db4o-8.0.184.15484+dfsg/0000755000175000017500000000000011621751105014646 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/db4o.license.html0000644000175000017500000011223011520622620020001 0ustar directhexdirecthex GNU General Public License - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

A 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 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:

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

db4o-8.0.184.15484+dfsg/doc/0000755000175000017500000000000011520622620015410 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/tutorial/0000755000175000017500000000000011621751575017271 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/tutorial/bin/0000755000175000017500000000000011621751011020022 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/tutorial/bin/Db4objects.Db4o.CS.xml0000644000175000017500000013343311520622074023635 0ustar directhexdirecthex Db4objects.Db4o.CS Configuration interface for db4o networking clients. Configuration interface for db4o networking clients. 7.5 A configuration provider that provides access to the networking configuration methods. A configuration provider that provides access to the networking configuration methods. 7.5 Access to the networking configuration methods. Access to the networking configuration methods. adds ConfigurationItems to be applied when a networking Db4objects.Db4o.CS.Internal.ClientObjectContainer is opened. the IClientConfigurationItem 7.12 Sets the number of IDs to be pre-allocated in the database for new objects created on the client. Sets the number of IDs to be pre-allocated in the database for new objects created on the client. The number of IDs to be prefetched Sets the number of objects to be prefetched for an ObjectSet. Sets the number of objects to be prefetched for an ObjectSet. The number of objects to be prefetched returns the MessageSender for this Configuration context. returns the MessageSender for this Configuration context. This setting should be used on the client side. MessageSender Sets the depth to which prefetched objects will be activated. Sets the depth to which prefetched objects will be activated. Sets the slot cache size to the given value. Sets the slot cache size to the given value. configures the time a client waits for a message response from the server. configures the time a client waits for a message response from the server.

Default value: 600000ms (10 minutes)

It is recommended to use the same values for TimeoutClientSocket(int) and #timeoutServerSocket(int) .
time in milliseconds
Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ClientObjectContainers after they are opened. Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ClientObjectContainers after they are opened. 7.12 Gives a chance for the item to augment the configuration. Gives a chance for the item to augment the configuration. the configuration that the item was added to Gives a chance for the item to configure the just opened ObjectContainer. Gives a chance for the item to configure the just opened ObjectContainer. the ObjectContainer to configure factory to open C/S server and client implementations. factory to open C/S server and client implementations. Db4objects.Db4o.Db4oFactory.OpenClient(Db4objects.Db4o.Config.IConfiguration, string, int, string, string) Configuration interface for networking configuration settings.

The network settings should be configured in exactly the same on the server and client.
Configuration interface for networking configuration settings.

The network settings should be configured in exactly the same on the server and client.
7.5
configures the client messaging system to be single threaded or multithreaded. configures the client messaging system to be single threaded or multithreaded.

Recommended settings:
- true for low resource systems.
- false for best asynchronous performance and fast GUI response.

Default value:
- .NET Compact Framework: true
- all other platforms: false

This setting can be used on both client and server.

the desired setting
Configures to batch messages between client and server. Configures to batch messages between client and server. By default, batch mode is enabled.

This setting can be used on both client and server.

false, to turn message batching off.
Configures the maximum memory buffer size for batched message. Configures the maximum memory buffer size for batched message. If the size of batched messages is greater than maxSize, batched messages will be sent to server.

This setting can be used on both client and server.

sets the MessageRecipient to receive Client Server messages. sets the MessageRecipient to receive Client Server messages.

This setting can be used on both client and server.

the MessageRecipient to be used
7.11 7.11 Configuration interface for db4o servers. Configuration interface for db4o servers. 7.5 adds ConfigurationItems to be applied when an ObjectServer is opened. adds ConfigurationItems to be applied when an ObjectServer is opened. the IServerConfigurationItem 7.12 configures the timeout of the server side socket. configures the timeout of the server side socket.

The server side handler waits for messages to arrive from the client. If no more messages arrive for the duration configured in this setting, the client will be disconnected.
Clients send PING messages to the server at an interval of Math.min(timeoutClientSocket(), timeoutServerSocket()) / 2 and the server will respond to keep connections alive.
Decrease this setting if you want clients to disconnect faster.
Increase this setting if you have a large number of clients and long running queries and you are getting disconnected clients that you would like to wait even longer for a response from the server.
Default value: 600000ms (10 minutes)

It is recommended to use the same values for #timeoutClientSocket(int) and TimeoutServerSocket(int) .
This setting can be used on both client and server.

time in milliseconds
Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ObjectServers after they are opened. Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ObjectServers after they are opened. 7.12 Gives a chance for the item to augment the configuration. Gives a chance for the item to augment the configuration. the configuration that the item was added to Gives a chance for the item to configure the just opened ObjectContainer. Gives a chance for the item to configure the just opened ObjectContainer. the ObjectContainer to configure Factory class to open db4o servers and to connect db4o clients to them. Factory class to open db4o servers and to connect db4o clients to them.

Note:
This class is made available in db4o-X.x-cs-java.jar / Db4objects.Db4o.CS.dll
7.5
creates a new Db4objects.Db4o.CS.Config.IServerConfiguration opens an IObjectServer on the specified database file and port.

a custom Db4objects.Db4o.CS.Config.IServerConfiguration instance to be obtained via NewServerConfiguration() an absolute or relative path to the database file the port to be used or 0 if the server should not open a port, specify a value < 0 if an arbitrary free port should be chosen - see ExtObjectServer#port() . an IObjectServer listening on the specified port. Configuration#readOnly Configuration#encrypt Configuration#password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates(bool) is set to false. database was configured as read-only.
opens a db4o server with a fresh server configuration. opens a db4o server with a fresh server configuration. OpenServer(Db4objects.Db4o.CS.Config.IServerConfiguration, string, int) NewServerConfiguration() opens a db4o client instance with the specified configuration. opens a db4o client instance with the specified configuration. the configuration to be used the host name of the server that is to be connected to the server port to connect to the username for authentication the password for authentication OpenServer(Db4objects.Db4o.CS.Config.IServerConfiguration, string, int) Db4objects.Db4o.IObjectServer.GrantAccess(string, string) if the configuration passed in has already been used. opens a db4o client instance with a fresh client configuration. opens a db4o client instance with a fresh client configuration. OpenClient(Db4objects.Db4o.CS.Config.IClientConfiguration, string, int, string, string) NewClientConfiguration() creates a new Db4objects.Db4o.CS.Config.IClientConfiguration 7.12 7.12 may return null, if no message is returned. may return null, if no message is returned. Error handling is weak and should ideally be able to trigger some sort of state listener (connection dead) on the client. Platform specific defaults. Platform specific defaults. The default ClientQueryResultIterator for this platform. This class exists to work around a decaf conversion problem when the code was directly in ServerMessageDispatcherImp. This class exists to work around a decaf conversion problem when the code was directly in ServerMessageDispatcherImp. an event that provides the name of the client being disconnected. 7.12 Defines a strategy on how to prefetch objects from the server. Defines a strategy on how to prefetch objects from the server. Messages with Data for Client/Server Communication Messages for Client/Server Communication dummy method to allow clean override handling without casting to be overridden by implementors of MessageWithResponse get the classname for an internal ID System.IDisposable.Dispose() EventArgs => MessageEventArgs Prefetchs multiples objects at once (in a single message). Prefetchs multiples objects at once (in a single message).
db4o-8.0.184.15484+dfsg/doc/tutorial/bin/Db4objects.Db4o.Optional.xml0000644000175000017500000005615211520622074025117 0ustar directhexdirecthex Db4objects.Db4o.Optional allows running Queries against multiple ObjectContainers. allows running Queries against multiple ObjectContainers. use this constructor to create a Cluster and call add() to add ObjectContainers starts a query against all ObjectContainers in this Cluster. starts a query against all ObjectContainers in this Cluster. the Query returns the ObjectContainer in this cluster where the passed object is stored or null, if the object is not stored to any ObjectContainer in this cluster the object the ObjectContainer Statistics for the byte usage for a single class (instances, indices, etc.) in a db4o database file. Statistics for the byte usage for a single class (instances, indices, etc.) in a db4o database file. the name of the persistent class number of bytes used slots containing the actual class instances number of bytes used for the index of class instances number of bytes used for field indexes, if any number of bytes used for features that are specific to this class (ex.: the BTree encapsulated within a Db4objects.Db4o.Internal.Collections.BigSet<E> instance) aggregated byte usage for this persistent class Byte usage statistics for a db4o database file bytes used by the db4o file header (static and variable parts) total number of bytes registered as freespace, available for reuse bytes used by the id system indices number of bytes used for class metadata (class metadata repository and schema definitions) number of bytes used for the bookkeeping of the freespace system itself number of bytes used for the uuid index number of bytes used for the commit timestamp indexes total file size in bytes number of bytes used aggregated from all categories - should always be equal to FileSize() the statistics for each persisted class a fully qualified class name the statistics for the class with the given name Collects database file usage statistics and prints them to the console. Collects database file usage statistics and prints them to the console. IoAdapter for in-memory operation. IoAdapter for in-memory operation.

Configure db4o to operate with this in-memory IoAdapter with MemoryIoAdapter memoryIoAdapter = new MemoryIoAdapter();
Db4oFactory.Configure().Io(memoryIoAdapter);



Use the normal #openFile() and #openServer() commands to open ObjectContainers and ObjectServers. The names specified as file names will be used to identify the byte[] content of the in-memory files in the _memoryFiles Hashtable in the adapter. After working with an in-memory ObjectContainer/ObjectServer the byte[] content is available in the MemoryIoAdapter by using Db4objects.Db4o.IO.MemoryIoAdapter.Get . To add old existing database byte[] content to a MemoryIoAdapter use Db4objects.Db4o.IO.MemoryIoAdapter.Put . To reduce memory consumption of memory file names that will no longer be used call Db4objects.Db4o.IO.MemoryIoAdapter.Put and pass an empty byte array.
creates an in-memory database with the passed content bytes and adds it to the adapter for the specified name. creates an in-memory database with the passed content bytes and adds it to the adapter for the specified name. the name to be use for #openFile() or #openServer() calls the database content returns the content bytes for a database with the given name. returns the content bytes for a database with the given name. the name to be use for #openFile() or #openServer() calls the content bytes configures the length a memory file should grow, if no more free slots are found within. configures the length a memory file should grow, if no more free slots are found within.

Specify a large value (100,000 or more) for best performance. Specify a small value (100) for the smallest memory consumption. The default setting is 10,000.
the length in bytes
for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. for internal processing only. Delegating IoAdapter that does not pass on calls to sync data to the underlying device. Delegating IoAdapter that does not pass on calls to sync data to the underlying device.

This IoAdapter can be used to improve performance at the cost of a higher risk of database file corruption upon abnormal termination of a session against a database.

An example of possible usage:
RandomAccessFileAdapter randomAccessFileAdapter = new RandomAccessFileAdapter();
NonFlushingIoAdapter nonFlushingIoAdapter = new NonFlushingIoAdapter(randomAccessFileAdapter);
CachedIoAdapter cachedIoAdapter = new CachedIoAdapter(nonFlushingIoAdapter);
Configuration configuration = Db4o.newConfiguration();
configuration.io(cachedIoAdapter);


db4o uses a resume-commit-on-crash strategy to ensure ACID transactions. When a transaction commits,
- (1) a list "pointers that are to be modified" is written to the database file,
- (2) the database file is switched into "in-commit" mode,
- (3) the pointers are actually modified in the database file,
- (4) the database file is switched to "not-in-commit" mode.
If the system is halted by a hardware or power failure
- before (2)
all objects will be available as before the commit
- between (2) and (4) the commit is restarted when the database file is opened the next time, all pointers will be read from the "pointers to be modified" list and all of them will be modified to the state they are intended to have after commit
- after (4) no work is necessary, the transaction is committed.

In order for the above to be 100% failsafe, the order of writes to the storage medium has to be obeyed. On operating systems that use in-memory file caching, the OS cache may revert the order of writes to optimize file performance.

db4o enforces the correct write order by calling Sync() after every single one of the above steps during transaction commit. The calls to Sync() have a high performance cost. By using this IoAdapter it is possible to omit these calls, at the cost of a risc of corrupted database files upon hardware-, power- or operating system failures.

Storage that allows to save an open database file as another file while keeping the reference system in place. Storage that allows to save an open database file as another file while keeping the reference system in place. If anything goes wrong during copying the storage tries to reopen the original file, so commit operations can still take place against the original file. call this method to save the content of a currently open ObjectContainer session to a new file location. call this method to save the content of a currently open ObjectContainer session to a new file location. Invocation will close the old file without a commit, keep the reference system in place and connect it to the file in the new location. If anything goes wrong during the copying operation or while opening it will be attempted to reopen the old file. In this case a Db4oException will be thrown. the path to the old open database file the path to the new database file We could have nicely used BinDecorator here, but BinDecorator doesn't allow exchanging the Bin. We could have nicely used BinDecorator here, but BinDecorator doesn't allow exchanging the Bin. To be compatible with released versions we do Contains the application-specific reflection information (that would be generated by a bytecode enhancer), as opposed to the 'generic' functionality contained in SelfReflector. Contains the application-specific reflection information (that would be generated by a bytecode enhancer), as opposed to the 'generic' functionality contained in SelfReflector. prints statistics about a database file to System.out. prints statistics about a database file to System.out.

Pass the database file path as an argument.

This class is not part of db4o.jar!
It is delivered as sourcecode in the path ../com/db4o/tools/

the main method that runs the statistics. the main method that runs the statistics. a String array of length 1, with the name of the database file as element 0. Publishes performance counters for bytes read and written.
db4o-8.0.184.15484+dfsg/doc/tutorial/bin/Db4objects.Db4o.xml0000644000175000017500000261613511520622074023340 0ustar directhexdirecthex Db4objects.Db4o Activator interface.


Db4objects.Db4o.TA.IActivatable objects need to have a reference to an Activator implementation, which is called by Transparent Activation, when a request is received to activate the host object.
Transparent Activation framework.
Method to be called to activate the host object. Method to be called to activate the host object. for which purpose is the object being activated? ActivationPurpose.Write will cause the object to be saved on the next Db4objects.Db4o.IObjectContainer.Commit() operation. Transparent activatable IDictionary implementation. Transparent activatable IDictionary implementation. Implements IDictionary interface using two arrays to store keys and values.

When instantiated as a result of a query, all the internal members are NOT activated at all. When internal members are required to perform an operation, the instance transparently activates all the members.
System.Collections.IDictionary Db4objects.Db4o.TA.IActivatable
IActivatable must be implemented by classes in order to support Transparent Activation.

The IActivatable interface may be added to persistent classes by hand or by using the db4o instrumentation (Db4oTools).
IActivatable must be implemented by classes in order to support Transparent Activation.

The IActivatable interface may be added to persistent classes by hand or by using the db4o instrumentation (Db4oTools). For further information on the enhancer see:

http://developer.db4o.com/Resources/view.aspx/Reference/Implementation_Strategies/Enhancement_Tools/Enhancement_For_.NET.

The basic idea for Transparent Activation is as follows:
Objects have an activation depth of 0, i.e. by default they are not activated at all. Whenever a method is called on such an object, the first thing to do before actually executing the method body is to activate the object to level 1, i.e. populating its direct members.

To illustrate this approach, we will use the following simple class.

public class Item {
   private Item _next;

   public Item(Item next) {
      _next = next;
   }

   public Item Next {
     get {
      return _next;
     }
   }
}

The basic sequence of actions to get the above scheme to work is the following:

- Whenever an object is instantiated from db4o, the database registers an activator for this object. To enable this, the object has to implement the IActivatable interface and provide the according Bind(IActivator) method. The default implementation of the bind method will simply store the given activator reference for later use.

public class Item implements IActivatable {
   transient IActivator _activator;

   public void Bind(IActivator activator) {
      if (null != _activator) {
         throw new IllegalStateException();
      }
      _activator = activator;
   }

   // ...
}

- The first action in every method body of an activatable object should be a call to the corresponding IActivator's Activate() method. (Note that this is not enforced by any interface, it is rather a convention, and other implementations are possible.)

public class Item implements IActivatable {
   public void Activate() {
      if (_activator == null) return;
      _activator.Activate();
   }

   public Item Next() {
     get {
      Activate();
      return _next;
     }
   }
}

- The Activate() method will check whether the object is already activated. If this is not the case, it will request the container to activate the object to level 1 and set the activated flag accordingly.

To instruct db4o to actually use these hooks (i.e. to register the database when instantiating an object), TransparentActivationSupport has to be registered with the db4o configuration.

ICommonConfiguration config = ...
config.Add(new TransparentActivationSupport());

called by db4o upon instantiation. called by db4o upon instantiation.

The recommended implementation of this method is to store the passed Db4objects.Db4o.Activation.IActivator in a transient field of the object.
the Activator
should be called by every reading field access of an object. should be called by every reading field access of an object.

The recommended implementation of this method is to call Db4objects.Db4o.Activation.IActivator.Activate(Db4objects.Db4o.Activation.ActivationPurpose) on the Db4objects.Db4o.Activation.IActivator that was previously passed to Bind(Db4objects.Db4o.Activation.IActivator) .
TODO
Initializes a new collection with the initial capacity = 16. Initializes a collection of the specified initial capacity. activate basic implementation. activate basic implementation. Db4objects.Db4o.TA.IActivatable bind basic implementation. bind basic implementation. Db4objects.Db4o.TA.IActivatable System.Collections.Generic.IDictionary implementation but transparently activates the members as required. System.Collections.Generic.IDictionary implementation but transparently activates the members as required. Db4objects.Db4o.TA.IActivatable Returns the hash code of the collection. Returns the hash code of the collection. Collection members get activated as required. Db4objects.Db4o.TA.IActivatable Returns the number of elements in the collection. Returns the number of elements in the collection. The collection gets activated. Db4objects.Db4o.TA.IActivatable Returns the values of the collection. Returns the values of the collection. The collection gets activated. Db4objects.Db4o.TA.IActivatable Transparent activatable ArrayList implementation. Transparent activatable ArrayList implementation. Implements IList interface using an array to store elements. Each ArrayList4 instance has a capacity, which indicates the size of the internal array.

When instantiated as a result of a query, all the internal members are NOT activated at all. When internal members are required to perform an operation, the instance transparently activates all the members.
System.Collections.ArrayList Db4objects.Db4o.TA.IActivatable
activate basic implementation. activate basic implementation. Db4objects.Db4o.TA.IActivatable bind basic implementation. bind basic implementation. Db4objects.Db4o.TA.IActivatable Initializes a new collection with the initial capacity = 10. Initializes a collection with the members of the parameter collection. Initializes a collection of the specified initial capacity. Inserts an element into the collection at the specified index. Inserts an element into the collection at the specified index. Db4objects.Db4o.TA.IActivatable Removes all elements from the collection. Removes all elements from the collection. Db4objects.Db4o.TA.IActivatable Resizes the collection capacity to the specified size if the current capacity is less than the parameter value. Resizes the collection capacity to the specified size if the current capacity is less than the parameter value. Db4objects.Db4o.TA.IActivatable Returns the collection element at the specified index. Returns the collection element at the specified index. Db4objects.Db4o.TA.IActivatable Removes the collection element at the specified index. Removes the collection element at the specified index. Db4objects.Db4o.TA.IActivatable Replaces the collection element with the specified object at the specified index. Replaces the collection element with the specified object at the specified index. Db4objects.Db4o.TA.IActivatable Resizes the collection to its actual size. Resizes the collection to its actual size. Db4objects.Db4o.TA.IActivatable Returns the size of the collection. Returns the size of the collection. Db4objects.Db4o.TA.IActivatable Collection factory with methods to create collections with behaviour that is optimized for db4o.

Example usage:
CollectionFactory.forObjectContainer(objectContainer).newBigSet();
returns a collection factory for an ObjectContainer - the ObjectContainer the CollectionFactory creates a new BigSet.

Characteristics of BigSet:
- It is optimized by using a BTree of IDs of persistent objects.
- It can only hold persistent first class objects (no primitives, no strings, no objects that are not persistent)
- Objects are activated upon getting them from the BigSet.
creates a new BigSet.

Characteristics of BigSet:
- It is optimized by using a BTree of IDs of persistent objects.
- It can only hold persistent first class objects (no primitives, no strings, no objects that are not persistent)
- Objects are activated upon getting them from the BigSet.

BigSet is recommend whenever one object references a huge number of other objects and sorting is not required.
Defines a scope of applicability of a config setting.

Some of the configuration settings can be either:

- enabled globally;
- enabled individually for a specified class;
- disabled.

IConfiguration.GenerateUUIDs(ConfigScope) IConfiguration.GenerateVersionNumbers(ConfigScope)
Marks a configuration feature as globally disabled. Marks a configuration feature as globally disabled. Marks a configuration feature as individually configurable. Marks a configuration feature as individually configurable. Marks a configuration feature as globally enabled. Marks a configuration feature as globally enabled. Checks if the current configuration scope is globally enabled or disabled. Checks if the current configuration scope is globally enabled or disabled. - default result false if disabled, true if globally enabled, default value otherwise encodes a String to a byte array and decodes a String from a part of a byte array called when a string is to be encoded to a byte array. called when a string is to be encoded to a byte array. the string to encode the encoded byte array called when a byte array is to be decoded to a string. called when a byte array is to be decoded to a string. the byte array the start offset in the byte array the length of the encoded string in the byte array the string All built in String encodings Db4objects.Db4o.Config.IConfiguration.StringEncoding(IStringEncoding) allows special comparison behaviour during query evaluation. allows special comparison behaviour during query evaluation.

db4o will use the Object returned by the Compare() method for all query comparisons.
return the Object to be compared during query evaluation. return the Object to be compared during query evaluation. Marker interface to denote that a class is used for db4o internals. Marker interface to denote that a class is used for db4o internals. db4o-specific exception.

This exception is thrown when a global configuration setting is attempted on an open object container.
db4o-specific exception.

This exception is thrown when a global configuration setting is attempted on an open object container.
IConfiguration.BlockSize(int) IConfiguration.Encrypt(bool) IConfiguration.Io(Db4objects.Db4o.IO.IoAdapter) IConfiguration.Password(string)
db4o exception wrapper: Exceptions occurring during internal processing will be proliferated to the client calling code encapsulated in an exception of this type. db4o exception wrapper: Exceptions occurring during internal processing will be proliferated to the client calling code encapsulated in an exception of this type. The original exception, if any, is available through Db4oException#getCause(). Simple constructor Constructor with an exception message specified exception message Constructor with an exception cause specified exception cause Constructor with an exception message selected from the internal message collection. Constructor with an exception message selected from the internal message collection. internal db4o message number Constructor with an exception message and cause specified exception message exception cause Implement this interface when implementing special custom Aliases for classes, packages or namespaces. Implement this interface when implementing special custom Aliases for classes, packages or namespaces.

Aliases can be used to persist classes in the running application to different persistent classes in a database file or on a db4o server.

Two simple Alias implementations are supplied along with db4o:
- TypeAlias provides an #equals() resolver to match names directly.
- WildcardAlias allows simple pattern matching with one single '*' wildcard character.

It is possible to create own complex IAlias constructs by creating own resolvers that implement the IAlias interface.

Examples of concrete usecases:

// Creating an Alias for a single class
ICommonConfiguration.AddAlias(
  new TypeAlias("Tutorial.Pilot", "Tutorial.Driver"));


// Accessing a Java package from a .NET assembly
ICommonConfiguration.AddAlias(
  new WildcardAlias(
    "com.f1.*",
    "Tutorial.F1.*, Tutorial"));


// Using a different local .NET assembly
ICommonConfiguration.AddAlias(
  new WildcardAlias(
    "Tutorial.F1.*, F1Race",
    "Tutorial.F1.*, Tutorial"));




Aliases that translate the persistent name of a class to a name that already exists as a persistent name in the database (or on the server) are not permitted and will throw an exception when the database file is opened.

Aliases should be configured before opening a database file or connecting to a server.
return the stored name for a runtime name or null if not handled. return the stored name for a runtime name or null if not handled. return the runtime name for a stored name or null if not handled. return the runtime name for a stored name or null if not handled. Interface to configure the cache configurations. Interface to configure the cache configurations. configures the size of the slot cache to hold a number of slots in the cache. configures the size of the slot cache to hold a number of slots in the cache. the number of slots A configuration provider that provides access to the cache-related configuration methods. A configuration provider that provides access to the cache-related configuration methods. Access to the cache-related configuration methods. Access to the cache-related configuration methods. Client/Server configuration interface. Client/Server configuration interface. Sets the number of IDs to be pre-allocated in the database for new objects created on the client. Sets the number of IDs to be pre-allocated in the database for new objects created on the client. This setting should be used on the client side. In embedded mode this setting has no effect. The number of IDs to be prefetched Sets the number of objects to be prefetched for an ObjectSet. Sets the number of objects to be prefetched for an ObjectSet. This setting should be used on the server side. The number of objects to be prefetched Sets the depth to which prefetched objects are activated. Sets the depth to which prefetched objects are activated. This setting should be used on the client side. Sets the slot cache size to the given value. Sets the slot cache size to the given value. sets the MessageRecipient to receive Client Server messages. sets the MessageRecipient to receive Client Server messages.

This setting should be used on the server side.

the MessageRecipient to be used
returns the MessageSender for this Configuration context. returns the MessageSender for this Configuration context. This setting should be used on the client side. MessageSender configures the time a client waits for a message response from the server. configures the time a client waits for a message response from the server.

Default value: 600000ms (10 minutes)

It is recommended to use the same values for TimeoutClientSocket(int) and TimeoutServerSocket(int) .
This setting can be used on both client and server.

time in milliseconds
configures the timeout of the serverside socket. configures the timeout of the serverside socket.

The serverside handler waits for messages to arrive from the client. If no more messages arrive for the duration configured in this setting, the client will be disconnected.
Clients send PING messages to the server at an interval of Math.min(timeoutClientSocket(), timeoutServerSocket()) / 2 and the server will respond to keep connections alive.
Decrease this setting if you want clients to disconnect faster.
Increase this setting if you have a large number of clients and long running queries and you are getting disconnected clients that you would like to wait even longer for a response from the server.
Default value: 600000ms (10 minutes)

It is recommended to use the same values for TimeoutClientSocket(int) and TimeoutServerSocket(int) .
This setting can be used on both client and server.

time in milliseconds
configures the client messaging system to be single threaded or multithreaded. configures the client messaging system to be single threaded or multithreaded.

Recommended settings:
- true for low resource systems.
- false for best asynchronous performance and fast GUI response.

Default value:
- .NET Compactframework: true
- all other platforms: false

This setting can be used on both client and server.

the desired setting
Configures to batch messages between client and server. Configures to batch messages between client and server. By default, batch mode is enabled.

This setting can be used on both client and server.

false, to turn message batching off.
Configures the maximum memory buffer size for batched message. Configures the maximum memory buffer size for batched message. If the size of batched messages is greater than maxSize, batched messages will be sent to server.

This setting can be used on both client and server.

Common configuration methods, applicable for embedded, client and server use of db4o.

In Client/Server use it is good practice to configure the client and the server in exactly the same way.
Common configuration methods, applicable for embedded, client and server use of db4o.

In Client/Server use it is good practice to configure the client and the server in exactly the same way.
7.5
adds a new Alias for a class, namespace or package. adds a new Alias for a class, namespace or package.

Aliases can be used to persist classes in the running application to different persistent classes in a database file or on a db4o server.

Two simple Alias implementations are supplied along with db4o:
- TypeAlias provides an #equals() resolver to match names directly.
- WildcardAlias allows simple pattern matching with one single '*' wildcard character.

It is possible to create own complex IAlias constructs by creating own resolvers that implement the IAlias interface.

Examples of concrete usecases:

// Creating an Alias for a single class
Db4o.configure().addAlias(
  new TypeAlias("com.f1.Pilot", "com.f1.Driver"));


// Accessing a .NET assembly from a Java package
Db4o.configure().addAlias(
  new WildcardAlias(
    "Tutorial.F1.*, Tutorial",
    "com.f1.*"));


// Mapping a Java package onto another
Db4o.configure().addAlias(
  new WildcardAlias(
    "com.f1.*",
    "com.f1.client*"));


Aliases that translate the persistent name of a class to a name that already exists as a persistent name in the database (or on the server) are not permitted and will throw an exception when the database file is opened.

Aliases should be configured before opening a database file or connecting to a server.

In client/server environment it is good practice to configure the client and the server in exactly the same way.
Removes an alias previously added with IConfiguration.AddAlias(IAlias) . the alias to remove adds ConfigurationItems to be applied when an ObjectContainer or ObjectServer is opened. adds ConfigurationItems to be applied when an ObjectContainer or ObjectServer is opened. the ConfigurationItem allows to mark fields as transient with custom attributes. allows to mark fields as transient with custom attributes.

.NET only: Call this method with the attribute name that you wish to use to mark fields as transient. Multiple transient attributes are possible by calling this method multiple times with different attribute names.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

- the fully qualified name of the attribute, including it's namespace TODO: can we provide meaningful java side semantics for this one? TODO: USE A CLASS!!!!!!
returns an IObjectClass object to configure the specified class.

The clazz parameter can be any of the following:
- a fully qualified classname as a String.
- a Class object.
- any other object to be used as a template.

class name, Class object, or example object.

an instance of an IObjectClass object for configuration.
configures the use of a specially designed reflection implementation. configures the use of a specially designed reflection implementation.

db4o internally uses java.lang.reflect.* by default. On platforms that do not support this package, customized implementations may be written to supply all the functionality of the interfaces in the com.db4o.reflect package. This method can be used to install a custom reflection implementation.

In client-server environment this setting should be used on both the client and the server side (reflector class must be available)

allows registering special TypeHandlers for customized marshalling and customized comparisons. allows registering special TypeHandlers for customized marshalling and customized comparisons. to specify for which classes and versions the TypeHandler is to be used. to be used for the classes that match the predicate. Registers a INameProvider that assigns a custom name to the database to be used in object.ToString() . sets the activation depth to the specified value. sets the activation depth to the specified value.

Why activation?
When objects are instantiated from the database, the instantiation of member objects needs to be limited to a certain depth. Otherwise a single object could lead to loading the complete database into memory, if all objects where reachable from a single root object.

db4o uses the concept "depth", the number of field-to-field hops an object is away from another object. The preconfigured "activation depth" db4o uses in the default setting is 5.

Whenever an application iterates through the IObjectSet of a query result, the result objects will be activated to the configured activation depth.

A concrete example with the preconfigured activation depth of 5:
            // Object foo is the result of a query, it is delivered by the ObjectSet
            object foo = objectSet.Next();
foo.member1.member2.member3.member4.member5 will be a valid object
foo, member1, member2, member3 and member4 will be activated
member5 will be deactivated, all of it's members will be null
member5 can be activated at any time by calling IObjectContainer.Activate(member5, depth) .

Note that raising the global activation depth will consume more memory and have negative effects on the performance of first-time retrievals. Lowering the global activation depth needs more individual activation work but can increase performance of queries.

IObjectContainer.Deactivate(object, depth) can be used to manually free memory by deactivating objects.

In client/server environment it is good practice to configure the client and the server in exactly the same way.

.
configuring classes individually gets the configured activation depth. sets the activation depth to the specified value. sets the activation depth to the specified value.

Why activation?
When objects are instantiated from the database, the instantiation of member objects needs to be limited to a certain depth. Otherwise a single object could lead to loading the complete database into memory, if all objects where reachable from a single root object.

db4o uses the concept "depth", the number of field-to-field hops an object is away from another object. The preconfigured "activation depth" db4o uses in the default setting is 5.

Whenever an application iterates through the IObjectSet of a query result, the result objects will be activated to the configured activation depth.

A concrete example with the preconfigured activation depth of 5:
            // Object foo is the result of a query, it is delivered by the ObjectSet
            object foo = objectSet.Next();
foo.member1.member2.member3.member4.member5 will be a valid object
foo, member1, member2, member3 and member4 will be activated
member5 will be deactivated, all of it's members will be null
member5 can be activated at any time by calling IObjectContainer.Activate(member5, depth) .

Note that raising the global activation depth will consume more memory and have negative effects on the performance of first-time retrievals. Lowering the global activation depth needs more individual activation work but can increase performance of queries.

IObjectContainer.Deactivate(object, depth) can be used to manually free memory by deactivating objects.

In client/server environment it is good practice to configure the client and the server in exactly the same way.

.
configuring classes individually gets the configured activation depth.
turns automatic database file format version updates on. turns automatic database file format version updates on.

Upon db4o database file format version changes, db4o can automatically update database files to the current version. db4objects does not provide functionality to reverse this process. It is not ensured that updated database files can be read with older db4o versions. In some cases (Example: using ObjectManager) it may not be desirable to update database files automatically therefore automatic updating is turned off by default for security reasons.

Call this method to turn automatic database file version updating on.

If automatic updating is turned off, db4o will refuse to open database files that use an older database file format.

In client/server environment it is good practice to configure the client and the server in exactly the same way.
turns automatic shutdown of the engine on and off. turns automatic shutdown of the engine on and off. The default and recommended setting is true.

configures the size of BTree nodes in indexes. configures the size of BTree nodes in indexes.

Default setting: 100
Lower values will allow a lower memory footprint and more efficient reading and writing of small slots.
Higher values will reduce the overall number of read and write operations and allow better performance at the cost of more RAM use.

In client/server environment it is good practice to configure the client and the server in exactly the same way.
the number of elements held in one BTree node.
turns callback methods on and off. turns callback methods on and off.

Callbacks are turned on by default.

A tuning hint: If callbacks are not used, you can turn this feature off, to prevent db4o from looking for callback methods in persistent classes. This will increase the performance on system startup.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.
false to turn callback methods off Using callbacks
advises db4o to try instantiating objects with/without calling constructors. advises db4o to try instantiating objects with/without calling constructors.

Not all .NET-environments support this feature. db4o will attempt, to follow the setting as good as the enviroment supports. This setting may also be overridden for individual classes in Db4objects.Db4o.Config.IObjectClass.CallConstructor .

The default setting depends on the features supported by your current environment.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

Db4objects.Db4o.Config.IObjectClass.CallConstructor
tuning feature: configures whether db4o checks all persistent classes upon system startup, for added or removed fields. tuning feature: configures whether db4o checks all persistent classes upon system startup, for added or removed fields.

If this configuration setting is set to false while a database is being created, members of classes will not be detected and stored.

This setting can be set to false in a production environment after all persistent classes have been stored at least once and classes will not be modified any further in the future.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

Default value:
true
the desired setting
returns the configuration interface for diagnostics. returns the configuration interface for diagnostics. the configuration interface for diagnostics. configures whether Exceptions are to be thrown, if objects can not be stored. configures whether Exceptions are to be thrown, if objects can not be stored.

db4o requires the presence of a constructor that can be used to instantiate objects. If no default public constructor is present, all available constructors are tested, whether an instance of the class can be instantiated. Null is passed to all constructor parameters. The first constructor that is successfully tested will be used throughout the running db4o session. If an instance of the class can not be instantiated, the object will not be stored. By default, execution will be stopped with an Exception. This method can be used to configure db4o to not throw an ObjectNotStorableException if an object can not be stored.

The default for this setting is true.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

true to throw Exceptions if objects can not be stored.
configures db4o to call Intern() on strings upon retrieval. configures db4o to call Intern on strings upon retrieval if set to true. In client/server environment the setting should be used on both client and server. sets the detail level of db4o messages. sets the detail level of db4o messages. Messages will be output to the configured output TextWriter .

Level 0 - no messages
Level 1 - open and close messages
Level 2 - messages for new, update and delete
Level 3 - messages for activate and deactivate

When using client-server and the level is set to 0, the server will override this and set it to 1. To get around this you can set the level to -1. This has the effect of not returning any messages.

In client-server environment this setting can be used on client or on server depending on which information do you want to track (server side provides more detailed information).

integer from 0 to 3 TODO: replace int with enumeration
If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. The following assemblies should be available for native query switch to take effect: Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll.

The default setting is true.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. The following assemblies should be available for native query switch to take effect: Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll.

The default setting is true.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries
returns the Query configuration interface. returns the Query configuration interface. Assigns a TextWriter where db4o is to print its event messages.

Messages are useful for debugging purposes and for learning to understand, how db4o works. The message level can be raised with IConfiguration.MessageLevel(int) to produce more detailed messages.

Use outStream(System.out) to print messages to the console.

In client-server environment this setting should be used on the same side where IConfiguration.MessageLevel(int) is used.

the new PrintStream for messages. MessageLevel(int)
configures the string encoding to be used. configures the string encoding to be used.

The string encoding can not be changed in the lifetime of a database file. To set up the database with the correct string encoding, this configuration needs to be set correctly before a database file is created with the first call to Db4objects.Db4o.Db4oFactory.OpenFile or Db4objects.Db4o.Db4oFactory.OpenServer .

For subsequent open calls, db4o remembers built-in string encodings. If a custom encoding is used (an encoding that is not supplied from within the db4o library), the correct encoding needs to be configured correctly again for all subsequent calls that open database files.

In client-server mode, the server and all clients need to have the same string encoding.

Example:
config.StringEncoding = StringEncodings.Utf8();
Db4objects.Db4o.Config.Encoding.StringEncodings
tuning feature: configures whether db4o should try to instantiate one instance of each persistent class on system startup. tuning feature: configures whether db4o should try to instantiate one instance of each persistent class on system startup.

In a production environment this setting can be set to false, if all persistent classes have public default constructors.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

Default value:
true
the desired setting
specifies the global updateDepth. specifies the global updateDepth.

see the documentation of for further details.

The value be may be overridden for individual classes.

The default setting is 1: Only the object passed to Db4objects.Db4o.IObjectContainer.Store(object) will be updated.

In a client/server environment it is good practice to configure the client and the server in exactly the same way.

the depth of the desired update. IObjectClass.UpdateDepth(int) IObjectClass.CascadeOnUpdate(bool) Using callbacks
turns weak reference management on or off. turns weak reference management on or off.

This method must be called before opening a database.

Performance may be improved by running db4o without using weak references durring memory management at the cost of higher memory consumption or by alternatively implementing a manual memory management scheme using Db4objects.Db4o.Ext.IExtObjectContainer.Purge(object)

Setting the value to false causes db4o to use hard references to objects, preventing the garbage collection process from disposing of unused objects.

The default setting is true.

Ignored on JDKs before 1.2.
configures the timer for WeakReference collection. configures the timer for WeakReference collection.

The default setting is 1000 milliseconds.

Configure this setting to zero to turn WeakReference collection off.

Ignored on JDKs before 1.2.

the time in milliseconds
Db4objects.Db4o.Foundation.IEnvironment A configuration provider that provides access to the common configuration methods that can be called for embedded, server and client use of db4o. A configuration provider that provides access to the common configuration methods that can be called for embedded, server and client use of db4o. 7.5 Access to the common configuration methods. Access to the common configuration methods. configuration interface. configuration interface.

This interface contains methods to configure db4o.

The global Configuration context is available with Db4objects.Db4o.Db4oFactory.Configure() . When an ObjectContainer or ObjectServer is opened, the global Configuration context is cloned and copied into the ObjectContainer/ObjectServer. That means every ObjectContainer/ObjectServer gets it's own copy of configuration settings.

Most configuration settings should be set before opening an ObjectContainer/ObjectServer.

Some configuration settings can be modified on an open ObjectContainer/ObjectServer. The local Configuration context is available with Db4objects.Db4o.Ext.IExtObjectContainer.Configure() and Db4objects.Db4o.Ext.IExtObjectServer.Configure() .
sets the activation depth to the specified value. sets the activation depth to the specified value.

Why activation?
When objects are instantiated from the database, the instantiation of member objects needs to be limited to a certain depth. Otherwise a single object could lead to loading the complete database into memory, if all objects where reachable from a single root object.

db4o uses the concept "depth", the number of field-to-field hops an object is away from another object. The preconfigured "activation depth" db4o uses in the default setting is 5.

Whenever an application iterates through the IObjectSet of a query result, the result objects will be activated to the configured activation depth.

A concrete example with the preconfigured activation depth of 5:
            // Object foo is the result of a query, it is delivered by the ObjectSet
            object foo = objectSet.Next();
foo.member1.member2.member3.member4.member5 will be a valid object
foo, member1, member2, member3 and member4 will be activated
member5 will be deactivated, all of it's members will be null
member5 can be activated at any time by calling IObjectContainer.Activate(member5, depth) .

Note that raising the global activation depth will consume more memory and have negative effects on the performance of first-time retrievals. Lowering the global activation depth needs more individual activation work but can increase performance of queries.

IObjectContainer.Deactivate(object, depth) can be used to manually free memory by deactivating objects.

In client/server environment the same setting should be used on both client and server

.
the desired global activation depth. configuring classes individually gets the configured activation depth.
gets the configured activation depth. gets the configured activation depth. the configured activation depth. adds ConfigurationItems to be applied when an ObjectContainer or ObjectServer is opened. adds ConfigurationItems to be applied when an ObjectContainer or ObjectServer is opened. the ConfigurationItem adds a new Alias for a class, namespace or package. adds a new Alias for a class, namespace or package.

Aliases can be used to persist classes in the running application to different persistent classes in a database file or on a db4o server.

Two simple Alias implementations are supplied along with db4o:
- TypeAlias provides an #equals() resolver to match names directly.
- WildcardAlias allows simple pattern matching with one single '*' wildcard character.

It is possible to create own complex IAlias constructs by creating own resolvers that implement the IAlias interface.

Four examples of concrete usecases:

// Creating an Alias for a single class
Db4oFactory.Configure().AddAlias(
  new TypeAlias("Tutorial.F1.Pilot", "Tutorial.F1.Driver"));


// Accessing a Java package from a .NET assembly
Db4o.configure().addAlias(
  new WildcardAlias(
    "com.f1.*",
    "Tutorial.F1.*, Tutorial"));


// Using a different local .NET assembly
Db4o.configure().addAlias(
  new WildcardAlias(
    "Tutorial.F1.*, Tutorial",
    "Tutorial.F1.*, RaceClient"));


Aliases that translate the persistent name of a class to a name that already exists as a persistent name in the database (or on the server) are not permitted and will throw an exception when the database file is opened.

Aliases should be configured before opening a database file or connecting to a server.
Removes an alias previously added with AddAlias(IAlias) . the alias to remove turns automatic database file format version updates on. turns automatic database file format version updates on.

Upon db4o database file format version changes, db4o can automatically update database files to the current version. db4objects does not provide functionality to reverse this process. It is not ensured that updated database files can be read with older db4o versions. In some cases (Example: using ObjectManager) it may not be desirable to update database files automatically therefore automatic updating is turned off by default for security reasons.

Call this method to turn automatic database file version updating on.

If automatic updating is turned off, db4o will refuse to open database files that use an older database file format.

In client-server environment this setting should be used on both client and server.
turns automatic shutdown of the engine on and off. turns automatic shutdown of the engine on and off. whether db4o should shut down automatically. sets the storage data blocksize for new ObjectContainers. sets the storage data blocksize for new ObjectContainers.

The standard setting is 1 allowing for a maximum database file size of 2GB. This value can be increased to allow larger database files, although some space will be lost to padding because the size of some stored objects will not be an exact multiple of the block size. A recommended setting for large database files is 8, since internal pointers have this length.

This setting is only effective when the database is first created, in client-server environment in most cases it means that the setting should be used on the server side.
the size in bytes from 1 to 127
configures the size of BTree nodes in indexes. configures the size of BTree nodes in indexes.

Default setting: 100
Lower values will allow a lower memory footprint and more efficient reading and writing of small slots.
Higher values will reduce the overall number of read and write operations and allow better performance at the cost of more RAM use.

This setting should be used on both client and server in client-server environment.
the number of elements held in one BTree node.
configures caching of BTree nodes. configures caching of BTree nodes.

Clean BTree nodes will be unloaded on #commit and #rollback unless they are configured as cached here.

Default setting: 0
Possible settings: 1, 2 or 3

The potential number of cached BTree nodes can be calculated with the following formula:
maxCachedNodes = bTreeNodeSize ^ bTreeCacheHeight

This setting should be used on both client and server in client-server environment.
the height of the cache from the root
returns the Cache configuration interface. returns the Cache configuration interface. turns callback methods on and off. turns callback methods on and off.

Callbacks are turned on by default.

A tuning hint: If callbacks are not used, you can turn this feature off, to prevent db4o from looking for callback methods in persistent classes. This will increase the performance on system startup.

In client/server environment this setting should be used on both client and server.
false to turn callback methods off Using callbacks
advises db4o to try instantiating objects with/without calling constructors. advises db4o to try instantiating objects with/without calling constructors.

Not all .NET-environments support this feature. db4o will attempt, to follow the setting as good as the enviroment supports. This setting may also be overridden for individual classes in Db4objects.Db4o.Config.IObjectClass.CallConstructor .

The default setting depends on the features supported by your current environment.

In client/server environment this setting should be used on both client and server.

- specify true, to request calling constructors, specify false to request not calling constructors. Db4objects.Db4o.Config.IObjectClass.CallConstructor
turns individual class activation depth configuration on and off.

This feature is turned on by default.

In client/server environment this setting should be used on both client and server.

false to turn the possibility to individually configure class activation depths off Why activation?
returns client/server configuration interface. returns client/server configuration interface. configures the size database files should grow in bytes, when no free slot is found within. configures the size database files should grow in bytes, when no free slot is found within.

Tuning setting.

Whenever no free slot of sufficient length can be found within the current database file, the database file's length is extended. This configuration setting configures by how much it should be extended, in bytes.

This configuration setting is intended to reduce fragmentation. Higher values will produce bigger database files and less fragmentation.

To extend the database file, a single byte array is created and written to the end of the file in one write operation. Be aware that a high setting will require allocating memory for this byte array.
amount of bytes
tuning feature: configures whether db4o checks all persistent classes upon system startup, for added or removed fields. tuning feature: configures whether db4o checks all persistent classes upon system startup, for added or removed fields.

If this configuration setting is set to false while a database is being created, members of classes will not be detected and stored.

This setting can be set to false in a production environment after all persistent classes have been stored at least once and classes will not be modified any further in the future.

In a client/server environment this setting should be configured both on the client and and on the server.

Default value:
true
the desired setting
returns the configuration interface for diagnostics. returns the configuration interface for diagnostics. the configuration interface for diagnostics. turns commit recovery off. turns commit recovery off.

db4o uses a two-phase commit algorithm. In a first step all intended changes are written to a free place in the database file, the "transaction commit record". In a second step the actual changes are performed. If the system breaks down during commit, the commit process is restarted when the database file is opened the next time. On very rare occasions (possibilities: hardware failure or editing the database file with an external tool) the transaction commit record may be broken. In this case, this method can be used to try to open the database file without commit recovery. The method should only be used in emergency situations after consulting db4o support.
configures the use of encryption. configures the use of encryption.

This method needs to be called before a database file is created with the first Db4objects.Db4o.Db4oFactory.OpenFile(string) .

If encryption is set to true, you need to supply a password to seed the encryption mechanism.

db4o database files keep their encryption format after creation.

true for turning encryption on, false for turning encryption off. Password(string)
configures whether Exceptions are to be thrown, if objects can not be stored. configures whether Exceptions are to be thrown, if objects can not be stored.

db4o requires the presence of a constructor that can be used to instantiate objects. If no default public constructor is present, all available constructors are tested, whether an instance of the class can be instantiated. Null is passed to all constructor parameters. The first constructor that is successfully tested will be used throughout the running db4o session. If an instance of the class can not be instantiated, the object will not be stored. By default, execution will continue without any message or error. This method can be used to configure db4o to throw an ObjectNotStorableException if an object can not be stored.

The default for this setting is true.

In client/server environment this setting should be used on both client and server.

false to not throw Exceptions if objects can not be stored (fail silently).
returns the freespace configuration interface. returns the freespace configuration interface. configures db4o to generate UUIDs for stored objects. configures db4o to generate UUIDs for stored objects. This setting should be used when the database is first created.

the scope for UUID generation: disabled, generate for all classes, or configure individually
configures db4o to generate version numbers for stored objects. configures db4o to generate version numbers for stored objects. This setting should be used when the database is first created. the scope for version number generation: disabled, generate for all classes, or configure individually Configures db4o to generate commit timestamps for all stored objects.

All the objects commited within a transaction will share the same commit timestamp.
Configures db4o to generate commit timestamps for all stored objects.

All the objects commited within a transaction will share the same commit timestamp.
This setting should be used when the database is first created.

Afterwards you can access the object's commit timestamp like this:

            ObjectContainer container = ...;
            ObjectInfo objectInfo = container.ext().getObjectInfo(obj);
            long commitTimestamp = objectInfo.getVersion();
            
if true, commit timetamps will be generated for all stored objects. If you already have commit timestamps for stored objects and later set this flag to false, although you wont be able to access them, the commit timestamps will still be taking space in your file container. The only way to free that space is defragmenting the container. 8.0
configures db4o to call #intern() on strings upon retrieval. configures db4o to call #intern() on strings upon retrieval. In client/server environment the setting should be used on both client and server. true to intern strings returns true if strings will be interned. returns true if strings will be interned. allows to configure db4o to use a customized byte IO adapter. allows to configure db4o to use a customized byte IO adapter.

Derive from the abstract class Db4objects.Db4o.IO.IoAdapter to write your own. Possible usecases could be improved performance with a native library, mirrored write to two files, encryption or read-on-write fail-safety control.

An example of a custom io adapter can be found in xtea_db4o community project:
http://developer.db4o.com/ProjectSpaces/view.aspx/XTEA

In client-server environment this setting should be used on the server (adapter class must be available)

- the IoAdapter
returns the configured Db4objects.Db4o.IO.IoAdapter . allows to mark fields as transient with custom attributes. allows to mark fields as transient with custom attributes.

.NET only: Call this method with the attribute name that you wish to use to mark fields as transient. Multiple transient attributes are possible by calling this method multiple times with different attribute names.

In client/server environment the setting should be used on both client and server.

- the fully qualified name of the attribute, including it's namespace
sets the detail level of db4o messages. sets the detail level of db4o messages. Messages will be output to the configured output TextWriter .

Level 0 - no messages
Level 1 - open and close messages
Level 2 - messages for new, update and delete
Level 3 - messages for activate and deactivate

When using client-server and the level is set to 0, the server will override this and set it to 1. To get around this you can set the level to -1. This has the effect of not returning any messages.

In client-server environment this setting can be used on client or on server depending on which information do you want to track (server side provides more detailed information).

integer from 0 to 3 SetOut(System.IO.TextWriter)
can be used to turn the database file locking thread off. false to turn database file locking off. returns an IObjectClass object to configure the specified class.

The clazz parameter can be any of the following:
- a fully qualified classname as a String.
- a Class object.
- any other object to be used as a template.

class name, Class object, or example object.

an instance of an IObjectClass object for configuration.
If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. If set to true, db4o will try to optimize native queries dynamically at query execution time, otherwise it will run native queries in unoptimized mode as SODA evaluations. The following assemblies should be available for native query switch to take effect: Db4objects.Db4o.NativeQueries.dll, Db4objects.Db4o.Instrumentation.dll.

The default setting is true.

In client-server environment this setting should be used on both client and server.

true, if db4o should try to optimize native queries at query execution time, false otherwise Db4objects.Db4o.Config.ICommonConfiguration.OptimizeNativeQueries
indicates whether Native Queries will be optimized dynamically. indicates whether Native Queries will be optimized dynamically. boolean true if Native Queries will be optimized dynamically. OptimizeNativeQueries() protects the database file with a password. protects the database file with a password.

To set a password for a database file, this method needs to be called before a database file is created with the first Db4objects.Db4o.Db4oFactory.OpenFile(string) .

All further attempts to open the file, are required to set the same password.

The password is used to seed the encryption mechanism, which makes it impossible to read the database file without knowing the password.

the password to be used.
returns the Query configuration interface. returns the Query configuration interface. turns readOnly mode on and off. turns readOnly mode on and off.

This method configures the mode in which subsequent calls to Db4o.openFile() will open files.

Readonly mode allows to open an unlimited number of reading processes on one database file. It is also convenient for deploying db4o database files on CD-ROM.

In client-server environment this setting should be used on the server side in embedded mode and ONLY on client side in networked mode.

true for configuring readOnly mode for subsequent calls to Db4o.openFile() .
turns recovery mode on and off.

Recovery mode can be used to try to retrieve as much as possible out of an already corrupted database.
turns recovery mode on and off.

Recovery mode can be used to try to retrieve as much as possible out of an already corrupted database. In recovery mode internal checks are more relaxed. Null or invalid objects may be returned instead of throwing exceptions.

Use this method with care as a last resort to get data out of a corrupted database.
true to turn recover mode on.
configures the use of a specially designed reflection implementation. configures the use of a specially designed reflection implementation.

db4o internally uses System.Reflection by default. On platforms that do not support this package, customized implementations may be written to supply all the functionality of the interfaces in System.Reflection namespace. This method can be used to install a custom reflection implementation.
tuning feature only: reserves a number of bytes in database files. tuning feature only: reserves a number of bytes in database files.

The global setting is used for the creation of new database files. Continous calls on an ObjectContainer Configuration context (see Db4objects.Db4o.Ext.IExtObjectContainer.Configure() ) will continually allocate space.

The allocation of a fixed number of bytes at one time makes it more likely that the database will be stored in one chunk on the mass storage. Less read/write head movement can result in improved performance.

Note:
Allocated space will be lost on abnormal termination of the database engine (hardware crash, VM crash). A Defragment run will recover the lost space. For the best possible performance, this method should be called before the Defragment run to configure the allocation of storage space to be slightly greater than the anticipated database file size.

In client-server environment this setting should be used on the server side.

Default configuration: 0

the number of bytes to reserve
configures the path to be used to store and read Blob data. configures the path to be used to store and read Blob data.

In client-server environment this setting should be used on the server side.

the path to be used
Assigns a TextWriter where db4o is to print its event messages.

Messages are useful for debugging purposes and for learning to understand, how db4o works. The message level can be raised with MessageLevel(int) to produce more detailed messages.

Use setOut(System.out) to print messages to the console.

In client-server environment this setting should be used on the same side where MessageLevel(int) is used.

the new PrintStream for messages. MessageLevel(int)
configures the string encoding to be used. configures the string encoding to be used.

The string encoding can not be changed in the lifetime of a database file. To set up the database with the correct string encoding, this configuration needs to be set correctly before a database file is created with the first call to Db4objects.Db4o.Db4oFactory.OpenFile or Db4objects.Db4o.Db4oFactory.OpenServer .

For subsequent open calls, db4o remembers built-in string encodings. If a custom encoding is used (an encoding that is not supplied from within the db4o library), the correct encoding needs to be configured correctly again for all subsequent calls that open database files.

Example:
config.StringEncoding(StringEncodings.Utf8());
Db4objects.Db4o.Config.Encoding.StringEncodings
tuning feature: configures whether db4o should try to instantiate one instance of each persistent class on system startup. tuning feature: configures whether db4o should try to instantiate one instance of each persistent class on system startup.

In a production environment this setting can be set to false, if all persistent classes have public default constructors.

In client-server environment this setting should be used on both client and server side.

Default value:
true
the desired setting
specifies the global updateDepth. specifies the global updateDepth.

see the documentation of for further details.

The value be may be overridden for individual classes.

The default setting is 1: Only the object passed to com.db4o.ObjectContainer#set will be updated.

In client-server environment this setting should be used on both client and server sides.

the depth of the desired update. IObjectClass.UpdateDepth(int) IObjectClass.CascadeOnUpdate(bool) Using callbacks
turns weak reference management on or off. turns weak reference management on or off.

This method must be called before opening a database.

Performance may be improved by running db4o without using weak references durring memory management at the cost of higher memory consumption or by alternatively implementing a manual memory management scheme using IExtObjectContainer.Purge

Setting the value to false causes db4o to use hard references to objects, preventing the garbage collection process from disposing of unused objects.

The default setting is true.
configures the timer for WeakReference collection. configures the timer for WeakReference collection.

The default setting is 1000 milliseconds.

Configure this setting to zero to turn WeakReference collection off.
the time in milliseconds
allows registering special TypeHandlers for customized marshalling and customized comparisons. allows registering special TypeHandlers for customized marshalling and customized comparisons. to specify for which classes and versions the TypeHandler is to be used. to be used for the classes that match the predicate. ICommonConfiguration.MaxStackDepth() allows to configure db4o to use a customized byte IO storage mechanism. allows to configure db4o to use a customized byte IO storage mechanism.

Implement the interface Db4objects.Db4o.IO.IStorage to write your own. Possible usecases could be improved performance with a native library, mirrored write to two files, encryption or read-on-write fail-safety control.

- the factory Db4objects.Db4o.IO.CachingStorage Db4objects.Db4o.IO.MemoryStorage Db4objects.Db4o.IO.FileStorage Db4objects.Db4o.IO.StorageDecorator returns the configured Db4objects.Db4o.IO.IStorage
Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ObjectContainers after they are opened. Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to ObjectContainers after they are opened. Gives a chance for the item to augment the configuration. Gives a chance for the item to augment the configuration. the configuration that the item was added to Gives a chance for the item to configure the just opened ObjectContainer. Gives a chance for the item to configure the just opened ObjectContainer. the ObjectContainer to configure Configuration interface for db4o in embedded use. Configuration interface for db4o in embedded use. 7.5 A configuration provider that provides access to the file-related configuration methods. A configuration provider that provides access to the file-related configuration methods. Access to the file-related configuration methods. Access to the file-related configuration methods. A configuration provider that provides access to the IdSystem-related configuration methods. A configuration provider that provides access to the IdSystem-related configuration methods. Access to the IdSystem-related configuration methods. Access to the IdSystem-related configuration methods. adds ConfigurationItems to be applied when a networking EmbeddedObjectContainer is opened. the IEmbeddedConfigurationItem 7.12 Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to EmbeddedObjectContainers after they are opened. Implement this interface for configuration items that encapsulate a batch of configuration settings or that need to be applied to EmbeddedObjectContainers after they are opened. 7.12 Gives a chance for the item to augment the configuration. Gives a chance for the item to augment the configuration. the configuration that the item was added to Gives a chance for the item to configure the just opened ObjectContainer. Gives a chance for the item to configure the just opened ObjectContainer. the ObjectContainer to configure Configures the environment (set of services) used by db4o. Configures the environment (set of services) used by db4o. Db4objects.Db4o.Foundation.IEnvironment Db4objects.Db4o.Foundation.Environments.My(System.Type<T>) Contributes a service to the db4o environment. Contributes a service to the db4o environment. File-related configuration methods, applicable for db4o embedded use and on the server in a Client/Server setup. File-related configuration methods, applicable for db4o embedded use and on the server in a Client/Server setup. 7.5 IFileConfigurationProvider.File() turns commit recovery off. turns commit recovery off.

db4o uses a two-phase commit algorithm. In a first step all intended changes are written to a free place in the database file, the "transaction commit record". In a second step the actual changes are performed. If the system breaks down during commit, the commit process is restarted when the database file is opened the next time. On very rare occasions (possibilities: hardware failure or editing the database file with an external tool) the transaction commit record may be broken. In this case, this method can be used to try to open the database file without commit recovery. The method should only be used in emergency situations after consulting db4o support.
sets the storage data blocksize for new ObjectContainers. sets the storage data blocksize for new ObjectContainers.

The standard setting is 1 allowing for a maximum database file size of 2GB. This value can be increased to allow larger database files, although some space will be lost to padding because the size of some stored objects will not be an exact multiple of the block size. A recommended setting for large database files is 8, since internal pointers have this length.

This setting is only effective when the database is first created.
the size in bytes from 1 to 127
configures the size database files should grow in bytes, when no free slot is found within. configures the size database files should grow in bytes, when no free slot is found within.

Tuning setting.

Whenever no free slot of sufficient length can be found within the current database file, the database file's length is extended. This configuration setting configures by how much it should be extended, in bytes.

This configuration setting is intended to reduce fragmentation. Higher values will produce bigger database files and less fragmentation.

To extend the database file, a single byte array is created and written to the end of the file in one write operation. Be aware that a high setting will require allocating memory for this byte array.
amount of bytes
returns the freespace configuration interface. returns the freespace configuration interface. configures db4o to generate UUIDs for stored objects. configures db4o to generate UUIDs for stored objects. This setting should be used when the database is first created.

the scope for UUID generation: disabled, generate for all classes, or configure individually
configures db4o to generate version numbers for stored objects. configures db4o to generate version numbers for stored objects. This setting should be used when the database is first created. the scope for version number generation: disabled, generate for all classes, or configure individually Configures db4o to generate commit timestamps for all stored objects.

All the objects commited within a transaction will share the same commit timestamp.
Configures db4o to generate commit timestamps for all stored objects.

All the objects commited within a transaction will share the same commit timestamp.
This setting should be used when the database is first created.

Afterwards you can access the object's commit timestamp like this:

            ObjectContainer container = ...;
            ObjectInfo objectInfo = container.ext().getObjectInfo(obj);
            long commitTimestamp = objectInfo.getVersion();
            
if true, commit timetamps will be generated for all stored objects. If you already have commit timestamps for stored objects and later set this flag to false, although you wont be able to access them, the commit timestamps will still be taking space in your file container. The only way to free that space is defragmenting the container. 8.0
allows to configure db4o to use a customized byte IO storage mechanism. allows to configure db4o to use a customized byte IO storage mechanism.

You can implement the interface Db4objects.Db4o.IO.IStorage to write your own. Possible usecases could be improved performance with a native library, mirrored write to two files, encryption or read-on-write fail-safety control.

- the storage Db4objects.Db4o.IO.FileStorage Db4objects.Db4o.IO.CachingStorage Db4objects.Db4o.IO.MemoryStorage returns the configured Db4objects.Db4o.IO.IStorage .
can be used to turn the database file locking thread off. can be used to turn the database file locking thread off.

Caution!
If database file locking is turned off, concurrent write access to the same database file from different sessions will corrupt the database file immediately.

This method has no effect on open ObjectContainers. It will only affect how ObjectContainers are opened.

The default setting is true.

tuning feature only: reserves a number of bytes in database files. tuning feature only: reserves a number of bytes in database files.

The global setting is used for the creation of new database files.

Without this setting, storage space will be allocated continuously as required. However, allocation of a fixed number of bytes at one time makes it more likely that the database will be stored in one chunk on the mass storage. Less read/write head movement can result in improved performance.

Note:
Allocated space will be lost on abnormal termination of the database engine (hardware crash, VM crash). A Defragment run will recover the lost space. For the best possible performance, this method should be called before the Defragment run to configure the allocation of storage space to be slightly greater than the anticipated database file size.

Default configuration: 0

the number of bytes to reserve
configures the path to be used to store and read Blob data. configures the path to be used to store and read Blob data.

the path to be used
turns readOnly mode on and off. turns readOnly mode on and off.

This method configures the mode in which subsequent calls to Db4objects.Db4o.Db4oEmbedded.OpenFile(IEmbeddedConfiguration, string) will open files.

Readonly mode allows to open an unlimited number of reading processes on one database file. It is also convenient for deploying db4o database files on CD-ROM.

true for configuring readOnly mode for subsequent calls to Db4o.openFile() . TODO: this is rather embedded + client than base?
turns recovery mode on and off.

Recovery mode can be used to try to retrieve as much as possible out of an already corrupted database.
turns recovery mode on and off.

Recovery mode can be used to try to retrieve as much as possible out of an already corrupted database. In recovery mode internal checks are more relaxed. Null or invalid objects may be returned instead of throwing exceptions.

Use this method with care as a last resort to get data out of a corrupted database.
true to turn recover mode on.
turns asynchronous sync on and off.

One of the most costly operations during commit is the call to flush the buffers of the database file.
turns asynchronous sync on and off.

One of the most costly operations during commit is the call to flush the buffers of the database file. In regular mode the commit call has to wait until this operation has completed. When asynchronous sync is turned on, the sync operation will run in a dedicated thread, blocking all other file access until it has completed. This way the commit call can return immediately. This will allow db4o and other processes to continue running side-by-side while the flush call executes. Use this setting with care: It means that you can not be sure when a commit call has actually made the changes of a transaction durable (flushed through OS and file system buffers). The latency time until flushing happens is extremely short. The dedicated sync thread does nothing else except for calling sync and writing the header of the database file when needed. A setup with this option still guarantees ACID transaction processing: A database file always will be either in the state before commit or in the state after commit. Corruption can not occur. You can just not rely on the transaction already having been applied when the commit() call returns.
interface to configure the freespace system to be used. interface to configure the freespace system to be used.

All methods should be called before opening database files. If db4o is instructed to exchange the system ( UseBTreeSystem() , UseRamSystem() ) this will happen on opening the database file.

By default the ram based system will be used.
tuning feature: configures the minimum size of free space slots in the database file that are to be reused. tuning feature: configures the minimum size of free space slots in the database file that are to be reused.

When objects are updated or deleted, the space previously occupied in the database file is marked as "free", so it can be reused. db4o maintains two lists in RAM, sorted by address and by size. Adjacent entries are merged. After a large number of updates or deletes have been executed, the lists can become large, causing RAM consumption and performance loss for maintenance. With this method you can specify an upper bound for the byte slot size to discard.

Pass Integer.MAX_VALUE to this method to discard all free slots for the best possible startup time.

The downside of setting this value: Database files will necessarily grow faster.

Default value:
0 all space is reused
Slots with this size or smaller will be lost.
Configure a way to overwrite freed space in the database file with custom (for example: random) bytes. Configure a way to overwrite freed space in the database file with custom (for example: random) bytes. Will slow down I/O operation. The value of this setting may be cached internally and can thus not be reliably set after an object container has been opened. The freespace overwriting callback to use configures db4o to use a BTree-based freespace system. configures db4o to use a BTree-based freespace system.

Advantages
- ACID, no freespace is lost on abnormal system termination
- low memory consumption

Disadvantages
- slower than the RAM-based system, since freespace information is written during every commit
discontinued freespace system, only available before db4o 7.0. discontinued freespace system, only available before db4o 7.0. configures db4o to use a RAM-based freespace system. configures db4o to use a RAM-based freespace system.

Advantages
- best performance

Disadvantages
- upon abnormal system termination all freespace is lost
- memory consumption
Callback hook for overwriting freed space in the database file. Callback hook for overwriting freed space in the database file. Called to overwrite freed space in the database file. Called to overwrite freed space in the database file. Handle for the freed slot Interface to configure the IdSystem. Interface to configure the IdSystem. configures db4o to store IDs as pointers. configures db4o to store IDs as pointers. configures db4o to use a stack of two BTreeIdSystems on top of an InMemoryIdSystem. configures db4o to use a stack of two BTreeIdSystems on top of an InMemoryIdSystem. This setup is scalable for large numbers of IDs. It is the default configuration when new databases are created. configures db4o to use a single BTreeIdSystem on top of an InMemoryIdSystem. configures db4o to use a single BTreeIdSystem on top of an InMemoryIdSystem. This setup is suitable for smaller databases with a small number of IDs. For larger numbers of IDs call UseStackedBTreeSystem() . configures db4o to use an in-memory ID system. configures db4o to use an in-memory ID system. All IDs get written to the database file on every commit. configures db4o to use a custom ID system. configures db4o to use a custom ID system. Pass an IIdSystemFactory that creates the IdSystem. Note that this factory has to be configured every time you open a database that you configured to use a custom IdSystem. Factory interface to create a custom IdSystem. Factory interface to create a custom IdSystem. creates A provider for custom database names. A provider for custom database names. Derives a name for the given Db4objects.Db4o.IObjectContainer . This method will be called when database startup has completed, i.e. the method will see a completely initialized Db4objects.Db4o.IObjectContainer . Any code invoked during the startup process (for example IConfigurationItem instances) will still see the default naming. generic interface to allow returning an attribute of an object. generic interface to allow returning an attribute of an object. generic method to return an attribute of a parent object. generic method to return an attribute of a parent object. the parent object Object - the attribute configuration interface for classes. configuration interface for classes.

Use the global ICommonConfiguration.ObjectClass(object) to configure object class settings.
advises db4o to try instantiating objects of this class with/without calling constructors. advises db4o to try instantiating objects of this class with/without calling constructors.

Not all .NET-environments support this feature. db4o will attempt, to follow the setting as good as the enviroment supports.

This setting may also be set globally for all classes in Db4objects.Db4o.Config.IConfiguration.CallConstructors .

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

- specify true, to request calling constructors, specify false to request not calling constructors. Db4objects.Db4o.Config.IConfiguration.CallConstructors
sets cascaded activation behaviour. sets cascaded activation behaviour.

Setting cascadeOnActivate to true will result in the activation of all member objects if an instance of this class is activated.

The default setting is false.

In client-server environment this setting should be used on both client and server.

Can be applied to an open ObjectContainer.

whether activation is to be cascaded to member objects. IObjectField.CascadeOnActivate(bool) Db4objects.Db4o.IObjectContainer.Activate(object, int) Using callbacks Why activation?
sets cascaded delete behaviour. sets cascaded delete behaviour.

Setting CascadeOnDelete to true will result in the deletion of all member objects of instances of this class, if they are passed to Db4objects.Db4o.IObjectContainer.Delete .

Caution !
This setting will also trigger deletion of old member objects, on calls to Db4objects.Db4o.IObjectContainer.Store .

An example of the behaviour:
ObjectContainer con;
Bar bar1 = new Bar();
Bar bar2 = new Bar();
foo.bar = bar1;
con.Store(foo); // bar1 is stored as a member of foo
foo.bar = bar2;
con.Store(foo); // bar2 is stored as a member of foo

The last statement will also delete bar1 from the ObjectContainer, no matter how many other stored objects hold references to bar1.

The default setting is false.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether deletes are to be cascaded to member objects. Db4objects.Db4o.Config.IObjectField.CascadeOnDelete Db4objects.Db4o.IObjectContainer.Delete Using callbacks
sets cascaded update behaviour. sets cascaded update behaviour.

Setting cascadeOnUpdate to true will result in the update of all member objects if a stored instance of this class is passed to Db4objects.Db4o.IObjectContainer.Store(object) .

The default setting is false. Setting it to true may result in serious performance degradation.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether updates are to be cascaded to member objects. IObjectField.CascadeOnUpdate(bool) com.db4o.ObjectContainer#set Using callbacks
registers an attribute provider for special query behavior. registers an attribute provider for special query behavior.

The query processor will compare the object returned by the attribute provider instead of the actual object, both for the constraint and the candidate persistent object.

In client-server environment this setting should be used on both client and server.

the attribute provider to be used
Must be called before databases are created or opened so that db4o will control versions and generate UUIDs for objects of this class, which is required for using replication. Must be called before databases are created or opened so that db4o will control versions and generate UUIDs for objects of this class, which is required for using replication. generate UUIDs for stored objects of this class. generate UUIDs for stored objects of this class. This setting should be used before the database is first created.

generate version numbers for stored objects of this class. generate version numbers for stored objects of this class. This setting should be used before the database is first created.

turns the class index on or off. turns the class index on or off.

db4o maintains an index for each class to be able to deliver all instances of a class in a query. If the class index is never needed, it can be turned off with this method to improve the performance to create and delete objects of a class.

Common cases where a class index is not needed:
- The application always works with sub classes or super classes.
- There are convenient field indexes that will always find instances of a class.
- The application always works with IDs.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

sets the maximum activation depth to the desired value. sets the maximum activation depth to the desired value.

A class specific setting overrides the global setting

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

the desired maximum activation depth Why activation? CascadeOnActivate(bool)
sets the minimum activation depth to the desired value. sets the minimum activation depth to the desired value.

A class specific setting overrides the global setting

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

the desired minimum activation depth Why activation? CascadeOnActivate(bool)
gets the configured minimum activation depth. gets the configured minimum activation depth. In client-server environment this setting should be used on both client and server.

the configured minimum activation depth.
returns an IObjectField object to configure the specified field.

the name of the field to be configured.

an instance of an IObjectField object for configuration.
turns on storing static field values for this class. turns on storing static field values for this class.

By default, static field values of classes are not stored to the database file. By turning the setting on for a specific class with this switch, all non-simple-typed static field values of this class are stored the first time an object of the class is stored, and restored, every time a database file is opened afterwards, after class meta information is loaded for this class (which can happen by querying for a class or by loading an instance of a class).

To update a static field value, once it is stored, you have to the following in this order:
(1) open the database file you are working agains
(2) make sure the class metadata is loaded
objectContainer.Query().Constrain(typeof(Foo));
(3) change the static member
(4) store the static member explicitely
objectContainer.Store(Foo.staticMember);

The setting will be ignored for simple types.

Use this setting for constant static object members.

This option will slow down the process of opening database files and the stored objects will occupy space in the database file.

In client-server environment this setting should be used on both client and server.

This setting can NOT be applied to an open object container.

renames a stored class. renames a stored class.

Use this method to refactor classes.

In client-server environment this setting should be used on both client and server.

This setting can NOT be applied to an open object container.

the new fully qualified class name.
allows to specify if transient fields are to be stored. allows to specify if transient fields are to be stored.
The default for every class is false.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether or not transient fields are to be stored.
registers a translator for this class. registers a translator for this class.



The use of an IObjectTranslator is not compatible with the use of an internal class ObjectMarshaller.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

this may be an IObjectTranslator or an IObjectConstructor IObjectTranslator IObjectConstructor
specifies the updateDepth for this class. specifies the updateDepth for this class.

see the documentation of Db4objects.Db4o.IObjectContainer.Store(object) for further details.

The default setting is 0: Only the object passed to Db4objects.Db4o.IObjectContainer.Store(object) will be updated.

In client-server environment this setting should be used on both client and server.

the depth of the desired update for this class. IConfiguration.UpdateDepth(int) CascadeOnUpdate(bool) IObjectField.CascadeOnUpdate(bool) Using callbacks
interface to allow instantiating objects by calling specific constructors. interface to allow instantiating objects by calling specific constructors.

By writing classes that implement this interface, it is possible to define which constructor is to be used during the instantiation of a stored object.

Before starting a db4o session, translator classes that implement the ObjectConstructor or IObjectTranslator need to be registered.

Example:
IConfiguration config = Db4oFactory.Configure();
IObjectClass oc = config.ObjectClass("Namespace.ClassName");
oc.Translate(new FooTranslator());


translator interface to translate objects on storage and activation. translator interface to translate objects on storage and activation.

By writing classes that implement this interface, it is possible to define how application classes are to be converted to be stored more efficiently.

Before starting a db4o session, translator classes need to be registered. An example:
IObjectClass oc = config.ObjectClass("Namespace.ClassName");
oc.Translate(new FooTranslator());


db4o calls this method during storage and query evaluation. db4o calls this method during storage and query evaluation. the ObjectContainer used the Object to be translated return the object to store.
It needs to be of the class StoredClass() .
db4o calls this method during activation. db4o calls this method during activation. the ObjectContainer used the object to set the members on the object that was stored return the Class you are converting to. return the Class you are converting to. the Class of the object you are returning with the method OnStore(Db4objects.Db4o.IObjectContainer, object) db4o calls this method when a stored object needs to be instantiated. db4o calls this method when a stored object needs to be instantiated.

the ObjectContainer used the object stored with ObjectTranslator.onStore . the instantiated object.
configuration interface for fields of classes. configuration interface for fields of classes.

Use IObjectClass.ObjectField(string) to access this setting.

sets cascaded activation behaviour. sets cascaded activation behaviour.

Setting cascadeOnActivate to true will result in the activation of the object attribute stored in this field if the parent object is activated.

The default setting is false.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether activation is to be cascaded to the member object. Why activation? IObjectClass.CascadeOnActivate(bool) Db4objects.Db4o.IObjectContainer.Activate(object, int) Using callbacks
sets cascaded delete behaviour. sets cascaded delete behaviour.

Setting cascadeOnDelete to true will result in the deletion of the object attribute stored in this field on the parent object if the parent object is passed to Db4objects.Db4o.IObjectContainer.Delete(object) .

Caution !
This setting will also trigger deletion of the old member object, on calls to . An example of the behaviour can be found in IObjectClass.CascadeOnDelete(bool)

The default setting is false.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether deletes are to be cascaded to the member object. IObjectClass.CascadeOnDelete(bool) Db4objects.Db4o.IObjectContainer.Delete(object) Using callbacks
sets cascaded update behaviour. sets cascaded update behaviour.

Setting cascadeOnUpdate to true will result in the update of the object attribute stored in this field if the parent object is passed to Db4objects.Db4o.IObjectContainer.Store(object) .

The default setting is false.

In client-server environment this setting should be used on both client and server.

This setting can be applied to an open object container.

whether updates are to be cascaded to the member object. com.db4o.ObjectContainer#set IObjectClass.CascadeOnUpdate(bool) IObjectClass.UpdateDepth(int) Using callbacks
turns indexing on or off. turns indexing on or off.

Field indices dramatically improve query performance but they may considerably reduce storage and update performance.
The best benchmark whether or not an index on a field achieves the desired result is the completed application - with a data load that is typical for it's use.

This configuration setting is only checked when the Db4objects.Db4o.IObjectContainer is opened. If the setting is set to true and an index does not exist, the index will be created. If the setting is set to false and an index does exist the index will be dropped.

In client-server environment this setting should be used on both client and server.

If this setting is applied to an open ObjectContainer it will take an effect on the next time ObjectContainer is opened.

specify true or false to turn indexing on for this field
renames a field of a stored class. renames a field of a stored class.

Use this method to refactor classes.

In client-server environment this setting should be used on both client and server.

This setting can NOT be applied to an open object container.

the new field name.
interface to configure the querying settings to be used by the query processor. interface to configure the querying settings to be used by the query processor.

All settings can be configured after opening an ObjectContainer. In a Client/Server setup the client-side configuration will be used.
configures the query processor evaluation mode. configures the query processor evaluation mode.

The db4o query processor can run in three modes:
- Immediate mode
- Snapshot mode
- Lazy mode

In Immediate mode, a query will be fully evaluated when Db4objects.Db4o.Query.IQuery.Execute() is called. The complete Db4objects.Db4o.IObjectSet of all matching IDs is generated immediately.

In Snapshot mode, the Db4objects.Db4o.Query.IQuery.Execute() call will trigger all index processing immediately. A snapshot of the current state of all relevant indexes is taken for further processing by the SODA query processor. All non-indexed constraints and all evaluations will be run when the user application iterates through the resulting Db4objects.Db4o.IObjectSet .

In Lazy mode, the Db4objects.Db4o.Query.IQuery.Execute() call will only create an Iterator against the best index found. Further query processing (including all index processing) will happen when the user application iterates through the resulting Db4objects.Db4o.IObjectSet .

Advantages and disadvantages of the individual modes:

Immediate mode
+ If the query is intended to iterate through the entire resulting Db4objects.Db4o.IObjectSet , this mode will be slightly faster than the others.
+ The query will process without intermediate side effects from changed objects (by the caller or by other transactions).
- Query processing can block the server for a long time.
- In comparison to the other modes it will take longest until the first results are returned.
- The ObjectSet will require a considerate amount of memory to hold the IDs of all found objects.

Snapshot mode
+ Index processing will happen without possible side effects from changes made by the caller or by other transaction.
+ Since index processing is fast, a server will not be blocked for a long time.
- The entire candidate index will be loaded into memory. It will stay there until the query ObjectSet is garbage collected. In a C/S setup, the memory will be used on the server side.

Lazy mode
+ The call to Db4objects.Db4o.Query.IQuery.Execute() will return very fast. First results can be made available to the application before the query is fully processed.
+ A query will consume hardly any memory at all because no intermediate ID representation is ever created.
- Lazy queries check candidates when iterating through the resulting Db4objects.Db4o.IObjectSet . In doing so the query processor takes changes into account that may have happened since the Query#execute()call: committed changes from other transactions, and uncommitted changes from the calling transaction. There is a wide range of possible side effects. The underlying index may have changed. Objects themselves may have changed in the meanwhile. There even is the chance of creating an endless loop, if the caller of the iterates through the Db4objects.Db4o.IObjectSet and changes each object in a way that it is placed at the end of the index: The same objects can be revisited over and over. In lazy mode it can make sense to work in a way one would work with collections to avoid concurrent modification exceptions. For instance one could iterate through the Db4objects.Db4o.IObjectSet first and store all objects to a temporary other collection representation before changing objects and storing them back to db4o.

Note: Some method calls against a lazy Db4objects.Db4o.IObjectSet will require the query processor to create a snapshot or to evaluate the query fully. An example of such a call is Db4objects.Db4o.IObjectSet.Count() .

The default query evaluation mode is Immediate mode.

Recommendations:
- Lazy mode can be an excellent choice for single transaction read use, to keep memory consumption as low as possible.
- Client/Server applications with the risk of concurrent modifications should prefer Snapshot mode to avoid side effects from other transactions.

To change the evaluationMode, pass any of the three static QueryEvaluationMode constants from the QueryEvaluationMode class to this method:
- QueryEvaluationMode.Immediate
- QueryEvaluationMode.Snapshot
- QueryEvaluationMode.Lazy

This setting must be issued from the client side.
EvaluationMode(QueryEvaluationMode) the currently configured query evaluation mode This class provides static constants for the query evaluation modes that db4o supports. This class provides static constants for the query evaluation modes that db4o supports.

For detailed documentation please see IQueryConfiguration.EvaluationMode(QueryEvaluationMode)
Constant for immediate query evaluation. Constant for immediate query evaluation. The query is executed fully when Db4objects.Db4o.Query.IQuery.Execute() is called.

For detailed documentation please see IQueryConfiguration.EvaluationMode(QueryEvaluationMode)
Constant for snapshot query evaluation. Constant for snapshot query evaluation. When Db4objects.Db4o.Query.IQuery.Execute() is called, the query processor chooses the best indexes, does all index processing and creates a snapshot of the index at this point in time. Non-indexed constraints are evaluated lazily when the application iterates through the Db4objects.Db4o.IObjectSet resultset of the query.

For detailed documentation please see IQueryConfiguration.EvaluationMode(QueryEvaluationMode)
Constant for lazy query evaluation. Constant for lazy query evaluation. When Db4objects.Db4o.Query.IQuery.Execute() is called, the query processor only chooses the best index and creates an iterator on this index. Indexes and constraints are evaluated lazily when the application iterates through the Db4objects.Db4o.IObjectSet resultset of the query.

For detailed documentation please see IQueryConfiguration.EvaluationMode(QueryEvaluationMode)
internal method, ignore please. internal method, ignore please. internal method, ignore please. internal method, ignore please. Assigns a fixed, pre-defined name to the given Db4objects.Db4o.IObjectContainer . a simple Alias for a single Class or Type, using equals on the names in the resolve method. a simple Alias for a single Class or Type, using equals on the names in the resolve method.

See IAlias for concrete examples.
pass the stored name as the first parameter and the desired runtime name as the second parameter. pass the stored name as the first parameter and the desired runtime name as the second parameter. returns the stored type name if the alias was written for the passed runtime type name returns the runtime type name if the alias was written for the passed stored type name Wildcard Alias functionality to create aliases for packages, namespaces or multiple similar named classes. Wildcard Alias functionality to create aliases for packages, namespaces or multiple similar named classes. One single '*' wildcard character is supported in the names.

See IAlias for concrete examples.
Create a WildcardAlias with two patterns, the stored pattern and the pattern that is to be used at runtime. Create a WildcardAlias with two patterns, the stored pattern and the pattern that is to be used at runtime. One single '*' is allowed as a wildcard character. resolving is done through simple pattern matching resolving is done through simple pattern matching Base class for all constraint exceptions. Base class for all constraint exceptions. ConstraintViolationException constructor with a specific message. ConstraintViolationException constructor with a specific message. exception message configures a field of a class to allow unique values only. configures a field of a class to allow unique values only. constructor to create a UniqueFieldValueConstraint. constructor to create a UniqueFieldValueConstraint. can be a class (Java) / Type (.NET) / instance of the class / fully qualified class name the name of the field that is to be unique. internal method, public for implementation reasons. internal method, public for implementation reasons. db4o-specific exception.

This exception can be thrown by a UniqueFieldValueConstraint on commit.
Db4objects.Db4o.Config.IObjectField.Indexed(bool) Db4objects.Db4o.Config.IConfiguration.Add(Db4objects.Db4o.Config.IConfigurationItem)
Constructor with a message composed from the class and field name of the entity causing the exception. Constructor with a message composed from the class and field name of the entity causing the exception. class, which caused the exception field, which caused the exception Factory class to open db4o instances in embedded mode. Factory class to open db4o instances in embedded mode. Db4objects.Db4o.CS.Db4oClientServer in Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients. 7.5 Creates a fresh IEmbeddedConfiguration instance. a fresh, independent configuration with all options set to their default values opens an IObjectContainer on the specified database file for local use.

A database file can only be opened once, subsequent attempts to open another IObjectContainer against the same file will result in a DatabaseFileLockedException .

Database files can only be accessed for readwrite access from one process at one time. All versions except for db4o mobile edition use an internal mechanism to lock the database file for other processes.

a custom IConfiguration instance to be obtained via newConfiguration an absolute or relative path to the database file an open IObjectContainer Db4objects.Db4o.Config.IConfiguration.ReadOnly Db4objects.Db4o.Config.IConfiguration.Encrypt Db4objects.Db4o.Config.IConfiguration.Password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates is set to false. database was configured as read-only.
Same as calling OpenFile(Db4objects.Db4o.Config.IEmbeddedConfiguration, string) with a fresh configuration ( NewConfiguration() ). an absolute or relative path to the database file OpenFile(Db4objects.Db4o.Config.IEmbeddedConfiguration, string) factory class to start db4o database engines. factory class to start db4o database engines.

This class provides static methods to
- open single-user databases OpenFile(string)
- open db4o servers OpenServer(string, int)
- connect to db4o servers OpenClient(string, int, string, string)
- provide access to the global configuration context Configure()
- print the version number of this db4o version Main(java.lang.String[])
ExtDb4o for extended functionality.
prints the version name of this db4o version to System.out. prints the version name of this db4o version to System.out. returns the global db4o IConfiguration context for the running CLR session.

The IConfiguration can be overriden in each ObjectContainer .

the global configuration context
Creates a fresh IConfiguration instance. a fresh, independent configuration with all options set to their default values Creates a clone of the global db4o IConfiguration . a fresh configuration with all option values set to the values currently configured for the global db4o configuration context Operates just like Db4objects.Db4o.Db4oFactory.OpenClient , but uses the global db4o IConfiguration context. opens an IObjectContainer client and connects it to the specified named server and port.

The server needs to allow access for the specified user and password.

A client IObjectContainer can be cast to IExtClient to use extended IExtObjectContainer and IExtClient methods.

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients.
a custom IConfiguration instance to be obtained via Db4objects.Db4o.Db4oEmbedded.NewConfiguration the host name the port the server is using the user name the user password an open IObjectContainer Db4objects.Db4o.IObjectServer.GrantAccess I/O operation failed or was unexpectedly interrupted. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates is set to false. password supplied for the connection is invalid.
opens an IObjectContainer client and connects it to the specified named server and port.

The server needs to allow access for the specified user and password.

A client IObjectContainer can be cast to IExtClient to use extended IExtObjectContainer and IExtClient methods.

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients.
a custom IConfiguration instance to be obtained via Db4objects.Db4o.Db4oEmbedded.NewConfiguration the host name the port the server is using the user name the user password an open IObjectContainer Db4objects.Db4o.IObjectServer.GrantAccess I/O operation failed or was unexpectedly interrupted. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates is set to false. password supplied for the connection is invalid.
Operates just like Db4oFactory.OpenFile , but uses the global db4o IConfiguration context. opens an IObjectContainer on the specified database file for local use.

A database file can only be opened once, subsequent attempts to open another IObjectContainer against the same file will result in a DatabaseFileLockedException .

Database files can only be accessed for readwrite access from one process at one time. All versions except for db4o mobile edition use an internal mechanism to lock the database file for other processes.

an absolute or relative path to the database file an open IObjectContainer IConfiguration.ReadOnly IConfiguration.Encrypt IConfiguration.Password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and IConfiguration.AllowVersionUpdates is set to false. database was configured as read-only.
opens an IObjectContainer on the specified database file for local use.

A database file can only be opened once, subsequent attempts to open another IObjectContainer against the same file will result in a DatabaseFileLockedException .

Database files can only be accessed for readwrite access from one process at one time. All versions except for db4o mobile edition use an internal mechanism to lock the database file for other processes.

a custom IConfiguration instance to be obtained via Db4oFactory.NewConfiguration an absolute or relative path to the database file an open IObjectContainer IConfiguration.ReadOnly IConfiguration.Encrypt IConfiguration.Password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and IConfiguration.AllowVersionUpdates is set to false. database was configured as read-only.
Operates just like Db4objects.Db4o.Db4oFactory.OpenServer , but uses the global db4o IConfiguration context. Opens an IObjectServer on the specified database file and port.

If the server does not need to listen on a port because it will only be used in embedded mode with Db4objects.Db4o.IObjectServer.OpenClient , specify '0' as the port number.

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients.
an absolute or relative path to the database file the port to be used, or 0, if the server should not open a port, because it will only be used with Db4objects.Db4o.IObjectServer.OpenClient . Specify a value < 0 if an arbitrary free port should be chosen - see Db4objects.Db4o.Ext.IExtObjectServer.Port . an IObjectServer listening on the specified port. Db4objects.Db4o.Config.IConfiguration.ReadOnly Db4objects.Db4o.Config.IConfiguration.Encrypt Db4objects.Db4o.Config.IConfiguration.Password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates is set to false. database was configured as read-only.
opens an IObjectServer on the specified database file and port.

If the server does not need to listen on a port because it will only be used in embedded mode with Db4objects.Db4o.IObjectServer.OpenClient , specify '0' as the port number.

This method is obsolete, see the Db4objects.Db4o.CS.Db4oClientServer class in Db4objects.Db4o.CS.dll for methods to open db4o servers and db4o clients.
a custom IConfiguration instance to be obtained via Db4objects.Db4o.Db4oEmbedded.NewConfiguration an absolute or relative path to the database file the port to be used, or 0, if the server should not open a port, because it will only be used with Db4objects.Db4o.IObjectServer.OpenClient . Specify a value < 0 if an arbitrary free port should be chosen - see Db4objects.Db4o.Ext.IExtObjectServer.Port . an IObjectServer listening on the specified port. Db4objects.Db4o.Config.IConfiguration.ReadOnly Db4objects.Db4o.Config.IConfiguration.Encrypt Db4objects.Db4o.Config.IConfiguration.Password I/O operation failed or was unexpectedly interrupted. the required database file is locked by another process. runtime configuration is not compatible with the configuration of the database file. open operation failed because the database file is in old format and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates is set to false. database was configured as read-only.
returns the version name of the used db4o version. returns the version name of the used db4o version.

version information as a String.
indexes all fields prints query graph information to the console allows faking the Db4oDatabase identity object, so the first stored object in the debugger is the actually persisted object Changing this setting to true will fail some tests that expect database files to have identity prints more stack traces makes C/S timeouts longer, so C/S does not time out in the debugger turns freespace debuggin on fills deleted slots with 'X' and overrides any configured freespace filler checks monitor conditions to make sure only the thread with the global monitor is allowed entry to the core makes sure a configuration entry is generated for each persistent class makes sure a configuration entry is generated for each persistent field allows turning weak references off prints all communicated messages to the console allows turning NIO off on Java allows overriding the file locking mechanism to turn it off Base class for defragment ID mappings. Base class for defragment ID mappings. Defragment The ID mapping used internally during a defragmentation run. The ID mapping used internally during a defragmentation run. Defragment Returns a previously registered mapping ID for the given ID if it exists. Returns a previously registered mapping ID for the given ID if it exists. The original ID The mapping ID for the given original ID or 0, if none has been registered. Registers a mapping for the given IDs. Registers a mapping for the given IDs. The original ID The ID to be mapped to the original ID. true if the given original ID specifies a class slot, false otherwise. Maps an ID to a slot provides a Visitable of all mappings of IDs to slots. provides a Visitable of all mappings of IDs to slots. Prepares the mapping for use. Prepares the mapping for use. Shuts down the mapping after use. Shuts down the mapping after use. returns the slot address for an ID Database based mapping for IDs during a defragmentation run. Database based mapping for IDs during a defragmentation run. Use this mapping to keep memory consumption lower than when using the InMemoryIdMapping . Defragment Will maintain the ID mapping as a BTree in the file with the given path. Will maintain the ID mapping as a BTree in the file with the given path. If a file exists in this location, it will be DELETED. Node size and cache height of the tree will be the default values used by the BTree implementation. The tree will never commit. The location where the BTree file should be created. Will maintain the ID mapping as a BTree in the file with the given path. Will maintain the ID mapping as a BTree in the file with the given path. If a file exists in this location, it will be DELETED. The location where the BTree file should be created. The size of a BTree node The number of inserts after which a commit should be issued (<=0: never commit) defragments database files. defragments database files.

db4o structures storage inside database files as free and occupied slots, very much like a file system - and just like a file system it can be fragmented.

The simplest way to defragment a database file:

Defragment.Defrag("sample.yap");

This will move the file to "sample.yap.backup", then create a defragmented version of this file in the original position, using a temporary file "sample.yap.mapping". If the backup file already exists, this will throw an exception and no action will be taken.

For more detailed configuration of the defragmentation process, provide a DefragmentConfig instance:

DefragmentConfig config=new DefragmentConfig("sample.yap","sample.bap",new BTreeIDMapping("sample.map"));
config.ForceBackupDelete(true);
config.StoredClassFilter(new AvailableClassFilter());
config.Db4oConfig(db4oConfig);
Defragment.Defrag(config);


This will move the file to "sample.bap", then create a defragmented version of this file in the original position, using a temporary file "sample.map" for BTree mapping. If the backup file already exists, it will be deleted. The defragmentation process will skip all classes that have instances stored within the yap file, but that are not available on the class path (through the current classloader). Custom db4o configuration options are read from the IConfiguration passed as db4oConfig. Note: For some specific, non-default configuration settings like UUID generation, etc., you must pass an appropriate db4o configuration, just like you'd use it within your application for normal database operation.
Renames the file at the given original path to a backup file and then builds a defragmented version of the file in the original place. Renames the file at the given original path to a backup file and then builds a defragmented version of the file in the original place. The path to the file to be defragmented. if the original file cannot be moved to the backup location Renames the file at the given original path to the given backup file and then builds a defragmented version of the file in the original place. Renames the file at the given original path to the given backup file and then builds a defragmented version of the file in the original place. The path to the file to be defragmented. The path to the backup file to be created. if the original file cannot be moved to the backup location Renames the file at the configured original path to the configured backup path and then builds a defragmented version of the file in the original place. Renames the file at the configured original path to the configured backup path and then builds a defragmented version of the file in the original place. The configuration for this defragmentation run. if the original file cannot be moved to the backup location Renames the file at the configured original path to the configured backup path and then builds a defragmented version of the file in the original place. Renames the file at the configured original path to the configured backup path and then builds a defragmented version of the file in the original place. The configuration for this defragmentation run. A listener for status notifications during the defragmentation process. if the original file cannot be moved to the backup location Listener for defragmentation process messages. Listener for defragmentation process messages. Defragment This method will be called when the defragment process encounters file layout anomalies during the defragmentation process. This method will be called when the defragment process encounters file layout anomalies during the defragmentation process. The message from the defragmentation process. Configuration for a defragmentation run. Configuration for a defragmentation run. Defragment Creates a configuration for a defragmentation run. Creates a configuration for a defragmentation run. The backup and mapping file paths are generated from the original path by appending the default suffixes. All properties other than the provided paths are set to FALSE by default. The path to the file to be defragmented. Must exist and must be a valid db4o file. Creates a configuration for a defragmentation run with in-memory mapping. Creates a configuration for a defragmentation run with in-memory mapping. All properties other than the provided paths are set to FALSE by default. The path to the file to be defragmented. Must exist and must be a valid db4o file. The path to the backup of the original file. No file should exist at this position, otherwise it will be OVERWRITTEN if forceBackupDelete() is set to true! Creates a configuration for a defragmentation run. Creates a configuration for a defragmentation run. All properties other than the provided paths are set to FALSE by default. The path to the file to be defragmented. Must exist and must be a valid db4o file. The path to the backup of the original file. No file should exist at this position, otherwise it will be OVERWRITTEN if forceBackupDelete() is set to true! The Id mapping to be used internally. Pass either a InMemoryIdMapping for fastest defragment or a DatabaseIdMapping for low memory consumption. The path to the file to be defragmented. The path to the backup of the original file. The temporary ID mapping used internally. For internal use only. The IStoredClassFilter used to select stored class extents to be included into the defragmented file. The IStoredClassFilter used to select stored class extents to be included into the defragmented file. true, if an existing backup file should be deleted, false otherwise. true, if an existing backup file should be deleted, false otherwise. allows turning on and off readonly mode.

When changed classes are likely to be detected defragment, it may be required to open the original database in read/write mode.
allows turning on and off readonly mode.

When changed classes are likely to be detected defragment, it may be required to open the original database in read/write mode.

Readonly mode is the default setting.
false, to turn off readonly mode.
true, if the original database file is to be opened in readonly mode. The db4o IConfiguration to be applied during the defragment process. The db4o IConfiguration to be applied during the defragment process. The db4o IEmbeddedConfiguration to be applied during the defragment process. 7.9 The number of processed object (slots) that should trigger an intermediate commit of the target file. Default: 0, meaning: never. Instruct the defragment process to upgrade the source file to the current db4o version prior to defragmenting it. Instruct the defragment process to upgrade the source file to the current db4o version prior to defragmenting it. Use this option if your source file has been created with an older db4o version than the one you are using. The location for an intermediate, upgraded version of the source file. Filter for StoredClass instances. Filter for StoredClass instances. StoredClass instance to be checked true, if the given StoredClass instance should be accepted, false otherwise. A message from the defragmentation process. A message from the defragmentation process. This is a stub only and will be refined. Currently instances of these class will only be created and sent to registered listeners when invalid IDs are encountered during the defragmentation process. These probably are harmless and the result of a user-initiated delete operation. Defragment Encapsulates services involving source and target database files during defragmenting. Encapsulates services involving source and target database files during defragmenting. A mapping from db4o file source IDs/addresses to target IDs/addresses, used for defragmenting. A mapping from db4o file source IDs/addresses to target IDs/addresses, used for defragmenting. a mapping for the given id. if it does refer to a system handler or the empty reference (0), returns the given id. if the given id does not refer to a system handler or the empty reference (0) and if no mapping is found First step in the defragmenting process: Allocates pointer slots in the target file for each ID (but doesn't fill them in, yet) and registers the mapping from source pointer address to target pointer address. First step in the defragmenting process: Allocates pointer slots in the target file for each ID (but doesn't fill them in, yet) and registers the mapping from source pointer address to target pointer address. Implements one step in the defragmenting process. Implements one step in the defragmenting process. In-memory mapping for IDs during a defragmentation run. In-memory mapping for IDs during a defragmentation run. This is faster than the DatabaseIdMapping but it uses more memory. If you have OutOfMemory conditions with this id mapping, use the DatabaseIdMapping instead. Defragment Second step in the defragmenting process: Fills in target file pointer slots, copies content slots from source to target and triggers ID remapping therein by calling the appropriate db4o/marshaller defrag() implementations. Second step in the defragmenting process: Fills in target file pointer slots, copies content slots from source to target and triggers ID remapping therein by calling the appropriate db4o/marshaller defrag() implementations. During the process, the actual address mappings for the content slots are registered for use with string indices. turning debug on makes the file format human readable Diagnostic, if class has no fields. Diagnostic, if class has no fields. base class for Diagnostic messages Marker interface for Diagnostic messages

Diagnostic system can be enabled on a running db4o database to notify a user about possible problems or misconfigurations.
Marker interface for Diagnostic messages

Diagnostic system can be enabled on a running db4o database to notify a user about possible problems or misconfigurations. Diagnostic messages must implement this interface and are usually derived from DiagnosticBase class. A separate Diagnostic implementation should be used for each problem.
DiagnosticBase IDiagnosticConfiguration
returns the reason for the message returns the potential problem that triggered the message suggests a possible solution for the possible problem Diagnostic to recommend Defragment when needed. Diagnostic to recommend Defragment when needed. Diagnostic on failed delete. Diagnostic on failed delete. Query tries to descend into a field of a class that is configured to be translated (and thus cannot be descended into). Query tries to descend into a field of a class that is configured to be translated (and thus cannot be descended into). prints Diagnostic messsages to the Console. prints Diagnostic messages to the Console. Install this Db4objects.Db4o.Diagnostic.IDiagnosticListener with:
commonConfig.Diagnostic.AddListener(new DiagnosticToConsole());
Db4objects.Db4o.Diagnostic.IDiagnosticConfiguration
listens to Diagnostic messages. listens to Diagnostic messages.

Create a class that implements this listener interface and add the listener by calling commonConfig.Diagnostic.AddListener().
Db4objects.Db4o.Diagnostic.IDiagnosticConfiguration
this method will be called with Diagnostic messages. this method will be called with Diagnostic messages. redirects Diagnostic messages to the Console. redirects Diagnostic messages to the Console. provides methods to configure the behaviour of db4o diagnostics. provides methods to configure the behaviour of db4o diagnostics.

Diagnostic system can be enabled on a running db4o database to notify a user about possible problems or misconfigurations. Diagnostic listeners can be be added and removed with calls to this interface. To install the most basic listener call:
commonConfig.Diagnostic.AddListener(new DiagnosticToConsole());
IConfiguration.Diagnostic IDiagnosticListener
adds a DiagnosticListener to listen to Diagnostic messages. adds a DiagnosticListener to listen to Diagnostic messages. removes all DiagnosticListeners. removes all DiagnosticListeners. Diagnostic, if query was required to load candidate set from class index. Diagnostic, if query was required to load candidate set from class index. Diagnostic if class not found Diagnostic, if Native Query can not be run optimized. Diagnostic, if Native Query can not be run optimized. Diagnostic if Db4objects.Db4o.Config.IObjectClass.ObjectField(string) was called on a field that does not exist. Diagnostic, if update depth greater than 1. Diagnostic, if update depth greater than 1. Argument for object related events which can be cancelled. Argument for object related events which can be cancelled. IEventRegistry ICancellableEventArgs Arguments for object related events. Arguments for object related events. IEventRegistry Creates a new instance for the specified object. Creates a new instance for the specified object. The object that triggered this event. The object that triggered this event. Argument for events related to cancellable actions. Argument for events related to cancellable actions. IEventRegistry Cancels the action related to this event. Cancels the action related to this event. Although the related action will be cancelled all the registered listeners will still receive the event. Queries if the action was already cancelled by some event listener. Queries if the action was already cancelled by some event listener. Creates a new instance for the specified object. Creates a new instance for the specified object. ICancellableEventArgs.Cancel() ICancellableEventArgs.IsCancelled() Arguments for commit time related events. Arguments for commit time related events. IEventRegistry Returns a iteration db4o-specific exception.

Exception thrown during event dispatching if a client provided event handler throws.

The exception thrown by the client can be retrieved by calling EventException.InnerException.
db4o-specific exception.

Exception thrown during event dispatching if a client provided event handler throws.

The exception thrown by the client can be retrieved by calling EventException.InnerException.
Provides an interface for getting an IEventRegistry from an Db4objects.Db4o.IObjectContainer . Returns an IEventRegistry for registering events with the specified container. Provides a way to register event handlers for specific IObjectContainer events.
EventRegistry methods represent events available for registering callbacks. EventRegistry instance can be obtained from EventRegistryFactory. EventRegistry registry = EventRegistryFactory.ForObjectContainer(container); A new callback can be registered for an event with the following code: private static void OnCreated(object sender, ObjectInfoEventArgs args) { Object obj = args.Object; if (obj is Pilot) { Console.WriteLine(obj.ToString()); } } registry.Created+=new System.EventHandler<ObjectInfoEventArgs>(OnCreated); EventRegistryFactory
This event is fired upon a query start and can be used to gather query statistics. This event is fired upon a query start and can be used to gather query statistics. The query object is available from QueryEventArgs event parameter.
event QueryEventArgs
This event is fired upon a query end and can be used to gather query statistics. This event is fired upon a query end and can be used to gather query statistics. The query object is available from QueryEventArgs event parameter.
event QueryEventArgs
This event is fired before an object is saved for the first time. This event is fired before an object is saved for the first time. The object can be obtained from CancellableObjectEventArgs event parameter. The action can be cancelled using CancellableObjectEventArgs.Cancel() event CancellableObjectEventArgs Db4objects.Db4o.IObjectContainer.Store(object) This event is fired before an object is activated. This event is fired before an object is activated. The object can be obtained from CancellableObjectEventArgs event parameter. The action can be cancelled using CancellableObjectEventArgs.Cancel() event CancellableObjectEventArgs Db4objects.Db4o.IObjectContainer.Activate(object, int) This event is fired before an object is updated. This event is fired before an object is updated. The object can be obtained from CancellableObjectEventArgs event parameter. The action can be cancelled using CancellableObjectEventArgs.Cancel() event CancellableObjectEventArgs Db4objects.Db4o.IObjectContainer.Store(object) This event is fired before an object is deleted. This event is fired before an object is deleted. The object can be obtained from CancellableObjectEventArgs event parameter. The action can be cancelled using CancellableObjectEventArgs.Cancel()

Note, that this event is not available in networked client/server mode and will throw an exception when attached to a client ObjectContainer.
event CancellableObjectEventArgs Db4objects.Db4o.IObjectContainer.Delete(object)
This event is fired before an object is deactivated. This event is fired before an object is deactivated. The object can be obtained from CancellableObjectEventArgs event parameter. The action can be cancelled using CancellableObjectEventArgs.Cancel() event CancellableObjectEventArgs Db4objects.Db4o.IObjectContainer.Deactivate(object, int) This event is fired after an object is activated. This event is fired after an object is activated. The object can be obtained from the ObjectInfoEventArgs event parameter.

The event can be used to trigger some post-activation functionality.
event ObjectInfoEventArgs Db4objects.Db4o.IObjectContainer.Activate(object, int)
This event is fired after an object is created (saved for the first time). This event is fired after an object is created (saved for the first time). The object can be obtained from the ObjectInfoEventArgs event parameter.

The event can be used to trigger some post-creation functionality.
event ObjectEventArgs Db4objects.Db4o.IObjectContainer.Store(object)
This event is fired after an object is updated. This event is fired after an object is updated. The object can be obtained from the ObjectInfoEventArgs event parameter.

The event can be used to trigger some post-update functionality.
event ObjectInfoEventArgs Db4objects.Db4o.IObjectContainer.Store(object)
This event is fired after an object is deleted. This event is fired after an object is deleted. The object can be obtained from the ObjectInfoEventArgs event parameter.

The event can be used to trigger some post-deletion functionality.

Note, that this event is not available in networked client/server mode and will throw an exception when attached to a client ObjectContainer.
event ObjectEventArgs Db4objects.Db4o.IObjectContainer.Delete(object)
This event is fired after an object is deactivated. This event is fired after an object is deactivated. The object can be obtained from the ObjectInfoEventArgs event parameter.

The event can be used to trigger some post-deactivation functionality.
event ObjectEventArgs Db4objects.Db4o.IObjectContainer.Delete(object)
This event is fired just before a transaction is committed. This event is fired just before a transaction is committed. The transaction and a list of the modified objects can be obtained from the CommitEventArgs event parameter.

Committing event gives a user a chance to interrupt the commit and rollback the transaction.
event CommitEventArgs Db4objects.Db4o.IObjectContainer.Commit()
This event is fired after a transaction has been committed. This event is fired after a transaction has been committed. The transaction and a list of the modified objects can be obtained from the CommitEventArgs event parameter.

The event can be used to trigger some post-commit functionality.
event CommitEventArgs Db4objects.Db4o.IObjectContainer.Commit()
This event is fired when a persistent object is instantiated. This event is fired when a persistent object is instantiated. The object can be obtained from the ObjectInfoEventArgs event parameter. event ObjectInfoEventArgs This event is fired when a new class is registered with metadata. This event is fired when a new class is registered with metadata. The class information can be obtained from ClassEventArgs event parameter. event ClassEventArgs This event is fired when the Db4objects.Db4o.IObjectContainer.Close() is called. event This event is fired when the Db4objects.Db4o.IObjectContainer has finished its startup procedure. event Arguments for container related events. Arguments for container related events. IEventRegistry Arguments for Db4objects.Db4o.Query.IQuery related events. IEventRegistry Creates a new instance for the specified Db4objects.Db4o.Query.IQuery instance. The Db4objects.Db4o.Query.IQuery which triggered the event. 7.12 db4o-specific exception. db4o-specific exception.

This exception is thrown when the current backup process encounters another backup process already running.
db4o-specific exception. db4o-specific exception.

This exception is thrown when the object container required for the current operation was closed or failed to open.
Db4objects.Db4o.Db4oFactory.OpenFile(string) Db4objects.Db4o.IObjectContainer.Close()
db4o-specific exception.

this Exception is thrown during any of the db4o open calls if the database file is locked by another process.
db4o-specific exception.

this Exception is thrown during any of the db4o open calls if the database file is locked by another process.
Db4objects.Db4o.Db4oFactory.OpenFile(string)
Constructor with a database description message message, which can help to identify the database Constructor with a database description and cause exception database description previous exception caused DatabaseFileLockedException db4o-specific exception.

This exception is thrown when the database file reaches the maximum allowed size.
db4o-specific exception.

This exception is thrown when the database file reaches the maximum allowed size. Upon throwing the exception the database is switched to the read-only mode.
The maximum database size is configurable and can reach up to 254GB.
Db4objects.Db4o.Config.IConfiguration.BlockSize(int)
db4o-specific exception.

This exception is thrown when a write operation is attempted on a database in a read-only mode.
db4o-specific exception.

This exception is thrown when a write operation is attempted on a database in a read-only mode.
Class to identify a database by it's signature. Class to identify a database by it's signature.

db4o UUID handling uses a reference to the Db4oDatabase object, that represents the database an object was created on.
marker interface for all special db4o types. marker interface for all special db4o types. Field is public for implementation reasons, DO NOT TOUCH! Field is public for implementation reasons, DO NOT TOUCH! This field is badly named, it really is the creation time. Field is public for implementation reasons, DO NOT TOUCH! This field is badly named, it really is the creation time. cached ObjectContainer for getting the own ID. cached ObjectContainer for getting the own ID. cached ID, only valid in combination with i_objectContainer constructor for persistence constructor for comparison and to store new ones generates a new Db4oDatabase object with a unique signature. generates a new Db4oDatabase object with a unique signature. comparison by signature. comparison by signature. gets the db4o ID, and may cache it for performance reasons. gets the db4o ID, and may cache it for performance reasons. the db4o ID for the ObjectContainer returns the unique signature make sure this Db4oDatabase is stored. make sure this Db4oDatabase is stored. Return the ID. find a Db4oDatabase with the same signature as this one db4o-specific exception.

This exception is thrown when a system IO exception is encounted by db4o process.
db4o-specific exception.

This exception is thrown when a system IO exception is encounted by db4o process.
Constructor. Constructor. Constructor allowing to specify the causing exception exception cause The requested operation is not valid in the current state but the database continues to operate. The requested operation is not valid in the current state but the database continues to operate. a unique universal identify for an object. a unique universal identify for an object.

The db4o UUID consists of two parts:
- an indexed long for fast access,
- the signature of the IObjectContainer the object was created with.

Db4oUUIDs are valid representations of objects over multiple ObjectContainers
constructs a Db4oUUID from a long part and a signature part the long part the signature part returns the long part of this UUID. returns the long part of this UUID.

To uniquely identify an object universally, db4o uses an indexed long and a reference to the Db4oDatabase object it was created on.
the long part of this UUID.
returns the signature part of this UUID. returns the signature part of this UUID.



To uniquely identify an object universally, db4o uses an indexed long and a reference to the Db4oDatabase singleton object of the IObjectContainer it was created on. This method returns the signature of the Db4oDatabase object of the ObjectContainer: the signature of the origin ObjectContainer.
the signature of the Db4oDatabase for this UUID.
Unexpected fatal error is encountered. Unexpected fatal error is encountered. A previous IO exception has switched the database file to read-only mode for controlled shutdown. A previous IO exception has switched the database file to read-only mode for controlled shutdown. generic callback interface. generic callback interface. the callback method the object passed to the callback method extended client functionality for the IExtObjectContainer interface.

Both Db4o.openClient() methods always return an ExtClient object so a cast is possible.

The ObjectContainer functionality is split into multiple interfaces to allow newcomers to focus on the essential methods.
extended functionality for the IObjectContainer interface.

Every db4o IObjectContainer always is an ExtObjectContainer so a cast is possible.

ObjectContainer.ext() is a convenient method to perform the cast.

The ObjectContainer functionality is split to two interfaces to allow newcomers to focus on the essential methods.
the interface to a db4o database, stand-alone or client/server. the interface to a db4o database, stand-alone or client/server.

The IObjectContainer interface provides methods to store, query and delete objects and to commit and rollback transactions.

An IObjectContainer can either represent a stand-alone database or a connection to a db4o server .

An IObjectContainer also represents a transaction. All work with db4o always is transactional. Both Db4objects.Db4o.IObjectContainer.Commit and Db4objects.Db4o.IObjectContainer.Rollback start new transactions immediately. For working against the same database with multiple transactions, open a db4o server with Db4objects.Db4o.Db4o.OpenServer and connect locally or over TCP .
IExtObjectContainer for extended functionality.
creates a new SODA Query .

Linq queries are the recommended main db4o query interface.

Use QueryByExample(Object template) for simple Query-By-Example.

a new IQuery object
activates all members on a stored object to the specified depth. activates all members on a stored object to the specified depth.

See "Why activation" for an explanation why activation is necessary.

The activate method activates a graph of persistent objects in memory. Only deactivated objects in the graph will be touched: their fields will be loaded from the database. The activate methods starts from a root object and traverses all member objects to the depth specified by the depth parameter. The depth parameter is the distance in "field hops" (object.field.field) away from the root object. The nodes at 'depth' level away from the root (for a depth of 3: object.member.member) will be instantiated but deactivated, their fields will be null. The activation depth of individual classes can be overruled with the methods MaximumActivationDepth() and MinimumActivationDepth() in the ObjectClass interface .

A successful call to activate triggers Activating and Activated callback methods, which can be used for cascaded activation.

Why activation? Using callbacks the object to be activated. the member depth to which activate is to cascade.
closes this IObjectContainer. closes this IObjectContainer.

A call to Close() automatically performs a Commit() .

Note that every session opened with Db4oFactory.OpenFile() requires one Close()call, even if the same filename was used multiple times.

Use while(!Close()){} to kill all sessions using this container.

success - true denotes that the last used instance of this container and the database file were closed.
commits the running transaction. commits the running transaction.

Transactions are back-to-back. A call to commit will starts a new transaction immedidately.
deactivates a stored object by setting all members to NULL. deactivates a stored object by setting all members to NULL.
Primitive types will be set to their default values. Calls to this method save memory. The method has no effect, if the passed object is not stored in the IObjectContainer.

Deactivate() triggers Deactivating and Deactivated callbacks.

Be aware that calling this method with a depth parameter greater than 1 sets members on member objects to null. This may have side effects in other places of the application.

Using callbacks Why activation? the object to be deactivated. the member depth to which deactivate is to cascade.
deletes a stored object permanently. deletes a stored object permanently.

Note that this method has to be called for every single object individually. Delete does not recurse to object members. Simple and array member types are destroyed.

Object members of the passed object remain untouched, unless cascaded deletes are configured for the class or for one of the member fields .

The method has no effect, if the passed object is not stored in the IObjectContainer.

A subsequent call to Store() with the same object newly stores the object to the IObjectContainer.

Delete() triggers Deleting and Deleted callbacks, which can be also used for cascaded deletes.

Db4objects.Db4o.Config.IObjectClass.CascadeOnDelete Db4objects.Db4o.Config.IObjectField.CascadeOnDelete Using callbacks the object to be deleted from the IObjectContainer.
returns an IObjectContainer with extended functionality. returns an IObjectContainer with extended functionality.

Every IObjectContainer that db4o provides can be casted to an IExtObjectContainer. This method is supplied for your convenience to work without a cast.

The IObjectContainer functionality is split to two interfaces to allow newcomers to focus on the essential methods.

this, casted to IExtObjectContainer
Query-By-Example interface to retrieve objects. Query-By-Example interface to retrieve objects.

QueryByExample() creates an IObjectSet containing all objects in the IObjectContainer that match the passed template object.

Calling QueryByExample(null) returns all objects stored in the IObjectContainer.


Query Evaluation
All non-null members of the template object are compared against all stored objects of the same class. Primitive type members are ignored if they are 0 or false respectively.

Arrays and all supported Collection classes are evaluated for containment. Differences in Length/Count/Size() are ignored.

Consult the documentation of the IConfiguration package to configure class-specific behaviour.


Returned Objects
The objects returned in the IObjectSet are instantiated and activated to the preconfigured depth of 5. The activation depth may be configured globally or individually for classes .

db4o keeps track of all instantiatied objects. Queries will return references to these objects instead of instantiating them a second time.

Objects newly activated by QueryByExample() can respond to the Activating callback method.

object to be used as an example to find all matching objects.

IObjectSet containing all found objects.

Why activation? Using callbacks
creates a new SODA Query .

Linq queries are the recommended main db4o query interface.

Use QueryByExample(Object template) for simple Query-By-Example.

a new IQuery object
queries for all instances of a class. queries for all instances of a class. the class to query for. the Db4objects.Db4o.IObjectSet returned by the query. Native Query Interface. Native Query Interface. Queries as with Db4objects.Db4o.IObjectContainer.Query(Predicate) , but will sort the resulting Db4objects.Db4o.IObjectSet according to the given Db4objects.Db4o.Query.IQueryComparator . the Db4objects.Db4o.Query.Predicate containing the native query expression. the Db4objects.Db4o.Query.IQueryComparator specifiying the sort order of the result the Db4objects.Db4o.IObjectSet returned by the query. Native Query Interface. Native Query Interface. Queries as with Db4objects.Db4o.IObjectContainer.Query(Predicate) , but will sort the resulting Db4objects.Db4o.IObjectSet according to the given System.Collections.IComparer . the Db4objects.Db4o.Query.Predicate containing the native query expression. the System.Collections.IComparer specifiying the sort order of the result the Db4objects.Db4o.IObjectSet returned by the query. rolls back the running transaction. rolls back the running transaction.

Transactions are back-to-back. A call to rollback will starts a new transaction immedidately.

rollback will not restore modified objects in memory. They can be refreshed from the database by calling Db4objects.Db4o.Ext.IExtObjectContainer.Refresh .
newly stores objects or updates stored objects. newly stores objects or updates stored objects.

An object not yet stored in the IObjectContainer will be stored when it is passed to Store(). An object already stored in the IObjectContainer will be updated.

Updates
- will affect all simple type object members.
- links to object members that are already stored will be updated.
- new object members will be newly stored. The algorithm traverses down new members, as long as further new members are found.
- object members that are already stored will not be updated themselves.
Every object member needs to be updated individually with a call to Store() unless a deep global or class-specific update depth was configured or cascaded updates were defined in the class or in one of the member fields . Depending if the passed object is newly stored or updated, Creating/Created or Updaing/Updated callback method is triggered. Callbacks might also be used for cascaded updates.

the object to be stored or updated. IExtObjectContainer#Store(object, depth) Db4objects.Db4o.Config.IConfiguration.UpdateDepth Db4objects.Db4o.Config.IObjectClass.UpdateDepth Db4objects.Db4o.Config.IObjectClass.CascadeOnUpdate Db4objects.Db4o.Config.IObjectField.CascadeOnUpdate Using callbacks
Native Query Interface. Native Query Interface. Queries as with Db4objects.Db4o.IObjectContainer.Query(Predicate) , but will sort the resulting Db4objects.Db4o.IObjectSet according to the given System.Collections.Generic.IComparer . the Db4objects.Db4o.Query.Predicate containing the native query expression. the System.Collections.Generic.IComparer specifiying the sort order of the result the Db4objects.Db4o.IObjectSet returned by the query. Native Query Interface. Native Query Interface. Queries as with Db4objects.Db4o.IObjectContainer.Query(Predicate) , but will sort the resulting Db4objects.Db4o.IObjectSet according to the given System.Comparison . the Db4objects.Db4o.Query.Predicate containing the native query expression. the System.Comparison specifiying the sort order of the result the Db4objects.Db4o.IObjectSet returned by the query. queries for all instances of the type extent, returning a IList of ElementType which must be assignable from extent. queries for all instances of the type extent. queries for all instances of the type extent sorting with the specified comparer. activates an object with the current activation strategy. activates an object with the current activation strategy. In regular activation mode the object will be activated to the global activation depth, ( see Db4objects.Db4o.Config.IConfiguration.ActivationDepth() ) and all configured settings for Db4objects.Db4o.Config.IObjectClass.MaximumActivationDepth(int) and Db4objects.Db4o.Config.IObjectClass.MaximumActivationDepth(int) will be respected.

In Transparent Activation Mode ( see Db4objects.Db4o.TA.TransparentActivationSupport ) the parameter object will only be activated, if it does not implement Db4objects.Db4o.TA.IActivatable . All referenced members that do not implement Db4objects.Db4o.TA.IActivatable will also be activated. Any Db4objects.Db4o.TA.IActivatable objects along the referenced graph will break cascading activation.
deactivates an object. deactivates an object. Only the passed object will be deactivated, i.e, no object referenced by this object will be deactivated. the object to be deactivated. backs up a database file of an open ObjectContainer. backs up a database file of an open ObjectContainer.

While the backup is running, the ObjectContainer can continue to be used. Changes that are made while the backup is in progress, will be applied to the open ObjectContainer and to the backup.

While the backup is running, the ObjectContainer should not be closed.

If a file already exists at the specified path, it will be overwritten.

The Db4objects.Db4o.IO.IStorage used for backup is the one configured for this container.
a fully qualified path db4o database file was closed or failed to open. is thrown when the operation is not supported in current configuration/environment I/O operation failed or was unexpectedly interrupted.
backs up a database file of an open ObjectContainer. backs up a database file of an open ObjectContainer.

While the backup is running, the ObjectContainer can continue to be used. Changes that are made while the backup is in progress, will be applied to the open ObjectContainer and to the backup.

While the backup is running, the ObjectContainer should not be closed.

If a file already exists at the specified path, it will be overwritten.

This method is intended for cross-storage backups, i.e. backup from an in-memory database to a file.
the Db4objects.Db4o.IO.IStorage to be used for backup a fully qualified path db4o database file was closed or failed to open. is thrown when the operation is not supported in current configuration/environment I/O operation failed or was unexpectedly interrupted.
binds an object to an internal object ID. binds an object to an internal object ID.

This method uses the ID parameter to load the corresponding stored object into memory and replaces this memory reference with the object parameter. The method may be used to replace objects or to reassociate an object with it's stored instance after closing and opening a database file. A subsequent call to set(Object) is necessary to update the stored object.

Requirements:
- The ID needs to be a valid internal object ID, previously retrieved with getID(Object) .
- The object parameter needs to be of the same class as the stored object.

GetID(object) the object that is to be bound the internal id the object is to be bound to db4o database file was closed or failed to open. when the provided id is outside the scope of the database IDs.
returns the Configuration context for this ObjectContainer. returns the Configuration context for this ObjectContainer.

Upon opening an ObjectContainer with any of the factory methods in the Db4o class , the global IConfiguration context is copied into the ObjectContainer. The IConfiguration can be modified individually for each ObjectContainer without any effects on the global settings.

IConfiguration the Configuration context for this ObjectContainer Db4objects.Db4o.Db4oFactory.Configure()
returns a member at the specific path without activating intermediate objects. returns a member at the specific path without activating intermediate objects.

This method allows navigating from a persistent object to it's members in a performant way without activating or instantiating intermediate objects.
the parent object that is to be used as the starting point. an array of field names to navigate by the object at the specified path or null if no object is found
returns the stored object for an internal ID. returns the stored object for an internal ID.

This is the fastest method for direct access to objects. Internal IDs can be obtained with getID(Object) . Objects will not be activated by this method. They will be returned in the activation state they are currently in, in the local cache.

Passing invalid id values to this method may result in all kinds of exceptions being thrown. OutOfMemoryError and arithmetic exceptions may occur. If an application is known to use invalid IDs, it is recommended to call this method within a catch-all block.
the internal ID the object associated with the passed ID or null, if no object is associated with this ID in this ObjectContainer. Why activation? db4o database file was closed or failed to open. when the provided id is outside the scope of the file length.
returns a stored object for a Db4oUUID .

This method is intended for replication and for long-term external references to objects. To get a Db4oUUID for an object use GetObjectInfo(object) and IObjectInfo.GetUUID() .

Objects will not be activated by this method. They will be returned in the activation state they are currently in, in the local cache.

the UUID the object for the UUID Why activation? I/O operation failed or was unexpectedly interrupted. db4o database file was closed or failed to open.
returns the internal unique object ID. returns the internal unique object ID.

db4o assigns an internal ID to every object that is stored. IDs are guaranteed to be unique within one ObjectContainer. An object carries the same ID in every db4o session. Internal IDs can be used to look up objects with the very fast getByID method.

Internal IDs will change when a database is defragmented. Use GetObjectInfo(object) , IObjectInfo.GetUUID() and GetByUUID(Db4oUUID) for long-term external references to objects.

any object the associated internal ID or 0, if the passed object is not stored in this ObjectContainer.
returns the IObjectInfo for a stored object.

This method will return null, if the passed object is not stored to this ObjectContainer.

the stored object the IObjectInfo
returns the Db4oDatabase object for this ObjectContainer. returns the Db4oDatabase object for this ObjectContainer. the Db4oDatabase identity object for this ObjectContainer. tests if an object is activated. tests if an object is activated.

isActive returns false if an object is not stored within the ObjectContainer.

to be tested

true if the passed object is active.
tests if an object with this ID is currently cached. tests if an object with this ID is currently cached.

the internal ID
tests if this ObjectContainer is closed. tests if this ObjectContainer is closed.

true if this ObjectContainer is closed.
tests if an object is stored in this ObjectContainer. tests if an object is stored in this ObjectContainer.

to be tested

true if the passed object is stored. db4o database file was closed or failed to open.
returns all class representations that are known to this ObjectContainer because they have been used or stored. returns all class representations that are known to this ObjectContainer because they have been used or stored. all class representations that are known to this ObjectContainer because they have been used or stored. returns the main synchronization lock. returns the main synchronization lock.

Synchronize over this object to ensure exclusive access to the ObjectContainer.

Handle the use of this functionality with extreme care, since deadlocks can be produced with just two lines of code.
Object the ObjectContainer lock object
opens a new ObjectContainer on top of this ObjectContainer. opens a new ObjectContainer on top of this ObjectContainer. The ObjectContainer will have it's own transaction and it's own reference system. the new ObjectContainer session. 8.0 returns a transient copy of a persistent object with all members set to the values that are currently stored to the database. returns a transient copy of a persistent object with all members set to the values that are currently stored to the database.

The returned objects have no connection to the database.

With the committed parameter it is possible to specify, whether the desired object should contain the committed values or the values that were set by the running transaction with Db4objects.Db4o.IObjectContainer.Store(object) .

A possible use case for this feature:
An application might want to check all changes applied to an object by the running transaction.

the object that is to be cloned the member depth to which the object is to be instantiated whether committed or set values are to be returned the object
unloads all clean indices from memory and frees unused objects. unloads all clean indices from memory and frees unused objects.

Call commit() and purge() consecutively to achieve the best result possible. This method can have a negative impact on performance since indices will have to be reread before further inserts, updates or queries can take place.
unloads a specific object from the db4o reference mechanism. unloads a specific object from the db4o reference mechanism.

db4o keeps references to all newly stored and instantiated objects in memory, to be able to manage object identities.

With calls to this method it is possible to remove an object from the reference mechanism, to allow it to be garbage collected. You are not required to call this method in the .NET and JDK 1.2 versions, since objects are referred to by weak references and garbage collection happens automatically.

An object removed with purge(Object) is not "known" to the ObjectContainer afterwards, so this method may also be used to create multiple copies of objects.

purge(Object) has no influence on the persistence state of objects. "Purged" objects can be reretrieved with queries.

the object to be removed from the reference mechanism.
Return the reflector currently being used by db4objects. Return the reflector currently being used by db4objects. the current Reflector. refreshs all members on a stored object to the specified depth. refreshs all members on a stored object to the specified depth.

If a member object is not activated, it will be activated by this method.

The isolation used is READ COMMITTED. This method will read all objects and values that have been committed by other transactions.

the object to be refreshed. the member depth to which refresh is to cascade.
releases a semaphore, if the calling transaction is the owner. releases a semaphore, if the calling transaction is the owner. the name of the semaphore to be released. deep update interface to store or update objects. deep update interface to store or update objects.

In addition to the normal storage interface, ObjectContainer#set(Object) , this method allows a manual specification of the depth, the passed object is to be updated.

the object to be stored or updated. the depth to which the object is to be updated com.db4o.ObjectContainer#set
attempts to set a semaphore. attempts to set a semaphore.

Semaphores are transient multi-purpose named flags for ObjectContainers .

A transaction that successfully sets a semaphore becomes the owner of the semaphore. Semaphores can only be owned by a single transaction at one point in time.

This method returns true, if the transaction already owned the semaphore before the method call or if it successfully acquires ownership of the semaphore.

The waitForAvailability parameter allows to specify a time in milliseconds to wait for other transactions to release the semaphore, in case the semaphore is already owned by another transaction.

Semaphores are released by the first occurrence of one of the following:
- the transaction releases the semaphore with ReleaseSemaphore(string)
- the transaction is closed with Db4objects.Db4o.IObjectContainer.Close()
- C/S only: the corresponding Db4objects.Db4o.IObjectServer is closed.
- C/S only: the client Db4objects.Db4o.IObjectContainer looses the connection and is timed out.

Semaphores are set immediately. They are independant of calling Db4objects.Db4o.IObjectContainer.Commit() or Db4objects.Db4o.IObjectContainer.Rollback() .

Possible use cases for semaphores:
- prevent other clients from inserting a singleton at the same time. A suggested name for the semaphore: "SINGLETON_" + Object#getClass().getName().
- lock objects. A suggested name: "LOCK_" + getID(Object)
- generate a unique client ID. A suggested name: "CLIENT_" + System.currentTimeMillis().

the name of the semaphore to be set the time in milliseconds to wait for other transactions to release the semaphore. The parameter may be zero, if the method is to return immediately. boolean flag
true, if the semaphore could be set or if the calling transaction already owned the semaphore.
false, if the semaphore is owned by another transaction.
returns a IStoredClass meta information object.

There are three options how to use this method.
Any of the following parameters are possible:
- a fully qualified class name.
- a Class object.
- any object to be used as a template.

class name, Class object, or example object.

an instance of an IStoredClass meta information object.
returns an array of all IStoredClass meta information objects. returns the ISystemInfo for this ObjectContainer.

The ISystemInfo supplies methods that provide information about system state and system settings of this ObjectContainer.
the ISystemInfo for this ObjectContainer.
returns the current transaction serial number. returns the current transaction serial number.

This serial number can be used to query for modified objects and for replication purposes.
the current transaction serial number.
checks if the client is currently connected to a server. checks if the client is currently connected to a server. true if the client is alive. extended functionality for the ObjectServer interface. extended functionality for the ObjectServer interface.

Every ObjectServer also always is an ExtObjectServer so a cast is possible.

Db4objects.Db4o.IObjectServer.Ext() is a convenient method to perform the cast.

The functionality is split to two interfaces to allow newcomers to focus on the essential methods.
the db4o server interface. the db4o server interface.

- db4o servers can be opened with Db4oFactory.OpenServer(string, int) .
- Direct in-memory connections to servers can be made with OpenClient()
- TCP connections are available through Db4oFactory.OpenClient(string, int, string, string) .

Before connecting clients over TCP, you have to GrantAccess(string, string) to the username and password combination that you want to use.
Db4o.openServer ExtObjectServer for extended functionality
closes the and writes all cached data.

true - denotes that the last instance connected to the used database file was closed.
returns an with extended functionality.

Use this method as a convenient accessor to extended methods. Every can be casted to an Db4objects.Db4o.Ext.IExtObjectServer .

The functionality is split to two interfaces to allow newcomers to focus on the essential methods.
grants client access to the specified user with the specified password. grants client access to the specified user with the specified password.

If the user already exists, the password is changed to the specified password.

the name of the user the password to be used
opens a client against this server. opens a client against this server.

A client opened with this method operates within the same VM as the server. Since an embedded client can use direct communication, without an in-between socket connection, performance will be better than a client opened with Db4oFactory.OpenClient(string, int, string, string)

Every client has it's own transaction and uses it's own cache for it's own version of all peristent objects.
backs up the database file used by the ObjectServer. backs up the database file used by the ObjectServer.

While the backup is running, the ObjectServer can continue to be used. Changes that are made while the backup is in progress, will be applied to the open ObjectServer and to the backup.

While the backup is running, the ObjectContainer should not be closed.

If a file already exists at the specified path, it will be overwritten.

a fully qualified path
returns the number of connected clients. returns the number of connected clients. returns the Db4objects.Db4o.Config.IConfiguration context for this ObjectServer.

Upon opening an ObjectServer with any of the factory methods in the Db4objects.Db4o.Db4oFactory class, the global Db4objects.Db4o.Config.IConfiguration context is copied into the ObjectServer. The Db4objects.Db4o.Config.IConfiguration can be modified individually for each ObjectServer without any effects on the global settings.

the Configuration context for this ObjectServer Db4objects.Db4o.Db4oFactory.Configure()
returns the ObjectContainer used by the server. returns the ObjectContainer used by the server.

the ObjectContainer used by the server
removes client access permissions for the specified user. removes client access permissions for the specified user.

the name of the user
The local port this server uses, 0 if disconnected or in embedded mode extended functionality for the IObjectSet interface.

Every db4o IObjectSet always is an ExtObjectSet so a cast is possible.

Db4objects.Db4o.IObjectSet.Ext() is a convenient method to perform the cast.

The ObjectSet functionality is split to two interfaces to allow newcomers to focus on the essential methods.
An ObjectSet is a representation for a set of objects returned by a query. An ObjectSet is a representation for a set of objects returned by a query.

ObjectSet extends the system collection interfaces java.util.List/System.Collections.IList where they are available. It is recommended, never to reference ObjectSet directly in code but to use List / IList instead.

Note that the underlying IObjectContainer of an ObjectSet needs to remain open as long as an ObjectSet is used. This is necessary for lazy instantiation. The objects in an ObjectSet are only instantiated when they are actually being used by the application.
for extended functionality.
returns an ObjectSet with extended functionality. returns an ObjectSet with extended functionality.

Every ObjectSet that db4o provides can be casted to an ExtObjectSet. This method is supplied for your convenience to work without a cast.

The ObjectSet functionality is split to two interfaces to allow newcomers to focus on the essential methods.
returns true if the ObjectSet has more elements. returns true if the ObjectSet has more elements. boolean - true if the ObjectSet has more elements. returns the next object in the ObjectSet. returns the next object in the ObjectSet.

Before returning the Object, next() triggers automatic activation of the Object with the respective global or class specific setting.

the next object in the ObjectSet.
resets the ObjectSet cursor before the first element. resets the ObjectSet cursor before the first element.

A subsequent call to next() will return the first element.
returns an array of internal IDs that correspond to the contained objects. returns an array of internal IDs that correspond to the contained objects.

IExtObjectContainer.GetID(object) IExtObjectContainer.GetByID(long)
returns the item at position [index] in this ObjectSet. returns the item at position [index] in this ObjectSet.

The object will be activated.
the index position in this ObjectSet. the activated object.
callback methods. callback methods.

This interface only serves as a list of all available callback methods. Every method is called individually, independantly of implementing this interface.

Using callbacks
Simply implement one or more of the listed methods in your application classes to do tasks before activation, deactivation, delete, new or update, to cancel the action about to be performed and to respond to the performed task.

Callback methods are typically used for:
- cascaded delete
- cascaded update
- cascaded activation
- restoring transient members on instantiation

Callback methods follow regular calling conventions. Methods in superclasses need to be called explicitely.

All method calls are implemented to occur only once, upon one event.
called before an Object is activated. called before an Object is activated. the ObjectContainer the object is stored in. false to prevent activation. called before an Object is deactivated. called before an Object is deactivated. the ObjectContainer the object is stored in. false to prevent deactivation. called before an Object is deleted. called before an Object is deleted.

In a client/server setup this callback method will be executed on the server.
the ObjectContainer the object is stored in. false to prevent the object from being deleted.
called before an Object is stored the first time. called before an Object is stored the first time. the ObjectContainer is about to be stored to. false to prevent the object from being stored. called before a persisted Object is updated. called before a persisted Object is updated. the ObjectContainer the object is stored in. false to prevent the object from being updated. called upon activation of an object. called upon activation of an object. the ObjectContainer the object is stored in. called upon deactivation of an object. called upon deactivation of an object. the ObjectContainer the object is stored in. called after an object was deleted. called after an object was deleted.

In a client/server setup this callback method will be executed on the server.
the ObjectContainer the object was stored in.
called after a new object was stored. called after a new object was stored. the ObjectContainer the object is stored to. called after an object was updated. called after an object was updated. the ObjectContainer the object is stored in. interface to the internal reference that an ObjectContainer holds for a stored object. interface to the internal reference that an ObjectContainer holds for a stored object. returns the internal db4o ID. returns the internal db4o ID. returns the object that is referenced. returns the object that is referenced.

This method may return null, if the object has been garbage collected.
the referenced object or null, if the object has been garbage collected.
returns a UUID representation of the referenced object. returns a UUID representation of the referenced object. UUID generation has to be turned on, in order to be able to use this feature: Db4objects.Db4o.Config.IConfiguration.GenerateUUIDs(Db4objects.Db4o.Config.ConfigScope) the UUID of the referenced object. returns the transaction serial number ("version") the referenced object was stored with last. returns the transaction serial number ("version") the referenced object was stored with last. Version number generation has to be turned on, in order to be able to use this feature: Db4objects.Db4o.Config.IConfiguration.GenerateVersionNumbers(Db4objects.Db4o.Config.ConfigScope)
This feature was replaced by GetCommitTimestamp() . The main difference is that the old version mechamism used to assign a serial timestamp to the object upon storing time, and the new commiTimestamp approach, assigns it upon commit time.
the version number.
The serial timestamp the object is assigned to when it is commited.

You need to enable this feature before using it in Db4objects.Db4o.Config.IFileConfiguration.GenerateCommitTimestamps(bool) .

All the objects commited within the same transaction will receive the same commitTimestamp.

db4o replication system (dRS) relies on this feature.
the serial timestamp that was given to the object upon commit. Db4objects.Db4o.Config.IFileConfiguration.GenerateCommitTimestamps(bool) 8.0
Interface to an iterable collection IObjectInfo objects.

ObjectInfoCollection is used reference a number of stored objects.
IObjectInfo
the internal representation of a stored class. the internal representation of a stored class. returns the name of this stored class. returns the name of this stored class. returns an array of IDs of all stored object instances of this stored class. returns an array of IDs of all stored object instances of this stored class. returns the StoredClass for the parent of the class, this StoredClass represents. returns the StoredClass for the parent of the class, this StoredClass represents. returns all stored fields of this stored class. returns all stored fields of this stored class. returns true if this StoredClass has a class index. returns true if this StoredClass has a class index. renames this stored class. renames this stored class.

After renaming one or multiple classes the ObjectContainer has to be closed and reopened to allow internal caches to be refreshed.

.NET: As the name you should provide [Classname, Assemblyname]

the new name
returns an existing stored field of this stored class. returns an existing stored field of this stored class. the name of the field the type of the field. There are four possibilities how to supply the type:
- a Class object. (.NET: a Type object)
- a fully qualified classname.
- any object to be used as a template.

- null, if the first found field should be returned. the IStoredField
Returns the number of instances of this class that have been persisted to the database, as seen by the transaction (container) that produces this StoredClass instance. Returns the number of instances of this class that have been persisted to the database, as seen by the transaction (container) that produces this StoredClass instance. The number of instances the internal representation of a field on a stored class. the internal representation of a field on a stored class. creates an index on this field at runtime. creates an index on this field at runtime. drops an existing index on this field at runtime. drops an existing index on this field at runtime. returns the field value on the passed object. returns the field value on the passed object.

This method will also work, if the field is not present in the current version of the class.

It is recommended to use this method for refactoring purposes, if fields are removed and the field values need to be copied to other fields.
returns the name of the field. returns the name of the field. returns the Class (Java) / Type (.NET) of the field. returns the Class (Java) / Type (.NET) of the field.

For array fields this method will return the type of the array. Use IsArray() to detect arrays.
returns true if the field is an array. returns true if the field is an array. modifies the name of this stored field. modifies the name of this stored field.

After renaming one or multiple fields the ObjectContainer has to be closed and reopened to allow internal caches to be refreshed.

the new name
specialized highspeed API to collect all values of a field for all instances of a class, if the field is indexed. specialized highspeed API to collect all values of a field for all instances of a class, if the field is indexed.

The field values will be taken directly from the index without the detour through class indexes or object instantiation.

If this method is used to get the values of a first class object index, deactivated objects will be passed to the visitor.
the visitor to be called with each index value.
Returns whether this field has an index or not. Returns whether this field has an index or not. true if this field has an index. provides information about system state and system settings. provides information about system state and system settings. returns the number of entries in the Freespace Manager. returns the number of entries in the Freespace Manager.

A high value for the number of freespace entries is an indication that the database is fragmented and that defragment should be run.
the number of entries in the Freespace Manager.
returns the freespace size in the database in bytes. returns the freespace size in the database in bytes.

When db4o stores modified objects, it allocates a new slot for it. During commit the old slot is freed. Free slots are collected in the freespace manager, so they can be reused for other objects.

This method returns a sum of the size of all free slots in the database file.

To reclaim freespace run defragment.
the freespace size in the database in bytes.
Returns the total size of the database on disk. Returns the total size of the database on disk. total size of database on disk db4o-specific exception.

This exception is thrown when the database file format is not compatible with the applied configuration.
db4o-specific exception.

This exception is thrown when the database file format is not compatible with the applied configuration.
db4o-specific exception.

This exception is thrown when the supplied object ID is incorrect (outside the scope of the database IDs).
db4o-specific exception.

This exception is thrown when the supplied object ID is incorrect (outside the scope of the database IDs).
IExtObjectContainer.Bind(object, long) IExtObjectContainer.GetByID(long)
Constructor allowing to specify the exception cause cause exception Constructor allowing to specify the offending id the offending id db4o-specific exception.

This exception is thrown when a client tries to connect to a server with a wrong password or null password.
db4o-specific exception.

This exception is thrown when a client tries to connect to a server with a wrong password or null password.
db4o-specific exception.

This exception is thrown when db4o reads slot information which is not valid (length or address).
db4o-specific exception.

This exception is thrown when db4o reads slot information which is not valid (length or address).
Constructor allowing to specify a detailed message. Constructor allowing to specify a detailed message. message Constructor allowing to specify the address, length and id. Constructor allowing to specify the address, length and id. offending address offending length id where the address and length were read. this Exception is thrown, if objects can not be stored and if db4o is configured to throw Exceptions on storage failures. this Exception is thrown, if objects can not be stored and if db4o is configured to throw Exceptions on storage failures. Db4objects.Db4o.Config.IConfiguration.ExceptionsOnNotStorable(bool) db4o-specific exception.

This exception is thrown when an old file format was detected and Db4objects.Db4o.Config.IConfiguration.AllowVersionUpdates(bool) is set to false.
Constructor with the default message. Constructor with the default message. Static constants to describe the status of objects. Static constants to describe the status of objects. This exception is thrown while reading old database files for which support has been dropped. This exception is thrown while reading old database files for which support has been dropped. intended for future virtual fields on classes. intended for future virtual fields on classes. Currently only the constant for the virtual version field is found here. the field name of the virtual version field, to be used for querying. the field name of the virtual version field, to be used for querying. Basic functionality for implementing iterators for fixed length structures whose elements can be efficiently accessed by a numeric index. Basic functionality for implementing iterators for fixed length structures whose elements can be efficiently accessed by a numeric index. "readFrom buffer" constructor Returns the next object in the queue that matches the specified condition. Returns the next object in the queue that matches the specified condition. The operation is always NON-BLOCKING. the object must satisfy to be returned the object satisfying the condition or null if none does Useful as "out" or "by ref" function parameter. Useful as "out" or "by ref" function parameter. Useful as "out" or "by reference" function parameter. Useful as "out" or "by reference" function parameter. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. A fixed size double ended queue with O(1) complexity for addFirst, removeFirst and removeLast operations. Fast linked list for all usecases. Fast linked list for all usecases. Deep clone The parameter allows passing one new object so parent references can be corrected on children. The parameter allows passing one new object so parent references can be corrected on children. marker interface to denote that version numbers and UUIDs should not be generated for a class that implements this interface Adds an element to the end of this collection. Adds an element to the end of this collection. tests if the object is in the Collection. tests if the object is in the Collection. == comparison. returns the first object found in the Collections that equals() the passed object makes sure the passed object is in the Collection. makes sure the passed object is in the Collection. equals() comparison. Iterates through the collection in reversed insertion order which happens to be the fastest. Iterates through the collection in reversed insertion order which happens to be the fastest. Removes all the elements from this collection that are returned by iterable. Removes all the elements from this collection that are returned by iterable. Removes all the elements from this collection that are returned by iterator. Removes all the elements from this collection that are returned by iterator. removes an object from the Collection equals() comparison returns the removed object or null, if none found This is a non reflection implementation for more speed. This is a non reflection implementation for more speed. In contrast to the JDK behaviour, the passed array has to be initialized to the right length. Leaner iterator for faster iteration (but unprotected against concurrent modifications). Leaner iterator for faster iteration (but unprotected against concurrent modifications). A dynamic variable is a value associated to a specific thread and scope. A dynamic variable is a value associated to a specific thread and scope. The value is brought into scope with the With(object, IClosure4) method. Resolves a service interface to its default implementation using the db4o namespace convention: interface foo.bar.Baz default implementation foo.internal.bar.BazImpl the convention based type name for the requested service Iterates through all the values. Iterates through all the values. value iterator Iterates through all the entries . IEntry4 iterator HashtableBase.Values() #see HashtableBase.ValuesIterator() true to continue traversal, false otherwise Returns negative number if x < y Returns zero if x == y Returns positive number if x > y Non boxing/unboxing version of System.Collections.IComparer<T> for faster id comparisons. a prepared comparison, to compare multiple objects with one single object. a prepared comparison, to compare multiple objects with one single object. return a negative int, zero or a positive int if the object being held in 'this' is smaller, equal or greater than the passed object.

Typical implementation: return this.object - obj;
Useful as "out" or "by ref" function parameter. Useful as "out" or "by ref" function parameter. Adapts Iterable4/Iterator4 iteration model (moveNext, current) to the old db4o and jdk model (hasNext, next). Adapts Iterable4/Iterator4 iteration model (moveNext, current) to the old db4o and jdk model (hasNext, next). Iterator primitives (concat, map, reduce, filter, etc...). Iterator primitives (concat, map, reduce, filter, etc...). Constant indicating that the current element in a Map(IEnumerator, IFunction4) operation should be skipped. Generates Tuple items with indexes starting at 0. the iterable to be enumerated Returns a new iterator which yields the result of applying the function to every element in the original iterator. Returns a new iterator which yields the result of applying the function to every element in the original iterator. Skip can be returned from function to indicate the current element should be skipped. Yields a flat sequence of elements. Yields a flat sequence of elements. Any IEnumerable or IEnumerator found in the original sequence is recursively flattened. original sequence simplest possible linked list next element in list carried object db4o constructor to be able to store objects of this class Useful as "out" or "by ref" function parameter. Useful as "out" or "by ref" function parameter. Unbounded queue. Unbounded queue. Useful as "out" or "by ref" function parameter. Useful as "out" or "by ref" function parameter. A collection of static methods that should be part of the runtime environment but are not. A collection of static methods that should be part of the runtime environment but are not. sleeps without checked exceptions sleeps with implicit exception Keeps executing a block of code until it either returns true or millisecondsTimeout elapses. Keeps executing a block of code until it either returns true or millisecondsTimeout elapses. yes/no/dontknow data type ThreadLocal implementation for less capable platforms such as JRE 1.1 and Silverlight. ThreadLocal implementation for less capable platforms such as JRE 1.1 and Silverlight. This class is not intended to be used directly, use DynamicVariable . WARNING: This implementation might leak Thread references unless Set(object) is called with null on the right thread to clean it up. This behavior is currently guaranteed by DynamicVariable . On adding a node to a tree, if it already exists, and if Tree#duplicates() returns false, #isDuplicateOf() will be called. On adding a node to a tree, if it already exists, and if Tree#duplicates() returns false, #isDuplicateOf() will be called. The added node can then be asked for the node that prevails in the tree using #duplicateOrThis(). This mechanism allows doing find() and add() in one run. On adding a node to a tree, if it already exists, and if Tree#duplicates() returns false, #onAttemptToAddDuplicate() will be called and the existing node will be stored in this._preceding. On adding a node to a tree, if it already exists, and if Tree#duplicates() returns false, #onAttemptToAddDuplicate() will be called and the existing node will be stored in this._preceding. This node node can then be asked for the node that prevails in the tree on adding, using the #addedOrExisting() method. This mechanism allows doing find() and add() in one run. returns 0, if keys are equal uses this - other returns positive if this is greater than a_to returns negative if this is smaller than a_to the number of nodes in this tree for balancing the number of objects represented. Traverses a tree with a starting point node. Traverses a tree with a starting point node. If there is no exact match for the starting node, the next higher will be taken. com.db4o.internal.blobs Represents a local ObjectContainer attached to a database file. Represents a local ObjectContainer attached to a database file. 7.10 backs up a database file of an open ObjectContainer. backs up a database file of an open ObjectContainer.

While the backup is running, the ObjectContainer can continue to be used. Changes that are made while the backup is in progress, will be applied to the open ObjectContainer and to the backup.

While the backup is running, the ObjectContainer should not be closed.

If a file already exists at the specified path, it will be overwritten.

The Db4objects.Db4o.IO.IStorage used for backup is the one configured for this container.
a fully qualified path db4o database file was closed or failed to open. is thrown when the operation is not supported in current configuration/environment I/O operation failed or was unexpectedly interrupted.
Wrapper baseclass for all classes that wrap Bin. Wrapper baseclass for all classes that wrap Bin. Each class that adds functionality to a Bin must extend this class to allow db4o to access the delegate instance with StorageDecorator.Decorate(BinConfiguration, IBin) . Representation of a container for storage of db4o database data (to file, to memory). Representation of a container for storage of db4o database data (to file, to memory). returns the length of the Bin (on disc, in memory). returns the length of the Bin (on disc, in memory). reads a given number of bytes into an array of bytes at an offset position. reads a given number of bytes into an array of bytes at an offset position. the offset position to read at the byte array to read bytes into the number of bytes to be read writes a given number of bytes from an array of bytes at an offset position the offset position to write at the array of bytes to write the number of bytes to write flushes the buffer content to the physical storage media. flushes the buffer content to the physical storage media. runs the Runnable between two calls to sync(); reads a given number of bytes into an array of bytes at an offset position. reads a given number of bytes into an array of bytes at an offset position. In contrast to the normal Read(long, byte[], int) method, the Bin should ensure direct access to the raw storage medium. No caching should take place. the offset position to read at the byte array to read bytes into the number of bytes to be read closes the Bin. closes the Bin. Default constructor. Default constructor. the IBin that is to be wrapped. closes the BinDecorator and the underlying IBin . IBin.Read(long, byte[], int) IBin.Sync() IBin.SyncRead(long, byte[], int) IBin.Write(long, byte[], int) converts address and address offset to an absolute address copies a block within a file in block mode copies a block within a file in absolute mode reads a buffer at the seeked address the number of bytes read and returned implement to read a buffer at the seeked address reads a buffer at the seeked address the number of bytes read and returned implement to read a buffer at the seeked address reads a buffer at the seeked address the number of bytes read and returned reads a buffer at the seeked address the number of bytes read and returned implement to read a buffer at the seeked address reads a buffer at the seeked address the number of bytes read and returned implement to read a buffer at the seeked address writes a buffer to the seeked address returns the block size currently used outside call to set the block size of this adapter Bounded handle into an IoAdapter: Can only access a restricted area. Bounded handle into an IoAdapter: Can only access a restricted area. The delegate I/O adapter The block offset address into the I/O adapter that maps to the start index (0) of this window The size of this window in bytes Size of this I/O adapter window in bytes. Offset in bytes relative to the window start Data to write into the window starting from the given offset Offset in bytes relative to the window start Data buffer to read from the window starting from the given offset Disable IO Adapter Window Flush IO Adapter Window CachedIoAdapter is an IOAdapter for random access files, which caches data for IO access. CachedIoAdapter is an IOAdapter for random access files, which caches data for IO access. Its functionality is similar to OS cache.
Example:
delegateAdapter = new RandomAccessFileAdapter();
config.Io(new CachedIoAdapter(delegateAdapter));
Base class for database file adapters, both for file and memory databases. Base class for database file adapters, both for file and memory databases. converts address and address offset to an absolute address copies a block within a file in block mode sets the read/write pointer in the file using block mode sets the read/write pointer in the file using block mode outside call to set the block size of this adapter implement to close the adapter copies a block within a file in absolute mode deletes the given path from whatever 'file system' is addressed checks whether a file exists implement to return the absolute length of the file implement to open the file reads a buffer at the seeked address the number of bytes read and returned implement to read a buffer at the seeked address implement to set the read/write pointer in the file, absolute mode implement to flush the file contents to storage writes a buffer to the seeked address implement to write a buffer at the seeked address returns the block size currently used Delegated IO Adapter reference to itself Creates an instance of CachedIoAdapter with the default page size and page count. Creates an instance of CachedIoAdapter with the default page size and page count. delegate IO adapter (RandomAccessFileAdapter by default) Creates an instance of CachedIoAdapter with a custom page size and page count.
delegate IO adapter (RandomAccessFileAdapter by default) cache page size allocated amount of pages
Creates an instance of CachedIoAdapter with extended parameters.
database file path determines if the file should be locked initial file length, new writes will start from this point if the file should be used in read-onlyt mode. delegate IO adapter (RandomAccessFileAdapter by default) cache page size allocated amount of pages
Creates and returns a new CachedIoAdapter
database file path determines if the file should be locked initial file length, new writes will start from this point
Deletes the database file file path Checks if the file exists file path Reads the file into the buffer using pages from cache. Reads the file into the buffer using pages from cache. If the next page is not cached it will be read from the file. destination buffer how many bytes to read Writes the buffer to cache using pages source buffer how many bytes to write Flushes cache to a physical storage Returns the file length Flushes and closes the file Moves the pointer to the specified file position position within the file Reads the file into the buffer using pages from cache. Reads the file into the buffer using pages from cache. If the next page is not cached it will be read from the file. start position to read destination buffer how many bytes to read Writes the buffer to cache using pages start position to write source buffer how many bytes to write Flushes cache to a physical storage Returns the file length Caching storage adapter to cache db4o database data in memory until the underlying IBin is instructed to flush its data when IBin.Sync() is called.

You can override the NewCache() method if you want to work with a different caching strategy.
Wrapper base class for all classes that wrap Storage. Wrapper base class for all classes that wrap Storage. Each class that adds functionality to a Storage must extend this class. Base interface for Storage adapters that open a IBin to store db4o database data to. opens a IBin to store db4o database data. returns true if a Bin (file or memory) exists with the passed name. returns true if a Bin (file or memory) exists with the passed name. Deletes the bin for the given URI from the storage. Deletes the bin for the given URI from the storage. 7.9 bin URI if the bin could not be deleted Renames the bin for the given old URI to the new URI. Renames the bin for the given old URI to the new URI. If a bin for the new URI exists, it will be overwritten. 7.9 URI of the existing bin future URI of the bin if the bin could not be deleted default constructor to create a Caching storage with the default page count of 64 and the default page size of 1024. default constructor to create a Caching storage with the default page count of 64 and the default page size of 1024. the IStorage to be cached. constructor to set up a CachingStorage with a configured page count and page size the IStorage to be cached. the number of pages the cache should use. the size of the pages the cache should use. opens a Bin for the given URI. opens a Bin for the given URI. override this method if you want to work with a different caching strategy than the default LRU2Q cache. override this method if you want to work with a different caching strategy than the default LRU2Q cache. Strategy for file/byte array growth by a constant factor Strategy for file/byte array growth. Strategy for file/byte array growth. returns the incremented size after the growth strategy has been applied the original size the new size, after the growth strategy has been applied, must be bigger than curSize The constant growth size returns the incremented size after the growth strategy has been applied the original size the new size Strategy for file/byte array growth that will always double the current size Storage adapter to store db4o database data to physical files on hard disc. Storage adapter to store db4o database data to physical files on hard disc. opens a IBin on the specified URI (file system path). returns true if the specified file system path already exists. returns true if the specified file system path already exists. Block size registry. Block size registry. Accessible through the environment. Db4objects.Db4o.Foundation.Environments.My(System.Type<T>) 7.7 Returns a copy of the raw data contained in this bin for external processing. Returns a copy of the raw data contained in this bin for external processing. Access to the data is not guarded by synchronisation. If this method is called while the MemoryBin is in use, it is possible that the returned byte array is not consistent. for internal processing only. for internal processing only. IStorage implementation that produces IBin instances that operate in memory. Use this IStorage to work with db4o as an in-memory database. returns true if a MemoryBin with the given URI name already exists in this Storage. returns true if a MemoryBin with the given URI name already exists in this Storage. opens a MemoryBin for the given URI (name can be freely chosen). opens a MemoryBin for the given URI (name can be freely chosen). Returns the memory bin for the given URI for external use. Returns the memory bin for the given URI for external use. Registers the given bin for this storage with the given URI. Registers the given bin for this storage with the given URI. Storage adapter that does not pass flush calls on to its delegate. Storage adapter that does not pass flush calls on to its delegate. You can use this IStorage for improved db4o speed at the risk of corrupted database files in case of system failure. IStorage implementation that produces IBin instances that operate in memory. Use this IStorage to work with db4o as an in-memory database. returns true if a MemoryBin with the given URI name already exists in this Storage. returns true if a MemoryBin with the given URI name already exists in this Storage. opens a MemoryBin for the given URI (name can be freely chosen). opens a MemoryBin for the given URI (name can be freely chosen). Returns the memory bin for the given URI for external use. Returns the memory bin for the given URI for external use. Registers the given bin for this storage with the given URI. Registers the given bin for this storage with the given URI. IO adapter for random access files. IO adapter for random access files. base class for IoAdapters that delegate to other IoAdapters (decorator pattern) allows registration with a transaction to be notified of commit and rollback a buffer interface with methods to read and to position the read pointer in the buffer. a buffer interface with methods to read and to position the read pointer in the buffer. returns the current offset in the buffer the offset reads a byte from the buffer. reads a byte from the buffer. the byte reads an array of bytes from the buffer. reads an array of bytes from the buffer. The length of the array that is passed as a parameter specifies the number of bytes that are to be read. The passed bytes buffer parameter is directly filled. the byte array to read the bytes into. reads an int from the buffer. reads an int from the buffer. the int reads a long from the buffer. reads a long from the buffer. the long positions the read pointer at the specified position the desired position in the buffer common functionality for IReadContext and IWriteContext and Db4objects.Db4o.Internal.Delete.IDeleteContext Controls how deep an object graph is activated. Controls how deep an object graph is activated. Activates a fixed depth of the object graph regardless of any existing activation depth configuration settings. Activates a fixed depth of the object graph regardless of any existing activation depth configuration settings. Activates the full object graph. Activates the full object graph. Factory for ActivationDepth strategies. Factory for ActivationDepth strategies. Returns an ActivationDepth suitable for the specified class and activation mode. Returns an ActivationDepth suitable for the specified class and activation mode. root class that's being activated activation mode an appropriate ActivationDepth for the class and activation mode Returns an ActivationDepth that will activate at most *depth* levels. Returns an ActivationDepth that will activate at most *depth* levels. A special case is Integer.MAX_VALUE (int.MaxValue for .net) for which a FullActivationDepth object must be returned. Activates an object graph to a specific depth respecting any activation configuration settings that might be in effect. Activates an object graph to a specific depth respecting any activation configuration settings that might be in effect. Transparent Activation strategy. Transparent Activation strategy. A transaction local variable. A transaction local variable. Transaction.Get(TransactionLocal) Transfer of blobs to and from the db4o system, if users use the Blob Db4oType. Transfer of blobs to and from the db4o system, if users use the Blob Db4oType. com.db4o.internal.blobs the db4o Blob type to store blobs independent of the main database file and allows to perform asynchronous upload and download operations. the db4o Blob type to store blobs independent of the main database file and allows to perform asynchronous upload and download operations.

Usage:
- Define Blob fields on your user classes.
- As soon as an object of your class is stored, db4o automatically takes care that the Blob field is set.
- Call readFrom to read a blob file into the db4o system.
- Call writeTo to write a blob file from within the db4o system.
- getStatus may help you to determine, whether data has been previously stored. It may also help you to track the completion of the current process.

db4o client/server carries out all blob operations in a separate thread on a specially dedicated socket. One socket is used for all blob operations and operations are queued. Your application may continue to access db4o while a blob is transferred in the background.
returns the name of the file the blob was stored to. returns the name of the file the blob was stored to.

The method may return null, if the file was never stored.
String the name of the file.
returns the status after the last read- or write-operation. returns the status after the last read- or write-operation.

The status value returned may be any of the following:
Db4objects.Db4o.Ext.Status.Unused no data was ever stored to the Blob field.
Db4objects.Db4o.Ext.Status.Available available data was previously stored to the Blob field.
Db4objects.Db4o.Ext.Status.Queued an operation was triggered and is waiting for it's turn in the Blob queue.
Db4objects.Db4o.Ext.Status.Completed the last operation on this field was completed successfully.
Db4objects.Db4o.Ext.Status.Processing for internal use only.
Db4objects.Db4o.Ext.Status.Error the last operation failed.
or a double between 0 and 1 that signifies the current completion percentage of the currently running operation.

the five Db4objects.Db4o.Ext.Status constants defined in this interface or a double between 0 and 1 that signifies the completion of the currently running operation.

status - the current status constants
reads a file into the db4o system and stores it as a blob. reads a file into the db4o system and stores it as a blob.

In Client/Server mode db4o will open an additional socket and process writing data in an additional thread.

the file the blob is to be read from. in case of errors
reads a file into the db4o system and stores it as a blob. reads a file into the db4o system and stores it as a blob.

db4o will use the local file system in Client/Server mode also.

the file the blob is to be read from. in case of errors
writes stored blob data to a file. writes stored blob data to a file.

db4o will use the local file system in Client/Server mode also.

in case of errors and in case no blob data was stored the file the blob is to be written to.
writes stored blob data to a file. writes stored blob data to a file.

In Client/Server mode db4o will open an additional socket and process writing data in an additional thread.

in case of errors and in case no blob data was stored the file the blob is to be written to.
Deletes the current file stored in this BLOB. Deletes the current file stored in this BLOB. in case of errors and in case no data was stored marker interface for special db4o datatypes All instantiated nodes are held in this tree. All instantiated nodes are held in this tree. We work with BTreeNode in two states: - deactivated: never read, no valid members, ID correct or 0 if new - write: real representation of keys, values and children in arrays The write state can be detected with canWrite(). We work with BTreeNode in two states: - deactivated: never read, no valid members, ID correct or 0 if new - write: real representation of keys, values and children in arrays The write state can be detected with canWrite(). States can be changed as needed with prepareRead() and prepareWrite(). Can contain BTreeNode or Integer for ID of BTreeNode the split node if this node is split or this if the first key has changed This traversal goes over all nodes, not just leafs Iterates through all the valid pointers in this range. Iterates through all the valid pointers in this range. an Iterator4 over BTreePointer value Interface for comparison support in queries. Interface for comparison support in queries. creates a prepared comparison to compare multiple objects against one single object. creates a prepared comparison to compare multiple objects against one single object. the context of the comparison the object that is to be compared against multiple other objects the prepared comparison Composite key for field indexes, first compares on the actual indexed field _value and then on the _parentID (which is a reference to the containing object). Composite key for field indexes, first compares on the actual indexed field _value and then on the _parentID (which is a reference to the containing object). a buffer interface with write methods. a buffer interface with write methods. writes a single byte to the buffer. writes a single byte to the buffer. the byte writes an array of bytes to the buffer the byte array writes an int to the buffer. writes an int to the buffer. the int writes a long to the buffer the long non-encrypted read, used for indexes Retrieves the value associated to the key from the cache. If the value is not yet cached producer will be called to produce it. If the cache needs to discard a value finalizer will be given a chance to process it. the key for the value - must never change - cannot be null will be called if value not yet in the cache - can only be null when the value is found in the cache will be called if a page needs to be discarded - can be null the cached value Removes the cached value with the specified key from this cache. Removes the cached value with the specified key from this cache. the purged value or null Simplified version of the algorithm taken from here: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 Simplified version of the algorithm taken from here: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 Full version of the algorithm taken from here: http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.2641 For reference types, _typeHandler always holds a StandardReferenceTypeHandler that will use the _aspects of this class to take care of its business. For reference types, _typeHandler always holds a StandardReferenceTypeHandler that will use the _aspects of this class to take care of its business. A custom type handler would appear as a TypeHandlerAspect in that case. For value types, _typeHandler always holds the actual value type handler be it a custom type handler or a builtin one. no any, primitive, array or other tricks. no any, primitive, array or other tricks. overridden in YapClassAny and YapClassPrimitive TODO: remove this class or make it private to ClassMetadataRepository Traverses all index entries (java.lang.Integer references). Traverses all index entries (java.lang.Integer references). handles reading, writing, deleting, defragmenting and comparisons for types of objects.

Custom Typehandlers can be implemented to alter the default behaviour of storing all non-transient fields of an object.

Db4objects.Db4o.Config.IConfiguration.RegisterTypeHandler(ITypeHandlerPredicate, ITypeHandler4)
gets called when an object gets deleted. gets called when an object gets deleted. Db4objects.Db4o.Ext.Db4oIOException gets called when an object gets defragmented. gets called when an object gets defragmented. gets called when an object is to be written to the database. gets called when an object is to be written to the database. the object gets called when an object is to be activated. gets called when an object is to be activated. TypeHandler for objects with members. TypeHandler for objects with members. will be called during activation if the handled object is already active will be called during querying to ask for the handler to be used to collect children of the handled object will be called during querying to ask for IDs of member objects of the handled object. will be called during querying to ask for IDs of member objects of the handled object. TODO: refactor for symmetric inheritance - don't inherit from YapField and override, instead extract an abstract superclass from YapField and let both YapField and this class implement dirty hack for com.db4o.types some of them (BlobImpl) need to be set automatically TODO: Derive from FieldMetadata for Db4oTypes Will raise an exception if argument class doesn't match this class - violates equals() contract in favor of failing fast. Will raise an exception if argument class doesn't match this class - violates equals() contract in favor of failing fast. We are running into cyclic dependancies on reading the PBootRecord object, if we maintain MetaClass information there Configuration template for creating new db4o files message sender for client/server messaging. message sender for client/server messaging.

db4o allows using the client/server TCP connection to send messages from the client to the server. Any object that can be stored to a db4o database file may be used as a message.

For an example see Reference documentation:
http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging
http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution

See Also:
Db4objects.Db4o.Config.IClientServerConfiguration.GetMessageSender() ,
IMessageRecipient ,
Db4objects.Db4o.Config.IClientServerConfiguration.SetMessageRecipient(IMessageRecipient)
sends a message to the server. sends a message to the server. the message parameter, any object may be used. Returns an iterator for all Db4objects.Db4o.Config.IConfigurationItem instances added. Add(Db4objects.Db4o.Config.IConfigurationItem) the iterator The ConfigImpl also is our messageSender TODO: Split into separate enums with defined range and values. * only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. Doesn't need to work with modern IdSystems. only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. only used by old handlers: OpenTypeHandler0, StringHandler0, ArrayHandler0. Doesn't need to work with modern IdSystems. Base class for balanced trees. Base class for balanced trees. this interface is passed to internal class Db4objects.Db4o.Typehandlers.ITypeHandler4 when instantiating objects. Interprets the current position in the context as an ID and returns the object with this ID. Interprets the current position in the context as an ID and returns the object with this ID. the object reads sub-objects, in cases where the Db4objects.Db4o.Typehandlers.ITypeHandler4 is known. FIXME: remove me from the core and make me a facade over Events keep the position in the array. keep the position in the array. Information is used to look up encodings. Note the different implementation when compared to LatinStringIO and UnicodeStringIO: Instead of writing the length of the string, UTF8StringIO writes the length of the byte array. Note the different implementation when compared to LatinStringIO and UnicodeStringIO: Instead of writing the length of the string, UTF8StringIO writes the length of the byte array. Marker interface to denote that a class should not be stored by db4o. Marker interface to denote that a class should not be stored by db4o. Workaround to provide the Java 5 version with a hook to add ExtObjectContainer. Workaround to provide the Java 5 version with a hook to add ExtObjectContainer. (Generic method declarations won't match ungenerified YapStreamBase implementations otherwise and implementing it directly kills .NET conversion.) allows special handling for all Db4oType objects. allows special handling for all Db4oType objects. Redirected here from #set() so only instanceof check is necessary in the #set() method. object if handled here and #set() should not continue processing Differentiating getActiveClassMetadata from getYapClass is a tuning optimization: If we initialize a YapClass, #set3() has to check for the possibility that class initialization associates the currently stored object with a previously stored static object, causing the object to be known afterwards. Differentiating getActiveClassMetadata from getYapClass is a tuning optimization: If we initialize a YapClass, #set3() has to check for the possibility that class initialization associates the currently stored object with a previously stored static object, causing the object to be known afterwards. In this call we only return active YapClasses, initialization is not done on purpose Objects implementing the "Internal4" marker interface are not visible to queries, unless this flag is set to true. Objects implementing the "Internal4" marker interface are not visible to queries, unless this flag is set to true. The caller should reset the flag after the call. overridden in ClientObjectContainer The method allows checking whether will make it easier to refactor than an "instanceof YapClient" check. overridden in ClientObjectContainer The method allows checking whether will make it easier to refactor than an "instanceof YapClient" check. This interface is not used in .NET. Implement to compare two arguments for sorting. Implement to compare two arguments for sorting. Return a negative value, zero, or a positive value if the first argument is smaller, equal or greater than the second. Old freespacemanager, before version 7.0. Old freespacemanager, before version 7.0. If it is still in use freespace is dropped. BTreeFreespaceManager should be used instead. TODO: This class was written to make ObjectContainerBase leaner, so TransportObjectContainer has less members. All functionality of this class should become part of ObjectContainerBase and the functionality in ObjectContainerBase should delegate to independent modules without circular references. This is the latest version, the one that should be used. This is the latest version, the one that should be used. gets called when an value type is to be read from the database. gets called when an value type is to be read from the database. the read value type marker interface for TypeHandlers where the slot length can change, depending on the object stored n-dimensional array Shared (java/.net) logic for Date handling. Shared (java/.net) logic for Date handling. Tyehandler for naked plain objects (java.lang.Object). Tyehandler for naked plain objects (java.lang.Object). This readIndexEntry method reads from the parent slot. This readIndexEntry method reads from the parent slot. This readIndexEntry method reads from the actual index in the file. This readIndexEntry method reads from the actual index in the file. returns: -x for left is greater and +x for right is greater FIXME: The returned value is the wrong way around. returns: -x for left is greater and +x for right is greater FIXME: The returned value is the wrong way around. TODO: You will need collators here for different languages. A weak reference to an known object. A weak reference to an known object. "Known" ~ has been stored and/or retrieved within a transaction. References the corresponding ClassMetaData along with further metadata: internal id, UUID/version information, ... return false if class not completely initialized, otherwise true HCTREE IDTREE for testing purposes only. for testing purposes only. This is the inside representation to operate against, the actual file-based ObjectContainerBase or the client. This is the inside representation to operate against, the actual file-based ObjectContainerBase or the client. For all calls against this ObjectContainerBase the method signatures that take a transaction have to be used. This is the outside representation to the user. This is the outside representation to the user. This ObjectContainer should use this transaction as it's main user transation, so it also allows using the method signatures on ObjectContainer without a transaction. Retrieves the value of a transaction local variables. Retrieves the value of a transaction local variables. If this is the first time the variable is accessed TransactionLocal.InitialValueFor(Transaction) will provide the initial value. Represents a db4o file format version, assembles all the marshallers needed to read/write this specific version. Represents a db4o file format version, assembles all the marshallers needed to read/write this specific version. A marshaller knows how to read/write certain types of values from/to its representation on disk for a given db4o file format version. Responsibilities are somewhat overlapping with TypeHandler's. this interface is passed to internal class Db4objects.Db4o.Typehandlers.ITypeHandler4 during marshaling and provides methods to marshal objects. makes sure the object is stored and writes the ID of the object to the context. makes sure the object is stored and writes the ID of the object to the context. Use this method for first class objects only (objects that have an identity in the database). If the object can potentially be a primitive type, do not use this method but use a matching IWriteBuffer method instead. the object to write. writes sub-objects, in cases where the Db4objects.Db4o.Typehandlers.ITypeHandler4 is known. typehandler to be used to write the object. the object to write reserves a buffer with a specific length at the current position, to be written in a later step. reserves a buffer with a specific length at the current position, to be written in a later step. the length to be reserved. the ReservedBuffer Wraps the low-level details of reading a Buffer, which in turn is a glorified byte array. Wraps the low-level details of reading a Buffer, which in turn is a glorified byte array. this interface is passed to reference type handlers. this interface is passed to reference type handlers. a reserved buffer within a write buffer. a reserved buffer within a write buffer. The usecase this class was written for: A null bitmap should be at the beginning of a slot to allow lazy processing. During writing the content of the null bitmap is not yet fully known until all members are processed. With the Reservedbuffer the space in the slot can be occupied and writing can happen after all members are processed. writes a byte array to the reserved buffer. writes a byte array to the reserved buffer. the byte array. a node in a QLin ("Coolin") query. a node in a QLin ("Coolin") query. QLin is a new experimental query interface. We would really like to have LINQ for Java instead. 8.0 adds a where node to this QLin query. adds a where node to this QLin query. can be any of the following: executes the QLin query and returns the result as an Db4objects.Db4o.IObjectSet . Note that ObjectSet extends List and Iterable on the platforms that support these interfaces. You may want to use these interfaces instead of working directly against an ObjectSet. orders the query by the expression. orders the query by the expression. Use the QLinSupport.Ascending() and QLinSupport.Descending() helper methods to set the direction. FIXME: Rename to Db4oEnhancedPredicate for implementation of callback evaluations. for implementation of callback evaluations.

To constrain a IQuery node with your own callback Evaluation, construct an object that implements the Evaluation interface and register it by passing it to IQuery.Constrain(object) .

Evaluations are called as the last step during query execution, after all other constraints have been applied. Evaluations in higher level IQuery nodes in the query graph are called first.

Java client/server only:
db4o first attempts to use Java Serialization to allow to pass final variables to the server. Please make sure that all variables that are used within the Evaluate(ICandidate) method are Serializable. This may include the class an anonymous Evaluation object is created in. If db4o is not successful at using Serialization, the Evaluation is transported to the server in a db4o Db4objects.Db4o.IO.MemoryBin . In this case final variables can not be restored.
callback method during query execution . reference to the candidate persistent object. Represents an actual object in the database. Represents an actual object in the database. Forms a tree structure, indexed by id. Can have dependents that are doNotInclude'd in the query result when this is doNotInclude'd. candidate for IEvaluation callbacks.

During query execution all registered IEvaluation callback handlers are called with ICandidate proxies that represent the persistent objects that meet all other IQuery criteria.

A ICandidate provides access to the persistent object it represents and allows to specify, whether it is to be included in the Db4objects.Db4o.IObjectSet resultset.
returns the persistent object that is represented by this query ICandidate . Object the persistent object. specify whether the Candidate is to be included in the Db4objects.Db4o.IObjectSet resultset.

This method may be called multiple times. The last call prevails.
inclusion.
returns the Db4objects.Db4o.IObjectContainer the Candidate object is stored in. the Db4objects.Db4o.IObjectContainer For external interface use only. For external interface use only. Call doNotInclude() internally so dependancies can be checked. Holds the tree of QCandidate objects and the list of QCon during query evaluation. The query work (adding and removing nodes) happens here. Candidates during query evaluation. QCandidate objects are stored in i_root Base class for all constraints on queries. Base class for all constraints on queries. constraint to limit the objects returned upon query execution .

Constraints are constructed by calling Db4objects.Db4o.Query.IQuery.Constrain .

Constraints can be joined with the methods Db4objects.Db4o.Query.IConstraint.And and Db4objects.Db4o.Query.IConstraint.Or .

The methods to modify the constraint evaluation algorithm may be merged, to construct combined evaluation rules. Examples:
  • Constraint.Smaller().Equal() for "smaller or equal"
  • Constraint.Not().Like() for "not like"
  • Constraint.Not().Greater().Equal() for "not greater or equal"
links two Constraints for AND evaluation. links two Constraints for AND evaluation. For example:
query.Constrain(typeof(Pilot));
query.Descend("points").Constrain(101).Smaller().And(query.Descend("name").Constrain("Test Pilot0"));
will retrieve all pilots with points less than 101 and name as "Test Pilot0"
the other Db4objects.Db4o.Query.IConstraint a new Db4objects.Db4o.Query.IConstraint , that can be used for further calls to And and Or
links two Constraints for OR evaluation. links two Constraints for OR evaluation. For example:

query.Constrain(typeof(Pilot));
query.Descend("points").Constrain(101).Greater().Or(query.Descend("name").Constrain("Test Pilot0"));
will retrieve all pilots with points more than 101 or pilots with the name "Test Pilot0"
the other Db4objects.Db4o.Query.IConstraint a new Db4objects.Db4o.Query.IConstraint , that can be used for further calls to And and Or
Used in conjunction with Db4objects.Db4o.Query.IConstraint.Smaller or Db4objects.Db4o.Query.IConstraint.Greater to create constraints like "smaller or equal", "greater or equal". For example:
query.Constrain(typeof(Pilot));
query.Descend("points").Constrain(101).Smaller().Equal();
will return all pilots with points <= 101.
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
sets the evaluation mode to >. sets the evaluation mode to >. For example:
query.Constrain(typeof(Pilot));
query.Descend("points").Constrain(101).Greater()
will return all pilots with points > 101.
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
sets the evaluation mode to <. sets the evaluation mode to <. For example:
query.Constrain(typeof(Pilot));
query.Descend("points").Constrain(101).Smaller()
will return all pilots with points < 101.
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
sets the evaluation mode to identity comparison. sets the evaluation mode to identity comparison. In this case only objects having the same database identity will be included in the result set. For example:
Pilot pilot = new Pilot("Test Pilot1", 100);
Car car = new Car("BMW", pilot);
container.Store(car);
// Change the name, the pilot instance stays the same
pilot.SetName("Test Pilot2");
// create a new car
car = new Car("Ferrari", pilot);
container.Store(car);
IQuery query = container.Query();
query.Constrain(typeof(Car));
// All cars having pilot with the same database identity
// will be retrieved. As we only created Pilot object once
// it should mean all car objects
query.Descend("_pilot").Constrain(pilot).Identity();

this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
set the evaluation mode to object comparison (query by example). set the evaluation mode to object comparison (query by example). this IConstraint to allow the chaining of method calls. sets the evaluation mode to "like" comparison. sets the evaluation mode to "like" comparison. This mode will include all objects having the constrain expression somewhere inside the string field. For example:
Pilot pilot = new Pilot("Test Pilot1", 100);
container.Store(pilot);
...
query.Constrain(typeof(Pilot));
// All pilots with the name containing "est" will be retrieved
query.Descend("name").Constrain("est").Like();
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
Sets the evaluation mode to string contains comparison. Sets the evaluation mode to string contains comparison. The contains comparison is case sensitive.
For example:
Pilot pilot = new Pilot("Test Pilot1", 100);
container.Store(pilot);
...
query.Constrain(typeof(Pilot));
// All pilots with the name containing "est" will be retrieved
query.Descend("name").Constrain("est").Contains();
Like() for case insensitive string comparison
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
sets the evaluation mode to string StartsWith comparison. sets the evaluation mode to string StartsWith comparison. For example:
Pilot pilot = new Pilot("Test Pilot0", 100);
container.Store(pilot);
...
query.Constrain(typeof(Pilot));
query.Descend("name").Constrain("Test").StartsWith(true);
comparison will be case sensitive if true, case insensitive otherwise this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
sets the evaluation mode to string EndsWith comparison. sets the evaluation mode to string EndsWith comparison. For example:
Pilot pilot = new Pilot("Test Pilot0", 100);
container.Store(pilot);
...
query.Constrain(typeof(Pilot));
query.Descend("name").Constrain("T0").EndsWith(false);
comparison will be case sensitive if true, case insensitive otherwise this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
turns on Not() comparison. turns on Not() comparison. All objects not fullfilling the constrain condition will be returned. For example:
Pilot pilot = new Pilot("Test Pilot1", 100);
container.Store(pilot);
...
query.Constrain(typeof(Pilot));
query.Descend("name").Constrain("t0").EndsWith(true).Not();
this Db4objects.Db4o.Query.IConstraint to allow the chaining of method calls.
returns the Object the query graph was constrained with to create this IConstraint . Object the constraining object. Class constraint on queries Object constraint on queries Join constraint on queries Placeholder for a constraint, only necessary to attach children to the query graph. Placeholder for a constraint, only necessary to attach children to the query graph. Added upon a call to Query#descend(), if there is no other place to hook up a new constraint. Array of constraints for queries. Array of constraints for queries. Necessary to be returned to Query#constraints() set of IConstraint objects.

This extension of the IConstraint interface allows setting the evaluation mode of all contained IConstraint objects with single calls.

See also IQuery.Constraints() .
returns an array of the contained IConstraint objects. an array of the contained IConstraint objects. Query Evaluator - Represents such things as >, >=, <, <=, EQUAL, LIKE, etc. Query Evaluator - Represents such things as >, >=, <, <=, EQUAL, LIKE, etc. Specifies which part of the index to take. Specifies which part of the index to take. Array elements: [0] - smaller [1] - equal [2] - greater [3] - nulls for C/S messaging only for C/S messaging only for C/S messaging only for C/S messaging only QQuery is the users hook on our graph. QQuery is the users hook on our graph. A QQuery is defined by it's constraints. QQuery is the users hook on our graph. QQuery is the users hook on our graph. A QQuery is defined by it's constraints. NOTE: This is just a 'partial' base class to allow for variant implementations in db4oj and db4ojdk1.2. It assumes that itself is an instance of QQuery and should never be used explicitly. Search for slot that corresponds to class. Search for slot that corresponds to class.
If not found add it.
Constrain it.
Public so it can be used by the LINQ test cases. Public so it can be used by the LINQ test cases. handle to a node in a S.O.D.A. handle to a node in a S.O.D.A. query graph.

A node in the query graph can represent multiple classes, one class or an attribute of a class.

The graph is automatically extended with attributes of added constraints (see Constrain(object) ) and upon calls to Descend(string) that request nodes that do not yet exist.

References to joined nodes in the query graph can be obtained by "walking" along the nodes of the graph with the method Descend(string) .

Execute() evaluates the entire graph against all persistent objects.

Execute() can be called from any IQuery node of the graph. It will return an Db4objects.Db4o.IObjectSet filled with objects of the class/classes that the node, it was called from, represents.

Note:
Native queries are the recommended main query interface of db4o.
adds a constraint to this node. adds a constraint to this node.

If the constraint contains attributes that are not yet present in the query graph, the query graph is extended accordingly.

Special behaviour for:
  • class System.Type<T> : confine the result to objects of one class or to objects implementing an interface.
  • interface IEvaluation : run evaluation callbacks against all candidates.
the constraint to be added to this Query. IConstraint a new IConstraint for this query node or null for objects implementing the IEvaluation interface.
returns a IConstraints object that holds an array of all constraints on this node. IConstraints on this query node. returns a reference to a descendant node in the query graph. returns a reference to a descendant node in the query graph.

If the node does not exist, it will be created.

All classes represented in the query node are tested, whether they contain a field with the specified field name. The descendant Query node will be created from all possible candidate classes.
path to the descendant. descendant IQuery node
executes the IQuery . Db4objects.Db4o.IObjectSet - the result of the IQuery . adds an ascending ordering criteria to this node of the query graph. adds an ascending ordering criteria to this node of the query graph.

If multiple ordering criteria are applied, the chronological order of method calls is relevant: criteria created by 'earlier' calls are considered more significant, i.e. 'later' criteria only have an effect for elements that are considered equal by all 'earlier' criteria.

As an example, consider a type with two int fields, and an instance set {(a:1,b:3),(a:2,b:2),(a:1,b:2),(a:2,b:3)}. The call sequence [orderAscending(a), orderDescending(b)] will result in [(a:1,b:3),(a:1,b:2),(a:2,b:3),(a:2,b:2)].

this IQuery object to allow the chaining of method calls.
adds a descending order criteria to this node of the query graph. adds a descending order criteria to this node of the query graph.

For semantics of multiple calls setting ordering criteria, see OrderAscending() .
this IQuery object to allow the chaining of method calls.
Sort the resulting ObjectSet by the given comparator. Sort the resulting ObjectSet by the given comparator. The comparator to apply. this IQuery object to allow the chaining of method calls. db4o-specific exception.

This exception is thrown when one of the db4o reflection methods fails.
db4o-specific exception.

This exception is thrown when one of the db4o reflection methods fails.
Db4objects.Db4o.Reflect
Constructor with the cause exception cause exception Constructor with message detailed explanation 7.7 7.7 7.7 Use the methods in this class for system classes only, since they are not ClassLoader or Reflector-aware. TODO: this class should go to foundation.reflect, along with ReflectException and ReflectPlatform calling this method "method" will break C# conversion with the old converter FIXME: Check where pointers should be freed on commit. FIXME: Check where pointers should be freed on commit. This should be triggered in this class. public for .NET conversion reasons TODO: Split this class for individual usecases. public for .NET conversion reasons TODO: Split this class for individual usecases. Only use the member variables needed for the respective usecase. TODO: Check if all time-consuming stuff is overridden! no reading no writing no updates no weak references navigation by ID only both sides need synchronised ClassCollections and MetaInformationCaches Additional message-related information. Additional message-related information. The container the message was dispatched to. The container the message was dispatched to. The sender of the current message. The sender of the current message. The reference can be used to send a reply to it. The transaction the current message has been sent with. The transaction the current message has been sent with. message recipient for client/server messaging. message recipient for client/server messaging.

db4o allows using the client/server TCP connection to send messages from the client to the server. Any object that can be stored to a db4o database file may be used as a message.

For an example see Reference documentation:
http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Messaging
http://developer.db4o.com/Resources/view.aspx/Reference/Client-Server/Remote_Code_Execution

See Also:
ClientServerConfiguration.setMessageRecipient(MessageRecipient) ,
IMessageSender ,
Db4objects.Db4o.Config.IClientServerConfiguration.GetMessageSender() ,
MessageRecipientWithContext
the method called upon the arrival of messages. the method called upon the arrival of messages. contextual information for the message. the message received. support for the new experimental QLin ("Coolin") query interface. support for the new experimental QLin ("Coolin") query interface. We would really like to have LINQ for Java instead. 8.0 starts a IQLin query against a class. creates prototype objects for classes. creates prototype objects for classes. Each field on prototype objects is set to a newly created object or primitive that can be identified either by it's identity or by an int ID that is generated by the system. Creation of fields is recursed to the depth specified in the constructor.

Allows analyzing expressions called on prototype objects to find the underlying field that delivers the return value of the expression. Passed expressions should not have side effects on objects, otherwise the "prototype world" will no longer work.

We plan to supply an ImmutableFieldClassLoader to instrument the code to throw on every modification. This ClassLoader could also supply information about all the method calls involved.

For now our approach only works if expressions are directly backed by a single field.

We were inspired for this approach when we saw that Thomas Mueller managed to map expressions to fields for his JaQu query interface, Kudos! http://www.h2database.com/html/jaqu.html

We took the idea a bit further and made it work for all primitives except for boolean and we plan to also get deeper expressions, collections and interfaces working nicely.
returns a prototype object for a specific class. returns a prototype object for a specific class. analyzes the passed expression and tries to find the path to the backing field that is accessed. analyzes the passed expression and tries to find the path to the backing field that is accessed. analyzes the passed expression and tries to find the path to the backing field that is accessed. analyzes the passed expression and tries to find the path to the backing field that is accessed. analyzes the passed expression and tries to find the path to the backing field that is accessed. analyzes the passed expression and tries to find the path to the backing field that is accessed. exception for the the Prototypes world. exception for the the Prototypes world. exceptions to signal improper use of the IQLin query interface. Internal implementation class, access should not be necessary, except for implementors. Internal implementation class, access should not be necessary, except for implementors. Use the static methods in QLinSupport QLinSupport.Ascending() and QLinSupport.Descending() static import support class for IQLin queries. 8.0 returns a prototype object for a specific class to be passed to the where expression of a QLin query. returns a prototype object for a specific class to be passed to the where expression of a QLin query. IQLin.Where(object) sets the context for the next query on this thread. sets the context for the next query on this thread. This method should never have to be called manually. The framework should set the context up. sets the context for the next query on this thread. sets the context for the next query on this thread. This method should never have to be called manually. The framework should set the context up. shortcut for the Prototype(System.Type<T>) method. parameter for IQLin.OrderBy(object, QLinOrderByDirection) parameter for IQLin.OrderBy(object, QLinOrderByDirection) public for implementors, do not use directly converts an expression to a single field. converts an expression to a single field. Base class for native queries. Base class for native queries.

Native Queries provide the ability to run one or more lines of code against all instances of a class. Native query expressions should return true to mark specific instances as part of the result set. db4o will attempt to optimize native query expressions and run them against indexes and without instantiating actual objects, where this is possible.

The syntax of the enclosing object for the native query expression varies slightly, depending on the language version used. Here are some examples, how a simple native query will look like in some of the programming languages and dialects that db4o supports:

// C# .NET 2.0
IList <Cat> cats = db.Query <Cat> (delegate(Cat cat) {
   return cat.Name == "Occam";
});


// Java JDK 5
List <Cat> cats = db.query(new Predicate<Cat>() {
   public boolean match(Cat cat) {
      return cat.getName().equals("Occam");
   }
});


// Java JDK 1.2 to 1.4
List cats = db.query(new Predicate() {
   public boolean match(Cat cat) {
      return cat.getName().equals("Occam");
   }
});


// Java JDK 1.1
ObjectSet cats = db.query(new CatOccam());

public static class CatOccam extends Predicate {
   public boolean match(Cat cat) {
      return cat.getName().equals("Occam");
   }
});


// C# .NET 1.1
IList cats = db.Query(new CatOccam());

public class CatOccam : Predicate {
   public boolean Match(Cat cat) {
      return cat.Name == "Occam";
   }
});

Summing up the above:
In order to run a Native Query, you can
- use the delegate notation for .NET 2.0.
- extend the Predicate class for all other language dialects

A class that extends Predicate is required to implement the #match() / #Match() method, following the native query conventions:
- The name of the method is "#match()" (Java) / "#Match()" (.NET).
- The method must be public public.
- The method returns a boolean.
- The method takes one parameter.
- The Type (.NET) / Class (Java) of the parameter specifies the extent.
- For all instances of the extent that are to be included into the resultset of the query, the match method should return true. For all instances that are not to be included, the match method should return false.

public for implementation reasons, please ignore. public for implementation reasons, please ignore. public for implementation reasons, please ignore. public for implementation reasons, please ignore. public for implementation reasons, please ignore. public for implementation reasons, please ignore. Reflection Array representation. Reflection Array representation

See documentation for System.Reflection API.
IReflector
Reflection Class representation. Reflection Class representation

See documentation for System.Reflection API.
IReflector
Returns the ReflectClass instance being delegated to. Returns the ReflectClass instance being delegated to. If there's no delegation it should return this. delegate or this Calling this method may change the internal state of the class, even if a usable constructor has been found on earlier invocations. Calling this method may change the internal state of the class, even if a usable constructor has been found on earlier invocations. true, if instances of this class can be created, false otherwise We need this for replication, to find out if a class needs to be traversed or if it simply can be copied across. We need this for replication, to find out if a class needs to be traversed or if it simply can be copied across. For now we will simply return the classes that are IsPrimitive() and Db4objects.Db4o.Internal.Platform4.IsSimple(System.Type<T>) We can think about letting users add an Immutable annotation. Reflection Constructor representation. Reflection Constructor representation

See documentation for System.Reflection API.
IReflector
a spec holding a constructor, it's arguments and information, if the constructor can instantiate objects. a spec holding a constructor, it's arguments and information, if the constructor can instantiate objects. creates a new instance. creates a new instance. the newly created instance. returns true if an instance can be instantiated with the constructor, otherwise false. returns true if an instance can be instantiated with the constructor, otherwise false. Reflection Field representation. Reflection Field representation

See documentation for System.Reflection API.
IReflector
The ReflectClass returned by this method should have been provided by the parent reflector. The ReflectClass returned by this method should have been provided by the parent reflector. the ReflectClass representing the field type as provided by the parent reflector The ReflectClass returned by this method should have been provided by the parent reflector. The ReflectClass returned by this method should have been provided by the parent reflector. the ReflectClass representing the index type as provided by the parent reflector the value of the field at index, based on the fields obtained GenericClass.getDeclaredFields db4o provides GenericReflector as a wrapper around specific reflector (delegate). db4o provides GenericReflector as a wrapper around specific reflector (delegate). GenericReflector is set when an ObjectContainer is opened. All subsequent reflector calls are routed through this interface.

An instance of GenericReflector can be obtained through Db4objects.Db4o.Ext.IExtObjectContainer.Reflector() .

GenericReflector keeps list of known classes in memory. When the GenericReflector is called, it first checks its list of known classes. If the class cannot be found, the task is transferred to the delegate reflector. If the delegate fails as well, generic objects are created, which hold simulated "field values" in an array of objects.

Generic reflector makes possible the following usecases:
  • running a db4o server without deploying application classes;
  • running db4o on Java dialects without reflection (J2ME CLDC, MIDP);
  • easier access to stored objects where classes or fields are not available;
  • running refactorings in the reflector;
  • building interfaces to db4o from any programming language.


One of the live usecases is ObjectManager, which uses GenericReflector to read C# objects from Java.
root of the reflection implementation API. root of the reflection implementation API.

The open reflection interface is supplied to allow to implement custom reflection functionality.

Use Db4o.Configure().ReflectWith(IReflect reflector) to register the use of your implementation before opening database files.
returns an ReflectArray object. returns an ReflectArray object. returns an ReflectClass for a Class returns an ReflectClass class reflector for a class name or null if no such class is found returns an ReflectClass for an object or null if the passed object is null. returns an ReflectClass for an object or null if the passed object is null. Creates an instance of GenericReflector transaction delegate reflector, providing specific reflector functionality. For example Creates a clone of provided object object to copy copy of the submitted object If there is a transaction assosiated with the current refector. If there is a transaction assosiated with the current refector. true if there is a transaction assosiated with the current refector. Associated a transaction with the current reflector. Associated a transaction with the current reflector. generic reflect array instance. Returns a ReflectClass instance for the specified class class a ReflectClass instance for the specified class Db4objects.Db4o.Reflect.IReflectClass Returns a ReflectClass instance for the specified class name class name a ReflectClass instance for the specified class name Db4objects.Db4o.Reflect.IReflectClass Returns a ReflectClass instance for the specified class object class object a ReflectClass instance for the specified class object Db4objects.Db4o.Reflect.IReflectClass Returns delegate reflector delegate reflector Determines if a candidate ReflectClass is a collection candidate ReflectClass true if a candidate ReflectClass is a collection. Register a class as a collection class to be registered Register a predicate as a collection predicate to be registered Register a class class Returns an array of classes known to the reflector an array of classes known to the reflector Registers primitive class class id class name class converter method stub: generic reflector does not have a parent Predicate representation. Predicate representation. Db4objects.Db4o.Query.Predicate IReflector Match method definition. Match method definition. Used to select correct results from an object set. item to be matched to the criteria true, if the requirements are met Reflection Method representation. Reflection Method representation

See documentation for System.Reflection API.
IReflector
Renaming actions are stored to the database file to make sure that they are only performed once. Renaming actions are stored to the database file to make sure that they are only performed once. RollbackStrategy to deactivate all activated objects on rollback. RollbackStrategy to deactivate all activated objects on rollback. TransparentPersistenceSupport Interface defining rollback behavior when Transparent Persistence mode is on. Interface defining rollback behavior when Transparent Persistence mode is on. TransparentPersistenceSupport Method to be called per TP-enabled object when the transaction is rolled back. Method to be called per TP-enabled object when the transaction is rolled back. current ObjectContainer TP-enabled object deactivates each object. deactivates each object. Marker interface to declare a class already implements the required TA/TP hooks and does not want to be instrumented further. Marker interface to declare a class already implements the required TA/TP hooks and does not want to be instrumented further. An Db4objects.Db4o.Activation.IActivator implementation that activates an object on a specific transaction. Configuration item that enables Transparent Activation Mode for this session. Configuration item that enables Transparent Activation Mode for this session. TA mode should be switched on explicitly for manual TA implementation:

commonConfiguration.Add(new TransparentActivationSupport());
Configures the just opened ObjectContainer by setting event listeners, which will be triggered when activation or de-activation is required. Configures the just opened ObjectContainer by setting event listeners, which will be triggered when activation or de-activation is required. the ObjectContainer to configure TransparentPersistenceSupport.Apply(Db4objects.Db4o.Internal.IInternalObjectContainer) Enables Transparent Persistence and Transparent Activation behaviours for the current session. Enables Transparent Persistence and Transparent Activation behaviours for the current session.

commonConfiguration.Add(new TransparentPersistenceSupport());
Db4objects.Db4o.TA.TransparentActivationSupport
Creates a new instance of TransparentPersistenceSupport class RollbackStrategy interface implementation, which defines the actions to be taken on the object when the transaction is rolled back. Creates a new instance of TransparentPersistenceSupport class with no rollback strategies defined. Creates a new instance of TransparentPersistenceSupport class with no rollback strategies defined. Configures current ObjectContainer to support Transparent Activation and Transparent Persistence TypeHandler for Collections. TypeHandler for Collections. On the .NET side, usage is restricted to instances of IList. gets called when an object is to be written to the database. gets called when an object is to be written to the database. The method must only write data necessary to re instantiate the object, usually the immutable bits of information held by the object. For value types that means their complete state. Mutable state (only allowed in reference types) must be handled during IReferenceTypeHandler.Activate(Db4objects.Db4o.Marshall.IReferenceActivationContext) the object Predicate to be able to select if a specific TypeHandler is applicable for a specific Type. Predicate to be able to select if a specific TypeHandler is applicable for a specific Type. return true if a TypeHandler is to be used for a specific Type the Type passed by db4o that is to be tested by this predicate. true if the TypeHandler is to be used for a specific Type. Typehandler that ignores all fields on a class Typehandler for classes that implement IDictionary. Typehandler for classes that implement IDictionary. allows installing a Typehandler for a single class. allows installing a Typehandler for a single class. StoredClass instance to be checked true, if the given StoredClass instance should be accepted, false otherwise. prints Diagnostic messsages to the Console. prints Diagnostic messsages to System.Diagnostics.Trace. Install this Db4objects.Db4o.Diagnostic.IDiagnosticListener with:
commonConfig.Diagnostic.AddListener(new DiagnosticToTrace());
Db4objects.Db4o.Diagnostic.DiagnosticConfiguration
redirects Diagnostic messages to System.Diagnostics.Trace redirects Diagnostic messages to the Console. List based objectSet implementation List based objectSet implementation Reflection implementation for Class to map to .NET reflection. Reflection implementation for Class to map to .NET reflection. Reflection implementation for Constructor to map to .NET reflection. Marks a field or event as transient. Transient fields are not stored by db4o.
If you don't want a field to be stored by db4o, simply mark it with this attribute.
DB4O type handler for efficiently storing and activating System.Guid values. Judah Himango Constructs objects by using System.Runtime.Serialization.FormatterServices.GetUninitializedObject and bypasses calls to user contructors this way. Not available on CompactFramework translator for types that are marked with the Serializable attribute. The Serializable translator is provided to allow persisting objects that do not supply a convenient constructor. The use of this translator is recommended only if:
- the persistent type will never be refactored
- querying for type members is not necessary
db4o-8.0.184.15484+dfsg/doc/tutorial/index.html0000644000175000017500000000075711520622074021264 0ustar directhexdirecthex <body> This document requires your browser to support frames. </body> db4o-8.0.184.15484+dfsg/doc/tutorial/docs/0000755000175000017500000000000011520622074020206 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/0Welcome.html0000644000175000017500000001052111520622074022546 0ustar directhexdirecthex

db4o tutorial


 

Welcome


db4o is the native Java, .NET and Mono open source object database.

This tutorial was written to get you started with db4o as quickly as possible. Before you start, please make sure that you have downloaded the latest db4o distribution from the db4objects website.

Join the db4o Community
Join the db4o community for help, tips and tricks.  
Ask for help in the db4o forums at any time.
And take a look at additional resources on the community website.
If you want to stay informed, subscribe to our db4o blogs


Links
In order to access free developer resources you may want to register on db4o developer website.  
Feel free register to the forums http://www.db4o.com/Users/register.aspx.
And here are some further links on developer.db4o.com that you may find useful:
All Downloads
SVN Repository
Community Projects





Download Contents


The db4o .NET distribution comes as one MSI installer file, db4o-8.0-net.msi. After you run the installer, you get the following directory structure:



Please take a look at all the supplied documentation formats to choose the one that works best for you:

db4o-8.0/doc/api/db4o.chm
The API documentation for db4o is supplied as a compiled Help file. While you read through the rest of this tutorial, it may be helpful to look into the API documentation occasionally.

db4o-8.0/doc/reference/index.html
The reference documentation is a complete compilation for experienced db4o users.

db4o-8.0/doc/tutorial/Db4objects.Db4o.Tutorial.exe
This is the interactive tutorial application for .NET. Examples can be run "live" against a db4o database from within the application.

db4o-8.0/doc/tutorial/db4o-8.0-tutorial.pdf
The PDF version of the tutorial allows best fulltext search capabilities.






















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Indexes.html0000644000175000017500000000636211520622074022502 0ustar directhexdirecthex
 

15. Indexes


db4o allows to index fields to provide maximum querying performance. To request an index to be created, you would issue the following API method call in your global  db4o configuration method before you open an IObjectContainer/IObjectServer:

// assuming
class Foo
{
  String bar;
}

ICommonConfiguration#ObjectClass(typeof(Foo)).ObjectField("bar").Indexed(true);


If the configuration is set in this way, an index on the Foo#bar field will be created (if not present already) the next time you open an
IObjectContainer/IObjectServer and you use the Foo class the first time
in your application.

Contrary to all other configuration calls indexes - once created - will remain in a database even if the index configuration call is not issued before opening an IObjectContainer/IObjectServer.

To drop an index you would also issue a configuration call in your db4o configuration method:
ICommonConfiguration#ObjectClass(typeof(Foo)).ObjectField("bar").Indexed(false);

Actually dropping the index will take place the next time the respective class is used.

db4o will tell you when it creates and drops indexes, if you choose a message level of 1 or higher:
ICommonConfiguration#MessageLevel(1);


For creating and dropping indexes on large amounts of objects there are two possible strategies:
(1) Import all objects with indexing off, configure the index and reopen the ObjectContainer/ObjectServer.
(2) Import all objects with indexing turned on and commit regularly for a fixed amount of objects (~10,000).

(1) will be faster.
(2) will keep memory consumption lower.




















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Setup.jpg0000644000175000017500000007674711520622074022546 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?~%4 u9=dYP#nP$9hψ^[xfLCrb"nǜ*,!tzlwvnvHqV_C[~lmed9XԓIVn d *T i;wѿ3 J/}WOm.[eW 4+؏ι_Y^kC|Dd𵦛-5z^{$ʀ` [J<;x['ӭoZ\\\I"L]( R>eMɦծb~dg}"G+߃t\kKy.[o~cco5mlk&r7 8=3^oJ)}Jg%ԓ~)i6'v'we~lvJFyp|?gId$z J(B/’/=  8?1{':'?pT{?^} 9?1w':'?)}Jg%ןs?NO?NOR*=^ާs?NO :?O&JQGԨ{1}b6i5kԨ{1}b4iG3DD?df2i1MqG{1}f&{~C/MqBQ:=_ZGk w蟐i-MqtG{2~W >?!W''?E(t{?[ >?!S''?}NgwQ''?_I3DDG\R/V#?OO4g MrTdv~ O Ё#? hk >G_u_xgM/$>DGW*)bO$DRAtOr>G73B|Z'?¹Nt{?ong-KOsTd߂#߆C?59ZL&v# 5 u/dj_#'?—c?"hs(./ O~ _?"h/D? :b7?|3B.~Tמ4#EX=kC3Ҍ[I )%/:_':=:&D9,@ I<ߥWuekcM'tG_ :cjsqX Υڞ+*Oh󈶞3i$~t_-Y/s J7DQ\8ROZ)E֊u&o7eMsJկ4/b/?HpQO T1xS#owguq%1 3)$bۂc]"W;5:j7ugQ^!|Gj59ʊ-w8=$N7[jt|cڽrpj/_3rčRTIOLbxKDZ2M~˷Qy9;>>دaqN!+*q9o5K1My>KO mI5)MG-q #Z(Zq?uEg25D0s=k8|=GShqV!mN?W'rT?]/+9?**^+#'ESuj$<|W#~ {TV'#?yXW?U8x'_U?5aQ?ai_#OSd@?jtZ1?X*oGxS _OoP?Njb_؏cϦx_ $[Qo.O^/@@SYq?KGAK'Ok@X()$$]<(x# O '^郎#vyQb?2wc>#d/!^"$k|~T?w uZ!-[[hy>-׊-Ďe#˪^~n+˨HiGJP Y>$YAUL~58 n|ԺY=N/- P' 8?CUfenc=3wt~K"me keME6,MɳBIO\gr3_;?I *kqm>O="Ytvj:5{t;G)X1*}=+%[e)"'8MyZ9WUf=>uIvJڳ؞ U$qF"EY׳sQ^3QVH?JTf"W׃s] |A-!%H[J62wsa_#fo!>Й D{ qQ[AkX\I v~iAic@UX{r3TYol"\Ya`8AqZzh9*Lm0>RKi؅p2rA.;˟70m26d{[B?!(72z҆OvnZ4ɽ q &-7g٘>7e'hVMEu$7*2;hW]xki4R(+FHsܤ!C` ?k{ h&v#tyǦv6H_G F;e5iTl.2z|R58mƧqVX|6 p֏uj@fsҔm'Zvn6Jp֠G#ڏ|O!!Vʚ3>,M#580@y5:IhgpdK! ?s֮|J7o#Rh..-b% Z߰mtwai6e be rGr}k\7τ/ cN3&.5Jμ s5ЗKa)M'xj)Z'QYIukj r"rY#L.m2Bq KO;ְ[J<0Gcvȹ)} kBWzTk>b6Ɍ |y+KU\v9f־Krx4)dEtՕ Cqb/fK`IEezr^@>h;pr;zME$6$0G*Ԧ26$ }T7-C(p~nztN YEhE?.pEQ?JTf"W׉Q\aEb-d^][' k|2;u\7 XlfӴ_( -Ҥ2fL .QE]usH]ѺTdE:uYEV1HbY #-n •#w^F/j7m}kQI2^,St~VQm*\@9>n;Sxw}#ƛʻuu\8# 給I<3m4z+<תc9_1rف8̆Q{,׋ 1k q$ps7[ FmEsK;SAAr::`[M[SHcR[bZS)'FI]ήkS.nIL<cue8X!!A,GsW75ߙ$Irm@ i)I\{Q:RnjQ\5 -{ç[k<:_ qj%5:m]_"Jm7;r@F>bUcb# W|(mnKD F*UQ!JžׯZ'[Ųwc<ăbnhso݀N@S7s\{mkclr/U;~R E m~ 4W/ I6Kpۜ9NsޘPIjZ6kM%*Ī`uaxYa1ޤWЫޢ!~cq?+㺍" jok.쮂S)'Jxhi-V23~/vB$<~\Ao#Q-)(XtnOx/cRdm̠v׈m!W'e5Yalqfh(Y'OԷV8YyFcm>{Z({Orb;;S%^*Ο%>\mU澉dsoiãuf֪@GEQQ,t\|BbTb ?{z $WFex'?0TyKMKk z"5 Et-@ <:.4qq֮|&ꟇJFVRM{/__7Npo"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.YϒD]:=; k/_5/MӨò !g1tMg,?&g|_ə(ò !v[ϱ6Ϲ%{8v ! o R/?QO=a߹ Szާ(`m Q}QKǰXO&9 |Mc3tQGd+o??Gm>3?E{8vAd]]'i>3?KEY ZϧLZϧLGdByV3tyV3tQU]U]-{8vAd'i>3?Gi>3?KEY ZϧLZϧLGdByV3tyV3tQ` bp d|oCEX΋%xkp#WJFV~9z-(gחEf1C qfiմ(?4U$(279Jt+tI%q,SDd<ܻj:bj+oO29!+v#  #De`m5X.ash N%~ouG9.PhÌYW?[ VsZe_ۈ!uppQtƧӮA'J3iW}ά,5pQSvV_Aa{%O-,lP_q;ܐ9*# /-TE=sԌ1>Txn9B;i_[t1Mٸv #8,?oern. &d/$P2(`tXxS̪ǽ7-dwیټH .,xٰUc'%zzcVSB/D BC2#v Vm&f63M ԵEԬ-n$*H(g ZMRۑDs ۲O8RkZM 4X4xcJoS[A9Qcڡ KaO,I$s pѱv. Ķ> Bpm.lRpnӥS|Q5Աi7i<drl,OqpdWw/y\zlE㚭ee~Iqq >hHd*R1#`0IC@eE B;bA":)`ٌN&Q𦧩RKhz96:G(Y[|U%YNQEG*J1jiM>sW"ijP/ ͹񕍄R}tdQ / #uaqԀ`tWW/5Ou ĶЈ˙ Jnݷvߗ7bbf}F﷫-1h`1~ }<88+z6݃u+6Tc@/ "C𛔠ʒ̬=P۽aiH(T`>bTz',m_ɎT%;n1⭝&ݴFҝh 1o'#`[ı}!O|ĆY\G\ 9$*O\YՍ-nC!RHdxᨅM.{249dҠ]@A^vw}]}ui!A,T@`2ylm8W,GӃ [o೜ť#$ӫZ0Vrv(Ȑ3oLNo&EYX`@h4$Y2-wn<./Nьs}׏t1DI"F(r 34(F.n3FWd @sKP%_Y-&rAe901V:#pؤ]\[N ;@$w+n85-2eO0X N/tmBR5́ >Myw1ƙsƄRj}ۀą;݃x,"2Bmn짟Ok$Y60@8r0H]I,Q,֣,H$gX7B8C S–mjѻo\ʲ 0F:v{Ce~"lHU~bmPZ< ]$1\ldܕo_ܡRc讠aQGI.bLdoj3RP9%)o$4Y]EHd|i.QXx(%!f@|e~FG j晢\$yFy$TS#$"To\mlX%-s H_ǷnwsfYpMA<V46ex2UF}/khc/.7mp%grT NT~\y~B۪,hmAPrrqh`Sƞ?&y,Pd"\H 3׃ڞl[\c-F*>ŀ<0^Im<8|Q$ylmPmH%TOZde]OQ{XxPr6I&P~R((((1?AQb(%xkp#WJFV~9z-(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq'"5 OEx{D .jQ^\?ү/V%QEŠu>.ehݞ7^GC]+eT3T/~hZZx\̊I$ VL 1H: VV8 te]ܲHc߀(R VUx±//ik2ͣXy*S>yd N)^>;ۉ5lKi6p1nj|eOguqJYew9E2񥨈jЉdWz^GSi';A^whČHU5'+M +=UGWFMƥ3rQWSext}Exs+񾝢_x;k7{Acg%ꣵ{+e-|0Z)r*[2w2vz1QGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@D qlfvǘϙc h(?[QF!?:/ȕ^>+_ ZUĶ (DmkWSswA`uBpY^f۠cwdݞx>=/:0Oۏ w'&. pۣNOw+'WFslEݣď!`JdT:K`QVzg_RŨu$v$(剙\[<huR4r]S( dcx*[Į20XsbsfԜmkE?qkNccsdt|n̫1uP8 ($^zW%Qd>Pչ 3zu`u)4:$R(dt mVRʀ 'sRHQf-[Շ,~ꖶ:]{MdrOwr-q4e\a7RF@#w&ӭ!䱾v(!-懜É18 FAA'P5lV>^W?|%Aos?}FK&i5 Ë8Mh[)+  èP8Wח/ c{vBWv}ʹvRp"g G[?|%Ao~vQi$q _h4K3L$ #y2۪Ƨ :d}#^yៃ~muRKmyc(w!C{w}gZ=ɍ\H#EyM8liU-7W5}/QcIk:ʪpJ"4ʆdPaA q(9♤XGhdXp}8%T {h+5 D9 |q>^=ǭAgiZvZչ"xa] Pr9EQ]oJ}UQA™c9)=*(IKͩGialnq>p#{ӬڕnĚmms{i].yfDY 8a:ze,DDe`Q}K^b_sƥ Z:୙3w68=*=3^XѤ8fIFڄ 1iZDwff4C<'D&,'!y+MkiwK;%ĎrU`9?_ˬh-{٭!Ϙ[t?*'8wCP2ǝy{wc,ta#q [gWG]e /#nݛ=sݻbb8`~O3u\ {+,NIsf<5GFiʉ 6(|&zt'M}nݿ;gϽ.Ĵ]-ZL4Ba($Pt棟7Zlhd˘ب@0ÀIa{Zu-.%`IFmwd$yGt)E1y{Ug&cWv` fע)QEQEQEERףب/FEQEq'"5 OEx{D .jQ^\?ү/V%QE?#k_ʽFg2@7|:=0F8_.z?Wm1ݻ Ga vqI{zdm cz#to%aRc9;9M3cӚ ӤҼ}IuBD\^2b|*zu>N4ٵ[TwFw-lykl林croD6 j:0[ Ҕ17n1'wkE6c&6Z= [=0钤{bA9aSfG}~w6я.*Wb cyqјxy#ʅsmŹGQxMR+YfQ `+`xCFѐU#bgCM*Fv'sܒM|#OBXae2]%:'aXIHϭ7WĒjX^ nkxeE?#eBh-ϦkdFco9vDN5rZզK{elĖI{r9K\JVUK^óI - ,t `vq1$5FEҵ {2܃[DFGĠA\J#y8nbXt4j&wVk{aMp+X~hn1z[ A4a8P*vןymuq OKo íMy&-̄6 ?0ǭ /e)9"lTQ}K^b<۫ǪI25A/ل@bv-Ӷ*Մ l8go>9wP=ܖz|zqfӸ7rWxqQMcg<ܡDIrNWwEnGM.CV\7@q6F$MV{4wȐ;P8Ҋ;[hxJB+yZXejDZ7$?" 9ji[lhh'/1z%EgϧO4{ʌHyJnG6}kzL(EPEPEPEPEP}K^b_QE(1?APE5`G%xkp#WJXEVc9ȍף*Q +",Fٱu~^? c#oxDmkWvKûl$c=26౽˺Si7W 1Tp:r3ԬsCZX-oTExɜ}11|?@MêaTUh|WhzE,ZRGbAXXXX-v -*?\I7moO$Mwafg«FNF06Sx4= և)5-F"Iexـ~6"|jobtuI^ͪ\$2R3h3c]g /4z dU|ֹfqI=kӪ퍦hְ][Itlzss1툱hI<eB96kM&ͬڊ^ B@t銡T*vo[_Kc%? `Yw42G'4$Ca`Ny%#>^OI_b5x$uD[Y 3>E ivQ Xʣp8usvi5Ca [ena,<#ƽVyoy{Y\[`kuw([Cn+^.ڞ۱:}#J$6#sO{_Eom.+yh(3+VCk>'U=Œ[\%)t2-p7?7'c]kHzuXcQ@p!rv|ƽZ:[p_sXj3^Zmf% Qv#sràdTԬty4s[ Rk]Dd;q׵z=A V0ƑDETtӳ5kkb}z[xnmmkߏ&1nd!d wn=luB)>8kVh^o0 .ÕElIϡBv=UKQ.P[uߗw;$-=oJ ,7XZE|UUmKM{y[)%@?t Y+=O>Cy}A4 1>`7O "&@Ų[/:nk%XJHn fd)3עB ?Gy?`5-Exa2ҽ̮:Ldyp;w;,s?J:XOWs/FEԿ6*((((((((((("lTQ}K^b (8oCE'"="W5z{D .jiW㗫(g?^^A^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@`xԭ/@Կ6*(>GѱPuψ4[;!\ (22>Rs#QKi ̢ ݾ]۱sPV Ŕ\)bgUik-j*HIO  UK]Jx-Ghk7< X^Pk7򍉛>?1bqp3Y,r>SN FS#9|R+JNFAW+Ye'Famt3|7͕*Xc94[ cv.ˉ҆\ÎNH&@;+χ/.LblV0K}Aݜ օwMa'k<20L#s 'JvnQRu F`S w1rT$ ȪڤMYuY&U $!'H ;ז8Ui8 }pqq.pySwyS`wlo?[`ԡCQX*uv|\ g.8r(`;z`y*q\us'ljnħPZYF8ڂ7m##jEm|!U]upT`,)0x:59eAJ6Jg988Q:]qyY۔ 0uM@9׿׶}fᮭwǷseIȒn˒vr'7&H ^IFVlk#(ÜkzqI pXT`P= *: 2AI";Inbom'=RΡ-[_lv^$ *w 9=R[]=MRVhGI_ɗ`B  oOfY&fp"f߻nР8V8 *t1YN[MpAg׌y{ިO#iHnb!# &rF}.-ܴoH  y7MO$+xu{{KA lŁ I\|dvkJ+_ ZUĶ (DmkWאxDmkWEPEPEPEPEPEPEPEPEPEPEPEPEPX /e+~92sAK? o%esPA /(@$l_W?EtH?\AK? o%esPA /(@$l_W?EtH?\AK? o%esPA /(@$lZٙ!+ iȉf_)_-z{}M*WIҀ;XM^)E JB :>V >u4qj)i O9sӶ>Vׯ/C_M,6JAERو3*:PԿ6*(>GѱPEPEPEPEPEPEPEPEPEPEPEP}K^b_QE(1?APE5`G%xkp#WJXEVc*jdΙsK$V(cS?皨dgoVwkI.W)` H`z]sy͜(ޡ"_YIowfAžb`.38$$seſ[P?"C&EMlQ@/#-?_ݬGp # *xKxϑol$D9s OF{mׄI-Q_H#?n(qΤeȒUacv,9?nvN(ZP1].i1̻0Hc`㳓8ciVyVɩt qBS&8pOR@!*}lqe50P( H'jms% [].͉jr$0|ޘ普wkqzCc RC8+1jhVVe f!FN?7_j`xJ7Rۛr CP/4nUPX1T[!=*߅^&k֒Zy8ʲJh2N9G{XjA~J8TNB zu ӭ&+'ČZʨBWk9$})-`2TQ8<ź?'CH79+.אYWp (&D]۳+nsy(K/^MݤELbR|^Y*K/ g@!KXe<ܶw`FpMjX}Kw}o7qU^~ρ#Wxq71=yȴ;avqMh;pqY!>ǥA9KX5э1`Qar{m|9- \Zjij`2a6bk e%z^AխmR[[-n\m>ӗ%N҇"};ŶWRE#̉lCƎC8e5:$e,d;+*Exx|,Itibxf5@ߌf5'^i 罎%-Z&Dѕ1m 1S;0ekWfp-%2 @a9_Cߛ?Ÿ]ء>q'+g+F+ƾU[ټϴ;Y1F ym/ۤ6k6$IBE,![#8 $q6$VeR+i]goINr>lrV0ӥ2NPTIF*_2zpNil:Xӭ( 30(A͞[9*ׅn_-5teH6$md"nH=ΠhzY/Ry7 "(Ud U1ҳ4$}a(m/<2pv "yoSo.5;)?Ycr. IЌ>Q|%x#갵f;mIm_rh@ixMJ,rγ3HJ>=2>oNլUڼFFA3@Q@Q@Q@Q@Q@Q@]v! " HUbz(vG%?¹S "3k rd$e}FEaxu% a$xW,pNNz;_l߄ >/` 疞 xe~cWH>"_0ao9fֵuI}F<;cUYY eRF@$@wl߄ >/` RxTux-1mJx`Ky%ct[!gnڽb]ɝ-·>ݫӜ^zsNk}_~(d݃'U.๖(_s0F֧6yqyxH_ԌqD1p xIkf ?*&(1?AQb(%xkp#WJFV~9z-(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx+XkjLPFAp{dV]k@sS4]k@sS5Q@%ֿ ?U?G%ֿ ?U?]]k@sS4]k@sS5Q@%ֿ ?U?G%ֿ ?U?]L+kwMms\j&X º*(?[QF!?:/ȕ^x`W|c:\8gVg?pZUĶ,QUg?pG+1(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?)5Wզe A6(A Rtsy?sY>+_ ZUĶ,}~z+1>y?sG?jc?4}~ՈR,#muP }o?4oѾxO@?h} 4o>y?sF??M4}~ѾxOF??Mo?5jiv>pI WLE>y?sU o?5^>y?sU o?5^>y?sU o?5^>y?sD)Uz>ҍ?>y?sG?hg<'}&7 hg<'?4}~?7 h} o}&i qϪjqY4YcW8UIv>'?h} cX A?%P?h} cX A?%P?h} cX A?%P?h} cX A?%P?h} q^0յ nUMJdUob-2z]mX} onE4S3V$JPzm}~ѾxOF??Mo?4oѾxO@?h} 4o>y?sF??M4}~6y#Fē۰S@bKy'h[Q@JFUȕ^*rb[QY(*>ozRæLȑ1`p_}~9jvC"DGl ;ȡdrh$(notTYSmK:tΌ\>KiBCHt?:v\%ӬI`!l)`A-(y#ҦC7cXpXsV5NVlJ;bpp8lAUQ? @c3x_y+oWM*XZ(((((((>ozRæLȑ1`pKbSVU$ga'}OݏjUU{ҮYy`mI{#=@5-VV^s ۘPiw0}pz?c[a% 6dl)b1s,4;us8i :HI0V=i^Qgسǻf6#-d19.NZK8  h٣w- E dV3XI}"xjm䔪d)g%~ꑌcV^Y"* HQ`OIɧZ?0# o WQ? mg뇻`]yd2`Ic r})Q\'>soX@MkQje#x6F;m⋛NK[m&W4G3,ʥ#o+b*FCq ^#EݽΫZo@P^0zcj3OM6*!,0N`94k(]v۸mϛi >p ۻGARdݧ/R;q띧8r9c,THXY1a#k `9Ux2- R,ۃc~9RoJ! 3JRGl/W? υ=cE[?P?ů'/Wq^c/[ Vs$l#@X8U\ӵ hIq0,8|@ jk--(4č ʩwT FF@ݜgX}Es6ym%ֲ*twRw=߇i5 5)$eHbP[",s9QSKs;h>eF7:#8=jF7Rn $mNc"\fjHt{h~Tn ܹcWn} \kq|r=J`eM?k IuS[󭧴żq"a{ՙtggɒ1z2p@U99-)VXȊʯ=1RF]?4/?@{UQ? x­a 爙H*uRA+_ ZUĶ (QEU;'M< >ϴBm3~UrO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WG'+b͵cr6>o:gl"2`" ( ( ( ( ( ():nhi~^v}nqdgo+ آ1 WG'+bO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WG'+bO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WGEVT.&i=2IdbifbrI$rMj@o+ ? WGEc'(O/_V_ҿ ?? п[P?"~J(D7BQlQ@-2 LAƥp^Vh8oCE'"ɱF^%*j(*rb[QY((((((((((((((((((((((((((((((db4o-8.0.184.15484+dfsg/doc/tutorial/docs/docs.css0000644000175000017500000000307111520622074021651 0ustar directhexdirecthexbody, p, td { font-family: Arial, Helvetica, Verdana; font-size: 10pt; color: #666666; } H1 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 180%; font-weight: normal; } H2 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 160%; font-weight: normal; border-bottom: double #CCC 3px; } H3 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 140%; font-weight: normal; border-bottom: solid #CCC 1px; } H4 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 130%; font-weight: normal; } H5 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 120%; font-weight: normal; } H6 { font-family: "Segoe UI","Lucida Grande",Arial,Helvetica,Sans-Serif; color: #BB0000; font-size: 100%; font-weight: normal; } small { margin-top: 2em; padding: 0.5em; font-size: 90%; color: #CCCCCC; } code { font-size: 100%; color: black; background-color: #F4F4F4; } a, a:link, a:active { color:#698DB6; font-weight:normal; text-decoration:none; } a:visited{ color: #394DB6; text-decoration:none; } .lg{background-color:#F4F4F4} .co{background-color:#a0a0a0} .console { z-index:1; float:none; width:100%; position:fixed; height:150px; bottom:0px; left:0px; overflow: hidden; } .button { background-color: #BB0000; color: #FFFFFF; } #footer { border: 1px solid #F6F6F6; background-color: 1px solid #F6F6F6; padding: 2px; }db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Configuration.html0000644000175000017500000000756711520622074023722 0ustar directhexdirecthex
 

14. Configuration


db4o provides a wide range of configuration methods to request special behaviour. For a complete list of all available methods see the API documentation for the Db4objects.Db4o.Config and Db4objects.Db4o.CS.Config namespaces.  
A more complete description of Configuration usage and scope can also be obtained from the Reference  documentation.

Some hints around using configuration calls:


    14.1. Scope

    Configuration should be created and passed to an opening ObjectContainer or ObjectServer:

    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();

    IServerConfiguration serverConfig = Db4oClientServer.NewServerConfiguration();

    IClientConfiguration clientConfig = Db4oClientServer.NewClientConfiguration();


    Appropriate configuration should be submitted when an IObjectContainer  ObjectServer is opened:

    Db4oEmbedded.OpenFile(config, filename)

    Db4oClientServer.OpenServer(serverConfig, filename, PORT)

    Db4oClientServer.OpenClient(clientConfig, HOST, PORT, USER, PASS);


    A separate configuration instance should be created for each new IObjectContainer  ObjectServer  It is recommended to use a factory method with all the necessary settings.



    14.2. Calling Methods

    Configurations that influence the database file format will have to take place, before a database is created, before the first #OpenXXX() call. Some examples:

    IEmbeddedConfiguration conf = Db4oEmbedded.NewConfiguration();
    conf.BlockSize(8);
    conf.StringEncoding(new MyStringEncoding());


    Configuration settings are not stored in db4o database files. Accordingly the same configuration has to be submitted  every time an  IObjectContainer  ObjectServer  is opened. 



















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/darkgreydot.jpg0000644000175000017500000000155211520622074023232 0ustar directhexdirecthexJFIFHH)    " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?آ(db4o-8.0.184.15484+dfsg/doc/tutorial/docs/querygraph/0000755000175000017500000000000011520622074022375 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/querygraph/2net.gif0000644000175000017500000000560411520622074023741 0ustar directhexdirecthexGIF89a^A@A/.(&Y#!1L⎐VY%%'&#$8M B(%ꪬ%񟟠:>e%#r'$ a`a,0102! "3HLg5"&Kb~4egs5suJY.AM+>W9B(ۗ~6,]s3G5QPQ㳝18$ey朞rXn߁Sf1)/ qpq5 "0IgHH%,H #5lTUbr;*,",^H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s9cΟ@,УHk riP>jڑկJ2N(pF \j۷pʝKݻxX.,j,`ǐ#KL˘!\תQ F!/4(c\b˞M۸sͻo[l5 9#[T'C}kν 5l9R{%8HC뮷οW 8 . C ML$Dr?T_c] `l x'`A@|%`F8[Qaco 80@$ ) l nh݋qv Y%d#8!c= [U]dEt$o "8X:@f*x\8)e(\0A)r¥Cg65E\ [`d#`뭸뮼#觝WƖ奴 EOVgbmJvbx%$PVzɥH@@)B-\\KvGjG`.spB1dutnlp $J)l 0@Ϊl"\lp)g–F+[ÆBLoosc -cnz+('lD[P:h<&X@P+AHI@BB()\@ZxD"$}HD @ `Ură$qX,Iv,z#@Lj q EZt#6#=# A 1$"IE2|(` A Fd bQ>2t0ty N+c9(iIC`)9 Dy0iLӘ c@7rg4"̆\S  `n.s:YqF FtM^@  0Ay >RxNr` ЂlB 4/+zF4)=SR)fe<%[F 䆂4Uqœ~ѦOt^lT/U6GmjJ5OUTn;W8@U `{TJ׺v-ɜDXo ; c@UMb:Mב  k P+"I^GZn#?B T--!Hf6yHh*D vwz/!$hP7JjZAH D?Z̬ x.a3  [Ȭt2-)` pz/y@y{-H PJ/5(Y;٭~g.Ēnm%2e-a+M2MZ  5a͂R2`}y! .vO2Gӆ[ u:3M6"u+EP3,1j1N(Z`G>:7* ;͒ulLϵ̼V_'@.͏'!g2.g86lp3@yCvi;kwmr'ϻA <  *DMJ܉^v:APkvl-{{- @K DԳImi}{j h@݀~I-R͢g_5otp)+`q;&i͒$~nBBl` ]$W c2 _HOґ_w2#X[Xg_JXS`NhOvp3;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/querygraph/3.gif0000644000175000017500000000677311520622074023243 0ustar directhexdirecthexGIF89aa./(&A@AVYY#!1L⎐'&չ#$,0M 朞HL%%߁8eg%(%r'$Bsue%#ꪬa`a ! ":>AM+3"&s5Xn18$QPQqpqbJ1026,Kbg5rSf1~4U?>WJY.ۗ~G5)/ oV|b]s3ν㳝׉o9B(kjODG҅,=qߥ*9g"!a,a-_ a_`_ׂ Ϋo O}84lPrq@N,  \V^퉜IlC*=x@B0T>a!p]˗XKlH0 S08T5f@mچ F"Yʮ뱯-&6PWbu`7dEx @!g_1i ee1yH*. ŝSdf O!,kgs49Muw'`@ DH6XODU%^fhı@g`ѩUd?Q t?Mh]t)#@et(@X^XU=`+h#7]@)DiH&$ĨpD)TVie+=)\v`)d _l٥Z)g"|1xJzg|):J衈fh6*ϢF*)/Nj饟T馜 iNi2:jzjjj8kwkfkZkZCB,%A9 j#PnBcppD!hc9G2nUTdpEB@$( !<03 l!ɀ xv 0|iah Iph 8m(Y1Kn.݆-5f4rj~+]a߯-rq_}`5nf `cZh#d! uP)!_\ї (WM0l0 ydqK^$曂qbR`qB` ] nGbX]) ؁$)#xh*()؂42,4x'6xb':(nA@A/1LY#!.#$'&%%M r'$B8߾g5(%e%#~4! "3a`aey̋ƟKb102%18$Xn QPQr]s3>Ws5AM+ny쪫,9B()5](&"!>, @pH,Ȥrl:ШtJZجvzxL.zn|N^E#!,u,i/!}]!Y && HCV*)<)*EDU%% <&M;= 2Û%2=€+`XAȱǏ $ &Q0\шc5l 9y<;OB ,/ "@pʄHRpftsΎ;},JoGz ǥE|Y Ȉ]&]@ge7Dk/Pz q@ Pe`ގ z ?t\$qH'&bE <$D)G2/zD#  v. lxܭ)|9`wAy@HGlcP(g\M&C`@^ycO fc=E3.8 5hw ,s߱e tif^< H@Qp7Af%N&HF!vĀ,h8P$h ̃< [h۠.҃=0:~q vCF|1~h?@iiR6A]C1@l=eEK^#gpKAeGx .Q¥U-tԩކkǸ첏 1Lāʐ4O@-DmH'L33|a,#D3d\wm ba`hlp-fmx|E;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/querygraph/2.gif0000644000175000017500000000474311520622074023235 0ustar directhexdirecthexGIF89a^]A@A/.(&Y#!1L⎐VY%%'&#$8M B(%ꪬ%񟟠:>e%#r'$ a`a,0102! "3HLg5"&Kb~4egs5suJY.AM+>W9B(ۗ~6,]s3G5QPQ㳝18$ey朞rXn߁Sf1)/ qpq5 "0IgHH%,H #5lTUbr;*,"!],^]33E)Dȵ.DEѩ3J)۝J77܈E.,i*`Ç#JHŋ!ZϚ1J F!/4C\bʜI͛8sɳO[h- I!)#[T&C`/}jʵןA 4l9R[%8DC.ʷ߿3.vH G L\--? mW־엀R$B@b(Ə#EH([nvyg  t{>Xz i@ׅ8-mCf[UX\q 99@d(rx\8'1e \0AqxB#53ET [`D#`8<#襕Ŕ݅4 E~TeZMJvZX$m$PTlAzǝHH@@3)B8%\\I^vEb' `&SA1DrNlp $H!L 0@Nj\lh_F)SBJgOr[  uCN)LDSV(:Mn'FA,'?o%@!-mju0)Tr8 (G(N\t eA܁ C(D|仯-Fg̀ [P[% "\K8'*³6 6EhВgB.6 J<0lWPq\ |AmP7x"W:wn < {n6p h#@謏Ny굻.zo<-Ϻ++Ϻ}b>"@ ! BІ:D'JъbK5(Q=qdq]`K)tl m@Jw4f"$r r +]RSL B aT _@ Œ)ުJdc uR_"嗍Q+V։<cnUB-xLYeVKA0@TѕbrX`Ce@= Pt6Vg?3VZ`&W$RZŦTńz[&A'0Ҟ˴PDj&{#kiBAzm2 uc{V0{%9 @ TF5'0#} ۓ+CnߋNv&I^@]bJpeB!eq2)\֓xv& Os~5>X[uB4PN~  z@`$4: v5h+ݵLS=BH V"HQbB4i=-4 Rn֨bf͓Z@'a4kJÕPDӷ8!xK @d9*OA !!6AT+!MHC~*@f;͎;q dR9hkn-,8 @rNvwIzޙ;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/querygraph/3net.gif0000644000175000017500000000765711520622074023754 0ustar directhexdirecthexGIF89a./(&A@AVYY#!1L⎐'&չ#$,0M 朞HL%%߁8eg%(%r'$Bsue%#ꪬa`a ! ":>AM+3"&s5Xn18$QPQqpqbJ1026,Kbg5rSf1~4U?>WJY.ۗ~G5)/ oV|b]s3ν㳝׉o9B(kjODG҅,=qߥ*9g",H*\8Ç#JHŋ3jx CIr(S\ɲ˗0cʜIf%s3` JѣH*]ʴӧG |ٳիBʵׯ`JYZê]˶-ӱgE֭D˷/Qsϭw W)84n X岄rAAO.  ^Z랙튞MtC>x@b0T?"pmKnh0 s0xC9T7j@}ڇF2vluww GAx&l@AP7_QśVS (bHq%֟anwRa_7#IPk'Ԅu^!mB=dRFgP߁H`ԥ[dhAQ ^^Ag|woF]&f}D@`QW鄿Q MjeS*%@t*@x^Zu!>hj+W^+k&,Ī6E+VkmK_>+"v+ _ۭ+oB|1Ro+Lhp 7,G,1OOlU q Oq$3l\eV@0l 5vl2!r^J2w6b w|*t'C0rW=t nNB0yf8`(6y:gv(՛7P8kQf*8:j!0 h}8 Qx7Yc5[Qld%36RKW&%g:;AcS}%A:mYpfW! o `[b- J]IG4!9U@paKJĺ`*9AJ҃w kA` !t1 #Orx;a2B W3jAp?o$4 dP7^I^6ho{?wG88¾hoVKԩ \ f./7jEc &|  ݍ y?_ӽ[4~3&=ҧ` '|Grx D }t=^-/{VpVwybŽ?ѕh_.6Py'8&@tx3GFCF6:<,?W4z:,;6I8W460IAwW6s7`$:_4esnC;P8;$;c35O'R)C9cv(qL2Jx94@<2;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/mono-tarball-dir.gif0000644000175000017500000002236611520622074024051 0ustar directhexdirecthexGIF87a 5225!!!,,,333999HWt2t2W22W22t2RWHQQ5Q2tl2l25HHQWHttHttlRtHAAAJJJSSSYYYIIrPNpWTrUlGHtttHHwoNusSbbbhhhwtosssxuq{{{HRt2nHHVpXv~~Plxn$OBQQJNtl~qtHWVYYLJRUZtttTV̊ RRH__ tf'n5tl$r.2HHett;: $'.269NMQRdhHIXYDHSVopvuegxz2QVnsRtWHtWkcsopuÇ6ߜHԲhذpڽ|txx“ƚˢϪԼ¦Ȏߜǔʜɳ˿߿ۄǺض协提蚝骪꼾ƌߜ̨ѪմȏЈԄؐؐߜŧȰ, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8s.t-@ JtѢH*MSӧP¼EիXjʕ+`Ê}ʓϮhӪU;۷:%ɕ"Z˷o֯p |ѕÇ!XYwd(@7-ӨS#,[5AI޼e\IK,XFSrkL җVͼy`  TT`B,p\]UC |=Wa1; %?΁&Fna7A)gUP{g|U!RwQ\,XOHZc~+UӖk.Gb뮻++ hR33ګ7G,1<?u[D8[]D$nj&mmP ,Ӛ\ARwr@G0 VRM3"U4sc=m@5b-/Y&hz 7sl@*Jk0LtτW:~tf) 夣f8ʆ]-v^+%n{[]}/ʢ#?I7QqC$,t=%8"ƽ?ӽ%/ij^&/=)~ h? }L# a jr'B`$=.Dk;A@!~&HD A`'`P`X"Ћ@ AA6qz00?:p"h9֑hTc~򐇄EGG2ΈJݢu}9JPÂ9R h劾r0|*c9r!/xP \(54HjܣrB f+8NrBo<+Az֓Z<IP>I؀ [%[P @H{r -@, [3SJҁb,EU$n68` /^@6&7IzSP-?A0\<' 9~l  j1D 9HulA'Ayf#YYTk^r;jN'ԁt0ZOʏJ u`,p`+A>Zw*␥;AZ_5(Sc"79 #h~XsrD<@R`Gt+]Rs]4 TÆ̚ j6]!:!# eۏ2:P:_~H{=͆o 8@+ÙO$Ѐ<KAj S! (C∘Xy1!V* ?!&'%"\KqDZ z  6b̠ } I!!#"h.ed˶9eBS#0zCUV@Q91oVt޴NIڎS9ӜuY'y--#|k4)"){e[pDWœfS%Gݟmdr 9әf.y_rG W;sF;uvSf:4S\sް$6wx^AlޘԸ9."YjZ܂`^`8j,MTױ񩞨WXtWXիnꤞۗt,(G:rWr. bwݜ?nh 0zWf8[9"%AP $ zӆoR䧔-c7Ȁ9Zθnn?:s0%u!wm5TǺֽ п[$Ͼm}q _^AFk;6Ι`pWѴ δpzr02`Op wa7Nf6hvk\6c 9yy8?Ђ/b#z S6[u|a XvI"6neE ?frSoÊPt\%P57\58pK5I t єbpVHq:&<=$D>AFo.;RiS#mԉgt%7 6֑'Dyfu_{ pkiVG'V To9F ;")'uP[%{%T9=Snk'6u?2`^YR_lm=bvleio)dhS]M#8xM44m]iO!c昷dnv<AЙqhwGq&l(N'0#nnY ɉR<ɞ%qH">v0 ڔʒ4yD9 xבc=``z/!>O C K1v޹J9K?Z>CiEIdٔORIVeB#e]a)#cAhfR㬠 N/ЭSPgMѴ5Vssx—fBG)V'DL֘jj9PFoGrhٙpY7Q  `9{<;I\Sh Mp#XDt ok7*YIσLkK6,,[%X* @:лQ]:XT#uEtp牓5NɕTD`Nzi< *rFQC QpX+,v[q9uPca1>jzQۺ"*d$j(ʡ%mҀR0B&@ M/$Tj4]Zv 9ۻ1`ZEwp%{x 0W"#ļ7+#Am K@ugwzz ZZڹ ,LIP <!\cH '@š<2<ʦ|ʿSʨʬL:ʖg*ᴰ~'kz\s7m2m } Ӭ!W 12M/.71'qP7;(:4$X&6(|öS+L/2H&y-s[ЗX-!|0\XT\6gI}=,<R|-p1,5%m:]|`xV1òB]F}9]LLG;0Pշ@ Q-D{z@t0sgd.v<v{#5@rponuR)5Sإ:$ Gw'x\-D6I]umyk[; SnѨ+|٭q7!{Ѯ   Gqِ}ۖ-5lȝM ~UÎ,,폰TX KZƎ&nlQA$f?eYFg]9gX^9aQY!{.tBB(ٟʎ@`v`t`rѰ͌uZc5]T׼ QdK>tF&ᜎ>UFKI}}6m @+".S?k9h- ·z<>S:e[1 'gjfo[n.gν `h} vg1(Nk̞SH.(>!EerY' *zQ7+gJ!KNDR xy P( 67P3\XduBu3 5Ix(pL@uFSNuS\oN<ȂwueqO \0uĦuZ%Fw+Fė꘻VmBA w!|pڴLFp^/ 51hL%f\5dX-ȁxuYаW-׬eȢ%yG,_y¯ȹOmNBˠmo]\| o^P}^cQN\9 DPB >QD-^ĘQF=~@H#ADRJ-]LʢL4aęSN=}48(QETR)mN|2j(OCGL؏#M~mYX `0tW GrJ[؃K B~eBz# 12=-;n]cV¼ KGCk} GI_+ɥSRdLi*JadAVСT"Y[:ˑ8s8D.n3WV:_ tT/YrFXIm(X`!R_hUVWU5U= dVmUNu^O,R {NYh)J)ТTMfpIp<b88&[AU]O)^<Ă٠gHC ~:x`zE%,5Fv 9%c/a݆p"tٕ]φt:9r_K<9ϻCt^!_xpg!b $b/`Eʡ}4F#r(M4-G7=ջFvlfW͆vu">iWos]ZײSWl˶03+?qMP" 󙙩1 C$k!3&NA!"2%C(,Tɻ$԰) Na7{12AAB2T+6+¼94Z3$4Q&|ƠK}`I31$24Cy3TCi6t6\84tY;CJ9ٱ ;=TqC :lY]\A|  BM XOEPK4Ą iNTŌCh~^G~hK2I3hł"8[eV؇gFhdА1YI𸕺RFf\cKU؇XG}X oQ!⸃ 2WZTdDžT|؇ȇL}D~<3ĀL⌆PRއ؋qTv1q 6%B v()d_rK_T~0XmvuaTi(vk}H[ Ʋ}R-䤍ٰp';LISmHDαިg7Xn 0ʢh*RѶci5B$BQ5OA C+yk[N$I&s6K!tPz@-q>dU3EưI3XWJWkZ\"$Ffˬ&Iyr6ZfʎKqVHl+=Vz{7<[qY.kVW<\#in<Ў.J.X\w&_[7'Pr|IpjoApmea {CkJuRޟ2ڀY!Βu>J 9)KH1TȫMPmA$hDBIJ &kN%\ڏv'I?`@Q7; sGjkwN:awmom_R1hC^2$KMJI:6 IJtNon:4יqXCM *ְ* hjHɃ\OqBF*DEHVoYVmK ÙǛj RCnKRABHRM)P5:ZbFHTt] ZaomF JZH q*[8<}J!>&^%㸾nVˆBK )AJҾW0u[S׎t-d+$zّzsd!(JZ! :UY0' ̀yKNR(-"J9GD؎w;qҶZەsDR BI HSX*A]{r@n:;;6lDZ,Î -%Q4\SS:cY& "ax=Sau[rJj6$_Q^]^); KaAKS`FTt@H'Ve=+Q{KhJ0. Uȶůkޫxco Y.!u B HJA`%seR T-*I$X +jG#cl9XkLҐQ⾪ȳE{!m^K$&w#)R!I,6Df--b,ruIednM--1r7$MWkZm sH]TuƷ1dv߂ﭡiC'WGe|7Ln7LOBﭡiC'WGe|7Ln7LZz}m sH]:;+uƿ1dv׆TnsGm-=4Mi7\[Gm{2;km=g4MiwTnsGm7TnsGmewb=ĉZlMILjKS gKM&#F͵3[}^n&= Jeڗ&Jc(HV7"l'OL DU#qx0a84f)Ш)vlqZN?TT!):7%;4oF-nOnKeIQVW/s+;ҲmsR5YKLz\WԈ'ZqhZPxh\Z\ segl1اK"cew>/!* ,xza{ ׼ru9ywHiD/o(bC<5q0Kᰫ{M-+hW]wv6fW*CĘ(P lxY$ﺼ5O % $ X V*HG"4LvXol})u-YJ"nk Wjw^aGӫ<41QJrCfCqr:i H75kk ZmLvQ! i('Y'+/~yre֔Oe@%: ez꒜C(̈BW۾Ii? @ֲY {M!eҔmu[^&(!Ef8$ﺼU3Sf65Sh4!)e"aQVN"k>sY)} Y6 vLfKOOeA RcY-9Ist8߽+]Qoo6+jJlhߗpIk7X5Q593.`aKhoZknRTN ekcP[*Gկ oecy'Ifrm85^ƾm$/KP:~z <ع4ut5!e {&pmV]yɟ~y9V ˋ%_{CFNWbC~4h-m%5| Σlg$FKã8Hr3Hqe-0TC6֠5:N`Ns}QWS-WpRxkqB܅!MةJHYcd=?伮O+x|$ϯ\Ҋcf-:g>. #ޯ8}vy{,_lo][c}+?rl1༾_-{] FUn8{q,~AE8}Yp`lu|#OFp/mA/<; 섍"*ɽS*7>Ʈ"9w&8{8XHNC J6p9H~qAW5(ڷw?*6?a\2C0hlW>~g/G/ZaJ^]\ozl~ ⽶y|O)h;]p'D:g47XqH:EB̮C~q_?QͿy}#~OyjyMsܫmzl? o.~mY7q[8u lfMEjIPxvD /UWѸN{Bn= wƾFzl?}BoZl/Y,#H[(_'6 )HqbM|);ζӇxm3.''=$A:N6 7U~!:/{9Mr|:n3xmWE{6v9|G; 4%w \o]"AF!ؓ%}qn?%œξp},%8H8w0k׼q<=ԫa}H༣bF<_%>!G7/ʾxi?vkMZN8HBv 꽸1>;!2b~r29#8f_%8y ߜ5`q>Zw7$w-zmq_Yh;V9g,-@6F& lEg2&y '1֦ۆ%F#W]JNB6iVL .}$РAn/30\' ЯS6Q:Rr{u*U1xtٷNjZV]#э&ȟs݊tu)Z)+'H^%W6Cזs/u) ĉ09ְ BCv#\=#H h 7F}~dBJPtTBBo{a&ڻ8>*?~ngY9vmlQ|:o:0ҝ=7ͯj׀5_YWVhtmxN scYro׻NJGߛ+kpko*~nNJGߛ̛i}m- ġe&ĦH_\^ 1߲rٵ~q^o*~n`xVit0h˙~$dxj-qŐԻ mqVK[ynŪ%)h%T!GcYvo~޼ߛ&*BJBR>T\XkqXrW1MuuaBJtΰRF8ϊWߛ1<t8CexCiȐ@ڦ)D-wmFޥ☲hX!ڊ hGGu7EŭQ;Lo[՚'&$hGDqq K[A*A;uMdo,JJ0 sr;ϊWߛ;70ey\>dMYjZP)KA$!JIf!ĝe!~;N8V=[NJsG'ߛ7fɟ5A8̓:A:Dm1M;^NJ^sXP#G jK"cl^it8{՚/ɿ7AcmsPlCQXcnJrhJt@f/-Ee{^jt|W'f D\&z+-:hKi*Q֫4ߗ~n|U'fұbW:61;7K7fQ4>im{H~Ղ&cpl#)B(q7JUEj3FulS+0 ۪G))VճNZS|ڌ#rˊ0#ƹJT)O񸯪Mﵓ; 3Z sFӲF_TWi[B%6=$/ܚ9VlB\e H\ WF}WHlz.sd~eJVvVhmemIe½iZy΢ϣZ9֞a<{-~; _s0oN.݇x ,4;x_QgѠ[fakY<]`9;+ov/{}EFi 굓}ve4쵓͹]º.a+:>{΢ϣABZC);-d .a+:>7^Yh9٘?OavP9Ak'л+v3{EF,vYV\{?N!z5w^Yiw΢ϣAΊ9;^iY: e?avP/0Uw^Yiw΢ϣAδY$Ff`dZv]{EFW8,4H[f`r~z5fjpqLvaCdn6ķ$qk|0<aGɸYk{1|!)JR`%! % $jjy)4{>Ҥ^ _s9ۊv2^PfNA} 'UWCWA؃a~ GX-)ɟh>Cx@%zÅ ]d c F(e.2 6U̍UkSѮBOO~>8c:pk`رCNK-7JH$\I"R}1 aO) QiPX U%nĝ@%`'MĢă*[ sD̯-RRDx̄̕#-Zzhq/-cA$Ein1򘘦# x6\[Ѓs}]AVE섲eTJR u!r\Vػ;nJ\"\N=Ou'RL"nLK&CR#(Cr9uΈ:]E꽏"1Vѱb \qռ kG1x$8&6 ۡ^|BIA*7Fui+6gNb"O:Ve\pcH*\UDZmu::석q܅`H7]t[{80kaዙ&3:!eI+RMs]*ˍ6 (-Uuo))J)J)J)J)J)JVȤ4.mFĪ#T=ƾ ԪQh_ wf 1; 33b1ǍV\^V z2æ|!N=%b]53UVp>g*,qcy:-Zkɒ.d!d|=Z7y&b^i;pB%!m,7}-e7kI-9>RJgm աUb,-cIiaMڀ a{U|lJ[GPkI[A\@(:^;2͉q,@6Mx'?d&c!eyxq7W4{Dyp&K-EB{Z@7N*M]rrff$VTڠJ OtuP$ I o :9O4ߏ1qujM<ѯ0G꾳v0\tae6Ӆ24.ZگZ&]eHJ0 $,A;+4vZ@|f'*fGu^~3G UTZ3xģ)Q#-a+ aHy- "0#a:J\ۮ4ӏvRv"EE`ͯZ7;ܦh *|*)OsU/J0˒Z :PDV4 "KW`En8lˉC*XnRuWy*I'k<:0f4aIvtfԲ\ ;k("!u邢U@ĭ.8A+.)d/V5FbIR"*0Ym6V[6*}@dW:rԃ."*JkWe`lY+| lYu&*kWe=[b|j젬 r'7^2%2~ԑVVX)kWe>Yʹ'GE$z@?R܉?MVcAWd=WH~~ԛ?}O]o񫲂-Ȟe>~ԛ7}O]o񫲂-~eEwcܨNPtV^}BkWeG\M$ƾ^(+b5?eŹx*kWe=[b|j젫2 M$vWR܉?MUվ'ƮzAY?qRoL#aN5pM5wcVVVX*<׹N8A_0~.dA=Iʳz繉񫲞~5PS'<_p5 uQXKe@-$n=u?dV57@g;]9kQ{3~ƪwCE'gvݮ{Usݑ>s?uж 埀 []J״7t5sq_Tln z5RJRJRJRJRJRJRJRJRJRxRD*RxRD*R9>/_wa2&gCYj{g߭Maof\Jcih&^nmgUn*ڷb0dn5瑺Tpf;3<~`>yM7<Ҧ,s~Sx 瑺T|a*j<~8Xޠ>yM7"#Tsx- 0"ˌi#G FSU3BeʊPTso<~|a*i0n5\c?z,s~PX<ҦFSU9?C<~ hC]nߩ[FSUs: eD)Ez;Z<~|a*i0n5\c?z,s~PX<ҦFSU9?C<~|a*j4." Q=ixXެk[[Q q-b0n5瑺TsxpAc|7Jo>yMW8Xާ =#t،jBe'MSixXެou<ނP@PY#q̍Ҧ FSU9?C<?z6lS>Ӛ:΂vJ_gEdű)wX'y+ k )M+ &ȟs9ۊv[}r[UvDWB؃c~+\)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPVȞc_OU]OVȾc_t6ٟ-6a˿WL* 6+AͶKV 'uSd$F %NT.օ6Ǭ8NZ;v%;kj`;}Z7Y'^{Sϡ􃶰a?i?o'V}O>ojy>v`?i?o'V}G=ojO~xh~e-Oڞ}Cm C)h~eg} Cm C)h~eg} Cm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~k>Cm7=A}6:ͯFKK(Hm,@ j{ڋ' lF3˙+(jl9)Xv(]5]t>g渍q,=2&:!x{bTH|w6a8  役[.EZ@Ut*U3Q9NxRsJ'{rn:?֔zn0o:ĵA-^}}m64H͸럿3Xaȏ-85J%J 46eM@X$<-˻1NMQոTV &k_,/P\Ds$%%"'ˍ7EA-hi㺷--($%D\x2n8ք~n1Ձcs8Z3C#([m&@7J79LLbb0{r4^ _JS)9Sq ڋ08W"qPW񰢑$XOk8^)H>Y_Up+Jև#FSlHmgAZ#D媖qpdD1c2ِ^օ)R` -&7?Bm˻qFKGTuM[H+/(L8C00.K!RRlW}e"£CVQ8hgSn7!n XѺIPWr;YSeObχ\i-)SqDdqwOqtuO5 /X(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k+MXrTDE`/*iVfB]F5[AA>>h}R 0X})D'rHJKCQٛ%a6M)bHX&$.mL "rAb!6{ bUWȼ/ y )ՇgWk聥b I9k ӽJǰW1LfLqǶ omsW|-Z+)KMbel]mIJX#EN"5ꬁ[vm>N?%k1fr&'A)P4lFTU ˝9sP9ם/ڀJ4Pޫ:gba/-הJl.65GD^m0x/.b8B[KI;SAI\- R)wA:il$ &#~NЕAOvJע.5jqTY )M^=zkLdy}i}h )r9GRK.6ۙ>WZ_m72|$ړm.%2|$ndI]i}#kpWkݩ6O֗M̟ +/Nx5|Tڜj#ndI]i}jNWM6O֗M̟ +/Nx5|Tڜj#ndI]i}jNWM:#!J*׷+fmsp qhFN.HNukB⫎XUU$Dy.h4X̧`Ob/ԝ G*+)U{ĝ \H)&HKbs0̋.%? .!.at mm~q[Pa"ax&% }i R)lX6IB{Qkv+q)f8S 02Ե*CiEDqZl)6#ƿ1Reh"dx8Ҵ5؃ q㏡ฮEyn]Rrqq3:Bq-lrU5}kYPT(2!! %>FˍbPfJMJֽͭ{ԍ12+ܭCqtJF;*uzñm+J2 R"Uw UV(ÊH*PIJH 'Pj?aGبIؐר\ e9f3y- f<ԚiO0ףAp67*߹ZרP*67:ԚiGףA|0_tx^Oe7GuV ԚiGףA|0_tx^Oe7GuV ԚiGףA b8-0!MIHVȁ-0}v:NޠZӌ®?5 eL2m(HPPE+RqidYBF/ rG`a, !D-)@9j^8ҥOSa.!1RVQRMGFΡE/(+jH)lM!12Zqukܒ/krV83؟,%%)l-L%Ed7ӱ>kױ&qXq cI6)/\@sXų#6+snj$񤱶(o܋j6enP)V. ʀ@. %~AHZtゝ"-pNUƻ֎&#χ01%!`,%!2{KqTv=e|C q{V$n<]iPH4ur[U`&ӿqœtGN4{ k9k NJͲ֞r=R.8ƫց;bB:㾨Dz$REJb催ʝ?B])#m֔ XV(6lm6!n 0bhOuXZQL%0@B!Z@Ui[[uӞu:iy$!2RV(Hs kؚ0$YiNHKkPVі"w9k\錕(%$H7$ZuspcR]>`ҋZDkLc$B-]yKl5,%h,28*,Mۏ2;Ɛ@xCkH&M7&_Pưm$`8JYkD<˪`i n.u[V[Wr18d}xq?f=ml}ӿ8kg.+ F@⒣(ZHֽ4FFr&"҂tԗ դy('˙^,Ydbb^YD[!MĞQ }#+mMmO qةiu\\Ba;X' qĕHEqkamZ 븬60"K$b} -.%MSm$Rc E@v+uaZ i ؃jz7Sg>xxܐ2 6J I _E\W gh?$~e7?$~eo7<9'3=M[O3gixyyGlSyGlVzo^/ys?;Ah=h=޼_<~v׋gh?$~e7?$~eo7<9'3-?3QqXNqВj y-VsLx#p_pER[)eC0zj1d Hq4 X%|gyE.%$2%1ji\{(%Flm[D4g@Sul;k cXpLPL51q'Z)č}ZNaD JK(*]HOBDGE!Dhm憰u5qavRVbMy [fjl0\qWzP~[Ҹ@Ĥ61$r NsUV68MIkaqȪ^<J eA sIZW{PxcX8k xi7Jō|I<|GIe4quti1R.(c -ƨ*.F8 BɮσoڙMZK_Aif޴ݸSjg7ch1L&Mך+&ǴGe6ZEd44< ^`ǁkDDcX-yK0VMMAic m,xY,y5,yE=ט)Zd4<ǁkX-yhXj {C^`8!!)9RF>&]&rBC5 d\ĿXb%|g; %ľS}~ȩu&"ԅ)J)J)J)J)J)J)J)J)J)J)J)J)J)J fc- Ra ]n{jX#RB:TZϹ}6~i?'qQF${ D\C^!;0`P"!2:[**TEz5xDɀČ=^{i+Z]]fF;9F__j#-YuXy,KquZIPC8` P:*qXɰs%cټ({"b2!Gh Fwwū(c\|{wNJJnNXT ?Ukk rPjԕ(f똗KLZC5 d\ĿXbU?0.`?dT)@)@)@)@)@)@)@)@)@)@)@)@)@)A~ŹL><cګc- Ra jRhG_h8{Df7ÏQ[8 >n l~كP dSb{e9o- -„$I:7풱1iqJ,%b]@Yc_-ϗTd ij .ZAieE!*cr33M9y%Ĕ QşƲ BSOA)$_Rn5qM򚍹r?#Ϡo)~c:9#Et}@,IADWl_`h+[ 9^Z_*i Z֔\U0*Daƚm KZTŔ 4UD$Hыb5/"sk#f B(I#v@udш%/8\RDx8N{c2^t6Z-mcYK;OP&ě3#o+I:@6⠫cYB3&,N*b:F!ǶЅY+EΑBb/ZL?&!QpO,G*mNjiKRⅇ}6'@Ź?_J$⹒.24t>1t4K Hڴ{]I?kCF$A-=mU$+@ѿ&R%$io)ۗ}7/< 6@j>~O^+V# +cmxYYA%[ZonP #/UyM-5r?#Ϧ~GA&STE a̮._;eMkns+J 3PAK%|-MGNWeb_,K1jwؘ_G슗Q0ba~*]HRRRRRRRRRRRRRRf?b& mU10oj5)J#f7ÏQ[L< Eb-jkbV l\_pǏ5 $d!1qܐ@Y[Hp ^tԸ|6\(rd9$/rluEWo%{q(*kwr{F+=s! NZJ.TI6$3[Q=*RPF7d/ũ ϔ3PvAK%|-U[ R&L/#EK R R R R R R R R R R R R R R[?mf?b& mPF)VyyJ+a-&)/nq:[Z Yr/mCW(_b>;r|7z4r|0 Pgr|0uâGX)AuâGM'`}'xeH"AkcXiAu&]7\ :$z5\ :$z4r|0 Pgr|0uâGX)AuâGM'`}'7\ :$z5\ :$z4r{`m&YDFO=J O=n>R=J ۮOߣP =*RpOzw69173BLC5 d\ĿXb%|g; %ľS}~ȩu&"ԅ)J)J)J)J)J)J)J)J)J)J)J)J)J)J fc- Ra ]n{jX#RB~:7v3UoziGR_f|8{4@?/,OadQ@GR_f|$lm/z%U[f4(6PHi@#'5vW  u@6jTž+K@kl؛S̱ӌ/ ;Pu--i @RNlOJ7?{Wer#e7)n)IZ/{xuQKX>u8K'Ϊ=zX^8K'Χ `xDG/K `xD,:ax,:%U,/%S<"|ޗ㄰<"|pOT{pONz^X>uQKX>u8K'Ϊ=zX^8K'Χ `xDG8aműR@UJV9&}uxd_>hzRvEgkŢJ+&{A(ы^(IM mujiV Kj)So-ԛerZ)X"[Hp_ujqtrN.IJ_8s{| J+ˣL]J`kAr+j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vַ45$eLTMԮn+O{ +Yp6m` WH {aGVE$a11Zim 1۲jΛ=]FRV>N:@AUO3~]ߣ^ r~힮ߣAgl 寢׷⪰'힮ߣAlgߣAg! XW $؍WuV8V}8h#ٝx!. L*ixswL)#YSkk%iq4,bH.<+iI,kN yspL5/,ȺM?8|Xttx9 +! H$$EIeIF =2c:E YċCoYFLUr(5_'ٝajqd5+r jT'yC캩"~177+淒^^e)(I Vn`)fC'/QR*RrH\Z9z9^nqʜZKk{k8iӗoRHWq}$YGjCN33smV֌(RJNAP:qݩ7bO2z9KUb)!8TrrH @8kcf4PBq%IPH#kr%$w8!޿R{Ӧ2\ܒ]r]鷵QӽW5+r]5GNMjNdJ7k'We6:w:msTtzt7k'We7k'We6:w:msTtzt{sY=)sY=+ͽjN{\;ޝ0 +M+MjN{\;ޝ1asY=++^msTtzt^9\ODqz%vSok{Ӧ5GNLCqz%vSqz%vSok{Ӧ5GNLGW5+W5+鷵Qӽr]r]鷵QӽW5+r]5GNMjNܒ]%m!.պR}uojԨKm[q1XRJuV 8+b0ڕ<_vŏdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Pilot.jpg0000644000175000017500000006563111520622074022523 0ustar directhexdirecthexJFIF,,C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" g   !1"AQTUa25RSVqt#67r$%34BsubCDFcdfEv&e,1R!Q"AaBq2 ?xBZj38O's=pZ7tv[,To1i_߂KƬtXJ m|QgsV`nG ٹY^"...5dv堜\bhYĹl073/{PTBʶP>F:PML$2seZ"K)m%xʣHjK;55S:ns'  9==+ɈzS e=KCy +OF'ۂݻ;C[A[UUKQN+GO[%;LQ ok8'iM~ s杙Zޖweblu*q3LFjj+:3\7O[2zh jj)tک&G1 K- '1[t4T7j %i8Ÿ2JYr7+SVԽ-lcIw(}nd_lxH9QgϷyvX$}*3/Ysŷk#Frްyzˏnm` {zɏn`,j AвXL{wmdj'd _8lum!9d? (%WTO8- :jf` -QMUDtZ $2( d|@":}w/;\{O7ڷ҃,[<?ҷҳ1[AY+Mk}(&J^^m|ov%6FF nھ jw7vP}A޾ :Bа:gh_Hg{>Y@DDD@EAXVP)h}Vcbj^{SѲ6@99H͠${`͖I3Dیl㾮j1[i&8seɟd]maRGyLĮ&#* Ƙl6{M^nwxmƞ)%tmqfә'-idt{.\E=44XތQY spӿ?:Ѭ홭 w K9"(S|52ox|68]7|59>(Ps-iy>(S|51O&N NO ?0hy>pM.>GC~a9鼟C~a>Gm7>p<8];|59>(PsdwN NO ?0iA{7WԊțK;tۨ\Pт[ŠYDژq3ԁu\L8P*` dڑ07eČ^TҲ})sѹ'9ߕj(iE $G32nO?%WRWJrԦhAyw 1?8V4dKbL 5A7ߌ{s '':I^[ᆲвs< G$g;>UT8kd|d$g#8 j4v׆ TQi<$kH$-]MWyP~'HLu/nynNq+{Ug=%Y,X*NY#F^ Vh⠲K i#0v>(Ik{g 1KtAD <4ݦ`lN:\3åV斲[Z+SRӚ#"h l2B?Îަ @I{A nHy.[)A SKmkpݝHO=m-C ڪm lF1[a$ ALKJauhd *$`uN263u5%T:Td>S۶q2qymL!o  j!۳F0v}m%U9ʸmb2Ӽ4R5}M3*YFɪj0mtg/}nK ǽMթ~dt*_8/7V ަԿ~ *u ަ~^^Tq>7Wަ~BsSuz_Nq޽^K/黾|/,&|;ϸRs&|}TciioU$U?=x,8aݸ!E&|uMR?4zkL@9kc㣘JV\"1#CNˀ#$c$}v>Uj->niL>&JRl2p#G 5b[/M t|'wx#2N5hCdiqnY)#!AEˍ4AN|q%bXYve qsH$Ej2@BvA{x]y=cqRqzN,d6kln$s i-$cYAO2cG{vóӇn>E᧗ۧ;Mѣڸi"f ^Zp{{R6Xb`Q49/OH-zw++-3v?&ËyvˇH8;8W?_qhlCs{!p)۽vVҷüCnNi=߸3yr;ZWrۦ?rd9|wɶS+{wx}q_Ni=S+{wx}q_Ni=Vry|wt-CS&@b^F9S+NLhpf1\k^wdjY%~)Mj8{_ߠeyp,uڿNnW=r^\ =vӁg\Wq7]Y&~)Mj8{_ߠGpz: )+]AJ[4)e9IF8ʰp1o֕MuĶn}֩ubNsrډ7 ;Q}ڝ]auDe勇PI#3U3ojZ﫭zx+hvgV GU?ddjcqWtpI;sBDΨݽn!ZgzWP("){w4y<tp G۩n7*lKKdsLesj-+m4T۔t6ZTp xq$O1}uVŕݫbm;^bI#q8ikYڸp8l|GQ36a$LXDq8vxqҳ-Orc38> ϳ9u9(wj*iZSŏom,$CH/b.n\g'Pd'lbGd @T9T w88I,AnVbqkݡ:FMGE_N(w Aćߟ'5⏏K;nDpqFݙ״zF6z}GRm\dufTҴmlXFI9O}+#q{~q^iA=dO[:SvKYAQb:YX塭Mf>k'~pCUy潤cL?2yj̾OD(Wkڽn/׵{f_YDO^j̾s^3u}d]TWkڽn/׵{f_Y35^7YNkڽn/35^7YNkڽn/c?s^3u}d潫f2(?^3u}d潫f2(?s^3u}d潫f2(?s^3u}d潫f2(?s^3u}d潫f2(r;{We9iԾ 7H>DgQtHZ!Y9.];nxIf?e>Gd: Ov}A1E>4_-SVlO[Rh{dU: T7;4‹!Xn{/ןA4HGʒ+ݳXkjWNO5ܸ;{0Cwv#Z,պP Ue˿\oZތg?c~11F٠LڊQQ+-p?ڥ&HtluLCG| 3L:Ouui/>{x>t"=hM1Nz,Vr/瞌滼4y5Wh"GN; 7 mβ K63yʮV+JʚJ1!w"nHhܒ@ MJcE| ~1DȈ0׳gb@17oWWZmEunG77m흿ZH B2ISӉ]pCN˲D$ jA|SՕSkE->4F]vpN2Slǵ)3'NK6xNeZtZ^O l-c CL6qt;~u%HpO <klbd \'.cZKƍpR:]8٦L,xyf3vti'A lɜ9 9ߛP`V#ohZmiʭca<$%35 FێgUJ *Pm'orFYNFYAyRi<})ʔ>I\>(Vz>(Vzu^TOI\>(Vz>(Vzu^TOI\>(Vz>(Vzu^TOI\>(Vz>)VzXu%%IiC,dp:rAo@ e.d[EkXy #ڻpYZ: *ZWt0MG -}\3N\G )hkCRpNZGQTݪjZ頨ksU0J Ld=㿵+W0uzp$õk/v羢)]MS$ glpx8;9y[WCSMEuI= r\cUreۀ sgr( (TE(icHp{ ߜw:;t -Kͅc7|K6j./f셬!TQݩk"t0ҊSL=NLa-atqH{c!{;(k wo69]RM cͶ15Bcs_I{yGJj]AWvѺ##;m/nu V椿V{x$4s[ff*0Q-s@e|P=̭<:bb3wp4ܪjZ7Q-\Jq칭sIU4utKPlo%8s%~N2g8 nɮ,$PTHLjnf Z 6wweEs++RECiԆzۻ yJI ß\0 b&Mеe=U%&kƌTE!F0län޻NZ YA5MOq ] |TlyXLaأ 8ҶƮԳ2+uz]H's[ 5\te2woWiD sI(,R}uSTIMn0 9﮳~qW.;&C߱%AeU<|qq'xa:g9ogxG/c:**^XWWI{vC\7tʼgj-s2'=D9{Y.jѓwB&h#j4|awL|3mgs]#KAǻ^OTGLZ՚]fG$<*ƴWn^ulOt{,J!./;U.V"ođ:JiZO H#8p@76MI_WS1Muφ6=9{Gn=o Ղumtd`5 YȿxŽ7dkTnpK!-Y0^#n_mm,T.lZ"Δ.247OA'֠žv<+#|{ő989]Xp;@c'kKriʇo)f$G}?jYAoP}⑭|^kSײQY2qkӲqѕ9[xYR"YR"'֠AoP}gKrgK ? ZOA/)/(*-jNi?+(VxTH(VxTHsI >9[xYR"YR"'֠AoP}gKrgK ? ZOA/)/(*-jNi?+(VxTH(VxTHsI >9gp}gKn?MAdP(YhCmT m 8jaecc{$@v-q>U5 mbNOYGvݩVnt_ilfTэ2vI~:NJ6{ ~Oi_qtz vJOv6DWPZT]#i\YNet0vjiYPamynt'rԺv[PԽ1KUΧdkr6K$`&t暥A%DXvvrc>\d^k苞YCRQE sbl^N^֋4zP^&7dQFӖ2&I{Jk2ii粲i*ZcssmY̍t=[%3NJ^2G85űpvk[ڥ7fN9i0lm8UJ~Ņ8穻QI`0:T3jwL;3kqg#ųSUMr:i`}gC; cI.ufvw"GͳqXExc[yq85]Qsl\[W1?or }_Q;7A;\UvQkZܯ@4`~XvM-Kϱus?ؼrNVt=n!$qtT=OctgF.ml71 "" _~:'a/??n^B!A[~?8"~ObڟSysvARPܩv ߽m p tlp-#B]kYrfke9$Ľh$컣=/賄AK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrWǍrԮ~qW.Gy:0wyeiA$AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ|8n3E >|wYE;|>| >|nBmyB= hwΛ@PB]dUr#kowuT5SEt[Q+*_28k)ߴ@= mʑIt-5Ӊ.344ݰ1\EYIy*jg gd9Ygpgp(/gNjK{OۧWD@DDD@DDD@DDD@DDD@DDD@DDD@CЈzV6?D[=DTSRiIURsv6^v@#~7ޣ\tU\glwZ|meDR_S9ᡓ'#uU] _SmyZ济~OM.v{۽sq7|*1I-Fu$(ؓe;u>v.VhA$7U2FFG&O8Y9Zdq dFoPQ ~6j.l G&O8Y9Zdw ĿV$yZd&O8YC2U)6jj Jcg'9ߴ*ԝB+WxLqrw(%U }d4X8V$yZd&O8YGq-sR}2ɠ#sNiPHrw'+WxLq;uVwVkC:RF)kEl%6\仆d j ?NVE-Hw-iϽi\d9 lmn wmm1ZLgQ X n4s YE%b ;76W`t68+%oN7;Nm͌q<;ϓ9M|pw|]@T>rN )'Nm˜qNg"y~?w TU6s Pp){ /TL҅3P{_AFwGM.C~ I(xD9z~Է;UMQSUq{p A.`%nYwc"-8w3^\_m) !8vA Ko-[=nO ѰE-uU.1M dk[8nˉ[f۩fN*eA x 26qNoկmUe\Օfi!~YEm!wSDDAK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrZ}=gfWMGͳr+5`MW&i<G@8 4Mk卲#$2@T6[mҜW+$ A Zۜ?tAqT] i$߽-8'h=z]Y0nt|Q`ª:m2H A^&TW,4hKa)i&T$3[3FC6Zop-?S;hJ VF`SIqu=cTFHC$ 2 KsܡGNrwsV%cD {-=ޟJ bVܖMp6j{Rc?cdoy'<R ] *s55TEnQeKmvA [ֽhg|B%t";YҴZC7$W תh懪ZħZ6+gn7WQJٛi7l0ɡit"U O5G2e8<UNy.i}?ܡtϱ_:ec]P􃾖 ZSS6Skz6*.Q;@Xc-cKݳ3{vW;o 6{hX 8nչlY eӹsx\uKGx7R!ETf5Q69[#8v Fw)pS gK}3vZї3t zptzkKH{⇿%Js6*cltcfd9-vwGt-;9 /T>y:q[F>n2[**)Tf)|NقӇ;et tZNRPR8C΄7' BӾI ~Zw)>дR}iC-_O(~?t-;ᔟZP j*|2JO Ne'֔?|ڊi ҇BӾI G?P?R҇u-DV#TJGYO0r alQ; ~Oi_qtzB ֣\Nk(GFSZóB^\6XQ/OGPS^U(*]I j!P[y>I &9appsm_0#Yjmp*6 k9-.B"ihm61 vz[a0UݞOj{5t6CP$TUQUDCFĕGaN1ӳ쫸To冏R2=sI-n,woӲWvQ'6WgbmtА9*fzy B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~*)2λүiUWg9 B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~*)2λүiUWg9 B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~**k I&l'2<Ҏ Biϊ(X&!5̝w6{ ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DD=oQslTM=Qӟ%{~?8O~Ttoj_DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD{$>K|.C'_ޗA46{ ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DD=oQslTM=Qӟ%ygfG*gd:罍?P H?Aq(?Aq(7Aqo(7Aqo(7A=.yӵS ZkqtGj=ͳ_y&>Ⱥ[cu8$׈/88Mgŝٟ38uohw:X{Dq(t֏KKujF 6G $%ҳǶ{] {;<'Sg[CYd elrK^XL#jVm lI= Dt.9=ށ닍'E`\"iLS [Nta󿡦bt?K]'&Ҝ>>>´45444ߣ\8iB7dۓxj;c ;U]d4C-M=;%/kq @NA/33.ݓ@uNoh}|Wv U%|Ts[#⦷R55-$DEݙ@r6y[5e5HB P*Z2#l ;%=m߫LLI5?UswDҳJm2agu#+t_>nh}|Wl~d7SndsD%=ssE{~77_y}@uڜ>z_w0q2y~; nh~=6OhWl~d7O/ͽމjma'~މ̜>z_peDw'MuߵcZ{_h_4v*emWlhnc}=Ap !m -z)jk'슣+Z9hϳ8#vWȻvGuX\)SJv.՘Ҍh`|C XK=0A;bJv0Y4b*i=Hyvǎ쓰=Ź>TZmP{1veh#e},v m%th$/y}U9kq8ĎAF.y&!4cXuzMG:8>"w;WקqZrK~mͫ:y1'2]372rpq!p-54hJIY ݝ76ݢw'q'^jnWǪj᭖y65.=OuXs&As3ouah&&|@#kchɍΌgg]Sh*"<3`?;eykzNB6jfR& )!kF8G翔$u]K;ςx k8mK]yf}b]ⅲTܴm;]7hesqsgTVjI#wakͦ-R=^*sJKL%iqys̭iglFFt;If5RQ1tOݫG{vss}i6cqY1g|= 9s@ޢ-_Em[m*)`twJjXIfH-N;N쮥j;Yc9b71v7U;7J{V>'mKf|mygmFs !JlfCޣ._ͧRIfQ[lrVOn:f(iy~FXYV􎌚w^뙻ѹ>˃-`,9I7VyPTpvNjDIh#o7{Lhŏ3l]tcQ "!{};M9}}E;fsѯ}Ln.{ wxwUi?yVSݮ mttE0o$Hhت]P*Hdg{/|tΌ.兽#zsRX;\.5tvi)eGc<;Z  2p$dtGbS[`8 %m7pNi 5W#HvR8:,@8?lѺ.i. uvSHO% {㉥-Io\1˧cm)k ItrPl36ZgqQ˘GqDx g҇z繈BsH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇ztaM!Zjֹ]"-unsaH>˾>?xSɕ٢M/v&1 >|`s%=}ӫڢvDDD@DDD@DDD@DDD@DDD@DDD@DD(kQ_r畼_kw'tsK]R pcvH]QskTfS1⪮=Lq3&GĂO{MQE ︲IS%]`l-sA{0{{lp.-cg!vdǼ9\ڈp;vOH?W"Q>|( Hq~ ݳdw馹u=n#F`iypl3{\p˽wQi7kS;??PQ.P_j晑S Wg&96dsȧ([đ\iih7'i akz@-9ˎQ[{Ia࠭뎡xBحx' !CsiV֪C X*j&:Zݨ' 8{kSn8ڻZpɿt ٻځg XZmM:niGִ}t;o]~]L Zm񭫯)[|mjzꍤZm=t;o]~]-^RӔ5u}tHyNkO_NRm"+o]~]9JkW_AW6u=t+v[V Zm=[Q롹GM_i)[|mi]9JkW_AW6u=t+o]~]ֹW_Yݹc6akf4W?w@kA8AK{OۧWD%=}ӫ" """ """ """ """ """ """ "" ΣW.qm  al\@?#ڭiծ2&{8]-ZQE^XY[iݴͺp{鋛֙m˼g~z\h`Ӵ9@آk$ly'~ۛL 6Hݞ9/fh)hP54koGH!b>-h#j؛hG8y.Mlw^ {Y܇QE@@ŦϏ}U#A?z;PӦdO.XH+_үq].h)CpLQo+}WSiYp`{fk=;x X6 ;d 0ˉVbSɤ*[*#Ό7#AչfjmKQp@ YÝNޞMtU8mW&~58-tΰ@GZ}**g)Px|iZlh40e>w7 WV?/l&g7p1 9)<}.GAM%nIؚkd51gFesHA.+ʇTY3+ttTK-[id7vǣTv̜ݱmd 8wgvNte65*v3 *OnCj-5=:V2Yitl`x7-w# F(Zzqe4Nch!]$myep~¡줃Dٶfl,cr0`{-kWMnQ>8{)$s6CNv1; >#\J6Sx|Rv~F5n״A~5WV?/vSO܇w4TGAО/ -6GӰ;p(tկ^^mn$0>34i*1UU+kcb)"FHaK!ԶstsiHdm531B*IJ1[ 1Ko9˳_*:e4gq[@ ͦ0 a"xiCoGq<'7)~ev@&9m=hC!{87ǧzbw),Wxm6 ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DDD=+:ۋ_r(h:zjj&ʱԗpl>l+V6?OЀUG$Bbٹ#$c0KRUՔ 68iM{ikKAHUvC%u{ELXe2`!-;]uwSEqt1X׈쟇d3T)+16#ҐbqkqwN:*VtagY]zRNdh!쌜t]{3u5msSH^ $c;71pNB[u[)y0vߝO8&{>Y}AamͿIZ4!5oUIC:́ ;8_N ϢkQ\%TS寒*&48rs4i-mc|UYY s㬜S0LAqvZѿg~d}6 ]gF4I6iW<YL;W'kE=TA;#`RBj6As[@qjO.AS[m pкfpLgJL`{g2ޗ㻞$q^![o{&PRSE 8G v+Y"K1j4xMm-=HtD0{Z;lw-ko[o5msBd|B+6Z]s3^4zQ )aF"<2vA! ZaN"4zG4?)P]5uT@+=VW S# s@x8' k+Ү)gZx@  kvF@/Tow#TrLpLxat8^ nqi4.Q]Q&)GE`dv6N}[s]4|F_Ͼ:|sr(X[3 u eHE<z+l4RI.{"k n8qvX:Nm_uҶ;ezJz)b8?fF[;[>\/qWTUU8Tѥ>yctҹ0z7g>:Yl!}pQ>^yt43a vۻʷ4\ /O;;C8n/q?{g :02֖qF?|W=jmݷM{{Gl!8(D-x}m?6ȩ/v%cLR9h)uwc9]TZS: Lmn'8V!ɰÃILgƊwORoMKas $9W`mp5a?ꦪ>Ō{C^ߝ}pmg 3B"4C;Om79Yp$JΏ蜿WpQ>TlfkZ$ӆ2pt'jc+Mg-D_)ѵK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrcZ][Buщi %~~?8S@?\A}J -' f٫ﵵp7 )6CCCZ" hhߌz=Oâ f,Z0T,kKir3ɢcI-hv/U#a#GWӔGWԺ)U#"I5֦ApO5$'Dj" x9݂{ܘE j+jxҲ1d2`a众wQSE^%16"-a8E {N{>}uJ~7W`Uqʝ$DBryxϹ (vC cc6Nl9PhTUVQi)a|3D$ð+ +Tw+4ck#X`dJq#v\88KOŅ-+5UKҾ)Z](/ ӎ$d ^:,u~~]gGWԺ }}s:Y*!hAn\⣥:xaZpr *}t*}u.nW nUx}u-W%C}ߔ+` *}t*}u. QYYQ X= F0wtum-=="5#i.~UDrrWӔGWԺ&G)WRXoU4l61(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\Ҝ>(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\Ҝ>(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\ҲQ`y![I&CS`=_N?XN.Ӟ7(~tyksOU_O_mUM?J֗M~CtHDp1 0zG" _~:'a/??n^B!AZ~?8,#S[i.uUqjzƉ_JǶ杜*~qW.sYn?sѵ#v5TnKe++'[fcDl *)`h>#>53@K֧t7b\ͶL>_Nqh<'h>/ YԿ5g'A9Š.Z0va=Y>vj|wh>qh<(~lA[xVr}DZ0Š.uo'NlA[Lqh<'h>=տ\Q9uo'A1Š.Z0xVr}D=տ\Qh>qh<(~lA[xVr}DZ0Š.uo'NlA[Lqh<'h>=տ\Q9uo'A1Š.Z0xVr}D=տ\Qh>qh<(~lA[xVr}DZ0VRӚk#smMicfAnFCG{lA[b4k1U e7m0#8p4$mHyVBsڐ(5{$ Z2:v*s`twJ  yvs<졷?h:GG{+jq·j}Ab*֚'WJ1_#b{ZIsZ1T&=Ws.E^"q!q8V/7+/ݐ-՜X;y9p 9;Sii▵i]>17dw AnD}'/u{TN_~:""" """ """ """ """ """ ""CЂ~qW*3)':fB^ ר~qW*dUV羮7 L 8NOd ֶjXTmF&VG;hon? HL<#!V=-YT*o̚S#%w6zIf7xZf7c`, sZޜHX_ᯨVQ ✊$vNl, SWUOOMzx鶅di=pnz =mMU!SO3 ʍceqf٥ѥޖSWSHA$m``cZ p9q܂Ox5SOCv>,V"w*/F h3g?,Kl6+-M H6&7(vlros1lhĽ/5cA.~Won[ ^UfvK\_BAgUs;\+"" """ """ """ """ """ """ "" ֢pNTgRRFUKKS4<-R@؈-ԢS-(u(TDLw-lEE ȵI *`kZֱ5hhn" "" """ """ """ """ """ /U8ۂF罖" =*" db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Attr.jpg0000644000175000017500000005003511520622074022336 0ustar directhexdirecthexJFIFxxC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("a   !1TUV"AQR#Sas2367q$4BCduDbr%&5EFctã.R!1A"Qabq#B ?jq&!MJDbB#0^";~1ȲԢ+'AUj$N:ʐFr͗d88H%I)+pd6IGxGQI$Y/e^JTY&IDv~KCٜ >Lvpoy"Q]ZZBNޜ⭖fdC12,qg$7ܔ?q~V81Hm:Pu$dZ.8^1jBRH&uh!hQ§YTXS-{1 >LڗgqVҒIJJ鲏Ne\IW}(5$ ǰF1+%-ܪ/+:$W MF3D6^q"&kqOU=}EOj_x؏G*G<%]5ߍԾƊY\i%]C0# Zm$ԥ"/)h9KgĔ05nqLI-q'ʴز4責w Je7>LeqFLΘ-לJ6JJ%!FW=0A+=&| MZ}#j$xI5*qIʿ?s{+:u^f'*8.dԧuܐh TJ[56j##$NFڄʞ ȩL.BjFqMfI Ȋs1^X5(Z3j<  JN"b\QCqJwCdDd^QǚQTQ?O/iadu2ڜudWQ^S<5R%V|r\lSΆI\4D#%+Dd%kE[dk&#%VI&zKMqQR* K$:C+R r I=VQAIg"C^x/72W%Fw2txs%Jyno>ѓ$q#QDFzKE7NK21# %-K%(`%grofܼDTLjeӒiywnfz-s6#\%JӑOQ.""Y$Q(Y$$E3SǠE4wTndMgsQd*Ix6;Cu)$.RaKJδQdlLX4"5M}qZq>[&ɖfqHJ ȥ"rқҺ$F3S "JsSH%Тr[fPt""۔|>\ %._iQ܎kّAO&#CLRl=v,Q(9$Jc9L/c14O>QҖ[}8%r ,&H]v3q}..Ji3'QMipd9lD=FslSё䭨RfSEP%գTsz#+SN"3Fٓ%(2}7EEPrRd2ٗ YHiM*4iP gSh4(mƜA3'=Υ̦MF$XW0 [$ӢA#2FZEI,JRFeG$DJVےV᩸9e)dJiVb9'䢷U% Γ'e)wI)MOiƑRMMQI%9h4ܙ#4/(V2&:D)+mTӒLFҋd9YnHpмVJiGcdL+#7i.d^7_\P0$=3Ρ,JQ-hd,Hұ* DSpl4IdJ@.f|U8CIՇq&bѽX4h%ɩp19$df'g=)dlA/'OEX";αpͧ}w ĊC'dJ[LMNmfdde{[`A~$q?m6?N^Vz}Tʱf?*Kbb%+MK|fF>Տ}]$D(RT×%$>R=NlZh e INRTV27#}q؟dj&V%$"I V+/(+Sxz8-풴)(#i&YEcQhwͶT)-:- Za nV7)Hj3B!?QvPW/ʖˆLVo\|pwYɬv?rrVN&:E:Xrau٫IDi^)XwèuTg%-2S d]$+!Ĩ߄Ffiѓp'Ti7"哑b@#B 1{CĈUqGj!nI$+!iRfvV[ 5U-¤h /=RHԘ_J&dEr"/c BTd-N-RWN3=1(i+﹤Ez?hc.EQ]N{=9I[92ȐU̔#MԹ{?&L:sj:$%gd)5dn^Z.AVY0EsF =6U8STHu͂SY̔9{n.-D+VMxWF'\Q~mNy7qF'Q~mNy7qF'dYvhrKMJFD\  ^If&_uA-jQ8II >F4t4_Y2TJq&!fJI)@xRjICLT9Iݵ\ >4(i4R"̄?+9s8풳o,ԢIVJtxa|,4D>dfZ \At&MJZIHx6 +źCO8Bx>Y [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOj +źCO8Bx>ɸ]iTҫ!" 5ei%oKE#w;[Jml֒At %JTeG{awX+4* |؂܆l%j`{Ec=t UNQ?"lТTTJ}'GD!OvsJlޜՖG,K+䗌7Oni"I)2Y,c8YA6dv3Nι'$EԡTh}8E:\dnCkim|̔Ec"3.B1߉vX\2oDFnBTM+A咔 ^M>E+ o6 m52%4'QrӱQ!;϶u6Ҝ-hdĤ~egK@MͦNNL5d |M5iBzrh8 ĆЖۻ ЂIOy ѦFgq%z,4,Y؎bƲ;_$E8rNHM yȑ1rTḦbƤI+_H㧵RNMjGI!2Z$])e$Ho0ץΒhq2Mv$ŠҵJtV>3`NgdPj>^ZCYrA6z,p)I,FtIi9k5r"+r_)x1flfSYtf%[Yie{ ЩFk!o->SK5+GYbbqGK92q4[2tdG$XYAr ԚM5z\nSJR)m%+iTer`=kGf]Q٫FcFm 5) Y,RI-s,4dfFz NQ\j4(\:kqF0FFj}|#t>Gf]Q٫xZÒ(i0 ԳKXnQֵRRƗMUzJv5R-6* R2MJk]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf'R$qI\,$V3"|%x:F}Cf `i)+n+hQ*nHנ?Q .?/ѯN܇sE5B88EJJ'o%<rkJoͳ3Q8Nh2I?.Z &)XySiqZ3y,/dR42wz!1jJ#-nZB֜fvBNeri;CV [|8ͥKuռe+k^QK}QU,NL pИ7M%$Iu Sh=hģ™ER{pA6B{fD} 6͵ C,K[7%1XP)Bm)TZCPIIKUgw3+wܖ\iR :&`!Zd&fmH$gILȚӰTnDj!zzc-iBPS%(RIiVeX- rqH_g!~ (EØjCYB3C1to0)&v PДDZTqqXRFh"<"2"##- p/̥)DdC:3tJrjϸJQ和FV"ơ˕&>ye62?kKFIJQm6=ٖ~IT27p\ETh:H[Iei<+6yAG4F%D=7?d]޵,Kme_:D2' DY ̳M8&Y&RG´UTx\CiyR"M[dmY̌rK$I2l%jFbBb3 iSe ~Sls333333>Qg[Kqg[KJsTlvsTlv>3,~weo. }iRղ|eTlv>3-|~wZi&ɓM NArXwiRղ}]iRղ}ثUNBUIYԽmXLe (ːRʜ<-)(Zt3k\6K|+2P2`H#ɾk|w9KVaw9KVcUu|bKWL5qɬFJϓ96d$ebiGPa(٩>d68n:FM1%23 ]iRղ]iRղQJD GZ~aG]-[+݅-[+ݏ"P0ȣ.WsTlvsTlv>s =B "P}]iRղ]iRղ7( 3 =Bw9KVaw9KVc0ȣ.7( -[+݅-[+ݏ"P0ȣ.WsTlv_4j^|z:$2?W[ײmrޒO+iRղ]iRղ}ئWRi-$SMC~ɒo!VqI+̎Ex24i!uSJ$F3%]4j>.4j^Q3-|~w3,KMsJM6QǦ<YKISjMAJUc#2ɦw JS$Y״[ՀUKHxpUKHx`オ\Got|0W$EuʯMk;h8vش`Ҵ?! 6?/ѯN܇sE5BO#<#( _+YH_ UYo7O&ҕ=O9$+"5$դt%ndɥc 8$ޒolfnrv~!\ sK olvI]&HSNXØ0mM4F f)?ozkC?ƝNĚNbMVCWz ߬>Sy?өؓUiI d?c{? ߬>ozkC?ƝNĚNbMV[!3Ngv=ѱ%%KTQ7SgB~S&dHp6/efi%yޖ S2ZgNjY]ħ*nC魔8h#ӡJ"+WWu V -KzDztؼ<Ѕ16ˮ?\ZCDDVO"rlʰdN'vN[ӚNQ_#ϡ$Ydmt$ȼJ;XnݫĄ;)YҐY(5%$dQH[Zt*;Ӧk JiY.4RNz}$&gdBuVRaܙit'\A$eJJ^ v3=H:ޟ+MɺK"I$JLA33񙍰8SW ߬>𝍭RxөؓUgIzr3dLDs PQ_l#n-fI#2.[!) -dbſS`J]U-NRYY(ѧO; Qiu<_vfuu+-N2ŷTױ$S`? Lur Z -11U_O NEqDH3O&J3H^p(WYOX8IșIP)] &ـऒVI"REbal' yxE=mǫTq؞mÉ^o#_1S{*b{`^o#_&ymlzOOl=^&yml8E=?g=bl'yxE=mǫTq؞mÉ^o#_1S{*b{`^o# c' g.^{rJDMI%.Q3.NC1큌,ě́BR40a/)fD3;d p-8'Ɂn%\!ZMDNlcp֒#22Qi[2 pnJd$4a*.cJ1sy *CҌJ|K%b&]Ѫ^ zKtW}MDqFzs-ta蘿يRW ?XgC?ƝOĚNbMVm}v7=K!?,cz&tcM4(ХZH!UNbMVȝ[P1 3bƁ5.%SƵ% #2I_Gc%«F~jbSURn lDSebroˑ|Z2}^q.AjQ&C#3>S̢qL-w@)Y`,4t%ede/rk?rksiK*\<[%ȔGe*idz AHݏ1jgR7ckڙ9˹kS!~PyH_g!~ " DZ ''|fK_cnόTOqo9@-qo9@-qo9@2tqoqo9@21'0G9 s9:o8ao [0cžs r8 F{S?0.⑻c_]G4__."k/BFPW#?I G>2Q? fBop|e@̄c_ n3s r nC9xqr3a/H_’eqL{Ј˥j|0euɔ|s,uV=JI-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-Vm#v2ضj3s_дmZL23T]Kͩ.5փ%Q&\o,{hF(\E;r _' 1|F~4gcħ#/d_1Ÿe$F">K;@to.h]{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~ph@R=L9!I(o$yekA\myr(E? `ǹkS!~P?h?Hg T`aFLNxmG;d3nf'q9풌lȩ̋JL!Q)Qɕ#Q뒙BI$ A.^""!68ʅuo#qD)FJy(BQ߲|߲|%! QF)I%9G|K,Zt?~g+/d|do/0O׳5O׳5"8OՉem|*d_~f;O߳5*:*u&\v#9hCfI)+|U Xz̧'ARnXY^o<llP);!V$sp%&dQ\Ie{O0O׳5O׳5"SBȒ*3=1$:(ObQ̏Krr'@%=fk`sd3[#?-^5L:IѢ{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^S$eNkk]v+JuRrL+H⵼gb\Vz ?±FKImOU 4IM&"SQb4$ӕ4Ndt F9w(F$r\y*X~{KfR]FRKITI#a|ztg\g,ېhF(\E;r _$?#OPG'փ@<"Ô<}|cMZ |κ棶Bȉ&GRhoI\*XD\SQ:uIqP^q&jX8Q`bTI#h))̨Ifg㒐_mIKĨLߤA-߈YY-*6lmԲmY7 yVʱxg wAx)DIkH} |X5ĩ0g~d-/+"A1tR"e >}y-fړ08]K6fd_!7v ߜnPkg> |Zc'MH˄i/˯ctGqkn)+-c#wO!D)fgeΗ)( VɿQeO6q2Y+6ӇdD &WO #Fm}p]iDŽ&3f$҅+Ub22";1{Uߑ:|Z BXfQfEfBn;%nygfL:pu&qEr#.ji'3J#2#N3FgG*c~ ]8_^i\j/4ۨ G{Tں^q)}ġ+xN$e䑫;{u .*u[,q)Î%pܘFQ Zy95"$u|er1 e+QJy i% Rْ='GWOc#5 z+\&j14! Z#m3p"Wr(dl,L0Y43?KIi#Jݳ#-yW|l~ ^,e,Hv&|ӛ7 33J;\db[I2ʉMM?,S7wq{mi\l\&*Ӆ40D͉1Z:,xˈb;-rY(BI)+""/g Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@XGGqVO2굂E(1:!3'r nC9xqr3a/APɎGEjM:ksj-QQ%a_שaY}uO%yu&ʹ)Ld(d3;?amgTHXmF8iA.Jk<*+BK)V-ajc5jAq9Jt*SvIFYGcK']1UUOI|Ș*vN2̌8Mߑe EJͶ33;LWS5%PAH&BRdI#?WӧF8;@2d۳",wiMD3iY7F^!fU*=R$SN:$2 7Y< yz-b+gѝ57&ȨcKƝKwiI-JYRVN]dWVQ6+h2 Q,_dCͺҲI4)RRTJ!ۚ˥Ѧԟ9-)27o8+m$$ڬvDDVD/|,h؜I8mMi jRv[KN C]%$c#-G`u#'/A'C[ X(Z>q 4>=+u@ ZG0P:B֑Ɣ}_at;n(`kHc0P:B֑Ɠ_at;n(`kHa X(Z>ҏ |8-il8@ ZGQ}WA`u#x@ ZGO}WA`u#8@ ZGQ}WA`u#(`kHcJ>:~_P}-iliG}_aOӾ{V `u#( wc~0P:B֑ÌP}WA}?Nq[ X(Z>q 4>=+u@ ZG0P:B֑Ɣ}_at;n(`kHa X(Z>ҏ |8-il8@ ZGQ}WA`u#(`kHcJ>:~_P}-iliG}_aOӾ{V `u#( wc~0P:B֑ÌP}WA}?Nq[ X(Z>q 44y>|8-gltjP*^qS0f*tlEo=A.y 3F|)9?"23^SlYjnC9xqG4__."/APO#M*V7B*NBr*y+Qѯd%!cZF^RgMǭʼnRl^:S>WL5[X+,ޗNLP:)s3LD{_ՋZbH#S)7ekh?OkD~i>tD&BM%*|ԙ+WR跈Tfgi=mG31W #s> X4<74CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4dn[R VNP5*Ң4sg{,ʊF?1YbC1NJ "8]unC9xqG4__."/GAFPOM+)?/b)?/`)hd]#v̀ F?/ѯQܝTZ1nr3a cԒlN\V@Jn!ϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfQH݇F73s"ϫ ҂zUMġ:Iv=%D ADG'>db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Inheritance.html0000644000175000017500000006343011520622074023333 0ustar directhexdirecthex
 

7. Inheritance


So far we have always been working with the concrete (i.e. most specific type of an object. What about subclassing and interfaces?

To explore this, we will differentiate between different kinds of sensors.

using System;
namespace Db4odoc.Tutorial.F1.Chapter5
{   
    public class SensorReadout
    {
        DateTime _time;
        Car _car;
        string _description;
        
        public SensorReadout(DateTime time, Car car, string description)
        {
            _time = time;
            _car = car;
            _description = description;
        }
        
        public Car Car
        {
            get
            {
                return _car;
            }
        }
        
        public DateTime Time
        {
            get
            {
                return _time;
            }
        }
        
        public string Description
        {
            get
            {
                return _description;
            }
        }
        
        override public string ToString()
        {
            return string.Format("{0}:{1}:{2}", _car, _time, _description);
        }
    }
}


using System;
namespace Db4odoc.Tutorial.F1.Chapter5
{   
    public class TemperatureSensorReadout : SensorReadout
    {
        double _temperature;
        public TemperatureSensorReadout(DateTime time, Car car, string description, double temperature)
            : base(time, car, description)
        {
            _temperature = temperature;
        }
        
        public double Temperature
        {
            get
            {
                return _temperature;
            }
        }
        
        override public string ToString()
        {
            return string.Format("{0} temp: {1}", base.ToString(), _temperature);
        }
    }
}


using System;
namespace Db4odoc.Tutorial.F1.Chapter5
{
    public class PressureSensorReadout : SensorReadout
    {
        double _pressure;
        
        public PressureSensorReadout(DateTime time, Car car, string description, double pressure)
            : base(time, car, description)
        {
            _pressure = pressure;
        }
        
        public double Pressure
        {
            get
            {
                return _pressure;
            }
        }
        
        override public string ToString()
        {
            return string.Format("{0} pressure: {1}", base.ToString(), _pressure);
        }
    }
}


Our car's snapshot mechanism is changed accordingly.

using System;
using System.Collections;
namespace Db4odoc.Tutorial.F1.Chapter5
{   
    public class Car
    {
        string _model;
        Pilot _pilot;
        IList _history;
        
        public Car(string model)
        {
            _model = model;
            _pilot = null;
            _history = new ArrayList();
        }
        
        public Pilot Pilot
        {
            get
            {
                return _pilot;
            }
            
            set
            {
                _pilot = value;
            }
        }
        
        public string Model
        {
            get
            {
                return _model;
            }
        }
        
        public SensorReadout[] GetHistory()
        {
            SensorReadout[] history = new SensorReadout[_history.Count];
            _history.CopyTo(history, 0);
            return history;
        }
        
        public void Snapshot()
        {
            _history.Add(new TemperatureSensorReadout(DateTime.Now, this, "oil", PollOilTemperature()));
            _history.Add(new TemperatureSensorReadout(DateTime.Now, this, "water", PollWaterTemperature()));
            _history.Add(new PressureSensorReadout(DateTime.Now, this, "oil", PollOilPressure()));
        }
        
        protected double PollOilTemperature()
        {
            return 0.1*_history.Count;
        }
        
        protected double PollWaterTemperature()
        {
            return 0.2*_history.Count;
        }
        
        protected double PollOilPressure()
        {
            return 0.3*_history.Count;
        }
        
        override public string ToString()
        {
            return string.Format("{0}[{1}]/{2}", _model, _pilot, _history.Count);
        }
    }
}



    7.1. Storing


    Our setup code has not changed at all, just the internal workings of a snapshot.

    // storeFirstCar
    Car car1 = new Car("Ferrari");
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    car1.Pilot = pilot1;
    db.Store(car1);


    // storeSecondCar
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    Car car2 = new Car("BMW");
    car2.Pilot = pilot2;
    car2.Snapshot();
    car2.Snapshot();
    db.Store(car2);



    7.2. Retrieving


    db4o will provide us with all objects of the given type. To collect all instances of a given class, no matter whether they are subclass members or direct instances, we just provide a corresponding prototype.

    // retrieveTemperatureReadoutsQBE
    SensorReadout proto = new TemperatureSensorReadout(DateTime.MinValue, null, null, 0.0);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    // retrieveAllSensorReadoutsQBE
    SensorReadout proto = new SensorReadout(DateTime.MinValue, null, null);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    This is one more situation where QBE might not be applicable: What if the given type is an interface or an abstract class? Well, there's a little trick to keep in mind: Type objects receive special handling with QBE.

    // retrieveAllSensorReadoutsQBEAlternative
    IObjectSet result = db.QueryByExample(typeof(SensorReadout));
    ListResult(result);


    And of course there's our SODA API:

    // retrieveAllSensorReadoutsQuery
    IQuery query = db.Query();
    query.Constrain(typeof(SensorReadout));
    IObjectSet result = query.Execute();
    ListResult(result);



    7.3. Updating and deleting


    is just the same for all objects, no matter where they are situated in the inheritance tree.

    Just like we retrieved all objects from the database above, we can delete all stored objects to prepare for the next chapter.

    // deleteAll
    IObjectSet result = db.QueryByExample(typeof(Object));
    foreach (object item in result)
    {
        db.Delete(item);
    }



    7.4. Conclusion


    Now we have covered all basic OO features and the way they are handled by db4o. We will complete the first part of our db4o walkthrough in the next chapter   by looking at deep object graphs, including recursive structures.


    7.5. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Query;
    namespace Db4odoc.Tutorial.F1.Chapter5
    {   
        public class InheritanceExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreFirstCar(db);
                    StoreSecondCar(db);
                    RetrieveTemperatureReadoutsQBE(db);
                    RetrieveAllSensorReadoutsQBE(db);
                    RetrieveAllSensorReadoutsQBEAlternative(db);
                    RetrieveAllSensorReadoutsQuery(db);
                    RetrieveAllObjects(db);
                }
            }
            
            public static void StoreFirstCar(IObjectContainer db)
            {
                Car car1 = new Car("Ferrari");
                Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                car1.Pilot = pilot1;
                db.Store(car1);
            }
            
            public static void StoreSecondCar(IObjectContainer db)
            {
                Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                Car car2 = new Car("BMW");
                car2.Pilot = pilot2;
                car2.Snapshot();
                car2.Snapshot();
                db.Store(car2);
            }
            
            public static void RetrieveAllSensorReadoutsQBE(IObjectContainer db)
            {
                SensorReadout proto = new SensorReadout(DateTime.MinValue, null, null);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            
            public static void RetrieveTemperatureReadoutsQBE(IObjectContainer db)
            {
                SensorReadout proto = new TemperatureSensorReadout(DateTime.MinValue, null, null, 0.0);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            
            public static void RetrieveAllSensorReadoutsQBEAlternative(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(SensorReadout));
                ListResult(result);
            }
            
            public static void RetrieveAllSensorReadoutsQuery(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof(SensorReadout));
                IObjectSet result = query.Execute();
                ListResult(result);
            }
            
            public static void RetrieveAllObjects(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new object());
                ListResult(result);
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/directoryjava.gif0000644000175000017500000003252611520622074023553 0ustar directhexdirecthexGIF89a03f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,0H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\R៖0cʜI͛8sɳϟ@I JѣH 2PJJ5-WED[ٳhj9߽{Ҥ1[ƔiCd ț߿\毰^7ǐ#+\k0i]|9½{ÂXhɨS:/iׯ.v -tW N'ٻ4bwν;Levyԫ:vH`P^}]7߀VXr ןA^MhfX(pa( G(,0@}(8PщXm'B`Y gBJX6zX/.#mRLbɞu:jjE^[*z(BZPl-r:J2t5ܞ $CONŔlb4+vіc1Qkޫ&/,/-_@YQ1yw\ \9IElėF:XatVX( Y6[#@Nqn;|D>$!a"#ň<,lJ2Dҫl,P#laRkDy%ʨ,O >< #lW9 '`$cQv)D P*^ \*?Dٙ{pBD0V"Wp\ c5"E`}8R.*yYpj+'PE.7`4#]j(b6P! W]Hİy1\_ I:OHEɪ3آƅy84N?b Db!g<0!?,~MrIW,Q\$v8?[5YƠIDib'2d'Cz!6A90y7YBٌ"OX@cHPCX&BҟT'&T{&E7TX b0* ;II%! Uj:=@dq SLFSs.3a$ɞcOogSg@+;ڱHB1clf4ۤTx|RJ;f ?[tMKV-M•;7 _&ׄ\쥕iG.l(@hGKڊ CTֺ֤ jyoxmB5y)""\E AAQ{pdխE7/#nvJ .l 'w90! -A rи2mv=|iC@bHastυUF. ((IV[эpc]WD=JS'l%N%HXDrAN5 8*C&T۫#%xK` RMIu7To<Sy9&7-hf2>{(W-JBZЃ&tCqA+fE3k@ jvN'zjǮ qJn`MVAYI[Dz`M5FcFܚhj/oh&ng73[Dv!n."՘91&s)~Ȓxg#!;1E2(MAB5^Ϩ6BƤmIf1׃DM1 (yy1g/V$b%7DGUHEO0(oG'y\腂XGm r7GP6*SQqya2Vqf k֝ hiՔ@d!'ֶfanBb:eNd{(0L:v@:Bwn5^(鳄MPXSUʼn$itO%5ީJח_jd^g/WSWzR*$j3_{rITj6 &Ж)`zgi%Ywj([ kѷE[j30 ^vS ᨑ.WILxu>(TCg Z0 ̰Rà1<I-Y3e'(ɚBaLj@T1NKT.^8j @ ف\w>ǺJ jgeTiMBD0 7٭vtL"3ȣ&u9f)i~U#FGAhJJt& P@ 38qٹMc)Q*@&˞` 5˅YD˔fOˡʋL+) ՠP Q[LJyNDj;Jg:fYp I:t}JyB7$g -a~'t{[ gP::+Ã<(v{ !$h(hP(^X%@ȇ*ëA3 Ex\ NhƄIHD9<:,X";}d(qimD:5 {,[89ID:)r戓!KɌA z茺U<")`؊+]wX`Xxqcw sW3XRc(%[bKFQlig{"bW&܈EeW 'ӎVl g{ȓ臱mȼ7ę%[\z M'd~ h˹\@aڀb!\ }= p<>Šq˕< mH ޴|,9L@!u PQ`PJXكn$фG]́,ͰP 0T[ãdXed˝hh/-:!.]iP3 1|Mu]џ9N}ec7Б U+Ѭ.YXS a75!٢Ҷ=9nSv*ßH!7eŠqmʍM6٦Ֆ\Ető"ސ=?l\;ʨ*jĝd M 95@aA QA+ AD뺮2[Ӱ#*c&M }u=-!.5o|d8  ZԺ`ڱ+4PB X8>1=d_\Zt\k9)pV\FM \kNZvLeA2>q<&!桳 ~԰ |JV̞(h*ت~16@ 8*@u>2뻹޻j>gMLwl[#I5n~lļ҆.?)3!.=G^jAnvD#>ix <~hLMQ.>0enSÛaUX_kyv+S q{0L]KCne՚B5i ˽9T8AD1h~D>Xy;mn箌Ɂ\>n ( 2Ϯo+i"YV;^՟YtCW\˲L':@#^w:{`k,qJjܯzNȵxx֙cOHwXl7썪*@՝:ʭ8a7_:~&1]ρ]yR 7Ϫ 11@ DPB >QD-^ĘQF=~܈ Ә RJ-]S?LP ,U<Lw!D]iť -jçSaZ=t ֙]F= !ׂdJWS=`sE&+ڍf"`.%ѯa  m'OUPf=Z~E(iթ zuc~zqͻۥ?VYlѦ w7,u>1ro+ԈDLHSRb|ѱS# 3LrL,@1rR-\Ptt1D=?XW j٦`unUۂs0s>\WJλ`cvAi5TM'C6Y<7^j/\3 ':Fq%{)Z0c }]^ͼcj=[TL" VCCFe;m Qg{f&hF:ifiP^j8uj:kvHj;liF3fmvXznƻ"i趘X}ٳH9d|qD8&8(s-4q >UEbN[s r|ayXqґvÄ\B@/84%a_N]#ݣ'\X{[ᴕK+<‚WQ-ׇu5Ztd@--ЎN_ﰤ|3?!~b`xe%oOBsTzQSQ WDPJbPXtjT []d:! Cڕ̧h4+yd&0Z\|T]AjV΁G+I%jDP!كfT1l#h#@hB`>Ӟ$?#U#(L⻡4sc*4 %OA e,(Fb +|S7<*Q3E:x}Op> @ q+@XO6DS"i&Uu"Y{և`K.6`&86O\"!"RO+D/Nx=ZX [ b:Yf%eVٖ+TD+Y첮*8[ڔ*J[rRA9א%iT .&Kϳ݂yWZD#5?g4erD(1J&h΅\Y{d6\q77h>q|)HkV<1x줲=Gu,l׎g`Tݹ&-=eٜfY3@ڿӾ:7$:4ҕaxzr7\ӹ:Q3:l [z#R# z궀C-ܫo7]983""F!+8Jr#[{C5",7B9"69ԟX.ȁC3[CB3ry@"iL"|-7Cmk++ IĺMAbwa $P:>ȣٷ8S4 +$O?\Ev9S,dl* 4`?ɩSg,hy[;7ƃ#K ë]ZL;Cx c2zTdZeyŃPlkrDȄTȅ7 dȇ&׃ȉ\1zxbȱȄ>qa*Ȍڼ{<ǖ\IXk?GcI@XcꛉD(>` LKoI)Ѩ \3kgtT@]@˓ ԯ*/6D@[;@Y5(컰\^TRA1 TKLV WK*Jஞ *A);ʼr$5#9$|AeE?Ř̹Cd/[.$k+GI+R+5D7H:C&ʸѢ&\' z7̥22u:ľMذzƒŌi @7\NL"*"$C\Öc;-D4ʻ$ꬮyN93ۚ F-FD 񶨳2[ŸPLNZM{PS4bL6l|hϿB MA,ƽ [E0 %!EqKKFH{Ʒnj %TʯјrrBü_BS 6@-DUE>BeG}3I&3JTSOM12?T(+9;@<9"ә_i4 CIKJSU0A#䓥E[_JYJ'U. 4@ָKOUomI*8P$Rs%R өYՂ #<4R$r;/c$ҞB$ͦ#rC U7ɼlmQ 5֠ , ̈́Lw?ޔL&X<-l89PDBT(< + N|u2d~++OC%D+CNb,u"9+CZAZ< Z=bdZc)U8^ڟ cQPܒe:6,Q/O[(5^d69cB=܄UBGv*^+.$Q0eҥaJ45jfеEFmxN㚙Ԃgܹ/]aM1Sa`^;hKK+sƙ7uCiU2hipߞꮰTO @Z'NJ0U2~d0<'^3v=hH}?sJۼ9\nV5i+Vb[#l%P\3qPYٺMaq1T7=p^20H{EmG5圽ϛs%(s_[5}RK(]e~ F}f2u^R^rjﵖiCN>3.=Ffjf_6oD3U|imME$FvKylk0:ʬVK&?GKƦRkpԴ>y6qfʨ\ԜKIwZ!~mr5pm~xmPSHĮd=5 l2VCȶZH>fMMEY9_NE5↽ Wg#B׎-MK*腈E#wtrΕAʤs'45Q.o͙[FߦS#\B<ߎ\m<ǪNhI4Gf2HG\Mp!ZTJ^]^^`G&vX6Ds`] G?Gum'qf `$ksGVuhG3l^Adeim;%rxSBw_<URy.2nyl9mB7e Q8.[fdԖ-B杖=dC>JE8,Wg^[vy96`fPbvс$fԴVe:v';#B!gڥwzFsbzt.|ь渿[iDZ=fiCQ$%{|>ݲ"1 +Wop ~}Yi{#xAi ߇= ~Lwjc6ߪ.pgm" }b/xp:UvYtXgwOeh B \!Ĉz@0>@`ÃB>$Yr"J)W%̘2g9pH8oٓM&AIfPGCyԨPMBZ!ՙ #qڶj`Uj۴92UiT=:Uy˷]WT+Ċ:]W޶}Y2]J&,qdК?]x17^d"cwj Ѹw{<ژo#M7ʗΡƗZ.hN1tޔs]^VEic,\un_hFaq_ i5]piv~o9UEYk Qpcօ u"#Ƞsȡg/fCbh_5cj奴DTS ,dX*&79e(ۑg&Gߐ7? ~IuyT\`w6WK.8Je6QM!jSmTaM础i'4ڵ**'%JT>t{[nM|JI&S*,sD,k2;-Z{-Ҫ*RH߆-{.骻.n;/{//*f <0.s2+0 /~h<(0{\L?#=,S 2R,?35;qA =R4?$mv=5U^[/3=J(Cd jVFr(%SyI -q; b@N{p~kn!t?.jeJvg؍PE7[ O8(Ln=(l.;Qg]ϻ[LfwϽ.(>5~aw?ǶY+G#™QZՠsR`JB r #rBXL.x26屰6lIB2Le,; (ć0N 5Y|3pN1-iMԝzi%+h*y`<㫲gDk\Ć8.NqZD4>FMK(2nz3YG:Im37r^\'&O "hTonz; Zd8"r !\*wM2aR:t(ٸ;}S'a'zm?̕NIrNu˔ odRt=cbQIS'$ɐ੟I8] -F10(&jTTy.rOW#!H/w TREITG l`eQPA]U&WՍ~up˟V>jucaNIb{;8 -فp `N6-i+kԾ4;ms6-q>7ӭu~7-yӻ7}7.0 ;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/directorynet.gif0000644000175000017500000003074411520622074023420 0ustar directhexdirecthexGIF89a3f3333f333ff3fffff3f3f̙3f3333f3333333333f3333333f3f33ff3f3f3f3333f3333333f3̙333333f333ff3ffffff3f33f3ff3f3f3ffff3fffffffffff3fffffff3fff̙ffff3fffff3f̙3333f33̙3ff3ffff̙f3f̙3f̙̙3f̙3f3333f333ff3fffff̙̙3̙f̙̙̙3f̙3f3f3333f333ff3fffff3f3f̙3f,H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛C-Ӊϟ@ PIADJJUZ7ힴ{̖۹!Sʶ۷p\ϟݺw)exڸ AP\MwO1W ժm*y`_ k̹3L]v?,rS̯cL ^(J/9eٗͼF 7}?=\ËWwAMxכ=(ݏO@ ś:{EVwY6~&MVhfv (}h(,"Tb0x24%8v;#B _h7VXcET@W>4%5&ed)?Xogx)Q1ZhJ1srGlz6hCj>oQdi% kw>YfWziܦ}ꪫFXWk꫼6=뜙qE+gV+fvEPk(B.c[Я<lRA4K0LTY.cccK Z ew%2K$chTfc\;}W󁔵v Ύnl 3L1^IXjT_,Ʀqܗbsb+7[C6u&h4Mtn6}7j6+yXo}%\pJtrYk= y{9An_vM#޵c X^e1z)c29z.ac=yn_7t!Ӟκ^Zoi[ϗ_c>Eo?! nY_i K)OvӢ rQ_v }^ AUiDi 76k\|7Ƚmp{!~[[}0pa=!"!bDLڕ$*P;D8qXXh.i/2"dHPSQ1R#@.L^ՂBč!Htw!'=J |JV ܣȼQ,AdA&Ic[*gIE 0U1Pix IT{LG{%|Ca:!);#ة|4DI-4!vsD|`X K KY(il}i5i,|I!"Iͱ(DPQUTH}FS6Ui?P Ԫ0]Ím WB-.SPOM^(,TUB7JZ7es>.+W}@bUƕ(^'>ڝ#iM>$ZmِP^= !->;Cm3gsz;*۸6J"ovR,'AݵpmV Mr-i\xk Bю*v"X;ɛ (Oid-G ){!.)M[SW#JUij\® &dNonUX-@w՛u3+eG^Mul^qj&?oF\ WȕkAZ7n XK)jĴ}\bGj&d,lg"7,Mݱ&[. U[kOQZ^K;>10䊈inn+RVlf7q C#w%5[m!t;3nLH>xao7\9!MLhxnoYg <wX>oE8o؋F9]];՘Z#K?07567} ~Wn7> =B9B {NIE gewAr], ^?SR:xcɋi}C{fy| Pyaa(KfNij7TLvI^&wEweJzZ|w7ihG "kWg1,儻h(j~6hqZz4{V{B7_Q{&ȅƍ^䊙aZgsyv}g~8~f{fhgXg8 ~5l@ka?&cPHGX(>(Hjw+f3kx'Yn:9a)JrsbʣlnszR(:ٕZ*iҦiRIyΨxMuuiD&h嫜uUl7XC䍋e{BRJQyѶ#wӦ_@ -+mʀƢ -g"*I :R;9\:鐐 cp;6k:%/ hY꧐ڣJ8 *bwmrp)FZXZzy;٨Rp! 9u{$xjU"[Zjn|S)ٕj8XEK_uI^DuUL92 (4Uu[DVYpgZsj;ZR!{Jڱ;9d-K:*e2z詝 B *BWe8)zl|Ǚ'1i$E"<84&7eR#"̐;if¸Y,E:k<k$ZiU˟^ʜNz]C۟X-],$[kѷm_堃\(IdP_HY&ڃ(:+ꫯDy jG 驦=1 ;;+.ʒtvJ%6Óld˹]֠'?L[ub&>)pH2hsyzڷmk?zիq[ʜ+j|ˋ[rSqةM{˼DUYxͩRB7@*+B_Wd*E;/f;/ "=`Ib(NjcVˉK*,J K<\!S}A18?)kF1LE]%@h |3Ukl~4{" шԩo@+iȩ6pȅ Z.MlUOI֩IX Xm9Դfʗ:/)Kq q̵Jǩj=Eɷh}U|׽k$AF r~KU'ɥ;׀~b]xM7QmqV*`Kܘ(YZ }ʴܿKлڪǫ`2+ۼl`~̕tC^I֝ 8=kϧT-=u7\^о]?+mM"+,w' @$rENP&w@LۚEmB~G|l- ;20~6 M' 5,8>lhV)~/6Qz$ĭsdz;l}!Vv`F Z6dK+!ͅI^7/%/uڄ&o~ۊϥ""˱PV 8aNוr[ٸ-鵉.5S25flo~ɻ1ih&A{\W #UU^Ҫvo{w|ɾ%GU.09\|5Xf7CD:S( ?Dr$0&#xD6^d bf2Euv;Y&t^N tlizЁvS]=Eo{4 9l>?2]CY@zV OIYL6 Q~.7Y !uf4%omJU}댧?hq/ih'iۋ#eOEɴ#P'o"גquNɵߨ͢|ƿמ|c ̯~2cF]Dh+(tφ B >QD^TF=*dnj1"\x2H+IlYɏ(mtq N%GP}RUU!URYRʍ]z݊RX0/ Zm2ܗ9n=[N%lݔ0kִ=T|8ʾn-_p|!b, ^sKspfڵmƝ[n޽!-(pIJm[5U?]tխ_~ a^xǛZCe:Q՟T׿]z0@$@D0Aګ轡S0B 'A C?1DADQ1EWd: )pj!{jl1Gw1i)HfAG#B, ϰ#hjꁨzin*ZH(/ń6DIdi8ϦA&P<'Ͱ;2%jtTa*!rk:hQ0(KQfSBE23,z-5TuUT5_kXis,3[#TL'a+(*޻ jTLTtB<ڊEdCMTU^{|;˔š'2}ܲLXxaW,e0ZJUR5Xa<턗t)^ Q1zMt2MC^1UmD\ ؚsg3Ff0lRK @VY#ه5efJ]mfmu^j{*s;ooFpG[b&SKhF)3==1-`H[Q\huJ5AҐ1ICѕ/Em|\v#~?ՌQ:L"NT*ֳAROV/[t6Hvɬ!Vֽ1Dk7c〰*Ae@oBjk< [Ɩ"1R H`osЇ*!gAZֵֶ[>Kmnu)"!:iBbܦ">!Xh%\&  5mA 7v+PzveMah! aiuo-cjhP4,b $cu+n1HSu8Ж6J W0b0+Ljհ#Qml04N->be_߱5U1qF:B0*`@j=ugd'HpJl[@ՠ{s3 C9 Y6w*F^B76K *R+;җ iN緝uEMO)2T}jVTX?  [hFG1e9dҥ?k_:^R ܣ=$Q|=P7VtwZ E?py\voG(F=@qKZGR x(.n~D<߸&;WךֲvH(@ao'wey>GGzҕ> v\ċB٧5/]O3 d1kh$ +d`>7Cߒ+VexһSO4UY^~xƗJBV^6+_b2e_;p#{zgt;x>'ڳ #9y#9+L+9;>@"ANܮԭ[̭MV!4#"t:0(Xk'UC6Qk::i‡и[# *k)3Ks6y-I5U ÚR;";c5h[<>.K* C(! zګCo;EoAWa 2Õ27)c)+E #0BM+\<=CtY j9;{c@]rE;JD*B| R18;8I\+BGT=YD2\":8GcCg\5FYDø=ƒ+B$L&:8{Xdr@HjdG1Dμ‡99, H|#MM:4lĶfgZ=CN^2NGY' CCBJBpqrݺ-/&ʥ脈kb[ܝK9}K{CJOi≓Q%z\iY3 d2X[bffWvhj}fК_:fI..pp> * Dev弯/ƫgg!0C0cZ~Ky SU~ -h ٰ)b++K1J&>O4!䊦111[ܵib%K6i‡h'2)JBeWݢ{i 0#33C3P&S3=-领93<3=#3iT-#jFCC[4Ie6>_vk빦뉸ɺ<K3Z{|I>6a#6cBbTP׺$i1u=iRmg{܋5FYjM(f`~^]ůmj5{yc(x;$ U2^Ԃھ֮YQ7lSw7d̷e_cݶ9@&$EQSm.f\ E=N' 87oDLbY,O*Q&TZU3%о<6YfNZ?%SFBeq2Cp̸k꒶Nqi# _V!%(m4^a=O_Xk9#q(jqao̊ll eWK gE)϶P qIKF&lϹ@'bBEDWE%vY5'sh1`;cSNg3slATl{pRmh3{INjmAjX"Z`QV_np[J:=M=+vm0fP&n+h{ $q76R`WqqCVSR' U喽2g p83q]Zp*Қv+Ri~+VS4b/v![ |G(^]/S  9UD4,u_\r֙{8.8@?3g}n2T;w\)5>{tEC|c.FGgl_NGlP?6QB(M*=\6]WIц,hi?YVTJIuFTSKNETV]iwx6 oy^m;Ҽs zӽDž@gxvuACuU~gv:}8wO+L~O-|p|!ȋP *,!Ĉ'Rh"ƌ7r옱A GTrB ,p%ʆ1gPH:w?Zhb(PJ[zO=4H'֬Zr*ȫ$o& ֪UhOYV[m׼zf,_R.l0bp3nǒ'S|x̚7s3ТG.m4ԪW5زgӮm6ܺ{H #Cv/n8m1P=FmQBȧSn}oobM7)}yy_}%YvYmy۟64,DE^M_g9ͅ6eU|W!e'#4'+! bmENءfՕ,^)H!N{[="I#Wah#b3*}/eG9X.eJ5mY8V7ceU^pIS0YkY0˓Ӹ2)r9K7VCƹ炛V៌n%z\և]s򩠑 Eړr)Uej֥q].RJeoi,| D{b*2VfaD\˭% $^]2+c.Mp 򻑹(Rb~d /Z7Vd\lK"L*XK*CFJp*Nuj)oJ3i8;tn:+B}5YsDZ=6e}6ڈq6m=o=7u}qWxwM6R*+kz 4"H #b 29{ 5F#[F޲9x;s+!\ ?:36೨?'I.)Ztad6+Cis'#r@qtEuLlOdF1nifǿ3Ҫ4_3_M!٭-WhE,E4+.yQ8KXY5y)smBTT`dSlvqti%ǸP,t\;W^Gє 6\Tԋ@B á['QM[Y7R,p{i dI~匴Me[_7'ܸؒ&=Dϳr]jC*n0␢|v9פn{Sf6>d\l!g+N= =@k;tvn2|c][݁JqVI s٬ٺAcL(l.[TY9P<2lѻ=J2᭛Bqrt\>Zл."E $8fa| y|Tzi739':V]N,)\HA\ xPB !O&DcnH^S{U :qN[W>Tg@vյ0c.\Sfuc'i7tJ$z |qE;Uُ MɃpnImnTuZz#i`I$'R+#‘52*Tz#aYYAkm:st!a +{^>`;Xˊ-nYjt>ڀE]cNm^|KƟ 3&;i(;R_%7zˠ9tqLޠq'ۅڷ\9][!$rrzr`JfHqmJ8Vysvyڣw"n%t\I-wrO/nH3="c-+fpmۼG?zf7d8 nP* VkvRe>ڕ+ʐ~*֝d^8G4krݸ)k%)W0KS;Yz%w'_q-8R`8ϧNTOܚ#¦_Vv}j-ȷ%. Oogk$9Mgva=kyo[,Iqx q¥cDXS[(? MvXآG W-U3WzFacVGb|5$}Z8zWGkoaj+#]lp>t7ďs<.r:ku|5?M# 裱mm5JQN9: `Gl}%ᨬ5oT<.wY~rP~_[{ QNNsU9}m(? E}|a|5oT|.uY~r0a|1oS׈9}oa|1ƶ?"?M#\꾇Z9}o Eg/?"O|HG;t_ƶ?"9m!1oV=\)]1}!ሬ5Cb)>F<]1ሬ5"|1oT|2炕c|O"9o'N:5 hc:>{k|1oT|2甮co}Xkvډ~-k%oqKEi )iO_B͵zԟÑR-M]̲8!Et$1NHӶjdZq /MCrS uI[kx--2O#n a@j:^āD_(A(VFn뜮*C1-!,G|YysJY.\XO&*Z[!DJAB€$gܕ."BҞAZVs$znEA!NP-(JOq_E- W;Va/W?i^s`@{fKuCSrKCZn6J‹nAW܈}ۃ{ɽ<7£-m\$r ]+*R"HbOvK؊橞 {W FN+njϪLJ*msu92V܈A 9cWpZn ;FC<[[@ o.hW4`S ֫" +cEC˶I ͧq!y'™tC-mcJq-EqjZP+(cO>[}qJf/;CH;)I9(׽֫E@y7R4+R.IZqvmյ|T)(H3XID6IH!fC%6AB҅PB>6@OPv};6.uvG cPPRRC*s=ʞ 85jv'jb̧xnb"z2(a)jTqJ_wmCh.sr0Slݠsys:2pk[Qh5+K,Gq,%ĸym0H=Mi7j2܋Q-K}R]CkbI{t(Em;. Ƽ!v`fpyxkZTX;VEdu(%В*>Q =/h2n]aȊA,t$6Z *RtnP$GI b3zk[;SG$ԞIv_|?sOY 98.F5ө:<5 dt/E)Y>> Vh5VZ>%p==emy!6VHO ןbӥy21ܧ_uCn]z hҸ=̌|+Ns_Ů{W~ͪ5Q/i%"*K!R,`u 꽣ۢjq+Lj䶗ϥj%)_#2=_#r-z[ecvOl$\Nc$&DonځPB sH&$. 4eH9l~1RxH~HZ7+ y =8o?zxJٽJ±k=?R~1jM׫^av <ɽBOyҳ(zSl ȭ mLk!ۢ=sw$řJ0XozZN x)轖7&jVz+ɬoyϚɩDCyPEpEas.4lSN 4˫mIC1-Ė;(qjQ9%IIqvzь֊"3gz_yQ?F>Mdz9ͫJɫz5Cd]ħvC+AJ䅖)9Kj='"SnDDhrE ;mId"J*'$4uSTgzNqfjҸɡfF JR5tMْ/J<Y[p?2;et1h{WhҸɮ{Xx#cW{|_j4ɬCJ|甫'??۫Їjӥzc#&=kڍ+1kҞx#6t/F4^~iO\9c=q]սiҀ#~|-}g][ls9 >unu;J9 qZ ED&S8ܭgrofcLy)RAq!JJ0RӜOQ5c,8oe f3 NpcRaO5FDGsn5=iw2ęm)6pV(8 xl}o?c3G'|뗴%"o\֭.|\2xBRJ Y^f%*JYZ AEc=ch'|;1i9o|U{LKÐC~+^JsiVjf|ɵ,čqBZ\[K.- rp!)9ߙ&F>M<;jzB;iIo| S$>ɧg}F>MNR/>ɧo| S5􏁱k>g6>MM҂>ɧ.o| St'.?o| YɩPCyi曗ɩPCww J>e.ۥ8 y֜ؒynÖYAQFsGӟ稪4F#Đ.‚R*H?gK]oK%aAl(*V-צOLwbRzm~j ,-)mM)Ak_z%;&]\uLխj=Jc5nŖ* ťrOuIP9)G*IuV|LSC,ͫ^OqS>9_rfY'-a7v-qowivWj5 29Rx-\heI7K9kgYg=?X{:?O^r_f,gdu,e:8JI$ίcߋ3NZořO_]Vp+ad܃lC NyIXJDVUZ/YEq|ȉ)66 yԟs=zG~T'-a79kgYg=~jUO.; />lSڀJ{*$O1Z6dj٤n7K0zD.3e= =ޒ"T0C-ևu*'%O/F|k;T?ls547*,Sh]≑\ER#Tgٯ %'IYx)RAZd IHB[ 2GfE!*+KR0|G׫yo%Hu ?TK._ZA'ګ`GF{#QcMc6[J܎GX9x)[YIOZT քb)Їem [^S?Yz-KtVW>ٯWД7! !)R cPFj9M)<P/ZzB{IC!YNާኟmŀ}ՠz-wG|iFh:B7t=yU$22܉Nn#!iO?hrZ'fۙlr;{%iKn:r.tɅ!CeK|!!$ ^a:)J)J)J)J)J)J)J KT()@&eA^=8Ҷ#Gl%CpOtv$YIRa:RCxWx<U~3kiԸPUx RH ,ZmsulcVq8y]/ rX\d9Hp=ޏ͐nGJRLm_r')o\ܖ@0^P{⑷|]pZWሐ)hRR @)OWZ5#v#fB<Zz׭"}ޙ8(JY3<qƶS]\㿱wq[Kj)̆ӞNoS3ja"\qYXo@9;N0qS $v™m%grA'x״`I\VV[cpHua'$9d|9@髅r%fKg;Ck+w*W9qy7[z(2B2}jjڧպ+*uNJPQKl֛r܌JS9ޑ 7rKPG֡)+@E@諴M3hls]νoM;11ގR%* pmχTj7#\XHܒԜjsU7Tx0~cQ\[b.$d6jՒ'% ~Ŕ{kR"FB.;ik 'IVJBHP֭8}֞K i+¼'.D Ud锶"J(kamIPۀHHJBG,$WrE>K}[wu~+SGjoOrn< S NUgiI8+IҥnPAV:Sw=e)|n|xFld?7m3t &[hWӌL.b)Co/ln+ a'aV[!)/Pm.a#jH'WuGmXm]i9ua;Y8 Y==˖;Eq Q[))qan q!J$rjoVWڃL<%ƔͰa/dRmZIRU{1S|ӕnBDaqGSK˭ IQBH 'GҺz,Ȳi3R$";i+e#$mZ™SJuPOI|<2* pЙiS]r (8DHɫw">-M(AǽU~j$*H+Lߔߔur"֓mbT |[joVg΂0uCc?C*JTT2miVr"J|x{\r˗,cZc"$J.~RN5rVcJy`NBNN1ֵ6ӛMJHD&UH )j(%E|t I.dYsjH#$+'5+|y@c8I=jqQԗkܞ|%*>8?;.PQ!䌟w?k *@RG5-6+HwKk&2[P'Xr{tδh޴9lMpOHnKT^yHjJCkI;U;T}Pt5 $Nc^- ɪ7Z>x}ttų/˧7Z>x}dtų/'ޥh϶P,zg(_OO<[>B~: V-l~Y?x}duݭPJnԢpy$AJϽ҃[OLTJ C,yIEZ.so0l-sf*,ԮEulUuL 2<+N!*Jm|0G>Ze΢l4;9%dg+Sj;Fӓr&[0Ducv[yiZPԔ%ɜ4/{ 6w68!)۵ ީ=`5z'O0sHlƻyO/[7o-I||@+OpԶ1|^{JL4V?;L'#·0" )8 U(]o>$ :ѩfg>o\f8^%^Q#C-+V[)J3$` -d 5J.RVSd$ \$-VTܝĹRmJ{jQ*nѳNԻ銫b̺V9:tUzdPxXR(F9V܎|K)6u%Avmi"&lis 9r71\ͩuk$ln%*0P|5 =M@kb~s |Gb<]yס6N@^·FG,䎫GZܮacշyZ57VKKuV_i h]\##& uLMUdq<9 PgRF="냏\&Ρ*C2d<2a+*.&''"*+Zݡw8 f5t$%Hl嵬IHH8pCʀs\~no*\ "am)$`-|A  &6랠hmMs+^K0YoEH rX#yV32/LJLP }:cq0ljPx)Lp*IO%e@q`WVjiL{-ɊKɛĖJڲr)Hϡ0:+l(T->6]}M҄9 TrO,飴=Pα z:Zr8*Pu$/\•/L7|qa]n8EGRm|sRG"k -JvBH'##:AJTRRRTS_{\u9PsM}sxIj:GJtcnj9_ܫu t'e*\a )YrCm)P+ _znoGP%sP4J[۱Dms9ݠj cfnM4%M8(zB6LXa'|R}5u1gekqP'6ʛuEG^c ׵{ o*ܙisiLD K)x7%KQaVXDž`1,W'k{U+d7j y O)J#+ hW7SȲΉ2:h*X``SAHkP͕qؘ ۅq!ԩ˄Ii8܂IϤ^wբT9˜f;JGtgw@9Oj^.v:LeZ>eqвB%J;*F5 XkICΊĥ +[yp䅨98ou TZ+E;3Dlu-@4I5ANzzMyMx`M(C9 ҩ\}* S0T2wCPpr8)`1[2A3r%Q-*KhSjKa s 2XV$닍mzqv5LHyju)<5)Hj̑qi}MH )oE\/ڣ) `1y^vn6۞P u%jҰN:i)J)J7&+v4ܟؚ_G|1Y'V(RNh iΡ$:{YHlg1ϝr,&;8\tn˘<}vf9[2`#sNqTz>d.d)w%D1sr_M)UVq:F33#t`Vml2;Jϧhkec '9E}ufNwz:OƢ&b1۽ +q|mX;n.9NIucĀoEVXsO*?fu q ]s[ N%YrҬof[̓-e []临@R8>+^噈whM7~Ksu )) ia@BС~]4us$|okBPPRw(Fd9-]ymz;LJBԗI$Ig>bb1!EX-):%G X|Zq\YwٳTMVa392}Z%|byp[qj__`XeW$HYmcGrCΐ ;[m*R$+w_c7Oyѯ'EyE[䡂Hio1)fG)I9^-gnpC[{̄$ u(>"skg| YUdHC}2w4grrMjB6yCns&o2Cm:ԥ$(BSmyѯD+tk;oՁEDZ|\ %,MNI9zF"Zda\qm@}mJRRB 2=i%<"6Ilȭk[\ʹEKvTBJRIӗiھ^ϽU"q\QhOKQ1TZ*RwԭXIJ=T;SIN3|8RIc==n!#ȏ T蜃r1Qjp6Km$ӡ0R"JTYX!H  OB:Uneİc+ݷ3Π6̸&"$WZyr:QpnMJ7JKd'}@m hmi m ۭO5[/-xR pT1xLTtVL!SiZ %pGU@ Tvd+(Rs1YK-$2rvI'5J Xq,V4Ԝepb(fAo<2%$sI,٥Ch33ie'b0IӭlҔ R R;XsOMP0GjN}}aޕFGa2Yx++>Iu3R7 (?1*}ppuصeMz8* CߩeLn<]I> #_-{)sSu{;,U]OUw?B2<;w>.($yL M{p("E7*=P@`ݭ"Š[1 Yݫ}O}j+~Zp8 殍#i [HZJ9TXRC#b-%Z=vbq5}<5v#1L{O[l$xkKOn))0[<´K!I–{#F -۪[E4ئ7xwc &;CH.'rگ]0ǔ|c?)K s å/u'ۧFjR\*[}3x\h8 d=N5dkv I3VHR[Ԗq:U9^v~"*y'UV/u+Ne&++H[BǺ+{܉Ֆ'MBkkr֗ S>a!Xy$b~v~"*B>W/Nkա L%RqJ Gd-Ĩ)TjZޙ7mťN 굚m2-pS6Dĭ7Rk.^NOt\4%pKzƤS4`ԒpˡoVB8"W S=)@)@)@)@)A@T?b=8W/ wU*G'H}@c<7 qj?lg|!{z;Mx;Wf\ }k ,p/_]=&\3+ޢyx+ޮqtrc? j:3zǁwWЮWSTÂ<}]uWӤI@-8]c" GR#u3.S!爄 5fs%)yȸbpa.^T>CЊ\P][ rad6Q q);w$@Q8ρX/ZOLi<28 X$ H?UG}uqD)zZ.ʂT[Ip sVb7}љej۠Wh Wp}ĩ0 (HCMNBRTmAROd5nŏܗ *4To4¢JRv(T9g#c |cȊm6J} x"dͼ5)D<wwL<9Vu81a9P ݇3*WpF\.nm`G 8!:_Ritt6BWdSDnLI͢RS a8VHi*GFL)}%[_E[|^FT zO\NRY:dUH^!U-!Giy$c´vm{ɗ){DŽXvCN %2Gt Ziv!$<QHX_AId >:;6{[?+[Km.Ԅ9'ܻ23\!w{eʄnM.NdB;b}:Vr X΅Mh(qp%![7N3`sXّq ͐.%Q6ޔYN#[4buPu5r >ܪ0nv"b2uL) ÎcwGɨ%XEљJL,H<ւg4%vj }3˖m:@BKmKʷ x׽onl\wkiAHQB,%AIP r s˿fϗp/K%IJԠr +-شx WHY8͹>XՖVOBhi~W*hM޴E^mODR4̔@J"@2}5$Z/hЄfPhi%!p})_yQ*V PG0 I \ Ͱ+)qRPA+/gv2ķ!v[0xD$9rJ).]K\pw˙F; 9" 0tAOr2qqnڝ_+ !Vnە3ət-~;)V6(Q#qm I> `O&[*]|K+].2PJZ$Sh U;LBBd͋2+'r$P}V:%DT!GD[7OnFr\uÎ-Erچ[ޞ8 F-VaN7%uq 8$$ޒSR ֖LwB縤Fg@Y7R#5!𰒠y*'#'Eƽm /O6gSͲ0650 a!1K2!E-hңPim ʳGĘ\TT!q`M2Vn϶—qbƁC+[eǔ8M!-+3y#Z%T.SuyN-ņkqQ睍#UEEjTC;Z[@%$ ({ފ vn_SVD",^}Rԥ'W e*Q{IN6m|pGm '@ LBYpfbmIK[+ XψQ.">64ǤBy^RJRGWi )xL[u*mNrY[Q ,- ÖrA{= %LEVcq% S%`<\l(Z.#ڎ9V +q_/+9*.y֣=YF_78K\\]L7!rᦹh-6P[kIPA }P _)@)@)Amk#$@DMJByӨJ-a?^<}^(q^sg۰!NuCR_`r%xЯSQURMGf; SuیN݌-֙RR-q[mhH!jH zTxcj| lq G 9;b:n"*7gWAtVK|(l'.&p[DjmvIj2P] RdՑշd[uSdm8r,>K  B9@me5Z74]MswNF j51r:%#ƣ=n-/m߹D(*IOw?窾tVqEfSg6&kju[dҤPޜ Ǟ0BSm=c69!q2*ު`*|&Z HlrKzd A )nCJĎTCjS|Ma[>=5tpwZ:BӳMӉiTpRpps[wEsCJfހ[kvonyG* Nۆ1ąm9>7]ڂ;7o+fU# i>W չyܳQ{t|8p䶲cNQ#jŠ9!^1`Pt2#.: ,46^n,TY')ȩB^U)70y :jvEzchJ̡))^UNP½,<76/6\>9>.nD%٘{n^8@MXjw򩯽~ٺ = GHR2z҃L _o3.[< 7(jgW?]Ց'c!&m|.u PږBw#s"eǸDj\ڕ䅶 !RȊڿ]I5/:^wߧ,w ҘZ"9,E iaLEhQ9'kJ4\Ñwmj;&D=k_iz)BZ N9HYrCVX%.6*=Cexf*lfd9Wjзt3b4D%ΈRۢC[B+)j֛-ڸo-Gml5ݿzOyIA<2bH@QGNXr+n?w}7syuLS&,!I%/d `,*'RGCjLY;RHjsKߊ#wՏң+?zXwg>ߊ\GTc/|5O H?Qibq;OyOhBYN[^)s[[]|7 ?|up#RCHHByҿjv̀Y L) P --}Y;8E6tVEe(cj.U˪kM\UeoQRr-cI$U|2$B)S&C-C N-Eg^\g^F\`hNVyW-Jㅗw6Z*[;jQln)*ہr5 KJ1JI$H7%6LX;@3>hm##c:.jܴ@oڲĩêJֵ9kfۦmK)a7!ॄŠg9sמYQכ-'pk>k6}Lȅ:`Æ8-#wqڠ JH܇Q\ e>S*˘ ik[ySQ!*qd|}\ay/>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>@j79fCp=ϼj%FCaVo7A= GHR2z҃L}^?rտ\voSʘŎ mbjx6*@Q'rUBd8<3ֹ|{wއir2.>ףmkj~D<~#L2G ";R IO"T68?󳋊,Le .P)a kZڕ}[):Q^y%*ÅKI( xT}ʱMr8zRiJ-7-,hJ0a( Y/<+NĆaŬ\|V[^AZ|R z;Cn4ۗ)m*  O/jgV/7xvI:#/f-v!8ϧV^&j4OGF?Io)cK[we~+[;]P!XS%NJ}BWM( jgK[we~*ێ1snNĐb흒 YU@~R\Nl;vVU?fz|HZp/@ k쁹$uA5=}uEF5grs\y ԈFic!)@)%!=O:opDzkϜ[R%$^|i˪$rMvR9c³Ar˺(wՖ}%8;$uSt.* $ / 70\F9oYmC,mRx"(8wK9 Q_|Q{%6M!j@n]K=r o>v26BI[Tke(H%JOcG0x֙@BSgrr jdF.ye( 33)Hh*c<)@)@)@)@)@)@)@9ʦfr*훠t#'(=tgخ~Ѻ nPWnm@%+$u^Wܫue"$ 2bTrgNǺS"f,U)H 21|>Wty7i-7* U|ԔQZJSIBRIJM`Bv6   QbKM( $$$+hvma%m=NdsA35/ 6n9{b3|COYc,sfg)DZYǶ~* Td1Dtc,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI" tS,¸p_q0ӯ j.d(S]\L[P8)q|mZw!5';&\EM]p(*'$> rZ<ҕmR+'uB<\*PVȩm nzD{3tF!:I}7+ĨgEƾB)ۣke UA)u\RCjRqK#ZqLW +VYJ!GϡJɰb"\Zr9m.*p0TⷬzKQPt~蹮/凯)k )ʀ;ߜUٯmUFZQqP;ݡ]('mF &sM|FJnKC(+ڒJ@OLdsuann]1G-J*Q+ڜw4b 3<-*CK2ZI}(C])ڤ>zbZz=.-6XRT2Pt1+EgҞꢡ%Cԛ{=_/ёW$oS4%5^`L-,:qVq+N;, )R䔤 82xmވ02a е%KU`'ɯ5չ2 bO%*=:fiY 2^Su- ,yVJsWT"'QmZ Rݱ4B;AYnx6{Kd 3 .)8QWq W!Gw3)m*Uh:x)HBŽyU)#VG[nm"-ihßGLg(,J{I!QKr,R @Mn%y&1cihyҝ!*F)A@Ԓ(-4uM)tgþqj}L%8[Zygblyɠ1oՐTA]ZU4kz;ࣸTtn˨RydrV=ݨZ>U"vRB-sY!#O1ҫOjaݶ6X m*!e=Wm7E-eoq2ϑi46OxjRRs] $R-I)DTysUH_S0K Bv׌J3zN9׊C#(!HigVBJ[A+W 8Ass65TmS_M='rZ 駾D.Uտ#TJ]4c?諸@yI>9ⱻ׫hŠ)]YyaVa$twP[&AaɐPYoF#k:]B,'p Kd@{\.K %PSEJ`.c ʞoN4{}oAc\BҢT#'Yerc"2-;Abbl-JB^y! VVrHy 2{{UFjg&%*t#0RhZ+A+6kM/FlQpy sm-'%JAT&ߡtqYy--$(xRRRRUsZG);wtzn q:u`FAG#qV:jUl!_S󮴒PZH(*ΜӷD9)AۅHp%kq$p{}TeۤX'Cbm; Ч! Gs%{ӿ0c-\85z x!PڞR`TMUlܑܯ {+tq68xmxDŽ$QLشݿM&.r }p>s IEnCp1ˍNŏ"Ly! [\U\*QA5GQϧ ;i\Dbc)o8-R[XPh)es+gG\5.dņ#&D Bm=jT ʡhKkl%E\WhT3+Y%R7()$擰_V9'rdFBQ TilԂ-Tsp0? 8jNiW*TcqqNmBw!%C !ݯn)cBC됕HH,"BÎ{j‰8Ҫ:wDK{dD_@K-yP1C.L;Kِ%2 77lJ9aae\-OA\4>fmNVBTnK{Aqd+_OΔ붇#]\;I)}|cw.*#n2Cz;yKkrJgt (p+=] f ~CzVq7jT(7'iPBFh/-533pi\ZxeᎅQϻe*I5#4tfðShj#H[, UrNyti.ݩ*Ee- oLo>Yj{Q"-s`CÏH,28G8i{H`;c%j7B@AZa#hݻ/j&v]q kXHnbTqY/ˠ+Čۺd}رsI mJ":_ j)Erpq Ύ_eLD,8Q NVCErm>&:bMnL1:78JO$]e0y 60És#J2#$( qϭi󎑗uL <8K-e)I$:}=H }NiVm[ód-:iŸը]j{>ns6x CQ\r̲ iԞI[7TַKD8ᕶ} wz wxpމ Hƶ<8^WӁlUYQʔrsRtD=hJB DQ:d:Hq`洑uPO!eL`.4ۈRB#(S6bWMJ;Pee+$=Jy(Ni 2:U33_˥^r{f;ֽ{~*aj{tO]["??MlU\T?M1] \L}WCnZ:+ mv[dġJTT y18zVݺ 3Zamb1+E)@Sh)X9 ֝bڄ%Np[cwzo!mc'%5D1Ͻ 2s,^epaJQ:ҡvg$+fuT &X||6O $+@'>E^c\ҹs tqrAQPۮWxifgsiJ%FvXoV]ŕP]R][8%!Ehr': K{[]5/edJrYYC 6Ϫ1|k;MD[z+kly FG@FhQRr8\}#VkvhӼlnqҝC7rV 6G,+*:7iVX6v@,,IN #`{z)ބnM;u k s5KjX1xtmz0YB޴A@l )T̝U?FܱCyRVk zG`}~s?4}~ڪ]L`^c[)654؎ A€@ϵ[E.-"J嗐P)IZρgs!\^_`dxkHcrO=?u<>s4.OXP}?N1Aź%9C_aAkS[~ykn?s[(48_`k s5bCu qn?s[(48_`k s5bCu qn?s[(48_`kS mm/OǒV8. BPwmjsި+w9ƚWsn]Z3-m~Sppq-w29]P!X:$\^]nB[w,c׌cvH5ݚNM!<έ p pz9 Aٴ*J!?%o\'aeE, Y!Hcj'VNҖ*rL%RIąCZHx!);I1^H$% (qԤ)ORcѓWp6Xm8,W)@n໲Zޔn%GE<7V͸f["*!"$%֨6{|+*CQ~Lحňp)ߓ()!ܤ!$S5|lۤ(gpC굠D1*s7df=~ tϿAڮ6۟Kh?% dM)J)Hm-9P=.Z/ Epmrܝq(mQ˒RlP$`vzz}vQonrOSFvd5mLGqN@(FjI,lq$)о"S.qs_#@w:b:l0ZIJy/U^iyU8"YL Z aŨT}K9ד- Sv;7`Nq 0-[ ɀ@^{v!mȇAl7ZP GD=55fr8NkP='9 ;8e]GshڐkV0t'dL[NncD^jAq @lk#A#)#cݬOPsm[ntuCWIAr\ub>Hʣ:<)5X\ YnOCIRc5?;/-cNR BA撀@kǟl֩w+,׮1'%,!8طRݻ(I= GLs?~:U1N l ZV-mRӊS =ANrLjA˝-𝳺;JR %/^U9wV'K.-1 "E\yI RSH=˝HiHvUԘ`%e*W w{!C+}9#syPO|tݱ>Jb?&YGs/WVT{~*ak}<*viD\W=q}UEcsWՅ=FI^t$0(7G'm71Rݘ$32Rڒ+lj3@V$GBI HۇWX PT p>gTEm&bK X#5L"brۭ:ʓ[ *SH>}-}/-Lc;wdgA!m6磏!J&9Ki 3v6}9VG:Fk~ͩsKiAMר5fFBV B)RNAEs EbB99!Fa-%\T@888:"o|uGHm!+m+RpP<[W}+m ֝X@}1-H9Hq)X??_by{Tڨ,ėKr2Z3K#z!:˔ ʘ%q6yrzՆ3JmNFuJ[j HQJ QIRBR W 9@4-~mخ!.*>O@v%^(1JJP} Rχ%5S:ġ6\>KJ}G|ݮv43.>%(!%o%z gک#nvvnܢȶ i^g\-a2Yfg. )iaD4iԁ뫨N\;09KNλPn-̲!+yWuHHI,׉zԷ#v֮c™EkCkZ$+n29 ``8>ֳӚGuN&sZ.Fv}.*fHqq[Ԡn2AW/Q7"jCpIzD\ )ilB_n0wub#<^koa]_ HdN7$r@ ۜ k̜s~ {U;0NoTwZoTw,#iARRRRRRRRRRRRz 駾D.Uտ#+A}4蟥ʺDX~O]4c?節Zm x2nIb3 +ڝ%K!)zOU{i4UZu%ˢ?{5lHBIڤneGV1A)ƣvp.p^eJaeޤ!)*IE[O{d8.Ѻ3廙\Ѹr{>nx |vYOcyNJFxOޖݧnqeCTT&#Fxt]u)Nu<y# >]KVFDZkKd&ؘ!)Yu@NtOP)JP*8gT՚3/}oƂۣ]>\Է"CMoOdr3:~5}rl$"DηqՔ>jpt#*J_RpHF usq87H6+٫?_Fr%wTBUJr+AW޷ͳ9q_CmLDHIm*6VOAN:WƚPU:4奴ˎiļaa$+ymsztBxl~Kq+DSϖ)*NF"smagʹFɱY[AiK6+RHQS+*|So*eaB *ZNeR X<)njYZZ[MΕjDrw̤) TRzs;g=L;l mQRxr1$sя4yߏ,?gWp=($DSrMyvȖIq&aBBO)Nĕe6('$6ЮQci]*0]| Iu Z JRI #5va.Qn EU)I%qJNRP2ch}n񓹈x%%C$xn7{gRLiI̶F()TY%#Rj֭sp6 fĻtT#n2 S(8Pv(+Jfl)H䕭 `)C$T/n kku?R@@t! #x@Y\OE-#"{n5ն)hO"q"Ĺs;փ)6iBrO%e^wn<;cf-kl Q%KJJpI$̒k Ӗ52dAcKe\<<ͤ0qALم]VlˉM[N \%*#=2wvmEc!$NR6H>Vh 4X [=EFlhTI#I5tV]lvZ-ȓ \@F '4#+\e\LDvbG[* fqQu^B ܠ6U`vqA6ԇ(-e'j8 TTH wHNMpvuo3 -K!I** $-c>+kŝ#RΝ0()e[6;w+)wI% .Zᴫv#K9PgYJs0N9;)Ă)@-=]-=] Pm(((((((((((((9ނi?Kuo5J_M='r}譴kI>Gi]MCLٍ1 BI$avQR']FAd{U.G>kGVNZ6;c;$YR*VK,KI6kM=%\RޖNZKrBR Íȫ髂PSseG l$s@QT -*==e 9>\|-V<*bS-Tֽ?$9)\EymIoV_g0\$C)l(T1Q_ۿs+_H+RϵKz}"jC\ լhTܑ;T8Dg% ;[.3Qf:. G)[x)#cS[fhuK)nkdYwsUz \ΛH[޷:e*e ic`sJ[O-u˳9I߹]nԢS<"4daDf.N!#_>E6֔6瞘^0uUr-RcH^mlHI:N=лuz%0˹/0DHyOFy-@nӯ }<~'bF߭ SδF7*U-iA Y^![=Ud*@zC>򓊬in̯EzkT> Dw&Y ?5gsd//5vbСZĽ!rK(Dv\KB0!)PBfu>8{2l{2ꦵ.s't Uښm[vPomu`a ۶!A:c'M끰ˆL&p."QJ opHgfeِSeِT&jۭbmD:DBq /F@=p ;)3}LH*`8. Chu*JP.^̅E.^̅E\?6&BE,oNSSuZqAXBʐv'xA)PS]݄٬I)>\q'2.nCn)nCq;Qx{E$eWLgȪnt/e27E;?Dž>ǘy3;RrQV^V4c>u1Tn\h^S?".&Apׄ) ʉu(($w|#89oUj#CR,"=MB\r"V8[U$``5kקbv|89ó+?r~", !R@7Szfjnb@maW}eGK<%d '=y՛)oЋwjjѯ`ΜNȢ{E3GgTg yO.t;Ll#Iʞ6=|%ٮ=.}O!R6TӊMj[ҚnULO9{DtȫWfw8f#(A;Aud*:lij-*-|6ԧaX3W.%;YI1n+B+B/PA= $~Ю]]VçKEt#ƣxcW_ۿs+S[-g.S%Z'NG,TtTs4q+-,uyUHHN0* {ޑ^-kuPC))0#-!=6?i .ģwut62ԯc8Sb@89&Mx[unBV@^27]Hm.kq mIe8H>jHҺzEۄ %qv䨌G["hSMܦ$n%#krRsc8sP_Bey66(/ Ɲ]/R+\թ"*%e AW1ԥO{뽎:sI nDq oğ[Y6,u*SJ(<"+]nmj]b@o; NS}m)w`VVb#sl)჌QST]Ĝ1U2"wITrh2OB4"`Co;ۻ|y(!#lVv~Ji5 OY 00̸)PBё)JPB|jRwff+f[1iqBT(BJJZiTWyYW>e=+p9 '@B%)JA ޥX4ZL4V66j+RW͌YUV<҂ϮF}XKcȞkrѽTPIPEeKa.*{֟eebw_G-o-qm<#̷m?WfҜ,)wH3eIs\r0TS1cC>֟efZw]깣>?*UN娼Uˑ{Nw}g?Zdwd:>nW׵C.ʌí3cj\P9F:#WK[!ڶ$Pp }_ۓ-E1o!@lay^ߵZ^f֎ݪno95lin̯Eoj;UEv?(y;p{PSmy#4tշ~W뢭spnl+n2(SoB*NGt+pPW3ֻ\߷2ӳClEm-?( ^ԩžNeJ 9Q#'gF|F?PsF7vLιzJ$;XgkG E$\'d\QC62[lAD(` UȠhro^6R1Ri l8 =1ʭͷw.ȀXRҖVcpH;,Ќ#JJRJRJRJRJRJRJRJRQ7Z{-Q7Z{P)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPs{~*aj{tO]["??Mm]\T?M1W+TӜa?`&ꮀkmjzyb׫h9t[ xI)DEB?O\xCz*z>ijV,qrZPܖKJm%+ JTI”2k%Re %I Ӗ1*Czuo!ڧkRJ>ұIJ8\sHS&QznT.2^G,,a. np'#iMF.ND)/BRvY^BRtu+K * q~qt "5[¸.H;H2:ѩ=-S/k% ˲%!AS聨Jq-r8Nn|{yuקvBa.8B  zˏ5F-){\/w10f%v۝$]Œ"=L, wRܗ9s:d>999~,7c [W)r[S,rPUDL|Ph{`ޭ7g[;GU2]e2&צʤtƸ wm0iaEiJm[DAOwr*Ţa۽;e?ƍ\f9@qm 9O;{[Uis* 7h3;#Ga+O Iۻ_.ȭ:G;U?־U*O|5O?־U*O|5O}?־U*%ZŒoZcO5A/J^f?_?5| T?F}hk_*5| T?F}hk_*5| T?F}hk_*5| T?F}hk_*5| R|߯?־UhNg4./yw (qX \ҰZ9U~ҕ Wn?GQcWt+>koJd ׋?VaJVqѸ}0.O鿢OkM)S+ONPm2J+nNJVcawFSR?'gb}S;_W3+th談Izo?O5(+e}_x.^?vn}BOR[֝-&f5oJR"Ƽ ^)AI{i?*iJW8+}Wҕ޼Ն)JVe)J)J)J{mw)J R R R R R R R R R R R R Rdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_QHistory.jpg0000644000175000017500000007744011520622074023217 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((k" c !1"AQRUV2Taf#456qt$37BSWru%&Cbs'DEdcv0RQa!AS12q" ?U2"(%(RdI"333{Ũh{ N㺔9|F m Aĥtr'>@""pmxeP$\.rofII tb[-;6:M 'gBClDz /0Φ{aS1P%6 PًdBIT%Ϋ,ƓQ${f草f k3|ZaIQ&* 9مre6IO:fZyFYrRJL7VV:dQ;){%(t"44dTAA"!{K4hfJBu$9ȥm4tb:2(r}JY -dJp+L"8iIfJک(T4\c2~>Qg& ܳ2qg2CWo2Ijeb7:2e=5aKL[3BIm#5))A*M&gZRQ䉻2O"wE֔!5eN y \?*L&QMK[h̒ Z1bv.D,T|:[tl^KwԔ)FPT4!0veڋD2u:diSUM$j;QrbߙЌkOc2~Xž͐2*5 8 ~ y0*"6doH܊qȢ7~jbR2$Fs2*TI0aK?(RXnY溂Jngja#& 1E]4LFuԎd!EL.) -Y;y(\GSfX~KL92Cx.tGCŸSkR)2v9a(u& BfUeCH&=Wt^M 9FDY91QQPH'3$?L jz5-L^f>EOYIIΦi7jfHf.# ܓ4 h"3IT51b>Buha&IǔQiR'C šJ ʟ`fCb24i%>"2!&[ILT11&ml HRDH<$] 4uBCLZ'aky֢7J-iQҿD614{vddU#\?,A; !&5 гBV^I5JXr m܍dq r\[JPdJS0q)CrC6Q@L Y>xWudJE¢i3:g?œ\miϖ5|A='J س̗v)6W\4)ZLܢ 1'$7 (qY衫:r*LB0bb:6VFvS"3c&mB"}jqiA]ca+V'2(9|YڒGCA\`Bp j. >PLl,a-)f ~R!w NْzTuCn,5BP'lR_pCP`dmNZX!ނy ZbᢘypHpҋH:49[8FFM.E:BAP܆&42"%~ZPI$̦U/nSph1RH%ԝK> {KvN Ӑ Bֲt4M44YΔ#1񉣑Sң\r\ ٶS*Rĩ&ddf\7'Jg3f_m8(D-n b(zTt<\uKfPJK DDn:f>Gƥ$N8e$s>8.ᡸR6ɠ߽J̠rUm賡!:b2=<;TuƞCK"_RWuְ]\2* 2SC}%t,tf$K-˘M- I)*sbډfɼ1 RI_rCQ,dVjb` 3miZׅYiuFjQ!رPenKdxl˄R>cB$ZT96\%6m)%& Bttgf䖤fk#|\=99\ضU-ŢLJ##QC܂٤$:TO*51s!#*f8`:alESLϔ.f1M`z1ضR^Kew^Mԧ?ej !g.J"oCC*f04!2F餖pR'9*CdMJV%7g,œO@$bnSNJuּB ]k>GӒu QZ)MuּBE#N׈Tte%:^ +G"%:^ qQINJuּBI!N׈T+)$=9)ZRHzrSINJuּAxe@bCӒue$%:^ P]kI!N׈T+)$=9)ZRHzrSjZyE\$ l(w]JL^]#<vOkeʘا# IoPδin%7R7 6 ښy"R\B+ Vf m&m-2#$hu%6MYK,˟m;V` CϚIpʗk\Ggd1S<$d\!\#%s(ӚT:qV)>XKC9 A2M) Z43$gU-DyצT2[=ghIk61d\C&tFfDjV+B z$)y< k6ycV˗"m*UL}fFt@m\Q$3 imnV\VRIFt*fgyLK:ڐ{;gpQ,* yÍ6\%)^Ihe>ձlҩL+IBA? Hs==xhR#6QqiIׂ']1Sg,Ժ^R\4d̮>%)SrKR(ԗRYTMNm2}gv|_HAŽ 4K2PJ)idU2 ƭlaPl4J"aaڍm34[JPT5]".13uMMbr6]n9%O4Iu&W/fGI,֚*rrkCleJI\#**5|;f"<#:mLislY3 :zjմ8QiĥqF Q&Ec!v8ˑ{B䨗% LId|%*I:-jaϟt*jDKG"&Qm)l>)H2rZGR:ezkf66D\|2jTIok6!&dDiM1q;M 0ajj)-g iZ.(T3*,\"qmiVڙjvoUؼB '3( w]-Ci˘)!&ˤqt6sA]jՋ/ cxwV/,]jՋ=0A=0B ލXBv;ѫPC*b@aF{kemm`{kzP{kz g~. g~`{kzP{kz g~. g~`{kzPݎ&^{Ջ/ cxwV/,]j)N!'P߶/9";ۑV}) >oUލ_W|Xl.{zuwWhzwW[ލ_bWh_.z5 ލ_bWh_.z5 ލ_bWh_.z5 ލ_bWh_.z5\cN“Mێ8N=$%0̻z:͢WGI+O$ eCDV~ z>cO1m=D& UEMIK(qDFtYkB> U\tpžgʞ낛<6ߟ3KO 1Bhb'M:LJY)\%DM*BժK>NKDrГuaJ ZT)DGtn XmoGRjCfM_1jP!f3JqQ<#Bzkm)5p!JKvB0!lzfuID$I9 !)#RǚEiR#"I2Dȧ* 9Y/@xgSk]Sk0,̠b<ijZI.#+ј|-4DL*G4 B'Yg$<&fZ%h`0jY!TY{:>A]VG˷ +7i8 9 ݴ8٨ȱ2;:S8E!ShCke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@CkeY[IRwbΪQ$d6x[Ň` fa7`&%Ӎ6$A(%/X~.jSѻ[K WYB36}%_Dܿ\D;CK%h[xdRHf 5-WR#<|Edd}POA-w3>n 'R<1 CRdhY&16ehZ=E#zxM&F\*A2HT/]L3UX:>la1-8F$?}hRJY,,sSkk|c jvҤ%GmF_MҲBx8^ Z mBb!VN 8wz"*Dz-[<A+8Ɠ2e.RiU3LcUq=Yy0r!J7殽 M A -fqŦRItO(ڈ;`%1qV,hhMIRdGt!`Xm]}nsSJT-d%SnUVzb56G% KTCV)QDɧӊJMê-#v:Yo63GFAڹZ4-TkB֔IwI*IB {XHxn1w2Swggx=kreZhh+Uh"a Hq%ԩ7&Z.ET3FfRYkf혘!LBl?,ԂO7JxX􊰊zJf;[NƲvAG;m%4"go`%e#DEzf- F<:9 2ZLEʆܡm]-s+K| hFaҏCڦ{.u6 ]e#_{+]LK޶:rwr<;)76i<=l!͂|YH,W뵽_[My9C:[v&[_ m9vV -uǓ69;})b-t}9Uhoۮ&%[N'Em]-s +Ja)mfüٰWk^_R.uʻE~_Įv1ozq8ugӜY۱2x8[i˗0Ҵ.ј8füٰ]o) l[G e]{wWn[ؘm7ug,km}ٙ|<,=ۘxwiZSNnm-5Ǔ6͂|7ٰUo)%vߛ߿~v1+iï;>g([[knkm.ûJҘ| h@p Mq͇y`]e [,X=_%R8G* ۿ7uĽiםH3beӗ.aݥiL>9fi<=l|6 ]e#_{+]L[޶NyruvLr<;.)mZk&l;}.fuKpU+~oz%v뵽{^v}"QNݙn]v0\y3a{*7iC}_.YWhmk{:ruLr<;)76ɛfg;@Xz2K]|pU~oz%v뵽{Ӊï;>k(g[Wknkaam.\»JҘ| ssh\y3a{+//) l[G e]{wWn[ؘm8:, jmؙml<-˘xwiZSMsh\y3a{.u6 ]e#_{+]LK޶:rwr<;)76ɛfWKOR*7uʻE~߿{n[ؘpϤY)۱2x8[i˷0Ҵ.\y3ae͂[_%RŃѕZ#r߽{+]LK޶NyYC:ڻ[v&[[ m9rVSF`ɛf]Wy~Ho`%R8K*ۿ7uŽiםNqg(g[Wknkam.\ûJҘ| hF`ɛfuK7ٰ]o)%vߛ޿]obb^םHSfgۗnaݥiL>9Lw6 Z~rfWKpU+~o~uįES8m|<,-ۘxwiZSNnm-5Ǔ6[,,]e [,X=_%R8G* ۽7uĽiםH3beӗ.aݥiL>9fi<=l|6 ]e#_{+]L[޶NyruvLr<;)fi<=l[C}.YWhۮ&%[MyYE;_vf{_ mvVS@p Mq͇yo`%) lG e]w^ۮ&%[My%hE q2xX[i˷0ҴZ&l;̶YYk@Xz2K]|pUzoz%v뵽{Ӊï;>k(g[Wknkaam.\»JҘ| ssh\y3a{+//) l[G e]{wWn[ؘm8:, jmؙml<-˘xwiZSMsh\y3a{.u6 ]e#_{+]LK޶:rw0ۗnaݥiK sshi<=l#kL1UY2IE$3&If;*f/~iuͪZm">>.'c ;غY]V͢89)QN"-ԩHZ y(Q(IPT?kaofعv,SLaI!eh%-)hਲ਼fetһ?g Z5d1$viL>UCPԔ !ez2l#(bMkO6qHr|BM$!wI2s}#JLLZq7RqE GJagfrH?'NVR4f[jYiCp:M֬q,aQQp֖:x|Q/ ꅩ'xxFGty`Tġդm$w_$L]%^REx7N6`pͽ.-eI:JIib3YidQ((YHe/FjY.8n!GCU(y0a%%ڿ fmCZ6E\,y9N$ ,&Q*uhDFFD6-pޖ9h%rp=ё6K$*]*VX)I&3<42j&WT44jdRMd;tZ?O$– RY(TANT:̐%8eS; .Ymr ݿKi ҃b}'-/JŜRn. 7y7NZf #\"y)D^L6*-ºF)K,˩"y+ ]91'z6*qVpknl7˵z+L fǓ_bsrnUVn}N yx_ _r`Swfwo\n:^4_R85Il'>/ٌK9z\Jݭ785|ע&ͱR߹Ki p Osf99~׷bsrn}տZV3^^-z.YNn]uRiJ׌t8y'f1[:zڷ߭+wM yx_ g|l:_tJVT xCo{1ϥ=؜ܿ[oտ[_S^^-\9ݿKԦ*WGc7=͘E1v'7/^[/Z]ٶ=^)z4_R85Il'>/قzNn_ϹJpkE=Iپ-˷vVJ׌t8y'f Vή^vJs^^-z.Y*nv/R+^1.y'f1ܫ~ݭAFư{Z#.FŦ5qJxQo%y)%],A" ?H ]ՂwrZuLD>@PG6OT?kk38pq[CJM8i\;)XofjKeyER$*U1E4p(f! M/RZ^*C&ѽhsd%$>fo\pj%2*孟ʦc ,DD[!!$Yk2W0KDajRlYD)IeI[*48gE"}님YlynYZlʆV+qaZ#1Ռn_YT2U3K""mjJL:ݰ,C#;'[u(12_*S@BXuMtk+CJIJiB1zi}jUIeH ;[JJIJֳ" t͘R*Y4j 6"4COYRZ=DN&EDT."--NbE-mȊB"֓n&ApZLD=B̭DiYNJLLb%F܅n uDN:*fu) &B-pCM"sC.rL[jW2fa ˖AfmS0ƦQPMB;=|^J̌vJ\&%HyS(wqeHI(j4lԪjQxL\nrS⬢' .rlW鑹olt ?tZQO7ajmf˩22Bn*a*Ed ߜ=3BD iak$ IqGM2Nyvef&!*͙i4E23WK:_5~DC6Lm!)8%%q979R)m& q0<n\Y!٩&. R='Z8g 3"0qói(d: &% xT+3I:]JҴ* 3u%Ulnu*g^rGñ[;yfjlgt%'$|D/ثL$pA`,2yN'kDEh̳%NԈm88BiXo/n]#4%*GCc,ƝDfrȥ4VT1'S27 lΦgS{Va\H/˳#judfIBHDt"*ЊzG[l5s9|5v إIKfA5ƈH#Q)Y gS4֢XqJLFo .VUZ+*<3RYcpPTKqn;"ZQn,(ԥ)Ft",n@uXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \Tjݕ۫N|w|n \59OɴZ`uچ*F5sP`kT+3ȍl5 HʤfT8Q/2Sn)/yWi *x|l-\6 9Y[n1luf2K9t(IB,d!7$4C5u"3wHddQJ!CеRlt5ׂiߚAh&-6%9tGD3%uD;t9Afkg(ߘ.R3L)owQo {{ڋ~`=)owQo {{~`=)owQo P7MĨ=)oOG (uG (G (uG (G (G (O ¦T2K8 )RJc3m Zx΅jDTBGK.?bXщX )_/!̯*cJr9D9JR%ۤJ&W 5u3*.S8ʙ4fJm*4_m9dDYS"=_Jf6a,T|ݴlmPo]7hERDJ0KL{_7~Xy^Z;E9>TLR-'q\ø#VyȊ;-%nDˑ+a ulҵSyDH9}=(uG )owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=,PЏ9[S upF)MQU#2Н,~?',lٺK7ވ"g~`H7 pĥԍ$FjE놤#e.U6KoFZ%DN-!yK3_9e-Y3fJ[W ef*eZ!%R3㨿f$M1i\T*Җx&ɳQ$Իɦ8FD0 @%!5LG2œ/>D( N!kR4$fu5i>Qy喌Ygp"J%07"+,zPi:c#H 6"* Ǿ5ZS gxtjTT22l33>8m,вCito11vShZ('"5[lĸDFO oQC`X3-*#v!#g7#Rq.ВE"*Ptf)}K>xMy-(|3QFK;6̌ fULyDc ۇ3\qlĽqo]M!{bD[%^a6E3Or)} {7j`8%ky29mcV!$US)C)pHK4N[2ԨCgJ$̯^2⎇T".S=/4(2)}%fE+B!DO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL}ך}%.B !BgS9 ⚾S2]A(EM"evPxVba_I7yi -sLrL*qJIM+BFfu$1%fe]+M;H mQv4vJgTMImn*ԂI-.MTot)^Kar)N;%FT ΁nXŤ\UM;; :uG|#MN%LLG7 “T%DәFs̆wz։_$ ܉yi&.3^+ʆpʼ3gu֊&+]=47禜J6?raa.aMSd;M*d\t"^vj&ҨwFӚmv?3p%-|: pڟ3Lh5DL+cbE[OQ +:I&2i./}IJAT|ڙLu'3HF׆6]Rt*$IsԟT NeE(cCvoM9;csTw8a~Q?A,uKlziQoM9;,,uI.csTwsNjG p Rf˺w禜ӚT95G|!=4p&lziQoM9;,,uI.csTwsNjG p Rf˺w禜ӚT95G|!=4p&lziQoM9;,,uI.csTwsNjG p Rf˶g5XIc(r:a #ڮA%[fd=r_ۧNw8~8ywB,vxhy-4c4kuU*S|yT(y}jpb]mG;H͔cJ# L8 []sqIǐlY֣fjHRZSqm)ٔ.Isb L#b5SYqD1&UNMuAg5[k֊&lꙜ&~*P叴eW&\h"ardK i`_]$ִԭ>A6[? lJI{tDVV[BU]}ՙN,WNӊ6G4[e,n jfXH4:_Be1eZ8[,e!Jj5,o3&V[UYoWxlq/\q u,D;2nD*9ha#Q箁odPIĢ>mTݼq`Ȝ6qwH׈v~V[UYoWxc q]z ` 84Pm Yo2[7 )>%TJ2UK0&sDG٭ɦ h*% %S3g3>3߼TUwV[U7amEe7{V[UYoWx4Ovrz?;YoWxo;UeU]~;UeU]UUw(=̞x{V[UYoWx{~;UeU]UUw(=̞x{V[UYoWx{~;UeU]UUw(=̞x{V[UYoWx{Ј~;UeU]VV[UD2$CY +2f. |ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W:gfaR8Ffs8B]l ^*M2t_Z!Ej,54p#<2hiǣGGO@nZR n-vޥ1|opVT?>"vĝ˄mL3SD hO~&`7K8$QU*d!gbm2o79 $ML(K^}x֐F6/:S!҉S z&iv&ex.**Ї읗Qe?ZJ5$IN:A[^ԋjDp0.t.3tʞ]:$#eyՌ+̞g!֩ JmDs(iT8JQЯ`g#,C*2"&&Ȣ$ BZBУu^ɜ#dO{V3$l2{ڱ16!T<)av!ǔ]3n-3UPQz]k!#`}hz*:ɧIddg隤.D|,H^dc>(P썕=Hϊ;9iJr\*Q0-!嶲u?CϡT2eNQ06iG/"pDBDŭN#HMEB-©yT䅖#{R͞iC`_i 37$l2{ڱ#eyՌ ӜCfiV:aaK,N?ܝF!~+pN0 j|PdO{V3u3v Mc}d6]$$yF|-B埵Oc!8q qHI0I;̌fPJ+6W=Xϊ j|PZ[&4CDөSO%JjM^dfiRPYMc3g?ɋq'HX-$Y33J1:i(x6j(pʧU4!+̞g 63.c@ʴ/ZheVfq2&-fRRGE6W=Xϊ+̞g dлwba@ dִۺogFE[b4Krj%WMm4Sު1f#/>~c$l2{ڱ#eyՌ勈NeAö\d:qƄ\MĕӪ9x6X!W uFmMyȒt32+̞gH^dc>(a3HH6dD+Qy>n=%#7|fi8Z+KlVZQL/䍕O{V3rk:Vlin}jNv$QZQWFY4ZPQY9>+r?gv3d0'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3`fSXhxs2|q$*Qg#f$Z:ҕZOysP(rS &T͠ >,ȟ47J)w %)e4:mWNeCE###G\䔎[^aOj?f: uMǦOJD" H7HK Iѿׁi ySKRR{U'E(u\]n:֗ҥi8I75zG-<Ÿo FT՞O0-+A(_c 5!T"& k!hZS2%Df4Dg$eCρ?ϠsX>셞y} ![Jxv-xלI,5~JE;6jc '.Ur'XeDffdyNG?݃)t c=&P6z[(f6_%º5D)̐.q,'iLJJP4RN\Q)FwS33zD7s)]H_Ń ΁5.,:`aZa+Pq)-[INha5@,s@5{L@L*(QM(/'OfH/r̥/LJ*@4/0u }f|DK*E⬛QQqFt"qȈFڋi4*Lq7|Q!}?`NJDJCD!pKIp_+I#GܮM+D&!3uף]}Kdj|&G?݃ ρvRD8YYJ\NdоArQ,6#Mo-u( @v7>>x y7|DN ,۟@v ]Ϡ+N;.}&5I+f4cQա³2FqL9Qh4I*J%g/_݃ ρZ<¦tХ i%d(DJRktdfUgdpB[<[tJke?`s)L%Pq DmF+fWңJ: dԑגl4;I}Vk GV9Bftπ@vLp\SIDC.mL߉FDFDN"Y%2%LK-E:!RhIfb?`sٗ\i(ƙNDԫUF7>>xJrPJ,`q7k%H&x5n P<p͓iTd%_%>쑠ײ,K$YHI M?a4m ;X]/4Gcgm90[ h!pl$GBJIJ*ONZel v2g/ C4 Nu*&H֓5"cDfC.r$$36sΤKXMYxZt¯X7FsW6b/}#EzAgVN)}o@zAOi' h޿OhH/#{HWL[!Y=~XzAOi*əKz?> k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯Z k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯Z k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯ZMӨ4 'LFq}v֋J('뭔Or?9-~s%{7 H_fmƃBJTP@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0dRU֘TdVU֋<%HlMVh? D/%7+dVU֍5.?Ƭ1_x|D_$K6&+lo4"q?Ŀ͉ K*WFdVUր-F8ZP J uT-?16H,OҨ΂fm)B:V*naUŹ+:ː&U7u9s/7V%]B{i*8O ύ^Džx}eīS/7V%]B ύ^4'>7]{֛ӊ MՙOjE|n4'>7]{%}x2ufSڑ_iz)H[ v K ~_Z^{R+/7Ve=Cq!?ƒr?__ZnJ{R+//Ve=BA9.|~YW_n{R+S!XMՙOjE|ȩ"z7  yufSڑ_}i)Hp`0|YW_Zn{R+p 0|~//Ve=A2Ԋ!+?Ώ:?_ɗ2Ԋ MՉWjE|>?_?Ϗeī"2ubUڑ_=y?ϏO`<}i)H YWfObg`+GxufSڑ_}i)HG'`90 YW_Z^{N+保1\B#֗2ӊ KՙOi|d保0:?"<`1}i)H YW NK B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ!Omc.K0X ֪5kaR D&ЈMKg!- OG@db4o-8.0.184.15484+dfsg/doc/tutorial/docs/ClientServer.html0000644000175000017500000014560411520622074023513 0ustar directhexdirecthex
 

12. Client/Server


Now that we have seen how transactions work in db4o conceptually, we are prepared to tackle concurrently executing transactions.

We start by preparing our database in the familiar way.

// setFirstCar
Pilot pilot = new Pilot("Rubens Barrichello", 99);
Car car = new Car("BMW");
car.Pilot = pilot;
db.Store(car);


// setSecondCar
Pilot pilot = new Pilot("Michael Schumacher", 100);
Car car = new Car("Ferrari");
car.Pilot = pilot;
db.Store(car);



    12.1. Embedded server


    From the API side, there's no real difference between transactions executing concurrently within the same runtime  and transactions executed against a remote server. To use concurrent transactions within a single runtime , we just open a db4o server on our database file, directing it to run on port 0, thereby declaring that no networking will take place.

    // accessLocalServer
    using(IObjectServer server = Db4oClientServer.OpenServer(YapFileName, 0))
    {
        using(IObjectContainer client = server.OpenClient())
        {
            // Do something with this client, or open more clients
        }
    }


    Again, we will delegate opening and closing the server to our environment to focus on client interactions.

    // queryLocalServer
    using(IObjectContainer client = server.OpenClient())
    {
        ListResult(client.QueryByExample(new Car(null)));
    }


    The transaction level in db4o is read committed . However, each client container maintains its own weak reference cache of already known objects. To make all changes committed by other clients immediately, we have to explicitly refresh known objects from the server. We will delegate this task to a specialized version of our #ListResult() method.

    public static void ListRefreshedResult(IObjectContainer container, IObjectSet items, int depth)
    {
        Console.WriteLine(items.Count);
        foreach (object item in items)
        {    
            container.Ext().Refresh(item, depth);
            Console.WriteLine(item);
        }
    }


    // demonstrateLocalReadCommitted
    using(IObjectContainer client1 =server.OpenClient(),
        client2 =server.OpenClient())
    {
        Pilot pilot = new Pilot("David Coulthard", 98);
        IObjectSet result = client1.QueryByExample(new Car("BMW"));
        Car car = (Car)result.Next();
        car.Pilot = pilot;
        client1.Store(car);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
        client1.Commit();
        ListResult(client1.QueryByExample(typeof(Car)));            
        ListRefreshedResult(client2, client2.QueryByExample(typeof(Car)), 2);
    }


    Simple rollbacks just work as you might expect now.

    // demonstrateLocalRollback
    using (IObjectContainer client1 = server.OpenClient(),
        client2 = server.OpenClient())
    {
        IObjectSet result = client1.QueryByExample(new Car("BMW"));
        Car car = (Car) result.Next();
        car.Pilot = new Pilot("Someone else", 0);
        client1.Store(car);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
        client1.Rollback();
        client1.Ext().Refresh(car, 2);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
    }



    12.2. Networking


    From here it's only a small step towards operating db4o over a TCP/IP network. We just specify a port number greater than zero and set up one or more accounts for our client(s).

    // accessRemoteServer
    using(IObjectServer server = Db4oClientServer.OpenServer(YapFileName, ServerPort))
    {
        server.GrantAccess(ServerUser, ServerPassword);
        using(IObjectContainer client = Db4oClientServer.OpenClient("localhost", ServerPort, ServerUser, ServerPassword))
        {
            // Do something with this client, or open more clients
        }
    }


    The client connects providing host, port, user name and password.

    // queryRemoteServer
    using(IObjectContainer client = Db4oClientServer.OpenClient("localhost", port, user, password))
    {
        ListResult(client.QueryByExample(new Car(null)));
    }


    Everything else is absolutely identical to the local server examples above.

    // demonstrateRemoteReadCommitted
    using(IObjectContainer client1 = Db4oClientServer.OpenClient("localhost", port, user, password),
            client2 = Db4oClientServer.OpenClient("localhost", port, user, password))
    {
        Pilot pilot = new Pilot("Jenson Button", 97);
        IObjectSet result = client1.QueryByExample(new Car(null));
        Car car = (Car)result.Next();
        car.Pilot = pilot;
        client1.Store(car);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
        client1.Commit();
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
    }


    // demonstrateRemoteRollback
    using(IObjectContainer client1 =Db4oClientServer.OpenClient("localhost", port, user, password),
        client2 =Db4oClientServer.OpenClient("localhost", port, user, password))
    {
        IObjectSet result = client1.QueryByExample(new Car(null));
        Car car = (Car) result.Next();
        car.Pilot = new Pilot("Someone else", 0);
        client1.Store(car);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
        client1.Rollback();
        client1.Ext().Refresh(car, 2);
        ListResult(client1.QueryByExample(new Car(null)));
        ListResult(client2.QueryByExample(new Car(null)));
    }





    12.3. Out-of-band signalling


    Sometimes a client needs to send a special message to a server in order to tell the server to do something.  The server may need to be signalled to perform a defragment or it may need to be signalled to shut itself down gracefully.

    This is configured bysetting MessageRecipient parameter to the object that will process client-initiated messages.

    public void RunServer()
    {
        lock(this)
        {
            IServerConfiguration config = Db4oClientServer.NewServerConfiguration();
            // Using the messaging functionality to redirect all
            // messages to this.processMessage
            config.Networking.MessageRecipient = this;
            IObjectServer db4oServer = Db4oClientServer.OpenServer(config, FILE, PORT);
            db4oServer.GrantAccess(USER, PASS);
            
            try
            {
                if (! stop)
                {
                    // wait forever until Close will change stop variable
                    Monitor.Wait(this);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            db4oServer.Close();
        }
    }


    The message is received and processed by a #ProcessMessage() method:

    public void ProcessMessage(IMessageContext con, object message)
    {
        if (message is StopServer)
        {
            Close();
        }
    }


    Db4o allows a client to send an arbitrary signal or message to a server by sending a plain object to the server.  The server will receive a callback message, including the object that came from the client. The server can interpret this message however it wants.

    public static void Main(string[] args)
    {
        IObjectContainer IObjectContainer = null;
        try
        {
            // connect to the server
            IObjectContainer = Db4oClientServer.OpenClient(Db4oClientServer.NewClientConfiguration(),
                HOST, PORT, USER, PASS);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.ToString());
        }
        
        if (IObjectContainer != null)
        {
            // get the messageSender for the IObjectContainer
            IMessageSender messageSender = IObjectContainer.Ext()
                .Configure().ClientServer().GetMessageSender();
            // send an instance of a StopServer object
            messageSender.Send(new StopServer());
            
            // close the IObjectContainer
            IObjectContainer.Close();
        }
    }



    12.4. Putting it all together: a simple but complete db4o server


    Let's put all of this information together now to implement a simple standalone db4o server with a special client that can tell the server to shut itself down gracefully on demand.

    First, both the client and the server need some shared configuration information.  We will provide this using an interface:

    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        /// <summary>
        /// Configuration used for StartServer and StopServer.
        /// </summary>
        public class ServerInfo
        {
            /// <summary>
            /// the host to be used.
            /// If you want to run the client server examples on two computers,
            /// enter the computer name of the one that you want to use as server.
            /// </summary>
            public const string HOST = "localhost";  
            /// <summary>
            /// the database file to be used by the server.
            /// </summary>
            public const string FILE = "formula1.yap";
            /// <summary>
            /// the port to be used by the server.
            /// </summary>
            public const int PORT = 4488;
            /// <summary>
            /// the user name for access control.
            /// </summary>
            public const string USER = "db4o";
        
            /// <summary>
            /// the pasword for access control.
            /// </summary>
            public const string PASS = "db4o";
        }
    }


    Now we'll create the server:

    using System;
    using System.Threading;
    using Db4objects.Db4o;
    using Db4objects.Db4o.CS;
    using Db4objects.Db4o.CS.Config;
    using Db4objects.Db4o.Messaging;
    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        /// <summary>
        /// starts a db4o server with the settings from ServerInfo.
        /// This is a typical setup for a long running server.
        /// The Server may be stopped from a remote location by running
        /// StopServer. The StartServer instance is used as a MessageRecipient
        /// and reacts to receiving an instance of a StopServer object.
        /// Note that all user classes need to be present on the server side
        /// and that all possible Db4oFactory.Configure() calls to alter the db4o
        /// configuration need to be executed on the client and on the server.
        /// </summary>
        public class StartServer : ServerInfo, IMessageRecipient
        {
            /// <summary>
            /// setting the value to true denotes that the server should be closed
            /// </summary>
            private bool stop = false;
            /// <summary>
            /// starts a db4o server using the configuration from
            /// ServerInfo.
            /// </summary>
            public static void Main(string[] arguments)
            {
                new StartServer().RunServer();
            }
            /// <summary>
            /// opens the IObjectServer, and waits forever until Close() is called
            /// or a StopServer message is being received.
            /// </summary>
            public void RunServer()
            {
                lock(this)
                {
                    IServerConfiguration config = Db4oClientServer.NewServerConfiguration();
                    // Using the messaging functionality to redirect all
                    // messages to this.processMessage
                    config.Networking.MessageRecipient = this;
                    IObjectServer db4oServer = Db4oClientServer.OpenServer(config, FILE, PORT);
                    db4oServer.GrantAccess(USER, PASS);
                    
                    try
                    {
                        if (! stop)
                        {
                            // wait forever until Close will change stop variable
                            Monitor.Wait(this);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.ToString());
                    }
                    db4oServer.Close();
                }
            }
            /// <summary>
            /// messaging callback
            /// see com.db4o.messaging.MessageRecipient#ProcessMessage()
            /// </summary>
            public void ProcessMessage(IMessageContext con, object message)
            {
                if (message is StopServer)
                {
                    Close();
                }
            }
            /// <summary>
            /// closes this server.
            /// </summary>
            public void Close()
            {
                lock(this)
                {
                    stop = true;
                    Monitor.PulseAll(this);
                }
            }
        }
    }


    And last but not least, the client that stops the server.

    using System;
    using Db4objects.Db4o;
    using Db4objects.Db4o.CS;
    using Db4objects.Db4o.Messaging;
    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        /// <summary>
        /// stops the db4o Server started with StartServer.
        /// This is done by opening a client connection
        /// to the server and by sending a StopServer object as
        /// a message. StartServer will react in it's
        /// processMessage method.
        /// </summary>
        public class StopServer : ServerInfo
        {
            /// <summary>
            /// stops a db4o Server started with StartServer.
            /// </summary>
            /// <exception cref="Exception" />
            public static void Main(string[] args)
            {
                IObjectContainer IObjectContainer = null;
                try
                {
                    // connect to the server
                    IObjectContainer = Db4oClientServer.OpenClient(Db4oClientServer.NewClientConfiguration(),
                        HOST, PORT, USER, PASS);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
                
                if (IObjectContainer != null)
                {
                    // get the messageSender for the IObjectContainer
                    IMessageSender messageSender = IObjectContainer.Ext()
                        .Configure().ClientServer().GetMessageSender();
                    // send an instance of a StopServer object
                    messageSender.Send(new StopServer());
                    
                    // close the IObjectContainer
                    IObjectContainer.Close();
                }
            }
        }
    }



    12.5. Conclusion


    That's it, folks. No, of course it isn't. There's much more to db4o we haven't covered yet: schema evolution, custom persistence for your classes, writing your own query objects, etc. A much more thorough documentation is provided in the reference that you should have also received with the download or online.

    We hope that this tutorial has helped to get you started with db4o. How should you continue now?

    - Register on db4o developer website.

    - You could browse the remaining chapters. They are a selection of themes from the reference that very frequently come up as questions in our http://developer.db4o.com/Forums.aspx.

    -(Interactive version only)While this tutorial is basically sequential in nature, try to switch back and forth between the chapters and execute the sample snippets in arbitrary order. You will be working with the same database throughout; sometimes you may just get stuck or even induce exceptions, but you can always reset the database via the console window.

    - The examples we've worked through are included in your db4o distribution in full source code. Feel free to experiment with it.

    - If you're stuck, browse the information on our web site, check if your problem is submitted to Jira or visit our forums at http://developer.db4o.com/Forums.aspx.



    12.6. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.CS;
    using Db4objects.Db4o.CS.Config;
    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        public class ClientServerExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");
            readonly static int ServerPort = 0xdb40;
            readonly static string ServerUser = "user";
            readonly static string ServerPassword = "password";
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                AccessLocalServer();
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    SetFirstCar(db);
                    SetSecondCar(db);
                }
                IServerConfiguration config = Db4oClientServer.NewServerConfiguration();
                config.Common.ObjectClass(typeof(Car)).UpdateDepth(3);
                using(IObjectServer server = Db4oClientServer.OpenServer(config,
                    YapFileName, 0))
                {
                    QueryLocalServer(server);
                    DemonstrateLocalReadCommitted(server);
                    DemonstrateLocalRollback(server);
                }
                
                AccessRemoteServer();
                using(IObjectServer server  = Db4oClientServer.OpenServer(Db4oClientServer.NewServerConfiguration(),
                    YapFileName, ServerPort))
                {
                    server.GrantAccess(ServerUser, ServerPassword);
                    QueryRemoteServer(ServerPort, ServerUser, ServerPassword);
                    DemonstrateRemoteReadCommitted(ServerPort, ServerUser, ServerPassword);
                    DemonstrateRemoteRollback(ServerPort, ServerUser, ServerPassword);
                }
            }
                
            public static void SetFirstCar(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Rubens Barrichello", 99);
                Car car = new Car("BMW");
                car.Pilot = pilot;
                db.Store(car);
            }
        
            public static void SetSecondCar(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Michael Schumacher", 100);
                Car car = new Car("Ferrari");
                car.Pilot = pilot;
                db.Store(car);
            }
        
            public static void AccessLocalServer()
            {
                using(IObjectServer server = Db4oClientServer.OpenServer(YapFileName, 0))
                {
                    using(IObjectContainer client = server.OpenClient())
                    {
                        // Do something with this client, or open more clients
                    }
                }
            }
        
            public static void QueryLocalServer(IObjectServer server)
            {
                using(IObjectContainer client = server.OpenClient())
                {
                    ListResult(client.QueryByExample(new Car(null)));
                }
            }
            
        
            public static void DemonstrateLocalReadCommitted(IObjectServer server)
            {
                using(IObjectContainer client1 =server.OpenClient(),
                    client2 =server.OpenClient())
                {
                    Pilot pilot = new Pilot("David Coulthard", 98);
                    IObjectSet result = client1.QueryByExample(new Car("BMW"));
                    Car car = (Car)result.Next();
                    car.Pilot = pilot;
                    client1.Store(car);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                    client1.Commit();
                    ListResult(client1.QueryByExample(typeof(Car)));            
                    ListRefreshedResult(client2, client2.QueryByExample(typeof(Car)), 2);
                }
            }
        
            public static void DemonstrateLocalRollback(IObjectServer server)
            {
                using (IObjectContainer client1 = server.OpenClient(),
                    client2 = server.OpenClient())
                {
                    IObjectSet result = client1.QueryByExample(new Car("BMW"));
                    Car car = (Car) result.Next();
                    car.Pilot = new Pilot("Someone else", 0);
                    client1.Store(car);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                    client1.Rollback();
                    client1.Ext().Refresh(car, 2);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                }
            }
        
            public static void AccessRemoteServer()
            {
                using(IObjectServer server = Db4oClientServer.OpenServer(YapFileName, ServerPort))
                {
                    server.GrantAccess(ServerUser, ServerPassword);
                    using(IObjectContainer client = Db4oClientServer.OpenClient("localhost", ServerPort, ServerUser, ServerPassword))
                    {
                        // Do something with this client, or open more clients
                    }
                }
            }
        
            public static void QueryRemoteServer(int port, string user, string password)
            {
                using(IObjectContainer client = Db4oClientServer.OpenClient("localhost", port, user, password))
                {
                    ListResult(client.QueryByExample(new Car(null)));
                }
            }
        
            public static void DemonstrateRemoteReadCommitted(int port, string user, string password)
            {
                using(IObjectContainer client1 = Db4oClientServer.OpenClient("localhost", port, user, password),
                        client2 = Db4oClientServer.OpenClient("localhost", port, user, password))
                {
                    Pilot pilot = new Pilot("Jenson Button", 97);
                    IObjectSet result = client1.QueryByExample(new Car(null));
                    Car car = (Car)result.Next();
                    car.Pilot = pilot;
                    client1.Store(car);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                    client1.Commit();
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                }
            }
        
            public static void DemonstrateRemoteRollback(int port, string user, string password)
            {
                using(IObjectContainer client1 =Db4oClientServer.OpenClient("localhost", port, user, password),
                    client2 =Db4oClientServer.OpenClient("localhost", port, user, password))
                {
                    IObjectSet result = client1.QueryByExample(new Car(null));
                    Car car = (Car) result.Next();
                    car.Pilot = new Pilot("Someone else", 0);
                    client1.Store(car);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                    client1.Rollback();
                    client1.Ext().Refresh(car, 2);
                    ListResult(client1.QueryByExample(new Car(null)));
                    ListResult(client2.QueryByExample(new Car(null)));
                }
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME_Pilot.jpg0000644000175000017500000007441711520622074022514 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ev]F}$Vͦ۫}[]H/Q*(瞦J]ͫzH-~sX(~&!wUYWÚ+V&v46SK1I.[h Ym3MV*b.nm/&ܯ,GUs]e*\Opa_-1,$ )8RUSZm$ͯ7yKRTf_ 4ӼOYBxEPFdVo4y_xQ[o5u1c!36l+>+#=7MRTUٺo⫙ėv˶)(*XÓkZwۦ+nݝtf!瑎f_ 7MRTUr˸ahnI++U(.q*yh8n9:4ԵDL i[Y6syְ2n #"lc#Et(?Q~S#2#:_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@5oX][kE|z} JNVSOYemuZEuc=imieXC}i-[̻gyP8bQ#͕Zlg#Y]- ڬX)&0du5Tn4{ֻ󯠝X/ܪX"7Pp]oseqz5X'xTK.* A(8.=EIzv8;O'py;lLzv-{{ջ󯧝#h隸ڬTG`2Qzz cj{?ٟ}gݿqE<}ry!$7 g` 22Oz0] x6$g}Òa5 lP.W_|lZ6ŀDF U >\oP_jn,#͖5V;d 'y)N-]ՇLG"S##&F20㚫%y~i24nAr*ؼU>z7hFUa.ZkAZeb0P\I2rVބ1U3nS߂G>ؼU>z7hFof-o"[?y$#Ĝ8 f6I6!]v8S}_lfx|o { &i&/683XANM66FX@)+9?}ӧFbW/R 24d*s)6\'GSW-m"fh3+HHbIƣFbW/AfX/m&6E7)##{1yg۷w~v~^S>ѿ6_3GؼU>z7hu̱kYZCkn6C kkP0O=MQFbW/afiCw, YprkB-FB>^}¹߱x|o /Aш=Ge5փW:+'? Oh'; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'/ğ.O3EŠI@4eh{Q\_?\f;C?p; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'/ğ.O3EŠI@4eh{Q\_?\f;C?p; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'E]mq| :U<)+=3:QhVUuZ"IZ?՛W»QsxGIJNOQ\>[^>unk.2X/ -+UxEղilf+$@$╷:Φ6wIHљ:t__[ڍ $J2˾5f9gԞ9ZGTϊJO;F|WBUZ(3:џЕ}֟v> g%_uO<>+*?_ Wik0ϊJO;F|WBUZ(3:џЕ}֟v> g%_uO<>+*?_ Wik0ϊJO;LowUP@ԜJ_n?V?7R9)g"2Xž9xZ[+_ >+*aF 8'<i\ 3"$˪1e y2 d{}tv6ɲ=1 grz>E?5W^ݞ!Ŵ1s}ղGu_h|ϜU.4FDOʨ<坌~XL9<: .[TT^<,G`ْ%l~=(ϜT}/*OX#[U]F*0+I 3nq[:UrVoqm1DS"XTu`CB}SG]S#\ܮ`*@95n'G[,}D''ϜT}/*WS#T+9HbErϽ[އ|Wsd X\$<3yUvF8C9ϜUCk4enYd2x^,Vx#Y|by0Xc@~V;G#7d{4iSM s1@zk Ww/yGp8CVi#A2/ ț>Et 묟(D_Uh|gxU?֦bH!ʋi_YXX!濵n$#ʡ#ӿ[Pyik, HFp z ]:olrPE>p~oQBT`IsMo'$*ZM7z奼\l1yVs7; G8=GEPEPEPEPEPEPEP]~ ?_BA#@gx0©n+GVUuZ"IVt3a Zn?. Udޕ**5mX^W8<<<"hie*DVUydbj0K%""),xԚݧ$te8";_Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:V~YXiR]:L6xT\I>y?sG?hz jmOgƾ6~޻2Ī .e?4}~ kX׺%s$eK$PIX+O Zm5[è]X#|70;r\g9Ӯp|=ʘ y-̂&0fNsg<_iw+sS4C fV .ĞӮp?\Tts]ϗ0fJP\#`^85zhmM;?fsQ :,}D''#KFReUܹ̓'hR!HbolP6X.z Fhiik\I#4`Y\y=ռQ wn!~̲yFoǰ>3vn8]'soXG'>>#즖kNXW|-+">aϸ[hs\E';ǀ1ހ< z?9.6,2_ii*j |TGHmj!fQ,]ʑ`rgߌ5N|-A+Ӣij}?kr|~N:γqoyy.a bko-_l~j υ=cE[?WMvtڕWӮmuYdNH5x /f5/A~V,䟕p3p8/N|-A(?K-v:BђUqqQFttmVng x9QN|-A(:- aq+:7(ʧ @5./6_DuU'[?Q υ=cEw [`f/ɡfbHnP|̯Œ/Q\N,0ۻKnf{ 3$?n$< z?9KӼCjZ]DvS$RÀsI8 թGA υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@G7q4píY,$3IN"K1s\,7uCj[Tej'!O?) [Tej'!O?)hi^;]i:fjWt2|aLgN(mTm/M8mm@128ؠg=9>E@k[m>r~$k6Ö7G5zsR%965i.1z2-b-%1 ۹H;jK5ĶMЅյւHb) O7 6m 9._ip\<\0dq+zh?SZI|L9/i6mkYpO{p^Uӝ,*$иgW8H$]umXþ%ZǢ=ȝ^,K"@ NF9-Ë7,mp Ho!YCmS8'z(/O;O-gi K_X9ɣ3ϔc0l9%ԧE-:Y.$$ȓ$aluwtQ0_[[RYI"KxVHV蚚15;/-ԲCATbUPz4V!$lyd;eG't-dKp"i?u#|LL\EmNTM:No=ސ>TϡȮ޾KEwps6֖$6 է<ˍmF2qC+,?3&& 2:7>!M99uHMG/*GUX8~/Erk2Jʬ% B74Yo'_>74Yo'?՟OB%SyZ?՟OB%SyV@=~((((((((((((((((((((((((((((((#EmE#Em@qY)_g7Y)_g7o^袊 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+>74Yo'_>74Yo'?՟OB%SyZ?~1jJN<)dqare=2$4ImA/i{9cQ\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΂A?ɿCY?6vOZKFUR9cW-|K/qvb7 e}\n_Onnce b1[C) T}NdO?v3Q~Y,/]QB>] zU8ݫ]ϖ+uYY..-$.wV)3-S]:TVleɎcbv32:0M mf J|]ϖ+i yfVRy IiWź Yhc3 ݜgi??-'7Z}5go?Ե?OtZxC!yg64p3;mx{+zP/DIi?ݏZ#xmeYTp *9cUg5]#G9x(˙6eN>zPg"WJ|j}.Im`}B+[=~c)dpy X/m*Ī~W8Cףڋi??-'7Z}SWcl'9v n`{yXdP$lYO 8"9DIEŌy7 wA]T::θ mmkkGs4;t##}VC*uMZRb[Xv,rZFRlل¨,X`ePpZ24?(Cl·5 -mc-ԓǪ9GY:0eaGz?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmVask2\Oڵq͏lD62yhc}}?aT4uEحVHnvhʶ%PhW.cs_zmٶ7W̎>TQ u@'ClšEc+w7ۿQV32]٢,ޡD̺YJ kUj-+跬hz3ʾK f T159qhG?TFW6 H~bIT+W9#4>x[1,Q=@\ӿ7H㷺d$Y q~rGrSUpJȫ'٫Aj!O[8Nd,[W /FI9T܇#8:զs'5dU'3W!cedӥ-@(V"K?uOǿMkV&60wt; X,6U f/4A"`iuxZC=w0yEw@UpIQGئoʩڜz 3kƫb2:33IܪŹ1V +n6yu60y!x 94<[`,-%\Ij+V];9ޣpp HuK7/feG<ՋfI C R(@I\^DԴbgͯm0Q"iILl`d0x#sy`|^#2@7:vXٕK0(ZhNb%qm&1*Xb= 0p}*m.P̅Tf8IZ߮M}檼GK~%<8 I*)Č ĥ匕&L/CtV< qrܥv aV+[N7 sw7K:g,x)˷s>^ FI G#}`ef `Ô%/vw/:ԵxEo/ټܻ1S"pnwrlc5x O 4kK.+ulNDK'8n1H?oxQLSOX^'L<+o44_捞yYYfm8a}~,QUg?pG)b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@+1?A}~]bDUuu;pr(_i]OմզBmn?S5hM #*8Gޣ?sϬG-EB& @򃟽'>uDpqw (nrxOC@ޣ?zH$ |WYϨY\%X҄21 c9=p8oQqG~? ք6dۛ2,WmhEU-8lS{"b  GL掶3_oQq¹؞K{mv<^t P3tRԬ.ݚuns@zm?/W-o u[8LП6unkVIባY%Di[laz _oQq¹SV:ZyOQHmGRw0'ٮv?kݟzyZf.dA w PB8Is߁}\c{k[K>V (f >ٮv?±#@$EYH 5xFg֬xOD-jo-hb}u?V? Z;H|?ʀ9KĈ$0wB10<ʲΥm3neiJ ڣn䑀ǃߧ}o?hUt;+9nXD PHRAv>5%[8&y- Y '%T9#}o?i=Jzᾶ4 ԟo?xCi }u?V?G&qkJYIgGb.,IS6o X2 ، r;5s)[+3%_kjo5%DMVrOA)yr_ ^Tm&8VGz/$O(?v•z¹m3K[_x|ڈf+*3>P  9Mc0;7lRC*K08c砡_p3{p?й"(#  (@sC\EhQ@.h+pEg?й"G4?V /`I=ɑNC6{ P$QsK/*"$ #7>#gMFv徝q{A4n xRzfG-t aC#nC|t4?[=W)xsVO*<[-fyʴFTH-cuzKK,Cl(pqHm#Kv*eAʩVMB?PӁB_Nu [m@ l[  =ɠ&ދ]0A0.h+hX>-$Ẻ-5ԥʒy+:.h+pE 3?\WX~2Ѵk_k[Z42dMYN: EuDmkPkJ/.'ۊiHUAEM<7u `Fjnj!N`{F($GV w^]?ԿdM4y.b_+nz y @-=umH,&c92y[2r03jK)$Jۥv ?MU_sj3]\ i.hAADą/MGVug63pʆhOXIҨ{o.tS5%BSHygq2IopGAnO̎4cH’r>ϩ X%Ѿx N[rsZ_@sC\E.h+ (?p?й"( G4?QB?Т9;C%>̐b#CA7} 8=NoG4?U}/F-?\g?й"G4?VB?EtFgր6.?S5hM #*ϸ_i]Oա7u A}Cy$svMF5]J z]+ ϥ n ?B*ͮRԷzHw=̆9B7CYCHvGi,+ ϥ n<)>5kIoZKX.䲑#EFɅvl=z [b";v!&8Y9DL9(p;}?vVKt(,L M<&Cʓittڳ8VK?XxS}/kwk??vVK(??vVK(&ៅXdYUul~4>x:)"I!Gƭ~O?/uCZ|aqsgu\Ymbx<8'(8$v?<)>5°_5hDOou=faѪ\H?˂q)u1#80wO#Jr#g%!K Ÿ}[;UL{>1kf4\ 5Y5*RƖ.,u4>O!#rƻ\Cum4:ݫ]ZX$xrí-B4(ӣƔ|,w7͔/3yy+ ϥ n<)>5jj6:U#-f]2Xi@3<|C)*G5Q@+ ϥ n<)>5Q@+ ϥ n6O6KGY[T WeEq i^!ye.rԱܚt_|ShQ\ah*6\C%ƣ$6SJnk|m$r0wVK?XxS}/kwk7JϹ5U$VqD(s i"1͌BЎ??vVK( Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP~Y/5 ,eU?Z?v?Ob8VK?XxS}/kwk8VK}u?V?g [f[PϕBKꦺ?I/D+_ҩk~mşRYcS"A%-mZSMH?Iy?#R{RWKmkyOOj82H(E\'PMGW1Eko8k]$̖rs{K]??=4}_O&/Zޥ֮59#HhdVmĈ5Wc)*_V'Ճg'5b@W/O'^}5jz|zcO^Ȑ!`ֻ9Y }]/w[/O'G$jw;Pr m DS#xg'P?Iy?EdsN/-/`܃[B#k*$j_4}_O&Q@/O'G$j_4}_O&Q@/O'P<}!?8LWUB)?PY-om5>DIHcڧ*d2Xϗ ds+KF{K 8!H{ʠlEc8`?5Y/iqkGIr 9D*ÐۜdIՏZq_Je*?Ob+ߓQ{~OV( /?U6赯_ El\@jЛAGUqBoiP)æ5ͼ)oQ%y1g3Jދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(mf).[?f'^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}Qf#pF\n~rAsPOoEEsPOoEEsPOoEEsPOoEEsPOoEEsPOoEEsPGE؁sp1ʓz/X?+:`z/X?+:`z/X?+:`z/X?+:`z/X?+:`z/X?+:3n]|ˍH??"(ދ?"(ދ}lZA\o-hb}u?V? Z;H|?ʀ+EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?oZ+El\@jЛAGUqBoiPz( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( m#}k]s6赠 Z Ӵ*)$Ɵv)8?S5l?zZ@y>߳Um]j,r3>[ uO QoA>WIno޿lQy9ࢀ.%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ Wik7w_:7WkR#(~pzՇ_ϙ^Kx?o5/-)7EeNv6?^F04j{j@$qӼm#}kEdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/Query.html0000644000175000017500000016355011520622074022213 0ustar directhexdirecthex
 

4. Querying


db4o supplies three querying systems, Query-By-Example (QBE) Native Queries (NQ), and the SODA API. In the previous chapter, you were briefly introduced to Query By Example(QBE).

Query-By-Example (QBE) is appropriate as a quick start for users who are still acclimating to storing and retrieving objects with db4o.

 
LINQ is the recommended db4o querying interface for .NET platforms. 

SODA is the underlying internal API. It is provided for backward compatibility and it can be useful for dynamic generation of queries, where LINQ and  NQ are too strongly typed.



    4.1. Query by Example (QBE)


    When using Query By Example (QBE) you provide db4o with a template object. db4o will return all of the objects which match all non-default field values. This is done via reflecting all of the fields and building a query expression where all non-default-value fields are combined with AND expressions. Here's an example from the previous chapter:

    // retrievePilotByName
    Pilot proto = new Pilot("Michael Schumacher", 0);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    Querying this way has some obvious limitations:
    - db4o must reflect all members of your example object.
    - You cannot perform advanced query expressions. (AND, OR, NOT, etc.)
    - You cannot constrain on values like 0 (integers), "" (empty strings), or nulls (reference types) because they would be interpreted as unconstrained.
    - You need to be able to create objects without initialized fields. That means you can not initialize fields where they are declared. You can not enforce contracts that objects of a class are only allowed in a well-defined initialized state.
    - You need a constructor to create objects without initialized fields.

    To get around all of these constraints, db4o provides the Native Query (NQ) system.




    4.2. Native Queries


    Wouldn't it be nice to pose queries in the programming language that you are using? Wouldn't it be nice if all your query code was 100% typesafe, 100% compile-time checked and 100% refactorable? Wouldn't it be nice if the full power of object-orientation could be used by calling methods from within queries? Enter Native Queries.

    Native queries are the main db4o query interface and they are the recommended way to query databases from your application. Because native queries simply use the semantics of your programming language, they are perfectly standardized and a safe choice for the future.

    Native Queries are available for all platforms supported by db4o.


      4.2.1. Concept

      The concept of native queries is taken from the following two papers:

      - Cook/Rosenberger, Native Queries for Persistent Objects, A Design White Paper
      - Cook/Rai, Safe Query Objects: Statically Typed Objects as Remotely Executable Queries


      4.2.2. Principle

      Native Queries provide the ability to run one or more lines of code against all instances of a class. Native query expressions should return true to mark specific instances as part of the result set. db4o will attempt to optimize native query expressions and run them against indexes and without instantiating actual objects, where this is possible.


      4.2.3. Simple Example

      Let's look at how a simple native query will look like in some of the programming languages and dialects that db4o supports:

      C# .NET (using generics)
      IList <Pilot> pilots = db.Query <Pilot> (delegate(Pilot pilot) {
          return pilot.Points == 100;
      });
       

      Java JDK 5
      List <Pilot> pilots = db.query(new Predicate<Pilot>() {
          public boolean match(Pilot pilot) {
              return pilot.getPoints() == 100;
          }
      });


      Java JDK 1.2 to 1.4
      List pilots = db.query(new Predicate() {
          public boolean match(Pilot pilot) {
              return pilot.getPoints() == 100;
          }
      });


      Java JDK 1.1
      ObjectSet pilots = db.query(new PilotHundredPoints());

      public static class PilotHundredPoints extends Predicate {
          public boolean match(Pilot pilot) {
              return pilot.getPoints() == 100;
          }
      }


      C# .NET (not using generics)
      IList pilots = db.Query(new PilotHundredPoints());

      public class PilotHundredPoints : Predicate {
          public boolean Match(Pilot pilot) {
              return pilot.Points == 100;
          }
      }


      VB .NET (not using generics)
      Dim pilots As IList = db.Query(new PilotHundredPoints())

      Public Class PilotHundredPoints
          Inherits Predicate
          Public Function Match (pilot As Pilot) as Boolean
              If pilot.Points = 100 Then
                  Return True
              Else
                  Return False
          End Function
      End Class


      A side note on the above syntax:
      For all dialects without support for generics, Native Queries work by convention. A class that extends the com.db4o.Predicate class is expected to have a boolean #Match() method with one parameter to describe the class extent:

       
      bool Match(Pilot candidate);
        

      When using native queries, don't forget that modern integrated development environments (IDEs) can do all the typing work around the native query expression for you, if you use templates and auto-completion.

      The following example shows how to create an autocompletion code snippet in Visual Studio 2005.
      Create a "nq.snippet" file in any text editor.
      Paste the following code:

       <?xml version="1.0" encoding="utf-8" ?>
      <CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
          <CodeSnippet Format="1.0.0">
              <Header>
                  <Title>NQ</Title>
                  <Shortcut>NQ</Shortcut>
                  <Description>Code snippet for Native Query</Description>
                  <Author>db4objects Inc.</Author>
                  <SnippetTypes>
                      <SnippetType>Expansion</SnippetType>
                  </SnippetTypes>
              </Header>
              <Snippet>
                  <Declarations>
                      <Literal>
                          <ID>type</ID>
                          <ToolTip>Type</ToolTip>
                          <Default>MyType</Default>
                      </Literal>
                      <Literal>
                          <ID>var</ID>
                          <ToolTip>variable</ToolTip>
                          <Default>myType</Default>
                      </Literal>
                      <Literal>
                          <ID>expression</ID>
                          <ToolTip>Boolean expression</ToolTip>
                          <Default>return true;</Default>
                      </Literal>
                  </Declarations>
                  <Code Language="csharp"><![CDATA[ IList<$type$> list = db.Query<$type$>(delegate($type$ $var$)
                      {
                          $expression$
                      });]]>
                  </Code>
              </Snippet>
          </CodeSnippet>
      </CodeSnippets>
       

      Save the file.
      In the Visual Studio 2005 open Tools/Code SnippetsManager
      Select language "Visual c#" if not yet selected. Press "Import..." button and select the newly created file. Select "Visual c#" as the location and press "Finish" button.
      Now you can use the snippet by selecting it from "Edit/InstelliSense/Insert Snippet..." menu.



      4.2.4. Advanced Example

      For complex queries, the native syntax is very precise and quick to write. Let's compare to a SODA query that finds all pilots with a given name or a score within a given range:

      // storePilots
      db.Store(new Pilot("Michael Schumacher", 100));
      db.Store(new Pilot("Rubens Barrichello", 99));


      // retrieveComplexSODA
      IQuery query=db.Query();
      query.Constrain(typeof(Pilot));
      IQuery pointQuery=query.Descend("_points");
      query.Descend("_name").Constrain("Rubens Barrichello")
          .Or(pointQuery.Constrain(99).Greater()
          .And(pointQuery.Constrain(199).Smaller()));
      IObjectSet result=query.Execute();
      ListResult(result);


      Here is how the same query will look like with native query syntax, fully accessible to autocompletion, refactoring and other IDE features, fully checked at compile time:

      C# .NET 2.0
      IList <Pilot> result = db.Query<Pilot> (delegate(Pilot pilot) {
          return pilot.Points > 99
              && pilot.Points < 199
              || pilot.Name == "Rubens Barrichello";
      });
       

      Java JDK 5
      List <Pilot> result = db.query(new Predicate<Pilot>() {
          public boolean match(Pilot pilot) {
              return pilot.getPoints() > 99
                  && pilot.getPoints() < 199
                  || pilot.getName().equals("Rubens Barrichello");
         }
      });



      4.2.5. Arbitrary Code

      Basically that's all there is to know about native queries to be able to use them efficiently. In principle you can run arbitrary code as native queries, you just have to be very careful with side effects - especially those that might affect persistent objects.

      Let's run an example that involves some more of the language features available.
      using Db4objects.Db4o.Query;
      namespace Db4odoc.Tutorial.F1.Chapter1
      {
          public class ArbitraryQuery : Predicate
          {
              private int[] _points;
              
              public ArbitraryQuery(int[] points)
              {
                  _points=points;
              }
          
              public bool Match(Pilot pilot)
              {
                  foreach (int points in _points)
                  {
                      if (pilot.Points == points)
                      {
                          return true;
                      }
                  }
                  return pilot.Name.StartsWith("Rubens");
              }
          }
      }




      4.2.6. Native Query Performance

      One drawback of native queries has to be pointed out: Under the hood db4o tries to analyze native queries to convert them to SODA. This is not possible for all queries. For some queries it is very difficult to analyze the flowgraph. In this case db4o will have to instantiate some of the persistent objects to actually run the native query code. db4o will try to analyze parts of native query expressions to keep object instantiation to the minimum.

      The development of the native query optimization processor will be an ongoing process in a close dialog with the db4o community. Feel free to contribute your results and your needs by providing feedback to our db4o forums(Forums are accessible through free db4o membership  ).


      With the current implementation, all above examples will run optimized, except for the "Arbitrary Code" example - we are working on it.


      4.2.7. Full source


      using System;
      using System.IO;
      using Db4objects.Db4o;
      using Db4objects.Db4o.Query;
      using Db4odoc.Tutorial;
      namespace Db4odoc.Tutorial.F1.Chapter1
      {
          public class NQExample : Util
          {
              readonly static string YapFileName = Path.Combine(
                                     Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                     "formula1.yap");  
              
              public static void Main(string[] args)
              {
                  using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                  {
                      StorePilots(db);
                      RetrieveComplexSODA(db);
                      RetrieveComplexNQ(db);
                      RetrieveArbitraryCodeNQ(db);
                      ClearDatabase(db);
                  }
              }
          
              public static void StorePilots(IObjectContainer db)
              {
                  db.Store(new Pilot("Michael Schumacher", 100));
                  db.Store(new Pilot("Rubens Barrichello", 99));
              }
          
              public static void RetrieveComplexSODA(IObjectContainer db)
              {
                  IQuery query=db.Query();
                  query.Constrain(typeof(Pilot));
                  IQuery pointQuery=query.Descend("_points");
                  query.Descend("_name").Constrain("Rubens Barrichello")
                      .Or(pointQuery.Constrain(99).Greater()
                      .And(pointQuery.Constrain(199).Smaller()));
                  IObjectSet result=query.Execute();
                  ListResult(result);
              }
              public static void RetrieveComplexNQ(IObjectContainer db)
              {
                  IObjectSet result = db.Query(new ComplexQuery());
                  ListResult(result);
              }
              public static void RetrieveArbitraryCodeNQ(IObjectContainer db)
              {
                  IObjectSet result = db.Query(new ArbitraryQuery(new int[]{1,100}));
                  ListResult(result);
              }
          
              public static void ClearDatabase(IObjectContainer db)
              {
                  IObjectSet result = db.QueryByExample(typeof(Pilot));
                  while (result.HasNext())
                  {
                      db.Delete(result.Next());
                  }
              }
          }
      }


      using Db4objects.Db4o.Query;
      namespace Db4odoc.Tutorial.F1.Chapter1
      {
          public class ComplexQuery : Predicate
          {
              public bool Match(Pilot pilot)
              {
                  return pilot.Points > 99
                      && pilot.Points < 199
                      || pilot.Name=="Rubens Barrichello";
              }
          }
      }

      using Db4objects.Db4o.Query;
      namespace Db4odoc.Tutorial.F1.Chapter1
      {
          public class ArbitraryQuery : Predicate
          {
              private int[] _points;
              
              public ArbitraryQuery(int[] points)
              {
                  _points=points;
              }
          
              public bool Match(Pilot pilot)
              {
                  foreach (int points in _points)
                  {
                      if (pilot.Points == points)
                      {
                          return true;
                      }
                  }
                  return pilot.Name.StartsWith("Rubens");
              }
          }
      }





    4.3. LINQ


    db4o querying syntax has got even easier with the introduction of .NET LINQ queries. LINQ allows you to write compile checked db4o queries, which can be refactored automatically when a field name changes and which are supported by code auto-completion tools.
    In order to use LINQ you will need to add reference to Db4objects.Db4o.Linq.dll and usage to your program class:
    using System.Linq;
    using Db4objects.Db4o.Linq;
     

    If you are already familiar with LINQ syntax, you can just start writing LINQ to query db4o.  Otherwise you may want to familiarise yourself with LINQ resources on http://msdn2.microsoft.com/en-us/library/bb397926.aspx MSDN.

    Note that LINQ requires at least .NET 3.5.


      4.3.1. Linq Examples

      Let's prepare some objects in our database to query against:
      // storeObjects
      db.Store(new Car("Ferrari", (new Pilot("Michael Schumacher", 100))));
      db.Store(new Car("BMW", (new Pilot("Rubens Barrichello", 99))));


      The simplest LINQ query will look like this:
      // retrievePilot
      IEnumerable<Pilot> result = from Pilot p in db
                                  where p.Name.StartsWith("Michael")
                                  select p;
      ListResult(result);

      You can see that we are using db4o object container as a datasource, the rest of the syntax is generic to all LINQ queries.

      Now let's try a bit more complex selection:
      // retrievePilotByCar
      IEnumerable<Pilot> result = from Car c in db
                                  where c.Model.StartsWith("F")
                                  && (c.Pilot.Points > 99 && c.Pilot.Points <150)
                                  select c.Pilot;
      ListResult(result);

      So we can constrain on one object and retrieve a list of others. You can even create completely new objects based on the retrieved information using select new MyObject(field1, field2...). Try to experiment with different LINQ queries against db4o database.


      4.3.2. Performance

      db4o query processor is based on SODA queries, therefore LINQ query is analysed and converted to SODA syntax in the runtime. However, in some cases this conversion is not possible. This can happen when query is constrained against aggregates or projections of a field value and in other cases when SODA equivalent does not exists. For example:
      // retrievePilotUnoptimized
      IEnumerable<Pilot> result = from Pilot p in db
                                  where (p.Points - 81) == p.Name.Length
                                  select p;
      ListResult(result);

      The query still works, but it requires instantiation of all candidate objects, which is much less performant than SODA query.


      4.3.3. LINQ for Compact Framework

      Compact Framework version 3.5 contains LINQ implementation for querying objects, however it does not contain the namespace System.Linq.Expressions, which is used by all optimized LINQ providers. Luckily there is a solution to this problem. Mono implementation of System.Core can be used to support optimized LINQ providers and expression interpreter contributed by Mainsoft  to Mono's System.Core can be used to support full LINQ expression trees.

      These assemblies were used by db4o team to compile a new assembly, System.Linq.Expressions.dll, which provides LINQ support to .NET Compact Framework 3.5. In order to use the full LINQ functionality including optimisation, add a reference to System.Linq.Expressions.dll in your project and enjoy.

      System.Linq.Expressions.dll can be found in bin\compact-3.5 folder of your distribution. You can also examine the code in src\Libs\compact-3.5\System.Linq.Expressions or db4o SVN  .







    4.4. SODA Query API


    The SODA query API is db4o's low level querying API, allowing direct access to nodes of query graphs. Since SODA uses strings to identify fields, it is neither perfectly typesafe nor compile-time checked and it also is quite verbose to write.

    For most applications LINQ  andNative Queries will be the better querying interface.

    However there can be applications where dynamic generation of queries is required, that's why SODA is explained here.


      4.4.1. Simple queries


      Let's see how our familiar QBE queries are expressed with SODA. A new Query object is created through the #Query() method of the ObjectContainer and we can add Constraint instances to it. To find all Pilot instances, we constrain the query with the Pilot class object.

      // retrieveAllPilots
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      IObjectSet result = query.Execute();
      ListResult(result);


      Basically, we are exchanging our 'real' prototype for a meta description of the objects we'd like to hunt down: a query graph made up of query nodes and constraints. A query node is a placeholder for a candidate object, a constraint decides whether to add or exclude candidates from the result.

      Our first simple graph looks like this.



      We're just asking any candidate object (here: any object in the database) to be of type Pilot to aggregate our result.

      To retrieve a pilot by name, we have to further constrain the candidate pilots by descending to their name field and constraining this with the respective candidate String.

      // retrievePilotByName
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_name").Constrain("Michael Schumacher");
      IObjectSet result = query.Execute();
      ListResult(result);


      What does  #Descend  mean here? Well, just as we did in our 'real' prototypes, we can attach constraints to child members of our candidates.




      So a candidate needs to be of type Pilot and have a member named'_name' that is equal to the given String to be accepted for the result.

      Note that the class constraint is not required: If we left it out, we would query for all objects that contain a'_name'  member with the given value. In most cases this will not be the desired behavior, though.

      Finding a pilot by exact points is analogous.

      // retrievePilotByExactPoints
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_points").Constrain(100);
      IObjectSet result = query.Execute();
      ListResult(result);



      4.4.2. Advanced queries


      Now there are occasions when we don't want to query for exact field values, but rather for value ranges, objects not containing given member values, etc. This functionality is provided by the Constraint API.

      First, let's negate a query to find all pilots who are not Michael Schumacher:

      // retrieveByNegation
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_name").Constrain("Michael Schumacher").Not();
      IObjectSet result = query.Execute();
      ListResult(result);


      Where there is negation, the other boolean operators can't be too far.

      // retrieveByConjunction
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      IConstraint constr = query.Descend("_name")
              .Constrain("Michael Schumacher");
      query.Descend("_points")
              .Constrain(99).And(constr);
      IObjectSet result = query.Execute();
      ListResult(result);


      // retrieveByDisjunction
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      IConstraint constr = query.Descend("_name")
              .Constrain("Michael Schumacher");
      query.Descend("_points")
              .Constrain(99).Or(constr);
      IObjectSet result = query.Execute();
      ListResult(result);


      We can also constrain to a comparison with a given value.

      // retrieveByComparison
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_points")
              .Constrain(99).Greater();
      IObjectSet result = query.Execute();
      ListResult(result);


      The query API also allows to query for field default values. 
      // retrieveByDefaultFieldValue
      Pilot somebody = new Pilot("Somebody else", 0);
      db.Store(somebody);
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_points").Constrain(0);
      IObjectSet result = query.Execute();
      ListResult(result);
      db.Delete(somebody);


      It is also possible to have db4o sort the results.

      // retrieveSorted
      IQuery query = db.Query();
      query.Constrain(typeof(Pilot));
      query.Descend("_name").OrderAscending();
      IObjectSet result = query.Execute();
      ListResult(result);
      query.Descend("_name").OrderDescending();
      result = query.Execute();
      ListResult(result);


      All these techniques can be combined arbitrarily, of course. Please try it out. There still may be cases left where the predefined query API constraints may not be sufficient - don't worry, you can always let db4o run any arbitrary code that you provide in an Evaluation. Evaluations will be discussed in a later chapter.

      To prepare for the next chapter, let's clear the database.

      // clearDatabase
      IObjectSet result = db.QueryByExample(typeof(Pilot));
      foreach (object item in result)
      {
          db.Delete(item);
      }



      4.4.3. Conclusion

      Now you have been provided with the following alternative approaches to query db4o databases: Query-By-Example,.? net  LINQ,  Native Queries, SODA.

      Which one is the best to use? Some hints:
      - LINQ is a standard typesafe queries for .NET languages and is recommended for use with .NET version of db4o.
      - Native queries are targeted to be the primary interface for db4o, so they should be preferred.
      - With the current state of the db4o query optimizer there may be queries that will execute faster in SODA style, so it can be used to tune applications. SODA can also be more convenient for constructing dynamic queries at runtime.
      - Query-By-Example is nice for simple one-liners, but restricted in functionality. If you like this approach, use it as long as it suits your application's needs.

      Of course you can mix these strategies as needed.

      We have finished our walkthrough and seen the various ways db4o provides to pose queries. But our domain model is not complex at all, consisting of one class only. Let's have a look at the way db4o handles object associations in the next chapter .


      4.4.4. Full source


      using System;
      using System.IO;
      using Db4objects.Db4o;
      using Db4objects.Db4o.Query;
      using Db4odoc.Tutorial;
      namespace Db4odoc.Tutorial.F1.Chapter1
      {
          public class QueryExample : Util
          {
              readonly static string YapFileName = Path.Combine(
                                     Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                     "formula1.yap");  
              public static void Main(string[] args)
              {
                  using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                  {
                      StoreFirstPilot(db);
                      StoreSecondPilot(db);
                      RetrieveAllPilots(db);
                      RetrievePilotByName(db);
                      RetrievePilotByExactPoints(db);
                      RetrieveByNegation(db);
                      RetrieveByConjunction(db);
                      RetrieveByDisjunction(db);
                      RetrieveByComparison(db);
                      RetrieveByDefaultFieldValue(db);
                      RetrieveSorted(db);
                      ClearDatabase(db);
                  }
              }
          
              public static void StoreFirstPilot(IObjectContainer db)
              {
                  Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                  db.Store(pilot1);
                  Console.WriteLine("Stored {0}", pilot1);
              }
          
              public static void StoreSecondPilot(IObjectContainer db)
              {
                  Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                  db.Store(pilot2);
                  Console.WriteLine("Stored {0}", pilot2);
              }
          
              public static void RetrieveAllPilots(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrievePilotByName(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_name").Constrain("Michael Schumacher");
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
              
              public static void RetrievePilotByExactPoints(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_points").Constrain(100);
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrieveByNegation(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_name").Constrain("Michael Schumacher").Not();
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrieveByConjunction(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  IConstraint constr = query.Descend("_name")
                          .Constrain("Michael Schumacher");
                  query.Descend("_points")
                          .Constrain(99).And(constr);
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrieveByDisjunction(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  IConstraint constr = query.Descend("_name")
                          .Constrain("Michael Schumacher");
                  query.Descend("_points")
                          .Constrain(99).Or(constr);
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrieveByComparison(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_points")
                          .Constrain(99).Greater();
                  IObjectSet result = query.Execute();
                  ListResult(result);
              }
          
              public static void RetrieveByDefaultFieldValue(IObjectContainer db)
              {
                  Pilot somebody = new Pilot("Somebody else", 0);
                  db.Store(somebody);
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_points").Constrain(0);
                  IObjectSet result = query.Execute();
                  ListResult(result);
                  db.Delete(somebody);
              }
              
              public static void RetrieveSorted(IObjectContainer db)
              {
                  IQuery query = db.Query();
                  query.Constrain(typeof(Pilot));
                  query.Descend("_name").OrderAscending();
                  IObjectSet result = query.Execute();
                  ListResult(result);
                  query.Descend("_name").OrderDescending();
                  result = query.Execute();
                  ListResult(result);
              }
          
              public static void ClearDatabase(IObjectContainer db)
              {
                  IObjectSet result = db.QueryByExample(typeof(Pilot));
                  foreach (object item in result)
                  {
                      db.Delete(item);
                  }
              }
          }
      }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/docs_ie.css0000644000175000017500000000056611520622074022334 0ustar directhexdirecthex.console { z-index: 1; color: #F4F4F4; position: absolute; bottom: 0px; left: 0px; width: 100%; height: 150px; margin: 0px; overflow: hidden; } div#pagecontainer { height: 100%; width: 100%; overflow: auto; margin: 0px; } html,body { overflow: hidden; height: 100%; margin: 0px; } .button { background-color: #BB0000; color: #FFFFFF; }db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Transactions.html0000644000175000017500000003303011520622074023543 0ustar directhexdirecthex
 

9. Transactions


Probably you have already wondered how db4o handles concurrent access to a single database. Just as any other DBMS, db4o provides a transaction mechanism. Before we take a look at multiple, perhaps even remote, clients accessing a db4o instance in parallel, we will introduce db4o transaction concepts in isolation.


    9.1. Commit and rollback


    You may not have noticed it, but we have already been working with transactions from the first chapter on. By definition, you are always working inside a transaction when interacting with db4o. A transaction is implicitly started when you open a container, and the current transaction is implicitly committed when you close it again. So the following code snippet to store a car is semantically identical to the ones we have seen before; it just makes the commit explicit.

    // storeCarCommit
    Pilot pilot = new Pilot("Rubens Barrichello", 99);
    Car car = new Car("BMW");
    car.Pilot = pilot;
    db.Store(car);
    db.Commit();


    // listAllCars
    IObjectSet result = db.QueryByExample(typeof(Car));
    ListResult(result);


    However, we can also rollback the current transaction, resetting the state of our database to the last commit point.

    // storeCarRollback
    Pilot pilot = new Pilot("Michael Schumacher", 100);
    Car car = new Car("Ferrari");
    car.Pilot = pilot;
    db.Store(car);
    db.Rollback();


    // listAllCars
    IObjectSet result = db.QueryByExample(typeof(Car));
    ListResult(result);



    9.2. Refresh live objects


    There's one problem, though: We can roll back our database, but this cannot automagically trigger a rollback for our live objects.

    // carSnapshotRollback
    IObjectSet result = db.QueryByExample(new Car("BMW"));
    Car car = (Car)result.Next();
    car.Snapshot();
    db.Store(car);
    db.Rollback();
    Console.WriteLine(car);


    We will have to explicitly refresh our live objects when we suspect they may have participated in a rollback transaction.

    // carSnapshotRollbackRefresh
    IObjectSet result=db.QueryByExample(new Car("BMW"));
    Car car=(Car)result.Next();
    car.Snapshot();
    db.Store(car);
    db.Rollback();
    db.Ext().Refresh(car, int.MaxValue);
    Console.WriteLine(car);


    What is this #Ext() construct good for? Well, it provides some functionality that is in itself stable, but the API may still be subject to change. As soon as we are confident that no more changes will occur,  #Ext()  functionality will be transferred to the common IObjectContainer API.

    Finally, we clean up again.

    // deleteAll
    IObjectSet result = db.QueryByExample(typeof(Object));
    foreach (object item in result)
    {
        db.Delete(item);
    }



    9.3. Conclusion


    We have seen how transactions work for a single client. In the Client/Server chapter  we will see how the transaction concept extends to multiple clients, whether they are located within the same runtime or on a remote machine.

    Let't first revisit Activation again in the next chapter and take a look at how db4o can take care of our Object lifecycle automatically.


    9.4. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        public class TransactionExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                using (IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreCarCommit(db);
                }
                using (IObjectContainer db = Db4oEmbedded.OpenFile( YapFileName))
                {
                    ListAllCars(db);
                    StoreCarRollback(db);
                }
                using (IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    ListAllCars(db);
                    CarSnapshotRollback(db);
                    CarSnapshotRollbackRefresh(db);
                }
            }
            
            public static void StoreCarCommit(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Rubens Barrichello", 99);
                Car car = new Car("BMW");
                car.Pilot = pilot;
                db.Store(car);
                db.Commit();
            }
        
            public static void ListAllCars(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(Car));
                ListResult(result);
            }
            
            public static void StoreCarRollback(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Michael Schumacher", 100);
                Car car = new Car("Ferrari");
                car.Pilot = pilot;
                db.Store(car);
                db.Rollback();
            }
        
            public static void CarSnapshotRollback(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("BMW"));
                Car car = (Car)result.Next();
                car.Snapshot();
                db.Store(car);
                db.Rollback();
                Console.WriteLine(car);
            }
        
            public static void CarSnapshotRollbackRefresh(IObjectContainer db)
            {
                IObjectSet result=db.QueryByExample(new Car("BMW"));
                Car car=(Car)result.Next();
                car.Snapshot();
                db.Store(car);
                db.Rollback();
                db.Ext().Refresh(car, int.MaxValue);
                Console.WriteLine(car);
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/First.html0000644000175000017500000005676411520622074022205 0ustar directhexdirecthex
 

2. First Steps


Let's get started as simple as possible. We are going to demonstrate how to store, retrieve, update and delete instances of a single class that only contains primitive and String members. In our example this will be a Formula One (F1) pilot whose attributes are his name and the F1 points he has already gained this season.

First we create a class to hold our data. It looks like this:

namespace Db4odoc.Tutorial.F1.Chapter1
{
    public class Pilot
    {
        string _name;
        int _points;
        
        public Pilot(string name, int points)
        {
            _name = name;
            _points = points;
        }
        
        public string Name
        {
            get
            {
                return _name;
            }
        }
        
        public int Points
        {
            get
            {
                return _points;
            }
        }   
        
        public void AddPoints(int points)
        {
            _points += points;
        }    
        
        override public string ToString()
        {
            return string.Format("{0}/{1}", _name, _points);
        }
    }
}


Notice that this class does not contain any db4o-related code.


    2.1. Opening the database


    To access a db4o database file or create a new one, call DB4OEMBEDDED.OPENFILE() and provide Db4oEmbedded.newConfiguration() as a configuration template and the path to your database file as the second parameter, to obtain an IObjectContainer instance. IObjectContainer represents "The Database", and will be your primary interface to db4o. Closing the IObjectContainer with the #Close() method will close the database file and release all resources associated with it.

    // accessDb4o
    using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
    {
        // do something with db4o
    }


    Db4oFileName  is just a string value representing any filename. If the file with this name already exists, it will be opened as db4o database, otherwise a new db4o database will be created.
    For the following examples we will assume that our environment takes care of opening and closing the IObjectContainer automagically, and stores the reference in a variable named 'db'.


    2.2. Storing objects


    To store an object, we simply call #Store() on our database, passing any object as a parameter.

    // storeFirstPilot
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    db.Store(pilot1);
    Console.WriteLine("Stored {0}", pilot1);


    We'll need a second pilot, too.

    // storeSecondPilot
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    db.Store(pilot2);
    Console.WriteLine("Stored {0}", pilot2);



    2.3. Retrieving objects


    The easiest way to see the content of our database is to use Object Manager Enterprise, which will be introduced in the next chapter . For now let's continue with the API overview and learn how to build db4o queries.
    db4o supplies several different querying systems, Query by Example (QBE), LINQ, Native Queries (NQ) and the SODA Query API (SODA). In this first example we will introduce QBE. Once you are familiar with storing objects, we encourage you to use LINQ .

    When using Query-By-Example, you create a prototypical object for db4o to use as an example of what you wish to retrieve. db4o will retrieve all objects of the given type that contain the same (non-default) field values as the example. The results will be returned as an  IObjectSet instance. We will use a convenience method #ListResult() to display the contents of our result IObjectSet :

    public static void ListResult(IObjectSet result)
    {
        Console.WriteLine(result.Count);
        foreach (object item in result)
        {
            Console.WriteLine(item);
        }
    }


    To retrieve all pilots from our database, we provide an 'empty' prototype:

    // retrieveAllPilotQBE
    Pilot proto = new Pilot(null, 0);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    Note that we specify 0 points, but our results were not constrained to only those Pilots with 0 points; 0 is the default value for int fields.

    db4o also supplies a shortcut to retrieve all instances of a class:

    // retrieveAllPilots
    IObjectSet result = db.QueryByExample(typeof(Pilot));
    ListResult(result);


    For .NET  there also is a generics shortcut, using the query method:


    IList <Pilot> pilots = db.Query<Pilot>(typeof(Pilot));


    To query for a pilot by name:

    // retrievePilotByName
    Pilot proto = new Pilot("Michael Schumacher", 0);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    And to query for Pilots with a specific number of points:

    // retrievePilotByExactPoints
    Pilot proto = new Pilot(null, 100);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);



    Of course there's much more to db4o queries. They will be covered in more depth in later chapters.


    2.4. Updating objects


    Updating objects is just as easy as storing them. In fact, you use the same #Store() method to update your objects: just call #Store() again after modifying any object.

    // updatePilot
    IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
    Pilot found = (Pilot)result.Next();
    found.AddPoints(11);
    db.Store(found);
    Console.WriteLine("Added 11 points for {0}", found);
    RetrieveAllPilots(db);


    Notice that we query for the object first. This is an importaint point. When you call #Store() to modify a stored object, if the object is not 'known' (having been previously stored or retrieved during the current session), db4o will insert a new object. db4o does this because it does not automatically match up objects to be stored, with objects previously stored. It assumes you are inserting a second object which happens to have the same field values.

    To make sure you've updated the pilot, please return to any of the retrieval examples above and run them again.


    2.5. Deleting objects


    Objects are removed from the database using the #Delete() method.

    // deleteFirstPilotByName
    IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
    Pilot found = (Pilot)result.Next();
    db.Delete(found);
    Console.WriteLine("Deleted {0}", found);
    RetrieveAllPilots(db);


    Let's delete the other one, too.

    // deleteSecondPilotByName
    IObjectSet result = db.QueryByExample(new Pilot("Rubens Barrichello", 0));
    Pilot found = (Pilot)result.Next();
    db.Delete(found);
    Console.WriteLine("Deleted {0}", found);
    RetrieveAllPilots(db);


    Please check the deletion with the retrieval examples above.

    As with updating objects, the object to be deleted has to be 'known' to db4o. It is not sufficient to provide a prototype object with the same field values.


    2.6. Conclusion


    That was easy, wasn't it? We have stored, retrieved, updated and deleted objects with a few lines of code. Now you are probably interested to see how the database looks like. Let's have a look using db4o graphical tool - Object Manager in the next chapter .


    2.7. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Query;
    using Db4odoc.Tutorial;
    namespace Db4odoc.Tutorial.F1.Chapter1
    {
        public class FirstStepsExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                AccessDb4o();
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreFirstPilot(db);
                    StoreSecondPilot(db);
                    RetrieveAllPilots(db);
                    RetrievePilotByName(db);
                    RetrievePilotByExactPoints(db);
                    UpdatePilot(db);
                    DeleteFirstPilotByName(db);
                    DeleteSecondPilotByName(db);
                }
            }
            public static void AccessDb4o()
            {
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    // do something with db4o
                }
            }
            public static void StoreFirstPilot(IObjectContainer db)
            {
                Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                db.Store(pilot1);
                Console.WriteLine("Stored {0}", pilot1);
            }
            public static void StoreSecondPilot(IObjectContainer db)
            {
                Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                db.Store(pilot2);
                Console.WriteLine("Stored {0}", pilot2);
            }
            public static void RetrieveAllPilotQBE(IObjectContainer db)
            {
                Pilot proto = new Pilot(null, 0);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            public static void RetrieveAllPilots(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(Pilot));
                ListResult(result);
            }
            public static void RetrievePilotByName(IObjectContainer db)
            {
                Pilot proto = new Pilot("Michael Schumacher", 0);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            public static void RetrievePilotByExactPoints(IObjectContainer db)
            {
                Pilot proto = new Pilot(null, 100);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            public static void UpdatePilot(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
                Pilot found = (Pilot)result.Next();
                found.AddPoints(11);
                db.Store(found);
                Console.WriteLine("Added 11 points for {0}", found);
                RetrieveAllPilots(db);
            }
            public static void DeleteFirstPilotByName(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
                Pilot found = (Pilot)result.Next();
                db.Delete(found);
                Console.WriteLine("Deleted {0}", found);
                RetrieveAllPilots(db);
            }
            public static void DeleteSecondPilotByName(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Pilot("Rubens Barrichello", 0));
                Pilot found = (Pilot)result.Next();
                db.Delete(found);
                Console.WriteLine("Deleted {0}", found);
                RetrieveAllPilots(db);
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME_Attr.jpg0000644000175000017500000006522111520622074022330 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((D"c  !1"AQTV45RSas#267Uquv$3BWrt%b&CDdcEF)12!QA"aq ?ZS7 |\IlmKr55Ad%JXmJvNIIWV= t 텶!R{`ڲ(+fiҷP1=ڷIJH5yrtPlHCnSIDN4e+scl` ٯ2̫GU'e* I!/g :%[]a9㢪 ,KPv0e Ādt+y#q&:SIYFkCߊ*26Ea|"{DÚL8(CJ!YJAk*}2PBRD`q%P㶄 ` TijDh RӠoF3[ kfk.Ӱ;swޝ=sn9v".<xtնm72+y+֔ݽPXÎzCG[8^mD-oќ&Sru[`R%l" ʐRˤF)}OC䌠}9ɪT%EKh[`KE; # (;ҥmm%MuDXbb'u/4T#}SmXǶ*^53'COvOO-5[DJ_8i*A-C104d-$ 'pA8968bSquehHg9PTј_4_4ue-B"%3YȌF01鯽; ʹKxJRqEep-0~ͅN-Yi4S^u-j3lp Î ҧU {;_"-"@F$g'frdse*Jiҵ% l(8ȯܛ.6Sϻ!kQF +uJQI h&,A8)H}#gm[; p3TxIu\y @JT) BՔv*Cޢ( Q2*ttMLu;*OybДHJBX:+uݫ Y^(4"u&LRQ״rO%jB6;:˭-W[`ʌP6TV:-MA*J8ҭM (Ւ+銆mW|\BvH#wI٨Ci aDo-+rN(3-ۅiM+dHK1Ky qqH)@&ozūTnn^4EAu x-ȍ -Je`rYsb]32,S(CS[6HC*-+*NBUۅh^ G rp6 d@alv! ^'w[7x=ד4[#UwSߣο"=1ĭJS\1 (+í(teIS{8;JS}vŦyO8A.Iuýk$$Nkc͸Mj"B2@oag~+ Qݐ"~/_,Qԑv4m|ZT ENP6If$q% O޺‡{$`Ffo2 $8% @$! JARY3_㴅m^F㺠Rm>!%,)۽EĄ%)c*'e#\K/\K*pFq[KJӋJs zZ{Y48Ĩ(9!X8#cO^޼q\L\G%@2xG YڲH8{(vvT'mwHG$mD') k3od1vSIbk+[ChH8Rˉ=*1ӑK ƹleRB_ܤyՁ:F6B6v$:2vA8RjcPGrais2Krx ulrp?9f` -6 P)FGߧynX&31ε-H*QJJʻ>D ̨;.ijגpS+*ŸP2:kaԱ":ZIguԬ'A\J?=fZnL[yյFOlv 42)" mGC{ HNҶ_$H{Tۗ >q:\WY׬$ *szՐV(R쒐MdV5 <] zT4zSa^4zSa^4zSa^4zSa^4zSa^4zSa^4zSa^WeIbcqp7pf~Lخ Hienޗ TC|*@RFV1uZOMzPBFfO6roo Y9`tkviS 5RY-dCR;Mϛofsm"JNS, nROdR,*Զ/i$[yY#{+wOtگSڳ4UŢRTC R BRTR  #ڬbΣjONjOSRͩ=E.a3CYK)i2rH@={|@^uVwF2~uVwF2~?5cL8me *85P6V6cM?kbޣjӟO\N|4?8RnLV-ͤZrbblAqe[=Z Ewl2 λI:is:Ͻ&I]զ}5u_͕=lŞNr#ͼ{YI tftf_E5y>0u'UwV}QCI"ANxU۳e).IpvG^,֡GTF,d/aͱ-5Lnbo` .i~z> _uN{(Vï zyJ:qՎ|hZX88Rw}L~+!$l-S1Ҧ/a*+]s*B{ 1V/wSFJ2*\HC'Kfܡ:2R;+Jwo݊e]m7"-!I<؁MW^g+4. >M;ȉ }j b D>M;ȉ }j b[\.w6\"'1.)=mpDOcTs0֫и(RJh=fWo h?o:{iK"yS(ي6R3'p}ުjfW?썚-uE<X2S}TSCǠ6Rw:Rܻm+ꥫYNI=7 j+_~H}mg4.Kmdqo)!+iG9R|?;@-+5KzS"cPjD[; MqBۉ(PT0wwdERNDedfw%`#Ms۩a6EF"̘(;Qfl%OY<,들HP@PV#=}/!vEm \Q%zqwjKq!w:P3b"b:CkqJ H߿N_ejiO2o(D䡧-)Y@YGp鏌Vztr~W"^(2w'=<\™%ͦC#9ߕ-QtbJt6. P'kR;ztr~Xaʍ,,% JBHMHop7VLbhu@bC a/!.qd:HԒ NSuC!iA!Ŕ!JI PJF@ $vEA6R$:`rDЌ9cQP*.m6Szûx&ӷnVLm ˜\)-k[8 Vj׷;L|g'æ>3Z@oO|i\"*y ].j$I1!y(ܶPYjncZ1 'cf\z1w80TOg#i[,TT67Xߴ;u\r\UZcP &G!Ju;[[m 1jP:o6=ۥ]Zz\hE䨐TR!DsFtH)mDkLڿX?,y^M_Bĵn$%LK!$ԝŗ>uG'ӟ>uG'{$W[ZR.W{ \l2Z-%/(kkK~ln=5?n}O?n}OE-{zISϷYmʐPiV읡tovvzhɓϋ'R_o`c#kt¶Oj) Ę R@*Cd@lX9sWTx|9r[Tx|A.jm:4loFVvBH'q߸Cn# R՚%JIS;= ^~$;N~$;P2,mxz)JRBPI݁]=qu.S.JT$)P E?n}O?n}Oi=Wخy_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ!ڣēj?HUi*WOm\9\3?tozFNn4Fw-HV=+v0ˎEmɓim n^SmA5VTɗ7T8m-ՔHp4}Asv2nvl%H'rѼo ^=|JPym6K֧j51zc.6TOZHMKWO=VG9=s&[Z$[2\y,$$ FJ(IQg;#pq mϽ/]>,N}gv ˒%SB#qyE3ln4j 0=V{"}&8\&J[(=9118Py+Ş)Ͻ1\xElX wTۮJerC)L yZZNuki&]i&S.EU:^x VHyޗ{ȫ)Bɑln*.6Z;tPFpEdti|jِS$e)S (-{9PJr &z_|Y"yypZy2o`6,J! lvv΋l2W]‚m (`0 ~ |yޘ{ȫ%.oe /6Z11V{)KqdmN550eƚ$4_ic2JZR6R E VKWO=Szc|Y"k;pߕ>(bh ZR*.lJK(IJʕ?ҸJH@eҊh%)')Rƃ_sKWO=Sz_|Y" prj;H}pҷQ)% ;~`[*miSȔ%2 TÀ8A<nR1N.ޗ{ȧ>tEoTz_|Y"Ļhs|E4Zl)R\h;jf;ұ]G(Xfif ]/\"[hTИ qiNwJGH]6+O5np69">)TcEgO[9&[m[-ea'hm uvpijh*ewƗmZ#h8ED)@}f k&i]D /{]oZ粛v;va9J7;ze/U;oi(MIuI8Iקj6NcaX>jAM犳;]l>V |Zl+a] * 6'Y׍z_3h')P}J⯈vMjΉ ,:CmnpqcJ6X* t.|;I{[%%#($}ۤX)P}J⯈U|@ϝA*ߊ gөWU>vrԫ~*;N_W Uf:o;; I8}ā\Ɠ#X%9 fJM#Y$)6&=;ԫ~*;A9J6FU{WαV@3h')P}J⯈U|BϝT5c^lQÂz qVFG[9'dHU9⬍ϝ²"U7@õU-8mVZNvSU%˚R6RP8P@\iKE[ Q6u(+QR ){MskKvnqdL uZ`,Ҭg5׾>f<&?ڠݙǿJ<~=/?6l$LrJ1\(-ցܕ~=o6/fs!lž(+ -}zԵ((rTN3!R.)qI*BIʕ3٩ 96Q)%*w`(k!=LbV&cfxHJ@H$`:*x:ˊ nXh- $0IFZ޴n:4;qgz۳넫oRB_bg46¹2rI $Af]ږ&6Yw˫.3 ;$(I[8*;#$ ZW|? @rjRYt8Y;>5Eǃ{\mE4lKH8 ѻ90i ځ-FZ9WkK߹D^PFIRF2@سv&Lc.)}7[8)JibDEvMAnj"t\ġ,vU'y$֐+m[GTN>4/ ݱYݲmzSm,9%S",6SM (+!VǢMQDEUgxLF4aDylQ]B%K^Z 85jҶW&|(}x6)d%+ uvV*Wm]:NcYJ&6Ր#6FCo%=vr5 aukrH'9n{dEnbdDq򦼷.TTK#rU R pU&zx58ժ9@6+O5uOѬv5m_VkH{2:EM%6 GOI:7I IiS!StSQC{K;Fxiݝ:ChlP֥G Wd tb3nɎ;lc-*h2+ Q R7vW~[Vμq N{JpEU4l) $\ |VIIVӃ EnE3(nm-J)Bvvѵ Mnq3r7%^qL;I'6XI/ bZ!͗"[̌3XcCp{}ؚFTfqLLKiZ~Ĺj5Z#ZJݯs5i"НVn&=e:AJ6A A ͹52(rሯN WAڭݭzmzcCre[R[V- Qm3ƯEpk]PW)8[e1N2n{jtnqmӉm-[xVԔl@Z#GTc nK]nAQ_e%\[ R%X%#p;u/E{g;ЇBφwˠ5|q{ Jz^t!н3"=_CƯR:|3]=t/{g| Ʃiob>Gc¼L0 2p^~ _i,')D%[UwU\\cQ7>ڛr!eҖmq\' BI;;@Sag5poZ9m`LVC;{j)zEVIDWvfxBs+g CM=2t66ii %6Yj" ^m[r3WOB= s}UQ/OrrB}l"JC\Ii>z6]j--Pi@IqgraJVa}vTq[CЇBφw˧y PE&2Д!6A^TN;d?B A~uF/A~uF/AYliW %I a $dc#=i jazjNtm4WІʐ 8ZVp7tA:N8=nmP CWXi%-@P '9N@h'j .BS 8I(WCDPJs9P[kdT4]?Xu9(!) e딵͍Dkڣ1K]R5b]m_t67*uvgpjI+f0cp)[y-S\c@+&:;Khsiکz½4ڎ5E[]Wra8NHJ.' BӍ8I![h%)Nuٴ+v{ 8ۭGO!BQJR6ʛ(Cyʉ '5y#=cM/Tb! )~˥'Tb! )~˥'Tb! )~˥'T#w}⾊#&eȮ&Lwl-;C FARJT@RNb->1ky3n-ƪ,gXeKZc%9kP[a1Sn`V4"3"l8մB)I* {Y?ԝ(1:WNCV](1:WNCV]("NO欄bÿ+n?xǻ)4 їB- 5R_s_"-'= U]u5(1&}ߐTMwmTVXmN7q B\^)#~UKZOr+mȔJCb;[Q9)`$\mA z?G?m^yǭs&^֮scR_T_T{^6@iT)JP)JP)JP)JP)JP*gwsWWpV_LڿX?,}=Mc!m9_,ݥ~%?@mƔH$8 ԝb'1^Z}#~ 2Li%B\x0t_}\玛܍oN:or7Q+#=)^9Ay#~ӎ܍oTnJyurWG{P^x߆4#~r<3r\:or78߆5F\ W%zxg1*/roZ+~܄򣴯 Y\:or78߆5F\ W%zxg玛܍oN:or7Q+#=)^9Ay#~%kJ6\wGZ媏W%zxgz}hRʁuڠfq=ӎ܍oTs}pI@=<:+#=(/^0Ͷ^rG9k-SuupL) O[AM^hFlRjq\ % y--DciX`;cޥ}~Ph?uz^zxɷW{5攥d)JP)JP)JP)JP)JP)JP)JP)JP*gwsWWpVx?`y1!d̋ l F38d{៦Ot=ABG [F-I5$*rշqF9ؒWRBTXydn9ԥA(WzN_Aiw>jT(4O[M ٯ=pA~۫нssJR((((((((@3;ǹƫP8LjqTrm_VjWW_GHTVͫOޡ.fm\Kgah)V;9;lFVwtfY@vJT+*)#q1m"ۡ1bqm6R8Ȩ'֮y_-K0$2?iղcGmLUў$GTrFxT3Ɲ͗6pvHd&ɩca..TvZHP[qPq|ZcP-660D īTАs%RAN-&xE-rG(S@)R* S|Z~P-6ZdhhBFFPޘKKnsne)B[kV'9-{v?XՎckRrn:??~\\NYݸ̚K },H;H$ sj Ki&eo76"6k[Ʃ($l-|gzw/2FKdq+d1<{hZp펰 bk@:2;q}%֟4Mjy7qrt&Rv-lZ{Jhc֌ Jk ]y6؈6.2]Y?#)AH@l[tg&֟4M%և? i=c\MC%uJs֒:AVvnL=dRq+$+2tլvOFN%ꩱa e6%.ˀͤ7Ƭ[F3Ѧީ!n[-JY[@i[%xPB@$Bt:f;;-#կ\8DLW̸im%arc8ATV{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAZH_o[u Lj.%)@=__;.JRDA~۫н[M ٭\>4+!JRJRJRJRJRJRJRJRT=C{jPG(Yzfifu}tQeW嚕~iU'q`EvYmWnrݕRI9í9Vf:l={TD~R\ L qVļPֺ¸q9FvB\սUe>5]ohRJq[bCmJUI21P9Gf"}iK\ZR'mNCpʔLp6>p1`&qPa%ɑŷČlT_TICKSHkj>:nƵ' V7Aǵ]FjӿVanQN6S;u\{yS;Vd6[@u+ƹj.# CQJ(.'%HlRcڟS#VX86,KB*ݝk+U#ۓ"d"$6fn҃!/!2Zi'{A6ïɫ^ٚCwnm9m* VۻQJ*@ H93~vrs J݌*_z JH_}6?WZ$t ]2aZBѽ)ajog# N*S\ofΡ=lX qqm*8)RVC p)E)‘R:D:BS+`0|f\+ɇɘ,l@FvYq%E"Zm*N\ʕBB#y /hN v06bX'd߮dj}jmtڴ;xm -5!JqJ-cIi ouUӗ.bKȐy RBROܔ BaG}hV@ NclU(51_}6?WsUcZJ i}WMj}!_֫e҃ZsUcZ1_}6?Wt֜}!_֩}WMj](51_}6?WsUcZJ i}WMj}!_֫e҃ZsUcZ1_}6?Wt֜}!_֩}WMj](51_}6?WsUcZJ hl7;COtpR8KQCxX *ˮghvӚ|OrsVdUzܜ_JPh?uz^zxɷW{5攥d)JP)JP)JP)JP)JP)JP)JP)JP*gwsWWpV_/LڿX?,ԮJeW嚕~iU'qZg8=[W+TE)T1\cusJ bR cڥ(8i@((((((((((+zmVw=Ϝ]Z۪S{8 )J 9nBk\~=o6/fsҔ)J)J)J)J)J)J)J)JP8LjqT=C{jkeW嚕~iU3jbR>:O*;81aSչLcÁsT R R R R R R R R R R R R R R R R R Rgd;.ZmVw=Ϝ]xɷW{5?uzZ}iJVB&zx58 =_5jP5ͫJ?4^~Z~Y]a'Rw0~զx1aSչ)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J ޳?~[uU|OrsVgd;.JRDA~۫н[M ٭\>4+!JRJRJRJRJRJRJRJRT=C{jPG(Yzfifu}tUEk/LڿX?,ԮJ; p?T|nj<0~oYY?->'9V?~[uU|OrsA~)Ax z?Gm^h$>N\KYZ,RJ [9#;`g6~G_G3T J*.*.~?ȥk~~G_GN~G_GM:~ J*.*.u"|U]9|U]46E+[?:O*-_VjWX~GIW9vpcÁsVN7VRRRRRRRRRRRRRRRRRR?K#UYާ'>quj~GnON|/ԥ((ܒf{g׍Zџg3QɼXϓjzChF#U԰<ي:'g'9JWCERI~,92b:XwQ +La^8kU5c=WcMyժ.lW#NҲ}]d #i.3/i2j4{Ţ)keoq B0;;[/֏-t3hu7PZzt=ys؆![!Ҕ+ghZPÆ&2-wa]će.:*=ѠՏZh]ϛ <  }C'2~ڲE\)~%r#IQ6q `v3E3?,w0 (rZERJdfHjzbd[]#q#l9X~AݚN3cS"Y-%@)C);+hYj1Ye(4ii"J@B@~}s_U"mrVvFc˒HW(6C*p-+8XRN ,j.[-.kL6T)JzFʳA":#̀^KQʔw"HٺE9U5T^Q wld qS|nʈlߺ:]THH#d/ݜ~ $E|ۮycgѶ{\;֪wh2Z^9ii lcH$-IA$ b"yIH,* 8Y=$[v NWo6Z3폾{eG(AT%O-%Rt+**hhl6nŦ< 0i)XۅN)IY0J :I&o$yK~U|PZ֕!w+r!t^-qމPHfs&Ghć'$2{v\^޸'a"Il@0h(ʸ@`چC$ %AA@~p_^>W^\ X..Mi0TH)-, ``;XӺgeypC-^qN4Ce-G(A=;ӻ$PQax>U:ax>U[.)JqvS,0( #Z7n5vF#?q& (Ji@0S߳Dh~>ϕ\Rw9 ~U*|U]TA=̶}=~sRMZʛu+aHmAE*>ѯ(^’vUHǿT(thű0-K{qc|` q8JY)oq(!amdDŽ%CLL9gwg)@;}6wo ( 1xTu9.tU( NR{ }Gn49Kw('a++ %k͔z ~sAjӯۮsҥ+Gen+ cWLmcaUK\rt88%%. ,l'Nʎd'a>Sa>PK\t=qv"%a!!rp6ٯ]zeuIO)9+,[=+JHe=OO:n&[Ww`W$h<6ccMP0zssҶi`.cͶ%,8 FqVE6E:ZvtJfe4[ieĸ#m$ oKŕm^ol6ۭ%IIN딑Dl'֊ȶ%"L7⃧9j6ܔ~+<{eJy $oبxMXGN\. *RpKU8= mcO嚖~iU}1ibRڿB:O*"PI5 Q\ZGFK[[C]b]V؉'ŏA=fz+$i]'OA=fz+$i]'ŏA=fR ^ӌ2gdm-AT;f9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗA٬GnON|Vvn|}l '{#I;ʏާ'>qtRR3'7{2C*l-{xC~:Rg$ 3[d4V1n38 ^Su}% %ly<[-'m9EUOr= z>OqOٟF}=0=q`[d,lI# Q#uFɉrܥJqpbj-kq]"! 4Jq5H t!>мaMr. v!s"ZC6يMX2򔼠›qLGY$ -$ܻ-.Le0-Y@lu0ANui$ li!-0Ӎ 9|(GPWR+7ggv!ڐ:棩g#_| Cplo6̖H!e YJP[wOpwB}4;AGi;xPm9G`Xܾw}5.aM$dR|i|/GAJ{#/aMM+^0w}44"jI.G36r6z7t |/GYV]BiֵJzaR0000:ggFw,F?x~nG$+ j{==5خl-arkH$&eJ 9#tɸ˸Cԉ{ih6JQFkLZX?,ԶJcO嚖~iT好dqi-# g jڹCd<4$%a$)W5dv9jaR4e,ȥS ׷PLHH[ cl+Jb%i;4n†3&K啼C;?HJpp WL'~Rkql7TŬezv8k1ѐnܝ ľRo@ݻ~+簾='H)m1 ;a8e-BUA9A 3,urL}BU2$"j,B"G\jc=Ņ 6A;hOd^Q~]Bbm-9p(˛T5v[sU'9󋮚|OrsA~)ABeȒTU+Hib$V+,=-n=&Q2RI(%{ӟtΝgN|OҔlt|9{ӟt:w9<_7Nlt|)@ΝgN|Oӛ:w9<_7JPr1IӿubӶo;`XJQm<#cpO&gN?Μ/6t{:sxnsgN>'͝;Μ/(ӽωsgN>'J6t{:sxnl+,+90VHu CZNRPݑJP}*a9;JuGnA@.%Jqj2vIx'po zէia=ͽڅd~ʵ=l;Sa'qH J8 )Aw:rgC3aR%BPJ\;hV֎iJ=wx;OC;+Ҕh^vZ;~;+Ҕ&؛K̺PL*HPRN 8Pj1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JPpD`2!w<ƞ[KimA$I;'Ҕdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/Collections.html0000644000175000017500000013236411520622074023363 0ustar directhexdirecthex
 

6. Collections and Arrays


We will slowly move towards real-time data processing now by installing sensors to our car and collecting their output.

using System;
using System.Text;
    
namespace Db4odoc.Tutorial.F1.Chapter4
{   
    public class SensorReadout
    {
        double[] _values;
        DateTime _time;
        Car _car;
        
        public SensorReadout(double[] values, DateTime time, Car car)
        {
            _values = values;
            _time = time;
            _car = car;
        }
        
        public Car Car
        {
            get
            {
                return _car;
            }
        }
        
        public DateTime Time
        {
            get
            {
                return _time;
            }
        }
        
        public int NumValues
        {
            get
            {
                return _values.Length;
            }
        }
        
        public double[] Values
        {
            get
            {
                return _values;
            }
        }
        
        public double GetValue(int idx)
        {
            return _values[idx];
        }
        
        override public string ToString()
        {
            StringBuilder builder = new StringBuilder();
            builder.Append(_car);
            builder.Append(" : ");
            builder.Append(_time.TimeOfDay);
            builder.Append(" : ");
            for (int i=0; i<_values.Length; ++i)
            {
                if (i > 0)
                {
                    builder.Append(", ");
                }
                builder.Append(_values[i]);
            }
            return builder.ToString();
        }
    }
}


A car may produce its current sensor readout when requested and keep a list of readouts collected during a race.

using System;
using System.Collections;
    
namespace Db4odoc.Tutorial.F1.Chapter4
{
    public class Car
    {
        string _model;
        Pilot _pilot;
        IList _history;
        
        public Car(string model) : this(model, new ArrayList())
        {
        }
        
        public Car(string model, IList history)
        {
            _model = model;
            _pilot = null;
            _history = history;
        }
        
        public Pilot Pilot
        {
            get
            {
                return _pilot;
            }
            
            set
            {
                _pilot = value;
            }
        }
        
        public string Model
        {
            get
            {
                return _model;
            }
        }
        
        public IList History
        {
            get
            {
                return _history;
            }
        }
        
        public void Snapshot()
        {
            _history.Add(new SensorReadout(Poll(), DateTime.Now, this));
        }
        
        protected double[] Poll()
        {
            int factor = _history.Count + 1;
            return new double[] { 0.1d*factor, 0.2d*factor, 0.3d*factor };
        }
        
        override public string ToString()
        {
            return string.Format("{0}[{1}]/{2}", _model, _pilot, _history.Count);
        }
    }
}


We will constrain ourselves to rather static data at the moment and add flexibility during the next chapters.


    6.1. Storing


    This should be familiar by now.

    // storeFirstCar
    Car car1 = new Car("Ferrari");
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    car1.Pilot = pilot1;
    db.Store(car1);


    The second car will take two snapshots immediately at startup.

    // storeSecondCar
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    Car car2 = new Car("BMW");
    car2.Pilot = pilot2;
    car2.Snapshot();
    car2.Snapshot();
    db.Store(car2);



    6.2. Retrieving



      6.2.1. QBE


      First let us verify that we indeed have taken snapshots.

      // retrieveAllSensorReadout
      IObjectSet result = db.QueryByExample(typeof(SensorReadout));
      ListResult(result);


      As a prototype for an array, we provide an array of the same type, containing only the values we expect the result to contain.

      // retrieveSensorReadoutQBE
      SensorReadout proto = new SensorReadout(new double[] { 0.3, 0.1 }, DateTime.MinValue, null);
      IObjectSet result = db.QueryByExample(proto);
      ListResult(result);


      Note that the actual position of the given elements in the prototype array is irrelevant.

      To retrieve a car by its stored sensor readouts, we install a history containing the sought-after values.

      // retrieveCarQBE
      SensorReadout protoReadout = new SensorReadout(new double[] { 0.6, 0.2 }, DateTime.MinValue, null);
      IList protoHistory = new ArrayList();
      protoHistory.Add(protoReadout);
      Car protoCar = new Car(null, protoHistory);
      IObjectSet result = db.QueryByExample(protoCar);
      ListResult(result);


      We can also query for the collections themselves, since they are first class objects.

      // retrieveCollections
      IObjectSet result = db.QueryByExample(new ArrayList());
      ListResult(result);


      This doesn't work with arrays, though.

      // retrieveArrays
      IObjectSet result = db.QueryByExample(new double[] { 0.6, 0.4 });
      ListResult(result);



      6.2.2. Native Queries


      If we want to use Native Queries to find SensorReadouts with matching values, we simply write this as if we would check every single instance:

      public class RetrieveSensorReadoutPredicate : Predicate
      {
          public bool Match(SensorReadout candidate)
          {
              return Array.IndexOf(candidate.Values, 0.3) > -1
                  && Array.IndexOf(candidate.Values, 0.1) > -1;
          }
      }

      // retrieveSensorReadoutNative
      IObjectSet results = db.Query(new RetrieveSensorReadoutPredicate());
      ListResult(results);


      And here's how we find Cars with matching readout values:

      public class RetrieveCarPredicate : Predicate
      {
          public bool Match(Car car)
          {
              foreach (SensorReadout sensor in car.History)
              {
                  if (Array.IndexOf(sensor.Values, 0.3) > -1
                      && Array.IndexOf(sensor.Values, 0.1) > -1)
                  {
                      return true;
                  }
              }
              return false;
          }
      }

      // retrieveCarNative
      IObjectSet results = db.Query(new RetrieveCarPredicate());
      ListResult(results);



      6.2.3. Query API


      Handling of arrays and collections is analogous to the previous example. First, lets retrieve only the SensorReadouts with specific values:

      // retrieveSensorReadoutQuery
      IQuery query = db.Query();
      query.Constrain(typeof(SensorReadout));
      IQuery valueQuery = query.Descend("_values");
      valueQuery.Constrain(0.3);
      valueQuery.Constrain(0.1);
      IObjectSet results = query.Execute();
      ListResult(results);


      Then let's get some Cars with matching Readout values:

      // retrieveCarQuery
      IQuery query = db.Query();
      query.Constrain(typeof(Car));
      IQuery historyQuery = query.Descend("_history");
      historyQuery.Constrain(typeof(SensorReadout));
      IQuery valueQuery = historyQuery.Descend("_values");
      valueQuery.Constrain(0.3);
      valueQuery.Constrain(0.1);
      IObjectSet results = query.Execute();
      ListResult(results);



    6.3. Updating and deleting


    This should be familiar, we just have to remember to take care of the update depth.

    // updateCar
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        IObjectSet result = db.QueryByExample(new Car("BMW", null));
        Car car = (Car)result.Next();
        car.Snapshot();
        db.Store(car);
        RetrieveAllSensorReadout(db);
    }


    There's nothing special about deleting arrays and collections, too.

    Deleting an object from a collection is an update, too, of course.

    // updateCollection
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        IQuery query = db.Query();
        query.Constrain(typeof (Car));
        IObjectSet result = query.Descend("_history").Execute();
        IList history = (IList) result.Next();
        history.RemoveAt(0);
        db.Store(history);
        Car proto = new Car(null, null);
        result = db.QueryByExample(proto);
        foreach (Car car in result)
        {
            foreach (object readout in car.History)
            {
                Console.WriteLine(readout);
            }
        }
    }


    (This example also shows that with db4o it is quite easy to access object internals we were never meant to see. Please keep this always in mind and be careful.)

    We will delete all cars from the database again to prepare for the next chapter.

    // deleteAll
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        IObjectSet result = db.QueryByExample(new Car(null, null));
        foreach (object car in result)
        {
            db.Delete(car);
        }
        IObjectSet readouts = db.QueryByExample(new SensorReadout(null, DateTime.MinValue, null));
        foreach (object readout in readouts)
        {
            db.Delete(readout);
        }
    }



    6.4. Conclusion


    Ok, collections are just objects. But why did we have to specify the concrete ArrayList type all the way? Was that necessary? How does db4o handle inheritance? We will cover that in the next chapter.


    6.5. Full source


    using System;
    using System.Collections;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Config;
    using Db4objects.Db4o.Query;
    namespace Db4odoc.Tutorial.F1.Chapter4
    {    
        public class CollectionsExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreFirstCar(db);
                    StoreSecondCar(db);
                    RetrieveAllSensorReadout(db);
                    RetrieveSensorReadoutQBE(db);
                    RetrieveCarQBE(db);
                    RetrieveCollections(db);
                    RetrieveArrays(db);
                    RetrieveSensorReadoutQuery(db);
                    RetrieveCarQuery(db);
                };
                UpdateCar();
                UpdateCollection();
                DeleteAll();
                using (IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    RetrieveAllSensorReadout(db);
                }
            }
            
            public static void StoreFirstCar(IObjectContainer db)
            {
                Car car1 = new Car("Ferrari");
                Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                car1.Pilot = pilot1;
                db.Store(car1);
            }
            
            public static void StoreSecondCar(IObjectContainer db)
            {
                Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                Car car2 = new Car("BMW");
                car2.Pilot = pilot2;
                car2.Snapshot();
                car2.Snapshot();
                db.Store(car2);       
            }
            
            public static void RetrieveAllSensorReadout(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(SensorReadout));
                ListResult(result);
            }
            
            public static void RetrieveSensorReadoutQBE(IObjectContainer db)
            {
                SensorReadout proto = new SensorReadout(new double[] { 0.3, 0.1 }, DateTime.MinValue, null);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            
            public static void RetrieveCarQBE(IObjectContainer db)
            {
                SensorReadout protoReadout = new SensorReadout(new double[] { 0.6, 0.2 }, DateTime.MinValue, null);
                IList protoHistory = new ArrayList();
                protoHistory.Add(protoReadout);
                Car protoCar = new Car(null, protoHistory);
                IObjectSet result = db.QueryByExample(protoCar);
                ListResult(result);
            }
            
            public static void RetrieveCollections(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new ArrayList());
                ListResult(result);
            }
            
            public static void RetrieveArrays(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new double[] { 0.6, 0.4 });
                ListResult(result);
            }
            
            public static void RetrieveSensorReadoutQuery(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof(SensorReadout));
                IQuery valueQuery = query.Descend("_values");
                valueQuery.Constrain(0.3);
                valueQuery.Constrain(0.1);
                IObjectSet results = query.Execute();
                ListResult(results);
            }
            
            public static void RetrieveCarQuery(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof(Car));
                IQuery historyQuery = query.Descend("_history");
                historyQuery.Constrain(typeof(SensorReadout));
                IQuery valueQuery = historyQuery.Descend("_values");
                valueQuery.Constrain(0.3);
                valueQuery.Constrain(0.1);
                IObjectSet results = query.Execute();
                ListResult(results);
            }
            public class RetrieveSensorReadoutPredicate : Predicate
            {
                public bool Match(SensorReadout candidate)
                {
                    return Array.IndexOf(candidate.Values, 0.3) > -1
                        && Array.IndexOf(candidate.Values, 0.1) > -1;
                }
            }
            
            public static void RetrieveSensorReadoutNative(IObjectContainer db)
            {
                IObjectSet results = db.Query(new RetrieveSensorReadoutPredicate());
                ListResult(results);
            }
            public class RetrieveCarPredicate : Predicate
            {
                public bool Match(Car car)
                {
                    foreach (SensorReadout sensor in car.History)
                    {
                        if (Array.IndexOf(sensor.Values, 0.3) > -1
                            && Array.IndexOf(sensor.Values, 0.1) > -1)
                        {
                            return true;
                        }
                    }
                    return false;
                }
            }
            public static void RetrieveCarNative(IObjectContainer db)
            {
                IObjectSet results = db.Query(new RetrieveCarPredicate());
                ListResult(results);
            }
            public static void UpdateCar()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(new Car("BMW", null));
                    Car car = (Car)result.Next();
                    car.Snapshot();
                    db.Store(car);
                    RetrieveAllSensorReadout(db);
                }
            }
            
            public static void UpdateCollection()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IQuery query = db.Query();
                    query.Constrain(typeof (Car));
                    IObjectSet result = query.Descend("_history").Execute();
                    IList history = (IList) result.Next();
                    history.RemoveAt(0);
                    db.Store(history);
                    Car proto = new Car(null, null);
                    result = db.QueryByExample(proto);
                    foreach (Car car in result)
                    {
                        foreach (object readout in car.History)
                        {
                            Console.WriteLine(readout);
                        }
                    }
                }
            }
            
            public static void DeleteAll()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(new Car(null, null));
                    foreach (object car in result)
                    {
                        db.Delete(car);
                    }
                    IObjectSet readouts = db.QueryByExample(new SensorReadout(null, DateTime.MinValue, null));
                    foreach (object readout in readouts)
                    {
                        db.Delete(readout);
                    }
                }
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Result.jpg0000644000175000017500000010313311520622074022700 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ERʈa8zH{<'FYq7bz dO6Kc#[qX1 -8 :7V3h-e6XƲlK)1A%B}u#խ";=gOe%ܺ0"\:6r'AvBW5->}c+2{ kѵ~%ZM8mipI`s9kV_v NggFT)-]kZtyQ mz*^IH0=h_( }:\uoMp8WcyT |޴/AOo9G5#ms\/~^ ntlڄ&#eܿ/1ɫW^4֬4aK4u !8j6Ozayi#Vܠ,x *jF~%.ܛ}Zs["#&HܓV|D*i}B ?)( tS)_?UA Oo9KCr>9l-.R:o}S PQ<;~rsZ>mSX6afT@#s|1tsM鿟 _뻱a?!i(A Oo9^+u試ɫyOǽ(!AroO@>*6si%mWp@cA Oo9GصZ7,5KIXn{E}JC+@o"=GrzZ^ϩ]ooX=@,c*# eb_J\x(|@Rj\}w{`kV֗=욏, d!gm+[[꺶-w1j{a4ape`,20qҼ_;J:u}$/]N#cI0o0t].7~?z5YBnmenfujbUl`;|c%'lY `IYl@PINI,5? ڂ=,( 1;o+t7zigbeײ$gj$ @Vqq$MrjiXϩ4r(}˸ g} >!t?\EߊŮerlNXfBT3 8Ih fy"UE)]7#8杺B]'?\BZ`FnG)ӝ\޹[)d{-JanH# e nz$Q>!tE?^vke͉Źq,rrLGlcA=Cwqm|^NLqɐcیnS8=8y_H}CU\p YDq4QQ;[4X_Z1vn#[r?;m`=b#;8UP`1X$>cY|Iv<Á^ݞ!Ŵ1s}ղGw?G@ $_]yQU2i,q]mSΓ{H^5.K\i-Zi6>d]Jd#íH{?$=UԿ6_9ʻ(,' q4HoBJxcr02$ Г۱6xZ+-:NPݩYQ۳%s9B\Q@A'+Mq.p@>#23NKW[_}^K;n^JҼ?ݴ6u#rv@9B:z|Z>/4?/ToZ}mjmafV(I!qd:/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֩Z^in!mz=z+#"SCnMZ>/4?/ToZI5FeI1QV|EBxe  txAX3xrtlRiVH70x9/4?/ToO Y"g#+Fb`p T1V4e*EeWi*H˂qMU/To"SCn-_\V-cP>8Q$ ߝQU''SM/To"SCnxbJ\amBi=*CV{ӡvfv(ypUpcsL/To"SCn&VhM??Q]i^71Z[?5_Щ?7G|EBxjB_&fϜ{?W:j>}Ũ/#*_ʉ"H>/4?/To .tn${M١& pی9#SXiI0Gvn]73wS5W"SCnzk?5Q rȠsF@ n=j.eyuf\+ A9+> [٦C.r6J:ժS_ՄwW5k c s [?&ݗO_F 7e(?{)+ޢ5gv_e?p]V&ݗ_ nQ z?k =to/zפ)ju5̷-žIgAne H%7 G}VD^///eo{tf6ZRX\h1F;Nz}3Ee>dFXib{gYOX_iWb|ͽVc;sl tnJqg~M{V7,+ l3$f ͒H%7I8݌qZgv_e;|,/E`k ?57M|3A/G&ݗO_F 7e(?{)+ދ>GѱQXqÁfK3:0Y׾;E<[yiqӜ?w/7lbZ5tRV-\zS uŝݫǗXѤ1n@A + jWY%ᤞAh a[%X";\tIJOiIc _Ǧry&fFts#A/8 d21Wt~-Zx`T7E 2X0p3dsXׄo^yQE$˔11daFr{Je[]TR.<w(QIv iE`k ?57M|3A/G&ݗO_F 7e(?{)+ޮB{LH^e 7e+t/@2 (((((((((F_VIk/e7mր: xoM}8 -o}y/󒼏[ZWU_%y pЮRe:NgK ao$K+H=:]7x[Y/ai-V9CF%dl9g9_W 6(Q@Q@Q@Q@u[Vo7u@22䝧XW6]KksE<.RH` vv擥m[z|:/٤i1n硭;]_D}[N<-^]BY^eiO,@`P?8՜Un/jzlUඝg06P0:gީ׫7o}.4v "1p)%Ex譥[v2]V3Dg_XyqSD}òyulյk$ݢF!%1ÀQ]/Ӯtmwfefck!T.!9eny4;Ac 6OsM,F2ygcCxU򶣯VZ~F I-qlt'8r'(HQEb ( ( ( B{LH_gzE 𳯱 i4(((((((((F_VIk/e7mր: xoM}8 -o}y/󒸯.^0-nx- ʤ8{[_}^K[J`H?|t*rRΚl v={eytCK'YmQ~v(L`q]Z߂"y"| v=ΚlQorDXz?5ߧ(K߂ 3A:kO_DQG+AgMc?t?;c~,W~ 'Κl v=}EX$O.1֬KFP0t?;c~n !<3mL&L0#U!si<{m-2vvg5uP;P 9&RO8#?5ߧXzs ڠKxeFNG]"H el3yybEA ŗG/K{s~ ':kOG3A뗾:⻱[oKo-C,Ⴡ< IdswjA+` 2Õ# E/,W~ ^LJ:kOG3AG,fV?doق3yGEc<*+1ye 76YB6O xA?5ߧXz/W iF g HX{OK߂ (]V%:a֬plG:kO^76? fKs$$4Wp3fVc[K_gMc?t?;c~oNIOF}j'MlB5,Y-4XS=jB n0gߚ,V߂ G:kOG3AE_/H;:kOG3AEib_>wt?;c~gMc?(79"| v=ΚlQorDXz E3"hV~"^^I- (QEQEQEQEQEQEQEQEW_o =z}y&O7㢏 %rS|-%OP$>JvN݁֯pshr[Aܧ:-D5VnX?ad 'daҡTI$I= gg]fuA7GyVuo?_ tEgg]fuA7@Vuo?_ tEgg]fuA7@Vuo?_ t,'LmAVkF>-)ì3cgo\b0QP;2"q'6#F3[Pi[[o|DvpRg]fд <3}{mGSR[C%D0ZF'gL_j3]]2JKYQcەCh(5g]fuA7CE@Ү'Ƌ [%?ٚH2DFA5_^k-wht71 XDɃ~~Bp3_ tg]fw`d-%m6IvyoW0 0*.< {YQC\,A<Cgkκ:7nė^e-`DL1ڳm֩-ݣ,93%.eGM9s(qg]fuA7H vZ _k6R!4{wH;mw榊SOy$<؛~۹>aSNκ:7n&'k trc[&H202:֩&k:ȭHWO @a'#jk6ɭJZĘJHUp!zl"M>XR-ԅ Pg]fuA7EEgg]fuA7@Vuo?_ tEgg]fuA7@Vuo?_ tYgzE ?3}|AեYkbƱnʀ&(((((((((0{Z |Ma[o'oiES}__N:( [_}^K]}:_%^ZevQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE2¶Ok^^a}#/+moM}8oiEak{9kїUG[_}^K]}ފ((((((((((((((((((((((((((((F_VIk/e7mր: xoM}8 -o}y/xCG-w?2{9kїTEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW_o =z}y&O7㢏 %rU>F]Uo}y/󒛡>-c[U//w Isn#8(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^+/e7mֺNC^ Y5[}A [G@ӎ<7tPVb"Xy ɪ_%^^Oރ9OP?c#qp 'ڇf63n2::@/4}_Aj"T.CJ4!*% €-_Ahރz(vtR%P2ILK ,̊lcp` zg#G Ȼ6>/4}_AjcrzG?Ʊu]nᵋNX@1T$uT״I/p7fvx#ր6~/4}_Ak _h7w6֒M<2˜g8ZĚ995 hM9ّBz2q9P?Ə?Sx`I%E #Vu%Xރk/"imYc<[dbR28=_)_wQ%tV}ޱmeL @ 9%u]YanyxbyFW(B(F+*ĚMv/ LY8R3$`ށsVƇ^S[L%pa8 8'/X&;.azRfW R8n1@7]{lsr jpymsHK}Vlݶ%A7< T~ȏ#IxE9rgE zTv<_ ڴgw[9fU@4VbkhӒ+FEHd$ 8Ȥi1jr_H 9Ve9t4z(((QK1@$-Wurh}o?/1|3{ jz|LZ8ffy 'wH  h}o?டOЩ&A<B>g?pG+*h.OЩ&9ئufDT 3}5^icJi<̒Ill|kO V?+?vchchO V?+?v6/s\O|5^lW卣ؕ`T?ֵImx{+xY#%K"`qn^rSC ;?1Xg.^?Me1E&>|gCXzK0%sGuzo]b.]FO8O V?+?vchZ/.$8]%J{P#`ȓ0 ZԼ=Ly  .^S!d_P#[O V?+?vchKG"0,, 3"ܼēf9wgx+;GwbYW?SJ?SC 6 p$4Kp8u=(5 E$, !3!}6}q\[WKKvfFd}6I95B^-r//~ 1vͣgnGISeMݡvۈm>>}-5;TKY1ui/HGJ$FC@88yf}NaӚ9j,ٔ84P 7niчI&$1aH$|n\HѴ5 Hiϩ0`+` یwr.-Đf>$2DPc! [fnm4[3-1~E,75j  }5LTwg~W$*y;tf8a[?.^7H[*w2px㩢j>U.]D?n(9wG ;38̀H~5!0H x/QGKB`0ۼȋj7$GbpV0v`ElY麒\4}-'HO#k` sRЭom-dK`IܴV=YDjQH(((:?5bJHцI q?@ծ|'{) cqt (<9<; 6[0D#7U l?F?F^iC^i?F ڕV2:cA Y#\b+cی=+jc(ȣ$ۙ5V9=n⼹6+_ܱE#20RTd' u?$Zi e!J$ @widct0NB1Rf69ȷn]A޽ ?^BX5 xoM}8 -o}y/%rT-32G&"LoPq8~ӏ?V>g>߱R)p4`"}N9> _8~ӏ?[7$tkh^i"rdۻ=B:ܚ&cMsN=ӏ?GN? XĒjZUnց3ԞO??q8yKM>ٮou* 4ZPI2c@ς76런tq8gK]B..L@80yz\$ZL,^@ y?'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8UFtu B(!7c$(zXWjQi}]M8% n?qN?XA~P[!6ׄ(t=ԑҀ'8Xdy{}4*H֭'ehJrҤ1Ip0|7tQ7㢀0JjBzvY7Zկ4M&JKWʚl188~Dh4ֺaTT` *hҿO5G%~.SJI |9%:n>ݥV@OŚ.i^44Eluml-Ih eqs@'Щ@jJ]B?V~qkvZt1k{x=37 ;DDvBsZ3j:o~W!-Oxʟ+6m V O::{yoyuOulsQ3cWM+ TI~tGWoqo=gqErhw u@m) (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?̍_II"FL 0Q©=H+c ǟ*?ß? ǟj\]XM 2;Er`AӸ<+(Ցb[Xʠz  ǟOhq0|]ǥ V]NYHʟs4ax}|9ᩧE7>{cwWnjOyXs5\Y]QEs.Y7E($Aٞ@@ӎ<7tPX%GIUZג9+Ե=+&ypɥݫH($Ƅο^Xj6v,k4RH5ʔm<7,ر}'9}v%q3M `SWb:Oh?+>}W’^=忊EeX*)\:)g#VTWyz>q6ߙdk+%ʌeSmhZ}imwl* ixrLpU`jxЎe X[ŮژcRHQ~))}s5gv_e?p]V&ݗ_ nQ z?k =toQX?gv_M|3A/G.+_ nQ 7e(SWѽE`k ?55t#{Pp1ÂAo)p=4P1XG "Fw7 wR9 E͢ Qς)A3n\s$Ό ˀ pvpM/Z(N|NGpsMޏa*;:[xi"Bɻ ( cӑxhp:t'8#k6&162 E m|xF0I~QIRa} 3x(e%LqFD[[-$ujߎt+wBFfp#a9%ƣ$^!.aI㍔lcoƬ \fe̐0PC1LaF6Kkiiu vY#oU#"z/n8_@..[M|3A/Mҝ$+_ nQ 7e(SWѽE`k ?57M|3A/G&ݗO_F 7e(?{)+ޢ5gv_e?p]VZl xzR7ľ+Tң{fvLH 0kľ<'/T-Ѝd+פ <kkZw1O,X\\@0}8Mr?C&IOiXG2j$H=AļD82iX~Ke׵bDd;20Y."j9V+WU8V摣Z=֧7Vq;1usl>k4cNѮOOyZ`edW\ѾA}:WSO_l|;]:M9㼞YU"tOʳ3+d7OszftkbZEw#.1vzO[Fcy\<ńY 38Q'oF dk 2ݿ8 T2-uР ף[ck-e[ZT8}҇ظ$  7?jQ,Q~Vdd摓1#/MKanE%`7]6ܲxyH(xI'"hז->TNb?|\č,F@o_4+M2B`4h1 OFoqیsҵ,- ϩ$ºlljûӭӞ;ER'Hyq32;FON=jKik^]C>[] Eӥ]O[Fcy\<ńY 38Q'N|/GVne.oL.lV2+Hde:QKFVUt. GF dk 2ݿ8 T2RŴt[eI| 3w,^R 3IѼB5z ? RXD9f+#$\4q¸Я4u (fPѣ&e=ݿin1JOFm pDq$l 5s:7qqy;"0{d?^qڈJ2oy[ZχS}_RI#;wty@ g_@=8Zd-v-DR}7C1EQW4K9 9\m9];K϶YGq.pe7Rw4ucm-eI {hs".YrOv`$".Fb38ϐ:rH:$k]ti/CBŃoa@*9TԯL./uzvʣc 82 =6#^vg^b]37["gXE r p# !%IxEwb\cPҧ Fzb۩kkn#RK} NF88ݝIuzV\#>X?7gK=Cr=ǚN!vރne̵kjiht7. !6ٸD32+[Jfyz1"MI'<85jCF>p$ݷ~pqiPF[ 'ږ[i-1 *1a9'$϶3[_-K1ebcH|@xĺuk({KIfA)IR7,EOj\ZJmC~#J}Jm:S-ZrG k!_]1)i.?Vǀu13Ik.bePIp7gk_jq$;°c"bYcCORK"М6rg{dDŽX 9RvHNQ%Q*#;n2LdlF1R"zѬun=*iXa{{dR>btn$iF77v{y."yF˴Hy$uY5#Q Z౸a!`I* |5J^iRɧ=Gw !>ANC$>zmŬCtžBe%x3`eDbkjXM f՝|H95=lF4F3)\mp1KuqicM wE$D'oP9$:Tb.]uT<s_i9Goy Frq\dZP=$wcg0s~'H!M6knCmD#³9$\zݬ]եwf-'{ěG*}N溷m- ZnlKdO&`:sM%5Yn^{@n.&ٽA F,ޯe^\O{cqv%Vh 1$8ϯJ^o*= IZ3rKN m21#9"Etv[^H5}"Qӯ餌4y2G"craє{+ {L kgmNeiPQj䗼|CO6K?+㿆?R_kJ3O՚( ( ( 3^c 3^c7tQ7㢀0J[ɼ[ xOlUvkג9+6K`2pw@qΚl v=}Evib_O$O5ߧi^db}cݏG\Utcvv7g"}z$79"| v=Κlxɦ}|{7d0L0Grpp?q,n2e/2(SWhgMc?t?;c~Hawo3638/4QW>wt?;c~gMc?uR]M[m~+ >88XJmRK8gr+O*ݝA%q_xy٣?5ߧXzyz?BX'q5KuQڻI9&iKk)ebm*+X=rZE# L]/,ms˿5ߧXz"_X'Κl v=}EX$O.1֬KFP0t?;c~U֤5-2/oLP5+yn߻ib_<Xz?5ߧQ4`}}ygk'$v`q uA7Guo?TKFZ\' ykw0{I6ؑv)Rp,r*ʑʪI q<09c:7n 7kY27syjd oڙ \|݁#i_ tg]fc] =ߕpY1y0 ?fvsE][}v7O+K-˒ȨBSD@!#%NFk{ML,!fhHP!@~*E$I&v+mX@ N?@h[Ywu2(g7(9#дViYR[3C If%bFH@ b283}|ABκ:7n g*E HU7#n.70+(~K"MR[w]L ̢!/`a.Hd[X{ :m\J0R09FdGEC#H#ҡMY`vƭ#9Qe8qE k65rgMrNqJ7Vhy(=w.uiOjFv|E T)'yPi~ [вB T&Ld,}3B{LHZGG_ՁQEQEQEQEQEQEQE`j6mye3k-89xSF4JAF0io5憫^D ycHfcsC# zAV/l9m.mt$=;{w7|C[:Dwϒb)FkF뗍S Z6ޤCuZl&Mf Hw Yk.[V` 6T@c\dfBN\g\5;N=ٓ")\ e\z l`c]"׮t8($R&˒]1|įexu^[uhwh/;Tc?zķzzⶂ9Ta._3Ȏ,FO'H"!]ayż2S[$,bxX(TAE6ܒj~ntFubsk*++P[Fsi}J%K>%9]$<N㱤eXdS-vUhyݸe3i\ hF 9ǥE_Znqţ4CU/"1$T`319h<#X[| Nܡr+RQ?6QBH 3㷷z;꿭[D?Kz.Rv2ެ- qnnTc"5n\ӯmwcwo0ۖq׃NEOFg?} ?Z(((+4z_Vk4z_VhqGӎג9*imy>;xA\0YP0΃Xג9);o\(cah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+BE"f2:qW ( ( ( 3^c 3^c7tQ7㢀0Jn%N?> vMпG@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^A`ҳ^^A`ҳ@ӎ<7tPMпGNג9);o\(袊(((((((((((((((((((((((((((+4z_Vk4z_VhqGӎג9);o\)_%7Bm`Kz=Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yYJzyYJvS}__N:(q@Z_%g.xYt/l%x0^H l%rU"vP0>ր+olr1V6Yyg=# 1G&)F'U?6Yy&)F'Q Qce*? QolrXg=#e*+olr1Uu-FLK+Ne @:<`ڠУc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc+L8'$1'$x3JުooM}8oiEakyu%Qג9*>'JEPr3 oF@`F:$iA,qW.$)mǞ2<̤JcPOHp:IA/J`.цnzh]*C沰Qs!@<98I hˮ0*8Qӂ"ȻA&ܮWo 'jifiUCOs)</_s/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|yTAi*2`\?h} zӎ4+ю;'I'?db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME_Result.jpg0000644000175000017500000010124411520622074022670 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!idc5baI㷮i<=6?LV~{. `)=Q ?ϸ~~<|3\8EHKܖ=g̸$1R lvaL_ߟm]CBv +Jt8 }^! ^ʷBC3`V(EDc+$+yIdt甿/\+ZIpf(X`Mj^^^_k/a%Pۤ,m#3>u`l'=IJzOn<?t/KWe u>3b"dv~ >%dg0YB74`$JryuO;7yKRTf_ N765HYH7xQv9댚$ץGl-ʹv1ܥ11y{ S甿/Gn<|,.fF@mcӮ]6d;7hGTo1c甿/QOXLQ tW/?J䶼ѯo&mf9b!OMEe.GhgjgdY3cg- #Cz`fHIXdp"Kk=o:xMPprSM s$cT4}/jduVwV#+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƲԬn⸷J=:ԌLG9˃AY$qǬ]`8Idl aqn{7#++`UA `],{xnJmmnTbYe8qZVPiI{2H331f%If'$?_Qۿgye9۝>h-QF ;[pS`2 Ft+Bc2˵ъӸ5B)_zM}>2̆$o:8W-Q-%qͥZZGXl*r2?U4+f8۟@ִr.biUpsz֧+AEl-*sW+qwd,qUU@'t`hD2TS%ԮѪ@Ff%0@?)+yQ?D ?εQVL (5GbCY'1_OsRX:vsXdYtH%UYU[??!t¼Ӵ{n%hD̒ H^sqS5<ًFYpCbv9W:?^BkXټMsoϻ]i^7 F?Tis3X؊I{+SD ?ΏW:-1dA3vp T $#ĢEE]ll d5ѯ3RsMATSөKV 5W9?#uPn;|Y-,\d Z7\w?MATS$O?]kKR$Vfyx~[XTfXH#t”s=*vlIlgD,m|`m>y] U?t 7SOZzafqWvlGmd2-s?L#-.eTh?b W_$O?]MATS酙 DB5]a29 av+hvҳd$[9qW{$O?]U<&eڤYʱl#srsq}0OmH,6=OeQ 7%w.(l$^}E'D9_6Icvb7c5f?1f?1{zafcFZ G"CQ}=n3Odۻݿ;~\/N+w6I6Iצ 34l89ڠ` z ͇~c(͇~c)bYa,`NYsc5m! d />ݏM͇~c)rQփW.YضQgehEgbsG-?AZ=Тl -hQYضQgp4([?~(ų?‹GV-?AbsE +? ?lgضQhBų?[?~({EgbsG-?AZ=Тl -hU{ Ul,7*L _fx~ʲM8ݶ%8lsxkK-v. bK~t2%mp?K!flşdL>T J@[OxV6YǦu*wH6qu v:0w&Ko͢W1Z7#a7 `L## gڴdy߷fsFfA$ .a2mx8B;ɤEzAF/4hI;Nb\`Is; Zω5 SG!v}xd-n_%@ۂNII Q=8IhѢ8 czzJ՗VЧEI :EVWBy=A.v~#񶴶r4UG ihf|yFg";W\5]6 #]Oq-ܶ""(-ŌK~q\i玙 H/>gj'< `k5q"۲@c qJ=?oǨ_x_I*D֖6$&kii'b,Bl'V-mM[{_+x"6k`uƴ+F-Fv%vr&<LG*y=V-Z2L$¥[rԆOoD~T+|Շ).EߌuECi,2[4[,c#v9R<#" kD8g7n9 g3̏;ݟ].}8px+O㲋@I$ua@̇*Ai#ZZsqw;[(RC@S6-wtM*_xn;oJ[P$ $bGQ@k[uH?x5d]ffx' sil{RLDVD`*\ޡT%//t~WVzPlaPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Z77n b,@OzO]U__`5Q#I#C+x#S  G%χtJZ,:$r6 TONPedu&au~xrdyYʑsXD&.l ڥŶM ҠR8 AEOB?gѮQ$^lefap?>AR(#xеfI[xU'0Zkc#<OZ}ƙy! 襮d1U 覡mt >kǷ+ ;cebr3Y4M 㼚Y&hɒ6W~(Hcisp?й"(#  (@sC\EhQ@.h+pEg?й"tD%tge7i[6 xIk}wr=X@sC\E.h+ (?p?й"( G4?QB?Т3?\WG#  +B@sC\E.h+5-u[1&KhG][z5j>Kh?g[lLT3ɖE o9:?й"G4?W)?e+F+߹re3n9=3V/{u+>:6v6@rQ:G4?QB?Т3?\WG#  +B@sC\E.h+ (?p?й"( G4?VO4= [O6I,ݗwӠbqu28+ ȧc]o?zB???\WZP#  (@sC\EhW9]!&ӛQݶUwN)=Op?Jz(#aSB{"t5䍅y:C'1?&:³%̈́rܘn줬ly[ #gM@??\WG#  +BaaM:|_?-c~vd5?*QI\?*կ Wς4hOأd` 8e ںVKCAOёץk j5}HExM@ *Ͱ5_ M D5{BOaOOɻJ. xmc㸷x]YT6չJJ͡'tq<)>5°_aE!+ ϥ n<)>5Q@+ ϥ n<)>5Q@+ ϥ n<)>5Q@+ ϥ nC? <,Fu-һjGހ9VK?XxS}/kwk8VK?XxS}/kwk8eK^Fsr277{S~&3%\F1Yq 917/ w[be{WkҢm(5URKr%WmC|^_fxüdj]dA?+ ϥ nciao\NWeL=KI:'Voucyg6R 7H"p[ J|x2K鬖B$w±`>f9ߕO Ÿ}[;Xr&kz$k#4+LpDy0H[+Ӛ5kvM kq|IckuhRp@,+ ϥ n<)>5㵕%^\Z na8滙H~˼ ~Pqgi1%WShi!pe #]uv8$~.{{i5[jL3Y,}$ԔXxS}/kwhaOŠXxS}/kwj>X}ˊBnMv^}u/ Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP/_5, $jxRr#&-W[2O7 r9qZ8N[ P&K,]b(nxNkQ F]"un~~\#VI>lCh9N@B]iiϦI%(KmnEVޭ°_՟?uGQmnm^ݚD a\q tڳ%;+ ϥ n<)>5QHg Ÿ}[;P|3K,"nwVa&jy/ Ÿ}[;G+ ϥ nvP?_Iޠ?Dgw,WLf 'TeZw?OOʵk~' Tr:G]έ}yatEtJsojCAOёk&˭Ga1Wmh xpiT(_[lbhi((jG\Nl԰4?(_(CoQqG~? Ϣ4?(_(CoQqG~? Ϣ4?)X4Rv/Av5F_oQq³ G~? ?+>_oQq¹/kunL^b:K@Bme -Oz J 2( r ޣ?y9f{ud o 8DFH9z/ޣ?z:^kvDRLWI>) n̤.B.=kvZYy^<$1~4p*yW:뚀78 lz$]2 5C}XM.B1]H8x\1ߒy~fYĨ4JYHB@ I`qE%Az\%Dkwn@$7ޣ?y9丿e%Yh8fTEݒz(bPHQi{S-[~6xP\a?'^Һwzm?/V}_oQq³ G~? j> /'zzTh G~? ?+>_oQq³ G~? ?+ >~txa@;N#dV۲Ix=+ח ̋mrE|/;Lbzޣ?zh:zoHK۶䞦5gbV_oQq³3CoQqŸ{us 2\*gYbB4}_O&Q@6PtIIU?uV!ryƓZ@qi%##>duW4 e@vcϦCAOё׬QS`3OG#?E@C=?o@C=?o@C=?o@C=?o@CcٸxQ[>_\=}! #{z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?y*[W޺:oh#{z?׭({z?׭({z?׭({z?׭({z?׭({zC7u *``=}렪/?TlߓU($o+Sמi?*ף!R48O]U__n2<$g̎G}&o4tz> E}7?jWy< }&Q@?hy< P}7?j_}&EWy< /a&Gq?ZUB(xAF?MX+ѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?5u]bIFs)_jW_w]GoѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?5y+@c)<yxAF?MX)yƟ|lr=yz;B'J'TeZ?UV ,Gl8O#QD?Uy|(h?22:*|@h|ϜUb+_O*K>siU(%94D?UX+_O*K>siU(%94D?UX+_O*ItgN2U~&Q7ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜU&DQ)ȿUohD?Uh|PK>siQ?EWD?Uh|PK>siQ?EWD?Uh|PK>siTsa\L?{$U~_}_O*K>siU(jnHמi?*ף!R48O]U__n/69-dz"¼o4tz> EEl߇ E@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g][l1 RݱWBoz>g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@gqٹ!/_El߇ EWd_ݟ?Qȿ?PEl߇ EWd_ݟ?Qȿ?PEl߇ EWd_ݟ?Twq*3.?{Uyȿ?vV( k2ͨEH1{<O]UGC\i^qVP*0Ohl%$du?o?/E ]?FG^EO_}~QPQ? EW}o?PQ? EW}o?PT {j/oôĀ0c9o~&Q7}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_knafAص~@Z>g?pG*_}~Q@g?pG*_}~Q@g?pG*_Bna'͌ Uy? >g?pV( k<3yR&"|`qWi?*ף!R48O]U__CAOё׬WZixCOG8Wo1K}39>ߧϭn#~~>?>ߧϭn +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 G޲>ߧϭn/,ER`>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߪ>ߧϭn lC|c_訬c7wM~~>?>ߧϭn7c7wM~~>?>ߧϭn7c7wM~_;}l&to,X,S _~QXoӿo7GB'J'TeZn%[xأ.؃eVP44_S:J02U$g 5"jb\GCj*|@rzG?ƪv DSݻ#"MJH69@/5VHey]HbV@+9I"' 27*a=k\7@4vX\U>9Ou%sx9nOktFcg W+\@,:@?Ə?aO(e;(Rp02x>>"m/>m(Rn)3gsGcw$V2< .1B r ʤT;7wΥ^yQGsFo O%t,~barTW$cw?Ƈ|?O;ā/!Y<:n\yҀ:?c&ga]}o!ie,R3$`ޛxΚKYIfTEX03@?Ə?cWmXR9v@lM׬\[⼀ydڎWv޸8N<[c$ћby4pb N3]z럛J?l5PEP,~barTW$cw?Ƈ|?O^,}_AhރXě$c8=#u?232Jt('+{d3s,O2FRq˯^) 1.@`ddpMrCU\?c$H^GTQ՘ w8.@`pFG!Ky%&O*rFگ?+/OPio?H-OtSև_xcKA$ҹ1)' 1'ݵ`E? >g?p[w閷xOEXaY>`zV  igf1? >g?p]? SCt?MG?+ko-ſhg $v+#A A4e(X9_B5yM&P &te,)0@ҹEfEKJ@Un;{ȃdP23%;E ) 1.@`ddpMc/?ׯr@ZeeeA?OZ9OEww=,L #Vzz >!kcEC@?Ə?W$̪2Q@/4h襚Kpdp,r3*, TWOixfgܬ.Xq O>*Z@MO,UmU_Sx=>Kkhj܊rI%DdN:Tŷ0ܐK+Ͱv ݑRIo~kYo1W+T^Yft_sw?Cٿw?Cٿ@Kڤ.Gˀ* Տq9I7Eo*QK )dGf0сՁڀ:|?OCCrqح\L#4ʫ 2w7C9ڥθ4M:H\6぀p6~y0fTc xxlbD:E'cA'ҝe+4ۛ)!'؞O6Aq0p N1Z~w?Cٿw?CٿxzDh$T.bt 8.1X/隹I7Eo*QK )dGf0сՁڎ]dI\,bQ$hihHwFB8#cTiIv{Fp0cn޹c;lj3,%wo\ټP>ܝFyASNq+Bó]YjIJ]sɝ<+2ᗔ<90fTy0fT_@̓:ikmmx@6<I2$& 2AgMl47[s!PF'q\:y0fTy0fT7;/\kv[ꚤZ|I궳x'r.>WEH(  묟*$VL =js .N%,W.`* sߠ9w?Cٿo̯tDXp GOg@yF )\ @W;x|t? Qx|t? P7;/\k^?k4zEg%!%6܋{n޻Zhg$f[wP$ q3mΏUUۓ3ʕ=9,sg` Iy f;lj;lj+sſIB.qIpt{aK! Wbkд-ax.b-TS'IӚttmKF;xHbA8p3)5u`Nښ7acn6Ь'4@O81ǩjAKʦĕ G$lK xWR 롒3+&? M`(l &GhG,y.d]M*ݘg Z; țr tB,QI ?#Ut+k=!Yb>Lԅ%TB(yo/ܲJ #7@dx[k[ y.89q֫y0fTж5*b5k_*x|t? T]fח!v1FL<8lБ+% 1‹Ky2pI77#BVK6cy:ƩM 5ԩʀ6ßDZ>LѬ&dimR(IR3ۊO]U__P)d?kE9V;(4g+ȼȴ]uttF᮶LDmGHaHn82Odm|_&ϕ֮ [Ub'a`;PJ-׎*始g۔ i2K*pk"{l}r4m|_&/sZٛxo[/7F2$g<yQ.aӹ T\g$fA\R9ϕѶ9촍@j54"F%w #ֱ%uoۛH.cֶPxv&GFe,iPUVv#l}r4UՔԫ)<0<=kڎKHv,RVlو  C0zEH ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44O MsOʵhS_jWO/u _L|ZE_K$۵ǘKH)|*'11<Hy-3Qh`!#rq։@yݺg'y Cu0yxXK)# ,~s׿T&Nz?QWD7_noDcP b~Jk2,UG𕪷Q̨_H=Vy>6$Xax}|9?y>!(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@*#G?ß?MM 588#M*> r4O&jpTt؊ć\krc6_URA$MѴhmh޽EKv2O9OVO>'^D B$Q46=0w&٭B{@O!SH1$&ox8c@lI^iG8 Ӧ(>;_ tf/ϯ?:3H U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß?ß+O]U_iox0[HʤÜVP5'rE ' *E-cOuO/i6k)j"oxeɩ(,YnsEд$vw{hٙI%FI5N=.(8u4DUVtyzmⷆu$ڛzMuʲvEr: m{<Ų30?#v&K>siQ?a%Z*)ӿGӔo~]{PL幷y36v+I"f$## c#s:|A=Ise\Dkgp5NÄ#q/笸ݼ:kRH"SkjVV̖m`$rչg#K]+H. 7(Nn`G8xlkZ񵝞qd/.oI82%R* ~>Y226Y]1łw8я'i\ApI]e` 'zQ/îjt5ʼ]]ecğ8'$p{xĺAɤjkem$( P Nc {k?>Det\NrxIHitב%$H&NK]~=I47Iy An$r?0a|3ĺ^m6D{ۭоSi{E-E'n>b<qSF\ճ}f1;N~Sr;Ӻt {Ƽ]" &0?-yL@IwSc$vPa%`.e (퓱&{={SNVl0}*T/#-J9g ~n@ѕAokRKQ$%'j+_ =TCůmU28`qXNI樷<>һi#>42YIq"3*eu;t茻Ufe r͜qd5F#iJhLe1k9l7' x7%94F,QU/G%94/UMdv~򋌨rR} =-̈́WojVVZDmoI+FrѻmFF:Y-Sl}*W"6Du{[<ܪ%z6G'ķ%\K42vd $21`UF5:%]NE]9[P g7\w=KKkɷ** Qxrs$ _i>K4HFd". 0' %R>M:q@#5<}{;mG'Cqnɞi ڿ'̢Hn>S3ƷuheN扙X+2 S@3dm:qIKI'$4M79:4爇X/>f sX?&vѽN )%9QUMw =؎s4Iw/2T+~g8Cta4XJXN5IT2<c8Vӭ@Ҧ-=rI$$sl~ `ƔJn#"G]4,`>\gEL7Qkf4 ;ӵvd6GttY٧g, btYs4SvҲwpGR4kSG[bh1HB#o0NF&DS -/vU(5,W$>昆æ։6x.wa I=mAYZT{.b;dv~Cx82PJ Z+ywv7B):,u%"T2o?sg9FrqV GOEWd_ݟ?Qȿ?_vG"€,W3qg,g4auo16*vȿ?t{KKGPf(>R~5;_s{:M{dg]T"&q#ӽtl߇ ̸[ao=Yvw?L ӧBŤz }UHxc(K?a<[,i rIi I$ۣ*'e D 9^q6m<=] :K]FY'G_x~ktnGQ1]He ; A$P/3ODԤմ{{泖@YHbUqJAhU 3mai?mh8g<|MOȿ? UEl߇ @X/~(d_ݟ?P*"EX/~(d_ݟ?P*"EX/~(d_ݟ?P6ˢ>;m-~KEy 0ܼP>'{Ŏ;-<Ƶ EP]8f*\Cx m>Ъ$Nk*V,־7žJUՇ#$'UNV_W4[^FJWvH-4rH`J.ぜ t<=ygIMH]DbO0YN8<$A,cDŽ\'wҙB{LҼU5_wՋN|1);$7`RS[̭d]O_XiaA:w' fcgK}lռoq,M 'VѸ8=M-Ƨ>h-`/:ae|OLu ⒥S_wWI^ih>UJ"2nFu?$݈ѼSmݬ gyk@nmdTQu @>eœ09I5oKm6醴l\[#̎Lbytmo5Ξ2ɀZsw X.XG=sJg_MEs?<C6 G,OͥBSWQ\,OͥB 3i{)+騮g'f!hZ=ttW3 3io _-:j+Z?bx7m/e?p]5o _-<C6 G. ^q]O{sk,$6l*~?*ҵP5'rE ' *E-cOuO/kT}kC *dZ*|CGOEW}o?_}~,V +:I/! ʛyߵk~g4u:mq![Ug?pH UQ? EW}o? UQ? EW}o? UQ? EW}o?t|El|%ZI$X!wru;Tq֧GNKyu#1ζ!.鵣6 NIxvCme]FYRK87#$i lgkjr~,olЈICnY2I;c$8 WNH[iZ&d #=Z]xU. R3LI@71$z]U%Pk] +[oT9?EC@S k_x̚+[oT9?EC@S =?}fdZx:-'Qa 3&[??OoT9?k_xY4V"!rx:{X2ɢuO([??OfMG"!r̾2hoEC@S ?uO(eEk-'QG/,̚+[oT9?EC@S =?}f}-CIn]fэU4S_kGխŗ[{%tmʅYr䌃B+;IU?uVOR_fdkOuO/O'UZ?_+cO<5`_Oh( ( ( ( ( ( ( ( ( ( ( (+>/b>/b ( ( ( ( ( ( ( ( ( ( (+@Z'TeZ{ ^qVP5'rE 5>5%jI1-ghOuO/O'UZ*|@YϤQ ?E@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*Bm٭,bRIdT`H?آA_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@lHHQD |^u^ok4S_jW$TRYò XII$gUE 0+C@{)PcMM+Qwi[K D 428;(6b5Ii _*Fy . zFGLdv<5]g?p@w#K?4]c~Ptk/Xo??4]w#K?(}lk/Gu? >g?p@w#K?4]c~Ptk/Xo??4]w#K?(}lk/Gu? >g?p@w#K?4]c~P겢T@Y0K?4]c~Ptk/Xo??4]w#K?(}||Ux%)L9@ qd1>_o^sxgDR&.c^?>:<~yIJvOn'K'laz3_ws=}}߼xn1,'ۮx b}>޽9wï_w'K'lazyIJvOn:<~9wb}>޽n1,'ۮxξs=}}߼:<~yIJvOn'K'laz3_ws=}}߼xn1,'ۮx b}>޽9wï_w'K'lazyIJvOn:<~9w.onw,F\S=N&KQj:t~L djwmT$s#>p 9=O= D--.y qrΡoπ9$|3<&7O;_݆F,H0';`?*ֿO/?{FZ@x>TiLLԃ횫?E5?VQE N2G`} > EFХc?J#x>A?PFХc?J#xykaualӬFpU9&=rGH)X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ({=#:}Yxr ,0*:8 H:s.sy׹a@Pss=?A`9s!^5EnCH9g9d<kfi99̇{u 0]9s 2z3XtP4vsC_h:s.sy׹a@Pss=?A`9s!^5EnCH9g9d<kfi99̇{u 0]9s 2z3XtPGu.9oss!< T?J#(BG=/IfH@㴟S_k?/ A5?*կ DXQi\_E5?V.?Z#> E(fmUbGgs28O {dYdt*:8RBH1t} *9_awbYش-^]_OԵkX1Z6Ogjt} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW 4O MsOʵZ_;ACAFBGEJHMIMINKPLQPUSXVZ[_]a`dbfejhlkomqqurusvtxvzz}z~~րց׃ׅ؆؈ܕޙޚߝᢤᤧ㩫䬯宰尲沴!,/ HI𰥎`~gJk3jȱǏ CI[(RχPE͛8sLx2%+ ΣH*ir(Pp]JեM}>Gѫ`Ê5V]˶mYg9ݻT,87e]̯+HŐ#.b?t:k]PD]Ө1dIڛ40F ="<СYq_(6X(E (N(׺')x͍<{9ぅM%Wp &X#}y4<!:0S`Up |_h?Æ4C9*&WbCpOF5%A C@x,1 a@FOt:,R8jc*T2>p†HyYP@QY]-Bz,$KnR>LjĆtɆ?DM*{ EAXW<G};Բ pJSP=.h1z I $xzLc/",*R&PAElHI7Y^AU[/R=(Gy9A!tzi{*d/A'HA@:@[:r%pMѢUAgA b6 "2A4l8AlH$<8XV7 G>4Dxk#J xʣ׏#D 6#xx.0~\KXJއAh#"o$C@Pg㎖}hh8>{a=| ta(`(gQRye?lO$/= 2`eHFqFt|@tv +`HC7 bX (@"Ay$|A ;D39wT#E68t\8MEFt$p2AQ}$uKgʑڇ`4ͩZST 6uCOӠ45*RԥU0,|Z;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/racecar.jpg0000644000175000017500000001522011520622074022310 0ustar directhexdirecthexJFIFHH fPhotoshop 3.08BIM ResolutionHH8BIM FX Global Lighting Anglex8BIMFX Global Altitude8BIM Print Flags 8BIM Copyright Flag8BIM'Japanese Print Flags 8BIMColor Halftone SettingsH/fflff/ff2Z5-8BIMColor Transfer Settingsp8BIM Layer State8BIM Layer Groups8BIMGuides@@8BIM URL overrides8BIMSlicesyA Ohne Titel-1A8BIMLayer ID Generator Base8BIM New Windows Thumbnailp$P/@JFIFHHAdobed            $p"?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?uU&V]_΀߉W Sub.4-#oKf;﹎qsGR7~&P}o8[CfAȿ"ܛ^veMJ{GGdh7@q[sIsH?E#}?Һuz?̜.OU[kktm}?*R+ ,e4wӭev/ٽ+B@yF}ͮ\GX ϮG.vOF^s)vM>p+=vkpVǵ;nGS?Lzt,iƦ7:v6[}SO)qA$hqkHԇ'#Qp}?əuF?[o_:$>oޓg_3bGyWCo}2f~g ?$k$?_0$}럁*;HZ}`gW7z=f??,~}?Sg}?b?旨7=kS kf{3>3\IkI/S8BIM!Version compatibility infoUAdobe PhotoshopAdobe Photoshop 6.08BIM JPEG Quality@ICC_PROFILE0ADBEmntrRGB XYZ acspAPPLnone-ADBE cprt2desc0kwtptbkptrTRCgTRCbTRCrXYZgXYZbXYZtextCopyright 1999 Adobe Systems IncorporateddescAdobe RGB (1998)XYZ QXYZ curv3curv3curv3XYZ OXYZ 4,XYZ &1/!AdobedC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222A" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?AX@٫ *H2ce-߭iXM\c̑ `}3KkT"ӡrXu*;orqF* )hOxRp{U+Q 81J]";Gfl Yt<%1>RUXN(c4P9º٩cW#R$w47`16/ޢ'Ҵ{+奚0ZF'|c: ι, VOm PO$fCHEk/i]<#O`N=kxm44ŦOPkͮnj>ÿ\E]( 9 :]Gmu{-;1\9 }qjWQipJ%pvX"ЯkOCH( 'x].i 7MwH}CZ*Fq89.U'c?EjfI$h9GENruq p WʠZ4AʄG`k=5fŎӞIn˒Abp {Pݻ`HV$rHPN9UcJ(L& ՟}82KHg3w sm'O2@][Q.ukƹrIŽD@.2kU[Eys]?JaM)ger-$?^iTG<_:M1G2H'P>˧7S,)?1L~:ޝ#F N;W-zx fѼM#) P[ {wa\y5u.>^vʹꇯ׼"+Ar mME؉h*/.yuXK?l>w{Sl&rʨϸ0A e0}B ֜@1R3Ŵ;ƨCZiW`vA]>̟ٶ>?ZAVҒ >k%G$~,EuzO,t$Iie$$B=6dGtf[gD¡{uriݰ="4vN=(y*C cT=sU8V'bYGRt(|@2ؑHjЌZFXў$0haB6{{aFcf_MLݫ{R[k6_11,OrMq֛nƑBdu8 SJ3ܞX BpN:@VE Sn FqǧC1P@@S{㸦ۧ#ԂG֒|ԏ¥y:^p{uUr&My++nNUAO jcMag8_ݿ8=WJN&J߭[ *(\|wѴ¤_iaOM2 2Aa$WzD?93_F+"aNA9M.ɕٜNiBǡޔ60w3}ZF9p8Rry֝gF^ңm{Kvᾧj ?g:u F2"76h6$ ;-;zװ*1t>C3GȖ_Z% 83g>;RFJʀz;_;Xi< djY|}ܾgH?6a|N$lDvm+q(z.7\^1Sh\qTZ O6K֭V2{~+MT]F4>|R(c"}`U#=$T3'o"09;SVPXR_9 eR)kGԱ}BNAVVJ#墸K/?<Ԡ5Kfz?턔vD`h>:_z?7d~Q\XvGC#}EQ_:}QEQEQEQEQEQEQEQEQEQEQEQEdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/License.html0000644000175000017500000000767011520622074022470 0ustar directhexdirecthex
 

18. License


Versant Inc. supplies the object database engine db4o under a triple licensing regime:


    18.1. General Public License (GPL)

    db4o is free to be used:
    - for development,
    - in-house as long as no deployment to third parties takes place,
    - together with works that are placed under the GPL themselves.

    You should have received a copy of the GPL in the file db4o.license.html together with the db4o distribution.

    If you have questions about when a commercial license is required, please
    read our GPL Interpretation policy for further detail, available at:

    http://www.db4o.com/about/company/legalpolicies/gplinterpretation.aspx


    18.2. Opensource Compatibility license (dOCL)

    The db4o Opensource Compatibility License (dOCL) is designed for free/open source projects that want to embed db4o but do not want to (or are not able to) license their derivative work under the GPL in its entirety. This initiative aims to proliferate db4o into many more open source projects by providing compatibility for projects licensed under Apache, LGPL, BSD, EPL, and others, as required by our users.
    The terms of this license are available here:  "dOCL" agreement.



    18.3. Commercial License

    For incorporation into own commercial products and for use together with redistributed software that is not placed under the GPL, db4o is also available under a commercial license.

    Visit the purchasing area on the db4o website or contact db4o sales for licensing terms and pricing.


    18.4. Bundled 3rd Party Licenses


    The db4o distribution comes with the following 3rd party libraries:

    -Mono.Cecil(MIT/X11)

    Used inside Db4oTool.exe, Db4objects.Db4o.Instrumentation.dll and Db4objects.Db4o.NativeQueries.dll

    Cecil is used to read the CIL code during NQ anf TA enhancement.

    -Cecil.FlowAnalysis(MIT/X11)

    Used inside Db4oTool.exe, Db4objects.Db4o.Instrumentation.dll and Db4objects.Db4o.NativeQueries.dll

    Cecil.FlowAnalysis is used to analyse the CIL code during NQ anf TA enhancement.

    -Mono.GetOptions(MIT/X11)

    Used inside Db4oTool.exe

    Mono.GetOptions is used to parse the command line of the Db4oAdmin.exe tool.





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/TransparentPersistence.html0000644000175000017500000011246411520622074025612 0ustar directhexdirecthex
 

11. Transparent Persistence


The problem of updating deep object structures was briefly outlined in Structured objects chapter . Update Depth configuration setting gives a user a certain control over the object updating and allows to find a balance between performance and convenient object storage code. However, this balance is far from ideal:
- when update depth is zero, each piece of code should "know" how many levels of objects should be updated; this potentially creates lots of problems when the objects are refactored;
- when update depth is maximum performance can become very poor as many unchanged objects will be stored unnecessary.

The solution to this problem is to let db4o engine decide, which objects were modified and should be stored. This feature was introduced in db4o version 7.1 and was named Transparent Persistence. So how does it work?

1. Database should be configured to use TransparentPersistenceSupport.
2. Persistent classes available for Transparent Persistence must implement  IActivatable interface. This interface provides a #Bind()  method to bind an object to the object container's activator.
3. The object is bound to the IObjectContainer  when it is first stored or instantiated from the database.
4. When an object field is modified in the runtime,  #Activate()  method is called to register the object to be stored with the next commit. The difference from Transparent Activation is in the activation purpose: ActivationPurpose.Write is used for TP.
5. When the transaction is committed or the database is closed, db4o traverses the list of modified Activatable objects and persists them.
Well, that's enough of theory, let's look at an example.


    11.1. Transparent Persistence Example

       
    We will use Car and SensorReadout classes from Deep Graphs chapter. These are persistent classes, so if we want to use Transparent Persistence, we should make them "visible" to Transparent Persistence by implementing IActivatable  interface.

    using System;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Activation;
    using Db4objects.Db4o.TA;
    namespace Db4odoc.Tutorial.F1.Chapter9
    {
    public class Car : IActivatable
    {
        private readonly String _model;
        private SensorReadout _history;
        
        [Transient]
        private IActivator _activator;
        public Car(String model)
        {
            this._model=model;
            this._history=null;
        }
        public String Model
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _model;
            }
        }
        
        public SensorReadout History
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _history;
            }
        }
        
        public void snapshot()
        {   
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now,this,"oil", PollOilTemperature()));
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now, this, "water", PollWaterTemperature()));
        }
        protected double PollOilTemperature()
        {
            return 0.1* CountHistoryElements();
        }
        protected double PollWaterTemperature()
        {
            return 0.2* CountHistoryElements();
        }
        public override String ToString()
        {
            Activate(ActivationPurpose.Read);
            return string.Format("{0}/{1}", _model, CountHistoryElements());
        }
        
        private int CountHistoryElements()
        {
            Activate(ActivationPurpose.Read);
            return (_history==null ? 0 : _history.CountElements());
        }
        
        private void AppendToHistory(SensorReadout readout)
        {
            Activate(ActivationPurpose.Write);
            if(_history==null)
            {
                _history=readout;
            }
            else
            {
                _history.Append(readout);
            }
        }
        public void Activate(ActivationPurpose purpose)
        {
            if(_activator != null)
            {
                _activator.Activate(purpose);
            }
        }
        public void Bind(IActivator activator)
        {
            if (_activator == activator)
            {
                return;
            }
            if (activator != null && null != _activator)
            {
                throw new System.InvalidOperationException();
            }
            _activator = activator;
        }
    }
    }


    Note, that we've added an _activator  field, Bind  and Activate  methods to implement IActivatable  interface. In addition to that all methods that read or write object fields has got activate calls with a corresponding purpose.
    Similar modifications should be done to the SensorReadout class.
    Now we are ready to test how Transparent Persistence work. First we should configure the database to use TransparentPersistenceSupport before storing objects:        
    // storeCarAndSnapshots
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.Add(new TransparentPersistenceSupport());
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        Car car = new Car("Ferrari");
        for (int i = 0; i < 3; i++)
        {
            car.snapshot();
        }
        db.Store(car);
    }

    Ok, all the objects are stored.
    Now, let's retrieve all the stored objects and modify them:
    // modifySnapshotHistory
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.Add(new TransparentPersistenceSupport());
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        System.Console.WriteLine("Read all sensors and modify the description:");
        IObjectSet result = db.QueryByExample(typeof(Car));
        Car car = (Car)result.Next();
        SensorReadout readout = car.History;
        while (readout != null)
        {
            System.Console.WriteLine(readout);
            readout.Description = "Modified: " + readout.Description;
            readout = readout.Next;
        }
        db.Commit();
    }

    You can see that we do not have to call #store any more - all the objects are stored when #commit is called.
    Let's test that the modifications actually reached the database:
    // readSnapshotHistory
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.Add(new TransparentPersistenceSupport());
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        System.Console.WriteLine("Read all modified sensors:");
        IObjectSet result = db.QueryByExample(typeof(Car));
        Car car = (Car)result.Next();
        SensorReadout readout = car.History;
        while (readout != null)
        {
            System.Console.WriteLine(readout);
            readout = readout.Next;
        }
    }

    Yes, it is all as it should be. If you want to see the difference without Transparent Persistence, run the same examples withoutTransparentPersistenceSupport .


    11.2. Transparent Persistence Enhancement

    As we saw before enhancement tools can simplify the process for Transparent Activation. The same applies to Transparent Persistence. Actually Transparent Persistence enhancement implicitly provides TA for enhanced classes.
    For more information please refer to Enhancement chapter .


    11.3. Conclusion

    Transparent Persistence can considerably simplify the development process at the same time providing considerable performance benefits. For more information on Transparent Persistence please refer to our online reference  or your offline copy of the Reference documentation.   


    11.4. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Config;
    using Db4objects.Db4o.TA;
    using Db4odoc.Tutorial.F1;
    namespace Db4odoc.Tutorial.F1.Chapter9
    {
        public class TransparentPersistenceExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(String[] args)
            {
                File.Delete(YapFileName);
                StoreCarAndSnapshots();
                ModifySnapshotHistory();
                ReadSnapshotHistory();
            }
            public static void StoreCarAndSnapshots()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.Add(new TransparentPersistenceSupport());
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    Car car = new Car("Ferrari");
                    for (int i = 0; i < 3; i++)
                    {
                        car.snapshot();
                    }
                    db.Store(car);
                }
            }
            public static void ModifySnapshotHistory()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.Add(new TransparentPersistenceSupport());
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    System.Console.WriteLine("Read all sensors and modify the description:");
                    IObjectSet result = db.QueryByExample(typeof(Car));
                    Car car = (Car)result.Next();
                    SensorReadout readout = car.History;
                    while (readout != null)
                    {
                        System.Console.WriteLine(readout);
                        readout.Description = "Modified: " + readout.Description;
                        readout = readout.Next;
                    }
                    db.Commit();
                }
            }
            public static void ReadSnapshotHistory()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.Add(new TransparentPersistenceSupport());
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    System.Console.WriteLine("Read all modified sensors:");
                    IObjectSet result = db.QueryByExample(typeof(Car));
                    Car car = (Car)result.Next();
                    SensorReadout readout = car.History;
                    while (readout != null)
                    {
                        System.Console.WriteLine(readout);
                        readout = readout.Next;
                    }
                }
            }
        }
    }

    using System;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Activation;
    using Db4objects.Db4o.TA;
    namespace Db4odoc.Tutorial.F1.Chapter9
    {
    public class Car : IActivatable
    {
        private readonly String _model;
        private SensorReadout _history;
        
        [Transient]
        private IActivator _activator;
        public Car(String model)
        {
            this._model=model;
            this._history=null;
        }
        public String Model
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _model;
            }
        }
        
        public SensorReadout History
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _history;
            }
        }
        
        public void snapshot()
        {   
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now,this,"oil", PollOilTemperature()));
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now, this, "water", PollWaterTemperature()));
        }
        protected double PollOilTemperature()
        {
            return 0.1* CountHistoryElements();
        }
        protected double PollWaterTemperature()
        {
            return 0.2* CountHistoryElements();
        }
        public override String ToString()
        {
            Activate(ActivationPurpose.Read);
            return string.Format("{0}/{1}", _model, CountHistoryElements());
        }
        
        private int CountHistoryElements()
        {
            Activate(ActivationPurpose.Read);
            return (_history==null ? 0 : _history.CountElements());
        }
        
        private void AppendToHistory(SensorReadout readout)
        {
            Activate(ActivationPurpose.Write);
            if(_history==null)
            {
                _history=readout;
            }
            else
            {
                _history.Append(readout);
            }
        }
        public void Activate(ActivationPurpose purpose)
        {
            if(_activator != null)
            {
                _activator.Activate(purpose);
            }
        }
        public void Bind(IActivator activator)
        {
            if (_activator == activator)
            {
                return;
            }
            if (activator != null && null != _activator)
            {
                throw new System.InvalidOperationException();
            }
            _activator = activator;
        }
    }
    }

    using System;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Activation;
    using Db4objects.Db4o.TA;
    namespace Db4odoc.Tutorial.F1.Chapter9
    {
        public class SensorReadout : IActivatable
        {
            private readonly DateTime _time;
            private readonly Car _car;
            private String _description;
            private SensorReadout _next;
            [Transient]
            private IActivator _activator;
            protected SensorReadout(DateTime time, Car car, String description)
            {
                this._time = time;
                this._car = car;
                this._description = description;
                this._next = null;
            }
            public Car Car
            {
                get
                {
                    Activate(ActivationPurpose.Read);
                    return _car;
                }
            }
            public DateTime Time
            {
                get
                {
                    Activate(ActivationPurpose.Read);
                    return _time;
                }
            }
            public String Description
            {
                get
                {
                    Activate(ActivationPurpose.Read);
                    return _description;
                }
                set
                {
                    Activate(ActivationPurpose.Write);
                    _description = value;
                }
            }
            public SensorReadout Next
            {
                get
                {
                    Activate(ActivationPurpose.Read);
                    return _next;
                }
            }
            public void Append(SensorReadout readout)
            {
                Activate(ActivationPurpose.Write);
                if (_next == null)
                {
                    _next = readout;
                }
                else
                {
                    _next.Append(readout);
                }
            }
            public int CountElements()
            {
                Activate(ActivationPurpose.Read);
                return (_next == null ? 1 : _next.CountElements() + 1);
            }
            public override String ToString()
            {
                Activate(ActivationPurpose.Read);
                return String.Format("{0} : {1} : {2}", _car, _time, _description);
            }
            public void Activate(ActivationPurpose purpose)
            {
                if (_activator != null)
                {
                    _activator.Activate(purpose);
                }
            }
            public void Bind(IActivator activator)
            {
                if (_activator == activator)
                {
                    return;
                }
                if (activator != null && null != _activator)
                {
                    throw new System.InvalidOperationException();
                }
                _activator = activator;
            }
        }
    }

    using System;
    using Db4objects.Db4o.Activation;
    namespace Db4odoc.Tutorial.F1.Chapter9
    {
        public class TemperatureSensorReadout : SensorReadout
        {
            private readonly double _temperature;
            public TemperatureSensorReadout(DateTime time, Car car, string description, double temperature)
                : base(time, car, description)
            {
                this._temperature = temperature;
            }
            public double Temperature
            {
                get
                {
                    Activate(ActivationPurpose.Read);
                    return _temperature;
                }
            }
            public override String ToString()
            {
                Activate(ActivationPurpose.Read);
                return string.Format("{0} temp : {1}", base.ToString(), _temperature);
            }
        }
    }
























































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/TransparentActivation.html0000644000175000017500000006132011520622074025421 0ustar directhexdirecthex
 

10. Transparent Activation


Let's take a second look at the concept of Activation. We have seen how db4o uses a "depth" concept by default to activate objects to a specific depth when they are returned from a query.

Wouldn't it be a lot nicer, if an application would never have to worry about activating objects and if db4o could handle things transparently for us? This is what Transparent Activation was developed for.


    10.1. The Activation Problem


    We can reuse most of the code from the Deep Graphs chapter and get it to work with Transparent Activation.

    As a first step we should fill up our database with Car, Pilot and SensorReadout objects, so we have some objects to work with.

    // storeCarAndSnapshots
    Pilot pilot = new Pilot("Kimi Raikkonen", 110);
    Car car = new Car("Ferrari");
    car.Pilot = pilot;
    for (int i = 0; i < 5; i++)
    {
        car.snapshot();
    }
    db.Store(car);


    If we now rerun the code to traverse all cars and their sensor readings, we are again confronted with the same problem that we had before, we end up with some leaves of our object graph being null.  

    // retrieveSnapshotsSequentially
    IObjectSet result = db.QueryByExample(typeof (Car));
    Car car = (Car) result.Next();
    SensorReadout readout = car.History;
    while (readout != null)
    {
        Console.WriteLine(readout);
        readout = readout.Next;
    }



    10.2. Turning On Transparent Activation


    Let's configure db4o to run in Transparent Activation mode and let's try again:

    // retrieveSnapshotsSequentiallyTA
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.Add(new TransparentActivationSupport());
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        IObjectSet result = db.QueryByExample(typeof(Car));
        Car car = (Car)result.Next();
        SensorReadout readout = car.History;
        while (readout != null)
        {
            Console.WriteLine(readout);
            readout = readout.Next;
        }
    }


    Wow it worked! Is it really that easy? Principally yes. When db4o is run in Transparent Activation mode there are no surprises with null members that have not yet been read from the database.
                    

    10.3. Implementing IActivatable

                    

    When Transparent Activation is turned on, all objects that do not implement the Db4objects.Db4o.TA.IActivatable interface will be fully activated when they are used.

    Although we wont get any surprises with null objects when we work in this mode, access to the root of a deep graph may load the entire graph into memory and that can take a long time and use a lot of memory.

    To prevent immediate activation of a class you can implement the IActivatable  interface. Whenever db4o comes across an Activatable object while activating a graph of objects it will stop traversing the graph any deeper. db4o will "know" that it can activate Activatable objects on demand, so there is no reason to continue activation until these objects are really needed.

    For demonstration purposes we have made all classes used in this example Activatable and we have also added all the code required to activate by hand.

    Let's take a look at the Activatable version of our Car class:

    using System;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Activation;
    using Db4objects.Db4o.TA;
    namespace Db4odoc.Tutorial.F1.Chapter8
    {
    public class Car : IActivatable
    {
        private readonly String _model;
        private Pilot _pilot;
        private SensorReadout _history;
        
        [Transient]
        private IActivator _activator;
        public Car(String model)
        {
            this._model=model;
            this._pilot=null;
            this._history=null;
        }
        public Pilot Pilot
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _pilot;
            }
            set
            {
                Activate(ActivationPurpose.Write);
                this._pilot = value;
            }
        }
        
        public Pilot PilotWithoutActivation
        {
            get { return _pilot; }
        }
        public String Model
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _model;
            }
        }
        
        public SensorReadout History
        {
            get
            {
                Activate(ActivationPurpose.Read);
                return _history;
            }
        }
        
        public void snapshot()
        {   
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now,this,"oil", PollOilTemperature()));
            AppendToHistory(new TemperatureSensorReadout(DateTime.Now, this, "water", PollWaterTemperature()));
            AppendToHistory(new PressureSensorReadout(DateTime.Now, this, "oil", PollOilPressure()));
        }
        protected double PollOilTemperature()
        {
            return 0.1* CountHistoryElements();
        }
        protected double PollWaterTemperature()
        {
            return 0.2* CountHistoryElements();
        }
        protected double PollOilPressure()
        {
            return 0.3* CountHistoryElements();
        }
        public override String ToString()
        {
            Activate(ActivationPurpose.Read);
            return string.Format("{0}[{1}]/{2}", _model, _pilot, CountHistoryElements());
        }
        
        private int CountHistoryElements()
        {
            Activate(ActivationPurpose.Read);
            return (_history==null ? 0 : _history.CountElements());
        }
        
        private void AppendToHistory(SensorReadout readout)
        {
            Activate(ActivationPurpose.Write);
            if(_history==null)
            {
                _history=readout;
            }
            else
            {
                _history.Append(readout);
            }
        }
        public void Activate(ActivationPurpose purpose)
        {
            if(_activator != null)
            {
                _activator.Activate(purpose);
            }
        }
        public void Bind(IActivator activator)
        {
            if (_activator == activator)
            {
                return;
            }
            if (activator != null && null != _activator)
            {
                throw new System.InvalidOperationException();
            }
            _activator = activator;
        }
    }
    }


    Can you spot the member _activator, all the # Activate() calls and the two methods # Activate() and # Bind( IActivator) at the end?

    An Activatable class should store the Activator that db4o provides to the bind method in a transient variable and call # Activate() on this Activator before any field is accessed.

    If the object is already activated, the method will return immediately. If it is not, activation will happen at this time.

    We have added the PilotWithoutActivation property to the Car class to be able to demonstrate.

    // demonstrateTransparentActivation
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.Add(new TransparentActivationSupport());
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){
        IObjectSet result = db.QueryByExample(typeof (Car));
        Car car = (Car) result.Next();
        Console.WriteLine("#PilotWithoutActivation before the car is activated");
        Console.WriteLine(car.PilotWithoutActivation);
        Console.WriteLine("accessing 'Pilot' property activates the car object");
        Console.WriteLine(car.Pilot);
        Console.WriteLine("Accessing PilotWithoutActivation property after the car is activated");
        Console.WriteLine(car.PilotWithoutActivation);
    }



    10.4. Where Enhancement can help


    If all this Activatable code in a persistent class looked like a lot of typing work, do not worry: db4o comes with a tool to add this code automatically to all of your persistent classes. Read more about it in the chapter on Enhancement .  

    As a final step we should clean up the database again.

    // deleteAll
    IObjectSet result = db.QueryByExample(typeof(Object));
    foreach (object item in result)
    {
        db.Delete(item);
    }



    10.5. Conclusion


    This was just a short introduction to Transparent Activation and what it can do for you. For more detailed information please see the pages on Transparent Activation in our online reference  or in your offline copy of the Reference documentation.


    10.6. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Config;
    using Db4objects.Db4o.TA;
    using Db4odoc.Tutorial.F1;
    namespace Db4odoc.Tutorial.F1.Chapter8
    {
        public class TransparentActivationExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(String[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreCarAndSnapshots(db);
                }
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    RetrieveSnapshotsSequentially(db);
                }
                RetrieveSnapshotsSequentiallyTA();
                DemonstrateTransparentActivation();
            }

            public static void StoreCarAndSnapshots(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Kimi Raikkonen", 110);
                Car car = new Car("Ferrari");
                car.Pilot = pilot;
                for (int i = 0; i < 5; i++)
                {
                    car.snapshot();
                }
                db.Store(car);
            }
            public static void RetrieveSnapshotsSequentially(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof (Car));
                Car car = (Car) result.Next();
                SensorReadout readout = car.History;
                while (readout != null)
                {
                    Console.WriteLine(readout);
                    readout = readout.Next;
                }
            }
            public static void RetrieveSnapshotsSequentiallyTA()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.Add(new TransparentActivationSupport());
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(typeof(Car));
                    Car car = (Car)result.Next();
                    SensorReadout readout = car.History;
                    while (readout != null)
                    {
                        Console.WriteLine(readout);
                        readout = readout.Next;
                    }
                }
            }
            public static void DemonstrateTransparentActivation()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.Add(new TransparentActivationSupport());
                
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){
                    IObjectSet result = db.QueryByExample(typeof (Car));
                    Car car = (Car) result.Next();
                    Console.WriteLine("#PilotWithoutActivation before the car is activated");
                    Console.WriteLine(car.PilotWithoutActivation);
                    Console.WriteLine("accessing 'Pilot' property activates the car object");
                    Console.WriteLine(car.Pilot);
                    Console.WriteLine("Accessing PilotWithoutActivation property after the car is activated");
                    Console.WriteLine(car.PilotWithoutActivation);
                }
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/db4objects1.jpg0000644000175000017500000000675711520622074023033 0ustar directhexdirecthexJFIF``ExifMM*nv(1~QQQQ``Paint.NET v3.5.6z4BDĤ-,%.4Zd4.< ~>D\^dl CDФRT*44Ĥrtlstl ܚ𹼴Vd 籼,,C    C   5" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(+^~#ZQ8bҸX# P+X|M=Z} r1 A*`jwzZ\\DWEz*1?@3co/RKNJUO*ac$dGbȱ;wOEiwgI80`⯥Νor@S4J_'+Oߴ-;m*ĭ59tG˸D#=@C[7]u &9:R28< dטGQ=mEKC]jg8^NF ƅ7'N_<؝)]A]@3яS+)+s:jћXtj(faEPEP;⋔ޚ]#<_ň~zx7K'_er乼X#U,/Wq_iQ'╀-ߠ5HSYH&rg`54&MSϖ 'e-3Sj-Er!8ץ1Xo~[]HfaT1Xo~[G@xG'+Ok#@?=ľ!kG¢ՎWvz y''+Oᭌ0H#wc$?/|H2iuAϦGs_$Ѵ+N[D_ǰN_ -KpLj*_nqsۢ)OEF?ݓ foA~ga|u~%MOD5 #ޕEƽpz?_udᩰ3?ࡿ/9 ?=k佖6 eٞw.~<-__gɴUY)t/ŭ 2ha,[eazKi7E\=S#U8TҽWg6I)M5'YƑ4wIe UC |Mh(cTI0r#r00aWşP# :eI͆ng7#iS[JXGdtUgEQ@Q@2|KMGdB3+ƾ?LW;9ڼ1f א$N R l,f9cWCXd€?;!|BD5 {CL?fO}1ʃ={oI/,m|[_Y\;d1"ds?:m8 (Q c5w(Ҵ{믴k&;v*xM7ůZggq7_c%[+|09_NJ'p3/BT(X#[mzt6vmsI.%#R p9 ũTBnUDv=}E cg!srZ( cwҰ;麢]:]"F}^&?O?/jF|.~.|.O~ne}r2"x [ A&jWGO 5;|l5kY˗wO P@ZCA\5}>WU<&Ktg_7~!|{>[O r%ui )(06ǞUFz d^MFӢZioDP~B T@;RaʍS:jnPht+((((((H920!AUk7N9S ( TQEQEQEQEdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/Contact.html0000644000175000017500000000455211520622074022475 0ustar directhexdirecthex
 

19. Contacting Versant


Versant Corporation
255 Shoreline Drive
Suite 450
Redwood City, CA 94065
USA        

Phone
+1 (650) 232-2431
      
Fax
+1 (650) 232-2401


Sales
Fill out our sales contact form on the db4o website
or
mail to sales@db4o.com

Join the db4o Community
Join the db4o community for help, tips and tricks.  
Ask for help in the db4o forums at any time.
And take a look at additional resources on the community website.
If you want to stay informed, subscribe to our db4o blogs


Careers
career@db4o.com

Partnering
partner@db4o.com




















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Deep.html0000644000175000017500000007736011520622074021766 0ustar directhexdirecthex
 

8. Deep graphs


We have already seen how db4o handles object associations, but our running example is still quite flat and simple, compared to real-world domain models. In particular we haven't seen how db4o behaves in the presence of recursive structures. We will emulate such a structure by replacing our history list with a linked list implicitely provided by the SensorReadout class.

using System;
namespace Db4odoc.Tutorial.F1.Chapter6
{   
    public abstract class SensorReadout
    {
        DateTime _time;
        Car _car;
        string _description;
        SensorReadout _next;
        
        protected SensorReadout(DateTime time, Car car, string description)
        {
            _time = time;
            _car = car;
            _description = description;
            _next = null;            
        }
        
        public Car Car
        {
            get
            {
                return _car;
            }
        }
        
        public DateTime Time
        {
            get
            {
                return _time;
            }
        }
        
        public SensorReadout Next
        {
            get
            {
                return _next;
            }
        }
        
        public void Append(SensorReadout sensorReadout)
        {
            if (_next == null)
            {
                _next = sensorReadout;
            }
            else
            {
                _next.Append(sensorReadout);
            }
        }
        
        public int CountElements()
        {
            return (_next == null ? 1 : _next.CountElements() + 1);
        }
        
        override public string ToString()
        {
            return string.Format("{0} : {1} : {2}", _car, _time, _description);
        }
    }
}


Our car only maintains an association to a 'head' sensor readout now.

using System;
namespace Db4odoc.Tutorial.F1.Chapter6
{
    public class Car
    {
        string _model;
        Pilot _pilot;
        SensorReadout _history;
        
        public Car(string model)
        {
            _model = model;
            _pilot = null;
            _history = null;
        }
        
        public Pilot Pilot
        {
            get
            {
                return _pilot;
            }
            
            set
            {
                _pilot = value;
            }
        }
        
        public string Model
        {
            get
            {
                return _model;
            }
        }
        
        public SensorReadout GetHistory()
        {
            return _history;
        }
        
        public void Snapshot()
        {        
            AppendToHistory(new TemperatureSensorReadout(
                DateTime.Now, this, "oil", PollOilTemperature()));
            AppendToHistory(new TemperatureSensorReadout(
                DateTime.Now, this, "water", PollWaterTemperature()));
            AppendToHistory(new PressureSensorReadout(
                DateTime.Now, this, "oil", PollOilPressure()));
        }
        protected double PollOilTemperature()
        {
            return 0.1*CountHistoryElements();
        }
        
        protected double PollWaterTemperature()
        {
            return 0.2*CountHistoryElements();
        }
        
        protected double PollOilPressure()
        {
            return 0.3*CountHistoryElements();
        }
        
        override public string ToString()
        {
            return string.Format("{0}[{1}]/{2}", _model, _pilot, CountHistoryElements());
        }
        
        private int CountHistoryElements()
        {
            return (_history == null ? 0 : _history.CountElements());
        }
        
        private void AppendToHistory(SensorReadout readout)
        {
            if (_history == null)
            {
                _history = readout;
            }
            else
            {
                _history.Append(readout);
            }
        }
    }
}



    8.1. Storing and updating


    No surprises here.

    // storeCar
    Pilot pilot = new Pilot("Rubens Barrichello", 99);
    Car car = new Car("BMW");
    car.Pilot = pilot;
    db.Store(car);


    Now we would like to build a sensor readout chain. We already know about the update depth trap, so we configure this first.

    // takeManySnapshots
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
    using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
    {
        IObjectSet result = db.QueryByExample(typeof(Car));
        Car car = (Car)result.Next();
        for (int i = 0; i < 5; i++)
        {
            car.Snapshot();
        }
        db.Store(car);
    }



    8.2. Retrieving


    Now that we have a sufficiently deep structure, we'll retrieve it from the database and traverse it.

    First let's verify that we indeed have taken lots of snapshots.

    // retrieveAllSnapshots
    IObjectSet result = db.QueryByExample(typeof(SensorReadout));
    while (result.HasNext())
    {
        Console.WriteLine(result.Next());
    }


    All these readouts belong to one linked list, so we should be able to access them all by just traversing our list structure.

    // retrieveSnapshotsSequentially
    IObjectSet result = db.QueryByExample(typeof(Car));
    Car car = (Car)result.Next();
    SensorReadout readout = car.GetHistory();
    while (readout != null)
    {
        Console.WriteLine(readout);
        readout = readout.Next;
    }


    Ouch! What's happening here?



      8.2.1. Activation depth


      Deja vu - this is just the other side of the update depth issue.

      db4o cannot track when you are traversing references from objects retrieved from the database. So it would always have to return 'complete' object graphs on retrieval - in the worst case this would boil down to pulling the whole database content into memory for a single query.

      This is absolutely undesirable in most situations, so db4o provides a mechanism to give the client fine-grained control over how much he wants to pull out of the database when asking for an object. This mechanism is called activation depth and works quite similar to our familiar update depth.

      The default activation depth for any object is 5, so our example above runs into nulls after traversing 5 references.

      We can dynamically ask objects to activate their member references. This allows us to retrieve each single sensor readout in the list from the database just as needed.

      // retrieveSnapshotsSequentiallyImproved
      IObjectSet result = db.QueryByExample(typeof(Car));
      Car car = (Car)result.Next();
      SensorReadout readout = car.GetHistory();
      while (readout != null)
      {
          db.Activate(readout, 1);
          Console.WriteLine(readout);
          readout = readout.Next;
      }


      Note that 'cut' references may also influence the behavior of your objects: in this case the length of the list is calculated dynamically, and therefor constrained by activation depth.

      Instead of dynamically activating subgraph elements, you can configure activation depth statically, too. We can tell our SensorReadout class objects to cascade activation automatically, for example.

      // retrieveSnapshotsSequentiallyCascade
      IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
      config.Common.ObjectClass(typeof(TemperatureSensorReadout))
          .CascadeOnActivate(true);
      using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
      {
          IObjectSet result = db.QueryByExample(typeof(Car));
          Car car = (Car)result.Next();
          SensorReadout readout = car.GetHistory();
          while (readout != null)
          {
              Console.WriteLine(readout);
              readout = readout.Next;
          }
      }


      You have to be very careful, though. Activation issues are tricky. Db4o provides a wide range of configuration features to control activation depth at a very fine-grained level. You'll find those triggers in Db4objects.Db4o.Config.Configuration and the associated IObjectClass and IObjectField classes.

      Don't forget to clean up the database.

      // deleteAll
      IObjectSet result = db.QueryByExample(typeof(Object));
      foreach (object item in result)
      {
          db.Delete(item);
      }



    8.3. Conclusion


    Now we should have the tools at hand to work with arbitrarily complex object graphs. But so far we have only been working forward, hoping that the changes we apply to our precious data pool are correct. What if we have to roll back to a previous state due to some failure? In the next chapter  we will introduce the db4o transaction concept.


    8.4. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Config;
    namespace Db4odoc.Tutorial.F1.Chapter6
    {
        public class DeepExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreCar(db);
                }
                TakeManySnapshots();
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    RetrieveAllSnapshots(db);
                }
                using(IObjectContainer db =  Db4oEmbedded.OpenFile(YapFileName))
                {
                    RetrieveSnapshotsSequentially(db);
                    RetrieveSnapshotsSequentiallyImproved(db);
                }
                RetrieveSnapshotsSequentiallyCascade();
            }
            
            public static void StoreCar(IObjectContainer db)
            {
                Pilot pilot = new Pilot("Rubens Barrichello", 99);
                Car car = new Car("BMW");
                car.Pilot = pilot;
                db.Store(car);
            }
            
            public static void TakeManySnapshots()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(typeof(Car));
                    Car car = (Car)result.Next();
                    for (int i = 0; i < 5; i++)
                    {
                        car.Snapshot();
                    }
                    db.Store(car);
                }
            }
            
            public static void RetrieveAllSnapshots(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(SensorReadout));
                while (result.HasNext())
                {
                    Console.WriteLine(result.Next());
                }
            }
            
            public static void RetrieveSnapshotsSequentially(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(Car));
                Car car = (Car)result.Next();
                SensorReadout readout = car.GetHistory();
                while (readout != null)
                {
                    Console.WriteLine(readout);
                    readout = readout.Next;
                }
            }
            
            
            public static void RetrieveSnapshotsSequentiallyCascade()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(TemperatureSensorReadout))
                    .CascadeOnActivate(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(typeof(Car));
                    Car car = (Car)result.Next();
                    SensorReadout readout = car.GetHistory();
                    while (readout != null)
                    {
                        Console.WriteLine(readout);
                        readout = readout.Next;
                    }
                }
            }
            
            public static void RetrieveSnapshotsSequentiallyImproved(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(typeof(Car));
                Car car = (Car)result.Next();
                SensorReadout readout = car.GetHistory();
                while (readout != null)
                {
                    db.Activate(readout, 1);
                    Console.WriteLine(readout);
                    readout = readout.Next;
                }
            }
            
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/ObjectManagerOverview.html0000644000175000017500000001543711520622074025336 0ustar directhexdirecthex
 

3. Object Manager Enterprise Overview


If you did not install the Object Manager Enterprise yet, please, return to FirstGlance chapter and follow the installation instructions there.
Once the Object Manager Enterprise (OME) is installed you can see it in Visual Studio Tools menu:


You should also be able to see OME toolbar icons:



    3.1. Browsing the database

    In the previous chapter we've learned how to create a new database and store objects in it. Let's create a new database and store some objects in it now:
    // storePilots
    using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
    {
        Pilot pilot1 = new Pilot("Michael Schumacher", 100);
        db.Store(pilot1);
        Console.WriteLine("Stored {0}", pilot1);
        Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
        db.Store(pilot2);
        Console.WriteLine("Stored {0}", pilot2);
    }

    Now we can see the resultant database in the Object Manager. Please select Tools->Object Manager Enterprise->Connect (or use a shortcut button from the toolbar menu) and browse to ome.db4o file in your Local Application Data folder. (normally it is C:\Documents and Settings\[user name]\Local Settings\Application Data on Windows XP/2000, c:/Users/[user name]/AppData/Local on Windows Vista).
    Once you've connected you will see a screen similar to this:


    In this view you can see:
    -    Db4o Browser:  window displaying the contents of the open db4o database
    -    Database Properties: window displaying the properties of the open database or the properties of the selected database class
    -    Build Query: windows allowing to build a query using drag&drop functionality
    -    Query Results: window to browse the results of the query execution

    The Db4o Browser window shows that there is 1 class in the database (Pilot), which contains 2 fields: _name and _points. In the Property Viewer you can see more information about the class fields. You can also change "Indexed" field and add the index to the database by pressing "Save Index" button.
    The filter panel on the top of the view allows easier navigation through the database with lots of different classes. You can use wildcard searches and benefit from the search history to make the selection faster. To further improve the navigation experience, you can create favourite folders and drag&drop frequently used classes into these folders.


    3.2. Querying

    It is easy to retrieve all of the Pilot instances from the database: just right-click the Pilot class in Db4o Browser and select "Show All Objects". The list of the Pilot objects will be shown in the Query Result view:


    You can see object details in the detailed view below. Try to change any values and use Save button to persist the changes to the database. You can also use Delete button to delete objects from the database. For the objects containing field objects you will be prompted to use cascade on delete.
    More complex queries can be done by using Query Builder view:


    Drag "_name" field from the Db4o Browser view into the Query Builder view, set condition "Contains", put a value "a" and run the query. You can return to the Built Query tab and modify the query later on again. For example: add "AND" operator, drag "_name" field, set Condition to "Starts With" and the value to "M". Re-run the query.
    If you want only selected fields to be displayed in the query result, drag and drop fields to be displayed from Db4o Browser into "Attribute List" window.


    When the new query is created, the previous query is stored and can be selected from the history drop-down:


    More sophisticated queries can be build by joining grouped constraints using "Add Group" button.
    When you are done working with the database in OME, you can close the connection by using Tools->Object Manager Enterprise-> Disconnect menu command or by using the equivalent button on the toolbar.

    In the next chapter  we will explore more about db4o querying capabilities. You can continue using OME while going through the rest of this tutorial. If you are using the interactive version you will find the database in formula1.db4o file in your Local Application Data folder (normally it is C:\Documents and Settings\[user name]\Local Settings\Application Data on Windows XP/2000, c:/Users/[user name]/AppData/Local on Windows Vista) Please, remember to disconnect OME before running any of the tutorial examples, as only one active connection is allowed to the database file.  




















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME_QHistory.jpg0000644000175000017500000004750111520622074023201 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("`  !1QU"ARSTVab25q#46Bstu$%3r&CFd7Dec%1!2AQa"q ?6mv'3E$Ap8 $1(X.H%B1PÒ kW.8dvtR S4`Ԡq J-ĦTMpWM,2v$L-6ꯂ Dv{yͥ($g.Y{l@@@D٠I:Djǁptc@pX9n¥NM53#I.E\, QP-B:k)[Ls mMI %w]$iDzd߉$knGMAD-BkGum/%h` |Ġh7QC-!Z=cLL4:'[H4:'[H)cK˘Mxp[8QV΅0EL. #P1 LPtjzY.ߎȑ.YUkȅ~8ӺAI|uAI|uu3#UQ2( a!z vH Cu@FV.Y|H r a*`-sH|tE5 ɒRcv6趼hܻ)*iq G86X7pp2q"_8Ɇ S;LwE)'ߎL")1R*8H TUM׆^()& +esq~|+q1.vd°\;ᘮ?_, b@w LfL{b㍱POט22$QX l<`?u13zۢ`LbT\9\{paV [K՚-+u~-+u~NME%v3Kʠ+85师{,T.fslXUQU)L\S(" Ò=Wjӕ޺Z ӕ޺Z9yF'lKMR0 M2r;R0rLG8pG Z-޺Z x޺Z$UU#f5,y"(.t*@cnl(p6֫U<55 vSFDn]k\?48m?бe *STMs=\  rG$6b6C:ЗZ7o3E9T!!QCS* L䀇taeWflc1(  趜h hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh h*ebc8^C7UT˪,TId3J%-{|>XKLXABYw.RP"Lb90rƖI")HP"i9|BZԗ1k.bF)& Ĥ2P@Ls&0D7\Eu;6\*-WLlb(VPy 5W2w8 S9D0#M峉+YtY UPSܣ)XÔ?ԦQl27̧m [( ZI7)A>I7 *i-1 Qv0Jko$!"<̙M^hEbfXʢJK&el-nfԚ{==6[Dxg[v&ʥ2LR:"(E2l("& XD#ZrJV'fY[PjuAa%8\x?ѩ0ɛyzF$2(LcXo|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,te>X'Ŏ&~h-ъ`)\ V-5Anv ѨDlω- n'c" m$X 1j!IOA3ʌSdH26Zn%Z,EfuQX_Z?iG*w1"Mu\(h9TDqF?Nopuc'!MxVSGs)Ռ7=YNg9Ք5+u`ue: A CucAάV!]2V1u`ue:o{:Xw=YN:Xw7CYNcH#9Ք7*u`ue: A {:X7=YNPBάV xVSGs)Ռo{:Xw=;~,V~~,V!M xVSue: A pYNάV!MxVSue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNC58Hc 68/%!9Ք^SmArjy8&%1 Prmx <ʙjiPY4K۰z.D8 y#LH[4Rƽ=;\*DSә]GJ,TfS͊Sl @v0 {VԔQ.y$Y߸EH&G8*Gm$oD)0hzdtݝnS!V D.GC@$ ^37[N֔",Iah%lLR cDD _>5/5v"ʥkJ] R (%b|LLKjPΊ62Q5W W6(l&M%(t]K&j9 ң/wayEVfJ6TD0Gܲ~yڅqavJ=i&VK%Dq0p5 `ڪ`i*ryA {$1h) cL "a˰ ANjV}TNJ"D8$%D`%+%Crl>fJQ`(Q\eY"9A8,hBlciW;STUM@L8=)u'-*S>`ަ@@~ {CeGܭļ(UݧʘSAc&el_&a'0٨) MᬞI0d'r`pmI(*G0@F`fNgI6#PX(ف^+grCɘN[)b +9IFjs I0%K 7  ;SZ>Dl$rDp( Td(ۜD "6'ܷxoQLTY#@Q"'O1LE B!!N%R*nbN$΀'12`"NA߻ ,f  4EEvvT b8'J,0$%(P$ M*% k`(L" @e*ܥɬ)+;qLa()] ZrG;i)Z\HQIrV(%d `2v XӉEP<0UhIƅTQp ELPh9& !nUN){tdeȾ]4&sB*82@Dqw\2evTYf ul _7Nbֶ9^ldNC"jAR үEuS.Q $ #2?-[-.)#t4lR9I  3>i LG@ғ %\&M@Lg ""`p3d3VY 0ha+*=TD.$!J6cV8Ri|DKs̨O@,A.YbJ8@@boE͓As6]@ :M#9 p=rq&JI4)"WJʟ2"?9BQ MLBI2؍&|aoeF'j[G$.!")3fIjtAGΟA0QR@)rn80Iv3|9._#K;%I}R~m={3|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}xgCw({uSNIiʵt].+ J) kPD27HU#`ڞ{^}=B[:`nv)*X@s*" `:̢xW]Z-qQx8^ߘDO?/Žq~-:jG/'PYT+ȜJ@d\QkRXQ)t;Wy$n"B*l8]鬭Dzl%Yb"EP&U!XX@!=BbV$4@"`QRrT0C$̅Se'M YfrDl0.bq>f]P)S b '9lͶp3vEW/f$S$\(% MXpl=pjNQSV폒sJ&*LT[e[a#@VApe l4(LR&JDxc<1`#8‹` P7-̙GhAis>:QE Ԡbİ{ÊQlVI)ع1`͘X0DKaTr0Jjv3Gɶn1T]|_0Y)3PLBC*(v8c#nҳw3Re R-2":E$FEM r')A9 yFXVK;IRHˠB2@ QaP!jRr3ʨ̎7q4F.Q.0e4|F B]ꡐDKhp.sP Vٓk2UADL$-`.Qާ'O$_5p &lD U ܣ!#LTFȴ0d42g$PEqfs`V9Q)@M 0ء7|.!|.#8@#o 4c(>eB87 4bP} 3 |ьF{1A1x/~>h1F.oeB8A>h1F2!P} 3 |ьAq 4c(>eB8A>h1F2!P} 3 |>hP} qA1q2!|c惖؏'Fo |ьAq 4c(>eB8A>h1F2!P} 3 |ьAc|!Jo$i04sGnc#Ho?ќů0$ 2~_Q+Oz*.zuԈ{8>2nZ ;Y((AnL[|U-9x<_axU4ucXu2Z* YNZDh7n cgxe(qMx<_@,*@궀q-\Gt*@\]bDsP6ԡU6xjGԾU5xj"2@~$}@pt}KS_g4}KS_gA/M}/ڠ/M}/ڣGԾU5xjGԾU5xjaX9 +E1~eSN#lcI}Jn*`HΣOX_ ʠ.$-&/i)ruȹ(C(Q( { ]S.j(w@8ןxT -\NMjTՀ5ߨS;RbTn=2/ Gʧ pUVI6[c,!` -S\C-8<[ RU6<[]MjT~FK~DHP5)۹hyF32iÄ>CDP b*C j(OBxTU6'|Jѕ&v`'r" T{e{n,#C8+p]\,u"S8Q b0RT RT;@pt}KS_g4}KS_gA/M}/ڠ/M}/ڣGԾU5xjGԾU5xjRT RT;@pt}KS_g4}KS_gAuH6JC95*Yfg-L23~8Dư9(]KP#z"!|Bp˪`jۗT`% [[8~Av-i1ҮxXi;}  l $&KZQzy`wܨ-Pˠ * @ o ,Sk_xΏon6(GG>~ YE;R&Ұ$!{a8+Syn捛w,3@MQl"\ ._RT y1uqJ0|j9i3`3 Kid`PpaS eBVE96Z)a-Lj_ qKSog4}KS_gA#,-O0q4L;4 * QAA0qX#|F:¤* S}SB0a;Xx_*<_A_*<_Gz|k~|k~ 8:>򩯳T>򩯳TwʦPhʦQނ_*<_GBNtIi9hN ۷679(ѷ\Ho?ќwU$i7S?bטAuE?/ŽquԈ{8>2nZGG(Y9*jHTL\SGt14ИB6縆ſuB~q,]Sٷk>zيS5 @">y0,ke$qGr\*bGszMree-"9*Xk”^HUfԑB\ mup9,瓹uNxJVt;pTfT&.G5Lۊ#G,Ϧ\n)bAADN@6B|k**j=J>0ev 7*ڮ4VtBHS$Fsu:z35 2M|O6ro,  ]7-L "" RJ*2lAWXT?Jh-!]+2SxPKj -Ea nDXmY=EQ%RKU/P@`x"JLDC(LS PP(x*nUFx]ENtJx2 wx]ENtJx8]ENtJxh (dU*1c-2rU2$-4t+.e @r{"j*9&) 0K0]v *o%]tI+u\E!Q$o9xg!,pJ9I{P o{Lbn ÷tS?`HDF⠀l7p*vꃬj* |#2)I+TcpP#GzG^fIC"!BApvh\brG9fNrf`%2DsX`Eb7=V< :%] :%]zGKZͣ-uAcV-B+3p4>Uul**lJxt~>yƬ>PS*sU*sUǫA< :%] :%]zS*sU*sUǫA< :%] :%]zS*sUÒzj[:NdΙIDT U0@xҡ~.]d&g#n~.Q2F|U3-y!GY\Z}=[QQ-H~_Q+Oz*/?mC+41?\_Gfn ^+CUECeIpD; =?.#kԲR̚,(V!2QHg ĕErdrED3g6\9#@5ތ[D fl-fAyz|Ҥt-ԝDm2`r{ǹeIQM*yO.@yi :HIc{veq\o܇ *UMOTrպ Q#2uAD3WLnp4Vh/ݾ_<&mӁL3ڗrD_ZMX+8q JTY(!9]ET8G*B^-3lhV]K}"ɒ2D2P PĸBIJNT?0;Lc+R}+OH$pٹP*w 0'Oe$|i6La1L Άq,9m-pjTK  $ RC@nA/ː^H* X62v]FC#K(xN\t9yDDɜDD@D Cn":&QqpyVw|;vxGr A\5rQC*$,bb"8k4)s ,adBY?e?`ӜyD\>igIpBҔM4Bf2Y(PO2;ҟ7p.#aqwL4!VNP]f.țu(ܜ<"Ҵ1LUgU;5fej M36. q3GM5oSLJW)*GL0 JO7 a N7N(Ihj$E,re\.!8HvcAoԏ>Ϊ["%E,^ZftP.m7%@@Ïj7 Gf1=<\Vdxv)rC]4ULӰ jR7mq1BXqxH3כnjY+2ᔿ\2Ϗ`7CN`/nDLjv[,CkؾL|?^nVb3<9Lw@t)rTžS3:)-J%#L;4ԡIݤtQͨ2@9R!q1p 5z^rczu L|?^ny39ӉR2𝑳e3sn7K(D @0(׵LjuƙYu"P=%C 7 ;LL|?^nɏgԆ12r@DK{_3A~HzEIE7RDt*MrĉxkLv 0!=׀滓;ɗdAL7(n#?yF 9L,إ䠨d l1(CD"#%գP34](5"d1 Q^W(hvo02Č]9:cPHP.9VJB`zL,e)JXJ ڎi2إ \DG fu!/>L|?^nɏgԇ9ɏgԃ91 yT'.49 ɇ3כ)Ր5cP&>7R 3C@#~H3כArcu L|?^n=9ɏgԃ91 y&>7RٓH$ܤΗ*cv! ~.]d&g#n~.Q2F|U3-y!GY\Z}=[QQ-H~_Q+Oz*/?mC (2qbrC=8./`g(tST\LRH&(oE2T#.#ح/)oA*Z6 YF@q>3F@8\G;JYԀ'dDŽ>s#*׵ ٝa,qk_8C*NYbOI:8np*J(-aC {i HI:B*nAr&)obE(ih &0Hd $c7.\c -YFւYF=h8zsgg ~2vK90hڄ'WSFJ8U+(sqLDQ " w+:YfEc̡ P(Û܁0ZR_JKeaLț3vpF*Ò`zC)R2n)_w D |\rƿ-+m%$tBp<09Lc @Dn w@#-ysyt) sGYeW6j~,UZ @I)9dL2ZfDNS)r D9#PrQvrED)r Pa6p6()9"%. 0G9*Dpt S bk !ZAh R)r,W%M%2J 8' P!ie#):3e-OpeaQac\퍏bZ`^&?ѶqYFւYF=h8zLJ?YlDTz3BV `\C;/ c]@q L,gA8~WdH$PPOŃ'"p(`R`P5ggL|Um=h L|Um鏊֍G=1VzѶpg>*Z6ӱr k|5}s;1VzѶq?*Z6 YF@#=h83ggAzclL|Um=9鏊֍=1VzѶp>*Z6(ɤnDċ cN?K9wU$i7S?ctw4⩟g1k  :̢矗_޸ʋjDDZ}=[QQ-HjDŭQ!rXǫ#ŏ*˪b^x-~xo#Ň`K|,a /Do/\*Zf` 1*߉LT C#o:}CyyF0-Hk x![b"0\yF߄-pe".<ǔ`-Hk x![b"0\yF߄-pe".<ǔ`-Hk x![b"0\yF񻦊 I Fأ}C|wqFuX8HkQ0$mYo-q.<oFuX8HkQ0$mYowRH2w`"#<ߺjF"H8Hk([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ`TMlC!4' .[:JeQ4Ɖ62]W&L [* Hl @zwqdf $V,Vts

+_֬epN]vk&}'\g5{6n 諻wxސM7ݜ $SC/ 6 A]52fx&d͇B#0b'€u"ӆ'jhJqB.ˏ@B t86U-D)OViUE]\v`)fY>ThlvfCo)0b'!tfoh@iB֨]h H Y "6l!~|Eا(G;j䦬>ifqv9FFnP ꯔuZPo?մhwi)r]xḡF4K.2jH+,f.[h ꩡ޾ẘSơ bc?ᅲW g\UPj8""OLtµܝ0,4űA7׬< S>-B':#4P_y'QWm? Z-JĨNJB`,+=6 ajިg܄gjfHkZiʱ+jͤ|_Iӽ?2 DavRʅ4A]m+yk2~܌Qll={мXA*/>PܶCo&A ;1 Tf1#I{ߴD@BFo ͑/Gf z ԎBHB#H+ Ur+^IrS8<)(#?H5x ~È7T!NlH2E*Ƥ;9Gnf ~?DS4dU AcH(*MD*.ńTu])>X9\"ArppSؔG hb$.yyd A `0%1CoJXp$-_T@ L 2 f1 J2*-f>3$1gŎl,b0cQv1DdN` $ k4Q#Fx( "~Dg?K+@ :?B!IQ pH?"Ӈ>t)LetLP:TQ3?\D6P..BЄ"IIR-T͕O %OZ1 ?,pnŇ ց8S@Z@G[uulTbXnp$@BqqG(*? u֊jǂfHmR31dcǤj]jC[xsa֢~%HwS~ְ(!bֺӽ.ND=~0&n0,%H(!Z/yCTOI@W !qA@]L/-_0"7#!>. j88&Gn z'<>/|(e BUpܼ;e74h5?}< hV31mc?@6%4e0{HJmҚ{a#Lmӟ%_yyKғu~%{_S^ߙُ&JT%9bU9MrUHU2WerUJUV!ULu9 qTƀբ2*qH!E-VU9 M%S(ES?vS*Ȃ+R6R"CtPR/SD=S7(RwQ{Y@PLPS'`u]

SA(S[p,d(Z@ZOZ`\eke[A[2[qEfʥ?eQ\:0AYEv]XXhE(vhK8%dYxw]WrG8CW5__EZaŢaYv V#e(`h`!rHd <͘`gD~_&x֕^^^EpHE؎Ej]祅_ap%dN&{%eT]Vr[ō\f_6fF^F 􇦧zdAdD"I;6)Inb)g=cIX4F]hp8U29c96=֒ajj(lCls1kyl6.vYk#ZIϥ@?k)A$jiv]rYi'hF eg?#yhhSȃ`m)uvg/db7p GqG97Trr!#Wr'l)+.`@IUoCr\,VP)(o'p؜o6Fo=fX&WwoGSVmӶmnS }) F9s츎m_(P\jWոh7Khb;Ź3M deSyeK`Ȍ~yː{+0 %)ִDy]4IZ=c5y{+fmM1ٶsS >[PHjKjN\=;/k5`eѕTilbɕ`)jI?(t&sK &vYK&ig`S C P 'C9D b;-|g_'P2 sD eYq݈i<9Érț`F?"1@{ևmgCi@jU)F|%p]%PpD`oo4]o }ofnџsJ4UZj -\!f#!u(49=L,C"+"Ztg0z2p-v0d7qWd9{FFzz X"A_ ba{tHؼ&w$D\̲(G\M}}}^4~~G4ʬڭ8qPfRD'GΑ37+S2v5YM5P{K  EUZ+Z;;[& @)h\$KΥY3͇&Dz`>_sev; ՆRUX^Վ+K J׺9) )f ]eיs{+4c{u+4PI[TC؈H>" #'+Iֻ-뛙fpv]0? !F&/ ր<6ȜDA/\~ 5)Pġ ~v A|GFGw1LqWJ*x1GA yVdO̻F(\7-X%~йТWpxͪPթwM>r@JIџJT3w{I{U`*Z~-Yw:Sېۀ]K2[P2-gzO6OeP Ņwʚ8$=H& UNUK쵣2P]H-L*}El՜Y}[XY@ @Ƕj hXNN[}_=WuYlPDbB땫VΝCa46n`*Kh %Lb1Ф`+M6˿E45N sfQ0bUI2zNVZmݾW\uVdN޽X`… b3=9Scʕ-_ƜYfΝ=ZfjKFZj֭lڵmƝ[n޽[pWBNr}wIM(Vsݽ iҖ!ch_[  0@pϧD0A6g?~Gb /Đ a2LZÓv VBIAW6$㩮!YcQG|I,8jy`EZJhHZ jzE)m}Ǟz!g„`&L5!L2QCj pj;B(N;ISkyoKPF5 EQ4ZӁZ2+xԥ;/4MO=1Q#SO5uхwR ʧ54W]sEꤓ( 5!XbU]hM܌ (B&,ݵZk?3#[m[o9[q%\s] ]u]-ܹe7^y祷^ _{7`;eW`%ӊR` 5TCO=7<yPd)ҘcdA%|B gd*)eueG8-e4nl(d:̈́nU*)wgK- L14٨SGݺ΂HO>4TB M4Qώ:M;PG-S Rժ:p1;nbGhʛyD38T,e姧+;/1Kz{¯!.a ƬB DN<(Q0H'B1H8!we,HT%qyլFMΦ*2I C˳̂CtG'Uv%_654f%kZ ~k-0JjK\g̅@b{K*:bƛƉrgY `˚^E :AJDI͸`SYQta c(UVS&kkYˠTv+E.qbnUO4qjdv7Vmo$"ORfSo| ]N}_4kp*? \A f/ի)@-",-[z@0R3ܠg^@ӰơjAT Q QĚ9Dd2uXء- nv @@Fڜ|`yDr?N- yDA G `IA4x@A"1\mjTw߶@.>ByCA)+أ rIp%jV~\`<@FO }#' T`4Ї*qU PBRqfD.r\ w8K~ V.0>!9P hYPFNPhLhMkF`Tb Rrc͗F>ZozhF<𣏁'G3ܿy %\ _xBw :ڊ\)%zٚx-'6 \ⳛ{@fsI,`! Ftp`$դ1=#M%D75@j ԗ=!8Ȧ>gzΝwu]mM> A$׏G=U[Bzs`Ɖ?ёG‰=jhJy Gc x~ x9}ЇJ +? imЇI8ܴ@=` ?sAik88+6NY뱺8|`$LͣtPІD9 x#4t5h63 _?\ ;l AAܻBDDCTDfF BT_AX@ԁDz++M8,)rJ"E{yɢy<) Cۅ ],E`&WI ꑗ07'YjƩ79k 1d\":9GY<rǚ"G0=Iaj)e"$*l,q+ʷ|L4).[)>!pDaH8b. j1b:4Hk9/׉cĚIrTƜɠ/jcA0c0[J0 ۰0[:eʨS1s14<ȵ\/@)+˲-/SK|4ְ͐3<3>3@#a2 DC-E+qg4IK̐P<;xՌl۶nprtnd>w7&97lL{÷(~02 M0M깹۹Nj{;HNt#\۵^#~ O^#2CO]Sg6aˏUk,OP5RfVAY[6T6cd˼!h X껿 +<@C< MlR6 |QMљC98C=308>㸍8Q"3TA"њ{ڳ=ӽ>!q䛔lI4m ɀKl;S;;#;S[;#8/;Ż#;sLsۿ?e:dLT> t:\SD$UdA;}MBL2m<Lׄ@ c ,qE35C X:KH2|x02C2S×eY',-D.LT4sٕ57L56D)P xБڭJyį ZDLNLOYW$[8Rq:Vd˾Jd[yȂxńt 9Zŵ aӘ۸`Fghƥ[>(9-\0GZhH4ѰGx Uͅ ǕȖHڕ]b(.]ݶ3r.JQ>`(*%"ܠ5ۄ.ρhI' ʭRt_Cߢ_ _W' ]Ċ@[h_,I`vTԘ` `Ԥ5j^U#  ťUiѧɦINڿaиᅸ`CB *q+u6;cK,dPPY5[K" L^S)n5&~A`O5$P5EO1v㟁bGj|$n*Ad2)H(vMR[BHPIkRPdF&d =Q tQUOFM MBKTkޗ Q?Fb\HmWU(U?UNKCES@e`F]Nl5ԮӅu%ԮCcӕI#Q"wek-Zav`u 0JHB[g+V;=hwnft{Z8˞5Uxl`b$@KMCW@X r}n4&2qU&A4A6 ٳXk6}:WQji<=ׅR~X\ LAX$haB7ÞMcZu3 [{&= NY[ckZ-+£YV {BdkUafSmϖ.^9P>S ~9~VmEh~S~86]P/7~R؇vn.1l^|heaqܺͭ㎉Q 8 L0ퟴQYMQn:t|30FKೡ2 5 Ѐ{P&$pMaoQ p zJɧR77FɅ 5˵,Q$>R4[H8[ _ WNVPPp1m(bqo*n">]QJ]jL "!~;Oc2 P]Sk'94VcH50n4b81s+^cPP jz{uQOh˾)/" m)qF'{]̡<.[$8ԃr3L2SCnd <2d9SyЇG&dkd#2O66{Қ#pWH`Tv_zrzS)#0[/>UB.#˺VshfeհKEVe_z=k j#%MHɡRu# S7H#3&BֳS\4xS|/?gSr p/H}RG# n@F_ ݊c_Epnz;od"?ixsV?p~po}V&ilGVc|DUfA@Nߕ [;2n@ةlM3w ~[6|h|kjix~?v5bIk8[ M }f?P„ZZN>&~33 @T@?K<@|"pGZė!@U@l%̘2gҬi&Μ:w'РBg#KRD2)ԨRRj'.k*إ_Ò-k,ڴjײm-ܸmKW&)VP//\D nлJn9W1uoRdIf2MɪWnRʿgn9K!X~ٛAwm<Ȧ]N H'9,3w(3ϑiYH /}3g?;zx%&12Q^=P 43aTAE A=@QT'v\}3Rrp@44K5(ӐN'RISWN8}"H` @` f gb\㥅5"zia%Y%#| t< U(DGj<^I}AdH#sQ32hGv|B:㉆x[瀙!q9mq"KI'p% D#* JR*=8z  ;n>Sj< O$︊ʓsN^|!%Q,iJ{-A<`Ԛ2a d?{$p?~0Ob?+y$}N8Il5[LXda;蠃 drLb!_ R5pzlzB|LyM@S<j50(-~3UQQF* w6㷴q1d>A#0 7XT@b 2^Зʨ^b ?~|~(@%>UK Ю! @ENP B?CāH@%`ă Ӈ>$kRtxTNPBYHC$P$}8 vȵT%=5P#W>F0W0"Hp5n|#(9ұv#=~# )Ȗ;db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME1.jpg0000644000175000017500000011006111520622074021410 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?tYj7}4ޘ*9,z`\ rO֯I`wmr@*ǎzq[Mi%YI:+:'@89i~i㝯myK>T,actd7瞴#-pĉoԷڴv$Qnj~e}mkMyӋO8̭,pB{P~%\]iE$@2fϕI$u5LE; G*/_A\Ykވ#WVKrA8 ]4۠ 7VU,9u$tN}wω!Ʃ`:geP}^wbfoᏈM,:K) H~U{+s/F? }G\๗R{[Kuf2y;Nj#. MRYν(y6rvǜt; @;'\'^5lALG~#Ckomd۠H:dq*~x_!rVk:n1Grzt If1'fp<1Ct_Jj 38IdE"69=8徥-]8#ƫQр+zZÿEXV,̲bWb`w1O/,8SR{9TjK(^@¶d9~ջVjm*ccpm^ ^9].ss0ƦQ+؊22I94"/yG.O&gp +?Wgrz4ߗJ G5[-ݒ\3CmuxiEr@#(r A_>^F.8iCJPpcOkO#-;Ѳ<#` #Ii8_!r32MZg5{̥u65*qH=ERAuA;\CxHP#r)'?0|A\mԬTTEA #<#M*q4h|2ĀuU_]^6]-ިѶƝevqj]f`ԡlI.TVli2H#Y3fOsߍˇk18ϙq 18LE'nIKe{ kwr4IwfF!/#rEM{[mN{1$@m;ǰ k26X U7&̀I"-cYĒF$`n{GcE;fE ˽WPhi.=0pA 5]\M$g"eQ'iFj(ghK"F 2X3 Z]6zvJn zا*vq%29!Yf;in[xderH{M%wԊI+j[QJ8GRŀ1q5|lLP2ٻG<{M2*Óz9&]''M+2=8yo>B~XK:ƹjX?o6㫏7m[ >uE>k޶5,M~QΕOύWR?ӆFk||;}l ?^kk/#'Ffa WR?j_5[?—gQ/!{ݙgB7KFk{gR¿=l >d/c_0Bi5;~Y2٘z/?(][)G8_DGfaiwiS? z׭?N}m? >d/cAwi5< >/ b;3GPNY){_w]#X) m >d/{3F?ui7uk`x'W) m >do+V ? սm >dK#P~Q_ooC5a7U)}g _V+2/7ҋ5nmRjY2ձ_̡{??Ɣ_?njꣽ?Jv<_$~u ]nKlL-rW-upd9@>uR2x|c# Kbқ ooȉmU&6;38T3њﵧӚ3e<)d vrz VRG0 3dƮI=ZQNaj>bV HrYvÒ#9Tu}j'Y"ILs:$i*D$22GRY̓ -O2\J'.>vʱvMlh]Io8TFZ<.6};VO_֊wXE^[.U쑙h=Ğ*AGX%fpBv.`GR9(~oA(?CV}A5d,M+FC`3<?Z^}Z[֧v~lm3ţ\U@#={N@84@D':8C%m_C +ifDY )a-ñO5sGzlmr tFQa^P@V-r g8oW)RO,mR`Xg9"E_S[O*'fA`cی'sZj&Ki<p~V·RvC.\ z]͙@1XBy PQKEPREPQKEp(()h()hZ]"ǐ o˵AKRpmG/ypm@QRpmG)HTdܨ4Rhg?QKY4Xw%ҲRh:*_.~ڀ8??:(n3/"|Zt@ #;6F9]WOez'UW]O  iM]h6ͅ7B@=zߍgj:lܬ-rT!+WP'0Do0NqDA SHk8&rBkH{rBQh =㌤42P:pI1YNi3֬BMH Xh '_MgYu` Պ2AZџ9sh QBMĀ{ ${/,ҕ)L$bFqy $jݠ9Ze|[p1CQOm3I #8!p}*Kh11u?2VbW=!8`jP)MDTvΨ )< rNdw<~`zfx԰Je93CX}%pFV z{t$8ٙA`XNu>k-E IYIJnca #e0FNA!46Ao19K+T./?G}їcSG>ʝL.2T;SGPeau~+iPҸE'M[Jcjsך1V A=W[K+R<=G_U]K ACkˮLaϣd}j,P#v{{c1GeWNnOaV #qOlat@ ҢW1D@Q>TUlXEQn3'Um;T~է\;HF29Uc$ܒI?RI?SZ2YvLȡD,ym g5^xfLn^VBX d␱f,͒NI&TY#Fc=3Ԕ;6nsgџz(RndzZ)7Z2(he}&,knCʹbߏ9ݤس'%VdTy$v*#?{2= Vr䎃=uܛy5f .%Qamhxb3O֝u=.ծn. pѷ˒\dvǸm̒I4sWJuL}߻O! $#2YXt&W8kcY}EG{Url3ޝ*đE$Gs5 ëjrݙKPG[zn'{ZSgh#)m3?jd &DT6JH$p3NKm:WXP$9<`m8p4}̺m~3эƭ|fݷF6UurjD U7;>w7m wr3V6zUAP)"_1G o5k&)$PF/F#ch#XcY &> W$[Nv[G#_(#VotfTDo(nKstXɯZވJO1|HBH\U hvMBjPI.LDc6Ѹp; ~3o\*K3LPq `(rMfcc%͟aWi2@EevCp2x]Ӯ]4͑©zOZb)c8ea.@0""L7_a̲#*UԃӨM}?[2Ew E0܍{{X y2$$?.(?*_*_¦9ğ۳P^<200CNz?Ju W/P'?:[tAj.-ղVV x7o68ǭW78##B:~cmkl& &6tzVfjW\y>O-KL#`9IlP$u}l#e’¬NUAؼ&-غ, 33aH#p:n&.Eia2wgpzFrj[ B.1}E&o_(8e%?Ϊ&W7Q NyzU84}Ab}IYпA' RKpt[:&__𨌊"S~vA+ap9㰬f5dV&-Ny`sVuriGvnT4s],-i try)<5/so;0Y7ceʫ2FVj7n/m.,ܴ%NFUY>'pC%pLAxUrvON4b_4w$mH;uAp n9@q6'`yd$?4BV>g2?.9#jէNZ2o<9I_5Ӭ6eq(zq'p@H,&MRk+#:~0ayk!68ѹ?3o{A+& >9[([gP<[ұo4t$.G#`$` tE:67?R?¹g౻R3+r}Tc^iu[ ^+&[J(VBё* n9#$2ް 7Qy3H{¹hT|8L\+`nAu1(ORURѐgր:Ixjo/"yӥIK?2 c&ܴnG[<V@R yR 5/?G/?SQ@R yR 5/I|/QK?R 5/G/I|/TP+MF]$ؐZX8E$Z!4#5Whh[kg nG.,TE;gd=>OW[++kUsa D'bݵi]t[ff {fbb2GuG ޳i :X{=@Ie|SҞRkd8@\VtQ{տ}e3\yR[ʉcMH0 ?뵷!aIZSV osk RΨ=@''u"I>=s-Կ[\CrUuNOR:}A`>`WBާc՝ĚD1JI! 켐և#>*K7Bާmۚ z㵳ϊDt3?Ŀ]cn_-зo;[?tO/G#>*K7Bާm5ԙOPe Zg_߉OF|U?/=:ZkWrOU}ZջKi Ggk.miy4*I3Y zOU?tV2Il\ 1.UۺPPjڊú-GB֧mn<bNNq\Makеo;G Z6u-w;n+}5''NI/.Ί <,xcnO|ir߈J(  uG&? _]{s2xy#dm7Qӿ4n~"(,x_&? _]\7QuQis@GE u^E@x_&? _]\7QuQis@GE u^E@x_&? _]\7QuQis@GE?e CgufFK X1S>V<`h,ַjIH@ѯ{GimL' `v2q:U-߇VƧ{iSN/m_V5WWѼ >U̱9eRc ?>!ai[Džo\)`JLci2|1V)wHm>ˑ̓<#l#$ tE;c9prHJ()lߤ @w5oG~(dޏ'Pq3\?&?Mw#z?G&'P^>GOQ̄eOG^A#pAȮ_Nm&T𶝦1]y73d46YI䟧a]Dalq"2ۣ6%jFF8!r84ukr\`6y'B& 83/q]{Hcˁa ԝ늫{C&|[[h,r˅p+d^"$E3VOE mhȽT-k[w[:cz$lg~Y 4-Wnf;~B.n^UuU8 14|+0 Oc$QQF!@'^prk3"=S4d^ɪj 'C}G#ab<ڲ4iԷ2 $}P*;Q{cuw0toT* Tu?9ZR<(,Ivk>\R"MSTh [^ڳR6m@ 0ᜏT(di2'ڧwD6&-|ì. ]f7zOYVxX2o8{_#'OP 5)`L"> ;pʀk:Lu?*?€8&`Xo-J%u]β rx}??*Co]S@=w-m5Ak#J0~d$6--5> m<|[Hv秮;OT ??*!iho@}?S(wD6iiho@m?S(wD6ڞ`Mco L97Xi`연ˆfit]1 GP+?*Cic'G*??€@}?S(wD>;uL*AylQt&\n-qGtOi PMMn?4ѓ@wZj=uú'OOQ.rq][E\VtR;v_7A~;v_7A](((((((((((((((\ϊvg?w\ZѐV6gG>/?i* =H3fD/OTn!5'OQE=n!5'OQE=n!5'OQE=VcqE0ƩuiKTt_?@ћH3RyDt_?@ћH3RyDt_?@VkEV|B0X@פ?7^f} <B#פ?7^f} <B#פ?7^f} <B#פ?Mb"ԚE= H>*vn!5'OQE=n!5'OQE=n!C1m"ϘqU:/Ш&35a!Ơ#3_4YOθMKCR??:(ΊC.kֽsF^".kֽsF^"QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOy#ֺn<k@]to2 ӭTVXu.ۻ>R[IٌybG ?M[Y/{]~g_j~@t]mݶdՉ?Q/1_5 mnϲ~_j?m?/b1_4y1_4m>ݶdՋ?Q/?Q/'֣v}V/E|GE|@[3FBzG?v}V'E|K?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_jlzղBnW?E|I?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_j?m?/b1_4y1_4m>VƩ+m?Q/?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_jcVѷcn޼YLM'E|@۶W;~&h˝a gB?O?Q/[Vd܌jP9??:) _ȻsZ@z{G?ȻsZ@z{GB.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEvg?w\ZW3Gyw?qѿ+8?dUO@QEHQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@C?ɿkT &ѭT^uoEq][HbE۟z׮h?WE۟z׮h?Rv(((((((((((((((s>);Mڹǝr?h˼A#_FA]q:3G @<$r* LZ\ (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" )2=ir(gy7j#֢Bv5P9??:) _ȻsZ@z{G?ȻsZ@z{GB.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEvg?w\ZW3Gqr<^>kv!8PmOn#:lm$LEwR:~{)佷fI@z`rziڍմ?ݳFѹQiͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@EwTLQ>ͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@EwTLQ>ͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@zñEG:m ~WJdr1GSp\eմY\Ge+"XO VΧ-a"yJ\b2m|Y}7S [?UO?#G9' >iyek{X;[jjrQs /WQ BX$ ¶ͪe#24#h! wv`q Hw?w_-UWRvtfk"ϱ\`'պαVUm1ڧzVoA0~gk`N01z >h%y.Onz¿п?jb_/M\ T r-X#{ !Nc9WQ Bb,ې: "9dƀ7$rq><X&AT'=>Ri? _h jql~:ҿ紟ei? 몢9_@t'Y=_OzꨠW+{IV_G :W(J#=+/Gҿ紟ei? 몢9_@t'Y=_OzꨠW+{IV_G :W(J#=+/Gҿ紟ei? 몢0hq$+ִAo pĖ,8*['_2I)g^MZuΊ/?\ѿ״#?\ѿ״"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@j|Sw5s>); 3iVr ;I`+XY;\nK}gk{`A\YWsj}u1Gab5,nRŎ:m(ꗝ_t "d"b 8탟J]'AIt5ZVڀG>/@/z<[h$H&(3ZI.AK6Ek$tB&Ձc0g_6fּ:4۰گ2#N%q HIKI2:V[X`yr([dK WB.I7/)bIdSo c`ӿ?&wGo;U?9o c`ӿ?&wG)`ׇ.c&]oa+oϰ?MQѿ$M:7 }lh?+cTto G@};#haA[< wGNHV&>?5GF>4`ӿ?&/yϰ?MQѿ$M:7 }lh?+cTto G@};#haA[< wGNHV&>?5GF>4`ӿ?&/yϰ?MQѿ$M:7 }lh?+cTto G@};#hN L"x,~J?,ɿkS4/XfBF l&ѭT^uoEq][HbE۟z׮h?WE۟z׮h?Rv(((((((((((((((s>);Mڹǝr?hs]AdBHJt7Do2  E3iS5 K` ~@Uo @`{gs 6D-0PQ1ǜñyP:Q*۳b)u*H F|#4k o$FI;G5s з _MHZ|?#c-ym9ob26Im-xh)]f\rxW з _MyΗ-o}sq~o\`#q# >ey [Ŏ0OSMvx_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b0x]O!oGFw<9A _M`.?̵R Yד֭$xIr}~e)g^MZuΊ/?\ѿ״#?\ѿ״"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@j|Sw5s>); 3iS5 K` L)/o(j7Avh?Uڐ ( ( ( ( ( ( ( ( ( ( ( ( ( GJ}BZϟB5A%)g^MZuΊ/?\ѿ״?;I.u]̏ԑ"ƖWU[ )(7v?gK OʊgK Ov쨮7v?gK OʊgK Ov쨮7vs.wG}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4W3GSݟ}/)?ƪjYoKinfFH냞€97?JR_Pӿv7?JR_POմo*Rѿ״ QEQEQEQEQEQEQEQEQEQEQEQEQEKHqſ?,ɿkVpKYRFR5{տ^uoE!tI^;kvn>qYƺ) 3gy_Z y/N߼7y{vqT!.K K+h/3.]TQegWvhە~˧yiq}5Oaoxl~$v4M ʲnn_<ǽr$6)KqͰ ̬ o- :ZQ+"N!ت#>ēAڤsN>T28aW FK48i# " ݌. ?wZA$)c&dxrȬ$:B MmbO0~@tiic*ЪdeHϡvOts6*>ەG|%്FHcȣ+s)L ##ߘueSi|S׊Qc2&hFǧ\B܃B *@;p:&Hm0mUvE/QP58,_ \8!D1#lK,P#<Ŋ)mzn1.ۿUOBҬV6dnV-% cs`=A@dhأ$c~߲G,rp~}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@o`Xtml`!v"p'. cX^Bv.;[csm> gJ->ABaF#}#\BoxaeF``aR ?+@GZ}nmn&E+8!d0ZM<$,Y"ހ2w*f!I}COs% T =[F^"-@z{GREPEPEPEPEPEPEPEPEPEPEPEPEPHq@[pKYRFh??,ɿkU.sWq][E\VtR[n5xB@;{ұ3P>j,DneN 2:?F+/gW^ amX#FfTybQe$"h|Kj&H:*C:iFyi:يP ?e]|;!̈́D"oYT6!!.>qa5ԭv+y6OA&m2fN[v 8:Cm#t\ON> WaX7? Ϩ@UyD_f K&Wg9 <\&^\M%VҢo) 'Q@YKpOz8ӺZ.sd{.l F 98D*qj> Nqh o#;0#=ON,jLb%d9F8'fM48mɢ.[=8#g|U-[7W3ռ),Tm]rHPD9Q|sg=1[mwwv :$a'*n?s~IՃY,MM,MWd$iYмqoɸ;ɸ; ?ٰߘ?a/"y7y4y7y4G6Q~b(͇ߘϝϝ}G6Q~b*q>w 'Gq>w '@a/"}GM,MM,MQ͇ߘ?a/"y7y4y7y4G6Q~b(͇ߘϝϝ}G6Q~b*q>w 'Gq>w '@a/"}GM,MM,MQ͇ߘ?a/"y7y4y7y4G6Q~b*XHz7މRzVq>w 'T$a1ArdqTBB3iS5 K` ~@z =?E]Z7Av(((((((((((((})i7Ҁ8_yЖy7j k> Yד֪]@3_Olza#~R5[ٮn.no%0F+<:_;TGĆoy~Vw%69d KF\؂KvmpĐ@3-}V.:[ϥޭi:-[̔y, N;7.2S0:=޳=W ȷ @V&0 0hua_ki>ݫsD ͻY۫a+FD05Go,j@T4Kz#֕n@ }VZ} O _;P˫0Om7~e˴q(9*礼 'ֶk:?ۺ#ڷ.:}U} skַkԅP0V8% `kV~mպ`\u_ɢ:E7gtiX#] 9$ #կ$[x z2x O/u.:ޥa$hzq\7R+8'+Xq[U ly2#h apNY;K@_mտsֿvj/u{O_k!ulB)G(-}10r8=h%5}E]́#A\(ryqϖ{Tnտ__;IdxV j_;K[?kk6YOɉ%F,b3v!Tpîy5_(`m[8N~e }F@:j_;G۵o\u~O#%W˛ʋ q+3lڡWOr %I q#+<mVZ>۫пuֿvmoad M53#iB_9U%/\Ik7Ѵ_gy)#ێ?(sڷ.:VZƹd\[!cos,8,& c}zj1jqjhRH3v" L``rF wڷ.:Ms6iіႫ~4y4WR'hP߮j}@=E5 qTBB3iS5 K` ~@z =?E]Z7Av(((((((((((((})i7Ҁ8_yЖy7j k> Yד֪]@3OH>Ri't})ƴѴ˻Oj7_-uM̶D|V I.IERm2EjW̃ 8 }=χ?KbЗ]\0),;V?i.Ϊqch?m/dS$dc1޴?_xs}?es+cl 6LR( rJz^t/@+ G.I$hҗ?W?r/:O_Γ}eh?|6H&?7<J?_xs}?es+Y5k5 \H?xހ0_xs}?es(}Γ}ehY5_xs}?es+/S4-uA4pW$gzgY5մkmi/-nJ#9FrRjDŽ5-1mB+O:CZ?9>ן2b֚nooy,c 1~5I>k4¾^Q ßy+9]'I>k4xu.­$LLn~m9ǦR¾?W?ri>4یt/@+ϵ 9>ן2yϬt/@{6R㕟o V_fTq\R1K=Γ}ej"ŵ)"ڮۓ ttڭൂP5wCu\xRGmZOnzRmM)2)PXg'@>VA.k4 \ !n=AnOԮΓ}ehY5_xs}?es*hz:aJK%9uv$~Ϭs1v}.Ѳ|<3iS5 K` L)/o(j7Avh?Uڐ ( ( ( ( ( ( ( ( ( ( ( ( ( GJ}BZϟB5A%)g^MZuΊ/ήF O= Ka#~R?{ğ?Mo]phb{qSO`jNziEqwf;3@iS?vWw=Ohӻ4Q\_?NziP\_KNzu+0d~h;3G?Ҋwf;J+ӻ4iS(/Nzw=OhZ+Gz?vWw=Ohӻ4Q\_?NziEqwf;3@iS?vِިiS\Kq3qTBB3iSkwFTI6y8g &{ߐOhWkOmmxDb$8ɫvԁEfm7Gݯ~k4Efm7HuQ?@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTHqiTZ# s-g!K?oՠZ[¤P2|&ѭT^uoEq][HgWa#~Ri'_>-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@& ]E5-& ]E5s;\nh%JugqUwΊ:tPǧ;#UQ5$j.bi3qāzsGe8($@CGr95-;~֠q _/C1k'od 7M|ٶ yg$:qM}A*e5.ԗV }>ԥOw?a(u41Q\}1@ky3mӝ*q'^Am#]ȴ't D_7,e)8ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P5cgera߳Gnok;*yGU?Əw@h}fϼwU?Ə?-~ey٬?V=[>s>߳YV?4{G?74}}f4eY#hnoh-~geY#hʳG?H ϼ[ʳG?t%Y MqE-~/noj ?jK;$pRaYdr~UlH?ڭ ^Rڇ8'fԏ?74}}f?O;I*?O;G=>Y}f?74x95TRDj$54%#}9SNg[>s>߳Y'FP2Dx'8>W'nojҲj֊UpttQ2nN0?ߩ4}I!18B^AIig#KK\vlƽΊKo{YYEӧi#; s+qgL1rRѯA5}*rdIXRz;N_F.(EY%>`S(Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((|?l`Rr~b'PKF%>`PQKF%>`PQKF%>`PQKF%>`PQKF%>`PRKħ`S^1"eq@?uwZo-1\NiV#?gaGF,pzҬo_vc*m3smVm9Ҁ&jxs)uq EtS傧qmT^s5Ci) mepBX oƗvhp=HNmjk_& ;UC$NA=gtۛCmw;[FDr7q$(jN=vj?I[ѭ )_+r[w9ZjϤ_Ty>~rUb2RE0RG!Ij}ew==- 2 h?+xeY^A̜"uurA˞G 427))\?7zsKQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(_EPdb4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Tool.jpg0000644000175000017500000000343511520622074022343 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?D[DhI玞Cah G?LSKm7۽koWiyaA$ILvN7)! ]Vq2ĎB1؀I<Ԟ[.Vs`&>GOQoK#F#;#st9cI%F5t!m71$$GީKTPQw +9ӞPvztMi(wgo62j/|fpfPneOn1q.ehĈDw s׸=&YLKh33 +7sd_}mg1ٌcԗ0IYeY.,%,x>EɽΊ$fXv #.Wb`z-wSRq9lݵ:XHn|3"eTCOk[$dV}} 8-0CF"($xy=\I_M5t2m?<ƠQ=Y!iXag5;-ی%~?rR}d^' CA孿L'БjcGǏ/kl@5KE[7I]#'\gڧ_ޞEvSTR1$jтpyby7 U$O S_p"@VF*Th>[ pF`x VeRFMH#9'M/EYo"[dDB-C#9gNi%,]H݊(Xܷ\yW1$0;`/y;.}MU`ՊvW%lL0hcgげ2:޴`maXm;R5 U|Rڮ1I bPAV>o_]FmeS:?zR#8f&Ql'$ Eu#F1V?>)`zSI%d1oc[B)"Ѹ=(izf7(j`z~aW J%=-Dv dd%Mr~2ԧY Ph9[Wa4d3c9۞}GYsh0\LqrYO̿[(vf8lm㶹HwKn]JIf t*o4M# nsN*0?db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OME_Menu.jpg0000644000175000017500000002477111520622074022327 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3N5lUL˶ 1'WAWӵ].)yT eA cSIՒݣ  ct(O߭oi!-6KxyDTƊ̤L9ʒ`[N.Z@I01V$-c+{) ԭ/%UU>D?L2]Cq.I1b 2KDjW7Ʃͦ]F-ǹ9Tu-QiXφϷޚ1jXx e71FK~:k+uD"6Zitv쓛mz"rB^1x6K:kNwگ`>lʸ8D+ee=Ԉ2NsQKyImN9pxDdpX`W/& %,[O۾nc~;~7ݝ~ .ƝLjl8'x>jUӵx.d@ 3+r6{a%'$ڙ8W7_nﭭVȊ8gg Eۍsӻ4ER .QQEae(=(Q֔Fh . o+Z͹1Ԍ];q c^88:qEO i4-$ #voLf5Zyj:¯ !.A>-}|j]hC7-\ypD1ΡًZ@civH$s,mzyQ[4H4>+>{bݱI=H'?[4g!]B{,a{85gFa-HG9\(.L 82**%y=zdnB txN?_?)7g93 &REVrfUP;(\c>7Z (DgۆAL@28;G'e 4'UO&K?v\&_jZDQn-E\\hHRM$^3]}i.n '٥'lO&`N{YZMkgR[Ɨ,v yw(IBmLqE;ww0w(zЛipsyq*o)$,|\jkm= NKm2mX3p y~ i fgS5b@W4?MfgSPK?)i?EW4?iOKǰXJZgL803:[kb$dR;H k.*O-#H9}cɇ8d]=Vs7ЗWSsyu5qEXBYXmy6jx_IXZ/"V7%  6: |HT?sK-(Z}J; Y$<N3JTuG@%]f^H}ÔDY  Ϧzӿ=ӳVwO=rIZt]cQK:i|JۀCFv~~9<%n.teh@ι75CT6IfBl@8ɬQ%ɩ"]f@%Ny:z<7sy S~NȅĖ嶉U̼H9CK{[;BDzhG{1eݼϣWKlutʑp$Ve!Ưvisco=-hH6$R3AH(((((gIFy ;4mbG2RS1dd sucHmI#Ga4E 39!a2Eg d"4r4laR0MPcr~NМ9o۞5*QR&7A8ѐ}U; IomJ5tFbEͬ[8c. O[ʪO)JH6aAuVd tʏOz󖸼)$Ph Ău #M6~P8L.RE&uɥϪI C)*<|ܞCG,rW(pNvpAk$#d'IwyRo zVƑh-uor$%WxLh7)?&w00F=1L 5մ׿6 Zmdg=9Nh1H}J97 uF+q0]9*wڑO]jK|VM̫_q|v;Wmڽ]]j6{|&#mqr l]ά#m2&yϦ5#nO1bqp %:z( ( ( ( ( ( e AeݩSI4 >Y^VmŎ.e$vKX5$bĕ @u;^NZOlV'/.o4גPĥR[[Qvs#u`QE ( ( ( ( (f Kg؟7|' z_7ӢQ9h}\"`{Q&`Ryv㭍EѲ|l/&ҌJMcq4lғe_M-hp}(x"e_M-hH[oJzs+a@`}8ZAV*:ur_?oX i+2AHUz ~U˩k@g%o'm^2g41$3FE"tnWI`*_O߸`; g:nL\[N+I*[=Dѳ!PʥrYO,ۓ(F;7xLRc*+Z2bA giهM )AO\rxgIY{Wo=\:yኦvrWB@qgkk(9+&>NAqѳQZxko웅EVYT3zX浸]L7pF=X:ƤnՕKaC7дzB{KM-e Gq 3U͹J}zsO<_ iR٬ j dlepvy4keҷKHHYI'dT'Oݘ$2O.ο)9お?a4+"J+`?'$2d^*Oi0 x'i@ J̣MRݴE%dMUQ)ITm#k!_5X"c>܅&0+{EΑw& FN#'#ĚxfT!9VY>P2>M dmcQDI$i_%]H &ު`Ԋ :]ws;O0eH s E;~muɭd2-fC**dL6993-$Wr)2+;4o2G*rH#qMU.]^ l2y `K6zxĂO2A7L d3<ӺxK[謘Iԉ-*.Jx846F ITQS9;#565.o-f 4e$` vU4"$D'5 .r6BTq@l![KHϷk, *˧'N񅞫,1Y,mAJe}1EGge:NmIj.~d\n GRJh.㺞45{b^}$ PU:vְaYe|ąPȌ-[{yquJa~f$U!n ˫+[Ko.RYzg::^{X]Ԥ »|0du11ӯIV(K2M4qgv8 $\3qJl=fܒʄno<]j}͜ʓі^#a?gQ:X .6I?7n=([B`bm( Bz+1:MԼSgok~nF-1ʉ0=@9>ǃmgd m;1**71 ǯz?^[SbǧG5" H2u@Cm4kO.`S v1OiNR47<2 sJdlr=Ef]hڃ+Mk6xC 1BVvb,27u٠*."ӄsG9Qϵ04%]WpG$wq%浚1F 㷨͉u?XŢ' :2ދ޴SMfnZ7GsЯrG'%O^keR0 \"3Up "g#ǭ[Cg67c2HP@e`)'r$ҭ&0<& l %bV$SSx>3f1."G-885&ѧHݸrz,j8JwZth%¡tې4?(`AaZ@lc3\ - '5|]buD͐ݥ6ҍBcsUOA[fIvZo[FՓwʧo@Ϯ*CK(e{oxu1B< q82AtVw[,y #FѰ AVzi62tv]=ԊZW,sO8j QEQEQES?:o׏z\Ϡ"+X$ZxGSk5X?_5U?k\SAyS[/ʟz+0kC#L]d,Q: ?*ceTyS[/O~yS[/ɟzA q#:RUB f7 E&29RG# *ceTyS[/I2"+XT^ǿ^rx=q@?<筏UKNweٶ |ǁp4,Qn5N\ON8^?_5G?(ʟzTƨހ*ceTyS[/Ş4PP̩6E8GZqKpt(U`>fO=lj*ceU7p>ɜʒsR:O=lj*ceTyMA,I oRuGO=lj*ceTvZ(?pAA'\fN:*a _ʬUktOzPwo:YNֱy!ƅ=_ dN cALR,|nnu=:#:{3Cn rʁXo/]g'mfK{Yb 'ylǦxpp#/@㱒vVe UrH03֫kvomZ)X#ҍҎ<)7i>*rJܭDr&8FGxoSmq)hDAy>dDdy`H$`cwJP b ݒšKQ k/Qw7G.Not{l} ϻ%5׃?"_* 7n]qٗTvK k/G)DUE n?<A9//>׃?"_*S^8g'7|<sumn,3Goi2".Y2zG̿|šKQ k/]g\q_@qTšKWE?i%kVR3DK2k 7n'0Rmy9o%5׃?"_* 7n]qe>ݒšKQ k/Qw7G.Not{l} ϻ%5׃?"_* 7n]qٗTvK k/G)DUE n?<A9//>׃?"_*S^8g'7?vx;s f_S^}/)DU@qU.Notw7G̿ _S^8?Mx?%⫣jUXX$a2A+Jxl[N'bs5׃?"_*Z/fvGvUBpA\1xIG!McMx?%5vx;s g'7f_S^}/)DU@qU.Notw7G̿ _S^8?Mx?%/]q 7nm5OAyd@qTšKT_<A9 n?2j|Mx?%5vx;s g'7=e>ݒšKQ k/Qw7G.Not{l} ϻ3U8ZU@[a#^̣4W;*躭Y 5s~=yRc+I"=}Tk_Ώhɥ-;&ΫDA4g,9HO(˷?\$vHıo{n#T~/GЯd^5o4tLm=p0=(`z dʚK[_ܦ{ ""32|Bu`ψ}Zڄo$o%DC|́褀Q+čf;Qj% (˰rnz 0=y5ng\<9LBm|psg< &dE -0˹1C+2;լ%M9eLAF3<cBe_2J&[t%#*]u`usѴ/4y{K[xm[o.p2pX[o_.]c`z |PM@KslXszcں:y%Df ?`?k]pPDӥo<=W8(bN7Z:'-k|eKNDӥwU/GQ+A\~ amhX-*b`~)?n|,zki ZBe\ Bԕ?j_@Q+,h!@xA-S_,EpF03?\U~ Rג]7Q⳶N1D3L5,KMo,&*mwW_n>Iv=Q+ǼeGi F?ͭvv(YDdI2G̀JU4o%osXj|l \F,0U}O]`1.<܎ֿIv=Q+Oΐkm7%عm"c 1݌ !Zسd!.`!o^UhG"#Kh?9_c0=_376Vݭ70%x& X}r#+t~xMD7j6K ()dU(rVyZt: ZSA 3[\i0%R̐d4@xdz\iv[Pʡn@xΧ4#^5\wO#K\f}go=Ɗ LdWԛ 3Kzov1?%-<R |vuy촻MS1\æOiמhwQ&gqLd"6=&{jOr_$n7٣6PH6iﴞm {dW)㼷;[ 1 7RScs%5l մ(#KpH7 8J]ZW2]. Ћ*B)Uv,8Nkÿ|Es=&X^Ϧncq3 Cت+cؐJׇi$rVK}x:m3^ /j:UK#D;AbF>E6A03\ؤy.\6X 8U mUSٙ8gV4 NOxo]s$/k@Ye]G]{6iTլfErַU7ɶmWxR^T軽qvz|z\yt$0\ Aamki55 GkCLV '#n% A ĝoLu|Q%ƕ[zXM- ,^T{r~`2gG/۵{mVEP`sB9u4sKơnWSJinۦpIIkso3\ 'mݎmd#epUQ6 V1آs0mW1j 35Wڷ7[m [cMRy|jYQTObVduGxֺŽܳu n"-Z]I \|ʎj)v!;v`琂+7?0ht_(XֺpLJʎ$~2ȥâֻ~2ȥâֻ#(gW]K toK^ZJO'J2F2QdG? ['V+^ggRw2!v* a<Pbhy&־qZ V6bwӮܺYEL|Hm?>>k@bƇwh"]$!deZA0a]YAժP5;۵1mhh?g/QlZ5%B̬c`\xMeZ~i.b}/X6yEQdvF8`W u'"xggF yqp/D GI+y0V,Y|]cA_Gk 'Pvd[x*FG ǵ[ҧ4Ok׽޺yhҖ=cX q=Z UtBеs$ɜCp-G P_W2Zj7w7%fҗMt ]J> +ŚߊWDD^kCo ^\["(gVI#E/H$ffʤjU_.Ϡ#EƟgixQ]2/KsmmokY#X0($ jkîkvzmyw /ɧ3"(B1yS3J>IЇy^Oe^Im~H;3/";_UӅwU/⻪~&[J ȃu-Ҹo aGKg?)A~ oum[8O]$I T Qfzva4m5ZR!Hvlp|c|N|M'@?mqjww3Z3Ff#B/Xeq7Ro(F•pq=Gԛ ³xe[F =l5,^0Z[ZJi|Q_8Lvyz+IeKspPnkhZWݳ8vē>ư<@SaZjCnap~zxuhZ2˧Yiltq|!rpAUӼ[MV4nfg;=+~ξ ygs*vNm~>;`ou=.[HlKZ)!Ԍ*gpMw ɤb5༌8r[= G$]uGX| yLێIVSx|P)%lZm bf$9G@?i`\X!tpJA^\ _8ZxF4ln{I2K>MCMg_t3Vʴqj%w73.s=kϓf{[{^LX4ad99ß'ĺ< 9*K$ss8}rH6(t{ͦ] =8Q@rS[髩ZJv`5u4QEt_ؽE}-_4[sbhQ\/+MGiG+MGiS?MAe?C?CC~/˹Q\/+MGiG+MGiG_7s_W W eo .uEpj4R5In2K 1y_М7eIGڡ4Wj?Z^sq{LͦRk7%*ɻ26.;0G.3_}O)jT5Ԕ^IcѨ9ߦ[tߦ[tOLK#Ѩ9ߦ[tߦ[t??#Ѩ9ߦ[tߦ[t??#Ѩ9ߦ[tߦ[t??#Ѩ9ߦ[tߦ[t??#Ѩ9ߦ[tߦ[t??#Ѩ9ߦ[tߦ[t??#g/*>;> #AE~ 5]KEEyVѳoK|3z6 OWIEkUՔ]9[^G_sTm`#*+mğ__'G+~'mo/0V3GTWϿ 7? ?9G6 OQ? kUr#*+mğ__'G(Q\?Ռ6 OQ xOB._y@U\ __'G(WIQ?~'mo/c<*._}E| xk+$(?ж _/>}WIQ?@or[[X? AQ_>k+$( 7? ?9G-AgW@ormğGr V3GTWϿ 7? ?9G6 OQ? kUr#*+mğ__'G(Q\?Ռ6 OQ xOB._y@U\ __'G(WIQ?~'mo/c<*._}E| xk+$(?ж _/>}WIQ?@or[[X? AQ_>k+$( 7? ?9G-AgW@ormğGr V3GTWϿ 7? ?9G6 OQ? kUr#*+mğ__'G(Q\?Ռ6 OQ xOB._y@U\ __'G(WIQ?~'mo/c<*._}E| xk+$(?ж _/&#ђ\'>1z_2j8ԕ:PƤ>> (((((((((('_sZ}Զ.]@q"A!`g5Nj E֒%ն_6810$ݬ[&m#;~XY[-φn'uș^;s,L*x-uK/v:ěK2Kt>xt:%n+EJmYyo1I8QI.m6N/|k>wkxZk5ۡrX3z~+xgEԬtn{koc$`(y<`sV\$\կeN{ڴK:2V2EZM+F.yEymGSG E'pd'P$cGΈZ M}ۘK_s*B{85, M^^6{drψ0*s5e-EEsp!q!v g oZ~}ڰ`ȑGa][4CNhnki[$"E;;gڼy Vteٵh{o̿മyt4<[7Wk_vP}OG{i,VCrhP3z:ck>Ю$~Hf]7E$\(9IKIjF:+kw$wNq?JrST\Ӻۄ.sIYI6ݽ:>6hڪۛchpJ8z\?.>$wރv+WPx=9g`ǚS}~̮mڵծt3y6'nY(ۙr)]]+&ǨQLE4`Pi TQEQEQEQEQEQEQEQEQEQEtdOsRG 9dXoUcG#?Jko?oʡJtz.?tM_DoOSR#iPoW+-&aϰY>lpkS@Yl Fn WM?0 ec8 3ҽZ~(ֶߦ %f.X.[(]^ڧ^#xGJWoXMOKymR_ԠlB ܺx?o>HJP:~aקk[y\ҥ;"Ch򓷚8ʛnئ(o]hV<Kz͖qKs,Zi ȥdlzJAkk%+YK՟ IW<^mMk[yrx8TߚwmtOqbrNTwM6qOH]+M8>.ۻ?PPF!df>g9Q9z;o@ǁ5q\\\-֜ S3 #8 {7QmMRWRno^tnP('vW U =}9֓\Ӣj _4g8]=GkFxöƟpPζ`I#a.)#9'Ai7WVsj3<)2@vAF+ovhM"[fWW18δ57UP2)rb/mUS؍P^!<zsOj:`\EeBrU0$gc#vAF+?i-; K|E3ar8 }gOk|ZHrQz Z(6AF)hrQ G|;P/G_=~_T|w`}#Gj=;q_kۿLOV7bt~Tl_ʸ?^^ m3f;wT Eiو"A˨Eux P2J.rzWʍX[-\EQ?*kzvrj7${0z(,FIicRN:"{_=|ԏs+55t?*6/GYxȑǮi;-V2ZR2#<9֒ƾk]a6ėq7d7~*066/GFi%ЯnŦ{zl,R[>lxK/5u lInHąźP:g7J_,͍Q?*sX x, %UN9Ȩ-K^ޥg=ܐF(9*}zTrɫ Q?*/>ҭg^xooKHgY[8$zV^*f{ȁuܡh 8~^}j*]Ņ?*6/G\WZ޳,&XapTK"B_8#scşx^_u+u㵒3Z3! ?cWGݎ/GFPG W J 6adȬ?K{]CR9Xf2ICR>#19E\Vl/GF"ҭ]N)/uv3pGLyg=+;Z:*p><Q?*55SAZ[\ݧVh˒@ 'GtEM^-X%r'c!ح%FRn/]ؿڞcٽޡyct2h3ah?;:fqRIWRL!BIWzNr2Zbt~Tl_ʹ}?⏅5+]J=z+m:ۙ'X.LjK? 犯|:/T*boW9|/'cU^z_Y&ؿgGmk8[']0-}]s>1᥻l[Ggj9'مmQ?*>"Gx\뺼mx-aA$M"&UfI j ▍_YiY-(Fibo'~ Q1]?*6/GY%ֻPٺBHS8z^n9u Yuz"Fd>`)F:?&Ѯ5XV+I yI/ƑV_ ^w;Q?*Η<.eWFs]oNЭѩ_is۩5,@ebؿPZU0˩5zFk3:gf'<wUmXID#;\( ;UsJ)݅:Q?*߈.Ed#տ-\Qu@ !XLϱ;b8F㐠΂ :toE]KlІfX݋~DTw|W;Z `l֓Y2ڔ*(vlݿ1dC}5C -̾t,RL. c [kƢ4#iOJfl|?4~uO6D3dV 7į?/2Qk+yO#cx* 6s:-O{.6f[HKa$Fʁ ">x7Uݮ->Z.USkʍz>޷.0QC8(g1*a'2jZ/[Y}&m:{[lnXM;6WxA;I9Ey=kIe.t$[n/~ė37HEmBwr1zZ(;JB?g/*>;> G5&'+<'OzΩE΋j; h++|W~--q3FT dA!3n16<99@Ӡ6svNSng<ٷu1 K# sxKzrL֯IOe,ϰLu|VV^WBҹ_οm?XӴ}Ǥ^O뒘F"n#}ˈ`o%ylH-fY!g[Vh%Ey,^ i}~J IʕO((쪶g럴Nj6W-{59L\Ÿ/TRц: RW[jծBJkB~sw,c:o*(S՝8!2 rJ 鿳yN4i_q#v䒿1?wȤ־:xMFg}i|zFwgGgrӭ 0[;doڃZ/Ӧ\؛˒YS-Z0v:sҔSVw~u?|Mo:zm~is8k!]+ ]ICFX/x?uU֬`YMm񶸅KwB].Dee.i |g5ZibO>vKvhXS>U1Bed/oO>iK 6ډ`0cC\]EP'6:u~^e߄ھ[~cn/l/%ⷼiQQT20U8ZZ?/MKϫErb0DyI q0_(qw?Y.^[5׆᱾KO9fJ<><唞~%O~Zxt>ssӘaVIfTf (&h{K.t ͱ~\MtJIW+lх<;9oH`wMpA+yk>c;hE$#'=X/on!];kioqo,K$o/ vyNhÂc^F_ya}_\\FխěQ"%F@%_0Q)A);Z^iy/[ռI\V}u=;Uyݧ-*к. H`Yቨ~):·ie/&-Ӊ#q5wH&юWIjo<$gek{`k{ g"3jI] XhxM/I^"jm8ಉ swv' f4ҋZuw/Wqok}k'd煠E c^h\_?fOIԼ76ER4K&d٦a-ˍcѤ|WE_7R0ho&VY3)VKA pU n񇊿ml|/}[_juJmme20#2`( )$Sy."W2VG\~+Xkkym(w v+T*#hx8/x_/NZֱ{smv.KnY{o< NXvֿ []KCTm fm ҨfrT?_O;6ֺWXK|,hkIeȅ/RkZ'hTvo%ml?鍹S_5/PKu-'Q|ɛQ(t1 `wv1\7f?\M;Y +9k.+x/ndp$T b-۩Ѿ1þ(;'H3x{Vm>~P`y8pw |w~+j0EwkK]Z5BR;tR`ҹ폁层_ÓoO'(`__p,AnA ׇ_7nF-D̷WlgkfH pk+|1mwS>PiNur n2|5ߴfycͧfΟqk\Ln;f0`chOI/c%uv$1u>2TG}2]cQ2,%ċrIm/*ܧ'HN휺csfzUǖ1^^']SXԭtYYO txԕG=g}3lˈչwkh"Y&Yrʭ&-T.`/u?z=֩yg}w-4 )$++H x ^׮Mue[WO:9XX9p'8Tc.i6Zt]5uO^ -go4iHD eTf\ 3Ǜ꿳Gm.]ق%[t.|ZfhW么QS?_ᮝj=tiw}="XF7JͱznGWVᨬ#5{-FB "7ܱx~ = S0Ri.nJԋwVȓ~?xOiQe#Y\ HrxM9"o~О$75˟ iTUjW$̰ۏ(ULw9EcNtO~|W.x/}Q坜:wW tWu[#a=!TeZn\t+O HBfݔd:lx N_oɮսݾh!O<ښڧ䑱C z9,QI'uh~plvwgh]E +0%22X&F>wݹ[}s_о xnMэ}]>^-H< |##'%f mzZw!YCLzd;|Y v7v.ym7bS8fƇv0~ΤcqgީC]%59V A@'\:eyF_DGoB}L(n#՝-Vjw71C4jS O} #l?q4"og-i$(Am>yZL^XbTeZZRrѳ, J˾XV[,&mݙ@Y|^p0˹%#ߤ:37/-W2S!GAA$Taߴͱ-O[i#~!'V_+M:ntMOwvO9,nmD:0P>ß aoYhrGy-urnq_LQ\ǒ/7ĦֈSkAeuit͢i-ⶊP淗dDX})oMx+K{%.-f |ղPEM|mLLTj%''-#ђG?QCL( oտ-\;K[[kᲒVYbg-l(g_瓐+j?Z_^ 5gA޿9M>G>Io꼞UxoJ͵-1yd9;w0+Qj+iR&m>X"DN w'UO6:[+:YظU\ rhKeV r7P3~7b=?F6;8-s^q|;3H<jtn` XwNA;Rb,Wh%Io^Y8nm>Tۊ{j JTԊ|kYNRfgyˆ`:*0XrGOOAs6鰹#w=BΈ TG'ҼKxk]40e!~LD`qjo/"5Yũ%H3Y$xA9@x;CoӴ{[5 ۘܐ0 v.lҴlf鹇#V-*9Vm >Ozpqn9;4;My!N6ܪaA}ƖCZIcp!̃c'&(R^j7e;6v6%s[tQ@Q@%G?v_CHڅ}_W#D<>.&l<[ٛ ,+j3rnkI< Yh֗EEDzwg,-XzQDDψxX.Qj>fnV2C2pLmƅ~Um([@LiMhZ $żҵI!WBZC6fq*y7v^vo?>=2BӴ5+kFJTus5B9@@*%py!ÏYiQje3ϔ\RW犊):W{uOkk=7; ?_~iMY-؁d!s NH0𗋮 kBԧ,㰺{ʑ%#~]Wگln|=/.- 5K9YzaHO6on-6vJBf4QXaEt*(l~-z[nY1Ưš5ԗgڙ|ql 'Ux6=gOKϰA#F1RԆSz;ׄk{k{MG'c[ !FU98VG`C--vyv6j#9h4EJ wzifgY?]"{@"HCE"IR1ąX 0[ "_OjhdF `*q"7|_mo$>}&V?Gx?|Déq3~ լOhkyTbH{# iZ(O5޺kqῄ u C{Viͼ!XT*U6=5~xڋcq%f H09o1UCH|e$wK.|ֺ.cul^dd >3&Mz~g_xz; Z=@ie֪`D n0pͱY.NH]+S伡k_[wl6Y_hFtav`k+~vaǕҳ5/> 6F4'ٖ7h2[?2 yg)4ZGxrxxn:s¸2e'I}B>ym_m?'區.d!wm\j#B_Myc\|>59l!K WX,Kon۳2T4r!W > m.sXM-;OjkrYm*of8jjz%aރ{p4Z65-NѮ~U'qWUxivzTzɡ̗"c\$+Uy[Uc~j5<=}XDeĚl!m  汕&R滾$^k;O tR7tLj~R % ǭsVU+EӬ.䶴[x"7E6qYx$;jטi'GҴ&X.4Yco;q9ʼn'9<)ִGS[\jCy%1f>SG tK >ݟmV.5緹l[fKYM'c_0FӡP >x[_Ï$wzim_T4xgmwJҕwoV-tK JjItwݮZuSG_ GIѬt"8#Yw.HuI(B~P*a7qj]iV"xX`1ld0>0?.EtZ^<U~ U0ʸ ZXHþ'pb{k nYQf{vw0,CSNI;]vEeڞqzݞm &#)0c!A)-sZ jzt7˓&yl䖈NM|gSW=w_-n<3siVq"j&K`L0&6C&Lk/ +OHOXVkm&yݪ FuRRjka%]E?Vw:? xKf.JJC+yyLRA6 7h,㵆Ƃ$mѣ*Qe $?#Mi-Au[]G oG6\\G+Pp|{]޷k{ :T$bZB FNUHTjt(7 MRi_EK~(Gw7. -|{ny@}ːHw<y bK[v[ E$埐EyP*;Ho$< :p8 >Ӽ%>eXnΨiʌa2 op8+S#\Km-B d{m _P/Pkse\@1q:Ubn@$X"[ivQ' N{5ʶ6yC&Fb.0D[U[ N+~ J[w;T7y0&vEFs!v3<ٛ ̑**,*Uvr{zo 4+w;n-d-;-osǔ#ԾSS Y牢qKWF RU -K6ydGC+Lؖc#9$Wԃio~Vrk/k[x~{󭮱%+[Hm",rXυV5yF66x: J+*;ȝbC9",lvڿ $Z[rK@,uPSzoƉgwp!{Cno5 6k:qrQDSp@lg <64[6ږ}bYcPHl#SrQU{]CW:|m"`m" j'Ogy<{s"2]$W!$ vFvᇇu ŝ7Ie*lzN?9N}ǿO{v ñ|7uͼoE-J+]EM5LUB~1l;_eK? |;ZGH+0.dxW!bU唆##aW[\XҩUʊ{&($((((((k"(`y((((((((#ђGPS=Go jW-\kB}W֬4ۓ*jh!d`GE7c@/.6OI/?8?&? n2c@/.6OI/?8?&? n2c@/.6OI/?8?&? n2c@/.6OI/?8?&? ?g/*>;> K3&[wX_G-lZ{'4/RIO.h_ Ϯ~2y,=Ey4/RI Կtb_?(/_??|7>O.\SVzо]K'G4/RI<Pߤ_??s/OYWBo}u/]о]K'G.e@X{)+=Bh_ Ϯ~ߤ̿ e?gQ^_ ԿtBo}u/]عa +|7>O.h_ Ϯ~2y,=Ey4/RI Կtb_?(/_??|7>O.\SVzо]K'G4/RI<Pߤ_??s/OYWBo}u/]о]K'G.e@X{)+=Bh_ Ϯ~ߤ̿ e?gQ^_ ԿtBo}u/]عa +|7>O.h_ Ϯ~2y,=Q*xt;+(d74;xcE~ôja4I;ݞ4db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Structured.html0000644000175000017500000013415411520622074023250 0ustar directhexdirecthex

 

5. Structured objects


It's time to extend our business domain with another class and see how db4o handles object interrelations. Let's give our pilot a vehicle.

namespace Db4odoc.Tutorial.F1.Chapter2
{
    public class Car
    {
        string _model;
        Pilot _pilot;
        
        public Car(string model)
        {
            _model = model;
            _pilot = null;
        }
      
        public Pilot Pilot
        {
            get
            {
                return _pilot;
            }
            
            set
            {
                _pilot = value;
            }
        }
        
        public string Model         
        {
            get
            {
                return _model;
            }
        }
        
        override public string ToString()
        {
            return string.Format("{0}[{1}]", _model, _pilot);
        }
    }
}



    5.1. Storing structured objects


    To store a car with its pilot, we just call #Store() on our top level object, the car. The pilot will be stored implicitly.

    // storeFirstCar
    Car car1 = new Car("Ferrari");
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    car1.Pilot = pilot1;
    db.Store(car1);


    Of course, we need some competition here. This time we explicitly store the pilot before entering the car - this makes no difference.

    // storeSecondCar
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    db.Store(pilot2);
    Car car2 = new Car("BMW");
    car2.Pilot = pilot2;
    db.Store(car2);



    5.2. Retrieving structured objects



      5.2.1. QBE


      To retrieve all cars, we simply provide a 'blank' prototype.

      // retrieveAllCarsQBE
      Car proto = new Car(null);
      IObjectSet result = db.QueryByExample(proto);
      ListResult(result);


      We can also query for all pilots, of course.

      // retrieveAllPilotsQBE
      Pilot proto = new Pilot(null, 0);
      IObjectSet result = db.QueryByExample(proto);
      ListResult(result);


      Now let's initialize our prototype to specify all cars driven by Rubens Barrichello.

      // retrieveCarByPilotQBE
      Pilot pilotproto = new Pilot("Rubens Barrichello", 0);
      Car carproto = new Car(null);
      carproto.Pilot = pilotproto;
      IObjectSet result = db.QueryByExample(carproto);
      ListResult(result);


      What about retrieving a pilot by car? We simply don't need that - if we already know the car, we can simply access the pilot field directly.


      5.2.2. Native Queries


      Using native queries with constraints on deep structured objects is straightforward, you can do it just like you would in plain other code.

      Let's constrain our query to only those cars driven by a Pilot with a specific name:

      public class RetrieveCarsByPilotNamePredicate : Predicate
      {
          readonly string _pilotName;
          public RetrieveCarsByPilotNamePredicate(string pilotName)
          {
              _pilotName = pilotName;
          }
          public bool Match(Car candidate)
          {
              return candidate.Pilot.Name == _pilotName;
          }
      }

      // retrieveCarsByPilotNameNative
      string pilotName = "Rubens Barrichello";
      IObjectSet results = db.Query(new RetrieveCarsByPilotNamePredicate(pilotName));
      ListResult(results);


      Using generics syntax this is a lot simpler:

      C# Generics
      // retrieveCarsByPilotNameNative
      string pilotName = "Rubens Barrichello";
      List<Car> results = db.Query<Car>(delegate(Car car) {
          return car.Pilot.Name == pilotName; });
      listResults(results);




      5.2.3. SODA Query API


      In order to use SODA for querying for a car given its pilot's name we have to descend two levels into our query.

      // retrieveCarByPilotNameQuery
      IQuery query = db.Query();
      query.Constrain(typeof(Car));
      query.Descend("_pilot").Descend("_name")
          .Constrain("Rubens Barrichello");
      IObjectSet result = query.Execute();
      ListResult(result);


      We can also constrain the pilot field with a prototype to achieve the same result.

      // retrieveCarByPilotProtoQuery
      IQuery query = db.Query();
      query.Constrain(typeof(Car));
      Pilot proto = new Pilot("Rubens Barrichello", 0);
      query.Descend("_pilot").Constrain(proto);
      IObjectSet result = query.Execute();
      ListResult(result);


      We have seen that descending into a query provides us with another query. Starting out from a query root we can descend in multiple directions. In practice this is the same as ascending from one child to a parent and descending to another child. We can conclude that queries turn one-directional references in our objects into true relations. Here is an example that queries for "a Pilot that is being referenced by a Car, where the Car model is 'Ferrari'":

      // retrievePilotByCarModelQuery
      IQuery carQuery = db.Query();
      carQuery.Constrain(typeof(Car));
      carQuery.Descend("_model").Constrain("Ferrari");
      IQuery pilotQuery = carQuery.Descend("_pilot");
      IObjectSet result = pilotQuery.Execute();
      ListResult(result);






    5.3. Updating structured objects


    To update structured objects in db4o, we simply call #Store() on them again.

    // updateCar
    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
    Car found = (Car)result.Next();
    found.Pilot = new Pilot("Somebody else", 0);
    db.Store(found);
    result = db.QueryByExample(new Car("Ferrari"));
    ListResult(result);


    Let's modify the pilot, too.

    // updatePilotSingleSession
    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
    Car found = (Car)result.Next();
    found.Pilot.AddPoints(1);
    db.Store(found);
    result = db.QueryByExample(new Car("Ferrari"));
    ListResult(result);


    Nice and easy, isn't it? But wait, there's something evil lurking right behind the corner. Let's see what happens if we split this task in two separate db4o sessions: In the first we modify our pilot and update his car:

    // updatePilotSeparateSessionsPart1
    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
    Car found = (Car)result.Next();
    found.Pilot.AddPoints(1);
    db.Store(found);


    And in the second, we'll double-check our modification:

    // updatePilotSeparateSessionsPart2
    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
    ListResult(result);


    Looks like we're in trouble: Why did the Pilot's points not change? What's happening here and what can we do to fix it?


      5.3.1. Update depth


      Imagine a complex object with many members that have many members themselves. When updating this object, db4o would have to update all its children, grandchildren, etc. This poses a severe performance penalty and will not be necessary in most cases - sometimes, however, it will.

      So, in our previous update example, we were modifying the Pilot child of a Car object. When we saved the change, we told db4o to save our Car object and assumed that the modified Pilot would be updated. But we were modifying and saving in the same manner as we were in the first update sample, so why did it work before? The first time we made the modification, db4o never actually had to retrieve the modified Pilot it returned the same one that was still in memory that we modified, but it never actually updated the database. The fact that we saw the modified value was, in fact, a bug. Restarting the application would show that the value was unchanged.

      To be able to handle this dilemma as flexible as possible, db4o introduces the concept of update depth to control how deep an object's member tree will be traversed on update. The default update depth for all objects is 1, meaning that only primitive and String members will be updated, but changes in object members will not be reflected.

      db4o provides means to control update depth with very fine granularity. For our current problem we'll advise db4o to update the full graph for Car objects by setting  #CascadeOnUpdate()  for this class accordingly.

      // updatePilotSeparateSessionsImprovedPart1
      IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
      config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
      using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
      {
          IObjectSet result = db.QueryByExample(new Car("Ferrari"));
          Car found = (Car)result.Next();
          found.Pilot.AddPoints(1);
          db.Store(found);
      }


      // updatePilotSeparateSessionsImprovedPart2
      IObjectSet result = db.QueryByExample(new Car("Ferrari"));
      ListResult(result);


      This looks much better.

      Note that container configuration must be passed when the container is opened.

      We'll cover update depth as well as other issues with complex object graphs and the respective db4o configuration options in more detail in a later chapter.


    5.4. Deleting structured objects


    As we have already seen, we call #Delete() on objects to get rid of them.

    // deleteFlat
    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
    Car found = (Car)result.Next();
    db.Delete(found);
    result = db.QueryByExample(new Car(null));
    ListResult(result);


    Fine, the car is gone. What about the pilots?

    // retrieveAllPilotsQBE
    Pilot proto = new Pilot(null, 0);
    IObjectSet result = db.QueryByExample(proto);
    ListResult(result);


    Ok, this is no real surprise - we don't expect a pilot to vanish when his car is disposed of in real life, too. But what if we want an object's children to be thrown away on deletion, too?


      5.4.1. Recursive deletion


      You may already suspect that the problem of recursive deletion (and perhaps its solution, too) is quite similar to our little update problem, and you're right. Let's configure db4o to delete a car's pilot, too, when the car is deleted.

      // deleteDeep
      IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
      config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
      using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){
          IObjectSet result = db.QueryByExample(new Car("BMW"));
          Car found = (Car)result.Next();
          db.Delete(found);
          result = db.QueryByExample(new Car(null));
          ListResult(result);
      }


      Again: Note that configuration should be passed to the call opening ObjectContainer.

      Let's have a look at our pilots again.

      // retrieveAllPilots
      Pilot proto = new Pilot(null, 0);
      IObjectSet result = db.QueryByExample(proto);
      ListResult(result);



      5.4.2. Recursive deletion revisited


      But wait - what happens if the children of a removed object are still referenced by other objects?

      // deleteDeepRevisited
      IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
      config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
      using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
      {
          IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
          Pilot pilot = (Pilot)result.Next();
          Car car1 = new Car("Ferrari");
          Car car2 = new Car("BMW");
          car1.Pilot = pilot;
          car2.Pilot = pilot;
          db.Store(car1);
          db.Store(car2);
          db.Delete(car2);
          result = db.QueryByExample(new Car(null));
          ListResult(result);
      }


      // retrieveAllPilots
      Pilot proto = new Pilot(null, 0);
      IObjectSet result = db.QueryByExample(proto);
      ListResult(result);


      Houston, we have a problem - and there's no simple solution at hand. Currently db4o does not check whether objects to be deleted are referenced anywhere else, so please be very careful when using this feature.

      Let's clear our database for the next chapter.

      // deleteAll
      IObjectSet result = db.QueryByExample(typeof(Object));
      foreach (object item in result)
      {
          db.Delete(item);
      }



    5.5. Conclusion


    So much for object associations: We can hook into a root object and climb down its reference graph to specify queries. But what about multi-valued objects like arrays and collections? We will cover this in the next chapter .


    5.6. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Config;
    using Db4objects.Db4o.Query;
    namespace Db4odoc.Tutorial.F1.Chapter2
    {
        public class StructuredExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            
            public static void Main(String[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreFirstCar(db);
                    StoreSecondCar(db);
                    RetrieveAllCarsQBE(db);
                    RetrieveAllPilotsQBE(db);
                    RetrieveCarByPilotQBE(db);
                    RetrieveCarByPilotNameQuery(db);
                    RetrieveCarByPilotProtoQuery(db);
                    RetrievePilotByCarModelQuery(db);
                    UpdateCar(db);
                    UpdatePilotSingleSession(db);
                    UpdatePilotSeparateSessionsPart1(db);
                }
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    UpdatePilotSeparateSessionsPart2(db);
                }
                UpdatePilotSeparateSessionsImprovedPart1();
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    UpdatePilotSeparateSessionsImprovedPart2(db);
                    DeleteFlat(db);
                }
                DeleteDeep();
                DeleteDeepRevisited();
            }
            public static void StoreFirstCar(IObjectContainer db)
            {
                Car car1 = new Car("Ferrari");
                Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                car1.Pilot = pilot1;
                db.Store(car1);
            }
            public static void StoreSecondCar(IObjectContainer db)
            {
                Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                db.Store(pilot2);
                Car car2 = new Car("BMW");
                car2.Pilot = pilot2;
                db.Store(car2);
            }
            public static void RetrieveAllCarsQBE(IObjectContainer db)
            {
                Car proto = new Car(null);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            public static void RetrieveAllPilotsQBE(IObjectContainer db)
            {
                Pilot proto = new Pilot(null, 0);
                IObjectSet result = db.QueryByExample(proto);
                ListResult(result);
            }
            public static void RetrieveCarByPilotQBE(IObjectContainer db)
            {
                Pilot pilotproto = new Pilot("Rubens Barrichello", 0);
                Car carproto = new Car(null);
                carproto.Pilot = pilotproto;
                IObjectSet result = db.QueryByExample(carproto);
                ListResult(result);
            }
            public static void RetrieveCarByPilotNameQuery(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof(Car));
                query.Descend("_pilot").Descend("_name")
                    .Constrain("Rubens Barrichello");
                IObjectSet result = query.Execute();
                ListResult(result);
            }
            public static void RetrieveCarByPilotProtoQuery(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof(Car));
                Pilot proto = new Pilot("Rubens Barrichello", 0);
                query.Descend("_pilot").Constrain(proto);
                IObjectSet result = query.Execute();
                ListResult(result);
            }
            public static void RetrievePilotByCarModelQuery(IObjectContainer db)
            {
                IQuery carQuery = db.Query();
                carQuery.Constrain(typeof(Car));
                carQuery.Descend("_model").Constrain("Ferrari");
                IQuery pilotQuery = carQuery.Descend("_pilot");
                IObjectSet result = pilotQuery.Execute();
                ListResult(result);
            }
            public static void RetrieveAllPilots(IObjectContainer db)
            {
                IObjectSet results = db.QueryByExample(typeof(Pilot));
                ListResult(results);
            }
            public static void RetrieveAllCars(IObjectContainer db)
            {
                IObjectSet results = db.QueryByExample(typeof(Car));
                ListResult(results);
            }
            public class RetrieveCarsByPilotNamePredicate : Predicate
            {
                readonly string _pilotName;
                public RetrieveCarsByPilotNamePredicate(string pilotName)
                {
                    _pilotName = pilotName;
                }
                public bool Match(Car candidate)
                {
                    return candidate.Pilot.Name == _pilotName;
                }
            }
            public static void RetrieveCarsByPilotNameNative(IObjectContainer db)
            {
                string pilotName = "Rubens Barrichello";
                IObjectSet results = db.Query(new RetrieveCarsByPilotNamePredicate(pilotName));
                ListResult(results);
            }
            public static void UpdateCar(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                Car found = (Car)result.Next();
                found.Pilot = new Pilot("Somebody else", 0);
                db.Store(found);
                result = db.QueryByExample(new Car("Ferrari"));
                ListResult(result);
            }
            public static void UpdatePilotSingleSession(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                Car found = (Car)result.Next();
                found.Pilot.AddPoints(1);
                db.Store(found);
                result = db.QueryByExample(new Car("Ferrari"));
                ListResult(result);
            }
            public static void UpdatePilotSeparateSessionsPart1(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                Car found = (Car)result.Next();
                found.Pilot.AddPoints(1);
                db.Store(found);
            }
            public static void UpdatePilotSeparateSessionsPart2(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                ListResult(result);
            }
            public static void UpdatePilotSeparateSessionsImprovedPart1()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                    Car found = (Car)result.Next();
                    found.Pilot.AddPoints(1);
                    db.Store(found);
                }
            }
            public static void UpdatePilotSeparateSessionsImprovedPart2(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                ListResult(result);
            }
            public static void DeleteFlat(IObjectContainer db)
            {
                IObjectSet result = db.QueryByExample(new Car("Ferrari"));
                Car found = (Car)result.Next();
                db.Delete(found);
                result = db.QueryByExample(new Car(null));
                ListResult(result);
            }
            public static void DeleteDeep()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){
                    IObjectSet result = db.QueryByExample(new Car("BMW"));
                    Car found = (Car)result.Next();
                    db.Delete(found);
                    result = db.QueryByExample(new Car(null));
                    ListResult(result);
                }
            }
            public static void DeleteDeepRevisited()
            {
                IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
                config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName))
                {
                    IObjectSet result = db.QueryByExample(new Pilot("Michael Schumacher", 0));
                    Pilot pilot = (Pilot)result.Next();
                    Car car1 = new Car("Ferrari");
                    Car car2 = new Car("BMW");
                    car1.Pilot = pilot;
                    car2.Pilot = pilot;
                    db.Store(car1);
                    db.Store(car2);
                    db.Delete(car2);
                    result = db.QueryByExample(new Car(null));
                    ListResult(result);
                }
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/classloader.jpg0000644000175000017500000004074711520622074023220 0ustar directhexdirecthexJFIFPPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( $6I Vf!F,J\15_RR;i<#\EHT'#Åzdg|5raimk .dXU *^{Y11c'oe<>#4v1pz[bG7p62ڪ `/K ëK!]R\yfBc#uz,Ŷ.{[O!wux5AC|ŵM2$ST˾6* wlMZI v#a<9bRy̬xU,W뵻h?\Q 4k?!LZ4.X cŢxcG×Q_lrIm,o,Ls, N3q f&_QF ӡIxUYQUw@'=zWQEY+\iYQY(((([u~?xz|R799P,HPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQPK{iݽPssȅ2A98Q{%!hӂ2ȥ>@ mbNH^Q..!e[ [R.r1b ;E*FVق&26X1$ `*s[o( ( ( ( ( ( (zqj03Y.X ,@84r; z a51; z a51(z7m?0UuO .`M2AfԨ'v!Xi; z a51; z a51; z aCLt}oloydIvg8q4((((((((((((((((((J_%33#yQ3l>$ec;YH Fr1j-n.^"IYd;C/6 9; ݵ]HƪUN%*WG+\[{nv`%T\(((((*淤KKdҽzvKd7< ][b?)`3+!MK.bRN5?;fѰgw|$xƚ/"WGӒVm1n-fbbv,TAɀ Ex=ޱ3ƟCg=[|xvW-UwF+ VJ$zT- 6U*˝'M9+Šj-XKCwsvk%-:Ljv:GnOEO}-󾆌(РO@2@؍ uF2ɪ 5nқ~QSr6^Fz4څtϪr>?(ęgOt=ZW[fDou+sHʹp7oUcJl bNggw]:5xM_63*J+T-NNF/Kk~Y}21%gGf]NcXaTPr0I4j:>q&iltciA" 8_n'nU.z:G=־/ӥ妭ma,-w?*<]o^K{ ŚXԾB@ˑa9N[}jK[x ٤|X'wL?Au[?fuY[pۥpxS$FKԪ_Tg:8NF-Ru]4OKxI.cXeCX(g G$:`եjeKB('״]VYdW&6gӷ=EXFCk^&I#7_6>Awv_ֿ ,/$\~Kt& $s٤O9.Ll 3v-nc@knZiUg7!EDZw~9JJIt_ճdu7:"#DYڈ~\d1m8zԑ Ԃ)"i_)\IPIETLp6pVuO?)T?zLvVuZXkmvCarrpOSIMYQEHs~+xrSgNȦ+cs;(-/}u^=R$n-}$i躈GqG䌜'9ɮĖvXZ>Gv*yHH1vܞ+?hsXkX<,)FydP4j_7Y{ lNЯ%@#YqTpI#sU=kTԯ/Iԣ @2zNI<1/::Fo,竹b88~ յխ4kUPW&3Jy۳އoAxoY5v'Gԝ&2hPs31Pas-3Qut!m@R x8 ry&hi:N[ˋbǖ']rZ|#ntk2u:eq,$mGMHq``? ۉutn=?S)sxڸx+5]*\4N;;,OчG F/Ÿ I4Ia6L"%eG܃ŚMP% Fɢ߻9f>{ze_m}iPMmK UIu*%;y4GNacv@@+r ( ( ( ( ( ( ( ( (<=mglnⲲԎ/>i!vm%y 2xsjIצ M|}K[\MȊw珼57Vrc@JGW \gg88rshc&QiMƬ rŹn6ીu?_^jG5^⟂lnl ®O8SxCװxOC𾕧CB+GvnceHKH02O>"q&-?u oll&hX6waxF8$:PAᯋ۩ేJd`A :RmƇsC7%K(Mʧb6syޱ_|cik36:`*6Hpix'Ŷ7HgԵ/Բ gܬY0B.A}lſ izGZh<7fҠI 낅NC="GP_G.-ܠ,j c3AcYUG$OR=:!/u e$ /rz(~Ylc%[xĖvXZ>Gv*yHH1vܞ*Vˎ3߸܀`*W84V<FIˆp2I?XK]sWf6,l,8- ;!1.I' 8$ƬW? >iAEc'u=DX@/heK>r)PQAu+b ( ( +/U\[Gx务PĈ uO-/}u^ܞn巸9 I]H#V zʄsvLv3*ADMi >Ia+=fM&G' ;"|Xj2P ܮnVXk3A*9b/>At:J //ïZE K qi^iַ2+3# CHʪx|ɻ^z5,[I̳*;@ ne׶"] Wmc'E nq?\Uq-EQE+Dٔ >ΊVt6xY,#߿b{YT$$穭j*RQ,Q:f[kvWK̤`y¨$0U %Z2YE7);l%p 7H,fz;HZ|VX ]q2omAF9U\Hgt$)q s0hZTSaX![6|$$0cf,2@]0pp ki%KQ^H !(gU @2t- ߇>ӴtgZ-[7Q{|1Tg *uN29s.+0n".4H&gbpI2-웶aʐG  q_PAy%FU(z7mtQEQECѿm+SRմn5MBp%8'Ʋ? ѶikZM<#HR; '=3@ştB[n`M2Ct ːp NO'+yc P=ܦ{YtHH%|3d (?uh>i^+ *XrHl8$t 8~5΍^>h->̚nk0HKF]*cǴQ@|ڤQ?Efձۖě#a`?kWֶ[Y$q%(qyZ{.! :_zg5nFѷm~\)kmRWqjE,;>rrrsMWMn%O$Km5؜I$k7}ko`GrX1Qwevvm-c`krI8QqIk9{WԵ?Xϡ_iֶ},r۝$@JM((ZJ-4F[Y!VFId@F"~;#nL!vrZ5'c4%m9y<)?ZZH b4 e,FI^Eqq^Z*AE-%6[v,$AV$y=23>}uo-ǁ IX7 1[1n˛$=Ei u,=I_uS{/_OewmlYa 0`ZEqoHg$vj09>AyE2O$Y=Ԙ4i;`2|ZkWֶ[Y$q%(qQ@"N{{OaAf6}|e4m޺ ((((((((((((׭%e+k:!hN ՛:5rTz88Q`]=O4Q@Q@Q@Q@Q@Q@Q@Q@o亼&FP-3b(8(((((((_*kh!P 4~! :Nf[[Eʹ?7ۈX;nq$*)PM#&Q$op*P(((((((((((((鋬i-4$ݓby.O` )-cӮig#PT5?!%F73gM,: ko=ݎYnmǔ̑q #/B$ݖHU{YT83}5t#I+;NŠ(R((( w񬑶ܬ2= M^cfŔs]ǧM%/2ܨ<-N37ۄS9ϖ>{t}zu_ KndhZ[Jy?g^DkLCPy ppkoijQfkZZ6"ȄȘ$!z4:}_Ni7R[ZIm+,VZKnRv#x#W U2Hn$Iܒ7ѴԢ%Fwe74a5OBj⽥}oں:Y;;if"y;q湎>K,pBM"jY@OA^w 54T? .+{m{2æ^Ϭ`q[hIh2lM`c+;jh|jE}[Y w񬑶ܬ2= M^xR+,&3 S+uO_QӬL.m㱙oy1q8F 5]+^o%gӮ[U r4@îּL2IRzktZ;it+ү ]6{mʸYi%hsrC32k%.O}ƳHi&!v3ƹ,6;N RnS3T]յzf SniG'n@OXuM2A#*L i 4Y5-TwC54{-;{n^!̶vӢ{n}6y0޻_W9 > {i[o66%&+_o׶r[YU|d^'H;NF:/pe۬n`ѰrdaQn xUMiJT+vVn5MX٨nnd#H~g`8f5#Xksaq"ȣlaWb3Rv' q(յ]V;{jkCOe1FAUQTU{䱖ᡌb̕<nIsM5GxRhdY"C#ʰ<)SJH2!83)W80>֋ci)4 (!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPY>dy2EK7%)Cnm^t*B uGVXz(,#袊(((((( ȡׄ-Z*W}eD+>->oN-ms$S8QYUw`q=((((((JFIFPPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?db4o-8.0.184.15484+dfsg/doc/tutorial/docs/classloader.gif0000644000175000017500000000467311520622074023203 0ustar directhexdirecthexGIF87a,ڋ޼H扦ʶL "4*̦ {Ѫjɭ ӱN7 Թ(HXhx0)9Iyd :JZfZ!: ;K;)[[x{+<L|e|-=M]m}] ~E.~nh^>o'd/ ^ 007PA%+,! ~=$I?FU8Z6I2Fon3g>iJїZEQ!̸JI=ưqr lXL]\U\ŊVj)$ٕd]ö8~-t1ps͕5\F]xO5Y:6Xp⟥jƘ -fSO =-AUĭa *v_4 ~7Fl8qΝgrH<NjЫ᭶Ovn׍Ia\hASG}HtqS!xمeR` ^ 1~y!p{M&b"nQ12#_hBpd'Pf朒Z`.8%U(%vܘ9*pZ2y9ERCniН~R'矆.oQعɡo*xLJiN(c f`eq @!&:5|6뫵ˬ ٨"o( sU "਺<+L~E(0.ڭ809,2S\ͺʴnAC/>cIn3kbM hJuq&Q%hen,e>&" %gf,ĞT\r\Lq)>L&pA*gF<%ҟ)R"M2Fj8ЏAFMsE7Rx_u$Vϱ.&n5.ֵT>&fM8mou;LJvNJ}2y[>8e]"dl%فsz{y0k}8Ǡ<ηֲ: 3' qi/7 /</:n<ϐz(֋0|PGJ{N ٧_AK;_K?%R7@e LAA *,A f~0hAf$ Ѫ.tl"! *L_ I%A 74 wzcWxF eZ\P`܇?+`1ƺv /qXr$NThGV-kUD@ XA@DsKh-}L#'1,/!8fT =9/*ҋ$ME<ױ9݊-w[&.d[? ya,{Y_qs9ۏU$^ n뜎6Y7-`@ hD+L$2`mLט(9mJ=ضIr~Ŵf9ӞYR^/8IS}=)YnL5BLϏs;WT1PTC<2qBHN&FTH{ PbpfbİciZUna-Hj!H]},Bw WX Iʆj [u]wS : +*4%7rdּ ųg+VH(LK2`mj\L&lK[\Dosۀw-kSm~K *$k\s]F-yU"Bm{ _nh7|K^C䷾5/p_R.l=W$X*6OH +?n+<~p/ db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Fav.jpg0000644000175000017500000003256511520622074022150 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222 " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+;q I1!.jJl,PPwrj* P8D)&8oM0O}q޹&cVozOLM[SmEAy#ž#"3j#L5(1^:Omk3mVuBFUEnZ][X^G_@H'>"oAD/ilvo I=JA?E PrNי$ˌyo9i#e`%kz?WRV yZ8@|C)<+ENd6͹t]c1$AU"Ybq 3-2m;Τ9 B80~c%ѸњVi-۪ϥj2ֳ˦iuokpy7 rՍ{JMhlg] +6$4#nއv0pxt t- M$_:HEԌ:+m[\Gr?cn;UPsj&v_3Rᱜ8ui6 jsVs'$Ɏp;=^V#:u\bFrNǧUY,hN2v㸪4*@5 J-,{#8ӄ1Cyɪnἆ9Ibu AuURRKIK@QE--(RR8/ܙ#Y<ӥsz^ieeug}ko7eiȬ<9T*AV޼{JOi܀nu*zs[%ZXumN1'vc g`<ǽz.$G:{)%eQLc8Cy;X~QoO5hV ͥ܍Qp2{kWW$j8 0\6sP[DzC쯧" ztR_k4|~$6#I+N&PDnԖդ*3#yɥkQ]U$b  JƼP_Dk[{W6yPL-_Nzy,CɪMYy}aQڤHLn9$JL&x #+X>,G,n_Y=u~?I\>1Vi+/7cp5,n_?7q/VrȪIK 'h+ZէEѼ@Cl,K" d9#O W!«aAO&ǯ~??hty%YgTآ[GX'!_3›"*w,n_u{D}-K_4g?% _X^,G=~ Zh ~Kg?% ?_G▾g ~Kg% ?_G"?9s/Q ş(ǯ~?MQ_2o.% ?a?Q_=>Wizu-P)oD6Dm7 ?\,?r UdRZzs\rWZ'ěM7 |V2f3~#|kX3m$]x*%TQ4}<Tm;S&p[FVerpTpkq^]M[6iwi gɝy*9^<*7}+FxY8?OE{3hJߑ_#LF=̊=r^L ޸`F@&Gtnw%Fe5Y #HN n ǀ9_C3@U!߇&9WA8#G + Ǒ^5C\n &X#s9icoiAzuG0HCvF$,avonOa[?oK8…PJ܏A6y4=Ӆwֱu [)`7oX/;&O1eO HHgI`ңHN-e0D @$W-QK-nW<~! ń5R,MŽi$,I ː;vooK8o2}@=~u3jP\ N 2Q_M-QUblooK8E=@/ ?a=>d[?oK8+fϙ(t([?fٳJ+E=@/ ?t(هlooK8E=@/ ?a=>d[?oK8+fϙ(t([?fٳ|/䒉=#VEo_$\@g9jKo!Kx_`}%G"qBͩ)sr;# mi 6ُw[q(yCR$k>F`X1QM{CV`qͩEr=!eD1m%ܘS.}zi/9 `k{CV`гg=:-FKh+GC޲cIqrOR;O"VhbX 9<{GsR1\ p? n, ~dȓFUH`jLRIӜ$hj};UE$kKR@ًc88QK{%u51ШuIӰ'3U'22HE6A9%QZiG,ԁJK MG *UZV窢v$ z:ȡLyHyquPBB$ znfL!PJ>՛sElU&Hs~~|~Gd?k)-`pHh<g10x?N5[QKF 4_0Ǭ**6 ( ( ( ( ( ( ( (0e:pKhet$c:ܬKmX%ܬ7̃܎/*Ȗgl~d.ƶN]Lm#reYzޡpKy"! Wyx*[ҵ_B0)?W?r:X̒O1u)tpϙW﷥xJѱh|L(Zr}/+w6g|C!qUWzz(k8? .zO+8? .zO+8? .zO+8? .zO+8? .zO+8? .zO+˯P3iHYNp<~?V,׷r@j@O'h$mPI<~?XZFM${\m@@8B{fjkn!U Z5"1#9*kijC$^O(L58Tu9Oިs kAE$]@xz~]?l?ߛ/Geq #im^A-mgHMY-̓',pes&8^ԼU>T Kw2G!G+lvcr8#J~mawwpE]H{[DeW܆?+qcS6v8l('ؓW%u@٪M*bcBK% 8dla+nó[|?t;-BnRQ [%Ry$K˖]jxZ7* ٸ皻C~lKX=5 il$8gÄr7Y6emoYj][I-)13bzJM=?说6{ۯkooI# {6p-?V!ϳxI?jҠsʹ];g4h֭.#/E"m"1p@xIR(Ej)%uqGq!Nϸ"nt&9Y;HrcJ4>S7_T rz[ʜ{W3XtS}`},Kk#y^l< }IAmo,n%pG0W ZΫĖ:֏m_TMqRȅ8ZGDM#ᗋ"dN ȧd[ vs]$3 m#Hg6?/獏k@: +c2?!xLf: |Y w ѤH#*@zNc2}~u/͎vg.qL}4 ]&#1'(8IЫHf[n( ]H@#x{_*ceTQG?<筏P .:M,68%w:4Lq΂4,p?~5S[/ʟzq &-/sϖ Mz^ c dIO=lj*ceUzVm}pO7ʟz:4eMe&M4OK9?з*$UAٶ&;KmImucn~ɰF_.Bӑ]N;ZӝwͻdnRAYa1t1n+Ui[*M]yG?[WhG ~* MtW~3#7H(2‘H66d`Z7mf$AHC,K,W͉>AesNO#- 4dxP&{KuoTC 1c䫆8-Su9)m5ɒh;]V S9CA)UA?+*?z}g%_u>+*?z}_ WihϊJO;^Ey|WBUZ3:ק@aЕ}֟vPg%_u>+*?z}_ WihϊJO;^Ey|WBUZ3:ק@aЕ}֟vm#d7 ++[}\ֵ]s_VjjR~,x#Gץ󸮶O2{{e)qQV=#ϊ?Wo~ۻ10۷vxk˯rS,m?r3km)oy%{v;S,Tcq$mã+ 8$t5j'z:1)`2w6~8 `FFh`Z]^^\4FCޛQ KS-W۬ i$a0Es,r.HX0o>XsM CunІU{kvː̎ N2q1T3ح7bZMeDx~XNBDu-KÚZzE={+ޘͳ2"*CDco< 0[G2&73cϩ$K㖳csyzKIq  qi$\cO gMV_+k}>gFrj 8H +5CRR -HE󒐫 @8ެj~#kk[[qmiq\[y/t4}yzڼ)#m=-$m,q6jtպCe w>Y!Cɷg* , ;j+~/$&5kh(bqMPMֽiowK7d /)1/s9B\_ &}BT'(mI>~-KYC p^$@0 #8%WEp3:xPTl@cfg`<(ABf:JvgQ?i yy,Q-ac?1i@2X_-D] ׈hbַpPɼ͜??A]hVzŇ9eHd|1TvZ7=Z&}:5W1O?Ruj0o 9?(8<})KQO$ٓM$]QaX ]=k?:O`yUF Yq4Ds,d,^J0tndQxLa(KqZ>1ΏeM% EJLHs"0 gU=R8eq<+#8Jҵ?2y5 hSCe-,,Dci_[3u9%#I'>Y:Uޝܾ}w 1!8fe c]ԟ'Nk}yWcg=0&ا)_/=sQT_c'RdPP2T?.` 59DQmoSL6rXr$_iRSI`EI,9(@rOkdzٵ;skid\z8`rKޕἼsI_?=m@6-^LI9bR'rF;Y)-7)uzmٹhu722+GxޫDkpIy߅q6:#w^\U *B&TJXh6i -[5՝!ĉfDsڴ exT em*Π}c, +s;)I뽏@{4H5=o !{^Ny^wh[|ZqicoEU@NxƓ1|.\n{YBn F=¢׭,fQ}O-}FI.yݧͺ]ky#ج_+8 PҒY#"*)$QA7T0I˖3wo sS}CH>+67&ki2o[) '~=@59bT lXPiT@W8;A uBshiܶk^Kg-=;_.n1#fI?틘*}8r dXIrI=kRo 'u<-(BptHMN{tx,(%y%fef2ppAѓ@~GuX&+d6&7?e~jW]jW\|Q^;'gD`kG>(Kq]S6\=ʈ0mQW(9g:GoovM#N(b>l6{l^5i)@ypEqi9+ԒsE%{8|۪O ^ѕ$15-;' _dtּ!6Zzz ҈## 9=+:+fSV#$>_3o|_:YhW`}58ApeϏi'sN|gBe7#"Ggÿ{bYCbџ,3哴@C1N&[ ,o塚\vF_r5a5o%_:ӈݎz4O`ZirGsG˓w)rJq;ҔSӛV9Rx7vpZ-kfdF`Qܙajƃ}mxK#5 i,rrH'2_SHCJ+M:o20,뵳;G|f>ϿrƟc EXwnϠhSnGǂ>.m|/rn|E̥vʰ1"x;z,::ha quOs_JQONi[6<3/.nI-]?R(FEV%Q*zTf,6oӨ+Iqj0\1$9'd>lmLDmndŪC' 99SH hv/&qm"Epvc~iO#D|q/7^'_ͦՖE\yP^>Y YUh{&FI[tN_GQC̦Nr+|'^˧$#9HTbP5|O
 

1. First Glance

Before diving straight into the first source code samples let's get you familiar with some basics.


    1.1. The db4o engine

    The db4o object database engine consists of one single core DLL. This is all that you need to program against. In addition you may want to use client/server library or optional components. The versions supplied with the distribution can be found in /db4o-8.0/bin/.

    db4o is available in multiple distributions for Microsoft .NET. One downloadable distribution is for the .NET Framework 2.0 and the other is for the .NET Framework 3.5. Be sure to download and use the correct one for your project environment.

    /db4o-8.0/bin/net-2.0/Db4objects.Db4o.dll
    is the standard db4o engine for the .NET 2.0 framework.

    /db4o-8.0/bin/compact-2.0/Db4objects.Db4o.dll
    is built for the .NET 2.0 CompactFramework.

    /db4o-8.0/bin/net-3.5/Db4objects.Db4o.dll
    is the standard db4o engine for the .NET 3.5 framework.

    /db4o-8.0/bin/compact-3.5/Db4objects.Db4o.dll
    is built for the .NET 3.5 CompactFramework.


    1.2. Installation

    To use db4o in a development project, you only need to add one of the above Db4objects.Db4o.dll files to your project references.


    1.3. Object Manager Enterprise installation

    Object Manager Enterprise (OME) is an object browser for db4o databases. OME provided with this installation comes as Visual Studio 2005/2008 plugin. OME can be installed as part of db4o setup.

    Alternatively, if you opt out, you can install it later by running the installation from the shortcut provided in the db4objects Start menu folder.
    If you've downloaded .NET distribution as a zip archive, you will find OME installation in omn-2005 or omn-2008 folder of the distribution.


    1.4. API Overview

    Do not forget the API documentation while reading through this tutorial. It provides an organized view of the API, looking from a namespace perspective and you may find related functionality to the theme you are currently reading up on.

    For starters, the Db4objects.Db4o and Db4objects.Db4o.Query namespaces are all that you need to worry about.

    Db4objects.Db4o

    The Db4objects.Db4o namespace contains most of the functionality you will commonly need when you work with db4o. Two objects of note are Db4objects.Db4o.Db4oEmbedded and Db4objects.Db4o.IObjectContainer.

    The Db4oEmbedded is your starting point. Static methods in this class allow you to open a database file. For client/server environment you will need to use Db4objects.Db4o.CS.dll and Db4oClientServer factory class to start a server, or connect to an existing server, but this will be discussed later Factory classes also let you configure the db4o environment before opening a database.

    The most important interface, and the one that you will be using 99% of the time is
    IObjectContainer: This is your db4o database.
    - An IObjectContainer can either be a database in single-user mode or a client connection to a db4o server.
    - Every IObjectContainer owns one transaction. All work is transactional. When you open an IObjectContainer, you are in a transaction, when you Commit() or Rollback(), the next transaction is started immediately.
    - Every IObjectContainer maintains it's own references to stored and instantiated objects. In doing so, it manages object identities, and is able to achieve a high level of performance.
    - IObjectContainers are intended to be kept open as long as you work against them. When you close an IObjectContainer, all database references to objects in RAM will be discarded.

    Db4objects.Db4o.Ext

    In case you wonder why you only see very few methods in an IObjectContainer, here is why: The db4o interface is supplied in two steps in two namespaces, Db4objects.Db4o and Db4objects.Db4o.Ext for the following reasons:
    - It's easier to get started, because the important methods are emphasised.
    - It will be easier for other products to copy the basic db4o interface.
    - It is an example of how a lightweight version of db4o could look.

    Every IObjectContainer object is also an IExtObjectContainer. You can cast the IObjectContainer to IExtObjectContainer or you can use the .Ext() method to access advanced features.

    Db4objects.Db4o.Config

    The Db4objects.Db4o.Config namespace contains types necessary to configure db4o. The objects and interfaces within are discussed in the Configuration section.

     Db4objects.Db4o.Query

    The Db4objects.Db4o.Query namespace contains the Predicate class to construct Native Queries. The Native Query interface is the primary db4o querying interface and should be preferred over the Soda Query API.

    Db4objects.Db4o.Linq
    Another query alternative interface. Combines the benefits of the db4o Native Queries and wide database support.   





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Evaluations.html0000644000175000017500000002542111520622074023372 0ustar directhexdirecthex
 

13. SODA Evaluations


In the SODA API chapter we already mentioned Evaluations as a means of providing user-defined custom constraints and as a means to run any arbitrary code in a SODA query. Let's have a closer look.


    13.1. Evaluation API


    The evaluation API consists of two interfaces,  IEvaluation  and  ICandidate  . Evaluation implementations are implemented by the user and injected into a query. During a query, they will be called from db4o with a candidate instance in order to decide whether to include it into the current (sub-)result.


    The IEvaluation  interface contains a single method only:


    public void Evaluate(ICandidate candidate);


    This will be called by db4o to check whether the object encapsulated by this candidate should be included into the current candidate set.


    The ICandidate  interface provides three methods:



    public object GetObject();
    public void Include(bool flag);
    public IObjectContainer ObjectContainer();


    An Evaluation implementation may call #GetObject()  to retrieve the actual object instance to be evaluated, it may call #Include()  to instruct db4o whether or not to include this object in the current candidate set, and finally it may access the current database directly by calling #ObjectContainer() .



    13.2. Example


    For a simple example, let's go back to our Pilot/Car implementation from the Collections chapter. Back then, we kept a history of SensorReadout instances in a List member inside the car. Now imagine that we wanted to retrieve all cars that have assembled an even number of history entries. A quite contrived and seemingly trivial example, however, it gets us into trouble: Collections are transparent to the query API, it just 'looks through' them at their respective members.


    So how can we get this done? Let's implement an Evaluation that expects the objects passed in to be instances of type Car and checks their history size.

    using Db4objects.Db4o.Query;
    using Db4odoc.Tutorial.F1.Chapter4;
    namespace Db4odoc.Tutorial.F1.Chapter7
    {    
        public class EvenHistoryEvaluation : IEvaluation
        {
            public void Evaluate(ICandidate candidate)
            {
                Car car=(Car)candidate.GetObject();
                candidate.Include(car.History.Count % 2 == 0);
            }
        }
    }


    To test it, let's add two cars with history sizes of one, respectively two:

    // storeCars
    Pilot pilot1 = new Pilot("Michael Schumacher", 100);
    Car car1 = new Car("Ferrari");
    car1.Pilot = pilot1;
    car1.Snapshot();
    db.Store(car1);
    Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
    Car car2 = new Car("BMW");
    car2.Pilot = pilot2;
    car2.Snapshot();
    car2.Snapshot();
    db.Store(car2);


    and run our evaluation against them:

    // queryWithEvaluation
    IQuery query = db.Query();
    query.Constrain(typeof (Car));
    query.Constrain(new EvenHistoryEvaluation());
    IObjectSet result = query.Execute();
    Util.ListResult(result);



    13.3. Drawbacks


    While evaluations offer you another degree of freedom for assembling queries, they come at a certain cost: As you may already have noticed from the example, evaluations work on the fully instantiated objects, while 'normal' queries peek into the database file directly. So there's a certain performance penalty for the object instantiation, which is wasted if the object is not included into the candidate set.


    Another restriction is that, while 'normal' queries can bypass encapsulation and access candidates' private members directly, evaluations are bound to use their external API, just as in the language itself.




    13.4. Conclusion


    With the introduction of evaluations we finally completed our query toolbox. Evaluations provide a simple way of assemble arbitrary custom query building blocks, however, they come at a price.


    13.5. Full source


    using System;
    using System.IO;
    using Db4objects.Db4o;
    using Db4objects.Db4o.Query;
    using Db4odoc.Tutorial.F1.Chapter4;
    namespace Db4odoc.Tutorial.F1.Chapter7
    {
        public class EvaluationExample : Util
        {
            readonly static string YapFileName = Path.Combine(
                                   Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
                                   "formula1.yap");  
            public static void Main(string[] args)
            {
                File.Delete(YapFileName);
                using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName))
                {
                    StoreCars(db);
                    QueryWithEvaluation(db);
                }
            }
            public static void StoreCars(IObjectContainer db)
            {
                Pilot pilot1 = new Pilot("Michael Schumacher", 100);
                Car car1 = new Car("Ferrari");
                car1.Pilot = pilot1;
                car1.Snapshot();
                db.Store(car1);
                Pilot pilot2 = new Pilot("Rubens Barrichello", 99);
                Car car2 = new Car("BMW");
                car2.Pilot = pilot2;
                car2.Snapshot();
                car2.Snapshot();
                db.Store(car2);
            }
            public static void QueryWithEvaluation(IObjectContainer db)
            {
                IQuery query = db.Query();
                query.Constrain(typeof (Car));
                query.Constrain(new EvenHistoryEvaluation());
                IObjectSet result = query.Execute();
                Util.ListResult(result);
            }
        }
    }





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/OMN_Query.jpg0000644000175000017500000004337011520622074022535 0ustar directhexdirecthexJFIFC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("a   !1TUV"AQRSa26u#$3q4&7BCdsv5rt%'DEFb)RA!1Qa ?EPv;TI^BHrI/I);2R{bpՒ^e4aͦj-Y(ZH"-PW3% NѤX ,wjo4duw qK JQT5%:wfUo~A)Sbm.Ae\*+AvAҜ~ANO I*MM텙Hf;[*<.S,"LD%N[I2Lқ:h$HIQcۗBrkn%#5U7BY*BZ3OdFfV/wu)gڦmkgT}N^F|转!u:f>H ر&+N:Hxi'~GRvTX{Yg6sRZ|ZT̔- W$MFa\TĈr[JVӗI(̊OF cg" |F.l+ɔ$mݺÙ $eJuZUl#Q]d,2љeCOG88/:ynG(}/jyRbB\ED$fdeaU)$',(ʚ3">RZJZU)rc%gKeKorlfYjJL6+oN.; cu-%c$"1#d#&r Jj+4Ǡ,+l"R+rrCIRrԥ2EktFU603ZlZAo,?wwm ue:jX=e $6$V;،"r"G򒒻jl723#W31ʱKɣQ9I|#-~U"knLmÔe-PIN3[55^ >$(?&d Q8rG2$&Jec\)bVIJm2j۶sb2Vr#Ҩt86[D ISYrJVNҢ6Q+BSXXR16&Lv6TIjDf3L^XEpf4N*wQ&9JQӐM%/&7-hZUB-)m0r"(8I(YW>/!`#1bdMd64Lx5"?d7YS9 R1T\^RrRجg+bO&UJy^"BrT~MIo ҤB>Ѳ!֪ Z뒉#+JzD'c>7#k'Rsy$f=ildRTGFZpJT!pI*. #Aψ\GJ%"y HP~3Ҡ@ `Vz2u6O\9c.־NYr6{:T&#![R|a.m0qnA&fM٠REcZx8sX$?Hđا*fAK.%f vJT*Eұ&Tي]vC>Ct"I>J"hFdJ4ansqW!ke%MILff|Ghw-ZENǫ3ÆdtN>`9";jRɦ!i5\ 66H+Mv40(uQd5UnKjrKit:iJ R d7_-Y-Dgdv"#3?"3]ydֈOƭl@ŸZbg:)JJD"C+$t)=$fC"+f'G[&scNC[l2I8D[!Lx|u/<dqs-Nqk[=n(ƍCpHuɴM>{!gr$RI\WJRt{-?ļG j47ZGA/g1_wt#T;`:OB'ꅁ9}I25C ŭdjp}IR5C ŭdj sq_wt#T;`:OAZOFXc; szPֲz5BW0o'7djѪo )sz Pֲz5B}I25C ŭdj 7}sz P﹃x= FqkY=`ssE}sz P﹃x=FqkY=`}szP﹃x=FqkY=`}sz P﹃x= FqkY=`+7dj}IR5CZ ﹃x=Fwt#T8Pn}IR5C ŭdjs_wt#T;`:OAZOFX +7dj}I25CZ }sz P﹃x=FqkY=``:OB0o'-k'T,0`:OApo-k$ ]^;4m)_sQ*өˊ9-!֝QңQiIF_$R|cIo |EC uD`DFN);iVӀ(:[b9o֜нޝwrA^R-:sBp:t//)QyHtv8Ν gcоw(E!ӝ:ӆ9ӡ}8QyH2C:t/ ?N>Ao0O)LjS6;FeV3lΝ aInԖԗ H^QIOUh926Wb[,x:c8uL48d #IsW,hy_CK:Q)~ّ̔(cBUfFDbmMiU#&mFdla j;6J )֓uC^1NDleAFaMҝr2Gc0~B\K3 $DٔZp1i9&ۄl9f%jԼ^%te)R8FZgl#,9OF%6ŷ^{!fj;ӒDg{;p 9d pK4ۙ+J4ܷ|Q4[/3LFqG.Q2;㌭[eInyAh"41s9k>tN9ʑPìSom6⣩VñF{%qc⟏4kL ev H8QҔi)g\k)H-yJ5Nȝ^xcDM8kAAÔM-(xJ4^ĢGJ~F=AכzQőH$ ,;r8f&3~qZaL+9NU\a eO!?֔QfYMM3UqVf pz 30SQSI)%-k%;cNw_t-w-RyDԗ RIFyfMd,LA\m%b'gEǘv )hk|c+gaKlYUp~*Sԇf4m"FH56(;µhvz:)(X\{8yM6S9i+dsד@yn9rۥ"i-2N:hZTJi$Dht̔i-^G#S -TeR,%(IEξ~T[`Ek^XQ)8n|n)؍86mLH^~d%6y(ee(a)$IЂ"D[ $wko hrs3?PlEOVEMNeIZL-.hUAdesCCHmkm("i(lSdZlzDU'*U6{̄܌sry7okothTA9ClQZ~ž!$k,Lk t?Qj4[2M9ƾ¤6DHױ(R$2^rDTɎF&Ze:24(25x&Eb!/0|Cmu(%TD > 1Nw4)A[RRae%(Zi.I$(: Db+z$X"P9Z6I<#.U {e)m9!S+A{ QMxm2Ѩ%3qo\0kQ65Z#;2ӎ䷖T &!f%dD3^Q_onQnj8j?-QbfqThn6ؑ" ՗SK scfJ<1ccaa!gR#+LZIdeH 8j?-Pݺg G幪#is=HP@Lj6Jm>n(Y!uj2"Ut@ѩ8VJPh-6ZM m SkIW%Er;v5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ڦp~[RÙLŐ$IpȐP 91.Ttf0Te6 ;A{NQ̓b3I_AMM:|ssW@}ߪ13OYt/ףbԘԔ]$4ڂTZ^ud{赯m.RYtn/#YŦOZxld;zMġR/Pby#%%̔(#RVe_-:nD<,Kʔ\t3) MHAJ7ϬkQK_센Vy4i$m%:Ly-{-gU#J,QuH!s%Z2SF[&VDd{Ţ)&:7Jf<K3Е"!BjJ/O<┓BгJ҂RD6"2 GrrafDLѡOBe{%"e͖f[Mx\f.r R !q.7U)IFQ&#֧Őb/07!1+%8vւ='/rsf(ꘀ\Fܝ)Œq]yt.[wa3^*"5|ۣ tZM"ʌ2M4,I)lL\ȓliYi= 8{Æ6ydRe:Yn+rI8IgkzluFjkv.ϖGRH9,ӢW14dZm]J^ɕ A +i3IK Nh0D`&"D(pFQdJ2=gOQ)T 6&7̌dI'6V[79Ja9~рf-m~CIq&KY;o[xrlM: ĺҕ*I(#͒d)~r2/F(ZJ=Jid!!^؎Qdd#$,zFޜd!S(Y#$6Zj33UffffffzF)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>|1”)9PڐDs\iҟ8 S#IdG1*T٦ݔͶ̆(q$,$t NߝG;~w} x»%,SHw`ZIK%8AD)3VύcE| ܚ<d^IN`l`vu*1m;r!LGvmF̿e/_9}?ORk#'~qǶgo#^Lfz9dmLA}9JŕA-?̧%RfdqɗFQ Ȍ%:G乑l`l`ᚬ8KI*3,Xemr/`>>)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>ߝ`e/_9RF|k,hgk`c JcKvCjIIbb#%wgmVӦV9$ѐ&Y!n%).BZ_>b)Df`f=Mr^^yHe{ΠY 䨉ӼCGĵJy)4ft(%)IAjBM^Ii2go?dgo?dbRc06vOE!x%Dj,?R3M&KbLϺ |3<ڟ~Lr}`09~ψbx }> OokS_b1[ s\J=E1/!Vd2LiIJ0-e!I?)Kx'r_sŮFx^)*Gr2%! iQ)`*?;7CT@JwX3JN ?ҝ ңS|49Gu4 iQ)`*?;7CT@JwX3JN ?ҝ ңS|4)”M I&R+\&gGڰ1DdJ2=&G1㿾7`HXbE*-Xےem iQ)`*?;7CT@JwX3NwǣuhiE̒[Ò>3ߴǴH %gu!G9GuhsJNiQ)aңST@JwXo4f?ҝ*?;GuhsJNiQ)aңSxJddq2=֝NFhjJL̥W jSDiiFIiQ^5BNI7$gs"|| Җ^2Z[o@=ҝ ңS|49Guca"jBWYF;&`| =Rz9^w꿌L'sW V?,+O~1w%Gw꿌L'b/1d_jC/kj?Gr_sŮ)KAp /w׸>!Ubg1<+K~) okR_`:~_QYĐ!Kԕ2KDҕIۦTv#Q;zkwĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT.~APwU#,NUTGaSn5#h\ƨaPϒPaE5hʹj-Iq۸>!Ubg1<+K>1 okS_`*9T:c=vC(URIȏ3}I(FI( ;eL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶%L״@3k)ٜ>m lhɏkJQ| @,m{}ߪ13qϻ_&|C1[☲ V?Y.~ N.HdgeTKBm+&w= 3?Sq[:dj%VNG( ;.[u7rlZHYt+""Ô2uŢLY'-Ejj$ܓ\JU?( ߩ|SRGEjB٩DiV%FIA,̍5&~%hWRTYIRq@E/i޾ a|*_9Q-[cl9:U{>/t*|*_9v#R jF%$j&3Q'gi1Ɩ֤EP#27{Sr6OK1N1*bqT,_w8MlIQ8yTGe$̞; SR6OK1*̭wb*ʍ@9*I S Ĥh' TTs Щ|4;FjPáJrT2f4x؆jtʹŰxt*|*_9TTsQ5X_Ywr-Wtu}>/t*|*_9 P/ժ3YP7kZŭ{Gz7ۡSR6OKhw[kG ~!Ҡajf*|MiKIfWI_Im a|*_90J*F"3=ܨ3"(f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0;2wG3zT2ו̫E+NsM',?4+H{K?PZ[BP: dm pڍȎ;@vXK39fW֥Ge(ԣ3R{{tgѩS5(2ިJf,udWSMȯ  qϻ_&|C9~ψbx+|W,+K>1BBܥB I f*ʯܤi[Lb#2$s5Eb5oicJTi_a*7bYJQ8eܔeOeቤNFN^QI$Y>[X%&re˲W ܖ;)= [JVJ~֌!µwNMqN&XSJ"6MRG3o!D~5o | [hFif!)s98ʼ19 Y/X۾]ɶ]u76SdRYI_$hSKm~ M̮$F;XRYUW!fKr2{+7Y)7DE4GG'GeG9i,䓥;/w`%8KUpbNL'H2ߕfbs ZZo+h NRjæffg3?_WK6 =U}5Z&buKV&!>.Myso6ObBj.ZjA!\#;*ZWd'Qy9J͉x}h ?VY58Rg.EJal 4!d$IOA fW+j4jIq( Gehfi<+6HNlM+C6'rs`zw1˹^-wT'}b!|xoXbi6ģ,E'µt)\>R&_<Jemr'MlhI)[ K5BI)3BF8 97<38s' u("LִAy*QJf{zan#!o,Qly 34" HXsOE+C6fl9?Z(N! CK&̒(JV߲c?9CSuMӯtpDfo&c))\i2q BЬE$I2FGkп^JoJf<2/&gGa|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!=ᮮA?)#_q_CL|~eYn*-^1J}h^U>Zӿ @Ubg1<>w꿌L'b/1d_jL=5ZGphFL?&i edEՐk"i!܎{YLe0r$m;9hI(c5 "?aiw&Ҽ_ꮻY;b^8cJvZcɨː mIrZVf3O|;Yʋ*e}vtv#[sP)?Jv{F=JO@,XOSqlz'.hm4$ғI_KAQGT*tGZ"Ov!JuRGв4#/D؂L\[[T't'uJt̒d*%̔Dv""ʩq|wY 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX *= ; )7*rU'|Y }Xm}ߪ13qϻ_&|C1[T☲ V?ܗ],%x~ "|͟e'*n?|_xp9~ψbx }> Oo?iS_b1[Tr_w'ܗ], 6ȩgY ۸>!w&m-*$NJsp1[T☲ WXoO~fܝ*Jq&DuL,=ea$OIGɐŻ"mc;S@.gOz' ü db4o-8.0.184.15484+dfsg/doc/tutorial/docs/IDs.html0000644000175000017500000001045711520622074021562 0ustar directhexdirecthex
 

16. IDs


The db4o team recommends, not to use object IDs where this is not necessary. db4o keeps track of object identities in a transparent way, by identifying "known" objects on updates. The reference system also makes sure that every persistent object is instantiated only once, when a graph of objects is retrieved from the database, no matter which access path is chosen. If an object is accessed by multiple queries or by multiple navigation access paths, db4o will always return the one single object, helping you to put your object graph together exactly the same way as it was when it was stored, without having to use IDs.

The use of IDs does make sense when object and database are disconnected, for instance in stateless applications.

db4o provides two types of ID systems.


    16.1. Internal IDs

    The internal db4o ID is a physical pointer into the database with only one indirection in the file to the actual object so it is the fastest external access to an object db4o provides. The internal ID of an object is available with
    objectContainer.Ext().GetID(object);

    To get an object for an internal ID use
    objectContainer.Ext().GetByID(id);

    Note that #GetByID() does not activate objects. If you want to work with objects that you get with #GetByID(), your code would have to make sure the object is activated by calling
    objectContainer.Activate(object, depth);

    db4o assigns internal IDs to any stored first class object. These internal IDs are guaranteed to be unique within one IObjectContainer/IObjectServer and they will stay the same for every object when an IObjectContainer/IObjectServer is closed and reopened. Internal IDs will change when an object is moved from one IObjectContainer to another, as it happens during Defragment.


    16.2. Unique Universal IDs (UUIDs)

    For long term external references and to identify an object even after it has been copied or moved to another IObjectContainer, db4o supplies UUIDs. These UUIDs are not generated by default, since they occupy some space and consume some performance for maintaining their index. UUIDs can be turned on globally or for individual classes:
    IFileConfiguration#GenerateUUIDs(Int32.MaxValue);
    Db4oFactory.Configure().ObjectClass(typeof(Foo)).GenerateUUIDs(true);

    The respective methods for working with UUIDs are:
    IExtObjectContainer#GetObjectInfo(object)
    IObjectInfo#GetUUID();
    IExtObjectContainer#GetByUUID(Db4oUUID);





















































db4o-8.0.184.15484+dfsg/doc/tutorial/docs/Enhancement.html0000644000175000017500000003115211520622074023323 0ustar directhexdirecthex
 

17. Enhancement


As we have seen both Transparent Activation and Native Queries will produce correct results out-of-the-box.

To get your application to run as fast as possible with db4o, you will want to make sure that only required objects are loaded from the database and that Native Queries are optimized to use field indexes where this is possible.

Theoretically you could write all the necessary code by hand but you will save yourself a lot of time if you use automatic enhancement. Using the db4o enhancer tools you can automatically add code to your assemblies to make them work even better with db4o.

There are two possible strategies to enhance your assemblies:
Enhancement with MSBuild
Enhancement using Db4oTool


    17.1. Required Libraries


    The db4o enhancer requires the following assemblies in order to work:

    Cecil.FlowAnalysis.dll
    IL code flow analysis

    Db4objects.Db4o.dll
    db4o core engine

    Db4objects.Db4o.Instrumentation.dll
    IL code instrumentation

    Db4objects.Db4o.NativeQueries.dll
    Native Query Analyzer

    Db4oTool.exe
    commandline tool

    Db4oTool.MSBuild.dll
    MSBuild tasks   

    Mono.Cecil.dll
    IL code handling

    Mono.GetOptions.dll  
    helper library for Cecil



    17.2. Enhancement with MSBuild


    When csc (or Visual Studio, calling csc) compiles your assemblies, it uses the instructions in your csproj project files to know what to do. The "code" in csproj files is plain XML, it is very well readable and you can add your own tasks to the build by editing the files with your favourite (XML) editor.

    If you want the produced assemblies to be enhanced for db4o, you can add the db4o enhancer build task to your csproj files as an "AfterBuild" task.

    Db4oTool.MSBuild.dll contains the main MSBuild enhancer task:
    Db4oTool.MSBuild.Db4oEnhancerMSBuildTask

    For all possibilities of using this task see the  topics on transparent activation in the reference documentation.

    The simplest enhancer task does both: It optimizes Native Queries and it adds the IActivatable interface to your classes, making sure a persistent object is activated whenever any field is read. Here is a simple example of how such an addition to MSBuild task could look like:

    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

      <!--
        Normal build code here   
      -->
      
      <UsingTask AssemblyFile="$(OutputPath)\Db4oTool.MSBuild.dll" TaskName="Db4oTool.MSBuild.Db4oEnhancerMSBuildTask" />
      <ItemGroup>
        <Db4oEnhance Include="$(TargetPath)" />
      </ItemGroup>
      <Target Name="AfterBuild">
        <Db4oEnhancerMSBuildTask Assemblies="@(Db4oEnhance)" />
      </Target>
      
    </Project>




    17.3. Enhancement using Db4oTool


    Db4oTool.exe is a top level command line interface to all enhancement tasks. You can either add it to your own build setup or you can directly integrate it from within Visual Studio.

    To get you an idea on how you can set things up, here is a step-by-step example how you could integrate Db4oTool.exe from Visual Studio.NET 2005 to do it's post-build tasks for a CompactFramework 2.0 project:

    - In Visual Studio, right click on the project you want to enable Native Query optimization for
    - Select 'Properties'
    - In the Properties Page select the Build Events tab
    - In the Post-build event command line text box insert the following text:
    /bin/Db4oTool.exe -ta -nq $(TargetPath) (replace with the correct path for your system)

    Db4oTool.exe offers different command line options for different setups. You can get a list of options directly from Db4oTool.exe by calling
    Db4oTool.exe -help


    Options may be grouped into 4 categories:

    Enhancement Modes
    Target types (classes) specification
    Output related options
    Misc Options



      17.3.1. Enhancement Modes


      With the options in this group you can specify which type of instrumentation you want to apply (either Transparent Activation or Native Queries Optimization or both)

           -ta : Add Transparent Activation Support
           -nq : Optimize Native Queries
           -instrumentation:PARAM : Use your own instrumentation type




      17.3.2. Target types (classes) specification


      When enhancing an assembly it's possible to enhance all or some of its types through the following options:

           -by-attribute:PARAM    Filter types to be instrumented by attribute
           -by-filter:PARAM        Custom type filter
           -by-name:PARAM            Filter types by name (with regular expression syntax)
           -not                    Negates the last filter

      Note that these filters specifies which types should be included in the enhancement process. enhanced. If you want to filter out (i.e, to not enhance some types) you can specify -notoption.

      -by-namefilter expects a regular expression and will include each type whose fully qualified name matches this regular expression.



      17.3.3. Output related options

          
      Output related options

           -debug                  Preserve debugging information
           -fake                   Fake operation mode, assembly won't be written




      17.3.4. Misc Options


           -case-sensitive         Case sensitive queries
           -? -help                Show this help list
           -usage                  Show usage syntax and exit
        -v -verbose                Verbose operation mode
        -V -version                Display version and licensing information
           -vv                     Pretty verbose operation mode



    17.4. Native Query Optimization


    The Native Query optimizer is still under development to eventually "understand" all valid C# constructs. Current optimization supports the following constructs well:

    - compile-time constants
    - simple member access
    - primitive comparisons
    - equality operator
    - #Contains()/#StartsWith()/#EndsWith() for Strings
    - boolean expressions
    - arbitrary method calls (including property accessors) on predicate fields (without any arguments)
    - candidate methods composed of the above
    - chained combinations of the above

    Note that the current implementation does not support polymorphism yet.

    If optimization is turned off or not possible for some reason, a Native Query will be executed by instantiating all objects, using SODA Evaluations. Naturally performance will not be as good in this case, but queries will still deliver correct results.


      17.4.1. Native Query Optimization on CompactFramework 2.0


      Due to some platform limitations, CompactFramework 2.0 users using the convenient delegate based Native Query syntax that want their queries to be optimized are required to run the Db4oTool.exe command line utility on their assemblies prior to deploying them.

      The Db4oTool.exe utility, which can be found in the /bin folder of this distribution is required because the CompactFramework API does not expose any of the delegate metadata needed by the Native Query optimizer.

      The tool can be easily integrated inside Visual Studio.NET 2005 as a Post Build tool by following the simple steps below:

      - Right click the project you want to enable Native Query optimization for
      - Select'Properties'
      - In the Properties Page select the'Build Events'tab
      - In the'Post-build event command line'text box insert the following text "/bin/Db4oTool.exe -nq $(TargetPath)" without the quotes and replacing to the correct value for your system.


      17.4.2. Monitoring optimization


      To monitor optimization you can attach event handlers to the IObjectContainer:

      NativeQueryHandler handler = ((ObjectContainerBase)container).GetNativeQueryHandler();
      handler.QueryExecution += OnQueryExecution;
      handler.QueryOptimizationFailure += OnQueryOptimizationFailure;





















































db4o-8.0.184.15484+dfsg/doc/readme.html0000644000175000017500000000364411520622620017542 0ustar directhexdirecthex Readme

db4o Documentation

This folder contains db4o documentation.

tutorial db4o quick-start tutorial, which covers all of the most important concepts.
reference Complete and concise explanations of the db4o system. The most current version is available online.
api db4o API reference.

For more help, tips and trick join the db4o community.
Ask for help in the db4o forums at any time.
If you want to stay informed, subscribe to our db4o blogs.

db4o-8.0.184.15484+dfsg/doc/api/0000755000175000017500000000000011520622074016164 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/api/db4o.chm0000644000175000017500000765635111520622074017534 0ustar directhexdirecthexITSF`q2 |{ "|{ "`xTpp\ITSPT &%' j].!"TPMGL,//#IDXHDR^/#ITBITS /#STRINGS`/#SYSTEM5/#TOPICS^`/#URLSTRz/#URLTBL>< /$FIftiMainN /$OBJINSTɵQ?/$WWAssociativeLinks//$WWAssociativeLinks/PropertyɵM/$WWKeywordLinks//$WWKeywordLinks/BTreeŏtL/$WWKeywordLinks/Dataɀ@ /$WWKeywordLinks/MapɳKb/$WWKeywordLinks/Propertyɵ- /Db4o.hhcr /Db4o.hhkr&/html/D/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor.htmywO/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_1_f9cace8a.htmp O/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_1_ffe0907d.htm}O/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_2_4075724f.htmdO/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_2_60e3cf0f.htmSO/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_2_d398cbb6.htmR9O/html/C_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor_3_4a0540a0.htm >/html/C_Db4objects_Db4o_Collections_ActivatableList`1_ctor.htm I/html/C_Db4objects_Db4o_Collections_ActivatableList`1_ctor_1_68052cd5.htm%XI/html/C_Db4objects_Db4o_Collections_ActivatableList`1_ctor_1_f9cace8a.htm}1?/html/C_Db4objects_Db4o_Collections_ArrayDictionary4`2_ctor.htm.J/html/C_Db4objects_Db4o_Collections_ArrayDictionary4`2_ctor_1_f9cace8a.htmLT9/html/C_Db4objects_Db4o_Collections_ArrayList4`1_ctor.htm zD/html/C_Db4objects_Db4o_Collections_ArrayList4`1_ctor_1_e12327e4.htm7D/html/C_Db4objects_Db4o_Collections_ArrayList4`1_ctor_1_f9cace8a.htmQ0A/html/C_Db4objects_Db4o_Config_GlobalOnlyConfigException_ctor.htm3/html/C_Db4objects_Db4o_Config_JavaSupport_ctor.htmE/html/C_Db4objects_Db4o_Config_SimpleNameProvider_ctor_1_61b4e77c.htm&5/html/C_Db4objects_Db4o_Config_TSerializable_ctor.htm.%/html/C_Db4objects_Db4o_Defragment_IDMappingCollector_ctor.htmnz=/html/C_Db4objects_Db4o_Defragment_InMemoryIdMapping_ctor.htmh]G/html/C_Db4objects_Db4o_Diagnostic_ClassHasNoFields_ctor_1_61b4e77c.htmѓEIO/html/C_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_ctor_1_1ba40388.htman/html/C_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_DefragmentRecommendationReason_ctor_1_61b4e77c.htmo:/html/C_Db4objects_Db4o_Diagnostic_DeletionFailed_ctor.htmӦuL/html/C_Db4objects_Db4o_Diagnostic_DescendIntoTranslator_ctor_2_6608d038.htm{ :/html/C_Db4objects_Db4o_Diagnostic_DiagnosticBase_ctor.htmI ` $ {.0'ADPMGL;?/html/C_Db4objects_Db4o_Diagnostic_DiagnosticToConsole_ctor.htm՝=/html/C_Db4objects_Db4o_Diagnostic_DiagnosticToTrace_ctor.htm-]K/html/C_Db4objects_Db4o_Diagnostic_LoadedFromClassIndex_ctor_1_61b4e77c.htmֹ =C/html/C_Db4objects_Db4o_Diagnostic_MissingClass_ctor_1_61b4e77c.htm׎GUN/html/C_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized_ctor_2_7e02942e.htm(T/html/C_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_ctor_2_e676e493.htmؾD\N/html/C_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist_ctor_2_6608d038.htmٜ /html/C_Db4objects_Db4o_Ext_BackupInProgressException_ctor.htmNF/html/C_Db4objects_Db4o_Ext_CompositeDb4oException_ctor_1_4eec6344.htmcd/html/C_Db4objects_Db4o_Ext_DatabaseReadOnlyException_ctor.htmN2/html/C_Db4objects_Db4o_Ext_Db4oException_ctor.htmTo=/html/C_Db4objects_Db4o_Ext_Db4oException_ctor_1_61b4e77c.htmCb=/html/C_Db4objects_Db4o_Ext_Db4oException_ctor_1_8d535e04.htm%=/html/C_Db4objects_Db4o_Ext_Db4oException_ctor_1_f9cace8a.htm*=/html/C_Db4objects_Db4o_Ext_Db4oException_ctor_2_3ec47892.htm?d7/html/C_Db4objects_Db4o_Ext_Db4oFatalException_ctor.htm#*B/html/C_Db4objects_Db4o_Ext_Db4oFatalException_ctor_1_61b4e77c.htmM5B/html/C_Db4objects_Db4o_Ext_Db4oFatalException_ctor_1_8d535e04.htm`B/html/C_Db4objects_Db4o_Ext_Db4oFatalException_ctor_1_f9cace8a.htmbcB/html/C_Db4objects_Db4o_Ext_Db4oFatalException_ctor_2_3ec47892.htmE F/html/C_Db4objects_Db4o_Ext_Db4oFileHeaderCorruptionException_ctor.htmO6I/html/C_Db4objects_Db4o_Ext_Db4oIllegalStateException_ctor_1_61b4e77c.htmGI/html/C_Db4objects_Db4o_Ext_Db4oIllegalStateException_ctor_1_8d535e04.htmL^4/html/C_Db4objects_Db4o_Ext_Db4oIOException_ctor.htm*r?/html/C_Db4objects_Db4o_Ext_Db4oIOException_ctor_1_61b4e77c.htm?/html/C_Db4objects_Db4o_Ext_Db4oIOException_ctor_1_8d535e04.htm/A=/html/C_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor.htmpH/html/C_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor_1_61b4e77c.htm!H/html/C_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor_1_8d535e04.htm'LH/html/C_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor_1_f9cace8a.htmsOH/html/C_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor_2_3ec47892.htmBvG/html/C_Db4objects_Db4o_Ext_Db4oUnexpectedException_ctor_1_8d535e04.htm88/html/C_Db4objects_Db4o_Ext_Db4oUUID_ctor_2_fc432f55.htmV"G/html/C_Db4objects_Db4o_Ext_EmergencyShutdownReadOnlyException_ctor.htmxSD/html/C_Db4objects_Db4o_Ext_IncompatibleFileFormatException_ctor.htmKO/html/C_Db4objects_Db4o_Ext_IncompatibleFileFormatException_ctor_1_61b4e77c.htm_3B/html/C_Db4objects_Db4o_Ext_InvalidIDException_ctor_1_8d535e04.htmqB/html/C_Db4objects_Db4o_Ext_InvalidIDException_ctor_1_f9cace8a.htm+_ctor.htmI ~ & {6PMGL =/html/C_Db4objects_Db4o_Ext_InvalidPasswordException_ctor.htm.1D/html/C_Db4objects_Db4o_Ext_InvalidSlotException_ctor_1_61b4e77c.htm_zD/html/C_Db4objects_Db4o_Ext_InvalidSlotException_ctor_3_2bb455db.htmY&J/html/C_Db4objects_Db4o_Ext_ObjectNotStorableException_ctor_1_61b4e77c.htmYJ/html/C_Db4objects_Db4o_Ext_ObjectNotStorableException_ctor_1_bcc15f36.htmX7/html/C_Db4objects_Db4o_Ext_OldFormatException_ctor.htmje+/html/C_Db4objects_Db4o_Ext_Status_ctor.htmO'B/html/C_Db4objects_Db4o_Ext_UnsupportedOldFormatException_ctor.htmvB;/html/C_Db4objects_Db4o_IO_BinDecorator_ctor_1_1722fdab.htm8`>/html/C_Db4objects_Db4o_IO_CachedIoAdapter_ctor_1_f1a2e59e.htm>/html/C_Db4objects_Db4o_IO_CachedIoAdapter_ctor_3_e9c63b3a.htm4>/html/C_Db4objects_Db4o_IO_CachedIoAdapter_ctor_7_372537aa.htmKo=/html/C_Db4objects_Db4o_IO_CachingStorage_ctor_1_9738b4c7.htm:(=/html/C_Db4objects_Db4o_IO_CachingStorage_ctor_3_b0e0d0e2.htmbE/html/C_Db4objects_Db4o_IO_ConstantGrowthStrategy_ctor_1_f9cace8a.htmbn=/html/C_Db4objects_Db4o_IO_DebugIoAdapter_ctor_1_f1a2e59e.htmP =/html/C_Db4objects_Db4o_IO_DebugIoAdapter_ctor_5_3bffa4c7.htmZj:/html/C_Db4objects_Db4o_IO_DoublingGrowthStrategy_ctor.htmDf//html/C_Db4objects_Db4o_IO_FileStorage_ctor.htm*'B/html/C_Db4objects_Db4o_IO_FileStorage_FileBin_ctor_1_33e1cb26.htmQj-/html/C_Db4objects_Db4o_IO_IoAdapter_ctor.htm;v8/html/C_Db4objects_Db4o_IO_MemoryBin_ctor_2_acf5cc17.htm1[8/html/C_Db4objects_Db4o_IO_MemoryBin_ctor_2_edf0b48e.htm .3/html/C_Db4objects_Db4o_IO_MemoryIoAdapter_ctor.htm:>/html/C_Db4objects_Db4o_IO_MemoryIoAdapter_ctor_1_f9cace8a.htm:/1/html/C_Db4objects_Db4o_IO_MemoryStorage_ctor.htmiA/html/C_Db4objects_Db4o_IO_ThreadedSyncBin_ctor_1_1722fdab.htm?/html/C_Db4objects_Db4o_IO_VanillaIoAdapter_ctor_1_f1a2e59e.htm&?/html/C_Db4objects_Db4o_IO_VanillaIoAdapter_ctor_5_3bffa4c7.htm9sC/html/C_Db4objects_Db4o_Monitoring_Db4oPerformanceCounters_ctor.htm,&F/html/C_Db4objects_Db4o_Monitoring_FreespaceMonitoringSupport_ctor.htmR}?/html/C_Db4objects_Db4o_Monitoring_IOMonitoringSupport_ctor.htmO2G/html/C_Db4objects_Db4o_Monitoring_MonitoredStorage_ctor_1_9738b4c7.htmH/html/C_Db4objects_Db4o_Monitoring_NativeQueryMonitoringSupport_ctor.htm7L/html/C_Db4objects_Db4o_Monitoring_ObjectLifecycleMonitoringSupport_ctor.htmP+B/html/C_Db4objects_Db4o_Monitoring_QueryMonitoringSupport_ctor.htm{ L/html/C_Db4objects_Db4o_Monitoring_ReferenceSystemMonitoringSupport_ctor.htm+0/html/C_Db4objects_Db4o_Query_Predicate_ctor.htm7&;/html/C_Db4objects_Db4o_Query_Predicate_ctor_1_90c95d47.htm]>8/html/C_Db4objects_Db4o_Query_PredicatePlatform_ctor.htm/@/html/C_Db4objects_Db4o_Reflect_Core_ConstructorSupport_ctor.htmS/html/C_Db4objects_Db4o_Reflect_Core_PlatformReflectConstructor_ctor_1_90c95d47.htm6jO/html/C_Db4objects_Db4o_Reflect_Core_ReflectConstructorSpec_ctor_2_ab94ed8e.htm L/html/C_Db4objects_Db4o_Reflect_Generic_GenericReflector_ctor_1_ee97d764.htm"L/html/C_Db4objects_Db4o_Reflect_Generic_GenericReflector_ctor_2_c3599f79.htm9@/html/C_Db4objects_Db4o_Reflect_Net_NetArray_ctor_1_ee97d764.htm=/html/C_Db4objects_Db4o_Typehandlers_GuidTypeHandler_ctor.htmXE/html/E_Db4objects_Db4o_Events_IEventRegistry_Deactivating.htmN9/html/E_Db4objects_Db4o_Events_IEventRegistry_Deleted.htm_=:/html/E_Db4objects_Db4o_Events_IEventRegistry_Deleting.htm>/html/E_Db4objects_Db4o_Events_IEventRegistry_Instantiated.htm/38/html/E_Db4objects_Db4o_Events_IEventRegistry_Opened.htmbZ?/html/E_Db4objects_Db4o_Events_IEventRegistry_QueryFinished.htm< >/html/E_Db4objects_Db4o_Events_IEventRegistry_QueryStarted.htmH|9/html/E_Db4objects_Db4o_Events_IEventRegistry_Updated.htmD :/html/E_Db4objects_Db4o_Events_IEventRegistry_Updating.htmQO8/html/Events_T_Db4objects_Db4o_Events_IEventRegistry.htmQJ7/html/F_Db4objects_Db4o_Config_ConfigScope_Disabled.htm9/html/F_Db4objects_Db4o_Config_ConfigScope_DisabledId.htm͚/t7/html/F_Db4objects_Db4o_Config_ConfigScope_Globally.htm#9/html/F_Db4objects_Db4o_Config_ConfigScope_GloballyId.htmο>t;/html/F_Db4objects_Db4o_Config_ConfigScope_Individually.htmϏ2=/html/F_Db4objects_Db4o_Config_ConfigScope_IndividuallyId.htmIL@/html/F_Db4objects_Db4o_Config_QueryEvaluationMode_Immediate.htmж(;/html/F_Db4objects_Db4o_Config_QueryEvaluationMode_Lazy.htmѐ=N?/html/F_Db4objects_Db4o_Config_QueryEvaluationMode_Snapshot.htm oI/html/F_Db4objects_Db4o_Constraints_UniqueFieldValueConstraint__clazz.htmzM/html/F_Db4objects_Db4o_Constraints_UniqueFieldValueConstraint__fieldName.htmӛm=/html/F_Db4objects_Db4o_CS_Db4oClientServer_ArbitraryPort.htm|UD/html/F_Db4objects_Db4o_Defragment_DefragmentConfig_BackupSuffix.htmԾQ7=/html/F_Db4objects_Db4o_Defragment_DefragmentConfig_Debug.htmՑ&l/html/F_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_DefragmentRecommendationReason_DeleteEmbeded.htm.U>/html/F_Db4objects_Db4o_Diagnostic_MissingClass__className.htmW/C_Db4objects_Db4o_Reflect_Net_NetClass_ctor_3_d8823d7b.htm)\I < 9 Otl7PMGLY/html/F_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_NqConstructionFailed.htmגZXQ/html/F_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_NqNotPresent.htm2(I/html/F_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist__className.htmغZI/html/F_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist__fieldName.htmٌwB/html/F_Db4objects_Db4o_Ext_CompositeDb4oException__exceptions.htmb0/html/F_Db4objects_Db4o_Ext_Status_Available.htmڰvV0/html/F_Db4objects_Db4o_Ext_Status_Completed.htmLV,/html/F_Db4objects_Db4o_Ext_Status_Error.htm"~1/html/F_Db4objects_Db4o_Ext_Status_Processing.htmܜ l-/html/F_Db4objects_Db4o_Ext_Status_Queued.htm -/html/F_Db4objects_Db4o_Ext_Status_Unused.htmݹ 0/html/F_Db4objects_Db4o_IO_BinDecorator__bin.htmއ4b8/html/F_Db4objects_Db4o_IO_StorageDecorator__storage.htm9/html/F_Db4objects_Db4o_IO_VanillaIoAdapter__delegate.htmߤ0DK/html/F_Db4objects_Db4o_Monitoring_Db4oPerformanceCounters_CategoryName.htmtPM/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_BytesReadPerSec.htmDP/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_BytesWrittenPerSec.htmVTS/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ClassIndexScansPerSec.htm*V/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_FreespaceAverageSlotSize.htm@XX/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_FreespaceReusedSlotsPerSec.htmP/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_FreespaceSlotCount.htmTO/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_LinqQueriesPerSec.htmp>Q/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_NativeQueriesPerSec.htm.jT/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_NetBytesReceivedPerSec.htm,P/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_NetBytesSentPerSec.htmDTR/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_NetClientConnections.htmS/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_NetMessagesSentPerSec.htmR/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ObjectReferenceCount.htm.T/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ObjectsActivatedPerSec.htm<,V/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ObjectsDeactivatedPerSec.htmhXR/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ObjectsDeletedPerSec.htm@Q/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_ObjectsStoredPerSec.htm@jK/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_QueriesPerSec.htm*fL/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_TotalFreespace.htm|Z/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_UnoptimizedLinqQueriesPerSec.htm 0\/html/F_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_UnoptimizedNativeQueriesPerSec.htm<\?/html/F_Db4objects_Db4o_Query_Predicate_PredicatemethodName.htm&G/html/F_Db4objects_Db4o_Query_PredicatePlatform_PredicatemethodName.htmR/html/F_Db4objects_Db4o_Reflect_Core_ReflectConstructorSpec_InvalidConstructor.htm6`V/html/F_Db4objects_Db4o_Reflect_Core_ReflectConstructorSpec_UnspecifiedConstructor.htm8;/html/F_Db4objects_Db4o_Reflect_Net_NetClass__reflector.htmNi7/html/F_Db4objects_Db4o_Reflect_Net_NetField__field.htm7Y/html/Fields_T_Db4objects_Db4o_Defragment_DefragmentConfig.htm2e/html/Fields_T_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_DefragmentRecommendationReason.htmJC:/html/Fields_T_Db4objects_Db4o_Diagnostic_MissingClass.htm fI < D {3PMGLgK/html/Fields_T_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded.htmsTE/html/Fields_T_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist.htmG =/html/Fields_T_Db4objects_Db4o_Ext_CompositeDb4oException.htmgD-/html/Fields_T_Db4objects_Db4o_Ext_Status.htm+u2/html/Fields_T_Db4objects_Db4o_IO_BinDecorator.htm t4/html/Fields_T_Db4objects_Db4o_IO_CachingStorage.htm4/html/Fields_T_Db4objects_Db4o_IO_DebugIoAdapter.htm:/html/Fields_T_Db4objects_Db4o_IO_NonFlushingIoAdapter.htm¤q8/html/Fields_T_Db4objects_Db4o_IO_NonFlushingStorage.htm K3/html/Fields_T_Db4objects_Db4o_IO_SaveAsStorage.htmXq6/html/Fields_T_Db4objects_Db4o_IO_StorageDecorator.htmďIH5/html/Fields_T_Db4objects_Db4o_IO_ThreadedSyncBin.htm6/html/Fields_T_Db4objects_Db4o_IO_VanillaIoAdapter.htmūJE/html/Fields_T_Db4objects_Db4o_Monitoring_Db4oPerformanceCounters.htm\ >/html/Fields_T_Db4objects_Db4o_Monitoring_MonitoredStorage.htmiD/html/Fields_T_Db4objects_Db4o_Monitoring_PerformanceCounterSpec.htmǗx42/html/Fields_T_Db4objects_Db4o_Query_Predicate.htmȜ,:/html/Fields_T_Db4objects_Db4o_Query_PredicatePlatform.htmFcF/html/Fields_T_Db4objects_Db4o_Reflect_Core_ReflectConstructorSpec.htmɹ)u7/html/Fields_T_Db4objects_Db4o_Reflect_Net_NetClass.htmʌ17/html/Fields_T_Db4objects_Db4o_Reflect_Net_NetField.htmO);/html/Fields_T_Db4objects_Db4o_Reflect_Net_NetReflector.htm˦xwG/html/Fields_T_Db4objects_Db4o_Typehandlers_IgnoreFieldsTypeHandler.htmo!E/html/M_Db4objects_Db4o_Activation_IActivator_Activate_1_e67c62b2.htm3N/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Add_2_3fcf08df.htm2%N/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Add_2_e41ff259.htmWN/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Add_2_ec7f75d9.htmk9E/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Clear.htm$qS/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Contains_1_2572741a.htmzS/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Contains_2_e41ff259.htmBV/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_ContainsKey_1_1a965722.htm6X/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_ContainsValue_1_bd3dcbbd.htmK/Q/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_CopyTo_2_4b274b99.htm[CQ/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_CopyTo_3_adc1e27b.htmPM/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_GetEnumerator.htmnCX/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_GetObjectData_2_af75a6ab.htm1\/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_OnDeserialization_1_2572741a.htm2 Q/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Remove_1_1a965722.htm=Q/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Remove_1_2572741a.htm@Q/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_Remove_2_e41ff259.htm^$V/html/M_Db4objects_Db4o_Collections_ActivatableDictionary`2_TryGetValue_2_dcb7efc6.htmyH/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Add_1_1a965722.htmz M/html/M_Db4objects_Db4o_Collections_ActivatableList`1_AddRange_1_70e2ec3f.htm{D/html/M_Db4objects_Db4o_Collections_ActivatableList`1_AsReadOnly.htmeQ/html/M_Db4objects_Db4o_Collections_ActivatableList`1_BinarySearch_1_1a965722.htmj\Q/html/M_Db4objects_Db4o_Collections_ActivatableList`1_BinarySearch_2_d930934e.htmF,Q/html/M_Db4objects_Db4o_Collections_ActivatableList`1_BinarySearch_4_d3ce66ec.htmrx?/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Clear.htmjvM/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Contains_1_1a965722.htm`fR/html/M_Db4objects_Db4o_Collections_ActivatableList`1_ConvertAll``1_2_125b283c.htmF:K/html/M_Db4objects_Db4o_Collections_ActivatableList`1_CopyTo_1_b8cc08cb.htmqmJC:/html/Fields_T_Db4objects_Db4o_Diagnostic_MissingClass.htm fI <2  N+T3PMGLWK/html/M_Db4objects_Db4o_Collections_ActivatableList`1_CopyTo_2_5f02821a.htmqyK/html/M_Db4objects_Db4o_Collections_ActivatableList`1_CopyTo_4_7e2412da.htmj|K/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Equals_1_2572741a.htmf+K/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Exists_1_a32b734b.htm;I/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Find_1_a32b734b.htm L/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindAll_1_a32b734b.htmLN/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindIndex_1_a32b734b.htmR N/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindIndex_2_a85ad092.htm_LN/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindIndex_3_d2118ea7.htm+rM/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindLast_1_a32b734b.htmoR/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindLastIndex_1_a32b734b.htmIR/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindLastIndex_2_a85ad092.htmfR/html/M_Db4objects_Db4o_Collections_ActivatableList`1_FindLastIndex_3_d2118ea7.htmn.L/html/M_Db4objects_Db4o_Collections_ActivatableList`1_ForEach_1_ba0993bb.htm`G/html/M_Db4objects_Db4o_Collections_ActivatableList`1_GetEnumerator.htmzaM/html/M_Db4objects_Db4o_Collections_ActivatableList`1_GetRange_2_4ac95b2b.htm[L/html/M_Db4objects_Db4o_Collections_ActivatableList`1_IndexOf_1_1a965722.htm[ZL/html/M_Db4objects_Db4o_Collections_ActivatableList`1_IndexOf_2_349587b2.htm57L/html/M_Db4objects_Db4o_Collections_ActivatableList`1_IndexOf_3_67e66f6a.html]K/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Insert_2_f5a71668.htm]P/html/M_Db4objects_Db4o_Collections_ActivatableList`1_InsertRange_2_dc88fa90.htmIQP/html/M_Db4objects_Db4o_Collections_ActivatableList`1_LastIndexOf_1_1a965722.htmwMP/html/M_Db4objects_Db4o_Collections_ActivatableList`1_LastIndexOf_2_349587b2.htmDsP/html/M_Db4objects_Db4o_Collections_ActivatableList`1_LastIndexOf_3_67e66f6a.htm7K/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Remove_1_1a965722.htm,6N/html/M_Db4objects_Db4o_Collections_ActivatableList`1_RemoveAll_1_a32b734b.htmPM/html/M_Db4objects_Db4o_Collections_ActivatableList`1_RemoveAt_1_cd2d7ec9.htmQ)P/html/M_Db4objects_Db4o_Collections_ActivatableList`1_RemoveRange_2_4ac95b2b.htmz2A/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Reverse.htmb/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Sort.htmI/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Sort_1_3512e669.htmI/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Sort_1_e24f45c2.htm@I/html/M_Db4objects_Db4o_Collections_ActivatableList`1_Sort_3_95926531.htm[ A/html/M_Db4objects_Db4o_Collections_ActivatableList`1_ToArray.htmgsD/html/M_Db4objects_Db4o_Collections_ActivatableList`1_TrimExcess.htmZ%O/html/M_Db4objects_Db4o_Collections_ActivatableList`1_TrueForAll_1_a32b734b.htmN/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_Activate_1_e67c62b2.htmI/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_Add_2_ec7f75d9.htmHJ/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_Bind_1_133748a9.htmdA@/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_Clear.htm%pQ/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_ContainsKey_1_1a965722.htmH/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_GetEnumerator.htmF/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_GetHashCode.htmL/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_Remove_1_1a965722.htm< Q/html/M_Db4objects_Db4o_Collections_ArrayDictionary4`2_TryGetValue_2_dcb7efc6.htmE+H/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Activate_1_e67c62b2.htmpGC/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Add_1_1a965722.htmMwields_T_Db4objects_Db4o_Diagnostic_MissingClass.htm fI <2 r PH0PMGL/C/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Add_1_2572741a.htmD~H/html/M_Db4objects_Db4o_Collections_ArrayList4`1_AddRange_1_70e2ec3f.htm7L/html/M_Db4objects_Db4o_Collections_ArrayList4`1_BinarySearch_1_1a965722.htmBL/html/M_Db4objects_Db4o_Collections_ArrayList4`1_BinarySearch_2_d930934e.htmXaL/html/M_Db4objects_Db4o_Collections_ArrayList4`1_BinarySearch_4_d3ce66ec.htm9-D/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Bind_1_133748a9.htmf:/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Clear.html1H/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Contains_1_1a965722.htm%H/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Contains_1_2572741a.htmBKM/html/M_Db4objects_Db4o_Collections_ArrayList4`1_ConvertAll``1_2_125b283c.htmŸ *F/html/M_Db4objects_Db4o_Collections_ArrayList4`1_CopyTo_2_4b274b99.htmÎ7eF/html/M_Db4objects_Db4o_Collections_ArrayList4`1_CopyTo_2_5f02821a.htm3N/html/M_Db4objects_Db4o_Collections_ArrayList4`1_EnsureCapacity_1_cd2d7ec9.htmODF/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Exists_1_a32b734b.htmŸRD/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Find_1_a32b734b.htmK&G/html/M_Db4objects_Db4o_Collections_ArrayList4`1_FindAll_1_a32b734b.htmƛevI/html/M_Db4objects_Db4o_Collections_ArrayList4`1_FindIndex_3_d2118ea7.htm[EH/html/M_Db4objects_Db4o_Collections_ArrayList4`1_FindLast_1_a32b734b.htmEM/html/M_Db4objects_Db4o_Collections_ArrayList4`1_FindLastIndex_3_d2118ea7.htm %G/html/M_Db4objects_Db4o_Collections_ArrayList4`1_ForEach_1_ba0993bb.htmʤqwC/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Get_1_cd2d7ec9.htmeB/html/M_Db4objects_Db4o_Collections_ArrayList4`1_GetEnumerator.htmˆh}G/html/M_Db4objects_Db4o_Collections_ArrayList4`1_IndexOf_1_1a965722.htmlG/html/M_Db4objects_Db4o_Collections_ArrayList4`1_IndexOf_1_2572741a.htm͞:F/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Insert_2_a902cdae.htm"pF/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Insert_2_f5a71668.htmJK/html/M_Db4objects_Db4o_Collections_ArrayList4`1_InsertRange_2_dc88fa90.htm:hF/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Remove_1_1a965722.htmoF/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Remove_1_2572741a.htmҺvJH/html/M_Db4objects_Db4o_Collections_ArrayList4`1_RemoveAt_1_cd2d7ec9.htmП\EK/html/M_Db4objects_Db4o_Collections_ArrayList4`1_RemoveRange_2_4ac95b2b.htm!ND/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Sort_3_95926531.htmӔ@22W/html/M_Db4objects_Db4o_Collections_CollectionFactory_ForObjectContainer_1_dea717c1.htmpF/html/M_Db4objects_Db4o_Collections_CollectionFactory_NewBigSet``1.htm.@/html/M_Db4objects_Db4o_Collections_ISet`1_AddAll_1_70e2ec3f.htmؽ0=E/html/M_Db4objects_Db4o_Collections_ISet`1_ContainsAll_1_70e2ec3f.htmٟm5C/html/M_Db4objects_Db4o_Collections_ISet`1_RemoveAll_1_70e2ec3f.htmڃ"E/html/M_Db4objects_Db4o_Config_ConfigScope_ApplyConfig_1_b909ace0.htm'U@/html/M_Db4objects_Db4o_Config_ConfigScope_Equals_1_2572741a.htm|l:/html/M_Db4objects_Db4o_Config_ConfigScope_GetHashCode.htmܙhm7/html/M_Db4objects_Db4o_Config_ConfigScope_ToString.htmU1G/html/M_Db4objects_Db4o_Config_IAlias_ResolveRuntimeName_1_72eac341.htmݻ.F/html/M_Db4objects_Db4o_Config_IAlias_ResolveStoredName_1_72eac341.htmޗ4V/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_BatchMessages_1_36d384f7.htmG+N/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_GetMessageSender.htmrZ/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_MaxBatchQueueSize_1_cd2d7ec9.htmLV/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_PrefetchDepth_1_cd2d7ec9.htmNfngClass.htm fI <_ K H :3PMGLQ X/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_PrefetchIDCount_1_cd2d7ec9.htm4N\/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_PrefetchObjectCount_1_cd2d7ec9.htm>^/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_PrefetchSlotCacheSize_1_cd2d7ec9.htm@ \/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_SetMessageRecipient_1_5c88bded.htmI.]/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_SingleThreadedClient_1_36d384f7.htmwc\/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_TimeoutClientSocket_1_cd2d7ec9.htmZ'\/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_TimeoutServerSocket_1_cd2d7ec9.htm/html/M_Db4objects_Db4o_Config_IConfiguration_ClientServer.htmeO/html/M_Db4objects_Db4o_Config_IConfiguration_DatabaseGrowthSize_1_cd2d7ec9.htmtfP/html/M_Db4objects_Db4o_Config_IConfiguration_DetectSchemaChanges_1_36d384f7.htmZWB/html/M_Db4objects_Db4o_Config_IObjectClass_Indexed_1_36d384f7.htm9<_ b ^1PMGLU Q/html/M_Db4objects_Db4o_Config_IObjectClass_MaximumActivationDepth_1_cd2d7ec9.htm=F/html/M_Db4objects_Db4o_Config_IObjectClass_MinimumActivationDepth.htmBQ/html/M_Db4objects_Db4o_Config_IObjectClass_MinimumActivationDepth_1_cd2d7ec9.htmVYF/html/M_Db4objects_Db4o_Config_IObjectClass_ObjectField_1_72eac341.htm/H/html/M_Db4objects_Db4o_Config_IObjectClass_PersistStaticFieldValues.htmHAA/html/M_Db4objects_Db4o_Config_IObjectClass_Rename_1_72eac341.htm 6O/html/M_Db4objects_Db4o_Config_IObjectClass_StoreTransientFields_1_36d384f7.htm?`D/html/M_Db4objects_Db4o_Config_IObjectClass_Translate_1_ee661bf0.htm~F/html/M_Db4objects_Db4o_Config_IObjectClass_UpdateDepth_1_cd2d7ec9.htmTN/html/M_Db4objects_Db4o_Config_IObjectConstructor_OnInstantiate_2_e7991036.htmqL/html/M_Db4objects_Db4o_Config_IObjectField_CascadeOnActivate_1_36d384f7.htmrJ/html/M_Db4objects_Db4o_Config_IObjectField_CascadeOnDelete_1_36d384f7.htmvAJ/html/M_Db4objects_Db4o_Config_IObjectField_CascadeOnUpdate_1_36d384f7.htm7B/html/M_Db4objects_Db4o_Config_IObjectField_Indexed_1_36d384f7.htm=~A/html/M_Db4objects_Db4o_Config_IObjectField_Rename_1_72eac341.htm;`J/html/M_Db4objects_Db4o_Config_IObjectTranslator_OnActivate_3_7cefac6d.htm6G/html/M_Db4objects_Db4o_Config_IObjectTranslator_OnStore_2_e7991036.htmQ@@/html/M_Db4objects_Db4o_Config_IObjectTranslator_StoredClass.htm`E/html/M_Db4objects_Db4o_Config_IQueryConfiguration_EvaluationMode.htmq P/html/M_Db4objects_Db4o_Config_IQueryConfiguration_EvaluationMode_1_8f89925c.htmza?/html/M_Db4objects_Db4o_Config_JavaSupport_Apply_1_f3cd1791.htm[gA/html/M_Db4objects_Db4o_Config_JavaSupport_Prepare_1_878dde74.htmBPF/html/M_Db4objects_Db4o_Config_TSerializable_OnActivate_3_7cefac6d.htmCdI/html/M_Db4objects_Db4o_Config_TSerializable_OnInstantiate_2_e7991036.htm'oC/html/M_Db4objects_Db4o_Config_TSerializable_OnStore_2_e7991036.htm]S/html/M_Db4objects_Db4o_Constraints_UniqueFieldValueConstraint_Apply_1_f3cd1791.htmmU/html/M_Db4objects_Db4o_Constraints_UniqueFieldValueConstraint_Prepare_1_878dde74.htm~eG/html/M_Db4objects_Db4o_CS_Config_ClientSslSupport_Apply_1_8f873baf.htměc|I/html/M_Db4objects_Db4o_CS_Config_ClientSslSupport_Prepare_1_55c91854.htm_wZ/html/M_Db4objects_Db4o_CS_Config_IClientConfiguration_AddConfigurationItem_1_dc74b8ac.htmDž;$O/html/M_Db4objects_Db4o_CS_Config_IClientConfigurationItem_Apply_1_8f873baf.htmVQ/html/M_Db4objects_Db4o_CS_Config_IClientConfigurationItem_Prepare_1_55c91854.htmƨkPP/html/M_Db4objects_Db4o_CS_Config_IClientServerFactory_OpenClient_5_7a43d7d3.htm_;P/html/M_Db4objects_Db4o_CS_Config_IClientServerFactory_OpenServer_3_cc749516.htm]Z/html/M_Db4objects_Db4o_CS_Config_IServerConfiguration_AddConfigurationItem_1_33737a19.htmˊ]%O/html/M_Db4objects_Db4o_CS_Config_IServerConfigurationItem_Apply_1_d0a3f36d.htmwQ/html/M_Db4objects_Db4o_CS_Config_IServerConfigurationItem_Prepare_1_4d8119f6.htmʮ PG/html/M_Db4objects_Db4o_CS_Config_ServerSslSupport_Apply_1_d0a3f36d.htmI/html/M_Db4objects_Db4o_CS_Config_ServerSslSupport_Prepare_1_4d8119f6.htmwF/html/M_Db4objects_Db4o_CS_Db4oClientServer_NewClientConfiguration.htm͜ybjects_Db4o_Config_IObjectClass_Indexed_1_36d384f7.htm9<_P / H.1PMGLD F/html/M_Db4objects_Db4o_CS_Db4oClientServer_NewServerConfiguration.htmzsE/html/M_Db4objects_Db4o_CS_Db4oClientServer_OpenClient_4_89b21826.htmmeE/html/M_Db4objects_Db4o_CS_Db4oClientServer_OpenClient_5_7a43d7d3.htmϷR E/html/M_Db4objects_Db4o_CS_Db4oClientServer_OpenServer_2_01b939db.htmжrZE/html/M_Db4objects_Db4o_CS_Db4oClientServer_OpenServer_3_cc749516.htmјL9/html/M_Db4objects_Db4o_Db4oEmbedded_NewConfiguration.htmғeN=/html/M_Db4objects_Db4o_Db4oFactory_OpenServer_3_10594da8.htmܹP//html/M_Db4objects_Db4o_Db4oFactory_Version.htmV P/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_AddressForId_1_cd2d7ec9.htmޞcG>/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_Close.htm*??/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_Commit.htmiWI/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_MapId_2_3890057c.htm@YI/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_MapId_3_cd5444bf.htm1R/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_MapNonClassIDs_2_4ac95b2b.htmJQ/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_MappedClassID_1_cd2d7ec9.htm]L/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_MappedId_1_cd2d7ec9.htmzg=/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_Open.htma'D/html/M_Db4objects_Db4o_Defragment_AbstractIdMapping_SlotChanges.htm&L/html/M_Db4objects_Db4o_Defragment_AvailableTypeFilter_Accept_1_610a0e7f.htm.fP/html/M_Db4objects_Db4o_Defragment_DatabaseIdMapping_AddressForId_1_cd2d7ec9.htm:>/html/M_Db4objects_Db4o_Defragment_DatabaseIdMapping_Close.htmN>/html/M_Db4objects_Db4o_Defragment_DefragmentInfo_ToString.htmv+Z/html/M_Db4objects_Db4o_Defragment_IDefragmentListener_NotifyDefragmentInfo_1_31af2a8a.htmJ/html/M_Db4objects_Db4o_Defragment_IDMappingCollector_Flush_1_c76f4979.htm%jI/html/M_Db4objects_Db4o_Defragment_IIdMapping_AddressForId_1_cd2d7ec9.htmb7/html/M_Db4objects_Db4o_Defragment_IIdMapping_Close.htmq8/html/M_Db4objects_Db4o_Defragment_IIdMapping_Commit.htmRB/html/M_Db4objects_Db4o_Defragment_IIdMapping_MapId_2_3890057c.htmQuB/html/M_Db4objects_Db4o_Defragment_IIdMapping_MapId_3_cd5444bf.htmF`E/html/M_Db4objects_Db4o_Defragment_IIdMapping_MappedId_1_cd2d7ec9.htm&a6/html/M_Db4objects_Db4o_Defragment_IIdMapping_Open.htm:=/html/M_Db4objects_Db4o_Defragment_IIdMapping_SlotChanges.htmA9P/html/M_Db4objects_Db4o_Defragment_InMemoryIdMapping_AddressForId_1_cd2d7ec9.htmz:>/html/M_Db4objects_Db4o_Defragment_InMemoryIdMapping_Close.htm4/html/M_Db4objects_Db4o_Diagnostic_ClassHasNoFields_Reason.htmx#@/html/M_Db4objects_Db4o_Diagnostic_ClassHasNoFields_Solution.htmOG/html/M_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_Problem.htmjIF/html/M_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_Reason.htm33H/html/M_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_Solution.htmf_=/html/M_Db4objects_Db4o_Diagnostic_DeletionFailed_Problem.htmE/html/M_Db4objects_Db4o_Diagnostic_DeletionFailed_Solution.htmY+D/html/M_Db4objects_Db4o_Diagnostic_DescendIntoTranslator_Problem.htmC/html/M_Db4objects_Db4o_Diagnostic_DescendIntoTranslator_Reason.htm}E/html/M_Db4objects_Db4o_Diagnostic_DescendIntoTranslator_Solution.htm)=/html/M_Db4objects_Db4o_Diagnostic_DiagnosticBase_Problem.htm=)/html/M_Db4objects_Db4o_Diagnostic_DiagnosticBase_Solution.htm76>/html/M_Db4objects_Db4o_Diagnostic_DiagnosticBase_ToString.htmm+R/html/M_Db4objects_Db4o_Diagnostic_DiagnosticToConsole_OnDiagnostic_1_a137ee68.htmP/html/M_Db4objects_Db4o_Diagnostic_DiagnosticToTrace_OnDiagnostic_1_a137ee68.htm.V/html/M_Db4objects_Db4o_Diagnostic_IDiagnosticConfiguration_AddListener_1_5c82f615.htmDqR/html/M_Db4objects_Db4o_Diagnostic_IDiagnosticConfiguration_RemoveAllListeners.htm5$m9< # 9 @04PMGL3 R/html/M_Db4objects_Db4o_Diagnostic_IDiagnosticListener_OnDiagnostic_1_a137ee68.htmYC/html/M_Db4objects_Db4o_Diagnostic_LoadedFromClassIndex_Problem.htmoB/html/M_Db4objects_Db4o_Diagnostic_LoadedFromClassIndex_Reason.htmpkD/html/M_Db4objects_Db4o_Diagnostic_LoadedFromClassIndex_Solution.htm[;/html/M_Db4objects_Db4o_Diagnostic_MissingClass_Problem.htmrq:/html/M_Db4objects_Db4o_Diagnostic_MissingClass_Reason.htmc[F/html/M_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized_Problem.htmE7E/html/M_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized_Reason.htm|!G/html/M_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized_Solution.htmML/html/M_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_Problem.htmj#K/html/M_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_Reason.htm M/html/M_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_Solution.htm9F/html/M_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist_Problem.htmS7E/html/M_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist_Reason.htm !G/html/M_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist_Solution.htm+MD/html/M_Db4objects_Db4o_Diagnostic_UpdateDepthGreaterOne_Problem.htmxC/html/M_Db4objects_Db4o_Diagnostic_UpdateDepthGreaterOne_Reason.htm }E/html/M_Db4objects_Db4o_Diagnostic_UpdateDepthGreaterOne_Solution.htm)D/html/M_Db4objects_Db4o_Events_CancellableObjectEventArgs_Cancel.htm1%?/html/M_Db4objects_Db4o_Events_ClassEventArgs_ClassMetadata.htmV)>/html/M_Db4objects_Db4o_Events_CommitEventArgs_IsOwnCommit.htmU/html/M_Db4objects_Db4o_Events_EventRegistryFactory_ForObjectContainer_1_dea717c1.htmA?/html/M_Db4objects_Db4o_Events_ICancellableEventArgs_Cancel.htmReI/html/M_Db4objects_Db4o_Events_TransactionalEventArgs_ObjectContainer.htm79E/html/M_Db4objects_Db4o_Events_TransactionalEventArgs_Transaction.htmp:/html/M_Db4objects_Db4o_Ext_Db4oUUID_Equals_1_2572741a.htmy4/html/M_Db4objects_Db4o_Ext_Db4oUUID_GetHashCode.htm}4/html/M_Db4objects_Db4o_Ext_Db4oUUID_GetLongPart.htmF9/html/M_Db4objects_Db4o_Ext_Db4oUUID_GetSignaturePart.htmG*1/html/M_Db4objects_Db4o_Ext_Db4oUUID_ToString.htmqHA/html/M_Db4objects_Db4o_Ext_IDb4oCallback_Callback_1_2572741a.htm9r2/html/M_Db4objects_Db4o_Ext_IExtClient_IsAlive.htm+FG/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Activate_1_2572741a.htmqlE/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Backup_1_72eac341.htm]aE/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Backup_2_38670564.htm>lC/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Bind_2_0adb0be0.htm*=/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Configure.htmCI/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Deactivate_1_2572741a.htmZ2F/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Descend_2_42885d24.htm F/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_GetByID_1_86267ecb.htm RH/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_GetByUUID_1_1b7ea3b3.htm]DD/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_GetID_1_2572741a.htm!)L/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_GetObjectInfo_1_2572741a.htmJnisteners.htm5$m9<$ & ~6PMGL# D/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Purge_1_2572741a.htm@=/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Reflector.htmSF/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Refresh_2_3af1503e.htmb\O/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_ReleaseSemaphore_1_72eac341.htm>8K/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_SetSemaphore_2_01b939db.htmv{D/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Store_2_3af1503e.htm7J/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_StoredClass_1_2572741a.htmÔmJA/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_StoredClasses.htmq|>/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_SystemInfo.htmGz;/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Version.htmŪAiB/html/M_Db4objects_Db4o_Ext_IExtObjectServer_Backup_1_72eac341.htmƀ*/html/M_Db4objects_Db4o_Ext_IObjectInfo_GetCommitTimestamp.htmӂOQ9/html/M_Db4objects_Db4o_Ext_IObjectInfo_GetInternalID.htm .5/html/M_Db4objects_Db4o_Ext_IObjectInfo_GetObject.htmԯN3/html/M_Db4objects_Db4o_Ext_IObjectInfo_GetUUID.htmՄlR6/html/M_Db4objects_Db4o_Ext_IObjectInfo_GetVersion.htm>i3/html/M_Db4objects_Db4o_Ext_IStoredClass_GetIDs.htmֶ'/4/html/M_Db4objects_Db4o_Ext_IStoredClass_GetName.htm׊VbA/html/M_Db4objects_Db4o_Ext_IStoredClass_GetParentStoredClass.htm8 /html/M_Db4objects_Db4o_Ext_IStoredClass_Rename_1_72eac341.htmڵZC/html/M_Db4objects_Db4o_Ext_IStoredClass_StoredField_2_a8b2c272.htmێhO8/html/M_Db4objects_Db4o_Ext_IStoredField_CreateIndex.htm7c6/html/M_Db4objects_Db4o_Ext_IStoredField_DropIndex.htmS;/html/M_Db4objects_Db4o_Ext_IStoredField_Get_1_2572741a.htm޿|4/html/M_Db4objects_Db4o_Ext_IStoredField_GetName.htmݖmB:/html/M_Db4objects_Db4o_Ext_IStoredField_GetStoredType.htm/j5/html/M_Db4objects_Db4o_Ext_IStoredField_HasIndex.htmߛ`4/html/M_Db4objects_Db4o_Ext_IStoredField_IsArray.htmu^>/html/M_Db4objects_Db4o_Ext_IStoredField_Rename_1_72eac341.htmS5F/html/M_Db4objects_Db4o_Ext_IStoredField_TraverseValues_1_7d46ad30.htmz?/html/M_Db4objects_Db4o_Ext_ISystemInfo_FreespaceEntryCount.htmA9/html/M_Db4objects_Db4o_Ext_ISystemInfo_FreespaceSize.htmC05/html/M_Db4objects_Db4o_Ext_ISystemInfo_TotalSize.htmsdF/html/M_Db4objects_Db4o_IEmbeddedObjectContainer_Backup_1_72eac341.htmW91/html/M_Db4objects_Db4o_IO_BinDecorator_Close.htm{2/html/M_Db4objects_Db4o_IO_BinDecorator_Length.htmz;/html/M_Db4objects_Db4o_IO_BinDecorator_Read_3_90d3610b.htm~g5$m9L i  kO9PMGLF0/html/M_Db4objects_Db4o_IO_BinDecorator_Sync.htme#;/html/M_Db4objects_Db4o_IO_BinDecorator_Sync_1_abf36731.htmf1?/html/M_Db4objects_Db4o_IO_BinDecorator_SyncRead_3_90d3610b.htm^/html/M_Db4objects_Db4o_IO_CachedIoAdapter_Open_4_8b91491c.htmG*>/html/M_Db4objects_Db4o_IO_CachedIoAdapter_Read_2_73aead54.htmq>/html/M_Db4objects_Db4o_IO_CachedIoAdapter_Seek_1_86267ecb.htmv43/html/M_Db4objects_Db4o_IO_CachedIoAdapter_Sync.htm*?/html/M_Db4objects_Db4o_IO_CachedIoAdapter_Write_2_73aead54.htm:}6/html/M_Db4objects_Db4o_IO_CachingStorage_NewCache.htm7.=/html/M_Db4objects_Db4o_IO_CachingStorage_Open_1_ba6e37b0.htmeH/html/M_Db4objects_Db4o_IO_ConstantGrowthStrategy_NewSize_2_5d137e4b.htmdv=/html/M_Db4objects_Db4o_IO_DebugIoAdapter_Open_4_8b91491c.htmZF=/html/M_Db4objects_Db4o_IO_DebugIoAdapter_Seek_1_86267ecb.htm ,H/html/M_Db4objects_Db4o_IO_DoublingGrowthStrategy_NewSize_2_5d137e4b.htmLJi-/html/M_Db4objects_Db4o_IO_IoAdapter_Sync.htm'K9/html/M_Db4objects_Db4o_IO_IoAdapter_Write_1_8079d5fb.htmr39/html/M_Db4objects_Db4o_IO_IoAdapter_Write_2_73aead54.htm%/ecorator_Read_3_90d3610b.htm~g5$m9e% ` % \B=PMGL59/html/M_Db4objects_Db4o_IO_IStorage_Delete_1_72eac341.htmT&9/html/M_Db4objects_Db4o_IO_IStorage_Exists_1_72eac341.htmzN7/html/M_Db4objects_Db4o_IO_IStorage_Open_1_ba6e37b0.htmH{9/html/M_Db4objects_Db4o_IO_IStorage_Rename_2_52fce4af.htmC]3/html/M_Db4objects_Db4o_IO_MemoryBin_BufferSize.htm N./html/M_Db4objects_Db4o_IO_MemoryBin_Close.htmnk-/html/M_Db4objects_Db4o_IO_MemoryBin_Data.htmY~//html/M_Db4objects_Db4o_IO_MemoryBin_Length.htmWh8/html/M_Db4objects_Db4o_IO_MemoryBin_Read_3_90d3610b.htm?O-/html/M_Db4objects_Db4o_IO_MemoryBin_Sync.htmh8/html/M_Db4objects_Db4o_IO_MemoryBin_Sync_1_abf36731.htm /html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Open_4_8b91491c.htm=/html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Put_2_7063d57b.htm+C>/html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Read_2_73aead54.htmn(>/html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Seek_1_86267ecb.htm3/html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Sync.htm?/html/M_Db4objects_Db4o_IO_MemoryIoAdapter_Write_2_73aead54.htm1[;/html/M_Db4objects_Db4o_IO_MemoryStorage_Bin_1_72eac341.htm +;/html/M_Db4objects_Db4o_IO_MemoryStorage_Bin_2_8def5e7c.htm7>/html/M_Db4objects_Db4o_IO_MemoryStorage_Delete_1_72eac341.htmV*>/html/M_Db4objects_Db4o_IO_MemoryStorage_Exists_1_72eac341.htm'/html/M_Db4objects_Db4o_IO_MemoryStorage_Rename_2_52fce4af.htmwZC/html/M_Db4objects_Db4o_IO_NonFlushingIoAdapter_Open_4_8b91491c.htmQ28/html/M_Db4objects_Db4o_IO_NonFlushingIoAdapter_Sync.htm3E/html/M_Db4objects_Db4o_IO_NonFlushingStorage_Decorate_2_2484ba57.htm60A/html/M_Db4objects_Db4o_IO_PagingMemoryStorage_Bin_1_72eac341.htmœf[A/html/M_Db4objects_Db4o_IO_PagingMemoryStorage_Bin_2_53bebe72.htmA"D/html/M_Db4objects_Db4o_IO_PagingMemoryStorage_Delete_1_72eac341.htmcD/html/M_Db4objects_Db4o_IO_PagingMemoryStorage_Exists_1_72eac341.htmĮyB/html/M_Db4objects_Db4o_IO_PagingMemoryStorage_Open_1_ba6e37b0.htmŏ /html/M_Db4objects_Db4o_IO_SaveAsStorage_SaveAs_2_52fce4af.htm&C/html/M_Db4objects_Db4o_IO_StorageDecorator_Decorate_2_2484ba57.htm)SA/html/M_Db4objects_Db4o_IO_StorageDecorator_Delete_1_72eac341.htmП|`A/html/M_Db4objects_Db4o_IO_StorageDecorator_Exists_1_72eac341.htm\q?/html/M_Db4objects_Db4o_IO_StorageDecorator_Open_1_ba6e37b0.htmM8A/html/M_Db4objects_Db4o_IO_StorageDecorator_Rename_2_52fce4af.htmҳ4/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Close.htmӗ|0d3610b.htm~g5$m9e   KT=:PMGLJ5/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Length.htmy>/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Read_3_90d3610b.htmԻ O3/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Sync.htmդY>/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Sync_1_abf36731.html}?/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Write_3_90d3610b.htmi5/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Close.htmתofA/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Delete_1_72eac341.htmU$A/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Exists_1_72eac341.htmy9/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_GetLength.htm٬#?/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Read_2_73aead54.htmڃ#X?/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Seek_1_86267ecb.htm{54/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Sync.htm0P@/html/M_Db4objects_Db4o_IO_VanillaIoAdapter_Write_2_73aead54.htmܘ @/html/M_Db4objects_Db4o_IObjectContainer_Activate_2_3af1503e.htm2/html/M_Db4objects_Db4o_IObjectContainer_Close.htm) 3/html/M_Db4objects_Db4o_IObjectContainer_Commit.htmIpB/html/M_Db4objects_Db4o_IObjectContainer_Deactivate_2_3af1503e.htm9E>/html/M_Db4objects_Db4o_IObjectContainer_Delete_1_2572741a.htm~,0/html/M_Db4objects_Db4o_IObjectContainer_Ext.htm*2/html/M_Db4objects_Db4o_IObjectContainer_Query.htmD/=/html/M_Db4objects_Db4o_IObjectContainer_Query_1_4f76ecb9.htm <=/html/M_Db4objects_Db4o_IObjectContainer_Query_1_61b1ab37.htmG`=/html/M_Db4objects_Db4o_IObjectContainer_Query_2_5b34f106.htm'^=/html/M_Db4objects_Db4o_IObjectContainer_Query_2_a94fb4db.htm&5/html/M_Db4objects_Db4o_IObjectContainer_Query``1.htm+z@/html/M_Db4objects_Db4o_IObjectContainer_Query``1_1_336d8054.htm%@/html/M_Db4objects_Db4o_IObjectContainer_Query``1_1_61b1ab37.htmC$@/html/M_Db4objects_Db4o_IObjectContainer_Query``1_1_e3159502.htmgG@/html/M_Db4objects_Db4o_IObjectContainer_Query``1_2_204b920e.htm.}@/html/M_Db4objects_Db4o_IObjectContainer_Query``1_2_d3169620.htm+KF/html/M_Db4objects_Db4o_IObjectContainer_QueryByExample_1_2572741a.htms5/html/M_Db4objects_Db4o_IObjectContainer_Rollback.htmvc=/html/M_Db4objects_Db4o_IObjectContainer_Store_1_2572741a.htmY%//html/M_Db4objects_Db4o_IObjectServer_Close.htm~,-/html/M_Db4objects_Db4o_IObjectServer_Ext.htm*u@/html/M_Db4objects_Db4o_IObjectServer_GrantAccess_2_52fce4af.htm4/html/M_Db4objects_Db4o_IObjectServer_OpenClient.htm4*/html/M_Db4objects_Db4o_IObjectSet_Ext.htmN./html/M_Db4objects_Db4o_IObjectSet_HasNext.htmP@+/html/M_Db4objects_Db4o_IObjectSet_Next.htmW,/html/M_Db4objects_Db4o_IObjectSet_Reset.htmg=/html/M_Db4objects_Db4o_Marshall_IContext_ObjectContainer.htm 9/html/M_Db4objects_Db4o_Marshall_IContext_Transaction.htmT7/html/M_Db4objects_Db4o_Marshall_IReadBuffer_Offset.htmޗe6F/html/M_Db4objects_Db4o_Marshall_IReadBuffer_ReadBitMap_1_cd2d7ec9.htmb9/html/M_Db4objects_Db4o_Marshall_IReadBuffer_ReadByte.htm߼}IE/html/M_Db4objects_Db4o_Marshall_IReadBuffer_ReadBytes_1_8079d5fb.htmF38/html/M_Db4objects_Db4o_Marshall_IReadBuffer_ReadInt.htmy*9/html/M_Db4objects_Db4o_Marshall_IReadBuffer_ReadLong.htm#E@/html/M_Db4objects_Db4o_Marshall_IReadBuffer_Seek_1_cd2d7ec9.htmh-/html/M_Db4objects_Db4o_Reflect_IReflectClass_IsCollection.htmN<=/html/M_Db4objects_Db4o_Reflect_IReflectClass_IsImmutable.htm }G/html/M_Db4objects_Db4o_Reflect_IReflectClass_IsInstance_1_2572741a.htm{=/html/M_Db4objects_Db4o_Reflect_IReflectClass_IsInterface.htm&=/html/M_Db4objects_Db4o_Reflect_IReflectClass_IsPrimitive.htm(&=/html/M_Db4objects_Db4o_Reflect_IReflectClass_NewInstance.htmN*;/html/M_Db4objects_Db4o_Reflect_IReflectClass_NullValue.htmx~;/html/M_Db4objects_Db4o_Reflect_IReflectClass_Reflector.htmv?K/html/M_Db4objects_Db4o_Reflect_IReflectClassPredicate_Match_1_6386cda0.htm#F@/html/M_Db4objects_Db4o_Reflect_IReflectField_Get_1_2572741a.htm-~>/html/M_Db4objects_Db4o_Reflect_IReflectField_GetFieldType.htm5&9/html/M_Db4objects_Db4o_Reflect_IReflectField_GetName.htm[RG/html/M_Db4objects_Db4o_Reflect_IReflectField_IndexEntry_1_2572741a.htm+;/html/M_Db4objects_Db4o_Reflect_IReflectField_IndexType.htm/d:/html/M_Db4objects_Db4o_Reflect_IReflectField_IsPublic.htmd:/html/M_Db4objects_Db4o_Reflect_IReflectField_IsStatic.htmwd=/html/M_Db4objects_Db4o_Reflect_IReflectField_IsTransient.htm[&@/html/M_Db4objects_Db4o_Reflect_IReflectField_Set_2_3fcf08df.htm+@/html/M_Db4objects_Db4o_Reflect_IReflectMethod_GetReturnType.htm,;D/html/M_Db4objects_Db4o_Reflect_IReflectMethod_Invoke_2_a9f1606d.htmgS4/html/M_Db4objects_Db4o_Reflect_IReflector_Array.htmïFEG/html/M_Db4objects_Db4o_Reflect_IReflector_Configuration_1_27539877.htmĂ >B/html/M_Db4objects_Db4o_Reflect_IReflector_ForClass_1_61b1ab37.htmI>A/html/M_Db4objects_Db4o_Reflect_IReflector_ForName_1_72eac341.htmŮC/html/M_Db4objects_Db4o_Reflect_IReflector_ForObject_1_2572741a.htmƆF/html/M_Db4objects_Db4o_Reflect_IReflector_IsCollection_1_6386cda0.htm=C/html/M_Db4objects_Db4o_Reflect_IReflector_SetParent_1_9b72542d.htmǷUfV/html/M_Db4objects_Db4o_Reflect_IReflectorConfiguration_CallConstructor_1_6386cda0.htm…:DL/html/M_Db4objects_Db4o_Reflect_IReflectorConfiguration_TestConstructors.htm~HC/html/M_Db4objects_Db4o_Reflect_Net_NetArray_Analyze_2_4df6c618.htmȋ;^G/html/M_Db4objects_Db4o_Reflect_Net_NetArray_NewInstance_2_3c61bb67.htmOG/html/M_Db4objects_Db4o_Reflect_Net_NetArray_NewInstance_2_7c4742e7.htmh}G/html/M_Db4objects_Db4o_Reflect_Net_NetArray_NewInstance_2_bc8846cd.htmʠe=G/html/M_Db4objects_Db4o_Reflect_Net_NetClass_CreateField_1_7d4a5ff8.htm˅"~H/html/M_Db4objects_Db4o_Reflect_Net_NetClass_EnsureCanBeInstantiated.htm A/html/M_Db4objects_Db4o_Reflect_Net_NetClass_GetComponentType.htm̳;JL/html/M_Db4objects_Db4o_Reflect_Net_NetClass_GetDeclaredField_1_72eac341.htmTB/html/M_Db4objects_Db4o_Reflect_Net_NetClass_GetDeclaredFields.htm͈/html/M_Db4objects_Db4o_Reflect_Net_NetClass_GetSuperclass.htm;/html/M_Db4objects_Db4o_Reflect_Net_NetClass_IsAbstract.htmҿc8/html/M_Db4objects_Db4o_Reflect_Net_NetClass_IsArray.htmӓL/html/M_Db4objects_Db4o_Reflect_Net_NetClass_IsAssignableFrom_1_6386cda0.htm!=/html/M_Db4objects_Db4o_Reflect_Net_NetClass_IsCollection.htm</html/M_Db4objects_Db4o_Reflect_Net_NetField_SetAccessible.htm19/html/M_Db4objects_Db4o_Reflect_Net_NetField_ToString.htm^O?/html/M_Db4objects_Db4o_Reflect_Net_NetMethod_GetReturnType.htm-lC/html/M_Db4objects_Db4o_Reflect_Net_NetMethod_Invoke_2_a9f1606d.htm:/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_Array.htm2B/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_Configuration.htm6]M/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_Configuration_1_27539877.htm K/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_CreateClass_1_61b1ab37.htmrI/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_DeepClone_1_2572741a.htmsH/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ForClass_1_61b1ab37.htmUG/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ForName_1_72eac341.htmYWI/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ForObject_1_2572741a.htm0L/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_IsCollection_1_6386cda0.htm2I/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_MethodCallsSupported.htmNvI/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_NullValue_1_6386cda0.htmD;/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_Parent.htm^I/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_SetParent_1_9b72542d.htm{MF/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ToMeta_2_223610a2.htmHH/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ToNative_1_6386cda0.htm^gH/html/M_Db4objects_Db4o_Reflect_Net_NetReflector_ToNative_1_b9faab2c.htmE>R/html/M_Db4objects_Db4o_Reflect_Net_SerializationConstructor_GetParameterTypes.htmBW/html/M_Db4objects_Db4o_Reflect_Net_SerializationConstructor_NewInstance_1_0e1149fa.htmEO/html/M_Db4objects_Db4o_TA_DeactivatingRollbackStrategy_Rollback_2_e7991036.htmH?/html/M_Db4objects_Db4o_TA_IActivatable_Activate_1_e67c62b2.htmVU;/html/M_Db4objects_Db4o_TA_IActivatable_Bind_1_133748a9.htm+xD/html/M_Db4objects_Db4o_TA_IRollbackStrategy_Rollback_2_e7991036.htm#QF/html/M_Db4objects_Db4o_TA_NotTransparentActivationEnabled_Problem.htmt?E/html/M_Db4objects_Db4o_TA_NotTransparentActivationEnabled_Reason.htm3)G/html/M_Db4objects_Db4o_TA_NotTransparentActivationEnabled_Solution.htm\UY/html/M_Db4objects_Db4o_TA_TransparentActivationSupport_ActivationProvider_1_f3cd1791.htm1IL/html/M_Db4objects_Db4o_TA_TransparentActivationSupport_Apply_1_f3cd1791.htmz/F/html/M_Db4objects_Db4o_Reflect_Net_NetClass_IsInstance_1_2572741a.htm hactory_Query.htm!q9ek;  |P4PMGLg/html/M_Db4objects_Db4o_TA_TransparentActivationSupport_IsTransparentActivationEnabledOn_1_f3cd1791.htm)VN/html/M_Db4objects_Db4o_TA_TransparentActivationSupport_Prepare_1_878dde74.htmpM/html/M_Db4objects_Db4o_TA_TransparentPersistenceSupport_Apply_1_f3cd1791.htmosO/html/M_Db4objects_Db4o_TA_TransparentPersistenceSupport_Prepare_1_878dde74.htmb'R/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_Activate_1_e771d99e.htm N[/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_CascadeActivation_1_18c99241.htmW0T/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_CollectIDs_1_b8738a73.htm}T/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_Defragment_1_f8ee682b.htmJP/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_Delete_1_5b892108.htmN'R/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_DescendsIntoMembers.htmuL[/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_PrepareComparison_2_a62d59a2.htmAn^/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_ReadCandidateHandler_1_b8738a73.htm/6O/html/M_Db4objects_Db4o_Typehandlers_CollectionTypeHandler_Write_2_d9922934.htme` /html/M_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler_Db4objects_Db4o_Typehandlers_IQueryableTypeHandler_DescendsIntoMembers.htmEl/html/M_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler_Db4objects_Db4o_Typehandlers_ITypeHandler4_Defragment_1_f8ee682b.htm1X/html/M_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler_Db4objects_Db4o_Typehandlers_ITypeHandler4_Delete_1_5b892108.htm ~/html/M_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler_Db4objects_Db4o_Typehandlers_ITypeHandler4_Write_2_d9922934.htm/html/M_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler_Db4objects_Db4o_Typehandlers_IValueTypeHandler_Read_1_6834a8a6.htm# T/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_DefragIndexEntry_1_4597d22f.htmN/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_Defragment_1_f8ee682b.htm%4J/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_Delete_1_5b892108.htmYIL/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_DescendsIntoMembers.htm"6V/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_IndexEntryToObject_2_a62d59a2.htmXC/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_LinkLength.htm^6U/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_PrepareComparison_2_a62d59a2.htmXH/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_Read_1_6834a8a6.htmcR/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_ReadIndexEntry_1_1359b2e9.htm!R/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_ReadIndexEntry_2_195218c8.htm5.`/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_ReadIndexEntryFromObjectSlot_2_56972cfb.html(I/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_Write_2_d9922934.htmHJS/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandler_WriteIndexEntry_3_f21f928a.htmfbR/html/M_Db4objects_Db4o_Typehandlers_EnumTypeHandlerPredicate_Match_1_6386cda0.htm,hY/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_Activate_1_e771d99e.htmLb/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_CascadeActivation_1_18c99241.htm^.[/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_CollectIDs_1_b8738a73.htm {[/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_Defragment_1_f8ee682b.htmHW/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_Delete_1_5b892108.htmO]Y/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_DescendsIntoMembers.htm, b/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_PrepareComparison_2_a62d59a2.htmLle/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_ReadCandidateHandler_1_b8738a73.htm84k/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_RegisterSupportedTypesWith_1_1e2a5f23.html; ek )PMGL=V/html/M_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler_Write_2_d9922934.htm^K/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_CanHold_1_6386cda0.htmf:T/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_DefragIndexEntry_1_4597d22f.htm N/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_Defragment_1_f8ee682b.htm14J/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_Delete_1_5b892108.htmeIL/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_DescendsIntoMembers.htm.6V/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_IndexEntryToObject_2_a62d59a2.htmdC/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_LinkLength.htmj6U/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_PrepareComparison_2_a62d59a2.htm XH/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_Read_1_6834a8a6.htmGR/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_ReadIndexEntry_1_1359b2e9.htmx!R/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_ReadIndexEntry_2_195218c8.htm.`/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_ReadIndexEntryFromObjectSlot_2_56972cfb.htmxI/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_Write_2_d9922934.htm,JS/html/M_Db4objects_Db4o_Typehandlers_GuidTypeHandler_WriteIndexEntry_3_f21f928a.htmJb_/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_CascadeActivationToChild_1_2572741a.htmv{U/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_CascadeActivationToTarget.htmq&I/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_ClassMetadata.htm~E/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_Container.htm8A/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_Depth.htmMWC/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_Descend.htm$P/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_ForObject_1_2572741a.htm%TH/html/M_Db4objects_Db4o_Typehandlers_IActivationContext_TargetObject.htmyo[/html/M_Db4objects_Db4o_Typehandlers_ICascadingTypeHandler_CascadeActivation_1_18c99241.htmhT/html/M_Db4objects_Db4o_Typehandlers_ICascadingTypeHandler_CollectIDs_1_b8738a73.htmyO^/html/M_Db4objects_Db4o_Typehandlers_ICascadingTypeHandler_ReadCandidateHandler_1_b8738a73.htmHtT/html/M_Db4objects_Db4o_Typehandlers_IgnoreFieldsTypeHandler_Activate_1_e771d99e.htm/html/Methods_T_Db4objects_Db4o_Config_IQueryConfiguration.htm_p6/html/Methods_T_Db4objects_Db4o_Config_JavaSupport.htmO>/html/Methods_T_Db4objects_Db4o_Config_QueryEvaluationMode.htm`JrtedTypesWith_1_1e2a5f23.htmla  T X6PMGLD=/html/Methods_T_Db4objects_Db4o_Config_SimpleNameProvider.htm*38/html/Methods_T_Db4objects_Db4o_Config_TSerializable.htm]4/html/Methods_T_Db4objects_Db4o_Config_TypeAlias.htmo8/html/Methods_T_Db4objects_Db4o_Config_WildcardAlias.htm J/html/Methods_T_Db4objects_Db4o_Constraints_UniqueFieldValueConstraint.htmY>/html/Methods_T_Db4objects_Db4o_CS_Config_ClientSslSupport.htmj!B/html/Methods_T_Db4objects_Db4o_CS_Config_IClientConfiguration.htm 2F/html/Methods_T_Db4objects_Db4o_CS_Config_IClientConfigurationItem.htm=B/html/Methods_T_Db4objects_Db4o_CS_Config_IClientServerFactory.htm[B/html/Methods_T_Db4objects_Db4o_CS_Config_IServerConfiguration.html>F/html/Methods_T_Db4objects_Db4o_CS_Config_IServerConfigurationItem.htm*>/html/Methods_T_Db4objects_Db4o_CS_Config_ServerSslSupport.htmH!7/html/Methods_T_Db4objects_Db4o_CS_Db4oClientServer.htmiA0/html/Methods_T_Db4objects_Db4o_Db4oEmbedded.htm*;//html/Methods_T_Db4objects_Db4o_Db4oFactory.htme@/html/Methods_T_Db4objects_Db4o_Defragment_AbstractIdMapping.htmkCB/html/Methods_T_Db4objects_Db4o_Defragment_AvailableTypeFilter.htm.@/html/Methods_T_Db4objects_Db4o_Defragment_DatabaseIdMapping.htm0{9/html/Methods_T_Db4objects_Db4o_Defragment_Defragment.htm+=?/html/Methods_T_Db4objects_Db4o_Defragment_DefragmentConfig.htmh$J/html/Methods_T_Db4objects_Db4o_Defragment_DefragmentConfig_NullFilter.htm n=/html/Methods_T_Db4objects_Db4o_Defragment_DefragmentInfo.htmzB/html/Methods_T_Db4objects_Db4o_Defragment_IDefragmentListener.htmpA/html/Methods_T_Db4objects_Db4o_Defragment_IDMappingCollector.htm~m9/html/Methods_T_Db4objects_Db4o_Defragment_IIdMapping.htmk#@/html/Methods_T_Db4objects_Db4o_Defragment_InMemoryIdMapping.htm{A/html/Methods_T_Db4objects_Db4o_Defragment_IStoredClassFilter.htm ?/html/Methods_T_Db4objects_Db4o_Diagnostic_ClassHasNoFields.htmG/html/Methods_T_Db4objects_Db4o_Diagnostic_DefragmentRecommendation.htm'G=/html/Methods_T_Db4objects_Db4o_Diagnostic_DeletionFailed.htmnuD/html/Methods_T_Db4objects_Db4o_Diagnostic_DescendIntoTranslator.htmc=/html/Methods_T_Db4objects_Db4o_Diagnostic_DiagnosticBase.htmkB/html/Methods_T_Db4objects_Db4o_Diagnostic_DiagnosticToConsole.htmY@/html/Methods_T_Db4objects_Db4o_Diagnostic_DiagnosticToTrace.htmX?G/html/Methods_T_Db4objects_Db4o_Diagnostic_IDiagnosticConfiguration.htmB/html/Methods_T_Db4objects_Db4o_Diagnostic_IDiagnosticListener.htm&pC/html/Methods_T_Db4objects_Db4o_Diagnostic_LoadedFromClassIndex.htms;/html/Methods_T_Db4objects_Db4o_Diagnostic_MissingClass.htm KF/html/Methods_T_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized.htmT2L/html/Methods_T_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded.htm0F/html/Methods_T_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist.htm62D/html/Methods_T_Db4objects_Db4o_Diagnostic_UpdateDepthGreaterOne.htmhE/html/Methods_T_Db4objects_Db4o_Events_CancellableObjectEventArgs.htmp|9/html/Methods_T_Db4objects_Db4o_Events_ClassEventArgs.htmln:/html/Methods_T_Db4objects_Db4o_Events_CommitEventArgs.htmZ5?/html/Methods_T_Db4objects_Db4o_Events_EventRegistryFactory.htm#@/html/Methods_T_Db4objects_Db4o_Events_ICancellableEventArgs.htm2<:/html/Methods_T_Db4objects_Db4o_Events_ObjectEventArgs.htmnS>/html/Methods_T_Db4objects_Db4o_Events_ObjectInfoEventArgs.htmA9/html/Methods_T_Db4objects_Db4o_Events_QueryEventArgs.htm\AA/html/Methods_T_Db4objects_Db4o_Events_TransactionalEventArgs.htms0/html/Methods_T_Db4objects_Db4o_Ext_Db4oUUID.htm25/html/Methods_T_Db4objects_Db4o_Ext_IDb4oCallback.htmBs2/html/Methods_T_Db4objects_Db4o_Ext_IExtClient.htm5:;/html/Methods_T_Db4objects_Db4o_Ext_IExtObjectContainer.htmoD8/html/Methods_T_Db4objects_Db4o_Ext_IExtObjectServer.htm3f5/html/Methods_T_Db4objects_Db4o_Ext_IExtObjectSet.htmwde.htm`JrtedTypesWith_1_1e2a5f23.htm+ , @iS9PMGLd8/html/Methods_T_Db4objects_Db4o_Ext_IObjectCallbacks.htmC3/html/Methods_T_Db4objects_Db4o_Ext_IObjectInfo.htmS=4/html/Methods_T_Db4objects_Db4o_Ext_IStoredClass.htm*4/html/Methods_T_Db4objects_Db4o_Ext_IStoredField.htm:3/html/Methods_T_Db4objects_Db4o_Ext_ISystemInfo.htm9Q+/html/Methods_T_Db4objects_Db4o_IO_IBin.htmrF1/html/Methods_T_Db4objects_Db4o_IO_IBlockSize.htmˆ86/html/Methods_T_Db4objects_Db4o_IO_IGrowthStrategy.htmTf0/html/Methods_T_Db4objects_Db4o_IO_IoAdapter.htmç:z//html/Methods_T_Db4objects_Db4o_IO_IStorage.htmĒ40/html/Methods_T_Db4objects_Db4o_IO_MemoryBin.htm7O6/html/Methods_T_Db4objects_Db4o_IO_MemoryIoAdapter.htm4/html/Methods_T_Db4objects_Db4o_IO_MemoryStorage.htm" ;/html/Methods_T_Db4objects_Db4o_IO_NonFlushingIoAdapter.htmǝ+.9/html/Methods_T_Db4objects_Db4o_IO_NonFlushingStorage.htmȑY":/html/Methods_T_Db4objects_Db4o_IO_PagingMemoryStorage.htm{>/html/Methods_T_Db4objects_Db4o_IO_RandomAccessFileAdapter.htmt>/html/Methods_T_Db4objects_Db4o_IO_RandomAccessFileFactory.htmJ4/html/Methods_T_Db4objects_Db4o_IO_SaveAsStorage.htmˏLA7/html/Methods_T_Db4objects_Db4o_IO_StorageDecorator.htm c6/html/Methods_T_Db4objects_Db4o_IO_ThreadedSyncBin.htmp7/html/Methods_T_Db4objects_Db4o_IO_VanillaIoAdapter.htmͤp4/html/Methods_T_Db4objects_Db4o_IObjectContainer.htmBH1/html/Methods_T_Db4objects_Db4o_IObjectServer.htm ./html/Methods_T_Db4objects_Db4o_IObjectSet.htm'c5/html/Methods_T_Db4objects_Db4o_Marshall_IContext.htmΟ 8/html/Methods_T_Db4objects_Db4o_Marshall_IReadBuffer.htm9/html/Methods_T_Db4objects_Db4o_Marshall_IReadContext.htm,uH/html/Methods_T_Db4objects_Db4o_Marshall_IReferenceActivationContext.htmа! /html/Methods_T_Db4objects_Db4o_Reflect_Net_NetConstructor.htmy,8/html/Methods_T_Db4objects_Db4o_Reflect_Net_NetField.htm%N9/html/Methods_T_Db4objects_Db4o_Reflect_Net_NetMethod.htms6/html/Methods_T_Db4objects_Db4o_Typehandlers_ITypeHandler4.htm {F/html/Methods_T_Db4objects_Db4o_Typehandlers_ITypeHandlerPredicate.htmWB/html/Methods_T_Db4objects_Db4o_Typehandlers_IValueTypeHandler.htm_'?/html/Methods_T_Db4objects_Db4o_Typehandlers_MapTypeHandler.htmqP/html/Methods_T_Db4objects_Db4o_Typehandlers_SingleClassTypeHandlerPredicate.htmwG/html/Methods_T_Db4objects_Db4o_Typehandlers_SystemArrayTypeHandler.htmw9//html/Methods_T_Db4objects_Db4o_Types_IBlob.htm0/html/N_Db4objects_Db4o.htm &/html/N_Db4objects_Db4o_Activation.htmǘ;!'/html/N_Db4objects_Db4o_Collections.htm\"/html/N_Db4objects_Db4o_Config.htma1'/html/N_Db4objects_Db4o_Constraints.htm\/html/N_Db4objects_Db4o_CS.htmʬn%/html/N_Db4objects_Db4o_CS_Config.htm &/html/N_Db4objects_Db4o_Defragment.htm(]&/html/N_Db4objects_Db4o_Diagnostic.htm̡j"/html/N_Db4objects_Db4o_Events.htm͍oA/html/N_Db4objects_Db4o_Ext.htm01/html/N_Db4objects_Db4o_IO.htmϯak$/html/N_Db4objects_Db4o_Marshall.htmгL%/html/N_Db4objects_Db4o_Messaging.htmц]:&/html/N_Db4objects_Db4o_Monitoring.htm!!/html/N_Db4objects_Db4o_Query.htmҗ8?#/html/N_Db4objects_Db4o_Reflect.htmӒw(2a5f23.htms { s4>PMGL (/html/N_Db4objects_Db4o_Reflect_Core.htm8+/html/N_Db4objects_Db4o_Reflect_Generic.htmԪWt'/html/N_Db4objects_Db4o_Reflect_Net.htmK/html/N_Db4objects_Db4o_TA.htmմbn(/html/N_Db4objects_Db4o_Typehandlers.htm։P!/html/N_Db4objects_Db4o_Types.htmdtE/html/O_T_Db4objects_Db4o_Collections_ActivatableDictionary`2_Add.htm׶X?J/html/O_T_Db4objects_Db4o_Collections_ActivatableDictionary`2_Contains.htmؚ7H/html/O_T_Db4objects_Db4o_Collections_ActivatableDictionary`2_CopyTo.htmNuF/html/O_T_Db4objects_Db4o_Collections_ActivatableDictionary`2_ctor.htmCH/html/O_T_Db4objects_Db4o_Collections_ActivatableDictionary`2_Remove.htmK}H/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_BinarySearch.htmHFB/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_CopyTo.htmܵi@/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_ctor.htmݙw E/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_FindIndex.htmޅ/I/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_FindLastIndex.htm1C/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_IndexOf.htmHYG/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_LastIndexOf.htm!AC/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_Reverse.htmbK@/html/O_T_Db4objects_Db4o_Collections_ActivatableList`1_Sort.htm-{A/html/O_T_Db4objects_Db4o_Collections_ArrayDictionary4`2_ctor.htm(#:/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_Add.htmKC/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_BinarySearch.htm\X?/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_Contains.htm4 =/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_CopyTo.htm=G;/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_ctor.htm8>/html/O_T_Db4objects_Db4o_Collections_ArrayList4`1_IndexOf.htm/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_ctor.htm40D/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_Db4oConfig.htmdtK/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_ForceBackupDelete.htmXO/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_ObjectCommitFrequency.htmWUB/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_ReadOnly.htm,AK/html/O_T_Db4objects_Db4o_Defragment_DefragmentConfig_StoredClassFilter.htmm 9/html/O_T_Db4objects_Db4o_Defragment_IIdMapping_MapId.htmr0@/html/O_T_Db4objects_Db4o_Defragment_InMemoryIdMapping_MapId.htm"6B/html/O_T_Db4objects_Db4o_Ext_DatabaseFileLockedException_ctor.htmX4/html/O_T_Db4objects_Db4o_Ext_Db4oException_ctor.htmi*3.htmsv } LO:PMGL9/html/O_T_Db4objects_Db4o_Ext_Db4oFatalException_ctor.htm$@/html/O_T_Db4objects_Db4o_Ext_Db4oIllegalStateException_ctor.htm7'6/html/O_T_Db4objects_Db4o_Ext_Db4oIOException_ctor.htm^M?/html/O_T_Db4objects_Db4o_Ext_Db4oRecoverableException_ctor.htm+|5/html/O_T_Db4objects_Db4o_Ext_IExtClient_Activate.htm'(3/html/O_T_Db4objects_Db4o_Ext_IExtClient_Backup.htmO7/html/O_T_Db4objects_Db4o_Ext_IExtClient_Deactivate.htmP92/html/O_T_Db4objects_Db4o_Ext_IExtClient_Purge.htm [2/html/O_T_Db4objects_Db4o_Ext_IExtClient_Query.htmdy5/html/O_T_Db4objects_Db4o_Ext_IExtClient_Query``1.htm])2/html/O_T_Db4objects_Db4o_Ext_IExtClient_Store.htmP>/html/O_T_Db4objects_Db4o_Ext_IExtObjectContainer_Activate.htmV1/html/O_T_Db4objects_Db4o_Ext_IExtObjectContainer_Query``1.htmwK;/html/O_T_Db4objects_Db4o_Ext_IExtObjectContainer_Store.htmBVF/html/O_T_Db4objects_Db4o_Ext_IncompatibleFileFormatException_ctor.htm>9/html/O_T_Db4objects_Db4o_Ext_InvalidIDException_ctor.htmVs;/html/O_T_Db4objects_Db4o_Ext_InvalidSlotException_ctor.htmIEA/html/O_T_Db4objects_Db4o_Ext_ObjectNotStorableException_ctor.htmI:/html/O_T_Db4objects_Db4o_IO_CachedIoAdapter_BlockSize.htm5/html/O_T_Db4objects_Db4o_IO_CachedIoAdapter_ctor.htm35/html/O_T_Db4objects_Db4o_IO_CachedIoAdapter_Read.htmRd6/html/O_T_Db4objects_Db4o_IO_CachedIoAdapter_Write.htm6m4/html/O_T_Db4objects_Db4o_IO_CachingStorage_ctor.htm#/9/html/O_T_Db4objects_Db4o_IO_DebugIoAdapter_BlockSeek.htmR.9/html/O_T_Db4objects_Db4o_IO_DebugIoAdapter_BlockSize.htmu4/html/O_T_Db4objects_Db4o_IO_DebugIoAdapter_ctor.htmu{4/html/O_T_Db4objects_Db4o_IO_DebugIoAdapter_Read.htmp35/html/O_T_Db4objects_Db4o_IO_DebugIoAdapter_Write.htm#I9/html/O_T_Db4objects_Db4o_IO_FileStorage_FileBin_Sync.htmla*/html/O_T_Db4objects_Db4o_IO_IBin_Sync.htmMS4/html/O_T_Db4objects_Db4o_IO_IoAdapter_BlockSeek.htm 4/html/O_T_Db4objects_Db4o_IO_IoAdapter_BlockSize.htm4[//html/O_T_Db4objects_Db4o_IO_IoAdapter_Read.htmJ0/html/O_T_Db4objects_Db4o_IO_IoAdapter_Write.htmYb//html/O_T_Db4objects_Db4o_IO_MemoryBin_ctor.htm;4//html/O_T_Db4objects_Db4o_IO_MemoryBin_Sync.htmo^:/html/O_T_Db4objects_Db4o_IO_MemoryIoAdapter_BlockSeek.htmM>:/html/O_T_Db4objects_Db4o_IO_MemoryIoAdapter_BlockSize.htm 5/html/O_T_Db4objects_Db4o_IO_MemoryIoAdapter_ctor.htmM5/html/O_T_Db4objects_Db4o_IO_MemoryIoAdapter_Read.htm]K6/html/O_T_Db4objects_Db4o_IO_MemoryIoAdapter_Write.htm(d2/html/O_T_Db4objects_Db4o_IO_MemoryStorage_Bin.htm h3/html/O_T_Db4objects_Db4o_IO_MemoryStorage_ctor.htmt?/html/O_T_Db4objects_Db4o_IO_NonFlushingIoAdapter_BlockSeek.htm?/html/O_T_Db4objects_Db4o_IO_NonFlushingIoAdapter_BlockSize.htmU:/html/O_T_Db4objects_Db4o_IO_NonFlushingIoAdapter_Read.htmr;/html/O_T_Db4objects_Db4o_IO_NonFlushingIoAdapter_Write.htm)8/html/O_T_Db4objects_Db4o_IO_PagingMemoryStorage_Bin.htm.U9/html/O_T_Db4objects_Db4o_IO_PagingMemoryStorage_ctor.htmEB/html/O_T_Db4objects_Db4o_IO_RandomAccessFileAdapter_BlockSeek.htmH>B/html/O_T_Db4objects_Db4o_IO_RandomAccessFileAdapter_BlockSize.htm=/html/O_T_Db4objects_Db4o_IO_RandomAccessFileAdapter_ctor.htm a=/html/O_T_Db4objects_Db4o_IO_RandomAccessFileAdapter_Read.html#>/html/O_T_Db4objects_Db4o_IO_RandomAccessFileAdapter_Write.htm<5/html/O_T_Db4objects_Db4o_IO_ThreadedSyncBin_Sync.htmK3  a -  t"wK?PMGL-;/html/O_T_Db4objects_Db4o_IO_VanillaIoAdapter_BlockSeek.htm~N;/html/O_T_Db4objects_Db4o_IO_VanillaIoAdapter_BlockSize.htmL6/html/O_T_Db4objects_Db4o_IO_VanillaIoAdapter_ctor.htma76/html/O_T_Db4objects_Db4o_IO_VanillaIoAdapter_Read.htm%7/html/O_T_Db4objects_Db4o_IO_VanillaIoAdapter_Write.htm=>4/html/O_T_Db4objects_Db4o_IObjectContainer_Query.htmo87/html/O_T_Db4objects_Db4o_IObjectContainer_Query``1.htm'>/html/O_T_Db4objects_Db4o_Marshall_IReadContext_ReadObject.htm{&M/html/O_T_Db4objects_Db4o_Marshall_IReferenceActivationContext_ReadObject.htm!n@/html/O_T_Db4objects_Db4o_Marshall_IWriteContext_WriteObject.htmeK/html/O_T_Db4objects_Db4o_Monitoring_Db4oPerformanceCounters_CounterFor.htmtbR/html/O_T_Db4objects_Db4o_Monitoring_PerformanceCounterSpec_PerformanceCounter.htmV2/html/O_T_Db4objects_Db4o_Query_Predicate_ctor.htmfHC/html/O_T_Db4objects_Db4o_Reflect_Generic_GenericReflector_ctor.htm./Q/html/O_T_Db4objects_Db4o_Reflect_Generic_GenericReflector_RegisterCollection.htm] ?/html/O_T_Db4objects_Db4o_Reflect_IReflectArray_NewInstance.htmh6>/html/O_T_Db4objects_Db4o_Reflect_Net_NetArray_NewInstance.htm>/html/O_T_Db4objects_Db4o_Reflect_Net_NetField_IsTransient.htm6F@/html/O_T_Db4objects_Db4o_Reflect_Net_NetField_MarkTransient.htm|YD/html/O_T_Db4objects_Db4o_Reflect_Net_NetReflector_Configuration.htmUz;/html/O_T_Db4objects_Db4o_Reflect_Net_NetReflector_ctor.htmO?/html/O_T_Db4objects_Db4o_Reflect_Net_NetReflector_ToNative.htmc(C/html/O_T_Db4objects_Db4o_TA_TransparentPersistenceSupport_ctor.htm I/html/O_T_Db4objects_Db4o_Typehandlers_EnumTypeHandler_ReadIndexEntry.htm I/html/O_T_Db4objects_Db4o_Typehandlers_GuidTypeHandler_ReadIndexEntry.htm H/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_Comparer.htmς$:E/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_Count.htm^8K/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_IsFixedSize.htmQJ/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_IsReadOnly.htmџg8N/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_IsSynchronized.htmO/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_Item_1_1a965722.htm;!D/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_Keys.htm\H/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_SyncRoot.htmԠc z/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_System_Collections_Generic_IDictionary{TKey@TValue}_Values.htmp n/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_System_Collections_IDictionary_Item_1_2572741a.htm|Oc/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_System_Collections_IDictionary_Keys.htmK;e/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_System_Collections_IDictionary_Values.htmרQF/html/P_Db4objects_Db4o_Collections_ActivatableDictionary`2_Values.htm؆WB/html/P_Db4objects_Db4o_Collections_ActivatableList`1_Capacity.htmYW?/html/P_Db4objects_Db4o_Collections_ActivatableList`1_Count.htm07D/html/P_Db4objects_Db4o_Collections_ActivatableList`1_IsReadOnly.htmڮg7I/html/P_Db4objects_Db4o_Collections_ActivatableList`1_Item_1_cd2d7ec9.htmی<@/html/P_Db4objects_Db4o_Collections_ArrayDictionary4`2_Count.htmZTE/html/P_Db4objects_Db4o_Collections_ArrayDictionary4`2_IsReadOnly.htm.J/html/P_Db4objects_Db4o_Collections_ArrayDictionary4`2_Item_1_1a965722.htmݳ=C?/html/P_Db4objects_Db4o_Collections_ArrayDictionary4`2_Keys.htmޔRA/html/P_Db4objects_Db4o_Collections_ArrayDictionary4`2_Values.htmR:/html/P_Db4objects_Db4o_Collections_ArrayList4`1_Count.htmjU@/html/P_Db4objects_Db4o_Collections_ArrayList4`1_IsFixedSize.htm?g?/html/P_Db4objects_Db4o_Collections_ArrayList4`1_IsReadOnly.htm&NC/html/P_Db4objects_Db4o_Collections_ArrayList4`1_IsSynchronized.htmt2D/html/P_Db4objects_Db4o_Collections_ArrayList4`1_Item_1_cd2d7ec9.htm&Nin_Sync.htmK3  ( C  +A4PMGLH =/html/P_Db4objects_Db4o_Collections_ArrayList4`1_SyncRoot.htmt#]/html/P_Db4objects_Db4o_Collections_ArrayList4`1_System_Collections_IList_Item_1_cd2d7ec9.htmC6/html/P_Db4objects_Db4o_Collections_ISet`1_IsEmpty.htmZVD/html/P_Db4objects_Db4o_Config_ICacheConfiguration_SlotCacheSize.htm,aD/html/P_Db4objects_Db4o_Config_ICacheConfigurationProvider_Cache.htm0|G/html/P_Db4objects_Db4o_Config_ICommonConfiguration_ActivationDepth.htmK/html/P_Db4objects_Db4o_Config_ICommonConfiguration_AllowVersionUpdates.htm% I/html/P_Db4objects_Db4o_Config_ICommonConfiguration_AutomaticShutDown.htmE=E/html/P_Db4objects_Db4o_Config_ICommonConfiguration_BTreeNodeSize.htm[A/html/P_Db4objects_Db4o_Config_ICommonConfiguration_Callbacks.htm]H/html/P_Db4objects_Db4o_Config_ICommonConfiguration_CallConstructors.htm^~K/html/P_Db4objects_Db4o_Config_ICommonConfiguration_DetectSchemaChanges.htm\B/html/P_Db4objects_Db4o_Config_ICommonConfiguration_Diagnostic.htmq~C/html/P_Db4objects_Db4o_Config_ICommonConfiguration_Environment.htmo O/html/P_Db4objects_Db4o_Config_ICommonConfiguration_ExceptionsOnNotStorable.htm|2E/html/P_Db4objects_Db4o_Config_ICommonConfiguration_InternStrings.htm.9E/html/P_Db4objects_Db4o_Config_ICommonConfiguration_MaxStackDepth.htmg@D/html/P_Db4objects_Db4o_Config_ICommonConfiguration_MessageLevel.htm'yM/html/P_Db4objects_Db4o_Config_ICommonConfiguration_OptimizeNativeQueries.htm PA/html/P_Db4objects_Db4o_Config_ICommonConfiguration_OutStream.htmpB?/html/P_Db4objects_Db4o_Config_ICommonConfiguration_Queries.htm2F/html/P_Db4objects_Db4o_Config_ICommonConfiguration_StringEncoding.htm7H/html/P_Db4objects_Db4o_Config_ICommonConfiguration_TestConstructors.htm=xC/html/P_Db4objects_Db4o_Config_ICommonConfiguration_UpdateDepth.htm5,W/html/P_Db4objects_Db4o_Config_ICommonConfiguration_WeakReferenceCollectionInterval.htmadF/html/P_Db4objects_Db4o_Config_ICommonConfiguration_WeakReferences.htmEfF/html/P_Db4objects_Db4o_Config_ICommonConfigurationProvider_Common.htm 9/html/P_Db4objects_Db4o_Config_IConfiguration_Storage.htm+iF/html/P_Db4objects_Db4o_Config_IFileConfiguration_AsynchronousSync.htmZy>/html/P_Db4objects_Db4o_Config_IFileConfiguration_BlobPath.htmS ?/html/P_Db4objects_Db4o_Config_IFileConfiguration_BlockSize.htm\'H/html/P_Db4objects_Db4o_Config_IFileConfiguration_DatabaseGrowthSize.htmw?/html/P_Db4objects_Db4o_Config_IFileConfiguration_Freespace.htmz=N/html/P_Db4objects_Db4o_Config_IFileConfiguration_GenerateCommitTimestamps.htm7 C/html/P_Db4objects_Db4o_Config_IFileConfiguration_GenerateUUIDs.htmD#L/html/P_Db4objects_Db4o_Config_IFileConfiguration_GenerateVersionNumbers.htmgF/html/P_Db4objects_Db4o_Config_IFileConfiguration_LockDatabaseFile.htm/>/html/P_Db4objects_Db4o_Config_IFileConfiguration_ReadOnly.htm.gB/html/P_Db4objects_Db4o_Config_IFileConfiguration_RecoveryMode.htmiI/html/P_Db4objects_Db4o_Config_IFileConfiguration_ReserveStorageSpace.htm~k=/html/P_Db4objects_Db4o_Config_IFileConfiguration_Storage.htminB/html/P_Db4objects_Db4o_Config_IFileConfigurationProvider_File.htmFJ/html/P_Db4objects_Db4o_Config_IIdSystemConfigurationProvider_IdSystem.htmWH/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_MessageSender.htmu{H/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_PrefetchDepth.htmp J/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_PrefetchIDCount.htm}?N/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_PrefetchObjectCount.htm<=P/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_PrefetchSlotCacheSize.htmyN/html/P_Db4objects_Db4o_CS_Config_IClientConfiguration_TimeoutClientSocket.htmz L/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_BatchMessages.htm9 R/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_ClientServerFactory.htmFt_Item_1_cd2d7ec9.htm&Nin_Sync.htmK3  J    3PMGL(!P/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_MaxBatchQueueSize.htm:*O/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_MessageRecipient.htmd3S/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_SingleThreadedClient.htmML/html/P_Db4objects_Db4o_CS_Config_INetworkingConfiguration_SocketFactory.htmdQ/html/P_Db4objects_Db4o_CS_Config_INetworkingConfigurationProvider_Networking.htm4N/html/P_Db4objects_Db4o_CS_Config_IServerConfiguration_TimeoutServerSocket.htmlrB/html/P_Db4objects_Db4o_Events_CancellableObjectEventArgs_Info.htm^nI/html/P_Db4objects_Db4o_Events_CancellableObjectEventArgs_IsCancelled.htmLD/html/P_Db4objects_Db4o_Events_CancellableObjectEventArgs_Object.htmSx8/html/P_Db4objects_Db4o_Events_CommitEventArgs_Added.htmK:/html/P_Db4objects_Db4o_Events_CommitEventArgs_Deleted.htmL :/html/P_Db4objects_Db4o_Events_CommitEventArgs_Updated.htmY D/html/P_Db4objects_Db4o_Events_ICancellableEventArgs_IsCancelled.htmfaK/html/P_Db4objects_Db4o_Events_ObjectContainerEventArgs_ObjectContainer.htmG89/html/P_Db4objects_Db4o_Events_ObjectEventArgs_Object.htm ;/html/P_Db4objects_Db4o_Events_ObjectInfoEventArgs_Info.htm D=/html/P_Db4objects_Db4o_Events_ObjectInfoEventArgs_Object.htmOs7/html/P_Db4objects_Db4o_Events_QueryEventArgs_Query.htmB]:/html/P_Db4objects_Db4o_Events_StringEventArgs_Message.htm?/html/P_Db4objects_Db4o_Messaging_IMessageContext_Container.htm8^nc.htmK3  U ? [46PMGL" "9/html/T_Db4objects_Db4o_Collections_ActivatableList`1.htmV:/html/T_Db4objects_Db4o_Collections_ArrayDictionary4`2.htmo4/html/T_Db4objects_Db4o_Collections_ArrayList4`1.htm s9/html/T_Db4objects_Db4o_Collections_CollectionFactory.htm:@/html/T_Db4objects_Db4o_Collections_IActivatableCollection`1.htm:?./html/T_Db4objects_Db4o_Collections_ISet`1.htmyz./html/T_Db4objects_Db4o_Config_ConfigScope.htms/html/T_Db4objects_Db4o_Config_ICacheConfigurationProvider.htm==/html/T_Db4objects_Db4o_Config_IClientServerConfiguration.htmEQ7/html/T_Db4objects_Db4o_Config_ICommonConfiguration.htm=?/html/T_Db4objects_Db4o_Config_ICommonConfigurationProvider.htmS+/html/T_Db4objects_Db4o_Config_ICompare.htmnG1/html/T_Db4objects_Db4o_Config_IConfiguration.htm5U5/html/T_Db4objects_Db4o_Config_IConfigurationItem.htm 9/html/T_Db4objects_Db4o_Config_IEmbeddedConfiguration.htm =/html/T_Db4objects_Db4o_Config_IEmbeddedConfigurationItem.htmi/html/T_Db4objects_Db4o_CS_Config_IClientConfigurationItem.htm*j:/html/T_Db4objects_Db4o_CS_Config_IClientServerFactory.htm?>/html/T_Db4objects_Db4o_CS_Config_INetworkingConfiguration.htmSF/html/T_Db4objects_Db4o_CS_Config_INetworkingConfigurationProvider.htmW4:/html/T_Db4objects_Db4o_CS_Config_IServerConfiguration.htm O>/html/T_Db4objects_Db4o_CS_Config_IServerConfigurationItem.htmZF6/html/T_Db4objects_Db4o_CS_Config_ServerSslSupport.htm //html/T_Db4objects_Db4o_CS_Db4oClientServer.htm;(/html/T_Db4objects_Db4o_Db4oEmbedded.htm?'/html/T_Db4objects_Db4o_Db4oFactory.htm€Up8/html/T_Db4objects_Db4o_Defragment_AbstractIdMapping.htmE&:/html/T_Db4objects_Db4o_Defragment_AvailableTypeFilter.htmþk78/html/T_Db4objects_Db4o_Defragment_DatabaseIdMapping.htmĕ"61/html/T_Db4objects_Db4o_Defragment_Defragment.htmX!7/html/T_Db4objects_Db4o_Defragment_DefragmentConfig.htmy B/html/T_Db4objects_Db4o_Defragment_DefragmentConfig_NullFilter.htm[5/html/T_Db4objects_Db4o_Defragment_DefragmentInfo.htmǛ`Y:/html/T_Db4objects_Db4o_Defragment_IDefragmentListener.htm9j9/html/T_Db4objects_Db4o_Defragment_IDMappingCollector.htm#nK3 l  }Y+gH@PMGLJ!#1/html/T_Db4objects_Db4o_Defragment_IIdMapping.htmɟA8/html/T_Db4objects_Db4o_Defragment_InMemoryIdMapping.htmRO9/html/T_Db4objects_Db4o_Defragment_IStoredClassFilter.htm!97/html/T_Db4objects_Db4o_Diagnostic_ClassHasNoFields.htm˥ZQ?/html/T_Db4objects_Db4o_Diagnostic_DefragmentRecommendation.htm̂+Q^/html/T_Db4objects_Db4o_Diagnostic_DefragmentRecommendation_DefragmentRecommendationReason.htm|k5/html/T_Db4objects_Db4o_Diagnostic_DeletionFailed.htm;g/html/T_Db4objects_Db4o_Diagnostic_NativeQueryNotOptimized.htm[OD/html/T_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded.htm*I>/html/T_Db4objects_Db4o_Diagnostic_ObjectFieldDoesNotExist.htmֲsa4/html/T_Db4objects_Db4o_Marshall_IReservedBuffer.htm1/html/T_Db4objects_Db4o_Marshall_IWriteBuffer.htm52/html/T_Db4objects_Db4o_Marshall_IWriteContext.htmJ=5/html/T_Db4objects_Db4o_Messaging_IMessageContext.htmu7/html/T_Db4objects_Db4o_Messaging_IMessageRecipient.htm|i4/html/T_Db4objects_Db4o_Messaging_IMessageSender.htmeQ>/html/T_Db4objects_Db4o_Monitoring_Db4oPerformanceCounters.htm6 A/html/T_Db4objects_Db4o_Monitoring_FreespaceMonitoringSupport.htmA|:/html/T_Db4objects_Db4o_Monitoring_IOMonitoringSupport.htm=F7/html/T_Db4objects_Db4o_Monitoring_MonitoredStorage.htm-C/html/T_Db4objects_Db4o_Monitoring_NativeQueryMonitoringSupport.htm00G/html/T_Db4objects_Db4o_Monitoring_ObjectLifecycleMonitoringSupport.htm`=/html/T_Db4objects_Db4o_Monitoring_PerformanceCounterSpec.htmxq=/html/T_Db4objects_Db4o_Monitoring_QueryMonitoringSupport.htmiG/html/T_Db4objects_Db4o_Monitoring_ReferenceSystemMonitoringSupport.htm}4/html/T_Db4objects_Db4o_Query_EvaluationDelegate.htmt,/html/T_Db4objects_Db4o_Query_ICandidate.htm -/html/T_Db4objects_Db4o_Query_IConstraint.htm+./html/T_Db4objects_Db4o_Query_IConstraints.htm:-/html/T_Db4objects_Db4o_Query_IEvaluation.htmT(/html/T_Db4objects_Db4o_Query_IQuery.htmSe2/html/T_Db4objects_Db4o_Query_IQueryComparator.htm8N3/html/T_Db4objects_Db4o_Query_ISodaQueryFactory.htmy+/html/T_Db4objects_Db4o_Query_Predicate.htmx3/html/T_Db4objects_Db4o_Query_PredicatePlatform.htmwn;/html/T_Db4objects_Db4o_Reflect_Core_ConstructorSupport.htmeF/html/T_Db4objects_Db4o_Reflect_Core_IConstructorAwareReflectClass.htmv#/html/T_Db4objects_Db4o_TA_NotTransparentActivationEnabled.htm*m;/html/T_Db4objects_Db4o_TA_TransparentActivationSupport.htm:/html/T_Db4objects_Db4o_Typehandlers_CollectionTypeHandler.htmpoB/html/T_Db4objects_Db4o_Typehandlers_DateTimeOffsetTypeHandler.htm_8/html/T_Db4objects_Db4o_Typehandlers_EnumTypeHandler.htm`}A/html/T_Db4objects_Db4o_Typehandlers_EnumTypeHandlerPredicate.htm]uE/html/T_Db4objects_Db4o_Typehandlers_GenericCollectionTypeHandler.htmR8/html/T_Db4objects_Db4o_Typehandlers_GuidTypeHandler.htmSf;/html/T_Db4objects_Db4o_Typehandlers_IActivationContext.htm9v>/html/T_Db4objects_Db4o_Typehandlers_ICascadingTypeHandler.htm/M@/html/T_Db4objects_Db4o_Typehandlers_IgnoreFieldsTypeHandler.htm|XB/html/T_Db4objects_Db4o_Typehandlers_IInstantiatingTypeHandler.htmTo>/html/T_Db4objects_Db4o_Typehandlers_IQueryableTypeHandler.htmCk>/html/T_Db4objects_Db4o_Typehandlers_IReferenceTypeHandler.htm.k6/html/T_Db4objects_Db4o_Typehandlers_ITypeHandler4.htmV>/html/T_Db4objects_Db4o_Typehandlers_ITypeHandlerPredicate.htmo`:/html/T_Db4objects_Db4o_Typehandlers_IValueTypeHandler.htmO7/html/T_Db4objects_Db4o_Typehandlers_MapTypeHandler.htmVH/html/T_Db4objects_Db4o_Typehandlers_SingleClassTypeHandlerPredicate.htmk9?/html/T_Db4objects_Db4o_Typehandlers_SystemArrayTypeHandler.htmµ$3'/html/T_Db4objects_Db4o_Types_IBlob.htmÐWE+/html/T_Db4objects_Db4o_Types_IDb4oType.htm/1/html/T_Db4objects_Db4o_Types_ITransientClass.htmĽK)/icons//icons/adm.gif@/icons/adm_arch.gifXc/icons/adm_dev.gif;//icons/adm_dev_arch.gifjS/icons/alert_caution.gif=/icons/alert_note.gifD{/icons/alert_security.gif?7/icons/arch.gifvF/icons/big_adm.gif</icons/big_arch.gif?$/icons/big_dev.gifc?/icons/big_kw.gif"/icons/box.gif6/icons/Caution.gif7/icons/CFW.gif>L/icons/collall.gif K/icons/collapse.gifU@/icons/collapse_all.gif!/icons/copycode.gif6B/icons/copycodeHighlight.gifxB/icons/dev.gif:/icons/dev_arch.gifA&/icons/dropdown.gifgv/icons/dropdownHover.gif][/icons/drpdown.gif8]/icons/drpdown_orange.gifn/icons/drpdown_orange_up.gifl/icons/drpup.gifo/icons/exp.gif C/icons/expall.gifMN/icons/expand_all.gif'/icons/filter1a.gifB /icons/filter1c.gifK /icons/footer.gifT)/icons/gradient.gif}[/icons/greencheck.gifX /icons/greychck.gifb #/icons/header_sql_tutorial_logo.GIFlY /icons/kw.gifEO/icons/kw_adm.gifi/icons/kw_adm_arch.gif}/icons/kw_adm_dev.gifL/icons/kw_adm_dev_arch.gifPJ/icons/kw_arch.gifm/icons/kw_dev.gif8/icons/kw_dev_arch.gif?Y/icons/LastChild.gifC/icons/load.gif[d/icons/load_hover.gif?:/icons/note.gify{/icons/pencil.GIFtT/icons/privclass.gifHm/icons/privdelegate.gif5DA 6 *  +M$_PMGLL$/icons/privenum.gifJU/icons/privenumeration.gifU/icons/privevent.giftD/icons/privextension.gif8`/icons/privfield.gif>/icons/privinterface.gifVI/icons/privmethod.gif[/icons/privproperty.gifz/icons/privstructure.gifv/icons/protclass.gifX/icons/protdelegate.giff/icons/protenum.gifwG/icons/protenumeration.gif>G/icons/protevent.gif4/icons/protextension.gif9M/icons/protfield.gif:/icons/protinterface.gif@2/icons/protmethod.gifr7/icons/protoperator.gif)#/icons/protproperty.gifL/icons/protstructure.gif[k/icons/pubclass.gifFp/icons/pubdelegate.gif6/icons/pubenum.gifGS/icons/pubenumeration.gifS/icons/pubevent.gifm:/icons/pubextension.gif''/icons/pubfield.gifN7/icons/pubinterface.gif:/icons/pubmethod.gif?I/icons/puboperator.gif6/icons/pubproperty.gif>a/icons/pubstructure.gifS/icons/requirements1a.gifr /icons/requirements1c.gif} /icons/save.gifU/icons/save_hover.gif]Y/icons/security.gif67/icons/seealso1a.gifm /icons/seealso1c.gifw /icons/static.gifo/icons/xna.gifp% /scripts//scripts/CheckboxMenu.js /scripts/CommonUtilities.js!s/scripts/copycode.js}/scripts/Dropdown.js?/scripts/EventUtilities.jsP-/scripts/samples.js}z/scripts/script_feedBack.jsw?/scripts/script_manifold.js6d/scripts/SplitScreen.jsf/styles//styles/Presentation.cssy::DataSpace/NameList<(::DataSpace/Storage/MSCompressed/Content;b,::DataSpace/Storage/MSCompressed/ControlDataj)::DataSpace/Storage/MSCompressed/SpanInfob/::DataSpace/Storage/MSCompressed/Transform/List<&_::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/i::DataSpace/Storage/MSCompressed/Transform/{7FC28940-9D31-11D0-9B27-00A0C91E9C7C}/InstanceData/ResetTableypehandlers_IQueryableTypeHandler.htmCk>/html/T_Db4objects_Db4o_Typehandlers_IReferenceTypeHandler.htm.k6/html/T_Db4objects_Db4o_Typehandlers_ITypeHandler4.htmV>/html/T_Db4objects_Db4o_Typehandlers_ITypeHandlerPredicate.htmo`:/html/T_Db4objects_Db4o_Typehandlers_IValueTypeHandler.htmO7/html/T_Db4objects_Db4o_Typehandlers_MapTypeHandler.htmVH/html/T_Db4objects_Db4o_Typehandlers_SingleClassTypeHandlerPredicate.htmk9?/html/T_Db4objects_Db4o_Typehandlers_SystemArrayTypeHandler.htmµ$3'/html/T_Db4objects_Db4o_Types_IBlob.htmÐWE+/html/T_Db4objects_Db4o_Types_IDb4oType.htm/1/html/T_Db4objects_Db4o_Types_ITransientClass.htmĽK)/icons//icons/adm.gif@/icons/adm_arch.gifXc/icons/adm_dev.gif;//icons/adm_dev_arch.gifjS/icons/alert_caution.gif=/icons/alert_note.gifD{/icons/alert_security.gif?7/icons/arch.gifvF/icons/big_adm.gif</icons/big_arch.gif?$/icons/big_dev.gifc?/icons/big_kw.gif"/icons/box.gif6/icons/Caution.gif7/icons/CFW.gif>L/icons/collall.gif K/icons/collapse.gifU@/icons/collapse_all.gif!/icons/copycode.gif6B/icons/copycodeHighlight.gifxB/icons/dev.gif:/icons/dev_arch.gifA&/icons/dropdown.gifgv/icons/dropdownHover.gif][/icons/drpdown.gif8]/icons/drpdown_orange.gifn/icons/drpdown_orange_up.gifl/icons/drpup.gifo/icons/exp.gif C/icons/expall.gifMN/icons/expand_all.gif'/icons/filter1a.gifB /icons/filter1c.gifK /icons/footer.gifT)/icons/gradient.gif}[/icons/greencheck.gifX /icons/greychck.gifb #/icons/header_sql_tutorial_logo.GIFlY /icons/kw.gifEO/icons/kw_adm.gifi/icons/kw_adm_arch.gif}/icons/kw_adm_dev.gifL/icons/kw_adm_dev_arch.gifPJ/icons/kw_arch.gifm/icons/kw_dev.gif8/icons/kw_dev_arch.gif?Y/icons/LastChild.gifC/icons/load.gif[d/icons/load_hover.gif?:/icons/note.gify{/icons/pencil.GIFtT/icons/privclass.gifHm/icons/privdelegate.gif5DA 6 1|bH#=PMGIC/?/html/C_Db4objects_Db4o_Diagnostic_DiagnosticToConsole_ctor.htm=/html/C_Db4objects_Db4o_Ext_InvalidPasswordException_ctor.htmF/html/C_Db4objects_Db4o_Reflect_Net_NetConstructor_ctor_2_2260dfd1.htmY/html/F_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded_NqConstructionFailed.htmK/html/Fields_T_Db4objects_Db4o_Diagnostic_NativeQueryOptimizerNotLoaded.htmK/html/M_Db4objects_Db4o_Collections_ActivatableList`1_CopyTo_2_5f02821a.htmC/html/M_Db4objects_Db4o_Collections_ArrayList4`1_Add_1_2572741a.htmX/html/M_Db4objects_Db4o_Config_IClientServerConfiguration_PrefetchIDCount_1_cd2d7ec9.htmI/html/M_Db4objects_Db4o_Config_IConfiguration_MessageLevel_1_cd2d7ec9.htm Q/html/M_Db4objects_Db4o_Config_IObjectClass_MaximumActivationDepth_1_cd2d7ec9.htm F/html/M_Db4objects_Db4o_CS_Db4oClientServer_NewServerConfiguration.htm ?/html/M_Db4objects_Db4o_Defragment_DefragmentConfig_Mapping.htm R/html/M_Db4objects_Db4o_Diagnostic_IDiagnosticListener_OnDiagnostic_1_a137ee68.htm D/html/M_Db4objects_Db4o_Ext_IExtObjectContainer_Purge_1_2572741a.htm0/html/M_Db4objects_Db4o_IO_BinDecorator_Sync.htm9/html/M_Db4objects_Db4o_IO_IStorage_Delete_1_72eac341.htm5/html/M_Db4objects_Db4o_IO_ThreadedSyncBin_Length.htmI/html/M_Db4objects_Db4o_Marshall_IWriteContext_WriteObject_1_2572741a.htm@/html/M_Db4objects_Db4o_Query_Predicate_AppliesTo_1_2572741a.htm9/html/M_Db4objects_Db4o_Reflect_IReflectClass_GetName.htmERJVSZc jlqZuz T<%6D_km.zv|r&`tfPb h*%'D456BDPQ_amlp|4>ެp"(Xz6 %.+8B;(IPKX[4jl|xxz:><B :X!$/2n@*DSUe mx{x*\pHZ r@Rf< 14*CFTWfhHuHx̉\HֹF,6 l')589F`HnUWceFu>x."ZB& B^ )^-:=:KFNZ]Jjm4{}xҙܨ>"B`Lh<#2&8<KO^6crw҄Щڽ0h   0 3 A tD T n`jJV^' +7:jHKFXZg0ky{xnfBr<Fr*, #5|8EHUX2firuRwDpFRܾPRD4  3 @B[d~"zmvI}xi~0>g>v CM HHA Version 4.74.8702$ ^2(html/N_Db4objects_Db4o.htmDb4odb4o Db4o.hhc Db4o.hhkV{h  T#SM+wC@3^EQ*|`w`E;aԭv+4{B{]V!e|X( )LK%[ݽ5v? R^z XҦTm} oC,8DffHVf^/~3SzuŒhͭO_>2htO]rdB.ϴ27|| .+rBl",ક'% 0TyAjk$ 1;Y2EOwx&Řgg8Ćn&[@Mԟ]!@~l8Al)i'A|T##AɴwM 2° ԡ}_uL)HPֻ<.؟Q$8cL?lb6F&1 LJBX Q׃Z+&΢$0L37g#۔T@{ odNC M8c҉ =i"͐͂h"O5\SHOU8?;f~ f}́="f/߻ˤn۾ O:<{W4ٻZ](}#Ki}i}_3)u|.y+8sQc$hkw?yMOkʃ] ,pyu>%idw9뷸r黬-2TQ:ϳĥuQNU |}iM(֣={ V1`B$N{a&S?IC`_tyd O^!GBND(jY"ˇmh兜?~-E~Z>urR³`P>lvͤVwMD:}[N,o{)^Y7q6MBR$0B&yOdK$]]-.NNx. 7@ôC}•#K@5w ~P2B*K/]"&`IG , M&"^˒"(SQMx1͎$$B[ %9=8T~H(R.!dJa+,lB{'ijJ47iq%4]3X9o{3wc,mlE 8F@gR*w4ܘ+jX 챌hp k8qjet4娨%?el㲍[6%O j0Uȱ;n- 'c˴f!ϐH'Z-$B0DPzA21}Id~qG'qP[D7rù|wtKƳVD}[ YQ`5!-keU}??Ct=H]YWق j9 ތ$0 v2]-pxz䂟 $)|W>^~o #!W3U ]:x5Fw*CүS鉅,VNW#R'.؝y&ϵ ']RlzuMl9孡4X.WgGz˚r=rM .ߖIuax(tl^ I V+9"Mf29ÀGsVۿ3TgC'8.Z:|;I;ǼSoGͷijѣG|8F)\lC Cƹ 񐆳̚& tџBdzbᵚ6T >X:Ț+KhgeɈD;,nk+(3pne))_U&3,INz+6- c DnbBK\\7G>z+.+Ufh ¥q_ S1lr宻m*;/w{RwnǬ_/yܬ΢B(c4OSŞl BX׼ { -݄ s!|LHU9H<¾D=r_pmmb(g45T w d50&[᳄އR6?"&>Xv1}wg(4s(G*ðf-#z$(Bw /`i Scj,+Q61;?LEs܁מn}4Xɰ#=w zԓ.( D[ṳW-0N +=Zblo3 r x5Ps&C_iQ^Cmd|Ҍ2[[CP) c g&JH(kCx} "(Di?a.˲6xDYC/q\0(7g1J~K.-S^vpX50RX:ipW@9\Ko; UOl^zy Y>i0ڱ[d~[M&jbz )A\-v`$+?Oh~ Ǥػ ƪbH: 0X9+}xb`QGu1vq^=sEpmBOϫK8! ҜGK@y@<s|3T2ł%5]}bs{Ne8[+Ea8$vnO'wp=?awbjWT8.szz7[\™2X3&86́) xUOjk/6tFDFŨąjډ_2YLS8%d,kkཟBn'p1CĖN;Agpwi>گo\km\힥pY Q5,ѵcưEiTٚkK,l˽#̅x:G,nvwOp rY1w}w@zo}%b~+,uV9k+ `:GӡrCA1o0Ÿ^\9"yat/G}-d 45gNρQjh${vhyћ ӦB%QH+Z1#ɑ h=p6e@4 yl+^Y k)+$rMb*3Wb1L^AƚT Hnuo#{!#m,<0hn1'"єX,ʙ9X%6e͎:㯹`kA0J.d/V /":{I7m9ŲZ'E鵂RLGS ^OJ#4-i^]<ii=$GQ]HcCn$sFaź_Λn;3y:ZcV ] ;,SKCB,nL\+v5mѓTwM[.c[+EΖjMLdBf/#5j s҇YNM>EL^]!#7Mv'\gVX_@!.A&w#F)x靠ƻmSF/H31zpdAЈ =ڕ}~Faٸξ.(JʡtKR{ˈf F ֬rN &yqJP ⊢s ,b:~yhssS ޳]|kVN7θ9b?zVνjZΡm\r d󲣦Re Hj˒1zHcAodf3,?Ŷ\ `b -9TdQ7$Q[#8ccjo$&[4:68`,|,vy>hɮ#o8(N:p@XOPqU n/?|7 Kd5ca3{zţ0MLWZ4oW+dhIwaoFJm#\Mzh碤m*(ۺ1K_xZb㸥r%kr6_Vo]x1T13@Lc@L\4;Vd^&0>#1 v4*BEhlmO^u?\EnW+xS'Q'hVf+VɎ YW#w~xiEg:ؽu?tZd(&'kP^~L 7&C9)}=/l {z9=[gu<>85we,\ R8RtFo)<%&F{wn`f<"ـgm JbxVKb`R'Vv 5[r0n ُtB™v}_+)D溪$N% 4]~H/^U R`puUJY dcuT,R)0Fl4]z$y-ѯ&dQ)~fԣ1Mq2H7н .uyB wuB~9s+$\^E̺!<;_y섫G[yS^i-ѕ-g{hϡcl0mypqߚn3>;'5)u}`v/`5O~}mcڭ:!D<31)#nWd@y':e8Adm=@#(>\B/D(x6%̟fk)O!'O$Ȫsa X Bv, ;>ψXVWY I&l <wɴ \_>6_5R_˩!I3-qi9+яCF-'HDٳ{":-&A^WLMu{>AuA<Nq)-VĉGb mp{ttDFmBP߷PYOhT\,@̩t*B@2؆TNǴ4jR`(@ jl~/eƨ|e/Iaf _Z䣫謍\P~xjÁtFz1ΙO&+ ~QKTxk( JHv5>]4A"n:  ]l)ER,*k߷Rуц)V08vQ&)s,RB]u9E ׅU'Tce/+2~щ2j573V?9nP?y1+guDI8+䫄 7IH@V\\.8O]Oʹ= e'ȹ#?ϟ!@:% ˹ \qذI! lk7bZ#ҏɿ.-[|dWǓt]wṲjB/R2'Wl~wv2MS&D䮓A`k_+̾oJRxK bټ([wv s (~zA(=ohXg}}Wk-ZӘqde"jt!z8ٟC"^Ra[͘`"ypBj^N3h|֞L[ t0}J$R ""tTFۈר$(My@ԛ-|7o}m^4Zd`yd#4jw$*vud-QRbNR֞'>1`}gIJ` T3{}5(Jۣ0Df}-xceoi3wQ|?Bw1@=b'u>UAl]gMg ?Tsvzpw^Lm /Lj2`PG钹 V%N,B?![ [ކFK@ pw;z9ձZ}+̀^:;$wNkSTLr4z5D/o, gHYER9LG1EnoO4T'FBqV h4c>˭je&R F>D(:JY lMWEmk'72JAn2OZ]&JH_d/RiE""R{QxϕTT_ɋC"EJYzMb}A` T"Qܧjbח}VI/S|mMoBS mB6Omߑf?9M]{ق%BLA&F) `"D1TYU˟q-YIw9ueJ2%ЁE1Mngظ9-uH0 n W]A\piXaC,IX='Ci έÙ?k 1~)9&+CAQiͤ/K[rƒ#GNu=4(d7G] &`dܹﻕAhQ-7ކ²c=1Kc&Eu20EDak|:1D񵓚Q$ E'@'P讪B:S7kiMeUdh $F6τh3CPo a)ʀQG&(N9:vQfTSC} '(PIP?DN'q<5Vv`N @[vxw['0R?st* "0c~l6\e;9!wOwdðx?_-`&n8Ec= +QjQl |BpQwXP*ټq#py3OvL9b `WRp]3Hv }Mgc1k?=9s!a{M9hɊ k!ii );[dڀYW6l5"b^Ijًy>5( I`k asPU@,r &*y:=.vplCd7#~EUv_ozZy73{t47j!1l*((2Іg ||E%D,A ArFܸͻ X:=( ,Ft:J[@f8C,E.@!2P#wq-I8@m@ʦr;r- 1Rβ^>I/t&l86fB WR4a|S 7X~_œޢ/ VqS$k< ]O aNiahb$u摀־3z[ͧ/@De/* [zټ::i#U*lz$sy{- O 1=ᐑDU#ՃhS8nEEoɔ]8mnNuΏ]^ r97̌$bRIz( cpCKs!^UD Mq+lQ;@IQGYT8{^;FJ`X cyV)7fSh`+-VqOFr Yƒc==MjA2qЄgdcTIJ&3tCGKUWvYF@.fбԿ27G.nz{YFaL\=`C 0-=r2R| ɋ=]Ugd{ ib\ WW {}OITŸRL͝aVL.\ΞӏyܫEǙPy۾Q~ay-\[y|3Azf +LPomJu6ú2;=XDvR[fQ(tYO/0TW)~n&]i*.Mh#ceFͽ zLf 5P4!} ̡&ۄ1k{ 4MHwTC$aԓI:f]f"kͼ<)NS8liةgiz8|Af SvA ZiJ $zA" !îVuZ`t:_ ʂ8_5gQ`=jb4c72r]\}#P[;`AZ{,"-h,!}mn1/A~ b`b+QwJv" K0bƇ +?nq/UKÍ$>O>y=[}xq°~ 6T]'!r f(f̋+X3^nVT V>eIu \, +(k߰1Ңkz s;xPraڥt7/dG`74|te!KiA٢*(tB^hU> ҎeW#TXilwUW0aAxQQ*3YÙ'=C>U`w̰ƴ͒2\;eYa;}]Bx=XG" vRyu+-˘z#{|#9BxjV%Da*RcW 2f E t`=O4ePFAͤkKF󫾱 ?`]$H$_,8KOOEן+4:XqYZ &@ s6Qz׮Y$R1y$r8WoBQɬ*L ,&$랼BuI'Secz_;)scgy33U:/O919G7/5)j\iN_K~.W_Db  w4 g]-K@ol2 4L@`rkd鹃I?tw˂ծ6( +XkK k< U,\g溆eU" +|8@R-0]# 3TV81&if$l71Q @[ I4ymK !U; @U@-yU.ep\,thyg~IZq"pIDxknІ݊P4ؐ`ﺜ( {V Z\倪Uꏝ;hr~:<_TMu3V=a\Uf@#/tDZVI+)aiAT3CK 5aO7(S7z%[w 8=Be !HAIU)Cl<=ٞlv=` iCJ f S,9&>}#92Z[GUk'=k$z`ENǣNE$:Mڕ?oс0q`.Ƌ:4< s3]n F!^@xI_[an:_kf*ZM IJF$dlktH4l*BޚѵV{sQ[;_KNoL#2g@_NOy>1wR'x<od?Y38> }\9?g\Yt9 jX[UIkS~LLǟ}iK;0Vj7"{rT袚 HU4pbz+/DV._8B/G i `EG3zc h{tߚf/U9~R] CRQ4]R-5. 4(W^ -dm Dg6PY@? ,ueXc kt.ƅZ咳b}/؄C*8ºch7в`ύmq _ҍ_ϛiݸ#Qާl >m]?( &Ɏ1* ༅6V-{zT^3p8ʖk( N֪d9LK݆`Y~No+CV<t$I p5H>{(ʞ!47xQ}t)/$2tX6_>w7O0W7>%N*?uacs֤~v;Mrcj _0Z#TB:+ Q/Wi*l6F 33vF 9I/bftp <2T,7 ϏŴW[\L'ѥt&y?$5eVt:|BaKE`^jY(}*C67Wt;YS|*ab k UG_*Sa+IjY@m/0kUo$Ќ/P#-rA'֗(u W% ڄZ9ls6IWf焥 8gqp~j8%1$#P˛EbAA/0fg70}iVB w^q/HRO*m.tK .j1ume^Z=cARM4%s0 Z5l@DCI#:e\G֍'sP\ GWe7'2X\IJL.lp1N*Rsgcm`8'|ߒo`H"ѫ%=DS_">pKPN _CD\{ 0H>I4 )<|,J+?܈f$`,$@$)w^H$$2k$b]3,+=C_*7?'=0YnC-@ 5kKU_׬7uN77)Bvfh&ZDAQX"F;LBW(L 66_WOjb )^qZiƧPjʕ{W.;4 u߲!~ !OQe|_cxU2m#I-+qUOO[h坌K,,5 Z_;YOzT vR#mv½,q⏎ԱL]LuzSʊQҹ)ʃԴ("W{ę0473w2uݯp>W H@y:PqeUN؟iV`}v29] 5EuMB,#+%C@[NƀZ88- TϽڂJ3?YƘ .SU>&mR1#P/<"c?R\У9ҹ"٦0vA/,jFt67 eu9K]Wa<Ǣѣ@a3<ө ]ik\|2o!sFMUT/` 6ꤎMۤK);,R̚7LMN ?fc9 zb\ wt Fett}Ȣt ߯<h'9R_\KТv**єAN3+O*{}'Y:|d.hy:$ e$ B4UIdlms/܄*$(cLfdGC7IC5l)cM4S/ۤ4z?>L(g$QC%>L 3%(F6@[S ݘFRL C92+'b]ϲy ax0K6Q+I-{pS,MJ]a qA* cx]+P;/;q~+݄G6yz{q!#gpKHQa! )m+c’R+$2yj]`QNfP:=wܬ}"WI7&aæG#۽)֜ 0FWwg5aX䫂?APf$BtP70/3%6y}sX+J)1ZIJV/|.0ȿɔ T)DXSlehBcdUg6vDמW`Mqb|dQ-Q L`K"SfZI@/Tl|JqRUKq|uFe6wNm/ xv=-wY7x8v#ĪǒuKzWc%D(9P}ၵ!:lx؇5diTXYh-`,|Hj_ރ~C֩(Quz=+](rB6B Z֖pZ K `-t{,S ǯaׅ Lw!\EKw/)S`m (y. $ОzdbS9JnX;kmrml:>K?((0?~ N'N̄T@R[;aVo0tc\T'9p!+422@fG f@NF4S4s({t- :qL]W&_ܗ|~$ 5g_$)dH6/p[(lE+m鯖\,VB. h!UmxKC*<4Ch],i@ {xls^ ۙ~9+c}6Cx%/bT. oPiR.ژ \BJL h7Ҩ@Fd EX%8,["YHY%麍DyW/iX3ߥRl%evN K.Y! p^}3473e@Ҿ#7m&Y*':63covMO}^A8#( ;U@#D c[nfvۓK!?C<ؒQjqⓏ` J8 I)7+[w1`!I4ƅYpScl Z12 ڻm q7OIMFi! }!rvg dm``wgvxQ3;? wC -en$Oʂe=t|MQ pL6OAa~>UXvpS,ή3vTvX[%Q›骺s堧SlBegCpɐn3$ ;S$ENQտW+n>H>w0PQjFt&no{2ޛ |Нa.ׄ3< hd=y,u5UH^51F9rgctivN¸H*SjYj[+4wf4EJ} r6u[_m(Qb,H%e 2Z{-#"rsD&=]*ڎ)s沓8`:8.P[Q@oDy8v&ͷ!6E;JvQQ\\ "23H҉Cam/)Xa;]5fǮv9W yRZxcF4=7mr?t3z WبlotW͐;, 6yQ?EL̑ѻm`IuQЙ0#Pj> :Z$| Vl6\Zv5"Wy DC,&ZpdH^d#7Ib"և#w]n sW[# Gl,$姛_gnh) ;[S E3X2})!AQq]\(S| Ŏyєi'.O~VlۢƮk9򍆑*iUz;Ҁw] 浣 V'XKۂn [=l%򖬭ϗ>Y[̬}Vu.[Ff&Zŀߥ5*)(˰n]SV?t]u/M;[-+_ ۖdt|&XsXM D423p0[)0./d NU qiqqaק66:\ |M8+"szR!BuΞLmߜ ɍ z΂h<|ףmt T2p؏7ϳ:Fs!9 UeM,V-,M~9d{%kD_6 }k' zu/&4f2]`(A43nҦe;;ӞLMWG(S#q 1!#QϐhFfs&1+" t lwSccDH9nAqcK&^DuK67ے0 NxP'.f1%ɤN0[s32VaS$Шd? Mx7"d5 7QVh6nMja̭n6oɻ?mVm:h#,"ii7X4i@F˻4- JC8+⣞dh(99#%c(<|Dzf!4A&-sOp)+h6S 8t{.{3}5)Ō&-"/uE>0"14%SS<2Hc>V9'M!D|N zyš7vO0Яd)Ol*SVK<9~1jȊ 2ݒz͂i(G!p+z]: )-t*2[f϶8ؤ†!vU:YYk`DFk Tb"W}յ2zBz`Jrp9)ŴeB02Q`4=K> e:I.:[Ѱ 1Wbyw&M~u=koRTew]2/E/\w a L2ф˪+ء!wC63e@ҿ\&uB1hv |u{3A@#Q1D"@i c p%Xu7? [?Ό^'R3Zw7پo(֪9ݱ-rcn$+5;xb"Ϙj KoǸ 䨉|00BU޸^e7-~fRָ|O=45AEfe\KFHM\8l %)ΧQZ2Gkt+v8~rE\c ?4d=QBGcOmωVpߴ'!"w̷Ty:'hvϘۅ8W _vнzZҨ F'9-Bj.)Lv.5b?.m7{C,%i)d5/j?JYj0+Gt=Bu=7 SDdUmY7G{ZwM+{5߻ S}gkֱ,@P5ϰݨQQHFv &qX"A~(A`w86f&l̵rnTD|gϓ} cBA»Lދ7u@/bi\I#tEgf}!쉈oY2IRFݭ{69 u z:Q[BNeاL= mj93_ed[vt&ΧjVc$|li%ϙ c0G.ct^6u+UYaېZ[Uՠl1[Bz+o!z^J~p|/&C$SacK 6Wo$#XԵ_pUL T ⋐Ocd)--uIz;Tw*«ׁQN,̂,L_O[|dgBMh"Me &٥]O NV-tUcVdz( D_"Z;^1DZ- taYs6 :?6.냣V{Od׌\4ƾBW7Й˳C葮~ޕ@"Դf,w$9UP'Kw[!z8 ~Kg M}~&T.yB4էK"nI ۺI2ު<믞Sl& Oh^˓j`[WldQlVkBLZ۔]l6 zekq]|e$.#d'c$7j!,I%@gëSV7i7vWu5ܱAiϒJ*9| iB 5́|ƵkmUk$b2?Y Tian'@Bq#|2,[[bq+l&X# s8"&tsD~-zu#k6gsD zL iҞN_>!R>/>.Vz0m?]K[B^}*'5'촳d̒z >Zw[SⓖcrmlWmHa[-EyyГG4^y?ţ{TssKE.&0jE4F9+k[ `eȓAc .ʝaf( OaKALaab4@ 5"I*=0V[ss{•3{s]w=`dѺ$& ٕ GnkL8E#-"6"S; y"UIUH͗"%`H$Uđ%tIEJq7)%4%'-L2MM̓>.5A].~}mtZQm|#l?X,OƤgbc8lx1cZm<]kI¤Hs{24o?m3q}^<9jDSe2B;)ӊVh6ۊZon\͈}WO9Eɣ"X:7XDPQҐREfO[iӆˑh1櫨Kd|r韐u1o/јYm4#&.ᠫ q賆U}JNͨיƈ\%4p>_Ž u!v4u#8r%qܗ@2{Hl-/C3C 9[Wia>waM}D\ϊ4Flev 9H=!Iģ̗!yU4R.֓|Zfi+I` \Ta 3зADwj)n40=xe8_`gk $ſ66 3Q݃!:eCRFyJF`˜)F2#I0TD3 @1z$ r.`_feAvD;jL`)!Wbz[̪**ݛXW/M WǗsj!+NO2C6ߩ,i~z> EJ7%và+(EԺ2`t2%d@+&<ÄTrstK-AO-gPX}ٕ =2]OPA'#7/M`F@I7ljǒkeCrJ{-f9w INn=P$Y@/HO. 6lb-!|E )"N#p[ThJf+Hs@trrkg2Tgx|%i"=(V㌌3Exֺw3[Gv8'17\&oM ~FDHƀD_f@9Lw)H9D(1 +ê˜wnڥ&u8dOFE$ũΔu_t~%S:9xV{{s4˷iA?6s#K"_@єE`}0Y_]·`#0ʉXj3R\:^>){N1h?C8R*$1d$=O2^ Cղ9M`L֣& NtN\HFSwJ;no)oW影 lBiPaeUGevR,_Lp]-7_,oc_Bv[ַ8VO|c-8}ySIc=Q 4W>8cG)9`\l99;qޢ Aަ" QbU*_8+U]y~1܎@8D9`@71-~ߞ⹊K3Bs"B-%9xsAg9nLOy:0ff`]8[v// ֒3;זaϠwݦo]~<'Xd08Cԡ [ؘuG.hi֣ώ4^9Ϧ_o"6焢~a/gf":xi15|6R^ރ+ 3<_2^:`AV1s=5n( pOkJ BLw9&hp6>Xքyx2ȁ~eipMaVcwtsȳ Đ:M MXV^$Hd&Ic,XC\r% O.>Š<)llh+٘"? |? R{^Ã2ݦpBA0ÇlWI16בFP{TGy f俁tCգ I>62?)"OLhՂ]Zn_$t~Mܰ\ Y .eq}"&A77x'cO7l H I.5 nX,@ţfBG}ZfyQr"5WƎERvÍ?HZT\l06 حە]I}"&;'8@+iĽ`,\#)ēxհ$/mÄd=0ϩDѤ!`>^Md?!: 'fP.WC1^yTi-[0 nW;7Y3va0  "-/G7 vs#:^htkh*DhDZG. B5i1(X9 '-)LǡSU? mV𡍸 he]dܠ9$1b0 R-yQ-&O> ([c+ thIhc2(qtQb)3TS Z`dTTBz{é"Fh>uйSm)Dʁf FmPY .' a`s/XǛa[ gfBQrx5.ܹ'p'ZTo$d#<;Ț6PְSYi˹OiCIQOwL Zt! V* 캫ЪJHc1dqaAz,,8 ?X@ MYxcZܐW|u@ȽB ?A8 J A Ѩ;8ù53~a;,QrD~WN! nD OјyAcc9-~ C03DSF;b. 0j 6]uoHqZmm@  `_x_l@ I6wcVvcBv? /ݸX~d3YVh- @F H mp׺젫V][mS5fm{gum= j]jWD{z0SE(D@_KC~$J0|pJyb޷7}Un܏m>sk-ϤHT񗘽nտnV&A{ȋO7:zzԷn8y Nvr#c& >>`Wj\@J[HuJNxL&ѿw մj?xe6HVNnc?9St **l]zLqɵh), 9yyfdN7>Ul:ߴjogԑ_?yP\IN%H9859F8e!:lW̽9i~EjlŎ.Ɗ!'Gk > r]C!3jv.XeɚEuZ.?1\z,OrR͆`׳`h, 7SfAep1e l'wq?,^3K+k^ĤfzxT d2m¹x Gl >2@s^!\÷\k!g 5dFY@$y D6"B]bT0`W\"`YG-gHsJ94,w_āqzX-q~T_f96l{[ SшRD"Y8@jrkeBӾ@Yd仱e&l5U% ڻ$5#5XY֢+R-~ku2yAgj%]zQBj  irbBz$#?H m~!b;A ZY#ꅘci " z#p$U.JYL"꜈ESgv9{HF+Hv tym9]ԬhNq40GYuBN.>SPΠwu= iQ=1S<}~EL |[RU|7|w^W:'6BW="n9Ӓtc+>fK |37K0BmTx4ULd z6Ǜs[(Z+~^xUc63EQ %ې;\4E_&i6W5@8(U6zxZ%) xsM[wռ>7TO N]dxL[D@D h ~.~iECkm[ݲkjS] ;ƍI H͢>sx{=l4" zAȵԯΫ#음`=O ާed5~4қ~}:#q+Cz`Iv'|:?k'N[Ni[j\cWWYߵw#bw Vhݕ!=WɰQ4=Cf(C$Blql :!pG!a_%|\P0%k 3]vt (]z[0\=8(ÄRGKşZTَcs%}XgXDG:ܬĀR^ƀWPYk9J^po'~J|h )_zkeu3`AZg:(Ģ*5_&C$=/ǸG [lc%'m"(C;>dGI6h(#y-AUZHE Hu ɢЎȿE fPkՒ`of P`QbqALw!6PXeiW9N!ū^2qy-f|AlnaU1 ='}2݋&L!̵NZ䦱i34{,(k5- JPޗ gl&;JB99"-2Vv z4?8C)AHY d0:nɨ^P 8~oۧZs;:r ۼعzPC]]'AKR?Rf F8U]Ǯ=R [,l\@BmvYe9=W֟!YAM ?3rj Ny29XCaWG]J}m\ |,`XJRX-U`;Jp|`c ('EǙMQp@Sz+yR~.].p`ހ9)"DmTu1?;F5u9Cݐ-B 2vB˚B$|+,=5V- Zu ( +ķخ䞴nZc *UՄ<Ät[ZA ЛPלr JQz1#1@fYbpt]S (DEgm[v[FUٹX]'iI'):h8iQk&EXJ&̶~kF9p*Tzl&EXJwיeR$Sv A ,)8䯔ĢrPC&h '5*91W2Jc1!˽OmܱY_xUQxAS; @V ~rda`Pؕ+I urk9^ \=Md687*3BrcBI(u;˫Q}nRb (<-Q8!&$"Kx,E gpCLpjΣGl–DQߜ5؆}._b0WByH&sbKZ1v~$x0$5zd$]nz~ UKP5|Zqd_ /rб./5N}sTNv- ӥ\KG̶kM~ż ż/-Sbaqʲ[8p:#R5( ߛ5XnhoĞ~X>$Z88 yq'D1?VZ. f.5i=5@4 &Da6i1`Wk};dcfqј(aap8yGqoc޽1tBlqC$'с@%v q"#7Tdiyʎ;Gd [{k?>c+diwoQ1 !O@hD =b| mnZ٨ۨwv"A vL] !"""D@>n1 fj#qQ1CBt[!|U=5zР_ˁ$2=p+ 䣁Cq"PD(:I-T&64|pwT~@C;B"܇.kMcBG|=ǭJX=OMNH X7 %Y?CNO4T"bz P9lK,"ր @6u&~?xR@Pht!S-"`=`*`LoE9:kLQw+ApX6+?ګ[\T^}`43ąwa -괨^uFO0?Ԙ~WqUGhV/1+T"d=I9@I5kO UF`XIy %T LLޔEX<] %' VY(/pn 47Ź'6' ^~]: Hw % z([ l">*.ڕ0ҏԇYn|V;`Iz1Y( ؂{{iWɠ^_y%?]YhV^4P'\BЀ[SW@ & H'EE1A;)z$)7&LS󗇛5*+ʓBЀ" NYD€MA K0-N\ srX>r2@~ a'Yz(tkĕ<=(VIc\9X}m0' I7%qݣ*ĺAXHo' Y/qFY߫>ű麷pT9oܿX%sIg]"nI\r@`Oj [F4:/TKH@ {"K''4 d7^\8u8"']T0sa.)`n#=yGnwO8W_^0?y撃uWglɀA}&pE;O`,`;'G/t-)Tq~Qu9 % [c;U{zGpd2%@JU-6J @ !~|7S|8}HBK(yh MŨmӇR$ $W\|j 6Ѯ lS[M:h(RE`RS))ȼMfX&ENɵqaŦg)UcJE8ar5|歉Նu_$L_1)ըh!%(zbB-i&*IӢfgiӮ2ݝv 9%P@rPA_Au'ᡕh{\ 41(^K߷f3@4hGթV5aCK7_ ><"ZX$΀M[+c$Ulcab#W(q9'VoȋkYOƎ[ƌ1I=aܪx-x'Dfֵ m޼:$a^eao5ɟwsx@њv<\r8Ϝ)ɉj4g3yo_r3PBEUVKʇ;Pe3oa>d=?m:Θ3ɣ-Y؏ ;gu2o)p/7$.;(ѷ +a}Yߒ-k$UJza5[9.~t^/{ OonJՏݍu66o쾢3 (,=yХJnʝK#c%mrі.a)aGpj_LO;C$lwAѕ:)ݒ)Qy]x0bbQK(8bbE?0bFlEW_s5( 5t KϟTqӥ"c0U%*8e8XQ'ln<Ͽ* S jnڢ\xbg&tBvf{!4 i&EFn掙c*ɲ[T<0AB2j anldX=ffLj w*f-/sF쥑FE,]&p=;3眤YbEɕ߈.rIσnb]!uƞnWN˱AuoT]@~>+}n5gk rGE3|lm]R!mTZ̞CI0X;x2?/,Qm૔yQ,(&A-vE}țDdQKl2:ka-Q'yHX\?SvϺ%8I+V+qƩ /*O+%s oH֒?*vh|{6c/m^_ZH>-S2)|i樯F ɂQe}k;i%͏3[QA@DbՄgbh8h=ٸbe7x3)w3DKQB.U쒘u*RRnz]q[X%dsVvDhtΧũ@I}1B\4,rS-\a-}ڐtp, \+, inҹFw!E7=.P jmlt\U޵7n3*wϘ;x'`g-McﴅvtyGbt$ InӼļX/s]u1z]8-<сw^'r p9̿0裎3QCN|')CjwOq"VV&%T Ϫ">45]AsZ XjqQc1%hIf7+ͮ.=0+Y'z$`K0ӷc;R*+Du` ~HVx_|EDoҡ S8 ,! S$!v֨4}L@aH'Ɂwm,*tJw.8$Cg&b:uOCohh\3"]w"EY'K .BC;I^C,-\H5apw(mi`Qrw lq\{V8N%]:oCsVQF-zoMW\飦Aܮ_vRP|!/UbGp9R{9#cA֮-ZA?!p *]EGn~ک^kw٦PJFcҮX#D b;Wq^)bf6ύ|ރVP(N=oryG[1LS1en[v>>l~BIeOG*H;")egYqws3Wo¸kۄؚv)[wr C DE/EMP$5)W݂.>6uw!)*EQGRNRLr3>HEMݿS"*PKrjRi>YK߼ɟZW۵>{"TXǝL{ro2 ]zZk"z;@|+ʳ2fcoxAȸùX}"T^D@DnQ|R)̫^v:$*sϔfGra]ik1Qז 1Ȯ4jalq88MvpП˄+ ${-+շXΊ_\Zv57>#`T$ƭz;׫]jiIHm+[B1*kSn!f"wb 24aD~Ô46|Vhθ:=hGxb DsHqS,f]H7:X#="WR2A{z&klIMh<#t 77[ĚXkŏ)&CIe}AR`04"-x>yR֧ ;:cBFJZ}?X@VZ|5x4'*~s:WTg5 ɞ:RJ/SW d 9QH]s|^ۘ^l{wfV`gTbl:-y]l5: -9n/qU丐;٦jB{j!nLwb CS4ٮ{B~EsO(6v%S7~| YH]0sX,oO-.^AX3Av~ek3>\3bEEۈ˂+ .vTXPrKQP$?uvwmWP%QHR!6$!-=mׄ$(% !a Xz-Z< am?Noscb^m>id%ih8Bdp%Po-e,)pp{[3_ ^. ^\Ma[. _r#LT $(i̚ D4PE=wޭ^]v&$YTJ0BB0BPP)^D U@xyxyD5r7qPfXƇ ߷y3E~m8~4*e]ya${?tlސùy#~@s !y::v|Cwf:OHqeg>7~󻁾xo\ݷtTDG^{7'l¿:{'}4tWt-% ÂEN!&1)J <R*TPֲ^DqǧH rLM1ײ,oC!bLPS?05~sm+:Vލ5ѵ04llj͍[WEpLy1g†dz@P&E#8zF9+>g3Օ-Dz\*%),LGAp(OA>I]_%[+|"#= kBSeS9 vioS2 I#KFLa%qCw|DNbdp2'IWLj[8ܘPW SӃQKQm gmX{Y3R KsJj:JJVI{[U">h81'G1/JPg;I}lɊ*򒀝`/%EL]!E0މTR3`]Z8,nxt=b?.bz9[=Bz_BQr,=擉a13Z99-:\?C0T7{i!oKt[RB<5r%WHp= a{'Cg5ԹR[t{6^9YKƏj2ow\`8LFWlB#b({:eОht~lhNȘ5ZwłwcUN17Ҟ7q$-2^u)RCaeV=2h86m)sui+COXlmV}ai n ncHZooؘb%UJ8j^X]"Z^x/)\$%~!ʰnhl]#ϱZ[k:qUUww}+3g{GNJSN8PMwsq.&3RLLVWV/ ,5 zVݳv.J190i& B6ʬno?Y*MMG&EJM U֘QT9&gX]X SAM-toL-Yz(Qw["W#kAK-TڈU0v<~8h4nh$IHdis&׶j }kYwТ̫ﳚKz)pʞQߪ$Cu |/>7޻9oڙyrV>j+k˖IIh9:'ٱlÝgaEŤdý2?54ݚ^mX<\p xp (b3ƾx3Gd}}KC I&mʚ5'n8n!׭l"]0k% <۞aqٲ C?t~cSq:&W}9213nxJ8w+XVrMRzyZ̅:0H6ax$w ыM'%9]ECgfcN- קm2,G?lzɷ`2pپu{Rt< >!ugp6 o]K aZ6y͸vkR3bGȦ|f}Vԙm4JkN2r :sƏ}$ aZ9L ߱stU˔/ Piha]J_ۈL[_}o+@Oǽ#E΁etщmtLUM몾wv>D&1ϛj#]t As 4>cT2_/sa$C+>k,/%}S]nF<7q7.}?uuīoզ_p= 8Vu/dqFI|!eF_isU>zMz#UQ   6:/025S!rM֞?Q]O_SmXl"Ư`)1W"[mj n \/4VCF!۫*.t!\'P.ceW wI+&HYDWu,gPq&ެ˓H %VnhOX8J|~{yn~ieT652NP=˫p_:?{o8ݣ0Ъ"ޘ'A#j)O/lrbSmDŞ~9,ĉi/ӐDMJ mm.z'QGLbXTN_`S CF@?vfc`K-"E˚X)WufrgQձӇi0i6䌂t/ek,+)P=uލ OAX3Y[ de{͍sK,\5fOQSqv".'jGƐ>NkdѬ|Ue3-pM%@b,LXDZ8 ֬iR]xGtUJ' ![iY%'l|q^EfیGbD=LOy!G!~\TOi*,I)l44*7f #CsfY~f:B>@F$Yz481haH(P4 G2 aXiMipPCD p:Aj S5PPQLp5 U?dΦk5Tװ]x :k6h aƆ lf;lhH@v j6nC 8;vq7 a憸x;np7`av ?2 n 7 {7п!z ;p߇~;x!@|~˹򠜃p`/Z8.X"+gn-CG"7=q: +b%PA)TRZI'Js&ޣqY3d5N`UmR-5'Z]X@n2po4[OuEwHBfg)gnOѼBo;]}㔹2^;Mn;\B~- qB(DokiB֚|r!2$KszM]ȣ\va$9#F4eLiކɍwmfpÑIjiDg(~DZԕaPz:{}CşC0RjLŚj/JɜXR]meNɿNW|g(BFƊ .́|8Ύ¼;upuY^-_lR=vG\^\@ŵ_O|:~ {`y6?K;+; o<ueYQgvsovm3[9=՞iQpLP}]Vqvl//f3j%u {;褲$d0uݟbmMҦҤW:E^CKʡ!vmnmu%[O/1>o)myn}'tպbF_get2[(WE q7ɴCEh%C'Hk2,i 2SI^dY:&<.5%L%:I l8pD=`۸2cʁ &Õg .G'TؘjH4].〾M*Yq ac=VsT3y/jH l>˙hY6IЯǹKb#yew{44&R("J-R/Om"|$KG *ʷq/YΩzfje?mӨ24%}(@nj2-H0JC"O0fC7 J MȐؙ&DmiugU"6w.FtBۄ9ie"c<o-f1+r[cjH7&c@wj&enb11tF20c wQDQ_jhIףGl1BUDj\agUI{IDHa#.'OF-sa2!YgB \,;;]6(I/(˥O@Qc(I0ubp҄HU~PNe&+秏6Ub a`TSuuyUC^ 6KT)rP q |gR'?>n*<`}Xu%"[cAɅ 3$QYXݙ(,2EGdIXa؝)  $"ƨ5q+K])r:4e51e@}*%N"ɔ;scp/][3Z7O1(e$!t ڢ Sn&VIK-}2\[Id<ÀNǨ 6 d&(9lvaTGbr8W.[& RW^?5, {n!=GûޟS#[F7X×Q]s'm~U65p8qgݐ_J0-֘Fճ-U-nS+A.BEGc<(88blz .͆kNZk'K`ڐծrJf[5j**Ewk OISkc bm&+LC2̬ӬoW9+QM`{E=tF$}0`+^8A&T3t$j=-)5abt5BRrbQ4Q!ZpBD,r Z.=m&uEaG˿.WT"տF0AƉ:2 >>r~[rh'ɿ1Cd_G9$XΪ8:3hM{ri +`_iQS)&'6:&+GZGj hXj)SUi %'8ۈK"e*-jN{erjƙCESL C)/{!YWo+:E=] DM6O׼+EFTR?(1Ga/S0cr6 _BP<= "ZL$+_i,_{z v.Qq ɲ|5BJ"-I JBGIiɅQs.\V$3F_-F*oeQ݆W0MuNa:]u2%>\L()LI EPۑ̴'N 0ޑʔ<f0@h[Ix.eT%;j3Jz^,9Jpp^5^8 Wɍ;2BqGvVb\A|HJ3!>Io)vudʩG Ҭxd7G]]X,Q=сIUTČyumpv?\ e7LIb*7Ō~;zCI _Rdw#vV4op{8e"ro+aKn Cv9z>h/_85͢9vVTedkRWR-8ǹgJ w'U݂$5H+E'[4B4),4P2|eHtbh<s= >UC~Zpѐؓv-# [Uˋn#e`WtFux6.F>v E)l4GU'06U)C3Κ CQmX+Ǻw<*ᮚvRk6cyFbfVVAC9÷ԿxqU3(Wt5 z:٨!WQJνbmLfsCdQ֤IYJbW5٧lTwU,r[6LvJf6ɧ~f$+eXl8ĺi]tq*\5X@\}0vǦhaegp38gMD!B¾BaS80!%t$syEjV/ V ҍF$IS Q6Sѩ隗3zڭGw{o/ƻDl"شU(zn H8Q漉TZX^,_X,yEve8%e<*~؞lj*2ắV#^ueUU᝚3=cN&gU=/N|doRȩW?^>NQ"}!IMesfg+_,FSmƇx:LkOAci:rbHkqD& xR%l@el,)JhLm]e§r* vEgcr1`^W Ck 1A[,NJUVHy˥KAjPcB pˌ : I Y}TY~ Bt&Mn 9J5^p$fzU\ʫ +rmd)fYט=:h%AͶCb%LɁP+P8ULy,e]jڐ ,̄G cŴ#PS7GػCF*[&8s&uh]z-|r)ӣHMի(Xju~ GHt+}]%-ޤ㊰:t k^2r|nn9H ;[D͌J~<%wzb7&XMb oMu++WQݮ\UR9k"h A,?TгΔMLGK][,eP2R{)%;Tw j @Hlmw7!Ni?z= o`^`+'fxѦɥr4]vEE=BOUmU[ˢe̬ 7؋oѕ3':Re[؆1-FYͩ)7|^!NBVdt%_~@WU Ӗ,tNMOt =략6F9A*`LR +yk$ȫ0C&u%]N8j9P[&̈́XaӜqw`xIS|~`%^ΘO0rDRLFՉ$-䆳<+Pv~&Eaes*bR0+I-#TB@9: fTٛAtk*Le6jEˠ la!~"V"mF\ NDnܢ1"$ o!w@WįZDWڭV!aT^Z?1݅޺ p06L[Ds.ʍL[y.@?$)3fpApj敯;PJڌ+ LO0Pٖ: }FSr5J2FXg;y޽] :"'▉UWzɡfŷ\Ϋ⿢2[i:[ێXFy9!ej󸎹<}jk֬+)i&uT,%vG̡j#"YZ-vǜNL;i0E| W&8uiZ,xzN]k7εe5Ϋϋ7#9G9脾~31 bVS&S: 22(jUpr2^Jm2cM)RqiB)J)vh)](-Cqokʇ-3զERnIQa9ċ" cO ,GnKck'Em cn˂%J/Ѐ{_X(x02%PBRI6hYXq!WY8GaPc+hiLhqJR!g蘨}KAE̿kۢ}Bn2l|ԯsz$F_ǚf`s!  eg/[v|tn7s䒱O%o,*7y:eB-$a4$#}-Jeq߱OWPoϯ#ֻ}ԮjFY&zH+T B`BjwUrkUӲ.T l qfKe|5NkIeUr?shsJ2_̖v A 7 6 lsy,Sp"O-|mb`;f"m!2o#uwq-#Ͼsds}gXnd.U40_;g-zVNKzn%5[~ GYMߴ·W8;q,;wanKhCYdl@-cq;̌va=~@<=% bCs^r #EjAJY ܟ#u+*?v Udhኟ"/_A=$ (WZIrK5jT.͝ c:gbhi. j |cec ҅ M=?<$?Hz4B%zTKn+DH{N@@CJ@kgf|=G?&&bpW!aHD7< g16^}뙅׈]9^b9xh~{GERQZ3F> 7qgjehv9dN&YmlĥIA.vu/W¾ouK0fD枆M &5]tۈz` }cŷeY.QapyWߊ՛q|hV鼥-J\p-v;Y/V=DUHZcZ:bրA))SBUm)|dTRlmMbjUE0]:"Elaҵ\]ύFّյ+#XpҝkԨ]`UѦEavv#j. #-9CDפ&Ŧ G9e`RԫH« 퐡ʴÏBɗS_ziVT5/V/#̋?"8\#'F[ E@l~Fl\VEDi\&܃2}+o14<+d0&&aCOh[K(G.@"OahڑX'"r#N2;/[7N^v];"6# wg2ܧ uqPr{72ySGzcx1V Uh( ɱԗTѩ_Ԋɑ?Ս c :UH4Y|Xȇ5z$/ir hHd0.k݊? 9(fo(`㡒GDW_-*I:R|7dx_--۲׫yL{ {~{b"^9V=E+G;Ԯl ޟq}9Ȉ ό0~E_c<:LfVK!wƴxtŋ.lbw DD=h8B`?o]wX$”52[acθuht" 8/w7b;/qy1$[֤?G~>TCu$K@(܇'"wzZu)Yaz$e$qKzR.Dnް[U׫*Q#2VFiYɡnh kB*OzR"FՃr`\U3mEpL>)v=66*ĭBCGm*!3G#"Ct3Y<5 4:^}S.dqǪzںDAaY^>eU*CB񀧍%'clݒĖtbs =/ vn$Ċ)NcQ 㼵I ,Nծ6E6=yG ><>F{wy."nςs3+{ޞV9"X*%sks=?:Ι*Gmcs )-;vy~{txo|zgN NRt:G%:ZaճdI7+MptQ #>;ߊ<GKɦDD'8x7 yhOJsךySȯ8H+B(,6fEQJZ1yjydEǮ%Xtk[[Vl-C/m] XkXU\Ck-SE9`LK$r*QOڶnTMCҙ"q*VM#?OP=}Ќ1yt/:9i+IRJR:{ܻqeE3 vc*VҏֽsJ,A9*%Ըi|x M[}Y8?gZ\roZ:,DTBZx! EM[y2oIv܍<}w=ZSn,NAZ^VZz+]^V%5iO7SywE9p}ZtIkTD\UBd1&kmNȕ,YtSG*F1i0^2QۙgD@0-ѧkΠG"bWNcь-+SciyAfVm>gFD/7{u@*wgyO z7ռ'oE{Dr܉('hrLNx''ރX6"]ܜ7OچPМP /v>4&wv n\&Kэ@t.,ZJe7 y91ŵewNޏ_ȹ1Qth^\/!6q-%tq>]-FeDLExoX][uh-7p>> ?N=]TOV8+!am_ǂ`QYSЋ7R`H"pxn16WnqpH\ڮF@.==N$PQJ5%FNΎQGˤNPƅ&U41%P嚖Jr^'G z8ô֞bE ~PL 8) 6#1 ",E;; 7)߽{%xU,yeN{ & )h)4J/ r}8%%n-n={)._ᨨL9[ػ7qsRsĕ0]FgjHnROVS}WXΖ1\d 5BzaӨti(IՋ;2-2ip鏪~$G~v|5h^S=*4:$U\J;tmlRV (,7F&epåhq(%N5_Q^47wφȠDd~M-^8"wk d1 L H w Cg.\L8Yx@-/p4_ % xN]Mq W: $8TWhN&W5N4o`J430}Qճe {wr̳As(4 wR=LDZA C兜HfTkL-,2y9i7Y7Ƴ \0RdR(Ø 5DduXF5UnMq`S+dS$ThuzBVYm`I۔I'J@¢&8CψP\X0AQHQAHE0H0;{9n7 SXoWSA, _-[Leo ԣoaY@"c`@ {mǪ'ml8ك7rGIݷ~+R"U/҃Vazz;`塪aPJ_G ATQidSsȆŢ)#JS R77 \m@\$HcR _Q,NqD &fCoaG3悇~h&!I(BlTk=YA^[T;wXyIӇ4B!*F]u:r`YPЬCB 1WM1><{F7օmSH&sΌ7^=(,RY 7/豔iOzZ,"{v{y-˜ W bq y@;,cmi1r{;A&'?cb}tD$wT 8 %):ۡy ^[$ x PLAL.M=깯| S۔Dçhrf\A.IheX(WWY +dU8:SHdiL:*)L5,x ԯϝ WBU.>Z4qߥ"VS|N+#qnz !`'&p&8 u"l<AEA=5W'#z⊈A@#BwXr 9 T %8%`b -"'%(4O jF-GO&˵N, f@ 啑aĵz1ZS>M6#C$Z|xdjvaB1`TJ ªZKaKv`.`b^$(-(iBPgr %i-ü:723ylxnmݎwj|zuꮎ|?"Qaޛ'X9g0L璴K#l#ȭ{L9p" ̩I/Aq>7)') W(teNUԔf|Y[ڎ񲚁.qnƴ TEbMLꁉﱧvxݰ%%qK6-uu᥮/EČ LPҼbՈnDi]ۻZZ3Y >Ay릑_|vtlYwJKjU ڒ6jp<;V߶NAd0 ڰ]-v R(fu,wO9}yQ!/!_U^Qlvn`5NlKVMWߐ>U wJ1E NH:uZ58b EILӤ]Lei}JU+Z !UX1Ez]eAW,hN@VFM>GPAHAR0GDIS@B`GP0W`JVQ`WPPE0cHAsvsX'H"([@H%E'(LHPK HTARA^7Ij:A65P]ނ8 @r2< Ta,M1<$ ҫA~AANjAcSe? +f>G~$ Rwb-Y:ő3Rj26b&AEľRK')bHU#Ѷ%Vl0"%eoGĒBti|L->%Tx;fs8ZoJa 0wx-ۙi (`T6˳p՜&,myRI"lmڠ-H.^0|AV3v-((E(.WFfjG`|- *+*X5 XN N Ds2QT6gTT 0yGʐ ETs31'E_PF~*O g016 mwx w^!tRw@H :ʨȼQ/8N5i+zJ SUZve),%$GZ\=%-vYS ~H;n 3-hehUŒE 4g"kMf}M'eE'9C*on/?@5 #4?S17 Dcxos`%:sw}|כw˾J}$4sL} Rp紨hSZJril 6tnE̍wUTP=#5pGt/Zu @v{*'$'(,)P)& %$wb$m)]a51P?XbiL5-KE)8;{ DPf@?xVps)&߿_^ 1M8YUhYbs:H$ݥ HnowVR[f0N刐MQ#Xe qLL:0.DQvz 1yQwlP ߺe=J?%9Us=(|Z=V#P#]f2+`6dUGES9kX7JiD0ezp0 @p `wv84XjL{Áe(!7q\p$f  fJ2œ)@p~bQk4ܛ:ѨX.-WPOLՌS̩ >!>.Q< h=i7BxQljHn#_R.mVfYOvPլ)^P)kkj)]ZV/G!=:LCURIR. %X)J2*PS5&S!*SNu{Qj[a،Pim uzqm;;/V})L:jJk-2;gK)%և*#=R,*̤";&%=ȚNSWnP-lWqBp/rec8#х٢Gd${۞8P I }0 xi59'n0@E.< PF0[~"]O@]{#DN}_gJ',`e?l.XwyMkØ~ޘ,8ZLlZ'pSLŬ4,JeU(#LcM܈_NP`נ0@> sZsN o0Qs_ךW} ׋@] ƐxFh7< + _GMq & ={m LۇTU%NI;;/\/sh꼫.TT*MԺ:DN;@67(<oqʉ(_X(I^N*ѫp_8}:=E4$uCD٢+QP>}$ѡ`Dm _pDQzrhf Q(o y"OD`3yiu"DˢbO$JlM|DQ(F1낵6x$GYJpayyLt9H=Xŭk)Ȇ[Z*M+>@px@202G !)VS$*ŠP " *VBLG_X&kfAk15Cx(^o5m9^5u l4bkFkfQhk񚼦 k齤(WA*hgh/X6I ?G:<=ҩSYsyQx$T\JUMmH!`IԲE 6MVLcf/DBV]0w!B96rpR+EqFF;Gb'pk[ZGbq 2+"UPN<4;<ڛf$vnǰg\|~y*x#j=ni ;=<9i>5Hq/1UYКihyΝwqT#:>p^aW .kȮrH;q抔ȑbgݲ 9jqcc_ p kF|z"-+. r2G&~}~] ٰ =ϔžAW\~w?KV &gm1-bX{)qw~Ƭxу-Zض9]ߛ7o9=x%pތ85؝/w7qK澻 UϳXveZǷh *86&Zf̷ٗkѮe6@KJ*zׂa%e+啖TӮxjy?޿.s g_$c8;*hr<-%A0 $ l֟5 tN -'`T~it>DJhEHk\mau)r.$Y)onE.&Mf5Z, gK,xv=^K,c3 0$cu4}Yy@sωSxfz=˳Ea:9_y}\+ȑz^s Wץ܎`Rx; +4)9|< 7iqk\K[ݼmcPw+70\y_C+U@'Ll'dQ7H2;_ QEB]L[iytrˉ@q: 7OLt>.˲BÔ]Bgp\<3٦\ʹIt֫f16qMzEt}#75+9Ee':ڏZtrJjuΏ*uѬX !iFۅQ,z*sq a6[ AڕR0BQQ[#  )(ݐE:p02ogmiH H7 J} Z}֎"5$|G ̧@z|Fە>y6ed'e+ Ķ0!].\ð&zaѕsm  &=R!*u!a#ze?UMf̶_Hn97h#: ֝9TQ_4(|y,1%Eڭ ͼYnMˎ\XsMS֪ƭZ@1ک^kׅΞ@&|yw1vqY[!q!]F8Ywl[MrVtҜ;Wl}/]^yχ/FL@;p @m(D]eRW GG p(,ĽvLE:8a_}|}pMo==7-n;0[5fePq!mƛ>!^7r#wx~y_s a+8:_beb%P͸{0 j!ђ1 ^D#Gөɢn-SnR3f\X6'3u{/!ɾ-r܇/Bu:Ѯk\c+mϧuV2nr_RrhPPu!󶃬)OjӽZbigg.bT۹օWnW{]:kO'QEXw'[[ҏ=h;MBD1jeoJgei~ )Yhw8w'!)ҫ*Arj,Kv'5Y?O)si?A?hߍD{_Aow{[H~du:MmM߮ڪ՟D{߾B!,{Of}JO?ldm%@݄~4lϤۡ?O'}*”=ow}枧'>_sw;)wܚ-4ѸDُ%F)+ ʏQ4?z@?/}k_hac:JsZ].!ό}v?~I8[m3{}bk:t+7ܻۇSn t$wZWϚ)'=?{4;˺?lI?=kU}b 7"S˳[tu{R8EТ jd?]~ԟG}nVjӁN B0/w0p#oc{(Me=zdN(%|%Wٯs\mMAϮ*@>w?o%51$|Pw:Zv87庺=[-*+oO4okľK Z]˾ӛ+g\*{ϱsl{];9T0{.Т_oSQUJFoaB3C~7+⛋3ʶ?M{SLK¿?G܍ A[.;sُv(]ٻB (r_|>ϽOTlO]Zgt[p7߸j= T;)z7vm2({-_o;~~3tI@~amT]0~_ahӣZggS+nX}-_4wʆrAF|U_2ݿjKϘ?C!PZ>n֒ע}*Fק񘌕:_~thp)<9:jc5w!Qys ڏŎ?+"(OA _ɣn^I84߿Gc紟v{t7 X#໤ѯI9AױKG ?ܥjD7)8kll+"u6.K=M8e9__`?ǿ>S˭kcШ_jWrw w-2rRL/%Py*?KʂHh} riC|.AK~.ZZIY7?-`dTs/7rnǷFv7󄟋Gj'V=ZkcE#2i~`?hhZ}=F/B4Oe/*h8_<'l?}#.w;1ԱtE}G}s#FLGeu]eo?1 Դ{*4(yx r(?T4l~I KZ¥Pﺳ mfڇUŃ~_q:Jm}mU4}{OkYdT.kw e#ukܿwVztpk E5{ۛ[:Ѽs9&_g_f3WV<>܋Xd^.= w_tIot߯PF0 wsQLߣt{'E5qoT߹6o iZ'fc4h8Eq\#s1?Dݗ';ld/U#Z-metg^e>>:gz~Gmm{Oן>L=|ᎮOC/諞Ӿ _)z8t^FeW /ho,l;u:g5?2Mт5l~-A[;7?}8)x {Rc$Q}ܷF>_8etwuzH,>p;+ǑeZZEg?__ч-d~xoaH[ *p?{Guaw_ר[ [.mO[tkp,ߞ=[;Y`Z n7LچkK= 2kwxS{~wȞOO>߄^NN/PsRFwIP<ЄlRqɠj=Z^wjm-Ɨ{~jDOC ˱([m[WJ_?ƝJ6S_bčG:ѣI+G{uġnۮ-hRz[>} / XvqRoOu|~!"/JXoZi[ %އ?}:ڍi]#GZ}Rthck<13*?r8:XmSE0МWOb!_/ z T?? ~?~d~o!/yAAO*x73sNߧg|)'E}\>a>_y*~ug]PJmuբ;׋Z|dK >̯;8G/_'28m})ixy/]qףmi?z ͟#σppwx8>Š}=yЏsNj'^썏}VWﶹwاz$C oLxF!OkI73)C~GBOʙYb^`?}]ܬ?o5E o|'{?/w*5i'o/x~ۻh2 yq6oLuoi=JWf-Qk8M`}Af YH8w_8'Orm1qc-~[B#oW~rn3}5:]ER^b[]TA[&Q/y;טj  @$&}fW48?ہOGz&Q?%=׈lYB{ȏh2qNс_Y_-v)LQD؂-sъ (]!㶞zqmIu5yvb?D2>B6~ : 9BG+G}[:\/#@֠P48TRT`#eQDP6U %{1\\=tghM"L!bBLi@ x:y7QyhHZ&D:BVv6{ Po 2A360mr4 X \n/_:.˳B9 s#j Z"X1) WZ%OHʵC%㡦8&+ӏ&t%-Q 709OEH˲a o8ΛqSyizNl@ p6 EڞCzҷϟ),%Lp3ofhLΝxܵ9gNŷY60+F#$*~2X>LԨ5}'dQqM6(tB^LK4S\ZmeJ3Q2Q{ywikC!y c!Ǎ0~Af>v`e}kĥ%#49S|)tߗ ?}tOBEe}Ӈ{31#zn@mF .\cx:-pĢIDj\Jcb|%=HM B &͙ttQ Wv3NiB2-bϺj~ ~" Ӕ0S)%m9[' 70}䷦ ,-P9gqvcȕ$<Y{<_YM;! 4lE& jYܣ a9wcvjT*o `-61ց`q.ܻRQsr qJ{SD"Z*$"1jhȆ(/!7,=bcܼ"_ cLcJ6#F #ikڨ_" >F>.鱹 Y-]x^.瞞w+8Fϡ L͚8٘T):5(퇳To){7602ygtF $tTQjrtZ.s,.:1NBzQqAڦtUQ?k+ cIc dCm \4I"PQC7߉"{Tam:Gm=s'kolQ~Lj_+|WtU{ #ST众GbI}*_ @,fNN~޹{I~Yb>bEUJ*0PD5hYtmml&_}8N+^:$?&wn&bG87@>![ 86C)9DΑqkP<-yנGq}62@o-7["%n̷ 0NDU%JyBK-@lHIʿF\eC2 W 1X¯d ȂD֤lyDf{FbS(P3EW9^h̐x|hyO>L-l oƄgN7t6L127df\DC5rPKՁeJ)5JggyOTWV9S?' )|8tXSqCvUnbqa8j$tL{Gˆ߮ # 'b̸Ҍ,& ,J%U+G8HimnG75"gU 'II:ɖ͂-x,>y]@ !C%ƕ:ӀUxH-rrUc9j'g`jj83Џ9 Sy?_:R96bHbyd_2bWN/:V9񝈿gS@ $όeޜ ([m)-eߣGXh !`y@x$Kr/,9j+OVy;Q>7l?C%\#O;9T2Ë1MГƆTg2sc9iorRn3J2 ˃-BJ"z|XSqǫǎ@6-Z]n [cwwWOVk((;Fctm@qWRtQ?61KT&ʫ)Suq#\v A&ۅ|]^f#v }3qjoΣmЈy:Rꮱ\~n,`&F [/`;*[2^ $GH-Oa!}3?WEʞW5rbՁw\E9$1bRh0PO`Az, :F`9eBJŹ?WL)4$垤ޔ֏ >Q<JF351U\~V.OQ@D jo )j0]ə5{ǸeOc4KKy_EDJ%Z 1;5넊^!N_n#],ðB9t_0 C 9>C`dUD< 爣y7i{06-FŜ:_X V5 EhaNxT '0F19SsZwX^o4#J ITx6ʗvOѼ?s{ǒplSe0u Y7c85IAK5pVeqw){+E\|eEmh=(j ?J?F#p.3/lU1!=w@f97Et$6~N71/i)F|Zž"OlH/FP1S#b5LU_LMv5KN;F) ;jg72[uO\R$gh'2jn%eonQqZ$݊USr%WlD x/ptF:f,Ԕǿz~"ҡ\i5Pa~")m?Ov7qC$IT$;ڱ..TuatBz,CJ$NJu`Gv"'dIkJ&&Z7V* )DD@c l0Zw՚jM07H$hJSf~b3e _1@ap" VQhG,K8sK~1J?Q'(:,%PuHcM'XѸ9LDs$jHV`䐂Zpg5_q-7~9R- ][l@cÉ@:j i8f8%e8,s eDBH52P 9x̝RZ1FWi kYkd^Pn @;J&F Mv5qb={u ymH88s pgLez9_if)ű:VcFf@¨C]$1O5tH;[C9`¢Bs41HXˡ9*oa\LlOlYQ&<}4[k.̶fJC o~vm|O=Wy z='Rފl|^9ܛ̾T!MnlQW3ON tf!Jʯq`MuTZ rY8z%4NTŮWhs)g-ԍ$˯\粄S$]s.% JENo$d3 # vbe1f3p;3`Z@\C`=OBtKG`(~ce6.d)~ V)HWgԴ:K( }=N8U_ )$tx~8mcov|o޽eb#3T* 1)`zz4 \19,"%(ϴ=Y4`p̀-.Rat^F/~DG29#~1h <dܡļ%LJI^jDzNȁ2ANKU]փ"yTV-NA"ܷ0 !Bz̭6QD[*a+!x9HUh2HZ2VҨU궋QϾ0p4Ouc(@D5TxaoH2[Y1 UZD*E˧F#,u\JX]8 `mO!5/:i|i8Yȴp={\ŋFt(#]K3|4AC՚CmP* Y'A t#VԷw}j:Os!mkLn[lxOfs 7?j1G(~(qj(#A]Zu`sVxmvQ==!ބ^}N.!#i=zau*Zc}Xf|t!I^F}jX{p4=_3:=ٺcxt8VFj{g-|7B&h⳯hYE%w%Ps Ԇ5;`k^+\dtߕ/j!>ή?)6}S<ނF0I6w#~Kdj!-d %>e%)I)w3-_z$sp=1/>/l˒)1Xfݧ>NmSƳgJ$bWb%L:)) FWHJ<3o  @>;@[FOjT yl,?MMnNV^3F@j3;y:+~s8}!P.Y͑bk=kg}a`$YΎUYᙵ ,,YʵL9%^|Kj-.om' 0zP]g'^GWLW>Z;UoMJJwB혩>իrq؃V>^.h<':ʳ=.&?IBTC39Jm xтC[uNRr^K?laIinW` >z3!  2q-)3pgVd,oU cW3V܍Xʶ奐^NX . 3i9!ZR1CҔY6radᾬz:X&|Þha]Q9{.7#oIRUbӝz`ٳp~3n!097ޕW:xC\xIzg3 |}d("Kަ@VXbEڈ?l ҄I0gg&=Nެp~4b0Ac;lǒ*G”G& pljQ_Z JL'0}|8u:j"aڇWTYns i:H  g+J2 uЈHs|=M`alZ;q)>&A9) *hngi*t=jqHFPE#3PK,wt$= `=둇pJA"n?Bp JMuIxQv[^%W RrL0݅k0z3YOWqCj7EWfW1"!nu;d~|H}4|ܝTt.fhɛ /#ƛ3'~?r gJ_fuPlIQ6"hzţט^O~npgҷS,vI{-Hq$4^VS>_-֮Rⵆ!#?#9hH!ˠB8JΡakVt&5G0ñ=Bw3͌XVZdѿSiK`6l,J5#/ȤE8YN 7@/K<}'*l~& Z Q!p?f6w([N"DiIHuλ(% |t*ڲ<4*/vTYL% :'UUI"jĹK ![>2-,=ɞ p''@;Īfaoc0DTݰ{ "f̏nJ4Gؒc}-I@lLiK?:c~jFDA-6 pRM˪bS_K ;nܖ IX.8.="x,O3=w.^_%:1M͍s:h>-LB_Uއb3[}ҧr paf8ξXRbڴaA=Y^v UMFTʢ co'44۟ЁEsntDWwq#ЄC\}ƚm\vҋݯu;muUEF&) tgawxSp?cs S_yc2a@f{v=I6O/5nN ˊ1P]M0N*BTG9խ%bcXfkkd1_\iӾx.\,H~eǯVɣ%KGE]ܽP? IJ̶j%*KHZՅK -ͨQ\stH=^_zAFTmXZF~R7aY=wڍ~dZ9|`mQ 1pgN);JXgC ؓanu|r)YAe~D?<^~v&0G ei cؼ==ͻή6ISҾ9߾S؋\"Y.H0U>x _d]w)QR7-"=Z݁oõX?uDY VbO#gFi|Dl1b: `c[רBNm.cQNm+~ GkuMZ,T1MRZ<^Y#*Kw\O@do^btZhc)5k%nqq{# _;/1;SnuJ\ ]Vw6j,1qcrJz7@:Z+ˤި2>诒lpnl6G7~@uz<^`x!߻<\u? nJ+l$V>@N3Nvúk%V47/q(f ƪ9Ny:zlR+gZszD0ĸ=ak ?7P+;ך xrLovw%t,su$1u%/? F~MK^_ސR{yÂV}d.3qoQU9zbiLD6TEu{S}ou!bu-_P80w'ۯ=:C~5 3iZ\W.uzYP}}ͩ/Œ*'J8Ulc!)e0~T4,Z~oFwKΕ8v}ĕhCA:&jB#,B̯J4|,:Z:}8 3="n? Li7wkq>B~+43/]Q\epx8hX2Z=Y֢HD\J(A/U9^!&HJ !~ C!`vX]ޮW^=XuN_ \%~>:vFDgC"  ;C,9/y䦌RcMGGZwi&閚v @:zQذPtT?6yBKW2[au ]1).+ L>z[X^% jDqς4]ْ,UQJ&\5&_a}SZFs\:6[A$]zN@/Lnru=O 9¿K_F- &>RPm{1AnCH*!j4]`x˅V/Ă#x~Կ{ʘ.e^յpʣ4 04՛@P%1yC j>qn2Kž84-j$Ps\+UVD]se OvI]= lL:j ah"*Z*tPFZMl2*5WR(CNZb?2s3NV֌TCQ5/-N5".v Q@ԝ7]<}HJ߻USZ޺]A-G El}`^u!̲.|7ӓ.ҹA5 kYVv>(kXϯ}EP~ZJ1'љi*9!4axZl^v] A(Ȃ;Mf 4*/PpTO>@n'LL0ޙA|$ ṆkAy_d]eͣclU*Fa `ZDŽMG}]_ 0x](-^,Ci_l^cBʦi ka QѦPjMmMF tS8Ē[5>X5Kz4 z7L I)}mT<`5P{:6W4Ep&EZp`3 jXڦoz Z(u xCrC啨KR[moB"ޔ@!`+8\˃߁Of/wAc[׻Ys6,K8uj-v+eaK{4!Zz&k"nЭuHf=M gv g,;&oQ+ma9y8W&(VO v!4á~5Šm&G1y% 2UfןÎ0 u@Z H@\2ba_cp%mr낥clI]xtOљh;g`i)a.oq,- ub3 E\]O.W_K)|^!ظŊ[!4;D  h#Th U:;VAE*JL(,\j!bN,QU0(Amw$CB" &~P}+hj2"r3jpF+9w$R8 )"㫂wwu.ͣ³n]]Px8 +>qslslE\{Ks,\ 99X\]i"ǍJPnK-'E2,/V~ ߜQ,eHt=|V 3oؓk뗭̞̣֩x͢b)Qp`qϦٓ<ԿaI#Bu=!3\&( 9Z)JAtunczߙ1 !"Q>:i~,dJ|._$5$* Ou7ru\ x<^Vqpk96ZagU'N@ٳ&\>.ocKD"gmrIq A)xx bT 䀶ɰLP%XXN8Vʿ&M @^ hq> CR;`=W(A=`ØB4U+t&7NfPA#mZv: 9jfTT4lS^e6x7ZaI3njЖJobJ>7̑ei}"Ɲt-2Osʫd uC?<QJv[.$dž^@fcsP BTMljG#%$HK?»4J3CGP%v i  '֠1-*Z"AFV$eK?­0# E$ee: aSasC j;8oScJeyYS+n2w cr@_`cE)_CYFAX{{W0 xsvMBWȉēx!yx rmfTD 81B8766sWfe: <$[OtPr(zm/"owisfjh# f59\@3J]c¸\CoQ W ض F~vq|ARj(<;Yʻd5bb<4CWyCTZ[sjeii|m2lA X G=T >fV$˷uiX`KFEd=`G|u En6n;,gsR\EHI|iC> )SWW_dmۤ\hyRksuJ_ K{̮η}!P/xCJlᩈB~~_ojMhaD>$|23&:' e#ǟ0on~ႋCg}3 EbaK?ySzi<١P~iCZkJ^ iR-5 nK} *PLfAx:GgUݭw^MmAdA QK{2;sVr%/ ho,Yjh/Hb\H+,Zb,0xwzjE WV_ug%ʊM7= 4ӂ_LuJSOdb\P<8O^)UJt$d+BH/U{9uɜlokz sT2nX7km]ݞUr\5 N 0֖aY=@,5Wu)ܮ m| ݴ7/V~ XۜhW&S~>╬to`&2.YtSj{c=YEPn4NSWDw{#|)tNKT[zWPmcvi׸%y՗H5ͪE1rIdؒDx_6sL/ < ^+a,A(T&H.zИh#ق[ݾ;URZ-MuFy- ֩])>)TSGe븭gڭs_:.L3)(NȏͳP7ӊcXHf~SPnb؎V5u*9?7fmQfo%53ofd⫳v2…+[:[+3ysEAk)1큦Z%ƃ]VSBa0Y|Nja&WXaKw,)#q VvzO'Y|i6JJ«?ZȘb|t# 齛fՉvy84O*jq^  s3 ! # fGeDCod4.<=MZ|1d4(4lnIt)iPƥ3|կ _G^pYOM3jYbP5ޅ܇@aZmٖ_GMhCn#cL5'{'TBtr:WaٲU$p\a?#vJR]uD#= 2_dºDW7KY350_/O ׬hk y*E|p0˖H,w>R!Y=~{$sY_T-a"=B0v{5XY' O f6d ŗˊI啷.9ǎ>$Rg]/ʑ{ìV=l|ZBGYc#\ș,^|ϙYy(ivs>N?Τ 8 @ yQII&:3]|˟ 9<'gI>NHtR5䦽܃%rb ~.OU'1pIG%kAVBWԒ%k Kب\j! owTAxƓ½aa%9o*Nke:3)K\x)I|/[lѠ*AOp'q/ˇ 8o^N}/\h{*Ϝ_"72u=liҒE;_00Kr4@?8ZT 9ӵ;LVX~ܒxC})l*ŭn[4-}i,\ !GMCt@#V!g̰,KAR*ֈu[;תM\X`dF ds%YB%!ZN%[p&(ݻhݸ7oisz CvtM=l3r4ʱҔ}I$|_GP| D"Pw3s7s-&X3rts,ak06TJxDQAY@AxAEx?ЊGsT-IkZXKi Zf"ϭ1HݷY2xZn Lg/#ʻ*nˢ`.3rW0P)pL&S.W_{VntlhͭqhHR"$NWHKQ"$W5|~ {=Qh2SO6wIs<&U: 15}fj-=*Cq3>[Z^'F'33VN-U?ތ\?SE.-{M, Fjl試U(GJYY> ӢwQhc&A\'=榼*}_C^U*_]"}^^˧c򸵋uf mQȐUBZMk>AUfjmXE$ "r{܌´N'6grM$n`7} <]uj?)p@XN`<:bNp{0")anw`':Ϩv?lG*+5;c0n, ףX{HA uk(WR.o=*2JgŸox' -~gm?;Þg3`|u,Wv% ۺݝ;u},Ff,0 [>48BQ3klMj ceZGFYh7Kq`7d-%SŠQ r\ 3E{;vQ!RAt2@ohtz؏-xDЧ%o LIw5bIXJZm-_v"j%li|4쳹*N>/}ws2F /ۗ7qIwMEvqlkπ_`u35-j%Yrm/o9k#EMTV) O x*E"D+rrhx]O wd{=ߏ\z:?]?/a7B`{e 8;J껤zT}Ej zdȫ/qL+$*ExBWv:Y)y#Vb6֌f|Ufl҇%NE_o[%) KJo:EwaSRsLs݊/:V만AAM鯠RgDRli]1 ^&vwo}9j(%uٱYFv֫Vrb0̀xu1Wt x [/34/?*rxO^@ӕK[ИVA0ZܼK%Żd Z/Q_Z:CqKdVǞ~}M^h c {o8OOz⥟Ncs^Y%S:.:̧NʹmʩbCNmPR7G/uE9I]{œ(ݭؤ['o/=!ό mw~u*SY ğ3"`:? Q)dPy]xFĜzF/ s Nߘ8;2|жRb sr@^y &BMS;Q`A}V4;`ݒ#mNMŋ"q|1'( /; hю mwJ2Wm)ǵ&S_'Źjd`Q܆xn2^f^;G4jM+(QXdZ*0GV5Q>r'F F%Gr84y ] )Wɳ[DNL+B3o]U=Oѥky0QԶD"Z0EIw@d`H] Jrp ȘϘX5Jnܱ)W7Re@A}4L-!m۽7 +vk⫵6Wc$DK1EqB@ >GV"FJԤP%`|(_*SU52Nalt7S\(rޜ"`dTrM3崒QgDҐJd)m@)n%~xJ݈&.ɴ rѦ4B3tt[-(7c~F77B?vj=_2?l| AO=fSarS&J8fUlHJݝ \8L]:e_+ov 9,m+(.^7o^?fLjm.?_9jAgldj T33 Xht@wES!ܩ>@PC6LPFn2B_>0C`DV200fP;_>(Xi{C dx#q9f34x2 4 W;RA.AN=i>Cj)}$@G%][a?&j'$ha3 @`W<{"5>Dkqn$58"b{? 0sCU d$-d~z5ۆsOKZ譙y"|'Q ̧`5v0~|N=pr`7g\},Cc@#nEE>ɮ`QmXJ$aķv[큶O[YͦigZ02F#w[R[$۲<las=/FCPj2sp] $.XtilWU8\ hcYVK`7ۑ&ljyfGx4mNkdڝvxU]aaƮ0Ka6自U8j7_ 6%܆q}4UxZ/&AW b9WS#YJ`.+;mMy:V m\bW}47rVfpGjIVgO>IXCj,]2GpU0$Q-TkPwmg?Sȸ7^E\'*6zt̘ih.>.vmn k% x݋.Yef=eME1iv&qb,zbuD ׁ^$)[rE >ݰa/ ?M;;@߮Ȋ7ԓ;{[ݞ~ۄEPl-֒5<ͩ{BQ9aU5F2IZ_ʦRyMޙ),KUrrZGޡsFih3~Yۨ,.n@_mc%-hʜkúZFNK*  /Ȫ:᭩γ:5nQmNK:jy sac-c#aA(gtD#qF 31PFaLEѺ;l~U :)-K6[aOci^_ӊθiӳ "| -6]2FQX]ΖO|jM&X} .0O}CըΗXeLOmþ1a8gDMi3&bX"V$D˳>pҙhWH`/w}mZGzZKmAJ[VUUam(r3'F#ԟEFkS6+X _%B?!Ay-DjKǔV5nn߅rks_Hwª!~zoUֆ-O+2+/>Z,[VNlglhus bx55o ̧$â`{3B FR 2m-SX,ku_bjC9nʰlɕgI<=%Φ oCIO}dᰵ"U3Jn^d6aE 0uӂo [ ejҜd̘ _F 5ϵl̒QIA"/֚0*)#.B9rڃɴ *YE8gq&Gw N$}ݛ z1תbW.*&aߩ %ʫlg8vƦ+[g ;2@wU-'vCgq(@]Gt8 |fkPP\}+CMwԐhKZ[&6\9vsaN f^ OܿǙ)17>߆xa#97l9b/bz$v1cިo.\0h4zHS[oq@Ј|OB?? S~(-6鞱ͱİ02ֆL.CEV~/.E.δS?TJLdn6b?ѨJ"3v=?Y\eDQhŮVG& $Wrb+|Yȸc qi!G,Sgl`9*yx[ \ U=*_tqj4 6 7,[]{-zCUx^n;c 2s2߱hI:AVK[Y$}Pic<_f*΍ f 2y|5sz)3e}|D@]tQ"o /=fd|>Xye\Gx">Wu5Ld97bc/&ȡxV7_^klZ&Xv#+'JTHyMMv0%XTW 5(KN_g쳌/jѪ5CPtL>D7nZ*I@BQ}{#Jo}etڑO|Y! c"V/ 3+a9ji;h2KTXr'϶9Sw_xaO-!{ݹq6_m]Vٻ >c0P){|K0tF̗gs!+qY[ މ"xRN)MTqL^ K^BoZȷ<LJipPj<:*ձ%]6h!a(' NSo\;$Hl>uXѝFq zczЏS;ߔ5ҩvnO2&Z/Diݏwt˾me'"OxdrďKoƉG~to5l6V#P@9lZ ;Q"n]B)chɮ2A?h`ְkaÃŏ\1c*:\[ݘ>9b? 9<#> ? O@z3p@L #Z;?[B6h ŘTd{ nrĆ $S<-WZ_*N#+:5Eޖ*XTfUOX@[qt U4+zg F oXS_;*Z~L] aMo2?|Y;8a:ged" 3R}zb Ԩ%ȯY[./Ẵ ^]f)%vw%قlrl ξ ƅQ4x{R>nwIL9lV,MKBP,h!Ggҷ`[fHfnѴ]ζdڳot&w-w;z} fx43̱а9cf0!,4x愀 `y,f Eb l]'L1}s<"6mb[S›iܾ`!„;@5nafUꉙf'w%3=-PSdҨZʝG5KrZ[_ ц( d]W{y>bBf჏hiu17&$lίr^Ɋ<Qӡ :x Lj0x eX7!կ9; N綦9xT伢'gťӮY޽QR7o Jam[5xc=5aLB < ^:0 3@?2p3c@#V"=%W)ؖdAj"k.]?$M?0Z#2wFJdIe0'x:\vd8 ÛpPl:z8lLӽGIETio $NCŤFf}miڷkY]kbmDr(|"1>'@D g!'IJ-n:JJ^in21`FiznDGA1cgUgI㱳lg)M5| -4ҔGȇ8F#s}T/&O+Fg4n*ۥڍ~զ,mS-v7B2S!yuvCiDw^Q)e`HGJ;MsHl4Z(O/FW7kbCIF}&ka5%Io/fw).S]{^ _\ÿrcsKgl7 i7mwL:MӼO1cO7NR(a/uE9`J-X_]1Sl8Lh#ٍ$̕V&:Vɝ2/NJU2XqPuU 9`k;9eM9V~Z[ϖш?$mi4h؈,Gy nһ*}{zr)2/zahcls6&_fuÜ9)(+oMV,l JdKY1Q1&HqK}dӟ7ĭ*KwV{ic/ MP ;+*@{Ƨ_-[X ٳ+T_.TzST -JlW8q嘣SiBcLF3$,+͐K|UFj `fi{)Iork'rq=Y^9j; k(懤%mQ[Z{mwI{IStC"'z˱%_ezVN_VzGǾ]a=+e7%z9h_Oӯ\ kw'QbQxZ~eMy(H/z< x0w^N@!d !1Ξ;<Ӫ-x(VߐMD{KJ-GX6QX :5J9`.wA=Pbkj Sϗ+WXֻc+)'kz*7$,@ {qbBq0mQ2C 6gFQgSz :j/TӉMO)x >줇Ӓ e)U ~Dn(P7^ΜAM˙qT}7/#Fp*JNƌ(wt1,~PzAǬ|^ FkS78TX>!8d!]F^U1Խň0=qKeV]`Qnn>ɟcDZPfcEycLm[|JgM$RQDҮR `;BȐ#C/!0tdRHORpW KkWY|J8fs7E,W_eoxDGh{2] G .-eZ&IF`<ߚ:R3;Yv+`dC|q; ]dksƑ!unמj uϔ{#<=a*i',>ػZ.^(_,ny.^qQ{͒C 0)"ɟ9H!7ƦČ 8@\awy.s:S o7azG.>X3SH)t4yT ~T?/ޞ;iSlaEC0Qv_99.7TڀnV^.A@F#cWŔtZ4%5֚NH٤R6xl>J{qGqҌ+ rHC[@h+n%76F50q#71đBbL$c| [Af,8fE3FAYpH eq'$;HG5` >qp܀ p3c@#V"$W-e,bEZ܁mQӶ~ T)M"sg4phْFAٲY%Ce%NKˀ;,e"~ΜL=ٜ6=A-QtE'tCA(%dGpmmږ k8[[u֭I,^V@HP"EP" (<)xG8;p_l`ag5쟥\dOYU a+E2X-^/\ukҟQL,Pח6#ܭC2ܾۙG-}=9يRz\i}m,qV%ՋJˊ:g bv4%mq l˟?AamH  ƁmdcRǝqUf=0]pf{0u׿59G;\l[=r o-dĥ62r*ji_yJmŤ=r_ELoqGtCjj4S-תz2Y-4\+>P"A1,DzQ{6+SF.߸%O|.<8nir^^1st?>6x'v4M(UB;ө3ee3ng+` 䞸v,| Qb`?Ct\ƾCE!k-{! ,b;M>D4 w -'.CE2MoN6Q(+1į.**#yKce[7=A(t2p2}/Vkj)m)k {}喙)Um\:՗)DJ;߰Nn]EZm{ڍvV(K} s~WC0IM~t>N7ss=Bbt((gгȇT#ɅH+( ĿfTbC ݿ==;;-+SABl黹^e K,H fR8:quZ^%**_@O^u٨v/f$jR*C[}72|yEJ2dUXV1+tE4'e0b9rj󱹳YLHIȣ3-X(5i4Ԯyy yʘQKQQ,w6Q]\aOjO3Q#z :ة@r9-Alzz:""|YW;,}V f9pT}T %JcP`w#'qijquOxRq7SPrOY.zAr9 >JSr9tPL0=L>9,D!0gtP\6Ѭ( &QQٴ-D>\,ryC-f =5aO;{¸͘v?cU?2"kӧC/8Z߸SO(R.5$nkzJk$|Czh'zn7-7oB J5]SnjU-f5%}~Ƅ}ϭWXFb 7z23oxE"91B|l"S3N(-f8nP~4q #4uӮ8g+3>F2M.ZH.of" E:I7u5 >J+8L5-:OTMKaTH'\H%%)62j ⎗] ަ1i:I/ ȰzMIһW >OKw{Gw.۳'8Tە{Ky5^mkW&v/w!g'lyfKW7&ueTǸN*/YXnAT*[झgef 8^uO+)`m^OKr2urk*mK#j?e-n"gCf(zg#CYp;9+DAxR)2!S9mYVȩm]Slz̪D y ̓7-5}TJX=Ŋ9QO%dK]1/>q 5%eem4RSx̡}>n9q#< vCekJZn}u܉baz_}/ MNlyw*pIS0L ~Pעf8Q#nloro)hΓ1Ɏa ?8ARx"gC rQr*t /l/ Yfjhل?uId$\:ѻf4D=/c7$(܏qG<񅓜h$SyCLZ'-s sfiVt!r)M< ݟP C҄*aI<0 M}b (]:|:WOzM X.Ӌ)NЏ!IcXxwT χ| c4ýy%`(P?~vX,1#Ep+TبAl0` ϑ]? ^u瀧{_c,ʧ+`rs#  5 VɘP%=` p-2x t[`HVծ`^OZ^z/wDo-?!nUx{Bq>3yGb-@|htmxw= z1C]Cg3 >u;PGψ=hXCA$J_e7icQYrbJ>}@+//Ŷʔ\HM?"]ڲU_!ha|Gz&%qb)Z Hx'AՖAEFC )`nZ^.(BB]˴xhB@uth!>Ш'<ó(^`g,,,%!U+ʋǸ;11HX$ b(b_l3@#U")\M6Pm Mr%hݵ~m/v*&i4"pggpв -d6$%eK^n. ȝSyZm{tSdd6{N=2d4|%қ 8?߶}u]h%U׻]nhʲTDd"(#<"" N?RCZnji(4( XcϘHR/yhX:l' ]H]aIR*!.EvNrbo֩1W;lu9+ѯ/#5#~V(7}3-(LDvVmꕒoVuLH8u@2- t- lBi}ۊk+}KͣVo,⬐>k}c$&8-"wEИ:f)w!PV<Ѿ;>Ĩk딧[Wr3 t 7^mw,<%uerL ˩H.R]Va?RkkYtʡ;}!%} GV@2 ȆA7ZDF $2",|([) [z9Ղ-f쁬cԹk/<1 3iRʉƏ3Kʓi.?1so[:YAbM) hxБB̮;jco 秄 7//B~ڌgkON9}zAN4PWѯ'3"R>ى"b*sS_47GwT+"b4qB*^Gw}bbq*N&Fkm)ju4\K.oa^n&w{T CID 3 P y8-YLUTRSk@l+7ۙejl0GN<-a\dsA=+d8k-$i8ӼÖRKQ݂,0e]M5gJvmI)'QWD41x>N5lj1)q;aBgHZcZٱ4[(ЏN/!L"fzYZclye]Z,!ntnZo"HNN$+ <;8#(>ߩm5iiw>mEkxJٰޣ8[`K7ݧ ouWe<ԋxaq=!k:1&\?ϿW:>oLɽbb+ptW?uyQώcRl`{UN}eW>51Tq20V=[ y(c{xK:4‡sEE] 」 }l^YO H4*f(6xh(P1l`\X̫.SXe>1A1dC3<Q21=7 Ɲ `jCZc,jjqb9wkee줆=@7T-Tot46y|p<(]ɰN(y+'2'oFa·qt7]D8Blj$rfyUb}QP:?1(L?yvtL΍cӷu%ƙFsDwqPK ːqE%+(L+JA<> /GoA_4܈WIm0 +h%xC$`Ira+r=4va7:û:i[a~EdH5G(Tq>XJ )VWUߪcbZj[}9Ci4"@b̘MD Yc`; >pk#p˴v6Sw;)I܁m-+zYI7B!04I$[`ЈS/QyPMq?l+>raA@ts}lϷn\Dk\1РD/*ʚ?9Ge nWGŌ )_Ξ`1c<94Ei\ۉ Q3~2@0 V&"EQu΄"y5kqq c7ѪI,ʇ<->?ygp E48>zRx:aeB찌h;P;C]F!&{c-ule5L`}v[ 2,ndo_nP{8[F7XBQD ӒGp`7ٽiE%݁j6USL45۰MN_?!I_%(#bUPpۺkZmhnVW;P|IEA( @ P@>#'헩9`ܴY f* Zd-m_9|O6`õI93PCPA1 q$ iRT6˷vIe0;n YOKc$ْ%͵#67}i!sYxn"6(nݔe.],f}yUDheA NU;t2;ݡl*`JEjn6`zýz[^ME}^{NC6VFF^X|kM:oz|VbmEP'.uL*Z(xÆlkv2!udQ5"zγe AySvS0G> '0/3s}4h?ɭcpz3۪̽6MU;m{bjs ವ!x(xF_\n|\%g2Ìe{f* I ޿ z 62Wwo| Wm(D`u2}eR|.4;:iuw*1«1ƶA*褂z DU ]SCuWwlJvH;TS9̾Ywɻ_Ӑf؝P+ʹ+̱ 0;]ἆx_s *G)Wq(SAW+L,)R0;L6C$Ov/ADQP/,zX/`PX" ϝ8=Z7^)CWnȏ"\@fLB:b56eL;\b'jh \x-: aqE;J]-&B>sYk:;Fwoi\ir6 1El\'bu%[ozx#sn[pU;{5m`[ Vt/ON :0grO`!UJ8Yx+#:uqˉKܣ_`8~T~f/Ң(fd$A"RZHt/"1u//N# :B.o?}"{%п#ֳIǎeM>GS#$h|omZS=Ɇf4|e T%լ3 ΓtFOYa_vIX/bbzOCPxX :,1ܑ {n." Нir&68 ؼnrTߡæ'MMg܊-%qpFq*^KIM )r|oD4LZ= hS̱{QMzlk3BFAE:;U4y9 ?cXS2%,(͠ !N}|2ʻj><_<3o:Ct<a,M"XiD:eMÞ9虷MHha$qk(8YD:4p112{ӢGљt{.bPZ(À%}k?cx6؋^_|cwV\YwJas{ i{˵Jpbxu`V*;_ľtVW*y3҇Nt(.x5Ԭ~y3nEQO^a ~oaلw.>ADbpi_x.A|^D * ]&r]:rlە~t}KamsOVL߄I=YKcZi.MxKZE#s._qtY˱>kGSm/yBI= iD5#> |U'!@CjЉ6l*M~jդUDgЕb4Idwץ4kKpFע+QV*'%P%o]Ü##T~zġDXQ[GHN~:I. C 12D1JqѣOJ%r<+HJES հ~UX+$FCu9=|I3ZD_G.|mh`Y3@3U i?A#,NeG-Mv;[o/ @_a3(eKsi%_Ҷ&Bޖpn /hwP$ܶWrN2X D%!7o|Tp$ݿmn߹[ ]֭nǒYh,"XD@'$ @ ! zI;=`֙)1&)0[$K-$Ms^i/IT!8~QR9ۛ3ζRR^t5=#11 7i3L]oMg3˳:tܝ;1[h#g' NFwdpN Mq3|e5{Q-l֬Ǜo[GHحy|bu :[z4*˳* _I:.İ[Kj z|RjbTEi (iaSdK+q U4;Ls.,ܗC܋/ n*0AM}X}/F K>^ɀz,חj&UiM595&I5NC٨ӷ$XkFN/d"LɳaiMp,,$k$h%Mq웜9dz+ȦkYE-).-&G18_Þd8=RM:O2j!dNYo,vx9+7 ω/L08q[u!T"%i=l;AW>ʵlm M\O51i]Do m <'B:V݄6T cEB:^;6*!~ZoFAJV^jW j-d"iطѸ~N}TCZ/ӬjfU2Ӏ1.TΊA߂vh4n鶕E軞ٔ)譭RB'(wDQcpFYD=i$kdIc %_bc8}`W2,כG7)t?qKW䚩^+e])7͔_B3R|=hT .Pz%}ꎧ 3tݥ*y}6G~qAm&d^#b\MԂUEmcYKC ;[t-Z}Wӓ*L{{SjS|P8P&D Wv3yI;ׅnHގ4-zO{\6(t*%7Ej;s_}f!ڈhS詜, lJU DŽ^dw@$壪+RYB$崥 /y, pZ]iuqNCk?5Gf[Fi`L+؄dnS֩'>.Lr>G+aFZvZ=eY CD)L]ΗufjtntSVŀDW 0ILՇt&yin{.9cQ Q X=Z꣚Ó)v/4їѼ/'; \ǵNgB*Yx]>؄ښYZ|8k6x%vD 8zLIH4MF#6|~|x,^fzsŘ\4Qp3=D,xRWF)?AO '8zx\?lF͐8P;r|< S%lf7םK3{"ǟEvpd~2͍X"τey˺:M9[\St6nrؼ0۠|ZqqoNJU[+b7#.HOuPq[å]7&Nb ,vmUWչmg3 q02K70=06:5Jks#S'a'3X7u"{\H'_I.$to&D/㝾>%^R]n)m[7dKY** <ȇhL[q| ơ>Lh؞HM2T[i~5R]t)gڧcz75:uctO6U!oa^qx:ÁIjcՇO >яjwtˮEtoznYM.7_ˆ,- CJ>q<:4=&Py"aa./c|HllT+yVLҖ54od~xYa͠ښoKo0qiAQĤ{g(s\;U7 p(?gdQ%X15]PwW,R(k%SsvldƸz9a93T>-\FΎR Qu܌/u9k,ݥ4!*'D$ǦO vL&2)z9(ћT-3J7ؓzxDn!UGnF%mQz2A*:NN~Y1;r#Nq'h[9LpaT+TaJˎn]1mnvQmm{ <)YRl^Z5tPn[5-.d4p gSOE.- 5jVst{)^. "+3 >&htMZ BVw_B,Gudk~-KUzG\pTad*Yo6퍎w%r=VқY|ifpr4 iә,|%m8 fu;/hb(dKfnnkr\/6M[ VŁL=9=AODcu໴}hsk&NyFЧO_Te~/¯߬YVs XzNγpjshqڸٯܷ\ W;>!p`[ˇZ߹Oϴ_8sIWG;?isFϰ-y5:<8fؾiw胶';`Gb! qФG?*銬 ޸C439*RKܢx|6~?͒GUo-eJ:!IGi$l#S)&E.x=X8XzHjCVg9@z=D@#U !iOS nfb\L\WwF|^'N' @O!)<'̈́Hc[vjw[m[8YmuoB2x'D'ʵf&5TR\i r~-&ՑqQ /Mu^T87C=p {cmΦJ I޳RҴ<^װLI]{5׫KuEFM8W޺uLL^nAa9QDLUgj=2&V$M_BwHCrUnǯOc;I.]6]B8Mr&qV $eKmG+':Tv`,-R@c%-Il~5nO#U$jwnC=FhxXOtM7R!PC3icI3-G어rt{]Ҭ<_jyY;u.K)lNc>NjadJ)5 l,~1~^\ AFK"([^Tŷɪ_J77&dئaTlA?YURmǸuqp_I;cn9Gl fmU90+XU1v7[6*!9Fɇ|UtP鉐+"͊5JNj $n瀴ĆME5~VOُՔA{3Jeg(7L,4UNn;.v P=,VJ *IR4aF:;$M}`MJ2XH `,'HQ<9%yxwp`=4 ӎQ[AqvIVC{#39yƮ ](ޟ͒lBwTk"PK#U顖F 쿳OÜÒFܗ_Oj9s{5^7أ2-!SDQʉ/9Zc\rJ"FUb6Eosii(1_TٙQlZo()q8*z)O9uK1 tU M% - ҥva[Iҳ){ekjȨhA%2ӲQIt&yt9oqwZW&+؛}EgK5{43g 2c(p])?m*ꇞiv}kƄl*%<W`+}*pKFcuz~xщ{q{ĪλT(^{6Gd`/udAe,_uCԚQ:2 G&eecl\~L{_V(K܇ ͵[,(c{Z=n\6#M>nPtRnT$bc隌psU.pSosy1M/RY7QAx.>CLďƛ*/uf5M΃ |^|7]ȫ9PkjS_)=NJfxZ5}yp3MmߴbZ{SYJTS*ɉY{x3?їr*.]9ҐUs4ˍw<rVrsgEC[SvVЬΟ<\B?k5Ekj]btD:L- Ώ,a)0E0el8Y+~14IiTjkedz▙Lg]-N;2rԤ2kv.'"Kzz;ͤ J$鼍wzr4VMY0}η `V&"5K]36tI#–R2p8ƈUЃt}4>ViP19:ũ̫s~3ɭ^ݿKBjs$~NbwL(0"`>91Gzs6LjKQ7Up(NӼkI/Xuyw-8v"=(llk ?ĸm#F8D4*h|Vd ,E GF74kzV^)E Ep-)b^^#R#s4qL]ç2H#<9[ ӾTdySH aUF1\u ÖѼ #m6i _qU  Xl`J\oӣ0FՇ#ܷGO/8F: =,wCߺ~fV, =w'ڍn=Its#VFF pV]yB#/3cԸ~ Gr-ZHr7˵砧DpDl%! m?V%F<i!輽ʬ$zmeLk`ɢv,VvdG9N݉gO;hs~C=$ـ!!O(W'g)Շ؅4&d~WoE9T":U<.UDバ?wZS4|au#SAr 'hƴ?#Vvɉu(<59@ϧ:'A9yIHr= s<n$tzE*b\jaA8OOsҞBA+vX]OjM)rͬ=`4%0嶏Ѡ]H(RPa EEZ7\$h:Ho,_W5 Yo&Kq1邺' XC@#U!;ajX.k͊bSxNmuwU303%ߖh\e/|[. 6 Wvo(ٹ%PMlz1EtSD Y|՛ 33pWku/ڵm]鎐ْ,fk-b*JTH@@@   c00X\f$L)JnM"KT8A2g4!vy ٬ؔ3ϝBl=Vw1$13p6eW/g$sz*u*'|AJ@¤q͔j}AUBAm%9IMLib+EjL3k+@CݔnV6}ySO ռGByNrs.ژ*;c^o6)a&{ִ_^vw/dOH {og D8Sӈ3`Hǹr)0_jj*saV=& Jcڞkw^ />O.V1(,8. ~"t|0FqG3eɲ[Nv(ݸJ8+Y4h (&:m7P9{ Fj?q+p]F/V$d{ٟv0N'Xdsa(v3AS2wT7NC.Pi$[6Tt+n2҂/s0e)`?nS|ʖݐ}kzvnx &kTo9}<<-Fo**Cor5݄_"C]^/ԡD7Z/^@3܇GsjT\AR9G}Ҝ.V.#d}( {Zu$5emVw~أX1 pOT`VK~|rv n]}qH $1KRII#}[QE2d ]}㤋\ǜHhi]3W)7rl)jg[etR\0oRA{]]TU4J9ė0?^o% l=En3}=>s ?[zZgEFSj#ûaոuTauy.#ϔo'RaRqcxw^­OfqFoR CߏMAjJ[\-k ~K7[ƒnb65:Oߙ,j>N8.á v$h'ex_[9h.4jS<]:Ty2tCVZzÊBλ cJ`mSiCmR)q1AP:-N67xޠ+߉zLJE>+1g\~RN+B%`ս/2oȤO.&1oTّ@RJa_Gr7gQ7nvk&N\9.q7vho2!cD)*M Myƙٶhb _^I }qm U6tJC^G_s q:R{{!G]8YUW5,C7PEnz׌:tSm}zWs+1eQ7ɱI-kfe=Gy'9E/|7afeUfTŅ&d6f3[LΪ9Lni]qm"+h;%͗gZJ=뤡AY:0_Br~(H-?~7&=ve<1\N3\=P\/qq{U˿{K~>r%v%%Y?)9UJJ(QgJI3g+J'"o_4Y-1W 1 2z܋1,fɱhxҭl>[ bmڙ䴒CM"ɤUyz zH]vj@O'nv]wJٵˌ#8RQZYG"nMpְ kCNWiY568O\DEϷDn"3}lK3]EvU`tސ^B}zN'B ޛ-4Jz9dwmU5Qt: ڶ{d|uY=`=ܻk5Ԍtp6iѦpҔ?gvdauH c|avCk~|L?nɪ .XC`?%2;Jz;nl^yZI(buN]H_`lzzbFH]$}d,L,~%K7J!r#ӡ~#.;-h>T̖sFJ Ll95Dmt&}C>BS4DKKфϢWCDgsΪ5ޱ<ɰZ+ئ`A7#Ԁ FZA{+S f:^E&yٸ(&sL[6=̈ȈL߇?_Q88-'[qXB I{o2> Xo/m(Y'#lF:34/RPf/W#Tnʷ="W9,r豆*9/ܘH&O5 _:ӰoZE&VsUiXM+G+W&9䰒=<b.707 5g>bY-! qeTr!5Rda\zE$ mj2,nenjwiqV1)6/;N"2%ݨ&wHx$s 0mFb>'|P㊢롗b3Ȉt_Q>ڟGc!aŽUFHE@h,>teY4oOkl>ߵѲlXjh*[Bk 5.w]`TpiQalYE*7 \|CxH[{\mOSr7.Klρ0aH/u.avK *yK"g.hw+E$ "1mG$ 8EE$A;+u%Uڀ^^zgTD2$}M]Z19FKuGfUCcֹڕC˃dz{ pm ^88_(0{\Dzkz_Ľa5sͨͺmB3;Xb6( _DRA>_zYv_!:m*s.g624&2y/]oX+9TJ/f L.bSf _2=c{;8(kPHlgeƚ 4SLU.Q1=MAXy5JhfOWY yn*1i)c+~] R:\40;WH|;E#%D%WoR#ɬb9O!39do:Hxi?5/ˑ"}N6nLUEx7Cv=w]hyrBvD z9Xv;fcӇywGvjY#eϓAQRIQzJ,|:t{t=9gTHꚺӱGjEC,̓].]EfMԹ=cLgE/d]>Lq\pHwYJ}/G3}J99ۛ4Ӗ)Sm K9Ep,'%vO+0[TiC *%ڶ9I͚0%S|iPVl4g) ZLޔ6=A𶘴+Y!!8R<ςq Su,ˬTzTUfަ Ą@h&_}g#QYI0LJ?ujigT 5>q[7W#?ϼgbs~RRۨbo%ut)m~dL<a~Ў Ijy'j ߈|r_J֒ SM]7kS =J*%3Pذ2CD|7k 3TsĉCUaA>Cd!SCO6d]8qؑ PxSR^('9Qh@4?+ScbZ a8ΨsIQ*>qQ9\jiAc1*r5OԲ#.cWT , B1EY8m@Y-GC{J8_8gmq6;y_d=Ky/XrViJ ^-AaejjLVQ{?yrd}9~GO@exgM$?GBDf|b2УVXl1똦92e33]ދĊ0T}~'nTn mU0T$;Áe{9/(1RrDo?R y͚v q_COr˄#섕e 6hY^%ek!*Qv^kMi뷸|Qć(䁭wDSSUODɏ_w}Z>W_f`eSx꓾r[g}2pNzv7<:QGj;v1j#Jv}rb)ZCPeNI #c w0XkUx%GZ%K_\ZvA:-"߈*dvȜ\6wMֵа[)%C;rnsw[NP?fpE%u\V<:\̌g_~>x.L20:TIt w&+P'ftimlbvsD<u"j!JhMY"݆ I4,n#~ևiԜ">]U۽7:^t:Y*+T~f7ǒ, L?zR>t'm_|Sɦ:bqֲ&>hNIzvi#Ȯ[ͽj\"J3(pH9=jСAx\`v$mn !$h@x'AlhF).5/mlDgt>mN6I Cq3>LEL~H4~3 蘂/qU ``8^pKͲrk'y$)r2ĝQ[:,~#s$~IcpDqdN\ޮ_}+}4H@'I$5n:_tc㎏tPױ 1ñޮ@U?}Ց3''vs??$̔~'m1 Ic@ QZGv7~LnG0|;_ždvx|?Y"{32nRa)?\H@0e;'5}SwST@c:M0&ZnᏡu 8FЎXG$Qȍ Dr 9qEcǷ[H=m=I#Orgێ5Nw~V: "jS>iH4?LJW2X‹+Q5>I uч R֙JNW0#^d!2W䞡d&ݝF:e$n9m~o&lEpE jޖ(h-a0q<ڭ~,bD4vdqu犵bd"]۴G,)kM^+-fq V z[s]}m!JR]!"E)N 6m:D nqp<Ķc.pK_3-F,1 {=Шg0ղ5 GE׌r=)7 pwUKڼg 5^n1hb@*6Rǃ/(q0b\GluE`IxYc 1+!UAl7(1ENŏgl\vm(L?~y~BMX" ~%@Cd@#eͰ5իz6ePYXlll[V֭;UML}?s, $J$x0_&-Qpvdjcgj(wkd2 &dӈzQCA6L*a$$Y>|)p X }^޽mvyDJn,oZwС‚$ b@,0`q3[Ԙ'=;)snlu\cSQtWco,fwrqksM6Y u )_7~բfu?lT{* 9k5cJ'sxE*V\W9RAaA213 REkut}8# ,]Q5GkqWg00hZ\ S̔,=U<rj[5 7.jAjYUxU^}bP׈ $^fM~<[e~]Ulܥ[KUaBba/Wa6фQ`sS]C6RDI;`K u Zߔ~6K{*űEs{::V\_ Gm' 9eћ5Lj#BVug 4͏po 3`iҨfz;5SN}7=2?ɺ;ncw hBfDzsްgxf7ā ?* ʢj:ovhKEh!nvQ{ferMs-E6a/} SsyUkVy_^]T+WpX;Z#=Kc؀t \^Qgl)n,/%VX[]A x]`ק ^$=|SeOc\Pt>^MOXNngI/ F V.sZlc<SE}/ejQPoOWS>ϵ/^Ü ;oj.ms&d׏i/M64ߚ=su\yjJ8Ch4WL<0Ӕ#Tq'F9Hƴh~|dь,wC.,mR< Ed?|xvը!vt֣wN6* R|j\!m'$A F.Vzѿܕx7WX<*7&WY7ډ4rp^ fۘ<6yK`<{A%E:)6mX^-yYouBzszR\,*'vbP/jE9-}cL(d!яLUoN;_|BL?,&_^Л{31~'wJA:XT>c?L3DWIymDFxq ö)t㢽ðMW77_*bӌ؍v,nS.cWjSY/cZc9eO>S}Gs 8'4zFU~N&UO0);Nb=4#?(zɵ,5;]ۙ9ɝR+g04riCZHQ|jk40&9e> wQ[P#@II񪊋VHmQ $Mѡhu*dmd5&;7=SdG7ί Q=w}wwH2fRzJҝgd/W7&Nw82f`5?h&FS;7@s>-얳Ȧ[p\ E!sv*Z>܇.{*QWlOft=/+'Sߩ^-XAr37ж^~>H5[_ϨNgDC6aAaFrʯE"-^RIi:8*h6%)m2RGQrvؑl!^Ʌ!*!*;#;.jfz t|)ELOY#&j@0*t9de36ǎYrZ#B{ΫVXnTCjMG8B5;o#AIR !j^ISO/ʀP+&;L&GS^G:QҦfG:XVn1Rlj^R~(?%ƻK:t!y0WK>tlPt&Ug3VWk _784#@Y%"k~whXElʜSZ4| J˰[yɸ9=ܽS\%^IɎI56qϩ%nCAt!J3wN`Z%%EIM8P));nq!ДPE/Oᴦdq*(~0@;1c]d'.vJ間RIIpJ$XQjcr#d0-ɈH&A-gҟRkXAmf)9`AsB[>^Z3H\wV3f6(*2_/+f+Ą2=H$>&L懒l'm,Z ?p7?XtcIQ?'%,6g߃wxxb#ꇩ#2[9 [PGZFT2ǎIM56Q%nBЕxR:^=ji$@G RlY:7::?/2w# wm$`w"KUa'pS8~qi0@;1Sg8 [<2|ˬrXxbIw2$azmNEŽVROee;H#`aMy:h{hW$E-:u7갿+G6u8a~#P#a2Df$d=| KmO4__vM:}}v{>I-^"R5O وɑL(&=mdGy&Ocn-GE76e).L}S @uc4P7Hu`(XYC03U i/bC:F}tzHns4o5uYMonj 02F#w K?-YҖ%Ce9%oK*m˰݃wv1z8(ӂLDةDtŲ<>wq! 07w{}d%rvl˒l2af1 `G# E@ <€"#=A^30iD[љC[i4-6˲Cdy+rڪZh$@k@Gtv0kmhJzUcTa'Wҋ{jȳ5"Y'jSϼR ϹVvi4kƜK*i tKu i Ј9ne]EUzѧgh/. 3Y8sTY;0򊩉ApMzx([OWV?ҀVwK#Qѫ:7/ZW9~aU0z f30J ER=@1i\&mpy"TT$j "~$u J ;fa.>AO*6%fr 1 =T.ubPlҜ`*Tu=zAյԡO\ Zn b߃ LYQ{i%Il<QYWyR`ؠC}go*ސd)UM1sJBMxVP+zI&4&Rǰ t<6c캳 oVtOAJm`/c#FG -gg#gJ~6-I.|{ϭ+j $FߞaKOj6brgpKC_-ᔠ `㞹&R(| |IPQ ~XU i/4ã??\N㯾I]QDl؁xRu⧞ fmKJҩFvvCA1nP!EK; ~ J˒1^9\p\w$ė pi{o%'!]VzfplMX DM.7 [ 0ramBM|~1*bQqnƉ%(wV)d/nr@˽9|;V,ӽ<Ym, n!xp7ag2g)3w?}z3斟r_V?KH`KlO`/n{'oRJsysH5ket`ӞnFE"Z{ߗ`gǎ-Q9rL)0Ô+gf:vAXeÛ9M_Bшx->:Ʉ7^.2}_'Y% Ra{c)yO<6DY iV=Ib$?oK˝b_ 9}\o L˵'a[w505{-z9=jSD:Φ97❑uGSFrDhQK&46{uGIG'3f8Ւ-(kSoIfzݥ5['3SeΦ_9V,n[_vZGſ%)دgR$}Sϩu"?}'$pMމ-">C~jYU@0Ppe~i~faﲙEܲ"]P(^`-J|)@I@%"@7\ShS)3q&EEKa\ߞ"t&0 9^3iFeH"#߷{MG8%9O~",ĻfXvBe( d'鷭 g{$b4Xk#T#i79̨,tPאJ6qN+LLl17?:>}pLZ^/GH(:\#oWE82!"Xwҭ5rK /]4Yy!0Ѫ]J8F@ذAJrs.]VbE߀Cz.-?j&a;]ER,B>"sBd<< `:tx3WTn"</QJu:.Dg&bkA6 q_&jq6[ul Ů +nEhaDeXꜼ_8"ϼ(ٮAIuaLy6t}!d}I BIzP3Ek9DZwDPJBvhwγhL-\t|[awί = $.'~ w<'Rˌ*v XYm)%wI;CXrmn\Zy^<'2&w9"3ɋw\o"<syTǰ ]D!uɮߑ)]q&!=8 r->D@#oV !iOS ݎbLmNuwU$hdΠ@ ?oY@XI<߰ҊI%YW׾}gu߯u%̚׻͕ vc,;Ux3Ze,D/SX;fQkI p訰1gLK܅(3D{N:qBBjXZ@&A]7c^7Q-6j6W V3>vCu4;nMg:,͢$ž:kۢHl#z^F +={yOyOfvIjẔf-2;ѯ56ˌ$*^^=ϗ67xYSMv2t F(peq"'.[ N\|93(sM3iLԀo}n"mM)ZʼRn4P ~K y{SN oq % ^F>Oee߄ |s1 W{36Pr٩Gs[4,HQDsn1nfE1 s]r_R$Ў0)E{ &ď43y0 Cbygyl56⌶Ԉ"nai].WslqmTWmSK \x_O4w/Fi~⤼"+2p5bĨ*v;¹/G!;X#Y8?4)kV[pa8ѸQR땑0&-jLգ-7?G6Rd#zжH!^[S۠+OeffdRNE:fȵPiq*;y5,R*X"?,π)xI=.wŽǣ3h 3ELb5j4i`& ag:1R)c6ҹBx'lh<o̟Z ߴ7>3-aփT O,;xWZVL(BX3M02P"lIBR(T UI.B᧻B z#'ζ&x1륞mp.]=@G] Xds7zY+ڐe4Վ) r(82JB+QHNu/KlVgN+m7̡ђ=#=1,= G_?u$o,[+m2|ЪuϐjM[r%@RA8eEzB|ݜ> Oسpű}Zv>")ODR-,AH 툭U:W6+{oZz]/g~M2fk-QTDj *)df?#؏&Q!83.63S hENOONϦݫ'젴S\[Н)y@El)-}&):P~-S5HB5tKoS4&'V?M&ͳs$d&tts0zʵG6yOPt"/£txŇ;-EIuiC3|I}/1-<&2O\WI2{cPI{-C9y6Eಝ յ\":z0g)34 cGt*S{⣱FdˍPV2nEeH "Ϗ`J=Jeψ6EX)Vzڑ3BvIu>y^D(3?kAo w d,0&Ίt{*tOh)TgjS ť{&,s ϲ9i*<:S. 3R`]bwEux/dݯZ,&b ~%]MD?Jg>ȥQQW{3z3Ћ)& GC7!l@ !fO2sC@ZAwYT>7^D8\PL§KPXfuNa$[p5AɈRkP cRಐonoCr.i-IrLu.<wő͒Rr_" SO5{k]`,+W-/AV G"8΀ %V7\0# l'XTh3̏~evAHYzqZ J&&)iqJ3-!ILnX߯"M`$e:/{PERmx21 o浬^TT&E  .B `T܄/B BM]"o`!GDWLe" iUN >u8dTfō9l#oD8$&6a/b<?^ޥX`T_6m‰"Oc)CN/C4{!|(Xd"矑ϟ9@yk_Xg oVq@ ]Y"0?a >{]w⬁!{XCvgOJ TLr^wo?>P&y:"ޅ}|aCt@#V!g촆aհf8*Ų%x^:ުuD`hDΠK 'ɲIZ%x:'TlT^ݴ^@ذGaIn:PWsQt -ضͻQLڥ)2|}f`{}oKcUm--mK~J2b &8$i"E!!snOS9;Z2f9]ME`a+OUj?R~-S%n6k|0cܰ^ݡj(@@eLA7x[?_[🃮irؽ )j^iSfVq݌ȃsjq c,Gak1[Pdlx1#] 'xЭ%(rnݤGS,g?r+xotޏKk{0?.scyoQ@ÝRrҸX0k6j 螯R.ݹFfĔ/Hac1_eSMkvF4OΐYc^{GA{Ɇ4fIcg%y0W^ |ϵKJbcKg:Y2.],wCNO\kU`h" o~g. g"z|pP< |7n2*ZZK %c ўIq 6xD#4(F:p6EVY2|&KF(g!c-I̸_\ȓUyHn@lC-V4# "9|~K+]Wҽkm޿彮.%`ʮ})_.гKn_ź14gfq3$iJ+)(?l100IqRɹ/V1j'@NDum40DilV[Ki!oYm$\V.I| ڀj!<`97 NEVyAXToy&MީMd;oq5UzO\(?橭N]Z5tnp*}TU]S}B|'N19ވb=,wܩ RR#\+4gޠR9خ鋢d?4ʰɗ:^RQ)rwPM.zo$e(1GG g +F:/]z%B!7m!֠O-Un~ƭ4OvDؠ`m0M8aV7zQ][n(ϡ* 0$#.6&JǞ+I rVYV 1C3Gr;!^Y'J啁t%K]k'ӥ QfaHli*VnxV*.V*G2uî}pj* ոPZYjޝQ\"RwQUfB_W D! ;* AVn=Cݻ`o%;5;vKe>>I)@9[ܗT*:MZIHɼ=9'Lg8d&qƨFX2zڡTw2E6[cNYeܑ5f9f qpUڼ~RS`r+IahcJ,jؒ^i*wR=:z'dب(#H ϙYw7j,.~E;*srIaMlJ><|xݟѶi.눡(m$>Qh?\;?".QY|鰭ds^;,)x )ȇ^n hzq xJuTZ' ַ-L8j`vȨ3솮GX}~$w1(Mz`obJ(U0wI) 3r|XiJGF$1^9Y< >8i,IY7J2tf| 챭H[U)TW;]LzjS j tYj1>JLQn5e1WlOiy G+1;iq1gS-%`H;C)%:Y"Ki؁}H!*>!uс$ H\I"h{j 5s[pLV2A/R+os[ qZPD~dX\I,2L]8E0s[koBCt}*)7FG{9NP4[E+e QcF ]G0b-3?ߔX+r}= ?, \PxD14XѢ Uia HOYD͕O3$/'0f2@0 !&O,iZB] I@a-O{ZQ@ĖS]N V|;%0! @e&>`}bsE(h?l)mbJ wxLb)mUj̫Cpӄ =_@k~GL( Svgb,wl9 >)Od: XOƆĈ\r˴ 0o;YB CoC0#oV"Ȭ\  r<٪KmqCխmO?iD? !yl!<ͲL9^Tv׽jsRZf{kf赮浂lӵ-l2JH!y!NJ@fF nm2l5YniB#h@ @g0  У/UP~M=,I=M$40͚NC#>'zj3gcOAAj5KL 6OdI kn$)W<$sȻݵBLg^VV^affU7^uZmNfM .cj5sɞ5B(NP])KA4t+Z:5~\<% #Ux^賦@ 'LIEVAMA'us*,Ri+;śQdv0Ws4zmҧeWV ~*+%ڳ>z Vg{4ȏQX[}U%&|C$ZaWF=ۣƖϝ* q hQbf k|4\6A YtRMx$IG_LՁn7Tgt)ȗ[^A/SCWZy8 4eت<8x?M7Gd/2;(aÍ" / Qma֙Pٯ}9l: [FAHJ-{W\eD3fJ%S,5ِ~ך"8=jOћO]5 +a$upxVو.<,'5YfUDB˸6+EKGg%.a4{la Nd}bU&=d-Ou4sY]'gQ .Z *^N5nvL 38<`MK5Y(4KUT3s^3zPǍ^*IUЄ>!zϚ*)pWo`q|v꺘ծ"x"3#vIr?szk ӅsgHʋSӢ$ nV4FƯ)13m{)l EŜI֘o@wspcFGj7䙻\%ɲv}jE#MVQv߰6vʼn Sb*ՆHiWw<,۝: AoI"Lq;w'-ܝ*iڴp*C1Xmª.uCVxˢx5i[ȁxsϙ1[$sP"HX3w#bˉP{+v8whM|{'6Z>RؒZ(Y۝'~ϩgvY%TǠYVlmM)ѥU}6(%ܧ$O,׵#a.PDУ<>XO1kpSmLPK9^Clw B{/]n3ɧy~ju\,"e`,-y%t Qt$8A'OC)>tWv|}˳ ދ9y3li];Ğϔ^ZL |R?`lJ$q814_ja2p~eJȉw"Z޶Xw{"'舊*cdxuV/"e1uuo"em\WDa&;/Ud ˾)̯ht!>][HF\,$F|a(^sr"!av1xq?DxT]Mt!Jj!,kPL Э:B,%R.NQ`"xfJe,ʈf"]NE52:aMʴo 'N?}93m=LDU>M+ۆ0獶PFOb6*^*#l66Sm}F*"`M-RR^SʨmSS*~lA80j?2Go >s$/G!) J'KLً[ 0BH{F@6۾H!ZAUE߰AT?" eސ4(ec7` G!} ;eK(XVnCn! IR:HVPi|@``Ds@#e'tLʮ!U] )3VzS'@O \`XFd Rڲiɒ,o!Ka.]@rߐr~{uteM7Nؒ9=pTRLPC+ò$M)+8w{kחIlY8>KڲlYK!FQ  (OA E@}s~di=)=SXR ,FEb\EatovΑ=91j 'k,XfЃjks5PyKԋ7=XVoGlFiy4ftXR#A2QMEQ/@u$$q/Mڽ%TzS\]j䠴Zͭo}ָ]x.$:%ڂHl#y|oQ#l; V@I֨ h~ qv"<&%38IJx':hrRϹw9o z􅋨&G?'eہfCF5N!|(5Oź Q}jwO郬Zds߾DUZu l_v|CC r&FW?~ڤ1m{bwJJkf4CAf$VqpI FrlVECS](J'yRf9Zmُ;28-f%/_w_kkxǷ;%ۋ$ڍpNW{-Uϻh?NM:ԗI$YO½^]jR*}J{@!o#k'Umʌol8 BqNCPiƩM<\K9 <+DsL隰C]Wmi:,SyMi*+4Dv<ع"c1TZ+m,S{j5i>#{6t/f{l[mtjlf b+8B'Jp(yZxe4gM%~KVnp'KtUo}ap^ZȘ;iAQvVO;vZiG ^}{lЙ&XJ̥v|Cݮsn?=eRIw/ZRr4`5dVd\mw Ct]{%=0;V[dFۢאd#bvo(!DזRoúԏ4!f ΚpVT%,wS8l80 Z„S"6Fk!Ԑ0_vXc>-kg.#45-x,췭ʦm{ҦڼBl'*aQ|3.`;ely]KLJ1 g;s.6o[ۆydR H߾$c|Kv)EqV\F- .C,b'M) m*:r|D@H*v5 %?1/;Zs*ʚOgg Fif)'ީGR߸|329K1Oڷp.JRL;yR{7+DGGM(bA+ρ)!,S_rZ,mIF*NJQ0vj-*S U4{JJMm{M,<QM~/\t](|+"dt5U;5HZ " QP{V[zL^ʪ;pG?\5dڪ6QK[B_%6cXF&PӗouhyᓳnY;.ӦGC*L< 8o>SL\~ Q+|rϙ$^(Y,1_B_{BqW.758/•jC]+\;FgXv7 'cͧ5Iеxoa?jL>.{޴i=Z2B~U)$Ұ_/ӿ\yW8骺Xv78{>{D@UAł^࡯*v|-:5"#?cu j˃K'*'y:G)#lT(8Eb2_JW8 A`.QYuux= 9UjZIn|,p¸P!8@8,Np D 8?BK( ` RF)UGi ,=aQӀHBB<֝ZHTH+r-g_BL}>tj=lB u4KVSOcN}I8TTʪEOJ\! C[ty:7t e:͡AH . A0cyHLۓϯ H5҉<+\ZD,zXJ1G=3|-O/Sd>La4>wU$U`tXS4%8<" ?wa#6#j/ey/R[0At_ =7v#BT^xM3@3oV i/Adٽm*fG6<Ļmٵݱڈ~(@a3(dese_R" RIiZ]BEy}/ہ. uMm16N idi(ަ D#P޷3wvw\\lA2r@J, I ăQH/  a)$7Zwlej8'-c+)Ufp#uRLKPjMX=$`E],1Λ+yJ} A7it&Ligr/ K[5 V|xj#<[G.gTIap! ܓvMTwK,"g<[e&rAIuZA^C v =U,olt0kKg Z_{-B"( :lkފ*nk}3񰏥*YI^"='Bz V nb˹e!JfFΕ]AntG^5"!ǯ&B][q0KmX8+;_2ק0ᒁ5yX9R+buV 6nۧmOȞ8h_mDe(=T=D74p&ͱ?fmad2FEK-& ҃/]֋s`D1J!-κst8hJVƟr[=WHfޛC cNK:]Wʫ`ˣ]F6+;a.˽Ɲ ?Ժ%*ݣ,K?W71VIn6W)!F*JGJbPiިRjzשNUml6o7i q+R+rJ :ܷfc&&ȟ#۟|BSh(lImfBSs7ސoΠsE;:ͼid/^! uCy; +rQ'^}wW320k\M◳CԎ7m4ݪEJ+s%ɼUaR^D1Sܕ1BMr3 m @:',p(bQ>r<wS€QQ]0.#+aw.V~2ƀ:Vc <휚b ͅp5pDe9aE:skq0V/6&pjܩs_dєH׈chpN^bҵs*b!;GK1 nu}Bap  !>^X/.Bx>plE{G.6ٰ'"~>Rg*1`7 ОeK }`Mel,= ߅^B 8'!}9 t+ti c1崪_wUߧ,;XEYdrwn(8 :c.R&${砼:x'*֗QyWefowWl,V(4Xhj2z/nn5U,aݺE{!7E|s^m(yxG @~8]0\l'+.q/bT+aDQ0>?yɝk'nr锓sd{̾FZnˀhgfh?DN ̌ \f| |Ho4QQr-H`P_ fZNWI؝%~alL#[m[?o!mha4 rdlK9 4KG0U!Q)wh; UdYtB x.xA)z=;Ia/tE6 8 `9,ΰa\tz(/c1/1eܨ j4 W$mAĘ+uP (b_DtcQ{Vrmdg:DxX˝1|/;]pAD-yj3U62.X~M@QğHI}#G"I@W;3iE^.3ߓEϳ'B4W%SIO>StA΋΄@\/?]m303U!ݐ[R$@qǎQ:#9k!~]S'ڴ$)_p/X`dF ȒYR% 2r숓4vy}/ە]%݁G@v:ÏM3=zYSdd. #-%xS%>@Fh ג%wf&gkj9f..x*Pt'0@CL:3Yt SܒsH<2dbjN8Bc(=YBfYWy:0NKDtpf{9G$ݪ؝2j? xz\Ul@d筛{=NvT/Ϩ0є"[WFv9I\~joF9lUI53]bh.rmMlVhB#$맅GYF ׃:1Jj駑w]s} G4{&EUK&?-_%l:ĺNjf]Jd1[߃{/.SneJt; amb&؜暚7>ՉyDȲQ;cJॡԻ*`_b< j!Z\/l8FCN{}yR]54D{_4d[ISDŽ\Rl؁7358&u=tXQRӚ\ڥ~h(Oꅫ]e}a{9"TU z,/ u@Dx踏v_5V#n%  mo L.(%"d\Z3&-TgAxϒD\DRLnmlNQBeҞʠ'5H۳=-dUFQ%Stri:]'q zFM_WˊjwYBu+ kRWxۦdBv}qqkѺcW$3Ň:nskcmX3X{Ԯtw8Sl '[}G8DM#2nfj"Ep%g`" );yA_l㢴_&&'H} =CnʠRq'uAEY;ѱ;!")16#616_ۤZeD HQ3׽~un1S)AWzuRWYb %I8lq[VA-͎{ٚ0&^ 5]qKVY.nRρdG)Rn0_^nbg^%OST9ν[1 X9\VbOS;)#nm5't:,х:ecs1VTHv7&e1]@o}hsճ ":ȿ:U]g(]ݞg4s"Rz^#0"$ iil 8U̵ 5^4 xقױ/tvfWԃQկHF DvKbh{ٞa.}mW #77RRgRU ϑ'aUr4%'S:~+I!Oው͌NuR1ԾVssҜVcj֬N|4wA"]kQB{j;].Lc* MZU@\s.ܒU<I[b͚3g_H.VX gI2 pI3W f#l)ĩx;4Vì9Ȼ/.zrvNydVo?ֈKL3QB9 չa |34^V gRbZ+QYs&˟sMijT1}KKMwښ{eR3+ W@#2 Rf9~GޖqJhBsݔM߄`)gaj_6-W-Jg6QƏŘgR^>S2H]̃H+#3(=cQ㩃vWʍrK̥~+aq>\~!,bp*4bs2/,3pG*<'Sq'{,8S[0}w(N/N 0Nx}&IMD*I#C i涔,ZT@B> g9J{Ʒ57VJ>@ 1&#9Xuen/5'C{ߕ4!zj)cx"G^vNˬu$m-sEWA x=|>GY:ᕼg>?Y7IHe%Nt$Y^BA )D(P"q$8Uǟџ$رq;B[ mE&p#h_W= %[Ausl׍5[WTxY&qW^(:L\ğĹԡI7llC+Qc*f_6wJb/J5WxʂmԋӶ#{)QiԵ+S#Q"%(V/\􇮬 -2 sXҲ:śk}Q52'DPD}C#<딵0>IeE{ἠeDu-M&(yU\ euKs-2r5 CŨ҇]TG51||Rl!6IEG<@߶e4Y()3ggVɣRZ7T+$^X?d `ud\he"Ce]1Z#v/)lF)m7(&X@xvxcrHR>^ra%4!<'^nQVB3הVD (tUeB'sbGlP5V2@3>.djL ö7 JY),v,@]*CA>gHyH8mLr-7eІ` 2@<A21B\ h6R5ߟ?S;ϡϝ{yDַ,76 j8E$*&6 )>Rjpn~HdWv)8=>֗!K#W8OΈ[/9_-C΃fh %z \K=zMp=v(ɟ|fGh</qٵ/ 46zMXH#nrw+qͳN9[DfMP_/Ь@2.ZK@)C@#oV!;am5KvA͊YSUIE:$cWV^F;F$WSҥIe!8 Ͽ{72:18fR/i19YuE2TN͟$bQ*ҡx)yK+aTcϟlcfw!FTb5–+ '?2«AXCp]] V*ϣ%,ksAӋttSi'`ˇw8{͜pvYkjc&שeY棺[,2<*&etu jO~ jD]|yz$qXVkNIMr r4JmK-eaFE=\E컜knꞞjъ{a6%x-cj_ 4`'(Ow>R0҅ [-Z•Y=J;X%vQѩJKc:grlm{{F~u 7Fhci chY w1$0ZZvi3BI.~3bT;yK&H$% g:όDZ l\*A]o#KQjuYSd}Թ=QnB-3BPֵ O6HcL&/i,R26#1,Fb@!_&<\ `M(Cբ6D|z`TuR}<QJAʖKD{p֛x$l-ǘ}܃j45 y z`y' $d# HqgN2%=22ڍف|;":BE:3.*h2aiy(5RK΅5L&4 MB:"IEOZyXB T~mlo-4GX Fu=ƖqzKWQ~ZOZ-md~fr;N.F͛F#$yG,Nᦊ:'7:T9:'~B{k.(T,YVD2CҠRLֈ,H͠ϑ#p`Gt+1NA,o;I9zbNd(|Ydئ洪ֳ: lNϠyζ' LCZ'={Kzt v߆3&p|F'̿ /cPSg35RnuAAaN%R>[i6s 6^]6%_Cgި߸IJK,Yzϕ`4݆_HknytӎYfl&]v |6_e'($pxz$ioo_ޱ,T{p"q' W;pRˣ.1QLЮJߙ~-ڎ%t‹|^ulO*O>Q}V^3vuTX9)ːǰp=rIxz Nbģ 8y$(J(5.?L]z.5R_j9%ū3^I6PGCFM7V909ǟDnVM:CU , NC83_HYdl8O:8\fu3yÛuF{bVLw]":NmLԳ0OKc,ȞCrK8{И8 nk ؽEfT~ɦ+{q:z1 y㮞J}xԾLeVK8{XZ 39-M3$D}X:߹;umD=XBN)z^ s܁4׬5D]W`$6 :zm,uŧ]ym3*$U߂Y4R煘|s"gIm, jpeKf*;$"^^u!#:8) 34zw,zŪTp !to:;  F B0 [(#% { }V!tA gax:]|n k^ރѧI`;huϛҐ1DQJ;U?/p3'NfIȦCËr11`i UXMrr+<Ỉ<}ZP%JP78PتYxFcrhx>1omHw܉ ! pD0Msz $&XXTNQppE6]2o/s5̨᪍!9 q>N!$*OY bޤ 7=LөgVZBvDi@8fkKбXiaX2!Q@.~8Nx5`n ρhO-~jg >ub9I3.;O)Qe[p#)X~`-d'T>V% Y6MjkA( U]{qo $؛mS 5Ńj;#\`t6b ]ñ*e'Up6 502T4@#oeȐ.;"zlĺ?jR ;VO0'g; )1m&Z f{5d~2-hv=t Elу,ҘԸ.z/^P< D2Ww=o}̾Ume+\\w3\YRX^Z @/`"^]\ykxc\j5dfH+CI"ߛ0AU~M>^=S@O'=m;K)fը<]"lYj%^2ִ+4z:9 bk j+,5YC(fʕ>`MG{TZշi%sU<%Q\z*+7)S"UU"]|o&`[Y"+秔)T_V-<*3a|cBxpL27}LEV{-;#e+`>1GVf+ 6D3]|Eu 8:ۮ mwN9-ki8l&hvΞ:,"GYHj(׏YA(5{K*i=Qs[-щ[ρ SS kag[jd(45Qԗ+ AvE?mlQ(3aEfȦ:Sڥ;ŠuozJϡ B_B9iɍ-5fPk{-,d" ;ij{kaX~OH:cr[G_.< #u1>TC2]HzӤѴ09e+k)݌$}Jnĕ&",=>ْXK,=}w[օ:G<~L?x}KFQ Rgp 'SO_7~pkgbFo&mAfq x0$v3dQ]O\9I#V;y4RV?Jz; h<;8<,Ju66m7`FZKol~8\hdERD)Y2HV+Fy-e'YÚ N{W} ?QJv.QLe9/iqU>f=V-I%$򿷎b)wM!]WFf=f2lp#Kls{z>4ͺ-찎;gď0F"8[PkEoo >kҙG6~szoDWG^gI5gݸnG50J)B=p^V~&BxGxV)D,eK}-e桛/|xlE}uQ^]z1G ?c,4} H殽?v 3(l?JYݵMgYt k=/ks2ʥ›-M_h%}] woCQOc*AÞXP'X }%x Ħfz z|Lʏ*,_N&=x8vLP00+ Řdѥ@f䦳we 6xGv'}@$0Rà)F\Vi1iѤ붣TIV=̚vY<Ҽ[x`P2fRz2q ?{RbWJ6-8я[PB%1ÆU茁b5~T-BeE0M?ݣԱ̑ pI!J UNynb=?"]*4L\RA~ʔf!eJ 2=U#[<^T6{V)/- *wZC&r?#4kݢdž')gn.iriW6]75m9y%]JarHQ.oO&/6-i[/ftD+LֆN11;#|xWT Ӈ#M~mvP/"G9|}J{UL7[@78+~AK#GK؈^X3wD.¾>#eZ/Iª,PŊAp  s!q1+E9Di(Zc D;j C{uņ]%R5벢X 0 h+5Oteܨ)+*ߘY0qi"&tixZl*A]e}'r{mji$ H= On <+tj.uT)NO'"=jQǏ 3c:؂I@w § Yټ#D^PtwfV!Yr"6-s Cv0OH:2 (d< E}~5]NV hj~$,NZ\ 2߫+&ՏV!N4O c]I%XcWFs5QAK:>$vkD"/!4A_5ƐيnIa+kO]F'uU4j1AT˭ERkˮJ|ԪTԦ(σۊZCU%~Y )-q>E'($[-mûiUNMpJ]GLE"TgU{鎾;팳gzs^ c̕8Q2<PdThח!hlzX 9jI.[NJDJ%F@ݦUeMb'0v*cG(;.}Ac4h&,-zSXѹQ/CZv_Fs9#1}E]l)%t(t>B5/ZFZ(],:)!ҽX_Z; +9 ՝pj}EwQqAT{qsw*S0#_5e pFWfY ̮%:Y+lF& I+!)d =[$F7+$M[\҆jqk ت[Lb|uxәp ֥X>tt[B0D /;dWVn-h*{m +.wE J~Y:A&صb"7E^[(Q}u[)/#KrS'Tҽ̅0g&io6f4*Ϥ6'O5t8QG'n5> i0)Ο2.XItk<.R1 +4C* ;@?&zn3%u88NTVKjOj~6J?.^Ѥ0B$= *3qI*~T(*@ꘇ6g?>aG"l(%2D261G"͉19syYJ=?aeD kF4k*r}cq?3cRP&hT [[;]-Y|&{@sD,@Ƕjy|Ͼ~6 m8֎-/e!f?wv\7̷Qx4si~x~-Xs*öY40|* N>'=U*@cԾn:܉ח~̷sBG6q[/4[HGyj7T׽Z1:#}Hi滭K4SmeTWp˿alqes8MɎ=L_$KwKQ6p@QX|H^LqYy D0Jɯ}a!yTަ̪|rnR?ͤaSXo{ M"k.hTh +a2ҭ{܈:9j"I \L> nJe VHN?ApEϚCQvpkt ϭe;{NGV.5zm?ݝ,o'6F2K"?%-Yk8)yoRn`%&jݱw\Ӗ7ߕHM ]]uTh]|fV*oӺ +uxG^)EmЈ}tWS֓Y]1rVDej|oQhA=*xw)" Q7¢' y*_Td6@М>S6L@RE:J+HhWE#j2GH%Iaƙjǭ>z2T\M\fl5G. `ߕ|\\F}h\J-Ci*e,>)ƑB>Q1҄HTӠ;~,~wDzq S~h e4R.BRatOٓݢ(@ROl4<)<~V)qq%iJγj+u)E!\ N^!>=#wiVv-EY Q)> "V ZD;V4BWfJo> ~|uPթBVܧjEPE3|qR2OoX#EFş7JW/5EȬ"Ѡr<{^nDT1Z1WI9#˷v.[w#Y>u3',o|VkLCR;?sl ?77=5@[9~έwr{اoD7H##3daqb*kN]3ۇxZ_,b8A=skY7TQ7Y3}L?CB-Y26}MO0> CwւQ#zw՛g(ы^ق芴v#HlWsbuؒ s:4U'jU'*|IH Oᑽ(ް)YN݂F{:yO~F>4f&F/j@ccL=c ZȳaǦ9dqa-̨y~E>6ҋ32v<3wpGΓYUIYKfg):}ÓK9;GWp<V!m/SM}gymKh][P~',tEi1J'VSd 6vU(7]Npi.Fϵb3*L̝ ˼(u(.ԭh͊u`N׭ckj{%Læ;v_n n-}UUU3_Yȩ +THSőf(V4Z_݈˳dć F_ѩ*'&BMX2sqSzRo~A<`??7n*B4JVNg"w<{ ǢsuPHϳXC$V+zegtH5 QUEjk OBBG3A!@sM}U~eC>0py)ё.Sޮ +=vO+UF5oo.~Hwp&z2p2".Շ[drO= U8;<*' {!˨r*YGx̬Zǹ:Է;[8s<~֠Q} 5{Aޔ)&S1fw!!S=<=? oܧKRл~<ތF[GNGPJ9:E}Ffi ?TNbp-Rk~+af9ZBL"lSB4l b/pS6^_rugp3 (a @G&qsR3b[:QCr:BgO ]kc[(EIȦS{K`BW ~W>hZͶYYN[qu1Ѷ!vPUo[0n!R@Ūt& :V: Fo#Z2ÐyCd:`"sr7"i(LwK>-4ڸlF&UbsIjXɗ4ndL@tIJ\&v $,E|"*7[!?Y1Z\3oxEIR)UxwHN \1lLH⾽<]feӁj`1eN%A#C';. ɗwN?r>p׸G/54qx#ԪtWǗTl-#F=?A,H䑥xX%ƜKǎN!L$TO0nMN]:8дW'g3!(]ں6a·kr5]C7BUNS ta#*"$Ԩ2+%fh%w;yZSySzyӽs-^҃\[X4Y^X5ɩ|*|~UVqmoHXFY]iS|\]Nq?AJ}";7,Q0%D) "k,)Oz&,3@XpMo?qm!oKA 0E芾o~:nIӰ  22#֣xɷ?Oc}m6IoPgEoRBol mBm4gioDL?9{IDhG-,v(d7L /<*ŤobQo"ܰKE iѤzAmȫ0j^a3?Ri7ŹZѸV[`f:dBr8gcs:ҁDvxkOcm [ w~: b[wFL $bȵ5]!DQ[(W5(l(7բH)"74%aJs r #Pd+Q/Yj`^Яע AbYqrkA#C) R=k;]&hGٱ֭V Cd@#V!ȪԱƙ-Dշ^ݩjLز@-B Pd&) -;jNȭ#{wܹ_[[6~[l[*ZLnj*pă@/ވ0 @kvƺR0lkVruHM $8.` $ @` \0 %0@|ڧ6IiGLEc%mgq!J#NA cwS.Aaiw:z9={8\J,,NFW#*k5q/쭀kkۓj|ey~46Oo45m$6P+b]S 3&n57BZ'+y^[LBf0WÿzwkjWl{P7 :}om;=b$¹#bQ<$[J#M#?'}lDQHu.y [-w%?t*j4jBS(WVܶDЫܖ9A.r ?,[pã#9uCYxKl[JXTsّ˝Ұ`ùRHIJ4.x#U\h Gƒk)Tzݻѷƞ[U:__uƪg.* @,Ug9 ˴g sCs]U m{,\kikO>]V1Q/ot{;3=_p`\5~]f[w ΪCBD<$`;ESS2_m彎Wg+=kܒ3m o'#&ܸejq00K80Օey*9@Xki"js^zMwxa*~c DA-KqTW'/Ĩ0nFLMw{nN;?ϤpƱ2o탬zxj6h m1Ej)EЍbbqf\œj~ӿ)u@ժeRPnv)wmNZ%OA<į(|'7 6V,jj[5v ]8ܚcP<(WeĎws+ƻ\AC5LFj6&hjUUhg=lC>yjȼ wK^Owb.nmqqDFܚɋjX:!6#mnu^ȟ< .sN .`[.ʏy mUQzD& Bhf$,Z:1;xY[ kSD%称tcAH>mAs1|sy{~YAU~ډ~4-@O`Ċ M[|1JrTQ@66B|>ԥ&œ,ί>;fLF, įTxtZVV13tF )͸95ihNxd_ʢ:6C"n]UH `ݜ>JI4ZNڈv6c12ƣx,y[t,DB4XA{X.ƚc%N>$P9*K3;W4+<# PYgm#eIќ*^y8Ky9]/et^&>cR}L׬㖐ISA:Ewl9Τ:9~6uH,NȝsUB ʏ!_vժo|10jUa産:Jsd[SDH2nZrՀn;' J~ܬZ2]T=+)ԨMr7;6(!X8O]'Cdf5Yj j,ᾅ '0gH₊s Fa]5?`TzScr!O5 ׮a$\eNE9__m֬;Dn5Rܩbs.~Z񭞺?uuGi@TcG u߉4OJsJ}^7mrj*0Njlᅳ7hʣHQhH&4:i2)41׺#@\7gBPu?B'O2z{e2:;_j٦JSw:>Ҍ]PI#bko9Ւ~QwLPdʌm bΗ+&=Sz qY_meD0̼KMKUW0/ШgU LyǺ.X {k- Q뭄7K%ֺܼE2AdK3cD_Oqd:j4mƬm~lbB"X{L+b\~"o>dޑda?ug# Zbb{pN)9Z .4u 4}vv_هc|=n{aHDYJ߸#-whHe—#%H,&:JRN3iaT\/ȜՑ \Y$pD/o# #@دbS;Xrg] Iz(qkͮADFa㢰O`[Xs'NH4 E%tł64!e:<4kZPZv!@%a?_,i] VXTn!DB؂#Kf.E} N퍅xEq l8u;#w{ 펎2gQ*ϷS/fܱ gߐ.i{?Uȹ?pg@0t#6=IuQP&\В0Ӆ  h(" /M!7jċdysm2:YђBI@ |`N^&sT=v͔4Y!>¾"98Τ}r IyA~_es٬)FN+IGrdLKPaV@N\8}hVϰ+!94ƥP#R1CԱJÓGe+(s#JD9NKQ曊JQSM\yt_q&-VRJjUU5zmm[wWM gqꑛ+aMAy~P}|j9;|ޗgm(h3.`O\5fg1c&>__sU(݇84 _ҭb0:{:E|(]b-UvwzM((3z.w;OM$no~ Z5(t4Г}~Mf7ث}}P:x9%qHQObtMw[+{JWQZu`a9*MM[9*=0 Y(!{%Cs BHÄ]q7c`(|SP˫ZH85m{wl4Fjڋ߱ b2WZَ2QQ*[km-U?F\8:Qu7pkOg^X+KaOXıD}W˰nTݽڇ`=I+L>K4:M`nM4,_ݨEz3q_Mqfnݣ oN)€c3uATeHrM Lvkv#8I*$]brS"y K(>m^F܌\ޝ*7z-{؎OW(OfK1̕qOoAn̈W%qt6TڑU( Y{ -b/ "Rg`am̖l|j3ŏLeCgBz9Ea?cp?YO!Q |vJx3tN1fFr!,+7-=ͳ,&砥ʒ4d5 4y2RLTd>˞BNphoD~ Sgj3uTQoh`P^쏎%v$-OBΌv S&ٔmDl=sNϵ/}v#"N'sڋ(ӽX'5r&/ Z' h!@IxRixt?s']5L7)+>bfFY9TƂb&򦘭z|7 ]m4K䇔Fo.zjYrtm_-:469TC]/;'Yji~f¤j &.fG~+Azz~mNsO'ft\mpT,E5吮ie4 7SjmO3׈yHu]#PDjoZ"<&yTX>ًQr(ܜwMaRU?|ne_IKGDs ~\ +Ws(M.jtRkrbvrXrb|>sr椬/V\fȕX)6+Gwx4[Mn-Y`U3\N=&g9ҏdjSR/X.!ҳ0HחnP,ԊέY[9%RWS5=ոܑozD,1cUR(ڋ#!IɵUtqQ2PmHb0 ˶tUSv=BaѬ33GUVWTɛl핋Ö]ggA[eeZKbakދE2aRkA3gˆlfF20A7_kt tg]NKfcY?ӝu|iJ?uIHkd=}>{nOC zTỈn#Y]4DC9r#"_!6u:br"Ռr>9Mr=޿!r>)*-)S秝U*c=1;}"~="5QyWm-=uB,ztji" |1LB%pdMZ}uhjR&fۙq)?$% 6@C̊vQ?jY&2#mQ_iX%Z"^ڍ%F_# &F"aB Ǖ2X"+1Mӥ6Yi6l|j3@;o:X<+΂@-I$A";i xMu=5|XV$`Jo+H Q)O#qRc% \.d"a=P"q% GZ6& >]1 aDp*B趌D#UZmpN$F(CB (Efw 0 vOd[}gB@ӅZxO ?Q )NO~4|!YI 0pVS h䩀~)!'!|d3mx M=*/Ų%Of"H8KyScG*6 ?yꡙ*86e01ef| [VBe3$#!0W(Dx_Kd i<";|&6CO$VgXU?['ۊ #m``_Kl#(]Ґ9&B+5c9% 8ՄO 󙵴@e:c;zF^veVXҜLZOI#q9Mg 8[/XV4ވ ?s @Dg`lhn\kIi4Pwo,a3@#f 杓^$ʺ 1VZq whg*{{ ш@/.$KZ%Np[ےJK8N;*ﻔ]WaKfѣ_3iSmP&KO(PNK0"}{rf$funٻsssw"d2!T5JD_)IA B`➨D“-|님~ 'p4tnPc5'>b-Ѡ516D)jM_ь>A3Ĭ'b=ç^e) LJyI}ƉѝO}rn= SUMi5'y@JOu%Vih'P E\֪ )qE5vCuL}%\ZIe22;Ebg>VeiW0T_V@7ҳHm!2 5#!єv;$jH8G: ' S#N6{tw"*-B@28Y [6SIL>3Z}xhnQ ֯4vl}hfY \cBD) J!5YL{T=$[H~j꯶/b-ssMdI ZLE; \cq;0+C[YgDh4-fdj[Y4乫Bĝ4F* =SIi\Vi~@ɋn_IEXhځgiFn}+z= fnZc+gт[j + JS5~5}R=Ooσ>$xk]Q䳂6 %h1iy,῿(&ÖH+@AUQ2 2f1qt YEF:K$ eV{<#JxHB-%A4Hi`}ᥧ`90'*P%(פ~Bs7OR="|"(GqԊBzWA&?1b1>/ÍQ0jnR-MGI"tsD}`uXYͣ}mA:swԧęi n$t2u47tKA}K0[̝Jj-Gǀ&Jq /vRG>1&6tIc.BK'v:.{<;Y:IV:.˩79IF&"ęzJ28ܔf?VK0ԣGǔNm?dF9FB&`hNUe,[.ǵ84ÔRJQ;}z݂,M2Ƈl:T]t%hx9\X`4!_di_<6yBD3r,ǻxZn0/VȌ2InOӘDqɋS4̬YZnV_onHDŽ#5-Pc)'Gϊ7Oy ouOg2޴ߚx_M #ݫߞı?8VJEw82ƿ`u࣡9“/O}gWƢ*ł.tHk{X3G}.6R(x},k_4۔C0 wf^<*ϧbי[Smú˞N*'ıWCRӊv[,VĈ..QoL"1䗿<ٵ4kL30kd?0j2fP_ZaymGkY,u4\:Cu+uqvnzaJMoгzD| m>L9,(oǯ3qV-aȶ:jݝ:,L/_ߡ~)CY!]*TvsiL ԝ̙ Po)|6!MFc#cvY3q:r4N<| ^ܑEfm [B+FԂ]/*k2>ߍߌ_(E{7%o?f.59;9>:gW\`KmT^(RI21>ӬslI9W]uW߫X"w6W'vޜs$'&H)w ckG<^3(cXS[lTKlD;ۘ^Dn$ us'3.\Em: ܭ/J`]<g4o"Y=h51tKS].7S5 8g̛e/`FݿhC!]Bv6}ہ\@8r_ kw>W1+!I<ӄ@7ug[~^ag78#jZv1X2yC\<7|18'& e^sPhm<)5Uwb W"8wJb>/6A#p)FM -e [DV8?_8Cƹ<d!FCC{0ޒQG&Dp?{CD|ʚ= Qfs]ѹ B$vCeJ?zߕBDd}!(ښQ4R)%SOt sfF(>njwjb`FIq"\8kѷqb0}Ĝ ?)c{ŒlnCQH_4@GZnbN;GC$sQ(i a'A}7:GR7CF459r$ʆ(0QCh _BaD`**[JIqd2 En:\u7I7lZ*q H(AT[M@19t9.KxEި`Ǚ!r*aPX+ӘqjJs54(ԁI^GϝQ#Ttld G>RZII/|Gȇ"KH8U ^7 u$bc5,=D2w s)i}m@{u' q( f/fc@$3i`KD%mqS2%dîS3Sj4_,ѷ%z's9%)u<:rl"۩\/GGskP:O-ۨs? q@ŎyvLyg(/`>p{R#_hHv-!7j^PO1c(#]nK Rw;>I|ir+t #1 {a92ޭS ,_M&4|5\wpyp5}h2U?l!0iᲺ'nGj| =H;ハb%å0쵙Jh_p02mfl6~FA88idrGU,LE޴37d?H'H]t4T5Pߺ:=Fy;I @rh8o^Lz2^<{]#=#/6ֱTk9Zߜ>Ny=$nWzK,pf6|&G2{ Ql ,rUT%k%yu}JCP@i`)QK=@3O2'buGIu+ &@?{F WQ7;4gJ^jEysgJba!%*8Аv(hYhg:lH<2Lzilİᶐ*I1g Ct@#V!g촆ajedPbTdl![u[@`Dh'eJPIoa)d,pm7ZQy]&+sCZ=rLWtBɠ@F,I8@hd n]јݖvKX*"O'_ 9I%9|k@% qW\R9-vqmg lBKF<)ihִKLBa ͳQ6TMٶKNtQmvTVv\J Ee+UjK%niOAmQk>KTXj}Jj+\8鮰!*>ҪgIl0OidsԪԛ fĄKV7?E02M>}vA*ou`wƾy}+/(ҾPXNM]0_k7ޔkVc;VՃT8BYWx_=}/|;o/郰ě} uR mY(VAff.W:3s~_ko&5!=LB R+dh` u ɠ!46WȼDwm5ywvHkCQ*B!Pj}v/ɕJ^q\'8_3NXj2YKlQUa2WV7bhܽ=9gg*gL^SSׂ}&|/f] Q\ Z(O)ZC8Sw#WnF#o#JC#ѓxp)c,1_88ÌRlQ&5Q-LZ3鬅, Sf.tQJT}gd k2Z)d5^-e66Q GgTrkR%ѱI T(X(.oݨG Z\E/F7HNB>`OXc Qh2:=$k1vc5qZnP[E?UZm${2/N7㩿[̒8qf0dߴiK'jU\Llܪ}E>Rޢ9-~ƗߧU>䈑n9NCȀЗ8Y'FێT`Ae P9b5yxU uOFQܴvvQv?G*k$.hW#N'6PU>]Rr7Y.RCO`PiKmޢY S``9ř5J|MEន.xwa3/|-X/7#߰5d'LV!_eĭGI 6V`G 0DzBGW)t%d)dz;-źbE+5q{j+q{%{$͝Ӑp~j9g}~Ej-vfURyLFY >c]-G,fcMN|>[#nݰʓKI#I=B + &Sx_W/HPƌ܄{''x)Y 1&U]L}gB&BOYAC+7Hu[V0#p3jh p7|;l8qW""&D-LўP{cf$GS}vk}Z{hƸ=eay>S> %;^]pr=F. 7`4H] Sj4 K*!XToHۢcb9<W6 1F[ZANf+):z!V52$[=ttNw`e*-{>cγNY])zi만9t\F8=9yeɍ 嗯;O<rqn,8SeB\c^+%ohY5 %Sq6bk\zN|X(JIMθ T}p{h(3,°GTFzƎC֏^>Hy5زnr:3㉫C_CǑ5d*B:q|=4SǴ$)ٜS\ٞ"-O4q?P UQ\W3Ir1BXt6f᷒F}QbTy&GG]8Q6soV5=f}n*]'PR]Q'ŒNe݂>R&5\Y?A&h~s'E@/jugڥp=מmuSdx8^uκ>NZ2}ۍZ|Լ\K':꿨{N~,:pyzYw߭x0VTO9fdy MLr gKy󚠠Jc!-7VZ\l (T 2 @@_+,7fDC^9GP{H ҇${YN' ,#'4 No#~̙KͬɧѸh!GOCP~#i:#rv̀5"=>?;Oc R̖[a:eŋ][6L]p撩T:ϗqmoّRW>/;Z> /NPí ñ?f񈛸\ɣGn8mӥF;M:9Vv߳o;lbtYyRؼH؃P3Xk6AvDuV_v!Sᳩ^'Bٕv]&usgD@8y04ũ.SYTʠ&>Q鿏;YXQHLP{Y9~i>h& L/8ys{ö1Ic7ud2 bwW},<ċn=hΘ[츛̍ѮfC:T"f{Trt3ΟNzo+&"pq<ÙX1LRݰMĹag"\#5b9М]Q.t&(ZN,uqw❉aG ̾cJ$3d0#V"qp$r#1V"8dK'V\jnm@]W$.h$de1Ғ_- N$ea M{ۋrp~eA$jvB#r;}4-)EGtSΠ)ynC(!(0ww^z_}zn-nzۛv[cf3 3"0!  :ߑ'YQؔgX='͋ʔ5`y +j},:uRtU;,-X,<5$KTҔ^Moa ,mGY iPw{Ȓ*Lν*4)6uf<:ژ…/5ebfxvVVKZ'hA&<%H1rZ;[ :lheivM' * 2 iq^Wp.*rLgdz,\w Eûh" E[Yl*]mSl{DQKGfU|6j[;( oսޏA>ijW*B 80 ;% b 3{ ?*ʀ‚")3!_!kv-)a^9z~IwV?]1*wOጷׂ9JkmNհwIޜks"$&S%~YO4FE놳]Yw1kXU?oL]P_~ڤ~81{¼5 wR9}zQNh!fG1"`OOvk#/EFqQF?)lu8G>~t,ĿH|'OBM|3|e Z"{G+7<<S_rTK.q}^&k:{tEpL 4 ;d2Ωx7[~*~TѸK#t(:2 _5s 3rGR)q̦Q t{$c\cŊRb裲2*[Yw=4)m6*v5L5K!xHBKdX,Eِwe"“~F%MtTŖ S$(͒O_OqrLF{N`2Xbo4">A=.ǦOUۛJ8z_K75g ٔk}_'kȺԛ4{;tQ23}$5Q[^۰S}¯lvc|M/jCܧ=lcE )ێwcyXtA<˗7ht_&LCy,&|p3:.ZxL|ˇp-]fl{q a*y=m$k&AAN: _vX:b"ON)wg֒izxN'r:)ϪZJF_4.{|*jPNT?朦ZnY|ع%絛|@;%13jVSǿ}tiN rY(#%%m\'een:_ڴ%#uNA>!z%qj,*̺$&K.{y4fq4Nz\ &PnGdìRr*|C13*/ !囝vr~3=;m~4i5\͟RB3kGJe3X,i Y>iJ@ 6 NljI 8d2}8#\`)e-21O1o3*W?XZXd!X 9iN(+#ln`c?+< **%$q%2lWvl 'dH+[DǕvEwɻ3|eO%ŮFyj?7Ɗvk~1Bq-}*QUJ. GĽ~NyYm]nrJ[jr{nng>NOeG8&xV\)Thfv5IqMvxf&Q\s+B9.{4AKnzL0:=̿)Oqo%1@dѝH<ޱx?V;' q2@?uscXߐDp.<bGbґ  2)YiBXpi)2:nv.7@WU>,9Z_r[kؐ*oۡ172>7ù'}rR+d0 Ad33ܞ0˧#et2C_>N V ג6N|I,h+LVusx>:~,UdXG 4+Ǟ.[P5x!gea}PC<+%/|h1C[3LnwB#[|b1@ 6m=$~%M>B6N?.ɅM ճ%_ Ʈb>40#Uq")YjG w8$KmʤIthKtDIdI#O)-Ul/ lߑr;eSNa-lzt׏ʠLWLڭKTJaSSp@{vRX3[9n]vɱZ8rp1 G@fa/(6>~֌37Y*,ˬ&# 8k<+V<%G(mkE;io1Eu=!uEz %U[%}JFS޻í4}%P oASlbqJEiݼ DryCN.54xxѰ'su%EPŃQ F30=Iਡ1IM{( HDD*'q]έ!H^Z5Yµy(khIM^Zܲ=mĨ.L,݅M#|ʾ(qQS*]0><٥VSpK9<^SJPRC|fo#' ("(^8 uYP.WJr+TeDQ55FqA.-EU܏;wnNdm3R6QaZ4'Vz5zi!U{?m2q  eqmڞQ#0ǩ<:`2ww ȱ!Z~Հ N[\dG5Q-DR2sCȁj jxjMo>n"Y~ ҶeiڭNV2C^̹n &o,.䕎;R $@F-O{ZIiFwL1*4qF`1 Yq e@#lDCQ1=s_OA RqC<5tXxmCcWRO)v Ch*l#AI+Ӱ%_5c>{W_?wiR@q<3=+ zΣ֍c{j{EN'%=?N,=FL#i(uF-Yonݽ.n@PDnξht׀ QdRjD-ZSD YLm{K+F)T%$1T$):#"2فGğorۨOr}ȔoAb =;!(k=`i.=vk;ӜFaKqJ=)vPx㠩Ա(̬9Ra~u ?v:굷zrRorp*1 ;m%i13jlOdSrB[e4ջZeq$=xxB>Ț(8*Op ˂ +0cZ[cRpV!W 't-Nq&Z ކT+E.:A̘,tг(Jگ;zAtU14)5ѱa"2ti$Z^paxS{58c7d><?K Jt#tƱ O1#x/Fl}J*{ޔ#*`h%H_ЍKQpGAvd1޷R8O_Ϧ WtJC0au&E]xNjM̊fWIЅzTNA)1cϖTWxQxۙ _򱰚>xTj_`}fFX̸WC,z~K!h@>mj%=nBt~qT~?os"CQ?mN-t쾏 8>nn>`N_=n!3tZTYt8^ bG}(Cydq]^!!vz|ذ|//ѳR4S!,.]WT{oZNW*+sv%wީuSƩr%dtC@>}{߲/lR?x9y;s'P!>8L/xxs|U/KKq<6y_FІIxeny&:ɸcz, 2^_;$z,hiP3@#oVq")\;n$HP(SR[]Lv6춶OAI>~`mF ٿ-:t: :$wwTL{5;Z)Q]hoֵ__Z%W4.tD҈veP h|)xSfn{w˲Lvi6YfJ3+S g $ z" *C'f~ad/bHsGA(IRuSs)JTʌm ͵*X.eILʬaetxKt^[ZIk3Xޢ[TeP15KeSo?A<&Y 6YEa[t/?1尺Ds˳8m׎-BXk XfgY҈AuWBiXK)>HJ*[ WԸfH?E%fB~mϧzPlQ-exAaS=ŎgFZUYoTr2B Rnč[u8u0GGh#D-At`6t;Dd86v}z N˘H 54| V}9pױ*fj-rO:m#D4L'qq۔p,Ir`cx@s a+iٌlKyQQoM'v#WM.ؓ8VeDyQ͏ _ %Zlj>̰Ft'JW{Mp"rX5t^nqfKIk8*LX$Z̝#Ւj먁 z$.( }vh՗z#hS1!jAGɖ! @S.G1(+%*tWёKЌ|LQ'^2ݹoZb5q埲‰"/5z AO{))5tVz?gMH)r+T;L?&;UWљBS[#0_Pӓĝ#6lW)Xnh#o XVy/jL`g(['قnQ4"Fq+ʟCsJ#RcY gj6n(AOKY5==zQ3P #fW"3x9)!`PTࠣ>٫ ΊpgL{}l?t~iŦ;,:nrwY7;đIA"ݝ92<~ G GGw( +V93gr)Y(^Y V.4 %0R!`qʋVSP:(Wi%̤VsgY>S8$gQW\1&E"3j ~5j! N8섄'È) 5܆5aBZ3"zNsǾ6i/eořE:[\ FA(+CbZЛNSc|)^Ac\izčqVN.Ru~) s7Vy IqEw>EI9]ބtm6Z{h#$ U!$'C!d[ #Br)*HĔz^ShUc#(MSByM駝J~ 9m ic76qͯ^킑"S:oB\N8)&gh*jrԗ(л_4X3t\@'vqy_meBWFb &l{)c^*aϢ({1Z6+CȰl^Uq`uUBr:C+[OA|cͅh4V3vK3kf BBc_ G&McȤ#76Ӹ YȒijsxgXȆ۸</4ɷ/;[;11 C5M5wm+O^Nw!ƿ{P֖"GucDN,a)6X3Xؙ~#Yĉ7~@VӻAۃ8c!۷bSlԈMpxQ [ !6H!.pͻv"N)5sk&2~h 5 Ч.%®\ ĴjwPV<@,Ud2o-E f .w q п6%tJ,tiirYɼ9)o GUu](]@G>E%SA]_#6|( ?1GCaapP&$r>" ȿEnGqvk7I,$Az]|c6-!gD*.0Prrx$b.%dR gE"Ņ= &0kP˅c2eSkc jquK`DsZo Y-)lY8$Q.G){ 5&(KGu쿵A- _.lP;&3l֕ si˟-9ե鍾;k`XSn4f_x zY!@4aBC~F Q[ύ(=8r<<ѣWڅ wȩr)yLp6ϥ{ @0.NmnAW1ρ̇D\ʯkVWҩWVtQu1,Fhe T#zZVY=vU:5-|$QBCP5hs ng8eSNiUTsUr1Vkym a?1VSZq~P^gI|[O_6A=_k֪JC~dwBW>w˷͒>ϓM t#[q%JLqP8,f4J/_MEi V\ H-A74[Da+'0z!5Umi.Z_58&04+MJ#û'E'3ֿ\Jmm9Ӛ6CքΪ} :51 N=_rt_E%H{L  E1J$Hu5=.lucj]05!hFs ^ZIb 4ya9 1 q,<~jx4-.FA|D5O>'z+>Rtۓk_| iO1.<^Jئ#a P|  Cd@#V!{N٧lYm&:Mq&Y-jķuloS~Ӏ)o`3;)!aɒ,C2-{ gw=.P;w!`Ӧg^VdG(7# @kI;,# @{o[۵uұ,%;cݶn[z(B"IQH@!>s E> qF}RmiLD&e3WFVrgZUSCEEiٴ^y:,jo|7Fœ̍^@F3^9,qΛ̒ϗl6(WfYnloi :N%}/w{o항 Ӵ~ 4u 3Y6J%wyFDUŶW1ͭ*klS|ܧ+4:o5OZ[0*֢ii'bm_)/들suk `^lMEP@*/ٲ/Xo-E,)`I `8 ՚ YrYh?y/MϝJqgZ(:yگADR_Mxd=$i)Ϥ#yD{>k^ZC˯ikgeS$Xzn&&;r ]B)4ק6AMٛZU\+Zپ=5s M_* "2t=_|+CG/'k3`cͺUYETxlw`/6ɫ*L$i9=_kͻ5=)$eR7~Ikp߽J7QkU*w{`2ӑU틵QPи0??/cahU3ս#F3 qayIx۔yyR]٭˭Ś3^Hj[;AYɖ.3]ѝ&+a,kH.SitD2u6&u}* >)ay 妑=tvS.aMl/㺕 VղFûwcknՈ$8\3%lm}޶LsŔDc-*fyW{H7r&aqL~ aX}/a gOF,5 X *ǃӚSj Qm* YqКjT8<~iI.O}/bv@iZ}4'! U"}yXM8܊ NL< ETG8Wz_Upupm{f2.Lڲ?4[Ao(`AtXՇ2LOw݃՘)_O&DRʅ4~y2u(_B7]BFGefFj+YtjLQaY91/sAm# V Ь>rxȍ^7Nu?n;bYs,>1m";<sYa 3;;_8.hL\?`*iKtll;j.nZ 5NhVn/z.V:,nWC,f'$|8+-v8q4Uih@Up ZWVh<W*lor@kZ{<vR_l=+ffdT.en )Yߩb( jd]zVңu6h"9ՍVjѱ,LSc%'%U1'N\*+M*vJ5szVnLǛ/ʲQ(-RMG,oQmaRw-r4԰Y:Ehis*A= E9L5,Mj3|g#_ 83O+# cFyE3OvͿUb3n][p86\)C#|m#,ҽ[**87@7ߘЋYpOC,=BDB'e 9_mD*-EWw+P3FꊉJf2ǀ|x~~ ȀyrOu7 zBX)MS?l[6< ̻TPK`oĮwNgS'@PaCѬI>Jȹ*, HV*^V!^:|S1j(WW"5+f:35(aRp`mnq{N"S[Q+V4XI !d:TSn G$K7X9( Oߍ{AW3g{-{ŏ;A@/rzBaRɯOj0}= yMGzLS' HY6lӏ[Abo3|h 74*PhLj4X*J˺.._O*1[ӗYӁ0N aҳ&&,Lq9#oחg(TX9Vu[-\_N#B1+ y,*U.~f:=W^3ujwdHw/rnPC 951V6QEԍFѸBrrZ]ߺT''òsvJ^M~ڽO+)(}cku㶥:?&NZF|l$jsDA@1H9,bbt3gMgz] l8D!j{PmFzklXzgE:vH<~yJ ߐ>Qq(AQ=s{s߃̓Pמ>h=Go'Tb1HrT$uǸiNqg( Jo}rBs$S>'YcZKlxʭS7wk{D6@XvU7I ;h ՒY+ ^/$X vx(ǂ'p|XR C?\[܈MNy.ݵmrNI H4Ke >3HƈEf[QEg\4ƭh"55 ӈIXƴ7[o 2(+-UAX/Qu_vXE;B6D<! ΋?RV}G$QXX_,w y 8YS" - yVK`yK=vY!_غ c&+sX(;p 0`E! ʑdчnj<ׁDԌ!tcbYm7J"oOL{ C4#=0mz(zu@Ȫ8yI.#! HF+kI$;x3g)n?ήءd)20@]D-B(:DQ`Fd9.j;8$Vq ]7XG0Bͫˏs݅GBxqSOLD9\2*{Cv@ 6~8ymnюkޏ{ GҶvoG 5<pz^>8mG1#P]*u>mD㷤m/ه [@@'2F$Mik%>n' M`ى W%@ {R 'K#8#~[[+K0dl_`C<´]ɭ @$LxȸUkE6=%h oh Cntgc*V @5<ѡ܌'ñ;;bBa"FN\XO) tF 9ic)?O 8d@ᜅo L-LCd@#V!{NOTlH9ƊAfF5:o=S~Ӏ)o`3e!1-R`('pI-Y8+!;v\kQ͐^-rl:ӕ (Gٮ2 ih@2لY|?!!#0۷v.cᱭn[F#rqs;q)33F8")g8@8H#NuO8R̚U%%uL $!uurTmh{)6$75AҴV<8ӂd&ZY[1:i$LA~8*öXh+nB(2|uW!M_0C: kl9?PK#ddzE~YD{b ~G₍RcE ֻ6W} v̭)+n;㛰,=/#fF>tY枬̚+*UO3JXRzQ ?WAGP u_*# E&T@#p:YaOWr3HDi2CkxP+S1Vs[,Kv݉Ke]6N Z*$BezJ543D~&moPφw|̏l'W#f{nWw᰿TjyǃvXV[b_*\wt,^|bCIzЁU|lL!=Y m{އ4J7l1I*ؑ8d.;0vjަw[ķ=M^ޭ> <]H/SO8['b8jN'V_fN)'ɨzr5\yMCmm5q(KXߦWhcLRRr_vl2ƹi_ +k\D) 6 |+dpHt/7* *'q w +Y^#ßRnи@l>,'rr^U͋F _K^769u־}4F9 Īl( T{ݪ_ fl5 ~uzENJMchbW\udUPhhN-IgNen:eq6c2uc[;yN4G"I!~\+^G3# k+2XB_3KNAM~,_#59%4?̣ Px5:+X7@ܱm󆇺v>ʝhھһJy!:5Y&U69J w%-%o5߯ǿqL]aOh|)(Û[(-_j>˔C K"R+b}GN0ݺW'w^G>_M~]I$O0kRTTi6;:Pą_FF⋊m6+jfK m^kSc6m`<۪yA p ,}yxH##+H-J &J1uj_)=kc3~>S/ܗ_#0wvѤ];/%rzDQIR"2')jHNuJYasdmYh|W^~5[ΔXZSȟҚ9Hoe9ޖtѤwZDkXAFp5@V$RRqKbЍ՝6ޅpgʹ_Qvwc!.FHrE X^3AVÂhn1s$ILur!KrV(E*zadGe啜R/1PiL+G\9JZm%j^ރд$΢~?H)e5*-KH%ϋ2)78K3bYgiAֈN a;&T^OZ˛[c[UR. ,+7;/QrR30?8k^ y#ڷ97_`?.3iD,VcrrXU`1ɹ)}QP֢#/#yP+k[օDwjwu7W 6hb?ʷ:# mN&⿔Y?{+!U)7]ӂiF9OLcf$vZdH҇xԀQGAJ{<ƌQѺ#oBЭ{GEy)!؊4ZS[i[y4Tvs#}Ƚ(n< E^񢊬HvxͽRS]H 3FV̫(D3|qS ɉI.D6,8i 8ʹϳQJڐ?iXZ;Ba)x9KMT$41_ ͧҝoύzo6пUdLv^uw~JV:dt 4s+9=gpF̸ ^ Κ/_(m{l R_u>u\]%,ͬ!:ɘ5o_>u,!=#f~#吏(֊Jr53@h I&KVp5]6i;;ɍ8Mvc_i|Kt^mFXi7bT V @Gg,]@hBm”?ƶq! O2VE&HFVQ6Zjl kX[UjƎ&w"=ܟO,~ >6p`oeS8;rXf+z&]63\ic>8 ~U ܄nƮna)p}K+zts>SC([>`j~͠ED>nG13Fq7 )V eX9Pb[HGb[u?+NxmswL &}.@z$.*'CCuϾ;H&1 #8܂WEA)!?!⋖9 -y H,?Cze PC෿ S{ |pFC ,9oF Dv\v6D1DAKq_< ,8b#-0킱q @,ERߧp_`P@ @ "  `鐎S\ΨIBB*Wqi<5Lt.[a˓"ieg<VNq5K?2A^Έxb3@#U"'\6l RJ)m.(C춻&ڟʟIthH!C ,&.*w.GZ(r`!ȩ`ӘHW٪鎆tS ~_(%J@hf }^{]]Wvk*tfmcYItʒH "V|G@ €b}E"$|@8_M)DU^`'#'?zS,ê3 (1(siҶZGS+&4W󩠬q,bSPZTۚI=sIdZӦW+ȭT}c$NO ͩWvSKSKfH "JR(dX3=/s5vk: 4yu mYyd]yory9h2{ʡ\&.5dm癕Չޗ<rSs(b͈J%Uӄ(YV]d,7R(^3n-m(a:o0[auF ~լe7ddM >,; ϫ$ %FI,h@W I.REkd*vr5GMfᵎ7?usïjlx MYHNI[{WhwnɌ3-c&'߻˴dgJL5#zZ}>VyRpk**CK_f]/kKK_8 fzaSYjw`(prYs[)o/"iL!15T\4 >8ӢۚU3݇nW2KiRI}"?%-0dLT:p՚(:W#+a4T5Qkzi+4,sQ 6j 3"џYnoA|aDi"G 0zjL~^x糢^qͧg@c*@FhHSs4/«%ԴՆOE1w,z{ЉpJ qSm ?-wUgf|6ӿ؂~Jm)L?)sIدQ;,]Rwx;VcY?uӲbkO7\Զ-M+s }w;gjIxHwG"\4}oI"VrSYs'5&?xxۣF WnBpZs1?x.;*r)LM=Q̥0蘆 -Wk*? (%#J/᧷P,)QH( P9 ƱSxiW^$9gc@\7iTzj3ufL 3q`J0K'x$=,#kux]lzx̤;Lc$3_N XNnׯԅ -4hMMWڬ$P @*$X f +:9zŕ|KgU֚Y(܎[C^bB_FM/[$S~ʼyuK;6Zb7Xjz-g[\;-NZO!)^ۗ?՟ %AWExO7!+Ł|qsfkRN"r(s}1𕧌DVj4YZ+R8?jڤansJc}+?}JJi`omvr!$Q[=mo0sHKCo73FD~]2>ћ/TNDxJds$Ҳlw&8ƘzTTlx P%JNrq|RI1+9~h8#s0ĹB۵%'( kGP.iW=sq\Z߮7AXfJ2zU6"V"gVjRЂ[2šjiǾV%e.\;xbA|y8ެ;F8 kXkr1>$NaIA7!”.DK@n/AF_<\I`9b/Jǎ7:k"=P3mE KC/k޺+P2)T-od}q .t<{z}kH<-\<2?IDeBL?M"PzE%L{[މZWmS{ M k*ժ#;(eCPPtn0j'n#:M0CFr66cCvS]So^Yz?)]D[Qbq,Dmg˱6@%;s61THSGCEGC!4Ǿݷ? .QJc]48k6!VY߽~pf>&W_Q}{K6DC+B )+E/RiBUFܭ_d_!ɲH߃lC ¾NxsL}ҔE=|4BxO0#,Hn0 ͈=:TxĨvpJBE>NvxI8d-SSK`|؄Lqb\܅N" '' 0d`Pi$ \;Әk%RtPCe@TcO¨|[/mD ɬ+a=cb;qG#KbF7, x)8@h:Cu:Ƕ|>|hu͐W`Ekf}8=#p׀iw1^π缎|GZ]*}r6S{T[EO҇&`(@ ej`?,5Z&!bJ>FRk"'u dQKN1G^[x f]Ƃڅ'l䀻SNS\ .S~QZg׻gI/UcSSBkZG⽡eDS[)Ԩ-orWvJ`M(k_ a({FOwSĎSP;;yA԰\9d>J]/BMP E=(ghoH LHOpvZ x*y%]ZZzj7zʶm {vy;\ еg؋S_CIdC,n]lm΃@WgyĈ,Q$;I)ay4Tc>`"PWI a0OBTh[2{l'7ORIjOGO[IӚ OG)_Ig8"Y9+?;Y_dg/'tw.{'١ԧ*$\\3c@3V f9-%$[cmIdYsC ksIzWy->D$ZK]2jGD3M C4J姹=fYQ~33!KsALzRƍd?0, Vw׹&JY5(^5(LıVzj淣tM?R+R4:($U\مL-v sZSa.(5̀U<{˱/_.!DP){ɣvFJDc2kB/49vhWː)cqD5E fc%8÷i"dVUFh9#q&hRz)qUÉe42z^kQu=Xb?V cظ>]<(إuZ>YCjr$}mTF (]4n GovO)L4B`nu8 *(߻xZ~:w*},-¼=2 S$A" 9% <*fֵB)*sZ]i5@EHUQdXUkjk,YqXqnbZ`Z$;-1fe "mFJ v5e)'a(KPғ傲`9;PJhBPRYNƙ1U}GC=Ś/)&f';Y/^-oǕ،~Fl B^+_aơ,A Ka3zv'܍n$Y'7hܜ m^&>HO\<#p:+Te)a`Lx[?{R82n(9_e;dPP9Y~_JNt1,ځfy=FH䯋6l ktޥ/f3V{1(kE>z2ڮYc\laNrxؓ RO!< ߶Mw0VM~~.#lU6}7bպ-W;ct;^ICԤ%M8ϯ/*j4}~NHpe~o/v]Yw6Z2)KUVGB3t}P(*O'Vke#f/ȸkU`V6.ESòI>h)sZ_vS9K*d/G+;d2 ଍cwO2ٜ-8ΊN-Gɝ/)5"Qm[ J81/~dž9Ln-sͳvkCY Ω3g}$ ꌞIvE B?bbaseo5jZ?Gs戽sd!u֜X&,98fV/;'[Jk<54Y[DM63Q)|9ǎs޳OutcoG";D1Q%ǵn?t^Ee֪]*˛*_>FS̐/#aFF~C|Roh@A( q` Q_HGj>2E t X;„x܏-@}_@7ő/C\Gx(g} JVFh8FP/}$ަ9t [|T:#URP䯣.#/hQpK yj2P~mWXGFa-`H\@(4][:A6&[-ڍ8T%,LX3 -l;]%9PJt-f VVQ#lHBm'|#$U \ kAʣ25FfcT!T7dDJSU<[ZVdRxbT~&-D~~g lY-S>) HEg"B8!*=P&D6;SԵ{XƋq $^6JulwjnIT|V}KC8کM7j4"i.-ƳafĖ u.'ͤ`Wxa>z^lxQ)"t:8.uW:H*ZPEN3Q(nk;Nދăv-+=T|Pt }2]@J8K$|*j` Ck5/a=G.KtX ܴh!7EYО;M٧fqGS7:h ]/$unR5YP 7*)N.B|>nx\g70kpn*+3f)c SWeN!EVn+b=W1XV0Vtx]NQ.^|49:`\6\iجEd:@ l=֙!lwʥ"$COE{T([*m'}JM?N\R#vhJ 'NqDwdՋ  U2I+B͋ce<(EtbH(d8[0X,4a!Dd:@ E1bD[1W_t(b6ǰËg3UQm^.W(T*8]{/& ҝJ@Ca@Cc03V!Qq |:WvHI:;[֔ek[%kDhdΠO/I` di,XVj7{ؚg};v߿Vs{UeΘ]ײ1̶cikxIR_<xG@F f ^tI^YFY,tfs680Pπ ?}HAQ'A塆;F|9rI݊@x"diX,h I1VԬ=!5DR{abj1IU0L3Ed%8Q ]g5)e%7Zkdedq $Od5n龘 bMc;XjCS Hx^t!HoNn9 +N빵dfm mq (åyR3u$IB|+l<ͩ <82f7)q= KiIIhO&Џ)flU^s+{)t Yk֠yQqe ZakF[;|;`V얰Ӂ6RSgtg'vyn nZĵC;X0 kTbN:2FY<sZ_0,waJyYmuZUn<-wC+w @Ƒq'4BMX2 ۢ[|\2 Pnwr~#RiItr$)MF2јT;tʛjx!mFySjkc=:n[G<ݢȒ7AA鷱*y F|pQ/*M}WB0;7:VeIŅvX6 ỏ`", -=nV?̠h= Qt0⯑56iJi%,ؕ(]Wyȏ`uV*sjJvecMqg5\+Uʵ}jV%3{slSO=bEd/B/cT|WKaE*+}%>&Vܹ/0VK-MίIњޗ5VLAC%쒷훅,TәxF8ydc["nO%0o9: Wڕg0e(ϵOT7Ch5(è r`q={L|8_[n7ݿ+)Skߔto(U?T(|*n** j6/m_ {%؃UfFqç\=:s t)x10.Aȫ틞fh\3M {)[q?; h׍{^O'({p[NӔW~i/~tec%P? FzB`1͈mGj3>i)_G7أc6Mi=Ei җs ğШmu7lzFZTw نX?x;swH۷sb:ŏmfl?xU4 &]W؝.5/0Lh5Q_k^e/n'kKj>I&}-i[akS29{K[ D|/b^%kKŗ/t|ˀbmu}y9vW]ڶgs',{A??YjJCMKƮc漖_)wn꫘jмӌ)cAK{V=ۉwIBmUznRLiYx3%3QI :@X}!-!T0X_HsVSnj+TH:U7TS埗F%Z}J (#zѸt5th3Z[n;\ [ ĝTP{" CǗ:ZlGfA˦L[ 4ۛ`D`Tڝ!^vc6oRFpԭCŤb^UVW,K,dthiƂ10*)E$e$)bnUBkI6, 1E4vTh,]44[5/HM"@D}Bb9HBdB4%;+uC #xۻbʨQ{4)ip8 ,XzNEWK_EP X/ PIFPm]h/B!Ԁx?b9oܢMU}g{"x.. :'}}"{&;x1"X'406A'7gZ7)D@_,|+&; e+Ys be(MO@Ox5Y3]V&tWD, ^ȏ%j.kI>QDMۃN#eN˫;vn|P[?GC>w9WN);Uz>1aA[>_!ԞbMr+I`HPkܡ\vgzѺqW L@Y'2Pέc򡎗.zTGV5X,q%L;^g`zĔ[q8wHv'QW2)A6kBا@pls=8/` @3@3U i/6[ ]5;Zl'mmҶvv֏/`XFd 6 (%mB$YԄ&d[Impvwvp (CwPCeNO/ӫ8 HNtJ|7;F{{ֶBNB"(:n_nAyG-FulI:ͦp#NA;cɡmR`w$'=͢`v^t?T)mB{1Kڥrqk" kqmidAW5spQ]z vfr9mY|Kr !?\[%T<*q=GncI;?Q8a#՚0Op"9鋫wZ -J[҅%2vqemᵉ^B0r4=mDs 0TSMsBG'E'jFuLu-mp+IjrMi:L(vTqcv/g8 ҶL(1ty4B>Eѭm)lZ8,i[ysqlqt]yubwۛ-_gL:wȔs8V[ՏJS`3'ܸDٍDE9O*JʑFGjQ{dBޘz^R,iJ~¹U'jj6ax\*0KQK'ʰKIcK/ilq^7YkA?Ӱٻ;҄GWvB=p^M^%;E Sk>T40UֆKbo6ɟkVv[m(So`b[J|YHMU॔ mֹҷ;Ly/c$l$ |fj NBlIAUmy}~h(_OVPemjyvg?4Sf0JEzɞ:{`Ԛ{0REρ*WuVVcuTF49صoYUE2 hIdsS8@ŁL r!%v*(}!>u/^IoZ5a.wB7 ^uk]nD "xy_V?DQ.o@$VjZ'tqJ 7&zp\*JmPӭx2\h!;#d>;oT4&ѣY _rM4y8,/ 5lwy[m'̼i ")UbI˖ks@nNOnHLksZjtsE|V™\Q#szٺ,S}񓿁ݕoǜ+ޏU4E=tqZtj̊,FVwkԵ8l2|lC{ zo7;ey4p>Î|ǣxj`_8OlMM(*pzCLS.r,@kK󭹋z!Cں% ˼j^R>"OCm.oCD9s!tlNzÞm/p.~C-TTۘĞk17ֈZ{WݼXrM?pҗ\ω0%&tKc<gsh&OywZF0:ZU(SXK)& -}Q(uUh'ӘsP>u{s=Ÿ{E:n[K )x)aΝW};E]]\{/e^'< =:7 VeTSe\2ń:2ua/}e$."qeF48wǴ;~ exТC֐q~R mqsomyW`cy̳h`Uj2jHQB1TH蔹+4icF]FSkQrxpQpzccK'fZ%)-~xu(֥J=z"f=pb?(/lP\i2TЬ]LCK;bm Ss/ [G`{b^f4VtKr9BsLhfȘ$ѓj~Ͼ?lVkg]KQHt#8ݕŇk JV ڷ/*QۊQ9|)'"E&Z}dTfkJv+rf[ . lA7ysm0Baf_Lz|zY.aʥ5]vk+=6pOj/Q#2I`KF[cܥ*~10(ksDߟ>5t_]|n_:rE6vK}P߈ 01ehGA/7ꕍz'eDMBNif -,ƴ!"&li.%)#zlZm<kxue[.?uQ%Q\TRn;d$s1 e3Řq aB&q'?c ~9 .3I6DѬ׎IɄִu2,L {gAt|L3iT=>mUgdhЬP+ AB"|T6a!IDZ5 *y;=C&_ @$^X^qͥEMc%ŨByP:+K[<\y]LAGV lHl0I3ۯj}mUKV36lVXp 2Yۘز$Xp. ~` ny͜U!Ƴ~Od6k ,LdSb^JqyBħrf \US!L٭dqV52 ԓ7ZpD0f|UݛzޢMQC e  Z6n>;h…g /H0wuM3yT:nb7X$,=Mfެu|lњZip\ ukVte;+MfD^3J;o2J$wNHRn|WΒM98Q\r"mɮʙėn\x~_`qX 7 ĕkUm8H8D}@D@#U0!3ttbnl(Wu-b㮳n'[u[ݝgUg@g O@XFf $ɞ5@I`ZٍKY{lvwci1WXvʽ㶳-Ռ^[-3]!l֑5g~Ho= 3F4PmYvv-eUeG̴!*@` A.uk`G&ė#aפBh paoM̶ؐ4 O©2z$̧WI4ChWó%-\"Mj R5Xy-_=F(Dj}"ؓ uQ \|g!H X=Y}h*50&[$PG&g.֥J %SKUF{OZ]NScLJR."TROs+ry4MڬVs {hrE;L""ɢHX73 O;[΀7Gx\Q"C[ R1%5>\zLL$ ~("# 듍ϢeeAPUCۉzsB}Ef/=_3CdKkiaL]SWO].w\]vf*h{\oD 2M1* UHzTUͯWamAU.)t8w?۩2sRO]ܶٿSz|w/-@U%zĪգ*KM_FWlU՗"˅)b\+YVOl.͐͸t:%W?vFtg|3a0E-&?ȱLm8puh[$j 65F1sd?尿$%{u୽^1 8ؾ"i4=2W.\no0/6+li6YסYڟt][LWZ}ǶaSIV\Iw5 !@b< :.A>ba}_z6+ EVEZO_ ۱3׾&&' uB~3ѥSD_2E݉?cK?c:*gP:GoDRMw=U .B:O9B2#z B#ظwPaLyNw׹B'ҰCըb-т_IX35/0JRpMal6c!JIkn"F;:.Qhq^Fw: ˘gMu[آlwI'U#q;)ݾϨZeTaxĹ.$˷Ft (!ˏXW%6OZ(!@^:ʘƱ cKyͻݒ&Q0G#vUUrUZ--ZdIE UhxSZ>Z.@UW_^#TBè *k &B͟8>ELD/^nLkj1! W]K//+ôXEm}ǟ *bKw`uS%tɕҷJ[ܧnLyVMxWLFիUv9ܕYD*ET>AReIb0zΑBL~8,Psܟ#h s҆} B6 DScޔ+gޛ7NK:zF]JT}&=*WJi,A^lD{䋢ꒋ &Bp\/ܮSOp91:oYvnWyҳ<\R@\) Η}j?!ik5^p19% 0%ve|f׆B .]}^F VnRv~?s/׊^Sw(:<`;TɢqMu608g㪍p8iFk*J-%ɡh-b䉐}-tN'/_7 DRCy~]P՜jS %} M9Tr2Z.g;b'8KYfH!O;8v{ u 55.*ɱ;6UkN:1BsCBjM[.>,[e{<XAbGSFj;~?XOՒv)Yx pGQUŕ"xRPb'qٟfWcRRye#Rߢ-n*rRlh]N)Y& ~.JC+ jEvO(T)jcomwU5kea=Z=p9wcݙ|dSֳC\oTgz:)P{l3 ;JJ^Q~.K@~p͘Yi`&KY3f-sA6nܡݾu%bc_);L̕5GW ݿ,cE Xu?y[BO:DSEM=Qo\wf*na`h|U{>_9#t}xHzWNK>|#j7QF+&Ƚ9VhfNo+vh=8d$=Ҍ `$-$#6op&I3?`<$mА$_ΑW)5c]@exkC[Mę['fn0} &HԃCAK.N#"W~C(6yH@QYmx=/cO;RaX"{gcoxiǾٮ=RԪkH-=SLx@,^A),?DI;xxz ~I>|ЧyJ$0`a-voO;P1@& pPJy lͯĖ{*]=j:6`*NE{4XpPp"NŝGEI>laov jpqc>%7)eLufu.ѸO+䂑kt| \:;Kg`+s.\4}ۀXɓ[+֗AL[nxmq|֠$qBqqɳIq}բl|T[\=@rb1wcq=G(8N4퀒U<~)_<@3@3U i/16[ ]5;ZlgmnjmҮ햹~DFС%IdvHIV+/ܮ[M^-{IV{{U)2^񮯲6Si5Y؅~ь@ ݽu^Yʲd‹et[V-@2XB"@$P H!GH|Uc d1[\3vz+ M9Ş6["3-Y%a(6Η' T!6\fI ^Vh-P[s%?cr XmOY f%fTӬ>Ɯw}xl4{K|[]Q~uEsD8(vqrmlq6,VFbDIPH{ 6ȠTy$j !ES }UtHQ'݆$G.d EA; 48 XstCɍ#I%R7nSVljLZqlb_]4]c0ܲ$.r}bO5VbHO١̄dkja5"řefx%Yp7b~7:h0&1q5Kin7(, z%@وU\53oūV ۺ#]D7f&ۏЦÚ]{pMk-ڮHN|~287\C`J6?I5"2:u$!ǃ٣՚|E5/,+[o;C7q ymV=>3sW#^4B™`Mhc5*7,MFfZ|7@wJ;U8lsCi"tc.,2bƩcm^_J j\ 'di8xJ_Ϋ]7J{Eڌ !Gvr#K؈Ė9 A؀i\2;0xwSEZV1wO̤YNJy`=.ASnߜiDn_[IDseQW+3O(0Iiwܺ/ 镏KZy1813t>a.x/zўçt{DJDooG)DF~+s-ӗmakO(9Bڑ/s)'pdN[nDg An+'+W{v#X<<G /ڽ.GswhOn57:u*`\9"FEF,9UTzUH'i_}wʡ[UIu:I&낡Yb;#[]EG֥ҹ0Lg${L)݆)k [XFHRJsMArRb N׭ě QՔyVA?x3K˦^@)Uig:XvI ~ogM֖TS*F[;Ί-SҒjQgـ?i>;TcmFL% #(l1#aQHAu*imB59 )hLg?gk579W6BgȌѠ4I]'dr?dDn5^ ."3:'MCyn|R#d Aq>r"jS~4\-sš#]t5~ >RS[/r"v ~Yمv]Q]]ז) #LY ͶgBtT4t|⋼NQ˓iw_6Ywbd]ۿt4ZT.jZREg8f[9Hm{n0ڡ B O'Qjzj9!\_ Z=ԡ)MkǃgG6 dzr?]z˱EoxQ[\_Z濫TWtzU@)_6Dn)=G|@7{_V=Vscr'1Wu˹Z+fV,_J>-껬 I\3{Uunͨ&iiӍCyyO: HkOݣja]y鐟ln9/1GȟuMɧwKh>,CA6nڡ˞kM°)| R. ^gՄhm:gtXRKu^ W;WEKtd\fv.I9XEݶyO_ce"\ >7\QNċX8]Gh)^Q+\4)ެ={s6+s!Pg8_v|!@T1U,Wg!2K#u^C^TD?􋁴$P.6\/\$Ӳqr%{!n.]"RSa - WLpApIlE$ZȬ Ȍu)+m#"T p21W @Vp ?=8& o]]cz[ mKCZUИ5sυ?@N~ιjk:˜jm9G8\ {-ClKb VH~k.ԯf =;Ypky<%3 ] _K#a ]F ϲG!8mH 8b.l}:$ qC{nIk`o!.Ĵ|Ch}_Wjx,ck/ KyD~8p3t03V!{M VLq#)o5tYrMݒO/p шbB?Ӗ%QJ[&9%aK*o᎟a7W+ٱF}JMa6ij7˦NfA 2( %$`j{,@?wv[MK׷0u׮u.ee[m1"!" TD |ADb|`CdCnL(?cpR 8kj MeI5>jR͚=RS+NeGU,;tVoYj8aoY/ADʎ,E$-Q:Q -Imm(Qy NcNkUl}60U۵4}TЌc9i&=kڢ ǥJ޵AJ@Q+:kYAw"CʑZ퀔y}ܸN…UHg^+[2mmE ѯ"qkH~U[̾;my̬[/A^- h˅LeƄP8jCS;~=YS0fqUq;*~bZ=K^b s ꢠ+Vb ՜`$ERI&Ey#ġqư!Uq\YݛV֞EU&3fK:Ǎ 7JHLMrÝS)j0$U5vW!5|ꙫ!>UO[unYȰ8?Bmj^5 K Tsu$ן9`EVdNUQ3 %'8NeF;k$UV{/Fu): LQaU+K #*:ݏ'Cگ/tmlV{-9i]A>@UTLԊfVvH)˔ݷƲ>wՠYN'l5)hv̚uVh1_k)3q ;>X mI(ZOiZӡVY-q.|ϷEܨLwT(SnrU;hQF(u(h^ 盺=׆uNHD[H?5)uFk}>oX>(QH_u{W'nP[_ޫїd?ACǩrV Nr3?p-xQpQ *Gn9*$nO/֎X& j򏎐&qEܯ(J6ᱏb6a||`%f 72G^/-YGBGEZkk mrŎSǶe}mcلlgr;{T*uһ)ճQrX ƣ-uط|Trيp""#Hֹ#6` 1!PBʏ_6b1'vg1d(Nicg`,Y#!.~,Ԟ #c%-(1 W=e@n0JGpW=x;wPd5X!ļv~wGrIWurҙy,Kn/g#&;`?VQ얈^DiF7w"*< iA="_GkOLY4O=ԷFh g*1u'ثEob )unl(icm/­ ,a?zvn\9D6;/3aۜZjnڌWhJk71^ƭEc@ij::8KV[Ƹ]zcʖgn/7} PD8=&EF=~ ӜP)v6T5sNVS컅o?͋`Q2WumMVse-fYٖaehMbiÖL< m"*nբ\ZfYI~"J FaumeQ=jdmJ1o:RyƪSWS+0)p&+}l TxlaSh<޷X;??7ͫq2:]GQtфEj{D#pq!Z><`q4%W+c*.㦼ցLs+ wf;.Ugrx=heQ=Kis)*>B!} Q=jB)'|䚟#)Qo;ܽe~bRQ La Z~=x C~{ZS77׾wa:EHM b2\O(MoUO#,՗SsB*+Prڎt '-S*ד~ʹqH*4a_c%"$d~(54c#&)`S@x8@6w#@{74ܴ,=lu&>Y\Q6Hĥ\5{%+ 1D{UvIOs@i{$>nA|F+"a7myE6"d [:6USAeK5vɸ[oRQ5N|tczvhK\󇗉AOm.jV]BnྲچJzO>|R`nT * t%zy!yΖ“ wL1;7KkY8i|O&GIᬱ:yܔTǐ7ao`K-h[Sб p&rv6~ )x0;buU:88FU(Tϋ㪖pm)E@⨕+-+8v1i)q)vqSp@P)A?"@L(ž>D&.7b32rYh`$o"%/NM"$#Q K
 4rx@2 L+ȺGQ$$(lL~zSG 'lE~9KPr&yr/VJ"J_씯A*ǾKH{J`-/R_V B0 mY~&c7uK;9Q^_Z}ymU%޹ .1bx#a,%ޞjlrA_9O~ɵۀɡZPbɕ#&/E1b9ŤyČ*;+!7YELG*1&k L7+xS‹ZwJyAkrij8@Cs03V!{L琑-ѹn@I7vkvV'}Q|q}z"`4`P/)*Y$KL-[*on/elwp{T[ʄMez dLG6eH;kۚ.u͹%DYsVme;ٵ#qH}8ẢNt@ D" ֹ1FXOƖLThK5Xܖvdږb,r*Ma|5(Dĕ7i}K 24]"MYJJ^VP{ bc[b=y)ͫ<5]Aq2QugIMoSb+Ei!Bz'\|f6kX|-/UuйͦW8F]j5/-'jÙ[bJl+mV!+?|EG+ %nSSRJ"'q`XKA"Ծ"ZZ%V \F;~.h80 ћX0t]RՄ.&'\ϨEPߊUI[􃈛RZcDʊBF݅ luô!k$Lh3at)>g|0 rnƝy;XړO'TBc eI2$z`,&8miR>UBJ0kFW;{YZCӭ(BlFzA f{/sY04.~ah5569U{=o&> DX;vH. yWp媐]D-.r\F~@kjR 9 .ԩ#QnKI'DWz΢0 Ej8QIQG 6U0,jάKzA-̒h$ϟьC8e VqP|/z7`PpbqƳz]R{FkJQW3ԧ%64n215T$' BE3wEt-r[NNĊ,DZک,$!7@lTaJS&Ϋ1=ژMNc;,u KvZ+Iq).I~Eglnߺ%pO3.jfݳ@O3ٚɘ=?Ms*`Ccxf;Op/k ^qEC[r>^RQ;I1&y3,B8 %IiM+J{S%fGKr%n3yT) *{EIzCBrEb '}ٻBlIS9S0=蒠#pvg߁u^ͦxl/!{YO6C`w]WY ܪ63BXJjٹQLݣ`tg\sae߬2d(qş&BRs`#BZ)ɘi`nW(;H]zbD 2F4j~SWQyr}.ySR.[}mOޣ艑sΐ*ӫ9k}tss>#*I ANڶ;StrZ-Þ Ƣ4 "zy yj]_[GS5rf$;mo)Mw}ߵD}3$fe%p1Uj̾KoVկt+,אr3[%Fw}C"PfKfdSԴ65I-H(Ph{V 5PZ| 3y%GeW**nq&-ثX'h?A y˨ϨNZ} Y>Tv.ڥ9wKQW[yZQA;M{s>^/KW?kj2%nh ~zk{ P嵲 ]5σ ;iգ.1/3(3J& U4JIuBEvPN*=-1M0 }n`u T{9Wj)+M;uz :<w?/.=^~K$NhTr5kX,&$s\Ie ֻ'Һ8jV~]/K 4B u"KO< kM21̉K>B].tfރ>ݾLZ2GȯMtSKJ 4lJ9#OH8t&3V3KI-~NYVĄEC?oշΒ$-ʔ<*@9{ |'UXJiff "1?Ez39NH0*AlB鎅ܾa=ψ1Gg( ~}'[|aum9c\L`R`RYUTOJd8;Krbb7ڱ)K֪kRΝ[`:9SWЮ.q_8׀aض0 g%Ȑ*xƆ$1f,⯓Iqz*96 zaJze.7mP#sggArf6?NhU,cD̦a"w'qs3vu޴.PXXREC@wX2Bbm*YI{ iߖU & ȟ9v87Wk.+Ub8q?ME{`,9HF),'xb[G6h2Ӭr2l(Gֿ*7&?Ao 'p4&{Dsף Phc֢E4ΖDMh=@5C^K}Xݙm:u39-S&pVښfb^00@0:1@xf0&[ Ag+RCF>b89=,v޲Ѿ6;'v oY~6#2MNڣ;זo,GR#Gp]Kv]Rӽ&>Vw\:Zd\SpPa˽7@?~2#:a7wwzCm@o} coN>דMZxo퀳|gCKM< CDឝF'Do1<H0$AN0N 4]uqx pukśT%$y"vo[10Bp?*)8#q3l#M+ף6 3sg jU1o+iN4 9@o(q-Zo7!;+p1/'-)<:B2h.HQmoCߞub+ZDt, xACN`]?$uef9!lG /a S814rY}ODLij}3D& Rf1㐴l| Fܖ4*ZcWMG,\9G\D}aZ-Lrrƒ'^ʀwAvդγLbd<GZvטwr=KbxysW.yؙXl+j*%ʒ&\hbf?PSzދUdhe.Tf%2Mh+1DHX# VDehvpԞ:2xjhW34gߏN3zpQ c_ϊ)@UȮR>'PVIXo "WfIRIǢ Ŏa ϹsnY _4-nn*/Xsv;cM✽CkPwa-Q/]L{QAM?"Ec?^779:QKZt˧VJEnG}kCF51Kل}^wd +|*jLIxxHYDGLL޺+>+Ȫ ûԷ]!֝lXbg&}l6NX]4x6.Yv#E]23ϒur5\^nWy0dDDbS8Y_hw`=^U*,)@g-EwE9Q* JRƹsm+)HaX̦a ra1ǜƞƎbÍP頱/ %t=]Ӻ/b:G٦]xe}i=Lx|99;B1lN'{{ufաs%o_w | vA}yG~Sh JNY2|T"Лp{{U2KTɍbBʘ.ƗލKV+ׅ$:CgEMqy75f. c׶_pSw^A04\+z J_>녇:H/U$i>ڍeErS]u25SkE_#&811=Ox訋/{d"w4_u0rʃL^I`oGG;^unϦPVéՆZ eqX=.HǕ  ol-^F. /%%LnFAqa]D8=5er+(J JK<8۽1<"= czߚ->W>\)'B(i^A>tþ cj=}ɬ4 oNL;xrq'e7MXlr0볝'cn>?GY3bԘ#ZJ5,&=Hs6xUVBp'iҊBbߘ(%j2muZ@Z(e9RT zy##Hߖ% zN=6srr{/eF/_k n].rזL* D("/A70 H5ټqh$POtRv⫶lSaD%@e- WvLbNzBX\$tj6hoSӍjێ%6 <&r})׸O)azu_y b\U΅Q/P` Z hF<S`mݝ!l*Zd?D~S1iF_|LA|H-)/:Pl@LUF\8mP4u#ݗ`ʎnpp4P8ԬN"%B "^(#{>V"d5lwLx$#|,D5\@`9=pVyC &fݡH?) 4X* |IJ#af/5T66&j |Ը46&R|Da3J]ƬI"}1CJmf"I1-W2 ߒlLo9w|X$`ywA!cwq#ǃeF";FdpĆ2n?aQ0sXhwWDKl'6F3j_Ġ΄ S&I6D+Y>PVWwc-Z8|Yoi \qs\ÿ^%PB1ۦM)Z%i*oGTcˑ[Jnl|G͘si[{pSOKVV44ZJvpuݲJ+@ p#wԃ_C$L6 ~7Ƅ`kGZQ˨@ EI iz=ݾ5 I0ޫֻȆk/ޔy:_A.кi?=Q:cW<2ä!?*S*>r-=O:Gt|Glϯ/ڇ1LUqIj;dpYDkglx4Cn'[}b,OH^ɊwA8'ETZy՝z KR/3}W4uS=ɜy%Y-QT0=fRo%XjMr+ӎ'!~?y>g'(Q\ȿ8uM i3c@3eYN7hd#yBVmˎ#Hw۹kmЫ \/_`dF eHP%x| &xIr8Zni jvm{aK!1L>6(KzC{[&lM͒0aY[$%ƒ2 .Z1`^P{1!j$.؅!f9cF'KTߒC ٲߓZ^^B˳o1A6YZse4]Ҫa`dd8yDanv( dEكB Lb/l0ilΠX%/l3yn͚ȌUCEkV.] Fu!ǟ+og+}׉dK #ѲL|yφ$F}]"]ݍGڥ*YubfZ('W9m)!yXqpԾkR0=\{ǚ-EGF4ʱuEkKԼsf~/L_=ֶ&VSa T{EM qamJدae%֘H%0%+fy2^I `KUgQ/ Vz{Hb| J81& 3Aui:/ӑrJ'9V~~] u"\ߴ?FIq P9 \[^ u$ӂIx´YƭMLdyɌǤ; w2Oo^a+Cy/+nwD)K\5",9@5ZL:E7{rCfHq44a^ӘjX$9W7%6]+'-cJ~lU#"_峢I)E[R4*$6ןNd?@+1ozGCaE^ҽ8ߨM~pS.7cS|eo6Ӗ9=Kޖqa~|TJlIQ! W_:nqf9|j'wɍ#/ r5{=dWV-ٶw.ZEׅmE[vw~%dϺd>m_ncG>ck+JxhQY|=zC= h:X__^MYܰv=(ݓqkFi;EFꩿ^QYN-ٖ].G i1zlQ?ُqhEvy/z_dA7~)gʆb \bЁ0N/!{+$. d/1FO).]3;8-gفCp(9vo6w/.Dnؠ>= dD1)%юI$׉êmE} Dc 9l3˳T_PϏU%΍4=ȿPm>vD0T.uN8&ROP/|Y;n\!V :',̎$9 ˼ M[t$Ț҈Liк׭ѡ  P?B3.Yh)/ {}wEՅtEG _^Imv,l7l޽D$PT;(AQg$fM)FIl 4" `}w]nW[mM;+%RA> H* $C؇S^D!_J^PC6rї%-n `\t+5\n!b (YG<0JW"?dO d\xmћ_Iy9xAhpzCZ,ҽ.*R ;@ D.sh;M߬m(~0_!T~XG) 0I28n _"c$gC]wiwUaД@6,~.A*XU~5ݩFԅD_*lsw!N?d7pKc><9^6m"{aaoϬܱ2RclI[M qbk,q7?V9d?QU'FS5YWn|ڢC=x+ep_0z s<"q9Ic< DK&]~&ڽQDkJb֕kY y(d)%T!Qb,-&>hcjg =+_{wLk] !6(&.HX퍂%&.โ]"ַg?KuVzFqavĊ(Ŗ2ܓKkxӆokEpk]{ ‡꺗iu#N:b,ǚwK>&]_)sA<6zјwH)nܽ3'vG;b}4'6=7>,6?7s;HiFZN4χCsvn^p\g/P@08}Pckb.j֓.9f/u6SLSoOTˌfK f(p#6|bxVg`SAt&}5ݰtXu1) d֯UA ;JqjlXM/֥wjj5''QvBZHv  _|GXvAX_/p5'6*xl6=T`=CN"z;̴"Mһ3 tKֲVZhg\GG%goH;!SiG{>͡].t>oW84(7sX>=tz5,۪%/ι$(!RTxNg%N}5i{̦UKnohYpC- _2x+x]r;a7[-ŝ(v vêtoh|yG(Ltz/kMz>qp.F?_!i1HV/a-?#^.SuzuQxɮcx<)q2[Wa[%n*yS.O|aٴfā>l5,ԭRN 'llӼc`: $͉GdOBuS=n5U \i E=iQ`Sk=i¸uq;6G:ݶ jOTY^Z'ߕL V"!hm)`Vl ڙG<7`ٛF[|ąw)4>90,.%r'k~ι;Yә z t]aHw}mYζ&}no[9tz̛cr{ejHp+*2_팹!2-i[鹊[Y捸[rM[Ƭ˹@^wW;#Nd{. ˌ3t=|%t|NdekGK%u_GN0ī}_~UyWe7 \3^U?,PqH,MSfQDhRR=SJ.ĪZL38 840hs+L=ǪW2}r=n#!Aʢ=XN# 9'fCgRŎwдPf"ShT1畫zOADӼвl&Gs#sހ:.[yu fNz19H8=H5uy#ʼn'9.t3)́P"X03wZ<ѝ6y-#X"G`az;'ڝj.Gp'Áޕc>q@%g:x!މhj7y@%#v]GS}=Ӌ3'QN}/h>Ao@!H5߭#uIs tI3҇Eʥvn;#!``yO="[ zQ/֧:WpHl6ݓ֌  |=ڱ`d2C$}NӼUt=g.G>U#fLhS;RvJ`P𭓪f3@3U i?A6g Um9Zd"m𷝻v;[j 02F#X$1-%[<,Q&)d;YmsE\m?x?  |C*Jդ\ZD;sxcbCk~XɒAƓT_zn,Ӷ4y;.!mG`"ܚ<^a"u ;omXXۛЂy꿠]c_{~O$Uu H/rldgՒڥ2 4onZmf἖Ugp;;ϓ7 ,-ILH=nn0EorDqa!3~췌_fgn# Luw8⏩;?NjXGI.8h{ҲEw2Ht?iLL 䨸My+L~4ݕˢ\Z*Un9&Wm@IJݱ=L Ғk]0vB& ]sRdkE"US.u1g k4k(UB <,ӟa˞YT +Qbcz U=A1h#r=6⊢&q6EMвme{rw8k;lv?Wif,A&r'^hzyx7ިe}'jo6{H{8m xO1YF U_~Xî;VȜ *_# 9/T3W8C`6 a#_s&KQsaR^1+UDK#Q{ YnQF9^2oR v'RWs)?1y6Wsv#D3:-4Бr9l{*r_.5\^ NWoqwAU&h!$eNrIłx͵SZŌ8r#,)) OJ5o9,'*DKr6Β@N940SywMif^c[}j=tUk]B!"&!N_)b>Tt¿[mW~3='{=dz7sޤȮx|zt NYv3>^*'ҍ 71EcN`qr3MoEG֏a`IIJ+׿1 qZ"v#_gw{whvfq/;'{{?4:rdO/rU!^(G15nK2l* pO!̢GL0Ǟ=;n^9%Ө\ixg[ӿ=U.EI;68VGI5Ã-vkWķ]T{#\6+@Ȼq}^oB!P4PmI;珇Z,db|+01̹|X$Ɠ,D9]g'O]|Ix\MUhifcG85XoY䂑 C.ͫc"Z+ k߰E|W{ز ^=u82M]ޯFLVJ2 3\&~KB;^\믺v`GyT1Rm5GSt7qEV,ggpX7]tmn+0D!+"0FV[ټ1]/SR%?hZuB]<>zBDz{*55>>k!x oa:qN*)О\ ٴw}}2w'c*oqՋx-t83naCGx8x6oc=iLtK;ZŸiѴ/&p6]D{t[MWoW%TZG5Ǭ!W'Ub4~ ٦}9r\;7nj_qh.*j5O Ϯ|L,UTeA3GatHT@//Oė^Zh4 j+T/p32ĵ"-yỷ݈ǧgGbɱɎyOc2x_ʵ4Хm28OǘM:F<'5I.ؿ2ٜ˨$*lu:f]#CW$ÉW1W-۶b2iISq>o10g%[IS5x^X"V+?\_UkPg2z]Iw(jHCDU % ΁\tUXDI&2xTE6 NP*VHZIrρ$ZUOSd_LD}*"_ Ԁ?ۘzLCv~H Sx;c_DrF]FĞ [#g=kdD@#oV0!3tCm\qbqnVoYWՓV!3X xۡ`;/* [sojﻎKXv7:l.GokKdeLo/[LZ|ގwy9@mYٚTJŒBPQAQ@A >_R{2[q-"7֒-Z u9 I‰(6S:*+(mjc,DyME^م&`޵^TjK+l&ұqAṕdJg増GVJh$g_O"kᥪfa\Z x& әc"?RYyF4;E]F3BꞄGh{r-%mK8AB2Wܬ' ,NrFB$bm.$=L\uKx'W˱,NI'VgHFahE'p.Q e)@tXAJ~Kmo6ݮ/a쮵RwQ7lvA1~2+vgEEæBV\5oa.MXEbRBK+?v夔D+c1e>pQ9\ӖZN?-GIXgnDY6whVa6&K]=F x-yN1E]C'@A6=ʴ=0m=YLkGO7!&wVQRqF!"$o[ݶ"4raYNB>halNKR/7}D4Emx7k73,N<NlfLb~Uo'3k=_*о1kb8f[^z†RWoăxUDV-(ThlykWvբ/}h.*)7Iz/WfXoЁ= *dZ~փߋ5U|gQ-·hbHo /ClBڛNSy'f1vi&#BK)7ph,3;F5ke&yjg8F.߂IsT>gI4c;rOcfߕjeifLC'E2]1jƄVXɶɤi"K9gkW&$$ZfF{DKBΟE ֥xMl MgU9ŠwzaV8yhOF3e ?%Zw80*XʰyR_G\BPOCcZފ2?.[W!ɪOGtU+A­=Jw#O L- |R7 iYdVyD+6dWiXʛ9}JX[KY9$,hYEc V$gm_/_|WSWQ {# )A@}w C1Ĕ6nfd~y؊Sʼ!N8fşZj zl)U4 gk0A~؟X(CZTcl HrkmdKUQ+i(snZ=;Z qcvHwųR@|:voE-}r]͗(l7[p9l[?M;} )0Ӝ:]yO16|ta֧oe1`sME= :>-#$w4 /b{_2y/]YVFS쁴GԖFF;S|Ht(3b'Sy&Uq+1tp{;w1yQ/UZeUY"jm意4<˒j @OhȊ IⰉ't e?}WE#^ҲTv,uJ+YnuΌ4;IQҚ9b᧯4AXz_2'k^reapI(2&4Buj?+|ԏ"u[]3u>LQ~Ӓs%v? JIHH:fFXDJ{肆e~9!%AC&8BK䠩x;!5\xdA'ب )4]}ĩw@ZF XjVҽG*K^6;Gb S a S0>ƉM5%p}Kݛ(A ;ޔ(t:<>48; aOtȖ&?@̦BCȤ!uB=(ZI*JlFR GLָ.8~j&#R%LU n#3U 0aIsU*xT;Q=^xzTK^xKˠQUrT7+?mz:sQNj^;zWS!) .^U%/D)!&hH `l u'mK Cѝܡa݀)gtIpHnSp"i3ӈSoNBp"Gt;94JpUQocO {v~9?%@%M*t>寜8iz4܇wɡ(N7)Џ 9)w**4it}8=hp .S$4@#oV!'aښr Ʒk|wNDzݝ~U30 ABflK>5 zj֮ml{]lٽ$ٽfӛ t饷)M/tl@F#pXvZ/ʹ-5,{jM;˰*1AEld1>P CA D4[N2Y,t!=]au Erx&ln ̜+p--2@ЛQ Ny) )z)^ 9U7g1czWl(!E-5 WxMfsҨ~}(]6)S=I֯N{qf 5 0+]2,כy&"m2ۻ6 Y\[2Mlku~cR)ҫ8r|Lm( '4,nX7>_yfJ#j .v1 r/"FT|EjYv{7jH* PKImHh8&1wD\R2۩(aUuqbCpC`FKI'*VR7a z:ԳnTl}&,ǝs~*0&uiAf~߇XKIdY%ΓEmӎiᯜ%p3VD笢ֵ܎5!]YJ5&dP5f={/5uQdNO?Q)-)[G:s3v ?W(@&#ng"&1p7f'j[|.Tgַ.L(?Fѥ ?6_Njsi(sD4~2u ?/ヷMcxfJ8\jݤYR犴R$$9٢R"x#3Ej̫݆-딳Cyγw(+_rb* GߕwdjunrcV귕^lJ벙{ڎ\ndyZ|OqLu0k@INq*s*wVK]U)w Ib]enr#4q0cU_b?\&W- Mjnsǩ %-9<,=JwYݦ21'nYVa[m]& x]SD+c}(ZvގcAֽTZ]0{3D#$V cm^IK5jQ5Zcvm{M9}ALYJ$cLv&0s ^ n1[}gI9Ä_D*mOϿx'ET5*W<C2Ya$lEIv *arsƤޜ*fC.9ALeItQ16|n7܉Ke CJ@v8}Y4w?{eG3L/_uY]NʊAo5˹\sI>KKo٤'>IzFgI,e貞MtJKN!|wiUJyqR\YYEd=l+ڡ\aI ߵ-7 VWw Ķ@+Ç|k%>^XNb3 jWKuU}vK,<'2Fy S $V mrxUUXJ᣶9|?إC@z[ROyPzIzm0u *J_ 88]jBlX7|[#k15{FޜfZd#HU;.R.+~GWKlnޑa\$RI0?! Sщ|].i~fϢ Y;;q;[C)2:fB>[}``vS,zq]h ;nl('DVxVuMclD./'^s dnjBܬ[YD+_1(l]j#=-w33]] /ܨ)ub:͖tW߻b xڭ 1`1_?hVg=K(±Ժg7m6\szR1?3`M:<<㾛 kj22鐥NJ(0^s 1Ԓgq-Ȯ8_l{2YRQGS[-uDZ يrmo2O%CLpnMZ?YekO<:Rb6nǞ*-2a~\RziP|,Ia,ޱpۚ~L'lqWRڔsLP 4E,c < hQk>ONZ" %#>g=쪁Hv\z;) U[VQ)_'<d`@ Y Úype㔫JK$PPoieLC @C" (@$4"QeN@n=Ͱ FV{jǁFWPt77(aERBʻ?.4)v탸%WD/;,ex祖%4\sI^]y4jCfo!֣Xǖc Ym܇lCI ?Jd` s| èëZЕ@LjV|ad;uGYٖƕx=-on͞G8H;k÷Ntu΂?VqF8% xS>Bt%6kꍹ`* <_NJ-0:I…4~ԌrmqC!~֯9ICA毂6JCA嗭3@3U i?A6g ]-9Ze']xݵm/wٶv X/`dF %Ymɒ_B" Җ\VZ;+ۮ?!vTlz }( tӡ';KMZiIGс{ݾfgk[ -[nܸ"l-+h@B qB^<h $"|ƭg)7][T1aGI[UiP%hps::ȄkLdk_W^ai:%K#AW/566kz]&~Yunr)аDVS-p4Kt_UB>HPvfsnv$+2ǔ]+[X8F}j=/f?}g]cyj|}j@>Ko');nV赭p$.q)#ޑf[)_`lVnOk.W1*|\>^nrN6.oUhpb U-Zʟ#~0BCe_ӵqM7Llɝber7aAT墪 \-ŭH'i^ңM\ȕdJtGAYrB LƑ4-fEJ&au[<ޟSXn"ɟpռ kj˵8"Y͊+ʪ*y{nΫix(rb+`d8bw9wjnsbfCFuY߹S6\e؜J٦RZS/MğTw~ D3]ZrNr[@flZRq@5kJ*7"YcfZ\q'l%HZB# D8 i$Nk?I5G4h,L`>ktUL1nQlS^Ef$Sr;WČ ^l#ح'{;Ld$o h0Y\웃v;1c]e8/G9 쌈(Gdz.3bwT+")  u\gO ny#c1ThyaV?IkLϭxq*a h`K MHW}$b9&T5_~g$~I) ;9bl^ &rA $֐ ^R %-W ye+v#؁s@.U$tj|E JfAt*"Om՞3w0#GM<~K頲~f>v\32Adϼ|Wz '@Ve@.$o,݃&2jQٌ(HL(T dPaYދaJƁ 8_c]Q1k~K\&?_pk_ 1/tH5Q+D (Q5]v1}9×CBT(/CB65>jH7mҨ,4º9ۦ˳OiKLAJ.t:;pKEnP7Qiir4KitǫWgMeۣ~-.r=Z& : SA|/*+}Xx’6|+IJ2*Bq@LMj 씒œd 7sc2a^q9鑘<$lFhI?=EO}AH "̝؛IY\A~rQ^x1DJ 峽DJG| uGUL L;hU?k$db'⭃>,@ 0h 9>%H3>*U,<)i< iYAu0?o䆏c0KqJ5-{;$Xp@:9r.60Hs|mrT>۪-R5]t火nov?uz%Þiᰱ%T3>DWW+fÚF+@!Vՠ;A; cFK$]RkE pvӒY g[<7BM*\ZQ?w(,5qf@y}Dvjөm!5k&2S4%q|ѹ wZPxolr&GDYqu?oMP<~`ۼz9H1E[|cSSN`:}GR5s1DH:}K7ΓU Dsx^۔hu@* +'B]4x6q֧.v(bE{̨G3:> ]S_(i9ec΋$NJ{ ~]&"v=%S qnV3 5sUMzTp(B bF؅fMWu`+aX6`Yh$ {sMc9Eb_¤(WepSgqi]YuG9 6S{p^ *Vᫌn"/CjT Er8|ʷ|Q_BfI@Kț^hgV1 <ňƜ.sgFW] 1R$DEٝOSw'nAF'!CSҲ x^9Zjs^{ߤ+F?C0X*o_\W>< ;M1>er8^>qMG9oQqQBͶ7WmMf$,)ØK9pD]z[rIvm54#67nTcܯÀL7[)=U-sqǹNNH`*eh_`V_XEXb{KJ)F5x1!~DK̀ ;]6YG7DG4IArKSb[a}Z d;tL%w;Kn*_~VAR]ܽz,s-虽ڤfYF|EfǓYŮp˖o~j.Yu%7Pץ}xm͐@#5tX "řknV1l m7ׇ ć[4BOv6e31ĭ.6~A𯱭1L(QFSasY\@vPi#Ρ0Xw"74ůW_^k6l]D s 6c߼Т3"=,:jɹ ˽GѤгxrɝ ??9Vgwz<4'CsH./*5).gRnҡzٱ)!)2+;*IGd~U/k{mZ J\:ߢeOT2sЬPnk8ǒTc)]k\/E%39KǕ.^igP5S"*ė(2!)J?i zY%lG*a)Un*QM=Gتo ܾѣQ^c6 X'Jɾ;iix6ZM xm'yݝ寘sTMm6GQxR<Aͣ* ^}y $y" !~;\P{u$^ǵobf@GM3iCKܑ?O[^Px|d&aQ+L31N HeulA ?AK/>k}״\]43Ȱʄ{twQao{.pb(zzxG` G?ۃyMWTYWoX+<6uu>"4/1'1 sdsg{8^OMjZ9pD}L}\~·)kS(Q 3馷@ʕ{7{h pG@th2^KYq11v H|/ E8! N6v*TȎ8_)+8{HY0BB.3LȤ?~"|La2S"d O@e-bl{G_@~gEtv@ŠU/:e[DzO "n $Npu2Ԙ;4Tv* "o|OL~(ol--xt{kLZb%+P%ϰ) l)bIE8RƖs9+kscmJVeVCt*T\4K/#˗(<ێY>etkK;elszeI4J}E3l$}lޖ@qe.eyGh?soKcvۥ|ޤbe2_ IKkn=':dyD3S1эNʲC&%(#ߥ4uUCSUw{H,\LU-(`+}'YP k=|mwl\S$jʉ[o *JkǼKsQ<ޙ08Eb=\=$V! 05ɕ5 $V[٠xiķlb ƍ(4Ɋj%Q<>J+zᩤS4D-9Bb3}C4i *-x _D:HCg"}-) ֻ6\ a]+U2Эl5yu.@"@[lZ3$Z,I؛ϞºٿIErF:;T(EnܹiaK_*kؠ n܌wo|Ɍ8>o;!kD5<{t" XتPK:틎f`(8:QVXSQtBq:44iwxDs5K, ! on潇m8R,VQ:C^gUk:NC.S|j7Z7DTSVڒV^KIR9d?g klf%w[&4)1`HꚮEn,q[KRZ,ې9 W}+XmW*)_N<WJ9:r6N+׶Nعq9'l%][J'`ʪH mʤ km4_.qS%D?]UY1MCԜ<#nA9>u%]l p%1:̪%{zrx@slGX2 yi%(IyﶱoB`ybkH.ߥřrp+b&u\E]e15M}#5^.ZmfoV$]( J=CyWl~Dh%0E^U*_UC:ծ2 ^_F eaN53+Ɠn<=uݢA $i<+] `w':3E?:8֜Že5  ׅV)vSUl$4" L ʘd)$iQB[aO"DڦL@GVڶD֙ H%xfO4O$t$o;5G7r|zfЦ4Êzt||ÔLyߴ<:\79>hc"ң'LNIorI~!ɫ+2Ff*[[2 m6'k*HrF;ۛ }$`  v4F"R3OK ,ٜ}pCȗPjkr7Ƙ+ Ղ[%{lGǿZbTjKYʡɼd۶剉 Nar N-BNͅU%,A u QTcVS_"ˍL:p֫aa*N/b6a# 룟-<旁1,U k 3 I:ԨJ`Z6 =AeNw6;opPIS;'Kq*E4zd: gh#ρ$7f;$rOkJztjJZ a{cI?]Hi6m=3E٨F񍏾*D#u Y~V'aEQSQib~+ hG&ERZbf |m M__s b )REg(1~:R=&p~q47kCdf_I +< 3#4 !'Ѽј:q1Զibt;GQ^n4ٚ*180EmMZ&y-*"vEszȺΚDUɮw9)1ڂͩw @[ډ[=y:Mqt+*XP52$Ki-,{VM;iӟr37J_^5kBidBdKCN,Hbc^)h+cs6z^B04!t!שK+&;\b ~sVst Z^_PhG(]yUuW6\)p^)Q(׷FL$?@s4GC;vIC7 NJڻc@=+o{[zOlO(T2?7hMdp=CP7ƞ @??vݩсη .~Y`7@Bh8Pt=A!h[]á殂\ Hh-wjד$$]'Yo*um!{P&уPgpn$շ=&IBU>_aB 8 WoM1)-H5D$x}l0'" o^PR悥g44 Լ?uv/3Y쉏?ܿ!AFEH^YVGa^^僞Uׇox{NtznzƎ*'04OX &`ij[, 6L *[w 'I5RHKR #@<49*8FuhN`hH'XGKD؋9Z&_r.LM/"j}3 80d#ژ~᳚EZ5'\Z|-&[& SlԫZgy-TF5@uSqq6BBk,nƕP@Eo7CyB1@ĆP-! Fu"o#E!r#51{ ‹̟+VR^V`Z]n* kwoW`t;uV-~"د.@PD:qn0yΏ F3ʋckvK;$kˉ+z\cC;`<]h^X_E> )_‡d㞍@aC4@#Um"'\Z-4  dAalw5-w_ P|YFhDѠ͢<4$%5:3+€z]={M~qܯTսkҋNպ*k6Qwd&$7%L3WD{owovne%7n2mdmɲ&,s3U(,"$K,TeO > 438կ"2T"}tfFsXA,+ae$ u/'˧~Gbc\LN&jfz}r2 5!K!>jj|Gq&1> 8,ʽ,[Z(/UeZc j Q2Jwff By+5de`'si\zͱ8m>Kb kRFT}.s[#o譫|i+%CpYqahuRkXSu2\%h٩܆i:VkLRsL yK51盜YCGk e9DW ]{u]zfqolOiYf_7mğh3X;K؁Я::Kl!+!Wv*iyo++Dˑ%pGPWmcXɸdkXҫ(JwХQf?OYwQ+L/mT[Ҩ?>@lQ钲ӆ4Sj|2Z9?rY~雙ȀQ[N圐;wB,ЖX[ h|7`˳sPt\wk׀mithJG^^:FQ7[&?1 7Zad&8Z~5Pvq' 4.}[rp.TtVk]+i#;ICЏyK]V#%H)?5;50rX;z2R*Zjpmy䮁1٦Z֞>ֽraQ7K1[T:a.YoyaWhx,j2zNٚyg]_嶢6Z譃OaFn񃄦/4ZN֎-?FtRAlaYz1 pb:YPڑqu*(β$/hYZƓs0(cIBT /m"*;֐iϘp ԏ_1r#2;V٠g!koi#"WxfFNxCj-F}Zøț2nSeQoa̩Y߆ *:oeEF_@~  QVҚ[̎fþEcQV^T,aZ4­+;ҕmhhAӤBkx`v iL|ө92@[ӟVA\+ "ΑX]NPyZ,n*38*Z\MPН3~כa^sp ļV= wc=3MTS*f׮|(s$C$~-2WtRUmk*;k<,ODZiGmL5^Qd1DArFJLC77yiו^;L ͧo_jr?9ǹt:65ޞza=5T%84}X>w^)gU&#zL~kz4Z<>΅&B鏾X*v/e-}/m9GZE]Om¾2ٜ-a9oDMh&"ZQ_,OصFz~./:ؿ _C6?=8sjjLMѽ4Wzl<,z4Z5=Xw]2nW%CH=T_?dpk*s9uuf.\KI>)wz*7Uxv̝'0%js=X/vM$VFR0l"|)F BD\m0yte/̯wT!KXatv(ȎL 7,y俘t&(z4"-27>bjFTCBigNP|daxZZփǹBlV 9E4p}kJVz%ALMp~Ezg%+b:-Hn##v*f85e4+6P>rk7`ˊ/G~8<>knPıSP߽=5k73֭iLM/ͯ>uO:Gb0]iNwvŷ{IRn}Y13-~w%€Siĸ%MM- A٠Q04T7!܌}/ H$wi1ghH|k 4}"ez"4oAe(0^[T3eeTNoD9LX@mP%Y ʝ8qކ$lVuO`+#aѫ|LB[r&yi'YFZ5oT|I:>knGkyV73$_{"n:䣖:UpeI#$F&GcJx;ڊ&33X&׳FbWrUt PRVS$l3Fgfj$QFsH˒ۺvgD)+%Om[WIEba[.wF`e;9q3՛lY)z4jjfc>zlmϣ";R,iL# knv18] EMT4>Diïga.m]ّT7>_:eY׋BJ#֋PLu bMMB<@;CeKa}'YyϙInAh_R遭۷ߺ]iN,rD[xS {Dž~'*zW^ؽ ,EPlY깿WK缧M$r.u̼UX31*k)W'J*TTnכT`12oХY6qX}M3Y ?~=Ng;nϓ"I R,wlCZg+q!_3~l}'>Q*yFJ+g\`eگ[jmj^6WS{~z +/cqv 7qNs}6pp6@bK_]a4"_5Ewڛ~ 9d|΍~>u.{X{Lf;@gemf[27$V^{1Z9]v[+= уz8~xկZGL-[o!3v!|LLEygF~*f =̺Wŋz?}b2YEq ,tL?RHc<-Jn䳁Y}#'1$FW61!֒QwӵWsW~q%kb0PI;mʫUqz,?#@h6at+N5ϳ5 wWVjV8쵴j(%knm 5vwllweFIKQ8O182~kj99LY×" ZE}^eQ#C$khfΏb־wO/T"-#k-tOz}ĭB ǰk_ZXdi|zA4v \zO\#`|4:.(w&D0Dq[0?˥̣TW2t 2>."yo@ @{vsAv<^ܑUmHݦuhdX A7'VyF,,]/p_;}!Z@HJx +*4Sc߼%&̓hAMŴ?P)梤B w`dF^ dL`C^&JʕP?9ar5%eC|l?Gʛx9`͑+($Eu-mqSy_!#{C^NB}x#w;3OlоrD;΋sGh6W4}}׽X-8M]ٳo;6nxn0m>ua|v]$6".`e&Ɩ)kuRH}N\8wH=f3=͌]ܱ]A^5jRuwR5Hhϋ<X`~c2o(P[ ",g"v =Fxn'eCD03U!>.0nD%i-͓`rif]"ey9,l˾m Lsa="+804I%]2 P wK:C4u֪-=UЦnY˄VA7t`I48#}wwwۗ23w[;&f&ed Ab(_IBe@(n-Q$OT ySS2U ˩ ˑff!\܈i PQ 첈)IASJC 4(R$q/Z0h!b8" 4dSP͌52lS5>* EoF`Dxo KíH’2GJ%e|Z;)Y,)cEL}&RD6EE'ҕƴѾ#0Pb)Rh+`XYF>Ե-J4St6dL7[QB(BOK A=S?nIẤ49-[qT܁hYyKc&b*7eS"QF-'O6e,3b3q5"os ?h.ʧ-cLmokz5ZmA+&S\@C&1ך"H I3 PWT9߸6nj<)ZSjHo+ւi`wL)bubmb}qRj(-sP]Mqf ,>fP4EaTa5ʊE3 JG!D`+3{_v^E{V>A~o훰 y5(eNQ^bQZm-~ܑ &?\"aN(9'>g) i?Ih!>Iu}ZK&Yc6lu6u`~ UovLim}F^&_0v1-X0e,voӆbu,pC` O!gTBTN$З5}fIZC}-8gnPsiaj1Y|wJ~39CCh.iG41r&\H"$.DGW6h]hyޥM~L a7c P 3u=C+!:7Zͷ.4)}D:ߥP> ( r]c~-Pƿ'3\XGM>)WOWФ~sVXmVYJcqXta+%q˜%jtUGK/fib0?mzĈk&^hʎAAe9;Hb)U͂ z5ѓfN*m( +:6eGsхar >'G<My؞x(QI10t'eBjeÄJ_H.b WMK\XC+RdZ \'ba mӆTlVS\|}2[$YL 6W&撇ojNِL >rܨJat4gpA_vuIeU3u@OZJː,iPJhj~1gweWY@X5jKI~â'14j|!A=O.S}v=RbUt}ܹNX^Swx>u~F AMܢ}!/'DR %HPSP]N5} +[X,n3oS\U7'7:2x(#}]IXjU}Ta1L~PsQpLU^w7UL+) TIh'r.~- yT\9) bspgXy19D~~\UNK>ivʓi`XnI7 6K (olC2M:S˙f˖ཱིbꌊd{|{:۠&`'ЎX6~g袔( I.]Tp[_BALw: ZmݦK q*gndlez4^[Z D}ԺBۤUZ6򙚖\S0W#=zYsD?Q$EnZClK$=K1/1s:3 D޲׻?"Լ5T]]T;M} HAkC!n4WLw]wYo)ͻ-w'Xg[u& &OVh⋍v}'R TjV[?& VU7X#+VqGH{!s@T?^F'/?U;a{C)5y at3OR 0"$vgI֙6Q)!iS)K4's}z97Lpki>"- ھ%2;gj37e!Cu/0?ơ2Wa,=Ӊul0NWV&Z@4чY7;o.@@ @,{WM&n\\cy5A}5wLe_|L_E^d`, ]b>7s>Nc"MiMsDPOSnv/~鶥do>OViDߤnj옋`UKЋi?W?h_|B{e3O~ j@{!5tR8,A%1|ƃ0P?WȕfFi,GGMDGKAS[L&%QgqӘVr\3םt"ܺNm,C.NV'ڂ( w#$\Fx7 ;x%Vn1%7/pd8_݋ڵQ0nEl^ѴӸwwfz/eF1^b1F@{`٠$Xj}Ek8fx3꫰=P('?Cmy.^ظSnY]n3} j~<]FRpi Zܲ]%`\,TX=nN{3r={愙:]AgI?F=zHrm俇B'zh,D0>JM ylfF0+~z2la%N^rs#iR%aN-w3]|\\`N圧u`3[d`Tm6?J'L{հ(_zb5%iq܃0jTj@R5M }/ҭ)^.N]Fn8x#+&- RO9m"H3g"qbg2cYº6/@?![ y䇤Zƙ fog2*)V$ןgYa,\WfW}*@҅:TglgBQ GeXm9xV΃hNl2"]Y::iI| 6s_̩FTs#UZjƂyPl8UI& )E-_0UQTM kR|29צ>СICa x x=bm,~yq?0Hbj;f/q^aƘ}h=j| CجV{5=q3:0yFȪWIzitt'?G8͓r}8VUY$q9'2o<2^ -AW]EJ ]Ӭ}?˭m 3C!j;>tdͅ݌"Gæ׈O0<O˸gK *mB, \X\k[\c9U"4P:\Yy}؆G EIFS):?ܑ98B97L' ؗTB?,Kd'畔ؒef wp  4AW[:ؠh>#>_cP6 Cma*6vAW)I$^/*BIqKi1v~jQɰb#s[_7OS0V,Rðl4Iϟ5'K -HuaGygX+r2Y5K!||imoE m*}%glv8,z $c(}C^h?}y)3֩0>t#&+,тZt!?+@xbTal5²yD8炆("5o\Z!ߙ-cL @;˿Yw4 eu՞#:kBUiD+>1E #BWE~՝IS x,w"PO#*n"Q`l#mVJ7SiƛSR6uTzUlEdceU#iXCd@#V!{NOjAfd։VS?70 ց_ (Y$K|YB.{[]+= Ἴ_lvvFdr:_eg#ESyO:$%LJT}{\\q,þ"X" ̑ F!]!tJtTH ug gRcD1rwL `Gv<=b2IF{d&sfNeRZҮ_jvBSݔvH"XrGHF)Ri̧-n5*5&jZ05 Vp.GyE_iΆzؒ>( Pr8֭>U:KZaEiԻ2dGꃾ8u3V{>MR .RS4I@@8fÈvw__ml-iI!j=ץ1&7}ozǸpV ן`:q7wNQ6NMO{Z3g 1ns;=A[t 5%kxWX'OB!$u,Oa9 oF} ˿i`|I|1 IN@+*9^ú]6vcӰA{81s(p. ,i7n% ,QqW%ܓ:Ħ5Sn9;-)XZMܜSDJ 5" -o/!ԁEl-sG>ܡփ*GL_F2,FCYf$֢'e4hڛء3 GOrޣ)'RqP?yߕ$Pu"nWR߉8/\_%,:ىmN\A,HJ5xQWk7ɡEʜTjpNx%G>[ kErɪhjxJgChd5(-'n n{KZ鹸Z$_kR?<;1dUFv "+,y,*pCA0Qw(vh J[[?7uA}xo )&+5:?{RC$Exqe>A\,zuþ[.1{А}X{pIs)4>>B%^4lzR? ,?c9E7Q;׷lؕ!E$5kոsuB\ DvWZsN$/-,SZK˜9itMK޲fV+F4A^u I @r+(C=RQ< -3cKZ3+lVۖĞWٌc{s|gȝdŲGmFu& c:jm lSD3=Ggو6,zt.uNe]|wY5-N(OJ-waFB)}l~5" 3~^KseY?I7BOKW=ڔ, N FPacWVXgj9qvf0Mė)Sc (~u*-^wHK0q.nM| DI@jxj2U{E*6Vх5ZtU K41轻R<7ԣz53ʥ]Y'M98=?N2f cufܵ7lε]HW'} %{B~šzо {yep[. 698mniR̯7SO?۔ߢZzH*f[ 2". z.zTTJOأX٨/f)] ٗG`YYqjw=kWb!9b1paΈVs&?ҍ5OE,D~)o5/II.ܱ"12B -9ҍE)At#fQ7إn 5N<^M{v\)D9U•s3ŌR3j vʹ̲v#O5 r}y%{Fͭs*K3 %}j^;ZA'ܳPU[$ۄI83].) H ,ZW1WQ<UdroIԻ(qPttKel¦$t'D$ rjT6Ofe;&SȀOTGd9Z=N+ NLmN.Bg }GsɢD@lT0 e˚<^HDpJ gybނˉ(2`-YI"ѼoYa v@/J~w䈀|0F 9 M/+4f\!Ӳ%R23].^?NQcPdwX|i"F1 t˴:4źʣH$GZ'I$90 A1,?oסrI0xH@ A*%җL̇Xda z4k$cxQbM@Ev6":,pmǔ8z -`+j} OnAӂ>0kI?vQ~H{Q֫1,ڢ{c6w\.!7I# o.nGȽ =i.C/VE /-~w_",@|"}ekC~@Hscw %rK2׽%as=xfS~Lb~75{p^q,qQ`s5³S8AWi֑LKlf<߇vj#Wa#kҒAˑ"ib0bc\H$˹;5+GW_NJ Y'QvfJqgklo/WoV~cΖk U@kև OZXyJ:zx"r7 { 7w;w:B{܊xnVE[ ZrI!: Cd@#V!i5$VmMM֋AD&xu޲UsL ĖłݔYjB%ν4mٙݭٹo_Fٯvok6ns+mLtltjQ[Q[ҷy@Aeu%6+nd#B1\@A>>ҴBDA,GbYB 0Ԙ9rMS ף6 *O+&@>⥶w^fp8/JF3(R5MFr~ ++")ɑHSzR1X+9BO޲_+,Pʙ2SVF6TfCIE5d&JO*Z_nË\ e7z>)+57 8=-)%qy&˭@xX{jϤ*.a?+u=kn7'!0}Ê?*Uʏn\e_ S1̦:{:Nw2\3ZDaC8~bϪTX<,qgG^+MbϘU qc,ȝ. wOc[ks+iZrQܛ` ?G.nCo 9R%е ڑ((uݷ0-UX  Nq8yzWTO/T9 M 4d~K%ޯٟ}(z?Z}_/z;* *i-E=CY_H={ZBJgS\AʖJ'Z#(o1ӕ8$؊x5lDH9>Gߍ*ME=^J ٕ.=ޙYfRg~$]^h`ȏ|(IKfu۲r f&i+BJ )WAT)GKEN 8nhݹ5{ ;e[:uD|/D5pn5޳PW̶-0"% /l#M$ rdTiJ]=焔y6m%L*QDԣ)Ɛ$a{K?@>kl(qHFY6Uĭj:, LV/ЧbTj!F+vU ~V,HOf,J+S9iwҗ}07%9%zbX1hd|"t벖Ar!Cs=GW1,F}<V_boI=ی0[Sϛ@J4~F/AzE՛>Ea~jz>sI['wkRt0s^9F\o\g=n6Bk9r6vY; ̱.^_ٮF|C:_Ex 9 ϭpۥcAcg3PFV5xB4i@*8.ڦ"t jё[h/ b\sYTԺ` x176@op 5ýpHmjVaJ><6ڈ wk^(09t5fh?XS@ϱ*.( 9U\'R'Ɠͩ92(AN!ZOz^NWWޟ uE2ϊ.pWYb#3#LFk6K۝c{hXQj-#vƭ]ʼَcWw9z=pcrt!](b(d1t!nҫLwgQ4]4S9Ƚ(5B8& `)]EWkj^rj°rq$9j:>;?=rj&,BRA3L4򇉶wQo_[SEwޝn7 )[bvϲb-dgαblwu@/?E6TQo@$G6kÔ.{ϜVq7v8qr?{ex缞sR~jNmc3mOQ% sCN#0\lIP2Gq^ܨ?e.rf_nE(sS;'zNkR?cDV{FOK+5HjeNR7sĸˢAʨ>6|}V;A^YmbJriǵO̚CN"f XGe9-A9vOMJMK43\:54-1YOXlűr];?`ͳ61<~/}]fFFS¡ȺOk^鉲NzNN!U5Q2,𩖢yVIDC(G'S6Ab1!]Nucr1!:Kܱ9qS j(0%*=Ⱥ%mThč~":2|CjhAmm#a[\)R+J=X2σ.1lKA!Յwhwx%f:T.Ĵ`bŽ_j/_j/kX҂(\謙>a=تA ~^~#ڄL3b3@#Um"'\m@E0p5mۥ>*&i4"pW``d,R! NrI"^{4k5hlw8G6}Q$Ng4Qh%%KM$Cŏ))# 8?n}-\ư*3+5j+& ԋe$ʀ< <( " Oh1eZT0y6۸IJq**:uCkqH ƬYdeW Ev=ދјK!ђ;s,&ȡ2r'm75Ŧ?ȑn,6+5Epl?Ǹ~؂ Dn 2ۘ!]}R~qZ f `;+-ɿ0*rZr]vR֕MP '322buVSܽPj'j-ļ6ΖW_ώw$IjD9Q%3 %ڴ5~JJ.uRR7q6V(!5<.*wL1 jZ > ɲ&1AAױ9ۤ`ޢْ'H\.p+p4(lurrwG\ςFW|F RUi}Zi2j/alBmHM>S4 Ӫf72|uoEG۱SKz@(mϨe'VٛEӆݭUc\2"eJ.2xX!|wj׫oٔWt,P\8FL%Ų7V-APF3 CZxr :k+7i>3"0>Ԍ }m](yur?7?)?e5FCz3BLRh&T3g!vRB&w\0Fqń K!{(zJ,IǸea{xpyߢت$x!Ql}uٞXV lddtQ׷tLAմc?I KX*^m?uຣXCp)qKCIЉ%14FD3v5"cs2ۅa$¤ w7y+˩A["rBc9!Mͭ-/8~{!?"~2۵4u6]9y0tBQ|ʝ-w 3~;Sv8W}O""N"c^E.[4~V%Yfzd6΢EgZ r y*悒6ht>pԮimT bV_%FbCܤ &=?.h{{h#w2[L!lfJQ0Q3 ~S{m$ k`ʽ&Eǔ9_3~~CbIUM0-σ&1ʝ="鈰 #lѸb+y%Dr7ǫwnPf=:?7}\/_MZ=3lStxAcy}m8Ыtء)/Jls/]?NH#86cPCՒ[iXtШ zoCMXNQߕ+ck' ۠>hƿ1"S"ebDQz/JHrܩ 4a8q90EJ >o}EXPM$kGBCK)HCCڅkitE"HZبZ69E3\,Vx, ';;sј)IvnC!p9PFk .c0oWJ5IE, Bq}3Q+FR4pp$+_GboB?7/}r65Ǣ,T45=ewbV%$HMRh%ȵi|#b͹[[+ɵS}_ԏGh-L9{؊ʪ~h ˢ; x:GVr'IMdXZlGy:RK,U~cD 9TȔ2M{1sy#m"o}y1KfsCEk֡go6פ{he{~4vANF B/ ty^Fpx~ҍ+VO$(>4 j 3Dzȅ=%`RX^glb軹pp ]_#sQi]Gmd6&?EmSv= _~fyq7uƉ'|ZCw" SoXãlS|x^tx/w+1A;A3zڛ-=3{$ȱo|j_ z.`ݑ3@^;&Rv2?0` iՈБκl̠NK@gmm۵{?^.Ae>Zb=mL[ռoڷC {^^X ) >S[M|uy?DX,rOӞN@"ΛRQ^kCZ/yMOnlT;wdViL>D#zw #=Dt}R)<Efý;Rԋ|&rv<Lb/XxqYAu\HCPrEu%+?ܵc_E e4ml#Clԏfڹ1| ćrγvTW}`;+qs3Yf.ю75(Z\xLBzfÉۦk eOwXRƆm<9&-*?JF9\C/>'VϷ;VPNYxzCv IOG 3Y,`8O"ș6U+J'Km%rwXxK]#?RMu5WKvM{Kֻ ˷6h=5qxA4eiI~6XCm~ԟנVcW_KHocLgsynn7{*%Q Y]Æ|Xb+6qDttܲV6EyUu,nAo[v2Mg#? }! 0L~ST2-ش ~49FQsyY,>nP3I=pz+k%xkb_)'.}oA~xS黟_6W2v_|Zj둔סxI}H) JY*BVu'UIGϥc .JK3bD'g#X?n|{27.M||%f>5g%ܰDϜQdNŰ=^&Ǥz&α@r_}!KJ*~q+˴!Z꺤z[Raۍ]pY>#+lTW%<X'ʮpQҊO ⨆nj7ZK 46:|E,3ui*EkäR&\+[r54/Eآvnt|w;=\ъUK0~;':/y)/)fI/wtwadX#%Qt5{!āVtg ι_W<ǂBe ]dd1E<,lXվy&B"˘Ӏk ZbT\K .2-vZ"c?//YaDd|JP̰X{/@w;9+8&O2l(rLvlSG sKr~nX ǭ|kVA9=q=Ŀ͗D%<'Q")9}~(.Z8X0f +]Y{r!Eo(-<6`bzƧL._Y~k0at8w(rcꮌZ|c! ]j+q0A}e %ޥr8T1\(PBD/ExX?bhYa2~"ʉB%Gfi+u- y?F _LFQ$ 0&@\)Ǔy>2R%HDYkj#̜Df냀Yvd[o#7A.: 8vG|ijL{)_1|);*Eӫ$\[u^˘ܭm (BlID?|+z_V!Zܢ  o yQy$E*gEkEEi` Laãw2KLV"`Ei0dQj"y!^hI8=|琨/\,-&(6`(کw r( " zEŒBޒB"MB:,5'-L a;zC@#U!;$az55MVUS%xuսK{սW7 0 hDa / +Io0,\]]%Rm}9Q싇Fv=*36r]љN)),J$Ye88(w}[uZEV,mR2 @XE #@8A B@q> vv5M ӝ97_wYSf܉7.CSOn${6YeRKܟ] Fz=)4IVA5FQ{`Qiy)ۘ ٳj3X3JJ|.[ZWB;]$;FLҲFhezBP%+e3c%;%Kȵ獧NgﶯeH<ȩxKOrv^;,PAzGUhҍtCп XMԼ٪TH[ӜtÇ ׉7fpEܱON%lXx0g=cTF>PH+ZUVw85fcC?ssZpa}K UWו+,ҕ.D^xHfm=/n=v+Ŷ&mG_4ؓ^SC w?O+Iny͚ݳyo`kDO85ϨRU5ئѭ-[ƭU AQոp=45ǡ,˽8GYMiE}%HU7s{oV~1`[M6$p;| DR;^RSn ޞm7KsOǧv>0ԭt2 pD̍gH<ҽ[n{$Ey(x]\nذvD&Jo>օ-nK? <3/il?IGsM7gNp4lNgb$p$a5蜧xnf?N\ӟw (jb'."髵0=em{"gZ&ş<RCv1M2Ey)3m ICCo'(أ%"2#1#e?l6AinQ;!RޯqM,C}^/cz#&q)#w7/Hqb zB˰PR&,l5^F.x0ѭhjs._qЌR,)u?);ki^EA:VPdu|lh5+:5;{< w}65\qt;k*M)ٜIcI.Ķ汶/IU $)ncci% C jՕi&S&ydۂD& d@0..LHQ}+cia֏gBEKD3Rr>3xњ?g]b72D DDzϖ׏N}gF5+$~jkz1m-S]Mt8'ձ;XdE9ܞf 1pTya~:E?ID2Ԛ+>+ջ̹5nހ5I_ tZRD'ҙ[Etʕ\KU`ڡr_+7C(,WڤPx>4Ġ_% ‹ \qz&y`&>A@S`mCg"oAl.sAd&s[) "fTI``B/2KL‰0t0>d\gA~,l,ÁX=2e8D9e›޷D\ךRFefϻ' Ta9#M`31}pPPN!3<T`84$RZI@0_{\!ϟx4Ve8K4p@| ;!uĄV:CXX՚zګ \jĆ8fj@D Hek/[*-5-k.Qq0ivn iLnib\,,"/%E.~@C!O|ZeG 9D|kYu4Bp @hȪ-I.9 PZo@\I+O `\Hɇl4qVzbCX>D[;G })I6o^#qVd=ϲf2_<-c0!kX˱@303U i/1l9(ɠݢGd5jYvKO_)/p`XF 0dI gQJcBF;HZ^!*׵w#Zjz_[ e[DQ,2NK3с{3wnwe۸s ܖmusɷ- I"($N 2''gj(Q<D@2TŜ N[}j6Sf֒`Q4c~20.8ƈTaPơjbYnT],/f0rc;5ͤ=u1ƠziC[&wAnoL5!XsOPEOBsk(eI~HX{{oB $XP"OK7_{A.96Ļ)I'ǬE҆?ܶF"vlx7jzml vTRFD`?(7tT؛B;|nDN(;-'6$w̒kئYYq!MːI7̦,N%CNFFP"ofR xԿB Mz|kCc;E=1w.'୒VQЫ3.JG  usW%3}![C~xY`)t;b}Nh6r՜U9ۆ<r](-r#`Qs9j U [foqT!BSZ ;5۶Shr¯K3~VTdJ8Spžh.Nq7E)q<o~8R{=F`g»S*>siKm P9H:,҈ˉ121MڅpNߍvRֲ;hu|$ YK;̅.~f3k枹S.7OK  &3wYlР%~\>+Bheȋ˲ G9t)j[!Zv;\6䒽/L\/-q6Evv|bCS 6GRfY{M'o8s ?^[AA/EATژ1PuMIE[>'xW&i[o:}@mB ՜P(xO9mA_g lj{U8$Jh̟Kv=亐FYp9Tla]ҟse^סh90')9>I vY_fMUoJLٝ_`kfab٨?sugCp 4Tğ.ςk3Պ=j!>|̂By^]Hn ):)S;wuud(?rN +4-`NʸCp77$mk!$˽WǧiK4v&_`> \?˺"f2Ldtd)QԤ%LG57uJ .h<ȫtP=nD8\G!)H־}"cK9s$Q=kcFxmQnNHEze$+@U<~!FAՐQF"/ҖF;[G7i=MEZ0ZwSex{=cl1UosRg>4gl#|[4hMEL1E^?d0@txbL^|s@7MƷoM ǀC6CUl'1'3n-IS6ltxZȍ58Bfwe47u2N.o14RWk* wu ֙;)/aU{F*3|™T@9۠/iQ^[xs=\ w$ydYd=L,%:b!:aCB$>=uyYGw|},:x&rF+ -FD'=CGyiS~)G3.un|.AM PƝ獘SAy5'>޾X ؀Z7 0NZ1")V"8_G|x i[ bQ'[}2t/]K%mO Pkl>g# p%ub 0=Iy89UFw*\貘76'fYId:t.'3!ŝާ1F8vƈ`ޛZo:Jү5h{TpMP]alk׵@:'~G \k!bU;_W]2"}x[h[濞IT6ٌ[ϲnݪM{pt|8,-gƬ0Xj ȝz+L*qbO%ZqkZS;L|{e;FK|mO/Ԧ/(GG I4.A(@(aؓ"/w`NSlP;(JNq|rԪ͂5UiST]X?00c2^Q599Rͨ- .nֺ)T?xvPt=ŔaF p<2 0֘մЇEX-4b/bS 1yIfTNo"y{辂2GD3q@`7|ryϯ xmcNjMUбJ;Z=ѠIh ܐFG6M?'NMx' b-W[d4U%}rP$)3ȓ٦W" (7;ˮwN"j ȫOdl 5enw\r6NqcW^#YbmXxh_:7'd>(Z ɳиK [lX%s|{vw_^3{v.-cVkuGoG9LD+.!,* MpʱCRȝoP!j á&M5ZW 8 'ȘzTxM>R NA(Cc0#V"fjrZҝq Aprjzb*UVY=F5Y (T:sf8 h-Zbأ)DAe%'ۀ&q҉-D+%i <h6A18۬gÜyjv}TׇQl;]vŲ$SGbwcP;Ųr 3q\iWϯ2OkWNz˿\<Èt gS4=O}݅4:,]Ę|ֶaUA@e f{޾qakrZM(".ngze XEy?ZW:AM`"y/ U)95Ҕi2 \'u9BG -r$%8nA>g{{Ʉ)1Imf i|ǚ` FE^E+e*%͹.1%,yܚ<{\eEuKB)-g1TFxT)nX<;V oU`|Vh_MB?Ȋ|fjgRus136r٭H/5]ޙ3ͧ~;Kys{|Xt$ V*b-~jcUXT9.MtƓ99Vܐn5W~` z;Etƻ`2IDiY*%/iw~/uc$%_-vih^@,' $. %W%Dp02yx,dzUQhlp4uqdíx'> G,#n|w{ 0[K`C"$La7ԇߩ~ ݤ"J"6'6[SS-UTevV)IJVgD*}ba˭}]ՑUBz$|R'/}r]0*u7RqF*|ǿf$q:cys3ðY{>1_]8:ݼfY6"Zx| *[ J_U 1Xt^zb2|:O?vWvYڦmK~qHF,?ad#D}:TrX7VcXMWf~:68"RCRz:"t^~oj/5U=Vҵ.OQMx:ƼQQSZYKqC vQh̼]qtB-0o_g:+%|~`T|"2{l\1'}][ w׀;ڂ}Z;wU0V{U^o7hSu rZm1^+bB ;NcUzB!.zϟŅXaF5yyALݕŏk c-p[+HDIH?dfoKBb4WO):z\p`†pKm}VCsWg327:060nOmU7!UUV<ďC~xA)47P;6^. pw V3AT >ųߜ AΜbulOhQ+˗%nT?&8Zmg1/A:5|ӝŭM> -}45V{)kLnu:0ƏF$ǕǞКkl.vоښZ 4/+Dǎ)ޙ4&i!Ag\m d!AE۽N1z@!G]1zp1"z +!T"OaWb3++F4Y{d\4zvHJP(FiORlM[ݓE45 .OtM@]QQzLcKO}BLY'ӄ$J<k[th9l%0q`v~bub &VMYH̏t6Ǐ~fOi{#8uh6F{c Ih`.VNDqXŠٽ.1.+Šm"@\6oy"тhӿ_C[v6b)-Dla6P[[϶H[D C\/b*+ِ +slceE{yf,U[*\Mpmı\ƖPNۼIY'G~~ ,X#/Jwe-J%jA#r?%p)\44{\?rb,a{tx(f"Y l7Mz0tآd}\w,}uTCujhPc /ITbH;~۸YMqnP-O$n*Dֲ6R}j='ScIK|j9VN'r $ϴN~SZK;Rx0l~ \ڄe|`fW';ii~2P9õږ[*ɊQk)]T|oI(yD`ү 9#\?ȣ^*I )ƒgэBEQHr,;o/ɢ\H,&&TWt)v,(~-g ;-m`>RFEF2_ҰY-׷|!OXVr4NKYZV{2-隲ʮ}2ٔ/yeX~h|1Ȝ5kA%ٳ7ؤNJSjdG|M5*#A5KlC7dЖiȣK Cad!z8Mih]<`; V̠֨b+Boz 'NbqK:$٤mU[Mc7_CÈ`X`\;kkC!vUUKnfMxngΐpQu|n<;U״(cTxcxiw5ixAחu]^%rk5Ƀ FQIxƼ̫.!qxu\M 0zQ?sY~Zٍ죖fr,$uz?E;h\#K^\lak ~/Na8ϱ,ܹԼ,^]L"Qthy:]^G!9;mXS0W\j!Pq%ŹxH#*nYEx ~5pd6!vprΞSUy9siiMCڳ.[qhĘ٪_>4f'Z&mNW\q)8;),-Ôe\ȫvQw:~L{1'tm?rE݃S xS%3go*D~D_uC+`b9omRI%;sBBBI 7 8/n|||"7? =ock,\UhO Wzu EPPR\tӽ~CQ$/8 zceynFsInoK@Vc.{Xƍ+Y`Ŧty- / mky?t3Eȿ"bL! q>S 2C&T3/"pQ9S{3ę\ُ ;DqɱxSY(8G]Aΰ͠L6Bho8tj{m>u kyN0x;R{43,,.g ųvC1v[ړ, P`1% 2WMpJU )s--2wvA9V0( u;3n y ̵g稳R^.iRaWrzA6,׼K籗kmE@aڊ2urWI8x]A;7?odLSP~r^5|;Y%{{UERv/Qyߓ[[E8=#BM<k<-x e$Pu_i5 4"]Âw _rw(0 kf.W}4SCd@#V!NƆfuVSLfUdKVz֝)o`3RO-Y-$[L_rTe9-wDC ^K{S+[!7DvtSoLMfzf&۷i]4P)HXA~jU4g;4PW"8C@ >!| (>A+d.Iw\d f ^+bsX:Wb)Ƹ)~.N2+fʙ"00ԖԎVԘ [elJYųN3VmˇҶnfiзwmK9 t2 .ATIH3 , SSnף{c?</?GE 9X^$DpM]Lr+25@J`U%^y|s1fBĹB%m GT况!Aiv t hw ,?UyrOV)V}*Vxi/3mpR(l%qk FQzOW%ɉ$@qhɿc&,PϾ_"֌vliJ]\_A*b\(Ou 2>>fߵSQsLZxK5Sa@Z5OY=ݡ*Yj[e[Tk~4>~M}<:nN-I{u uDMƺګs.x_; K˛7&'˜+6V,|6WdW{kg>wO^? X)Kzi2Ԏ#ѷG*꘎嵭].Zݶ}ʔ7SNyAL8re!g\Kr_Lo݆& ;uI]5\J%} :P=BFHo"V rW=RB?J?+Rd}x.NL cf64tsI[! M=uथĸ%n:VB~T9EyePW&KHYeaj. ,0QS8񠈲]g3.rY^  8,QN m9GwRWբQ}j鮙bB_kiO:u[wP 3OT RYeW!ݽj*%hL{ra z3 b~jˣXC;fGfEMw-+!t! '4u%fTS\{qk-,,קL9|v51Y2Y)^ " %!&I0s| lYIPC~:{D5EMvݩrbQ; jŷu%`r&^,;}S8 ؤ)[ANt3 JM&Am%İdͧ`Yaਬ9xѱ#u#DӇdi`,w%[Hs ZMVζ|h?iA N(RC}@`+R,/I7T,zq%);,2NCxoBJϫ|AȒkokh{;;kFew:j߈&I*Ö"ʖyS'ʒ'yȚUaF9R*>fjNI\I$sQp2(kbD/9\tVHrWJ9'cj9m PG[D%rfdFP.eґ"%.̗Di-LL?BEZ16Mm]ybnLLeHٌuW1㵴[iSՆEaN},Y]+jCFgK[˪5'7lu1RyBh&cyj?;^2m݌;Sٚ-[wHkЗyn[.P1z=^'}drj+։it[  @#{7泏WE*?D,b3gxO^ÿ|`|͝[/@ 7="SG` zQf}QY&=j…UqJǚ@3Y+7d`Ti>;BRPa3#~e/:3 0ʼnš ";͛_&Q eGNͫ\iNf5&@῵[H jݩ;bMO؁Gm l7cqn_UJ+\r oۂtv ζ)t2 N0dwCMws^O]5A5Ĩ)JȘКʹ>p xYJHRIMoI*,qD~\8#n-7GK@Eq(JMfNy$ݹ>8Oi )X`hwT1i?UY^ϒIu8%vUYͩ[r>J Iݮif,&=z#uPǞfB [+a@*&՞֬Vg's"z hXCKȴdgW1{s1WS"yq.M )v|@g}H2޲}˛y)3hRO4el7*o}W+s 225ҴdUeaBA{:p9sƍXeJ2c(ZS Trv흵J[0sTb܁bō+T&4&j*9˫UUTU`rOqf{%,˼yQ1zkSg(åcJ5BXk(tڡգ ?X#y?>TZv$ˡsɱAHuGbٌ`BenLs G[01mKwOv4cNRGlY wC[g"2F;S:Cucq>%WIo-& JV*h%Hyܓ>r_4Y l%0'?pDže9/jKzP]--23ށo6 Vo]i}0TW]*ɪNUz+._JTaXIt̎Җ(ʺs16Ej՛,"3wZO;ykkG*TXL,e}[F)9zXON267&cƘڙޯ-nKkƣt1u5A]@&IIkb^+Pjmq y FD_cYP[YIU*ە9_$?_g&3Rg'tVMf }"hI,CC;0:'[*s3o~FVj\ɲvԍBݠu]ڦԌՙ?X)OדQv:Kfy*?s:q4|nWgsoo{ڊCCۚ4 \)F-s#дrDG=ֈKW}^ce4Is@%[JN/HE>S:$_ G+s4;kRA Qna/!ԉ-Mwq;l'H>%Q|hv_@%Z-3CBXM[.>%jgЯ(2%tv`=%nt9\-g%j *SR[/JdrLrdz%V`I%;\uHT^LtA+[({qE,8Z}9(T~B}ӭј\uENAy-z:V >j: IG>tA+vGc@̍|]ܗpKb;(T<1T}kL<DxH\4kLJ.:E0zP⣣xԧjy袤^rxvf;3Ĺ# QW@Q"h>b>0}HwN#;mys( ҉;nyO"E#r >Yi|T5*STDX-,~肽WُHp]ԾܗKbH=(T<1T}k=DzH\4@tW"rM+mEb̧բq\`.4bylUqY!-Aʭ*>TWUP;jb2PQc`4Yn_0}u)Ƃ\L4Dp Kq]33 lbR;jأb5΢'>M3C$oCY(8,| njSZ) k$jcm`o}ZSaju20dGB"-ﶯT+iO GNw>{XTFV`D)*7:fnˣDҢI2/W9դ{v~_#KgMsLêx!8p:ULu( ."Gϵ/YHU4"9bq8z|q6?"?+{xB ?uG )Ūku~8scܐWFI关uXr"JE.c&- m넺M%h*zԒ- `{kr!k9CǶEdX:0.(کF3r7t7{ [Mwvr-oi~?I499ϴa|EJ44Be$} :|8OJʾmR)#gGs`baR.t%~j{Y$vv/Q1`M7&uh51fWkn닾˻|S|o${=WCYYN\UH2W91L$$eῑݱz:%F[2nU"Zwמ-vXa zxQF~,C(JdNwYౖ,fDrOH|Wن z!mT%CJnQ{'%0@9V5ͽ^wjoK2h5izh:t=%صڪAUԔh:7Suv]9nJicM&J1(\5MuZ?Q4Ȱ iiN|9 &yX7sA]5{EzGՙ>uD\* Kȥϋ4A)^N+ELwΈ'4}e-,;5CŒJa*.U[kd4ER%Y[_88;Yoӣ>&n'Sދdm?ޥAvkZcEPr36 :)(},GYy (*U(r6 A-2l _2 UWD#.KLSB˞Vek 'qlXYo8 ŭ' ԧn5R\cOj'.U1ËXU6z$ 'j]) L{tynL'6xFY'H9ug(z="Hyjy߄C_i`vx-'u㽄 k 9o5lkBRjַ3H~FDq;nxય&z[%BP".|-Sb["|-P/d3V Lb# @@8@3&@I%0=dt0yO/)>:ƾ+G>3׺i܋4^QmPL["{0£SŅL@KW^N iF\ۚ*s1ЅB W\D@y=4W^Xj#O7pfMa >e6AQ8 >7_3a|86^QWVP#.+[ {z-+lrQnB+FC4 :kH+ݲi{x!@7^Zꬢ2Ţa^ |D@):V]"ěA]No. @4 ܹgW-[X3Ƌ')UOS\-)AT- Cp._߹[t?< 4Prx j-7|' P(e| cmO1Qvmٓm=grGX\7%g9an 7MbD6e'VMBabE(JώJ3-EwI*ZvwA'A^I4We__ MsAp\p%WUH}Yך"'(\07ÝFvЌ>OG/O@|nj/A |aH ,0xrO[ ":ZGkiWh^l#~M;(0n  ,,dӘ90\Ԗ),J%斅~ӛc;.6Ʒ[\pEKV[gy3(F!+^6oT) ß3eB9";_G8!)o;r%wbq 7;JcWҤ:t>eI~g ;))MN~,J|KKZPܒUGRj%w~U(ї}?VA˕ǣO]uRD73QZ7)q%6MT˞bK.ꦐg!Z(wsJhZD+;׌ԗ5txqhKq'HJ I4\G I''ep4GwrRUs\N/9087c7RKtmʳybf`cENL#ٞ L1FV4TWTu=vݿyzDĩ6"IL ޡ2_Sj G dOsKm}eXn"H;7p<^ |&%<Q(!T2aw %9M`Mmw島eô{粧.!bg{a!R[- "G 479}BGJD„E!qXǙֲ$׷ªJ\̋橺ʜsL%"\j\)\x:U<`Ņq: pa7 yC[9D&|ׇB7\⛏tRCxCڹ11r[P!&>qOéc˄q<a? m|*s*]?7rT*_34(qƜr_mnގq/$ۺ;zxmiXA|UL8I{+^ %k&*GBf}6Է-Uo֢FK4dPFxs鏱cm2=RȻ+9s_mvi>iHIrlUt@]YYBڼm(MVKڶV)IUheVh=R͔G ĈW5hU6gtJGBퟙWu='7`1]ň|ZeP_/xӥڷ 0Ukq=Nڲፗ(<{VL=֦e^GskZ#J"+m̫B9֗T%V3E)m>Iݓjꓔ!RjE9ŦKYdn#kU$c: y]1'D0rh~^趑MTIi҄uP"UEX`ͺP-:~~&eK]׿U?{Q ,9cdc3=bx3qy;RgU͒R֚%ѯM- EWW/rw_H؈8fRr65?@t_A{? U#=K)% LK|v|?ݙMW}>+(bNK/)6}tvLNu KԷ":ȃV**UoXEeJjG="WQRAOkcb 5x Ա-j~Qa]e2g4Tn~-do6+z̛KFabzsRn6)'F| ,4Sztl}lsJۋX%㢃6cis>QʂF}rUGy%;u%̇y7%3 0|ςYJl| | 1w@t1K;E-/= DLް߬QIqmXo$9d $14F$86kEБyhb$" wC ` /v&dA-#6ChHσ7G}$Ƽixʐ!_AdC=,W~#  AoL8A~w %acq5ȉ_m>`]0@ }s94wpJtZs=hujrKf\Ecdw^fAI=eꗎK bws+ (R^>ʶZ΢{pe-:EC-EQ_dYO-Q1$uB2_;b{s>p 1v+q]uY˺\Y̏Т:l8YuY ͥ542{Q\xH.3a6rmUwo 9@0K yOx O[gɥfoUj+axw, 'Z!ǶЩM KC8+ "D@{QAn +vcTiw++i"ŭ aPȤp##!{m$w5tx>lhr^N1ӛP/b1YMqUѓAb L]`)4T+BeT.a]$͘끊mqwͬMue..x;gd,dQϠ Yt]98[-z340|03޸j!%.sh*[{cO2B{\A?uy)Ksb ד3اhU+tLsŭ2Tv˩b330^Yç}yC |U?BKG'jgdd,D>];u} Y,I@~,T͑0r!2l2$?z 2q_ȯm6QfRg[3],~3'Ky]:AUF̄KIL}NQ(Q6%>];[ߝQMDUiТA&zh Q6&ݢ,|KV㣴6I.~+ICiTi riFim%bmAC ik:20604؍O[ds嶙]$^QM45j|Lf]'?p%$Uj_wbְ\m2vw{]hc/e:L=RʒJsB̂>v$# L;ڧH*QFH1Ɂm qוZ&ь^:\͉E>P&^_*C }M(pĐ{ %,>ۧ5l9#vumb,֯Zj-ٯ]W&҅Bn7z0d_k4-^TA֊$!XfuϔOiؘJ]?vL+@J81:+ ֯i|0d?Lu.<¾!WIX:IetɴWSml m]㽛KvM} Ǿ/g} o٭s\2s\!pӳ"}i'hf{tu-VK菭D~ (~Z }21y,ԏP;ucz?9h֐ tg^`)y%6)jAh3+8@c,`kK! ؾ;j-&c|gVk(q,PU@Qlg}Ф/r Y##"DCTOu2wZ.Rd_ZFYUN^$dڬr6Dڊj3Ǻn)/~St`?vγUp||2{+zG}6@ kƵgO-ns`'UlxFa,}ZCH^(%ҕ}o``Q>A075J?Pǁc>.XsIG!!.&TXl7 0 'UBK x& PM+8ľm(O#h>^G|A\[H?30oY( SW/|ϙ3C1B GE'A!XݵD؃NTZp/~:`lN_!pN"h ף.R]gK'g'P]2P۲˪D+[*҆X?:]*L{0,nGuj )Ai1͆Mp샬t0.Zxz> ,] !&iڼeZ/ Ff>F*$0 On>`;bDVtbDbW0J|o3IhG3H%rZhZ/Epuqt\y8ɓx_!i8ҐRv4V]䜬-7&!f?YN,tk{@Y+uM& KnC]uQPooSY>jeAg6cU:?,=S_;}XfȫԸc"纚Vy )P̔fLLz|ҙ\i)i)jJQ L \iR*c$$P!m&LفֻPBS Gg*t.LLYΰ+Hw#rNr՗ϲWnl8zL#$\[B*IsǤO:2M!M)"w3w#3-}:ɷ=6_=?=cJ䱵(Jj]? ,41إ$Sk/z[nkj:FsyS vգ}ݽǰyͯcD6>.'|ǐ|7*jfE! $ؽG"jN,Պ+{bht_njPזs*UҮQc_r읂пrP|8Ѿ.xi'N@UwD1KLekZ.OOƾet<1Vhǫkl>BJ I>4i>/2n}\|RuSEL#qz8]'GR?4ⷢTEJ} VaA(~rM!)| Dk&׾<393zSH.bst`NJg>cĆCĘvM`_NlEJ尺W1cڏTE`<`II܀M9H'|_r <ܟIk9*p(sVocu/PV}/7 `-JCA*s4Զ ]ڊˬBNb0(hȜӠcEjRD\PA>}AբD$hh޽'r4y\TτaTVQ.:C}[gLUJi:H|0YRDaC9 )y \O͚k z1b/. b=Ό1h~vXb I ~_ͬ_xҞo.yӺqH3+2*[yBDAGKZN{y_.xc;5*@RV#~{H&y_y!b^|X#{(t#%S&γ}GsaKAxu!H p |>ҲF@ހpi#*8c@zG@NjCZ:.8P5qQ]X,+"!-k(3C:J¨C@! ]`?ѥx#g7KK<xR|kM,5$K$>{&Pdg$*oFz*}މR UsQZV2ii96B(^3ς<)/R] H+637Dr_LMG?p18r:M\'.8R|# \XM.F'K6,keā0qi4q(1 CC@3U !kv6#9[!{뷬]I3 oX/@f F~i! - `˶L}.cmV칷^Z;{ٶ}+uw˫n g J}B 3W6{}_jk)5geI XI!^ ҈Ix=$6X<$, ԟEwC8&RˆI V Sua(dEՔ(,Q&t3K `g DEfIeI%%&3f҅] q4FfSJL}{e]$~V&#._d?D|r%&mކԩW0~{oF貭\3M,Ңyj >oS)HC+zoMW@7Id .רA_eg ӍJ!$"ؒ])p8^c7Ug?99 }#V=yy{m 4yhҠ!?&I`H -JU0IJ2ZYkJ*8UMnrEɎ[Ʀl["iQ73p O$"w&fp+w8IJL::arIUȡAIh|K~^W~s /*R&r:ʰ NbC0dS≲2W^ɗ:iJ̪rڕ{j))콕Q]+yʥA`.(5JXUU7[Vnoov&?v^[ȦXȪؠcSv"ѮGt3 y4T&YjpҪe5y)nz*#y@,*TfJM)_kl >]c+Vm.)!pXJfW0rbҫԪS,󦌥>f76R%X6E.xm>[uK霣,^V ~vBIc+yt9u]~D_$TxK#pTe] DMF\X$|xgD>ыrU­St5IsxܝvcGxhL ՝8݄? m7ܹ5Żx"YM)i trIHf6;>ZyY)mi2F^}&+jzw,krꖢS5J)? 7hX;Wšp^AZLSHw OcX$Y|ClÃ|K )G2)_B¶A;ʞ#2څ'$Z$}w^ wѻ|# H=1&?oBi>PfϺ!*?|%֎/6[20pS"P,wUgNq'BȧBNNL}&N'opӸ|~'NÓ$ Ӡpɪ&NtKmwg,l˳ [gtcl|@g##D=YP ;5Z8?y껻 S X_;&JR먻 :ܻK՛ObjHˎʆ'#JycyumPY_eІA:i ;>e4 V,tYvu/)dN`d|d-tz ]{-Ms}$F3#t5CNΗUBnwh>5>D 33%\jh_EY @%_!]+>+I!SK<l7\oE=[gXuEEԪ)o`lָ tWrwGEr/q$kt!#sA^ X7UƊ~UEƓ¨ .vn55FB%ռƽm "m9S^YvZiF܈9P+rNuwt_ LcS/cGB՜9,f+IJy'TӫnOaS/AL5ۜmjђĎ~ D'L8E)Puc &^cuڪjE,9DKO$馋Koju)+Jqk΅Ns=(=ğڻ% Zq˯"%TGoVk9ܒH~f"zXfjW׽]?ao)#Gru:-^ʽUv 7RhG*S<7]Y)49Nu/ $w1;%"b4u)vܟdc]Ss&-u ?=MK=' B)t&BO݌{KI93MC+wp\ qPoi 䴮jv-qSδY|kTW80`~2Ws|Y94媵pt*/9H$*${OBap5ç&G:P~zw1#8qFal&}"0<ʑO!61"{ň!Qi fmwg?M:̏*Z!ɚ[`/3]ТvN<2wa!SBh7}VHTudMz9 uY'ÚKKڗ&>T]O*u>WA(e'&[I{WQ|%S!6wMsSoWEj'E5Bl50DPƽń?BHX!€"xӔsѻ#"5ZhGvGE[=TDUxlB2rx!= )QA  G/&[G]ݩ2OiQ6x+ƢfWZ,*Iih\$_XJ(^NXlx1^<Lu[y'#콋͵BG RI㌸};k@AӠ2輅n z]vIO`k`׿O-"A̝k2ӳԩ pS6V))tsCЬroR 6 nEHGp+\SnLzuE{O[AyxCUm"|_O!0$T\h#rwAKjnrH~=dg5>j87/ ?&>Jo1;pD{pX P&hpqC@3QC5e/{Mi̖K=TH5_E܎/NěqzVBy1-= xG՘W_VʭUPw7Q J| ^A^OW>UuJ8dv3{bm$m_NUiV]$l;k*8Gg u#@7n/*md_"?S[׈ Y/,#"y}DixCqU˖.H߈Bj\hR\My8y-k;DNOH#fvǀY[^;2޹&Xw3z% `P c!i#t[v6Q܄+q7<63巙0&jhP40^ 0M&v}/(_1]QLѲ݊W7P -VV'6hwY[K̓lNl^8^_W7 uz_o]4)lݝ `;A[;2)4v30@3c@3V V9|dimY5 Zm;m'Ϯ{n(@a+0Y-K&],R&" xୈWcl;wlk^hCwCV!ќ>=bq18Rd31 .}o~o- #`5}{o{kJ]eͮnԺ,FHHҺ V "(4J-^@1+9s-_=+ !ISGȃ2dMͱ;e(=%ܩfuس-0Jӓ`H˫nn"TfPMm_tsam~&5)^fG?)쨫IyFk:6U].Gd{ȧ(hZV&T]ڴfsV_(R=vDfE*4+F O@[َ`v%m n5hA46ˌ#ёXvU` @V6Yhwf##U!CQ"% .uvxIV4b$mIҵKBNPC5l]\jo?UXS9> qf979$L*ɻwY㞨qIPboxwsGJ4 i=UPŧ PV:/">#w8Z@gN.ߥݨSQ5jw:QK1zPhEI.ٔ`~8_(zcQnC_ɮR{pNRj-VHƋ w\c|5(rZa9Ng-?)8#ǐ BW;sgėt?1&FI7}$'Avߚ "DV J\޾v,Aga/Vd~sA JKn-^MV~[Ă@\aUǍ/Hx"fԴ#)ΗnP$>ؒٻlf7*uiBYT$O+MCٛ=`QuY۫h$ KBӛ̓B /l9)=\jrPSy- :,,Ho%jJ>풽@BYPֻ5fVt-VěthN:ewaVBO"^/U|.kpdW:|[Ni'z2z_JoBҹ*;_o|q׶JҶMT[f%qoFmk ,L BצXw^W٫L+Zg'mBug$6 L8,X/F34i7LS)jߕQ#Qf(Ŝ!\_)%Yj6+񄈪 "PjtbEX>֐iAd}%`ͺztHmCDz>8sq){QqO7t*Dya6 >hC \?}q"0*5+) 6zi+}ObN#gQR_h4nb * zѕ0V9*j~f$׾qCA3|kՠ9m^ѿV;hnǦTJJ*x2:ƵO 4Sa:&tnC$ݵ%8_ CiGwZ @"`0Wys4Ɛ/rܑD1Evc@if= ]& 73.~{#u^jt'rnӣc);e{N۲zr1~NfxagE<]~&*vQx"Јj؟2,v]|g*kE2epMd9Qmj^Z:0{ISbR<f'|I)*wi ! pu#~NXy-KI-5p2OB:$g7MME s]c%R}c>iO,%,r~J#Fv[dVby|nSz;?5iLbLQQ2಩(==cWK&)svrh7Iԡs!9fTұAdG<U38j%E-]Gw p(u]Lov` KqU,RTf+ўJڗD[Y\특e& F-n4O@|}A=[B)ړf6bE 30eK6zs i:I(gj"T.3[ݼ&ȂZsv 4&,9b̿Rk[%+OG*V=5yFb0P%|a\¡+jLAP7ԮOG1!^dhG߿ҳq? .>k2S@bveI测"p HBQ[Hd4-*@DjqPjniϯPc('E"nH BMr-)x_4C!$*?bq{EXlup fbC2.،y=\"[ !kzBy!>*TM*̺$bm.םTTTbkd*,e8~R?)HXqRbmqi >cA?Iβpb!%C7k@^K%xgx!~;=] O[t;m Gǎ` YnƛeqY 5 lRG/9ex(`;ƣ޳Wc'e{/! gO;jl/\6ʆq˿fr\؁difĀV}PF'xb[GtSFz&LaPJ;fo-5]=5E3 SS3詁ShQSs&gXxj fҀzxg&\x?rt3rv ~HB' qSQVoN@Iĵ`wcYO3wAI-2QTd1D2g3Ր֨"I.#^: .@3@s{mҕ:ӷ`12D ծ`jTԑ3O Qe<Xy g9J P *cda3.1gj}xC rdG U4e@#nU 7!mL e2WEb\wvk6ۥU'pv"P4t`Q>~[ eZr^ʎ#= ]VݻӰe)H7lӫ*2 l:2I?%GJ@jf {sk۵ekk.-kn%),a I6X@  a!ADT$x2 >_fi2 'bVRhxÚ&J $Pʡ!+dG+f=F7Rڑ4+ˇ.ʕ(Mgk3j^vQ:Vz~cSbcl: Jon؜:#"=qMPd 7gx ]l5 Zr|,s&GY`thM= ҽIMfwjZjg ;4wC-lI)댗[ I"Rfr7K1e<*[5.j+*xtM-=cg^lakEpwHH~.4V݆TYq[yߟ`!6_zNiC̬gBdkVBk_) \݌)f&[ KqtcEZնܥXASX_YB=i^fn]GI,c]ءǼJ^$j-J[ސizA w *&mɜmie~lKT)PM|䩱ygRz<;Rx џ>YIڹ lu3 9 _)3'ٸTc5h1%.+yL.C9OwhJY,vZ|)څ4.9Ac}q-= +*MM>{uYBK ᩝV-i3n1'V=Y陪g´W%𜷟-!z!fXBǫF}va&1Pd1$ Nr<[$%Uhͮ DUw0"'P9bʂCq!w'{{4'|g{LMJ1Ou yRlt'OcsP7liZ>b0|A9z^VӗÞ %}5iAnzoMe]+nrz_ݏl:FRlx  Bx7>jTts\͞mCBY6ȞB?8١)'ә_RZ&{N7iDO;Qb^q]+/~reJ m۴ 6wOh6_o=bd*_vwIi4b E'ˎݩJ]H0zHĝ?ІzK0Z]Pħ4W8aCRs C9J8VYq%jזT:adkB?pnu[qPԋU̙t+N^ЈZ!|TXuB1ʪcY(ivY}cm GHxKx]uZ8ng4IAYޗ3y<9X8GGNДk8k]kGH )(oX/&r2ƀ,ZW<?uqpsaC1b;oypi ^ 1DALu^C#?=v#N^.sQ4~<7Zv+ {qtBߢ=o(+e3#۬DG7X%*Ս*OQ~%r_┅Uf=R `*#M\8+Ww4'Ft,3|?VF3d+E8K-*{W|DP{b[M {o|N95WgKRIt}vF#+Gk\E*qz)w[2+ki;j#AZMU]M{A3tҰdzF}ޔ%z= Iv1n?UĎ/#y{IfT*z#_z3'jb{ ?^zkSߝ"U ]e\h#[4>r>[imiֶSy-Q|.0oAV~1]~w AGDiЃiȨ;5,3 ; S'#A7Nj`/@L4’SY80_Gf1~q gb\Cvϊh\=!gu{*e&];39CM@}]= 7foВI}XUu#Q!=sttMC_"5MJc/<`gCGNT<.x_XMorؘM ;aH$}7>Ux|7G3D,CdΡ{s,FJk xN ЩTjE}H֍>^6>!l%5EфmEel#\[X/ۦ+ѩ*N㙍X 2+U?BMGTpj(Y]"U'H3p jW>CtjT [ i-&M7ڪ4Q&aV1s(#MdsRQ5-dR#]&wCsSB<w޳n[r7:R=r]sJc2nCɑYdE'| ӲLuݤY<5q =_FcmU e2 G)9 ;Z_LY"}d3,5G.a+gszKR=ڒpDE1rBbx1R@.L/zEw!(8<.ns8 *$o܌ nfت4]zl3"}ҟ@%R9i9&,jYP{dJG%]u 6rzy?g yjr H8v:V|֑L@0rc&XIw.'dG @V4yJ#%$58N#) LJc|eEҮkWoXȊv2/ 7jKD&m_ܐ<5fTwbg[E:SA\M2&V$W(Xt;Sx гbt:fj\yߛ{൹s)1CmvG[KxU$>,ϒˎ7daI[cRu Vy8}=d Li N2ԙDIÞNҎUQRtc!+9^A}K90i{1+~[R>Z"DNh ܟj.]!UE8E%>$[@${Mߪ&tOŇ!ը2LbwvzdR z잡Tب*9A\ël2?JdJvCFV'dr4_UoEr3?cÕ8pՂ%үXlY5͆ ’ZP(f{KP%춰`vHz+Z+ߋֵ穁 ˦df֪y8vPSs {R<^?6ZtDFiݞ5kCI%m)2,Ѽgih$?k&͟ȑ=a'*V0_4]Ŀ#vr=TCXY}y0:ӛ~%ϊ eMߔ'{1Nv^:6^gzcۧ=@is_p >;·ȋhu)7ztx\J/ ]7o3>;5~¾&l}-J`zݸ%+?q5NWGVՏFgmaF=Ē<,tO? UZx'V2=TNll@iYz@f$|lz -b9տb1rqPQ ίW<9Nxu YTchzI!z\' ۸2qv"c`D6ڟRgb2}|O *8>۶A#VSrfs/_hS~?ii$ tWf9s~%WfWSlAj;M<@ 1ΒUj٥Y͛xU:k[Gsl_ױu[G(ݚi ozʪA3"H6rTERn~ЪUjMca`&^il(]P5_Ӂb5~%c*ᤅ&Q lYMVw,L18Ʃ6 ,6û8)NnhdHc k_|W{ d?Es#B1 C Giwt/j^/܋!U~1-ԋƁ:Oi!3c#XU_ PIT>jCF."l6V ˱aI )ʴ(Pd`{ 72-IzU<ֹA_.j܂~T&Ux7<Ua v3$.]_Ю,|x+kmT^ئ=iN6ZxMؿI(jn" f4;vAh2{ $#%բ "(P4 a+i!&!G"p6?+3ʾ6o\Ft4`pgF)@>EכqO#Si8~& ػ?r]@:|d8?]:pع¥yEW\F b_uxab|^ r#˿!pw^De1iaTFgq[H1Q9gv7 زU=}DvH(~sl|{}F<_|.FŹAs?ኪqsYO=HN` [ (1Ihe=NY7d̕.?OIA(n> {(>ViWy zNO*0ٰٵeSuiz mPŚ(C@#oV!;0jHPV5ld)V{z}n~)o`3Ipm2e۲De7uo=sŲv^P ;;}t(ʰi2n5Iz,Y(|:KB#CgE@ݶvۭjkZ  b !!+ ?$" B  B1'$vgdqEt+v(RQҥFC+"&BNʲ:1J6EBK klUݮ I;'" PXgS2Lx]ߙf* c\b䃚Q"6kKl bݔnw%ϴ>6g6ᔝXe3yy;Gy-ސ[ApTA 쪡JY!M`[Jϒja rȈhda( ieԻuq *sMF=}l[vR\WV|9hꦫ>2PTf 7p0E_ֶ;ҳ>ɩMa9-slTXQQom L"]kտ_$tbX 7Mvkժa4,YXHvL<Ummڊ!"9` I/a3ЮL8hu,}+>Mtϣ EЪZ6V؟_(m;㆐Yb1P|^>GR\P ]:4Jsݚlγg}ZܹXzoL9-Sux^fe2JJSak_N'LҸ۴mEjy F2z4c' p #y$RmrIk32m?ڡ Cm)p4w)e,Z$n\4QLFLxݧ̫fcP}ČZTF;!{YQȎ=\;` D2 gϬFjZ~gV{nE& zc5PFW}(O\˜HVA i ! hMcY;(u6➧뢵셻<]i.,˧-5jQ*e_?0-8< DIMz'k 9l;*{KAcѩW2񚣋6t?p6F\7K'dmeq[ x7@=(AX; Md@4)/DKd&&eK !rq,%4x̱=ݛ7oD9Fz&m΋'A<=s֑7Fr/!tp՜-)iC4Kc֫elIO!Yͳ=HaWCrӌ ')M!i4x jx <= ]}B fFhV݋F1>zOwvqtL|iSvu%GK)LC=ld̄umc>9 8t~GT- .X1T1%6kZ'*d_^z-ѩ')+GI^\UkŽmj,!Ufc(2euON CͮM@<_I&DZD;@28ܖ}ţ<̱>Tci_puEWaBV'R$c_%W!'(q%y+;}Lb{k0Zg+>R^Ƭ(-u0B2GWcАRqm~_Ň^8+g;*Ǐ%Un/6&Tݶ!ϽO)?Bǽê=tt;?q6"XbάUx<8Mt/z(s:*"= 4BE>8ZGΠ!*X&zD UiCFTCe'UF7Dȕމ(QD*zܢ"Bjv`'*bHD8T@!Q\jv=KcG>j*c/m%ZsELFH49%Ȍ -WVXV7;;?y\\t'&hvdaT\-#ѧQ, 8htMGHKV2jkGN@'Ak%_#MC L4\Z`5)_9j#:@I^h$7Jт\\Ւzo5Š(" U7g ~jL.פ}d[hړͼ]CuW(֞ћGY%<+gr#D܋`$D R-\as9념+̽ۘUՅגiL!{ūH* u6HIZ;_>\p_ Pdu['!Ou4H6Er.2q@+&)ɭ7rɤ dl!.BElLPD*N}K$.Q>"30DUUo{]`68J9rQaXFC?l|'Al~^a;#A 7Ģt̮ؒj.sǨjΥWw|SUBqxH9,xs%,ڑnh8:}W*CqcLIȋtNQ;9Զ]*MWH-g'q* <~U2OP~i-wqpt{4²/'bQ7~+}JU!;%i 3pI  i q^Di7hâ₵jc ګn1myJMԞf"<5_- 0?Tz:B7 ~H oRoArsA&hi:,#$B-#^V0g96j;i8S7xOG틊*kK<1lO|ڢ<,=L"IKfqqƍT@KNkI96j"I~8RyrDi,,f9Hx?p7%97h6'Ahlk/)D[ QitRFA@AA$U |STՁSE7WK=/IT Ct@#V!gt)dXX f6"{m^@`hDc /)Y@VB`X&UI$Gee`){Pdo}Pv{DC 0+LX LWA$²-II,Y}@@|65kzv[r_z%q]8"OO"h%b-" ~ipC-I0ɲ$MV[7%`er 88]IjE %lZj#SiSf3xB@ l&~W(,u8A~/vÃzAQ5k zI|(/BRaHmkbPI3c4<6s0ak|XݲvҲW RrW>]G5/.up- wZYQN{NQƅ}lYZ&gń>bcSF,#t| 8_Ʀv'}ĥوO[`UuElNRayS-tiRc 8܆C{y0PYdU~`']ڧ65({*ZuK :>mKj! <`CAG`Ԫ+/ o"ެd xiU:w5ݝ~ys_[epi^=| 0Fjd=X7ih?H_m}^kx-/->ɦU}YٳQj_-v=y\+=1d?M#dit{iN?6:6=/ "EuNے_@[C Ty`yds)U5bI%B۶vTj0 .I,/  '=qB'ޙii8Uq3SޙP_]1pݬAMlErҽ?WP1*ETrky sSyd(] mF#豫[aw} _M̽eӬآС{k!"'xeNfmT)Ye)GTcڌBr}jTloT%+?bk#r6F!Kn*b)5 Logpy'O[|s,՛A=q uk9Ǜʾ4DX;Wjn{.Cd^zB"ZT|=O>Gg4IYf(ty$/4Lf JO˽UE[/k }=UFlʌ3أF L_(zg'ߑ{`*'E[*|>YD.Uc&Jj &q+#Nֳl& U`v& !xnB{~,ފrQ.ƅ/Kfb~}պ;dROy [SpY{WT15f^1ᷯ\%3Uti;-RpkE'iMU~We :;'m?@hT3ڶ'act<)*c^dϯ >4Fa=h>xFjv XN z(xB*xTbOt'.BgXV3S99 : &1o85h)L{4MSY~48xiN:Ck9!\a42*G)5pR'Ej7YpY^ |UIEoY8%]_dgSxqx-Nn});9# ax鷙Xt-ȡ(OP11)FT&ʨNOyQl9TURr=Q (ꃄ-aAPLJCd@#ofPttb,5M 00[u[;7Иs= H,6Zm[3*ڹwwۺ[նZǍwn6^8[ڪj<­$<00~ Ռڴu} [kkYvd$0 4@T҃hQQ@'@ g^D ;TL}-?D!N&k 2KObViZ4 T/ã0",dlb g;Tz62(MI%C.tL slЊ8NY'Ζ~:l7L!%IDt|{ @&:#tnZ#4m-o6 %$Y'Zؗ\H#R$~iAxhT (k8?yn E*nLC-t}~K*'I=˧b=M_xg..=pVsi;hP`rTPMycIL1RgJReL'kMey.G]]7FL+J>֭*]4s}:&ͺ!X7]Zⶎk_Ge1x!dOWatSNv^eO4D;F}3;![aHf kHc`L6,yP(tEsw [ƀ7hKi4v4St<i$թYZǰ]K,H\qOFOUP?28',q\I[bƬ+ >ma o/.u5e\k(=.eOo\d. K-&w+t“ҟcMB>R,Y4iJijVR\WX߽Ѐ;B}A&_rO>,h(9%-20dG5Y.NDgpo J4 U>Aj1)Nٿ-$ZlIE 61 vZ/1(d=sXi?\ZJBZ%їlMv>eG/l i¶cx3-S!˞oo);ARKΫ H'YUjMޤr jTA3uXHe˵ku_6$y1B'z[:Lƛ,LO ѷ*Rؼ:zX6 bYs?ኅ]?\S}1@聘ɤ4zyi--5K ZC3( 5-1K sCS%2AF^ aAt ~K!WS>Yް|Vl`t IAX[A_͕.q^S&TX>/*lTa'T"eԨm ?э[t6 a@VvJR:8GH48`J~x, o7cKDBSKːi6H?<˯hը{ DsJmt)-4K ZU+y H};dHƖdyquH zqFz8r߹Tt|BZp?::?Z8twe9#vሀ`_S+W-.x-~IXE^)y{L(e:R富@GPvKJV#q']Qu!P_1^DSP{C,$fh$T__p&VDpI"0m/`Oˏ^x~hnEZ<}{k~,ژB-A} ч [ M4pl唍e!8Jk^T>mVU9v۠4 #è =(] :_1EN{cTi-"lWV[e.Uݩ(lBvnv^2s7uV^ki)NzP-8ʌzʒgY|`S 8f j ݽ6]n]lֶGJs$kTJB'̄ H IBSK˫N6a PKd,ShJG Y:\̲}5K+gpOeuLvsᘭF 9WZԉ-mƖ%5ȅ Ƒfbr-V]-vwJ GŚׂZSU-zc*Σ^ОIid kgWS%5>eɒ9SN)kПbFJc6Åiu4u<ɇʹ%ixf.oYzz~2_e;=U˴hdTC1ޙv{w!*^q7_PwqeDg*78p [7Guip?yͽv]TB ]Twg/ ZHUɈQBc( {ʗVُEqc$đ-I3 AOR8)Z a j3O;,MҹӲ< gbN/o6{x܉{'7d>Z|v-lQ}W;#"do:t@AjOV,W9S|;`ux\Om#<1kOVbJ_/&gG($Yx  BnԳ+M&%l6vy$ʹP0DatOU)/"+7ҡ$8VD`\X/b\g}U=|5EL"ÝWV)\x!E)5]{} IR] ʾon JxÁe5>yԾėDH$<Z&5-Q,cA=:~CMA=z=XTDGt)V*C7~SڟOOudY]c+ y?S..0li(_QưUĜJIN)zwVh5tK xc(R.=&OuӔk\L>=􌆠. ͌rX\vX„109whlBm;j2fC=~ɟΣ.]etNE[u1Rឺ0Sʚs*9v󽦊eU4oQxN%6©0:L6Wrg8ǹd:n! /-p5*/P(i Bi{xxPC쵚SlLXg^HnGrN?)^)o'{}?|?/Э=VSS݀1/TC#3vYxBvkDj E^yX\CwD|s=b1R\t {MM+yO4]S牞Nlǫ$br\1I;~U&4tojf_?rFԼiKYU[Fϩ5|%Nz?ew< y 8\?#kRuJFS҉ludiXy>1a(1;_|lTwpy~pՂc_,R6&Sz0엠4Ku[}bM;~Y.[5d]&I$"hMrA@픨8#Y>04<$h/XATC<VA@\ [ mΧs4X+m 5k3 =_&Ty@9)QSKO"ISH)HEa@(XPdJC'0;տQ3F xD '/ d\ў\̓=_q/fo6.$S|s^8 o >` SL+ Q94HdϘRt|WC5AZi,Al6լD˫54Kf412k%Wzg0(OW^Mےv G 351%U\g< 8+UwkפO}=ufl1Փ'*TgC[nنhcfS&Z.O) lO>UGEn<7ծ#cE1/m6N!:TTSn|"SǥׅZ2FYJk*, swXc!<49mJ覃Lϸ/-zd*UW^9 dU Ӭ#$g瀞^&Q$oA'!'{2>.PC:p^3oBz-#@#hV`fI5Qق<--!D6;'= V_~æNRV$g;Ŏl鿂cɊ,Qڟd';5nWddSZyB,*n lAQT0NT(w}$7(7$K"T$!F&Ͼv՜էZtnK}Lq1 Gl״DM`H &ewާD}B~A7t$&RrUQA MʥuISaC94GMLy |s1_x&G`U^(6䢿z ]i#95HzT$t)pKIkk5s%Q/?)I%k8K߹_J)#ڄf$9c˟弙M}gEQ>HM4}V _i@_laFEħ# tYh>[7Iխ6fR`FUk1K4Kڷω:'+EWsby՞_cm=]}5]l$/2n|1̳|p͵٫}&*nXmj}͑x5\mQ!ԉa'z\z 8Z3 k">Z[]Lj YI>Y 2d9q)/풭5Xq5_Mga)Đxk{%4|%Yi)=oW6)4l( 4t4t!O螷 6GUvH͈g̹n|^bL=VS)O>.Uml;bK{GsیcrR7#Fݩ%lG(ށra$/U!X8ij-sghB2`1 0(1\+Z$0**BhG"B t,HE΢0BSD\Fx^F*%DN ҸYtbv*M!]Q~JkGJŏ3H,vX8^qF hFU 0\ y1 +" :-)bd"R b~b!%;Nx%k/b"  -cA"0.h ZEa ǼcD1iNpo|6KhEOw!sD_ y4+ٛר{\IC?張or0yZ-oŘ>2ѻSh\FUΑBLwl7қ4!MNpΪkS=Zj.ܿRP*;:*f åYc)Fj1kWݐ9< %_'|*3F =RZyDVpT]@JֈWOpK3&r$<ALB9m~3@dh Ǝ#>f gأ;DYdRQ\fk|L$0isv-0͸ut F[77PQyٸhbI~v83T1`O`X3@3oV i/h9#W;R#fG96xvmmD @\^%,B%KI ~rI&*ܹA7{;oAv}{ *:+eӊӍgJN`kk! Iao_}{ޝsq]5ۺ.6I "XB(*>`>1h1@$A_HΓ)~liO`Yvfwj L{S8#&옟(uKPaQ쌴#NelPqfUޭE[d2s[ BCT 臎 RDK3kAv]T@/ 5+[F M>l=rkT)ӭ/S_r9,;f*KZ!Li9$iWCv@kJziPQtʈCi ;E$M%6a DvgQY#smj)ogRˆE>7O짉Kc;q'g$43ޕBf(덽;j Q\!Q1ܶ}pQHN!;ٱ$4fGi+}Oɡdi=JJǘ(,mAJJ4klpG=7 ISe#D{ShҜN<x/3nj\`dg6 9UFi\;JQՃWP0Fhvkݫleq<QBװC8i 9#\OYZS*҅h V m-zrDV#_zQHgl$=9'|2RJH!TW ~-Q. .ʈld7d/Ғi-ٷ|!N]֢jM-Ľ]bqm]@TƠN*5dY9IzZjCgi(Q2j9H %Fwe=kI)IjAAk.g2Õ]̔~*ULeZF;W׈ 7צL`|M:jpdfRosڱ^Ӵ΋6Ww9Q뽆sw%ST^٬ܦ]c0ݷ,qJ SQ ͻ&;mODUv/:\L_nzw pj< -fΡ +-5w~wV[IDVpD"1Y,ֆ*+Q>\FROίg511՚ֳ9C&:0 ;X*zONo~|RycwAr$E3L4Ebޜ߅x3H,3y2$iZ񁗁g[$)W>d ۹dsŎ^=QcK٣m3L/ 3~/ؑ>n_ǺT뉈Ȗ+Mيn?Y+7β,tXUf>)jȺ^259?q8T}ŹkH̜szhŋBx8̻5͙lc%l"Ǣ-;#TEd;AoLB&%DEW]ڵOxF7IL % Ë+o.r, D"lXE `2r΋-}W[_.dJ,qT.DiiNa0&[&Q뺭>Эkm%‘IOt|1kJ}ׄ9ƧCH;>Kyw@t!Lf'Kqޫ$UFZLd+r:k~-˖VW.ΙϱORYV만3}M&׹ЃNJ Sg*՛4.Z+nd SmqfRS)Qel Ȭ Mj3}r z/DLpvEG{@ h]-^lW F~3~Yihoqy1ov ֲM&Ƃ킠R0̘ь.z]BZzdBrXmy`~Cj5'TїG+T$] ++GMghHcJOI)DOorvDg-'cRH3Eg@_t,Ցz!UdLmic\˦y}~F&^=X  ==u)qRP:PŲ_6/IsSk$r&",{](nV>j߸vQ-0&- 7pa\ F7͈p)= baAɇT#>;Ce(+VZdH)Nuv"c٘G&<hPrπ CwAF#t`[!(/mFor| Cp `Pwh>y0bS|I. HigdŒ|D<!VwHn -\T8EE'h8cuXL#q[{/>r [# ` tF$IO}1&,%1,9\0 j`.(`ɬZ_. c⧿S z Ÿ]Iu@$YD֡QSO1Jw'K{h6 E l{CAo}c-KzujQ i_,E\$8"C֎WFރ' HV4qmS_e\']ER؆+[D\C 2d?o~9Qb0'riul\s:omÖ1[۝hBř3]SN-o8Fj^(#3 /15HNbrMӭ5_43}"GQ3a'_ 7*_5m!HG56NY3PaIĹ, οc՗? od y?٠e(اV* JG뉣ޑ?*1& i"J;8_[o^̄M!KNesDmڽ21[. .3e_@L3@#Um"'\PNR[`- AevYn mkʧI?th`z($|k-eB'cce{k5m5WƖڽ8x-V5xmgQ@ < D3W4nݝ5zaYtJ -_BBP IOw ȵbh)LIbF&u1GKYZQŴY )me-S_/Cʈ.t ìqٿ2v ={BhA`B [oN`!S.s Hg[OS=1[hǗk֭]76蘱v.h\=Ŀ꽰5O1)[uko7Ee>cߚ/=+R/Z(2d/ex(+DYyeJ6a;nQklgRV'8+{-OS*оe=FVZ̀>7o.#?vp!$;uao12awmΫ^!Du#:qRFiZ%@6a’ Mk[4eg3 GoCTVJ $G;D4["P|Ȏ⫴58\9*yO]N8n>MY3mMgj{[ 116j{>_U4D⊽//ˡ{9'Nxq,>6_9 ;[+l6soFv^Я3snEN}xC?M֘w>H5vܰ-|~GHX8Nu%C:f NaD=sZry7>{eW WU9$]#7 Id,\3$\VFhqAE]WRb*Q~cjN!Eu!}#|IJYg.=iGʔϸ0xSFb.q4ݻ~FgP#mi<1CJx/ct19U9"-^xKH<ݱfvPF K/Po=:ҧ2+)UwKaE~ ƂVdCߚI/bxu&Лg 'F=2cͫNu[D$/ 0lRꙦ(GVķ%5F[&+y=P4mrfw_gyGo.>LF⧑V4Qv)CO쎾~;4V|!60Q kS=; Y򶮘"e?HD kUfJoV4C?VA>sGڬFFdwzXELna~6²m**=Y2>[ҫ#\W!p7p̲BNqb8(Xi9{̓b/,*.AA`e)JïS׫¸-u-o8Gngx,ZrX<<)+K日di*eި .՜NV\{)u?9Fh pf$dbƩ'U*n]8_\64|AA3b-W8@7maXhf1o^TÔUM}~OLX2;$I0)TBз8靘RfLW :RŀgKؗB.;ܕx~WL( 2V󟦸j">ިC4r~;^1YqQ\Q9&Whw O%1P9~\zwc oZF&rmp9+";l[pF_3;Tk:ZVoܵNZR᦮X[_*0t#W{dxl6nQ㵞zBoxF+^V&28%I HSV#N2PM?@c1I(E:VJ0˴>̴<8׸/>j߳ ڎm{"ӠZ1zkzBy^"U&k͕or5C f}xC/cTTxO_1v(,;Õ~謢 r|3 {fJwr:=0p0@-/a`j21b{#|uceCb,<Xdk(Yr,<@X6D6XUs }œ83X', ,i`::?5_YX2[@_[G {_SC*Nɸj#LS(vۢ8c"ъ65SXw= _а8!C5y0.G.[> LԺ?Cysds7u!ud,rz8gy=_ /'IN*Hr\cP+Xgxp?N}>m-c?Y}O>eӝǿڨt߃P TפLd#I}e%P`;̑F Zم'T!W:mS]rv\؊jY<Y|>]rƱk {#8?&NJQ284]HotokT#>bK'vȝCCv(%kelsfݟ3#7! -M|l,>>ގ+)`mkͮx-tu|E?;mӡ~[l[@8\8 OViKF7A}2sj?w`ޣoh%EO~y^r@o׈aOH.~ϭ$vРsӴ9wvMP&qOjkB1>r߷$>"mR{ =.;c{ﶨvȾ!=!dzWmL7tPftfBFwBŒ- 4#Povݻm,*,Wh[$[Gc aI1 #A( yAH"" b=| IX՟c-5G.;bR%VjƪNvKgvϾa<;l2yS*Vf\cfjE¢Pev-0k}e1US4|ӂ7bk::ʰwWkub}t'V."mjjK> 4RZBX #j,j'>+̚Zy^YI-==upJ])\Ow_%Sh5㧭'\i)QqhDK"2xH3eȳͬ5,6rܗq!VM9,FX*z&O'uV(5K!pbtҸ;6эn:Y$9-ėCi wH<-~{ l\%G}gĺΦڎl|=cZi$hJ%4E(Lc^p6pGFH^Jᐨ i]e%GhQ7,cbF ~gD9BQ8fr9Պ<"ڍm*Z )N=XQWuEYvWW){(t¥IO M@.[ryspiDr}_6)*jRɕ$?# ͻ) P G[}{N~ M vuf6^> 6v×r[۠5AeSJ kk%/: u m\jj9rJ9)sYZ.6clz{4{f4䋅k)&d)r%vXw)b0U> }sG?P_ǜ7VvDx} vY8"{3)g򽇶d#9)/~y4-*|}ߟf_#_>Rk_Cշ=\ T3:;ȷ f %ho |Si9mN8j(#煾)Rcm.WEhVLCu3G# 2W;"<͕p2̟R|'3&SP ΒlD'asHQSoybҢCܸW:mRQe9(,9OjY>,I$P֠xS0ܦ ?gM(6W|ʗ {_w߽ob>u@'AW٢bw0 8'W*sh11T`:N'=4zwnYY@>IDbwq DXإq:Y -`yF7&FDPe7 CXpFQ,_^1tuUߌoTM#R5ގ$.e6]ŦILedʘ?ӄhI0{A0M_`D֩H7%+=kU2+ɉ(i1F< %E1KSUH***BD[DV3Nm%0N(h9.Nоb>yȳD5%DPPo"0PEf5vܖ:<{NxjO!Ȃ6ξҘttM2WSy-cTkc -6}rZM 3`ʂe]JB~ BMJZFSGEʥْU,̏A딱13#\J,)%9aܧWP$MM⸃SR]hYvr~454r!Wg4]Db,Y} 0y،yqa^E% 9nQKx`IPGӘq?VmxlŘQ7S<>W'(R7vjtJ>3ݢ \XC;R(m}}3@ɢb|%`B|FC}tĻp9v~'%u ŏ01yx~VIP`%u• (1WN81# (T"dB#^'mU^H#vx<ޡN|애@9NL6@ѿ"Ak?|gc"^k|R`! 1dVE7`]J}"0<Q7"&Bȍ^zoxV]8cO@7(^ד?1]pK!1*9H"È0+PCU@#oV!M 0տd+ϔ;)wj6v^})>8S4"p`pQ$2 YNemIm+{&9nE_FLv=bVv2ft-ObI>O&3f޶y4_ښ.ʳ<,˪8dו;;G'ȡH"*X[VDIħUt4!&?i 5:)n%1 䨴Mah+ֹX @+KkEv#RJM̖4 kר*d<$k49_^XFZ3&_5ĥlt,h9FRG&-K}djkԎh}QXM!w $XԸ ?BU7V2cyG IulL M! L HGOnZ9C4tA8\|ڂd<%i<7 m;[!YsMlhixK>Ϋc x m kfBF]dT2Zm˙ujө"53,No:z`.{-,_ZUjo M1}e`pZE 8|xp^Zna鼶[M 7x)nU*#y*^m ,0ɪ3a?SjLZO䜯%C^Zuqb0mZ޾|rnBw /~5Q-[GNȹD]A撔BKػv"ٴxIUVV^e I7Q/_*a <.Qj¸Z+pYHjmYJ8M.(6UmdbVUh-wCkfyzޕB]̉aCS [$vQ>1W:[K+TݛpD}p|&WdGfR3nI]œb~MG_Uw\1<6R5Z @_GU'K-7G:#od͔x$-SDXR+< (N_cBsTp/r2/rfML"3=4&dJi5K*6 .m'11qЙĕXl4MP6/ ϚmOAᝌ>jsӥaleߢsBB6l}*ۭ8WAUW[rdc139^2pZGG9}0:kU(i* ay4iLf_SST/iV#]εrp~NV]h>ʂY}uqgVK'3 eMll/~{UM?^ ߼Qb  N4}-܌f˛g<{|7K? 1SQyf_}h!spDB.~%|>ؼ m+Ҿ굘7!Z֙2D23wK9JQq:A~(rl*(W#UᆾBmv,o: pm$ZOPDwǺ@&䢯>DE1ʏ3O#ʲ9*7I G2jtW6/߸Uqe*<WFyZ t^QjJ #3#m#GH?ڢqg^YoTWfҐODzne& ,Ͱ,q*/KHKm_|6S]-Ombg[yyW_>|zG+'Qo.d4Sia*JYEߩHTNsRS{X qIZ3PX 3Xfi^DȺBW}V=F2kiF~;;ԋ쵦\y2+IrD.A:2:ߪ>]hCM᪲5R6uzq($C1s[CȱpOuzbq$(C8opW=ly%|wm<ڶ@찎pZpܝ]`]<]IW>^KaSna3cLt?줒IuκxGҖ _fHiIt/*2j >[! `ze }":*;y =rGSZK ≽=D{R\-߱mqL, (艖lզ2Mi^ 7FNK6{[YM{Kr,z;?A<ORgQ+m.6fp7%`f#AlEhď \JQϛ,ZcPam[q e7xi/D3:C0MnyV↨9, *nvb{8o>g˽Rnu/ =.0g5 .sh^|byMYy1n ex;ci+xh&3d MϗxQ]qеjXEH'UM6zue{UTGe*+n4nܠ}ON3 1zߣt0O5 [OrO .(1ɟy& U0sJ}Ҟ$zvCx"-]6 %t,|A*%8ߥM!v53k2Ҍ[-Ag!%y˗?LZ]'5*@-̌.SVgkI5 y-?m4)<>5Hbd/^M tA 8㍛@ժ)Dk]Լ#PړqTqDi:cb>{`)kaM9fR-mNJ&۞<!*w 6 m~YȗXP( <M]6S6Uթ Ki`<)Xs:.p{4H1V6.=[3H0:" ݉n>A*n!5lgCPסG!#j6R-1hwr:p액xéVj)jlYH>b L.çQr갓ML^#F{4zcKG BE\NļfbBYtL6Ȭh0kR:~!Do MOnH涣8_Lg-=Ox4Oy+NX|2k3+|i@6tĸ?o> u7 gGxLp}Wy|[|&=reO쟠ugסvcIb>kxf羽iC@#oV!;066X1UM)se{Խ~W70 @FB @dPY+;u;bښ؝i^5k{tv]㶷6lձm:.+`/*J` )"#0w{wsg6ZY1 ,J ZEHaVAyGxD$EP%s"Gxxx0˰.IkZCrID"p Ŝ1%8eq1`vrN1؊-[N]@;lCِ4GlVҩ4:`lue x3b.`XҼ<v?Z25O#py>N@fTO=3 p:h!Yl;p‚'î0,77QmU[a^gݭS2 5IgMC*,x`ߌ|fXL[ O鮅KA^M2ߊA>XAmQPpuwT]7FޯJlQ8"l9Qx6so=Ԛwe7wwmP&s=仛]gDBSv쏜=@7[ل̥MvJT_:'R:Ժ%t9V^iKذG۳ lK%q\EI f2xRbN|+%g+S$YqQoʩ IUfvdS>23ا7\#+9T+ܵR \We.nWW"iv}!pv= qG0ʁm="b/ICU` 9f iN"'cGؔH8*APaRV+/Gc Iʞ" ¿Xۿ$yNקoX|/!.!KQV+"}iNP?7͌mZ%hO˸W ٯn^2gIMgʦ/#,M)D/먂7`O`][Vv–04hQ}wo^Rs;VT)/jT0%U/_ixx$ޜ ˈ _cم0)|F51 FZGlE.BRb>o\pw}O't5=('f\ 'Jyz"^ b6:e ;&V^aVN.Uخ+ԁ)x&*8-KzR66gfJw#>7|iBG|l9JOˇ,b.M^ << 䳧8eJ/O?IZM&@oqwF?a'a=Z#娢$U]^(Ź/yy) ܉AOXLY(tjҼG#k 7yƒ~=)}Xn:0t̮JX^ͥ|S1yFl;4S{Y_ՇiyN*>oGzC ,sRHq,xۮ~:ybW\HaeЧ%?tl5D# ɰ-:k)BQ})5F%g pދʵT ,Y2o$1<~nplŚlQ)-ƃL]W}Z#O2`s垚1c5'~[o!VR֥it_갯V;~b$I-dNkuzb4/,:,-RQA@(g1дf.U!R<^v'\N)M8_[f593o'Uj;`{Pj^m{m^'Ggynњ`^.Y݉Uk¬<@6 v0:p?s3u7s&1lEsB)~KJMՠs?\ʋ/!@` Nm]]wP:SO\좺-Pm(>xymV{!/bsUNv>g'qVex6Hdv禷%'MpMn2Iq}cܒ5U,uXsÇ+%+K.7H&&eQt7ΛδqW.\aq43ƭ[b9nRKCgTϼkwH߻#6WӗZxJ-E..y*_n3'F.Y1 F_M^z؋y^7BDe[-4 z]LVzx ˓GqyJ@Y. Dq;sּt haZFZD('zI ۀ5swF#,h"BOHRwhh$bmEpE fUuDn8*da#Cho>qx-EYdNEŲկ(4 _ Y!D;@?Z?|fR*HdiASX8tI7͏{=.͵] (̏ G&J_k}wB} #ֻ{%C >q]<18ώn~u+` +{=Gqc3kU?m΀Z. Yj}n /6jP0mc30~6۪RȦQ&X]n,bLə9rݻ rn./oF]5{Lm;: }=OQ9Ë=m=6745TpaԞʜ<]9Ckf`QL4V(ּ~Q-8;ֵXX|^(q2fKH)n;//IO'_HU{tyw8ݚ7$QKte.jw0ZV[G0>z,].ԘK=oqlT1[ rQa륍`]%cf+c/&UcUL.50wu0 m)M:a,AuLXqrNޔ+ Dd@#nECM1‹1A[L2&dIn^~@)_PW`XFd $K&I*+!oY0$niR*{vW¸w9uvl0CdL*:.; GEB4[lw,_w?ͻw[w̮éGDVA/U?@@~A'G4 /#@l$BV`,e) KlvI˙\4YjΒ&3O ߀e4[qSF^ƒ'#!\Xz! It m u`*FTP:dT7; @#g[chul3/to?ò,%.tD nyzVi[<-}zK&ݗ#>M5eקM-l)ޫx']ͼ̧*UWHW~qRQ0 \kR~II ,w;ɚ'o.9XxAZ (@M?FpFaO|[h`k|/6~<Ǟ> Y(=#Orbd2%%|#GLl=NCgX&tɪq2^/i==ׇ|OVWW<(3X~zX=МG-LdL.|h9/xlF{|5zk^Vi`NG9Ho[?»\WN/oi{?9@PfEKu|W#EGdR]}7KYH(zp9Ky9 U63\rOd6lh@jTCThhtE1fAtZ Z uTZ 업LLn:Od?n}?"` .\Gʹ#x4(89fKv:[E;hwS9]?@T7KQ¯rIOW_ǃ2?^N8f]ʌPc|G/G.TJ * }6n:t=g`T~F%j!PS$n7p ^l]e*ZlneWǮxIXf!^S'n Oa6/:) ¿Ra%]º"%:LtlgUW/'XwM0G\{+:hF5LH$VCt@#V!=c⧫)cld7ꊫ 1.dK{뽭[';ת)~`o3b_Ӳ2KȔ$> -J!Mvs4C ^e*4CrMoV2;Efi%-f%Cfv]%-cc%aq fL00=/Ѓ#A"B/8)2v$3, 3Ij ILly^juHng$Ql:Y}~~OP4nedU{\[(<)}Eɣ;Gl{t;9}s7{!u)wݙ}fgq{zRM gSկLhe8J?*/B3[(z}& ]Z(! L8+S3Gl{e& :ށ" }MlOFxJFg Mb1/NS+/:\Mwiv6!nkM`] ӴYgx>9 QA[X%\_)f}pB?AUӴiTC1{Qo/ wvUr}_(E`U #T_J;&Kt ~wcT,3)#&6,t+RIv,GB'nA/ݱ1=v7{ax(R+ًKU@?QpK} kX:ܬW#l6UGY\mQe!eqGm @4z1!;ϒըu]6;|)\_շ͠1,40㹁gB .ЩJ)k|MeK6Q\wN6ݥxW ͎m;fn;шˋܴj f7?o{H~[N7[]wPW}Di):hJ0r8:T !s\6G,+&<^0hahҢ"iގS]Kņ$. xjrL%))^roީǂ I/=[+&ET8z*Q Jx$NfF_E,Ȧ㢒)֩m4%k8 (Q޴;Їjd@eʨR)@_RAFn^JJrۥu={":S2M6g)%QcMk}Я'սi'R[SC(VıT77k*%i YrLxFtw8c+g[V{WTLZ̯a&ם4wMsӣ1 `j8Q]B LY⧦'֗}ā8hFۍqާtWr-9247h pE?MtaxwolwN3NkR*гĜt$0&. l%JWGXY{SvB#m[dd.gFד# KO.a"L{p7K׽2&h{K35W* VJ tOlָI=5\|M c?\ЕNG;e))?˞6=ja1ռ喊\mԭ޶}]Rꫠ>)qÂpF#Y@$34&,Cz'6#f9jhX&H( ldx=3]F'::[)]։?N ƏZ߇bJ҅'4_Jܥ5R„c詴UeH&QvyR^,t!VC; N-l/YMe=a}u=oW][㮙sMsW!"A 047-ٮ POqgF"(:YTuͶ'2Ѵt )o9N Ȓ3:;kޠbjjce1Fƍo44&4'ZfM4gR-3;ֻDijqQ@sϜȦ Q'aC|.؀ 2qҴHц;FxYdc xQď$(~sdzTd&;:J7w}y׹z+1ꋬKGr9ՍHZX$! {L뵳7n#1ҺGbż-mzՊicL*@L6?P2rY`@C/"%y'YWWs) cL3CT@sQvb{n K7gLesEZSjQG. w|q|qVEsb 1).&sKxQW.&rǺ)q"rA QCQRAXam4[Kw<') *? .b[b]ȣk6EFSй(1gC@#oV!;0V'5YM-|uBloZ/IL}=sa8(0Y: Yd9%iKdoEn+ݛ`/(겲A\Mz@Ze%I|puTuԎKJ`Q@eBR1G^ W?@3 hRS)IdQwȠ%Ĕ^5Pϛ-AӴ~$QyU߱J蘬 ̕gk5&[(XJ%,%/j:̓ j/RRM,X(R.G`4#i%[c[LfcSmٽg=:-cwEci=M_)ǿ&ÖXXI27qL9jlIa aWJy>υf?#*,s)!VeBwOhDXU k~qzs9M?1ʓawypS,'Gwe6jBbtLEպn1H,o%`+dEGV5]]g5 guk=բ s(j{vҰR}p[ \'FHH+BYY-xҴ!1F,jCؓp/_cנտf<B酛>g>G5ޞ$s Abp7x ǰyLwc 3y^C˨4h"e&ϊ֞Csr{1E(R17[K_-ԵisbNcn+AnLB_%oԽ@.M3ץ5zFև48fg-o8xی,Joy%߃og9W+^jK6spO<$Gz,PJ`/UFT;w<.W1/]n',RY?=^^hl(~ԾE7YMs?"1k]JM_YfyMsE8Z^So(roqXDҥE7UlƩyuK(U8yT"{}Lw1ZcY.vع/d}7i07rƜ(`g8YL03C22~&>3~)ۣcA! "X`ݜ+Jߟ,_Ɓe0e7$ȫr%uaVni vztCG\oO:R<tX= 0'j?vDG8T&ͭiDVE .8S@EkBy̚oOl+:N*!;uv:%3RlDdv@=xbQv^%":iiV{aYL缟~lif}JS%{A۾<.]MBW%u2IEyrJ.Ⱥ"Wj)+V޵,.nD+A7lzz_ή^Ww2,YHZ-Ÿ*vpFVѿUVĦAPx. 42UYW;11N2#š}vO-v#aN=21DkaK•࣍ gqXO:Y{j ٽTuTDPBv7nf* rVMV@G1U䋷JGs iJt)J=Ӣ``rjVT(sgi ]o-E y+LOŵ+R`-w+u]?{bEba//+$(UcׅN8oN{x7Kcw"xoo"Ʃff6F a*n#mw61:"0Lyը\v: d)HqTr萻Oi B+tx/Etrqn{PۂDž7!DV{9Bh^ [] Cuk#Uz1aAaՑ`MS*>!RrK2O(ءt<.UZN *U'g~; ?29ϋAcoŽEnùAH3SAޯ@q1t|VSU3t&}Rwf'd_>^q *[k)R=Vtܹ_NQ md2T~[tb?h~NzJcj:f)>1:ǀ lQ-_.4=6zWM۴y ˙5qzMb'@ydOu,+f{}4؜ `ǟEm8 pҌ-w5iH݇fVa7l1|1kfX;g; 6yTXɊfsq[!_{ڸr04[1Z ?j4qfW=$mGtIg6ٖbi=,5Ahqʒ"ҥAn ʚ=%;?Ҁ=Jl%vyH0 ^ 5DKnt9"wֽ6fccІi}dլ1NGgPym9^T#k}!\yŐRM(=ɷb\~}kޟFk]yy!>z`hc*?$Bu} sfL~qsY̖2v?ܣlT8> y楖*[Y&uI> YRiƩBHr/Yj 0y$lC]) 5bJ{2%#Gxoo-Db9%I [3'%H&Ґ[/$ BAzFHATW71eqaVi) @)F~nw g$Dh I\Q4^H0 &=/$]a yz5H )ľ:=1n$ēPz*}Oc'7'Ƌ< 7^;{;I} y|O"]ojf3MS8_Ltr(ji#%ϐo=I ꂁlHwn׼"@hɯeu%MKK$]X_C,1~l%cY%鲘|IAP8xKvȶ9NJmy?ͻ]ַ'1 xοѿI'c-%럾0C@#oV!;466Y' u&ɝ"uokomݝ~U70 A/͔mY$ ?٩JemʀmRdjG;*әT6.D5.=l%~OS)O3"}~f[Hjv *ڄ,0Ks * 0̌$|! xP UGud&2 j.STë&YT-ϴԘIbVKSnwzqiSEZcSrr' e!Jk'nzgYzIAP\R2d~.iy]+5y )u%s" JSɜe~6dgU˷;oM[,'k˖b.azw_Mti)vɷ~3b0%ոp&M s7W%?1p9zP 7Y MWʸScqq{ږA7oIЄbT"ܼ]iɬ.5oTEćMp:AJ_ө]q*S:=cΩiH^w'G*L{dҾE޷=OP?rvk)7ǟ|3}oVv&Īv 5 EV'荰;*?(xF#uDKkR1T=כA6?l^Kҍ$~E;ZMMMm¸2Y%P: V!lx! I1Zx^n5eGtZ9穨kQa+W)+V^Z.QM#B}"7܊י[9eNeռ\+g`d! e)y_'Swe)+ 㥼' f)U`1<\-i:ZQ,i4sSڗ# v c^chׄ>S %TER,I^QSƪ߱-4U_joN2:ԞG?cnnڪU"=['ΧuFPmt'x1NQ<@8Mt9\8IX|kP<3 ״PC[X;aϢAMg+ C?ϙ^=ķGafzdkQ _MPaF,29J6UH=h=|H'P2 ؋va+ M!8P KOmچ 響VkW01b~iB}w' /$NZTq۫15c8(jd}43wc{|ѱB {טԖ>rLI0mp1[2B+T1YgVRCCD9mJ깧u^Ed! 62eXQG.jc,8|z#UT \9S3:vT*\U:d4J["^ʶ{~ b+06!n{ÑO5+tq-\|l?.ysCz1yY4fT8dAH>qo?$ p=~pw K~cV%dnQs1H}.mK2+[q;!ݹbH[6?$̅DCt5='&K>[#匄Um, r κAdri t-Q3tdԨ8 MT4扑Ȋ@'"J|IɸY>s-}]}0i,;?|GPDfPYgvK>F%bM8sr٦e &O8'ٔd[vd/h!D)a;7dC`,Jϕe2t_K|+}[I)G 7L߂^?oPzgh;|vKPVl]Qڢ¨O:hQ2\U ! $$ra( Y4>Vkgym.|^')RʡJri<z <0v$F7W^ےJ*$[s\?'hfT$LK-R*zaCJ=`In-%5Jd!0^~,J@jmJj efe(H0Sńm0F¤B"saȕX5ΞwʧwG.!-ѷjdc-C-0ctw[{+lOK> <ҥ 8A3RòÏ0_8 UnU[b|O, KT{]ݓpN`u[^!̯gLIUG25J[xw-;^Fӕ*aqg5@6]˿7-Z4_IJV3+-lH/QhxZ%X#y#[i"JÈ|'--:5viDI@nɐk\bUe,@6{%ikćLgp<'NuK}! JVQ~W>(C4W{H̺ q]aρUzFfoCJŹ,IR .XTloF! i(kŵ;Q"e}~y@Icfr907%\LKK0.ҭols1g#/XhCǢ=.p) m? _GQWؖ#ks3STQ#UsxwF/?T{G.|ώ=~pBj'px s_rxa' me"y2Vǣ[m[nnغm;lS3{bmήwmkvl8EC@#U!;066ɪ65LVUS#dN:u)o`g0#2wE 4hH!I,Rj|-\FiŦ}-ٽw a";i lM/ݚCB3=A-!/,͊? 5"Ww͹qۭl'ZN:K |_55 (0>_@(#  _@>;K3 fh.˨u\q$rsaZ{5i#EZvxĝZ ] rkZZ-^&Eܘ+?+H -&.G'I)7N&wV*S9YSf+wҠT߄`n&g1P7Eh>ښ[#SrD1D3Dy9M3 ޼mwrO|E=^Su -v(|R :JkP]YSŔK+ROp@O$aXLUϭhnHK@`RKɁ+ߛƖHρfL4NhYRhsqcUZDu .< loQy֑7D`yRfrp.tlUzQ)dH |dC6,M']$rb-3WRQMWtZK=$~|!vf ‰mk3r#A[ȍE2_Һ|1=R %'-[a?j hz(3[TmzFu;ݼst+6'큇6ɪr͵٩|&u R; k!oʩ`]!c贅Qa °3rw-F .}4a[vs9nG} #8; x)+mD GSS ܍N8f;C&1?/8Ŝ|> "UHDm%>շ}өy0G,O-*96v3~ǀe'!=6Qʚ%-)f|x]+U=iUT!߂Nݚ ~vvIwa*/TaO3Dqg+~NO~_J;1LRr!Q}Qӌ"(ٗK0,_ף'ClCЙ)fݺݑv\ C8Bү)a^)Y )YdFI Eʑ5c\J IG;YTO:&ce@y0.FOhIa힤^EJ%O Ѳ%^ Uq3pL"cpEݱllTPRU[|m!N+ q.c Ԍvm@cW7;<7I*|Ҡ֡w'U9}$գ*=IHd]8!>Z_P/kY3^`yö1Xb|4鉏Sde(Qr\{%2CTa<:J⑿Nd{_տ粍%/)"泲 22(%竼gxB{s Ll]F):;Ǽő,avdz,DC&(y+=Kv{wD0'TvqxSt7y9zfRDFyi L$nx^.6r%qAYqk9_&`6}m*R+L vCf wz/:nMEHQkm,+*q.ճ$5$C).1 C4G# 5HQ7m !&"@=H( ]TkB.M,,IANQqB^:_aR`w7+ jH,A1VZ\:"|S=cK^4LKc[qRNxK]Z[#hOXǖ>iqK.>025RE3ʱ,#C+k 5S#ɽur!{8}LXޙZ- H]r6h!Ud!g26o QME7t#,b121 y?"'h1Ǐ@cqh~;篇HPWMvH,vwxأ rNS# cZ]QǫҤv;ny*QOxaa|OFUKF{_xA}/T<0 ?;1HPTIA/sA3 4?O(:LR(c00s8"†| #@xDX?"~nqH!=.D\Df9zE{/-hS4REE˚ zFELH|/[{M kr Dٲ`dC4@#U"{3WpS@K&!2LֻqnкV[FfdΠ&5v&7nD :=w@$]m KH`R)%@Z*C*T2D>I].Khь]on߻ڶV˶rnYIزl62~a\f2 033 )<@Hy""( @G8[aFzd5j{"hPYzi aUbU")a3I Pu| 2vc8'wT^4>5ѷTI⽉rSSf[5nU(. 9\F-uKX} kGȱTC}/SM ~x[BkZe" v Rd],̀fU%+a5cͱPmY79mmحbJB-ޙ[=N]gv©VI)ؾg':};9cu.g#;q{2RφnXū92 #/,sب9fuP<jd7d_6!Z>;ג?ڸ=бZ{%-ֱǮJ&Vo;-1 툊(c˾i'+H+ eEӘz4^idSVVI>tRSl`p~y_R3=7X[^0alY _V$0.P!eCH1WgʾdPrBk)SP!/v"s.iv*Sս*rx"o9?"v{7WL7qo)u |hLrf(m l[n\2wwy(/,Q99MxLX {,)jJb-/]\&J]d= v@|wy= }&H 0b WGjuqlyld㙉)ZoJ&q/Hnut[֒AZ!=и \edEY|yYzq-VqWmmc#XjsKiM_uYƙTQO'-MyA;>!|DʼzizOrW R?783EywU8BzҚ3ׄL %Ǻ7kXV JS0<FIAmi ѱ{1g<%j|fvyQ>8U/Ҡ`_mv7Cq5вoS?0?{ɽD8q5N>D:EL/3:.|':u ;STשؤqʽ2f /++}jNka 0ӓ{ >`҆js0Qfd4I{&ˆJx:vh>y%Kc^,*M9QY<ӡQL(F[~F'? hGq7WGY/!̛j6)wNnrOS[>sc|-VNZ%LMNgLs|9K!=?"BEuP X~u!qdjt{ WI|XGUp.N\W)"?{]RyFbA͂z}ksv6l^Eh[ۺ!J}8>/^oߘGn~Gmb49>j3VH;;KB :{ĺ{쟝{!.O1>ʻer0VCʹЛAvh'HSoc ŲuS7U>1j~и7xPNNЭnVVJی~ī%ŋ{$bwh-L^w&T`|Фݦ]*ulw1=),4O ͷuϟρPSɓcraBC!8xv-{!Ozb̍easBR:Rj P ̓*7וx;bЎLΔf=-GLD#YO<6PeX/E?7cD>t!2Mds|wn]YQɭ1S?bgOmu_e|E[\>;wykoQu1g0 X IV4m'i ^u =@[߼OˀiV}~N: ! Ws ~#e1Io m #KDE~{bLa"=aw8PpW ֩1[^lƛ7^fExIcC VPτ"}ۇOڲ- 8:jNz4b{|Ggվ=N{ ^`7=^j:K}䧭QEoE%ܛ8~/ w' a;ar}msɰav#z#%O ODv6SRr7PR !tt)}6|_0k8k4\65a6VMBSI>ِ.}M{' o!_<0%)_UX0@ât2? ,?5ZpiNJ8S#z=აGKQ"˃L#b:'V޺13M |:IWgiFs(\=m6>!H{E:V%12ih_Amh %~>ge&>TjH6pp!+°Z8DTgf13*^*p݄waZp:Ũ:֣M2>N J':$4>oZ${Eb;``v.?ۿɆ` IҦ0Pl^ڭz"QOgJ&" BՠB}{GE^FaSj}g%dj",/@Z݋^Xt"y&@D2U(y;f=7x(gS21}G<|!B)"=rt> <c/I3 DcXb?-vPCNJb4NB=Սhn1pݖNޠy# J> %wCHC [+QX.DRGgG\)\c>`B#:LÐ7 (1I$|?fj&`f!rZ/܈FlGB >Bd@K8t >lTdj(]o%}֏cԄG#O9GP||^z ʀz/CEB ZUM"8kTE>""PHh4d@#V! ,;J&mZMXb]\wcmuwVg' 0 hdnh(' k~ZXMvWsKV9wk}[国; Zd6+ojhLV8!>!#rFP}nYťl;%jK_0K@/|$A>| B%,>@1'E.w,jf)#-~;oa"Δv|vd|x~SCK,e/SfZVm6`#Sܚ?AVN7-hF nnƣ9LTwB[Vc q IyA $r1EuV$]#}nn).VjrdTfyYi,!0lunU jv2p1 ^;m=^=Z$O*szV5þ"~uUqCz)Z*Κzlݪž5Shڒ⾊G+ciA0ҼŽˑx&YŶ]f6^<=t5RS[K_ra#ܑGKqa۪_ȷԇmuīYD.^_5HI7~S֞oh+o{cI:/۠MG^tK6д B$ SmS܄c24ɴWQZB᥅?*?af4d˟mSǥm u]y¡w"bXoXQ% ٌNZ'(٣c>0֛ ̛EH.hQ,-t՟4[wsk2z0~]9}yDж7Z +6WC83|=)$06.~?:n/w8yk{YH`omҧ:9wlSIl9f?55/K]As.7G`n=i7⼽@9" 3}r}KE[ %5vI%r( AlT a(4Ir[Sͳ\P>UiÔ윤rkILD/~Xb7Tdߐ5y32tF\BSH~tqB4 Qz 1[+FSy\8rX7-[6vq[)k%^y65&cE6g1/%Hz̭!ƻ->muV!0 Vo@&(aj9U9m{VJU}oSӂvHƬn$IisɆPx}9)Ѡc0%:(g|ۜw3:uQ#K>Wiq5g^xNPa)[tlx5 NSKy4Êۥ+S~IkP'2pw@Gzs˓EƪdqɚLjY^ᰉ+uq&\;2Rkr'^`:;|fӁ|j"@Wh کRBT ;)6Edery]{*3h lR$Z[RK2)7 @K3|)ӄ^p nR#&iNtd$ "YY(M l[.; 'bl*svI`M4tZJzx?TSLW/ ݃I& l۹f##M'An{J` ѷo}se4$ &7-?I抂ݯZ]XYk6&gbsԩ>xNOe3עS>shQ._2'J.P۪Jr&3 N\V$ΙY#9єǵ8$Zaim7 *+#.o0Hmʭ_.a!<*^?Ko$%4> Q521ɘɆ`VVQ4ra'Jz7G4 2?όˣj5N0,o<[-?E_Ϭ{f!Yg㣚>d 3cԬnzRGN]Dh;Nhf -`DPz!d̉ RSTD`0?|Hn\LI?H₲jjp8~,a.:֞CqTSBB(Tه1^*Pxb]pvS؛:TMs;7w_}:FpZBp[iZ#Ӝn_UL׈&38rG5fADgШKm<FD;)b8P ,XBP.ʼnOaCyoQ"h߂9z96\$Y,O{?˥>of諸zANw PWCp(QW XgkH[/ æB64?hyAL6@:z?KS_Zm*rv٩e|ELvpe\"{%z}(:zu=N-BɳOd] VwQ<78>u&8ꗢAߡP.b6Sb(GdD <d8# JTb)8B voKH>5GK4jjyrsT  Acu=)WRB4Tsl RLtT^5ů 15et _@Xzg_x=uqiOBrv)1?om1"9K&LCA٥P.|iL=4B7?۸?-\)ZdEmzGXwoю 7,L{;DQAw'G#;X^K-(~u*ѳQHjlZx^(g@ {DB=Χ,&-Dl:8qiEU 0Ԉ:&1~S@SS--6B@*\%^i&d [72lA" t ;tr$0y9-@@.Ǖ☚ ,T\Np4d@#e2a)wXU7bWw5g[[zݝfUza130BKjIzB%YLˢpSeD{*CDU؎Zeӈ/ 4ے}2? 3`4붴.% lw [ۮM]5V @P@@8t 툳Y/3G>afk+\Qy7tM_Y"Kmc\E-g ӀUd6H-l犴*WC.\T-N^h˞[0,gt5OZQ4(^jhhxj@^fS/Ow>D͡*r,+<>9VG'r\OJ#xy*-ÒsA%Y[xsv8%$Yͽ$J#mL<, Sxf^DT0mn#IQy/B -k㢝01P`Og>##ǦD>y:#U^lس%7']Z aﭳotU^\ʘ(}diy%>@A9ߝ!#Tm)]B]$TP6/u+{]c17` %Vgosx}2Ի]fcVovET8Ŧ+u$WXr8lXEaj+P@%kۑN}QukR^?-Zu"0ȲW(/H"F߶TvFf[T8gECel_DKL#ѰqzvF 7qQZJ?ae`6 GEQؤXa*#:m`BF xpYV{mDE^+q54Ww<[muHݖ}Ub;:ڠ{fYZȦ̲_Q9"- W=V2@_ؖ  .US\ #Ieoiu) rsei -]ӡωy0Q~Ѭ63/Д"'?e'j{{N(=ښV&nSeosIGa#DEus7Kr'lfS=3aq?~w' Yr`Gxc]KAr`QQe\x+ʢCMD,L}Q>u Ţ"_We-m6C8(0 Wz!f%g4>*Oyw~=ovKep8V*`.zB U|.0aGN&OTT\٬zpjDZ-.SG[P\QO3 qt%)9]h+ Zp(ߜqq!⣤|ՙZQfN0,պKStᩨ5o]בdF- P'#cd 3_W "87ysYKm+âj!5ݿ'q_:feϭt*-m84˝%B8nRtD TntS;IR2\9+u]u\:%b;6qo\BSru"dg1-m5y%.Jϡe]V[nW,)aEl2eo mP-Žnwc:h&ǽ ʨyA?u^1^{w! v۫:QA֦Vwn^jt47oIEW@x GS `BěK}ܨjlǞ9 g2n R)'PͦK~C IidBcZo[buIr,XЌE9w,0UʒCW 9 ŇܰSս})Q[lBKRv2oĜq)?3Z#O fn? nMSbS RVLW嬶/,#i* {LqId7q_:13,ް=4ҫs"Rk]8O0L.Rׁ20BqZa*႕vY(l?ZdJ=՘T 3Y2M9aa$}PTi9%T{?DNbcR Q2?|$ ADR8zĕ'muv8=̉'tP!T9ƹaSpr}U1ע;6HqqluVk-Lm_(S0Us/ֻc0@)D@#oe'ptm1WW5֬eB޷;EۈWt4{U? ],sufFO9)ǰxbzseWti VɰSu" ]?iSصx"u0MtIeU+~f `0!7ī bpIUZu@T J]^>g̘KK T(`GQ!΃qfNki(xuJi8Q0(rR`EHn'S>ZtAfaUZ# `LSq=ȁp9)YK)y}>i (wBSWІh8O.C!N%| +Vӹ1%elQCF:m4Ieyp32mQN8~_o n6hPP92G1J ۖ˲!^+Qt6 ʝ/~ѻYE^1l>!!i\9rS2J dd4D=}Y''Fﻺɹ!^!{t<'\e̒yl'[hla^N:mDU"TQ~<ժ"{_t]!Ã~FW}TzI%FVe?$=ے͖T۠{v`/!hɞZ\䏛OUA&)Uԏݳ)ghl/}weշfX*9Nq: =C^ŝ"z\P_Z>\{yVg*iҜANS4BffD\qL#e 1מ 1HT Vr3w+q_kb춁w/-f =ۋؠ=ե60?jVCg''Un%]d%3{Wg %7 !vHN`*LW)1T»cb vw-+vo^1qa_pi-\ ! ~x6 (g߼Y+gb@Lػ, v #"<Ճ/_`@v+(0;G1ÄIAewWUC㽰=x#)#+k~4d5۳H]8mt]퐍,kqЙ?\fd"nY؝NirqW1|Ez@M 3^@F@E:/qC^A )ftCZ-]'lmE)o^WŊN嚺~脌*xrȬ%]RwC⥋ozְϋsuj@dVSe vDt4xF7ctz!iOFnNNxk;Ж'KAfn!ޖӂq=qE?RH4dr/1;*;N4!ְ[?ں]~!X@\@[ZK#QҩEL?gP0:x*1)Fz?BQ[dEm\0%l/=G(I`CA-igg/AqfPu:/[?ˣOKg+BdȔ8VRڽlUPބ/*!SAB`yV쬙E87DbLяXEvA]Lb^8-sC/^hh?CVsc"Qhp*PO4_̦#>N@^z5 @ack?'|DzNrG41p+ RanbTmdΫ}33"|83 DTiߌ SC:8؎U^ZԌoQ5o;25ױ ލ9b_h² a @b]X > 疝tt|4",1[|i% ,l"?t0m®ZUᘃ&YpY027v/_$-W*K)~|"q+X S.R oSXZU>wŕŷQ5<\_P^$A*ӶQܢ ;kߊI2M5yFVѭ $d!D !d(ο[7/ė# ku[LE:5`mp==E=.cO0ݾ1Dc1 xӖ6~L=Ghk+%?0"Da_pŭbXс]q~sRȠ xTI @`#4s03V!/iNcQo:ɓ.:ĻsYvڦ ED шA/KK-%!o|0,rIӒhhpًjGܹn7 a٦Gz v9LR%!)$|?RV#pPv]vUr-iL @PADQP5> C#I1P[$UPx"ˡn(2K9fwu2*!+]5lhX͐+Ѧ!D)lTC9P5PA-Ievl!J~H!5bx'[>b In{\Üsa_v7jvǍOQOq/pήiB]CLdEVAM.#8 ޙr" O`s*T)}:<1s, fx+A"쾁[9X -Nv> (_GZ`p㩭y`Tmdsbƙ c9]/&p h5wʔ1{O*>nWz llۘxIqlM!2C"ݐ>{Px{_ #Lx ?O&q&ݯB~t V{³!w{F 4W^ CIqE{/1(~۸Y^OLm#r-YEV_1{ '>B6%wn|𼃛x(1[mTch CldTLV=S,d 1y+U{])y:8^h}0AӇ`8ʜfΠuJ"yѪpc,69|4WZƅ8u@]5)vZ&q>u581m/\ymjv1ϵ$Q~hQjvwf#8fBȣlO=;IbXwN~˄70;jyW WkgG{"+> YffxX9 Uij$wAq삐ZZ֡Ȟ7 k#ϲC5.5%;66͸]pW\oO-5Jfr5eY3˱8nibT"ʢ,ۭVRvQ-l~ ܨ^[1yih—'gUH-plCuI̭f)R c_ ./V_j?ʈ;AU}5];yЈflX]} }zEý\hn+f_v+9ks)Cb^+a I÷76oKMUsĨ^RP)[/HS}QT~R4v'=#TY־A}CM ֫!Kv<d9f#[.>BoĖ}Qr<d?.y!jm%ѬiYzVx/k"gٰ!QDZxRbz%zL P@Wj5Ӹrhs]ۧ_0lF]?T÷/qjQY!1E|ӓ9dW10Ŏaߪ,{>5t ooD֗x \K_ *-$4RVNj|9]la30 ɯPJˆdҬlƀµ6B-܅II'[y-\a/[ہ:t4y 6,{/η?2OyyY>-)bC==w19\k|iu UhQm)e-|qJW@Cull h2op*-_L Hn}~`ڄ`%ͩ/V&qKLN4g-:ﳋLUEE0Oɸoxp();pȽIIFdiIEKGRJkv`ŝqae%jIͻ.*ǗjۦJxܑ-?w5yz'(yR5[You/ \3 0-W z-=$B%8LP,>U#N.dz)>XJH65BA ([;l9LбEDQN\ci"j3HΑK/c`VzÏmӿ5]<9F/tO[*l.C)uqzf땱GU g}U2TѨ5 ؤ`(AϖJ\ܔZZj{6M@#H&S΅^0'9hqЄYIpm1B vLHcSH12yH8O+-K[RS-Ԍצgnok-u!S3nx mF#N0rG[GI'>|;vL3`=.[o6t-JԶi~楪i4&2t& @p -Аh? :zIs>Iw`)~7}!kx}dp[9E ? ƖԎ^tj䲭ԒفۉZwW[Ieɠ hPgbGL?p^?=u`[Uh'>TWOoHƅt<5ns9{$?mrgٜW>y⣮"0[6)eB@K4d@#eN%UۑA\kR殺 .սaZiS<؟`dF $Yb`R| 0&xZ%Ჷu5n).y ػo*Ysgn-l:/M~XP4D{C@~g[ ޗe<R}fk5N۶6sqrD#d!A/| " a> HG>HMgI/魋\:JZb!M!+baQ"ct:Z[Gk4FwK4EVv̩&7X٩j4R%p3VS¹i]{L٨k;7jC,, v%Bb0bR">[&`&\τtVqPԋA,u)rvvg(k7vgVֹ}"^ xJY"u<&Zg\|}L $[=)[k󬥾:kIȌWJ߬\㩟"#[Kӓ!GvwI[[m h e^5~XA3}2cjq`[ޯJ,e߬h4-D1W/ A[X;)7{Vl[V] )J.h=>/ƤYRTIs÷(~lqNP{< +Q8^= ,UboϭMYcb^猊 8 _Mt~(w=Ψ]R}^? z#ם A8kT)zk+<4кdOQ Pc@; U̒p y)Nw!F>ՖBOiCLX]YNC_jngEq^6"}Akrlǝ pWa- Ck&խ۴R1GЫ]$̠ m▃Kkm;7aֵ=@ܶTv% ޞu{m:K~pڕ!5P9{:+-x__oPnm[3|.#@pbD~YPX0Cɨ̐ ߆mpk`, oXҽf;'Z_`Նna#1>O\cMl:h@|xǓ$Ԏ_6:a(]ؔl~H}C5zdB9%vTgś{Ij!ڰ9b GG?uWv8kuJ>g#CZwNϮʨN/!Q%}J;FIJmubfsZ 5#,Xl7r]|ubk^Wq ;rV9gߝ1<+҃/lTarQVL{YI׼%]4O"Rx„},h疾MX6,`NhO?,O><#˖݅ΩSr0|[(\" 3/R|4G}ű-tъ>8=߆u=断aVuV~ NW*Ar匼z ?Cה!imxO;HA9;8lvK234SVru(vSv['g`#}&OyƊv9 !S :#WUZ wɀ,!Zn};esU A[L 1oi5~VP G[0ͦoWQܸ= 8%=]\Pa1Z {J_U:!^49)ڋ#T$H 5-sIzEV.ENӅu>j`ImuIW )>1q>!56:8‚;(蝱B ϔGd~v5u)d=Ц=o^ɐ^ǗRcޮH4dFW3+V/9_/\967D9sI<=)~Vtdm_fSi Y#F#0dًC(c{sϭktj#bΫB d0({Qf9+', y&$d&-cdgr3q>˶=*s͹tJ*2q57vLR53"y4D :f,(2%P4[vq c p1t찋_`Z%ڋjiWz/kmI!4E{ѹY2?n.ƣ7@CsgҝS9z)LK{3sZf-hJB*mt[־Vz֣A*ʾG gzc-*aif|<yR1qi ~&:L"{ <,[h>r*XKv6IkL0+k""t(_WT=;qSMM/?!V٘yUۨj"!B6HY$PONH'.CE4!.D**Tj'JY59ʜLW,\Yf&\vaѨwv;ӈ|O }P(9g8T# Y@ٕvn'dIaru2|Z/fTym(;% G c|ah%.j`0J=\|`:WTh0U;)A}݂;_Adg3 56)l*̳@-~&6F9b)?zئ`Om͡ՓX7i?ڞ+B\ESU ܁n ȔGl2A,bY@hd wvvѮsrnުrb`k鄐 є JZDa( zrK d=۠XZJS3KlֆHQPO}CUZ19sM Q Wskn\%tFǖ&ƌ9cY ]RW-f4T#KgH"Ki(xIJgܔ%驶TD"8٫ ٤Fli+;)Mr;-qt ӏ];hPK榵X6M5 ξ2ǃ=h35"#XuꋯIQ%!w^}sO uQQi$̾;o1+*5?n]ѥZFMv|5G) x.JZ::zYin00e3,+в0A3FpuWI m%"?,.( Ĉ=/pUV"#@T2]KǰZ@I2cc5UR $xph1ib%cXnըjoGIvbM7.4]^orѵEXO{W~\03]ܗ{(ޣ);Zgq(TRʠۧG0.ћ>//l \礍 5[kL|<.ɴHUS0^"|^84l۶b63$N0^ݪOWA=A M0ӵD,C̩¼FIT b"y^QMR|.2qxn4q!{&% c0wiILXZ3v\]qٗZ;u9F68@B W%NB {6"lkA<yІ2Y' պsai4F; ~mo .Eލ.W~)qg-g5֚ABKns5kxv1>FI>NNTO>@rJʐTv)Ґܬv[8U7X;92iX13?7g9rf?}Uys:kw3,7G͎\ٽ1N-DDsXٵ44rK qo۔H^bLw GgMv3/:b뇕L>/+}7 @jFU-:Я-@NB#@=S K+Pk.1788!s\k{c=̩7FY]Wp_?5}Oy6e=GgS'̫Yz1U W;Ɔ?E,?QQЂm2djiC)y~2>L1#6tGzZY~DyeRU"0=RL8}@c7}޾ޖ̍%&grll _F:)f^q`]݌Fwo75ص 'î!~@sٿt4e~VS[quύi1YPwᲂ/K66B';zt{QOd5ލe{';&l, %F>wq7}E|I7qbW(˦Vjӷzw!./*;͛}E3Js&ONL[ߥ<~oqEi<iwlwHYP\1B"~s6͸jWڲlt D%+Q~GdqŬ0"#*W4ޔZU),S_+gmm[1cr=&|ڇdz4\ QLب%5?3v:\288(]P#9*_ Y \qӸapWh9S a u&Y_ռ6"v^Q4X1FtW!ֹ̎쵵?ҧSNDSpaL.ɻWz󦇗C$ r~$I&*9[Kr|ig XX\=Y$LKR N*(&w[/AMj|wM=a_ Ȫ|sI?uNf_>;+UvPbKq̢_jyUW7t_~ǧc}57N?; n[V}u1.NS+~z޶B$UW{zPg#}dixƜE.+P]&buٗJU[z ]X1fa%Ri'\IH^[(Ӎh3-z)GJGNF W_z KϪ89p7 ?ŠEgA}ѿ2FC,-@x{rL#!vJ![a#6vo @ 0p8t@0wCQnwۍ˄ r1M%`lqO&=f4d@#V! ,;$mUM n)]nƈulսmN~~S`XFd  eIf e$$-&eDlKMPeBWѲܻ74ll贞fl3ZmD,3@t@I:}aMMrF#X}w[\fmwNh_ɐBRA D}D/ .ʓHbDLmiھcvσ'{Y0MXM7ih&hr9>zKi>iB844&,h;$c&p~U[K2C"WqV%lckM >c1\W7%=T~)76}z{4,ٖ'|6ڼhB@8>͒>:a?t&UϢ$Չ-tpb=;)Y Y9˦Ml+E_[C zĭU^ uM]X@xS/Le"q\uEZOY'.2bF+'t[D̗鴶΋mC?}t&giAs4IcMOP@g*c澘o}{g/`(XtR׈ *j ܕ7}KE>rĕK~[Kqp̌r5uo{ bOT0rr*(u^o|" -~oKdo?]]0r#ZӫMVx /]^#Tg& NlzM7׾^YhgFWbjLYU M;5=HdT}4e[3؊"\IIOG50/Z_ȹjq0M|ؗ5}VAشMuw9JK.i,\w@Ȁ׎熋bO2Rxr;~C49- 12Tqo nqS,#@=WB]wK #Ob*OIK[}B$ZfVw~"!{@ m*Rqv1?eȪDxdQP<$kYxϬ(@kj^%'7̞ZRR]j[*AQe+m5T;sL#}I٘ \qP3y"=Ҭj3&xڭѢ3Մs/SFJOvx?>fDQt4Ս#rhKQ\q Y<"!'׬ _ˏM hxe ?wtĶ,XCWu,^*>5̅;WD NbN:zt xB Сn^XcS^9TPTP_@aH-e:wE- 2I(ʣncZlh1TFr qWBܟpF^)fXFidtKJ'Ix}62u~mp&StL$jazZ%-oRw?Lj5wZfYbƗu*ac@ \BT@Q =d/eaj _h5uG$9+[,vTp.)_*f^/6J{ebӫIe V+_ϟV܏q`Xcɍo'=3%r Nn,Bni-{{bFkrܶN?;M`wjzAc)O2Keibg/Q:ie ^ rǜqEtK/\B i)W5JgrNFkڴzJEe}tÂ4}6*tݰA~0z;ĝ:e#@zz+JoN+~2`Ynm%1/3K[*O eJ}fiݎ֠;Dhn~zD"˴0Q/}uǘ^#kbădg m(vDS9qaat9e>4]617mݧ4ݰ:*ꍱ2Kx +IOԢGv]4 a6m;s vx@'\ BpюweɶbE~;I\:5Kw)ǵ,Zh?ˇ--Yڌ*'=z7Kg6v)ÕDCE)@҇3aCYߜ7R̈:ɪB Q'Q l/!yq< y ڪl|k{as29< DQ?طbQ~G૨H?@T]0w8 `9uX!u&Ww\IZR|YM 8ٌZ:.%B}Pq(f-@BNT($P`-Ds 64XTcP QTs|=3^V+Ȋ*` [-C J 0EUM@ ;qx.H*PX3 8{oj`lX]"젣R,9DZ,S'4/ν8aYF$N'WLNJq=޳ Vrp܁ZD__⥨UضWI ֩.I?o\{dܠ\^UKe7bY\7]X`9U Qv0G`2騾d3s@#V"'\Q(HW [wPⷝ6vmwv?mM$]Z?02F#wRɒ_B-D<(%(nhW2r{ MݦW:Q&8eDgfP S,Ix#RVWݻwmWwmm[p6WvvgeK.-ED|@`!xAyN@!bk3jPR/dD9*\?`wT)`J0^m}yP %6;s"R@)L (f9u 1POm#:gJZC8#]I>I2M0 ^kbc0pe3Xn*՚{:*dd]!6ݷRrky lm9c=px:Ma3}Yi!qSBxUٴoVGCaϡ<}lZ]CSaw9F8* Xs9,,;Nyc'dUȇl ^2.ȩu]mk#y< x]Y#/]$1u[k&OTn9XP O2KDzT$`%Z:M=f#gٶ4*|__{qf7-[f BnlX FOarʦ3DǨ\lXn5ֈG *GZ W 5ܰC?x)ӓΒM8ԏ-sNtQB|7h KvWgUf=GҼmKLۆ}SsQ8ZܝYKDӐvbe⌑q OξҍSҊ/X^ %nW>JK*S†*<Ըjߝ!Pc7 ϑb)C!Czr Bߔ?NH0LΊw{| m~\ " C]u`Ova9g'ӛ)Vt+$Q@-%NԨVJA Y>r gU*ᘪT״qYֹ5Y4S*F~Kq<@C=e>LTgSO?iehSD=> fj|s*َ~,g+ex$wӤ|kUbJ*n~k;?#3O̥*PCFyT2$[[̇,9߂rV}P_ USSex9oX9xe_a dߎbi`2ys$g8HVZ)V<>9_C"ȱ0q=^ϥOiU@~n4#T\6ĆTtY 6`?N:}fި2cOӂ3>f/9+H=s+k)uJ ɯ\p}vy'(34>&f*v N(lѐzGt,B<; Ǿk!j7Y&Ax|Vȩ.6xō~:uSa ݡ TwppCдNcl*U[33fk&ɣ+]fkL,vƉ:|#l ? KC zL;8dQ&Lr#KX[_VkVJ7F~r{/Ii+ҡCqԀ,i[ ʵQmC όdfFڭˋa_^>=΁'v5>LSI[q{\2qO͸҃15յ'{#-+xpe,OđN>8̊.Z`ˊOM0F|qa֠6Y߮O^;{A)C߭?B92(n;bϜf?7}.]s2%{v1K-zF 9@7=S# 5Խ V >k7 *FrTIS߫[@$X\IsT?qꗾDd&{ +S1e{*(z째|֌q.I:|=ͻ44lJRJI?e2:CY/U;|rakJᜭ8s84c(>ٺxm$c1b&a;Z dJ98@?ZIFK tW̓ I~d䟍JiM~; G MŹ2pg u5B$rޝȋו\/ItJV0ЬO cV[U̿DBfU5tD_lVD҉kb`E u8wS'?&8[V2Ȍ?,YŖkk4 óEU"(E/|Z(\,ny}} C, bAmʱa{"o5TŀXs`;a-An-䮩D0=&'y~ .m8p̓_J98}+(@4~2@ܔ#>"_<q͖rU/oYBhW"+52Zic#H V=Ũ24 hX?FXDLcxo<$;C@#U!.;VSeʫ$v BfWnh!s;~JKu2L z! ^cj2/B {v;l-ۊ3$°{$ر:5QWί{~r&FSVWh۫7 6QϠE%Y+h,GўDϜN5@yM$ǀ R{d( \ p*S=r=_ki [BA0ﬧ̡ qi&uG^ok,%}>ӳBSY 𽂵&k*c^Pk+ 8 vw4lY dqR9ՁۓWr](PTh8yW4"лklWc8QʴESB[-j>}@/-kGI[pMz84<(BڍiO=YQܾ@ծ7{ M81Q=Rl鍳F` `?jٳ5LY[#܀*i)vW Dg;SV5`(~D-~gW\'Qؠ])'Q H>}ll wv]HݖQ3lfX'tl _qȑ!(1^=]t7#v(69wMmiUJ8DUq%hCW=t!xIUWVF!M "spEb;gũq~U$G.;]Ϝg` 6`0^]h*^Ml#0tWn)N-[X&߰3nf}C-s0S頴_z aQ\{7޸G˜-UIO;VZbwF*;YMotuȭ!bbUVL384dT5PDrΝY7&IN\nRx~.$vt\7y!E| .p`e]ɚP-V:Z!\pts<`!uZ#!c) Ӵ:%. 3YQJt~ۛzql>Q+Мbx[E%a*ւ~ĿsA_}Tt8yd٩oNJ$h\[77 Q^Ywd Eaz#e[PaJ#|9LG>o?ћȕ|Ҏvii19=|(}Kyċ?_O35;P:WԪ]*.&v^r3z*9ʖXۂO?d|}ПYP_B(>0|SCW> 0Q2Sg}`i˘Õ }"CYj%kV@jfo4|+OB4G,}0؎ eⓁ=\M=[*KdEss|P ]a}`&TΡx'5ЄzP)Rr&.GOtk 1a:8 ܑCnpgJ8ϰϳQJ媔qA&3zvf[-Mů[U(-Rg)UP Bd-zfUHW"j6wl~u|nnUXЭPB;~CO(t5fa^JI+q=+%f4\Nm0=:t8Dr.=$"ݺ|vZTmvR֎ }#]~R+t[);KEqW5gҁ}X>?;)A%=hg_m2C6)-YZ7zOѰ5N_01k0uj}=bkex8W;ySV[ke}?B_ q{w~B Q=̄~=Zd⠈!IϚo^Fr*di%Mڝr%,N6IOaIMGɅqUHy 9w P]CDŕqvI|1wtd$Dmz2in找f2x9r}Nwe+^I&'3UeˆK!87@_wOZO {ΉZxWX*qnȵQmH!ehl(!erb:[@Jk]Ea>QM%H'uDiJx_2]PCR lcDG)RUrƜW =s:MHM9VGC\UcHb5:|A__̼.'z7vEo˫+QۼG׼ouy7aw 8u[@T9O"hzutyx3XcFZã| a58R8D.X~(.]ƅǓhA"/ekpVK O2vK=ggt}ꌶEJkWL`,ѲR93GO0Ss)ovs$>tr3h7:_ i ]TR~ˆ}~Iv'|Kߒ#JMk,9Kx P1m,غ%'L'#wWg~ewQaHdK[Br@B=PHg[7LjSVmф+|q`7v2ITU{#_b-es~2Ϝen!^/pWɘHٱ]0>H0{o3ç֡NIhD<":aM#K' tt=#o29U4B`$Ju"KSmҩ.BR禧Aj[ST+Y 3$Y4s$VY2fZV.@ʥ1h9@?>ٔ(!~iOtÿ |wXG5H` I@o:[o/ :'S ?=Nf2ɨɦˑs^o _^R@;R=0^Pp5/^nXDx^ :w\X{bF;^hX }%c5b9O5 >cwͽCKVmw mh[7GߠCs0#V"'Y\oI/H #ēMwn@mOS4IןO шA['ee mL \$6؃h9wqrN 첻n6tX#aӘ:lgV+ɲ?xS#FPwWݮVKkj-[R(5g.+PTHY * >1|?*[~r60 ybʺ #.c.W]VxS?6w; Rd('j-ڲm4 r7&Ef9㝣~Ft]fTnҢHZ9c\bl!Wa` ;i068AZa$ӼC͕Mǃ  jJzш(gᄟx/bω)clW|p_8!_bn> (Z [V ^Sgn Z_lO5zfٺ2Og.ZaQ,2BJ F?YoդImH ~:&m˒Nr.:M~zf%"df5WAFF2Qkd BK 55z>K>lcmZ/Sw ,ЦĖkf?j[b^d{)Z1 $Tb5k6q>OnvSg9 Y]ozfQ۟s 7vcO4C>Yz55OŻ^YAȦ?s0їb/:Fׅ lau?C  rL%83%t~O_~lfħ Ϧf޽*At TmF5PrpDC&5>ĒME q)-m j@$^BW;4=) q/w2G۸ڱ!balM=譙JR$u'JuJ:dyI0?İӇ_y8WĢb6]R*@@KQ($8> ͉u)PKFDYY&YpOclӒKN?%GI+cɇ`ڑ5$*vknM)5W5\)osO55LA#l یNS^SJw\ U㥪QTXUdztV씄Rr5Le #10)5;86.8@3 iQKS3E7zW q`c9ƹ.*%%mJ2]=3v{f>\g7@N8xo_7?zL $Ϲfbr d- U=^b-e y'&d+Y ߶> %JBUqwY^4/pGqПn̉cJo9b~vi/l GS^M9k(I b_v4*ueOj/_Oj- 5Jdl|9\I;Kr'dWCP+>^{:Ý-rU>o7HRWnvvKT˶)jmj)q9(,W> 1#} jW%5ޣ+,#j6M{Mz';=װKf5yr9wb7ag&7gjٍ!⬅wft8Y-|a]}8GtB_]3. 5| s>B \p<+m.|kq?em#e1&w]"H]D J1w[%' ~ԋn'tI7ҋNէ咆[Rgz48'r;7MҬm[I|'Ya{w}69&%Ȱx_J) zDeMh|U\ތZi8r"R זOF?JI[xc0I^@MM*v:\N"PR4OA˖]-{,`TV\3@Va֝èZj[@dLGUfb>S)уUor1!lg<4#(!հ(ox2YS59:5A*xׁJwUS7y5 ߪ4 ba!Yufi>iQ&ԜzfUE]IO9fz:Yמ }z %5<\5nre+-:oEψscdp/M<"xZttLE |jZ%&k}DQNωKY`.n4٦nە"htV5oWP^x+>͓^(SW=O62Vv/yj_ w)ٓ9|jO Mb8yMzFV2$ ,t#Ӣ7ր(Nqv-\Z#N U|Q ym^V<%M P\jGh2G]=˵5.NK{|BmN)(BgtA x̃gq@\"XD GkbJn f(,mHG[ٺs K)OݑK3K OPRXH%6K(Vj dA5"C[5S\Dy8٤kҝ0'[qH#Cǜd^ȪҊdqUv~1zD6>} n! :8W0B4;_~1|+cGJF"dS*( b8t"kcR *PكdWG \8! ;[L?V(*Um+h h%BMNYhey]ХB AA}A$+a$5x In󃳀Ik' :"t ^DxID4p/Y*%Īi!N-a+xdxDxW%`;qՖ@ >VϢeN}wỎUaFV7V1E^.w!Μ @439S2=_xCi''[_8_x:v- E?Ӊnt u"i'4'mӛNٷsiC>R+p"ӌ B`xfX9$!oŴ8XRa,V [+^$-5pJ[6S 4 9Zi89."= pq"KJ$$#d1pdzsB06D*+>4-A`#C03U i/bi][q$s#G!}8ҵ[Mwnڅ /`XFF !Ks$@Dro SZӦl{0TcZw# G䯖D8 O`Y,Ygk)C)7W lruA)jSU#މ7N%B>`Lx90U|C>)5W.xCIG! }hQ#WT0 |a^+Cy[u^ȏtN۱w喩ɸZcco@ƱQY\5[&,ubXd@ X*.kK0TbWR c{ge>Kb{Bie'F+*+smF]TFP{ ib5Ї .jφ4n~E;Mzh颭jDVsʢYޤoXKn+H3w#;G7nhdXRv&cڟq#GW(NřhxtĨ"7'YU=_fx|isP.[lDq2ыeVA1y*1v\OO}py[CRmMWpFE +7vYTqs:1RHk5?.Z\zn q~rECs bh^Vz6E/Kǩ%:xY֣+c1lі ̬\%'(4B']+:fq; \o jqۿ*:^Q;Z`^AqWK_q}͟YFi~Cw|>‘߾Z*qĽsr t\4__ ][=(zsu>I-.oOV/40u3;pA#zèN 2d3 fjn1/W[{G|A~_O:9 <1d(H4lp¿(K4qPҗvOuz 'wA9\swBgua[́FX|џl@)6IM_hbTRfEiԌm4\ a5o'd.js)_]%7}/]MY5SR{xRRηPP QZ&qQQ srLId|_ p$*:{#筧27ؽػ~CJh!+ >.{W!4U*ϕhu *˜Y8P H/8(nUs5YQ5ro)X{l7EfDi?T=la+hKei[ 9M͂PKƳbґiF^8HЧ?Or7ߧVj'bUޞ >-hKʝ"qJ'cdT0]$gd'tѮH1%/ (/.9fKdFu[N~â` |QS ?:4/)`]e4ZI\a(@, K]})*1/i21w4':<8cBDća&aP=Cū %:4p8$}6Jk͖|]5{Z%`zs$k>Qa,. BZ&ۧǶ'ΥSmZQ#؉8e.y3nLX$XS䲈G >TA* $˗Ф#y{z,Y0&x 3!!{qsS]$D _ IqěI#W?I4l]M!*m-T#8=H?R6d&>["H i[zsEfiX /r)-whs%{QIvܟ^?]w X&j+U jwʫUԽw]4UM/=G:jm7[F[BI$ Aw^wv۶uY1lmfKLJ#- 0D#T@@`0{3 Rh/J5T0\^U& _ʚ;fAM(͓okM8ՖBq6 $2'֮ȴ4t$gjv(Tab 8:jl LbC]ti-Lr1Gv-"%&dTmVWUO2|X9) TrbsFRnk5-ӯ-7m@hɮbfoP{7dJ2ek"[1Wf!ö[[AlgI'!Lk;VJ{4 (hΑ-ycܗ{Oɹ5-aT`Ct7P~##߳ߒ2M߈$3x;iz@mncؼ1Ů%o;Vu:KQ2_bOv[یd iCS^x?SrX4f[R[S?W5U~i ǺxvL/t*k&̎ꍶ$\[}+369/i J8ۅmb([B >fA1sNqd$_~YUV+U2I9ߎ3#z.Nj [f=N4urر&6?U$(p3z9l\ΕwEb*k\4M_*Vx0U#-зxe!Z.Nf!*0==dgAjwyJsv]mm:=WA-PjN",߶twcx҈›Y%&GY>I692 ]B-ImqO\kzJEŚrsA`MƾyT|S[pvpAONQ[p^vG%+ Q,njrSAv(C9.5YJ#hbdfkK/A55s*y(k!KK`Z ǖBN?O Gl`8/LOh+P1쿚+O߃ecX4ގ1Z2`QU[Z=8)@u۫qwcl7HX+թ3i f͓-lvݗ>.SU*4ӍcA) ]Y^B bK(8KƠY>Y(z4)$|~UC''_Vũ$- *qG/ixnodڴݿh9|hecCc6| ,۳)uK(༥Xҹݗ)gv#|ă="H5('(8|$ ,Q\LO r^ [ZIgW;mD+KAhKml$Tt))dFR48h 1y^HfUu}j9#* rL)M.AHq]|o^A- ޶m>o֜7AūΚh0Jnpi>rfpy2{uG g uCgV|!7"!Pe܁p`*жX֋Թ pYDQԡ.nS .#/"Z;y)Yu_7xގG[HvF:#4[!#dd{y2 evFsej&;ڜ.l8(^GЅHF IF@MGδZ8tˣ{'GIw6|V7Mx #ZC^ NDy)Ă{{G)&iM^FhC$l}zmJڕ~d۽O4<ShX[VV[ g/Uk7U#`.Z\{1 ]$i s;t#x^"1>gh]X릺7cS(+ z tH"SȐo-GR+eIbQʵc*\*aWt[AV齐)ZĖP9Yf1""u/hPdu%¼_FG(̗}( 1 JX-z)@ÿ2*N@}k2#lqHHف"uDWHLt^(Ü 02slD@d@ېha6[ъq~])'VJb}tzKQ!脤\{BQbX̖ A%yoƾO4Wu {9Kg+zQ-ZFn@- t#A˾h w /q1IOþg݌tG^z._N+D}̺0zBKXWhkhݼΜXJF!ǼJD40NC2HAb!Pr[ ` o"mV;h\HDo9)-z sr%y,wAYKO ~i*&3B(RmKd &.V j{܋;oPd;&[`O72dMzeפ',~C:,Ifd}nn۹ld˪VKB x1@@ '|hބ󡍟8(]`oAS8|Sxjn,.8k؉Aɬ:1e*t پL->ͮH%g(w*'c[ =Vm^UUhaX׉[=u ruOiGh&-Юf5 yɖi|%U.3-sf +dgY`6%VwUlF˅M& c ^x̕60.j)Z0T i_yHBX+xSD?'g'kp3 1`{ɲPavvr2RU"ܖ7ۨ_hˍ<  tحu ;)7Mӓ(uQ@bq4KIk|4{JMh,5yRkzKfE]ÕMw_f=5TtSWl.V=Bi,+J,}nB+J;dv=qgb{ѳ(UDFb@ǩr%/ୗ./zy""H.hl6oWլ缾|(ݿlEF35vE#jݯT۽UJd#kZ?%Se1Q!BM0t;ib_EN櫌nҦoB?mF<R=`hiM' U)=&*!N&vSdQ[C;\.4aۖRryvSw^z7V|OWi)jqD`imC.#kQ^NiSzL&/uTR[Y 3rdGy@@F32^l 4L3CGGokzi{tŻ8oΞͭVC/.hVܮW_C񫨻?"CEGpP D_UBJr:p8T,N;>|sHc.CLSS)!kjRհA?hHNп񈏱偄IǍOGKir}ʘq^4iӡD]|^ZKgc{ļAumvľ(0sbϐ͞v*e0ToڲM>[s'XtM^oagܘ\nrqw78p)3j|֎L»G%NşjQRP9 (jtL铆kCn^FNAýRlR[U,|[ꩍ /ܐ {s7:rO\Rzk[5i"Fyz.CLI oQ2"(?6ݔk(*MJ J(7 b+?͐3~n P?QPqlv]ߋP]'c6LDyR<_xŬ-9g{_йwʈKd0v-zu;AUp]jP^8z7EqZÔQ%r) cY@RH&~GR#~/##EV)v()zS < GGl+ZȑՑ] v40ARc! !˝Tɢ{ !ZF+X [~ORص'Ə!6N=%kzA}GhE&LX]/Eff[}-ϷF,`N]>.%Ѫ}?dk*w#"##InKO78JMx&/)- //(+qi [U*'V-t1zߘe7iu= =cVZqBo[[[Ed#`^2 "}W>Y0OhGZG͔$SQ%VYh`BV鿬( .Zc-%72(gv.ͩ]vi#>9bϚ8m1_ߎpzYzj40ݒ7$Ξ);{<]QGgR8{C'<Ňu\ͶB`M :cra,`TL*8\jvhq;톓EY(=! -Ѥ Xʡk;YNY=<9)ũ[zO"vݼ/xݢJ0msT,wC'!޽qڛ'0ø7tu4YGÖohk xCvtd~N?lܺ:ھ9{Fmn[4+\FY-f8l+dm 0< <((+Q-?m:HEDZ|Ops˞koտ쏎OW&{ܒ)K.5aca(@4{mqw3ܰ?-=C4嬨^sC~7sÁFb`pFuhHzlJ*iwGTbBKDJ9;#u(3KL&| F:[VP'E`|$Έ=@vfXc9:tI $g`<~AԄJH}1Af+tpw6('u݋.4V9vL8=Nβ~c񊰁?}nrOX GB=#?g\1uTqp1YeI&L>%H3_, Ӱ1A#p7? T=^ءJR?k{N,(yGaO+=ʋȄG bw v4.o.x=]:g5qk _ nE䎛($[p~q@v~բ f_̊3,VqyX} ^_c#M' V#f=p3@#oe8BW*(eb-E%z~ji*&4@:(4l@IeaF $Iiz5]UآvfڂwN0~z.6TWP!ݰJBKޟ|),Q| D3W{ݾݛ7Y&_e%3/Q.ɭhLbI%   E@g! ^aHbi)̘*P1&9 T#3ɚ5e87tA39(.{2kÆQBŦ ;ls4r=&Jx9-ޡ-!N*}vQ^F_G7pOޟ?Jl(S2m&g8ԕLz[j5*^ܫ'{W{ynY8UW~l[gRs2e+'z"Jt-_)^Z&gR|MuZ|S*Pɷ+GOdEɌr75ܥ eS\Ue O5Yoט^I5Yr̫\}IJك%| [(kJWoL|g+OT쟚e4$vZL1RŲo- 32dڲ+9~u5_.'TblT-U~m=#ݴ[³u3N=B|VfJ'eC4~P*m4K]vA;/#@Uծlȏ}0l~FIX NKpZ$d;gt䔼2xǪs*gы[-BMtH7sGUFmU צr?Xm ࡇ Z@[7chy/:jﺤ Zڠ,9{Egp2c1a箐X.ǩ<% gjN7x2\#X ʮ>d(q#ctPGn0GUvT o%&х\ tsy\hHdOaa^l4?C=1//i{R%bv#Z)_/'߭PȐ7րAC78ߨ#Ik7R䀿yVwE)뽭N?|3~ FECHi ܚF5~<ETTsΖM3hz$ɾaia.^y9;08Lm$LN-6a ˳I^b:(?|̏=ѥ?}{Եy~iI娵㆝X-O1i j'r*ZS3{aqDDjS| +=zDNp!6vy2T#3,K;b"Yp{b1(c3ބц= S qʲ!7 H{Y,q|.+BzW!wiV8q; +N̫7\r7}LYҘ$|+Vi&Fz]/ʽQjPag^\baq8&o*~\U:8d:Y ؉cw|d[)IT4?l&Q5SvK)ݻ=Iþ AD3D^i.%]Da,9''\4 V*lA~v/w_" FC꥛TK4|7 {6b8+R$jYO&Ie5MRt}%huE;SG(M ?68HN~ʄ= @Ͼ6i/}Rj%8EaUWs'St Nő v dw:ɡV,LïvATNsޜTTêa Rt5_*07\Ua>'C:hsI[sŧI0rTztsG ZffcGǃ[4zaL _:<,yq[# }|A|Z_MzAOQ("&>g kXn<ɒy!3'?ěȌv@E/A_>ď~=5Xv?+k}gߐv Oܣ@Q'{=3!g "=2TD* L3O vel'b]ȦdL'2\-=_rWRa.R ~T 3k:5"8_@+8Yn"Ĕ(9k:NMu=3` 9f1maмG^s+y-sf a"'IՏdlnSeĒJb ];i8ztpG!)fɂ5yHK8 >CzrB9y/ OM%е`e-7aalN#@vo?o8 KCC$E.0+=<jG'ioiITt&[9 SqY gYa,ݛx/+p#emO\K /f୤B5-R`:~5?Ҳe) tA _:ꢎN@T d@Y&fOE.w0S#`E0 _,TA hՌ ůC}\۱XN{|ɐudY޿1+MЦcrN t*[k\ F!Ðbx/.j 9)fz< v}ՠKșM3]}% nz_]sH bqc (Z87sg_ArpAIE:uJv5Xu0\ǣ6J=u;#L֣[uXb`%&X\X`K3i S P r.Oӛ) d #hdg`4@#oV!'a)2n buM|wDzwSU >m|"f )$$-&r.-";@/h,e]w;vSRKMw64n7)-J!z ,%HmvVFn[d$˺l21YY Fqx"Eh #/9rx@,mgd4W-oѹMh#(>V@z:je1xowޚ(kMwR|J_xx]y# * >{K?\ay77Ds8%B$Ν+l3!?b䦩y׫ l9K~7mKt Ě+w4k_Bld)a"SG%|UԎ,h[/GZѤE/zq VE)tspf{GC+9"c)_RHmɓ2Lz3@28׋Ԙ0cv8kv LSγ׭z ffHI fLja[B4cRY~c: P#nX9TM٤LeGc7C柊s&~^+gfw~0%` 2. ((:_ y6I G>G Y)4Mi-s}ZnIpAac9 /pv^*ۨM~rI]J vNmmUYA9ȷC9UQ0jV+19b- #t^E'䙵^낺dZ}'Cn Q'Q"0󙑗@F !5`C;q&F/?y(M|j<ow,ԇ]1L%L=z \-Zr[B\kغ=|S7\%u6.ɸ~,ŕe1T9¨2W׳F}.aR-,9GlR8B=RY_Ǚa?r %~y(f7g,ڔqÐRȷQ}sU[00LfMmY.Iz6YJ)90p-6Y@_Iv85{vo^_==QǷ#'~б!d0PSLnZϢɡ;,#Ey"ˢSKP X? By( e}ǒ5{˒#Չtda,i!jwϓʉxt!:Z iM"2f)yϘjmT=ʪ_4sE4d K6€"FNpBtrqXlEܽE1p[\yFO̩+- i7㳣Fa93*~?8)ôe_!>rfOts?3y}1"碪xlt&\^^7ńMCB*)|[܂Q65."d =u4mŮHي((٢c ?͒?~6=dD>ױfdZ~:qF4+z%_a@@1`ZdYqI)tӻY6KRۅԏ&A51Q<M09=3Gg#=dzt y`sAJ^&LP=|1?RN`R [Px΍` .nSFj3zܗ6e:a9P D[*.䗐WoЮu{w h/gr91k=t &Y#ҍU--a}2Ծ:*_UrDćo(\rQZjӃCawZ 3kJSʁ1eb)h&BdU<T/yOZScIzM HT/XƚٜgsU˙Yڮ*-QԣtRKQq>w/,ՃӬo҇ww:}+ՂHuZ0//1ㅂuC|iyEE# 8%a !4"&bN$IEJxS z ݺs#YG)2%`='d[Rg} G[ZB[2{/+ ?oX'* suy.K4"S!F:kLX 4)NY+IEts\ǔtQz/*(H\v,Xa4d@#eN"mZX\.R3 nսzlNU I"h4P-Ж%I |p[Ty^ATwwwo(ξPPlt(m:遏LLڴ / e,M^2F3XmwߵmYla5iۓ6L`xHH'T*W D4E?()f۽,HYhKANG+Sh<ŔAY-I9*ى%; #;UJNʸs$.,Ŏv3XX5 v!+47}03c:m,N^R.ղf՞ҩ8%\Jۗ)-$ykvZB*SfDYJ`wn ]#d/>ƒYp7T 0;{ʈ} #8SďAksmJm/+Iɍ}KٿUrjTr0W_Űq?b|lpDzDk3)Jg]/Lx5RuV?w pѝR?H#`'r%Bd `ƒ;uVoctI$ #au"')U9CAnҹM[yk,.sxUʝd|p{%Uj~Wߙ.޼zfZ:kJJ AyPq;#Wx#EOG|ChL[GGn9SaJj)vb0F 32O<̽.svc3Ka]n>3\;Wb^) knYhfέTLI!P;_]2+  k#o OI l8fUsh&<^"k2Phĕ#Ӻ_f{|M"g 0.IYєA Wp.r8풦Nuo{A5DU.B2Fjj8)瀹 QMktNax+%O6Nn8ms}jkׁcpWCaD;(㬶Hy ʲǞç&D6.Οe};n^I]ͰBVvwj1dgH הI8BfX$QIlbaf͹xI.;qi&:m%!/=sW٧OwiSgc4Vt#q5~24.1Ւ;$mnyw̘u(m1 z EAE^*nAm7mNB0 \t,9ϱuj0AA| \_Ake=h!TS W-5)|nIVsE&ۄ0tGN_"#MH1l!?p_ngϰݰ8Z-9iV6izyȗncT&q75jSU^p5/%n^L~3Um? 8_3`s4}V^'MUېvBP1;khY9~;v7Dk/2p̓sfA# ܵ唓/t2#>:"(W j>ĵFS"F(!ttbj)a6*CRW@S`Ղ㮹l(]Z"02 w1Bi!xevW>5oWnKtJIiiGLnVr>ja绮]RnRQüh7r-2oVB^W6W $EU}w-.֒HrhS&`6"[b]Cw{ ^Ȼ yaEoߙH[i'SEOZ/]yRQd rZG_ EÃg*u&|%_Kp3QI19&&'v]* /1rD:AtX^xh~rFei4O8rKI{~wU/r2;`#"orG]6#j7b1 'Z#Re%&Wʠt%!C0d3s4D6vh$T[Qi%C\`e}K#ucf#i4UXxN [`H'|4iz_.r؆z~%%CaUTdf2е~ׂ DlՠHWPZ$QwsEY.Q]x-K#ݬPCZ*I9Y\dJ8SS!Xd.p|Jj<0A;jD,c!UM㦢OPU~o msB{t4{Bg$0RZ %X`9Q \=e]yϊ*)/+mMu-F85\;4'$+:B [=l:#Hyg#~\A yҟO)u*@4 h0=Fw6L.Bn"=pՠ0˞;OVjz鸪?׃ZM[PnX9~F ^$u]wR0̜ {{Cn?}ò.Gw6 ^BP^w304nx3Ch}PcX0 Sd!e5ͽѴASw^'/ꕣo2Mwb9l3TOY0\>7Q&Su:/}ܯMح*>cP+蘚bd0PULyÏay!]PcrY^H#[>"pyM`Je4"#RǕyJW(8\Ý7U’ћI89//OGfFb;fA>4 !'4^Nb2ly&+ oK,cxI(n\Xȸ;ef#'Ѕ̈`D\:ݕux!Iw|.(z#<[} xsW{w}y=Mi_L,ڳ2-N#j|s/y Dd0N QN ħ<Ks 5ӆ4R K#r\kS,O-^6O"ʈxWjזĩx= ~? "TgZx@f9ڄjW/X筰F|^2N!f%֍P68 K'`f+l3"o/{ ġܹ2CC`Å{E^W)pw+v {N {{qk¡њۣxc_%BLFn!~ e2-譯fJN ʁR=IHm?>'ٙCo߶mTނڨ-:zYpN6_.'[jIpt N+}_԰_D%mhht< /VI6'czNROI ,aW/C-;AZCHXMBSڻY2{<55\?aVo_ 5D;򌭛=b~O)1_m\%6*Zĺ;Y t5];ɴ&qId*?zY32qvK=![H%Q8\LU4I4&%InWκg?~T<͢*RqѸfGnog^jʸSe^J:XOuH^|iTlW2$Mr]P(uA[,YUcRS%>4z#plm(~qaI lSxH(t8!џiEpeT퇷w>r: /q㤸#=^[ͱW8&C5첉fX@,|GcdD M)/;p?߈S?:?M|A/Ó 'Ǧ{s ;0J/P6Į"p LN> h`6ZFmGܰհޫ=%!p,A @h/4-LD,ue}›p'$yt Ko xX& =G7fܪm-NQnyx0ctt`R +M`:7T"DE4mr_[S/SOV^\MAlwzN(fCXOޥq r ;uiۂ8ۍwe q yUv[oZ@&"`ØdGX 4Aa3*!B2ېR@I59?d =wy\I=|SYX_e}]>d޹Xke5wTF=:oF9(g2Z @!@P*K*!\? nX"\i_?6EO!W;‰WFa#\|~뿍ډECq@?rub:c*3m/v-.@yx ?;떑ݴzb~‚"щa şhʑ ]!n5(p$72Ywu_In_h{ExTFr "|ltr|/$[SR[-. [bR@;>1<,WIYL#D4;AGD~\xd ޘHH6){}(8R61W4jxIҳA78L8A@臈H>.Sݢ_Wf}^ߣBc'y nH/^êr1Szb}_([#"W1T~ ^ɯ@G9 f{Z`j?(_c^DW(,^[W /D {c=6< 40#oVm"'Y-PN$Rp>wBvmХԶj4Ith eHRY_" \B$c+^}Sn-[eaniHn%7IIŗ/_\>ᄏmUm7]KMuk̤  !:!tcgD<<Ħa(㮶tN<_n^ϡvi6Ũ9d@.mn&K1;hl@Hf]LB]+c^Bg&_4Tmi\Hj QgKzR, M+EՄAl]5;9K\"+Hz7#=!S) @g"%w7Y:ɱSpߨ)\䴕}C)8M- my4NLy ZS)n9ޗTU hF[v+Q!:dlZ:;ƞg޵K ]H-xE>݌ Y?=G8:w[:-l 啚َʡXݖVY,k6UpE龕RJf!pfXEtʨF6+wFnX.lPGéujf@B8dXЇFcbF G@9":%%ɗsd@9'jy<呯AfR+ϧ7M{O*Cp?S/ |wvP5%Vtz[K{ĽMe-bt#HEm,me0 ]9x~q;zaۣ8Pz/%DYRȚv[,'RV 2e /}Pˡ/䎉=6 !Pi>خ:KH,;Y+!]bՑ¨"uG9Q\e Z"!*6r!y+b`\m[l.QE1k==FZ z+lBl&o>8Er*PMAyK͵͋1紨tA[/9l> rݠj/)*\/pI5a~!n?0dL4p94XC\=ȪH1"q=i̺}|KHQAH9|UFq|@SPwʝ_LʫiYdZ8>4Te%Mu CpRȰ|/Ls )+Xfh̋lv'"ڛu{}Ko03r:OHn@4t!ܝQƻ],˷І%_UJ NCx5:ZRjYTjS/JE'SW4G업.}oC2uu!wS܌]ywC?uNNJEhkiǧس}iv^r.=SS=3:~ qӱjhz쯯6J+j{vYoN)糧jHyiN \vo 5Թ%qgf?>֞? @)OJEѓ[אk~Û_]ռ T:ut;뙳fԵ[BPjţm߶B#i9[N T*apW`RuψƖÿ(X#P33fL⮶~I/uшֶ>cǤ^.= [!\;TE>%AbWPc*Z v 08C+uF;ҩh˄iۣO{ZO'=G@ilxk!NH уؤ⽅[!'vUVU(dsu"Ր, 4"B ,]0¯ h|y8)H@ O.Lf" :"6`с8 }S.D:!0/؂8` ϵv'_(|p ACWRPl "HA J_^ &3ـ WQ¨ @r JA-w8~ʋE#]08=}"[,.@Q]2E-I yKE/?AHjJXpQTHP!k<"4@,0+\@@[x0v:Kx)88}z8<lPpf ]9~dr"/P Dad<5WͪyLUf:7?<7I/d"MUBB{eUN10x\#Q{"M&%v&3l̮*,rҿvv_gӣ?3B`GR+&wU\}uaA0VqlS @BDc@#V!=K]3wvukbnuocouw!Ui?)??a=4@=(I ~! L 3,TUskoz]Kћn:}א֮;m[zֶz١nvzzbMXA !x'$7 o "`4]ZMuklТ+_(B $"|( A>AC| s>dRŽ0&uhY!H+0`QѼʨmb8hM֓:WD+ Ԝ-3v񺔘{]243 J3PĸQmuQk} 3%̒=KI+_5E}}R!O2`VI?&n!ώsQYT{ gr_Tr?IO9E+{̅=W̞ *NݒwZ5g<^өlGFq>xp.)Fίw;4 L.[.?b77QVp*7֯נDYq4jLjD Z&&S.D(hPF6 `]N؟S*aDlɼݸ*CՊ7|ڲ77{\KģZsR4vĆ$wn1sJS.,i7Omit;6%Jy^I Q'/1궫=Ʌl6J tkyf;POlE$x\[şT^wX% T:@&'G]ãV-4Ÿ򺴄qRĘ%L,jv(ZOrm[j並Fȏu( T#Cg;@'5;(DhLx:̨TI5xmqjLj$ҔbwȝoT{aLSw h'VH?u<s%g wn!ᖃ/vHԩě:~4%)P]v|=4/YY^*zк-Ԟ^9z栃!R {OEW#tܭDڻH4*'+PnOkwqKm7X-{bv]ilnhEWYHbS9Gp;g;GF*eҊ0\~*o"g\qjW֧m?ysm 2e0fc⮸):]r_B&Usʗ(Lu,Z\5E1 kDzx2|癿EaXUTcLYe44+kMXKr-'Ɏj^!sxنu܊2*s33<ˋ;3qF̶KgrJO'*n_UHYB5ISK%$'s,ٺh+C񋾼eiWU*y }t%k˥--tLc 8.Jԛăx,i=.Iuj.P!yA:蔓ᇂm*Li6 _cݲ Ko=򗼤Q?Vtf|-^7!Eʶ {TC["S{YM8Hd-E+*=f7 5WEuS2;k"ZKc!Ƣg4(Q#X!ElEl+ LV*&[?Ј=^B4۪̎*x{=}j3MӅ{5Z)+|^T3R L,;RJl(}3P X7soBԤWpISԽTaQmc#Y*9̵?rMsky%Y? 8-YÔaNݐD>ekH ~f܆%Icb9YlB7m疤)/c)N 0\qDpBmju"`N%SM2OJJ^/bݒcJm0ϕ 0681/ Ru|@8hsPB=T9y*U}iͥbXOA,]7]CEV̨& /|~n-D;~b[0 n?Tɬ(swh?FFPT5#@JbSF. +-4)fݶpZ4q er#qfEATmh=B:GL|*bбui}y*dH+pDE˂w2q2l?uG$t[T-JZ"`K zQ駟o\z* Ӓ`X+%Yl7~܉R׈D8W[?Ri;F&˺VIB&9 #̂&Ƽv(d.+gZpkB{VQ<6{jG+Jyo 08WhH1IW:ZNq5}b&;W›QC aՔkgL *f{Ԕj#Ch+fV,=T3N< /U@Xqڗ * ׂ #FFlM*Hn ͮ9mȧf7Y|^!Ơ df :A3n(}&/q[ɠ$ 毇2J8*YM.5uxh6MSW Ί>&V~|tm{"uoh{?ۧ??Y!`3@4@#oV!'a)2&\VAInuս=So|S|\X@fF ![?s%` POրXj$][mYݔWjr16n56mmk{8Yֆ<6G9eh7p@("ysޛkr6V+fjgՇ}QYi2`C !(~"@ ؇?MT=tuҳ:2hyAxKfc$C%[gcr\\qYY+Zyٜ[yJ~89[E.͞VGt L1ڙHMv(I(tA*gDc ^{vFkֲUvl3ʐ|gvӷѱl돇+Jh*6z+z]nyrv۝tB9 , ֣\m8gֆf, uRdp;b/K2b̴NGݦFH׿铤U8ݔvm(老9[ێ[ΗkY5[ȳT^J|I"}ɀ6Į'MQPAX H[ Ѭ=A>iA})g'MRS9N]Cp:^] 䳩'zm0R}rsIJc,c/&yXū6ԚMω"T Ĭ~z--z0|XD#KS!OQ!5C1֊uFsf*e ok”~MA~EyZF3k%~ HGyPok"KHvo*5YgQ$kx,f;V ApIӀ\ޮ4ՙȕ'Oj1*|xԪ)%6)ӣ3hOI6Q3ilD E0usPWS3YyMSaz6NvBy=vn& W%A{7Z9"pXsj#κP{n߉EZ視FGsg4C1Bg A*A*UZ.\WۛON~lV׸^ݫ4t.+ΟסYldۧVt\M1=5Z,z݋N?9!վ'ũ^TΪwMN~kh* 鲫\ &ꂲ4,?;.٧la ίך}#?bY0i{!G+KĕJړy٬V HA( j-u"eSaRl풮^y(mlWsgMe_Xw|>RNƒ^ӊ%8Ly>nJQ06c.yGG|wYAo>(,&&E326g/ dz#ۓOOw16[hEo>]~+ 7}9+Ld\qLv" Ui4zio_Uf-p; syd`N|~W ^a\($oQ¥sCZX gNIy16J^.ahEѓ]?dnnVHKwrbFm󨡺mP1B 6GBPhP p!hfXH!UlkZloꋪyA䦥7~+$%2n0Wj$gGpkDݣIzp㰬RZ$} n&C>9{5(5'Mboo}^OND}U?w_bQ  H\M)=dK{}UӲ&X袥6o!^s-4nk0$%4puщLAn 3e\iXgBaNFJ6]BW$#4ٔcX~کd/'NqvGZFmƵYb# 4Q1));Էu Ly N&,5,8cpiY!(>ٺtM ca&:vN1n6C^nMRjednj 5 &҂-VtW>O)ٶe})2ְިU-[.^kʿl= ,,w؝MNA,0sSrM 7F0,Qn ~wijZ)|> H"#>|P] ӵRÔcUxC(U{b>pwƦHX| ͩ"꿢t "I#m~$G'D87yEv ]:(xI4}a !b{ ˳"Ri'E"P> zO< i1c÷jXk.iHnE]#T. # ù`k+b"LYZ^e޲:O=j;I1-l̈́wM@q.-^._ ;xXM`'/FoZ pFW}w{PϓVAEFԅ!6`^RL2\V/VØMVw;{fpkTڥS^P;Hް(r0WhWݘ$_?AStV7_-Bc,{Xeg$lu=ptYdi-1-(6>w!<[ uUxnhAȠ%ٽjE/8~MVT.Ʃ|cV >|߃Lj,,T:){Sж &("ylM\@z#tǕEʁLb^{Fwf;h_-9vWNuSbP' ؤMÏD?kD@R%/;G3@3oeLriv9Hu]U"H4mZۚ? @~ I Ih' ր I!e'ze۲-^wWekVrޖ5{㤯fm UxTVqSZFG / #W4pw{vҿl0v-[XXdB2\ $EA!xF<&<~eݩTYjgQ͘Aݚܲh Mns^]\Ҧ)./FA^-O-eĤTY+*ϔxEC+S5FkdnܸhKjIe$Wy62?SE֮]+kZJ*6_Uɜ́۫s~񆲻qb:UCfZϥE**mʖV+Ѫ"hݕv l9( d %>l_9hq*^wCDS<3@@=KKWu"ҝJK2Η@~]Vw,m);ο.ڵMzT7;:Q|9M 3Nxcs6&{ <|7 omujCJsjiRL6iE_ZȏmqWU*KeHJvD1ϜǽǓ-thIW6 L4Ԝ͗E%[,2rW:t7jS[[WԀ 1T^ɓ]^UK}* j8D3ET Dcf{AiõeZu p @zWzw6QEf[Ҋ綉([qF`83unqR_Չ+nm4shX›jLYͨQ3Cy` '``ѡ0\i$U?^Ɉ8MD|,:Z(]GwJ i]=g1{zG0ȕsg3+~7g%akДEIޞ5+؇VASs"}/1D, h}Bxl-ɐ6K{wo-owg=^ﮖ M"ҩ*h.8W&F= 0Ug!w⳸Z|jŐ-˹x-%%0-'V؛Q.>^g(-BW0(v(~g1JͰ/H"FQY7X1Sz+M ƙ ѫ ;g*(IQ죓̮&R(n9X0Z壕&G`Fi agO23u@g1x&۵wQ-**3,3[mu>M*橻b8;q%2h9-+,p,[0iQ^G2^z ؖZ3:cbd8АfKA"ȾԶYai7y3a,(w{`ݞ{H*ИƬnet: 9ƍhz _JXc mw}DuQjZ?vsLq{l_wL1?*|$L& 'دBXm,E dޮlh1Fӈal+H(QjٖJmTrC}xK+^P?>%њWDlHNތ1Ɛv%87T2y"Z)O=l=Z]ࡧ˜"K" v :53@9qf3Ε~6;3oqI17 mF0bR_%5=IOb\^SŋwJ+hU#_+ё Oӯ^~BD^ nˁ 4#FgK,,l%># {/pIq~lWSp3FbꟛmuO%ngTq5) w8p}jGZ;9Rڢ_;̥_EswipϚn$^i:iJBw~DF?{K:zBW[bo=nEWFO>e Oӛ(2%_е0V'^B{BJKn;?W3^i wqu4]F JD*v}#Lq^1G{;G5)cJ=㯥ߍ㷙{څQK9'\|I"({hP_~/PS;3t1\ c [r]O/߲1[vу|Еغ}- }Iwt1![OݥY d~Pެ=dSa42b|036EPw|aݗA=G$fDDC6d1ݷVEAڨ1ؐh.e+IDC2l+1h$3<_Ϥ=@·._`ZCT1Pbp X:|t 55u|=zzx:49+iQM0#@DV(RmI܍Hcw=HmJ잊szq :{~{|Ay~g{h gE]nネIN_v~g-h?˭(c9֢_8sL9O@u ?z(|є,rgW]LD0OP`F O3sNFY#ɘ))BVIjPҟxNoMڝ2AVOIQ]uSU)LV0`@ЀP`)3b͎54jsRaύStr- gp!PA|U̻)o[(s 1r i,Ft6Kt-H6`7,jD? 37B}xjyDJ&BMPCXu^Dn5ח^z+}#2&7-1[ctQeG&|(llr=KQaNq޾85KCݣdD-g݅@@̃"V&34,Wzx睄BX;9CVWܖN?k'FB#Hԥ_EQ٥M$*=ύZ¯ w]D!Ãf]6mHRY;"YϤi-ZLN+͒gBH_FJy303oV i/!r[Nm#aE 󑿕muk[$||рS_\`XFd %KdK, `&-djm;E7_aPl{Ge#le GVHY(|rA}{:^6]mgk{uak,5b xx '_0+@>yϗ%weylnZ^u,wGiGA36ffI2׳h9YX Eü$\ 1O3;d[coUQΜS&SLe[S% d9#ѓ댳5!)9r]1h;[YE2>H͓}dJef4Af fJlr]IZd>P@r5q21Y[ѨR2I^Jl5E^,-1lWuq'Ȓ(aӇz)mDtq^J3qR=J QJ< ^/#i2Tҹ(IsS/-e_]m,@dJrЫ2]QvhOfGY;LԶy㬳ZXgz)&Ve, h#"M|WDkR9Xm=ɝGVjASE~!t?na|ʻ%gqEut7Mm͘Ɓl #&dqsƐv63AľKxϥU05{Ƨ_sōfPuE/uB1+^lvbXf~A9" ۞p_ѢK,~Q5-xw_iEo*ylgb7+F n,\D,|^3f.;wI\\ ȌG\\b0VC{y'mʑ٣¡tV8>F4]ԬY[jϮևd.bϥ\pkCk,,.CY>x"./lw u?x/ozw? /!Er,$k6Ei/TpnA>i8fYy?-/7q?nϭۺ?}㟆!|>]XͯvdE`c'}q/@m+fA-jnzw+t f#fhmjUb/hhu&xgw U{אXSKyTmG*QDmy%`R}I7QS)IiAj {v7∸j1bǒ7uӣS1Q31w%if빭^΢ch04}M6 f4Kd}GTčb\~ә!$ 7[) ]wJr;J7}}W .GOyɼk^]jXxUnP5mёT|y 96%yP4=t4'_qO)TG*];km+ 7u1T$Q7㇌RfUZ=>q4Y7 1B΀h ]6W=('8m{^nDkU ̵3;)1/MIo_xJ|^ӒEXOV;}#WYHAw# ! Bo{ѹνs({'Һ6'Yq=cNlcjšN ddO8:e)Pܙ%~Iv3f{Y(~Bshp.KU'?dg41!_:YbD8d[R|J*uLy#mUVA=~Bq7RJ)'#ʼTs12(a3Fm-:+)')4 @#KzYIg&)tGq&eH%K0=>Z|D*>"'Jb'L~wJXR-}w-H JA1;H#PV׮Wzb9#WWQ;7S`#]̧_PDL.\kܼW_.|@ `.(ȄèǧY|X(1`Tmײݙuiq+ <'ߥTb#eCʾmCI_Ȋ[{ u9V'X6#K!='|R(L{pN kPQ ŏ0%mUL7uU of;?z-C΋Cꙟ+ԣ7p";8`~cъ%źAFE}`]yNb>) ŒX.8gqܾ 2Qalʎ. EC9 ˜/1(Eh36gA00`s h@q4 otZPoƺz@ P9Pe<n 󢮍"-Z}CQ:q^ylqmw X|E횜 iᄯ4{/ C؝ڌl!2Au2d0} Dx0K k~.|ʐ(@ EB6^S s*JXfUB HR. RRb @ ˜5+ZJjI|@).rhoh)zu -0-7c lh6T^@a|9T*>rnq;R)B n wbp HFXCm*:I !(7L08VEӇ]#b',vZuCQ?l@[ >S=(tEFP {VC%\ wOf6~(.q*谕o,x:5oծ)T~kFAٜJ?YP@qm_A}`vxTfdS?芷ӧ#oFט8oxK._1 PLtlL?,ڸè`|p~tه\9W7m)sk'W$NyC.̮_>`تg1ީۺ [|WlYmS(aoOa`;z"K3se>jB hd,3>J{3@#Um"'\6J Hݵ.(C춻~|*SO @'Kd%xdr7Y[eٲ{ٺ*imtS޶t3mxr*p6l5Kx-  |/ffj޵Mַe;ۀ[Sut[$JRFB4@c} 06`:F}h ryէ@ӆS\W}YEiN<ZZnζy9TeOf O]8VQZƪ Iɩ,blU\f;hx,(a.lX ~iZWE3 Lfra3Ɣ$[b`d1m)XD -0n۳ϐ‘೬R3i>4'2Sj3 Ç㝵b*bɪ+o۳#a*4jJ[P1~A0$wT4K#gPN6u(%0KV$Ue5ff8 Q}mw6qץ pϙְsG_'%(iי5ZW+:tȚo5~՝BT&st t6DMhZ"m%6KrlEӉD? d~Ӻͪ[L}Tǀ`P;H (JRs*X_OlIc`I8.a4D=.Y5G1nmA5" ;))K*%dŚ3VhXR]iFQ~P\1TfMb$')dW3#& ^f 캞 C_\ HSx .$F)vnmOb-e}V' ^eƪ j )vOds)(zެ(H_5RCe[›vYx;|iy1.fcbJ\?vaUi7M} PvCt{ur>./GKm$iej' ^7J bqv{O9 ,||;^Z:mà ԯRBGg۽\l#^Ud?ojUMUHGB\p;m`a݆֒[jPz Am-4BļaeNET83i6<ԷjKU X:RXgNDf9_zT;B/)YwfysGtˀ-|ۍ5+7^M937QU?Ö[{0|t7O8Fҝo\Fj\W㎒=%E-uѧ|F QG2CYBeO(HI'E!i`];r k"~: 2d#kt_Uk ȗQCb^T|?9_m;S( ڌ?BFuu FԍJ]WlaH>=m@?ZUm$Qmaי#O 3ktFe\H9TLH{yX":L:* $dzɢ:Ps =>֝*FU}}v, F/ 8uȃ"&tSĘc5w4ЈA R(N{Z[w} ǿN! 餹&%0bUr@ è{,{O9"*r[3yjԧ\q&Mu,"{Yfy{+u&~ V@R&2o"DEhd:B :#.^>7ow/"q#9k SϢNw3jwX!ZgCbOt ?3U m ȉ{EdE2UB?|mb{ѣ`o(:TzJ$ԦG%d'}t9 -͓夸Fٶ*K"fBt?cwplPv¸.-?َٔZ/Ychl\Փro } G4wbN.r S45aŞ dr5r1cѦt:'UHK@s=!G ryIJ 66geNΫ7g5fTu[3JPS3R9; l?h<3y5 \ѓԔj4)f =ޅbwR[s4 dfgKI8D#o)M+ W9([5'OZ9@YJ0t·z1^3ͻ^ɠ2JiQ#wL_!f@DǷj ^hI͒ˊ{{bSlaz%dr5_Ĉim;Հz^LGgzAOÿR%-V, lՔ y渒rwq?Q5}lv8%_j>c)`eRSv@,B)kx$(8gN P!Q?s^c p5H`0{M \&H 7L4W|E81&N&"62({uGԼ`b˟rN?+~6B/qamWFI}mg}@E}Po:YE&'.ۉ=aks_{mB)D,' xoع8A'<C78no>GkLm7qވf- C7<Ny&S|8atoe"$ϯT. hi8{odpk| n~# 8mN=12.ϗz,lxpKhMN;5^wRG#X|u߷JApUnͤՄ|"qP _9cV45Hb2]|8/2oUKX/X÷_*DiT]ҕNr71v|dj^,7Bhߪw'` W?PX64Hux~{ Ly}=RتW=pAw38("v|[A tG0?/-x"G^Mib'Z!nȭ>,~gJ9a=XmXO´|u.i [7MłA}O_UN WCQ@:{GbΰNIE[G$RYsQ8% qH  hS$!\~EacI1ѥGc#H(.S1dFo'hrDB_3@3U i/1F&ʖG.*vڶnm ?^ڌ $8; t'$:I=C 2'QjwNњ[oKoQ'^֚tGmPMtKC*!TtBz(#bUPs~;smZUj۴o tYK-R "|a  İ@DQDꌊL1 Z+O٣aVsnlM,(&rVꋄZe%W@OIA2ш#6DĪc$4M}ؤư6cף.l/`!譵)7MQKRzC&5$ l۔<؇^y96]"&oFy7 $k< fO~8v3)آCDe֭Vَ%ݻlK3){g *Q{\:ש1d}vM/jtF:biF^1*i#ӧ9bgY[wG4W2A]z+KIU _w)f{sWtS[XF%`Wq- 7$ZZ]f}cZ,eƁZhTVħ/N:崱 oWSU,uS)~${L 6E#MlY}#OT9$R*owѢKW%0b'~]ɘ{}NjkZ=K .A6xۋ=XMSl,GعR`3l_MmR{Y59'!wG+mT(r~719kX] ]ЮpI=ҪKc LAK;.i `V;|r^< 3ʹjmKŔ7Gj\"m6=.';xb]Ѿt$Ҧ^l:CL^!,ӲMX3x7iq(`=7v~4UR^H\v#V4qѼHAQ6\e}nXY҇oj-m$@W;YD6"66<" ~oo2fCR.[xvq(}{3 P3` ׍WkFD{}%\1!o*9dŝ|w^$ex?*ȈSRyh["}.HC{+l[6 ~ݺGJAy8Fm4/Wmma.a"슉dݣkuVU"(o%w|?g{<fgq{L9&+\{Mg~uOvԿvO#s |O*ryI'_[[dPu0.|ndaZ㯊L 4 nEM~Mч6M`%%%~kNŚ)o=Pi[걀/qׯOX}f)ɰYyc]5\.c/1%I'-$aG,B^Hqn굶n S#()XNõjfzeU(Jv.ɓOşINN۶wm]'4۶ l-@iSr0b5#3NSєZEVu֎0ӱ~5N-.<"*%gW;vgOz'ĺ!011%" |Yji2t _cyyA(CҪ/>vUwTM;3tԮǏZQqRK7e$B&"thE/K#(iۓY(.,QeiC'i] 5Gj,e+DRI$+>ȹ!,li^ɓ,9M9JHEF7!hM( ^7ԶZ'XX]@Uռz4m}R+EJ!2_5hI}RS};Ԩ3_.u52_ϜQg"XyJ !﬽PjnU}ގ=5[1m&j.A]<%*>i3?|nyGrv3m-ѴK9i{]1c%[ ^JR ]%(ņ~$s\X0דB%$@_n Q=1hXt=_f"$J x !Dg !~s){%=b]pU(:-TҸb;9a|*zp7~HR(a ,)C`ں y33E[\lvYL'V%nvH.Fj}}1>`HŃ:B4 <ӻ1pwct2.! {>1;26(DEM0I%k]5:G&sZs)ؑ 6=Ɣ9ؼ!'Kݬwջf^3(Lk-DYYC~N9,[`fnnc{XAxt+먵O~<>C;B\,lRFcq }A>N6-5A.%c$ƣcD"$? JI4~tW@pC68hA 1G΋8#XYQ> M.`ƒWЃhJ{##$s(e|ymz?/,.nm\%*/t2̓c3,[Wԇ7s6##h:G𿅖Op[YaAbVo.[SYlQBa:ΪWY}[lazqVy#,\܎4 @b coG`A7}Ig8;=[@`Wv#f1os{zbB[di+qIƌz{:vye?@=FlaKYZ\?Qkl%`q E&+Gó/Z?kKɿܶb Kc ,-X#4,pPЏ-]{-|ȱޞ|\`?8_Y`G>b&sVHu\p(|0 쑍 "ٟ48r>A ?Ej/p6K X^=}\QGF6aH`?#Ż>~};旨/}I'!n?b9z֢GXt=@C4@#Um"'\!3Ih27mH<~d{{N^S4IO]M$I4.M|g DI@aR6KKJPG6Nz`eL#2-CLJ`UQK:Xܙ%I4$L3}}ݷvmu;6qɱu׭aknhIPBlY !)( }g@J_$<'ATk?.D1xaUl u ? 7%~:=p;aF6sW{YUm}Ckf30\G-=k<5R/ =0!!>$rٚ]HU'wi3PDU/j &)GQL,L1?q';%yWQCt[46c4fCi$m,d)nRqCF=-x`Ä1A^1Bt?ʬCZi? KnsWދjdIx'} j4T.A.+\8n-l/-Nǧ6zpvy *ĠPJ!.ӕ;%!Vi:(;M0MhY FWOM})ڳ;vWGw\nER񝥰E_S]<1)9}HYxvGr! ^N]׍)s*z:w!uV~VFS?E/AE`{4  UEU؅fn,9: Ja0UtWk&Gkr`Ru|[Q$WcbthQч5"v#:oR"Q'Qtdtig: f-R1AA9/` 뭝Oo*)Yh׽nk*]d*^a1%fru /+fJh_zV|+vRkHIT\K@ ecvĄ}}IjNɃ꣒@,ĠaW8Nzxal箾̾(ݫyHo2o{M J[7kRBn[,Ľ&.Rz3GQŞ𔋡9w'h=?o\䶯6]FP){٫PvpN0qwFh|^1G"l6f%EL[{tSN onjI2^aB?A<1 ͅlMWon3a"BKr\ M|,6 Tꗱ;GdK '&i?C©=lpsL)?ԯJ"rPvt2}7Y\qQXvW0]RR#f'##2(i[2L]psJ&i iPuAo{kާ'nkQm'wb.^L7YŘ}cP 0{y yǩH~_Ic@]&fK3u7DhX3f\1;6vGn)u˨n~La=ag)5NH4=K|磳Rk'/' - {7QږY^ bA,SzKвͺIhՇMbrQʞQgC-YMJytȷCHY_>Ұ͉P=0#s/~z [ 7>LĮ>D<#-~aoc/KY" p>37ZnAåjM恭u)*ES[ni#ٷ9T7 'XauWN65ӫ/W{}PPc4uevU?MF)jԿXÔ(*~ %75٧S/Ԅr.8}S[ѐLb^M=:#ǀ &cP|uCc]1ں]*5T13ʙ)H&?kZ؊?|>Q"S9TS_M;RDΗ“ow;.(>8vgVūiT&V:wp({ɲz뷪VNh'qN:8\tgffdpe>!К^[D]~o5w5,W8*oE[Dd14Z}.tEeʢ;ߌG?NI9'G=b _r" tF.hveHS6rQbF|Wi h_phl"Ԋg o3^dZ" b2HBl@1F;b{ܝKN:` !PU73/J{9H(4؛/1S#buas_lP@4Mޏ-~}9"ݝS[C̝Bϳ32΍J(5Rq~ϝ nޅ=;|/(G GACPT*;0{f#+ʐ9{y'8?S-)*DiyD<_+w{?Oe⣟tQD?esOZG}Q~r"@/ xq8|r2_Y|SCu^̣`~{ eayuA|]>鳂>q, 1+9#?$CW TʛP"Is/; .HJM/\R#*w]ip,{kxDҨl'H=;G:%ިW +.G H&pC#TŭJQލa 4{qkvK Zxec>7,o^7'-WǂY i2*[x ǯ=8ww;m>c]4YõL<1)j.I-@G-DF\ᒐ"zIs6=7<9۩ioH% ?Ú\!](xSFlçQd5V]K]fkNRg]y_{Lw#/^`IHy "ұݢ0h֮d~e 8XmRH':e+w~Izlԧ.HKX\\׳fqQFB0"!D[et" r޴=8CMƼD4~5$ӫxe:ڝ}\E|*.r< At#?J-]h-zcb&FVSD|pYҲiw9f̿vrM.xZҀ!Lݕj8`}/y!tC4@#Um"']!3lL0h$!pguAԽ.WoߥoʥI~`df #8cQ+N>@-imMԽo i(Qjwr9Xjr匰kʩh)_K"o&q& 56dfHЊn~mvdv˙$2e$ɤrD(q^C8 P s"'~Y)o adTjTK+VIM++,Xo x+:JFe:tX㭮qdss (C|۵5F#.0Y^l5js+we! n߷DqZ/ux)wiڍ! 6R6Mh#&cPf^ny׹zAw㺜acc /E!j{}!? v|uLhKTxE+qsVVw0Eft@V..X%vb\xOK^fnř͑mmgoUzֳ\]c~(ͪ8\^i6w}7j)eQw6Hj(1 'RyP0J2[kkZpТdAԬB{xO4D8o;D޳8=`vΓ؍csd ,؆P'**T;K=ND4UcbIU[ږy!>GoOU;{DIGf`bii+H:!/5AXv <=W/eֶ:9rJ|huIw(Bd;Nx4Bи:(<6*x6rRS^|&qLY]K$!#2vG6>ע򤂻N$'ZWAuqeRe#{xgAؐ%0GCl[‡r{-SGƥ[܄kp?_d_ *)2YW 9dzɎu_teڨ]11korL\(t9Zbljd+-z* tc0'aɷ Y'L}o"\gJ&c,'qU'5i.oRPI99hӤ(%NE;dT~t$B)qZ-J+ mrdH1$?Ql;e6,wxjmy^5eacܢSa-UD^p3ܩSt)2?;M+* ؤfC3lW ~Xk~e2%/ -7}s G iH瑸 7SVs (hLoG'R-8 f5ܧ$G9ϙp:50NB =g? | &j rO}T.4zSDX?{%ʚC`G|Z,< %ٔ8j~#K}Y#yXnPjn9Xc- U'enX)Adk~!ӤZn|x?+C C{qT턐")c>PNj?f'6!W&B Xڥ8 KW8~J*tm=*{Y_BH ],-ouVm5;e,nz r܈J!=V[ěc\6'DEm{ڎpNscIs*?,9Ò?}Y '#x>UIeՇ_Vg/{31+:]ěpmoCRL]F!{MQŏR$wG0H=Lߡ &m6`҄d,m([_"<$P(բfdTa2qB=2 c7CMwG@֭x ~v2{w.p2qu{1 iCÏC؟} Pxwi@87^DG !>>L~r uH1;KiTs7F4:'H8-Τi_f3R}k' u>]'mv.x28<}<|#0a|تҐ'Lmc!q̼K_{wo#N3'"l6uh|To=,۽%6r3^&Ժ7#H1`=ftz)ѥUR篷rHkݭ^i4;aPU|Kl/54ǼKp**Dz'kE':lVrIf_(y_P/(yswaT6\~=eS.r`}:ADG&JԄMn&u1H,/ADD֘He}̧\6Pq- I?2 (S=zSQ\$_ 9~bΔOjnߍ"0\k"p~"׭dx{; u{1 J5y^,c]:S*v\;`U\z53y1GoKKAW:pH!?l@jF0?4اg`f\ jFuU&ӍzEJՔ7>sVsmu&/hĿJeq0=;ʹ< _yڻȕ@hRm}Y&B ;L3$ |O)R/j1&g߬?8ANJg;L9[Js1/3' C@$U !iOѦuWimqqLUķ;]w]w{wv)r?z"X4p`'e̴J[D > j(۽9rH`wMMezlMlzM=Э?T|2,o1!({m[Is+mdm͌c,LI3Q AxPxĈ3A^L*?[Z,Fc~dʆsVt&6IT $iW13CAI<%M8C'&2r| h̹k;/G̜k>) &g/"]1CҶDÙ:cfiiPt(Mokb 85*?Fdl;eXkm@j dI|8ARerVZVڤrEf~JE)uvhE`į K"U#Nd[X\PhH>Ug2/\oa_G["z+`Ҽ>q:a&n4iٞ k1=`tQZK01ˉsT\e!峺O\cfT;1&>4>&T9M7b!$<4.wX tmS\+P Lj,;g, JufTϪI~lkՎSFOɊ(au5ՔĦ?^wud\a3R"p"et@Bd\K]2Վ/6vihf.d%^t wm۝QuIنkP 6p fEAa2^a?6C~wuo mAl-%R{ȡ{߯I Gq%^s}TLL˿[^?TmpAPvpJ97}!3>r@1D^mm<Ӛ J𸞛HԖ0udp+^<߹ob) CƇш}wZ4]Ƈۡւ$ܸf GSJR7h;I kD^J*Sۂ&OvPyʦ4ո)rRK-(Fq؎J&Fa2p3QŪ+LKC5Ev#8q?K略2f6ΪaYӤykVD14o+4He6֊nx d\3^܌F*^ɚߖpͭrdspUE:͒7q]m= yh)ʌckK1* 7Vop!s`'>2sc㙁 F]5Q8mgHcYI 35q>f6BB*s yn7S|䎯ⓆZ+̷u2٭)33.E>`ÿ'':' P^ g zy=]8GLhH0Fc1ӂuY ٟj˅^Y |%f< p!֟ט%4JBz8W X?nɑa]z8WjUJ+ŽڡE' "=i9{Vyal+xlN9)%5 uwi՗nSp ,-a۶>^bt6|aJ}ٱc&:,.*fc1ֱvO+) P9sr>K;orHGn"ZJuܖݒ=2DOHq&_ TWDefKWànRKz-;>yr-¸Xύ <jc7 Inw'\&gJٴFlX%d9-糆 ,JGHY]FIve|IV' UmY9݌q{ ݥT mY$ Wb>H 9<ْ95`!T *[zY¡Dgkn'v%~8C_/J^ԇ^Jb#| N +acM:UPUl ŰMbFfV LnRLP,#uS,Yr4~8|z0F(HML:?S D9K.gllz=ǔE_RC/i0x M#?Q5"wuޫuYpa`* Sy ]3pj3G o}X_ң{l!GwEXaR RDخyeTYv;RnE=';{5R5;gGsv/15E}޸wT r6}uW󺆠P]`$rӏ*U=\ p!䳨%<٩`kIi8MvD,-?هH`*5oz/J&˛}Q g8W(432]#8U)GuA8=ş\k|yu{%ZCȯ;=n7ZcM]"zA bI#tX]PoAC}=8~u(huPåL@(sos!S4&Q {{\fJ8v_$`>3k#k-Yh@c1+3Mk̓;~PQMmc{|Ҕ}NHвAg ʰ7l:UZ")Nx e2d[/ EČ8ba HXTay0\>8z+cฃ>+ooKO{ 닋6 RNX\(WWf ZqͷRvnE˃~v.݅WxN*`'ū%"CJPR|7^/d7nCip& ~ML~WV.ePt VeCXbmԊMˊscb EO4~VZ)?x|WZN<"#,01DMEu iBşP+qX̳Y>S(f0&Ƶ8л =pfU2x>p4[iwm**YqQm**h5C oO]a[(J٧3">=TOV5s3UTE%VdE\JȊ()c 4 .xZڲj+BFVQ``d~9xIF 8*){]FPV#P# տMǃO&2 ^{Cz4Atˑ"Jh#mC Lx}-L-#{lDc4";~ YPEnugx}^4rH=! bAWƈZ05I@ TBTD>Fȴ 5&|# zM?dm hmۋ$@ʦ,gmG&7hɕwD=t8,ZY'6#p/{$UE{u0 z1 @d}&.  rHDr AV W(4ELK1RRuAJM1إ磞ȹL,?x`T=;ȷǝl&ElhE2[@G3;{lȞA烽~Y*tZbc\iA`鴌>8Gq~#l,_mxkM""C4@#oVm"'\@M $@̣iR~+<RuwM$]Z?035#`"Շ}.-8$皒CЂ}cd IPCms]Jmle!lUk@ܸ ԍX".D\G,?~iw֯ݺӮnKR1l[`[q>hOJ񄔏?Q$˺(&-u$!+ GHfK2|h1: ՒdQ(I6J9D4Q\L@b%KܩJ)Y}JrV/kR,!5Tܚ(f)oǒTǵdˬhTaR Gș_' Q7L &R|Toii YLb*EX ʅh5Oz?eZež2 c$yTyYشx<%Je "RGP.ϰ1$վy,5ӣi)pnt3,F@wV͑;Gԑ]@}.`mPfXjN<ŖULU&xRXE{+'ͺc[~ld#)^N PPJ'oTҜC|ḿ4%0ٳ>@K-~@IٛK}+OgIjrfYhNg󥉘=(ьF:r|< |w*e͡ IeQIҵA9FѢ4%Vt߈PD6N^hy❤~@P۾[ hgeR""=UsLqQ'tQy͌ 3<_nV4H2o8?gڪL!A? =N?8U4< \uN6ѫYRnoY/A`*Φ)$!9 X*=F`n_ u!br P9~(%$ uQrUqa}Y(s阿}/D_-h>ͰZP9J-\d?=Ept& 2 {S vjNV%AM?]b&EgQ_T[džals G,}wKMݖَ[67_j^6c 'Em#ي[;61G|t Ș~$rCϴCQ\qh~x ]Aw_zi>hn$S#}Y)1җ}5oUGۄ!c(G_0q姸*snz(6Íld}/SW8jn\G~NՓk/s7j;MWC6~$[ش8fFR"kJ攣 ‚ V0 kaUOQ5[&>%$xΧ>!12a&] `xcV&}a2Sé6i-=(ęwm؝_RSDXԭUk=(HnӗKz-~欓^',n`/r6<\ډr0&3=AaWCvcļ-At oR8Wo6S~E]+-CmFJJt qUwLL**&/1jB Ι ׾mО;_ c'-8iKW;)/j*rܧxQ-!#Ur`.g4IGC(IZbz,&6sÐd^Qw6ڤjC]Os,z zKx xى2ExZBUWd<]30!Row33x8L^-'7.e+8'LȨ:5o~# gkw0Fi&VU6q"NI0;G*9GJg!oAH%0FQpԾP'7v9B"Η+/kۄ6]q.Jtwu^&,VJ S2xSOD `[wN/J{4|*L-%ݭd/hMb`Ŕ7t[8vg[۹tZ5ӔJAKN8sMWgG݈et"u}o|7WǮxZՋ)_[&8@Xy?sK iz#$M2P<1kj'<:kg:=v?|>$gah%%)Qz&p?b@ƌ-b~BM$N]k-÷nn+ <`c|LF>XDؒ[l=aFʤCn 4-f&\qK<>DLv:U={Wn?Yn 9Ӌ]#'Xʌ#c3ԷIGMGP:[C+Z-ϡa3O}$/Z2V}aS0u7sjT}-ASMgUdzz//Tߚ>e'bܰ2<-w4jhʿ'ar]zPEe!RQ˝ni8Gg䫹Zpx/V,M|R1rVVY#e.2sNDiɏVwxW740k0:<& ,J/A$XRhdng&4yv{6H+f$7]IkC Pj*q+K'',^E,9S(9p1v!W qX7(nSPr4Cyd -J&F{BrO,+&,n`X PAe>~X:eؼUfe֐O^8>4J,imoq 9q {?~11 O0`.vi*(DZj=v .Nq𕸚j.߼|EЕ4-*O !N'3CHP¦i@|6c_kK<i#sz^P(pνRvsFg;ݕ_e } wic]vYIZF#$VLD:ڏ.Vg;~ĿG:ҊpzO)sv.-ĝ%1Ɗl_ e6K)VveKkzBFJTSzSl\ۮW+YgM!j@Dq>] U1OdWR3aUf׼GP.l+uIwMq\ٴ% 9^o-߹ rH$qfݒ>_y$tO7#J֧'3Q6ܳӯHxH֘Cs[:'goNC62Ǒ\;.Nytr,ϩ\H*š3S1/͞Z'}{:{(ը1 ^>枢b$pfu;?B'q|9wohe@/ = 'aJ6`q1(j1-XQYvDp8C;jAMQhN=Ѕ vaߺz^.ڽ3ErǛ4_Ƿp3G=?q8&0xi`O:g%= .&z?"KDQ*׸tʹU)g~Qm"0foͷ[QiT[~^ʞO//5IҪo*N"]lbzVDCPV7ʖͫV "_+]yZMI: b5L IΎAa,Y[E'sq1*L~K.]&3= HU&/x?AQVACtmw fJ?Jt(9o{,eshV{ڐ4;>2(zs?s+L6d *<о毊" EXM( pjp|&rMyA,y<q=y<œy:ʰ C /Oj@0+~0! P   SP L;݉_CBE%a?Eu#GLobB[}z ^G[:GnŧMDG\Ki#u `V.CSC404oV i/bT327^%ٖB󁌾Lc{%9RqM;' ]7wWMY`Sʐ>QVl.ԽjEId{ķ*RzP0.Nǁ-llx(hkې)W$TP6YqJ,RYU߇YeVR4g 0:ZN+(B^9VSIR?t>35HZuZb3(G@f'๎o5Va )ST50/.ve71H_O+93`롷bP?kEݟ%!55j{b}57Mo̚{wb_7F֋Fl uYCJH|ߌt7}jK~փ`☴cԚ2f5un3 ]͔C1ĠLkL+}x.r 0iէS f3*\Bt~;U36ȏl&&Fnf>Qi\GIeo1MJoT?ksRP|Y>{"0)_ozQ=ft>ѯSiJ*NzS*᷻ړRɌHXCrVѓ&a j{$D9 < %B9]F)9KkbJS:fqY /pfԆB4iM9:uwtb{v##jnWĄd2.ڸ]Z̏ʬt%fI|>iL`r7 >|d}%1eHSL]H'ev%۸Lhk}ʲ<wY}GMT}az.;^ˆØetgG?0`t6] m:g^nVnXc~ɺ^ndj(tg&OOVz;Ą:iRY0Kݐ-lU1cfIyHQEy$=pÚ;ޚ5 Th24> Ejㅪ|T0UxC#+[4 uҗgmKyORF/Py#|'΍ s}/14=hie[_X`A-ln7b||=n_>J/+!I7a'n*I<oJXvWgm%XyG4w@j>*>2)yϸM1ZӼtumҘQ[=aÎA&TM=.Y{' >A]ӖB)UTէNg7gQcͣ jIYIzxHĕa<; ْ*U]iW7V9w|nUoo]h5?g֩QMk_zYZ~ uSUGG.ңy#i9%TiM^h[K c=sRA%ğt_ZRPt%kV#?:AGRV&N kŨ5L %H:/Q;v)3u؎"p][̠u}#-ŊoH9~T6d[^㞣X5ҹZw9Ͻ8fE&aMe}~dtlTG2AE65<#agyJ_^g8vAy&5MQ rz:ߦJ !#Ë͇U3~Cm"E-.o)1I]?|2e)LðoT1|ɊE#t&Eb /<^Z@1|dO=;el磋oסC;{ ?C(;uhb mO4KC @3F*}1s"#r@@ ;`SsLjG 돱= D`l>h=; 1J#61 R>#X#Ua(sOj)vϽqD#e[kvyܤn';/>/kQ/qcn=tYW'^T]O;&mےϡp=zf gk=GM^(]rtqwMGŠiI>I[X<;S..pbҳ{݋}y涧w,`Н(ҋȓ{tw/n/b@桰Mޟ+84#@o|Ո{iYq{ E#3>tQ`oo\D}B"d"t%/ef./$%@yH?=nx&bl*NO/$S'lNiwt|_F6RMа{*9R~w/_ PHu~w%PWY ;sD5~*;' <ܠ:֖U-y+L,T?>~^}X~q,Qs+Q3P]%3ZoO}OsR%StK5Hhهpna)g;_6Oӳ>=llTG[vW2(_8-eȋ>1Bƥ_C78> /a ~_'~9no:~fdmD2!iyD5X[95"fRqqsE dijl?b)xtbzAM|Di[B^Q(/>W>l,z۞)qzphZhQ$zG,G3# @C4@3U!4FdƏՙkcNy]2ouWtw@ ^%ι\!D,rsBz1'Ԫ50[}֞qAjIe+FD< eqBCQgߚ|%$E3g@nKے䪶d2v[B6I1,R8GDA^9113@)|C3X(Իj}{Ar$4q`Vۃ2ke!@S:KR^ VkޏKa]l"-SZŅ(J|08T.܀\1 /*r /ܑ6[cq5~:P[@ajbzGS9ʻX6:%nW"u-ܫoc`AX;H Fᾤ( -` -۱g}%o 3d ysTB)n[8Zޏ^ 4eoW{Z0ovio~Oc[#ߘbF1_ RLb:b` _O R,&U=Ȍi{C>F~GE2 07ț*., Ɍ&Їx|4qW!m؏ڨ1{Zϖ1W^uU#qEⵄ8 &|KnÉ;^vAH0vnAS4R]OQCJA:9>; KY[=@|՟geL]Kwt T }\jU] pzbځ?t65~>F(KŮܗw_ǻbðE`)q܋wGG d#{[B\ekV0fh!,d jzZԅZ]ݸ p6Xk>FPFI\S2'IJea,%z) q?O9QIBugg&qs9MOX(G["\a+UM{ja}/)Od> ^YJ G(5̮v}KyUBTCMn/uV227Zƒ'X}q^=[+O81ڰ Ƕi]jsnvJˉzL_"fǙI ]œ!0wӥ]: C#J?{&w6m 꾵U~.G6iSjZ 1މjMtaW]YMFJczA kbNYcKNj-b7&v vtŖn7Ll%[UAeg3*/Ԭ_ӢUi`q3\Kb׾lsyP;_EStU}3.TCz4l=w9 LI=ŗ({JjcLgnSfoyg"f2 p@37ul:았Et{[gqzB4VuiQi{4c'pt1? 5tGwl,˳a*=rIuWa$GCY; -4 zmPQU9+P2D9-(0C uo;AkS/\)sK PM?3abEcO?3{0(V? s+~o  LΥ` &&dg\4s \#7z0-9+>^\j@1۷EqZ6% $8Fgɱa~4Mkz qIRCFgp뎲,7|N/D)U0)'<~KVN>CE1JL/O-SxØ3J  hVYmPpo(I0zx(/&s5J*JOPV F~R^s-m˥%z.>h~2lJឰVV\Aqvsũa?vbNtIRuۋ;hS?{^:CEѢ:gxk߮B]?[g-@YvJ$o0PV'\2)S6) k׳Aݝ8ΚΒ0lqv,}).Tuwٛe8>Tu @ ה#pdiMOp  dONG3G !Ug"w8~:pΑ}Ӳh(e5w/Z;˝|V%_ѻ%V.Sp;jJdlAZ(soDּrV8eg;!s-[ć'G, 1lF ʺf CED Ɍsh~Dޕb(a6o`~h= M2H_i 8KVpGL8>7jM_vh(_fyO0-ǭ.Q+dp7ЦF[XJ3>j64֠d6Do g4"EY _4d=^\''@;%@Y|9;`y+ZQH-B`zE&~gٴrh̖M|uj{L_Ny,isNԇ.!+>.U'G$c1 *.?sQmRU@d*u {(I?bdr؆ ]cJU(3Da%_}7*:pӊ: hW T^3/mِx{JgZ?گ<:?o0ǥ?BU.T6/+Kw+A`=z;\9ϿLg(]9=[gf Җ\TUXV$lg,uNw3UDhpG6782.P~odLb0bMYTxrJzreQANzjε3n3~p!tjzj}fTJ%7hJ{8il'P׍Ry$I縺(n sИ|$U6 qκyOis<G*֠@rSjCu$r:tU$Lz|XsF}*-d dbBޏW9`dNӼ#|N†ʉ{92۱ߊ~IV~@LY^܇-Ly ^NT*ʯzuDm;tb gd-<JC8D{A05uzu]U4<_ԢÚ%P l2 hv#y)gATⒿLAVl Ƌ(cIdc0,Ș}֧SeBX-p5UDߧ[j_1n2 7'$+߲:™7T9lz#HGdw SŌ)`w1.L C qΆ?x %1|[M&o@V8CA_ҿDۘ%}pQt0H}iβ+9IW@!Y}< mCP-hNwl %{yV2{Vd*ksIL._e~~lto0f@L&OTRëRͼԥ~SHO@X%Qv܊)ɌN8 rJѓЌٚW)<L94$meR\0&XMji'TϚ#܈F0T- mkdl]j86%2>t`For^ww~MRrluGenK1A@mf\>],%o 2 gQ->=ƈ9:a&6 ldNݷ7n،*~]Q42P򃻋89^K\&E3;JcY |yBb[}=10<{xǏR~*78 Ϩw2is;2@jZR#Q^v,p!J vV5Lf;eKz6?0[CL<{QxH`-o:?@[VFOIA)=ʿܗp!LRTZA( s1 b1|Of=8kzsf] o^p}\%u~U|o<w) a]la8sxpOG̪~a2%\ e3%䯖ѶE.a-4F%>>_cq,aQ0/V8掺YKwzfħ(Y7'[s:ǹ-/=6pF-oˎ4%#a%޿» 4YyVVESytK#aYgۼ_ư_g<ɲ!/6[?YwX[;RlOŦ9kRcd^o^GTj&,zE(L:%*Ӆ!,24 G[U&6:޻$u eUey,}=+xf_h-OW-Md[&9H-\ ^*C)/=BR`{aFqEAzX4Q'p*).nu9?e-L7>|ߖAW}~L{"gu`tCѐ>…=2Rԓŭ^|.iޤQ!j꒚P~qCOvN )\GXFmd׾Q |6bm+y)k݈ jm6:[$~B|;W5v@pZ_H{˂u>ޯE~3Vc䈄!}FThBDL JڜÇB.EBAd [ĵ(Ȣ5]!l"\BWǛUo/}^/ ?f) bp4wdb[&+.Vecl-*%QYmqum@HCV  _A@ UA\wjH]Z/C6o|7A #dQ)ȣZҀvrY,fm0%Gh q2_qs u} /EkUdK,+YepǭN>o ,9A(D(.*Eսd 'd71ܑ>$x$H6^|㙽s |fbs.5f"\sT~p@2ΩwI{v: qfS;bސ᲍f}ZX`Zm611z(צ"#HTq0~ګ&.l]zs`zdj.X߫ϗl#iB_| Rz)4 [g`l_-\cA0ok7p  iD8bk/t![E\txA1Rq)'^Nx:pa} 8I#4\FZ`b},}Ymn7X" qi 0<[(أ7Z EzNg}v4e9sÐĉb> o}Aȑh8m0 ɍV†xY~8i4Mݣ{So vn/f6l,A @g&Ӧ[4op~ùaf{8@EHʤP$K@JƲ4p5 R"!F%X#v_q;:^"LmF?2T:3&#az6=>xs{#~Ryk1C(KYPWY'?w\COLd8NVe6.vlzD 3F# %)5Z&;I5=Wejav/լڸƫnl6*^̲2qGjk?KB=~ !#h5}~lKIvۭkvuV"+%BI`!@ <cgKxEx!A?8ޓ ;4'T%>2fn(y٧:kZSQ$9;e/ely@3 riid(-e4L0&ĪQL5Fb^5Ww5Z&ާ6F\" ֌ȡI/u'bf>V咞\/Ovto[i* 5jMV̞QRlb]oN``e>;1B.$QypVYi}]GC~O/>tА2yB8/kwzLα?VJU1k^L*Xhީ( i8C;qh63;ѶJ^InB*ųHm {Y^40T۩sw긭I7v" bnqKZ!Fiq\Ghc)1k֑6}S ";bl lCB̍V˄|Wl 2p| <}>qR!C>O|w>{)3-dY)|ޏfKul*윾8fXshS;їn)7$Yi972"{;FyI{_h!c`Wԛ Y;'˕*]oݦmL`|9oͷ1/9tlZ6~35jXb]4*^nd2+h<D:֮aKĶ%^,)-%xqDRk Nn\abgAnҧ5jjgfM|ŵȻmm֫]r$%^ wjItr[֊n2ϸBKSLv%ů|}ij߾ăaDt$$Y;EClMgY]"Xq WcHhxge0{9v$fENEUASoyk&z֚@8ֱؚ~3&vӈ ܾg+Z13Ctϙق/_Bg shax 3T; eLoGOz9I%^{2w1t+f3Z_[JxD88unf{g;*9Ϭ!!NTE^Az)=ZHTafϒf| %5{ɤWlK[ȃ,^c+h/0Ze:C7nmik64]>m9M!B:󬵼YçL&kn*#bH k>QYB'Qo:ksf,"4ݷCc. ^u((U׃d4OXs~c-^5$.r7XͷOm_4uwL9NwLakFw$nEʕ!2Wk+dNN'&}fDlc]7 JSe-u:Mh1br:[`N)9} 􂦸*nX+CRΩ1KJ/8*] 2y*c &87A4ӭ=k֞-&wh'yDZm` S[.I+zLķA[r˃o㚧{^\Z_&t[APu^92B\9.kaE`KCk"Y=Px"26DЇ] 2 HF )*TSh4#E.*E]=YuxTO"y.ϞX,)onB=c&4'򄌔 &E:e%%bj4F:&Ӥ~4<'Ћf)O>y&22 MIIgk". vwmtL.0<3\0 `6/@ fTvXtVSU oOAhR cS??!zuPf"/ f^@J([ H1!thSxEK&I)$".̕q7T m8.a.}P_^}4D@]52E9-}@/쪵ɖۊ6  ߍ! @?J?+Ǣ 00L`*՟;:,)!sTN\L63Qx7T/D#-.̭͑T8̒;vN3B/#(Z&g٨| 3r4awl@U_eCj3iƽ810% =c*Ռǣ̲M++}LJ0(^Ckg>r&l' 31>5C51E:я,7x Ъw Sg(+fl-_eEz(1ja>'G,lyZ ]$s0ԕiRԳΧ#V4QeVd@sTY]J3a YN >j>؇i1-c,eՔd30#.~PCe8c6 >K9G$v5 go:6Mi9YDs6]5]viy}yM0JCׂ옄}49nPQ蒓3 ɋc!j鲙p=)C$*yWkGeR kmN, S&zlIDY+0'ZE~Ud,;u^݉!J5 j2Hk sjaU&q>~A UhxAY|ғB@W,4V& Оk+tTOIZ]=H5U-IʮH#,lYhg4QE&ur}̑y܈>Řk2Qsw% w^+ KZaFP !LI6hٵF; 3j (MoA]oUcs|n^٢gfTт3+xVQaNF &Ղd;9*hhaSPy"?d`֓Pü2KeG^WGז $O),b9?K1$.uZmvWZ;?nʡkPϩ;yOK6Gܐ ZT&7_wMO~%RF{L% s1]t4NʽeޙM jk M7Ȯh`gx!eq\GCk6<mwߢۑIn{dp' +,%D8N'Fd8=ʏ3|L9MunV2 Jvɱ+7%8--67TϩkgIDzeTN֪e<]1NOuT68O TrzMݷ8n#'*ɽ򷻌1bֽ&ܡLMㆴ8 j8yѐ(ty%_0%:3)1Lzµ̚#ͤ(34cJ02XZV6֚z+bmS\+EurmFY./){N\(֯V3oA)c1JwKES9iT݉`Q2LA?61t`LѹmbW-EPmkI(o)dk<#S\90;`ѢOvxo^㖋]|ei3NT5];F˭D& )FN&zt {qow1rNJW`|o/>_;z-!O`(GO!7TRoYW#)N3[> o5s ǫA/X.R1UW9{[Ʊ1-^ML=|̲0Q6',Q[{:Mڲyɀ(^O4v9snAJgU.,K~تvB?VWڜA̮[ݧ(վVpxPcl;3$-Ks+#5dۿPJI Yx5C^YwwǙxkrsćN^ω!*HB $oypeI,j-OH南P] WF=oWYOo}}ŵFZxTcXT[.qw5{i(a h QV"=_\,qo*}5z&-k_^CUfAIc 4jF_ %IKVAO`YikiPwMO3L'w_8<ٰ:' OEdRe-|ne# Qx$%I:5&͢dv 3# K 5_4V|,t$R(\c73^|љzēJ۠ܘ&\J~hV'}~\iS s{ ){`ۋL?7 WNr9 VrnlpR\D9U*.e~xerV;?6o7?݅XZB^̛@<yKݡSMT1Ғ/w*1jZcȆt 9>h>g56_ nC D,|GFw|MeH$QWC&>˺LA{.Uio󿔇9a6+_n%S86>ӂak>UF%٨4~L MƾrhbOb~ Jv77K dkZ̛0%>wR^aCi/!eu ;(5TtOgG NE&,f49+ƓMƵ&ߎݳ(I 6KczVeĒ}L]Y$ gcPpAg|c!M⑚ScUn4Oz>oB=6$?wnqa R{_& f?vЬkHeԬ\TuELۗ]Zʠ_²%IylĻ(Ï}8"6nvcm2 cyܢnwQܚ-|Tg_뎳s0뗌li(R<8MCj$[C{\c!mObC9卧Bh|vΗGrkz̈}ᜳ.=JΥ'z0X1痖yVwo9%sEԯSH3D@3U! Dvaˉm\Ocr9I SP{뵬N\fF G/ @3syɺ.+٬/ڌĭnių,,mG-p=_E{<3#pFPpw߻v]ٮZܴ [v$ҳd,jd@ABDD @>R@A_81 OER]1x0BdQOժNi }Y|šeL2hFQ+S+D6iiH+g]ALd&bH3lQ\R)p*v(9嶟}ksz֡ ѝmeY zXT~҃UY\R:UD"ߪ-*"+TRϒ7S߅K\47[ ŴQv!}@{PՔlN]MΞM[kP쏫҆if*t㶢!Y]~} j܈^2ujj_wׄ׷$>w2ԂT3'^ F߮Pg4Υ0ioMg熖dWb1!(7Ԉ5ͷc\5ٜc^[Bv}Yu>W_bLL I:674s^{"k'+O+NQGju!N]8*ZaU6UnLdm1lPth^PVI.A%\밊PN$z-ͤnda4[J94k*I!؄za)5k&Ec_aF$/ ]~bVQ,aͳ(p9ucj$'S\j6Voxg1%soZ`c.q z~a @|oGVi4,n*$r)"woU4C[ z);:Uv3?"Hv`24#H&{/˞RūFF#  {+7]PN]Apu犻b{XM\. gM涚!SX rv_WKQ9^c6;=޺sSWT@VTv*luV;3z~Lr59oVv+ao p:E3 $T6⁒7=FVwYsW^L*"E";&MKqntɦG2OX %Y4,L&un{@ ne2E[IѣF! 2rM?\gv:岂/ Ys6u3~S/ 6Vbx _>#S&J Zj&$ZGtLl K.R\&oXX@g)Xu*~aS)kY*pʺxSk^> /]RcQz`gȻ}\0N^S+fy@^kDTb74>$uQvӆZy}0A] Ե66Fr-OYp difN cFh^#2 yWEu~d8Ս _R:,*&`mɲW/KBpk:PKKĻ3P99#G%~R21~{|0j뿳'8y',QV{`n >5Эhii{71wt~e3 ޻y9弾K-YN<1 a~Sh6+>])ǺY4Z6ôhsƯ܂;̇uTo%rNwn禓48o#oOf5~ɌG0Br]whz˂ ȕ0wqБyMJ\ո yRdSf5 jg=ғj gR~jb e_c,,hKdzyFQy,wsN\5#`@Kd鷽!j%WOՂfaK2J7-a~Q%m#JpkR66Κ)P)fOOI32:̲nL4.3+ ]RZMv4UAD}IYpH.?>%H;2s8#2 Su%54VKVO%=7[nMn9z&= 2[eNz!m1z 1Fv.-PlJ%2g$>h h@nR@. x7RyvrxF6sy`CZ%SQ8sR&:w~`1QBSQ%hsòXKʾMG X3n'΀ 8|}o;ƈsWQdO#$ix$8 "Xx8|t q@p?TM #\9s6=LVt4__ LZu\_* =*dXV/լlؚ!}p&|tlm}\ zYǗ7*v1V,:go=o?"^޶ NǾ\=њ`9kL"^HG gQ&9Y̝l;|h3y՛`qu# h!#sqJ~e6'`Dc?C^8&hChz^v+ڪ [q6wϼ lK=YHqO`T6h3[44ʚty}Lf;&йo&G?cͷ.|) ,D?KSЮ6Gr:#.ȢFPɬY#^ɋn=!J zR<-{ 5w16p`Cwlr~>hΣ{ g- G@H3E|8~8?Ben. eBXc℣({ۈ'z:opN]<KdGJ؊ycp3s 'ƃ1p z,="0?P^p8Ci3r@8ϱhe_Zjw,ʑv#&B*lPʸ% xL阩;<=hh'R/J!0t'fxyR<ͫw]5o[nk[Q&.[(nGyЭ*TkYGmJZLs85Vj5O0wAF*9oVDQH|-eA^.b(Ƙ=W׬vTBuTvUlYgm2T+_W`kvS"٤3H6AeMrlC u$L`Y}Gأ 'T&Hg_\{)g-ޣmgb_ɈtK0y|˿{Խ؃嫞/=d}{kGo"*:bz_:#Q-lbFHqQdE~{bDo̿l RZ$C|6eJCAְ=`M vw{[R9g 힪joA=ɕ(c';u%nG{a'O٣eߺ5_6JN а?6Tj1 @ vp@ O&%zdpaYDEe)%*xzy< ?GCer{+mr_r;~~fFwp~,ХTRg%Mos!`>LEbҡnLܣsa!ة%&\M`_PfdCմlj) a)Ⱦ:@N?us E nŸWf ]g9i Z9J~onR!o6&U޲tmhf3x%Z=1#Q£# =bn9PGͣ9L!"2j nGbU]Ʉ\^1bq1ϫQQq>(=@<VґA$z" e#!R~=G{[O[1Em'"᎜F/rc|Q! C4@#U"fB0ID[0# #𭫥[zW'?i?0Z#BEgĜ7!2Io"(̆"UVZVѐ#[QZzeQjCeDo, L$ i6R33D3VFor[ܖɊ e)v,WDHHt@ p_}Pc8]O$"Տ"$}e|@$qlFŲR}-yҊ[:T1R5 #n7~CK4m:U4 V%T9-*CqQ- T$2 z".Y/059E{wTA>ܺGzT (QgV=]l%TS2w :MJ]?\.M;GZķzc g#6z3>O7F'AM?38UmS)b*%A ܘ0e 3Es76ID?mVt^~' hK vtj,]78Qw_)izNr1Նu4s"'~=r7 '{B`yʼnGQx$5TЃcRlWۢ~q&WvW8`g}˙kWO0_0*{}t}Kl:O-E?&gw$dsAqߤ)Xƞ(#ǹCS5_qM< D(G[JkU%`TGmz&IE=^C)&jq\K:L7u }'m-YKkN*y-ʻ;T1 1bM"#8+;q6*XtQ(e-$T'A3&,ji)O!|O%JD eRPŽ}P>r,CJCc"JWAoiGl\C?R:ޜ CEwIϟn7S񿳭%0\T+{!ݺO/BZ6M>@y_S{N>+R&U*_=\6^3%ޛX@y/_oɐȀG^ 0GЉ/ٴ%x`Q2k -8<DSuZL,a=7ݽIjbDdoKvqb5>b8BiۊbCŧxskuw˛K%5ڄJ7p4I,\:Xc?ίhoi!5>.I'ǴMVnl8SoHi\5b]& js>ScÌ@dIMIT8tς[.rg|'>`Z].ݺK,gҵ(RVnI pb>ĭkE5LD7,#ş-xm$R[ )sDmQSmPgD.;ȅ8<@",49od_eT:smZún4L 4!>9n̘ N6 Gerd<%2t?vqdAm_S/1/1rl1uѓp/aKFxp#=gACkz-w X6"rtj_+OY0x| BH45ª5c+9 nЮo^[M:QЊ: _8V-IkMÆMk*ņY(ư $̓˓Rۺɏ:4OKIo4mX^/IE%8%&E["Nz⿱8u4)Z? w:T}IQ-?>ry tuG$z+y ?^pCJzZֵrѕwV ZNדyVlCE%ޟ&42c1_lҙ=9C,=o;qWV[e+D\93f?&,`jG9W0|jr^9Kqw"WQ98?+_nW-{'}SA,;O(T5;eUC+=zXn=j(We ` Y7Ci_O;Z!#o^o:E3jmц!QK&}9Wݲ Yca>Gg讛6_&wk K4bF$)?p6֕N5׎~g?yI]p,ay.҉XF;~V2Pƻe(5 =<#>ዩ\\Ld?9$L~cZ1+CW a-8=&M1֚s3GUYV'X7TfY_Meτd׹,E['mS hH`W$QN4mnf_?#"kXڄ;'g~ǟ(:2OLlO6.6Y'g''RG?RcgjV`E갖.x/f@ yz)Q1 @=`d HHFP`HO$%\nZFǵRF oڃ b +UK>ά&\Jpė%CxI3Dkuhhe͗QFtEϰs-ٰ0V^#_{5#x%LX4<-ܱ.&msVd+©ƳEz^R0/E]۫ {Ʊ3T=69"Q4j_svTywr:,ʟ'zF0*5fGaPk M|5Bk8].!-0hS``2Q^u`9y<ڶuسdtc~9׸FU~&C&|>@ "Bq%/r @bC@ ⲉ~Rq4}(s-RR..O`Rfσ#teTVמJ[۱*4u/LIP'i+li-}ϣ#_jwgVzuAxknG櫃14-Uf:f&瓊ܟ5!]M# &l.P˿PR ]WD" ?ԏȤ@ =ȫ嗔iKJ4@8Ì880&eKX{L,ŧ'an\ի髜+}o@"p=,P^ϥWfYJIfMLfޥoKdq&)q,2Y CPf>=ԕf72v@bé i- i5FT7b'p.2ܵ=7`yc)}b#9m{o?z0'RB[pc.qPl_l ͉f_یcTXݐ3*qmDt`+<]m]Ddp?Ghu9F5eG#zd.U/˖o/ g%^2lz W1;/`{y1miGk JМ4h  .0'P"WZ>>egCą>h ^}=όgP#տ!/cfD9%ߜ\i.̊{5XN/̳lO^ў !Q h|{R^&x7:YԻv-qFZ8lӌYx%jq׻_ DP;Hο'_>ٙőUKKu+F2wT{aNKgf3w*lGZ'iPJ<_H~}Ar0C4@3oeĐ .;Ɉr nuN$9{˺uWYw$LD jhd Œ0{?Y__IZ;O}n۫+Kgj=ex񶯖2N-U܋O_$I00{{{m۷vW: d=;mٶ8$`D"E0@\.$I ! qS@^PB)mGUSRaK/XWT!s'WCk'/T.u 2eGrӚkU?19?RPŘfkf=#+oGZd Q1ۏ57 﫱[XɐX]7Iu(,f;pEVkym\x,OsgmgRqO,tS9>ȸ",L)n3!hj[HcJ@67Q{MN~hgmJks5.7Sտ%.{+w3`Ye0Ѩ^[M4Q}l; ~+؟U$zRPŷ)h\/whU[\?|ū }]zǜJݰa[xǀky،:. ƸU[RtB,{0}ŢaIײ+uZs}GWP<)+u]= ig{~Լ6U媒ɽنvثpc8>n֊g`4Mל`AM Ŧzk~9hN 0A^pB)?gIEGjܒvA^l} Wں<}c3!˰ӓU?I`vmJV*wj8>󳵾AlUAH#9x6* ;%^) Miuy.lb/.I4^ \sVl+egF[Vh6vpQ.8 G.}jݴR稍ݷG;[.*ء"+٩TāR3L/`ɩྻ_ْYH4ogCv"Lb#CZDVrrA^vu^1哯E44,CY`%~Y{hR-J3C\E Xϳ$)BTd فhqS2JUq}S4SVKGYŚ_`iD~qȸ4~6>I?-zj=A)>sY=,ՉμDVq(vMsAK-}l~> GQxB'3E;{#榖;sOb!8Q0B|&4#4RM.IVψHe2SG˃LC+ eM`d6.ev-nF>-c}XL.ɞU,JMe NdkW\dͮ4d6s`1ha򼺔V, Ȟ7Wf'Ixq_F+o#br$.w{8E9iOuCZvk߯'Nmz+/}5R^,J/^eOc_z# .tOH?(Rra$!=yDBR{ܑXuϦHcP໛zvPp;3˶ʜ~j!PʰS?עE_ 뾃 xq]nbsrN|At@ޫfaͷS(?pHf~.R6}S2@+9}N宝R-I;Αm 'DtI9:9GwO9Y~񔍈f5;ETz/6q'JBuFgܣ$Lệ_+i8)n8{XIJ+᝽=%Y9 I:9i%$oIQFƱfq<N1 5r \DBE+8VtlDC"%&K;>J RTGL=g=SVrg]d 33fK".p }$|/ tvLN׳Z-'vRIG&,?#HyZK9?zX~iDv6\Ҭ@5AQk;QKա' 닌 v?=e3ܲ84kPLs6V4%"sb[?\?O.A7IG~JFjҥ  %c;ژ ?{UtܰLR7mbtf|T7u  84֋H%B#?cq8dBN^1M1!zPu3r!}|AL"."}( J((څ/LQx0IPŔ Px(rR>Gj'Wk2:['ޯ9I ZPORwR]rdMI߀3pTh[Wj~8vXKIyt]! LrP}qˀYWG4MoQH.'i8&떮.)dӥZcumbSsv͘:48.)k4t爙)xOc'%Z?44 3Y%VuqPa\0~?LɯOA 9~,)= ]f%@vbhHi:7S9k&KeZAk;8סJp{: |Lp8te"=&A>څ ͐t>#$Ks|T?;eXl N tͭJ]cr#'@~Fjqfmڱ@T ԗ4Κ,pq e[Nl\ʵbH\ҴN v("gX^JҕTb 2f[b \7"6Pqe !s*fks{1hmTZ^[/ _R4H/I/n omp(K8*%h K.l m` GCXH^/(ҹ_@P1~f1L:G A()l T3-q"<]P^,#d@T.D-2h 19ȑ {g[NG0MdB,}Ȣ|ZuB IŸ/Y=`.',WI0j3"E | ߋ+ް^B"61` )' 94H2D|{LrAQc]{ֶ~Ms&g>`ʸHPK/gUBCac!D|RR3Tiy|1An cl*;\ OzbTx&O|Q8"71ucOWQg%{[~]M@#K/ pYta-sȲe c"Vn+ȅ(x/-/fh(DV + V T-_4P% J7Qo:E;- Ljު隀rBJ6j11zx*Њamh8ǸdW0J2zvjOo-(UL ~ً*H3n[Eˏ2.u'Ub/ڇv.뮓@fr!xZ ?,+ U]^IʫXRw[lp=/nЂfTej3h(9ܲ:do݀yE-awJpk}8-st>hm62ӆ0)fVk4)roW7y$Z8Zh;nP?K3t(qH4!TeTsV]ӝN2_I|u6\p?&ʢ}v7Up?ѯe[AQ)9?w]HcqпN&Q>obcJG3< ]Zl4ÍTL1ʗҫ8INqWZmiYHgձݼJhx0RɄH!-J$w9| wbw8O95'Q%@x{Du Aِ_F+Dɶ04A{RXqXiyi]lsOaCT/mnsVɧbʚ^)`AsvQCCny*[XvY<7~ t5JKI1~l9i[y^JnjoXxVtR 6j6Sq.l {uާX|/R(jCXRQJq_*}Ϧ-z$JOSgCFVS$f"\t[+y1v`ʖ$F>>>IRTy[9yҩ)$7!hJ;Ma+k45pz0S49鸳`E6xͨTfhL>;?͝{7S)r|b̦W9V$]DFN>N.25B->r=G8{6]7ELQr.=_ %av Cn@Tt ,F`SUaT=nw*;jJ 8/k NW\>nnvlLtmY9z}{qvCy5בx9w_a4~ 1S̀=@Bn';k^eiM4>tOdS\l.Hi u ˃(^곔sE"ϡlz-d?(ͅhDmD6K](:($$$$ePOQq'4tw^n0{ٷ\4&]*˔)FCbt̜99,j4́N<􊉤yc1"<,TO/#7aMlm*Csl-ysǷkn`{1iM$~Gпšep1p*F/pCͿ9X%ifg;|x?!*߄Ns)i9ģHIJ6IJh?n+j0 f`+Lbvŭud:N}_xp&&iFq(;Aq ciTXZ[Nce,K6>a,Q@ӓ4~LS4/X &T9yRm{"L0G dt>Xs4ӫ0Ԡ x6 oӜF*TUڲն3ܧQɊ(YF/J%Hl#,밈V,.2 ]Z"'`QS>Ç)mAVAcU;1mܯ՞,_.ء;qjiw9vf^3s赽%{V' w?9g>-:ާCY)S~ejøi̵ٗMDgA>((2D?`B-İIޔWǧAҹ183BpZtE?x#x4 2}M=UJߣϒFx;y 4>@ /!F'ԗj-y>vwn+j)|9B~lD|_}3A6hhjѱo),s@""!׵ڗ}0q'{oPVWѦHe|@MwT۰׎*كB}#\LvjkO lKڃg~pI_F Q4[\Fxlr,c׺כ'khq4uU_VPzq;hhŰ Nj\|MCrH•Ӱ=$V-gUwc.& A#ϗ@@0*J12e )&!RA,t :=nb%{/(5 dF/%†"qgdq:/0C@$Ll@ +x_%g/ -tVdY{6~qɒ\?%3}dNNFwJR!]%̉&IR/B:K:>PӣIrxąNMt4uZ#Hzs"q;%7>8*+ :\,8ƪޅ˽є۹׾Oʫ07Dc>_a_H>Wa)L m 8{wxߣ} :7Ev(~l/JtJ@ zC~+! b;|;w߲Ͻmma4z?Y1ۑt"J(oDnym=J|!D? @!(!A.Fnt=]{2/EywErc7KEj MdvL2C0z=7~CӀz!23YEO_=dx;*Wt+x{161)ڎ |Mxr<l @ ZV<*FA [F#:H~.)UipHyc )J}YZ߇k苇i6ۊS.~m /ُ47B(\ݿmZ:u2o-sBDqB 闐 _XͿ(l2D ,}O"Ϝ|1 5Xv<ѮwoI֨ `,f)G<,} "V7Z|lFdaK7~BK>ҩw>d4\>M5׬ /4zx)@L+7l+n+Uw"펨FXE>MKJ"`A£yMK,=lψq4$*k+!~f/_YK9cg3M^FP'jPTGN^EzaE7M #&h8rqfL!qVSc@]z RzLyoKJXuv_-TCCb[%Zs=#cL˄kT^!Gg>ɠҺaW.QH"/ V 7"۴QeAXm*|R[=T[Q[ϧ?Cs8 sfn*VWR+^b"8x.ӦtZi +Nklym'O#qِiV /`( &|͓R4]]c˗I2W>տ^`W+f&6Ws2ם+%!<)EP]em徲>rĔ'5^TBN2A7㯤Sڢ()tR7%w蹍JM4z'##g4T3՚DD;)Ƃ9R9f>KHߪA7lad}Ur_։I$<h1 ˺= %DZVNJ>hm䟟͚y\[9bERc(dcdʟ~3*8M7)]p8'ZsYڣnl+r1 Igݣ|Jddaop/fv"֬|彽@뇮bDoY&?E ^\bFq.w̝0W d=%@]x= 1f;rp(Or[*v(>Kv;?TpDvM#6qg{WӆIoLJD"z>ma~6wl=Z6T-mp+pEM8n#|e2{QsN bHM/[WJ<W'oP-l2Y 0ttG}(qt OwCqap6Kd_Jkb qcy.h!ۿJj, IlDl^]pכpn(u]D򺀾nFLOM @gG[™-<ɕ+IDpj_՛->^`ըs+~Os?GGll^=ms7z{c5NWe XEvVY$qwA=}]l@ (ߐ|# k.kă1nY?_D խ7cؑE-nCFeNTuDQ0"sL}uYeo3> )r:  # EY(qo5O^stn\/=VĖ~^6 }W؜^ZZiC+OXc6NO䶾 }b^5-r__%J~re9؇ĩjG 'dw϶;ye8[,7Zp}ņDM3Yd.`Tq߇.5(|I:r~Dq z7ybkSFﷆrPŃC:gTg's[{Wa8(ήsfn{)y5j!ϜNwC@с]%*R$uw4x`h%zZ=*ӜG6Qz+$UR"f)kcRtL~.%7,Lǟ_N(P}F#czX LW T#o7 ؼ{;/Dr{(a_+y 8s&G^yC .-GXlu<~zm[as%G|ppGֽTyBkIzj2l6Zbh4űlXMGBÎf߱Ϛ6/5v|OzIX*'媡~Gqa`τ2Te/پZF\F~SLMseQ`EQzZ-Ah/>\ Zs ߌ׎G!n\s,]>l5[ڪ]'bXE~Οg:s #Ε3`2WCJa~c*mtF)Y~*6ACOo':himiIQ>\o=?d(k=b=uęegU!&&cxo ֍c/p?gsu OrSN &=ORårиӏIpJ)O}4'7&ߘA՗ 7,=7&W{i`ڍR8YH۳dZ0݅78;4*":8ݗ6>I'J+`uO d!ɹDNę7}htYnNߵ 4t1DQboMBY\[nވOY~ήܴ7:}A7pf_E}{gUh`\=3O lԓ(AtD[+JY-(9"Z#z` ' W栿 n͋ia4{s JHC{9ҩ9ǂd]E{#Ń/# <1gTʘG2xq[P"5,E|h_WFר!^_iGR~_0'&F_& : #^ xsU:\.>g?<0ǃ1 ~m*0qTVw*?=?R}?M4"/>ھזz-knQvMVCCYM+rQ":@` V>ۼ5p׶֘m|kjѷo׍^}Mr@KP0ZWt/;Ͽ6]̭@fGJȽN`iݺǦ5U[Zݢ.kD'EKͼOt-pXo&JÒ=/\).P8Ru[D"iI͔z.FT@!Eq_ZG{Cc@3nECv 3xި@I8NV wۻlmI=Q<q=uDh_R$[dHF!LK/-%޶gnsor{徽0(SQ6eӛz8qeӈti0O)۲s{9絵k[x5j1l[o^<(XD.D P/E@APRTkQ O'U0$heW~RS*%hFt.iO|~t\@쑬PWi:+4 ǣzd}yR<Џ36xcf6 ϝ4mf>p?y?٣_uj}mȟۍeu^.\ӽk2(iSK֯dZ=jRkAJ5ṢT56u٠Ԓ٥_eP&s3V:gѥ:ʛ&'iğy8O)%۳,gqKx//,7C1S7 =3e!Dap]R {VdSpw3#9ROyl,-oj\I:[ S ٻ7wό"܃5Ole-'6L4I{B=aa,icCz=ψ$!Q<6FϔmKlr\?sg[~߂m馦 }m_OwuʻbuX9 K[s3z-p{ B Y?:pax){}zt=uvyZh[/F2!Jפ$fӣ8&GS鐦,=В{64=1ާRS!j-K$zAaWķ:HNNDAX]+{˧i/v`/3U +FdyL-i /d $5U$bTL+^sG3JPMPQ%7kK:BIlsKOWpkoVIZ@CrCrKax<$F8N0}hIcle }^SJbgֻLXRgekE*n>ZlQw59lIWՋ1.`(bu)] /WĄtxrp!2%.VY^p41~=,:?ԺyF5oۧh3nMė"z)n6C0YpvVQ։l>9$5)&۲;S]Iv!syN ɷyNN,`G2hlR#!p9_A._d*so`nصJCݖgeҢcxؖr760RvBW9F:)FA12!QrlM*r Zk8摩_ v rNj{kh׆> 33)2P̾ZY|,u ln!eH\KC5^6qW}5%g'˦5$kDZ(#cfn,vUZ*JRe=լ簂j[z3le]g*fm3YthZꝈ(glS41'U/ f'V6nNg'i4FkښF+!ҋ> ЍBiI^Kp ʬ^/ܔp*w%bȢHɓ*FT[k|醽zVڳvȽ#[ϫZzԈKTv uTFעE`iQ"N ]>7_۠ȬËn#4eP7x1~-(r;cWJफ9W/%;B^)PG>41uQnvu{FDuܬ BNc(Qf|D`2E1"pGX> T"@E.5"]ǶV2I:$^ɱIz/$O‘(? c E<$o!]nHTs Q-P%[B+AM#|o)gڂc/ߑҀ;nPr̹Vbވ;9ʛ4xF,Nz(fl ' W*f:ƞ3VƘsV*eੴNUYB}o=ݱ-uΗ^WׇELU`)2oXuCMzL.np/'R Csύxjj&AKEN[ԴBGnCܻ)C㧼 B~MdoY(kd+8odzEug7k_j-dq_J,ǚObӃU3{\cCxT(oFw{O;I,d}?B.a:t?W8LVj ͷ5b>2HN8e4n}ʞlaG xQ2Ndx|d&'e7[#`!Hd xU"ZnP2f.yJ3=vbͯʼnG*W#=&(uqEg@^Xݫ^H)LSiE?1WلPH[[Ww$>>{!?=;ڒq:yxIN<\I"/I=mn$QZThUu ~`Czzzӎ&b1:= @b:^%#` ~~Zһ|"ganȳ=A% [,m?L24P:CY:D²!"4Tρ|H3gSq噋q,AET×HR+*H6htڈNvXG2լHKv"(WnC(^5E$^ vtM(rzG*p9tV+:$ZzFEޑ uM0L' Y:YDp!Uo4.ngE9&.ny-٭@.6eL9xwdYO߮E,czwZE2}x&=;8ecۏy$vPd0w!<4WǬ">l8n3 Ffmiʱ/L2C4@#Um",fBГL4 H $aYJ< Rw:W{ OOL@-KY#N%/솇@vLSaZ3ِ+^dENezӡ^!R`$=I&}QpmumVڶV\Df0qbh戀`aOI'耐Id$LQ}ЮaڬaSi-G[\Qaj'3zPXC{SDKb8VM4gj5ysX,erSLNgL{\vuTQ8iuR0Sŧs[5yl/rzSם!̭T慕v3ܳ{@yi?YJsdlȿ˙sfj{J.>RX3bp{`xG3q[j 636iSAm^;g/Ҧ🬷ӽ_ApZǵ*f»iY9B p6g $>;N͞ `e j勪`FCgy!Y5UڢAԤуvMXba>'ByMj;.ds?7kQ🡾s37Go2KpM'ՠxCk!>P+zPiOUl1/`I@#2 )|rbTIOE#>_Oi{bZ/'G퀜Q/$zqLF^i!A81m0'C4`^>Mˆ kGrlyV:p) =;6c2;&ekl.5?kŕβ9Gj? ?)گ'Ss5X%\<]06a}HhO}T:SIܩUڦTS8Hj܎5YA9 "w@9'hPW!y}B9< K蝬2F;cc>m2 Y)J:`u:U>1쳷, a9k{SZI$}پl)V_噺V; jS!'zzGc2oN=Vn4rj^kW[~?YISzyS zծ=/h}#)njk>;"q\=Cb>LK=M;83gnoFlηag_N;lO ?ZW KClC>S*'A`Ul7uUajS<}j4;nwQB8M%^_UqޤGS͎7a~Ez ~>wCk {eeV/3YLQ(d}8$Bȍ :Q*Y}Z8 cRGJ7,WJMV6jh$<5zLZk+TЯtot&5+"y=c*_EN{ly䥝g 4ˊxDAFb*B吹ZD7rokQgUIZD[Չ+;m?F^m !MZ ONd/scPBMZ{xW+|2̄޸U9l)`_ܙdA)%DBbN~`ݤIGyBݮe¶SYYG)a_.g,Iɻ!+OVLTnv 56}~L䃐vj!_|Aʏi3W+[ʹϻ(uU}afS3sCRv4عo:|˳hGMI|7@;u%΃b#}e,rr}g ۤD[ Ub *Sŋ.6Wuh&o1qv Ec˝ѥzJlD*&@Ry0aʴ#0]^Z 4(`LaNf\gGKx77~=} éίE0fXkyn i|&|joA?j#1$Η⏴Z*@>je/̈́*UG,1K %]/|NIhHa`Xd'OCI(bʛ9R3#sN"4H`qx r}+yOЀڠf,.:|,b0H5~p5_: iM@&S35ߍԎ;汍 C gW e:vǒ1ִؗ w1X fU4 ^{.XNg >f/ Q~*G)BƏ@jGA(`d0u+R5',,6RY3ջ䋨 i+hނ.MUobHV(/ $BپZ(ꪡ t#HR(UF%EY;H79سШ]zfKO2H 43>G\w6]JMUʆN?ˋ5zJ:r$ dd2 ÆR.G"V9_~v.&7[c|ʡWča!E+׮ _ߛ wx8/7ʉՅ[ڜ46aK<;4)@LUÁc_t0{3ںcS'!‘gv̟3sңl.]! PR:p_f530CEHcZ A>J0Ia@(G/c>>.DJr8*ՠ>\4g(srD'609yveXlY9>XH+rOI(sq,<_O4w*;Qn8/&WT&)8J@>#o/MEمOeӾ7vtꪡP%M8Fω10~ˇ++NX:ys.ThR\T|gVxn1p뀋h6-_Q|=/9J|˕xY[v(n );b?L4_ʈ^rf?rgN:OC{tIor 2xR\AOR&R&deuk?U*4m>jIrBx]vlv{hWP4w Ο2-EV>i8eFGiRUSMtH78#uPd4S[oVN5[n4LR" R;dlnF@l | by%5aCڬ|Dt!VYq_x]aƣb?c͋jhX@%ZRlC_"ܗP vF+MD.QvʆD]&p*.abBB/9$TVʞ尴 3eU 0_h$ʼn1;\=XCC@#Ux"{2WL,If3i؁$R ?b{nWo $V-z"+0n?0 IP$َ$]-/̺QQ^jTs=Q&ZwR0P:Tu[4zG^T`KT $@fh }wiwfٸ.m,UPXO0q>`Q>@!i2s;`hT$-FYǩe Ci$*ce 5,WJr[X 𿿸-pAhmJ6qkLRnz=SO$!<0Rrd*)YAy5Y+Yfߡyɹ!Kih:,-ߺnݵNKlh..b)Eb])ߎX/Q .Z5wVKڝL/1:#.S)Y;qI~tBepJ9T6y_n<ox[*\+Gk˙O+(4Ѱ1 ~[6 Ứ3,TCp $Zn&`5Ud&tm#;~{ɜCmp@hw,]~ ]O]oZoaNmblҋ&mZM)~،k5fRn/FOa”v9a?lԑWG֧$UAQXreuv|Q4UO? +`0:UX^\F&3+$RwRAfU8sy[;~nQ7&_rh!8vܚt([FNFCQ}Ԡ7=v)-k^ Zv ް/pD:y䎨iq@Y ,ţ69D`#>5>p[SrF :Vιe sw iQֹ19)*2Hp;JijKi,I3M̛3ՖYM'ɽ&|B;ġtx&w|϶<2nt{*0 Mć:G%.8cyJI.D1hi {O{|1:LŹDWvgLEe7bugq@ѷ^B)OVh92ԇV>B&9CփBY1AA9_o_?kEF<%gdk!Sd_lAbc)]\cO{W=DzãN9P*0年=ĩl(ݮkz鱩7䙭^ヒW{NLnzS~@S5+/]"GQHx"̋] =n&_Mq}(MK(jko:kjWϲcJ _$ 31s( v]h7mF9|ݍ3{G<Ã"F#_4x8 /S;}b]K2+[2ޔcm?a*I߸5nw " ,ΣsujHNibD=##'޵Ɍ8: rwF"'lK Ȑ4K9y(Voy*gbICƫ6 lalԤ:mHyV tunrМBM[ /Lv7lS&dQ,`~]s:[U&Bene-"KdT`-Wфɢ, WFM;>mWG2&]?y k9+[5F|(*|?G|5+itEb;{{v혦HlԂ#!ݾiJ!]oR׿GGחUIݻ|bQ%~-bԫ a3au@u~]f:j{dn8 .-'HH\ie`E/]*-)KfQav^IV e<`NMi_#f6uxVr-؛VO,;47VcU5{66/bmшVOOj,k}'p%C9H01׋1m~p=bWuMb)j0]jW Zn,5Mڙv۟Aj.lM?z z㺎gu75jB q(!3J }dG){`oZ :]RGj`qe̡|e'N+̿)R[W;Xeb8ڭȈht'*\e]Nohٵ3glш؏OrJ8_|݊<П0'?ƻ-to7ulWΑB8|Ebx;~_b!h"1ωŲ$ydW"zw&Zn # Q'9 N5_ey!oVsPgzZX=3u5R.PR%= ZOq[SW#L@ /he(Wc-S<*? esZZ-?7_qb#CO]*y$jdq2Ggi"$|ldJIF!p*6p!d>"l2G.֗oA*Lh=0X*Qw<!nEMhC)ǧbDB)B44W/KːapbT9cqS ~kNE Ft(O?ׄ;ۭqwgxB_kY}[{M3@#Um"'\6ˢA J)MWk,nnmv~)OO bҁ_$Z$K,pRy[m)({j9jl`nja1]ZDtӫN)AESd[%GM#3FPpv߶<נŽy5٭QX[ #6 ,$IK!|@ PJ@l J Xw<4֋HC τo9*W'I\vPӬ1aɧ-FH9\"a:$]NҲuZ.,0ʜIli,Ufq{ͩ`2*JX蜝 p})(mI-2KsI:k ZAcmI'W>:F&5D5鲶'?OQf+O:n 8s{մ%I*UkreTriu@W؏;Tl2 RyÕ)aGxժrK2m(Ű_WHͼ} }Ab>ç RR*S_/)rs@.T.GC?Mye5r`7N\'3cUS.#6 g 5 B3&[ቖHVEI0@6jeJx5ZҊXk6rE4e_0Z)W6]!8B%O.2b-UBM Uq~g LJ$b&$JTB3v=|473RDaͥW_%v\[4yֵ-Ā٨p4v!!Guagq V[Hb/(*A^4\i>ۥ'$r*!@L kљτ9w`[H£+g~qږ$tYKpZI]Rz@aA=き-`^{hEJJgz'|Wr2${)V_cf;DL*!P2lQډU;z5JDJwFȑ3_"ڔ 춨ZT&t{ 4hU}ROպ77jS~F{$+ݲ:—6Қ2$G܌S*w/=V r@\( ~ q̆;`^Rɒr%,O[X=5   QyωS]P|/u^ۃdU}&v?Z` ItڴFK'T|I쟃s9f}gLYp~1r-vCS3.GqrtsFf|n]G"l/6&vp7n)I3zR?'KJ(D<'#|OB0r?9՜UV;va)ǻmiRvd1^ Gm] ¤PNyOTgR\n:\RSW{@tֹߚd^3ƙ^qh){)b1wN+?IGc)tm/՚ȇUC0+VԤzil@IӼx_n6^LaM\KFKh5sJ~6 Ab9ݶ;-2][ :*bG$e~V!udء DCȎb73!7 ;1"E> }Ҍv!Ҋ*ssK_(:JڼYp#;sc(QTnNFIBu#>pl{8,m$mcq<K٣Mbr{l`ߊ\Xa=_=sjєMҧ鐖6]D2MM{^@5p#M9F4G>f||yKƼbFF׻:mVgc^؛ MU/h:g $%}ͳϦs\ǡA[ hq=BVs 8vyrIitI:O&㗧LsOAlI$q}(B}K3>IQNed^?JΫeixvo˓]ؽ)6 wgs5+RXkq^"S'r[+=|9І`%N+=+*.^رo'g+qj6?"ӆV,` s\c}{{0;\]բd46F-Nr=!Qihyޮi߂kӋIňfqRza7KPRP+4D|,.lE_H.oE/"|yUtaֈPYQtX1OSG,p{dnT?(`(@уDH_`ZB%O12 SY(whxl@ r,ebnq=o;X|rELx"]yE'7Uwo%l|o6nܵ _Q&Tr _n3\5#)J^8][ g)>yӹt:=O"Vhz2RbU3C?b+`gHd{qT*FphƟCQmP|ζ/AXݡή·1ސbyu! fLaN=^EJt Tq[~, bSX&GJ^)f5jtYg'KP.6 yD"46v0U=_4ώ薪WɎu4af. U#%S^7^)6x%"cf!3E{ ;NA'--gHpZ͇6GxY/'bqCK4΁G^^@ r%^8 w `4𶤵ڣS:fd|jtCTQh -iY c;w1<74@xKJ*h Z9huF;onލ`r-35zNj΄ 9n7%k_ގn=~2{( mixx@z L/qƹכ)POl7Z\vY>+Gsa锜<Ǘ\_aOxgGl[[֩5iї LS A,ޯbbdr *EG׏U>я1^xf}v"!%LgcoٗxGNi)IT-R~;A[I Ar `5pVr TIJIkUF:̼/CUq}2PMw"h)fxՑHjG+zNlҩWґ]}\.&p3l5_#4--.G0=ԿQUԘߞ6x VDizEG b&KY״$?r̈́BcXG!ND噐T r!V(TSdzӬ{{ȿrUkY槭eQas2Dy(]ַ݀;5/kG`Sտ?V*CĮ-Mu0la٧樠"Oa:xJVc& }=Kbl.#`>$aystկ? #bPa= 97fD 6a+ilj$ />7IgӑNPb2Q6Z(Vuʞ PA-9hYc ¸\ρR WH{%57%`Lo ^\l$6g#0su)bә߱ph_ߕjGWW#Z*In/-WR0ZnoރUkL-AD=6T:-O^H.N(0B -FABI5gPkkui'T E_MpSKne}`XT4mrmO+z$׽x)tG,;!i: ˷tkzVNkM9*0}X5:~:zCY55KNw;5׬kずRrb'&s3"7];妬f˘-=7hO%q9Lb#~ꋖ E;~ߚQH8N#VԫZ)i' .J ~"!&eQX$U^\(HJd/It4i$|3a T&]1&Ue }"#*55|MsE҆bm1V>0\C#s*,JS^>5n.pbo oNEE}i7_ %1wEFe~'Y|S^Jx܅~(^~贼vl1pKk|>~x fx4~=Ǹ+D۽(6Wm;,+ҖW=eCłXz T}'! ,ݘS\Gz$h{wA0Y8MH(_GӟN…,{;!zO͉I}_!d<׀w-7"WT[>IX*y~Uenu8]ck X3QVC>n=@?2ܢ˜~\WҶ*?ǐ 7w/P7ܐ%H5C,=Ir _A8bee~o{z& `pMT c0I FR|QZQt3$~Ýq1D[˼9/JIT=J &|*╯ǡ!3*J+#mF!y5P:Բ@P} n\Y_̎.˭NqOaGpDEo'/)K;B+9r"c- 4wc@Cܠ.%&h/93~Ρn9<^=ޜo 7C236̎98T%tovkI =(LBDWy{}fd Lw3>}9\pQ<_oGJ8$e+ 6 \8L$2.& e1sS:.!/@hw6 }̝N.hQ(N`NL,`1%~&~ mBj2s} ʾiC~A-r@̃8JU:sSc쓳sbfG4V'FcX(Y܎Nap򋐄i :phko %p@ş9EHb R 꽐@Ex $Y2 \P@TyZE a J$@ƒ`u=beC7N`P"i.y 1v_@9ib7/ZU۝Ty 7_?95ӄe:Nތ_(=梲iKG Ar~?S&-P:B_E}@$/%2 A5(xdgv Sd@[]gf=0`ȏ= 0q C4@#oV"îZS $&h H?d uԽN~+i*&th  L?s7nngY>`kb2zfǪf۪lY;+{xԗxGŊ-U4VKIh$̆@$df{{v]wݶv]٭nk5XVHcJ07 $ Q*Z( w4?_a>!DI(DE2QRuK;yZs&p%wՌvfi~~,f3TɋG[&1餉%pV4 !-25͝ktWYP3%>GaBܑ%;wϽ!s1trc)vYe՜Q724L.Rržڅ3ej|V h \Uz57lE>ToL1OLh4Δ'۳cb i1E] IkFKTjŮϳ|.s\Es*i[?jW cmJcizD@V1]'ɐgVK)m|=#MOӎ-4$ HɋKzlGVw*کʧk]7SPwBbK BpH`0FĤF&FTQX%QJĢ˳@>+ap#8lS,$}K$#$lg0鐊1 |xW2x.}Um&ȖTĬ~5{VY1S%k D͚OE|9E~Noý^-n#ds@!]%&ۈJ*T&57i{A6m]TS.9mDž*HVEIu9Fw d'soGd'¿P 杽6TF 眡&3ڔVpqagF$}t1@6L0*"0t2-RiG4Vq}`PDvC`svE k\9Fs'ρ* .qܳ5퉶Ddb,i -70Xċ!cT=dzEf"| a<4KΥ=n: ѢѽS,+Mu2jmip[3 jɅ $T\(c,6ָFd8EnzLI[q1M$bpTn۲Sᩪ5Q±KpEGn2kx'rD40}<͂bul(ܔeQQV2r 91lʎ*+!&EWM])Vxp$qWDb$U $0K-<ےC~x_'߉Q]0 x$ۼ]:MXY͡$!Xz(% =.|: 5-29͢X($OA9$fq<U&E4rOu]TFj~W2Cޭd#FC蟦ȴ̖ͩ_q?1a<^HqN)Cd?e8f*qA'遶Hݫ~pN )_#c]QITe7/R:70@EuWZh'BC~1ƶa+ATlBn0CDqqhxwlSewS5ě c)xE~ǧgD-Jbc@)Ylý/{ݪ?6hcz40ϵ@@#lT.h~p*f @Vl/+7 䎔"QhNو\sq6Ԋ{=4 c8TS ^OSXr"Jڧ[[]<j@2!5nUs3洴fPe!Jsu9a{˃ bYHhufGE*t;ŠrzvJ{97K\؍MRt#zG=3tCi7JA s~]^mX~~8ݶnzcүbxRg~rM3ZeuL F5׷nݬRy#Ƭ}5L77͝Scs# A m7RE(<8vG >JwOV:2|ߧNѤNdl' .Ф.oV\+\.Y]lQ  00]df\ W^\!Ÿj Uhb+_* *S` yxɤ G}wLX 0p rX >$_.1< 6$' Am?ib9pՕ*"*usx Tݔfՙ\j+u'e]̏GLd0 Tx EaIDTW !a}qUՓ?IbmӤ{ڱ.ܣ s y΋$\(wPh `Ng d],?>J$Gm%%Y `h}%-cɒc$ǠI.GI'IښՏ$ǤIZn|.1# h*h `5@yL1q(C ڷσ8#ayrq|P/ h  r  szʔ _i !qsq0;)\J΢_iXB0T 9 x_e~kK@ԧrT+t}&LF=5}ޗ9sbWhx8hIɒU^ EUCB Lg)sht^N%2nEMd/h*nݐp|AaJB-(n&Pl9 Dƒ*t*3j{Oiͫw,䯟9iEϕV&k RY9Y` muXup^]'eXOQ'(;'vFvOb?-cm䬦0wu*dǓ#n<[mK&!+^{|Y:BA:h-^[9SհY1hsn_Z7Qڐ][xlً /7k3)ƽޚ_sgJ*&gL)%h2Ϙw١Rb(6^E 5|Qe%j1qb{3QKPL?8 Pڥcme/4O"I =I܉Ejy>91ՙ7gb~f^yOpo>n=s̳+Ǔ{@#{RpXiU.qusO]ͱwn&]SPEiBЖfl=&4^DqB-.N;.B2&Ih&׳V|yg{! vޝ?Xw}QL  Sl%s .TcjN]Zb|ݢW?X'e).w>,KQ4tt*OfѩYvLzv(j`CJ4$`ӼG ٹ.6uְM,dPW߻E im…,VZ΂dΪXʌxTɊY Kw~X'd½O6M\4&.U{Q'2VNM=R=N5sVnz%+<0$j#$f4wqwpn1ow'qԉ9M g,Y"dT\CF)3@tҳ4 63os=` gnߡ5o3_ {3UWK<:a^Z9L+̧qT'(QWʸ8X;a=n޶I)|rokJPSLI&kҤKVFUV._)if5n*ӭH8K?pIbF?Tjا@`42X"r"JXfM,09*0ܳŵ\(Lxܾdyft0 ?Zˈۖzya,K_O6߽v q*۬튢{LdX^jm$JN {`vNp90zSg6~;kX]VR]>{\붾sN%\L;Z?DSS&Lu{5~S\"UM}RAጻ];y긙.G UpNr%١3x(8l>} +8즓;Y{^:e%PfIs}W\%o;5"/f=ȋ i,XW:ؒFthIaܾ'|yúhe:RRhdůhH=*gW5 .ࡺnKs6PsD|EEH`;FdOSXEu-<8EQ͹KvHm@>AQV9YO /֐Vz k!E ZV7eup.t&ALg{5K+RJnmJ} ?^s|7"g$ vU4SEw βVpOnhе,dX{ ɾND?Qo @XQR@Ytg=DYqUed,D<9` Ky2ܮ|RAutS_˞Ŵޫ+楷v%#9 ɼm/QDXxz%dbXꈊtۨkx JPi@Wڢ{?!2@Ye(!{ YBZswI_<1>73*i[>A*0hUS) (݆ FE`JL%"|xTaU. =+>|YhZRtr(׻3%dYwmE ޟC6C,tSt ĄEJcޣ_NO6:DdqJub ]%J8#8stTm0/Ffh5l9trW_lcA՟P0bYp+# jn/ z~xNrHWΡ;O9|g3P8_Ѻ6<ޛMnjկ~nuHS=oTWn{T@/zm<>>K+8y Du)w;Cͭ3 ԥ7&ryh.s^'F7f(qYde~gY|0JRrW2R(3fp" F`耐BH(IGJIX/r֜4Zqec`z\{:#܇vqCt|H;pwM覔q!rd-s#A@!d085*&e50ǖc8sýjwa`? }a}HP3vvE>$j@DF flt:=` Gʭb!wX$́C-$!@l8t1vRkߌs. f.0 }X+p\{ԠT iҪT*tBi"3p!?xa_C\cuh1e#4t||CL C-A#*=M(]w%j-YMb4G/a[d.q󱕇<]`JcKV%cjlo#{ ]s?S/H>\ύ3\3"#4EՍ#}E5 'E mА!,H @;35@3fnG8<]X|ΧCmn{-k_ @X_@d f7!̭aÄ.Ol6iɜ=rdy,׶me[6mnܽ/+kW=-#mɊRE OƠ%f >H#UܻA9rwiNۥfdڵǶZV̊OZ   F RGxOQxYH6~b V Hq)*PD~Jv|\C-a% GuƩa&Gv@fU{d.ȖPj)^9EIHRפDqY&4k!hbBfJ|0ݚHŭqIIޑFϴv<${C,K V )v'3:Zո;:PiM-5J CȘKUp?}uԳ\ɑh$TUZ+P6SNj|& qﴡ!˸;|vu;oƱ{[NB}"tGCK2vt6Y RQ (V̫pS:~/jv%}ZiU8#.~S]w|ZJ([󃞨W$Hb^BTUM}4`BŋJ[r5.aYka'XFj2,nIl@]ӯ͊ ezj*d΋-8@ :(ő>'qq-I$RJ!_~[YqX(̥ķDbTX$+8BR奛rkWUg#zD&Ef=\?D; ()sESoU~2+3Z,҉rw%Yrd7Waqng{C^pCgχ3U@4/k\$4`[."D3PQfE$ LEIbd֑yRJ}g=:& S$5>U(jtkżb ۢEmLɘ)B{A_S0+Տѻ8p;łooUNA~woMyƥɸ EtF$DBÐ68Qz/ ?Mj|JXh2SmM:[_|g2Ǚ ra TnY&5J.Fi.6{=jU%Kb͈!/SZn|7#,L> VjuźUGHXu]7 jU-&52|mJ٨q-Kju:Ǿ`l 4jhm95ssX.tvy K/،L;$q67O.x1yޅ9>B9CRjEV9Wj78,5kI..gzi$7 'YӘg ¶ysᾆaMXqi%5QkS{ոc?p~Y!t\sds>ux)Wr~I8Eݩ^*zݺVɔ<}}<#$lbq;Swj {=RގA(f6ÝƇjU *Xj,r2G%$LX%uŶ:n( N/r7oYZMk/?V~EYw/ aڄ;Ps1%'1J2N$FtJ-cFW]diz8XS+7ɅLuvp*LpSwx9%o Ž0[t },|$q-,+Rr_!l_sBwNY#0z=#(OaiYKc >S~~]y᥷LKUCUG"\7؀_%}vXդj28syvuwz#"hA1_B%^ cB]&wm"埯ƓLgl.b;aPd?esLE0T2ejvۊ; +{2sv٠1xZUmuWo g`ɛOll fscn& @. `R`Rr/T >9Ň_MN_W1QEIk@1%՘1g`Cgy!V`x* $o,wXפ4''2?}S:hw(wSj[)1 LGP /iF<eGt {V+rIowT='Svdwn4]dZYUNͣr0s -\-ɝz֪=fz9[le)U 9 ;ɼ{5*w "Qfzˍ3Qnٶ\-~y3 \Osa0PHqS[5&KQ s {-#{wt=d&ZR$HAGqݬKCw{}Q'ԅZa3tӭ32󺦩Rz̩nל|݄p7ՒWSsNV(utpyJ)ԕ5˜e6'י̢XSg} MWb7EXWx" G] ¨nOl: ͠}ou(@}U8(nqfHF6U5%}h3AgnR'u:DUf>v$g^ЏxGv59\rL*R&x$QDQφ]z:dbNgkEC5*~ a 1 f%1.ψ: tf:jJH HYd|Z +%@3FVVWQvKK /")dqgguսN:\j-c1 b;}a]n~]MvTR9u>2C*2>TFWCMlj4Nt؀!Hn%bn ImLdsMQ J9qkI7F=1Ke=s¼S{[1ϋAAҦK{u:HD2>~6֓u}v#AـB֑m*~a%S5`>|vngD/گ |{$: ߏ☰7erD>Srmi)mż7Q8i?u&$ijr/m 3| 7MmXS\Jgq;$zu?wz642_fԠi6E % P?y ۏ8U3?>Mqf =X7yMMV'OGkJofSM?ǫ=G,TSd Uw`u=qR9P)بYtF<P]?"$!:ԃpHnٶ꠩),%gz<Χdz;ì3.>边Ws,qSy?yԞTfM`Dk(E絥;zb:yj:3 T \6&] 5^Mu۵`VW+Q_,ϰ\t.4CiI=`| [\{\7wkAz[IF:YaZA~)! +!` oJ^ "07Ž'fw3YÇ/bw%١|ȪhnYM{g,ڎ9 _{Ϸv^>3tޡqwF9iХI]V XO][GLƿdq_̳9 }wzlכ>iC:w͐O9Q(^os{ɼ ^yqp2z2ca`p1 <1ڹ`a1 FwJ2}=/C]p0q''9!0PxxZ#-yE.Y2bhF-0xY,XƵ&U$9Z#eyڐ},s8 `y0HEhrp@,Em=pQb\*z?Tpn4Aqp ee o=iZ˥PIL8땼A^&{|$6$A/_!v*pX 6,K0X1Vw h5UϪgu[ƽ {׏n/ kC㡇Np=rM4#lKMtQ ,myQ3yFP.2Hە R#^VclB NA4QSME4xΧ,*;ΘhG:Nu*Ty{Qt +lYi?L'OA;IlN ^M-m۵XaͮխJHޢ&Qz\Y\rX Iw9V)~/(#z@[5g1/v/u~7Kޥ`c4 ǼFadFZ{[&:8 _T %xL~ \hQΖ50~ 4uCr]lcV<풪AɵxCk;X}Oʜ'\i'Ou(Jjg6sgB} Mk)1S5zb,OBU*5YߦbUQgTfUUoZGʖ kMRllCra?X؆]$~飢])>2iqMfwݮwc: Y3ܵ%l:-5$i΀ʳb)F5r2'e1B+v}3sEy#EK6%bڥkf︿-}o #C"`C_zw!j}~oБS<& RrT^+솣M[0Y\Dɿ\ÖG[ OS[0,eK7ow̷ jUQe?\-~ 1 jJ+7#%W1sοYɦBǞnjBx*03y>Q[G5J]Iy-;`Y#};v̔:xwws3XIݶ1GV۟d谫ɢ6>'+wu9_MP+P7o#fL,dӼ; +dĺiy++<7d+<d0r _(pyj6c54GT].{uܜ<pk29A̜7gFDd' =FA⩑B]хby^2~I>Q2:QKCňϖ(3,,ht<"bnVvпaB=E%g}[wb H_ OkrSA-6А;쿯>3teH,lMG9$+1s |(jΑts7[o3g jg8~j:f&gưű?bn^e Q p2w]xJ8sPs~,m2qAk%xjl%簷B4TE{?e>׀[$y)/-R*B"?"cѨ;ũm-Mk6g߸}S9/T^I1-e&<9 Efy_mD:nUCR7ۑdz0#jUw\ʹQ0p,g'HyQ"|u@Ù`8RVcLKE)5M͝p;V9 <-| 'm9qg D w9Y-fPʢdq-Cu2Z1Qk>%u-ww+DSz%u? m,7|9j6j/Ӄ^K9G.qGS-]{Y,o\'ヿTRe)~|qweJW$-ΝHhd09nykZ9lX{Pǻ/ϠB|QHM槀Y.#SM4 *'qaxCD ЩŒ.Fd`t2TUЎy\z-,Tap۟q9Kf| :[q&Fux VWW*[[^ޓ/;ѹdAGBCQ6!E( Zz WdLyoQt->̧BiO#?&|R靵}qSlo7UcNbrKʞBgcy)T{h1V_⎺/to|nczYCy?nF8i$12CD(Y+((<\A]b#dThҳ# 5nG#,KOU=1yvl*tK%" ߮%ZtNf$_S3o2)}lӶԱؾw B; jf3N/D#oJ=1Xڕ I%d uɃ o&a3H`%/MB6=^o@N̬ [  KıqX-"KE΃"/FE m#<}Qk]`RȒ@ _8ZՂYKÄ̤q5aS^c]Rqg`dS0ܸ7q#\uT߁Is; ȱg OIlHE{ vΉ;%` J qm]0Q;Qڀq z}p~,_ g FgE~3cbSV"I4_ȇ'.g8Fa}ɷz QP =M˓2k܉GE\/CG~RQ3e8R+^M6 1\t3ry.A{B4!WTI5މ>I唗ȝh#KR(]9/ϥȈ>rx?=㳸FiOm qr/Zt#j0]!˳0Re㦋l-H_EKieYO[[1En.H\8r J .[y}v@&DV]&SDlaX;OmRotհ\xrXs+fv$(wzV;5(ZL(Goas*38 (W2+\fKS{4}{xE7g?4ub5KFC*$v܏Q*1\NɹGY!A"3~O ϒcy叇W/4Nl~f,޶U.~ `NKvW Oe߰7kO!vK'y2Oز?"fV汓-&$F[ƿ4Q5Fhtbcިtmt}ܭb>GL<[Ն9|.do;vؐFZ)\ /9˦M\Z2{;LX(f3ˡkr龅&UTӢ~ må9jG]ܵm@׆ -HopTqTvLDEJ/HfX[jF:awH͚~ Tڤ6yZF`ozL L5wJk3.^}?~ɟ[!ֆ<2VڨΗAn,5ԳV毨zcƄSe EUU添CsilV4A`ny`[5"j[8a髨Ϡ}'̭'Xt :x3f,Vy9v}#Y^tZ.8<7ʬ(x(tdJIW^_ν'PZ(I(%oD:8e DQauJU=c64mӀj92ƚ [VtdfIfc֠+qrq$; {M>d*/jQv>=aQ1({YaB@|H|iW>Q6s{^ _UWXr5Y=T_r2M04<7RFa!*R\I`}G 1`]MVz_ԍ7zѷg:yOMEx$J8jIAY`&Ć#8J\ǠJ=}26# 9 ?Zs?dd+uAǻk޽I^n@k B7.Bsp8{f8tAxf,p+L'(0w\mUemT`g X d;tGwytG{s4 wvowXfΉ{~NBwJN3yBX NeG@ډr8z 0aHձ"v:ӵ(aFm_4Y1ES1oUu7runXz'q\A~ء/pѽ"%ۃ]yכD%̎M8~bl;?FI"3"7 ~eKB;NpmwȸP,!B._km>bQʔ-5),lU~{<<";wQ\pNP0 A۩BF`=2Z> )G +_`Ϫri>|V$BqUDpx{-|M?D2˄?֮GXono%r(7xսggWfB3_C8jo]gy37'>Iz:LCWli=qv=m!}}Y\W>p7A^DwtvNdua`{^Aw ^#n@^C@#U!;066VAɌlS"dz忪)o`g0#2FYX2–I|['rKVɆeopG+}We;Zt&1ъeӍNZ7`E+k S<3nǂF|yy͊GQ'K߮i)ϯij|v9O5FA1Q=C4,S]~ ha2vfZ\괖Z=m9K @vQٱE%凬%ñ.bߑr?Vr;[Rg5G|_aYәȐZSeʰGݨٶB#4@,-K;E2&mH2 J%˟u<UjA. S ٳẲ*vZ5[_i5DGmbbf4ذRTl7QQ5n2;T|l%{#(|<Jߎ$-ɋZ_\-SQsAEŪEInvOTN[7Եyrp\wJG\*+ی2dke.1 gTS#}hek4p!Quh-{ tjt)VkR$ɼ΍Iw_ 9@?;"NeIQ9z&MMŌǑ>7O2\jiǎTI8^M fK>oTvYR`.Tuwm+ӫc}R&X:[2ᮮ];y97'{9{U4˒0dV\1[|qujCXWwH^?pVX<_FuLt0dcȞ~nv,H{x2/|,_ĶoIMVQS>ҡȚ~KOem"\dN;&2ԛx29.3G2ƽ K䈼pTx=^a11i9ȹgQ1=rn)-[ʬ 6:2kkXA憡њ!JҬ}7{yUeUR)(f]Im XߛӀj`9K0/xښjf2 ʫQ6U塙D Xy4ۺU431U7d,53so9Τ*lϬ+r >^eaH;{>b&a)Gs@?Ց[UO'놌/;\s̲박99G?+W>Y $EބߢtiE=1BRTPyjRGa )pBx ќKl^m0\O(~ǚXt'Wtz;Zs]m5,mîY5ag{2=Gw$iȑ!!gL;cK^v Őw8rtlY%} KVG>/-0˚=#K]"'H_|)9%/pEbxP̴"\}"oSpkρr~?(KJGEw-TkI3exA5̇v5CIE5>'ͨmQW. .q9{rI@y׃wtZpi/,b:"jrvptOB>F>(qm/?A%jе]-.۷Fv<$O£XkcI%F82]*5#X!zp@ſI09`zq!R_1ǣXM|6䷃ C/ɒ0fSr`1p8s#,0ʰ%׃Mģ7db1BDK78։(Db4p#l"'=DxtMq-2"?j:p}zLDt˿~z1Sb;@{1짮 xmE_O m}%w"] } 93*GDgøA)NS**Ѐ)uI3Y`q2_,DbEOĚWYENto_ړ"LJm*l(0_Ҟ(vMH@DU@" h" I \9|7dn~ +߇8$x/Gj15{ef4814lm:fofm,mW|"#N`{sjn?zgOR+zR,؝ޕ3jLB"+j}BlSl%ud1R)X+wŠ6Gӻ)v<ݰTUxUָs#@KF ̡L'Ac:cx˹>>($![q!HT NQ@E#C!5DH9(O(پ|t||;\ 0^q{ ˭ w(Eߚi Ic1h 5Ǝ +,.S\ X G#250br٢$yC䛸/[?IIoo(BE}Ta4'ğP|*(-i|1D&X|&Iߝ;D@=Ӊ :[IZ,ps`CZ9M :h,cls;>z5@q&`h />ʻL2 \^3y0D]|CSa-aHSp|ь]swݻﲲ$VYFc-taIwqjDz~vr;z}!!Z9f˸Qy'\~zs#p &%Ĉ.A\t!X+J`Młr6s6[j*+IroYőbbTA;d*EIAMv[Hv#NvA㑅gPh8Sԃ&0\N[؉3"!!j_l5$8O,u`(]=b&Ϊ<Ÿs ,:-s <12 М -"C>{P,k[ıP}=5AM?kbb*E6k3lp u;󅺟ิ_މ=n)1{cj{w#8 <pbC}?g9r YWݻƔ]D)i0}"_MN)C(W!.iy3Qr9;ww%6^ 2wՑ)ሸV=]kjs.Gs1U{SÂ~HpZv_*r(ܪSUvE=OiJ9qfGP^K"fANAEFr';6D[ٚzN@ 8|iτ(ZB7Υ3"vˢdꨤ;pjbკ>1wV2 57=9r(LΪ! UԒ~W#;Kn 5i1ٌerfA։l4'.NI8A f,fasl8a9B-;7%XKcsaͳ#c v%4PvUNw5% IŴ 2_O}0%#=iv>O9]{.Hj8ņuoi |mԪ*sݻ^-EgރR2L!^x f7δ$d,,͸cZhK3!Bq"E=h4A[AI@m( s)[k!giToz)[ ɜ ~ͱ3o#tok-{JnXv(]y~m~/< ^%P_5bcnϢ-}Y 9( "s^HbA_SQ@\wt#Q@8[|CZY,8ҲЀ-I&+v7VW&C,޿Tq 6[&$ bo0=\HǚDN-V:Gkt4LD1_.:M5ddt$Ψd|r{:Lp|ƺOb<g*9L?ضGu||enNDɌ|Vq ݑtB5;].N.iQNXRqO!W JQS:߆=mk44'_^`k4蒷Uy5 (; O#+yWr*w0HJ=f$\Y 5dKb&ْZ}˕ds\wϳLZGnM&ՈBTɄ^#dAlC=^SígyF( AWozr{,I!DRt,UǶcyt W+@ o]8o9igBLPSEeָ$qґlj7#F!?É.+_JboEhR~)țᤣp.ar<naޭUX%\]k, |zlK<:?ϋ҉"wTQZR %ŵ}@yxúzpzŭM-NXW_qc3yx"@kw+ xo;4gx #QG5@E-NFfeWzc̏uCOxsg?3x.6 O]=%^AeW##G'=ۚIvz ;}K.OQvlR<%9d CwJI@a.8l7,e2nvE[7֥WkfcmookG?( B#O= 5 ec%=?T#PWf j kj/}u7}Syj>)fFr}m_,]s ϙ(ӔdjNd0cƳ}z-H׮zI ou4O-XJ-?E7H|ʐ=SW#y2A5c^ɂ3@H)0Q!鞎mS F/@hLSM>~7l1cAD?Ij""g[~ ^џUﯽhyO*c]|Rܐަd9v2ƍWV)|J~цj*XpC04VɧAX>pW]MC:kTH\䅕YǚYwз] i:^Qk WƧ±[qsq3$f1/V\S"84+' uuL-fq*J(YUB.no#[zRdv>tY~Y*#)sOηS*/UaNN祬e}֊'Q$B*JUU'*޵ޱC+v&sc^:}m|ҘsTn= EEՀ \ y M8sZ!(z+q*lD\OZU4 Ѡlk.ayYs' Vӕ=,H Mc*)>K9Y=CzUr}񤤦8=Hl$Y˫gD)-QVp[V{%P uQ8`uS Sڹהbr[\Jg˶Ůn<ݚu)%Z-(zEFHnExM}j\ZٯC-lu(5b Sֺ`lmًigo6h}hjY[VA2!0TiBsmAV={OEoW--JkGQzս6> v[m-_}Inn!v๠u>! T*lC@a7~NP}_E D8[ ]u+wUC$ HKw )sGCm&湶}Wб9a. ?EŃ;6#a5yv`fupTRabNNywxa2.bTl̂w.aBܺoњ"q_>NJw>|a/h_y @ф(y{ EyhLMVb|Jpj=TIg ފ<)/rǼ\SP*O9OtX?]ܘ)+a-E NhMk+ 2CV&KOsLN$8|_C#f} Ozд0LU e2$\ K-َ6暒ahSvCچz;žsT \Fɗ%?eAnDgOI|k>Py(HӍi7θr|YLm35t)l3)@"^BHʴ(o uw*7ۺծ"qi]^kl͵ƫ9ImU7om.^`gU<"L! J㙗Wfj6j=Q*5@3we@,PfX4(T?,ɱPDKYQM Ц4|C9M< L%[ 睬2h8MTi4*jm[H:hOlu!Be;Q8[/GGܽZɴV]#rJ1(F+#e)轱ɩ5OJyqc8x[>Y*Ͱ|Rcq³X 2礩&km܏;Lc{ >}й*0#acz7y {?݋PEEw/Zfzcm _6 E4UqNFLޏOlʉШ nr^Id N< Ui %`duN&ItCw~LэF`i}yQM~k~㉸J&Q\( \09?1j-_pО}lZykW4wJSZͬ rҔf 9n>,[]+dJ Gv$ˑRf0Ƙ7gGt3C^p_'SOUc*CB` SBLq/_lsT! WŦummP%O4+"? <1c1S^"J'F~M! 8Y6şo '4M|rURK.rSIQڸb(slCdi+#(lO2@nzΖ{xi#FK!dZ{dҢyPM.ڎ+It.cnw`GgS>T%E%~yYX̗9_=Q`(@* .m2 `8Dd֭T#Z3.!E{v|Z&BŐK~R4TGs@U܀?`܍X sͮq'L_D؂$x.U[Db$.vF+b~b⌉圇cﭳ詨h֤[#,! ҍ(1r{Z ~aYt@ڄ9l!ӋXEq9?GӓH`9n[]V2z*%# =qD#e/_&z舤 fA2'kerr\>%* m7(r5o:>S\EÈI(1/q"' .724Yh OلŠ ʐq UM묝!rHEnbl/ (#dX橀sQCE07|5@xN ԏ4b\pxK |H(;$$eK،_z>bJI>2/w# )tI`{V(ma~ HGyR0ԺƵKI[$8GYfM|ܑl@Rw͏Ma7 Ao_Wmu[[&u),+㥓d %("7E2^ TCzy;'i6Vof S[ziQCv%D̕߶^FVm1H=X*!qsߨ?j2GVCeP~ Q &hbp (pDy%rdi$!2˾#]%ƝxQNAC4@3oe̐ N$CuG $[çq`+[N˺usٺ%MD fhd5| Mߺ~ĨIb۩N%`dv7K %[<ry]@nr(M%9%> Qw7~n}ָ[fBnų2n}df&b\̠" D* ' P1# b<@ꇠ|CyoL-R2{,'N惹|jVЈx)zSȲI'T[mdVn_KF\"YJwc6A4īe}-vqq=&ʯb40pf㈡ 4RhUpʖv=+tk'{l?')^u.? kB1s m$x`ߢvM[t7MT3?)& ]bYk6<3[iH6Sl9*żL57[*-j J}MK[f2;RiĎ_Mظfg$t4邎m鹯KoYVh)#Z7Qgki2"UN>7Y(Op=˯AmKߌQ +>QSڍ.r<{Fԉ!vЛ)܏{VU蚈 =㝱dE1=,s 7,)Ԗ;T׮I ƫU*Hڭa_MXdc6/WujKEZqV vI2I紣i,6e6/I*=(QY5I@oY |a72z_Jg5ѬF6 H_1j{:rUWќG82^{nΛO^M^50yڃUN.͚5 z#%l\e1t 0YF$| h2Jt\x۰ĻO8R6&vnQuYknQ5Z0Z9=:̞,r 2K e[`oWg9t\YpTet)_ޞ92[mC|B$ks+lщ$؏K%nRجwKןQ` xY!ڴLȩâ`c~kYq~CfsaY6_}LKf&Jؠp!c5H`T#G_Of#7[o& P"#ݫusmj6e=VL7KO)f!(صfJy1?_'=2kJUѯElS*%7ͽiF7_\ yWU*)КUiX+]ۓLY<1q9HKmŊyOԭj/+Ck:,za|206qKY1>µꩆg\mM,׭4%G6? RsWq(! ~{'ҁ)1~- өVC+:EBF'Q>פm#EiDxN[LkF?B/!?Zyǖ`_Ddogqq7U-.1\4-Al(] 9s$͋3ߍNёpx8/[TQ!dgw>@ ̈c=4\zŰ7gqY?tꂽ@Ú`XU"nѴ{ZuEjRPկNMWd`$N:6㛮҄ l+*ؼC ;U콮ʳN_ףq؛f i+8O<+5arߗvl&+qRa9r(ܜE=>{-/B#1Rbp9hH/JtmWxb|LԶe7yt uH=)_Vji6qIU/D.P{Vt1{y@X~GNCܪGԔrRCN8T8γkDwQy-դ1ac³Xaa"`MVRިMSs/MeqDG ,mO Z/ prT+'ͰiT$<\hÒJ{QӃ! U߂4i- D =xi6ȉӃVusYia><dcF Π}1獟V>`(z ( > #`^H `:ZN)Og'Ƕ9P@əR)& D|~Ǻ.p A~9ѤN/Y@=.77] H9U5ߝ Tw;A<.Hϼx䴝YʌI/ ,P Pn أ|J~"32%)3X+;Z<`ٺt8o \ _օ?;W,bॢ)2ڣm`n+yPD'&gsǔF>y3,о; |l@Ҝ:*2|o@B0x*X?گ5N|179\lmS&9mqOn g EėjeCFۑ)Upť=,nF~Np޴#YvF2O#,d:WBtX,J\XfʭcA;D[jQBEw?qkmilDx{MBd-O?r)Q\ShS${e3j! oHbxJ~y?9*J!23p&~֮kp ԃ ??$#y?fRBڢ #bƌjiyk$9CP@@w'hQ,o-NHmWF3ĭk&f? (hmz ^OOEIR^T+Kvq(wbܺXBf#7:`|"S(ԭE%)o/XP&s@dTມUO0˻FBKrr( Y 4]E3 ff,!r_M/%w2+ߥZýPV\K~U754/HAy*~)<=ɢ4߻'>dRMGd-;Hf;oN@#o53Z &8e:Or!*?g<)xDJsޝ18j*Ml iz,JeH`v[ghp5'-G$m;{䉻j릴pt&L?K!%栿s^唗v/giyXH8ch~^βZE!ۋS_;"FzuGp'DH|J ~T-4Gl ˔箌<5T ?SW^_yv+M[|CkŹ|u xБ|Cj* :XV=OaGyO߼~)-*0 (GJ1PC4@3U!4Y%FcޯG \çq`#NouzI֋L' Y ' [rO [~m/Dz}~oj[o:l3^ot^x8  7{d0[nmk\.s$! AFpAAP0rQ';cNOb|-ڐUKi"NipG ըk-9c^ߔuWy}WՖ,fۿM{6pb\eŎ6K$~/vӋܵY6 ]BԦp8=DUS0ߣK3>+7uPJJGzc\iW'+,ccksQK22L]2f&J+ޢGmY-޿l|K%~w䦀Y`8{ڃq7izS6^Yg[Y}Δ8XDs+bUs[$;P&KG|O:|eC^ӥ$]M?ZÓ~hvELK[-V1*{?hUB9wMI7w m$[Ww9mDlE<Hl6,~Ҋ Mܕ!@(1& ^e<[ *CmLNҸ\&9횅ZWybrj~SJ)#fB k`ʍC*"c]HO :_M-"~FɆH!zZycNo ۣ2$l@%dx@Up^Q7<ʲ䑠3 (e_ KaigQDaiw1%j,Z3ϴumo64!37:6imSGaJe\ô5X02,{PL.)X| Z!El@)ve f!+ce[ ]U.+DD'~?DȤ9e@N:\~<<<)bx&;CYRA4+[-*9* Yٰ.&o3N!վ~cȉjFpW2/\UPuӸ8ӧoAyEb͎8aT5,w{1 Ms^u381lscFF3s7- 6Kz2f0ϳ.jdzxm0$ʡrd1]W`TMV}}zרքN(~|qkVDFum'4,lMx˨2¬%Af>mWvq6nd;sEPdB5;%,9nx V/x&顬ykL/xsLoV݇ۗcˤKXZL4"oC ώB&gml(8*T--VGɌ`.rVYGY )n`wj~ܟݓVyYyl.~.aC.ѿi9yi뵶 DE!aF^F{wZ E4Ř>Yzްۿv5AR$|rjG_ɕ5?WϢSUuurezIEyrcmZcߔ Ig5'8aGܰURG+6,;-l"ZUXewQHmRFQgOG3S}[a|<<D"uʑ!e~_ذDyU-k}&ʏ.PP)zM}EvXZ }(UA :4{C ꃴ#KY("2 /?7fنsE U3X63 bqȎYv0fc5!>"c*jzq"i*j!#i +Dr}W9nj<+kekfքID9?kdvlPWb/&^u5Jf23v!owBÑGFx MF5ԳX!$?j4' ne+BX+œQ}KK}z?XIƮ#C_|4ʂ;5s@U0sf|3^S'-gq ;mP<$VO]z/F!0ߎ2W ǙU7=oI_x@͑KCjk6X޶MCpW;)jڗ{/Aulv.Ddy2\9JwYDE8#0$!ȡxxe| \md.-pG|)ܔM&W6$x|yU{J뱡rەY s ـWX &˥8yP! ~v>ZQ"wE; * VOtݦ-/c9E#Wd2:"|~T$'D1 A:j{¥bFRCc&WGn`U$]EQ@ijEH-Vq#Bšf6X)O#WB5$Bns~dH,*bQP!@q qeҋfڇY %HVIG1->؋]$rc<]c)ćy]rrl--q3DKa!]SI {@0СGf1@ 07RjF*kO G5= )2$὆,{Qn4QlżS]>,(t2,Biʃku/"Y̨ hc_8/ nifm,[E`$/|޽e uqĪME:`pY@(}3,{nh( ࡤSм\t#<0 f@@XdB `JfRP8j4T!/qD<=\"9n})+rt70(QWfVW`oէ,RMiu)CT?CiRϺ۳׏ ~R[N`nqGT_&hZoy㏃YL2Kr ʋ!ro9^M *$GMC|EbCT@#f̐ NOY$3ԱLgd6uom[U ԌO~nOM678*X i7тk=ka$[R@IRrʐsh+[UFJd '2W]鹻,] |+{~9nmn7]+Wmj4]B 5RE! W@Q @T$ )%IdK".҂&)eI+Qfdaփ̱3!CSEX._qM!z5ݪt%9 {QW,`EP=b^&XL؝:-iŠ&^'?Y#vѠ'dp/Z1;\o-?Gzw {ئy@ ZLϦ<[fQtϏJay֤B`ܬQߢoav n}%-fL`.uqJ|O؞oql)@b3=m:`̗)JZq*c& %f,2:\%Ki`$Ye]=aKtctV,嶧*[wP*dJge } v gɦ{ '; 7pgd P]GA *kqݹ?˔Lu DM=>Ҷ&ff-hS8l76?"Oh f TϔgD9z$Ϭv7u2!Jf:-@i?3g fzM>gXZ!Acv:0P ovI>-kBϙ]j+G[VҹEc{9xav3D 6n)h(>m.)Yf7Jte°=+ dYk[v[MvlbĊ-B,j wТ!wM%e:Dwܼg 947%q⮕:4T)k!q +hCkHe^9R}🸝 U4{`Q宦0Tu =lVf)|w qݙJNKob lŦ#5 ^JZǟg P1 rgZ(7e֬\;ϞU9/n&uy;q<>2GYͱV1cu=.aMb`lBLcv!gܚzCRuL nakuv;9f%f}*P̪֜ hһ߲{+U͕V1t[)tOcIM3"0<}`C(٠"}bDc+CCdž7[-9KJ kn9O 3'kb׋PN-/ N48si$o(VqjS\6ZC75^ +7~*)Y4U7 `6B]|.+b3s3,ԍ+}cIjJk Qډ~&P6zOeBH&II4B .}(EY1 S870^4$+OgnTCh>,zSƻ6z~-՞jЈʫW+(Y u?!H~0μp9++"ö)^,$iyͼ5;hu+~Bݟ]ʼ\aGf LWdz[ƾצyj l9dX Tiv1@(9Β_Hv'Tj 1nSJp}VL 4LO;: R׀yTG1&Tݭge:n[T'& 㮠6{OԌJν< }OyğzsNOb]GRKwrjNyM-0:*9<\'o܉v'Ky_6yMMfD]2h?V{-3ҾP/rDKY9ZMMiL@@;f8uEv^nh?)}Wno'{潥RDi`'i"#}hc䔼1,xȰ7eX1̳62#;QѼ̂?/;qv>WQ?+ӗI"{foG)'Bby7M#g8<8M, ÄaqNCE a`֘fomxXlA{M?Opzʡk:J%"GkbN5N.4j>N&'xѬ4 L:j| _7'B\|5h_}7Zek7J]Wbժ{3zb:}| hpϕχZr|YړmG4bW&~-eOZ_4{iu9e44-[qr;5//}X#itG^&hQ fl CnwirH*:4r6GS jfi rUuZOǷrl)Vƃl/{l:߂{˜pMEB*/y)Uf0KKls@gR ih%n!Alr `>R *xihxG`I^(gCP\$<8>}mZl6OImN4Ut(w}A\\f5ƋK`,r]ٚ~/X^9yXE0CPDPl"z ! &`a9̫ca9Dwh26*P.Kl6,nYXnw.?k2 K\Ot < `:ǝDŽtʢ#=}h|W&@?x)y¦Z4M b%bNvQfe* 핏Wo!oe*X8zly=qo5r⊕%(z!˺8ς&(ZzSq (& ~93 rR_gBAޕ/k<¸ҙW4G`0!- F4 s}U$y)0W}AcECx^^,J_FK1389%.IMWY(,jf̪kޥ"IW3dd .+KDpIn}_gѱ!/y>m!3TA ꀗ[@X|y+da~E|n!)ʣ} cKH\2=(MkLH) @fPQr5RIWcn*HMd*Ӭkd6tcz DɄ ! 6B/#~K[=u&yp*nRЈai h7ha!^Uܷ%Rӗɕ ˭GEO Q%^1#skoXO-$ɀ1arդ%sK+1%(k%`C#%4aGC _HӐl06z ׸ÛFxr0zK]Gk2p;[ٖ|$˧tcǾ,>v8>ޯ {%0Ѓ̼/帰u6C?K\=I^ ʟŒ, tc-7L,ݒ_NcC3D@#U"}K-G1H Აx[KY)~Xzր(N|j'IܽlҒr]ʶyg1nK$Kuub oL$d:+D R ?%moh'DfH۷nn-ٲlKeٲ92$8&aL1^ 1Nx"Ds 03.y̥:^9w*%,L-/k션 1f#)%˩ :dvaεL6㲅H C_7H\VYP^xNk-1Yݺһ"gl[9 SޫPt% y<sݩ^ezU!F=?ayN{L l2tcw+[+Z& aiVfWdv# C y 8TJbjT-f m6m?u#t?3'YR`9l"kԦ kQTz߮ZY<OPcn}ud  ;|cCمdR>FdY!d,f#nL!'^9pa<5lP1taVoOP+)P2O$Qm(IrJi{MٗXTJW%kUh̷L0 düѬZ5{[KUWUvܰJd78zpm.|7Ox~契$#;f Y˪Qd.-xau4d#EٶgzmͶu\$/~XoৡX)(uPKEJD<G))= 0^P<TSvIkٞr֋wΥ֒?K= o xqdd[{xCr{YufǚЂkMk >$Y~^ϚWߧY/NBYeh"J JRdѩN%Ԙ3PcexȯY45Eo^یĈY c6''bY?f}4'>]q *RҙJV,OqhF9m2}S(]LFޭ6u$\#xv?JI tKނn<& JbVNi0^%ߜ|A5!۶s+]9/9Bh'=$wӄnj` \rx143%_¤M%b>^壘` ZTG}zdUo,5H *rCͨ(w)U"`бE:hGJ( *bjYaKFԽ˽.Tv[#՗V#r[41j kw6}Z%[5`ˊ[ ɞ c |(י(iد(\IFfC; eγO=)a 6ǗFKJ?|DQk}yV]yfX(/fz- 3+;C렪qƀ j"o矉}*tסRQ2uГ*lSLR1;Џ'jwSV*7+Umk2缚KWsiD \-95v8?dzmt))O\mVjvmٙ}f)669Gw)(:FߛmokޱOfJs|_̽5'^@"7#}LGϥn U#ijQ90CE2M$>~zzMlh[RYarD1A l Lb[NG}CzT3%󳥛2Pu<ҝOq :w@WC@]^*mP.VI>+,b|Oҕp6]dOreqL5ü6)jj?JiSo'2;n+v_uH|_dUu6ͼ&ʍՍDuut5g*>OFkaVPNh*#!qEE+')wštdp 6n3==6WaviR&"rl} =3qӿV@ɵqkc=edA9q357(ʓRĦriM.i2?koʌ4[/FCE6wvLj0 R'@c, 0)K֭m֖t,o/z0]R,tU04z>*#ɱӜ@Vtvׁʞw Kx.=AK!IrƝN?AfZdD|7AuzGPX%:ſ8֫j7RNgY}Z4/Ôih.6:ZEo9 ݦhh@[]AC1ʊR{.މ*qR^116:`@ ݹ#.*"˪``@ujJ2 ivU -J`;n%ݯ$rxGtj8d?ޓo}5r "K]1p@#ЦmY- 474h4J+Oq+>._`9wN'#c7u zqo37iq71&$!Qgt-^BY>~[j#z3hB^E.YBFTtmOSX$zsԈnVjED(o $? jD[8-Ի}/, kG >=xSwq rv* *n>t:O|uT`sˎdkCΤzNkG3iP~Ӑ{r?}fkEA]^$/7㋋FԵ.!־ԩZD%ixݞݚ$xB":uJfYB5$>Xv14e.sP>rGūj= Lu;Y ss.)vs}V=J1zka7e%upϚ<$[kuVA&S.8hejYO(CUC7Hw~AX]Dtm(,"&Ll4cS@7IUv%Y'9Iv|Ĥ3+OtoAGY:I"KMmF։KJ{/G?V*EokZbƴg)Ƅ{톶+V=LX=LϺXcRk !zMlgs3)&P: ]ă? )O S?Y9N]]M=MD$ -񼨷ǖcZ5S$iWЌu+~g 嘂P,_H; .)_{$&@9cJ^l ,9(?kiNi koYCKbsC_O':Y'L bֳ{}wCN}f  w,VlME]kudҼJU)o> o#H]tKLLKϬ[ۜ(tio-;0.Mk{tuAźC5,itkPSKV/'ִ4lsoz$43Զ0ϕߏ;GXіDgKΙR6蒙 #fw/ݗ ,!]lc+%:WIzے/F@ lk94)Uꩻt~KѺ"CzU?7e ݬf l8ɮ58 4uŒ=Q!Dc"(M$Q+}9~%U~Vlh{9d/lT~7!Lxġ1ƋڟgU6:H+fsv{EaNgin8bN41NzaΌA--힤YR0:ՠZrފ=:>g.]x={ɋk#e|00´.!MצW]H?sy)z5e(OåKF>Y{ڣ_s~:0ߩƗԙc.I#<%u+ϗUӳU6njY1F u50vT#zE GLB86wZ4nG .BQ85[ zhނɷ 9K;;};m'L ͚\؋7';(RwKmRʅ|bĮNh]6kKIXf']JiP5?(.SM*~/3(2d*,[tQIO(`w;I-!he~\j&n91je_#6=w.fWD7"a2TGQB.ŕu4ɟtѨ9Mx@)x(1Em~VfJ1@T{JT3ҖܻTBZNGWh+$4) GL#&]?nhFvJ9n{ ;Ks*[^%B{k4Go7aNm٥a58=zdϞ˩5K67Uw늲rm4r88*7/JY7 zm@z=Ƴ<:a'\q:(J%NW.W90)RR~Xc,D/C[',/SMB6A&8*%s:6%qb, }4tS kPE&񊏑yh4 H)2Y$SX^OhAĞ/gLo!q>]H68}Er o#whBJi@@PUb9)b>MK>]'^Rŀ CGV?!H((uh42  ֟MOXãw%wćL$)R%xBd2fT]h[}c4ͻ$;s|=kҸM2CQ@KIcGHnxfBbGQ(ZTňװtg/cMq6R}(pI-~af4%ovh.w(j2%K]HH] RY;R;Rq5lߝNж{И? bn4@16QOg%4z֕p@wQk^yk˘]hZk_s?frÅQ&wMLpHkU ekn#؝Dp8GNS63_4Cde~;9?Q=:!ft?r3s@3V i?3d[ɉt?W"Yɚn;vswvߊ/ /X/`dF ,Ȓ-Kr-G+NݣE7I}ZٲiD/P RvPa)R~,_[<SIXm߶V׭P:ۖVeWj RG"HB rA 6 ^Q'x3OzSV n ӓ˴K18-QS% &9+Tڇs@G=tb5œ/D\NlS8֐|1X_j2^k|<21FY5m>\gN]f>VYJt4'!P !쇣MRtPP `"CMML&) kنig6ڂ^,sawbs-j~]MpOo-24. fA5m5[OLSnKdkTDڈ=R %i0M,նHNTbl8M⢂s'0 Mʖ5rT̷j`]UXB]i?VY@XkfXE]~r;B =ZZ#2 D]d9lo6y(,a`.p .δx?^ZW8 kN0FnUwHp4qD@skP,kYoV;8j÷g5_l)eX9]GV}nԍM #L Ngx @jkj,ͷzt TGK7rI1DD^LZ'>Mfk-x{]*@c{Gfb!xshS^GwmbZye*B;D#;{ vc*uZ^s4RyQN.$rNOTBg߮z))zDiZ(J9q=̠)Ќت>əh+I9Ypqi!!yFI&MDnWh*0U-ۗ h^zC:$ iOV5F}s^;_%v_ę#[b,uA-c[Rr#% 1E4h 6]*/ Ӑa#Q1ǚbH [D(e9&Bn(y^q & ~ _ 9=]5LIe.o6ssAE?; 5r*tEr*sdP}j@K4(jKzTuˆIf@FIa)f\:-Y˒MdXv'=%0I_ V7[oI+MM 3,$y7|\T0%[<Ll\o]U0[*x}TS4rqb!"0Vranɉ+s_{vRIv-U=a@{=Gnx^3s߰Ow<d19w߼.8lre$f'=TQ9=GCHpw!{g@F.Y6LKɟ?o {^} Mkծ!_*?cz++Z{Q0sT{fK \5$`/OB` B}̊xaBd' ]kkX~,R]N* ڇMp_%%g1ڵGJڤv$R!Iq}lEM~ 64MMÌ^ڀZ%˃[k=PrIN5I%?;/Zb}@.=srGWU, 6 ݧPwL8dcR/gbZ^2u{};h}\Ppb[QdXۖVH+[Q%Yj#&K\h_,u̚,[ά:PV][ayy3μfKg3⭛2ә-VΦ~"AG3K"nrVϡWv2d#y|#SLO(zO˙ks8,YO'4G5Hv[3hijB_; OT"Ee'+@Nǣ;Gr]_Ҩ#^OY aHޠJz;%a⛭4\OD.F¾ŶC#PJ8R?Oǡ5¦%1|б_0q,}6t9z&J,ðIR $g8a=qQBtHp}TW+ oԫO':Վ'>4Ogrx&Ce-I:]ukg&HMhXl:? 7GCիIjzE>ӑnJ#uz(Ò<64ʔJbъWG+fޗ,(*nl:}pm&h(+G 7ؘnS1`ǥ>/yo SF:¿q[N{CgS3RylL |znI f؍)IVZ1)?ZXȓ!k=âgu3UfIv`.&%z}3g}CqO~Nk_0Zs~zOêqFGPa^S0:ܻti2b4bnwjFh{΢}1 ê$D5A/Tt{N8)Oeh T];*!X9n|rނ?ߪ5C|_DO:}bѸ{& vSɉ0x~-;Jϫkh OY7pEz həRO@ޓG&a{R ;$}4+opPPL9sN̽ i#l񜊲+ܳwwӘom#ޑ[w%eST>[7Sbo m +[>>AoH|o[xr?z@ np̪pZä0e ET⟪0a?;zb_Rހ.^6%^7-o0'y5^~UWK';xqxy,&_M9u6Äl6yrQֵi'=ܠM@69 Co6=g3ĖƼK:}il{BR$ 2D_3q: 0aLJ.e8+*X%cW'\#*S@!;P^&|t{aJrDIܕ&ZP`ǔ[KnQ3F6WdG|?ڤnUqRDZnm+D"O"P@ *ү e#W%D?qRI m5,\]>fUQހ*`ei}3W>K8uYG. 9o55]$bb:aהtATzxPD@#U !iOS un71XW5ӛ]{n[oԫ 'O`XFd ~?Z!o`0LMKշ7Dvw8Um*vnz ]8T;z(tC]R#ey(dIpX}gvf6rwn5ҬB]l dH"H| / "00 "$= _ h)ecHtq ZRY%Z4ޘQdI:LN5/mafꞪ56UWij5l6⠻h<̋үqj8Sw?9bώ\UȴJWUvfד͊2.NV~ȃRjX22^bmT~k0m,Z U/p4&gSP358 ؾVgɚsPes2J(ЮM);[vZ?zy,3MC="7s]~hOJ)')ob!]jS't=tJV?T jQV:Lam%gלJMeqҒ+X+.-hY,>s7j[ke3:p{ApY^ aղb1$f֜+Q2w_skZjWCX}0/V2ܐ G?S6DZ7mo ޠʹt{! L/v,NkJ3)s]xn5[:YUԼIṪ19k>:/Ǖ UA3Mތ:9_μ/pSr3اG[J*`9i/2=durn8lɣ/a3cNu'Ō@I>v[d\J5ӆ/fC6=b\ #C7t 7Ie+ymiډ3g"aI) 4xN!'lcnZ"M<%j[Lr.Ogͳ3վFY+%-V{y#{c̱>pY_d7^˜gwrlZJ.TK0~|bTVDG2iCᦓTmK+{9;9|fWyEu},Q墠kԊSB^YdN[ylcWKǐeHHC:CԌ!N+T+QӰ(n ['J3wb`Q{5եm.u `\;yl _4o2NyԞӨꦈ'͓Wn=ouuwu͓bv9o{ECd˶|/^~hcQxއ|(]oOovϔi#h=:j3x*giZQJWԕL-uz~=Geޣ;qOSSOYzڪ"=ie zOΎ1o{"UGSKSej5|I.5w$mCY߲ʹɽ54|8xXlxj²Uޫ,;(ͥj ӎس}aG ehXkBq'yF?!Gƅlja @&?.6wyOz[Mev\SNۏ<ՀQTF"IS۠EvNeWb"M{¢{%TY}!0)>)}yt ,\ ~-O £1N !wH P۸|bHOsw/9x⾏ '0s~ӵ<kW9m OZ]n-ݏǛ.1u'IH={u/(Nӡ srkuYwGC 9?fun_sOi40Z|Vu }̅y??V7-lB̪90Xkr?<$mlRdv#7yE}:&eFJ'ἶ% JJOؕ͝Syn5˾5ӣI@Ѱ.juq^2`~[j TVFڤ|n%Okˤ3aZQŲ#/rGHB}:KH_6hTdcHR*zt."KA<fqcyicHMGT_B9(}KO hY( go?9™X5nj-B>i]xM&謵J%x^v*IP"ѡH8ZQܺ&C Qw(vmwdf(GR=}D W>‘eh#DL*9BT WF"Wz&P;K!lmEmuxꨈ7uռ%-e3%=-S[ǔ"(US瞶:*-#}F79o ;$+kwBDnRJ. ɏ *Dڴ/<ܛ65`4WTI B%&E04;#@ў^Q4/xG~Knͺ)RtI$Q4ab)({/KK:ƶl464r(eB2~6/jXZYlw)9-\ D~)m¦vaTl$.Zf\XU3DĹYjq6)[Ӛ*IǬ/&ڈU9~'9K!8kH?aYz딯wJĪ] jGnIX _MIΫYj@KL/w 11ۧ*OлYʡʊrDn,ιeFIWpPP }aKM'9~U؊+\_]0ѶʽLOZDV,]ZW/ВjXl 뢢YzTYK9]AZU]77?~\-VbJ%OH ٨‰OT#NJG{zF:&mXMNӓ=f<5V8C:EQIA۱s[ ^mSyfO*U/_depu:eEdG!#t`gɉ$ s:qgh4 dZ! YZ}($r2"d=oq5MJ4xpA,WA[}Mz@XLd> ){P&HEN!Д(1G%jxGRf+] Olm0/Cqch|H8axۘ)8T65`{q)NKcXB,ܣfP VW~%79,!Gme_1"͉19iq&(1uH0#g]5X3nS>VU_5^AHP?"d-xajpL]r].xuBBu,lMFdrn'~Pŗ_e8{G @eyy+ ʖr vjzb*~94RߔC(2njOcNj֦<#$:7zϖQOyzpM~q{`%K持l]u4E<gwpWtXg]R0`Ŗ23ٗ4}o-ߪ4zf(|Pڒ^! l'LP،C&Cd?\/l+Juzk`Ӷڋ1!-Yj9+_;YS+?{[Սe3KaX6KI|54 <~XfPhT K|B- ;0?H8@=kά}B{'<) _HLc%'OEJ(uv[)3?W6qH (L@y)u444%I"ҍф#|H/AHoI2QK8W$0r.ٖz,.H*Wrhg2 '@^@P"@I {Qed6] ?.VEʼn =f> ].5yOD\X.xP\.JX Ec l" -s@H Ht2{'KW[p"_vLY6ۤi@KK>lqoߜ`.jB~^(rsH g>aBA%I(h)}WINKk0#ƲD!`(#p5ayq#ci,WFi.$CVFn^H=2fˌ>rR*~r zbG|;%FN/B@{b's^5qTS8/*U3d0#V"%Nt:8YI<՗ڭ9 WU~.ɿK Z#3wF?Iȡ&J!@do jI[-'edf/Z:oWWPcvw/k+oKl\/5Im/ Pz D#@4r˖QY}ۢ-m2*$Kռ"C@.vǻ[ D[GSdjs&XεVwخg-2wCƞVugoQ 5q"njF/6I PXFweB;8i? f/V1<1 9DբFS$pgz *kv˟je%+{pjY10dEF ʓláuS6Jx2c=;1~p=Fٚ7zu@69hԣz=8{=#B$"vcm\^5`šchcؽXuQ[ފNbLlînzlf3ʏv΄E_9؃zCvDThuu4XS^u\u0iȣ_^UqIvx1VSJO)- 0n(=F`gWarjGR'%Y [!g yryJ <;[d> SYqT%lTZ]z5RR;`k>1Eq1oq2:ۛ̉{H- ~j闪u~+{b=x㤵F\(șmxJN rj6%?|*Кmx(C3=&!H,!zX\~Fɐ}#y5'ٜ^l}݊ r#L܌77CVsĵW7ٮ࿩?+Jr>$” }T:^ESD4'/6BwUU8!194׈:o]!*/F_YU\O[`r8tWuG"د S=bs`/S_2H0W[s( |VSZY}Rٽ$c{y[V)|~~w8!nv(Tg$Mvo܀PJ7oH`>v~uI @ ~2nٹ+pQR?ɶ=}n]Ҫ=Cy4f۪Wx0CnVw VWm%9Ivل. zvH@D^n+_B3)w2yyGӠj٩V'n]Ø惍cQg}e&(2guȉX|H%īd:9lM%$6äQ xݭ0 IIWĐ$ز.jg0TSDYTo?̠/CrJvaBECHްFBdwEr 4Syko&]b2g x|Za_ؘ®k쒞 ga`҉C_#>UHJm"  [=A !c,bIm.__$Fll#eQG#A2kt\g',ydȀuƅ,p&i%(E$Gw\^ų*rvs|I ]./hkֳ=w2JQOI%A眣>j㬝8e+?H:q;Eđ۰ ǮZ|ԍ#K#dDٍg$uViBl=G;dw_W ΅&z%"ʛ=D f{FAg SR|gS HO Մ?o0DsKC|؃W1funjl/fF,7L{S3Jy<:U=v0,h!#>o cSz:Ԇ@N@ZwKmfܦghsU "@@ i U }UkbneJg˯̟=L6fl :mg.r6|&l@jj=b*Ͱ\7-r߈q˻.L8ўOt$w:qH lБo ,~0c*@F D&nfajK.4r|6D{Oͯ-FYڐB4d;g<8=0cu.W) mGI.e7;rf9{4h~E5b/hDH7!MO]f!Z.rު6_tGʮ"/xԁVIxw8'g `սA7 54R E$ M%IC8J$7Yhv,EĠ}9߭AOIz;}k1a6q[g~.Uo o3OʯP|瓅ޠQxRXC\:e8cPhdKinGdLFY Pߖ8am x0br=+AQ b9>8CQ̺bD>6&[u<xMܷkfQ$Ԗ(E.'(ď<8xO Ss[Bj3eE;eb"l]Z=_q{DU)twwSW} ]¤"O;ėyIWĦ)7V'/RJhtLݎIP3\qg$WC-ebEly28ƸÒz+'3ub͘*VklME5΍hJ쀬FctfZ;Pfϻs{QG2ш߽-Tsוk]-ݫ6kh4)SY{^5{ wdpZasĞ>Oõ"eܴ!rnȝrǡ?cF1AC&q8i)XbJsc{%ö~JO5NB)!^Lgm/0lK{~PU5stIgfx{ƒʪ#)lE3kM,Cbm8M0>'ōCQ5?5R̺gc^6 9% I?ÍRpj[0+9ۚ9VYg;$Eio݀(՛Jn[;$d;B] @7{3i*5i1ٙ*)l 󪧇SL7Vz2柧mx8C6ZDZ-{%4f\2Kg ϝE ːHA5]^vwz2tQq-76T`O [hf"Ѽ(J.Oa1J<>4=͒Öt8;pLzkNd<ܪ=CQ͒/|ɫ+>n!B̢':BKmI?uGM S~vXo[K?_x[@[I;ψ˛n%`@͌Wŝ81E=-KK2̣Fgm#'ρ>] u/(;ֳHɥ&$”S@Ux 7>JTNr{Gnl2ܤҘ6(:r"*!Y#[Х4(n.,s-vZӶkjkZdMj4d=k4QQٴ :=dvwg$KZ͚N͉vs4jjeg_3=OO'*+lb:5Ij2!EY'5zc&Lnq3z]9ެaԣ֞6֞7Gz,|zΣ)b/x%N~ ?t;q5%fUMwox&g}uqq X="©XOI^kӑD\jk & q˂]bǷҧ~ʐVH6 qXUKvqC a^!d ҩh2nq !L<&+,bOZb2^NdeHL.{')!cÝ VvPȏ~]iEi#ӍBgU1fR`(z'OEcjg~D#+$P",F55uy#N ~ T_/F_ %u6GR25u7"~QS𢘥p7nK6(T'H4x5|z{d g@|06dȶ'o0?+D4h>M|exuBR%Cʢ &k9H -7S[׳iTtT> vCKMMNn',|=qIc+P#jGn[/7L\dQqLft׃1g1n > ml8OXgܤ+iPξOfyHOYwX8c= l I$s":k V$陚] ja0ܺчm$ͺd̅ç6bfl߮ip,TWC-D/;Ur] Khleaa{ ]/@_o@ƨr,MY Z]'vxVaba|kǐ$a*hx߄Z! 'ˁ|p\ /)|[I!JN' մZA6vyb2費:"6ܻR/%ekᓺைME]E}xEP|yW'.ýnp` =>ey@.#SҬ_naV_DS~FboӞd+d ؐ|b/hW1O˚ "Rh$k,DQϗXk*~$b7p@43@3U i/H6ʖŒ6:vmضX/`dF a,ɒl Hb9K]nl/#ٚ{ amM ;=*U5l:&"k(ْK'g!|Ç|/ PCW4{v{KvY2|r3%k2eLl8aDh<9<9DS2IZ1C# z͹1YrkIL7e,q2r̡0P*So:k TNfYJLˠ.\|xAu׿ݓmS]mz:P8pg=C8g,vЩ`+9(:)u}jt͗c\ yZeycP5+dږ(0Sq +ft)DQNtpZ=%ՙ7i'{Jد0qCWʨ$=9mkS-;Kk)8WZ]Xv{-曨Y;mfj;kf8ԤcF*#jdCM3'qb2+iMBm!gfku~ܮjutW}N-[ضkDW˄4'okgVg?gu;s1Q( $ֽU],t|VxfV Zʹƈo[X́G1~dؾUҰI(MMxW=obXXZud[iڇ9?33Fp{!hsD9+kZ4bO6vļCk3R8Vm, . /8\; **Crm/6l?S"| 7(bLcv7v8(Nayܳgu fMS_1RlGMcuZ VUq (::>OUyҼ7>HZ>إB17auqө(-q\nS[rk=s;ʷ%ѩ&qȒݗ8n14oM.(b=ם[N 6+rb?=#:U~|3k %MY+ZZ]${ָPFޢn6bkɽ吝i5 'x~0,՝ݱRLݴ [[gw2|VbaK`N[FUiQv/ {z"F F緸)%,WAZf-vw?FgS. & JteI4gZ5cRstn>`ir6s9mD$uv90EA-Xj!_ӣsu X f|}8eH]|!9ˤO<챺 : *#1<&0TWN1HRנk<@.^e>sKȡj~孄FhNٓMn.vBolk8څKkJRRwTrCGJ݈^R|YIZʝǶ8TS7Ssr_Y =7LyJ2)Wqch]ߤԧM,_%'kmSXQT/^X`+oR}J_wҮ.mxI;*Y5C V-8-AN4ȃeqӅ]:?b,{9S55SIWPQ;-::MnSL?4̌_gKtYC8#9^/AѵOf6[.J8AHIeݺ#i׆xmYt*˰Q y$^!Ls]͈&u ?nqp6s77+!Y3VѾhi?|E5T,Z ?N"׮Oڜx V:G,m% RjHTjiCVbGWHWÙR-"6f'2b#FF>pSsXSUNBsS3e%E,,Y+uӄ Y&\e*}A}2ǎ4,$W_~1ΖR{?UGt]s@OaXPʸՖw-\B'Y@NB {}MS9sxMU^Cmi:?cwSI1|VS(M2G& 8=Ɓ:e`\5X-H?/P;XJu6`G_E +A R_⚝smbdCØsDmyN2MF㦱&օ1W>N:~J1=<@ķϺk&E$*3jPQ]57Em~v9OhsJM@-[)g;5)M,vgXtzӟ6qKb0; A^4#ͻ4q*v%q%Vn7PQB3z:)[.lA˧ +BP#J؁^}AmD,DVj͟$1х",GR- F\\$qSp> ֯ǵux!ےG3.&O Gcuȿ=!O0 DR^T*i fz_&-QJk1d@2˧^9$I+TY&JO 4"n!_&4-bl7ԥPtD {7|+ ?Eޏr_=ޟ+¡%wׅ&P`VviPp__C^SM]Ā.%wjii1(ɓY8W@aCޥ&8,:G(f%o\QIܑ29y)1O{d6pՌqc줵 O,;[ U d 6*`)H|bDx`]l:rH4"Sf}.Ҭ]"CG||i V) $c #<>зz#HI4"73,.>XZbc;M!iͿ/lR;vUG"+;$B|@Cd@#V!{NƧjLnMq&YJ%:mu;)?`g3?d!@$)VΒeuv^l̲{{Z߽RXݯ.Zx^j3+_kemV,  @{wmdv#֜6M.+A" ( < @P@ba>|jYY79J-zf=1]J퓔 f8iiԺ(bu'iC.Z%MHӵTFOp>1G-EF됣նH**+'Y4<I#XQzIg')˭6wMSx4dg+~( 93TONnrN͞-H0d>J=q9 +in;x@̪Q fr wCy*o>ϰ9+srmafhu6Scmgzc k86e!j{+^Po&^?_^y`(OnYC_r% -FY?M~qs%iȵg-6ۦm*:rCqɺbDnmL>`efI) ܱ[h==-޹.A05+|pb)4 I;2Wۄ^Nb%s7NGT:Kjs}wR:Oe k0i@`S79WßlCJ}SV`ׁdrrQ55нQ.|WIrrZ2 j8k,i8i?%53Sd>XsT [k*fI/J0&<0uw9Նh4s!%R{3ˮw3A7vb<7WB'P!'gjQ ۫wT-5jG)2R$ʓG(_H&%KW'-^eȰ!ɱaMe&*(c'r&ܡ4ȧ;~2^ |*pД^F9Ŝk&=һsڍ;~PXTAi. 2OWW3s %=_Ap4Ig4WKG}0nO=x~߼ڨtbmlnvߞHa23{]_dmN7e6j3aܬjjn-65$'ߛsz7⭝g4[dnBJߙQ?T;L i0 ȶz{*7gDʞ5!$dx+qmv[JfT]ezD6%wF.mBq[l ڭjWw-n `vvCx&/c}fAy:*r7}p/s})XEx) Gz#T>*ӱ,ɽxĉ,^iDg։]ֱݗӾk' ݯL|oyNT'Ԙq3[QU/Ez=4(li,oUnVpoG%+Q{bkAGRLUGj݀i )5~,p.A_$9Q̵YQiDsœ./ gfZcbƤfr&#[rI_Y.;iM5b^Nxƌ6=ղKYm@qJOWEcܟV0]^E>;ەӖ+?"U׊Uco㦪:c1 E0V:{ Gq&>>̧2YV<6h˪[y6Y;i:FL Gir6W/F’r!&RZRm "#g#J++=AQC\u2rvf{$Hj/oZ.$uZ:i ѩҲ1oG>2ʞ)3ͷ|yF(;ɗ^읔pC՞.si~\ aD8oXQ2!{zɥZUrJ%nQlO";[gbMTys'$xz}X+aqQյ{?+MuLѦ /T27֕bWnҮ4Wۘy)R "~/@=^?S>+xj6BէB hj͒WʞŶ"c؆F5.1lJІcz=mAEr-a5Xnj%>NY}0~ >#]1]ϸvM3Z>JGc î;w:JTƁN7 yw 8TT0bxwhfW4v!K^ѯrAZ\*;Q/+1g}1m4ݴ)Vm< h#Xe/ǘ|Ӈy߻FszNVäjҴ8QG.n$%JoEOv_,go<$y}P xJoy>8-%%VɣtED]&0ԦuJUQZ!(!24Yj܄AWCb\iKߠHBWhQþv-"_JMb|<3q-F M+[eDc6`ޢmvl\4C=e~J0oW9O0 QJy۳MgrDfv:&i3.u&)Vth\,4uNn,g G1:Uwm`%l^?g0jJ qym\ּ5R PZnCkzƕp:4-Rqt7?+sqDj܏,Ĵc<_CSKI~ɯ#pΫ l`Fn_7J]ktmXXԔ&=rjnkOq}ds0槾G={0cp|g x7׶-ofQx*꯺lx?Pa[۩,̔;ʖ|͂[[4u-qɯgdW"Oz^ F<|TkGH\#rnOQvdUo藩")X-YhާR~ۚO4ED*α[i۔~UC,K7lkxЙL;AeyrKTqCSom%O퐥A77G415Q7^IiU5<Yόt#ågffj}qe\pcT3[c^R寿w;sQ>vb"~5&,uBkzy>RX1:'2 7r$Ha&%E7C6TEKi`Ϸҕpy 1hhz%<\-y3.wSC>=yZQl\17t ܓjCIMSzQE旣z.L?QՑk'p9ux94g?g)d5' T"2#`B׫wUw-A%fށ2&FɔLUW>gڞQ^ [vԡ tA2u U֟ћ#xn;y҅ *% wsQ9TL^ba'J[ NEtdIs)ś9R65ȇe.fo%HhH(fsf[X)vBi==)%N~*0%ge>M%Ųڼ樎`cڰw<B}%ĔP'2M%ɕ2:!wT?7@S~z2_بuivPyfѠt#C#4DEb7hZ\g'B=UžsrI^MJz>-kM>)j nUĥ3„1#wg sjl8rƔtL8,оc8a8[aOb,|>NM4hzn߳~z^\-J~f:HDYdŭs; ZI['i)JX v-,8Q BՖ=EBZv+pPc((Y򅭅"l!1 ="+}pE}b}Ch*~:v+Ri\LaXӽ7;rPʤ-Jn7'|+!/0b\}ҮfZ)g-AE(4+S17d/ h ]Bp:> ;㬜<ûSa I|\vse0gdE!?K81iޗC&I(Uܵ^FL4v9'(QVUg9>":07mYvB/ļ)U<+Mz&òmӟVwȎ7x0ԵHkdFлjb RJG)&Uj. IC ﺡ/JJ*"59pETf̒Ja_K$)%ZYz2!(hG[x{g%cD_p܊dy㰥_ [U(^43 ⇰唏u9$FoHg{GA@ ~)2'@pWpG6x[ /uI1?mHU|S=`q,w1`5$c$iDxl$g WVb&̲ɌjF92^BzynF`E,"ONhHMĬ$|{C?q %"P|/lX$/l gxC"-0Q9+~.,}~%EnI%@[ja죡B<%r{-Bi.aK6)vj+J;w '3LQ^^K9=P18\Nu H wLS]*Ր*CZ$=bu}W~%1y@ks\y#~~wkcI#xmiD"UU 0f^p1t}Zyx[jU"t4>!ϱS5g:$<ɟ7  bWw|$h$$}%8x$!\VU/D0gTVs太 q7"EmJ#|Z\i 5Ux86^D[j>pYJ;>lEsaZhk1-]y޶Rݴ0"]Ey}˖Vi$cMr/#ޱV&+n"T(;>CVn"#紫 |nNh i+L)p1>1~61 q28KbrtO3s>zZ˧_zYQcME!½]zTrjcqx4NZ (ne:5iM:լRwN'/~dx ;g2PMHOnk1֟jU_}BGy0NOi-ŕ&}>ОgZ<\ih,Ed%*+RewL:/Rգ}wHi'̔7;+UORZQoz n*EH*Wjf"\]L?;e/E)1 *nٵI$ob`u]xz~$wron2h7*7@Qe>c9{t f%̓{ph5.N "EE54I|ϩ未hPt]v3!Oi)o{'^wrv{qAj%eF3e\3w$7;x$y aK[wâY?,Dz|nwnntbFx S&*&'ʤ&#l.Qڏbܚ aHO{0jQȷ[5xgHM8iS~$~rIWacWNH:srhA-/(z^iW 6僆XQ>c%`l$uavֿ443NNzAvPK]RDH2(cZ3Kt(w 2:spdr&֌Q}!gW4G\\v27oGD>2[6Y1͜3VykyG|N[RM5L-pd:pP'^ s*_@Ş;F dAۛNwC'ðeV}T}Ɣx zQ3.@y H v'|{JY}+F%H*FOFA<>R]g"t1q-DIF(/&y%mWuGqbRԜ_;͘b /iDZ1Tf]ᆝGqfza8qZR#lNKӌ՟ c.zf'_ʘ9=%cc?Ө%$m>V)7&>b6p%qȊ VWXFP 6n n~8ojW;k!=O_RxQepm+E?#k1$}MRC$v?O^gnKbe.QP75\۠ZX%7k I[tUzm0{ګ('UٵIAԱKjKzTz/gx8PcLƄ>j H!;xŷS9G!~&ðc+o=a㶶]C=-h&D Cj0zRi>TyVް.$-+x&?`"p˦>{(_g >a_/1cΙfg}1pEF8+V(G1ySe#N#Y)K)bW:%oSnhy)C٢HJj&#ñ^,_/m2췣Bf헬qVeGj6DTF?DxbW3c@#V"$Jl˱4@)Bvm/wv)TM'4"``PoӖ[Kj$<m Z4<٣T^o*r?ɫھlT;:(tWJAi,IxS4C`UP`wwlv\Kdwͳl 1 < 'a=扞A4'dE۞a (fOXkHyD|t[ &)]Z~ݡ9/ŢRA9sHT|Ӱa2RjPd˳hQA2ۧ6YJws|U[ϸ=:].P߲tJ8B66vQtBPP M`K663%4ldVX L/f0yh ]jL-9 exf{$xm)ZVTZ=ZtO4Kbm)n4ol1>ʥ5]L)GH(BW@GL*p> pv T'3SyzMoj7[~B<%X2⺂|Ą7i7e0"zm3ovAVId|fYYޘٕו*_Q{sZQzDnY7}+7R`OJKUlI #\B FRA)nQA8_pnx#y7*q>iN4߸=[ N_VLPEvYHN,qD@kP]⧢;Xjo{/)zž2P˞eh_N?$P sK;֛.['-opiԊ}zҘCM]лD^L> eQ%ܹJ]"vTPq(@򅘕vQ?s#{=zXghg; g{v*bikjqrU.¬"%;Ω8s̔JLib-9#pW/"efr1-Uc>Q9UBܕش8,Nm8ӸӎDң}Q0Mi=LvB۟u)oE[H;D<4'FFUΘ'-t+^[ؠ*J.cսx]K3^n\߿c_dS~n4ѐG|EE *hȒ`S砹 dkX2Ͼ˲y(]m>ٖ^Tk+[$;`ڻ^0#ԁ&du'x4X;ncJʒj'hbKdf}鲙F/T.KrhrѢ Y{7ZsL6qxC{pIFcxL.5hp7i xog)ew/qSs 4K cKy[*}PlџYh10.?(_BӵQ1S&NugьDb9@¶K o@YL|%|e"X9Q k^ûxT.7C*j'?I?b18w׼#\Yǡ'k d)1*ova'qB8q{>%EQ›S uy˰]6Սktt3ѽWWf Q"#2|KOuC*!AHG m]8`shS/$>c /zK,dA7/az8%i':Uֺ}sv,} HϘhd#.8$?#_ḥ=#B׮$#kEOY}%GO[NW[e@ŗ[Ra&#/3/;>jljH۠T=[1ꏎXo|gxljm[֓ &ָ*$MTUQQw=2KD>v襥eg?FuEm)l'skuE%%{e% k0 V\p\ɣ'շ:, ^"2<du^g6}_1O}rJd3WVUn¢Xත<j\KwW7%ğO[ZLuٮvxݞ@iT}x{i&;C4ID%%PziNM'|yڟO;HaatғѝS=ג>8\dzybdKl?` 띠k[tޤ 6jjܤH[p7gG:N&R;gi~'$GslG"M+AB3| hOakv-BSϟ`ITI B8&&E&8]F\/;gՏɉA.8C K;ʜoLɠK3I=lqp_ ~Dt,|dlsjw />|"k{b.$pXCk6Qn9+'5v %'qZo_-h n@϶hު".p;B>NlKv3(ŭ,UV@8^)&I3_xBknMYم( qDQ-]Y2D/4 *A8Rm(ВaAqobK D/ۮ,SCj5fUA~\[G\=V iZ!a:h^*O-=wG+`OS[|ZuMPMnri腗aT`,G;`񤚮=?GvKoH_="95UOڰbέͪ=0 &?"a?N/JَDTa7JZBn~)%~SijI' Y򨳂:,(ݥu>;Y* iktϜ򨒢+`RwXVh]hԋQ66uF vJX+O91pZtr[nJs,Gy0AD)N *3oΌK+V^M *@T\%+(J:@z0cGrVR^,%G9AmeZ6 riie(8rQ$gu $6B>_SUfS*<qW\HW6+Gs+q.) xKYAzWչSem^Xw@\yձS: &vS,6)gcm3,kX7QPJK8`\ؼUfc``Ϯ˻mܴR},ç(nlik[?7?)?;Kpg<4:Sg8!|o3r}j@PsS`e8Zfwi6YKrNj]`8jBD)tI6rRoEC>;EeKxG&DC.3@ղ(6 `ME'Rxe6ƿ&Uқ]/#lOTD֒L]*5sոp'[ (-:C2 ,(}T`v<+rGBw{>I|pi+}Mq\qUsIW͍nTl>֎}w Q|{bI*T"8OѯNy\L뼞7Ip'/6yN-Ǘp l3KeQW%@D`l2#xW❝K>Y9ˌZ³Rܾ>P긱oK3PEOROlv7sL?nZJ*}3=Oc}ivp2n4TWCݺTaNf/}b;T1}{Y{3@OV- !V$ 8hoiF Tfζv=:):ږy8ϻ 9t֙'h^mt5&q@st=?52 _H~/m>2 Oq' v0çubr+D̜UaUNy$Y0P\$b7.5l nx;%M8؇=Ïk+{)v|&)}+׬ Uqt?u>(&UNT' Q9.T|%1v:kT_~Gi[f/n @Ѯ:U; ĺ8\EBoN|ijQ(Ol_}kW yOI|]c[~ݹ>8H=׽t(J=2È-H` 's"5hC)E[U н,guDf[p\1.64g+ٸo?sfm=nGN wD#yfcLGӹ=v熔z h"{c}wbmMRTB@ؓd\TB$#lɀ>\ϓ<'fˌiz !5id9HUpDB%C'D4RODϞU795'N]{pr5-;-^$c;l`=IOd-N&=INX6{LuNؾ N'V$yޞhtBUngmNκ٩='UuϻȐ |z`+DH4o'-] w!OnAb s!1É[> kG0Tw8$V8 B7xL<[2UNN.mM'lאb[cF>'j1rO}s\ l('&=ЊDN0lT1HoTu:$7鲵`mgL*Ś0UO, a5NC03U ;Xe-盓`@qG8NG[C9$[E 0##wF?m,@<LJej7٫voݶ4Qvw:Em[5;](jM`/d,$x@hF }KXd2g+P[˱j%jȂ) HqABAD \pMӒӳUȒN4Dbtt l FؖjԐONne kH0.1J-JtI{U|JF`ܦ|BuWCb 齆Yb/c}gU4F(y`FGtUfyGNq Z,aNhf\_튛Ҩ|彽wv껭(2ѭu"Ya^}L]hD)FFƜR6Tu&BI@[+o`F b;_RBkmڌ,NϣEuC؝z4tWϜ[PZFPޚ!-;1$%!<_rwX/27|LL*>WmK#ݽ& )vXi/ ŪUmm)~H6igiY}4w}\lV8Gt/Mmjor^aMВe;j`#+J8rP%|KR⪄ثw{Idѝ%y1 *l.3q;]L!BT ;á L|gINS]Ch&x&n$|^ˏ뮵A_ECKVoG7\bmX͆^Yy=p=`a(Zc Dkh+'$UNo֩hѡ0>Ј+oy/D1[ي NS2ޛNnaF| A˔ >%wH)[ CO*B.JXd[y>z<[G >?;7H0͑nG_[D7s׾-8%%`ȣJx耻ְ֤qB,Tg@+zq Pm?g+)?{ͩU$*UOTSS퉳eg/QFR?yE >:ln^ĻBuf :$;U*W(GhZ-B#-Ă_[jbhx:/ٗ!U8{ůDt4ZЇS V׏*&u((h\lbzu٢{25萱~tcv(VBZt;IYfZdWj5/hjTHi@OHĪ$!"%>ju`To^I\ 圪RϏR%)~,e)rU94X`aMi8sa(;D+%ӳ-^P{'Of]_pq[H-!GV❡h,%~^Y ]|v/Eis!6'ړR>W_K1N 4Z+R%*G=]n%IdvfsNL߻d9;im^P^yOrv.!oۨvr,2<]^#~]EZs =Ecg;F gc]3$07$SXx,;57j QX~ d˽͎#'?/n' 4 '0db nD2r2oK7=;1Z)no  |? QR,ѭ6al=lP2 V+ pbQlWYEMjYoK[W=~3ehÓ6Nj~KO6RNJ̼sYBP7=)2 & *bLϨG!ɫ>zUvuƷ̋2@+H1AEgqcMQ9{^!'+jE,G"$ ytP4&ccD~GQFq;&{cDxߣ ~Wyapkw:FE q@ӧ0blH2 @-S»I2@,6TZt.4Vgq%-1M M<8mIϞcNk/lvy=N}J058q|8\-tSJR)n@IzG|%.~P]TS4g;ɰf=ZXh7&Ym/2@n=WC{mGЛ !XU9VSSl!Te RIRa ǓqoI:I0{JBީފbIb>e[n|S)dX=C@3c@3V!f9;|.GQ#Ui- Zd9m'픵m(@a!0(Rˁ,[ -| * $V#rn */SNn6Eќ&NҖ˟,G-CAݷ]fݸڮHۻڵu\A6HB+A*P!| 'U"-WTJ,45S^(2Mk7Yd̐1Wj0-tv7:n"4m\~*Ǥ| /ں/aʛK®oԻ?Rrsq$`5=%˞lz m$ixP m򈑆."l-5UbK63o<ƐVsS_E>n-YM>O74q~ѥIU$x!}kM^2!Yq&m_ B{s!'I~WAFS2Z]q@:(XsPBn_%hr]˦T}.96`xBkZKJy3b%܇h4YsBΔ pG- kՎVs Kp~]L#oF6looPWtLur~ F/ٳ@R(~^1|֙_Hx=J<2Ӟ$מ2:#esXKT?{O"b\nC|R&wF$?|IBRʲ*KW6({ o&jJ)€TobxJ3\v F/N9q.78^՞$Qt6l Vr:U)eny/O~0SE.ZV/<3LiFp^Ni ywI_z j6.x'N]J|vU5z>T b%qSuVM@̉5JW{1r]2~J(KOJUh԰=\<̵"ݖܪ'm.hzMq6XٵZ+~{ֱmjHM!yu}Fن^Y0I7'fn6EVgcO&Js$Wz򲟾N1u,E#a<(w*tSWAGucD=q?* w,TZt=drX8nT6jwjҴ7xaG{nqQyW$7^!Oէ4fLJL :?er^=)N}hJ׭L zR9ks<(UM0Z ЫR|7^OEq ͈wuƔي Z;qͿvN6y;:Em+WfbI+I`mJ@6)@Ig4homVPD-$9HP#:AP<$DW?s^:GA@J w>j6% =t|Tz=us1w) F%A&]?$si(ʱտAU-W1uEL1,pɳs-窴bw+c˘GkL\d> ߗ`=6IKpcZB6G[6?؟}',X>LB͠|VmD/K >:p&/KMo&BF7+WINZGZmkā}0'Շ oizv I+\A*-eF'ܣiqƾ/YI1CoԀ~(>Sc`i ?'A?1~00<(餐1zW1q,K*yX` ޡqjhttltkq_-oŇYGcؿ'rS4QT僜%ʉa??]CÉ^`Cغs9 H7]z?D&[ӣݎ~z(a j#4ѰĿ:)! 8+5XRiÌ\L67'G>N/b0Dc@#V!{N5Ssdwub]w:eޏ^uwU$hDZ_CIY6%,%|\Ҷ$Z[m;GܛLvnj6Lr:ЧAL%O T)~{߿{{{{y[mjՠQt) H q\į"<=Ž&A";, cShv7iO$Sqr4ٰ+Ub8 8W4it! /Mb8I *Kd.dgIg:@O ,&=N`pV5Qģj`jpwr^O(qfzA7'^uZ!OTc7jb|M*zu kطA'rq.qlS䏝m V),ˆ񭒍hl.>1HݏM|Jh3&t$~Q~mS(&bfC0w&:ASl09QnոC@ʡcbDۘ'}dI``h:;'nJMBwM/y%tefU U-3u;hWRlc![u*YMX^}NkOzUyʻFQ"ߝGL&_A7d>©$@"g%wTdrL1#1Вi)I9%IMeRvj]pqӨFME[gE d- ϸS+L0]Ex*I1nNjGMp2R,ҟjCem VYmNUwdy_15xP[oOb+<Z;νpyr=fr4_/ s-+G.I yV{!c͢B8,gUee2{q.). 6zdvcӎLDLYwk~R}8Ɣ$C^sk-1w* o-dD78ֶD\@6A%k vVaAl +^:&Hm)4PCn;QXM=V2qjC?sJI3؍K C&߮~Q1.J+'@wtϕ,(kSS (9Qckד PG-uA@PGD5sqNmQlo&W&3*hDrrhZkɻ q K<>HSYNm?5t5g^*Ou\6'J1  LV$i훃0ɷT_%i(L[vB+ siTӐax\HNghNeF]r'RֲnZg":@n3xn% e.`2f窻T:UӘ!@y7&wOinr^}q$3EXbMϟg19Dyo xo\742HۅmEhN텗t}/r;g9}dmNT.:O\79_

j^.G"d*.rzA/L0 GG'b}LBI[c#=6+j{La`Nb NP+j)v_]JQV j~Uj*t9:DtJDy"H!T(Ԁks+5+BepC[}m]*WIs'imWFg%j5)txJ[)(AϯB5M@Ct@#V!}CeT $88]ɖ5:[ԫ@` @6]BBOJ$ؔv+]ҵV]+U{.ڎ +nTldV%. z#bUW767ZmU^ZSGסĦ( W#|C@_G|eja,1f_aVaĘn 8c 5BT5sX%]us3,#~>AT-Lr p6a-ZӜDYU[!zXv85% PibݔmmR l_OʎmʩWWގfy[Sɚρŕ9^S"_lsE]Q)58H|lZ?wtHTu!Lj8瑬vײgjSW:='%uO}?0&q}S[' Pfu#qyۅ7xCW6Pv܆pV-9V[ Nz0DG,Z,4 I30F=a.&4V&͡qBd>7Yj*ߢ`=/`2<`Q#ͲvWSDŽn*(7!ij'EIN%u JYsG\\ʯ-]* rR%j|BXgEoH ZSn:jA)!b6$.("%4FvΨo(.T1,= nϻ?u, w,mI%#~Ӆncxok\ۓ*F]sW½;?,U5mu}M?|؆lPuLKcVQ4lbVO:Hv}Eߐ7Kk܁+Ndwi8=NUL*;K:cE ]=#/Z"͗O,vʱ|j눾HCmo{blx|1RO@W%[Z %{o&M~.ݙzVgaA_mID뛅 lr]gPD[|[kGe.eB,qi]%rKH?@TLOEĪ$ " &`]G~_>E)^U+4 jweX\O2m:+UB3Zʒ{ڠ/V&ѠVA+9CĚ,tߋ>t6dd'ecƛĽ%m5v:+%~ KX=Nүw9pvJݭD*1/HnrZr@22<<$뽗ęӏ⺩* ѡ]HKMS@߻бnm}c=lQ$]gKnJwm W] 8Mo.1n~2<\E^&iɈr3{^;v{gٴ^LDVB@U;I7K8xǚjTl^bd?)~v{|lj-/[Z5/d^)47m2$7`@𡘨ySn*R*$ C;W 3(,~(ZŖ'Vv`Ƃ9 Nl`~}6TviIfdM؎_ː؋dlжe\f2 '(6u ?7Wk8s<|Dsjs%FAλOl1|F:Q(1g$Pv X)݁__-&؂Ѩu٘wNPTt=X9eEĹgli16'LeOU8e4q Bbl_uo؁0s [p1!TUS |^\!J GDJ5eɀGpfM> 0 %Ot hO)6DS\ɀ B= īS)zopH\=ݛMS8ZW$E@7Td'?ȿHɨC:çqЗ")Jw2^h` p1H9%b8z$>OCS quH|=MIS1QC 2dNq3cH&NC@#U!,;066ɮe ]bSˮduokoݝV Lsa=+D0!Y(@>Y32 ,UvlݥY-{ofWh칷wcr2ΦּT[nx-0Uœe3' #@XDj wmw\ڔQ<{jRͤ"X1J,B}‡7Ax GW?^\K)9K$c(q* WVa/Zo_sKȹA#,r%1i1DekZH$E+ͣD,4-&F vZ<ض*>)a7(Rǀt#y[[ ֳ{kH(;dPeRѡ5ԫش3! Y%XpYVįrX$)rNdM(cLy}Jl??MsT-Qמe_6'.|jY$*F显rvW.Ɖ=l fS9LK$j=r"r 6vQiZ`lVj}02مiU65"T`#Գ^XLj[ķdN\uls{A7͍#e}V_sy҆3; -gl  qEF %/N]]/x m?lq^Ux՘<7>wj3ڥgm-(G·8jd8  $1ߙ`ߚR6g#vnvEΡOA7L.­lvX#=gUpWhkbӆBd>Ӧ~ѽu$^Tkkm\ [/ l تޢGx,%eOfD;1/a 4o2Xz53x=3mH fTdk5=[M*8t,i\.b'wYIVΛ_p2Ο8yZ8lb*a+xK8Z4MZQ;!x$LGN1aD$:BѹєuKJ<E4' r>%jKDciSߙJ#زUQRt:}L,L?~B6 7KsqE#׆9Bko/SQ5;ec*,&yS0{N7nlaE9?6d(e6`Uc+"꿢Lꬰda_J@x䭁 [u, Pc *Wj! (VuX?Z޹Cbo+Bn_w[۩͜BO|;ohw#b)p&5󡗭^^I%fĴ9QV(Ҥ9N ,@JnqdHg-u0#It<vxA"`[|pY}hMWy=G#OJRa/SZI.W h;|7ˊ. 1X)ﺿy&=;AR",v2dѣwǽ;fyzj,hnP gѫ bp=$ȦuJF-e$`7a[E 0D/\qX -_$k;jZN7'~%5_z\dMJ8 _ߟFHJu|Wf7ɀOӿtejRg >+T->Dֺ[1@ D%E F}~ _bsWiVe/7N}~MnIjH2Lo]~`Ց'al?( &p-O50YȘzu}F3 8?]؅ka#)$^ %h] ˊqUSw@,1.P[wL7ȅYMYR cQss"U.e1\b?1&'lP0I*4D͛n0n&q *MsbQa&w iGgvUS[CqA5hw0^f~(g;z3g>:8Lk)*W=+ASPQc|L` #B 6%m&ƲEFmf׏@!ʠYƿϧf]PVFgU Mq8׀V:o#;QMN$&Srw;Q]|!y49¯N}Qc;G2~`ra- UvP9,LQ~&VZ:ҕP*oc*3gKhh0+\#|'OBa}9P`F{8K3%p1]ϩלi15?_ 0Ag`7G"%wVO{JR!3 w>BYߜE1*P|UO ,JrQ1z!ڞ%^Gp8\#RI9%|sLgK!Dΐ^E N8hެ9:(Ieh1Eq.!]={$5;e]Bih&E ΐX/!u P8eO7 YsWuUk{ݰ+<ۗA6:Q{8 C+&?R?.i(#RLŔѕsjsy:=-U02v&eQ%7drzUMU2-M{Rl9SVԛQnwڢ)eDTV|\|#G$g="gssUϭN]J&Cйɸt@oV[N6 ֮egZH*QbbDsvoPG WS;sQlLUzd-ZK_Ukzۖ!B XI)y݀'uBrk?ϜFJrնѤJIPl%ɱEܢޒ)cG Pi)^ -CGv[lH>}#–$6j'1z]*`S6V]DRl,=ȴ :84Ar18!!:,773ň"D>G;G<3@yx4jUa5d[n& yV@-8m4Z1ࣩnF==N5Gu`ݦE usoL+`S ,m]G?ҮҰ~G(/DKx||3i+ws '}2%_zT_BᔉI~+ O!0_4-r7y!^"fZ`Ibl4.y/)H|+`\ L-/;-!$˥NKy<{[&×)N VkI>bhNUd0 \[UrtKZ҈dK}|IW/,M]hGK/ܯn!-R6_Iױ&>Ӻ{mNlP<;,. ع+Ve݇]wxP *oDY\Rl%K,N4d@#eNH֤ulrj"Źݭ:5۬LL=?sm%J|d,BKhU«w[a{߳`}}C-ɲ;&@Ttzl&lEt-f?yz( 3W3`{onmֲf)[VRjY-YXe7 B (.!$1 \mc|01 6ZfM P*sӒ`iUAfU52EњBlkV=Uurh.y'CIT͚:ɩlςve;ɤ (bm}ܠk%vE,ǀ!1={ޱZBKAZpϝhJE.H}U%yϺcbtulKAMlKtC" ,59~jm~@O?WpN/աm Qc]cB Jm6.ux2K2Zi`%|*h%WM][ dkf6,$tFklVBSEf' Wf(e8҅^豍q[([%i$nnMkxOfD,ɚ۴ޝ#}Bz-pFttB8&&5Z y6i/YN<^ ɧWDafs7Z#Nz/L%)jJy!E`J iPABe]+" $՜gc7K=+Ŋkylpv Xa*>fL*Mͧ&/jVI oJD`+=". V%&1/6T$7`ۍ ڭ:Fxf.:Ku h_EUA1d[h1g,ҰG|lU%LQ_hF!Qq\'Ɣ}i͹"gD-1Tt75SB4D4:dPXY5SkJEpU`TS< ^gGyfϑ*):7DX7 @PYVY?U39yW9?A+W)22%iЖ}˪nޚI06Y [Nxg,;]Mܴ="d4sΡˌ_]0Fq#M,Bu]'?5Tw+}ojkL(a@šu9_r'L9͂fv\uHYM×lyZ ԛrvzĆ?IDĢǗиrYJKYsJ*7s $ PW@!Z=xx S; Ƣ_*RC^T嬜~AʡoA/nzuTy rqSp\Ճ%)=L6؎QV'R8V gFS\Dg% 94.Q(>lmA2&s dLaKQΪD5w tdL87r2hZ5wnE8zf%"[ }Cbo9d\/jXʲhG4H!'"znIW;A1:wL4Ԅ>4%kͷ˫<4ȵvmR_^H|#ӻh:Au}+v[B[O 6@ ۻHgYcd:k}n?nS GP&]0SEA^_*a8O/㨾~e[C8B֒ ӕ~4AoV_R?guy4i=G_XY=& t݄GN4PW?ýRZ*co—p=Y;2t*+C8O~ ϚXy^䏉WPثD]'c3eJMdJ=џAXVgԹɈ˖892WnVC]FƎCxԽ͘{.6[Ni_t3 b<򇓩k,K(ZGwCtn-]CK63(An5w6i12ncS|6]"%UӒX|\0Y0mG$ć#ވҷ׳ٿ}|<#\z+4l) X;XT D6 5b{ԥ\锇2֡+/m:)婩7Y`ˣ?.@ZD(yŞ&1}S֤Kӵ-YzB6[?êEV2G.yW!\,8C;2Oi- h~j@} .NߧK|` Y@7/R*wMCtwߗGUJB1_DYG<:p-ו>-$'< $[>r:Za_F9k?}>6##$:p]o睁q01mLX4Pb @D `(7fQ[ 7nfmbBX[K< Pu^wYpq;q/_Æh"CGү7c'  }Q}2=CD0#U"KЂ4`H1kEWdd- $V,z)<@0OO,ٖd[LC"j㾞 {]w(6_5VJ6GS@l}ID?||SzzCF7mVuֶhW5afBb8`S$' 3b2@yB 2~?1bMirXzzKq u+QdJda*Nm=$HFO`ee-1GP hʳ,'"$;jVKu".kR |Hx˳IY*xOK2o_ի\/bB=E+B -e[G8K6JmbU=U.`t!\Zn=S3;ڧUvEaҥ3iPf)Zfډ Ț҉d]-r25b󣘾vVL*ϗ.S|OG4k;LQ! ~I,h])&N=wYkkyg]." 6ӵ@p*$-XoPyr%Dchj:MJ4զhNʟي9^oC5oDMwQŃ-S`h̶O^4]&;Xͨ00q&X 9n Ѻ UY6S<sʜ Tz?~p,ڔIm }NQ#OJˑr(:l/!62髻ATIٶ=6黻p%b"bes2IkV^AeIfU[_!r)baɊ,bfGߜ#d[F Sˊ)`w).L BP 4X FCH$WjYXUD)Z9\ZkM693m«(eʼn73EvS#o&{qlX90Qb/:F֊9236n}~b(N_$E]trA0_6,y3cMmgS}wJ0U$?QX^h(cVGti 05z:մ/"IrG6'B![~NnnL:g6o6t*ej39rfϽɣ #I@LJOTRi~ T1YIh,Pex:XlU(IrP)*Sd1Af%If=UFl!kcGG0=Եr~֫^Q6\ܔ0T"i`2d85s,_//Mm [CYaV];: būGTBk)R-y<8uVCTB&DFډL/dRoMSuϓKLK=NJxωnPۜð+M7x^Oxr a[4@;ת,vټ㎲Cr]rK<^ؚEB3wCNU܃mkRݭYF;9h9i??!ϯb}0 fGv$2\=nb g2͔=D,gbm!ꬅHf}(m2:k!J\0S/taX|)8BaK8G 3o&8KL%S;,!uJ,wPkbb'˯#wV_%eerVR{Ry?\X{+bx{d ˒[oa{wqsW-`2Gu8_ad(ĕ]dnrL 4/wrsΏ)'\K*^rzSmo 5RJ>{*c^uV 9u\b xRdU:ϫB.5,EY2e;$VȐ`Fc 쨁 ϡ2Uϰ߻(Vg>~a?ACԬs6ue3OZ-$Jag::B}'덼!c;}]`=Q^Eb[?Kkp#sGCqW6$8m?;z-Mvn䯇8< KrH!pPgi**&FQ %#RW?E3B*{-\ȋL:D$sb'ggaHF]C'ƣyS0E~֮MCai>T2qiA3jPƵK:ͦ\ pzZqr0,4!)Vik>iaΈCR~ڽ%7mcs ĈZZL*b:T?Q Abh{nfe5+Yß˶'#Ͱ%ڷ]ȯ t!TOnEQEb0)/)lIH~ԌD3>#BEjI.ߊZ̓JNJvQcD3) :! @/"ݏDGXQqDRvEwVu.A'1r1_pgef8~.LQ6āsfb\jBr_ 6wnuvwV5QfjNptY =]1(ӢR@J8ab:]U9??|88^Z5UXJDRVПvMK cybbm+l`Ns(,,rBѡgq.4a7UTE/s,nR&r9R8 o UnI2?ό9w>Jߘz %M GhO]N[U;.6џf~E$gW\s:+׬+I $>wgA-c u$A+MN~r E`[N*&t~)'ajf#MKM KiNЎ*K⊀;xR_o,;ZKt3UYlj8!`ls G13{k.H1"\;ɷy(>R4ji#k}̖lF.{LFur& lTVGNkgԈ'+`2KDX/*2%lJ9#OTuj3_@yoG7x7(;|?n;uk-g*V1 pu{$11u]*Sc='&yN:\ : ;Ƨ8XqBcRƦĮԴUrO  - @T@iLETT&ך\r)0SWR%8ޔT*jN%]M?5H?TJSaRm֠q֙qY m\ P+dw7긨6Ny=Y2{mkvex!ƾs@Ewpj|]sAcȾkm4e.Cf{Ş.bq~S_d|ljyfc9(fIN.Q]3kV|_ 5F~4i_xw-͎Њs=gdiDjBoFU=xtƎc1MqUտtCG'j j?k(Simq_ 9v"6+D^-!@sL7)~@`*OǨ$Y mퟃ[EX1l&zs %*j  CGj_<3D@3U i?٤K6d62Er8nr!1éoRTv 4mybD4˦Q#j: -1fAʙa+Ɣ^R u@cH浨2z4{EALH*AUenDXCnZ+AQ\M$S\Y1ZiK(!ŚPy"oZXxaMc8y}@-lĈХN떪;#YtevuShE %fdU* H$irԈXrv)cje%: ӫ緕:V2ٌ[9x\EekENgO~S^Yۍ{WJf4GyZ"V0 kJ%u}vߵ.Dr+ESP /nڶ 3(Ew]j-ܽ*$wG7J?slvSv]5UaMjDRjn`Jr5)[DEBe}3@KǜG,Wl7_Q/3f!ͮX^&mnK7~L%|FGLSB i9ٌR-K2'Z؛m?.a-onf&i2ZK2&s:i{?vp(>ȱPxظK Ԭ,+mfG*Qn^+rᨯ0](T洌ܰhf3=:cfR4:攆h<nNI &~u)hVUƬpM=+Zy=k/XIQ'xKi!ڜ*gf4Z鼚/̞R[Rh;pZpXAP.Xryry-ʨ{EED֧h0z}2z#&3Y3tQR $şIS̬Kj6w/fG8 ;ˠgIΥȽHMN@Zble_=2 ֎ ׇѤMw?R!LكJ: {lۚ17^Ft!A].;GKM Jj$*J9?cbVzӧ /=D|FRͳCMy;D;tOR.m5D(u˭ZeIvGytT4`+,ub-Š#Qr76ul5EҤ!ǚ^^6h7L Wm9> LwKs4;74=ܟjth^OyIѴ+,swIJ=MzXNpwǴ.된e1>k- '/_Tcu Z2ˠt{wLhpL??m_XlE['p%}o^O1d;yGRôǻgORPBQL)%#,5vw}LJ82dv;ߦvdsb0Pjbt:EªTWÒ`N'G1+9u.c̶|vl z.S=]$K3 7?~%/ƀU0?j~&'=2옓5OsjS'-; [T {ewA6~bʥ{bOW)4tAQ|Qp_G"rK5OIy[Qyͧ 5Uu7Ik9 *Иv{nx' s7>쎋 ȗ[ob7s095C;jwre"&r/d<٘x|y'; ?I:Kܳ~o̺6_Q8j/7ooW@Ǭ9A}A]LZ.P/h+l 2h]4Bd Ӆa?vbx ӨNQ"vLe~ 5mg7GRfQ4tlKJWκx)4~ݺ>$}əwu;,nLe|`)S\(Nq(-8*KY8ӰgJųQ|Rtߑᅦ`O5٦k͢9VAnu34Fia  Oje3'B­U@J3֋Dkk}b┲4sM ܨs?!(3@%D Z2q=zE{~9^-B8~skTAҏ` /s l㔇4KZuy!Kb{vpulf3-jKpoV֏.YoL!qG<>qG&Jɕx4M 8Z< N"/k`/"n &T]}P%=L%,?'9gGx {B|zT4}bM& aI$%RP.0RB {xXy5|k yt[M>$sV!rg<{b3ZD/+zVz?s4mL+#-1G)܌=N$`E.@)p_2OE @qpnPJnC!!UH2pdA~ OJMj!TK"CXV{Nsh>CȒ %` S@\bc= xq7^N/7T_F]8agb!0t lSZdFg )S9qb/ 9lsfe}:ecqi|:%SCoWHBLo}>Oe ?ݟ@2 z=|zҍٷnST+@hb`w4rLȲx(uG\iT|$oBF(Z w|y7CDب? *mW!7VD_`$@by(&&G&NsqȑO@y=WIa!`msݵc/;O*r+.>AV6F8NyͼqKkpxs%;E  a;n3"Jn"X,&# qi_trF_{G \ɖ/e8e%dj@ RUf&)ygeȇU#&}o{{nmmmR]խ˳Yk-$EZ(iH$I  (9h O(d41*ֿJ8!Ox̐DMJBE&%urӊR=Re4T+miM/MZT#@ sܬ,+sOwzJ/C`0R^2|cmY[Rc5Ų ئ>^y}SFEs9s}r;J4[Q &=9w0\߽Ĺ«~b6qXK˘mB4fQ CUcUiPOxjBa{j' q,Uz`*|4KkP@i'j՝3jM<Ťc::- l<Ņ)ӎyDnUu7a=^؂ }[2CIɎ3:&+=Z&{8~/ƿ"jMVgΡou=˪i9H( va=R]p[Ma|ck+[%F*v?<6j${/Xx?ꌇg XI%m4>q~B'a |J Q`O)|,=5侘`OQ<+a%NE+=" 9TZtU==︱&ՓɯWp1M^ůFю!)fsC fa$_nevU,Wު !$BMbϜ&_B+{Ԅ':}'qg\dn\Vd3>FŖŒ$%zXH[%hP e);"jy>VZ`Np7]ӾA${JrzZ߫ ޹ ॅĂsz<3}Au(Bus-WC`"(n{ev>cz3K8jWd1xJhQ'2\O4-\B{ʦO{)##)/Osny}ʏx)>FL*kk]g0P=.3i(O{=ڑ&ÄeʈEe%+c*pnEdcYO"X}\d<'KǪ;eոBm]s1IcRE&^eiN(gz!Ms =Oq^Ԃӊ;'1oӀ%59]n6?h;ByXG-b5T>9:h>Ɯ n}SCbERa.1kjyW57hTV-.*2_kyv+Vs!r ;~m0tBvXNՠDvq?M.|Qfu73֡o^3s Ξ0^ٟޡ$rc>ר#^5QJ[D.,]irqDc+{~tN`$pdxDp/='L$KRDgH&u#H3։AL9\{\nUs'F˷uHϺJ出SVCWܟT1_{I$Ø]Xη^aƨ0;QW_x?QtM7$u.I%:X=IλꜚZ~W,`^RXfl;O'냿Kh_r/C 1Um`" P CZD]u~@zX zBFkU|/Z &gc?Gډֲ6}p;iT;9`\C#B,tsu_tL[?X;k߹R0{5}F$?}AԜ<P6`zaD]-ioB0v:c Đ̲1;~nHϼ樮^IJj"K=c~qu4O'^2qK,ǚ:_=Vp`a3KǛd9sc^ #TN$_zAz,ʲ<_~k})2k&:A7T\GI+r)[=7 ]()(*H;$s5xM1b@dpvȧ^wo, 0ƭ<uP8t!Oz{ϸd'ݡ%u),I@1ޯ/5UK[#/v7>5SFUk?͚ipS&xj q)$~L qH˪?-~LߑŖς_\_4\R9n,\P]| {rDYSM49;LOavgc/Vgq"vs<A;bP9熥TMt4|4>(:su?wi~B&9m#ζΩ}C\sɠ2L>1:m󀛩6(PVfߵlaLh^|_ $FUC' cif-Y9%? 5gy=R} D"¼}ˑ o|pc)tp>S ->ɵ N!6Gu/g͉i_=-CVRkDOL7ⓦX*4>%!ZT範Eo's}iIZ.?mblV{6@|.ză6`lv=`bځhn g`.s! ::: YwZZ3}r~M\]jS_.(=)3 ugQTn< (~҉=7T?N!!g6tdx̱zr/BAq92|lB2@qiCcQ}:aQvO{/fr1i+ Z$Qװ{0T@j>1[@ 0?{a[iRΣdjʐ<nDM6|$<τr*zLI$MrIBd_ak:G t4f47O% SJ7Q@*E<ߣ)\.1].t V-t!\AIQ]a՘rUЊ2Qw@iդ \~=#~սgA/}JKc/Jb O_/AH/{w^Y8{ 8_CH1\XU 7JXbiv[Qmf!l|M\.v[ Y]b՚^iFbx^ f)8h$(b\RC ZD8m拂c12^T]4-63{)SkHM."L4՗rF1e6p%׋rBKM~^9vfgPI~YKEp(rОC7[.tbsom'>k@ ߰"%[ gfSI#J!8}5w8厬^w}sg%nEA,~-Wb \šI׬eKa%8'|jZ׭\z@+_D  H*qy,/-9^?Wz!9ǖy|:@؟sU^.{ D!a=hVn$Ĺ hүav]Pǔ4.EbVS'e -)Vv56|剡 ( B cQbHj[¡]3laiV@!@pf樳^a3 bD(&B7G,YaBc9EhũJ9PYrȡFgĶs-A v14ۋO~ۿngz7^ !gu*E@Qpu6H ܔ :3x E Hsѻ t?t4[šwC ? Glnׇ.f>ho͹򆄐?du= `hy@hy@F@XbCD+-:+B`_k,$\<mu5~,tc7FL!X`DjZ 8p( g5 ശ-6GU 1H(n _inz&Wn+W?W5B↹3rR, 7ْ[Ϭτ%}YxJCc@$eGrkƭcmU{{NY ]O oB@Hˀ&-$EGwweɹwZܻ5bvv\xᅷZj֌mxt"qOH$~O 42WvZݶad"6nmƌ,‚& Ļcڳ_-Fk;)zW7Ն Iy*6-[gG#2w 4j㬳f{S&uagsM;h"B ~NcZ1 KdeUkfb{vYw<ޓ{ÖmhX݀};loؖ諄46X%lXλ0`I: }{Pq6N3+rsTT(VA7e/Lq/[A^$Mr.x ]gg:t̮:69nWQ^c;Z?el]F%s Vyֽc6LL xJ㤡|qnoTpEbZ\Z3[^R-Wq Uo&s9`3}IkN~vv[uVSUU"{ΤqƾhHץSQ|fY6۟5˧(eT~Hes/И')Y_j6gjY~4lg O6UU6Ҕۖ-\ϾYy]`qj+%[Z2P#z]_7Kk4Cґ$`x(qP)H)vi:o/ph5L5BR;̎ JA<ġ(41SPR \“Sba%t yRz6;F-t1V&.=73~ g=MVr׵׆m F`ۋ{E>(<3ڦ{3hӬZRP”IV80Պ4rJ$?paS9V{WW%"CN[[^|[ZFjU 9rwnwF7K2TdWZ Bɹ/SD O^A$^-|.J|.q2:}G,:)w[Pxj7è!HZ'$fk"<\yTE4^rѮ+(,8 &BFCb-=A^a\B-iwKb S1~#?J,~+Yیc;!Y0-kqN"JqF$nMoȰ51K^W$Fqa e0^8:o5UJd0;tc4툞,VwXq1{PDB>mZ&CH9kDC?D\x!zJAvM{&%pCΚ8o$|\8τWdT$-WUhKg;?O/. #,~J^f̕s9"/W]ݓvNfxaIir{1&6kfђ Xߪ;Y"&qy:׿ZN|Kh~;_73/[-Ͼ׺)靝$1 +ApQ`q׵nrjҤ2$EUH:?USUo{?2NC[ߔpOI@,X1͝K7===Bgg٘>P<%$SQ/{顐K]dI#q%͋RGF<{k#εBg1Tj_NC=tjEFUEH X3@(;x\-_2I޹$F/rLִ؜AU|9-J٧qnb$%{WlLn0_KuC dw2ބוpq%<4m'g,y{U5P@beS´Lr̘e{"{Lc~kjC^qvquEMji*d:L4¼^ӊ7Fu#JS(9}%U*8L.**5!bEY[}W |˷p&DS$`dZiN Vz pvV&cnhmZ=yBNvG!a^T[ƓPSWW|҆:bg,"&gv-gl>VM P/` >z}-zW}m IVkbqI񓔖?dtoX@ /1L96+td!NGFaf8/j#p8@So^fTƦ6k_ER=EKz;ƪ &tvaEO;ZO Oՠ(x Q ͠t AwQAiBŏtihJipZO)Ӷc>KYƮ[ ӏ+^qtDqxZǠtGTɤ2/8#:D&oR0B˒BAn(zqxt76? wwC=m oԇzl*͞'olap]t6~?BucO%]C^C @:<xˊfJ(iy$"yrp7S(er,=`U Bc:S PNC{$` ;K~{Q obN$)5{%GUAz U-,z'O璥όmj߇?9v^/*hQ"`]`}>n PPx!5'ANQ։z&?n)Ǽ؋~Nb8ڧ%oSjS>U,3zNV]s>][U^ HixP"ڈX*CژQézoJ +_/-!gF.(EQ,YLHZQd=2A ۦj 5&tp w؆aZz-Ug]l844 FrKP~DA% <A @iGC ٺWQd0daqH"4NDH:KPT^QݠuvEԾxMT Oa2{Z۩E I/|ir C/FQ0(|dI _wջ ̹-,Nx"±jf R`!:-Z})ܔG,:oh?` bnSb¾*0Fza4W!^oD4>Q99JA>u =ykr n!yjHYJ_`&8whJ=i%\HwnJ9-Vѱ.`wg7CFhVuX3EN]41$Ti.] z]  RP1kV WJ6?kXD=ee-/"^JZ~$9eT?˛fLwMZSa1w/a޻Ig .C2NEjӫhu5Fg4~ʣ2T>6S4Lmr^R sA ۖaun#"_6#aVsL5fqR/N1܍/Pb3.}9S,0v}Bڸ1U;u~i#lp yf;ԸnO8Ņ=@=K7mkK@Gr쾼%2U686=e6MrF땶-unrSʵIA~6NƕJJc}!F a47bcxNgFf,:u 22aDq5g3Y2Ѫ3Y|G䱃UQb\!E~~]) !:^-՜~0gW7"UžrAv-@F2W510Si엥''nqW&+ AL;[aX,ʒJ(HP@׭j\"zMT7Q/kyS'sQ^VСu@q]PL2 H{a!|Vt/p m)KGM͍}w6DjCHz$=y2lqsB_X[Xd{O ܕ&il n~=1)U*׹~l;]]o0` ~̠zKWrǐnо(]T:D:"8'_t/ys ̚9!/GͶ)2˚asnU&MD.Uh^b ^jX 堜=οcyw;}TrMa@#-?_dl 4/ ^-/ކyݒmsY 5ɜt!貓jӺZԮ*ans p/; lY91jrK#CZjtozLëIYH͆근"p^{fVFqoNöjjkwYFL^ĿF`/ M_8Gɋt冶L֜Yk{Ʀ=/#ӂ^3unW]jN';z?J[zʾ=3SиlG$Y{ASs?~PӊW/%e,we3j'2eqmh*3ȳb< @.aE(qŕ"^<1B{\Tѵ[F{l8 ˉ C\FևE2Ƅ/}9Tr*7ԩU05/쎺\u/V?q-8ݐ 1 nq cZD<\&=*Ɩe/,5L#վi#?YX&=zI?/-m;4/-b6qẎ,'`_xOoKo`;O|=ED <_V@{S[|WۅUb`;1/xVFa>x5Ub_D. "NNa5oURߨY %NL׾& fLpr,n<|MaFř>{>=204q"Ԁ, cbObc_#XvI@k|Z߷Rdwʲ/:E^g٫VR3‛:^os'DOe<7D!C+!iFSDCpDpwng;_'R׿ D":z KLWX kQnS ɨ^>>,{ˇ31⋘7л Ȓ2`8-עZEq*(A #;sSߠ'EA !:D7rtzR;sEy 8|JV07vʎw =:e؟nouokd|<UwMSu65M~7n Z0`$V דXzq:eԕb3Z~C+_i,BXŶL־>{3ӵM\{DxֵA d݃kh{ ̿ӔbYe!12YhYrQХN/S bͿF9Oc˶CRyE/2 K4ڱ/A:mZZ)M^[.MqLxALCT\ "tĀx 9|R)u= dSP =EzO%Q=BYK/-u/5j4v$g'vWC,CDr]`T ]'tt@[?-dKx9wueL9-ѣTu$P^e 7O\ۗTK'GyB@8 ѢU?k?q[OG'H_4Jȓv{ [FfNY7{p!Ǻ+p(d ܻ˷((\& y!d{M`]v$Ld,w! |a/4[7B^)?-PVيe>E6ut5@egoU8ߗ\ҋ\$osV.iu.ɥ+HOdokǶApuyƤRHr/H(ǰUe=Lq~e+gp7K0|aNe(1]3wq CE@#f}c{jʬݐ ]d`۫-w[`C32pW`&sn\j|w -4E ۠ f[B(`__kĞiҺe h@ʕI <*I%N7Lː$YYڹ$'@(fj }ιsvfn@kִmufֹHBD6PP1>@Ar>x(#(@0?4*q-[KJTRV^xRGJyM bɃP5kLn60*5fgs V^iPP>gz36 {5<}3yށ^SN̠m!GW6BZu 'wڔ*;-ĉYlٴ Z;MbV.Fqs4̾xkn'w[j64米y94W"Kg@ `3\#ǥtӻtJdwbv `U#54; Vtw$ B1v zxoAY.5_PCW3޿ɾ)tSDv26nhr_=?ǛvnoR&QD+.DPV+mA3}S׌ܘKgYi+jS( ?!qyYbDjKV? ҋU+i^x8Y d* 2\K &UP%v-.y=qsΈ]KK򬒷.g nM[ٰ}4\O7E^=>Rdgw"RҎ>(/E5Bŀ 97c"`o-;5"QBLO cQW*gTΣ8..q<]v_x0}Hbw$(m1Ca7 KVItn ʽfΚ̮gPolD&=nT㧋^.W$7:z7NzVJ!n@fl NgM#v8OъXCԚԠ , .=ѽeZ5&F':ΰrzBkjaY}X4ק:}gno!\ ɳ6~5TC<$ӁTKƲTIvICޱw9I'|[?.oD?oJ]Fg[dh|A/GldF忎y99{֘Jخ0M{i]e%NE^yqs\ ';)4 CEwr<ҖL6g2ޔcZ/N]dvOޑQfvzIq8-XGF&>3v;}rYr#/cǩ iB(7! ӦȂ8ihGĦʣ}u@`ƶjͥ㲢aXwkR|?HSj1<3h)Xc8c[FN&Vԙm^sufS‘v[- 7V dOlOO"jG,Pc\m3{GIjfpAI0xѻWIcʌZVYz5ZX{p0M`]{07)nOYev-Cr7KW< =,R}oamCY9Rux~v;Fj$C'1r_ ᶗr|W(V|6c|@g9g߉= DF37`#~gI*+P8uX^{?xzA釱Uz^)-^xGЪ7LNc%VI;k,?n7SLw:ZԦ qPRBKq)uGf!%߱K_ԛ {:dz ;)+NnVrzVDYU-587^m@n~n KĎ3ˋ{*"9޲rG,Vќ]oA,rZ=&]&‹q76oLv/t⇈tPSO)G_*9f_= ,v43{@;?!qӹ3sy+)/'"QKx|$NFfudd Yg3ٹ\ȐRׄ( \;`n՘Lሡ5pf*]!M18<+N<\q>`%\'M*W EeV53klM.oQy]P@8I;9V 1T3~:E$;5^Lbf3E{WH?6̮DX3ƗQSM8c(%+~uGrkwDSśž`+:*QP@MD.^\>5+r_{=OY8y['qa(zsngXѸ8Ç7 n[% 56@gs֤SW+FIe-h_+}\pwLWmxz50XyB}WqO!7^ĀqW]n_]k(mGo:1mZmZļeŕp{TY9oֆUQyltט'Ց(G$fwju>󨏜8VѿyZ{c 5O|(>&7')d?(?S')5ホ;myd1@#?ț(hd$ MU"n6Fq٥܂ $Ŧn$0 !4fܟNs 3HA0*Ud D(GC*CΜ(PVDr2ZQJ7J z'i3dXy"|Yx#RV/)Ej!Ž`t*uG=#hH*vfVq!Y]wA%!Xڣ>" ;I==II6GmkIjDӯs'ff/!6 tsy3ٌ 2j_]atos苨؀Ed\qfMòl _hݶ_pN4uUC@|¢sFigxyanocWXG9R eJ[2S7A~3ӊ ~![}ɱO+>+-L]HjL] *`+ƏF?Ruc#5F_7B7vڝm'@ `$~hnqjo^H^rU⧳߭2dt/Xȩo[?.V ]L[Dy9W5#S{H$r&0˴}"0jn?EX-#%er㌷ d֡C_b0ykGȘz) { 9Dꛡل__ZOq3 5'(n$.QI\}KX㠇:[2}obQv&>wM4n;5|gWyx y(oлIM:.yǮzdPi'%&J@y97v mL(S,X CTz<.|۸E^\]/e5FBBw܇4&>r\!f'8+^t.%^iH|T/=0>%JsU3&QeM^&JV1)*"QCTzkJ%>P(5x|iK>uX}pK;N vŘFDx!w3BX -b[h`ieաA,Jd2"=%324f0ckN3SӹbCŖOԧAՑ?Ŀ 'wUM3vpvPwTj7YW"ݗٕ]21;Sد;qfg;/I ;j_`Z%B)V"T~%zW=+i<($}! O6/rO0Rz&KY9鹴t1Z١5?uIjxO/7zLYWp&ViE[ - Qh|'H({JANpݠɌBIGR-  X /$G^àel89?w8MJ?7k'2{4/h}>K!irJ~ @ Ee^x]c`3[-Iws,О.Fv#gIԨY,B*B(2VMxiJXQX4';9ng JȐ' J@r duw1F"HB+IBz+r("JRxhi],/đ):(|_B~LB|T/e!c:--헏^i@ SbaeF l_`I7f]{ec[+Pm}nڇޙW[x%I=+V2+>qo0L;,[^TVZ8M?I2*K=,,.N9 Y"{*oW0ʡ;S50#U|"IdVpMNHp \# ZwnM/`ʤIthՌr:_kn&*F ZD6p0l3{H=u) *2ƶBUB2@hU"CpBKsk|SJ8}{sۼm9tܶݶ׭s[W22\JQ +DDD@T@>𱣐b#@)aA639 M9 8NΓ20,R]ͽpJe%2"%[uKԯ.Y9m8jJKGlEUj BYXYLn|Z~og ?M3Eo:5Y k# u l3ZCwZ*RDVC z-니 Rۚ6{Y54˔(H{$5@1O tZRY,䁵5!tu*58wOwܥ?E'WöDq) dT1u \FVxI&[]b$f,?^֟b+rd[b;}dҽݓ9{@ ZCp7@6gpQ$GkAF<lZ  Kea5NyY#! L\"moB@-U-+/ggu2++-:z`;IeWh]πD`"*$;bѺio .Cj8ϤT 7tꯋX:ٸGA2mSlt╎  RaMgCeE}nU\j`HpN6av@.P[G+$";T1$9_jj,аda\br2%5 Ȩ'a0fD0:{U<pp,ZOMՏ+ p}&52"3?gƜ) "-O"!T3w8~A%6-qPX3ߊ&^ RNR4Pu_I_#HrJMÇ:buHkeE۽Fz6_ 'ԣyN~^$w1u4lS1}i0Ν槾Kң#iƀT\B:3&~޹M&&7MlF_T~(qcWAN[EQ" d*2z8Ivx7VNDuCe;eaG!U)9嬅C4+kod1@JNI^WY= d3>9ЬŘa:lZ[u-Nx-TDScŔ9ɀlYylR?W7e 6~Jtg;% ;:!M#;4^dF4x-34>2WiۈƋ5lRv$C^NB3y \a33rQ+2j,0Wh$䌊 7w!9b7OM_T%òLQ7%jʊ[b;>yhŸSZQfb3×BS_"`/+Wy}!'q=YվwWrsM@Gu"'[9" 65;)JB'k,띸yMtaݻݐ D{"8 z[NlmX}()j*[ԧѲa֙Y4jPM7ay)4_|JY&.߯GPKd)]V:k{Oɘ? 6y8Y[Rlr|Vrg.9f8]hRX duaR "O󟼐۴ S9|v!Ezsm`NFNKUN+c18yB7usgNWdSBd@Ɔ,U%Kő=#쩜 ;1K6ggQ\e2Afv gYvE*ߛU#:"9vǝaR|wScw&L 곒#ūW inOxMSc$Z$­!jv.^,*?.f߅Kq\G܁/^|NrCtXsvhN3u1iVMkBd'Ixky+h6}&zܔzs1isKu_siLbM:[X܅2` iƸz)7k^6>+6۳:Q%d-~Umq6liH)?Gby9+t֍3""a݈}ȕ$y 3qNg)٘m>wl@ ŖΧ}(dB IٲokĜ8|~+r[vEDg$Q2،/Π>{\qd%ifEvy:4|:8ë+sssŏy[LY>Yձ[iix)M͘ =!/ ^I965(>*s=zL1oQt;gc΢xi[(*f+|X]W1,S3_JRc&1,eEU1:v$L }O tMö{ie- wYucDoטXĎ?gkl{v+5? oac:iy Βl^͎3}|aߏ=mfY|A9H}uuh˖Z9,l~kJP'`*q*b> T=lzϏ fzk\.ɰT{_$eiG0Jaf%d4]O_ge1hGN\9<NA[U R^uPH|1+!,`a1LP2_NX&mJ83#$v){%ש WL/itMB.6:W":dTýXtPS@ O{*Z8WE\wv)o֢S6[lVs}Eg d&! K@^Jss8 ;j=tdV\ztnm4"JGbz.+gh==^[6/EoVxBcDcc /Q=Q@SD?tWa]Q+cn/j@S RMBJWhkx͟ui{Ey-!@^/) &ZJE`r%W)7^CG}`  {ذ4dS\E]pXI~ հ'! `zP* y+촯?[BT@^|@^O! a6d_KvRF+ K\rc$2K~w]֟σ43-K߸V`$Eo&M}EOS{,NsWJ'Vs~]r+͘DtnԷO?8Ot!+FH.I}1wo([3>uLa,5Q޸Jɧ@CH-sX(DFD2;/"hD)܀͖dXk"\\Ж\tZ54Mv'&]ahz[hw|ȬE*6*{K\5@0ݑ# TV!#4\>ý_&WejxS'3OI"#@Avc9RΫ0_]I0Ut#xe ,MWbW2n&s,2 T|/AgiP 3Wt˱He \tɊ1,iEU=vY%vyHؠř @ e&T"q"'퀆-n/[SlC lq~#i_tqV"nouQ0zk(gVԔ-H. ?\?6>ݚڨ86%'Pm*Y-y҃ş\0*[CIb?,c)!aaȄ%Y2W _l1RyL7fɓ+͍hLZ~ç]UhsG9"tCfAQǗ?PN0;!JƯPsB#+},K!yX3eP#e?%EVv[Jxh%vrnw]œ8z?hK@ %$m&NXQٶ;]ܯ4w)NZtӣ*$l2/B)p \ߞ6;],e%J+W@@ !3@GAF"<$3,]-Ykk;䉪ת6¨Zs[2b%_CM@Q ќS28 <%~S\m̩Ӵ^'ֱ(fϓ/\PשAcBK^uN83Q Q\콨 V4YTЀQ%->FW}GCU2d`VvQmί"GUo+ ! Q,]Q4Ty$GQw?䌅N͹m=1ed;gImmoqi 7B爤x]3;sۭV.Ⱦa50?PxhG'-cOe>Cb ,]&MQt ҠiZ9KGΚ:vonv!*7PP-ğwFyq9h@Ӭ쟰N6QUED2YSܨ34(kyz2-dVƒν*͚Cɺ{^>F}kM 284w<ɮA { d_ظ=iסrRit|s-{ Gqt3 =a, ^x键 kD]<,eGF .,}wdsl5TtbWSsCKVwխ :h.A; !_Mq`iV4OTA% AOZcibx !`rWSˣTw.2 E6\)[Xi\!LOmXC}m0 cQ8㷋/Vw.TZES!E t>/#Dz0?~jҀ%40cE˩b:^#ea"n(A7 Oh 2a`$f\3߃AÀѰ 4Kv2EM J1La16,H34$VcR䚑JbABpK"s: k<=aTu9ݐ"5#7bansUO6%sb=O:6go '2i곕׃tR7UTq$a 0usIrdO+҈$ʜbڛ=X}iI՗ @?dd`l:E.K͙&YʀoӽA F i3<_@|0m-jA\%%'mfҧCJ=5JfAIkVyafYxq;iQrD^ӝR|S`ZUbUAbzOY37݊ܦo[G䛿rٶ@_ QA5{)7k"%0S0}J:Nuv{9_K4mvF :4bzF%.G#$eJX诣 S_))ö Ir%"rR|N 7Own$XlˊvH-;ܔcZ/[%U&L:uOqnu7$)gx)rVK%Q)>+ b> XT_+Bu%HrkJ-!nkӐCN?!Gi&zN, `fqLWfSz~]UK_N,#cxvӎU}*U,wb9{ǵp`F+?Ik?bѹlD @CJwŋG!0 Cei%*+z[+>X-GJVwT(=abU/>v/. ѥzSJ3<|r<֐J,BDCjb5ˈMP-]Cƿ,Iҙ ['m]8|DG{ yJ=e٤l "|1g—)PֆJl(+ fs$ K ,v*5ndV$܇˞$HVۖe3Oy&Lsu>4|GeT w֟uaSxۥGI:j`@8-X"Z@ b,:`ՎjoHPCA'ۊϨ?sRNevp 6$΀yI(T$PRy#!b̂I.,)₪&Y04״ =xaw1NWWbw\' J'8bͨeu6,Z{£WHᄎ<R+̀@T=9SɨK*_Ja v>8CRIF:Gj[w~.CH[NO|3?6,hc)Kn}]~Gr jN.4:cO ,! Q/Mr>շ'0qيF]zx ՜CH챝͆?֖[|کI+5t2sG:r1Jd2b[r`ɰY@Q@cpT{ ry,uH/{/#xzV~x O쨏Qy_ t:3G3;Ur4'՚bG)k,;ToȜ;WȐΧg OL/lڌҠ֮Qw;m2 Θ+"s؁rզ na,~9H9FU.(Y*:wVI.tx-|%p*ޡ| lpd <<6=%0ElK/owdKV&. {)psV~ܞ:vʖpIe0>V;`o@hQ땾qA,_^:am.//K/>U/{X[IQH"Zv]Rݖ< U g։F3 a , 0 4&_zdyDmne3LtrQبXrn 6.f|$;Rb.7^E !yd/+Ny+β(3rܸJ##nLQcZP|q3Vh; @ σE?*J_BJF" qc%"fN1?{vk+v r BNG Cd@#V!{NOcSj48+)&YxN;)`o3L K%|geXMr$ۮvdsw @ߘ͍kƌns65|V*?G|G|(;|}nk~kW-(ZckU֎8*f84I!@b@$'8%~տf#Iz#I;P-ˠf -MǴ#y*D/jbԌYJj΃KnX!a108AFxSc|N:Z)[hY)P,4 $)x_jjx\)YýuEKaJ[ru a=* CJ{CiZͤ{K7%$O.{"`TP)UZ\oR9'E\iXU`ʝK3Iu['nȇ [m68wB0SrJ񢰶̰WzY&0ܠAG,Y6ǹL2(s\%p}n[~żG4!*KOvwf?&Kf{wCm}푙^eS%`e'R#N$dni>!ς{ޭ6+)mB^a4׵5]U޿m=k}r!o G ]+fG,~Rxd'?p8Q֢k}:;$w+`6ccΏ|ŰSnn6WgeW^u }VN nuoVhKܞ6Zuھ{KLD|/c! 34>  DUFYK˅e6 ߼$Ꭱmi-aZtNj"wUwx/6.ɳ4{򬎚]Oɧl3I}CiXm;^SNCi7ڐ`U;!&X7yE}k +Ifr;ek=UlLsվܼo5m:u.%Yc孹+S[UA~܀ kd cw`P(j$ohy*@PuEmMݚ&jl qKSaӪ K0K~꺾_Ҭ9|꼢a٩vȫ8ͺ1ΪM_|zfZK|SNo$iްݠ,}TY&uS_زCQ6" Q M"T #5Ո8j @*vdU\ma[1He'x9fWP\ Y.\_g$gtFv^n.#c1gu)4Dܚ|n^z򺮌<1\):1$Z[@B,7Wܨ:&нH wY=.̟*쳨JQ[0-qʄw.cN@%f3;_ƹB]S%41zeRӃWoqvyj'B#b۱)_uh>bl[C?<׽dI mfY!_B2t['ie+PG:) !EUFGi(jeo4AnbHm'kɦna΢~zy mE'rbXyV,#1^&¢U+ОB= &,3YҦˬ=Ÿ-jvӪ&6pպ/N @zδ5Po]fz*l&T338r qt]1˾A~V3jDlN$SM'ӧuQ{ UNʩuM~m!`<GFRFg ӍZq22=}>Mb&yzo5jTSV6ڮnMƠ#BF\5~^Ct3^ދQR.nFu^X9^W&.,Dwn Z;~J{uؼtO"3a=#B7wTj\ba߮zsnZhݍAڀ8Yʻ1:bN ..8rĎvVEt4"V'goBu?qciPw4#],M{T*Ʌsgg`]O$og5S\ũ7LE>S/-vL9qG"(ЖM&OF8 `q9rE'VgY3VjJ(>᪴y#uПtx/tl/P X:'td[hF[g~`[f)t@C{>xtsK8U->̎Ўn㜥4]r:F<4yBctY!# |, MGhi(€㶀7P\@44Cv@^ \zXH@|*AHZ4B'< [0؊=Ju!bm!eق.xB;dHy`(d! ZB 2R>Gg3E FƀE&fRMY7vi ]A~;OnCH{he+ޞsO.S")c»3(2vQ P(1Inyv80At6Tfb+zt'W gZxX7qXA +z/RiqC}B|a4p*lYE*> |@`sC'cjy]`qp@0݀pT5_ } ! jk\)|A:@GΏQI !wYPg )G4y?2}Ċ`JG0>#_iIGPLAxHuGH{jd$G[DH4GH#nLP G (YE*dq礥TM56."H670G@xrZ6~"V0;By21'N$2 $ >o Ry#NwBW -,?`ĭG 'Bqh=/z 8M;҄Q.ܪy۴.HsIƳEoQ_1%pܘįGMy ә/g]s'ԔesmcZX5!nvShb/GQxDk>{cjޓ'--Z(g(ձ-vִn}gM&suff\7= M2gmzA]Қ.9i5\/9#ZwySkٽs o57Nnqg9%D.r6C=FzO6 !Lxokqgvjoi_D(^tR~sDI# )U%Ĕ PH9+:̣mm i7Q)SoaxB\"x4IUl&Sa'!@?!!`Jl`]NhsZدW*ѲڻَDoj` %03齅0A&k &O]L)rW7CbQGMN'LLRf/; :-={޼2%gè41!YgFK~R0 v1C_ǹ2-j>y{^sa8PK"{mϼȻ (P] <svv0wF:L[e.)F龜3ri%5mvjh4J;ώ"孊O(ؔy Jdl-{56'wגQ)Ø%EH!ƤF5 ۘa2 )((̡֦mZ(t+k7YĊKU駯^2V<\6B,]cZ'C.uڛde5l{/ge^5Yl:Rߧ]@~:B! L(>HHj6!#XlIΒ[#59`_^r'|ynO(N]If͙ĨK!.26iJ"E{bRnگ XK hit]])}FYemmRlpJE]ƮsR`ҎE*S\dl;.Բٹr]Kɯ(T(g NAݔoҋ)w{(vfq—g1FqyMI-By2nǯV{6j÷q5g5L~(L𬦯(MMG us䆾C?,r'A f4'@xb[Rz9Jt4Jh|APW)}\h0ΝNAufyMCRξ2^q`Gx^H!{*Y zXL2 ve4\ک/?֤௞{ԻCI" ;*ΩOnVJzT)@g ?9!3GZoZ(!ߓ?9-TY8VjJ(_e>d8A9WbtSQm]YKE\1QcmF v@nI1ܚڬ߲˸!6Lc^ "3=~ǛHx2gvv*3%ȡEU6&8v6^ -?6n-ȝUfy}#)|L,.K\sc.gmÙ9cLM ?8)=p,(ê˪~ph4Hf1zU^'Ca_5̬&u*!0win-X`ϣѴYIOۃϗrh7=22,~WMA %"e}54n<9ZGmG6o4#v)-feG.(jw߫$zn>tu$޶<_*rM8nXe,ECnN˳f{#mXc Fu]mǪ߆jڡ&zLzZ<{BN˜ [hyqE];.+,!u~=[7mIKOv=NʔoNƑU_XΑ_R1<2[rE*I|S6zQ||cu a Bzm7h>gzDnn/ힵΓE$Q9aB= Ӛg0Uv<`0)6QQ{ :4}bQHGgA~n>KL$6\3s+ky{lyq{qCBÐ=|i1RXHpMŠ Mʀ؀ Ek{guI}ЎJL=O`:vtGd}e<8U `AZy"8*ɚ`[ȿ\O "axx\!FJ֮oހ[qvmavñp^Y!xwEwsOJ6ЈLu)݃7Чx=:O;.Pi[?=M~X=ܡ؇ϻMHh{?!z޶gܺ'b%M@LT' :wt`rdp1ִ=c5r @.}`@iW]b77D?پϼ/ob&='@ ߾2zz$vW`;ܗimKm˵6e͙{~kHV?<]-ĉ$a=?"6ͺ6,8do d? yp+h K9/*;O b=Jeu_d ;ط:LΆ{֥\c|[wC\dD(*V`ڏl7_"̬d4Րr6dFu?<hZ?|%e>kWwl^ufsLpIq<`){DV_6 C0:mnVc&Y\F]"SE6gVFHm&X;Jw--}mEW,@ZP?FŶmn\ٹFnFX99 ]`l$#{rn3}Y6rkRUb^})TK>I}$P%*VlЬ5UG"چl sռ̙ (is.0M@ЖYSeDꖲ%嬋t7ͱNrZ 9 G[â{v?7t ZJpvާBYFtk)u>aÝo_kMɼ8l RN1sGQ޼ |Z|0^AKEߜcLco7ήQu.V)S鞫71 Fy`\%kL0V:NJYnSJf6&c%Ap=)iA.b~K:J;rIg:륣WnwLjs>hEw747ҸUyܭj*{bW9wcwlR)w $VKP4e=Vf$mOfgJaފ~{nJ;7#zBvuj=L%snu yIp-Pa4M$c>YS/,'J؉TwNێ?EuŶZt0_ ,ڻ0E .'l&Fl:")udW礖I~O.ЕWIz!rҦc;} u7}gi*u%L'6_׆7&+H}N0(0'Ms fh8tp08x݇[JApݞƠV+N|xj9}{߾;A0N:dM=ucq[Z^U!a%:4V.o-:O|eSb18qTGQ(mooT7A]D|h͚WSbUvgQ)TS Tdž&:h*DqQym{85QUFuwG:rQIn|'MbGD_TMP ҊEiNFp>.jsko8ZKo?/M,4 ˻6"5;.lu9 :bpG֗#'GMN4ZEuzW5y7ĩ|I *mm7*iҤ8[`d{nr%-e16:>s=^޳+Y@+ I~ML0Q%2t}NmXo|K"JTv6~HJPh5Xh Z+Nv n 5}>iJG8ߌ{-e"VH8?[\kp9rrƧ؟ތ9]P1#Kv| .rxSwWU ϑ/c^a?({YB,WN_q]QYX~M8{4G EL)|UO"R坾^WpNZ#s[30|-z<\z|4年5|,=[")2dU"8pǝť*vTnU:CQSTq:יT('5O#[]j{g?"T`1P@ EU],+@@:8MED7PҿAlNUE@!h>[ioW];|gR2ol"_ lzEcKim^4]ju'XmnjFq3tܵ2T ;x̷ׄ"Vzp>uPVG[umUﵓ_`'T鄃_Ѹx{^cF͉U\LK.kf;жd[ -X۬uɢrGtLA :fi6m}YfP[`*N `Dж Ԃ#"pí6a^{Y蟽?ոpDB [S?MS&Aቂ[ nYV% ##IjÐ-3{J¼Rp墧w./&rG]۽pE(+ J}ͮVYEG_];|HɼWm`KA7p?.Rb3n/EF`).G5 E xw&Ib6 uc0c's7QGK.M.^j8v6x(vN+3mu6Ѝ;^ X{?Dm:fS#bZ|Dv 4PJ@xp&i">Mlz,>h9޵ N&LU>/B!~~۷U]}L0Hc(Torc{[Qup^59\~z<μ(?d bVĴe8я5;֪;`BSP7jEBV4'QBjwAB0t!JI hkxm5%n$ؐ=LI>- } Y|Q7bPkBos҇r,N=y_kj#'2ytV$`,[^+)t2'F^WRE[n8Qݕ@eX,Qqc(SXEJ,O3@3oeHrMv;ɶЕٲ]"H1kw͹ez"D ш / %-,De.[RTy{o>r|;%1!fL4G]QL ۨ =fۣN8? }vr2,Y$e3B7`A< sgΘ8 ` @A^y{!$5Ji38M$N,-"8UUXe4*ZV%Y)lZ+JW r5Ƶ+7j)A,y.O~yjZerpƻl<Γ,a2$6N,T>g* e[y 8L%E\ Ce\nʉ$S?gW5IZRcZ_u~U~`e?DBxr`,`5C(]M'j$} [u}L (ژa͐t(}>a^o$f!gw_{Q=!?mjT̶\Ř# U Š^%3Vv(hՑD]wq9Ӣܮ\a^JfGJF8:(l5QFcR1Kz01{9_8hZ{Reϔt%*^ޫSu^8{Kzt71p#(EO^ޚwEGra eV5lɀ'rR(m8DCLVmI2)3`T%{.9seQJꠑ?}s642pڰ.=敒ғIyowEƽ𷆬JܰK\NV%ŝx>`ͱG̈́⑟mH([\6V*Кȹ#NuYaj5U—s)a K[VZ&C<0&TYrd L_dKcgIJ:aag~ dJYyBDmyvfOYYr 17S³wz$ϸ; BFN2U/LXN醮 Dk|P4xUxɯ[sLDžrV/2kO͚R|CIzpRkfrۤJU=&k#}ه|:g6hdh KfՎ7nR+E09Wdوw/|e0:3{3rB.*xo03^{'$;i7t!dvPW~ ~, oH1 Ǖd꼻ٗ`ܐP7Iyc{0JZ4YRgrN:%-) jdlʭZe6Om0v=A*W׸ajѿ-= s(fzř^=wA uuD?`6 "ބ-mƻ Rv8Y gE9d!/ >9]fDg> V >;-B.NjCgO/q޷~q\Å.,}qWɵG夑P4s;\kӑ^y%iՐV^Ͻ%G5m ^iPu kn70X-Cd"YrdzĕXèoJK0 T > 5 Lꐟ`1unzM++؁aY;Xjİ#qtKwOz'R'N2`xe*(Zf׀QʆXh})IZwg ·|M595MJ"O`<-$zx#'qӷA:G♻_YDjfrwI;K-Pʍ2k-[y!^|z8uEN;l2|nox=Q;Вw(~]ѵY[KTKr(FQ-أ11BEf%&1v=:د<#djo`_ A-xa6|M~ތEyJ"Dz. kl:ޓ%؂rjn 8u4?g?_L[%KNOA#˧ +>|F^庰]q QkWK򖥢 ,,yX j:*8vW5IEa^Ҭ=p^gq n4JPOSsf$k"Tf.=Ҽ1[Ǩ P|l[)݆swje\HF9ğ)[9|3+X8r ʸVAߗ=-(#n\Xl> '3v.jH&t4VyZ }l*{xjuؕ.u)bwZɌl<,}TL\0A(ԋ߳iEM6,YGFjdsq&rLBCS[>+TۣJ_ֈELCq⟸)<zqޠPwc˕2: F?LWㄡi R6| s-3^`v? Ieaq-HwЙ*xq) THaa\cKgds%7 Q]XK-ܵvZF 5]Ʈada=y }y|( @m,#\PR<ڦҍDƽ;FP]Qu0v--Ù./{AY.Q *qnDy {ΗR?>* \ 3.ݻ"c0k-_.o'M}3u{j)WȐE !0wdc>GH/ȞG:H.#PG{? ^vH@=2@)@{$}aCx)]$˄_)ZAVPmE{JqTͽ-OM!خVcZJ)@_o3(?h;D6;mtYǦWLzQ2G>)t#/s?k=~<7|V"EZ]0?fZ:]Re}./XlFckxWf)>o-D= 4%-ɭe_Ֆ aq(~Hn.ζ%#Ene\ͬ Efcf96b5r9pwkf%{X!cc9VuY$s@Kʃm ZJ,Wۢp9Δ')&\qe=8H+ZSvHacz#ǣΫX-B\] 5#>Xdf }XmIcWaz%/XGN$"p<ֹDva?3#L/n~^%8}E _@n7~O!17~W2݂.T*_p@넻omF9vG{Z-B]n(rx&Vai!7K=4" xnR٭4˳/گM7)E]WX31XUY0mVSnlZa?E%{©g}$5I{l poo}&N2Z%z+\z5| ʐk(1+3o7^EYPhCd@#V!ӆ鱩dِf.dl"['[uzU݉03 шYO_KdIpWy%Mdl:Ӄ^~2jʄL4@)P,[w޷emq[[mY.-Xq 33 < "I x0@Pʼ-5*d!ahC\R=,-`Tk MnC%j>E2YKaU`FkQ[($fhIDM6<[x1ɡ-RRU+Oof=҈؏R$E24siXOO &HNQ\lۂNY3bӗa@-1"Su_>aFю%W7A1]xegh{3@FV}fڇr(/ ŵ1]Bj^5LA< gŶMyx;^X}s5 T{drc=x畢xbzy!י lxu9 Yrhgcsuj2#]-lpe(c)3«j e3rN5P4eȜG7407ٴة ,RQuT>5:Z :Rgzbb ;9Vc<)Q-KP];K~.4‚͑ם4blxOL~gnUMEs09i -nӔu RvD+h,n[^)Mh .Q?c9|7E fak5TlS0Wud]N5ZwڐӁfY Xk3R͒_QdxB6Ssh#0&5@Gr1B%!1E6׳8FBPx,={녛(υÌ( jz'hzMjaN|?ZLjUT8K=t*$&0S'pнUhg\uCJXKԍf8̝~oʁ3jZ풛g&K`퀝K:Y:A=%cInX%q> ̚c"o)3?7~|$m+>ߵo) Gd?&6]]R6L2v,W{V*%t"ۃڇCoc^Y{>h..M!(*3p)%7V?˩vJ2gKN5uTƎB;體Q\r;v ITĮLhVKQyxfS4 tEAG1l8/GcvzLJ3w [jz~8د"a/-Yi+װZZ>+3KM]!"%:+\ibĻ]VsGrJon*u#(+T/%]v=)Ny-/CRC:s+7 yp:VОŇ|F@ Gcju=uDYdk?1OPlbՔD[wSE+j+U@-گ(` > zo6|Y,Z˴ˠ( :씳c"!^Rômy[CfwUo KG֦_vƳ.;~M5W*Z)NVt^s[P̙V}IA,E?4 QGKhlV0Mq`׭Gö4Z5Y34y8⯸,Zpt4Ɔnkn֒<6kXZzAH\1vf4@Zcz{+R)|iq4#{j$q|nEh HX wXFGY!g|XQ80c:>DGfYFΖ+ؽQsE˯mQc-` h^6,<]qp d ڪސlvJJQp@ЃHU!H/"$LIzHv=::`d?^놥Qa ")Pd ?ʏW*k7LߜFH'l/JBFr2O'$$IEQꡀժaT!@T)JtHڔ_/1%fُYy!j$rVA%M?mswZ6z?ěpTܹ9p.,h?[A^~RT$(Y&7\ 7.[vaz8B\dfO'-ϙ}bNJgQ~kUHjmh8-e Ui"1e%Zƒ|ēwX~>KzS"ҧIo06 !!"I}dm[]\W_Lnm7T=D/r{}D_ OM/6_r-QD&Zu?Z' @Ւk飑. ^uV/UkQ6/g] YqgrUj,}8&\|@D*Pq''+6-(JŠQŻBD^F~ edo Dah%;;!m'#O2;1mIuZ:.Nqң6:;*sk~slPnΆdWCc@$V!=GWmuKn12ٶV1w;]{wsW $Ba.[RSy-j ߽{W{PN5ezMGtkٲL4OOXɲmeJ[@8dh oݶ۞r+/{ٖ=f׭ea ")  B _)g!P$!DažE,4 SKy-Z`+)mIaID;[qS:0HkAQV3UJ,'%N-h$z:Kjh̵ai9(s)2@5(CaLyЯ\fW}/n"S'_ؒA>[#s:a%M+%#t !VQE}!Pj17.&#"F+]'R s(fbZsR8۞ޫ"qԜSuD+pf,©D4iE Rx_&7 fSgQ٩GzW1DUQ|7,+^JBӶ2jZ+JV򼦋+x/(Uס6k387%.ћjX"<2Iy`nY Bzk3~ o,TZ y+׍rԚs',ygzS+_jŃ%ͶVR}+ Ԧ_7 pl>gS Iߌt3}SJ˿U{~1n8r;cS'6O`찥9y/'oHIfW͑E].AfQ]-ЩCh"YWB!"%Zxcy:!3kb6huDEv1ZS2ޔcZ|>/δxp{^QU<]$NO{T>g\T 8RRKַek_FGgxi\(Jn9gx+2*6 Es84b(>xI(cbL0f[r1L՛=5پtUo"h79Ǡ IW;x!&BPHdq11Sva[acٺD2u3>|lE?UQ̈́'q|ߪn˟%|CF݇L8L|Ӱ>$uNuVQ.AY53sB.~ūx58ǟ3#ޠmq5 &/BnKj%<]3s CZZWć(jyVʺ6(;+i2{$AGDܷ Z!)q<%K:l`/~;bI>@kA<_~$鿑'ps ER_Bm R'PZ xyyU Y MI*ˤo*mGDJ'x4?"'E=R9#7??Y3Qݘ/w͜ϷPv- +G.^}Y固ks{\H%R\@'Zq) \**wtn$]MUH Y(;&ƫoHӵeslFX?8mS>? Y\Ս IM,v?H>ᏭB'U^wXvk#tsg&z$g[IeI' yV}]գˊD"Vz-Rk@E.&:Yڻ^EPO%`0sB1΄pҧ8Ixq.xltZfEJV'j%3_V;C?"m?ʿ왆oZNQ GXf*Q\yM!~I 8v\8en7u<[&PՙJ\$x[$P%&LL&qH|){I#= JxC|)[z%K!.V KuЀOwKj 8S'{yzȚO"l xAP/4YᒤJ Y&L\En^K|?FIU!Qu/VE!pܺ8-BZf|A8g~- ]k0#xwsȆ^䴞,Lz/ȱm?YͰ:-YRHE?c7QC=hhS[7 /p>+#d/k|Ig.Ҧk/5,ÜL ɫ!ȞIaX/j6{֙! 8 x̍cߊSBbjw/-g]R%e tguxBak1Mz됺kMk cgh#δ#[k֒DYsdQMֿH' O'OCm-~r6EW 8 c_9QuF'3(>-q@!64Z`ђo}by\=改BXlq~zVOFo;m{pEP6Fky+_}^QћKl۳]癞yrUZ9׌( rv @g&h6v.Z #S9)?ˣf; 1МubIC>uR;qّxe}k/2*tz<ʸT#Ex᫴wؒxkp1qHJVߤÔ|Rɾ*攁YqCp &J >cw1F=aZ{a55v`9$T;R\(O -l{EӅ} Yr/K_ AsW}G|Z~]b$#Ƥvk8OW Z`6aQf{!34lDPFb`x٬;8)߹7 ;'YLG9J ^K[ +yݸXR%| |XstCca'pv[o|ݘV[ogCl0S)Orw-{Th @ E1OV0ZXQZ@42Nx5/?.wɢf Z!Z';m(*B0?$ѻpnW|xEa>R~Ps{x((c~p9V q*;||xQcӒ e|7\?PʼnM|`^?6KסG,u[8dAЋ7TI ݛI!=LYXxEm`C404oV!4Fd6G~9m ֽ^mpED bȁSI)͓5I;[;tۃ7BưbK@ڸU%W2NR*P:A@]gdm\rS}w~wږ^Knm4ܮ'YwR+4DD ^ @@OG($:$D אD>8GhĥXqU$JOkVcYhS 6 c9tI|vFeZX*<&Qt:l),iYHUqE. ZЉdR^97 s%\j[TvV9.ybԳZ=KpJ]g^<"7*wDeR̔Wi9&zU5*8I|G@n5mv2Nɖ\uZy4MG6\]@(r*\6S#}D%v0."9%kVO|r c m%(0&r!V'4UQ%Ō='Ǎ"LQzZ)!^p\SFCQi|O6 |V>D2vOCMfi]ПB16!OmKmRBB#SYJGXVJrRTj5ZkidMlAD{ە^vӯIM%}ʽfT kwݖG+$:/SUD?b3Ī)p57.%8 fÈ]tF%+业\.y{Eԕr6cРsZ9Sdj3+wNC~9{PjĮ֑EtFWD],(H5ɮܝ0p"D/tK^~ٴ}iLZL͜w*_\ԧRV"r/k%ՊTk1|xٶ И44vW߁ep\iȑgz͗)t.G9>lvg:ZZtʊSw֊K%ٜ@{!żfWFi4יM%vȼ-7Xߥo5(lvs5jjrj/ UPy#[=*cpcǜkP\JqFi;f#8P( 3F;+&R-`TI6_oi76ɞڄKOf%'=rA!X;wg[\2vtbYαloӪ`bZ\ѯ) X}B{VaΦ'׌*.u IK ?;1o$EG^iH*ϴEf(հd P] ū6Jz8~R8/SMy,%?zv_⽯~Ҽ 7WMjU6'A>ִSp/aX*iq1cHs_ؔwD>kmNR(~+Yk30[=~ajpWH~ʓK}ע>e.lovbXEEGWphv.ENh;݊a0fݺa3/kbO5Z;]#Sxf8 EݟL!1 Sj3GW*l\5 1.VR5ǖ.X8Ma[W33Nf̀?j8tN~\qF?J߂@ǧFaiEaقgkS=㴲㶜pFGqtM]'~-):ٜ2&^g&__xGn ?|DrënPw4%8=Aaff7Kn@||T@EQ:ۚ-[[~Ec(GD#mQQ8اiW sXtЩQ$U!EPZjtrGbA N2f|׎L|":cGjgѯUGL=w9yF>,CJOAJqYB,&7Qur?"Aa}TMմxzL_6,jfƿBl JOsF-i̇^'PgeDH\i-NP| xUiiło}d,+X}b.ڴUފ%Bb`_-yP#?_@p]K [18ne >8Elj.XtbI- t_}ab޺xيaP-fݕmÁ#r\ozPh `Dw2/bVt2Z/~M&.V沣*⧗&W'+K*|i_?E;I3 5836ƿNoT0ݕR@̓%) z u;򓽋c5EvY  LK*O`"q'C~%^P+|[{dxAҹu&4K,މ˜~HTκuUܻ>ELU l{I9"g5h7gYGY'4|g:IORBxaflZ@c%xZ]˂D勸epǠ{xIt@P#R+liPA[.zWvd~@yg&mM+]1!r ۅ[чe) W!o i ~@Fˣx w'E߅|ܰ_ujɺͰ@ 'n/d2f"UP\X "'E)N5]a~^-_ǣi3Vb -oِ;Olh3n* WhxiKkx -鉤Pӱy18}.6 wܛZiv1[bIn ]0m캶A 9!t  @DCq@Rޛ>t!3L|<ð (2 veŏA#Cyڑm?I?{(iQzD kmmEE*K M!k?Lc~:|s[üfQ9̱ Vsb3@̵yo 7r2d7Lws`Re87s&? ŽJŸ/  kq|Fcˎ$;:lvJu,GyE %saJT|Of Pﱵn?؎aY4KpI-C2ǡ- #/䋢|L1n N *[45Jr<MNGf☺i8y1GqܭȩqbǥHUs讼AU'GqȬi4$:':9nOڣiHRE #ّtDFu,Jx r)N~w qS630#b΀~2= 'WD w  4j{ <= @O-rT+5Ql"(h\^p\LSiQʆjnLz8#>tLl/D]hAҢ߬Е&b4HHSHµub!a ('KH DŽ)5#<|:tqU~(Woo"r:t?į/ŞT wǀeC4@#oV"f!ow3L@j $ ?납{N{uM$]Z?0C5#"ݷIsI5;[:Rڅ_ZR} &dӷe@FT./Z!V%29,FTOY$:dF;߷vvnLZmef`1LEL>y2E#xI @< g9ʣ4c(fŴxea K:Q,9O յy~U)W:QL[ L /á#z=lY憜O@6cQ&s0•YRC( WPpz#-9HuRYՑr6;Z+uSYK4pKe A1lޱj%Kڥ.L?,W 3q4Kr/J%4ޫNWEVv LٚN`8vj\1`TGbQ{]a!DWvxUTҙa䧊>VLr)"Wbʍkp4<Ɣ_Eˢ|f +sF:%uGi6ܟ6azi%q>hg_hl_jVGLLnЕ[ v$x 1ElO]C=c̼ԲXKygI]`JBϣǞ+|'1>oSꦍX]PaЭ_OjR:hDb:Ij KΥǏ4`K_gn/O똘"T[bwڂ2*_#H+"sTmȴITe|e3̼6Rh͌PT81X3 ]S8>Be}bgU$_H_$x9DQWy|x.e|,Ee%3o5EH6}`fUHNq}Yz$.OPszblk? T閣c~4X^["< $XUM4ZY;d}*z6U4MMY4p: IrwȪF_ԩ5o9H~-mc*=w('fV\֘ f?0Kl0專/Vy{Rɜam\b:f9rZZ Z9 {M2w;2m/>!g{m *Y6j4? xFN)Uk1/}3{h=hT~ }[qNb9wr}?mZd|6{A!vBP:` 36n4PsR8Q3n28pAIޔ :X> |1ʕRhcw͛ SѢ]w+׀ &̬̟a)Ǵ5 S_&swp6˵u]%?/9C;ͦu =R8n[T bJP3vvdIJr b/i UxHrSbڕi7ұ8pMw)<Î9NF S%vea `͵*#e"[w QFn~I<@'HT S![H( ¼ie\k'U@^^cZNPB^^ |,#dˡ)?\ 2* %\MO3=V+8̆0{)!, х҈&Y<釖k%ʾ 8Wu)<;Mȋ% L]b!1W]vs-S~M JXL9?-|ɫlhtr0?NJ pr+3): ;_RC9_A(Gi 8NKv-O䲞 CGttﰟJQ všDvv+HL@T1H$yG!q$Kj]bƳO/"戊$ CK%[!Daʍ39sѡfKNp|PF1P62P8Sjr]Ri×8[qqwZ3r gcl<% QqsW[(=Euu2a&1L j$޲oLRn0Fr S$ʔ(ıq5n\b`crǯ{Rr>Spc;#gD&lW`8jV)Y[mC,@1Vix5ܵ/.hK*&5Y} TV#ݱdJñy>/ !-:? !\1d0IYVo3"`r FblEX\u?OcM9@8lYu{ucVoy'ml Qvq6Y>c\X]вWYQ^p8зv,+@)Fe|cIJoAxDJ.+9ˀc+PǗ%@ۿPO(<-.VCQ]՞p857}S2OGaAEZߛg;`dGW]<;66*sXW\ 999~rel^6s|Zzl;WZOc]cpodL&`cssZ9/+dUx^8Ez*T< ]=j[+S \ . )SS?Gr0N銺lֆrM hiw'̅kҀ,`bsNЦ%{Fӻ-ݙ +#K?1r[>6=ezgobN-sKZ}2w hsdTUAa_% pl|Ee| *7'@:,,xhTJVV ίR JQrW`pn,IiNR P;h/"ǒ_HNp=ꈇCV(r\},_jҹs}kCZ@Җ-eXْ_9>gP>7' v5QR$qߎk<7w1 gnT_[A%H -~cP"6.* MZm7I=˥P5G{40.]hŬwSSxUٴ[]y3>m8],oRqkҳDyB.A!Ȁs~ziB,'^qdvQyĿPzG]?$s͡ =3l'a$‚q :E=ZwH F)]qjAr!WǓlbf`~ײ-y$f.nD IP4-;⫙j"L$|Mm RDOF~o3 \W^bDؒ3a^+q?|o!4Uo Y4-xK9zX ȟx)c |J 3یjJnmBl/uA\vrt]`-ZVI,'iGo7/2NQ) s,Mñg=(_ 4`ʀgxxGgRM51 7H&6mIbaVw׿{ϷL-ȸ6jݣ˻̯DZWF֑E`/ m w2p3  z<'_]$>OiQv`A{O_U>qh[̽5yH9D% ('"&NRl&o#w!qUGarf싛)Jޤf d +=,_!G•! $ƔܳCG"S(x75YK޳=$ʹ"bfZ=$HY7\l#le&I0]E~+AWg&G$!LƉ66yHH+\K2*KnH0a'}k9Uаq|[.EX`]* [%Ej[Vth>1 /X/S[[6D6.h:` 5ObUswUk;b*UgsGW\as';*=D.Oca^D]*Et1 7mfaCBŠSB",%wrp$)}5fJåŚɚ8.IveNsd5QYJ UkF!`Pjl%@;g#wc2tXX7|7,-jXX^vW.4ǧXD=D}@ECYX-.+DqK4l]'Bw>RآmSCU[b- KU1 V+ߑY_!{_Qɣ 46,O3X͸X2پ]Oz*r|tUQUXx1͌ Ic~Ȟ܍NfVdL(Zt֛'wMK"$S+=z=1 ĕ{6k/B K m԰֛^Y%Fu4tRc/+wb~_<>M3-czwMnzVQ atli.;y3qBB̔<~BN\|&+5are0핅hFwW{'rJj]Om&w(J},W7Vͯ}!$%WHM nWreiihGdMC6:oLkBs 9(vKSCY7ŹcBw^>7=r$cWR nUuɗylO*?Y Ҿ7JQa #=<{T6lKxNًSVT^>M5Cs`Ξ,:7_YIig]u Zg)ٛD-oO|MB5@LK1߇;X02ΙsBlmOa/X>L ^cJ6;%EO  HVgzCu&Њ3 : 9t ˛~SS~w@PywtJ]8PxvN6)6&W"25Yy]a@+9i9Ye<Θe9QL|>|`Ẹ#+W2{\C*E-!Lѧ1[0 ReHD%q1{Et}7,6@ERD7۩w¬ ]Ȩvy0;JAm;/p7]OO@XHu:ΧvrjQwZ; k2 {Z ux"aEu]1Uv!¾ lLjCIzJ4N\0IF\7϶]?^KLll+Qֳ%-9mMvz=>uZ4&{(X GHu,0SBaQq?pIңS`5KWkYˑ<ZATl3Vn9`?~إ8q86ࣞך.z<6W ;Y<+|YB'T7G:]C؍>Foo$)Ed9s7gDž#>p 9#bl߱uEk_U|d=Qz unJNҗ\ ͡ oɗ~~<Q| yo$О_S#[7"T{B-s0δ{/hWOh(}*H˃IE솻CHnj?l!dPPG5 F ݀/L Xi%rGZ#8AN_|#tȁx>+;v/d)Q L//kI~&-Az+79:v@$7nChW*" 34-  OwD7d{:9Ǡtk.AAȨHqP&3s@#V"'\ 8e@( ߚgj4Jt}h ef ,Kd 6e.[(l]{#g޻M c#k#]JWWnʕW4M@id<,*,ϲ~l9(8?w}cwnv{%kVNfҒ*K6$0H $   ֓q> cY'*JXcs hGdLY9́Z`8Ǐۆ^2T:Kzl$2VӨ5f`PӪ= (vլ'ѽ:7Ft<{¸YҠ>`N4`{MDg69y 6fz*-9MBNzְwؖFFk9)ZW5FI1ZUSr7+7Q%s˴JKݕbzOA흚Mg4PPƈZb{Թ<ũ<0iݴMFAXzש\o`X;ګՃa0%]U약Oyxԇ(٫56 ۏ=74MvΈ->X=Xy L,sbc F)ى h `xoƁXhRT)/Tg҄ ˌ\YUPbձ]g9$-tAԫU5̺Q}ա%[#1mpTCǐ#ӿ 3[e![H"g_q}u+C.e;p礗I@m6={j;l} g5B%_ӹYm*U.q*ZKFPEF9wV3%kmmFI=\Em{ݤ"EidmYhR {-uߍ%>g|š:]u2M疘jS9Hzz2|Ud:6GzTa~ 8QW |{n Ll 7$w>~l#>?g XBԺ(&˪&+:yGm} '42=A/?I|ZU+]XĶWdAè9!:/n3޵ς*R 4WTyEQsҥ* F[ێ#Eƾ*[s@Q;߁ j|tA3{VءrjsUI֪jzpWȫ7Pgp{tgo*f,~/eMj(Xk8wm0}1WO?za4`z:qU(t!*#oP^Sfʖ@G]Z귄6ܥfڤ$1}+7^!V_Z@PPsi[m^ɒULxUDhsVpu ?R;ROh@u?(B޼/m.ȥB2_$])^ߢ g덑j _).^2[YAy䡫@@wGstݱ BRؤ="@r[Jח[''H˩di&']Q"I\ZTDT8V&C%0Ƃ2<*:;U+R$hcBI1RǪR"5M=,Rh!~TxR,,-?"xz) D檖<}&I|:>vC{y:@;TfB,͢ I,eK3LAґ7r6ޏۛٮۍ$mYǹIb%/=Wܞ+xK֎%F8as Eo= !*ջs.>e[5P78_?|>9Z^@~-(yr¥Lو LYRDN8U6m.9hcBEm6B*30qhub%VGD J-mHͱ#k =_j#KfB;+b# z<at)=[ark4PvYXuc Bߺb89=)$i1.z>ȶ6`@2hY1y>r(,^ulqyNop x:bS&gK箯u~#mW,<Ͳ{~ļ="ͯwu^D$`wPPEdAy΀}´Z 76,J/i1)yk5˶ >⋘ vp>g68L@7TȥiMË:v5[։idA.&t&8efJoWkHH"@繝QӶ\ʈT%$z,Anh$'w3=whڢ+SrMM%7TA\`p$b]RH+TmU! !$2تQ7B&rI6Io 4#hnsֶ]vnۑvrX؆`H @RH !%Mle*SF[Q0KtfÝ"1=t>A"+dK3QVaOgq,l9.̽?{l zVRj̪Uw\V-/^NNCV1WoO)v~%g50-̐$X&O7 w@SiJ[UQAu- +S8&:i|ldz^%eryzVgihA|Cwr5&I q֘NʈK’WpS>Uv5)~Z/v!>&t( Q޵6;>ЙMU tbh<3+-뒩/?ԩUt :8Xr/$֐c99_X*1`v]K[U> otV-Qu߿Ga PA@^a=RWbrqylSgͯ"!;^R/B<]E(ͻc__! Zs̭0;eq`~1Yr;U"^[eSDrӸyiYLyS(ԳP30oxoMF0Y'as-•j SI5^CNԜ#7RFOW{ iJ@rd;Z20qUAEx*EWU]YÔ+Z^-vV6,u]q*rܰ$74;[ZRF`3S?p 9k!B8*>T j"z6rX7W}B抝wĢ,7Qb=jλZCVo+T٦=&+|WTjT2>s#}!ht@tXiF[`)b{ЎW F'?n&'ֿ=!c[0B$k1WԙAXvD\S9SV]k]4MY^ZT尶oI3z/r]#T||sk <>߂w;E}tѡ' +C*+(AC鈸Bt`Q8){ jr./ct<4eM掕UvO޵~G)+v6;Ӽg+C‡(̩,j5WӎA5tg겷fsYS+ &X( X}V ÏŖ5P.]^6nX{T~oGlaJX{( }5p_UcV taRy+`v -&Ŏ:*./yk>j ߐbq2]@.ҿq>eG6= =]{ǡdڸotf0ijuNK\>F'8+wK;Oa6Ce3oRjf#uj? 7V-y0ݨ%u]Xn*j+E&J}XKmUu< # &/d @i#(1QV2 t6B|Z?Ap668 PPWɸp]{\80xLm9Y9y. q?N,{W7>_Pd𜫋8_`gQkҿǺ[7`|T~ݲA_j#~Օn'S#7u`Zۧ+v{I}C#dW>8X>ݬtS*bz̙jG)v{_3dn~ԑ+tiD*.rNw(ZoBBkr,էT/IeqŽ휺qE$d6"Ar1y{Fc#;\-[H~Po݅b<89d2a qԒH%cb@]:FZy`lz(>;cSYv] 1iY5Tk+Y~d|_Dj-_'rtbTѮnsFogv]{{6}1b68b@bb@ *$bCmA2MRd|M:P\LpIɞ?`|ȐM2J>.~}DI@dC!;x'=y'3=mSjD풢In@["n +$L@~'y~ Hwqߕv*{֎w䁀~I沛T.Gdj@ԁڂ8bIU*X8zKUj3Dt$<6pws=k*{GZGEwAmۅ"HD ^$kh`  r1 쏱 'Z5&6RHzܑ$a>J=X2dk#M+ CJ?łW%OY҈$xZ b =vQNJiVzj+WBɃʞX%aBOYdiu+g)bIW»xО[:%Fee6o6O57(~xPp>?2 dps۪ڻ1!dcVWmy vӥ o|15 p":U]C2SbD ||8'X< 'a|F> H9(aL,`ǣZS<0c' #y$p>@Cd@#e NƦՓX L [봫{n\oܽML}?s Ka$,eI-L 6R6Tv7vC{T/vDbwӅN(uM*2mi'GR g$Kdȏ%}{m[λ[jl@fV d=r!8 $ !(CKf2H 1 c9&FPXҒ7dX1j'[ %~{1i?Q92Ukz8ZvY?G=>WZjJNKJ+:g՜t9c6;&tOuFjmD3AzBw݄|JҀXGÞt 4,k֜^gl`ht,vk9mbŭi8{y7@y_?ɳP.%צݚƚ9Ȳiun/Ӗ9g%g)IGO*e;bݪFHU.q1`uLuij>JJ>QrTi`*Rt9Q|Ԋ\,hM ts#'< ck7S#9>bpM^]y+he w/wc;Zۉ|WˡjӦvIc;U Xwk&=}( *?}Mceil8 /z$hQl+ Ж`x8GX)<vM*KTdX<\t&>T$Xv#x;YM4}` McMyzbvSvRlC4j]r7 "?D쀭W,}gJJ0i ?¼0؍-Է>J8޵ k Dr-`JX`Fˉ" Hj мrWnЦ9On4N0z 'z o ^2)Hz5٧[ >o;˝ymcikd_#S 5~j1ܷk1GƁc^&YY,5x8g<$ yEϓ( }Бi"e{f*&h:zMb)%onJ#ДT3;3BD(s„4Q[;ke}l?cTS[Mr}ɻTL^!AbO~( {{2KtඉCa3u6َW`眽VfzAr=Y%߇쩯ݐQwDV'eQ5]wS1,or_%lWz6uo!Ƨ%=dhg E ̚>!24P!Q'Dao2wZ ag3RX]V0QSG|?$ jaD{;33òޔ㴷N6UmLne%m #{.;Sq^F4sъFRdr.%^!c/"\[IǜV+Q 蓥Yo1Uƨ_9N˫%h3FOGs(Ӷڌ_ ͖d⁈hde]NZ[lc"&cM*e2RC&tC]kyWqH`c񹼟lڄHeqݲ~7ˇjQj R#U>U]tNE8^2d%h"_Dg/Apf|xg6qĜ ~FaȾXg3[٪Bqyݓ+-[yq:̿CT5Ǣ~N}r7olq'EUBFߌsVAV>7XS8\c'wwV0uD,޸ܴG,D֚_ϋvu9^`BuܺvBJvqj=q(Cf5cކ  /+K|:! =3c1|,IDߣ9^jvhF5*-󥹨Z[Q2o:2 I85 ň[AiďΚ9#%fUJ۫-[E`( 3{1IؓVh})ī4r+bܘut_DͿ? r׾x L [}i8HQ~ߥ 0 V!p~i~KEKj)d[-5ڵ ,QRJuh,ZiV-KeW,9˵b=l b1`Q!'`"d eNr qX[~Ĥað+zx6A , $W7 ^r:֓L\-#3dc\YaBR۹M\_*`JӶTyQ*lAZ%sJC"p6-S5As 5KiOl.JF%ankR*vH} ]d+6Km^yܴT%o8tk3W!|{oh$1/.oyiZvӻTߡZR>%['94,zo@{8>OQ8$ r Ye *HQ[م=1/Pn~Iuw%8(Wތ9ĉl;pi*J]t=bm͵5E ӋBQZ%ݡFE,i e09w+B<" S*㱋k> ,d#Zaѣa[PېSf$B \aG_cB0;c2ÿu]+eBj&+xW )oZXn?,"^] Dn/0}L`/LXZ$Y 3,XZƭZ& &ULV`s♋.:i`ҽmw<ƐD! G /ΊF4aE(t\(jp{uZ.WxO4Zk{?m,<BbECd&TР*^yk秏W\Q3oŚLـԥ1#oJU*$䋕W-פֿ%D \6%\ۣ{(vv7oHs}Z]82 tv즦t@Pә A"-{)06 nef\岹-dKJe>_œ*Ԥ x(#8!yI8 "=ü G Y MJHkZԁa -\SjQQE3CVV V=k_'e*wՋ!1fhԕ,!@4TeY d["F{>I_Oςnׅv5}}POn1ٟȍ\f:y4]IrHQkf\)5or@j$X}t`l󗊨'zL߀[ aE#[! &ca%} gv);alSsmW%eZWY$^80 9ԥfw &Sw­WN,ur۝tNVsDMPke!""2) szY)o{ Idn[ɛdo}63nL1;lKO~uP7'?l%x>ݺMF 5bp斤x?;(.4,ox Cz|sƷ;*Bᖊ_ae3L]pʱǵ"zY"Am/͚*pv"|;$AY'p{R-BeB e)"/1ɌGNzdFI4uBtei48i,Xw֒Ա]mַZ{=2(whyÔ̚%AS.3t/WaS6 [qZ3bDw /05|b*1sp5BCS0,Q=?}9%傈oPd`+]no 'g647qmʶiXz0Aw@^)s *2`xj={jN(-È=N q|}?M6,G]4Z8Յd4vZ0jVAP={r*hm? z kbOn@XNOYHt8c=jEeph>+vR&c;A3I^@:wE ^==Hkw<;(~xQX}8b=2@XLMLrv S%_p@tDA#Oz;ь86|.Vrg]v۷^ /bYxn#KnKd=H Ruj֦gi<{L?k2?n!ܭ'x9|QKaĜxDpIl?Նa!jj7;f>^*Pa}Xu.º+2)^9QsNdϦI+qM$zױp]$oշ6wcyAWwmDHMItOHzA+|믶ݗBQWR/*&.|>E@*S CVc^#dU\ٶ|\3]X dP4R蘖_5 4M_&Ko_|`Ҭi̼Æ$kqOj;%2ޣuGA^=̯h"J7?vy+>kZ$Vcݚ^V›}J+b}+ ĄȊc8PwJGOu?Q?iB\fyONtm5Rίþ?txKYYWTvS7n}YkXTH}ڔ% 6#Wc6?H&w9ܢj1zmɻ:.zyz Pjz ߋ{,LL,MVNWi[3w=^8Yֻ[\/[2^r>+6tek%g?=gI?2[fK>nzy cy&ub>zjGKՑ>ǟ8ur:T_ W+x/ 'LKrEV t {r同֧}K:B;8|Lw܏z}u̙- )j(:o$A3g/E΂ 9E. 5*c< Pѯ||lbguNv썔x!Dv|iz3gvh QBh&)bb';1?AH̽ 5n:`Ot%.?'v] 8RTxΪҜ\"Q_ma=)Fz.5=Y I_1emAN]1 z ,~~}y):YnMZX{bw0P &nnu,̪tX]O*Xzױ.Sc Lq6]O8kG2˜}2-u' Ml"e/ Vq D'i^P~Ҭ{"H `b>ܣ/S}~ T٦FQyG6Gжq!rh3]ɚoK&Q ؛\=2|Lkއo40o7S7ϸi 䴡q~em>[^ z8=8Brvx>HZR$SrWj5E! pU+`/kRGܓ#$t#ZI܄m%2Ab8%_ 6M" Qj8HYF :c/I]L.T25WCu-![.P35)))胴`jw ;=<*b,Y~3U@w4e|zlRdEIJ ?\_=-٥MDz:">>E:F!x/,4:84AVe&r8`w3 Pɍ1+#dŶ|s|36^aL~] J.1'ۮ+H T€!-:* NyM*["& OI$B#RJ 9miġF Zs). 9kyQ3-PH'k2iEj.CBR; LobԄ$A/> RDxNs5"P-F%NQd p3T@3^U+7)8%HjҠ"N6M5il"Lzv42X`z F2X|94)߶v^Zl{[k}Z$ν6^ܶf׸m[,i.IK0$@~0֮$M McJmIǭT#IBH@'.b@.p| s\D5K$U0NTIAk3#648T1ce{6ъL@|TΤ9`[= Y@5q;ABs*mA-fNUSٔEfuUY-c,2wxZ0S<ѕ#ޞT3ūk'r^%VU6Ն1.kAoodRU5}e^vCMPBS-!5;jmb @З01v}i_pФ$PWzp_LՁ`\1KQ7w&u0՘j-e[bnojtץXT; eGK9SO k ,uSSy/o*/*QINob~\חMJ)gg\ ЮXin$/tT.Â=IH<@ {:k-"F+jk-`_;Ǖo&6YiDN}r rc2!lC7_HEgZ.8,0·sFTxd$2tuꗩ\&Cugsxa`5Osi Am5-%VX+f!nzvQfE!/.:t77j;;c/H©\rF+nk@]oYcs`^r\w%|o)iv{Y2|@Tϙf(ݳFjI7͹ Kʈu{]>+Yu}echTЅ{gyUQÓu@V>B10 uqdl8eٖ$ y{s {~w"G{wh~\!imyFFg~îNN:<ŚG^E,t{8ad0vp*w#oN۞x{=wvcc(oㅳɐ=azU"vv$_k=y,e^]~;  AOv=mhP`_bZET䎎EQ)t;I}A@,ևZ 1""T!<&3lvEeƒ#8HF(q~J`  zm۫!Wӆ : ם5N +8%|`2{ȰUϙ7~8g{ucX ~ rx4.x2fqBZ"eLI]/tR'GXVk|~Bh& >E "E F@RN" 4l<;c"eF<TJar(Ri$UIQNž Nn$6"&`U;I >O|$Ex-ED# @@wZL$.# %8&I 2猈yw]DiX j{^(?DÂ<ɧFZZp֙<+D=YOL "pjoWvXM%;@|^Sk.bzLENF@Q,E6}pp&oUȚ KgfBϭ#xC/gF z eFc@ 0I.e:^(S)hbS/ q Sp=ɦDbij9Qgf`~v$=)d1 $'J,<ڢucZCrGrRr\mǷ-Cѳ?bVK$POh؎A1d Ih?˷ɟ_<T[z|1)e*v9;]ٺL)oHFʢk{tS40t<9WI8O_Cw JELIdz37$opo Τ딭 e\ݚwD?c^! a@,į57E4,p3~Ό]ȷfж] }*Q]#f%+=/$h>wC+-^5,FMKJ}^@&ռ\x5 sEq͌4tkzY`7&B9#zj~W~uk8fd9f+>vf;L0gX϶~3LA{Z!|oi $nqO ٜ Hq3W:!"IM55p?C+yn4aY-VYSҒ]s*W6WqU64ɥ@G14/cUo)uhNI}A97x rQC%,P3vY?Y-uQ)0$yMMem9Y %^Q \^z+Uy+d%yi|$vGNWo~0;RN3B7$BxuM0a| V 3ǷD:u[]z (}""R_yb]݉6k2uWVYdL ctw޸ tz- ̽5$eVɶkeel4u#eY&#S$;&# \VBv0V4 0Ԋ1.*qd\C(ɂWk{ Ԩ 7r7+MW>\|'w` Ǝ2'k׿K^Ed0ch[UhnޘG!Γ=3>q6xωT}~P87gL0K_U@p%DQ8T%<7aVBzO{}\Ś\Vn'ߔJZ,18OhE 7k}HٍI?/P=k7S*uRCJc VSDk.F;#9 nC~|3[gp@f c GIQY܎O3}~]lx"Fc@#a-rþr5]gܓ AV[)OKKZ\\K+N fx߬o|ac'r;jVv'd)\PfaHA9CSdl Ja}"gjZlU&IlF`dz-v=?W0jr40Dbf:Un?fThβeM,w(a0d0rTs-%)M DIżb 4+nEH+vT| zcU-x-sT+yʍqHVH5J^?7;TݬsOH}jz^Bg| ^ֱ( 3yˎ&/lfܢ3qu挑]qI.eG6&;eDm%L [o_$(3V7B~""q&t~իeKnO6%0֢Nm%f&<3їZZ2V;Mŭ`jC0ݦ[87u@3'Xzò'J q; /$$"+v넵 p0rv~ 41-DK*Kc+{ɇclB{>|5mph/~<0?몕]/@Q>WeCQ⥀;J3Z=h9FS=4uxhN#fU=g _A:Ӳ~?mwn=4/i{uy/[drNq84|}:A)FD== R&+$s8 _hD :XT'R4*Rs/:SoVgB^ EC!o_E껙. p"F 1s]['ީuxGǜ%~, cdQN8mfͦ8=}K?rOt`̕NPC%$y;.CC}Lܬ%YEZ tf{*N%] c-\KR)82M\ݢ{~b=*&p߹m}V!~CAMl)sNSS'U}z!s麝ziBXz֢^ @{=ܜrcL]vͮ49c=U-˿hlu'[>)J|' b!9̼Zv,4#^[<E,E+{wua9AV2Ǥ*{ADSVFSʊ&La|dcΨƂM,#{ԝ"5/w_ن0biC9[gG]F/wPYc ܿ z+%:+ɿyI z >kc}AjZԞ'OvQDs޿z4U}PqRd5#m6ђh8$r듔0ꊈrJi7wuvbSi_pOEsz%2&M@jp.>(ȓĭFyr3YN1@N)LYjְkfR|iovӮT u7u 3c~9DӨ I9k@wb9\y|F"䑘! H`--no;6tw̉6Lp/V,5pN6T^GK;H\R Gm-Y=sFm۷vc@pok}a^9RpTKPXғ'G|Oѕ% w}N> ?iOK镾mER`+Pg*ENZv,DUzg5Ƨ-KD >4"]@ xJr n1YD9/YLaJUՎB]R+KʞD{D jdJJ.uC~;T3QM#TO9>Znrg xHHEy^b2'5fG/d˞ZQGi?3rDz0:J\A%7q.4ҽh,M1WdD\Iv{ôr*_=9iؠX!Ml-|y{ᅮ5n.[khcԡb" jIB? K0\.1q6@ ?Lz|d^&sI:Q9}m&[!(+'>*r$Jo]d/&/v4?'G0%m_;ƓIGVI꩙,.fsCKYtfYflilih/àx+%᥇6tCOHpϸ"W`Ao WQ[.B(ht#ly%3Ϛ7J;Xܬz8^/ %6-W^b'vdaH?HP N$!_n ɺcϋf;$~aJ-|S]C@#oV!,;0m5I:c5[2'딪{zr۪Sg #3Eߖ/BX|2e& w-ݥ۽eٚ,-ncf#۸UiV aOB RRD3 @ܹm6-n3lҶak  @DP$" %EW$*=Jl1a4 0Ǿelkv:fZbU,+r'@m D%a.*K:L_ o:@}'.~pߺZOӥg,(xc>ZɥsNj5l5m?fop~AtVmi7Oz&c)_0 =@Nb-ZTc ʍ@WE,b~I-43 B]}.9`Lt+oXWJ %oItVŰM^,a2k=65o0KX-F En!OHGJeNDFRD[yAQ=Oվ tEz[Trd_]ig9l66 ~ӷ޽ SέX&Yb8s Ї׮ˀD66jat3d2^cÐqkͬu5?ɽMZ&]=v"i:pY,;Nǹ! R eX%]fʹ(HNr5 @MKKXjѽVө'7ՉVQ@ E9'zM i kFug~#ڱ\=q%rq\:{rKPZsm"CbE0i5KJo ն!T?~I':QI.LZd:˂!UoKӔڳI8-25%M-dN[v`fd4TTljo#:HA-Vjb hm%ߔZ`hn$yNH=ndtԥ̩ļܲrf(H!d te;׭;y-o6'Z,j|v}gݩ82h.rN=WnpXbCn6J_g\s=z! 4 lwe͢,T6rJlNPu{L<7tGnPz웻8IfHa.Ꞔ!^iWnztV}Knaq!/D jRi`[ʫ皙Mc^k>RՆjxw1?kDelS|XcBV3}nUh#ax}rUIQdCK^*;XA_xϒ +Ʊ`\n1_IL>%L|)bTqRc5@\l4_7r:%8M9I75q/:Y6\X6{z&Yi_̐~S/Mͭv&/oqN3c%aT/fvs&,Xhf{QFq i$苓M_q_xéU|.y9jk]\c»ҍ>Jez0g%ˋQGq2g6Vlu@Gh&";'AIRk%ӏCV"ٵ; f6C6$R-.9l\<_VIB-ID#><ᦁ)t#1Fm:9}J(gd)tc_ե9UHMN y ofS ‡7)xcV$MH%fWBQG,TxZvQgvNpe f#t~Oj{ꉣ#u7>VX0jhMRDFT_l]W!"s=RtU?'dx 3z""ۅąwL;{?{JOTuC?Vyh]^2qZK.>ҽ~W JO8J7iΆk4!>J(jg]GbtGcF0k_.QH6#iI&WgtZ)<=:+9"F6b*?lf#-JOc 8Ex<3U.<7?oqXAzF뭦ĺAWSY@ VK,$m~@n˾tv}Q%Y[$2¸yVx wU PV#$C >T3 [ (eY~v\BZj+ ( _H*zUxEڈlE;9`bWAS9@ GAŰDPt2@@8@S@4cALx)n6nVtqV,.8TP+ff))p ݻ]Z ,v۵;u9dh4 |!PP '_} >bKm-,)WI*ʢu(5EJH^UG4LĀ|}B&¢KLY2F*uVHVM<#iYhR+)RzM$ { 钵b)^4BV.۶ﯦVb"~Ҭ8=XaSM-G㯛D^u02zQY/:`1IOl>UH<*v䷒T z.,*jst$)bJ%'%:GWfT'N59#s4v+MfPSy/T27gȽ`˙7Î6\cʉ-5m"%vzw39NBH3 exELXuI8;Gr&23јV)a{VM $&٬k/^'\Mf]/Yz| 2(2I8IgUXeZ]͆ׯ IWy\{ ͤrWArոȆPަ^Tm'v_8E-|Y1Du 󞽺qtR? ~n] EK^z*A\tFb:Xj(3e=/P@F]aabk3~4\Wt!?z{ itE^%iY3d>P̧%m.4ESbCa킞=imAsWM޳FAea4tx (AxMM5j"\EfZk{Et{Wm QB9P'mP;\;ދ09LAsl%Qe#ʓT˒G_Qt3jӲ"%k6aIυtN/`-=BRfp쿝-M7HJw*dזrY,vRx&ٰ&7ٸVbP$0VRd2^iR>pǺ?)gi>&m2/:<1]&֘=-쬔O N RKҠNy:H ςU8Y. ~$+o~Ą̑Gs<s!^u9.=2; u8K, rak,5Rj4yyQQ%AsCvMNuNC>%XaP9[h)M-_S)\M2mw6Ðٜ s&oϹ}K_J ߼{a1[Z?6t`zk<>[gLĿcXC \4`;B:5>hs X_^ۡG>'>AtQ?ZMPTvxRlt)ǺݴS /- +DgWwuh%]$NwBOTΡ Y-!ѷ;'ڟ49(/ G6QxriBLj* ^+V*擧2Y[ՙK*`cvٞ5)38ikĽH4 8b>J %SW¹QފktZ+VDfkU@4R;nfbr>qkm([evL.zmn4C]ʎpSjqy󅭟PI~d(J罿sb?ڣfI^ ܍@'yleT<ؓw: ~Z8Tҫ' +t-q:CDŽsbBm_E $*ru&EcrJ|WlH`{bY \ƿ[9laDX.z' Q>%LJR=R(Os^5+;oY|lîKw9 40 y6xC, ~y2@d@zlT?~66c֩;rEgYpQXGyH{٦*Q(, =Ub~{.9E{ Ξco:'Ȟ'6ϧl*n]']$yؖZmZ^ώN)9~a]/fbɀ= k9vt՚#-_G])ta8gȢ|SVYl۱S,crT.s+cڷd[K ת S+)gTR E xY4ߧ M; fR]GPMt5ѯiEbQȰJ~˩EC#]mp<Zape-ܱZ6DϘmm}shW=A]}^n/$֋En󌵧n o̜[]uD qTVPysGvb^.^6gv..ܩ\|U݉l P@7Mu,zZЖn7XÚ;i骱ۓ(bC4^|%ToX]Y3 G, 0EYcY2|KD6l5o$ =4ӂRz$)vwsofG ?g\5ɘrU?i Oi_rQ=ЮEZ#sq(5MQ`IZUeV/^ק_)Јm 2h+[KG=%<}i ȁjp#>y3Jҕn'=}rx @ٕ$,ed]f yE4Q݈2iZ!ԑuG G-.O.;i"vԷEVy5Bрr'C2M#2"> h݈|8Emo$?V8H28o.ycKyD lMjm3a(p8oo·F X3c@3ofP^3~GuPUٖæH n;vsmD_ @\_^`dF ҶBZR-,"Y ./ W{-^.Qm/ZrroXewV1Q2 ѣY#|OP,@?w}uzmLVݺ$,EA U!"|  "?QOx\ 0H?pM^˱RtRΣ,,2b{$/v3\E;9LI5ۇz(Q1ϛӱFu4#8dU+ :w[1U\Me)F!fș_\,K`b1ʮciKa`VZZ,ao\Xk+"K-哗,a v)BjՑe*_ѳlˍ9PVQ:FrN:"]L5UOT'Ft%&hmjC@lÍ0֜6-%MV:4lk,>k@+@z-)2"R0IpMU"F$r(G$J?v̢RQ?w'eݏX#3e^VN|j{+zG4~L,8UP!CMqL.IֽHOo8G,m] `9ܒa%6n}X[RԴ0c".~(ύ)cC.S9fǞrz*CTs+ߡob' Emo}w^ڶ7ۡӂ UbRl~ӲslNrP6/%Sd˥u8[<]$NOT>ε23ieNZ-.PĎ} ֧3bRN}XGtrB<4%,9M&< FI5a `g։UiL%Vz3ɉVNDOԌ 83^@C!өeN:LEX#{Sd`Pc6X6Qnԗ阃o7Y*=\1sH5Ojwp-JAd,vVFDu ˶8W+W.ʩԩ-2oGΈ;. $$Q> eS6EC"\P|zx~:K>紜&}]}IZӦˣ|{}=".謖k8z;Fq)t^ Llͱ6<'US41%--W{гx() RDSwu/s7w5 ^J!Q,"$a]}'֚ ISaW7叕Sl qD-^vx#הn`lObt!aIBm+mp;,n1Iw7!1~]:6PqsZWV(ٺŸ*[M=gWY+y3S$SZѲȪۥRC5P-։ j|WLβ!#^M JF&Ox r3:wE Q=%=vhB|G<$FDŽ-W>=)HPjn^c<9)WeG6_଀_I#Bww;Zt!+^#%Sm̒mNtW~D q]=_|.VHD 71U;'u'gq7Ħ&n|~4iP{bn` U溤ڇ`5+j/d<~Θ08T)†>+֧iGؽ[{s鮱\u 4>==Xn7cXݕF7"n>b*Kd"A`jDqR*}z%.ޖ(l;U(Ot=L4\},H>&eTs&NBEyEbYӊYi$_eti\|ęW'r`I⧑!!fJ]dMv(hHN q>uO>!"Ym2'E.Z',5DWjP = ,6[۴[]bt&Gih\)(MUNf@ƴH`_`Fp6V31(yt9l^+SX JA0)E,DhhM'~ٚSUg h*MT!v h { SAL@UJs`u]r(nU4"8[x{ϭjGeG>[64Lvw^V# [-E{'T=D꩗Xjss>ˉq/or^^7wɨ|XtT9D4]r;S~-նC)Omzvs;,eqwt ni_EGڻ 5h:ׯ)^ܔZQn5^0:(D&QPf^,|)!*]Fe|gQ6>=o,^xKe))  igT cY8F:cvtE3-ɃP=xgj ]0Uf͍+cɋ5$t?d@q[LMA3^2'k]NNWϫg2ڶBOtѪCY1$XSlLdQo1ءԛ˟y/xP#Փڮ#hpR(J^폾VPVP@+]Mh)k>6q[-5kZb:'3Pmzu/L' ZHky!W  T0EPmɡveO<_D|g@*pY4"jYs,|{_ I'$,U9-,ί@{B9ME7<n iY@`?Hh zOkTIDj,م".Hk\:CK\D`qΨ"ՁSd}D1K`-# ۧ@J8: Gɀd G~̤ u` X6B1NJ]125Zkqf\q82y6&Es_Y9^h7? {;+C7~^j(&+Xr[:C :I u$Zm,?킎Y=:ciHޑ׈Yx[sfUc&(lGv8rC<&,_Da-FÜ݄@I7 N\5 k_. Q%G(f#lH ydw+i(z?F,=*J?rD8/*@0ra7 #ӏeG<,4heC_A~ (` (oG-FM$ }fD/VӲ0#tXwFRuơ~ǏBHf>r>|dHj ='ƪ]psw@tFL)=aWB2!UBxcBQA $Z.]byXEf44;(컅:2_!{!oww/~R?>؈ kd+vK>I0@8ard? `,LS{ǁVئ,; M(G Zts]]D?9{R(M,$\W9j#`"3҉*upB}K-$ScKǙhʴjB\Bp? vM܈ 5~E& `䇯7 GmG|Cj=1G0plZ5W)Jd*G3xBBh-̣zqF1jG,¤FH yQꅬ^V=a>ބq>9"q07<Dc@#eП31-]m\ ź1-vݙaN;V$H  @Hج@Ie0&xZ!9ohgȢm})ƜS(D@7dNݑ2L-kee}x%K 2PCoVkbw6-V7as0C 1 ! 9!0q'8:|AKL$I yRT*U˼մVZ:-m4y#"e왎$+ҝb͌Ҷ4g"?:{nn,<'fxQN^L&7 I=s9bjBkbHM9KZ1k%iljwsg Rg\:@O}g%obk}6 ^w Ğw6'`S t{w46PR`'݉=KLz}ln}jҾB]"ލ{Rt$fBx#k=҆u敕&ʘ ;X:$fpíRbf%)6ןy]jczEBJ\S=*O5JZ`kmXk u yIh$ҰX%m0ca&յ* Nne~ ,Nv +zf}*`" ¥Ɖ:3$EQQ*c/Qi+G9#X!dػ jFlݲcŬ&SVWVL'"2\Zo_[%ΐŰY׀Ͼ5;Q;mCm~XWUr908zێdi ;1Z|Z}ȇE$7mS_(Gj;Gd% 7m~N]KD2>.̛TZ'J{\6~o”V^ɈQ#?`bRO>͵$/zq%,q~?vΈn]B"p8IY/_g-bU58Δe4^H|cE34ȏ}gU``<1Q!mAPoRe{eOPEAj,U0[ *Ư`Cz%ԁ-یHc) {x{oSj8V.&=UùULwD\֦:UM?z%"&:&zr|rϋ珡 x19$mLWK:[CHm}%Ȉ-v ʢ ]Ԣ].J|g;P-ݳ%-{\kt |s'Q;sed9z(alSbKKd}Om;5* [\M6An-~ {XFH!ʭBUx}Z}wY4[`oWwnMk9|l%4D["|15{3>{O?5馠2ie*%jj$˴EH-i0?5R,`KV)j6ZZ7apa*7@L S[[ikyk`NCdmR@^j~Ȟn#иg ΝB>?WtZtH0UN6;D).'*gUD .nFW~9$=s*sV8.3wntNl$gFD~*ȷSS].3ig/#wq<SMh)%"H?bJff(k&Ԍtzll wʣueVU'(:ԛ?;8*XWԽ6`M ,zۯTF[\_m:<N-լq«ZQVxEIn/H-H֊V/㟴TnM]5Ljffx$R¬Zq3i1y̐%LrW A3pE#c V,!4Nhj[ǫf-)۬h.۟bBJ }B i6NI{Q x(ar&'q` f4@fe8qC`7(?o._`HW N'wDdId}4 =>@N]t{?o +#4[:Sb-<^Z>_ V]$L {*l %g%ΗL UYi#7bu i.|0OT,uͻkSk!4ZY^r a[{|sRsަlt+[ˮuar"K'܌kDKj7U91\6 luIwI; 5 #[cU+sb$P%ljg';]~m6FVͿQ5EkjIE}+]>^+&ݱ73{h%|&7?Em"l4MtO,dz7]>B#&=MfΰLQ)YBĖD'd'Cu`/W>|>APvk莢|#4|)$:af'SGuiڕG3fIF,N.9Ry\ZA&FJm[s/({Q1 RvJ":O YJӿnᎷD\ReĹ@%o-;Y8@x$|.ĉw=Mb&%@հݛ89e= 7.]X#׳>S SU/2-i'n`WO''L;^goB;l/o0ڢHno8TdYMvW]ߑ?-ؼunXY[6{/"d ݣmP:.2Ԙ[`,֐h Zil>՛y'ҖXD4 pXkH񏻃-|eXoAo{x w3 5 kžn3ۖ}n WE|QKN"H#jmB?Tkؾ sZYUvi%FhIݧ^,z8_e9D%ry'33 ~Tl@yE5gJZ 39ts.}O㔛Z)pϮ>ח}I[0Ó׵I'=-xF6@: zL=[qv4~@N3wF(IEpr8GCɡK!qw&C-㇪r@H-ȹ'wqhuBUF6GU@ƝȰolvoT x.*SA -t1w!}7p7`@ކnЬ7W-Rг)$E1E/Dyt ţyY$5V"SVj0-oM`jkU*/~j[ᒗRҤ 0!x,Fh}GqC-4H>\ee%uP8Jk pBΤ)xQ̠.*U3^\b bvTM>e"E@ÕGIBx\Au"qx$8)hGMtNTf{/%+̼7Pu 4P ʀQ B NvHM4T{1Tp@p~BBGz6>ۂN^dUʋUrP 8~myh9XZA3@3D@#U"}KkЎDLЛ$M4I]uow.P ~U>-Ku` Fd m9Ғ%Yan|k#G~vE΄ wHd*wM׽U6G *Lgz1(mOg~NBIR8oڮfͲnk֙,[*|y"!^D1@(  <L5=3%UybDO)>IhS{x+ 'YidNF ̺}IPezNRNW§%},yiq\Nl?8bUb3 ; PE]iF\n0sRb$&fu3WozC=%[D L-ڃ ѠRI5Qke[ܨQ=̓ j;[+z?fU?ݳWXǽ}Ԙy(yX뽖 yÏo#p2} V@]zա2Z-ihੇhGKFfVq-*a,p:~J b\2qvg;%~ka v, ~}iXY{mg{ cm=qmfnB@|?)X#xs&6nw_AN䣃n}_o/?on_FE S=`fh{vPH48Fm5 } ׿VrDghʔwE֓r%"GՕl<6N&aQ?#hÚ*6>n݈n%/31oک|ͪN Mq_AQ$LtK(r8Xc=%};}2Y߹$=p)[(IN9e =eNSly`2TqiA(ʀ Sa"۸Na,QA_MԧsgQej+V+b (̜Zn'ޯ4&ϕrT]Zl۵Jm:2<: p0~2q%Gb_WA;xnA>3qd 9!sT閥Hou;(Wmiu#&[gbcF"BZRMn%}L cKEb,1<%RhƧ]7\*蔔K*tbh nO{0[K_u|_^nבcz#B<?((G7Z?)H+ʓ\Za'6 }(iȫ;Pec֧&&1eOU֚vt-!O6qa.ȉޕw 6(ǁ#W4@]IAak=^P^7f~*~m6Uv[-rnwq6-\/U%TK#0/ =Ԓ6_O!lg65ND}k.~0m %\ xəÚ;,1[ = b>`As"޴oKHFF]r JX%n^hv *c"g!9BKqK$}[P^{ o6fAj2Kh԰bD B5jO}dzt'IvN$E}^}-@OԦ) dfK,N裹)%6PC>dz[<[PL\q>fcť`ULs3K>T&ors Lv6NK2K!!dSԏ kvh>}If /4yѱ(P띊o迮ba" G502 1&ffmUV:TEf"pW$j+(F{xL G'ZnllF:jsi]4RW3wg3j\GNGsc5S󩺹.׺ѰRD-O| MqbP3'>QMk>#{Z#s^\L8ifq_A#鉊 <4=0?iѠnOHnto}P+S9lg İ/1EIGzא @8+bHqZ1,aʂ9!A ?(r }q2Zx]_Bedx-0Fʎ`%Qc)^0hg~HM7LNݩ&KE '_A@ 8EH)YVh7/Z p,vh5F BA7[, V"bUCf- !!{X1k=Zh䞴ZȥVqMk( &X2!yIIhG@ B:;B#xĨnD/QO/4T\L٢'c؍A<jidYU9JjB7HjJjJdZUz^kGl N1ۮ* pq 2@ pW++578RR+Xew` E e[U7ٰ({Poss/g/ZopGIĿ@I1SMvA? t<1BrL']v%uyq,Ps*]YF`yI\E 0J(ӓ!Amnn d ]#'6cPGN! DrSb~IӮ.q"kb, ?G  Gw<bq>'AbnٽY(2䧶OY0WA[( ٌ^;$Pw!/%U*6Z;',   |x>q/AP EdqJ0P2N ӵ4'[Zjh0,,sD&9$}V١LVPX,q hf 4umqO㚨[*4[ 6`D6JJUIGo2=;=l2>( ,IoE{qi\>0"o$vL"k2rZTL+j^r2V$h{0B$v{fHf,_fgp0&.Yhd)"ځvakف v~)&qM,4na ߖ/`flNg)Xn*}fm-SP+PqpL `20[k0*g"[y^~1E+w|W#yYZiVg~J*yO̔ڟWpݓsGG6|X(Kti_7u xs獼<"eBADF#w(J -Xowc.opqЌ.*?יqς|е6ya=QOVlnmz>!s?Edپ= q4^?I#σ1`GRH\oR96vѮjK=|  ̖΀N5=:ն`0aXdlPh,:P)$r#hRc-k At ـiZ<5;Gf!DFy~Uy`Aדg;נ(IvCk)6՛\+~ȆDU:5Zi_qaъtuqOB1P皪o{EIdvҵai*DpQbk;!'qLSZb!рV׆)w,POCJИ'lI$A3#োHI &ݯ `,0cB'0.3d2/`.U5Yf/%pWr~ᮟ7a ׮[>jy٣i]wjh[xu!pռ=H$(+t(1DkB+z(f7':>;g1^U-aullݰ<^cpFXOj K'O;OFy^̖Q/B x>F G;7Eh^SM:WFmOC'3S}K`9%8ĤIjdvnfB5/Jp++%AqiיF)h5<`ZI5Qk}[ob]s~Z5W,ROٯΤftPez|dM)ձI9|d')1zSMBhW>m@=֧|.Fq f](Pź + Qj}6&^7F0Yeٱa!NAɳ t>~0bNgͼ{VˀQ]>Xԃ$qcQ]!-\=,in4=LCSW|p%Yг$s) ?іwg2"&jZnLe2$w3 IizK'Y%VI*PZ=ޑr5_ւ3ȚJr1LBp 8ria)d(>麏ʕ2 [1N&O^GĤOT75$\f Gθ#6F&֔噦}ڏT[7P{I^Sڬe݄VzuJRSɴ|}bt1ro>٭e*s߲dԇr1|& aJyZ?ȸG0E;~xw$[DFUHx!.*ҳ>hf=L,®X$whvD梔36 ^=}ָyQ%)Ř".$ըW6,yw\=D@uME3LF4ZhBB M mު[Tv Mς#n+L""+'_f7esm%p>Z6ύ .N&qQpkXR_ }yL>!C|DTޔDqEUPoV5.t1Jcj2vBʜMf{(g\!9vESq@lȉ) sOYXҷzkwc'ɗGB16zfg9*.?DHg0‚ga8t+AzK oh-sH I?`IH? Z?+2ޞ]}Pq8z^ Kf%G܀gěy-Us,̭20D `i6VA]Ү!p]?oktg1r~]6x[5 \ֿ 5qprLOhC *N^#eK+k<2}YҘU{IKr2Q @{K0ew tJǵ:Z a JIl֮-RY o1[͟(GM/.@/K?$.,pHzxB.U0 փO;BZSvJ3IRg2c,-ՙ_~\=}YqhHձR]2Q Pihzw*~ѶIl~}&EX|g/`WmZ\"תvJw|jM/]Ula0̊lچTY]^qXy3bWx W6 UvBcƒ->B{ڭкYVd2-Ҩ׳g]l_"EE`BC@#U!.;Em53Vmr ʱȌ0NuKUS~X`dF 6L%oKEdMm@ݹw.%`awL}C9Q@ӢXԯ%Bɖ H7I$E3ppo@vmn$mn3ٛ4eY28"@ qP^@ecoUFTmjmmɵ~Os3!xZŀ_L[dL,&͙ud[mf}% S v8L vU lh4ܣ={&I`^Le*ttYIJNsdzr6ZC9}o##F|t;"zUw X?SU^.{) vׄOe@4(gfВNlӻkyu'V(LwgntY`[>WOҋS/x5o1z4}^wc[YZ]LʭI,u'S_2בүM]5 =6>q:0ߣQneONX@9{`vҰdz+Uj4܇|Va4߯_o,7ތB >B*_y?#1pos(K#ARW*}Mh,hmʬia$h`@ 7g'ꢴ(n(ZBgK6ګR+uM5Nsu`CZYpIfCJXϻ@W[1 w4ʾT|K J+sEi#vkO\/(ngv0nwtjh_D[jݕ}趤r`%#m*duWêg'jYu1U[zlv ,|nzK}aZzޒ׎vvIlv>,zcJ*yBګlI;^M qfXh+&#cedf &Tvެd!$_, )t?b $t|I;dv5P0e#r>!ŗ=Hcvet|C%, 3 #?FFngp~73$;LCQ2?jIgQtmi*4%c15 R0S`{b\A蟌Xi' :QZ3QǕVs~%4,q7o{/KA_LQ+{ }c6_@5o&cO#"\e+F0T?U]G >,P4YMG|##z[~[>cFhT'r(D5Hr ˢrM֙9i/)(!;..kʓS#wͼYi7f jxk_ZO< {Eǣфv=Y;>-V j]} T"P4#I96Ѧ> mm<5\ۄE!H2_ty[r&'~ Ũb-`oc9{gךo clkn֊Ꝼ*VN{vU#/Q}|-~tnYkǽDF`b:iTWDzri{}mWp9-:$ض:U?XpW5kxwYx%)%Y{)(;tnԭuzH&Mi-no4$pmc$5ЯH}qO8?]_5=Ę?/QiFJʎyJ9Be1ogn'gN]'iuO<ϥku89E;NC򊹽4ɹ6 m"s95m11~vUSLrA,hs\qh}'הw %MzhH2UsY#ʣG/?@O;9YC_ $M4S^qˊi;3xVT:œ% k;='MZ|IDuKv,^bQ/}5{E6+YE {&^Mw7UOa;,6?"| w/Fj郙~yޭeM\x)*yr`w k tD'ŁNF]fӠ:r++  QGB0Z?S5ؠoue M6̔c߬|S_.@۹ih}Fo\v`GةMHˊ/p#+drK]7:QyCOrY-VnMVa$$,UjS5iyMT@D鳱򉜯d-W=ub,zQjFr-p$a˽yހX+C39x ; NV^B{,l ׎ VU5w!󉻁~@Uݧ=!y*Y#TDȀaQ"?cmgύ{d)boEQATa<)~4}{c3ۗuٯUpR.*ۘ%{㥗j!K5MW?1Yn?lucXX,)d|S?nѠJ3bAR. 3ŭ,B1lF=F~@УΪ#v+y`"OKuQrޑHzU(ͅzŦK{ )biɼV$5NZ/[*&/Q]"қEK v)%:.I/%"x*oM h޲(zwiՋ~EuDQx_hO02*,dzb q[~96nYHrEeaÃIe`z]OxaU"6$a<\~k_LF`-ZNQW*b8-1)ka E>wElPVnT<&m)IC.N.܂#lC, cH;їK1;эX@]3ޔ7#¨^O(/Sp~'McF J LLfguj/Q)fjtE7a:l;^l9lIUf˫dow;;5[$˝lʭl؃َ o8WĈY!A b32FXᄏnvlnEoum. YH H/O<  +"/>Aĥ8h J0("e@/f˯SPCA1%_m($H,-G>F*|iʢّzhowS{NDbysvƹ+`PaiPc ܕYoGcب\Y:2%*KTfd,4|kCxʪVќaT /`ӔSZM0S['gzw,hR$_U] Kex }֫5-\gja( )K'HZ|a^Uȯhx9M)(i+}}'.7Ź"&[MG( qҨlQۉUG;z5JDȖP8C#54dTFj9`Za5p Ma.aM9CJ_oK>F[]類ޕb6>Eit˒yN_S \nF׹eۣ)5.$ &a/X;=ѽ dDi¦/t()A1gs T\w?r৻'wH!|T&bnڭᛰLV;OQEM` uGyņLB7/%MFׯ6[Fe[.`ha17Go4c .Gv((͑aD9xAܔWSr=iJܛU''R/7%h wv;}r,\eX)DܹP4>T<+8]qq㣤j*`յa zB)z5A+5J 9<ԟlJa 8 @oVh=m=Ldy[`x~JPgfZ]bVX1o1w$d>S2i$i( aq y +?_KZ(z)JGhY{A7e.!>Y s U"O$TS7O06kJʑhbY. 9:r.7?ڴSVU_,ʼn%&b*۵V:#[1N}x~ _Z&R8J#}*enK9>\@hS]sŏyq_x 99mKyW\- ?G,M*Hskq'FW^Ly6Jz8|½8G -,=?51X^>GyuJFf+v!M[rxSMp"Xqr#U2h/7aND1ごH~Ǧ˖pq/oN$N=~ nînv! բJV~l"b@eE.vY-/۞AK1 g[~[/PcXGja- icjalfj1Uv2F(7{uԟ+!|߅+)r%"'.D(Xǎ*A\rɺ_vI5H\JƘLIFN uƌBK/au]+-+#㱺-iVҩW +vFՠ{=Ỡ},XAgYWEXnr{;t/ :LJsZ4+8#Z ' JgDz3/Aga> +$r"0M @ @ t% D[x`!Z_t ֎S|rT٨nOW ~ʺd? `.\O8t$rO4>eMT0j  -+?{@']tc4 Tvډ8sjͣ'~F{5vGP8}6-+?he7F('Pz/"r5_']!>3*,.*hsS߆&ot[BLGʄ=8S?׷FY~LSFe(>wnwYClZdFD+ږ ]ZL,`  :Q+1@c6Da@ ;#?&", Հ{>-U+p*x~fOkiH,K4N I+Mݵ>DS.JihK O:nND攔oj6`Zcz5 P/7d/\!q{*K<Cm _*' [0D{K;,~^O.c zSg/B(qQ>嵢}7X#b][viA0DRv8T?7&@rݟ Tcvnq9b['Ez ~=7Ρi MfY.?`B]_ %Y#.-ˉclܸmPJ7mݜ\h"Sg..ttkh,Dgf6z5G@ t fd:m / `u|YiNR´bo" C ne[c8Dg;w=6z!iamv퍥vM\oW]D X3T@3^UΡwM% &y:'xopBw۵l=iI}xsa;)4B8JA%Y!CLA%ޗ\ɝ*QeZw&N=fN,`6Wt=+J'錤ɒ7fF}vwwY۹few5k.,] I* >A>( A>|?2 MH6 %;D!"I4CS|V$Q1YPYĺl?ށ5vve tWvIVz٥_igRo/R[J2$Q2JWb[gN]|JT9(U8ѓTCxu\mՖ[5}%iwnRl>yA3eWU:Ue2`e,I SMb;3'#.hcWc,թ<ɈiځsQ嶝]+Nܮ[߄2ntE٬պG22T1<'-/Rmi9)kvMyLZ]_O('6rY ʘB2#yq4YZif~t8煄149 LFF-]+nr֔9aW 4l+6S2Ta~Kٛ uZwJ~Ӎ߫v„;ɱ`\jlRPXXL|O`pm'Ҋ' p.fIY7ʞжKSU#ٹkS9Ӥ'ǍgoG^e֜$j9*t9W6ٞ;Kلg5^‰I{h)KXL1_@Bʳֶtl^ӶXjqm!i-%$[VU| F\Vs{޵9Tb~e6v~B޴qYg2S00ܬJxD;;,yI3R2PfkiP]*U2Z-k4tgbEՎ{XyФ"bS'"A9( W: h;v]ܤ%+g i g1D{?>| OqN@Arr"gp#@&gBz6>70.m%f,3XFs|Ae=n[{5ܮm1@oڽ8є!}lJll"~* )Nl/mGCΘ}HO'E5J`#^dFSŏY\vY?\fG4&YpBZS]^V:Zc#KG 9D:~Y/Qx>OaVo}$iүQBFZQ_*fkJ?4eޟIy%JbgDfUj}zITE Xmwi oS ۮ: &qZmϭ\\Qg5mOݪy9@x!!jָ&Tˮ~myF'z^8Ei{Y""^zq1YU2[p6V؆u֬e'Dlȟ1M|SY -8I$>0=e(Ik{'Tj9{&5JEAFھXT5YVFX4AaU9CJ_Mq[-ke%hTdNi0&uWv\?h&^4* a9.څeU@(VÿϿvڿ!؜Gϭ֭1Dwn먵Gq)WpFa !~[r& ?ߥL|s~ ڤl1E-]:7S#ӣ3JtKtGp@;IJܩSw?nJٮ:df>(a'v研#?cW+O7L!/HV2L7qFN{$!'F#@tb[@<# aՏ(pO>?>'!`n`(NKn_&gϾooȄds[Tl®~'Б>/C`A k)1nrO 1 zX8݌5v>f]}A:YKq ߂3B ]H{[7=|cXmE m.pwIKSjf\Pđsh)oDFa#Rt5!eq2F g6'=xfN7ŝF9}$ { ]FWːb o]h~$t@oOk9"ŵ xxzo?+qZLwA\G  ItE&q^l]<͡Bncf{Z[ 7|;OR\{}Bň' 65#Cm@y UUE4&9TA΍ cFB3 ?{:7 '&)gVtXGC4h6?pϚ᧙- FY6~bѴ1h6?ܾ[7#G !dhJn7a,3-@yQcfrE$qF^N0nab XrO,|FaN=3eap 2$K'VitqsfZ<TDgŻoUV.ؽ0YԼjF4h2F8\SuSJ[K.Gan`K)%{2@,f㮳[!|(,mpȨT4ͅۅ'&>9(d~F`c1,zʳvȳwd(KGxDvӍH 8 4r˅Ipj\tЊ0 ?{H{v,6C#I,>FІǐlܽ=ظ1BRdX.#fDh2(\ff99wȅv mh6%ȗ,1bxsƫ4OW Os MvM0x?;8~dhKs}ü,F ;c\*0AA\5M80\mbg6: e}Jg4@#U !iOR$-uuݑn&['Vݭ[S>W(%šJH[XL@l򶹨B9*;{/v{lKiZDv2Ӂ` 陮Ts2jhJ?-dII%|HR Q#`3[6ltKY5u4w'iT*8Q g}?!QH2(* sW iJ Uk-ZS"U-1T`4ac)+Ilf*`cřqcJUMRS%Zd2SlLbNw-N#ߤkR`M&[\[^MԼ[/JodQ^.j &w]^qe)jiQxlh|Ⓩl&l(BCEuycBNTa9xw隉1YaSr,I[pѶa^M$vY4U'lLy=M#B%+NNB џlLBuI?u׏e=m7l_s0ԓ_u|4) n)%TqN nV1'rv]vό>mD Q _9LLp7>qu dD&")nd; )B4ʎΑ72v86vq{Euʰoeڐ[lY^w7$3vgO Ta?S0:]!̽BW# D:h@=!4i'hL678=vЎ_a=ae*L4!.o_+}KiILh2dJL2U3gp@ry/ςm]'.ahĹ䛄 fU.Z}Αluj~{I5PBVi> `JV?_xdnLscZ'Q 'CEAX71VQm7΂}Ox2Ԍ9@Üϒk̞&vVgD'5Lh7<Dm gATVBAz΍W-^4+TJ,mzo,Wz{r@TNbwr-AvD瓾Ue#8 yE|KeCxwnU-C-^3g( r4Nl0!r\ͽMM뛥l˭}ffC! #uGpAܔk湓n<#"I>zCј;B.jXer7*er%$_WL סMpŕ pR% 5h nbGOk"Q8n 3i -$5-PY `X[8ӸÊREQ|Sma X%Wڱ-"נJe ?0c0H5K8_| v/Uj9TY= [E|t#]eYQ>(hr ;\/⥟Q!]B7[3joև ܔY\FjYu-NSȳk#*>n߶9{pQpa"1~'f>Eypf;`|4 Z-5q]c:Caai|W(r|,!0e7؅ A5!;J'`zhqQ3> ʮ.w.u!nq (:޹Ե+WԷ\^zyNӀkX=O}>+@:]q;Dqs._1C, |5?ԟJgyp:l˂y66OyO~6Uo茮㣪Z清s-*_EXUIxF|Y5[YDQn}Cm*jfCdq\&WUg~"H@ n -T :QW,BŸ X.tU_J|#HtPjq}pBV ;:v-0?P#h mIo~xD\ >h-S+Q0R TVw-IwD'^Isk^{Kpzy=5SNHd(ś|O Sz8s;|~}i\o,]WT#=;ësb fv6bڱcw!.P#[v_L_EE'dqײi/p"BxӢ*#~1HWx hџרe(bAyպ~3C}3˳N4BХgZfu9=vhwur !RwKGG/J/۩JRs$7r}1rb(>K[ ױxn7|ĩ{,F+6pt0U aFb@^b#'3OM6~ѴmQz'@P<љͶcQC^WBy(u=Ѕ2(' jI#`|_/끍d8+Z`KǤa=ʩYI2| _+p䒚1,^oZơ"Xqx}z&rTB4>@9AnGIIaUiW1PR_&Ɓ-jld܊L[c RhIv6hh/"]jIi3/a6PfS!1MV9Tݦ4c$mƓ0u jG)uۺ^ݽs?sf"q fѤMCf_j*㮅R0] giNXH9LH}@) -XsYƺ6-G(Pދuks%Y\%3^N!ukZC4E"[cXf-S)ZYjV =V*ZrQ Vt^Vwn['o0G%'$@P-ˣOy#N_ßzhԚ,)4Ƃu4´LS%5 ٣O^6k0SwB|[][n&h٘1O%L n.4hkvoc5یD#/=hg!P2cNnĻlJ70xGҀiZ|QQړ &tzbTY^wZXZɔO iDM}h/ '*}NzI͗%ٙMPMfhNwPݧy#qΒpH Sr8K>Q=n<)r1r kl3|)*.O&|i ϾO\5@'ʥ W*7 oDy9v:6$NЁjnSyU0F:[6(.fz;G"͟w>M!h7;Șnl[ov{Rxz{Iϥ0t#BkL;h!7Gq$'=d{8w FaY$G-Ȏ|+2 nn=lG8PAPac 8iJi6&Q7BL5S|LV=^O]$T\>0chS%A";~%}C*)5ť64BrlŸD1Ffzàї#7ufi#Txe-GFdU+4$,wc}+K+<˲Ѱzhaozg}dwK^CVaڈȃABgXދfXM3Z){|[S.$KGzAyPb":n? IznOT2/`/ť1_Qc|º2o!ez("%ևk,h'B`rWF9C^ L9TI $"!t`AA'UZ|[H>ioyVkՍ,au 4@t}|;YFyQYsq\DO YK),'>+s;Ru h~|T* eĈwm]X[vw $?afl@#\>B{mW]%`ۇa/i7vvVC-Ĭִ(1_-022~ZoH Ď&b2W8/\u3:L9{:̡ݬ^E{,:o&DBjtZT  `U8)~ku .}6!dFy.+P1ї#v5~.Koi( ?#KֆG$4 ~_osB€"l홸 we!c:iUono+b\s(+s1G/HF sƈ;0gI@4bD 7"Ѡ0=ZbŵZOZDd 9+[]M5zs?umo*!DdTQ=!+ ?R|E,|$t}#9=ޒM\Gtc(qP٢:@ əqYNJI'fG/2d,Ǖbl\,y's[MlK뇻TЍ*9S v0d24 ;xX9X-ut@ Ƽ{^%?bU)4UxGKB%H Ћ(1|0 v]^2!~%?K8g4k8*Q:m.􊳇+W$/N8\?p@+I59 ԕNn H,x(c8vB[EGI+DĢI%Rgm^#Q<!['V8| 3$\~G_H1ţ% 4#EV>HQ "DgoH7Iq-9ƒ!9z#d0H XQG<_nZ$ +)1@.I :&<yQH2=hsuAB`7 ϔtC;@L0ہ>` Nl@2 `nhn) Rˈ`^xPsb-G~TR)OxlVR@x P(Ҁ@$@Қi)ZFp]B?+M?@y<5x5(X|OxwCyV膬TZKMET ʹj~[`R,߱cr@EqynXݰOFX^3T@3^UΡwM%Τ M2 EqM%v˻MKzv"cx4P%[Ȉ'x('}ߢ܋=e۹Pʹ?ljvn6٨t.T6[N+S x&&F%Kfmﲖm1ŲmIZڶl0&(Cp /8Da) Bp}+>9OOK*eՖOKv:o t&&6$LӘ핝)B{bOyZEQRƛQPOy0LGM ,AzQ(X TBĘkhB2\OTB/~"j]'d!ECr,ܒC3ʖSzuHeXL9D[dZ'C]IʩP.T*.j}tlon]mIB܆lsսJOVtu<w{M'aqlۥm4ly)98#Ԋkgw,lq DM;BzzvG¬ɡA(P𱗥Nkd?+ϳ06CQ[j>X g*qf+*zcf)oӝբ 'k*C\^3XQ&J3IfiԶ,QgaA﷍^mu hv:#IVȨFk6Vd&(,,'7>N6Kj/Y boy|lAWdzVԴ#Sd[YGzfl4G rFŶ^V|A+RU\T B@42 RE|#%eoJ)vMԴݡ7jTly;(@ (ӓ)"M ICm}V$1v>f= '!ssIGnw*>jnG̸,6S!y۰(wlS߶Y +8ݘ!OiS2\yTP'MV^,^T(%kX ǯŔ -=Y5]5/[ktae N$-`fU'wE=!2*ev7*2e˒h* 68LBc*2?-PP{UПm\xfQ<xXVUdij](bQ-]Ld:*)DA]o9Nv/[Ӎa>y!!#S 0Qwj6xeydm׌ևOFm]Kl$u(` 'awMǴgRxۂMDe7ҿ9G>19(2LKr3]<8~hLLoW+5eԎUK?da!#y5vhFF04rVjk=| JM? $ر4 )0ϔ18K;WN2E=;JH źz`ew#Ib9Ų\mQVqg;mo{93z=W#10|9ەlWP"uW 83d.8'޻ќ/dDpDcSQW22+hSNFPpRDPwNҝfTZޛ fzZ AuLyy5r|q +M˨O) QV_:8ȭ,Í/2SM@6ENEfө]Z%k"ٻ%P-B5Kx4:0t|0 ;_{Sz\E}mĺM Quh@i<iYN~6ŗ۪Xbycor)^ 'TեM7 {+7$v=+s[vWf-NvFG(cg܂GPyqO` o}<P$rW&Y"C6cQ~+ zyNGdLxJC?GjvwBs{ %:}'n[kM}Ic(Lk_%NqLEAr!G{a>k0za)0Uq_ж; =dY}z6'A=$r w'Mp!gŽl/.:-=ἝVz.Hx9N*+xۂ$Qwp_\ |S*ዔ}04UY T(GBmgo $ @To(wHz/haI-"ڻ'(Y݇Q ]JKi? _(9{7pɏ=ȟmQi2sL#:Sުe`h#`l{Ke `A0ۖߌ19I#`unH>\P'YuB?g9(wfëXž^H 6x{Gileiީwɚ 6|́~ݨDWvx)o;a ]Tcz##+ܴ Fi1&=a3o^Pտ)I%rW" -s7k cUCd@#ofPtMu[,5b) 0i7ֻ:woU7јs=lK imlYiNʔe7[F׽+ne[ mݻݷ5dlS-ZVF@Q"( (>-1D&+q8`Z&F5eUN O/SyLv"t $HkeFqZEx fZY6d1YܙxgqOcb< `>R},YCc*gɘ$䎴#~VfWh?Iu=Wҗ$ɌU d,")΅fh 3ӅEvJD%NzNML?y1%4$/Z'5Y)[X(St=_a^pt8VЧqJ@3w;ҁB,{DN3qoGMȀh*8˭m,ԩϤZf*q*V[< Kf'R峥|2GaN8w%&OE(_ͧ)PXRQ`%ViENmz$fz'2aYf؁-AБ?!t[1s50B))gK*k#kq$1bum3++DCsYZS)"}:5gmװh^(h+\ײd@1`49\f}l;N|L\ Wh|>,^ _EScA]퍇g'zz}>wFCV9ٳ"ۨ=;b>#9o _ 2jkUq0* ju듒tǞݰa?ޝ5JɹD퇜.`T(KRnEu5#L o5 *_k|~f`5fHT9]ŧv{Oz.5s8]ǯC"|)?A{r5ߝ(>WFd|V0bQ0IwT:LoBps|T*ʪ+g )#9"t rC񙳚@*>;k ( Rį=/}VM8r}d57T`l J9mx$ƺ`~rV/Wm.jhr\]BlVb<FMv߸n3Ʈh -P REu +aSvF%M!"Y^l(RbS $BEJĄ`~_+5+V`p.Uz+ Py\AtGq uUg4-ǍƧE'X\[ D3vsǝ+$a Z .LIt =7#:߷KҐ znJB0 J LB:ccfd 8; "D %y} @!tP"T<Ϻ˴z>f.9GsU*Ү_rt%\7ܑ&3Ϋ\&0}m }9-8DKЊVj 0^6-B=Dչ7.Т)4դۯWx\mv@{}KV&>/x 3;쯗ۄrs9꽜W[;|@>IH3)&j\d6:r54Nd#Ώ`|m9Cja$w谒ͽlmC:u >u>IБ_[ ­RBlւ7αKKc:l:Qm_ u%CoW3ZJѦǔ%eB&vtKܵ \uЭgjݶ7nx y5Jms}a0%5g W_]\R VS F;Evi1U2*q{UkɧSO2~QQC֛ *Еڠ:S%9Zd =W2HԳ4Ve^}X>Mu Vl|wh]W.g3YQ,9{r$xPot!AiQMmVgO1h4)GK|ėeQVCN|{7UiqӼ88b7ָ #cE*MuƊq;QBݭcnjԗHsП~kR0]e5<_냨]P]Abdo*j_2+J``:c~WŪ\jNEdZQIO{dFJƣhjJ}}FF I2bًؕ}kmڭuJz/"裼t`#NKh1:%mHwFu UH0Î:GGߚHH 5G#TnN`nkg>W>m8\3}OXxRhcc6X~^IA"h(h?y7򹌗-YERQ{W;d >)S(~/,Y7^}X%#HIT$'f!j#(h{6hbeXXwG̥w 㔗z~XhԊ;U4ިu|X:zWxeNuwfcuGECHR9^~JHkF뛯_v ܡwvުύ @?vGXCB ;{P…rUZ&ge1;2?mg_m,xLkSv6N 'Jp+,RJͳ4mLФ( ;Y,ұ;nmU#^)tyc m-a#&&Oص86MaY9ߣCOG\5v"~CQ=iG"Q2t\~8-ёwF E{#E"?R$#wVEc.?2S<7Бo%Pp#GV D&y# -3Xw ~b(8|~v#Ӄߝ|@K[ `ْ{ z>`zDQ4 'C&gk2-ОQ^&wjp6*S}Ml"Cl-5hBL^#@HGkAH}4u 2}}A 4)d/Of钗|EٴHVb&޴jF"+ fiG>.ʼnbߢCm\uNB|ϱc4TsnvG֬Khڤ2oY{s(#Q^ rq%ΞE@E*}>vsn^莣nVr,l՚vm3_u9KkZ?M)Rb=j\z+d+z%3UY-?]dP!#B(kCm>N}2|@96R.r- ŗ(I (se+H3Q;/ht•e#?*&M3*p.XyT5߭BgmqwuY_go?]{t;]Mf*,Bq%nB#|Q_ðUv̮=aM[3b%]ʶLcU{{]PvnoORe$O(n# o~)m LPS&wme}i$qyLj#jOq黙Q5uփ E:||]1RKԴWOoBՌM^ڽ\OktIIQDKlQ.bݐ[Uh^jhIdSiLo vh0 e.O(ΚcSi4m鍁%P()D NZrpX9߰vBДy;+y8S-C~j>rPSٱz6au!*\ O~zbcO|C*Ӫ8MUQ'٢H ɋOMiKR>6\ǐU:A2[0;pI^ ¶&"#iUWṮ+>$jhG*6:U{mܟ{|YJDk>W,EYUֹNح~)zdċz?PSk/0taU V@.VK]\$6R$~%jK`a~WNÕBUHa׋p/=A2~G 7PUXUK2/xdS\4nHd_="vZ|rnNLy*supP̲e|(Q#i3M9EG9{ cƓa2 Li7ۧ#WU>FIKr֌w%6Z{F5֦zL~}| DkҡMܛO1Dt2Z+[aZu&| s-4:@nj䶽/Ή[):8Ɵ_Du/a!> 6&&CdBE|\ӿxkBNYdo+í#s"=qI vb91Z6 к5P FO!r4HaF5fPdyX0ԊST)y7jK+_/џYpLjP<:xK+(ތ=5NiR^=;kj'YòI]@Z3wP7Ai2=i&:݇ޅ}nQk|~QJ{ܰ3BuSϜzMVMٵ?6q!bhf % 5oߌ͹mfD3Rg]ܑK}F(4 ȗіωwc2,Te|28|Q*`Jk 3bfǜUR*L瘩Y#`X껳sE^M5RhcZ ~3;BLFYgndPUKepGeFcQͫڄ6dϮkoRSZK[Fx,V(-@v4\gG,UL`?/g@NhhAیD*w1Mûފ$uVʒjCkh=6f>t 'E:vX(/EѾ02)*cb#W}ʵ1oHc*Ż]/~lu_PyȡQ4gDiP [ZJ x(Ġ.>8#T@*ݲX\G8_ljmaz*[0C*x,o2qNs sj*LIJS^0+,{j~UB96B "ȃ?T[b7RV CX?G$O |c_ֶ^7 :#5x;.\Pc6o+saMF/~q U 0 <Pcpq*:IONz>+Ʈ Na9xu`-Vwcx[#*d 4;ɏ-|d bN xޖh}흹ooi'0ng^' :s}]vpx1ٺq @\X:db}q[~(Њ!Ղ/gVSZN\aVȅN\xOPR"yǐ>Co "-|F qyz.;9Qg}H[RxvbA[Rv"X_5{bK8tI~uƪ:E>j{jOY\ }YzTS+Wv9lOs^C"^znfYGvFwMn4>\}Xdҩ5uZxu;U,bz:@r >Vj-=` p:GX9(ٙ8SS驃yԤj助¹rUi^j8mfC5ԛ)w&tFog;J^q]9zUr!|Fb vzBPo'z-'CDCע_DȽ#4'}ZvgM=oIT9}jň>6mGQ@uGw&v)b@CpPzz^_0'o*e&1Ӹ~a?ZZML=IғYqf亪dUCAE2d@h697Agz6wPs_/&6ƪmshEA*TUܷڊ ۸e-5=l)Xj K*l+G AnPvJl/"0ŨXI_}JIz25-O͔P6wׄ> qiє{d]J&aڞԏVLj<R[Y@յ.YHq'1FQNN'SARnBxv4Npg)~ %sZd R2KubGۖKI -)2er1.=ۚx>=떼-jF1SrV>U#<4w`EAy.D[ Ƥ"Ymm_{)\yo'ឹkx:Sq'lEzsYAIwM×zٵ܋̹{"dx|Cʊ#cn^4`!˞Csd)3Aʴ7( Ѿ 䅜$D^GDkoMJnZTz>11,z> Q L4xp8P:=3h4. *f Ww($>9Zd8,84Ln>l]0%Z3 SbuwM*wghF3X^R:5 Ōa({ K 3n\)?#Jy!A`׻jΧŠXR{;ib;\Ty1Ўן5Gyъt-={ \7qFL 'R1tNH@r>ߎbˈAnrȲ\} -׈H\f)5a=V>8oRem(?/]?@7wт>WR]h[,D'*qbYxV3L8Tȯw\֚7Nhc,*ͲQ㲕Ӹ9O|#ivLMw\!՜IpmnT)׈W)VtB" _[Æ5MUԅmۇR)mE켉Ӡh۹/j{rar wmCӗ;_uT_"=q0ӎ|&'a!=s#[ȜBhQqEWfr{ҤM[i%z\)͞VB3#7aNqo,2b!vfYsj[4roOA7.Ԕ) 2e76khbʐ'cxC>LblpFeEQHwō(kDd`ї=U%#5P A: 1?#y?Jy5#)s!ZJ0xMua71?hYBF@0Jh6Yn_ ]l'm6|vs5?^% m#l,;!; :ǃȍ3_kŘ~XV .#9Y ORU8XZ裔:fg1vNL#/w29..Ӷ3S?#nH:gFgϬtOٓk{݊:{{jEőr k 9Tj^1 |T (u4<-߱q(]) sC& swa$qe%F[96!,T:A;/t0PSyÜpzԲl"D`_\0 @r.1n^E+ \4G+o+dA|OA3$;X6, iO60h߰q<{V]iYq dsfb2,X:WZԭs}YyRN›"J~Rp* Nve bmtN 6^%ÎPu A@^"}y#̩MN p8, 4ĠK M={ ^ي^{< ʰ۠w݇Ԇ]!@@t8,y'vb92Z1$Yk!hlx"P6Ps“6b8a5.Xv[~U $IaF&E,ǣ$Vŏ#_d$xG>HR%dm_%gaJQZq ry2byT9+-K;ZT\FMY{J´gs-jZga6;/IA:=_"O'K** d1`p=!h_dKR{~+x0QڹEWڞwcg㔦. HgjJb=Hh"Ռ]IQkl-wj)=4 ~1GJ]VgZ%dždvG=btN*?u噙ʪG]N)>J[k kn>:v\ʈӭX#Ez G/ols]2[-"+Me^%̛AZD`U̚*UJ*g_ *e/#@/x<F-M+_40ݢs=8ڲA(K}Xo2:.A,ck*Eij*xI]T.%ΐcpk2 צwr$iq 5<;Uﶉv]`Υ.{tg`M%]*0 4[8rߌ9w|L,g2Y%lO\z"˝ۋ]IrQuD| HZ,a8okdɔ5EݰQzhpLHB>MRUIk T~|$Vc˰x~@ t7MK_9x]'li&|2(:z%\ky|ٲ;\7)4e.%TYrIe" |@.ϑg8C4y)Ґ&rz!h4 /lۀOk(\שm+ewGEXgz qKWӞ o9$|ҹy vٱmἺfh1I|7k e{rKuJ(~ްQݶpB *Y2.S(N.kKH KGs9K`0*^X%t/DJ>;ȀGh[;ٵz:q34!*կ[lL?U T2~t$^Mm@pw6;@i{' $ge@}68|u|S#9@qk[u_@o:8yUq9(o΢TEռ6,N3ڬw%o xT*]JL 0}V7#!sn,_TZdOSȈ&SpyY>=$B ҐMJb~쭆-ꕽ#ζv "h]D 9,NuFR]lXv:zf4əH|ɮ#xL`Kr˓CIOjPpYeʵ,jΝ.Z4'ZI=CfY%UPD*~2^o`U8`fLn,#S%Zeʙ۩O'A`CZ3Gк pK'( $-tj߼3HN:7~DUu* &bi)+^ cz ͇3;^ % 7}D; xljuS(2yݜ0\br鼎gNiAӓWMCX୔c={&s8OeٹsxI̗0AQ^Dawãl1-Ylop9Ͽk3}18o;B{Әd<þJϧu{{)*旍;:۶qiss]YoNbx.*Ej~՗)6I4Vn:+f|y; ꤌ@@k~j^f, $@י:N/ c؁b/rE HꞹQ ghTjx0@Q%=MIB k~DtAwvNrhξ^Ck~]oyZ$6345>Ӎϗ =銨c~Y>YxAa[9Ew/{o6GOrY>یW6K#?Ns$$>2yaOцQZ6\ &?"Mwւp ͧP=rjswu:t"%^/:gtd[>0,0{鿹jRQ9(teݵm~Aܙtgz> |W7?QP@ȡ=S] Syq0B]h DCH^C;aؐ ^6); fh '2}hEcGi.aB xM)nLj ݣKtEq#h$|{DPu =n'iD% VmJahl^b**KVRdJJ$yTx)QcD^ UG̤*Б(3ꓨQz@߁fG,\8@yʒ(J$X?,|<A V35!Y&a>ʡzXwW $-'80CBC'CpxFp6;B&v?0oWj2\Xΰ&j,+'3 } ķ7eQ =B;ãMMl:9z m)"LԜŢctG[oPYD0%e7o^vP_@7no&9ܳ`V7fFʁAީ`<0H);`==X&0EM0jYG@.PX6 sM5LiZ ]:\z&DG==9p ђ$r{xpV 8q"$8@9\\"ߦ=";$4m9A5Qǥ5qYϦ'MPGGŷD z"N~B*䎮@}d:k-  Q~w@s$%Z:;1Mڻ">Bo݅;:6u!!2;Y2-xk,=~W̥\3_ʂ}Sy(p~PL;޽8l(5p@b4@#oe̐ N"meC&n$[VݭwZI"g4p P[ʒmI |e6yK\T4lݝA~QJ wEуnL:%l`4K>Mś 44W`{\n뻶q[+1I2K fqQ1 i(O$ ÅGwX%>B}by͈M&SlȎ֞Z`%ciefRbZx Tm?<'F!mVԧ5cbmWi[5k3ٸ!j̅YuӔR*3PmielKJC]bi 5C&;hd"gjf.`EW:yEgv*n4 5 U-pe ff) QPjfjs* _4B]2?\jkwgq\yک3fEףd:5}K5lbw4n E(.e;ǰovz~4rV-,]weq]mNzM6(jU@("s=]Z>QTTA(>H!󷶳[2&-%'Z }qgϯyu Ο55\!dml ǰfnO$P5 |a=ijJ,_~dn{V.d.6鐟׏ZvXlQ}ߣ$U.9 %ďmal$v4,42aF(dWV竄{){aҞ5>@btƼtIF4G-Ue"1ފf9f[>h#]E|a] c׃B‚`%Q PHŦ-v:?skS&6f'j;Ё4~ rRr+szn\t[2㵧W+o+:Xc}e"{LFKo|ؖ6Qs?-dO)0binmVpq-'>BQLUrް֫,^T< !-uKLO3h1jnدZ+ͨ3nP9{[E =; Ǚ/鹟BjQ$4FEi(ճKxG %2^۔DB8$*1 I\g6D ,[)14.,gF%?Eˆ3EDpǺqO'QX|IA朂xq,EŷE#i (]jʓ 4? %0C {2?1!;ppԺ_hcs^{tQ ݡ}6gng&z qv x~2 ޝ*iSOj(L`KaOHG;%[5"9 qUMCٖ- 3EPN vG4gHlc| h{uF;:&5hD)GjՋ^'Fe(-~0ƂkMHey=tN%ttNdk.u(o%"Fi A`GS7__r}^*Y@eJ0C9BsQF9v# 4ekAb=%-< %ퟴϣ|u@`ڙY%l lzTM fԖiO GՀڙn@.sxc𖐡33LרupuciX-Zn޸m\hU*ZmlV`I,?`L%iKZSa$HY۱?ꜰ~ngҔ>?㉞xHFC}.[Oyj{93j9v8`ϻ(>Xh[|hdQQ~BYK@[( wL vmI3Rc3a âֽNY.~,5I\'iA{ UgϕφNxFQ|TocI\%dW & E)-D7dɕ1I6U{mT2!RjU1eN曮[\_D܅ꢌviPuIus {fxW?^wlqJ#u.Mhw1bL=q|Ss)-w^@b eN.w?_KIDI~Mz!Q0F F+hߐjJEG& -a"yqZVB1W1 })"S[&ٿYs?aZsM7e eFU YֽČyVJqeyE?$M:)=3 k%əJWv-s^[^CqC@J/tAHgS֪vnro}KjaiSP^;el#&X)x^?`cm"ѥD ^ (-W\zZݭ [_q}Sۅ(~E&*aH}g:u1,z]Whz] @S@"@*-SM^o\MM+^氍rLog(nT(Q6Eo lg_e@cQ=%";w xdG7228~F[ӠIQ_($$K ۚ%iWnFO2{]Mcv'a\"jʓ頞@*KзѮwD;=0^HCOaooL'0v ueo><ʋOu=r:s~,R :tOv4O mOQ0%)?|^Jyi`V!{8ʯ1F4N?7f7վۯnR ^M*Oћ?w Ɇ]&$ x ]-3\ >ZS,Q?c3GثGu't=o Zұ}0-7`n)JOɜI&L2H@ /^o%WVO:^v+,a\ wrYe5ڻGk9 UTv'J;γ`'܏wDSݝq Ba˻OuWL0 9RΓ< bN& 6O0x/U?z F[!1sOF#@*Gm~v~ ۃ}{MwvG;P۝^y<6'ձOow*3D@3oe͐ SEQ$v=7:!uZַݩl&xX`fmF HPEڤIbJqC jj/Gڰ_$j(rVRmU$#I+u2rN_|% +PьAoﶽwm[e 6$lFDȆI`&!*$0' C?Ix[z[2SZbKB-򲓗ޕjHbY[jDVn)%Jq%)!”lU=N3RYi-nK̽8%ksk]_V 1'>p_h4m>OV'l5PGJ4p^J[ZI䵩#XIMjW/u= o'ߥLjɌPK8h ,:(\ɍE|hRSb.%8,σDQ2}T![@&KfSS#d }pj7Mt)!Kq4H<XLZ/+1=v {J5fuk+ m-M|3%@K8>n%(`)d#3S^jX)lGY#uDSmD u-~r;OI˺Y2_ Xv_ގ.zM-4Q>yV$b=؞xP* T!߯3t?[S@LώeCUBd:{>_2!gHkV%_Oï-( kLziuCZw>~c#BnThL4`ɵ.{фxa=OR&^T@gyFxCuC؈# (uVr8ȣfLݽ)LqI1/v.r7\Ev΄ثԩW}dX~ze (KTka=۾n5V& r$ u~j$վ@$ rkΒ%]p?~'`Eɛŗa n7W#mxѵM"bA"gw)lpB0Cᘙ|՟Y [Dr|VnqAR|:k}i40h2h;%Wz(3#09XD-²>fi[)N…* Q~V22.%&w4k޷Y-(U]JS^OXWd.AM,^ q>2"mamB8e\h,*o=kh!KbJw*DZcjn@CMjw'6beO1xO㤻i{Qy]W% IC>n&$fj]fE:ί;DGXm*!zSϲSҖݏU9]%֌j7Ww!x/=MFuX=\PҨ~0—\OꜴ0sxNm0BjUu6p^QHK37>iN rӥ0t_PQy >8&ńKU\x-ҟ<~{PvTzՒEu#hdu-3mMbT]3|6dr:,&ʅ$6Z̧\=Dm򐺐]8O2?ދS&b[>&BkM6Q'㝴WqxωmppaĐPoo^y ,'iHyt)$A׹zɾ#8Rc\̖E5:ǛҩCWU: Mu_`qzJïwW9*z[vq5lџ 9=Fy>BO"xD HdzJw} 9\D 4Pob$BST&i9*A?v >''ѯg V٬g6x[:!jg(-s2JUU>`V2G!= kѥc]a$oM=k9U`L>ѱ) 2OOկe5g ~G6^1<(ș?%\W fbr1њl:7mv^Œj@,ZwpY0ܥ!o|~|Ő/J!#ѭͶxG+Y(2ltjZt1V. a8v]&8w7 z@Z i"/aHǷ#rL:ac5O Wk$ryC/fxQf:72MQ|Q1,jS'U)+)R^:2zȂqT Id,6(ixjZZʣķ.ǂ>T'M- }:E<1ۘ9Ta_ALW ;v`Ug6Ϋvgܙ9ڕνFa4)Z*RT3 !k4yJHУyVgdA>Doui^! ɷ$:: Jm*/4-0T .CK{f_lُ𰦀jnt0[§7q{?vC`EB>Ҡ V-ot^j>Zh4!h:! m4*$',PNJGIp[,N"Κ$Y8h\k+2}KTa)"?I:2m."9zZq##A_Z,+]a(^N6(@E8}Xybq |?|sT} zOE?j;5her6m@Bft+7A([OYfkyZ"dUO;GMHxTv-\t( A`. OɅ/^7>9fB]> u_Mt-K_Q.7 ;! @H#?F'GU$||gPq2yBr04?n!8g_Mn~o'<gHvY9z׃v4V&oF[GDj c`IRL<׀6C|E^pvGPgGbQwP;~"UAnj ϞE`"=Xގ臕ʚd偵LI->wSn 0~˯_ฝB"s946B8+̠edq>s9}[j_||U%{PuH\CufGKH?4k%3(r%wkIgh_׍)/NOd>1[C)4ldނKAT,te\1A✱|1Wȸfc& i䄫͍LxTe29`Z]uI{!WbiƋԸE,lNa ,PT@3|S9^ 0_P[xm @,@OYܙIs@Ooq4c <}|)vZiI-N!يmC8Wڌ+*10^*ӹ8p9LLA7=ӿ!wt0dk>:YCd@#V!TYl&˖A).xN[uvNU07 шB %-$,Ȓ[<(QY[5vS/)m߹rr~8ݥ&Z4G0˦vң~$Y)p ь ﻷuMuTmI]kmIn!3, D$*(5 (D! /+?D`uH-P%f3j?{RZZ&Q1: zK9|kjd|U}mKbVKΛ5x96'10uv1d 3=T[)á];^Uyfyro&eɶrTs^aQ=HVE;@O6t|C,˷n9H zF'O`GU P5ewó.^f|cZ2l)̀7 3s_PU>c>;7A ."剗ӰGKErPXTYD;չ]ҕQ05T-j4D4r^B;e5V{ +Ru٪Hoo`r ͺM^اݶ }YUTfBfM~^Et}$a^:DՕl{J~Y91ogn+Re-Åʚ[][>Wbq[}j~ީFn]%Fl3QC8󍩦y^#P)R8,y" ^t[1v8Ŝw%uKxoʏ(qرg q7|%TʼnA(꧝W3}F+{>P4du*;͂S=˦ny!$N-Z^R^F(3U}05]"ؕb:ڢI"PxU5j5ZU:DEůi kvo XUU9W|% Y/GNL>m*؈.jN6jX*D*F}5o: E, 8ZyKn|-{$XG:{t.\6'/q'mYVrqS ̚L@($AS^]K\YըmronRxU朐ڪ) j5/o܏a;t'?^,Ul߲AAROѻd]oaʨ4\JB{`ot7\/Jg1]jj Z5d{5F\va{MQFQlQٸcBt%5 hdi W!Ū ejj_ЦTp&~WdG-UK97Jb>{0 ?us=/tn25!Ӂ^^gScD Z4=ē4^z6 x-PO  c1ڜr )tӦhNsͼ~ {n>_=b.¼\-c2-j9!GWw Hz e4ZVշ'EnuW"ɜPhYWDu{M~於<)n1,ML207 VH{ňz8ۣWgFI"5i=Ga35}Q5d2EXΏx >3FqT*ÜAYÞ Aݳ ˢIg'}{oȃ,=ړ~I`@bԬbsXnWҵk7So3ceɴ8uԪBv}+>|WO=Y/広wQӔr \W_φG)Ԏв4sq L*:?)Q ]PsCsL cLq+" 2FY`fJ3?֕;`O[)w?Dlgm{[ 'Нՠ۪&s<.TJ^G?z4 (zQޏ@r-^#E< o@mcE1.FD?됍,MV> =.*qp^BÅodT"MdHT"% J\8'$#@ W8 2B< ʠRp`yd"A ?w߹1,ɋ.gyTZސ.Zm,\5(lDh֮+q>Kȋs(X\TN5|1#G~.mfzQu^iugZ$~c@L|ruõQ+j9mb]}*]r?X?&hi:YH _LJJK6p#ye9lqe$)?P Ti%#=+\7JJt@Lc\<->9$ ޓ!d !KˍdF$D=A{!A ` 7'thFmP6&blQA4Wl-dMB3m h\Դb҅c}>ޒG&\raTԟ a5>f7Yf<(NsXtq^<9rh +k1j%f0!otD@/T^ =v?DRs -̀t1~'Y`T4毋-ȺD6v!_D][V.E0zض,}D@"A@3c@3eYN7jl<-lK@1vnwvD(^@qa00(RPIoa`LBUޫ7mWd!a(%ɲ{ʦnEmL:jH_SSxFWw;[m;OkR겭Z~Ye? Ho |/aXA|xS0a[$*G;bv*&ԙ,5 ^SL"YZ:ke*9"f28-9z&3TRWFHkdjnWkV |Y՚ qB~Z14e*j#ꪌˁ?{]_[VR"65#26;j# _,r ޚUps՞lgE؝R!"d=Mq'a7媁VHC^<ZRiEȒ{R(O+`W?,4 s:}wLA\߶Iy縪]e佊ENEۯ`ѴȗNgoT'bzP95[Mm"Ik߃NCe%e0lvruCS܅San)5̀'v\]UMClUs_5RB}[.ľEr² u 3+-c~P@ O;Ԕ#9Y&=x(ܢ} F?P竣$[nHU](я=qL4 C޾p:Z尴[P 55x`9f`э?^^ 濗_ w p]}' i\3\%R<i lKrU$_"9Hm#pWtH jF"ciMXvo xKVn&9QzD&s֕8k+9fB:E]x?hu՜QVTɖ{(&R,̲oY}WkIllb }G|z8=z؋\{FOoKP8&}z+zǨ,kY -Wx:h^D*Γ!x]8|TRF<3"Wk:*nj@GL-Le}/Ig6GʍKJ4wn븐ĺHHs"bFW׎jmym6aJ8oؽKۤ]n9\#=</JV7w[z^ .Ԕ̦6z׿PԢ˾Eߵ>B QB1Ov]#-zְHudW)Ab`RCyJGm{"};=HRQCH$xl7Zlѓd~vmZ|!ffTE:E)L6f濻O%s%KWiDpnҳ4%2ٙ׌Ыu&!&i6|Ay"|K~6,f>1c|>3oZ盖k7={-o{3#YoE>] 1L؅:cz7/O>G)v*0iŬ%ǪӛX6SeHQ.<.sx碣fk#sMSS+iu6Ur2W&ro5 ]Еu_mrf~rNYLG)e'" Be߿E}3]]gÊdܨgq@l:w3 Puxѝ}M.njZ$ՙ|&̝/|ְ G(zNu?k$ 8ޤ,.6-+w ע0Debֱr:g$FO|Wd1I6MA꧟@#*L=#b/V"wa0d(JKҰi' 8r<'͜o(#nj.'7E->dfE2RI.jfqx|ᄄ"VzOo,F+H`庄x[%V/%$fHID"ɯW5C(]űDF:$3m!Fũ_XJ#+LRrv+zw#UZ ۼ>oUL?"1Hm#/o gZu3:4RW&K¤g gS(4@G~%mg\:r[ ]=w#LĢ90p*EcQˌs~Û}'=lzES|,f&Sfih" .}8PIMl+=۹ D;JJpu%|92烴8}#h$%Z*3(+m+0 5>e\h:d]iòrhwE}Gƈ4+<;1?^^H`J\~ehxCR5\}_iŰ{ezGʇ r߁(eP 8˰IJrJ 98} (` $#VpeVdVZa`S"'@⯣HfA|o&$<t`o't:sMVڐ{lmsd N C>7ϓ 9'!H !ߔZ 7eM¯ jIKi~]dȌ1[i((h+fIq7R:Z$D!-D_Hbbl_۬kY4;<(лi%yo5ba9r-:zR#ڔL S$@4t@#e3;dMm]Ʋ!뎭ݔ{lzwoUg`Dh/%)%[<(pSe{\Dv?IpNT%]=6:!desIHo { 42G`ݻmݎVۖ&]bڲ-kkWb+20s`' !g'?ql5%4LU܎hOfȓik"VjKf ՠDs:]jsb̡LĜڸ oAQ*]Y̔:;uM`NU1PVetb9^jxj5R?IIl'lA+MCW\շ) zw!Cq4"|)ߩCl21X4AN̙(56ZS։M3QjC=_]jkmSCQޭH5/3:͛WQbCv F(ݵS)5Iu\-b2B}R *G_M9 lܧz%pfC]m׿hqsvBw;S5ҽY;ld!/mYey+s5`EGFiKlծjUV* N)rPW9&ѮFXaeyg|-? mQlaΡ4,v2%^ɆLj1\Y³2Y&ɹ_H\^?kq< 7I3TRSb2&^o(9XG,+ږ7RwJ)7FjdYB@+4WQQ҃5$Xp8J#W. SGV(7so7XCxw*R=N$H!ymUX'W=<%<dst׿nL[wUɜ&N[X ݎ.`i6_$T(LΙWsʣ~r^XY kb0AcA>g{5pb6Qرy^j,6λ/)pc农&[pf*{iCXL{9SƎ6X=ڍ ;gѢ6cMK'$&chuDjYAc`=/6;)!W ,#d%e4YbPjsَ,A0ASq*q> E:}r;*IV=Eu'`cN7g"=A+@RV-.ajNjjG5-Id#cVx,]ЋycAIt@拶'1su[Groޭg {g wE#꼏Vw)] A0Q"/7[/w W]61"'tol%]d6 ^KJ/hBgiAK?D;cJT+IgƴC< x\aJw,::-LGjJ88)'' 2?x,eUD$vF.574qoZֲ٩w2Txsv CG;z8Kܜn9槖ԫ% =v;,OD2q|(~$=MlBv8cqii(F_\]0n&z3eL jQ5wQV5H(Ib1WAәqt{|Tyk=V<ζ5:"JE6e-q|Vȫ>Jy't6bỔxY$7}~#80Fech|봞 *NH6&DRҽ6dɎNZl,rOmCyKNĶS9 sHy`ܤC&gm)^D}>#oQ5LPἹoܕ^ ێwndUiӺ*p&p[5g}e1zs%]xL-W& 4K'O+fv˅WP4%^< pS+8ԨQHaӞp;vW+Uh57k<e635ɺS>B;jQmUhDusO"'ٿ x/Ņix4-g'- l|VЋ[$[۴vuԃڧ\P~#,J!aNL8ޯGt 8:gGn!?>P^a=q+ϖHZ KG#QL/$XP~;66!'\e))ƥm'djfZ}XC tK52\#a9s:V˷e_Ajq)!@~lN;IOvTCӭY1([V?߶M?Sv?S-Lp- 6K~bjgkG&P 05lnF"`\Zb"8+B7dhvw gӟb?p_tE{:kMEq"UEI7-*Et Y)[(ע܋'IҪ ًL D:KGmpCIShnݢI]@[u'l7&"H\a` ]ڊ0]hyE @8lTUkJn,m) gR1v 2rCI3MuSee96yMs{YoCHxW ]8ǼYIWL=VΤxu7|}kRJt+_>w jhGKUt׊ת8IP,d'4YS绚u"[ 8,_E*c4QiwO0v`nQFv^ZV H5lZn`TC6cr b"L<(lfbqDyW#ySID]ӒNa !~eIw;4TfI\+c?V{fUͭ1Ew/Ύ.~L,M"!lɛ37tA}JGz(˓V.W.I9 C};=FJvʁ-yadw5Iwx:fcލW3' 2;,YM;g,[~/%I[٧ל>ڝFdd-5-Qޝӳ4ęraff'IbQ`]>f\A~7 @쳵d GfiGً~ğG,g?ns74d@#ea5)]tb]U &wkpM[c[mZwI4#X`vO\D'e jPiNe`]u}+ߵ{+cWZ6իlv4ia_8~|#@Bfh ߻mL;.=m٠i׭e״Yq1AD H }@  ' x2IIx'- 1XzBcVKEad#!d*aS]%d#jLŊ ^NhblcT YE(E\Dݜ۳#''nV30mD+WivU<=rVYyDoVHD]Bz}L>NP+y\ƴWmZ09)ofb+[\YFzjh};k2TS?/m/3rH zIg_W.Iϊ{\ɠW|gH#Zi(n-Q%*Oo|v$(z%ZEo 2_n.M0K4kM5Ofw8go)K_P!k#('|T #[g>ǫLCUҸie(v5g5@q7.'61"QV4NfbV::8|ʼn!elX!ښ#!!-IH.mbSAX_UL,eG^vM-36w?Z8vpi6 fI4!hS~9/z<6kr'[ kYMZ[8b^ےD#V5]ŷU@.u2mXQ+-P zgP7d}|8rd+%P)AsNA,f|Iؓպg8 Xo 'bߊm1y@Z&JL 6T6NU%$5ck#H/N<ݥ /LϏpp|(O +cX ߧphCLCSu4 s- F2xg_3mjwxpKkË>ʸLi/NBik+͋f f뫝2!>vl~앲;v$R0).eVg$[K!A rV 1<0G;],.TNPz4] i^Z7hT~`5oaԦ(GTGLѐꂲN{go_exyv#:Q|YN+7=♛_,ۤ@Tj>Ѵ9 Mi%ZIG:uMkhcmXBO$1PCSqG$F.2N{a[==a%})cu76(P$IzUl-#Zuo!5vXBn-*1g~rc>Ws ?ڥku+FT`$6M&7OtjKuMQ4E/ G峴bJ|S1&ǂ.ClJa*LF=Is&@q]͛&>§ Ge,rar텉 &koVQ' #r1jB`P6ōd@c}Z#C.kC]T˗T*?qU*Y{Y~{v^$1oe=Vޟ8}JfºYqU(wbߢ$E=Ư*jFBM؏o'*5NTDzP(VE+)Ÿ0fN2C"%(}t5{OFrSkYd-vl)$)|Ϯ1N6e'd~9"u4=b̐#b4&ft;V]/O44\mJH-Mdt͆ҍW•3NC:0,݇mJ~tBu^zMyGJ/]Q#`,-jK ׾4n?u> TP-W#Fo-E4=1QTw#rL{Þ)됋kg|/E_#!M(AKE& zS%dw"-F,2|ѰP8{:#ʧ°Yb8ЩI䰹SK|4s:wء}_D)< J"xbLFv)Ya[E< R T[K!.G1!{m%BW?~؂A{PX~/]zY,^8zZt3݀;a^чv" v)G"]ݹpȇu(u޷C4}'tb!E_,9+\b w{i:w1 ! tm`3[G0䩗IQdliޣrA7O0?{OgR{sPo+ʍ>T`4S ݉3 "dDZNE~pspa)N\8T"o-{IU7϶z7ThEe=A2=?y~$~/ϭTHL7Ċрx`ssv}?~0Ը x/D2-"?6s`\rp-z.$tP jpTd"HWZgUR}Ic QVNBc>9,CsQnرzCh@  b3ͳbGnIX}Z= :Bz򋞆!Gg0 BG4Ш$p.P`*qt4}jk!ǥ]*Jf0zOˊ0EG aۨhP'uuMѵL-cꑯx׆EE'E4fuk]b)ZsCd@#eͰ6լ6݌"!62 @i7VzuߪD703 Aii,$Ld*'=w+s={A?A2`l:ѭReJF?ҼwoH)X}۶\ۮm{g,n.u2`V"%!%$,%Gx @ &%5iک΄4.4/ѫ>63IOWN«%Yw|wja96D4ţdX84*a5:xRNqkf7A` ^ݲJj_(x$^j0եҏL)KQB(ij1WYb贷ITٺyyRk]X͇}捵ղyE2 jT4y_H;d{[зH |SaMkŒ+TSj5rbjLim710-ftYKTΊjw1LBfARVgneՅLӱPK^cT?q8'k}A5]w oQ{$4!:=E| ETr:5JP}eU)sOT Z"4dc(eTDQ+oڴy^Ȭq^Zߌi4bzݤ(?-+OZàs5sjk܀ܟW&66+X#h5de\97w^i \Eu,GQw@\ek05>ެ}S3doOӡ5GEY@#ﰧUmXa65)JoPI]{ : mNI*KUePe:MU>K3w[I.cAzwKUւNQTgVA-*McʹX畎4Pyi}+іUP7D\=5}K{1k>vr9葻y<f~69T(,+z/t3W)ThDrjUҥok=?qJ;1i7| iiLj`&TZxA [wGHyKM3̗lVM!bY#-KuRɨ}l >xQA d v򉕠AOv3̶F(oE[QhQwL )ާ3y}mյiIlukd;EaOg4>J%^1geleYP)w1>(Gf$gfD(w^Uu9.Q܉2E L CNeiQΫ0dzYT)u^%[m tSϾ4v{ŴRXxy@D$!"PoÛ.6 p<ڝˣ_ͼC3=y3 J%-DimT2inS1ҙӲG5IVsN0F2|ό i5:D./:~{:M~FGe=1i" Zj3_ܴ@1G^/M~0SEJ .%,qDsG)FI ~r |0YL6kvu 6UjWIx<}6)z*TxAbe"YVuM ZWSV|/O0ʉ#eNP7~Q]&܂w#8JmےܩQ%=6O+&EsT?=xߢP.+BFqM>ͧ禘JR;hkeL:s7u y9uisֵW[6@f5=.]ȊU #`H|pm g6՝RX:YgRDu›uo,G^L\!55Y{/ HEY0eA0x{ ޯL%%7 }Oջ$}7Cm4@&!8K%# vp` n-ʗJrE|!+,=tSqsp(Ž@7Ԝ;f<+ȔCScOjHXHY%{:Nv@ NɊ;ܝ's\5(6|1b* p܆l{1_,|c(f7a/S301/?_4 os\żz`* yxx$yH=J, B Uh I%a3KRg&, Wk|yQXq7Tס32'os<ь#?=帬2VfDig|+OgzbtpK70ǙVݖ'fI\v 8nDdV030EQf|x]s{sڹuh "~Ja%@D_1"9F ֫n4Z΋\uYqlwUUnCd@#e NTf8MqX-eս[[aA80(EYx%4Iߺ1[=LPT2@.yv.% g^k)1^ĥ*sɆ~;K,>@8dh wnv[\g/Mj̦sT[8.E #0 (I|I(ʗ_(_qSaKGK0YDjJh&aMw)뎑Tq::8Jo5RHYS=dpRfLdٌ7&F2⯐pVm[v*r"ޓLSat64\Y7CzNjX M sAQ d={\ckx?ժ6+?41zx~֩mQ3ڡRCeɝ* y'ZD2OMaPNk|gJCdbj84wuʯ1;a:LWk{nOբÐ$CWkA=%<7ALZ@f\s!Y[ay >Pd{Oڴ9!QyY6/LvTjb9$(}bpg"??g*{],1E!jwTӻWϪV70"`d9fO ]Vb _OۥN˿ aoڈjOe4ynq Yyl2"8{+cO]8{Jurjc< W)yg1'Bq}WnکFkLS/!xGu=;lpWsR) ٟڔwMbr$P9I%P?=Sgh4k+8xGm/2I._Ct 7qou:Ȼn+P 0gU[$ l'WdW|p ⛤;K##n+_VEm. a).zCc$ ad H}Y!;!VXu”I5Yqo ͲJ9yfOG@{?>ceڨ6X5 i׼{L>d^K( G݆wu#>EZW|<z,53gigo?a*Ǯ }AKgOEB5*;lűR>;|?ʺ]-pyqE(8 _fф{]Lvy p.뉝+;N_'  󜭫=|7׏6{ 8z#,>M Bd߄P| VAGk{Po8l>xy`/!vhp7f 9Ptau06;|ˏ ƛ! />q}B!Z㦵896R91;Tx٧yg/FunjbKQy ސ|+Ag"Pbsߓx%1z#Z771¯b5GtSw&v(LA'^=6Xr | 5'}g - <zT|*W?]pͮE8p{¼p9zǧz\[ay(0!xNw$#m=eES_0e+/k;F/|Xak(S4uR쪥)hCIHsB/R5ËlPRUdNkcÖJz0|Bvͮq^5aFkݰQgb5VL!t9NѽzC{qSRK/w`:sWL_9o!ə7Lo8ےM359˘+Ao]*]\V7冠;ֈ;59.!rc)ߥ=`fSJr1Ԧ7b E:uXB+1[@6ib<iبr+ZmN:<**Q&RlbגUirX-ebR{vJr0й ,bm-ṧ&2f0l==noS.ߞ0T]KXo%Zn1;!UM $xbp`5슿r.S6X,Y &MKX*UR -HuCGB\W-&T H:۔ˢ$ 8eiGʷ˙qGAo~14֚߯%s<ĺ);cFCF;Gjy72}+n43Of2ҞylpIϙm( =vweq7jHib'#p۳z5(5,3FŜsɶؽ 9֬\g 4lo% Ȩ $8gvw[A]wyg֊IyS4(nZ؀9qQrE)4[?yɥԋe1RR?2S&[+xMi{^k}1eg%jU#GTؖRu5FcX>4s_&3Q)^?j>%9WR:?-8AJ pG-RMmZRQ-%Y1"#xFcu฻(9A[(SiK leK/C1jKՍn ҐVK͟9 CC*Ǐsȍ3kΝP/޺xo?PeȽ09ŽwS&tqe`3DO@^ww-/2C5{"uj?-k@Wg&B@@Qs6H'O7sl9d+_6W# e ]b,meO6?2Ċ2hXuc&x\K7V% 1^⬹i/X!Vgeds,_Csɤ L,7nc^RzAݤ|jjl @Ů-9nj]AVTFDuIq/0j,|2+nZIJ ?t݂8Vd[CPTy_$I,ԾO%TAeQdZ Llѳsp=6 Le< |t@HNu T s)#"RZX\'CO&tA6M;<:IZmpPN.&AiO䓛XdB^5M4&KduCgxvJf޶4#&!iy@^-0Bm{JvfBJY ,(+Z?}22e1r,fBl|XE@6f8,ljz_w't],?#-阺Ayڱɦzdy̐|=xY;4;/Lt`)A*Mֵ9c^:h5s)RmӣaRVJHPrlr?㾮v!*u8ǰI Wz/0aVjj*5;hAV 笺2l@7{v]"oٮ݃|L:Fp;niZj.?93QM-`НѺ̘HSܒ>ןWfT|mszY[> }0urv`Τc@eVڲ7q.ԇ`lUGi̽1&p? s-f_qȐ^ߦå0:gf%EwG 󴘳=>_oNp̑>OO!u:͹3v;sbX9.ѣ4~p4m9I* ˞5 f &13?@{q]Y&eOd$VABT@곢# ôlT\`7 V )V"{q*]ͿŽ R2.GCEۉQ(Fﯸmj27v jBvwz۳~k-AEvO4Dj0c}ڤ*I/dM g kܽaqY QŬ QwglkW((Ƭ^n,CrC C+;?nʏȵ8FuS{@U֑<w59+.O N2ͬTѯV$!"``~d_ryIY!utn&( {awv? a|z!`! Qw5s,HZ1NBUR9e02 ]tk iU;oOe]Bȳ X ABva]t!l诙EŒ׼ ^Ms5ƭ0c<rve,ƕ\ȥF;=u]FV{kihnoqEb,NrOo+lJM2:Rd([h15hiǔ5命)0xka¨h!?kH7$I ]R?-}05 g]!``&(+\nx==@?AW Mkjr7-.$z!`h;,a6q![HP^æʲU{a8 C(@ ?CTVrQY7V=76gǗ{b?3&s3,yի1Z #!'"bv|L!h,@(zٿgBPEW}i>.N2lꀋ(7y[L\W"UXFg2 MP0rrkض`@d%R*#Q:;u+ m'4,ZGVB8|N"hԳ[nh x˦Ҍ:$?X "s > ՠD- @'$׋+6c+bPBe,˯h*x? 0jg$0ڊ(QqE۾ @ xC-+硠Ra1)Z}@rop]>P|]q `0= cHOI<l@k@!1hL"ՀEۅOCB}D=ާ> 9&melӅOW2 ^t[ 晛?D d609Fg)'zL$b?)aח1Gf: 5ˠ!(zՋszط%qh'x>\A퓎HhpٌG)"w*M"4u ><-6d*BRkQ4UE$g ^qTFL_W^gb$/%pܭC'j)E˔dJ'n٩@x*:o(Dc@#V!=K1[LwU ĸufڈu[ԭ$Dh/ ۴,%oK!J^ݶCEv˃~ٝ}a7z+94M4CR %?x70}n^m[d.vb7j2"CCD|C ЀA@A}%<ħe%-e1YmʍKB\aj^}}8>L$<<7;ܡqsi$j l ,Г0NhĘ;Dpk8]4B!xdzPS3}Uo?Ψ['`R"?萏K %4ңSӽV~4Oy\bn'YhlbYmɈvqbәN=eRMXm~\VѼ_W_W4yI"iCE)Nq)~xdUhQtLܬ\fPx-8*XINrWB"Zʼ:Zn <t KZyRn*piu=x y}0RJu Yks0xpd]|\[2%svl}wXa>zn"Wm$R1pԥcv*ﱟXIJ.0+@[ጇ-#V?,*8GsFݲ4lsĎy%=?bkN`MIfx~S9Dx3DV7植wY(ș944U̦Ar&JYZ.hޛKCYEK^.[}~gc" ,f[\(â$O3f]1bv^򷺂;bIvUYJ;9G0,xxW$~>HRPo`2fy6ůڠmWuÇ^Ya"Y퓍U\/7ZՅaw O/١A?<ԁ8f6,*G'ی+#SJׄ1*UzhB&Jd-ZjN=.~͜@#ˎbJ7R=Ht|Rl`o T(l')~< _HT+5a8xe"1et!$9B570.Mߏ6; 0GOZ>iOb4v- +n\r[nkWd6XX^O ,4v;DT>7*N5\|*H#1ZnŹa:\R^Iѧ}%}^J;AtDv#6l WH]:!g%8R!ڤdY|&^4*~B̾ :5 sk7z~{,SB+GV䨸#`3%&L}b-ȓ2ü9<[]ȸt~򨶮,JW1t-_茮Ykp<fxZ}=zzgw+xB<فlVӷ?l$qh /nizDС}u] _S[_;zJ/|!v׬5fC =3jۑnP~-%Vgg_rV%f7%wZ <-J}j>9 "]l}EiZi];\g;$ǠJ},QOs;}nk lmt'M-Mp * <A":8%=N=LI^G硴U Jt MדyÆnYPtcHCS! ⟏. tF峨0iH?Dq^],ў.D3(d+)ȵYm} XFF 1:#dqLbRiNp=GG`DǒjDh(zv /kwfc$A ܜ M.I!|ЦߝS'HT/~O}rR>>@ 1# O $^XRAuA򟈈 D]zhZB µrB-B-׌K*lj)/6 P$/Q]#ps w ˋZ/J"k%"&Nl* Ƣu!` *XQ_1DlaB9Yۙba?fg6CMmqY? X<^7 :\Vz.ϭqT igP˯VָiS' *R\{PꡟJze}tLa\ռJ|{yEC* 8JR^_%~/w V^uil+|U28zcugt8jHJp_b4)%S =*qCq *qNQGt ,VҠ=yR` a.FceǪ{Wg(xIdlc? M'2Mį:T"68-JEfg!H CVhj q2Ԗ"aaԏf/iPtN._Q"@)'*9^b? 3C2aEµݣ<cQznOVްF3T@3ECiQH-)6Ն@qGQ28NMv\vɶ'/0Xg`dF I%h$ >[6*{K*@Qv}݃}}e-w e7]tٵ2VaeK>%)T=rmvI™+usm1+@Pf8 -(䜅$ADT Ct cέLwvUDǖۦ#Lo% f .v^˘BQ85ۅ 슻 "+nS͵F[1p#\OkJMΡ4vk+9ă!<[͉m-l9̋rܖE}mm~[ũ$: `'D=;܆o%wA%)rx V"qL͓-gg;6(s#u)x&M6w):}YvKۘfvU?{J^ř=ϖyB"bЛo/tb (J,+dAb7$ls ڞ*PPOiwokTM!.?ؿzOh?ES4bXjt=/UZ}*z ¢x-^ׅ'd1DM15|QLROmTɾ?]밿k،E)6N7k6shc2}EE蕩fI;;<9K\ƭ."\8F壧(kP5~Q7ݵ}iaw+xIE[_Zc.߂vk/|?/nn4̳"=Ҵ0_5e?k3 <ŇḄo9vFZu{,iHkb2Vp%b؇Gs8r"/9Y>O0Ac97DY!+M1ws`k3 pKI(jKQʵr+IK l^gx9)BAMѳcQo+,Y=Zǎ~BGaOPlO?F'c5Uoat׉K% d>:E6VOqG8]in#Z^_Ql9mjToUQa\3(II'|2n@;qhț0Os lK̩2↜87ø딗3濝og`wg@ǑJK;Z ͕J#92~cb0Tc]E@4y1,wlF d{ĜnkU,3}yKJtw݄\yf${kGy /{E*]KXrveC[͝; ҙ%ܤF8.XA]aLN)Gm":֭:Q_Ǿ/Ӂ-_%,vƨ{dX K*w0K-S%ju⺟m2Z6!h^K)&,9GntyJЕ5&rXv[okbbȒxQlNpw Nn,N?%-3nO'Qgx3ZWNw.+[tN7UۄZ~:.^aOhP|t+h2sZ'P_Rּ72s7MhzqKGFQMuj`SԋoE="O'-r'b|t7aI s@1(!U_ǒȻ'=KĺKIdcd];\~4a{ONYM1+v+ S|ʹCd[m+Rc|N=m箜~Mɶ.y|5<'W=sl:Nq~n5WOyQɱ&kȚ }'dᜒ%ZXB\y9h+Y̘k5<8yӐDn3k|QN{9>BW۩g[Pϡ"ǽdn#@諌uxݺhΙ%]CIfӃ}[E c2GAϒz*_.x/1~zwkE%dx&^bŖ[R]_^*#i~;Nu'=οH iL<u_v*yw͸p'j ֠b|l88jO:kKw&B;&?Ǘ/ujƱ7m1pA{z wTQmR>lEQ e,qǰ>sˢ7Mx9u/۠m׵[Yv ctacYR9K mDiA?J#E!~9zQU@,&N T*iM5XOCӂH/}%?x/τ4CiϮ5W'9Շ˙y¾?J"?Q"H"M3 GVgpʫ8(^LV'°9]3i>z" )qcyBzvFby3t߫7 0΍{TiE}ƫ4_%i5]5ҏw>a~&+xӃNt Γjnh %AHh=B%\Pڼ Yflu!phe.lcߟP }M&P i֧'tTI{`:<{cNtEiYj]g."'WEﮩ'#h&NꞸ5…iG p\kB1%X>f{ֵ /["GU5sl .k|96hґq@ .Fd7Qf~]VUp)=CRFR)"vNt])N a^3O\ZL/Ʊ4wYQDTxԸpi\/dN bT YCΎ^]FfDp$'Έ)R5J9e^ɢ{}*T 9S>uv-bkγ(]VG\olP f[RcͼEUzo9?P>Et%ʗ\ଡ଼p]m}f<bʊ;POʞ%Gk39mݪEwj_[뚥Hއ&j19ʦR1=X(ј:Vl#c_-11kK=HG8/BLC+ sN<^߲'c9s:3,at݇kȾݖ{<Rݏ%uRYc5#H#aN0pZtqj5E4[Da^@XÈ:ϖsďl3L sOF`FN3eƈ_xs_.w ~wOov*.xKň2kg",/1^!,S6ߝ ZkϭW3HvuߩHkrM%"'h,ms ;zj^H-|VxM屬F~Ꞽ^!gCjmgRZ %|MFr&uhSr7xdDUc K&4Xr (5JҼ tF 86j;3>&K٥l.. ǚ[L`2ts+32.K/2aک?IVs2^c+٬ݼEG䚯^YoN7;juwcFR@/+S_5GUmg sW[ә@MꗯԊr),u"`Pf|槃%dQ~|?;D]'LjπNZ`~hg8;6^|9S<ꥲ}SԢ2-vto}Al_MOc>[x V=g.j@4CQx) @P|STN?Yn6\Vt&kw wu2M(gm8p/LOIHLO fza6,d#}k ,Dߢ[llQv=2-8Avae}A]axdmJfݬwiqv-Wa$ؔ혼%ww-[w7*/yܫ|u XCv[vӴrdf3rԢnǥDE;]YΜ=CpR U8c4萝".3p_"ysܡnD6y;E76 %{O}QҜ )ʹIQ+6(jKVu}Kj߳@c#0)t{N)VV | FűeG%|QMobuMIRSEFZJPv"{DovvN(")3s 0R:c=^WJ{Io٩o]s`h؜*rU\svꅷMANݦ.)"& S>w#í1* nFErDžnV!+Tq!qk+j_@r.mhc*wsU~%Do-{H.;B+vKG[ECP_Y *nmpѬuS+wlNȑ 7ǥTCKkJPmEyʉ Mщ)3Cpi]ĩղ!nHl:/b@ϵǀ`>XٰpD$R:J vc]BA %92P>ؤKBrFͧLUBcxP%w, h~6XBT}h4%eG{R\ѱg۴5,>4҃>ȵ3t-Q$ؔlg3hz-aŜl/.X \]NNBvk_+āW)@#jE2N-ȆbWD "Ϳg cnxOpOׂl`g'k~X&Ȗl]47#HIeo'㯼5+ƬORj̣X_U9[tmQiPI=JflUdwt{*YYFU^žmIW͊҉`j 7 ~%ӵWy99aUzUP̦kSRY=.תd3Y CZSgRϖFm4{+V3l˭.n{a> $$aDϊ7g ׿Yv|a[u̱:7ʢga7KeoGU~M5xOZ:2>o_MQJdPV̄`Cʪ)!ywxVW-Ȗ587E%ڼ!=rlJGuXKx.vh<Ţ=#: LnCf/Mr?IH܇NX (z V|F9{c,DˮS] 66?25;6ˌ-('eb=Hm'fc5.$L?#˔푙wצˋ8k׃6NKAH^p_+z>wꠥ9K} YWާei.D1ӊPFC4e vd*"iTi Z,qzKW9 lÛd"*uVgs}sd'xϩeMu HOWߚ7Q̛iŜiwE9=^fnd̩w-|ڥ `q $زtJPU^JVJp,~AY(J_{53»S[ T}s{Zdֻ‹zxԏ ßw}y|fׂ9^]}zwW/D#YoHGƵuSo= [OlĽWص$W$mM 6"fde9Py46qp=Ky;̍i#L:cπE"2 C/-hLڅ\.2 vmҬXG_f*g-RoaTH@iB+zr#<0U|s ^}TfMh)}<a}TЃC|PYwʼY.Zߗ.^|)?n?V*ַ;RCaTL[t)0oSWxS=OdC":éot,_X{z8/xyz"+܃ƨy_z/E8X/cԾx{6jCO$Ѷ}|%. _b`sمSo0$>"#j|"8Zc tV!>G̴Ÿq;!4_H3? x.b }AOnh|ˎad #_By@fP:tgDfp bH?kf͚ T|6@) TC̈S',?]=PG &S-}"I S)L4eq8?+@*OD?fYg7%#ut6>e(=N~4~Q/@%=8)-67f:{Cl Q`~BC?PH&CR67iߣ tt&&~g[Jvt|h2!ќR;>=~y6mVآ;gB (rpc20&kR< ƨ^0ye&־|Iْ+= #jmsXI&NAZtC;'=ofq,Fgi]y5yulHIMq5I f̃W^ uTnYkذ؊|b%^hZH&5yct}4%>p;Zܔ$_~CR*my-^Ԏԧu cyD2UsӒ&pq~!ݣZTKq; # T=BUi.붆a.hE˱`KsKʱ]9J$ÇcHwj3 w ̄6}fAx4RF PIIذԏ32DI/3s@3e},9ڶvIuUˑBkexdh $ -@ xVLڒVvW7Uuʕk-x6g[T[m @@fF}zukz[vlkzڴ[[bdQ<" B 8ă -/Š`#"N眃ZT")*SSeKJ\crrmQ+l?硡*肏EJ~̵5qIvzG2R5 ̧D[^j<꠴mmpQ.JaB_N^@ D>je +m0ډYiIiS"(D;X'>, $:O=sχ6<8hXM]`TAZuAROS2mAq ڲ؞> NLqk=6m+zܼF{+PqqV7QbMJ[d .luĔ&LsM?JմK] `j3^s?SN OQ'}rg!] =mL| 0 mi \hyF9; ĝ+~\G17 #|"JjfƬVB;lwvDKܫ{w7]g2Z m˱[TWͧBiܯCtD%Bqϸe|(S֐ѷQ'R5ɌGTsC Ds?)dS,)MHNC?BIeSkk0Ula0Tzk\@UԼwgތl-l!| ǶqiW#^ɳ2Bpw^ e*!,Zc9yxFjKt@#eՊ I9/45kWH:@ iી-HKY<,rc#f¤2r{i.%1mݎe>M9%!nkZ#S-7ѯNSͻft.PRv l%S,3GGk6D} SPTi88(e<4Kc\Z"hJ[.s>r'攼s?o;)H{ KZI٪BpډE5U'P6?I`wo}ܳ 7MKU6gdg/3uj*/44=])__T%, r]9N~IPO 2'kZ/,PlwxE`<|m !dkSrw*99t9hQ yP/ }<l#:c%4:t$Ɔ{N2kfB,l3`88(d[ s+Ix:U-oڣ2֨YJg5jNm$=Pavȍᵾ_ q[ҟ*lP3mP tAfaNr܅1`=}eXԏݢӴXLycدFAe^Й#0u;y5)2-/ߙieEHIA{+JXGxI $ءeH>CX~uH/Y66`JwKjM;>gL.f Mg,$d|?ܛ?BŞɡ)8yےJFŋjg~kz<u>6GfxF)xNƤttvox|5L6.l7~Gau&qRvZ'>Ksbk-mV(ڏװbX8'm!2hj =!_}  q?($nɸ#UM3wVe5Y#M7޴tŎ73/ %dҳ&Sܷ-g>zn:D:z cUѭ&O^  F%͎] ;CǦdO 'tZ2|Vfڮ6KY>Ӎv w㻘Ux|(TL|e w W||ͳg9]6w^*oЙgPdL의z3ʕޯ E V ܑ{R6n7?@%!._?uc 1/"{BQ|Tv:L}Z ҧ\zmX.+ \ǻmݎ,#I,aa _I+~}CAfXb{[%{[Qi:M ^T5n<վL\rjO?6yq#$NS_az>_={+S:!4ybwFyu+u9y$"uX.*QΟBv=w^/SRΆ\Xa"2x/"Eji4;'5{ONahۧw.~"%=3iCFvk9bV]4.IrFZ {W $'zkD9~Q=`V&?'So sA`mp7lqhfnR!&s2\*+kŝ\goςM~xxr5^q.p.j}KL7SoC &U{fD>Ds lY)x `/u:%Z27E; X/CJy~fZ0b(ƒ] /xQ~AxE߉@G+NQ+d}CB>EchKzUߌi4@@T^:V s-8Jt88g~3-t:8H7evxmMDHαmk\$FS-t LSžE̵IT̗Ŭ+o!K,r0th+CUE <@8@ I)mb:?ZqF˸'WBa 2(}*|lLE D\t1s/w>WTwt)-Dj(Jl*7R"@';+XьX-B}eZq*O+*Xmia+x[KڪIAKE}")b:H.M$VnEa'Ao^&,=q*Kцb%yf10)xTEV!/*UP;\8Гو=̯Zm?}hڊj!ړ]Zۻ=0-;T^L?zn&CN߾~G LK%GwMEc2ŻϦV4>T<*@pfSZ>;lI02}&ctuLkš 2>?SE88KfƫҾ̲Lu"6R42M!f˹=0ڵxoti1_܄ZNօSlvg,RWj"ACCVH: ^U]GZi+뎖FNAoVA 1+zjGSYpk\qS^s9] ^)% ߰K!%K)k츗a~{kDdJ31x&7dY:\.b9PXE!7}'>w$FjRO`گaطM qsiaБ{Fl8L2;,Zgz!+Jɭ~G7rs*ԟ$[|7q-꺾f`g)򲹃1#"VRs9FrLNAʉ8WyV;Txg+IW:uPaA#(} <_*#h%%ۍgVW+/|r +?(k?|e ?UZbd|n%~_0F@DL@T͋.R- UBhĥ^EKHs, P)dTPr65;@S? |4&hӴۮ ꨌNT pqѨ@id3 ER5O!χad\QVk{Tԗӣ4ʮ3(ϿLei2/"-#-4RȄha|`ht w=aSs$#oqZ T3T@2EE퓃[n^d 2,aSHHTtC.Њ*$uhiiB>@i o|0(ZIlg;]/W0ZiL'zl@Z7JRI_%Y#IF,!@#}{wڶֵXݍ9UY۵W&l[$P$0833I@)':3$! g?A8P6Bbڢ%EG QXQ#!q忥 Iˣ(qe N<04~ZdÊ٭Sf}`Ň09I]- N'>RG=-M ,Kal%*-}mu{W4]jHŴ.'-[4y;i.쐨I};hf<+,~V5fEjRu1 T*6̘!\Kh.ɪh]$TZkQ?ݴ cj֭cvADzI$U: V q 2AOJU]5MOZY q*Mc]h7\/Ŭ>֟Y-^f yy~"v.6ǟ~S_,2rhQH )U(U 6=< :m _/^H5$)* )2Ti(O rk!h6CNm.հkL&}׉GhTZ"GP,Ou5Q2iGj2ȭx=3=V{Umڗ^IUzs76Vd96&i[ R Is<n׽,{'&ϰ_ugrI'yzKmi1eF7l@ BH;*Uy*3z t0[G<j#nLPRSRyT3%ɴLb%njWQIM T_6%wbJ%ہ|?Żl4%6 5yGãsfn_`z0:$JJSRXwr*{4y\)yw˾KUVv[p rQq ^ se͡=Oуd;j82 8/HKC#9a͛*Z6]72[meCz {Or7ɏMĹn/iCΤz"[282r&_d;ش?|[rs%߂}žyGküZAUqzeMGXo Ī[ 'x2~Sjr:.zQ>_e)T%ˈ2>]!3V%sMsIP 3#rΎ؂ އfz4s'V܋-\ +Xy-["%=Ae3F] (~03 ޴]D?66C4& ̽ؓ^JE8l ٙ{<馷#UINߛ 4t+neU3V4r\=)l[7}bƿ 'u]W8tSrd!ǀ,P éM4J-U_meVS.rUwr+7ҩ;cn|=`o-ۡR7gjXC)V !Y,+L)k3n\RrK ^֘KF& 8:/|%e+iZΔK:;'y_l6q̈́Izd17 z:˶wcN97s'!S$dG*.:9g ^_F8GPڦ9eWz{)Ax*J="y>Dd  9tYì,sbw?98Y<ކ|f֪Aa~5X"~ rc ]qE(+3霔nshjוt gK۴:ǛYbXHGH7?ciOlmt):)6ĩ8:Lj|+ι 4~䧼/S)co 8\-.aIhG %)3ߔcZUT./UDH֧t p|OåO% qHD`ƎW#l9]lV~lC+80Vr jE}v(.?Y70T+M1ʌi ̻9!]c2*"W5„.fx1]+] ;zq|9$FǢܭl]}}fxCtr h:UFeBb.#Q޾LO±>@( z[EWpoxMcrF# Hi(IJIt!7S~p}SߔEްS9.yw{M,{ 9[ʃ}n%Ժ^CC| {m< >ݻH& P GC+&ϑFLǵFeXsUWoR+&.KmVd3DV B;w 5"T&2Ymч7 Ÿ?mc L3:Wt$mܽr\g>8kx(ohG \z/+_Bsɉi"5iϗΙӮ-ha*گyB*52txUo2V)Co(N{5a8ް5]j˖/ɡ .օ|qjbF=?gZёu,_ӴX)ER֝.oD؀6(NKlXAXIP ]Ϗ1&lH e?Q*P ! *¨ ah|`}V$}ZX,z@G8VB3"mLoT\-}D']fzB//H:/2QYTǻ<9fW = S}mfq'P),c pߔ/\2+E%.x (8ru %*=2Ozh:Rh#@Aο fst-QsPI5DР)t}b'gx4b7^wP4#xCZGIC @DD? $ßn“]Jc|0/r]3ٚ7o)폱<3(o'z}&wuUᑣ4s(Y|r^f@mj@K{q5^RG$c{K)zu1QYp{I.Ů$'MKD7Sp~ Q&ERqGH @eGhrM+]s-Jxk" Aq)81+.`Φx _76 <4ԡ)^Z꨷>3Wu`zaf%Õ {2 5 /\A`tĊiRTدd_cik HjR\m$MIkY,2HU$: D!F$FDX}DH[>!yc!c'2{b= >:f9Hƺ*`o1杭b[/$k#^NEH/Av}?&9)Qatowd7(UuБalL8D6sNF:A==+J-4 VقaQmHn2ДD8A;Ƣ[O&ksS.]H˷_w6+ j.f@aGlٺ \ڑ8@I=34;ف%$a(Xd{N;93aՒuҌ܉Ui֞rޡw?3@3U i?1˨'#-N$fG$^{nkmG02E#wZ-I-e&Lk%oI{/(;w;}b vDȐMezmNa(n $VKHCkڶ_[z ],Y]5+lPC!3(b===$DXD<?BaJezdtrP9ִ, iV:[qjic.9PulJ 3e|VWfM);33 \V)La&JRB;^BsiWkxWWWn, CJi P}XeiB3.*YVo$_۩q~_;r}KĒ쐶`ڲq4I{hqT.$^ٕI$vWMF=Z7Ӳ ibd [bIS,cjܮZsZ,b7 \(4y_ؘb##cj)MPd3Q`y l8ÉbFRm\cu$p o3݋k3 3vhƥϸ'/W!p,b[۶bShnp-Ri[mAO*ٲ޷JM aHVw'ܔzO߫74N`:|tFirH4EP;FeʼnBC)*} \,.F孰5f2_Zhlj)9[jTaO^aT;c,a0 G"۵᧘=@ӳmi> \Q l/9lU $cF~?5:mjvw5]{c.-DLbqK~{4v(h+7dP{ܺWؚL(FNZ䑿vey~%zbr!KD m(t[.?%7qX)S߱VnlTfDZZ1Iy'g`ص'!/ 5]l3霳瘚 _]X4zB7Sqyӭ 9dg.2j|| 㵦4[痲AIu܍zE~Y,|qǏ;=RMK3%ɴ)Rb(7zDk Td H]=|f]TeJzSkQKP߿)΂v)ҘS***-p <ތEdere=w^y1VS{(#Nl?h<@ˏƕ{A3)T|ґf1$c ڏ=*>/frjMWx,s`(Ҥ ]|(1]xa8I8oQ2.7z"RtMVQ혥cy4锃_ {Qߩm1w'|/Ǖ$*šs4|OvTvi_9+D )]TG dey+8 >Eh꺴lJ[b+BLg[tb8{xG4DX-~D*V|hlf}MN7\ ظVY1A:υ_/iy="''!,Lu7NKU}c;fS!"Ii>14*.޾#J54no^"D{͚H!( X.QBa:{D!mӯ,#Y"OYmÙ:+hV8E h1?ۑAW]D=Xfg.(F'R-F|q, zflN)P+}[=>YƪQJJZJw= [g)q'>sULKuV S1vV`8_yXf db a1]hדQqyR;w/~Qv~ޱ7Dô :#Ę7.ޔ㴶iS_+t L"6+\Q,E"} SIdZH_F؂#&uB\D?=Sigph4[t3N>2)Y ^u5ѩ5d<&d V78CBnha$iЮx!!Ȋ9C$"}'\}{]3"sm6hZ&ke)!#ʄx(Ǹdɒg˚;dshfk;d]2?ir"jh#,$sd6Ib)ouΡR7/τ2N$G܉=2"~tޏ`?t!]+Bp |+ 8"cQw/VXGs9BŽ;%hk^a!u1kPM7{{]'~^ZalV>ݱo~YN?'_q[۾C\ ٗ6 ]m/l 28>[)È(OM/d¤ W(24in)$@aw(pv`e h`!FE =*פ2AaM@rvMMiD8- `g1h[;ErC=y"A/-)*m_}R v 3<>:듽}B1ӧx>wϖ=ȘMbx1x1|w\X_O;G gQ?3%;JE-9 T'Q'a`N{ö-;~~0_Dh^lכRE,-vۦD\aaQO5,֐O u+ hxdk(k3spqI;8?FQL!4@Z5O=m߈Qucx,*2pn͠q..nߐBǃ"lAz,BI}_ "0{2QZ)!P~I`YDC+Ɗb\Rlۚ@ #k 6@ (AJM8j3w!3 C7C4@#oVm"'\0OBf$) I6 ?uԽg[;?ioO]i9$Z1@!>gJKMQ-oilu;Vɷ;7%mwm/I6&u+WL%KX#fހ{nmٗ%ۖOJi۸$2If&d y4H0 xAqB@ bD:6͹b,s8ZQt)W|"ZJs^Od`iVPNUi܀3tCin pvۺmq gE: VkVBR>B?uQ_3}: I%_ɲ廱uPc$KA(RN* ,};gMҴyFXVZ nyB7=-!iymAX*xVȿ7S?%On5τc-i6bfjjf];LGوMyNjI1ƻ^ MsB/~UW7Y=g2s߫rW(M|$~^wvkNby什lQŒfPR|I0G4?(i z qur0ljG{GaQ/y}e>3wh2j9vZgk.!%$Ƴ#-f}Kʑe.GT.{OofMoY+g.6dߤvc+XFPz$RzMZti5O⋤z-fYC_ugKEVN_gg'c!~ yQ}jF]df𯚊~h]; n@&W&/W3PdR9nևD0`BP?Wt۴"N oD~vx#0/ě"l`}f%k~Tt%]ݖ H8!\?eu'I?w0'8QF29+E38Ȋ> a؛+բǨXgç5%?3½Mr㊺VxE&"^#M$62~|j{k {oLjccڧڦ5:;s:Z5 FƺRgĔ[ѧbF9lXA{b>_^#l:W8R%S%ΥՄȤ3X?FNWݹr9]!{ꮠ[TuCEyܿ l*`3YT$C ,CVӆzakƁSo'nYhKfexl9I%*!fL=! H͈a[(B+2-3c2zd"MPYnKN<3 {O!q'?TSQц?wQtEkGI٩\u\nLmGjXK$W.4e .~1YT[d6:W[_埦#?8_nii6&cjl NTZ_<ϭ͝obeekW:c5YBS5_Wn9ߺM9U7ԡchqdzoIn ?*2.62jo d>22K,Хu,nclvnR, Mَס[y58zZ)--*lMt5}ZzS4iyq?E-}h^㦖i]a3~/4ǷFZ?A4M$urO܁xG\#/0++Yz|a~&;~8(=FI ʌ9DLze[>L+d)DMvsIy:ǕYEXj/rar_WHoc# pKR%po^鈡57EuADԉ<]%8~Z}M'>7z&κӡr赅(jE;ej 챝Ey~G/ah[kBƞ1&'Y.n!bP݅˅'?/xEn̆ǩPxS:s]ayKNFceKN${(' lԭN F'sNHR6 (oD c y.N䵍uZ m"}jXaM۾ $2礿C.n~Lp}vZ37wٳݴobW7N /$y:Y^%mMW!Cu)iV8E+ 6N(^N랜m2jE28ҌXMw[f~ ωy7J lK/207Ţ@ W+KYAJ/Ilϼ2A)eԤ|_eRxQUuب00MKGhz{󨯧8}|R|OsU(x*p9}1LtP1QW\eD ;upnۂx1ƔC{S^rX$j?Ém9Q!=- 0 :X*;%OE%,R) c1`80CG&8N0+c?|X, +(F|{RÚ1$=X8tsJљ%reruЏ?~-=1 9G}17W7;Xm &Pb=au\vxYz#fNeYby^mnRb|fų-{fkeJ>(yi<6jCÈ! B"*|+ 1XїZ~wІBˈZQL m"D?u괣(Vѡ2U⽛;C\䴠_JZFpZPQk\!`m>ϓ _{UQg)*>okЋX5^u8ZdZ8PBI^}>"+,N| ~OKIz;˔?G0طE!O^MX~.hC\a1`d_T&-yM&k_i`dtt-ڏ,\-==is6q䖚aх{"KT.&T=V…&0 >8!H,EdM.Lh,͇WdaUՇ*;V. 3Gz V *`0L іD=!Hhz+H<EP0!Vq= - IòXm`4u0#><@+0 'JRU-,|s}q%c KLH͎}`\M. ^h?EN\'UJ-UB@ewWLD_)ytI YJ>' <LY{֞`jcAQ$w*QbQ<)ĄOyMKIG(b'8$Xp ,3 TH6wVN+P}QsE<|PDn|DٝZ/s {{}{cT}/Fj<"8ONM!B!H V[=|WMpU2.QËrß' fA cj,CbVD%`?rs.Nr*EmFI" ϶+eXEiXʤ>ƦSSk0Hr&Gh jsKM]1FK81m |lGXlG UDPEny'WG""e_`5n:"p**V 8½?9U Kqb0V}>=cFim;;Bv%'N$t`?ک̽2H.f{I(o x@1OouaKMIw|?yop QXA), to 8 <1JKSA2&DmWa8:$93&:oh!3D@3U! VvhyB\&'iUjYozU$0_)/``XFf _Xߓ |dQn =w(d62pon[S[l,֒bˋu%XU2-'8M6FIdi"3$pE@pov%q$wFev_MIb `fb  8`ăV 96/VzAH]jŖVp 5052j98Xh$ `bJoιe<5zJꔟeTSyNsI^z/.dێZ`F7JۚUgcmt!D|{MW\At0j {fJ?ҳͱGbc>A˭r;+|eUqrރOM9JV423EaD0rCOu\U~[>B[TKtGOh4;dl(AuXmNLSK z?+o5V|r }vNAp p&dGZ3E:g5dM*QSb<(9WyJ%3%;jASq˗KON6 8;Sw &*~'LT'G9giδhFO>T%SF#<};ʝΓ{>f&|fWc#s91ZL)Vde wȆ;U>CV4<`y{E %ΓGĂN e(> Ot!76{z?+.cН43{@#'A^9`'}QɞNkݤY"9 :o6|lj/Ԝ*hA44 >|r6=Ob^Ǡv'PE!}LPdm*(Jɒ)LwF%zi*!±X5p˦iW?.mk0 )!5 ~lLrQS8T[[7ϼ.<3:x7NFL ݮTvX& FGbʰ6}Lhu<\yrܥ*癎yQJu,m3`MVM3dy_4DžjIǰ,l=@au9nE=2V,R&L{馿_׺}dP썓qauDfbKInђ5Qb)"~F:AWFtj0kNX9ΐx BY#+hͬӕJ?pYk$*wײ3r&nʙ)\2?S%AyOM[2Z?goAE~ɳG^L.yu/fj7mvZ0qb(QS7+E^;bAĐ?_ꥍ/.0<6Fq#⧰=|fѐvpJ1k$ixFu۲D9I!ܩSvJqm P Ѡg;뱞[X#V%Ive7&-4/ݽ zmѩCzs.`aH(kwwnLv:RK,ǒVjeYr$-bcX^+ɍ+ 88̓VqiqbƷQ!}(qN&z3luE8߉䔅d2:ґy:sЇUDkb5w[c aZ~)BDGcLvkU;',_`Q=9R/Oq}f]b_Ң9PGì1r~߉zyr0}Ga8[QDux G.} @o[Olͨȡm"G~c:$V2:[וy~8!:aפ{d1{,d߾쳊7Qr754G[r#&ߎ7 󙚲/-Y7ΝG$!=]dS!GugaY֦юzf=\E,͟G[qLl6Ƙ&͚ؠB GXv7l]x#1/Vv_tm^f zajRsN@^7l6P0O[YX8Cbi)E9)@D(&j'U-3F6żoy]PT`P5Gܸ6A1;h0CRc>Kx8 BFl7<6rDR}ECJѠV  y [+YS`Tp8 X_jͦWĽIi}բQ|ϻep##RF4h6)#F ;]T<3EAGDOA2ԤOC(_/CMvUmk!QUNcsZaʱ[qC-rȎ:fYwxE/C[-*X$JTɩb&KR7b2*Zso @OHVbIܜ%̾mTUر!>.9rgfuevƽGWbH>bVV#eɶPf ~hx61{}hHB##;FۼCA66X>ޢM?6twݑُ?hvx}wjgȬm~ZL#nMl2&ղ*5:P{f^jM Wښ7#@V~F7.ؒIyIM#!e~{zav@)+:nA\rBHwX^n"}D? ^@  r;)):,nb:P"c& k4^ 7ͽ;=yNu"6$YW}o_LX h.R .D{*+zpmHH+AkȊ<GؼNm!0*ڋߙEM%.nYYay H߬R뮤ZKE|X͉X ?_d%]~~rk o'߭o{B E2zāAWtPMN;EwNfkbן#$Dui[ bwSV~sjC!ݍdM0g[]s_{u @ ^0-![ amء]یh]FGhJWcFmhQ̓ԙheE1wA ^G8BRRR o/=_VDJ iTS2MU.;h:fٻW\-n_P}7rѓ\fh-~6|X.%/%Ȁ9~[Y`H*y_ͩ*NA7C['让q\IjQ6d_5rxN%=DJ).XM\1NS.ʆhI.cuёsaI Xz3@3U i/ʨ'-=N"eG,cܱmݯ_(@zq4"X` u/-Ē>D pYے4[pflRrtJ>z`9 :8)RK7[77/,,$ffhvwwkd[=ҍݖ5JȒ8Pjc_ @% xmB F^ ss6+5WўkˁJ3%qf2QUh1}Dkn`ݚ5,2[Tat5r_[ޞѾSK$@o d%i1c ֎ZqZ4Iq`F̦Tft6V^T ðlHV}S0/0A۬0&0`&PJ6-JKu6ۊխV<0k<=-ByrP沯f vޅV~['Yw֛ɷ+l 6racG.K<`%˥adƀeB[q mZ,n2(&y{culLfXIWE4-+))P-.Sek>ӧ}͙Y:0Y {&oxKa%.EqqDݶƀ3婰(G]gMeɑaw R!rUN{!*)/_Į*1':BofK걀/L= (p݊yQFc(Zu}(֏ںozFyZ^7{mUk5{?=]='R@p{ٶ3-*SmĂF$D?i<;'s)PSo="S|I/L3E"n6(VrҾpa"/TZG9[d͎v`jb RK ^ r6aW7BVlaIpb/C=MC-֛|a;+త{ >;KE lHvpӰ)Qi-]dF [+9]nLJar'R9$T$e'6?yz"qcv߳+cG7 x+xO#W聾%4k |8l]a_ esu#/ISW싧Iy_zQb?~G6Ijvc*Vjnk?KTeCV][kYƊlz\BkĹ1$dsHhGI`bn[97ͭj5v(m~ 1%eL HךLvs{}+$Ѷƒ.mIkwdԫ_5<;-55Ut;*0N5uy.]@@4ZLtDŽs)'ƳX3?4t)CH̞t<9[edfBg1r/,!E:Kj_ YͫbML{,_>sb^;i)XgaJBe, *{ilZolk Xu0ILhގB_:}6/^=2r^mf^3kxf~ũgtxf,P/=pPE-?9_SǴ)pm{ :ЕClZѷWK 79j͐V $f̏ἝTDM;)l:d^zD0G1xA1o,P]Խ_e}5xVDsK&:&n20ObR39cf$a`0f<<{B =g>=O'om] >ĝ?t걀?I1ˣjDǝ5 ./{un#;:pn!zݷ]ywl_m8x^/ sf4'b]{mEC#|ˣbʲD >WùCǦ`u0{Ի(ٵH[lYs};+Yh,IJ 27 сHˣ N fEy IWtC>'ꭍ&QQƼŞ/ҟ,*I'? 쨿'AAeY*@(c:%x5%d(onsImDI(%C9WN?>u{Mݹo"3?N!Y5(d^VP8XC^'}sHu3;=Iw 9wqݓkSWśmb=٫Pw`BQ1S|\جɺ$5%(^vu cp(2uoόw9yV01ټ>S_jce|NzPZ[rT%2`9F"a;Rfަ$bvrPn2B;Y<9a:<|y?x*ɹ & @--v"h\h")c*>6on|K)L6vE} ɧ1'Ѣk}d'HoMSd/Q,NV[/#!\uv/gr%R yF-@>9y-Rq/N# /@.Ypo"2fPL,#;a0rlx)pT?Xt!`Zմ;ǕqCe"!^x v+V晶 )qx[(e4X\qL_< _`s`6]Ggc(bx=^'`b9}Q8n6͢$O}(=EU xke)cՅ70,L.LF R! _Th/vt,*3]Xr f~hk$rʱX,T8r#E% GG_n8 !XɂGEz- ;(vgBnqla{QºQmA/to( D dv r!Gse}Љ\aS Lx2eJ;R! ud۠S)TJ)ܖJA_)Lb伔,s]j9tgŰ}LsKq)wƨr. pV^t+eH'/xQ%CB' JjĤOT?X2h_iv/~nhlXTBODPzY,bZWD ÝfqqwD!|(@1}:RB>;OlM1ߘU:5i=8a.zBӯ&KKbZ6[ 8'0^vWlEGD[KʨH#[߼܋],wXO-{5E O5$y #PDϋ0mVyHtE\$i6iW'ЀϤ? fh]*%x}/'XNa 1ǖEn"wpNsee[g"WYmzД2kUAoZb)3%>"6 )Ԭ׸ƦRYKasYGoy?n GPʞ|xT+4_lqF9'̼z~Ω+xFcӍ/JxP'[NAXaGep>WxN.$eHBn<+bJMTy()]T߲yHU%NQvzlSvh[ M0kTHqSMh8u6“% M׺D Yȁ7| Vq2N֞ɷCd@#et5Ym$mUPض @S6zNza,@:0%1P%mId--ӒnQN.PG9wTstCT6Cd/~$LeznFB)? 3h4>ݶۮ;ocu饶v6k-#EԔJTDj PA>((3( a16s3fּ'WИ9.iwcASUͧ47h-4T`k,F:ř1Oۍ"OVF368xh[&yt S8+,u2~ ߞsn[nqciMezgy,t1ҙZnS+^%@Z>0te-'i4\њjg'͉وI4B@vw \FM6 leK-:o39@>[AEXU^u 'fz4lLb8L.mKk0Bsg^7u0x\>F&6Go2cM }ڊxaZWOSLcsW[1v\GtSLMJ-S{_{ Ylw۾ 5U4=OiBZXS\lqSK.>Wn99Fvv< mCOݹ"Z_dU3Ƶ^lWwޘ$/a*0c%)@#.hMvo VR_d٨ȳTj/Vo b–}=i%5ATe%\3Ӌ=^^=Ǔbl,X/wRuJϲaױ0{e-cj+%s9t86ӂ( v!f2k5nZyBwkɦsdѴU]C.,>[D\dȴ=ҭo;35qEb7iGz](jQ6W6(!U|^`jbj-d"I j Mz>+Q O,OAucbK.#0MO$<'3wBp  ɔh\úwGH w'X\{0>e?1c yrL7W_h8+)~$ Ӛ6Ȱ/v3W7wQ0!e:14)C'~4]Ql!97\|YN:%a'ReP,pӤU)HN9H ͞19~I-Z%S\jQ)p\m6{.\;5A=Z-2yĨPP?RktZ<de3cj%'ggcT;y㯓Ә>J4 +A(hh4nzs=iy^?lm%D7SgUec^ES5w:x76-xKU]bT҇1[6uA=t× b*`2 Ӭ8_`縛3n*+(h=Zvi_ZA ~x+i6ŗ9%ƺ*WpOxuNϛiGnns(6R'rwi tV'LYvD9mɠ!yd#k H7tEm}LN7o(x*m=jv|o1+, 9 iPӌAKa&T[__s1ani<4ΏTfť0e[l׹ fwSaOGoYr$#YME$ R&ew y߇rQ=wrB`2{;8K8ZEx/=3qt~˓7H͞4nZ7wCt4,֟9<*oQcwa>ze~h*;y$vv&>suUfu[4Ez^7MeLssk+}[684`<: j.N8e9E-M<,V)N#aU~p ndH):SJub Fz `'h8"~0Ejs ht J:-tʒ.vSmO&,A @@(Ls(*u^\SN[񥙍']zA}@8,,e1(\E8 JS=f?EctҏsTׄ!B(5]p F 1!E?j{A=4+fXDSɁPR5Plߛtf}.) !Ӆ)w]$s7xC3]}_b$H}h.J`_dAրvi^"Ҁ<9d/"GbuȽA."8A;+A2 I&*$TQѻe&׋(+q\)#VPqzD_Ew'&(<yq_`ө, F~O8B6A TjNA[>K떏zdcY%;u }q<uأgܤ8U&E"':ȝIy ApENOVMOcw|'S&2ؤ{FzD˧#^} `O[)$E p#Zf㮧#8Q+acֽ&RkDk0+&e,W+-`]_Ϊor>7BTpMUP rřqܨZ(.hkkd~GsTX᳥u(zmb $vۥ4IJXP&\pY\ͥHdhW!׋E˦O5I竭6R\W2`l=~~@Wd%"O6s 'ŸIwgΌܓ)BNT#&'6-k؎;NڃniVWblkHus.i:FbϋgtoK$[y ;~銷8{311c-*Y6L\w {yP xtثpٳ|B6Pv U/A{z>rjNbzn ҖTe({t9"x?ooYy a>P(d>)W; D(c>SF&ƚӀ#{g䚡"ΥqBqfmA+T:!Ie[gq pNW`e<\kyń ?-Vyt|vūZq'-t %5Y!zֲK'޾ O[}z/ƨj")(4V=9_2hS&?7.ɺz̄MLFVL031?T+@V b3p(7}yƆAŠϕ x"QZVG ͙GQnۘj}1q**'FvЛ]g#VU"2e=Sz $㳨X1̚Ӹ\ aFs|\'a{K`]!h}Y Uy/] 5$ŇQROO1я/:48-]Ca3LU";d%x8,ڷNnNBԁ:\<}YLӤ YsC}1:wd,sm^_)-dB¥'2$WBtP_NI}rqNR1SXu0קp4j|2yA(͘`S7`q0hWL~̸X)z/R6,r_X!t7|Ì+#hY 8fZ\N',UmI_M%=lT8bQ"^z7,+>;(ln1%7Rz<E据c_FArT{*1\uToP@oIGW<{M޻T{ 5(`ECsQ8+> ߮J2~%QGțWlOM:{V@d87q4Ts\sDB+={%Aeaտp4@< CN)hNV3[BE;eFR{GT -6Q}&pv&)No.yR6!eTjIlKnr+/+ډr7J 2ڬV8N4Q }:(XpN&z3vkLfC_g頬QMyadT2*8or7[">NaXs%Е i=xW)V1giڀr 6T6OZBB?77Yx=Hq3a5J#KoHq"QI|b?XG,C9Gz~S+So@'!ys29*VXӠh" C}|˕W^/މוFw;,fy_w.g \׸x>'}&үg(Y}]A0v_(p7u l.,ءwLuWCgҶ r8ϒǐ7*6*F"iOSzmFdF h9 d$noGP#7VGQ %cLv3JP$hGA~V`/:K("\'8HqjH94q ܴ|ݙzGT 2V_M1-@=/@{+`5G7Lc wv7J _7qۏfش[pZk޾r!Ԛ,m;HZk6p$Y6b)H,$`ZE "?r n*{F{;_{8F C3@3oV i/1XyBeKv"YI&n;w9c/ /X/`dF 4$˲YB%!LᲷ%jikvPۦ>;]L6=UN`l:o(,L3A$I?/;K$ 򕟹Tm3WrUfm&lHSJ /9_P  /pЭŶ/!Tf=3lTyGaԳj8%/Z1x(,o TA]5!M<ҩ7,Vԧc%ۀ N$/qE:ܑOqpya 4Tw0Njn%2_ mhu! ,+_]ó Fe.δw! Դ] eF9j~+lP6ES)Cg*za7E/_t݈6+ Jj.44d(eͲ=݉JXk`tb]?70 mxbRM,@vIfϽ8+ $ʹb^D~ōBsĚ"qck*>5>{(J8bWNa84ֶR=ʛ)v D: (v(5\SYJ 95A,\ QUpk(✺dA ,۷k8q? ,6 `;#UI0- ZȓRW͌"ZU#6CɀiKЗ{n۶g@'׊Zupӌwd7b==[dRb%ᵸnJɬ#%o,mYc[*Ck3Er&vjx+%ᶊg{ȏ'!$8FP,g {*1zC֮= B?MMjdeJ`$UٱSfn>%![w|*I)$ԏ<%w =UT1fαVAKw]3 MW 2A cƼQ`prX3 yG)UEV=b_6?.^[e&*`R#u;(KjuX̖+F[;ّ'>GBQ_᳔bG {jAF1ȑҘ4nqqd; —cdIΠGq To;K1}_]W۫}Rs^/-j/ 0xD9d'Vgyp >:U^%e"mEqbޑ:Uzb{UNYqBɇ''kH%ݹ3 4E{ WW/<~{"櫭E;Y6 w~p4e$0ɫco-Ϗ>P |g1ud{85Ӧڪd7zL@Ns.o4uӓue6C|t]ڈ~twıY!yQ2DhB6Aj=CLV>o;6t_[nqhm_ȁÞl(p^])R_^8J;/&ϣ!ZF C@#GE@EG\IbW+}<^}gƒ 2 ٹEy-oXO%v+IԧԒbC|Џ^C,Fދ/}2oUͩ|=9pcf,%x8 qD0g8m颪dQ'ٚXO c[O ١#Sđbo=5k#Vbh%q:}*`k{ jߗހ'L[;/$y(>P_#_L;LxGO 6B#dCi.>{O48 ^=<>mc i=`Zi&x>/poԻ:-jJP;u$3rDŽ嗯 BG]ŭZ}<@q Za>>QHg> ۮ(> ^$˕R~o$Y|0'|mWiMdpҞLOY#կSke) )(kUJ/R~)p/K˽(=D*`0pYHY9 (<$D{.qɁoS:Q$n$oH 瓗%&h>9 qy%Xt?ɶHC?6}A%*N fhsla*3PLO#iEC4kj^FtڣꚤGmHFYF##X|dR'%O%:@ ]4N8cSw&U1VXlZ`"}AWXlJ6q"t6ץ򃸬WyFFp* $ə*6]+:[Ni_x[ Iu8)JK5gD`:<ҲV.,=d\9ے/1L/r٘/xR`!׿M@ !slJӎUܼ}2 Gaa?<s m$%1Ғ I&BlT!n컿2vo,o 6M:Ce¦f;YH 4 x$fjf_kں֞i–-$˖HGo+JiQR@ . |0CFO")U^aNjha5ieԀz-r] wp4ĦÚ/kln٩mqiIyE6 {Rɬ5fgF-OҲj~Zq2J$wu"81W38gǨ-87k8ټmDݜ6v-W׫51}l_Q'y6`ͯ `Wx^NO85UQ) jjKLEM.YӖ$gI؊-tի@{xPg;v\Ҽż]ASᚩTLkWv5Nͱo,M- Y8d{8Gq]rIli,y6JefO,th ~ ^fxwѶ̖=Π8W2:\`R(bM7/G| qnYrV[}+M=Ʌ1wu>CFOAU01Rɢ+$Fy(}|b*~m<=ںO6C);"_|Jf'&ƷL>Yʔw_6s"Xp]xʆZw;(AhPni7bVzUHlSuֺnb}1 KkhoL-$Y ]Ip G/Ti +a8ЈcrQ<-tḒ6h?/Y"4Ȥ:"&PW9$czQ1ᮜRmmQڄgd<2Eh-+ѕDt  O56Vc,RO쎙p?ȯNnk9]bx2q@u$ӟ90ފ'`6m kl#SQ+y7? gy#v8Y&;ˠpdU,IrWv9KYpV3840qmeDL0 K޺˶lѨvܓh3qOQGφCuxG\ӊ!C1VlyT)g;-w"c 7Ax*8:٭yŋLWϤu'=?@aߧa^)W&(`f6&YECoZ5 {qwY؝Ȃ1؏RRh7LvrDPa68l[kUQF:6 #z ƘόV:%,>o*]~()7(/6^qE֬p\jk&^m.L(qm5b~[\0r+ܛP3NqO<&qAUH:us^Ϊd=' +>P[+p "y |e3ag_BsUCN8ic{nWEܜWP<4$C8 ;dUE*rp'V[Pn5,d;Zsqlk6dՀ8iLD/jEygY 1?m-*М/SP]Т!8  `<hɛ" |\s+MwLQ&r&SO+fe s,SL{9Ş[_`%H;_L""Eגo_|7rx^Ґ#*cT "&~Q4lۻxKa Zu,'4]Mts!}ƌGK8_]h2ЦFܩr[(vĤ7x(c>_s:w"y=`:k9kzE0^mN."( 2./a w`f~EVHŇK 7k /9N!*.J"B*>T!b,F&R'V_.hD>Ab0S08y4<03R^6ܑu#4aOgDS2ZUE{pw:p;w _!4Й`h5].E& `a#Y9>}@26CbF !!Rט4qgLb&%pb,ԇ7 /jIM>_nH4.S"LRQ*IjC`׏(e6>eօ{֏ NyY; Szuvz1Js{ OeJRNou8IJPЀ'`Lfi"Lԧ.)DRɲ) DyI2h,=K_";A=.>;E,~F*e&A b K8QcĩQvFnA`k #hM̒/#Qk/7 OՎR "f=/-XEVV]jFķ0C@#U!;u3[MUK6&űdlcN/Zϔ073H˲YdJKޖlqm;@Lolrt70k $^dH{۷w}m}e̲m+S-#KW#1r#33 8 (( {1?%mR;;=MHv $ڢ%)[Fi}JW^!v$˙pӋVG`-lx*Ԝ7[E͜wg xK<;]6Ddi!A_J nrv*3| Y[ك27gթ h088Ks- C·LWbP~XgD& ҬT)fZZ"mϙԟF+#,Ƙ;& "Ye}\v*"4s&_C;N:Z%e:#i^#5cIڮf^^ӽv_&D 7c兦5Ay[/m8ӫƔد{kI܊eA?*w,{Zlvon)J*>O}Z rϋȜkqmOkauy3_Zi[oXU\Яf7՘}Mz%с El;z 5Ӧ4ImYcXW$V X^plKkms{Y]8/3 G4mj_$r+$8-:nS[xb09Ǒ:W{&TzEw-IK,&A;t`UH)竅|$w=T=kP ۧjbP#59!)Rk/lL;uB#MU)rL}~J}MXv[/oޒJ?; ϐBQ^3.b@m$eqި:W)# 2?h 8d_BlaM}+ҘsoUtЪ郌 e0c.OqJ4*Y(è6Oʈ V_4B:yi1,knFYjgSHq]\3Ѥʨ[OU'RPMvE9b*/r0>∸F1-/Gd ]FDr('?:7b* I@iB`4kԇhoJUUR0ܼ`go3vd=81T73(l ~Q# &>9@v`?1B7`}n(IEzڏTzUEPx.B| pUʞȱ;ua{vJg{m/Kx+8Pu͢eVcP e[`_Ú<-ӿn2̝t0 bӼi>IRBQВrn (d@!xj+D"ERwE=CYy YW}hlaP󼱎Hs^θ._'~q~QBt|.}  E|쓊r#M25LLBe q/Y\ #5o;qMHރ)ۙ; ]w;6+y=-"dpxDBe ¨@<Ӌ7p }J\cD>'U]Fj/ IYe|.cced6Gj|/ 8!W)nPc"FKHP~ -z[\ '0j Q}8P=U&Pu"^wg+3ѡ>d#%&ҷuՅAk6~7oFuʓ.nTmq['s}G{;Pm CO4t@#e3;dEXw]ݑbsW[ ={W3 0 4"p`PueYK( 0 mۆ]{Q] g6vHZEEJJNG:U!e:AƺR-G% H)X{{{{mlV+ڨk:SljR\ ( "  /p \r_Йr#Rj ;l-Kgx5E~V&DEWi>twOA;orLNnYɍGl1IYiiˋUe^2'܇ly [\SKB(Mr|WWzp wֈ`/v^BcKM ٮ)&ffersXj+vۧeI<*F)h8IU-<\'`U.[ة4aBS}. 8lCj9ۡH²$\enq\)ź_ֹahC<5%j3:kjI)D큔veemͼݠ5G/:65 Ù'Voa(1raVEtj9 FVl(VJh ~.s{>Yxjgi>\LXX5ʏïyd_xxl #s WKMN_h%a.sjw#åFeIDaKI)oHWN5xU5Q4l0_U[,]mu9T[[6? 5hp]4|4Q t_$ڪٜo~v @`.*+ZϷڍWiy4ZV8/ SiR Qg2␆SQm|)i^, t6j{KU7Ynջo ƴ\emZYjJ[u/NeIбBQbh $MjɀE"zKf⇾?X7TN8lWNtkϢ`<`rZo>2OfP#^[6(Dwzo5oQ5-;)>zIЂy]o6Sr'l5È?}2gwC~'tYH1O{j+X*z/PV qn^((Ŕ[C,\`YI(e:%dj,W_ԉF>'Ud ~8reKiTe&{M=[ϲ9ۇF|8&/Kjk9 , C;uM"8=]`ORZ)"wzRS{9 ÚFȉ}hb'!2 36YX1R쌒1ELČ{"s%%7KL|䎝X4ߣQ:-$RvYPT_]oz]/.tSNV}X}گzuԞ.|n HΕݫ^Vw3d"_n.WÇG~zhus=@\m0_v}o{==UtF#?c_sjI2ZNRqDJӚ<8/2$Ji}B"1 /e+Խ5@PYt > U^Ʋ8'{?OiQUz=BumkJI]Y`Lfܙ Jb Iq,9˨xl>-bth71wޫ!%i€2kFF_B,;˾|J',wf{w^B9,mh_w Xp΄;{$uԩ^w̱덂laW' T =HГHA-Nv 1 %$/›# y|VAo 6 'd/G_ϑ[L,>ψ ʱ &ya_M9ᙿU}W;xitDH5dH|-C/),NWEskn8z)r Bwh#>=ӓ"7[4;ĖEemh/8x!aIǙ_t9*@KӮfN;~KKgǭ3)2 Ra0},r.HclvGGa;-{-fgm+ϐQbZIE+I_ѡx vI󴢜dP0h/tJ XuZHezV+3Dw0a+\5VsZ$[#cZb::ΐյ:6r*JJ\npo{Bŀdd?3eʍKߛ yc=Zqg|,Z2,_wu0ąOgIZ$[#Ӱ T (j&dkצ&(ӏҨI0M/675);(e)bw-FM;BN>[ Z8ST&Yl֯\OUƂg0\T]sJIh$D*ޠAU0tד<3J/*`&LYD|x/"bFůڏ[P% 9Q%?mk ϑf_{7D<%ytQByWUYoi[v˙bZN]ty(^+EuIEPQŀJvzҙITSNQUt,z0r~*c>ѹ\L9qR&soklUGn3y[6~ !m.8Kn?6 j7V%? \KhkË`C8m@e&sG3 NE ;,_W#혋iUf"a s 8_NcG\꓌>yLwO+'{(HD\H4On d(@=CBLn䛠HzDv.W.H3t@$e}c)Vu!+)mNnvw$Lz}a+0elaOղ5[eVww[e^Ֆ5W+ifҲZ67e<Ü13LKl5eK ?,u]6$꺏msݸr5w]HkZĸg;XWs}ǓXV)V+Ϫ`JPͧ;H uec99hY İ':}>MiV<5߹sӟf^ls¢̔(m.i [v lΪ@ &YS'K[ ͿFqk4&˔RA(pӥq_\G&A1GgƌE0E죄]P0y|ѭδek1Q閧ehie5/K;: .Gn$i1烵 \IGA:smO<L9|A4K]x;ќowR"]06X$#4ٔc7S_ NCᲸ?6@.oNwԇ&#nF}PSR͞Id(_QܪyA&DT@qiVQ(lKMa X#Z9lA}\N<1iyja4l?L20S4u_=IS(t=U_;Şbд2J֤FX4~{ekK~uO!$4k3.ce+7Mɘ =֍cXϦI; ^IVZoj~wSkb%e2"7}& z\jFQ ufFQ EOb@y%5&ZU5H}S8U0QodnVGx2$] F;+ GФwv%QQ|8@_nL磌[*_|aUT@3jLflk}{Λ'(C0$WwqdюuտWڛ,ZQpEwfmp6Ͷ5$si֖Ƒ\r,W6a w089dƛrI2" ̝lR,x\31ήیyPI8D>ּ:aC6Ԍr&&o,sce?vX,XJMvJe[uc` _\'/>wBjQw~Ct|EfwkPɟq?1c(_i(0BHQlm=؆;#.;A>Q0@7SuwDO&.ߨ*E-X5^>쓆kegvd +C"~A:Gɴ@*p[B؊c+Ijfc,r".CNMXcT\ 2^ᔵ&|$EWC rG@% X 'Rϗ`\#YbFc8mj[6Av؃a M;J&2Ťk/O?//adefڎv ek nin%!^!O5nj4r ѶkNcv'Z).rwѯλ&-zD1|j|V]bړy %]D /"4CF .kȡ =`4 + KA?aѥ%F?3ߪyς$xӫɊ(PɏM<$37Y߁BSB  r4ZB*'PSN4hsar&I|Ka wO%1<0upw z+pp~wSEf?g(1fH~Uo᜶ǎܐLT(\|{=ֳA?wD6Wm^%75f()L+N)O  b1I:CKo!6`B T;shd*2ORX V.f(ɐsnD6qE s9عC]Ex.Fx@ #\uQ_Gw.Wֲ-D#g<'N=ۓYs*2$~\~T_ W0Ow0N;%Si}e^FgԣhG 3UvmZ/9FRXKGhJaV̦ah[~1ǜ$~7C[d< óV9*:pTE&Ι5Fn6mO!pk6z;R+{—Q_bxFɱj} Gy$Pe㈛5Md<N7C8T37rY1`2i٪K3J%s+7qvZ`֡m(Qp}1d oWj_%]C@_ + M,9كeq@3$d;t5#r0kp}p C6N}$>CvNNYr|\?@yU?o2;ugj5,zON8ws%G(K96u'lCݓ ,Qս- 5ió|U1+ b$ƫ?v4+ j1ڵgڝ,ĤpFcS,.ĥ9ꠠ ]JeF}{I0y ikIb:asg+iuf2眝uYk|V$ayq3.AFu+d)!WPC+aw{m/༓$wPY@C03U i/Hws}^r:9r⼶S'[tj׬m"D֋<K,K$Y$\B{-^Z~W}ؖmwwW*tM٨鴏EXaC>f K/+8{{oJmmr Um.J df2r2'FT9S#'U Qi)k A\}E6$65ŤEZq+$24MAVa+R.SB=A''{tNjO-5Slw aE"}jU b$]#^Yg 5f> SH.l~yL40ȝrb+JCG<ވs `#^gɸ1?Ous'&z"` ̈𖅄}˫pRD%< vbY [<|ƒ|e ^<p׏sE"*rįBMe"RuC7Q~8K8hG5MkC#3-}]}NdhN`4FqR9} eofw\?nt Y(N6SIvn(6ȷ"3]F㌣z"svm=OkX|tBS*,įHxm 9ytOlIJpMZKQ/$s!B8X0ylqKk?KS}w4S\>.PN ʅK([Izb_T\* 7C3w6YG"KQcu9R<,JrUBC4\lp$k8ӟ5FGkD19s֤Y[i87qTT/3\-KE|1P'5!.r!sNɤ-Ӽokbg8c7½Uz3!&Eu򾛙Ԧx4RQхz0" sf)A4$BWrFc{>B}UPMb즣\0 LdsO_dKMC1̭z>O.W]>'9Ͷݗ%] V+/7y%P0Eo1CPe5l3)O)]4{v?7{"EG2/람<,+׳EjpIb,qf< |muze_ j42G"nf# !oGR;sH?Ӏ'6't ..KtKsr%9JL[Ӫ*ByĶĝ4f^"? ީCyuvW%B)§=20ÁOua=}^̾EVSDlXhmǒhMX̎kZp%*Nd 7XgNb92 J V`%aWLK-4odRUyM6r85wJU+`l. K[ѩ&5MQ t:KL!S^-`S'ay/uPetʇ?߽Kڮ}ӟq}#Mo0%{hUӗR}e{haÈ 6OС/wl0eGc^9 Gkt>qqldﮙIN4 t7-jµ1^úO3]8]rLkY.:OV2]JGSzɒG ߊzmɵt,Focq,9LHFL+MuC dRkox6]rc#AD˰ ?bU+&}H_- &k9(2=u<+sT(wJ1lHB;X@a^Rà)!b ^Ԑ "cZF"K/KgB)]!YAuHb;Je2zcc`-(rbbMƎй&*Ó$ֹ Fpr>Οl &0\Tj,k>M=4|.|&we r=YTv|u}lwmx]4Iᇮqή\A:V[L!+@@('+;&6 Z<{[gGc{1僴{aؽuPC_xn(@1yȎg f$k#ي''z3_a>Y&Rkes0 A NkWq\%U2@c$P2&51}xkGt;\T;JK\N>"RM#ؤལO gw25Vxńta!<Ŕ'N16IWٹ֨ѺHӮgy77iĒ#.s(!z i w9??J~ܾn~>L݅ 7gz{":GSyGJ>\z)'ٝ~Yny;lAڣ*Zw2kdՇQ4`@3@`S6=[,xGb[C/q2U/K\te1Hg/N*\G= _>+}~*ʿ?7&kye rۻ%,/>gG­-{Z[?]v c'YWè0+R+Cd@#V!{NƧd&16ՙ,'VoSWLdYH $H$5C,kvlo.|{q񶷜[xsk--ص$=w?@XDj 79mnNckEjZKZe}z``/z@"H/{Y`igXٮav- Vs=2me2A PblMj`n$79&5H7̑tZ.w܎軔c,7)iKݫL+0օ_O}n\+b>exwe{aUu)ɾLx^X!n~;X3BpmcDoaFX1xs=vs*^KԸo/<7>.RWCN;*U♊/z8ϯ`ՇJcK"ɘE,Z1PxE+YhJ9ؕuL& RMGy, rcݱJ-%K}R[TaPuyWdճ<7v` Sl[[U^%J6!0+sNQIo%)ᳪI,OZT6\ G7\7Xpspb$GqGjɌEjīҜjKF԰feF3tW0ԠиKk+Ji9JP]u/ܷ4fӦ V]=5Щs<>mdo}$-xy0f-FKYτm~x*ι%e0opߺe;4>Κwc< Y͍~A^*C"ҧKsɮ^ /\v/2ӯSl5~gǷ<H\Ghyk7vV|ύL۴yYu-ÿbMmyzZ~y`j]VN+?a[K=Œ7]\ T=ku߿dbTi+22MK?Ĭp[TG9Ϝ34{ylJY)y-y"F+gnV-3J3z"s[pXh0_$mxn\HI~<,l=Y;s&Gh 8[}ɾF~S%[) mo{ܻK"*t) D(1k+ÅsiݳxYY/*fx{j<.b5jc$\"IօVtoQVvh}P)í;a"]T2Abio̒Œq+Oje(Mr,M^jmPaõ&Xί'$ӊX9J}i" ϡ2[K[6L\˲~/K%o.uOWyq'0f/y {4nۦD[Q0 A"ݳ˶ )Մ;O!6j^zUmM}6,Lېm볲gܜOѭϡwb,т%\xoRlnuFڞX[eQ[X0z6Ԛ77>̷fIϮh?h/;m k4yc_]TGּߣG]?r#VriӽT~Mzu fh_B>ŵ~_fͳL!rdZ649OpL[v}s3{P$uCy@|ῇg&0]hU'yKoruP%j+hKJ&OQք::݇avYDxOQlU|Roxd|l*;˴u$EOՐ#nkT.@~di*W;R>.c1ij/>c :{ 3`ǼϻTkw_4pgL?ē=x8b92V>yg@5s2⍆ m-ڇb\h))yƙBu *-:,z¥J9Q̜Peպ }Og]wI/ܬlp7Q!~UZn/3G[yG^oӦ 1g5*Zʟ Tk؊ZN\ʒk &X7U5?Km4TگK٤_9",QN| W2s%s 3%U:jOF^zgζ?̬GHG 钸%"K9dζI+.| Ͻ +DԷq`6^}:X L*0PDyvJ|jEPIZ[Qt5Y”;R&l|q"|aghN =8hpLt68D禤Xک=YLb ynays=C'oKQD6Hz ?@_OA8zIn7Ij yIvLkBKw_ rY*#e=1TR^N{ ~Vgyg/<ԟQJ\=Y v싵bMICk~:^)OMd0HiXq\U6:آ|?#!b3ݐ%Ô8Kd1CC^[US [ybt{ j"M4FwU^w-V`^JŰoIu!PG|tw&@w+/4 {0`R1AI (Ozx\;!\%C03oV!![m#՜@q'sHo8vk粺5k$D w0#2E%Z!Ioa5{K*e/wGgw})ý"-*;z! 즊ӕ a0-36t2a!CSX]9ﹶmIͻk;b-in}󵪆V+ Q`Ez= zQ# HX~yN9]l3I'UȦӣܖTM7Gռsj,>po*XHZ l_̵I839Ϭ=\C14dzhǖXrLY =\]C { ۇRdc.灻Iw5pct9ΔCS"ktЎS:vg{hj, 9$37rU1Z39ЖХUڬz{X5i5g?a8.ΥEk1:5Ϛ{ee}SJac.79mdihҳSi896P[elF 'Dx-wTISC^gd}mvDɹ;oYX%dF( /Tˠm8E~}л|NWjSl[/6VVseqv2Szfwv>tC*@Qunܮ}g %wjziDmNS_5B:y_ʩը[8 ýhz*m]sWh}xWhN>ZszXt#ss+>qAq?GիĮA7Tilם6 InW1 * P5GB?,՗5FF&+hR;Y>UZ~ۊu4ch[H!Nghr$BJq]T{VC]m$ }XRՄm/:q׎9TmoFFMVox :#BORZ:ljB/)u=RFk$? g)SgMJAݠJtT*q͸QDF[)׮xi0IU;nl< 2W["B У?-y`-#BFۉuٶͦ4=[1I\pk'~8Gu0B9 *g_~C*vn^- *@ gUYF&AX9pR|aRrs]թᘟ1ϼqӸa1nP_teV| ="Vj&ɿꫴMP&FCfҜ7Ԡz3^˫_scg`{"“Kan2l4:eEˣqU9pdBvޝ6˳" !W'-~_`o* H|Sڕ}FǛv}s[fY9MⴓHd+lf",+oɸDTh niƚҡJvJũR$FoARU)UIXUԪ^tƊ:I*I+jz}md?ɹL)" e3P<)Uib\|,,?gzr5Nor6A |^|[H6 B; B~ <^YEPi,8<7:հfZQ'kG&bU-Yb\Hig{J`Vy`{8GAf%O2]`5hE?aFde&1jZ.Ewn WcY!'3^}GL1QbQ5('IHwnUfXY=C=\yYMG5D~?ko'rہ@ghe+0$iu{ C_QgzX5ݶ`;N Xz[i$ ,F+X^Xz+Bv,uV:jh1V5L([uZh."´PQ`hϜbaoEzv1M/ T֢d p9c"BqhYМq(|Ba !rchhwBD?ֵh M$ W 7Wt:1pWH3ROIș&\$3ء'^Ex x~Oq:I[Ê\4Q25OGdO)jμai9)aS΄,=ǍqPD.5 8Wf>a3d03ofPt)H-cNUHrۭK֬m/w8a{4@:(Ypi%K [|a.vZV\f/ٷorf>=C榦W]i6tS^2II(,#F3ppP۴ֶJ^]B^,mVRDT 0X *̀@D 'c3YĞPhhK5+Hy`V\ EcՊUN~ 4OdgvVuvlr^^zXgpÜT^hQ;օiv@V薯wiT\ r2eaUNŽ]yT چd8k%2;fv+q5l9N>m4jZȩ^U$,%iҷE65pw^Ɂ)u-vadLH)3R [@σ{pQk̩`)*.B*JՖJ6b/[ko-ijñM+MLg /}BQNRI[$ԠuQ M)ɜVQRM򨒌x:ۈiI `]C؏¶8u)NC{7+eu%*N^l֫;1!՚~T{N7boɧϨƽԓG9ssZo\%zÜS )NTٶ*|ș5U͝VyꝒ9ʫH f$d&U~}Oi1R4FMы4%4O5M-y7`F{;c ѻtYP^3T *{B?BTЮކ!wdD4'p26YMDr'S>Wj-=ٟЄW)u2%0iPoܾԴՓ8FWdaq) |/?GtǁY8ϝ}9~(K՟g. ېZԓaj81>5EW Xb"p?/\?׽'V u.P➢no7uoB@0Y%Ʃ-7e4wݪ)JuOaIdOW%L^k@'Ctoi0['N^=1gnjfZ!w{bxSіwRwgoJdqoکT/yF.\x W\n:[  _ XUŽm~1^?ʼn( Aiu'<ȬbH8e)e˝v/.A#{՟nW[4L}O꺽< P6 ?{Ji]8jΆA'=l\VqSh WҡzR*zsÁ* [^JMši4*9c2cERPvert)\KjAˇ%;pb~^ ប]ELNmgȞB UoD r^5|eeئQǻuSq[kPBQUT& V{=/2M. R_:3r͇fS,Ov_p89<Eߛ. F{JvLjᐎ+a;N ",.'hɵ_.a\2ȁ_4u 8(bǮ_A7ibhx^9Ыhl,6 tN)A ;W!Y7?QK?73y6#hu%v-E0x㷗;ްM^h.kRw[6] bI=# FaGٮY>>n~f J ߛ휃 X# 2~fjd|:d9[ժ~5V!1"(Pg"{F}Nf>@сPg"Sn$Q$ I񦤬fe`kjˏo\;"v^Mfb2g7*t0|js*[뚕`v]<'4Y3`1YyR-P ϵDnbi(MQ҄:=С-=BH/:e:tfh338:N|8n;gL ̝qk񸑸yr!_9JTCR8dAu;T؂tWRRı".zIW'ŸOdD9bFA^WmV%4D+`f,^^BufRBUxe|α$f QzN.7"!=:~2 #LCW9\%k\h,$b Ea {V{[ Ѻ/)zRž??*6Z~e%SA@E*~~ȗ <õ3d5fBME2&SƝpqw+Q{;a^GRje@Y>?x yA5H4wdtk[`q|46#Uǃ {߀8_` ыD8?d3kZ=z؆tx?D}/`$,Xʢf?|)>_J)hz;_ߌbZrؗ?޺y>yhIi6i6D*b%c;C@#oV!;0q,M%xuo^Zw@`Dh '-YHmYL -I-Sv@yݞ`%+ 6zP8Ƣ;:e!`ʦ fK,a$ @kۖ6YvnV%[r&8n"i$0$' s>t 1ʓ`|[԰-Z|ފ1Z}^C\̡2d%}NXJ{e*X vUNnG>uA>"luۙVDRW]ӧ4D1 ̬_O94QReFkҸ (.֪8cR{}Enm =kPfJ(CQ1絳6l)aVl ɽ%1-A_o8*E)|*o~UJwvꛀNkj%{_mRiQ)SVI6%f|E4ڧԥm<,koC-kO!#ӖrwG4W5o%< ]S47&@T6`E>x#K&ޢ ˰B5JQ]tY‘xIձlbU@~^QI8(hKMvru TDzk2M\y,މGifZqg  5.F=M{W}P(̧:uZ-BvTGk%ZsJd5x#! QLf&9$4v_Ŷ_@WCWOU; [9t;+{gT]6eX%dIc)qӦzIUVVBs'2, 5fc"_+2 UE2kVAf gg&ӨγTe@2L&vQlԈPM4F~!\٬vtrx RDZ1ԣfe*Az}Z2{"nu*fs)H|ؤ*ʾ cGo_3 vzѢ5n]nCsRrdC7䰦Rے7aC/\**D!)C~S wO] {ɌUxꗰԆ/3f4{m*/PK)C5$,bIwGtqT9:ZS&?XnɕRг ~'2l?0ffU+$"{hC;3c8 }S_PڲRf\Y)twro E;O{TB3)vr_~S * 5A.*ʲmAq:`iS<zXr+MVXQȷcqa!g㣔}1Q6`8둒L=V&ߺ#VGU@GD#bVӆ!$*[@o7[oto FZ{n6"VMVB^muOsmbɦcx˨p_Ǘvk1w*zz#H`r#*iBR9Zc)~(߿4cA6_I'o* L5a$9sNu=W#k |BUaNXW~!-/b㋷Iq,ϣwpRRsٍ9v1uɎN @V&&SnIUz7d)Q}ٓ,9W8cXE69&DC*_qş '۽mD)Xgji@׊#/k~{3y˺S`(ƍɨVoUNYЋZ<8< FDJ+:?i Wu,}1!BFJ"n d8N!gV=t! mzKK6lK2d^eۇOTR$M'u/ۥ .;lܾ-utՈ8 KbTx:V8tlܥ")4vbܿ5pxl/Fm%ϖd+lT :JlfVA>!K'b _^|g[|HyM?ɡdomiB%`!5r ~Uͷ+'%_D{G<ܛCԭ"[h8fA~]mčM&^գJ&#~k؂k$pT|8VbHTjtŵNx[.]n/}+'^#Qyyb.2W 7K7ĝ7S=3a{N(\-\1 { 6!qk'~+8kiu]?A<_G.֒v4cg/&[Vk?4NYݒ7:WL[$ϢWa;Hi~SbjjjdtK0'Kf΄njq``.-y˸nv:l6/9(6n;v]U{g[X[dz>c dW8o.~ WޮJ%kr&3;ńaeK0Hc-ޘ= 6蔘a/t|c/)ɑtf֐<9H׃'6nlAc Ecéu=@ueCL*#r<\>|9;$4@#U!'j.U܀4B{mu0 *@Z $NB! I| r֒Uސ%NA]ܯ尻!^eTUgں[SD Y fKś),@?v߷;m-l7F' G9]aۢled DI@"-— 7@) ?)_BY޺F3eIh#1vrIU<4hkM,y4ID}˸q̉Е;.wCpղlÏZ庖&[#="܊cI7)s`qJGlJUթr+8Ϊh;TW ҄^v/lGU=Z -c_\ ?:c5 4ޮ7ݦ֩^?LNm<ݡ R 9$?`Y=R w"b<IJu'oGGjj!\>5Ɓ&~q"m rz.zn1tu藨&ؒasx3/aV&钽>*zZ0Wv ^&q^7z=Diy?ÂҦ@sx';%oRZ,S/*h'u~ZV{e.6Ko.>-`={˽SfR9='9eP㓋 U%EB̓oC3:@ϔ=]6Gʩen83WeS; |G4zdهd Zjv *:Fz4ppv~T$D]J~BH'QW?Դ3sڦHob]-dM=Rnj-XYS`鹜M!t^㝺gA3YֹEkO;|Óؑ3wsgϝA9XA;H\sf3,~T#zrT.>4w&f%qb,9]xY^X]o-?'X F^|Y1 seK2 #52MpR`˨(t %,m;:H,|b=ҭ;?M ( rjkNI X3rŋ%\)^ɥ"8NFEQQzQ&(s{6a(!V GFB@BITd5}Pkz)J]ž~¾sE^x5z?+TrS`9JM|VJ$ѯV5$$1|ITsYd rU 0s{[Pԛ }קmސgom&YSkkj>v}v^EӒΟ=/ع=a/۴Kq'f=2}Vn'&E+j:i7gʓ:'}r(Ƭ4:pAwܳ3ЩTg;2xǯY+_Qh~ˏ3|kvtX`wS`s L~icI4:$Z yL"4zgM\wQUJPSg 9/5e@h7S9Pɑizh~dĂ1qĴapTle:\Ȕ{ٶ[cA^[GK !qOߎdY*m#b7}Ὄ95\uE#5S \E`-빺qX~:Ow٤ޤhR[4ȑG- M1>lPr\C={$ S ~ݎ,+Dž.g:+v+8z# 4;5{ېQ|y eq0{G5bB41`t!)BK.g29j2\wNӭ!d_aAnH[2\ As"hJhi֋{_jp23u˂8"s*Z|F*R-R0e+ӢgD7嘅_Ȃ_/VKe&̋ 9YvY!/X F`:bDґTP(#˞.A|0 }Cm( P<\?mudOF/gqw?k ^# &k%& [ "͢.w ` xb8{t;}~G{?EBHO4dp8 }0/ptBp5cGJ8-?~,t_- ֟&0S\J4F]N/TBc.>:M##C]|D#+j^ Wz1 $\=5oAY`~4RUY%˕[·+{?(1-Q;ŕKݶrs*$Y(1~PE> wB¶^6Ǿ/^R83s@3e,;ڶvIJڶ.Es׷c"D +@oiȢ!K,oK4Iny[Vlfϻθr?*rwJM-dȁ3zDCd00bK~G>C;L77swv3-5U%1mmU$6e A 3œ '$'?˨6cl'iSUXX&™t,]< yMO-zU`qchi 5\-MꀽZVa`Lr7^;q]LD1:s#3F b>(df~nN^e[P瓅,Y;kRYlx"RM1XM5 &}m GJx^L>)q70~kaVM͞ZVR3h'/4Prb≈Lܪk`%}4`[W5T)3;%ĥo'۹ q#K:SVϪw2 ɦ;"zN:1s&t+ڏn-fƮ$Mf𦽪>.a'N҃K$Rp9{^,5*@ʠ&g7 %rL씡n!AN>lz-)pxkۀqfi<ʸ(g f=<M?NP*C15=+I8[|4М~HJ +axHcxto~n̉ԧIoEhGsqHL}X-@nQs0?Qv C֛m@6ߥEt$mlY(jbω8r'= XwjqP4]R-?C]ɍki-r3< [ĶG5YK[1in" K1D.vmmVFXV{rMꗕUԇ190[^[kķ tZ*2كq-|eyUzdž{YZhܶ m}mn6$e(Wۍgٞj![YG4D:{VDgfbc4#˓|:*3ihFRR 5w7rm)mr;szaCw%kpBs{GEMFřIĤMb"]d{>?gr0Zjd`:OI;ANKsegwDӬ*PYZ65Mt6'n&y79v{˖KzrQRW1"E/0ػl5X;{?E==BUI̹vZ1MG|OoxgŹ -dik÷шzȶ;r[,p 2 m~ Jv-"+Ȱu= b~4meU%A5*|iĔCnW%;Dsxv!D̊]ffV%؁jx2[4~X @7W ϙab'ѩHV2 .ZrŅW۟\պ-ʲEYq/b@06 CkbX;b˾: ~,Cfd"x*"3+""τ_:%\{D6@_]W;dv/(A9)Pt7*[>!){":[ Oύ KI #5 9ɭ1 8 mOzg>GiTxK9\[WۯVqг-zLz37Gsc OY P)5:BN @"r#C&6&%JKXX _&H(o؝wιʠ}নZȸ~ )(~ޓ7^h{Mjm.,Ejwv]0ᠴ&3>SaQb1J/㛌Fj61Ԝ%F NGrU>J owӵbNfp]ހksrUV4P0`qWv/*^H#Z ܻ4#%TDL0#|OB#~s6WQlcwc鼙S/Tj̙s급SZu$O{iaiOT:gV ztd@bg%vYjHQ3rcBK҇(D+HaM ni-ǜ<<%蠮. S{tMSxy"گ7gЊd,Vggŵ{Ȱx[X2|`;;M7[sװOuZG ѷZA䪷~n{lb3q[(M?\&2᡾r6R\t.tb4Wҙ@ΝfWPʭ*==Ԙ1-v=_3'WlcEU_xd/Z>vo ǤzzƶdJG}q9[CQh['qU-B(օ`3<~Y? uFUi<3݌E'?P,뺎-:[Q|R[ [f_U.?\b@󱉭l9wIN>4{yu5œiٻtlܽ[%)-E%R݀LE;FA??f_{RέZ1nEMjӫZYCЂ5U\:y7E@usS^lv7 !n#T'غƦGϨa:v}Cq1z,HP\i"[#> >`k:/XR-8)?3?ay$AxK&< ]YH=4$㼺U=UFU=V={4_=#պ{VŜ|),!֙ w ';u抔\۷e; ~:|á/za/P!,9Q$;)Wzէ&~U*{"3-!vuKg .rjlc6m1zJp9>|1P?}.r^ha/w tm+%op1%i"օ病%-W$+BR I@['nP 6II'K<Ϣr#'Uœc~Nx ,V'/yn(f ҷjL 'qISJ}EKy G/._lWAϣo$AۋS^Ylt=%޸+̔Nq.AjάwQN L $@;7Ιp*rNb LG4pHa33$8V?޳6%aB"J$ݕxD@4`%!Ji<4)+q᭏%h (XiL"QD$]m N&]%$\YBLF>ύk+IehQIc޹>_另'_Ϝg]Go)ZIg~>@\̣YL?HDT8[!L-}yQP=C@k>X$?}:4†ɺ6JImZ<(D @U]0K@#h.Ɔɒ)!0H(1Lbӽ=Ǭ!4ٔYv(> 5Q{-c С)򇵟T/P!^,d>#l|dOzHU9z硋xUKdZ@a+ulQĜ.$9 `3vx=uəb'JP`==6MA`7heDoYZO(w1w~c;Ӏٓc6t':Bbvs7*gGq<]i\|V7MԭlD6!I?R7`2=4۫:%1)LDŽ2M3neU6[F Oۭ(vn5ǫc\1rGnḥ2CkQ0JM(O:̬Kr V(FJq`C03U i/bC:FjP!GΕe5$kQ~DΆm%%| $Y唗ݖvs=ʾe˾6m[۝.:Ȇ"ܝz *wic^#>y%NK#RpVPp}wwmmYԹvnhiZ[.VCGE "J!BE}>aR_@'<> Tm3b"$j(L+,_7,dzz͍,$fzbRrֱlJ%LSB>5%+8L'&I9h'dh' R˚AmhzZJRD) +-C SJPCe&pI-o-5 %k75l7a y9 ̆8?+r5^EIAuhniv Ï\|G +=K+@)S]+T\ 4 WF+$ޛ6qȴp.~"YgϽx 2΢E6;qI[We"J`U=h\iۖ'-khϕR˒V>(sD9] zsivEa-NMI)KW^弩$0C)DHII))%Ur0fϘqq1bӱڢ-mXtZ[zTM N hE|d6[ɀlCbsȋ{jYzkc&5cSy.Wh+޶WKj`ђ-~ Q%58!T F١q(6j+.Ͻxr3U[R*O,gN|ФrQdlj`g1E1QvW6NIMinFZ5M,Å"?on?\2/Fs{ji*e}:xn2up Sjџ}k;?̔9^?ב9Кg.cD${~H2߳H.چUcOm J{8~8Q(\/~D djoh7UV+G~~ ,uU]%5<&˒8r* PQ~M:Lz.=֋H,w(<>^!8"Rc|E7Q)6x2ߘ6%5Xo%kWJ9@dzh35K9!pj[qIE(δE H^ 'X_G =.ެaBx6I::ڄhuP`M'ўZL l ~Sjk\A* 23y<(O\qEC#Jog"\'&ٟah{ri xly"SS yO/!H݇'/[X:\l:NtEK"OxiƓ 7k#)cOE&M~IeRqm4+_AK!ØUzyܬ/ on쯢7߿W>8ՠ粸+`d$%S5QT,@YC x_*K-3ykhly:6?W/Z4.FN1Jy2a4*9]MײzR1L@_En0ðٲ"ty.{q>JfGgYZsHB_K4t!m[ h2 ο[hY"3}f^ @뽭 W!-/"cU&efu'֊c^E'UuӔgvQ+`AS*6t7k_ѵj̶ =I9ڱ&ݟw|#A*GOSD.yyRJ7H+xK>KSm4ܷ،3|b:pGՈgU*:> ʥ#grP=/5!ӯ 0&أjxͷ;+AX=#Qk[ڨ_ G-9flQZK&aٌ\aoINhY쩲NCqML=P\ Schu^>g6>/WLwZ_.cW ۤMvXJ(i>1dzdL&XQW6E?qAf2{Z݁t6JlƋ}҃ɲ6!K1W^'\j^k޽C Gwq_YѨ:*>.(iʑَ2jDP)SEk> qVG) *Ӵ:J=;]@3%UE71sjz=ŢNo 2O^" @_f0$ E4,$["Er-&E-I*r*.r JdHyU4\`L'>.(^VF…N9Mw">@w@ ;7g眞sW= 0,Yq?G/@Я]EWA- *F)Wt)]]T 4DNTPsRgɊ,p:_CgkXN,8 uє[p;ct]`9Eqe(YNPX 5s_u`0]]|8~vQs B^-|E#՘ɞwmwn*Zhy0-[T-q UH9of UyK3^n=.`Z   rC!J/!}pFX|#tvCd}=fJ'PXH=T+Խ8wl'@IOՔ#("mC$}9Z('7;v dX xeNkNہ]v3@3U i?1h7$̖Ŷ. csc"D֋߇,%Km"0IƖ«^ Q.(/dUr 6=zmb]^BKXߖ 8(8ݾsk;smM6em%Ȁ2!( Q|(琀" "%u=v9W]#.ID-j9,ilDQ ]rg736ǥ~PT9ٙM^A$x'z-q*z"@&ڏE_̴j s&'Ux;nj( hEڃr aKLgM6*C[Bkuc4Ɣk.mI.Zxyƨۣw+"Ԇڱ.*N[na_5$ZЎY1|fY[֡BwDt[8zVpeOAqu dt{7b%"Ar_jZ $؅(e F;[_8ijeiӚ{Ʒs޿7E֏4_6 o7le {݈ÊؚVIzh |xbH}V&GD[,~QMOCXmdv{1p= M)؍$< w;d޻mk0 dSd%tiLLZ[oEppFy4"챣)J܊qjՏk)ILwEV)3k)8)Ri+EєqXfڜ(qq5lh `>kWt]L0\ΣR~:G1v>23{52y{[k/j@kȧ;cjvbcǺ^xlEP6 iǓ+ _Z޵Sͺךx(Mmwi2=BܦwS'tH WgaMWUXS?=?( P?AA$'E)b0I:_m_%bzWcƈ~{cSlaGaGo?t%*XUھe9snS|72 1e\|r?rr9GiԿzWƩ椩42nqp V B V ! ȼ$vX49B7H;}e{4]ÀT{?ԼF6jt::*R~gEfӑHu=e5<[0nlCq\J 6*t&q\^{4 o75%<jD 4/W=*.)~w|)e{!*,WbX@I"7'{}ۨ r~_n~ -* 6]Ɩ rݾ(qPpѪ<,@'󈒤&B(DvL^|U-jw趪`Z0dMP(]VEm\"B.jD&tIsc(^Yߔ+dϙ#rcR)8_Z(cn+%j /픚rYtSrπgAܛ剩m&>Wa9ܰȬnOg%]T^PL~+~7%8>߉Zϐ+?R|q|AT H?\^ #ЦdH8mq~9'2:Bv4@. :?JҷQ!!R(PKɓ0dKw0j)y`)#^:eT$WKDw4 (TT UT1̯!7Rt$y~1ݕѢ?dDUK.gߤ=#xDc=S 4&q{Ð1=S bl >a"ca`wSaܗۋᔖ= cC&`B0wA+ 5nq2R d^k\.|c[8JGl< {т@&!{GixĎa~ּ~OCĒDu 2$,Vs$^xnSCƔ<χԿyޗ=F("P2 @{+w!2* *0\+F iYH?2r<*^t|ǭRo$XUX`Orėl±zGA׌ve3Uc*>ڬ+khlS? eS,#@23E6ӵs)eya)~iJvQe| A.J]rG a Yk 1XrkX_99Z=+ )EG@;ˬH/s;[ :++CY=dz냜pW ni~x2K(8IN8-iM1!Zyq*i3@J}U8[ܗ#X Nz`N. g/(6Ҍ h"|* 7hܷ`|@ zďZzRJwjHeG"\GXlMr@^ľ&;?.ƓpUjs EW!?آ?<ZyWʻhq޲ܺOTŸc`߇2?)凕UD&ǯz#),>aE=Ct@#V!}CelYm6$ePS]bxN֣;)>`g3,m$KږB&pKےZ!n{5}w@J^"N:j!-\:2`ZFBC; =ۭڴ[WqF-*ŭqŐXa8 ;Ձ(Dt$O+(UIufF['XBKzTJn4ޚSٺ0ؒrJ#[mºBǠ)u_mJSa%p*2slO?7nC#Xͳy؜>ώB남6dC%%>H Gmg,9 嫅>\ Xg ,ohf%Y,Z*ϫ1f.V & gSIEG~"*'i6LZ0mWa.4U&hK^(6:Zk \,.Z呵;TB@mu%qh8&x1WrD&Ѥ9J,"1hG)\n6)!ϼQ6:rjI ֝nb( \[PYw>= TCY_QHK̈́>1TӢK}ݨo 40ε9% \R; 3 Pqkɠz"%2!_!jvZ%W]Ig.Qϻx ?//mS6n&?7\hIv_P^zDEPݬbw+[KV/{qq[ٸMKE#RFFY6`|9&4FS/m&/BPߡ6`NUliܠ)Z*RcN 6(6ݿQcK\|aNn";@pOR% nSLqG""WGU~4KNlU6jveE{;xC19pJq[] S/jߴz~sSw^h.";5 Su.R7s IHQb:nr"RcgR ̂KDiHSr1() V&batNslj)R˱Nڠ2)'j9둬UaOy]=eixa_B420Fsȳpm8TAs>M3v^0<; EmV߭BZW ߭ 6*-PܷJs!BUA1EyPdF[!۸cln CVf0FP^kG۝wF)|0sRwʜ8Kf,5e/QtEOO3oav1 g]vC¾kJhĒj{:eS?Zx-)MD~7OTo04qJVFhĨ_v;TMWRoŕv O1M]~~vzMύOjEUg/z 4m$̭':%iR"0nȀpKF{me|^,[>fɥb2S)7ьZ"ފ̘FfC.'qa83RdYw[H{F%4%In}n3%KOq i>Aj>yPѲm|3R V%4t8$I#w.ՠ)\iO’0a/l|h?DFbΉ02>%- ]8GjI03=;:23<<*#395|ۓ8]5/|;op$ͰKCVQ6jGl5ްwLl&tt|?Hyg$RωѷhUܞ"=pv\6%6 N \#H#2:K-ҏbQj120mI4hnQ5cYQS>kGAŮǛmf|cǿLاGE3a\?L_5ɥ&=dC!Di' :I< l(dq䓳G+Dfur +N_mTpIzQmH8 hŽș7M?M ,M ci17iҰc6+V',M ""0ivo zXRkPK^vH/r<kޠ.1Kp,+2\7{ߒ[ܘזunBȋ78Ԫc-ِ>KB@zgI>6te6'hkŽb44}? ֣]jlE']$yx&j6 \(x+ K@q,W8 o6u&7HX\SˍC*D0#oV!N.07]⚼ s% -[*>)g`3; --/(YKߖW2- £{ Gw77Cvw/ƂM+.aM:a`)+]2š4_("0 サ}̖"٩]ȤȘ.xH@@PGA@1^@DxA??eU6)#\m88Tw{uE SLrnO쭧{tϝrL9'Q&A8Ĵfcݽ Q3+$ B;fvI ŏX  -=4VU?Luq2*f4zp⯐jlJ%RYA]IFh&<AWqpԾR1V[hsbցgبpD&CY{(5.PbYͻk c7[.$&2SeRAEI6b9BWQ8Ϥ_◱ՒOXe4ϊW4 N26(r!@ioL3"m+)pLuLH .čDhgvHY!hlYmlڈvho)w:l2dR{V8/0W3ǩ*z)дSC虗g'nT C"g;zYGV̰1;3dRr˭*iʹQ9@RNSIXm:"K)4ݧ6g^W[b15+"Œjه8 A=K\t 7M_3b*>0cQ5j;fn4ݿ^ZkᚌlRGja8S|Ptj")akfYϿςy(-K+ezeUQml\L|Єd,'n4×iv-C>Ԝn1aY _&t ".ّDG{I( R+tQ6{pELa`٦9Gwo/}o/V&í=xy! Gɉr;f9ϤeJp F48YxQ.UhO8^'3lؙSup)DlKE۷h[-tVD=o'{蹌Gc#[\a5uo[;GM*U`r Jx{-& Y3Alɒs[u#2J5 鬓nbyDahk.w9} D[ȇ"(lԇ-Ksj)3څ* @=}_|kc^hz0Q~놎matǯ[qM3ȳ{]= +e(^ds6kub̤n"um9ϑٛ$|&+&w837Mm&%LˋxJ,NP%#OJ4)uOY1jq ̺:/|֮={87a-bjh$#)k$ӗx3|\Gu@l'E=kpM!OԜm[G@)mYP>Jzw50:k?[~Pӓ,#A,|E9~wE*!*^VXno9/T߉PQ+DaJ]<~d%)Ipzn8ޗ)ZðD |iD,'Hlh},e9s90D:KIFB⢛bܹpDiIrq޹]Iʃy낷ԕi #8M,ZϜ'3B|)@5pbK)KRJf9sLd@')W;U*6.[GO7 d$f9ګ>e6A;PtPC;%?V9Tp f治Zu+$t SM]+Kۼ W`Xnmi^n"ZM5|g2= [ 'IF.1)/YGc\k;7UweJj%1|gjdZ0;zt&%9]6>m33FWzvB*sJ`]odEO$7!= fcٲgrq)yM=?Aa}G%h\3*a^ _xwM B_%D_3brU}/sݷ/lҚuN %9 FP\EsM(C~,v?Q]uִX[c7lx'. k'vQ; %i D_teymȷv .эwXsS_S3W.]FD5G_ Pmz L`WIKp3U#S¤Zd䐷}wu{.,MH5„ _~I5$KwϩUs:t!GSBK̛J !vGpl6WP:4k7 ox̠~Q˚̨ۭ:->=;]w}3Ģ[[OiT΀M.G:U 5Z$i/ʗ YE3d~Y~dhPLpn,yp7prnP{ܢFݱe*9t,krl':)U|޴'=L FX,hb~kA۞qb߽Y_Vo6T aN9_,Uph`ďSb!-ldM !%S^v1uԚ|FOʀiz>JzU>jTlfJ O_JqO-2HENoFf4䵑&ZWW^|h̺b@<ꚵ)ԸtZ{)k?d fI7rmq|1YOm\ruU(;A̫(.v7 6U&ͧéjI4IuB<}XGY#,R zk?dZM:o|)slulҟNgooQxV21e >$WqD= pv@b37񁄖Ե* \͌2z0Xq|Qs2/6?`xZꅈiaЉΝud7wQ&=֢G -"!|?ImJm<2GC֒:qbæC;t%vZPHvS\YqOlL^ȋEξ^G')Q|Q z+HD2y"_T2^-)W6)Q)tJ#nUcV :X킽u׻ȡv>zb&Ol_\E[l|o[3{y|s4k@ k_/oHBt0 O7BNa9:.r'~z+^L%]hJ$iWt?%PK>$Ǹy{En`\ 04WuosBц!@:F"CigaÇeERKxB"HBbX1Y9lGTJR(: VEP a\D`1w޴\FDq;/?|΢74(Jib3vX\-p~{bQ{xCO6FDVw-E|v$FX1f~as0'Ԃb;;tz^52,u}lײ@qOh_GQ* P?d+"eBy "AAkyhyG8N Փx"Qlug@]໫7Yi + U#DǿL?Ђ R%Kbʣ^ {9YGAmvrn-Yv,2g,00#Q _x !$>QD|b?D׊)dSTٹ%&RQ gs:Eϝ:`Bjs?{HNlrd {kqCTWM/=)A:{[ԒQw㺾JM{ lgfBfc6kUxQ83ž}*MN^,C&"]:uK)j7=q)VJ?m1JLwk@7&B;+$Zg #(o4aVX  7SpA)vڼWN4❽/ZCjyݽ辖sjJKnFcݼfLU=%ܚ@ŕYS;zeNbX\>.0ċ?^qv8ͮsGazJ2u ݎ"ѓF8Wȍɉ.GOiĩMV17}Y4XgT%W:ƶUqnF.[էۘ*`ͦtJ8jT{.uQBKT2J,59W$25;s{y1׊|*f0LCvsnDpH{U53lՠDVaůbHeb[BmBm}ְCnC)M YSz4 I|, UD6@'=vז;`\Ke) y*ppIUCXRSqN&oԭ9UgȍV >k'SX/{hVͅ,u߽;<~[nvhVKHrtfXXpEa-YJSѸeg klK]!{-EPmcՐ!Aw%j8Eז|6'˾vDuv*{Q#_JEJndK{3H1?ʡܞ][2}~kZB`G=Qk@_>ih4١HgFN8i+#=bH7e0#iî/#[3M"ґ*z↬ta.[)K")\>FaԫŞ̢iq!-t)=:|XY!Ħ]&U7 ReKDH d^KxE[ߺ{w7;0!ߋ;eVDwX\2xȋ>kU&4)vɣ#tϊ+zUr"6Oɱq s+֐xdN_6ݺ?<_Mu-Wiaj[*D1>fofֈ4~3J pӽ C %] F\úCF3BA/L87t+ρ7;jgk}VQb%9 R'Rwuq^YB6c1hIoZ7}=C#GӀ5 @B]v,+<ꎢ#ry$_oWD 69QֆHj kR)5(~r\%ݸQGp׎L L)L\pwXsP޷u5Qa(m-;\!gtlS#$2L-jG*.%ta{\Ǹ0GO Ű1i}һoHw2/Lg?#,AH yٗU:1TR/쟗z]/lulZ_`Lge,2﹙/2mÜ2I \sۺcpxcz/u769 օ8u} Oj@LnjI%,9OaCԗP5P?&g\n|M]'_Nl0/ v W$f#} ͺOM/gHGI$#!_QBx9̗,/yVP F⋈x:t\=Huw =8 h//b% `.mb ^~Úe0Un&pq?#%dtNQ=T7ƞJcDjWez04CI}=ĵz ^ ~Ɩ=󿢔KU/PPnLwL.:$xs1_;42ߓ_&#b ;=*$T^ͽӧd8g&%^K 䠜yф|3/ 7XΟcydؼS[P/K?1JQav@\Kܶe:B g׮( :৸INX#ctc8>0uYbkfl΢&%K|3$&z3tPD@#U !iOS 5\]AXWjtiV=So~H ֓ n[%$/"  m^Z#Νq;W`mPDWhCdLY+iw_p| ffْcWג<;[Z!TIL'8 |`  `@P'`RKDTF\-]M=ʚufiZꩮ9/B8PA_2lfj7[Br@ϛG=+WEդi).Z7Yh\%N,*1w C(\47$B3UL&6 J~*撜Gil6؎Z섗.aW&5nh%b e_D\ b%7զiQw{vr'ZȪ0 ]4qD {.5[)yJe~7!CW(PEťFq^r:+zí'@+R`fY5Sl{dEeRa M5m⛌z?HXAth9Œk;j_QelIcdkF\_ɅWvn06 ^T>O2P2~d=l⯐5v-*,]{Jg.ξx>/ ɑC,sbcn賟g̍#ѯB9.e)Jֻ/{z7 lXMWF# EY609&#m(o'&<ߙ6Eȯ1{黗xRKt{N4jq"c/O_)2}05aב6xC)eEz +_*&^Un`ˬn3u-RzVr*R-V\x-| eR!"iGCSa31M*zңv]܎RV)fh*gޔՏJSS8DYYMØj_shcN?O1GiS(, `:4keU{[R|.BÊ;^DHAY̟\ M|woJ܀͢En抱4As>,L}IOչ_E!u|<5a⒎!G`1K!&4nͦ\SD,'f$RypIc,677T}?b諾b*q$HB33{fw|s~ņ]L7Q8{"|P ] L!C)l$XuGӔYy۳'Qt4#mAf-\X+b~D/&zL M.+(ź+TM* 5$äZ1& J3- άܩLȳ\s'lcRf,]kDCdni36P,`)'[bTʝ:Mh$ <ُ{8wz=yK1Lng'cʛqM1³y֨fWwׅG_8 ?mII+-zXQfju@h͈Ϊ?noX߯)rlIJ%3;0+7F%Ԛ6ffm<f6.@3!/'͡r?gc]ކƖ#C1 F!TRx):}F Hq8R7/K5١4[})0NxIXXUJMPqd%1yW![1M;=h5T](~5r,?UU-{ѳ0(Jx"<}9`a3,,!6y#yq3[7)Q/M"qf-~M {\ECCN|șώkʭ]V>G.`  s?7clݭ.Yc{0eA(+5nkV>uV_5]vy#LtжG`C7?eᚕ!6/Р=dOQapDK|OlX㧹BkT|M=:O<% >e2'hrr&:?2\}uL]%pPJ3_̸ %I셳 'ל+(y};3+ATB-RKP;"[RJKMB`j5hsސrǷɒ̆:fY2K›WПlu&70k$<ױF*ݬ-s'-.EJ vQ{+}CuڳR4i>*60 ;ZNXzR1ᄗկl,ux7dW. ޽N*a>C0h;DV ' -;(lwd=T!7[%0^4ǍkieI&̆(*5cу+TKKZ~aՖN)DZnwfXJ;?F="[2=6#<d?jɸtn8}N& \;=l4Zx&yq7iޔOC^`saX޴o_Ni,Q&ƛ= 7 `~=M=Wo|&&Q&UO &$`~ e:4HI,G"UC2q Pp|p&0ODKkf$pc-ױ7 C[N+鵀I8hzz$x0)Zhgԕs;q`mm8}'m[#J&/ %jk:lcq lL8t a~<8 _0`5?yOn6h~v=5wуn7l#Im]pbEN؞_{{K[$4t>ɩH7(xI4R`I0,5IKL)e, ^>`ҭEyM|)2yӑ&%1H4ƍډoz׀` S-> G꟨IP-Ct@#e3;.SV$ X $[[ݝwU30 "g4pPKmҖɒ-,LIh8K/* m/{A粆}&=Sڦ]aP6i^+Ԓ$w_p}wvگ붷 n5*iD`0 H@P QA( x'វ1Q-f%q!+ )b1t&jvydô)]bڒ*89?5Z ' RRQPQ \%k86^Т>|[U(soVAݰ2rhҲѼ͝ q`Q5în&s|FWBYϋDfMV`9@sz o Ie 01׭ֲ~չØiuLb 6gLNϳح/T$rY+^)F u DMS6Ԉ“wPTksR|JB]X0lw^ܮR oI Z57 =ȞkT6SmEìB%/8TS``Em#ƛo5vM"HsHF#:t5**.lA4/CBJu&{Bib js^0AAai9?|܍_mIe>0*)75u8;N]zVeIu2fnuG~g#vMy/Ė}Z3WtV0?g= o-ޜ:qC<3k֠B?x5{N%/4ޔc7.S_P'Ie}^Xhwa{\_*Q\wYQF}-8oGOnk"V}m8 s eW'&T pV[3c8ӴÊϤˣ#}:a M&r^l Sjȕ<&Ȼ)*13Utc0I"ٖ+4 v& FQz{2_ FKrn{+WbsFVMF]W|ωnn +YG w`ج$O[Z1j-#q2kt} eֶ[) ;v6B\gT4KH6eYkQ=Pxov=_ΝXbTmq bmQm'DE*mcPHEdMDL"2Lҫ\%oh&$As9Qe<-Dgr 9w NRAnjBO-Yt/9T{4(} Z@[b ׋?RSv;'56Z!gsNb}J=;azZRpK8,.o:$Q.Jj'#&X8Ta< ZMĥ(_s?L ^Aۤ/ȳa<1T^Fz0὚אntcmivxqг׾-[F(JWlѨ gƳL65 M{h81^ Vգu}YZbѰХG~bjDu%>|%ﶾOc76te??0">)\?{JW*!F$v=-6fx{sܺ͵ƳbT)]θ'u-g;E0._G*0*m5Y)*V1GZ7]Ž Lu:^}1>e *9 ttar8r|*yJx2>Ta÷`|cI,I QCJ'XA[G  ˄d.]pfcϨ8^)^;6KO:Akf0+Hg0&zsz?苍y+m<*f[(?@괗(ɲSw_Gb,";,K? 3b(1΄LѦVB:İ(ދʅĻ{3K=Qjo.Nh~TzS//ܥ.@ͭGm87"_@dV2$ϊmFl׮Vr)l~@,Э UbjyÙ"bԮ= n#/P[}'bBeb6j9M >]anslӷM,b)1|ڡP{~(Dp<@}%خZ--/'E0I_z6rrz%Y:'k՞B,Ւ! 1?{ݝd\~$/75 cqܕt$Pە{\cxs(6Zh w#l0wXwPoqKA†_rۅۨtTR>eR h+1:*op^VVq,Zy#8)ޖ"PP/&ؒERw] XWyrZ& S &KL5;5^8xNb8*-TI=M%lTy+hx”F#vR] j0˕|dAB\D&U8w) 氍$N2>^xELaIݒ$?r9BsӣHR+'mNQH׎s O>bg2Lm'^hFiB-pWD􊏬 g8M4zUUC(@&_oCl2aË_)E\ېhtC6CVtgm?a?7/G-p|"]Z ^uX^2#| d ^w*aL09orX~ 3G`mZnjұ1`iu! ^Wj2?,kb-Qnq@S𻋗eh\];l[S8;'{5Ny`JtޖMJS֦sMu˱69 v,sPMt#6pֈ;i~"vj_-5I:%@%U17sPN#Df~9:Ֆ{{V,ϵ]\ q].;$Agd(V]XvckZRΜػk?8Z^„rj5kFo1< (I'%-K"k&MޟR10fc?T5ܫY5:T"[͔YWXsH{3L]b5&OgD\w0<|'I[DjQiZ܀fOϿLARxn%)˭4;|WkY%5z\b[nVXv_ ϮVQx;.-uUa#:}NEC+AO?n"yvH/kGPK5,FBz7ڥ:Q~sngk)X tBۤfsdL7ukDΰ|ͬ4'#O8 ֮F-9_M ~5KƥIvn)'ӓ[x[fL[\wQk6E.$*^{m6ԅ)##Q|'^tzB,wd:%DѮ[nޖA.yj3d5?ECzYuib}D3:9s{OSie5=[[_I¤ԕ!wK~ռvQ.\?)uM00D3\/O?$1y0{|$6 qninEKCk5#r\2EU,/)-ن qi^EfNqݨs0 xq7l[ |Զ3+^>MN\/'o߇ZMlfօW3Gsa4(SȂZ7/K'/zJVa?]ؚU!S>"IjǴ3 $/9Yb(n~f [tӼވ6=Y,WXq2Ӫo?`.GhZG6).5tK Un*z ew4 9.O?\gQhF!\Y<m\ysrP'gpJc |uW׆ƿU:b]#20,K{Fn).WW6amT/ EFSJS|63EKp0`Lg ~:j3qʇmY0FHg~[qh7SLR`BP+#3۱7#^*pޡ~^jbݏӆ=' #gz K=nZրngIqz" A]|Tr-{ C)*MIl3v 55& SƲh->w#=J<®em0?L,w$[7tfde7b5;v\ؿU%Pm=/Žݭ"i2n.#fٕgK -#C"hʚߊc(flo_qlGo]sfG-OcP,=ҌS E9 )z |ªQBE膹kSX7Q"jy,Wf|GOGdI=aWpyΧ $K|Wc"ϕ&7tk60*K pl]oxHxqH{R:rX;NkwƳzW R/;wŢCOWi;Bm  .RN:~/k MTT]/ݢ-N3|nq=DM> (9OTVi97";o=Ae.AE^N]aǟngo+3 39r@KoE{@Y}~MC '8]6"_myMd5H\ڡgKMo]:Zǥݻ:*f"mmզFCocncv#r.}#@ʝ?WFz yc;58"$1|+`1 rp2-@6d8=|  Y=Z}hȃUTQӑc1$5F!L:<ˀ|>>(]9MJk+9gDg]c ~U=BkU@ٸ=,cѫGCu_:hW` [o ٫֐. !msFROj #Bg;9h؃__к7%.s#ȵ<d^4L|BrAƆ@5b/.]ē\nIFHJDx( C'2=h}ۓD#YyNݤyB#uN8$&ɞM5 פIaΈ;d]L~aR8Db $?ݩOWВx 4(n&3 :o N%w/ﱍ,,ښD 5~whs~N8dG'wP'J)aV2Kڥ~r@DCd@#V!;5>M$fU r'[V:ݹWՙL?  !,m-3eYR% `K۽´oglw_[tGȦ0EiDI dtY{  {n^[n,mf]ٵv5MdȠJ ( TF x!D=;f'"+:FJfq}c(.$:$50C֑lNpܵ֜8Ϋbe5g\f\Zh- UrQkq5&'d0RcTm1L;59`Z~ !%,f<=;]>(LوjÎF`̃wJ4czpF4h⟉~ݺkP%)}W% 4޽! Srߤk\鄨uI;%6~%nua5[ Bssa1XWvowZx՘%[{4.r1UT߻I>!:ēȀ)O7T9.@%em"l?[{Em3ʆֆbͭJ[֗-Wڤ.loX̲TͳjFcLGE5^XFd]jO6ƂȜ]SJfY0G-O95Y,]W"phKXfQ(id,#U y9n}<2F,]E5k8 =WPi6 G}LG4ͫ/33ЩCnr5>]v猙י #kl絹s~_~dž-sÞ`beFjwK9TҒhJf?&RJ'Ix.&QYᢢշAK]w ZWv &=1^ƽ^eX/bJnETъrƣ_c(q/;46Ǣݷy2Z%f|BgՁ(QY`9] ;.`aʷO>k X oqWnq{7-Ï=e4NtHR˾ZXF m/SSs_,XT/3π&OU_!nҎ6r:9z55ǿ_|8]Uy:x_|Wo";!Qj4dm\*wo9O(zUIFL1j_ےe 4l׊ p]ӦfɳkVWϫm&mo$iXMo2Ǖ )`(W3OCtx\#p'VUcG#4-鍫ҙAм{,=+d̍4SZf{R! '1ޚamJMLᚋBc$ٌ(ImEM6zdF)8 HA|U8)lt6(a=$=&e f0ʈz|H״~C]tȶܯ̿5 !֤&g_(/?H~1O eAԿK)tyU 24\ʝX,T#- !]ڗ9#aZXlʖ03o(m(k]=@6QFiy}q6hJ_5/P鲟'{iƗ괚ph1{kA<&?PAV:xK:)b逢wRz|=\_B(˚*!X1~}y17=$=1a{ k νVަEO0Fnͦoغ[z#Hzg&h_mQ_ #L/ ,/+QDdEŷljk 0x"]_ Nl_ye0,6Bn?P> @Uh1p31l ƫ#bTkVQnAZ$XQqDbuG9p5pF_c'htb8F{WG]oػGs~Ǧd%EytcXHTNt%6L{ _oR ^Ӥ2S `Y)u3S `9LX'b~yq"FWH.H)C{$Pch8H#Qա% pظ- JZyY2@l-J90H*_U;#YR%V4xXG2Rdd HIA_PEda>@wX4'6Y|cqkڋݓ7]g4!F4=eзA=_|6"EbG8T`Eūh @ |_|"|g na! em%]NXQ992^|;'|D@#U !iOѦjk5 u1\w֌[[؝U| @PZBa_-L U6mIZ6;;Y"Bի@Ԙ)u5EHMPΎ=qD}˪u풌eirH,+}1hw^GaBrhV*+i@3 nGk|)֩G䚱^#eYP|}E{#^Q-pk쏠lq1˛E򲾈@vGM }Sיw6_J Sk'p*zo/<;4$ +fI{#\i°m&4ŝ:j]/yt)#NWr:łx3VOrC%ĄqFnG\QrָNT(f5pSDa^X$9BF4dl,88ȸQZ}+(eN0RQﺬ/ёvHK*J3}Ưp) wgmȾ*krc~V Uv:0aK3?X;\3I5h\.FlOHP썕o">(!7%̎E.W5gLo+sGWyj/%=v7cIqnxFO_v_M;eILQ//uxwgQf\?A7CG]*Z;w5'h7<_bʡ4%~Aϣ/n?kMII7d:8Lj7[WOKV~gCMO;Qũ^nP\-^qk^xN|}L㲳 TorUqv =򟮹"CUe9qf-_*c Ӛh]:1 3yy++p%0Νt&ً=}[ws ^ڈl-E2bT}.:vff 范ḇ?*8ovԋ!qP2ÀalܠDbn ҔsVc0hc-z~+%eM^I]>z'|f|/)2#iZST5=MwݎI{˷F%rT}8 wtqd\KBǴϗWmZuRmJ n_/8wa}Ĺ!T I%|boNYJ12-?0ܽB| g˼ۥ6`/#&e/RcsL!! U(W3q.Y/d+Ѱu9;9>XgWtIM-Rk,dd_U[*|:J˸R5gkt]W-ց[lP=&T>2m~SHu' PYynNE7[.z]ٲ1p-yYQQraPႡ]#s 噝ȴ0[ϭ,&pAw[hqBs<ޅS}!ŅEJύD0 hOZ˿Ι)(Ԯ}$ :'dB824X4ʃP[[hTĕ(zJwo3u\KDW:1V]=>F Vt:BJ{[j{&%%e"FMK8iܛaV:z5V?rґ1tmk뛬GgԒ޸u7Z@dnM1^/W: Ѥ^>*ch,? .!@]wxBZIdڑ0/z[@j-6AL#]NCe\,ǹSru9Z&št37'2&\u@7_J֝IE&$LA })>AΏNkR!m`<{ѓ$v&F~NG6f؉p@Br6=u=9 os`qhjAmPѪ9p') 01 o3url4cUx%ΖjOqnpppJBWV"fed=Əg)iCD1U8%u|H,\/:&˷ΓK' Uy=M>{|'nnFE8>7EBҴAĉn0*%Q} I `UPoSeac992Dnqn|m" Gs!fH1?2M1W$SR\<îg?Os k<膱LOm*i#O)pv[AIn&k&7m+n~ 4p#MtC@#U!,;0m5.V,uqUƦc3d) V޶uoo` ]+'e(\ BF[W$V[]+jw:kw8)VxlecoS; x~6O 3`5z{nM-R[2lM2-GcE!/@^GyGt{ɋW$5-m){cQ$-(ifF3d{EW&0 mlrZfi 'Õ`>5f/as8Ekr1`KGsc^.Sqc1\ZDN/iCf'u+4Z|\T>S[.IrknHպ~ρk|[Y^WC+[`Z][hծGՊ.ͬLgT|i"V5 RsI=2{aԏDBEffθ=-.[FݧT !=k_}Ș sv=+Cg Kt-M#7u簐lc(;mKsfHZinkXV!<)z:^> 9fxڅ6M Z嵣aEɏQGRʔ.0Svޡ،jű?Zb=9Mq\.,-*|!J%3]f;C?bQrݍVECz~{_cŗahqI6 f\}ejwՋ?w6D(Wh+%OP1>'$/80vK_2[v29"Mw v^ntoz>!sM>/*֢qؚF3qpA$dwx TSE_#qtJOP~DN{lܴ |g-j…]|K6Y,ڻ_ >&t`WOT[Kx=tC$FNc'ZeAI viZM5<(ݫ3M=A=EM+xQgԹR3?Ղv ufNS/.U5LR9ZJM3qx*DWrjߊ]e|xvU3Uqg7S"qvXѶ-\XjV 8ZH`B1mŵ6UNFP ^m4aE4ZJO)Its!+h- /K|l:╭6<.wCt?B:&kg(q8V?kC"_6S,н;]z7G˧xYlxӹn]wZ噶*/ uMɣKA`O5T6s%V bPo#Wj\yuZv J:qlcZqiJvI 8P(_Z"IڡIv>o4!$\kʩ@\Ƹ.1=vR|UZ^v27jǥZ ;0wco'FMzU2xK--hЋ)DC ocnKr)Qִ3l0i/§Itl^c1>(4f +0,Y:5s ri/@I)6ștcw(jz#ٹ\E: b؁;?d=e"`@ Yɖ>ٜ 'Ϟg=dg̨O"TA "dcL1Bݠ۸?I2>@Od,tsא=m[k@jWA_9_~U5*)dl/RG,ܫ0])H, $k>!,QglYl42l>q@;t\܍7F|Mw]Vء;95[uI?oD֋&`us܅O~}HeX/T" Y3aZ#_,&? 9<}8 xCN~cM<\Ġpܻ6MʃD ((>!!{-!ڒ8ٴTsL~ޣҒE̚& A_~LC&6rbބhv}r   .2Br^bK(78lywqyHJ.^H}'`Zcwmx\z.Pf=q+mK CFp-@UgɋԋkRMk7ˢTpc&lQWY% +f%|k$e,q:Cr1~Ś՜b2}4CFگϸ²GNLq ϰc V0}Vm?E@xzgZpU6`caCua؅1+,xtB_'_lqU`ax\ q)G4irSdM/V+2_"!Xh*, |2`B qWF+. _Zt^a_ 7KOhKO#__?DChr.O #x7*12h3eAcѡtɴCoc4 K"&y$ @}d91쀳A+kH]aes@]5T@B#JαI/؅RubҔhW8 t҄ec;1OFeD&8ew3H> p$Z <=[3h$h҇J[QvlOڙwV)T+3iʎ 87fI)xYj½E7[RwW@z=}=Ν⍊FMa h8M.ސWhv\؎IEjإE~n#iD8z@Fb@N,+{>^-l~brY۵ٺqlՇ~Yoos8c:=gJgK^o0jhQП+s)$n89EnFmZ%3δsIs&S#fVGEπO!@*K6*dX}Y3"Ope~YTt -+<[_0 <{^C\Lc]e4vdw;"<[m͙!gAXt<:Mt<ȯx>KŽ2$0x{Zt}js:BYd\ *\^e`(7 PJGLAJ&x(Iغ!1rAnW dkP^o24r4 Օ $3nFnIJks`ʆKz>D\5nSp.L>miϼVeIEv6evɵ 98 XxyVD>I=j92 N2ipnjqHښqDM&e1(85\+GUŝEm՘uwsg܍ng>p'n;mZ񭠽.rPWП0;/;CBeJۿM?ɔ0wAfR8mb_8ě/[#ʣ3vJ:ph8=|Fh!q/^Gm6]DuoI f%ܩSԩp wrq^B:uV?AlLYm!XۣD#;{v*Kc$l#ys]N"hv(=S9qEIf=TKԇ: 3wtw(YR̨$Rh +cS1HN;?IF&KUl:YU0 Z҇jR?L?5@MF^Ų6@+ȀilѽqdV ^ ީz~Rd#ݽ}:l#R_AfDc Ќ 0IV`=JݯM2(2Y~N2+@/~,]=Ic܌k&;|>7_oF,#k /o`SVVLy@\fP)]"&"@~yTnl=hE6c9,h.84gL=]/*z"N1k{c鷲anq̆{:p;}X|*5ȜH ;a'a֓RkgϳlM]ORzr[+3v'ƲyO4}K1*C9PDD]r핺1xbIv 6,Ȃ#%5Twr푷Wt_.7 ZmIvS䛊}: ̭?)`˵f>;2,SKXgI69;؊ܜK h8pb0fsϚܮHH$Ge-MFl Y'er!TxV=xz W^2ek6aw_$ټB8m'ND늆 R nz_,&2d?oy$hMY Rz6K|gG; H4EUc[M z&l(c8CmmtѶjaiF/lߗRCK=e͑o(Eu>eouto|٣v~~Xm.q۵Gcw$!E0f-%l|GnvX奾ς7vqkE ZorPRrX9^\p "Z^ -$ʍiCpjw_w.o9]h3\6ZnZmV#"nW";ޱ:B7]-1-5]*nRzW.嵙|vĵKg քJC%t +9l4EOE: {ڟA;V8a|,3wo5{ݛ?rħv,1[usCz;$AIZV>w*<Ӣ",UO1K"tBWHEY, Ze%ptoIC{Ȣ\oXݤĿZٖ"\l.>//aEMAeSב'tOA| lQ]KP!Q¸C֦_ĵ1!I:sz83VS¨R;e/ =.>zLf35iwj"KRY["B=8B􈘰_\#<P}'y|Gb4Xڜ/Ȋ,7_LùO0h<,Կ4Ewюbhʧq6h# 7Ä39^\dU/Ey8#ƃ7nG3ry=*Q|a2ض e(&j| =_\&M&t34wڳ nOEr{Rh4Z@HrdHZȳp^OIi* "-|BH2Ji3Rh>m >ȗ/qg(CQ*7LBFX#*xP7.[v*n×0a˛>6_aӒ^a CW`0ծ/[T50/0p,઒$\p q[>=OꖙR5,Y-8Pm?Wx+_Yߕ(9쥨`).Ewr}U%^ I_'d9eA>'g{C1{[>٪X7I2NulEO$z_ r/zXZY^ .Uw A6 @$eacuy"ÖVFU~Q:J]'&V5^!+hXj\l_Oh`‹8A'P /{Ifv#>{ p8Y}cXd(*y&‚. R ߺ`'mEw\ނ@SzR'1/Գ9'&?7Er?"]oŠLOpo r3Z&/xxêE:ihByl(#{Fz#=lϡw\[^E"zK"ȂyL~f Qb8҇o):W*cn^Y8m!aC @HԂC>D^TrNhCd@#V!ӆ髩jetű)ؑ<٧Dz[uN`Dh/i2Sd[%oK!KbQިo+(-}/ܹwՉlvzEj7a +PҰ eMǛ =o}vkn+ljʣƬXjH WL@#"NH9 H$ '$OYRX2V\&|Q"K!yŠmgmdgR$64¿,(n߽n!@#ڇ4/;[~,t\4%^fMvֱ艨vshqT=o«*Q=#?WQ_(!lV/¨:&j6o,)gyّ϶@Y;5 YhIk9Gl xE1}SDhZwZw8tq*J=nDsUn|J5OFƶN*ֺGӟv NFCwNAEC;[qV0"kd+}WA7^.Ej U}M5hZ*n*ТBE*As< !3)wYxp@c|~Dֈ7 >!o%<< ,\-raeZ+>}ArTQ Nִ_4=;2tI҆N(-̲MQ9ߪ ;É*{p&hruA!K_CUw9j;C5q?pɡa,.qV]8uT:ڤt7YjV;Rf2LiΣ +G3Ę7i'?{W40~h_Lm.ʻkVe?eѤG=%2W؅ui`Z$-ZAl:/HVຆ񗳏~0$20XO~gW%MrwqyFo>/'|yy '[zF2BF!k* bGlN}NQFugEot>0$?5Ȑl~9cAwt*2AVd1Xkj't1<󜇇Z[9\_N7TLW鲺甹{}-ڊQ}eUFA9P2+w.{n G[ofB˧\\Z\=<KVvtyuV`(Iumԝy[ZU&SuvX_gUx;$1=0Z~fc~M$n? V\5oSd:ES]}MS>{h+V3^ry,QY-B볽4Q3;*j7{cdSlÕhU"PΜIo7t)~GUY~81U/= :ЪHxKw')cY\.1S1U fB4q*+BNX8p<{9F {C谘sO.04~+oz3N*CEf7v  y5ﲋ0v#WuhM1vl.!۹5e*p rcs|1HrgwZ\WN.u#T- %-am=[8ęjېvϟѰ(g\u<6]=ΰLv$Qioˤ!"׎A[M`6 lB7$)@xYh/hᢴئ: BDE@ @-8+%v̸jgkZNPq[&K6zJc$Z~~N {$o/-/VVWbqr8GwUrtYvcˌ[͢|ȹaϊ.de5Չ`gY%ˁM^kw,iA"ΕMM)/e#ߦиe7ZH0{yg%'ioͼI@N*|H`Q8+ z&_kRV3Cr= | [ *TA1ehΒh2<|wۚ¸ J7/c( Jw]ݏc}UW?ͣ?mnDF2ɕf0N ןtc51Wdc{||+Qqavh!8&$G&7&OIzogM>3pCzU>ocM8j{#-~`I'okoYvxe'؉gڸ%{[Ub<0zlB2?wLH58@}Kr@idѤ5fG.$0!s.1yp73-Ǡ iIo> vxrMبWoԙPI9<_Az!vb"N} D@#oV !iOS r]u;Xk6³4{=nSo֓-_ey[VnW]aB}T%ٜ;.%j馯P)96 Ji ӀndӶR^Q| 4#`vv۵-ֻnmdIdDBR(PDE |bXeDt4Q2S Gg:u{bEI-vXzHt#ΑFJhZT %M0%6je9 0[CF(쳫Y嚄i}%4 vgCSfcKW+mh۟NS?vPAyc 3Zg='A=e(W?Wf|E"*6œۣ]dH1.(;/6"3D_^pN.7Wg%:55gI|C o4^&tTVv-IiY!o>}ԛ QwUهmoߴ8X88`oeP5&*4 ye>m#'JU.b!dLm"MP\n8;|rwwX1e'RJsy8q Uu=bwrk/95 \fi:2՟5]X}WXHy5hH"$=qmzW+6`4Z99'ۈA\q9[[^ md wfU J}SMū5RImY&o|nqscy8%U]#1r8<}?πօ[|sLUj!^a HVF; 4s~X6V&OFtVAm BwɂOXտawxw (C"hנ͒09w$X3dx+ja wؓ˸F)l7IPFpF)o7B&NY_ 7Cރ)'X`{v 0g*$c a3^tcvUpvߦJBKRJggA%ZP6I#U5OG$)I'I")4S\]Y.97x-yF#! J!e#RQ Z;ܙ)ɪd g>ޣ3yK8 eݱwRzMPdə/anX,jQLOIzkr.\yeoK~D43ϖa.rZT$mbJnJ%)=VoVMAwrYw+_6q (ONNO>JziVNwųR;[6l7Zuqbj魏AW3fM[a[< `\榾n}x%~cWs{dR*nJ:fKGFo[+./ѕT*q?_>'u3*(FVzUP`1%'\ShU t- Np3>oZY2)p1_Ǽ8Ʈ&"YG]SVֺͦJ_0 sC"aѬǸcf^A$PT? +[)N\ _ 4(Ҷhm?5?jh[!r}|<8-q R|_}~I5;\bs+yDr[WNtm SWS|mzQ=.!>{B[0nfnvR@Fc#Y=g iCBhSmG0~Lz9|F$t6?Q* +ywɕ W ȸO|Sgw"_{kt{^՗5Go530Y ;>~K (zU+Ρjct:2tmf۝Oba̳B)詻,W,ue\0 Oix`5yS`aXrn.x\hWfEEE^OI1lnmPOT0(T2CL!AMP$/ M tʝ/1Y?[gEj c9 V.r S' mjK˳S>k|7gj)=4ks?<Ճe9z,lLʐh촴ͨ _ROBvԇR$Y).G1̥L yοJlonHx_;'3'wvtMud(Egj[E+XjNJ;l!UK*sTRٕkPbsLzJA4R^2 V3'4`_њ$~ R %1,=ΤON8:%EnU6Tw˯9=/4_d *rPJ7N]HaGenQBS*J.z:N, jJQШ(j i`ߠ. {.*z%&*v,,ٯK61Ƒ\Qea*LSp뻩3\ W3GEtKI_Ar/_T`h >_'M ,H )3^ sT(@]&FF8a-!Ig \,/Jm[\K.`͉_NLv#K&0Hc#d# fjpC\ -^=Ȥ"6-ҏk6x#:=;B=8uJ ^-EÊ]=&/!\'liqYR COީ!|eAK2*q-J+ !Nv&\XP^.7pt{]X4W+;9=@-:\_iJk4d@#V![U;rcVu4ք딪{NUĿ0'3~sJe!$ -$L e٨-SNՄlCTZuځj4WBa,Ͽ _sicZ*zL[<i)lqlQ-tk)?&RVtg'M!k3}p类?l<| Pj~ٺ&ܟG4Üz@^xU {XlCjQu(3%&&RO{8硩~UU+އnYfHk“,Y,4c5<'3blswPfP2(ٮX+a͈l?NYtAnMr0oGH|qo=zdJvDM*Iq Qїx-ӬB%N 0(4EM(0w:-QoEb}TJP*M{B\MD i9o>XfmLB4!v.ryՔf~n2td|~ xv}c~O%J ѣf#Ǽ FL*6^\*!j4߮QdEISjXbsW> nE)fo(T$5bœ :x8{deWH/"Lk+6GE-,z.V_iGqJ*9!WLb-IbKܼ/)!G bF"225TÁm#gۜvw#WV\jX,xN@iYߦUfkyO) ~}p2Ȍ)(m | YVKl%fV{;IB.'i(&@ y+#[ -f\J$y!/R3+}ez?̵1֍x_3 sZcqJyFoMQ3~ 5ߛAuW4܃ښ&")y#Qҵ%iKr'vBV*{~j3g^ &}+tTsF430DC~&Fa>}uۚm+vtlz.(*DWl֕V'JN:naDTeoZ1p]۩/am$+.焩D;Hz8=\v/XKRI]x'J#)3J qէ/u*FRVgLXZ2[pfƜ^riq$(_m<2A&ŪSFnѪ]ԝSi`-4#{s#=C*YWz̿g c#bϷryü|'``'խ^[X+NlOJV`NjxMdw C.yy+|d3w\OoH3uTy|-s%b՗QJSN>mբ=\+RCzav1HlIZ7e6rB>f3?,nAr>;$/]0ƚ`\Ӻ#lI~I7Nt=0F_@JkѸji*Jc:YF7' "g}n9ţ?!b'CH!LDvƒn~wNUlSGxǯJ4I3US:x4XVl¤Vъ3x#wk+wacZa2{=ʏivñ}ߺ]mt^ ` gK;.\XvPv_g2A ӁKlU&$MLWz\c z}]3LΨeC_Єku[jK*-r& vK] P@c&|NKQԊ.LWVҷSW܋]g]K ]|\< Agq#nk*1Wc,-(IPE-¡sYMeO{#Y-hn@@52=١~eq \YvW_{T?!~HjzUvye/<3tr1٪AYWF"cs1whGSz*| /$W^TC=FD'GF~F}*>&>~OHuPuo[`wRuc'!^b @'u?|HB̨,NMtot7=+~\X_?Sm7>HV^T:?Fsտ(Hԇ&S#DRY 350nsn*tڸB.-MD~YFc,~A9~9`eI8̹_JU{4(Kd@'^#O/m4N򼥈h0ʼnN#4Z|2ha6?@'[r9TE}d.Wy9Zf=-_^fH*_:9(ϱ<7\Ѽ9U)\AZS%4e< @Tĝ%DWMufoq3 66g7Сy,Igfۙm>n3k}lqIeIH벳Ce1ry>|k.37ԙ>Tݺ{ f]hJMmf3hL60$,3@#Um"'\MRj"1 K)llm. 򩒦Oi?0Z#2EHB‚_2ҖWBUخ_9rQa!¹mo";G#*kcaO%Iz,/w#3e@`}{۶.-UnsBtXi ${+^/RI8)C^:ՁΪ5e5ԩa[aR8$-\)tXCP9*,(v3O,V3"FP6kThҕOY7q`f p7pzW("37mV?o,#xkAWvSCXJ4}OkJ4)丯u%[k[F;|Su@Ң:moqkQM_Yq5PПlFaYI2`;enfַxJnpCtX8mf|ӕ>הЈfO.~1eܢJR!<LeXBo P* z5Q0aᖫV6%6WPVt,k/VjVG(<>FRO׃e]I(ELw]~4}0{GnV֫k~|‚5{{| NeE,WUaT?Z{ ͜}ycD7dQV|gYp`sX\v$&톒6J}3ìΒ+pڨW0; w-BL{""x-AoGbHzQ!Z{[tq$:EjS5Cݳc6csfz8kDq816\km}ކTNrفXpܩLAs̪s<4j.ۙS݇(v\w/ ]5CKr>z7:җ*1m!A+פM"-\X`k19[oVsq9vxp^3/udH^rg:/"Lyv  E \&8b_"N%Y{،h'baz3rX<(,Yvɯ'|!\%:?FޭW GqM2BxL&K.2Dى+=S k >] A;l mo^-O[Ti(ϼ)m%N*SaSiP#'*"h%f~14m1Iak\H ?RۤڃmuXM:l}u05E⯲Ch$ cIDSK+75@H&?rx;L3۴e_ Ï cohS'_6:C#nyͮSkex-Tuq@t0"3Aȹ(#4B$|gU+OS75EKtq7R]HeGle}ÿԹTUCijh[OÆ-BM/pr(Uwe'A7^Ԯ'pBb6ۑ;xgTETctRZjy1U_&i^{J̴z*gHvOuN]hYDs) ,72C[CO&bix]?~*c ~.~e|7n< % 李/=CߟٓjM&k·Y9XVwmǹ*yCz ?QbHyLa,>䑒 \-_оBM22dm%EOIp%Y jLD^W#NRw^FytHьoᚱ]lz nNfu LrmvWv(5% G~-.9ӧoUzoZ0J*& \CI{X-Lb]> *X`k-!l>P~u*T׽*Y'P5,L1oFsx,^O1s' skړ>ݺ7/"R{iomE̿QnUtpbl]%NY{Ibq:, =LPHѣݒ ҌGPΡ_œ)vy̬8ww"R(#XDeW%lNWX+uuUKM9v^Jp ,J̨#UDVNpG"0e%DYN,]'Y y pQl#/S^1@3d2el׽F8|w& ""`˳Hcb҇&gOЙzz3؉ eWُ"pjuH l;"`"wdɐ<.I ,G3އP,$-.Bx"NL7FSw%FR#*rM|,G* BlHkF.*` b3!ZC0hegVζ #p6&QM)9&|b_/\@o4#AhAGػZ׍KH"rIq$ќl9oc:0*&dvf@;4;q@ES":)425҃-Nu@[ׇ'1P0dEnE ˵0Fʷ1 $8jT6s|V H!BߦZar1)(Mw@-$,hPf " l%YH\I9Td$)l&S!pi}KKG*#Ddϡal!4bXư>37ȡibi :{3eJݍbf[ԋ/"y'9)]궟o.d9uD_ͣZ2,~Pn,N(Wٺ_'^xv:'+Zʃ/YJ$-ҿcC8E炙#@#e)1);"e&6}lv2qn.kh#G*vJg[7tKyG^bOĔaQLl+'ϩoA CFɽ(=*eo$ j~ߓ͔E'ZOSg2[uF:U*"9dRnof2NbKʩ )/H͗Ii^yVeTfH2,k%V:Jq.h YHۄ' n.JT@] r\}7|䰟ͪٯF0qI9x˿3~['Ks!a>}0*}~ ƺ(ddLNo7Cd@#V! VSbePWT6O6{{^ӷL?)e̔KߖC0- W^Q]ܑW)ݹ rG6G8NN:%*-_#!#8޾nvv[lLnZelGDc%&$ `#2ƃ< g ?RO,)&9.왠s:6ZK^Gժ⎂Y;5E-O=sIbZƙ2;S77Sr?*[T:EYvC3s"&ZɜWiTUE-BUSJE2:y^AQl6/f[hsl/'CnqܡhM9P;U63KuҌ>O=aWM[jbv!rFe {ցݮP(bsּ yOirpgx^>vD); ׿:*UKMLG,Kb#߲+J4Tp*u0U]G،f$ʢp4tLmΨ^)c1bYfq-_AQ\i3U8vc |:|ʌsFvd_5Ix'}-jit27m/r\5_D>ꠣd iƭ[GUUhS9\G7vۣ oQO#-m˻dqab1NDʉ ~*zeOujGZ֦A5.CQXvlЩ! Z㦣[$Z>wyj֒ Ok1 T.ρ*0B|t}>b!^RNw(/ƳZ6X=@^xUTFfYf @ʉIk~tw ><2QԤHs 1i{m50ڀܟ(wuؓM 1&tpt}wְ/z:d^!j.Ld8n>5rQOPZ$^F}cv2Do"\=ZP̜>je7͟q՗7f*cd}җ1]r˵bĸ0|:cqP #8D^Z1|{YJ;͢gE ={6HcO/}sv Jun+xw꫏ 8Ynт Wkϛv&S~]" X$ ć\d/~ZR`o,agϩ_C>L{GeN x1 | 8߈ /"&icqY1WАֈ" HMɉ23vR/>Fk]mvHe!932oWAt nL6l ZQr}'|^f{\öU{+.JIs>5 TyQ"Qe7.e`|噸Ec }IbRFޅDl?+BldZĐŗ>ܖ v,#m)gPZ>| S%-~Z nZ$iݚjw~3Qi&7sY)I0gAU~Q/(t^=Iy-FKtyo@'/v9yL]H'x'Q4E^Mc+b/F/ussTX&Xc]d胣[Ǫssk#Ǻ&#2mtyDŽ-D jXfY[+9* %lK:=Txx} 8Fٞ (]">6KoyT8>3Ln^B3Ņz ͡` ^yA*NR1%yבAZU<zw+n~ ?Ѱ![XuF郇 ?:R pԿ TU F£ ~!LT[HPCاVJ NzYMp oWOURe{ܦCZٿ|| ]}m]ӮKH]S{z1D0yJd/'fg'&R#p;عܥ]BʍzqF~v?ܿdV wKP%`n!tD"aX[^eǖ? U|P;mOԂ8XZ}1~C}'!丏35$zX-$Z"׆A{I`3 YiHCD߃iӆd 8n7Bv. %*sK`WmA#|cgiO EprE>|k=UF]fx|dYaω6,ɺnq|,JyzJ0VQJ $5@RS ~i`{Tԯ%  ,X^Nt3mUhct2 Tak+_;`PU_YZ(cfwGtllR֐KaCfaŖKTWY)2b<7jrosjsJ g[qb=[3>ɍ9Kϒl:HjA%% ܵQ]z#YKѨ8KQfbDÅ7(תܡY\G"L5hRK#6mdKi wzC":_T39ok:]ӵg:[ht}m(i|=늕| lo?~EQt/efx\ HWZ )%ԙ4/LO.-d{XyN|s Vo Q,tGSF{JotA鬉4nBm rU]Գpo[*5Zi?=Oye!VJj[yH1 5%if҇ϑ8C\@&OGh.V;Kl(֠QXIҗP][[FZӻS2mb)\CVº:?|F>_e:X7\7tpNL%4q+xkīav2B$iLt7Z죟[(L([$_Xk$Lr+qi5 L <(4݃ys#r sIQt_qʄk"Q2kPb;~gp!X:Ïw毫g]1Hg%EsWoAi]2eSl6SYG<t^Sg( *d:DP3glEՑ}~a ԱXd76snֽW[#rN5>d'V~vI)1sTL2<7 Lڋ=b~Jiз^n3BkQudd! "u)c]-BzL%XZNR/pͲޖ%=P*)  AݙeEsB'_QK2_͞$9NzgB#3)gI?3|B۝%KBբ`0|e+s9}m(؋7҇ZdU']w{j>xOVhK/=/qpQW]pRyxÁ8啕NK sySb cmAހ+t3TzB5#'*C"w7s>N۠ Θ%4޸Sl{+N٤Tu9?y=3:!ڐ(1NL=2ھ%|͒G%yޘ4I=K /ҋ4-=׷uyt_E6JXJr''R n#)S?ѣpre@M0smǚwcnK^`ƥSZ'5$]f*ğ4" 6 3MN9tEՖmxX* vч;HBvO^޿I[~k|KN6!ooƨ="7Qq3l.zZڻXCP1iܟbAiQJwn<ܽ{IA?;-9 JP"b4Ql͠;1\E gTOJc},=obx,?QWJdշ\,@M^vd]=(oy&n B&w)9'Ȅ1]&[ik0y Y &(#z s7@OVuJ-9ھYuU`i,€qW5ExCGs)&9b81e'Aޮ6ʻIV6Rk8ڣ}9`Mdfggp 8><0d-b<.DL\@vZe_ˀbXDP_fjT FIB{~/B!\7>\`G&3 y =oƻL'x6'+j,x|J"9GN"&wADXc.Z}/ {TiBQd|PDU*2u rݞG~(n/-&^~aDCK||sIb9sf՟uH i?EٗPǂh$2|dNob̕"B^|ʌyzTs}Nͮh>+jq(4 F1@?y?`cD]l<}J#hn2ơ7%N(` @/԰Xq1'#LԊE!qP>kD'`(i8 }E(7Z^ q|rQY*j'Blx{ٳ-lJ9#5E8`~&.jo(n |ѸkpEA|'jEVpXAkr)#3>?= Lfc.s#@7uu8Y Aٚ(|J/3]Jjr^bmY)A‰ݹX9x3"{$(( zPD [tB11iY!/S_=B(Ksx#S {))j]>s,ٶ YƲ6Xq W` 82!m.qfw@tdybt\|]R}?6BIOWRޜ)l 8+!c֩b]vV7?4UaH).L.*|3dBTEyPyA斬՛tekQm6TN}=&5pM/kq$g`?nnN9w\ - c-V ḿcSgY8ѽ=_<ߔ]"\+@+|GuKjSnPXc>wkVV3֧xEս);0"Ҝ_]M$K)=mM_abl8Ym0m~\m뎖kunu{}<'eUΒpOV_Z"WU}Dh`i4~9NU.w6뱁nw~~%BqK^ϴd P.]G+BYDҞӻ|xJ*kW@tD1eWY@$0Ԋcv\0Ȇ).kۮT骱r6-' a-zb &m5\uq/~"^I1JQ: Lh6Qmo=$0r攞O}Ua5?/\VnCأ<60{jjFzbSi3{EDb!S ,\G%>ۦU\zWB~+Vh7>iOvE >;]{ƑY6l{gU!0(}bp8_e*X-jn 6-|Z(Ы2lkiRQ >c~יG|x'bEDm{Qk 3^|HvŧkMD7ڰpg4e~XwN*O$9Ml,4!˙kV\EA$aH-0q T^:)l5_V݇L^z>b&%W)M)FfI*)I&{(,: :z&4J"բ(#t2iڔcF\VFxQDPEkgGt;ml QIZjIN'vELEegrq]rkaPu va̗ pHv*_m]bi[)8 pÃCp>HeW[18ʞqzK" pw#}lkl҉.vV &䝋MmTC+.-Sf. d*/ٶ_9X@<^VvkdTͰ1%BSwLF ?E ~m=Z~ wu%:IP n]“ i0ɾ t;ygI<c;T`j{|bT{&/9^.пi/x#.!g;t4S\H_G$^tu/8"`? '1^k$?7x}K}Ǡ|.đ&z7ez|^8̸GC@#U!.;jFV6c1j6O6sg` A/Ymh %K ?R$\^I v/wv6r{E@rׂ%d-o_{{}ύ8hmjb-4aH9Bp @B "^Jr^p %({ ^5$-TۊmAXA3-Z7zk]E1\՞٭olb?,&7]u)!-M$Tc,wP #epb͒Xs> ] {3,T>\3]zl ,{ kq4P}ѵKqrg)Nc݅4`` M0U[0g W*7$Vp^_edw~jV2rI#6EExE/_ʃ6j÷龮wTK\bQnqPJ6£h9nXwڪyEX^綒G4Q3__B~ޜT٥wR9IXO%W(HItؙK"oE&>K̢z"s+>UDŽG7eW^bq:*Kː.;ى6jCU\K`gg;WRt㩽DzÓUfN O*?e.aGN";$yQ+⒊d'D,Dg%wTerL1Cc3В,'Jnf%K25g@k9M<,%gEgeL ôfAB:pUz^iN*%pvN2N+y2ЖR22[}}湦fE1gZ$Žs:YB̤H1 I\ptXeZ^–'~7M`}/I(4pz4e}&2I :Y[mK6] nE!-xY~JcRX|I\ER}2cSs; nȴ#o:|%sAlW\8 0"c8]j*+~И$ϧfpYRu"Wu$.i?Q)_gMtI7F$ I%*QOڥrsg[sg5u*Oa o(RA5AOXݦLO3֥Æ[NZ8߶ ?>bͯN2헏I0_][YTx&;<7 []Er /YQ:5:sϘ%;S].ҊU϶4.L`< >G_8r_?**ϭ0"  {6ʕr􈐧5ggϴ&Oyΐ`h|݅M;rogGk\枳8>JP`hgtSGP݉p<-ME@)DKeuW/rm g[xc1}gfi]lv-~E(>Ui':SbHyC)ڬ(D1-6&{єR[e{o]#7H˷T_fQG%fR^8z~Y/ʩԑaRH䑥Ғ+1k`HcWig$U(>']Rq0~tUHHR􇿦H{V>08$5+"3ջwa*Rw7[!QIVۗ~rg`a*^p5"ߊy{GI?OLfo?xxAbìV`^2g>׃ڕNE,ԡ-E[fݟ n.fVtuu9N6K-IFUxmdZw9TL{G CVH͊I2KBEgjM􆍵x'fSnfXvԝ]C5Gab\vDe, z@?;jnW@6#W[8uS0߻r v0?sݻr=tm;navqgۻ5Rvwޭ&ixB|8cלhzN 2ٯ<*"@v?DR̎ I 9$-L3'Xw(s}gx$ ( 9\HxnQ@%\ąZ" 5;)"C!()2pԐDlHB5\7WQa`FfGc hBlB;aUѨ.ia>U,S8`j'~$h8㰓WᰚSxݳ2;t56ahE"* VU <|)< v4qrCx``M/wrCG[`Jv_%$ ֺػ x,voF>Tc /8Co撗T ;Ρx$20ᗱCl5/z*Cbv\Ǹ;$:%b# [WZ<<쎥EN\'AlU c!o. \U Mr>AØڱx$T93;͌JV*;R/24LN)e?ϔ+t]H!G5B~'l lmzet tiG61@20%ևcz HZ/QA))0:'VqYVnx?TU>u߹5Xh:9559d cZVt[2^OA19-[W˶Y5z^yekd8PNg v߁;&Āz1Mq#ķCǤCE#?ykw3[;衡}m9c`5S }nӰhi:5sͷ gǥ]Eu7>u(ejQ|mpR{CRC.fDDP&03@3U i/1QVBWeW#Yɖn;vwֶ(@qz"P4``/)i% %YXdS%oKjd)f{ `ݸw{d_;&h-fGt GMC($鬿))8@jF yݻ]lq3ej\ %+*HH@D)H|  !@B}'@}arܗlUQRIiLEg&$WH<⚻Nn^R7] ѽ nqvSJѦؠBtsnQ IRꫪRJ}wlP7{Íq52[oNL5 Hoc(RLىaXOp丵m4K^-wN+pO>pxz #oN*f{>t>ĩ$ E~37drT1Ck)NwR室$hQg t֕XkC1%T?}:3c]3KK}ƶ!(q\iY{8|kT]94*%vW?ø ͶǎW;}/4'1NxF+zߪLmȀmvL7V-[[Ń92+hEpc$Ր!YN[ZwHf!g{D$-;2R˓.6X+Wmb ifzY6ZORd`(Lu> ߮DSn!J.`/m2"|CԶД?9 /=@*p*Ó1 ˍ(>rI7 |*Ygq%߳= >Cw kזnYb5[|͕D)]uEc*CV)ZLҧ28i~ɣ_taWY{4Lՠ'{",fr7biHow~R-BB`NNGr[iD,W H̆j>X@~3\_zxэ&A-Ƽ+B8LZVuvq(tIn2XAV"Cyl7|vjgmX[>:X\UɔqفQy5 x%F 8^OskEX$L%mVk0UZxpMh8RXAɯcm }"+Xp{vIR+w`ngc+zkWse^VYɪuX1vJzps?xϑ5:%xG xǑdSչx_JO{Iz Fm>xrw&Hv(=.o(jsPIlʫKr%J9$h!J7Ljuͤy:dh9h2ق iĩ0{45.34RKn''_i`7q7)A>'bv=Ι'jȮ: Z|1DC!Y٥S)lQY@.:bFg|η0%a ;FWYTY#bp7'ONUEHӒǙ%T6|rk8Is(+UsGtnR69V߱&Lҫ%dxp~wLT>˔$d̫w|3&r` zY:x,n7Jʐ1~N1}HI 9ZֲG[P/YxSi1pM5}Sj3N?.9jr sТ2x\9]Rz*KO_qhV2ܳNϹtNvc.n5}5ݿT۸tMmkNQ } oTpC'Vo3ewN蝶ꦻQX#MNc @DDv?)}\NFgU|g[?f(=f}e 3|_B(eDt0}9hW*$ߏ*D`Hֈ~r7ymdˇ8o|u+ Zc? $@uhGsQcwo(wOzO M\r:pULa?ek ~OdMo4lFAaɭ:X M YZF#?ɿcʾ8pD9PfÃŖ/C";A^SDu7!3ƌ^HBu<$OE?b{8t0] &x^Eur2a,:8(')x +T6iؘ;xMY:VZ:=j@M~EyJ伪=EkTd.OEHƜ_:Rs$[&_j85y^SFq( 'T'A()ĿH꣸PN_Kv'zrPҿnۣ۝T`,w VTPJf2<t8fNQJE({ɐ^HR&ETLy^PASJ[Q!I +PPQ.?PQ1`G2+E;/&B߭:j rθJ`,95vp;PZݠ8&ϒ/lH{!ǜϮ7$wR@Cd@#V! VSc7u$&$<[[ڝU݉03 ш]?n[$/ ~eoKjen*dZa729`GdzLt@tP,OKN#YN8?(}wwݽvY{-)ҮIul kZՖ RU0APA@'@D}AՍwQD֬-:1T-f&}010UUjVC,1&$h;;6wM1 >i_@pK/Vޫ-U1)z\?㖬 S~dt%kf'hjPk@Xt.3SNUY8o4HQt햣ެTsJJʖ hBrRzWMЫΦYG/xFn4Evľ¥:IUV}iQ 1E#jk*K[mF v{p.+};?uHa94U.MXIm})M#,@| g݀gOgc?ϥq2/,ăֈjK'>7wi{)^{2$ww1FToC4(`V;ͭJ#=nM>bG؉l6N1Ch{kLtv"]2Mo6mߺݵS)/[ZNeW9_ 0Iaq*3(lryEQZѸ4(:?o4i*OəM-ea^elqYN840mF{b| c:T!i*t)I:X-xGhUR6|a1Z[BOCL:]/T`X;.Nc:+͋E-7Z+{A1H,B'[@eiF29PS~&h}!䵆ӵhG[ 1^dڇ/99Fϻx!9Ŝ=\㩯+xKK^1 n))dw9|mwN~7OZ-Lbw55 5}W ȇt5G~y?eq^߁o2~$iog/ b3X?42Ԉ?Q׷ uXfO3_H^~<+k u?G_LԭxpU$h)ɈŹ};-m}}cB=)Ii2Q>LH7q$a"d=~m6ne$(W@ݖHގ |x{C&mgt 4.|[0xr XG(x1uMjkrapyE|>?t]Ey+vjYxmc5qlX&4B2e| 9qv iGp՝ΥG`|aQg;e?Yci(7NF 5<˹*{yT.Gt|0cz`z =q(e\~aONi!z&vo#[9f\V KMgE5>v]qiU8E`+>)&yЭ6s7Oa6x7,Aym/5@7UkSUdZU#f.B;,ɏl뫚6{`7?\>goF<8A ?-7*R:#>z.GѺ(^1G~qLɌ O \6%Uy@@1"}a6 [rBO"Z)g ݵ-^0TJğY&Iˎ nFӉ+j/W_?QЈ n %EA|:ݦAI/N97' L_4;M8~FW.JGlBVG+XCQdm) ̽dqRRu|+p#{j;y]L4{P)~Me&v]$=@9@ @ o}}PfS u4^| V•JK>rJzSOgdMaS?(̠ U%@ O rűk$_Z\77Cp7.&P}/4= L ZE7IJS%?E~%eG.n0ݛEPW<-AT"LQpV$5s.@nAI]x۠ߴWp%6S KˡwqW RPpxC!meolpu}v?$ϢtA_1ʹ2J{x>7/(ayK+nҲ0B@bK6iKF0xFP`9SBީ'VѶSC @r!r(H5:;#pj(SN()) tבNa2K:+F=K=gcd_ߊ{ @x>BO ^KXyB_T0 PH3a[F;bT>x1}IM{? vzƾIMg_^S%Ҝw_CЈߓ=%t1{$dZ_ID^>E KF59F_WDlues{:kC2r*ɚ*G&5q $^՘`l0tɧ 9`tP%*<bQr]\):<RRX_l_uS^WhFZ(Íňz-Ygm^;|`Z3@#U"'\6uBR)۞26w`O4J~3(KږpJ[Bd [|Imwml#}}*r?NY`)L :(SdT4V5$βGF#P߾mXms1~mmwk6NDӦJB$@HEA!|@@$Z!(HagfJZUEOuP}U|%ƢZK!%Nuքy.##Z˦F Kd/ 9i;55Fj5iwn䗊g;-vZڰkl,Xl֓jR.7P5c&ꢝl0h\}Syyrr-q:zujm zm\ſNc3M{qrʸ4B1[RU2m&jfXƑy=o%L)j84K h eU=N2߁ &Ec~}@¼OO~QΣ{Zd cpvfѩg}O*0>  u˯+:K=4x3UC˜ݕ |u:J)o䶿|#qPQb}J{3%$jK+[8xWbdO齉g3s]"cvL Ȧml"]3DSVn )x,Q Gv`/Z!Hٰ5zE;~m'kA1/tב=bck!Ն}IZ5Q6;!1x/I{-(D;Xj:{)A?7} NI~xB K8$*IGt  cihKLwZ/G|7og1_<|oÁDn.fByd1VJw6zYh[իC ~vkz Nrځ[nbHaj[=]_\Œ~ OT)eZ+6olS8VPoDJ͕c%r, s{ʗٷ}ἳ_馡9Zl ls-悭VI7u;uM  B76q6&-ʊ`(NWbpSC3~Xz"Ex $t&YJ1HeRc F^2Rhjeʔ/Qi;U^9ͷݗ9Xb]nA5̱:{ GUv,wi74U3;BFt8kd$$()\PĿJ6_~@Zq{d֒#IUug ˺QZf|El$l ^]\4!Kq0\8.#܀tE~c=ᗝZGyǁƩ%25ʨzF4l֨Qƭc%*=Xw3zY߯Yy«بe8%i#fht[7e)V^ay͝ aAjۨՀ.c+.%|sldx. /yUInWѿNŐ?BoWt"K\f-hRX׳M~bEK'&enn[,^%G>f}Or%6q]sJi! BF҈zzG{ uݰ*"y`^QX"Ot>[)%n&3ʯ zXýd~HV)a?^8H Bڗ#Л|boT"8<!:\*&H ɒkp&8(igzt'8a%z 抜Fr#Ru)<}+@H dh)]TEWMzU<KXR 4_fLt) f׉$.xvX;܈ɸf'SdН!+&:nz k9CsƴДs(헆|d߶P@X ه|-,ky,ty%oޯ[m.蘣E:nCŇLVX7ɠf(oao{Ȣi#[XUt+7z_ ²3bqA̼c?B\&c3IJYӎ~L!s>;EQaf?Pdtl2lLt]|P̨Vt|fۓ! ԈF:G>iH $dֽmabN# z s+*ی,~9E EXǒ^ėFJ|n.:DCSئ$W DRBXĘM~DpVQk}08q s֠YmP58yX%^3!fqI ׿9AnotQs3oz32aZ>`9 CK2{:P|׎L{-I#(AZa\YXF=,+ [ќwdKڧ3+%2hJc6ӕ$ 8JCz!O@CKd~A ȡ,vrFSTۊL.Wb}PQcвv ٤5NqrspaCo%D)1ͭzt}[etIf8k,#`'Q44TD,n< !Ȅ <@:I#%rBn,xEE47Ċ]@c[uiMe}{\q\U]2cYĐXZ?O q.R)fZ*T<DOg+G+{+x{}剶D x/Xje h554CnhV"= ;EŻǧBzL$ʫ8≃p\ ]Wp):@@}Y:7(T8Eξ&V,BFXcy_9I;zePYiww/f+s6p> d,b!p ܟ>pzmC@T! FO)="bXw9fY`E2zPz4h: ld"ry]V&vWI`Y[=Efٳα66 &"TUZnrtjZs `k5+X" `*s qޫ:hLVtrr+Px_Zz+ BADn KYu<^2;@݅}L?[[AH ƮPHLunfsg=aɼ Wؓ_옙c ]^ɴDn經.lvfh910]*x;.oΧJYC>^K|H)а]e]C<,;[e(< E@vK r^E棩Cz@ϸJgNeNy`Asm^4\zN]Z&_􅴦zaFAy*k" {=D<b-@ +h=v;IRb zxd(wbBp+(Ԕ'qݐlrLL"|M[Z I:tOavp%/_F,ɥa7lircRIBFds;'\OCd@#V!ӆ鱩c$q],qGƓUm:wUu&S~Ϭg02F#! S( $Ko!!KjpSE^}W})vPA4blW:gҁn~Z/K2Hfۀww}om%eEkٗ%,+c.BDrQK̿O͸r~W6Uonw;L4thOUvPgcll}Ņ㗉MnAa7,gDQ4;NvMB^oZQrw_(H#[ky||S%hj J"l(ΌMҵlEYqTJֹ.L}ZCQiHBc9؉kO]iP~jwP6ќpJ*eѣ6ڲipcikE)\oy.ATdK=f DDErt!+2d8AowQoW6Kw=W.kb5fUwa3V,VZY~ e]Zc2z,Y" r#[6Q#D7 -l)0к r5:F'kXSFElUqdɸ3˂/T&NWeݚ3_Ӡ8s퍊D׶ԡ~7R?.eQk'3U zyJr<+mX'4TzzMoj[^<(NWPxاFW,OՂA9h*kC6M"xͲ5$1;/$'Iw.6Ա5Y)ZgszbV2n1zoHƺ Ff).>isT1s{8WOZ/\ n3s@wA{|䯵G^X7'Djqey5K&&S2q}GEDu-ɹ4),Ofn`}([Mc̞gm4_ ӧwrCMb^DFP>" uSU/Ϩn͒9#G 40aN*\|TK>T) Agw;NENfh )i%9+9 e!gC6 E Ns944^mꐍ(kcMg]5*.v{mCRC"wU Tj> dlZȁj,Ι.qK^o5[!]o`bnJ3$-kʇxH I*!-^eBKdL(sԄ(MjH?LD<xg|8JWț}AR5.IJ^׶-_KnKxAƌ ƎKV0hF~Ѧbz* Gp`2vBK_*1<Ίs8f5 ׀=| ~~w{s[&|Ԏef(޾Ze {X.t8ss@JjS]]4v<>,#ϋQRj[XGi輽6~WvjapJ\ ⒯r(8R>-LUC|M8V$'fP"}g1OՏI&C|ERv* Rdc/]Ҫ|y ̛WU03(*y(ʶV{vIvNR6v4|W5H@Q1毵YWȈ+xM[9:szI(ZDck Vx*U̢߰aUYd1+1?qH/rZo㑝Ā)saH~ϷҸM~ౠcv")>6ϣi$R/b%{ *(thp{K_Ȳu))P6eT>=.~߀i/rn/<<./| Q֘niӃ6MDj N0ZHSq1b+˓4YU2,ZXMVWGi=+c >\ʅD#}y]s4tԛzeB)!4HE#_ȶ5kYt잴`)G&̋ :(9l0{/.tG%^&rU[uĵmPWM&do-UR9w5g7NMN=k!K"ȓa+]IDɟ%X^6s/7~-fcEQVë%w !ߟ6YYY^PRuU*SݘlDv]o4*J[ĶVqa]ϑNMCGM-kYϥĺ=-Тg@Zq ͚#: ji3Hz,gɄq)g7Fʬ|"M㡖j [zvuFҊu+9Pb3b׮g_ *|XrS{$Ii#in\!81my|q>(F$exCo}IS]/.xmUģۢ?+DZ FnCWt aaA7V+csDNG{p*u>=9u7ö3>knp T˜%G.2x&D[qp (=m3nW̑6BUpl2?uYs)jC9!l<Ac?,װgF~~=>*}v.[/oyߵ'u]]'^lSJ:@YyL &Xvx/qIHi4r;1rbuD5O!d* U7'++ vc>%D (,zVi 9ҹ7ǧp&p_Âp?qD*՗$Vcp?Dp(~q^Y9(h5ND`s7=X ݙo*n7DֺX_˛-3M\Iy|@an0>e<-GE^>G!x:g-](O|QM|l^ܡqFcyz4z/(qMNĤՐ pĘ󇿪@/}5V|GY|[|SV&h% +#Ls`j6y; +[KA67lqO(6*e_﹃ P+4RnF[nzAoB(D=hynqp~M #/?b5 R.E*O(M>'}ϡɴ)ljXl0jHVn_G_U[vM3sD A>@bO>\z]Ƈxx2E3ԓQi5`t=]ݯz}IV\NQjb@e'( umCƮ#}DvR˸&D>!qj5&i"__#m9>Ld YaJ~9 S݊kI.dڡS!9m+{7 esGoԩhFo`Ka ]C)V|s u] ߩg%ESfE%g$2gɕ~%,US 0Z,$m+M-":qd<׫Mt3]OҪI䗮,Ģ:v[gv'-Wo m2&kUJ+zR}xsI8;YZ;ZQrJ3#K˥ͪyz&ƙh^srP3&.XUns}A`e.e`/x\(g0]{5ZN֡N|Գ-= A؜[DWymDo箷< lMeޭ*L( \yu&bb\Fakt;8,G:3.4.JjY[Om+L2Ѩ ʀҟi!S`W]})e??qzVxz9uu*6[SsW߾+pQ۰^\}OW(ks4 ft?Y~?[{ M2fɹبP`6 bIZ*) n?|T% $%"鉩[ۓil$PyTM"ё)u&4UDYA?uo֛9;U7u`7컩/x{Ȝix.a{ݛ_Hw5&\ ɓv7'h"CeTQ?i+pތZ>bB!%vzM%*at2:B oAVq:"jJ@T$$ms@C*SC3&s;5=vBh2=!ִ=ro?</H""ܓ4_buq"y}Vv q!V&eԪ8"CW,4}3OBQ[8DkX.OWГ6|_/tW%RrmJĿS#{{lhLO\1j䬫φtvPZ$Y&!ȇUeS`e8.Ý z-K'gttӇt7[„K?8{L5qna!~1^q3`F6CX],Oq M`,ݛe5Ưe.oT8jU#X0Ne蒧'O+/V ;:ov4Y-дa1 |^.m%g'H*b6׫藋^6=;S^*{R>5ZLciRyBfƌ,R%bX"&H_IE=bBjKm[n!a0XD+'\#3qTٚkkJ8Njw׺ ZN)ƭ5*n52ξW UGqʾOa9 b%5Bw=yvHwLtN=A9`8s V0~\m(~juÉGq,BarEv&D)ռo:iu%6^sײ?paxs2C\Qu2ŽiFz갍#1zڏTEt}T?|Wo|5V6n! }oǤ}yE>]l:~bYYǫe˓rEij~: Iz}g"׺_́=];5oJ8 b"0{f`M*^?wIhwR_u" Ɇigsp]m7Ͼj7QU+⁻VL>U~T/77JA膺}q6At(? Z8䴎Y-СgpEa7Vr^|z4$d&=:7@ӿAfe:u.v 1Hvt.hYx/)4j)uלpuEd ˖(9+"b\T\8գoV_I' d;z JG#|/wQ=?XZ+% |ш9Vi`{ _E 뛈2bSʪTՉZUj,NFVZcR"r@f o! {QF+Aډ)υ/Cl#!OנG? m=mI D]9ݱlcN|ga-!Jn}R[$} P>ϤA_Or0=̺\gmGދô``jWуj@ 0:dEV1L|$0|oz q;A )VO> g>Q7Xa}88kcr4PJHUg1zՃl pwP}vt},o '( ™wS|/ۯmB^ ?r%nz 64c\i`Qy}ɼrʊ%2QY7"Tq-@UN_ lY LR#|FTGlS,H#7(`d/`=% W噯8Gzjɧ*HZ,*4I#.̌^nsaמ2 HiI~7xTx' g^Dr%0aable~he<Gmn-mL"~%ė"E\AN8-b?A'~ 1-h5=ljרIJBV 577(]Y-"n[8`r?.9i1Yv9:'1^jt.+eǕ":w(^!:;~¸*%RD nay@D@#U !iOS u܎qXW5sݻ[6omuwUuI'0#2Fɜe/&[+{G{}W~E$;}WlzأLzCe2dI❊%Yo 2W5`{nwm9󝩠GHk/W00qcmG~yXf,ifgkfX[D LT\Y)R"'j. gE-f/܌▨r94/9lC@E𻤨&;N!5Leb j[~ vQKt7j{c+~Ȩ\j` j3^[dTG`{AN/~5vw0h* Bh8&ɠԃ s,Dp;bBxB06MD>w 1<0ujoւYY}S`r[uėswc䩩7 ^[*έ)M_zܩ^2ckZ&&R$)CMqb]RB}w8F,RߗÙq ֦LKj'm ͼ6@"`dGigb Lm> ؼ  ssع\E"iEMHq^Bz{T~ޱM4vy=jֹHok s88nBTKkkI\ܽ2SyU\<]CZPvz*8܌f=XG*hC f%(; "2oN4g~$iLC4X.8i8ϴKQZ>终* {a&ĪL1VB)~6S_Ϡ-̨g6F}PI--!5/:;z1,Ws݅[}bﰹ؅ 6XlW+}jf` V"svኖМq/T^R 9tV=\s@i$?A"H/H[KoBhG ތ r;J#;dt'[xr2 ozژG +"L`f'U3ywH M-ܵJkֹtfivCDp.GoށWeoϾP 2\ʱ7;~<ܔl ~AZ==Ύ\ wM3*V9'EFVKT@bc$9(1dXmЖӝRuǟ7U{ &ɀ6~"]UΧ\vجQ'L'g0퍶k N,$vb;cvnp_e#_ITڃk+ \?sB5'}@CQcTMjJ>Y4kxǧa!'F!Yԃ/Z:ib䁻hHQ!H'5{'#Uo~IɳZ/ͨT#prS4n8=6Z(DJu * i6r#;R2v%/.6F#p:Z]јyOxuZv $#@&_l8)ƎP9I9EQ8dNHw"iO(iA2:-Hs$AWu1Rq q pwY-;f9FG1C>vK|.oRT@e̦54Itb|.Z,0bܵbǪ6ڔB41j>@ vdٙ* cA@"N4R&{./V%/6\X+ow B g.'G<F{`9;a\{1P/"[b00 V~x ,,8{\.A\AZ'{)--XaNQ.7#^6\Bd+.Š& ,7k;O!Zi-Y?H00k Xbq*Q֐,ԛe>TgfLVDyÛ}P&ߠ7( ^fhtg6|鋁2LR{7 2nχFv1ƜMxvo h@]0M4`)v%C̽cϊDj LzM124(g`C4@#U"f!5a ,`&*{nWo[oiȃ]]OƹM&Y <v&w2u6a8-7ko$ kcdeʄ!ۡ TBJZ&;\rI$Y#ʧ$+{0owmm۵jvQǐ1LqQ s !  )''?:YjW-,y0jJO"IZLlU/ͯ[LEkL% ⼓ߞ&ze .l1-?7j .`E לVٞךE:lm*;&L ZXyg8tk"sqWƷOիh̰ͬ,q._0UUU|r^ɺ͡ʹ-J-qC -A*l8eEEWr:` E}Pc%B7Wt5?Djr㖇p,b_k* X}m-(T~K[jñ5$wlfDbx0>9?^۵/n-~Ix U ڏ-_|I.vr\' mSGP#vI:*6ʋ5 E ԇۿ ƺgyѩMytEʽRl !}%ٞ/'fd[KIVZԟYWOhT sk{x9U ,oTfn׺smK%\s [~Κ EXT;a\zڜ^ޙ"4{[W2+zP),||Ld&2lTݰ(҅0kPpވ%:5aϛgM˸(uunECyq3ښdq8S24gjS8RDUJ:/MOu5X?BVHE ?@C8|U$W[ ko V.szpې?Tswf69ۇkV$xcлy}zqEª"*(N+v MpΟ+EJrlbw#CrEçmkK_8yUg>f,3OF8O_j E'DlSXm|;*>)DKud;Te26eZk4ledIqӎ7>Ԅ5UaMԵUG bQօ=}R oTXÛ8Q" ׄ U$~۟NiPi=7-7NS\Yo5IDNچD#w3?hƬeE S3csw..W=x̔ku ;WdyLV_MgZۖ5%LuKoQA(5}+WBQ_xŒ{BMמM)vR>*LfDj$)mS%J rpdYn"3W8UN9p-\)%+,񣔒ue$ڔcJ[V&JoQbI(ȱSd3q66u-g`@\DΫemgbME9XʬH3p2%aB*:eMSGH`tV1l(s7Gُ_-B~rjǏ>{7ju9b-/oڟZ_)n¹=OɟW ;עAaYwB\6 ^IS`{͛`o:SzJ5a()q-2sW4(ae'NE1c&@_f9@38xl -h;knEWqo OYJo[ک/ݽIehԮ|OX:J Fdwܚ3)~bSo-qd @ g>wd;(0GVa;h9qA' hr,EA@S=fO:?ttcgkl6 `7͟mox [tFDOeaJټF $MwД>)?h3[ƅf`xd#!'mXCeQpX}|%]"6$bMsल^tK6bUOwqiGGQU7c툼.wkxHqZ_Ic/fP3#KML٬,^v8!kΆ鹓av|uYlMUӪށd:2ohy"'k/9"gd J;?0g#]\FDkzWR:T& ^gJQRqmd#f3ST S7#zAىzw3W7;U32,ҴE"w% u֬E*ɯ\g2('1Ӊbqwt?59m>vtU oGk=a;pm"mK̭~[}F@ _eju^]YΝ$q9wt8RR7#YXOy;x[MI"6կF8(pވ\_s5709ݭ86#u46cQj:@g5)"3/ˍu}#~G"=U Uw== Yt}©.cFeO;rZOλ'͖r؅H#@m7v``FPP6Xv EɎϝff&(M>BRKahѨP @ }`sC#i4W^506 21x(gCF"No&,yg~Ê`c<#דDy#9or) 〪1bS-I39+OGt1Bm*\cEoO^pōn y7c"5m8 F$XgʖVA |%vbwD1@vTeY_^G%w%?O;S- Ѿe#hl s2޳.Cf+ԔTSdՎyb Kbd!?΂8#UT]#29z΢ņ2i1c_dXCaDh5f|<\,ao$zAÃKJc qp>Jެl5kٖ=Ć<9@1eICqWwD=>|Hp9mbzH]tw=G/Sbq0$hb$sNUpb{64ڬ \ D ="j!e%>?"Zۘ=UӒtn)~Dlh3^9~M4&ÄnL[L*5 qR(<4V8R)C+j{PQi]I)}ftQ +mN6nE* $CuNn0*~RݓFhw=w4&)#HI9qҳ#G }鰌}@H8@%(?w[<6wEza/ҘRJ(%{RȦ;7Eظ H_ϸp_UuQyEs1CmR+;OZG!&޾TVUϙDrKYAIV&Ĩ] w1WZ[mIsq0*}`Pث#lGw߈lrTW[}=HբU i7Nz0*C>-bxsV'=B/q]Ix7 3t|fgtN8n l۩)W!L>'.ժ-|[2z넿|ta *(L@*#:cPvMkͿ! 4Jʷ)FE>Ukxaï"_* sn}Ȃ{Azj@>ŹsNYL8@r B#t*FWF0y@/0{l&]K"s'9+%\W%*">P@ pCc@$V!=G1 Wv ʶDwrlU%hDB_KH,a’C2v ]M rw ^8l\rwdL+l雮ӔY,Ӡ|p \ ރ{%ɶ[_[ɖX,wl$ D @` ag7!"9mZqR/4`.ZQ(`I2ʏlɒ4Rwd)ehR Aʊ7$ٶ.DO%=;yZZ ݒXCny--y>wB+R驔y4'q; "f?"HcyT$}gwD}re9nn*cLC /~@5k9\&S^ޚeQwp}Rs>(cc@|B֡+5t)XDĉ.7#:#kuh#Rk4'g=a-fo8ո{˔ =×UVY+%խ h4IUILj^v#tǹD‰`k`aI !Բb]~fnn3.;p3S6by0a<2!]( *VA@ 2*z[LHlM6l6m!OHȒjŔc?p[{_Z>^<1KZvY}zgDՓ3G3>˿݀mgT"|I_b;3-^*Mw}Wc"%g/sۗ/ejkT5귀쁪R0j&G3U)Q:J&RVM Lćٻ:T%ģGcFQo2m8,$Y-!}~#y'$H.헾kEI|tKtLgB8ߤhD6kZrӺo,ܩK*pH}"JC=%oi?[TMw'l㛩nW.m}l6Y6Դ[u:ׅp5ݛ8npϢUWx3V_%l2ky$ v7As=u%w=$0_<iJ[X2z)ŌF'r~uϦeg%IMF [9V165g괯a3JDƧ#mؼ? Z$nzܣ D{Ŋb+'tNoiJbT}`v艘̲AH즪D[1@zr[[q{yduPgVS{kL ~-Ւ)mt ZIgfS]984NWjk/ uf&RPfzz&T{}2~HHJį1zɆds?U 4Hæ|&Bk7zH2f0_JzXc8ku~aQ6q3E܏h)ȦO)$zPNIMOE`E#%)PJx#+GɃՆd2{P-[WY܏ f$xѨJ [~>[gq2NK4C*8rL5910T3C7F. y-k1Y_(}vs3zÓ2eizva)8F<j:Y]F<ڢt{X{}qɍ]EoLդRbbW6'$P ^GabUsl4oc;<<4?6ܽM׼8Ŷe X]p E:eQN,|f ttyR%/LMt> Qj{yM+=R?n"coy'z.U^6Dx2bLּ%E뭷 j] Oz#ww+گ"YgpTjD$5Pbjj|$ &u9rEԢ4`=Ϭ}KYl_X3MUNG۔D3ߕMoCΥj2z9kXEMYB3˵nŽ'{;dpKQe&Odv:#کvөrfyװ.~8yՉ0. hHFgKںxB[603$t|J{bFHǛYl}BqΒ(mj5_iG&2!Nu+1L7OK6)B~:W'3dFto5Sׂ7ԉ+|#*(H,iN@nls޵T+F-Z6? /9S9Onm=VCqS#(2~*Nm7M/v¡U}KW8i~{D>9}_oTJ7IkkfN8z1Q稙 ];bI`Nt7 INKFzKy7.='.Fi(>1NwKvǠ_Er䦺Aַ M>q\H~!0 ߰x"e, x\p7b>v +",Qh#f7 Huu?g}}c?Qi XfW*ǹlMN$3/]gغz#>Ҿ>Qهc`(Ne68pcl>Xvc'x `:X߉^cMtDpM'D@.Љ8Mt( 7"ƫQ3pGós Z_#d*3> ~G[Hl}fc[]!ߝcͭbNEO#OtrhX0Xgh*I'D>0TM,V1?i&7ǏOEw0 -ڎe.1trHiè=N|8o.)LDH/Qv%<G%c؄V& [Ѯ Ec@ډtEi/RRѷ5{hj.kkF+ NҔ*`>Q-y:,KMף!Ue*{>rM 2rzOOa|\Blh$sYߔb q1g^LU(TPR Sx}>ș[H޹,{̅pG%=~tYS%JA*G@C @+:i CW=/7?aC,V^ CǴ+YyNIoNUnJ0ɾ0 5k1 |-]eHaἮAaFK< =ĊV?>Lz5 a4tiCѺsALN}{J`hgY{B\yӼK?,Mhf_RBوR\f;%*hUtD_@8O1-⍚/c1:Uۘ=:ꮓlC>q ׳*>=%vW+_c~6MK$^?#m,ec j%}s35+nrj AS[ѱ7Kthb(F1VZ[2 º\ZEF&8yS'jPD90Cca g[̱1ժBP6@Tvm)NȉNPo]CkkMSJEE{=c}(?MsA@o<7wzLq8r@\Xp5VɃp}]Z(Y.ŒERa7D,Jӿ]MG4DiSU.]pN).+S5˙[#Xfyʹ="o*9_ M (M0>Hw39=ԣVҜk}0b3)׍tIg6vV.dn>*W\ gC8 _62Moh p+eD!2`@ bɯI?:0Fh;pp?P ɉ mC`>o#r)w7{-ӌK[Zը̥hhP_\N t*V_J6vUr)< v^Ƞg:⪭+u!JmѨi;:NI XdةJؤ$(Ψ$4b9ѬkozjxkJ eSN^UkSg2-ZiZüm-] [ R7ɪ|Z5ʻ Gu[Tr9XG4V-lVk~0M"p˪Zhu-s"*Yۢ"/S{t\ aň7Kxz)4"kU ;Ι>Y;S_wR/;F*B忧Ͷf]*oEH=֍D~ި}1 .}&&9M{$!#Wꡧ۽Hq~pϻ6p3'=(78s_fe7+Z^GVrQ.䦺 $\a4]9F{d :.;CA9Oo\}xٿRЌ;b [݄U"SzO}dq[FJwsJ*&.Ps&&:LGeBCV04;ҋX.UМ:D2,j Q=ߪvϡQGRoE/SY.3ؽtE5qnT[sFա" f 9I8-6bLNu|Y}CNN*x~ &  [fߘ#vYJ{[]cx>$aE .Uu5w/{M8 _%锃L8_a2UGlw<PN*gHhM} t<>H-un-`xi Kr{p8QF;}loAKO놺ٹkQĎ"|e;SE~g⓹-N>\ {Hbl"8qz.'$u/W YX,#]YcKV̫,y>$NMtbmS]VKwBcꓔzد 6Q֎![?P os#5Sa.G.DzϿsHٴ ; Pi=q7! Plr~'&wo07n]qb#qQ /A'?Y7\]eǽE*B; DWZ0{B}Ķ-B?)>v( (7 euSaf>#X 2"?V- !2f2 9> F8cJ#;`_a(=۟U4[z5r G{ eЏDv[MߔE@+ nj˰&wB=}F~a wh{0~hr&UM̳ YC(C򞃍[i2nסa2{h%*bcM )ߙ,˞F.eK[̢x2> b=\ˇ9aB8ԩT0qˍtR8[ˌ@7!bLLC4~!J{q*!N\َSPU"W+?7]=Al+6I+u^"mho=2s~b8]65P>@ oz Za "dc7Ram&-y#, Fftga#c7g;(G 3 {A|ߚ/Nm]Rq4輸ػ?8#>VrF8$Pa њIQI4JB]-GQٍai4oqiH029Fxg`,z&"F{$E3BCC@3U 5o-qQ9$D;^<:okzuKg/0g0BE#pM~mf&fŸPJh^Q7=QG^е/N9zCZjҷ[Ѵ:UzoSJ4؂NMLCL"3?(wwnwܶen\rew+ r(`"@ 0 qlI*B*b}>xr(~H Bb5FXYh ޮХ׌8Nm*e<#ʠ)Q:Q$y eR2u&/\8㟪wT‡K"YT qS+%c6+ˢ+%2_VnCAcZ6SQ1'V˶6mtKKs P-%>|W21 xPBd@; 6R<-'/|"Bk`M^CTwM~Dڴ5G]h_Z>"SvFwqHNwIUzߑSHXZ$2k9t%nPw9sY֙.5 {j'خ誒K;sBZ bOL]MSz]l0J8Qnf;ag=42V g}_;f<eSI~OoY Nw}3y>tG~t7ą) &/\/KgabSR+FرZbSJ]czWøAk!)  B!^n-a˻˜h'[;#0(2kp:eo KUөTOxMIS-ny,?Rj<Ň=s}QK2i_C&CմdGi'$40Y)Rξulk L%jR,ewkErƞRvޏ̶!SlZ0/FHEh#a" |˰Y=Wg١qamhc1#֌ ` Y; `cH # Y3^<&&o+'+z-Hx/dxT$e:*]{^zq&\ TL;{ip`iӯL,jUpC`ea迭 !%u)2ʴ&'BLM` C6@ow3r4LOV;̼!LZ>tsCv ~9GP)O^0[smGL7SjU&ExGf>ji4se1NGęt+ \ʑPɗaHcƷT[#PNYF˹`.5壜ET*I-sZ?lv_;.!E;[j2< #9J{rw2$G+r㋞HGp{Vuaf%R/y[]A#A" R BE a,+K{hcya(Nr"SN3F…Nl$6Wk%U+3bq2DjƷӂv  ځ5 漺6rfǖ+T-<ܾҥ~ JV w~$V;Cxȕl7*+JbUG+p@\Sܟy=lQL nK{hUI|j͈O?d쁟9/%9 xnh;Ncy:vI>WPˉɾ$AleƐZa؛K{|^-S7鎻 /|O7QDžGSc:p3-7(0 ^ILN{A9D(B z#d7kB"cԏ[o'ԗo8%P{8T®C0[v3\is+NeoMor3) (u@guu:Y$9t.sFSP'>6'81/ \`|8!h>WO?Vo^U m|vNnFm`D/ͣ;m1\Ma.K? 1boy74. mЎtyo~yPUv>д}宸~7&{GyFmERI΍Ed>ZAsЛ}KXEl,JߝajY~}9WEy fIC}h-B*ZCASD 6HW}ڍH}4[Xm P'D[xrjZgƦ%FVC |d=@-&ZRLɱhҠ%R.3SE}f=A($|_Lk%"f8|Z&! +J@eۥƗX; ji3 G?l4֍w&> [22 j/,y7ƃ,/j!l#VFXby\UY/+~hq{ 1f=hY&Ő;矗/t|bRxB ~I:B>[5HTCX<Ɗwzs}2Ɗ//X^Yޘ;rߵC01^,89H/CJqWX1/=ȵ95p|dDr4% &2B6E~5݌ډpJ$ubQ䤲5a=_-CS qPѾnMH>j]*}Bֺg,ROnmjtd&TLiج[1Ɓ K ?R,Quuqa!ɯ7A="8M NxYKcjo;uz'T7tVBxY-Ͷ0"M 0"t\NVGW¹M&G^TVUX2ﲜFƭ+kb 묀eˆsz,g+ E3 `& BwF&JLg7t}9'a򤆰QDPǁ LM^H4!ሢ D9V/r)Ojy-T}8./?t%`Y CGC)aBF{Y0Û|f@VR?}ȓ?\>1@ 8> [^(=sX G~/oZHj6thƤwo}(05F_ٸnfIFb- z&o~,a: L Wx3 2 Ź/d2>c I1e "՞8Q͠6^o,~oҞ gFʠv<9Z8tG>Խ[ "a@x0}Xx0GKٔ>6YVlGwſG]Q|<@ga€\81YSJU}l6Qc=.jL)KL[T`2X`Ab2[XX碯d`2uTbųkC$-&Q,IF@/$e`)0xb6pG_{?/;y!K׻=#"#GL.Z%++B>?֬PYiBbO{8S󚘪S^4sf,m|R`ycgpR~xu%t<¿Al~LF`D Fhw"QOtĥO׈*0 jeli ɝČŞ?ٖ_ 'zv4g&;E棝@]+s+L@E+ϝ5 C> /sA̖TQ;sԮ'kI bbkjrӏCvڈq8b Py𑰴:ۗILd_ g֎]W#֌WS[҇fY^Fܝտ 7 `HiUCmtwRLdi(+1Y93=gj]>2 .\md{6UsE4/Ui/Vg0VXxLu\у0IX7: ?[ )~cz`ݖEjqR!W;bJϸvQDe7*R h<^HgLvIp ϦURU5 -cyLn~ے7 at&&#+,URg bʳB_g&v LB9LۆA#V7tjЯq6hochaUe{o/9y' n z*uF Vy۝;⦾!8U`CwZln%{Q'x~͙'FbFhяWZ<-T|?9TӰZxqV Y)8zi8J$t _b YG8B4f,ǥ|BC.?kq=V*7?AүH)ɭ^A6=ǡqomfXP_V/Fs{e,57䋒y_h{`!@ћ{Ƕk"\;m+[-Ur(N{+/-5jmnS6Xo D~wpʗ3)QY^*|enXཕA6F?0hHöF׸ (譼<})+%uꞗn|+{_ZVΰ#[JFYO6<l+ Ea1?Jj4Ò%KJ\nq걶7%Te)1أltn+OW lm(K{So/IKo$mEԺ<0kiJ39|j cO%'ԦRVojk1iWRɄ%f=KL#Hݫ2G7Μ)OHgv[%n.uֽ6rfn;$QICOw7O%EN{ڸ#RrIv?`[}K:߭$ќjg8TҖ!#v{ ͊Q\:qv{!y5 31ǩ]2-0qѩ (,@ae=xL%#8fV,e\:LIЏxzfh l9;Ά'̏17-: Ļr7͵d6k}0oL UΠV0}T*7}ޓ i, %}6~FAfm%;<ׇaWfV,0[r13*p .Kr2O50X9&(sJ]U.yxOY!Ϲ8%ĻVءrnE*'7=H RRawg8},S/.*Kl\A'>F}@ހc/o5.hB;OwC1vA;~FCM?ih|O2&A"J[1fV0YH5昴oaT]~쟼.-p3>m\vySꝟc "O5@Xarc+0FXP@#09S@~9:Jl]qqR^Qrt_'XXST^ľmZҵM'9y^&뮘>چW0a^a}DSF} /9 O{?;\B#DD ~63I| q{L ν[{i[3+O[4̝O 0SC`#hAr{s@slP?SGT҅7g&LO(2뛖ggpcG,s:0?33d̆pj^g:8̞ne3C;JC(G9HE#9i n8LYΰ.YBt@We}\ ׏[ u#OhgnPQ F2E M ݬ*9pM=͡%R=E}765I1xW_uj!TvAZݻczi[śREB7Z"9txM,&va^0infg~5 su'T>ZX]uz02'U })I朕|^7twcw^+}A8C@Y6t)>Z'kSiDu\fE:o.9ϫyagNAf\KNVs> s=7"0+P쀼ceVڠ]a5GՆN%إM2޼I)\Xٶ9&ng ۍ~0r1啄D:Pﭯ xa xbL(vRp޾ODc:11OTձ_FY<9ֱ˅?\YXd?e2P*? SɆ͸M+e.OOiK7ȇG~k3!P?} uD_I(@$iɀ.̵rl jL߅mgA;*sęgݯ EYh]-HVդ䕴B:.-y G͛fF=E[d\&#)@p&In4-g$7$&2on&myx7E{l.NLf#y@wrdFH|0(Y2b6cv6$>EyA:o=\j̡pɁFwXkΟ{ɵuW}ihQ~L= c[4)8+4 CDp-n]o!(:Eux#W*t=ו0vekW9۩@$C4@#oV"fpdH*ْh|P|>‹p0Dbg|@~A`CS,294el/ #9nu5^xjܚm҈iMfi}K)%8UpJ;ws6<džPhi65r%{;|KY}+Ki0%J=WPCQPϥ}+/0}&n(ö$sn9 B0յ.)!דgM]&GV#֖-%_m^CqWRŨi3aX(N4%v0s^b)v]RPCꙧ]',ܓJ2~U'$ws)M )N:}8[pU5% Mюעzkٟ2uֻeIw+ՠYB,;۫'Oi3ƴj<"ƨ bHDV"%reCD[FUUlZ ]S oy _0[hdicD lz"<oدg@ʮ[`kؚRI.%R/U~nC=اi'ZP+a2SIMsOwl\vȆ23!3N`p,q0ֿsgkTܫSY2] ?I?1L=u I,_(d};@?MlE~3.; .vR[96 `,DPC'HsgIṮ8"a1~K&-:+ASbt*$GԪPޖ^ŮBg6_f֋KcL|ysY m֛[p;y!!5xM[Mpw^$an5Ddh83.NOuy;XS>-owyW {Ll%&mWփsn퀼G!nQ߻SH|u^6^CXFF]S7lE0i*h-< aa7Ą,>xozISʥJM\õr|mG+ ȒAÝ1ufQ]|}NcGcb>Aw'UJݚzSc A_PNfK Az*x֨OVJxyS+%HdƬ6̡Zp{'j\S hhJɛ*g S"K" 5geB9 A L Ah,;^7ѕ/.O}Y[ᓴ\Y!BL2{_[ց[`5w_2<䩮WYz%컷_RL,8jURYad),sߴإVc.O}SHގZ}َTSqR-kί8alQa3*_ Ɉf`sWiPAe}UG%z-$Mk(8ӧa't%- TQO Zc&H, .`gy^[46o]=I{ˁ9-89ھ1ҳ2_ %Ͱϭu=-=6~=X)cԷBƐT7;uCB` gzb_,`q=GhL]qJ[4D5ҳoED 0%}= *n/2 UHGj)ljTmD b9 C]_?FgspV[tH&$'D@3_3 Xs}#kjPYDzD9_VʝS`mm*v4JoSn˳};PT(1H[p?)oj}}e [J6îN}xus//mobڱbl[LI5ؙt2]_aOT85_쩨ICvNn"P ^-i2o!uAd6\VŇ`, !VgD>Q=y-jl4Rُr%.|s .\ΟlYa=E@efq? af(ZL}qաR^b?P֗(# QjGVH)U~e*/Lrou˭Ј=+Yd0칰2C8ޫD83y_vWz(Jl. ! {1f7Ì"ԉci ,h+.grkDI_ۊ.ӵr>(}" ]*h!og+3o,@# Ϗc;)'GYb~=nw7OC$ҙ/:7uR(ACY){Bl}k#E9K#oIDhxRTRpmȑ 37qCRI|M{Wc2W΍iO,q&MNڝW[2w5n1=5^G| Ek'~B"7d},BjPOPB >voQ'յB؎2H-X !8VhȓI09PVwW5V++C>=O$|N'-q/t!VB~=L Ymt;PۼSku&}FGD8s.cGC W$ǫXN<6x^iMhwo^4nqAaqY"*2>7 g6Ky =!IYqz~ѩI-LA2Mܼ|} KշǔFX=s >$-/u'6̄ee2(L0X+Ogo !պD#\f 2LWbH.@IQZ]WXrE{ntnF#3//*2TXDeBe 6׎'Ʊߜ">b/,/P-VX%z4UUe{{e] ZE, iQB^+HWXS <-ꦊ}{]>NlĠ/b\!g!rC:qU2O7FOoJW{S` Kr})t$㜤/U GOQ=c6aW3FQkrV;x 4^4\Mۊ+,Xlxލ_zxM qec,k|W鋷.ZܭRB&]6'cldl瑰?u:u1O 6ߢxly!+bgfkU!r7Bּ}<"ux2mTʙ6 0&V+sFQf^ę=P53"0w@CLH<X4;] WKb_XK ;h*[s+a svos^sm-f- zo{ˢ4P^3% PN'H-N JxL$ʹ#FΪ6I5!# ,_fBffq "ڶqSz0D@#U0!3ttbwUUŪu1ـB:7wmgu3 3'02E# [bZ[Ij%෿ K6Dy wvG{+`.xpJ7! &kzl୒Īf)plbh"IŤw$d7묦xq}#4z?2an|h|x0ۦvEbc`oqFϺ]Z y зܐɚ\/G=eYëwpE6 K&rxl=h9OFKDah=RO6xE9j&&Bɥc&8=vp<]=(?"D"l,Cdc$|@fR5+ʓRyMRTCP\EBIn}BM74ŖLT%Bmiy޳KStǮG>[;l%ޱ$@|v>xP@=v7wLãUD1z%%ܖ"Caj)FK6D@Aș&c[&V*y%I16IobwS'[kБcEO>ȇvuj 8ù1~pGҝik˦R> OuEֲEyZ:l% TP0n[ilnۄ<6TgAV!J]6CێuڶZSDk+k4Zw@>5kF5<17f\*V߳ALVy&os^+&5͛cpY1_kD^EG-4ڔJ[[1LҼa-Щ8KO‘xͱ/ҖݽCBj*eYz<4X) d ڧS8_5V,d].7Vq25FeeLz}ӎT2xitDɾ%IRth£:J'I➢h%|[n#v{U{kNUhFmX/4eC ĖJ֍~S|ۂ'er"p Bh/2,![^A!eX% :@vV;,y3'jʋF}WĹJ}qf5qخz^-zdDJrlJ:ޅ}_L dIѢ*)0c]~C6]vw2,{#wzl{._ht"! 9sW_lϗ~@kzg,Gbw p;1]]Z"BiUv{|ȥ V-CY.3gkCxƛ %ˌ04Y2j ]ŰI'a̵#RaF[5;ӈo{"V'eOz7HubQahI>,2%.IS*pýJ0k~EsFa_}9F[a9AU\p\^gKlIoG'ٔ֫s$_[>d:3m W|7&G|̀yFQYn9VNa钬Sv`f>׻|E'4 YP\4o!ɿ ݪY:-Xq}oFӶ5AI/u=?= N q{U}HMNh Z{3nqilCOY"bs.1(_C 0J;IʍEָ7⒛S$@I>Qs%k7Xv2DJIP~G˼f"玛qt3p^._3(){݌JluAu˫F5 o>!.g'-<-PBηCwƹJ*^=K/>eAjk#^(m!EtfN(ɠЎ&nƫ:B]EB_*LT[; ObAMڑ,DKQj%z +;UcjեwŵRty٣/.b_|^uIS5lk_*~%q1U^'%пPMhA夏3L>G,ɔ;BK;^YKnp$1#6s)T*8RgAM*-y@rj&7$(8AȐҩ@KBHzI->^!2?Ex ׽Y¨COKt63 CPP"0""P=a1N@@-m\9ބ4A(5⦇v3%%"%4*+qST*})w[?0"=CYT(!c?Ұ)>#Q0L+ &`0@MCD$>vy3v CFNG^infGb/Lqȥbrxr Rw+B h+>ִPk*l\k1IRfs|U<DrG <51j L@@ 5h2TYb ?:zҥASM]T.i@M_'#([Dc$MfKT]}z.EM@у >B(G(F).&*wt[̔gbX:Ilo8թ .H8Ylp&mh NuKGJ9|QdSeq?4a* yp/,d"Vbp;t0? kj'vpيF,8Mq LIjqp\Th[7Pq b;y8Q%.▝gԉw|^\55o\6Fc! {}p& ?^Λ#E9GDs7̾WjP` u aJ=r**bU#Е#D[1QR.f[9 ( ԑ lO)͇ZjeRHl*DiޏbmTo94ǒBx:W" 7N g.$%sk}¸)=hLcWj 8=.I:_lY Q..Bl)ĆJ7d$Jk[[B*NֵӺV<>(\ oA1\(E{[c/9bvݣ黪M }S^+Vk3e<*&:Q#; пjfC0+N .v(0CDpl݋_>A -ju urH1 Bglv, V THj%{X,x' TgD7ܖ WmȬcI.<8B,Y͸π?/Y4 ޻ (}ِ݅q,T4/a?Ԫg(5ϭẔTA)7DixDs--FG̒bt9.?㩷?oP ͭ[mlbgJ=sX7IZR>ly|4ZMVpzj"W%Vòϕ~<=>stf,֙'wX`MIIuWUuYNw9X9V8I ew{UO>;\ep5G~H_ÛIHXh_`sU@7ۆ""zOEZ(/gQ p*Ƌf>q$4 r?X5!?WޤjHg_bəmx 389akhI=fɆnW~/rО=AL)Sܩ#)V_Cydq Hv9u %v fǔ~Aϛ]3Z&)\*QsQ<]VGVh5i2[YAװM 1ҕxQl= '7W.[:xmhͣ5yo.{ox$f FRk;ѱ)ۿ4xZ\o6J^c-nL~ˮ /~?p ^ɲ)dǤ%ﲲw0 dŒg2oN{־}-ߡU\_vm,,3g5׹CN;ܢr;ՙ\I$.]Z[$ x݁nbNZ^e^lUeLU{foAcނvތ4$vyW=eK}Q5.K,.E<@1Ӗ{>ہӲ_u[/z3湉dj![풊Q\g,较0m?i"fGɇ=? pߓ+%D*y( p\+ֶ)鐔W_(O|Bnk`+_F1px9/\cI%aJ[:pD55إ\Jzѿ1 RNI V abEiTЫY@"ܱnڭ^0'psH+2zXLvcXJӞ@2F02 P$>'QPьFrL,|i7]/%q6 w~GDҷď?]]baGcfPr~C>ifi.\#_IEDϙs/5Poq q:%_R7,u8trIJjK &>,rܭShyz_'}SCi+~-9pa3YVqCY_ry&&'ӫNs΄[YdybͶ5hx68/Fbb4P ''AZL/u `ؒ FWnľT~4ʤ5$*.bځ󥮸 7mt犞C}ND' DakށSGdV[|W*(+5,v k-l'aQZKMr`v`Ǿ69@u6˿%,.3~XZD^~Э@csTj,{IʑsN}y2~߷%{#[ޓoCHP}řu߽8{"ȋGx䀟Aʼn|jQx@Tq~:Od2?C RUC)@Q'AdqOҩybul$[iR*#~C>{A) ڃ| :@P2ճw z>ddƙ_2sKW X8?5(/–sA)L8;+2aj q"FJ'&DWyye'˕f$Wg{GX]*c]YP/9O0-0B_ b|; ndJdX`ǶD*nWX]dvZ2_; (ΑET9ⓗ>N y"|dNK ФInҋY q,)^|תmTƕ?W\? Q4?hܜ'̷4,T&uMA! . 8I, )Q>m$ ́@舺`z!hQVGO9uKɪ3FI/DR Z2f~AfZ,A6q.kv[܂qY!J(*qEbUgeqMM@˷Ck"?m_;f:u~mJT0UQBPN,Sf/5 =GCI@@X'E{?.X4IP7{A?g~VN~FY~# *|cY*ʳp^5m4z^fz=)R/ʑr|dmԓ ##fbCu!o{[FW<˧ڳ Vs4.჻g +ۺ|(܎qVEN>،'f@K%_UA1ZFFka<\d1wk~ AL/&\Ae`s();kXF>UF'uΞGRodYY 7.+0陝'Yf }C4uy]]W07shqnOdg*w51$T,/~cWd.TRA5L[FxbsC׻Tޓ3ٴ8_8E&rcCMWm,ζ8LJP},$h̬w8M?^ l_^z:ugS029vBLڹl7ɗepk›ca4gAJD1r~}%s>MP`qͫ|qe9 4 &%y^# S kYIlt%[~ vyr0 !48ԎnѻUşN4ƶFX)ũwjKbAZߝO W1R`RHxYJoMkJ5vW4Z|BCӚ4JC7߆F??U7גhاώS i0OrM4oWkmdY5j)7;zdkSXS҃fۢ2ʼm$".WYZ$ܮb$5@;qpd!!.zkT—Q(Q;+w4&M.[pqF7Ilfr8Q/z}co &|u M#7 w?_'{>qvZu:8t3:DN #nfMx>||DC$߿%/Ozؑ4R>ZU-؁nIJI|ĥ_8i:+տhݖڿhWG4#}T9=լμ7"ؚ<;Oj8(BPEe~OEv]=h*_lڷ)Q#k`س4Q}Es?W_S 8bi ڋ`;DL (! A ]H%ϯ.ɓrKV :'x2Yhi% m/d7C9I'$$tV4EUzS#WA{Zڮ;EqƉAtt|ï sͿS#;YRw9);ڍV%6!Jm=.UD~鏶:0bUZɹTMWZϋ5Z&鈷> 4):ZĨ/sb/pg8IDBR:Ji1g5uU'ɥ"6WHܰ 5/j\qb^ܴ7 IoR)f''t>NC%;h},5-'J[qPIAװ9&`pʂkzt?T%}鏌aFb,%W;3$k*4^^{UCɤ;z*V+19J,KMe>Dfjr)V[\sQCJr Qǩ6v`WLg.61,vTvy+YQxSNO?|f/$mE7qyTJٺ@pJbva@~Ϣ{/ d@a_?|낋P/bGq<; H0@@.'`зX)jooLh; L}Fϸ{Rtoj` (f_|Dh4py6 Xo'R!Ĭ |PHO\]L񄂝x^u z)P}@?oN8|*G"[oR/N1,ޏ)BL ;*0Y-1*m48ݨ 4V_mm$ihiyQ7>BhQC )R3$,JT+ˮJ0ȫgi?TOr}BL\냤!D\\ڣn1 qQ1TY4`7W|:BCcw,͙')Ƃ PɭQ9T||Y% thtI2~moIo,fxVǠ$IrYsrJƂ0vqQ*ʹ+Dn{vGo( O{#h~9F% *R@0 -Cd@#eajͨ+2ƙ- {mZwϭ@703 A/ۥ$Io+8 ?B˄L툎J`]v8{iNʔM2* )-Q=KM$Sfv߶Kǹneݻ^ҭFXWO( TOB2OyE+| 'a JJZ rNQcPZO-fF,llDSZ 3 = #SZ; BQEX8ڱm|҇11D#!X޺RNߩ޿&AfÒŻai;wAJPytt<=Sav =<*4]S)>?u'~|zbmqJ{U b ?ݔM5 i@$^u'.H/%zŬR:b[|Qn =זEg Ӻn"BT=Q>,.ǟNKz!v0ۙUu8nVܽP]niҏZ]u WG C bV jXkTSQP1nIW^1)tui좚 &s:x&CҢ U3=SN?&yvc=m3Zt=/גxhӫvȐ[V#g] i6؎SS}a3G "amdb͉&?IE6FbП=Q-oC`٣XJl=ԧy$G!ԟy0%p_8y_wi2t'aԼo'EǗ b+6%;ڑ8&caWkRǏb6@7ݧ%֔YX`rʩM'NZu}_&19"`3%!"kb“yX2oO*qܝtY;H&BtffqKllSU`ai^11D*^u33i"ejULLOvOƹ5'mn0l't.*SB["%ՅI[_LN䔸Y)ѧU17='ρx̳-ӘaܽGBׯy,o; E+vYIZ ^t#$/(w\j ÌM~9gt ;*7&<}cedQG!Mg`WNgrʥ6YQ-@WY6U\4]mELa (fፋ-J  (jkhI#1ϝ1RWLUOtN&+!]:m5$8e~ˎ-IS,jvW7l(2y,"^5=5g ,yQK ~_C&f_J.nᨧ߶w#CzY){}]{򶥔m/B e1o߮@O#5iNZ܁>4izqG *E!@#E]$"5]*R,:M_Ƈ,Fo15&.Z'_<tmcgC(~,.2|ĞG17-^ |7;t Vt@a鲓5k;2+fGw| _eIl=gc)'e=6?0tZ cGAej*/33n-b13Ki_j=؊$ ץQM\ zB5%(OP+&w.fWF{Q"1|snu38lfwu/.}{N`xԻuaSΘ9;'EGTdb[#鼂 .g%m-k̮SFd~2ehRΟ`~BsV z`%;,b8ڜ=AجAc_mD{{ZDeѴ|JW#|Z+;ߗHd^u =o9)mڗeW~1ϕRx@9 Fѳ漏z\7*3CF֡V=#(8n|HPH*TW ;t=U cFqY3.?-ڸ;X0iCiKuQk!Z\KZ`u嶮>5F}TQKyRD5DK5`Q:rNǪ_'y1ñ@PHv^M= (C37ΫXqfkr(Ic 5k3'Y[eF%jXqO_[JVBT^Moe,wK dxB)'>%ludx#m1%Z]Z]d2|\sU5@>y!`EbJ8 (4fwF5޼lM$м`#ODxY_}DtzzRm^ԶGy8~^s7(jYi3,Q7S{G43Uۙ@ ˑ947PqrCˌlȧe"FDɠaB #۩,"Glj1"5$IOH?EDB-'GQlTgZ 6^+ Fʿ  Wr=ydIo?ѕw<2mG#HF7dSAq7/RSEf@z&8 ,"<}}>J`Hït*F\kOb/vlu VĖhsFՃ(>_|*f왚kL̮PiDU ^uxD>%!b{ A#Q2UWB#U16z#GMCHcw:WȩWg~]7{<ܠ7Je:Boei;\Z])#\nKp6mLwȺiR:ʔu*$ 2YhPA }O_zG~OG?&C7#Vm"'Y ]?@䉄`@,4n=7]ߓ4K~`Fd I<-$N [Q7DoEm;"y}Dv 2G\%fY@hKN!8#~ݶlؒ%[$VX[59 s  ֋(0 C>y ,$,4z&oAPW\cUȞ$64 a54wpѽ^i+쟭)NKA}^ h#ymIjUF٨f{x^G뮕uvo嗅[ֱފ$S3ωa㳛Nv \%8e(}7+v~nm`^M"Boռ(h$E)Y(2O -1 ,'_'1?e8ޓ'@DH׍YiJPgIO:DVzis9skDpG*&dh;&Xzs]DcJ}r5r{;yarz}yEN/` Y265,hR6$)7 -r|U;eX]P8\4+n϶'}q'K({5tD aX5UDåM '#dW/J?<ΰU_@a=ASljO8'VNjL&']],blIbVM0۰N5]52kE?BOkB&0 H/ϊ `zOO]<-1.A6膩,XVNߧinO4qYO~I"JkI۲(DeMu85zMy[lnLƿv_:\xiF\w@Is{!k1.E4?Цۭc{B4hKZƜU3stv  ѳl Mɍj6s˃} 4[y Z&7V$fkĩ/aoZi}^L+*OO(.Mf 隝8&mIqƖ}x"wf֡:1[7߭f5TBdcL+T4")#֠RT-+ ځ l5| fvU9ڃ!ͻu,Ͷ3y}vz+J+tcaug㊱)/I$jD\'*qUcb÷&[dS)Z; T->wZs8|3*6͊Dj7%j /)_.F񡛺մ!ڋ&H)?uOݦLopDtmb)wfhj̣ scmMCJDhĢOی0}+ ]u6:ȖS@-vQ['ߖRwnt+ߡGKK5ZdkqBJʏn)WqoFԻ%F4 (b`]h ^D~ixb1VEiFɬۧq쫕# \Mc)C~#|ɗËs+YCq"b Ōp57VorJ`3u匠`#Pj },#'Cq#nGNX3 ʔ[X)MǍ_h.͌[3bE9J,HLїˠ%ZXU= v'TlUhFOWz-Y-y{e~|pۦ h`}C>YU`FnƇ1b :4mvwmP-qWz|Zc;.8a:fh^/Srf `A. s]J&e$Mw0ӭ 0k-QPСop=Nq۳8jg5OPypu-'jig7)f9;A_fXpaՆs>Wك2> Gmזp/jd8= 74ny4 xQ{>Q2@ ?=zw=uRknc i@S`G)mlɦ[F(%&c<Ki}j&:p~Fm.0ZGr2 ik#gdn4v @ȼ;HEPDG8r `{9tۉO4u> 8B72o@RXRCd@#V!ćVSYb$+exu֝7sa=A,80B I I(˶فvroVξjN/ZZ5Q&5iI ,tXǏ۶[[%EXc[, IPA(`@D $70`B\L˳7bW( 4 ˔o-H% jr,NXNhv2rW饷庾kf ƉEuJƙģֲ>weFd吪b7YY;cZc1-lJF5P˪4( ǿL9NڵU>5691_ ezAVfͺ}!yZTR]E݈AWrV!#'zyŚأjG iSK4ef2e8;Gq#r];kY*մjˆY`=QETb*&iF_*ַ_ hlWgiR>ݲ6C\Ԙ A8յp盿ZS&D+Wƌ3|V-4K3\grٽ;ѩp1j)|43S L*!7 OҚ_y9Q[E?}?јM2q 5RE HrpY?5)j֖^yk(q:DߥeQwGYp!(C{|m^,5[^zi۞V>TKqdR?t9Ʃ4\+ X7hg ?E*Q?Tf`޺v7(-y_b۟[ Cì)|lxܞP>IuKhIMz4GQ6JS+HVȓ%z<ŝ᭠ZBu=/f5.}&ve a|OĢ[v?tO5{h {^Є=Ya{إ [9#@)sT$ة>.!D6Xt~Rx^´?}.Y燌a,Ưply#,V"n/%K,{:p#T~nJo9.՚*UQ:mQzWg:(FF/XHթCKi_$kĖ>B \igHL}""2y13G*fB8'SwKwڲwSC+k{{|aXZcݎd=ZXv]y&LS͝3XyaSZ,A{ڍG !CwrTϑ-}~[ajVc/=bē9]: OԶl: Yڭ!Bm` $[Y;_,6_QɎb$l'#ۙ!V˯u~unT/hNŕ)HH*KGz䨜Ǹ|:;zi74δtڵ:KYG۬0=sNbg u}qNşia޷Dop!=dhW#*:~QwCWhy9"Bf59E fo+k%QF$x)u@"QꝺN6D<P|\\)#rҍ9I-Q4xO]NO0?hD~5뗲6WL\#vr#2P~7I 1%3 6wGu yQ1ýlZ|e*1veYBqY^W$m!C"1C;IW2W-Yqm5̌$75v=Ϳbʛz%1i\gY?inAa)͋"mEl xM v$u~ݟ7dcgtlkڽ\ ,_N g-b>WaX6rh$A &[0ľCdյf!<7=#:6ͻ0%Lk5ηO=Ʀxo{~MMr $5#Qhؼ+B j6p!}.B5@:BfWboOAOfv7Y(aD_1f)d:&ܜF4V`{^E租 Vė؂k,3ڻ'B`whZp(U(""E1wd,&;B#awKnfW yOkpk3hL~h `fS_SvE=z"$f_UJ |H zoh~H=" @0}*n2E8zcbHv\3f"݈׼سD ~6ƭϝgdCVvm䞌FFCwѣ!HGFEM@QmКCPCSHzLzd.[$Am.(=0!'Zׅji< 5J[CmO ّ][i`ϙfKOz cc8 `@ P"j/*@d?{\frtəg5q+6 ?N!^^}>( %74gquR/kV.0Y58m!Q+.DxsbSj8sj9ot-LB\!Q\@5SUJsǰH3䛫 L;Ih4\R,G:O*uNygDEj2>1N&eɻ3)OjJ븬g4\s6_7amD癗m>W;WY577;Ŝ,M+6,eNsYܣ:y2.G\,0WG^m~tIgj/(!ՎLVU;|8g]rJtGD]kkrwyD!]e_ɈU#OV=)Hn~*䆫բkv;G{O,Ct@#V!=c0bl*fJ)lzݹW՛L~CJCjY$K ?6\-ۭ wSngVvʚ]R6tL% ȕT%}!%H{{]ۮl[diMtYYlaY!@Ҩ!rB@>؀q?Æ)w-i efPV1A,(QzJcK)FSVʻ'',QbY'0bsd9) g5\8i9H,r)^'1XTqzJ2RiWBU.^*r'5ZkǷl C}z'}!C[b'G-0DS!u^8<6֙ Kg eELM.XȄz躛V.BO?,Oq[*mXokhqUY!jE{7>/iYelqeYƸcY,fdjHMeҎ1Ͷy[fy)펷GbQU&:1(UUSZ&jWur!O0$0':oz<- ږi>>eTVK>C qK8 nXɶ1OuޙV@#{ +xaN=D!ݶ&!D{_0)٩>,Rj5YSf=A-GLpJ"Og*uWJn[[X'"+M":dQ~OY\Ƀf_.9f-c`nw)˶rMQ-lmp>_7>N[6lDaS=$ui˚צBw'Ik538|KM/a{<}Uvug6Mimb7s:E/7+Y~{1KoLl6 dOV57/g;5V_'88:n-9SZbvm)LB梪ȎHhY%`ȦF{Yi^ݟ1Ob>]jjڏnXqbL&W[>T0(zgQU-:ma 84`Oӓ% 5AiXi`Ԗ[8U]fHQbfnHF@2& ̅raWJ—68kYcV-8T ъM& E~_䱀EaH`+(} P {-N1Gj}/8b6'78CqPHX0—s!Kc7+ o6m=OYxe\/)&ж%Ca\1 FO+'i(1(I)LKOc$:`ynкj="BXG#V3[ 1<0++=l<\\|r tO&mk2fGOE֒ (ϊU(黉 i21syoÜQG*oD&hf[οylYen77/ dR5őe(=b2~/a]n )ɕlBScĬT Q9;{T_K-hhD>\9*4i4v ~#sڙKc!RXFXem51 UoݟӞo5njZȼ9^FL8k4)كE/VPQˋ_n33\geʽXM!C.rĶTٕ/9Y ,Z9ҳagK”XPs-;9ZΩ`V*Tdg.Qި+iP52ԪU:Z sRO%H2Wʆa[=DB ΔUEl6Nz%(>N)z׊zCV1qEGEqgPEwt0)X_مk/J!%9.6_P-a/Zߍi7FJ/zΌDtb=.{G Po`cL]dHhi3U#L)#"kS`U!dcq4EQ{uE!4J$"|)NDB?zj~$7CT ѹNnh!,'D|2ZIk \=N#mm~D&r_obC^^-nVї[ksfhU);<+{﬋?tj?im`^'R *mm|ڕz( (3~087ТJ՗i,2FjUc넲n{0} >bI׻]h߲% ܃4kŸcx$UEF>[Zz"|3:UdDNOfPRmiQB3zP= @,h=z(oG ؗ?{_zѵ뎪_B<7wQ43OdPB{叨^ID;0&1%bQ$UHF7hf;@YL[ߺ:eDF?5؍Yw-{SIŮ#Ly}T.TGLخ :C@<rǩiû@7j1c[߫1H)V~SMV9Ȭ\FC)ua?7hd8ӑ%ա9>0u0c|r}csa~?H6nt[Ѕp% RÁʟ =CH`B|8 !![Rx DaweҚ>L9y { Ȗ{GRt }-B\1h\`ءDoHP `Kjrlr6`us K\*`MR:K..ۑXvR;_*Ꮗ_h[$8 %@z =F=$WܘPX(?'.vfC hFV_9;:l-^!UNXO@C Pj 6Э,OS7--e翕EFdc@:* L@zC*ՊT\_ګ1 hI5r-")@ O[۠WJ:{{ag%a=1K1Yi Kig\;>ɿ^LZ$Q֥f57HP*5BGwMd1{ !s @{%q6D,5tT^\$G47J5!4@#U0!3]v!EV] R\+nxuRoU_)`OX`dF NIIh+!o`M[WjξW?olFvؽ&G@QAу6 ;,x 4#Pvolݲ2I-kȮZ Yd33Px G@x <gA CPSqdIWF-58Ջ_Ns@?׶U X̅UZvSWu˫{2Ab$K񤵄[#i:6FBw80%zmMY[B > = Űx,Dш<#*pd[npݺ[*I V5ؖeb6?h m&­BjWݞo}~vz ۽ 'vj Hޜ"u1;77k6ipiuIdYt"T[Fk޶Z#qյWV:aM-OF|x 8ΕMMN۞͊.;)^~&Plh\mCd3P 6BmR*.}^-,s+YXQ].ʓ"hٍWiTG{ݖ*b i򴋣IsVN3E:!b.yGq4a5]OϽe|h[z|qVHD(q&+-{k0`g `v5X 4F2B>3DhГ- ڢsrgJT;?5_#3De]nӢt+!T{ Y_1b\# JW1JЋ6sf-/N`-cv7Sa]|ӦZm)+:ÍxHUgSf |Q f5D ml 0Ej#; >ONEB0gc{ ^]:x4Z7٩0뎻fl-qԀn! Qle5t.v"m"̐_cW#E/B2]6)D飯J5G."1ȴI¿oKQ]jVwp$sxl(oo0=([ft,۠;sfQLҔ6(Y}D~>4aķ "bG'TsMjkDrfXGOĩ$˙C,\wE!O,9rI|36!W!9t|$Zgm={ڈJgvGd)_-U|!tOUWz|Sֵzn [ܿ/-MYM|Ec0gbݬnm*z1MתkS8ai;-$(8㰢 SA&8.v# ṙrho ƒ&*:~`C8И;<7 g`}QCp {0p~S I1q$9~`{SW*{G9flR@?/DfvUMѭJ70UE|/_7VuBewOus=@>b5JnUR|'HNzkc"pG.n;80]^f޼|q擏 ~7/׿c؟Wȧy!@o_Ǽ)2KtO^ݗR;cD؍+Ac'r~>D5&3 ی6|~rapC6XC%r/i8 Eg٭kw(ݽ6.ɬ@_wT kx[3jUtWR P&UtGR@QNgyOӼ*c!YݰSCwCllFJΥdf`n;o/;_AU.0JiAl' D|ThN|}O2y'>6W#勐&AH͞ܝ#.=9u|䀷4&7{%| Y?"Wt/15"R|&hRX0S)@m&w?0R' CA-]dbZaF0< |[G қ# ZVEf\:rgK1kwF|c2.~ՠ*2r> S6n%?Ti!gQL4AZM:Y0S|hprҤ)vOv,%P@p0}ZV0|`mA&OX`dS Z짲~;jɀک`*_43i -_̫l.jj겿8z2NJ˕quR%+]J"FK``BW‰S$W皤J${W++%zvGB/=x/c@ pSW䛩R9iLrTE ǃ 6 A v/ J1jL'_hev7K9]Үs E'NTuZא(d(u8fڐ c ;N:prh* HO1*NpmI:@IqP>1nf! *D@#oV!'t Uw7XW6vmsҽ_g 3֓Dlk*%$ &/rR '=;+9+OV1-#+0hL9f vI89bgδvgPh+I`:U20B25Ւ9>U),ֱFchxe-"QG17'Dt4#mǯM5 /x/:s#?߫„]vRJ.E㤓5mJ"[<ƥU-6J.7`1;k"s\B')#tT gԚ-QSsU[)o%kCcX/j0Jڝ|7'zpO>`l}nz/|#V܈1wJi+[o[Sf4sxђϙ7 ^[ q/ޔA^I72Y8tֽECFKoY MSwlg u*iejd\WGfE• YW=l!ߙqE16_bt2eFӭ)|0Ux7>?j£^G]IN$2ϿБ4J% c}{t jDGE]] ?ULhzI٧}(i.ĈÕQIԀ#Zὀf%溇HF46:s$8a<`VWdU^#ko纄:ۚA-N`U1d^z:z|>O`~|KrحӷPF]b2 gbmX߇,fX×\ik`,Alk;EOw4.|H1<#ǜ.d3W*7|Hr"֐R`VDs5`7,A.;@_9▩kaӆxJxN6N1em]C\(Ӄ9%7'W+c]\KKI,ɪQy^f='4F?Cƥ{-Pbw ׼AuICtw|hX`^1[LY=$"h9mX2YTjfls;^}/> 39|P."Zv0 _ͬrZ H_Z|9Y QB[͵y` t; id@{%C/9*MGLL퍣(`1l7O}jX!f!i;ȓ?U֐MK\!yV\jTl@o`t5z?Up'z#ɣw ڥ_M"WU|Қ_9MJ~KP&YCp<{,'1=|DQI.3{8~Y֮<_fX;I%gRrDыX?s)E^;jcp$'rH)/_^=$ ;NR`{3r&ORyA=kP쀐sCDN5f{>AxӨ޶-^ְAbLZ*Dy5Ӫot4l51;VK]}F劤JqmWee>JSrk>#ydDh!p.PuQI(cH-1_$ qmizO]Q猣e%Q)ۈyqR^e*S(?%x{( e~r= #|'W^$%rbge+:Re;T ,٠jZƋlόTod_Ҷʖ u[kr-mz吹ceA;!}(1ތ Q6Upu]ԩ'FC`x;)iǩ?ߊ\pd Tr*VG"NEN|Kk'+!=ɀ}+X8ts'P7Qڪ6=j=+B}։qBrbRwTцI0G$ +5EۯzT0۾bM(zoQvElyW޴`Et wr,"˵WXgZqErf-J.ᇓ"b?{{(6hW|V/ϴ򒴢2Iſ^TΠm LXL3f07y '^]˶+A -XD~”`õR|w7 >mm+O Y=ʫ1}@ t" R١r[>-FD ^I.*k$M{.M"( -/>&\v )Q8$8:/" DފL%%,$W,)#  y8'%e:q CT5;F݉.D6k53 /2?,kRMiZx.0۰.eKrE @~6\e-V6+ WNjx\nΊi݂y+ƉqT&2E}1 {PE2l`(%ϟP+ޮ|鑸GKV&PήOg99ԜlbמAٱ5f˷cnCY%.53$2 꿪x痝LgL1TO"ሩ 3pn98w"l?'Y9i핦n5/=.YՅ7NO ޟEC@Cd@#V!^M12fŪ)<:e޳ZwM`XFd EH%-L .i[Mv]n2Gݟ1Qv~HewkNېL/tThm)O! 4#Xp.;3h&[nQH@>cbbh"?o^΃Y#kl)]Ee:B zos k5QΚ-57)[̪n9LtHdaI,t?NT8xinޟV̐[FP^#%fvzT*G~3׆X#OzuE%0u{/Et6,'o]J.sSմelQ,:qf7L*jY;sgt.׎oRKF2뿤XF'EЁN]t2,KvuG- ko3Mf9ݢW{kTbtjɅtanVlu摽qXUkZx Z S̼+M~Vi45Q"+X{}¼3x _3$NsI]Ma~E}aJVmaes/^z2~~*kGeOnG'&"Bd}Vj_9oű'CV,Q ZC$0#9PiouqV{^`:su8xk6[eVI -sRzJ4lEDjU~q6Km̧iyCpbOD ]aR[,]l0Mړ]b)-u2\?|9:U>ļ܇k-b'S[1zklyT;':ۤVgbQwhfA6T Y+` s]CV&}"*{{xH3}n1i"pco$"6J=pk~!Yr"#g!+9S7f8xs~&5lFx⪲"np{`s?K(َ&;71 ڏ+9OVEf(ܽxML{޵vtonIa{ s`)y=HA"0)JD)G'Ѽz<^|]|oK9VC"~ }dzljeX0m+9$x"cd:X'qɗK2;6{ws:ĝYN{{'u?&ɹӫ찺5-ЄT' SLZ ov'?{}>"J cmɧ*ՁhImhKj%Ҽ/^S*uMҪon\':ٚ]ҩ[ӜlAnvDk]ڃ4 ٕ:D-S[Ԛ>e6e=>זFn򜜩g0BhڍDO{U=2tY sh.2iV*vA¯`Ig#/{~k<-CZTۄӡ7v^YKqBPT,bgd7d2>m*bK84f.= g5g5Vc{LB]L-LpeB0,L:V&VMpD5X?n13T R7.þ6BLjMgV\جidi{yMء}&a z+sqJZc J!itF2(cdQ [! t޺ܾq:}tjFC]mWBD@ISD'n9M S@FD/{}!K0o1EBNDҰC (M%m$aO2l\~~u!k3}w:-5Ak謗ǯW9YYmAbds55?K5Rʮ$lG{h[yﹿ+-(AxufsyA,xW1+=Ǒ`+G3U>^Wjօ{%?/f(0G XcapaNIۯS_R/or'=blӌM/O S8ct)aK JF]ʣZ^tOT11֧;۠KڕFr9B pKavOŧLi?>|z`)v t93#PCG&{]gy+] -A)i5<911+ vi!2M4z4Y6E2zA(mc)7Oybq``h(@Ct@#V!=c⧫)oFƃ:*)ed։Vݮ{&Sg #3wF,%ROFIJ$ˎk+w7;;s]׶Tr/{VE/̤߫G:1"zд;})]ak{Ʉ1{y e`׽wc8G /+N;1s(f\V4`7 ٛQ}7"ߡJ\%2J=&xЩaZju&- Z8QSM9$T\ղg#9k9qG>աԹ!N/癔 Y!b3@퉯F5Z ,6ޛp>$(=ꘪ9Jc֮'qɨu-󊥊4p'T7¨Uޝ3{q{rr-,z>G6W$wrf{"27 +B95U KG^1YUUIl|`f74i|ړkΣvI޵tZ}ƌ]Ō˦b*MƇ ̲1TbnY)ٚ5j&&o+jq(I]pi}ХazLɧӺk(+SܻL#xӵ]O< #PT(#)%I? Қ2Ni"v2Bnev"$K>NIM0>*YG okT:;6HSo>s"1.FnvQkMvJLohzQ[F}⨢Vϗrí|wEq5GJXr7oAg#/r`}vcUt-}mJ+C\apZ-lQtգ5ƿhiFimWONd`3{x].+W5ג߆ؐHvߧݞ:Wad921g"o5sfl|Hӷq5ZE,mJ|;P|nↂu"W(3KVF)Ja)^`v -3+8\T9% 7G'*zq~U T z:aGT uTIfvv =U ۂ> Pv'dos,\›]^,{cu6Y ë4kT56Ƹ&ׂ T'5"nDFTiǫDANyބ׺˦X~U+9- \D Uيy;เeksv,c+.)# !Xfryvb5&+'aqdtuEn"+ y@-mho1gR^p5Fec30c0gnH`%B͎ؿ,[K"\;zKWR\ Ѥ"MwwB8to #afܡ~`5t"t+:|$G~gz?'\l~ODs-ox;~jǞguGmgH` Z[S~ XM)'<|k5v#M#4W:sͨr~ǁ@1Z9؟H볹IkF{]` *jիݝ`7߸wNߺc|hs>;>TH >{\Y\ø_|*&fLpcx|4%9Zbo?bfe7ys&;*z-CrK}7&2+kֺV9dK*3J䈗 `?`?`|@3d@#nED;KVD߄$ `*In IObY׌ 1@%`2e[J<,-y6D¨ls~url˰;]EV26=USL4(N0BK2 @D h {v[6[VMZ4bk*͓ROjuASC?P5z( 2;$57CUG˟5Uh+4ʴֵ-iCku`gҳD8I=`GY]k +&6FBx' 57sZsNI\f3Su:cw|6YnO 'GR)6fl֩0U(t~xb! 䄂#X܌3^kP[TB&tKt߿x4mTlS_[lI^p<9ujpu,Y=u1p4d `gĭ`|U04L&Zw6:if匈v{}gj 4EcϪQv*μr[8LUt`U 0j9|(mҝϜ>:pC=kjPaQVjz鹪GHcRE`{a7/B຿@Y~' u:ܰDŽ|n铩z;c{-MߜiC뙲;61TOnf2BD>k# >h5pfE qVjCN!a|C9xzC]:C]պ09VpK۱=\k(#fS! ŝ+o!ʑnmZ8('x" ψ5y[B #עrc dOZ}IJ}Yu'czvXn}m'x=:}gKd:6bO>QĔEߡ3a?Y?87ڢSGn_L^rTySPj9"^p OcYȆURl0V<7qɾIsD;QbYP[Ej0my]}65[#Kvr b7Pv/9iR]<lS+n cNfy#C( iџaNWͷ vP>ۭXNMWBǭHZ!-W->h\?cFs,FYv1Zpl(!3>ιzO1 FcB?~A^uL'i]V'"gAA1Cs;I 21?b1^9Tc8LpXCYϏ ~1F.N#1[WpZvBmv`ܼA' ؞l*w9KxCDW/SEi9SBfI)ue=-E.RS*9.uWᡸuzs[1O` v[G-DziP%bs~OoXx]c*qzɗghGc+ǗrNsC'!y9>1;݉9l2$KXI.7jw x<9 9HY`b&nUx w9`# ^p/'n͙D[LRBVHMŘAhw5VɊI2oJN|r:;h~p* 6QU/Ί*1X1&9rJF;@C:~ p[0B 8ːf!) )EJ-0cGo<s[ Ďh"@e^aY$0=Љr>Vw8wFS`H1YAS VyFQ+tqut\N6Kye[%]K]ѱ)7 \T+tٚI)^Jj<_m<Ͻ+|,uU?hsW+P%=rK]qE)]KUjT0'Iv\$0VO1hr˔=Kk}l kKkoS'r;?LDZw>1}+~vBj]k|9(Qw.nwDYd YbE9zj9nb;5X; ePi9)8/phjt E6O6ڴY4Z 8J6m# <;-E/4dtV`+SКm^xgҶ3bCd@#V!䆫jdfDY 2pvZ"r&M3*v}D%vzjviW^tLtT1JٖIo,Q,@?~vf&,m/mVQdi B"A!@A )>qSLHRP0'*ja !J#2TC(-ݶT0Д[92&s"3Zz^2VH̟o`)r֗4N!SlcQ #-{% 2YlM۷II4 KQWNɯRg$m;%n50'Dh1KZX]13&ḁDg6ʀiJK~d(oȌ*hOѾĤ\ ,hnZFmذ_Wf3!EnBŝC` to\tBrN ' ڬhlsH!8lԵ1+"Z;Dǧ:@h4tмhb?%:9, Mqf$K2"]´i⬃j+$53TtF›kome<ăM<ȷC4D5. e*pzM)\9'8hEkpLiAd/(.N+x [.݋敧; is+jUebƍYQh> XC":ݍPb.Va{ 3m=E:Uw\KS,+_Gܰ.c4`3L#*33 abl#-sv k"Tud[iwUHU*̉>yCh9F84JaHoȑM*5Grm z)crfONF&k{`R9 G]l)ONf+hcW5,a0Dv| ˞KyʺDAP\O˜BtA̗zǫxńڽR$qg?¿[{cQMn\GDbHs4X[zQWaʲ-ܴ`~xݦq:ŋ$U ݰ!zi(_ {;mRRkY5涱ւ{2kOy"uWu|+浧_.Z/5:KE"Q^nnhBH)ȳ]OTN[xc.`ur M4<[ #N[$±}CMB6S 4KrD9qH9%fpF;xn4`g2D9/Kt8bZMN4YkƀiLfke  0?j@`M 'EAO;߀VZ$#1jZ V 1kLB1(e8^ZEo\]aVNIר%.hX%ULdrSH&nm.Kzf.q"Ũ+Ə\&|0Ѩ!C8nyj<|SNO۫Ψ E>n!/-KA?irxu8b M*: cߕp?kO*i\QVWM-?񮶟>bzNgࢢZ\8(^i{ [MdJ~,(Q0f+n/sGh&^u˱LLr`6 ڒXVY3B~Nǭ@00%$JK'J1MB't 2tZ[yʕSAkbP;3Ic$:Ŀ*)Sf*Yw 1$`TTfo Mf,ڌ<SU̼ҍwC7 oDzL"h5w jmm 3R ̪ucC+?Uz=@K9w_Ôr}p{S_s x8qX X0\Bۄq6 gfgp)yuu2NbM<`)rY{iՂi#YT=Buj :4vRyrvWytF`0SgH`lՀB:HtKVu-N a`j|#JLO;N3n·{EkTQ:O0$=5 Q~҄˄HH 'rPks 0ѸyԹ,t[LK'{h4"^<ѳ48oq?z)2^MyPBuA;,:MM VVOł9/V#O(KW/)T97Ō5ve6ġxH\@e*#91u~ ݌-Z|.ӺtW|z״2=~y`sv\V(zP8o(P砛yԛIX`F=_O^*z zɼ6lײς*R ¦~׆fǿyYYz}YG,n AͳR EޯUaFs%71zaSD4IHC ثiS;I8 !ps-5OO2zW{'rfvg[znu'ڙ3}j.l+]ў%n\?v]JuEƐt='mѕ@ADy!EEaث "(R:6%?υR~ҍEػ7Xak0A2p?|B>5<72aG!!nGzyP "DR:)cal@_Fx%:^'.:7O"Uߗ !mc:: DN>$RR^bǥ?߇n3}L ڀ5Y`I'df_|x ވ5o+a~;&J!! B8LQ9(ӯuJF5 c1paAGscH:+Oʒ=QlP aG7e%je5 Ǧ0^( ވ>piZS4ơ]c#"4n(B.8r?]pVď{.Gr\Ӛ-ӦQhaeڻGLGih/No6D;ZP!&ǮC5rNW=C0Mq4bte)g<V2ʶbV9Q&nnnnfnRYfԒ)!!'OK@<TT\ޮ`=buVfc:!5SqMM)r1X:(g֣,QPXs_':îml3 ցԖWc" 2CrZ8rwW;حJ`͵cR hfDZδg$sbmZ` ,K;V۩ TOv`ݽL7HM5z$db@ 'g&>"o_{)Ix\zR Y/ P3\n,Q5(+2Gmt,Dhʪl?h޾+$7smW@ʨċ*d_U( <] Xd^Y5v&Zn[AR;Il:C2ȖD_^ڷ}@fOVy[ͮqta]ӒY9՚{U#X]Sk+?Y;ҷ*y~|f/YJEӭR#U(fU6VMty(i;t3GW[I~r蟻f\~ ^jpVw1w$Z]s^$f9b( (?2:ڈczdZp6k~<Л #?[p%;cن=ڛ4Eo{4AG UlZcՔr/̻?k|'PB}h S\*rG9` "_\L _)-{jAwc8.*s3:t"+'^`ЉZ\ 0I]b8CN40f}OlnyIƐ1p}3?6Q*ffwm͋}oSDGܤ4>]ywِ}ziX4WSj! <߇;`*u`-򷚟:ރ*72,q` ""nOfԣk3"ޥt4RpFi*+{ln-W"?=A`!r gtk1|&]kYO?Gux$|*ؼ-.m~xYl\Z.INV(?kRiѵp_S ұNW!ŧdKHR|:3T(>%A?2l軜2ꪜeh^#kf#*fn{D >A;Ҥrycgjˡ[eQB> ѨYKf%1^ _7謣z 1#xzc=MQUs3V{gSprikr]o#Jz_?P#SPzhzKzdVeS?_^sene%}+O8KC'YۆE`Jw^6tQqaUF8_~ />GLZG ו;҇ Hs|ybɸe}Kgۓ _<4m`fxPM/O:ݐP_^AMeӏwbgоc{WA:M>]Pg_K8J3$ze,i7QxR蠛PZs1J8'\9.G;9EC\$^YP[@n`%li>u٨&Q?2 dohuO>v}ԌxݘP;YO0dA,P]]mCtk3R ?eoAH0܍Dm6j.%t75qzhTa묤*^h;|c_D-UM=xC$TTcW4 9q@稬:B-(|)jP( #k#=эN'X.,~j_KlGL.mo VX/v=Q`J*u&2)æ(-a=A%}D7GT'Vl+O|qkx:}sao0V3"u=VsJYqk52ҝwQ}+@ʾG*XWb?k*ŴW(k\4/,Z$%\pXOV0bXPl BB'ݍ%h 'VC PEaH0OVpDjAq_m`tl#pPy[7w8?Pb;V"p w?U}]l6-D }H!VeA'B !aՎ`}E4d&a,oͥϷC(Gq.F8eEhc`#'FēJ-ΣjRe $I8<b`vFղj,Viqnh/VRˎ`=AŞߏp3,4*ѩa7ϑOҥɻ*-XYTSEF$<X>TFG.<qwmt7 BDlU,(r4fb#X-Bf!WLU*Iȴ̧\5V^v#LpҧӇ`1-gyAH,vTl}Tc%x}=)-hȯ> (%A#ijAZM5}Ef*s`}-U|F'2W]jv龯o j`fePxV$4iYUSNxcdYb(&fܭ[*dn.&ETlk{!pаfTZw|œ ;:GIj VG y8ۃKWUu" k(h`yɒ K*63n a`.z2L) k{K&sh>/ϹB-ҊA'^E Wq N3}~Cq] n$ M55E܂nGu*(RAu7Y48bW'a >P751cM;tD߰:  *|Ȱ/Ie4M TwdF԰{ !^Ƌ{bF,ЊLlq,ͩ[ vE?π*K' ͔dV"+M1kаeFj?_͞VbWQ!/{'SFCDo I%: 8吜ѹxASR j,(PҦ3G*lM^@diU7sGKalΖ&KwC]pJM5j4dɩQK\JoP2bSSԣo̜Jj#TQ$M:zZz5\5,]n~f_7H`=?.Ov$N*'8wuN^2(úX!^$8[_^|)rIt1)5(w"Q?|:蚕\"Pâ)+VŗXrf6u}eue ^zy/%它+V fRgc\%Dh>=0ȧjAm+6'AF.?(rNvZo[uZ9Aװ9ߞ_&w ٲ=Og}?%ق3?b SPxmH oc=B~&f(iXqrbTs[3Qϑ.y_%7!9%O#.nu]̟o_WR?iQvk8ڮ+c1O>X"L67XwfWwh6gm~Ʃ%ޮ|;큶@i|aqt_CiGZbx Z;{AI>eyq~jP`~e(M/'ibZXC^6 HOGiC6ˌ'uybG9 h@)UW`J<*W {5#Ixq5?P|NC~qQ2=Oq78IK+1TO)g:}X?/cPGEϘVE#bBp},-Ǭ~jc_EB2_ {Zn23޾^O#S)cQj-3_eZ6ɇV͓$o"/b W۟Փ4yilXCPH rlsJ?^((%XEC 3o1,722!%CGE}L6y76_;0TYG] Mr0=SHx!nؚLuH~b(0?t}H"-B0vyGXxq4H.!]2}=wiL0ht|̼33~#6~OLsiz-{{wLrf]f(:OpyGs_:a̋[/>7Wg ̴R>-ryV/0̋W0AXLtPNM%Mof,C,~]b%rAgw3&|b|Ao?q}L$j(UբGa܀ P -{Wp"-d jX@+HC-R@D:# #[ :c5|}=(S:GP!0"B~M_悼zstatv/pˏQjE:2iSwK'ұnG&P:pwQ(t;7k lLB՘/5M,d (!4MA}e5C̭\*%G@K1Y r y%S tCbcL[Y5B_^>-)M (]tcNHF‹(ϡ7~:`[9"m^4:!JUy9Ql$XLE*CL^szEѮKq+A<µ{#׋‹±`o:rdB&WAj@2@6~3SQ3nl&f?3w/c sTd8  __8 MgZ!GeNgf] /I()ޭ ˲G{ }Iڵ^mQx! )81+[]0@p+6W(ewHSjȍM9jƇ~~oP|wz[+Zd[*nqh}IC_Eҁ`8 % €1+ `O.Ѻ^$R H,"?D6i CI:^FX,vޤ/ڲKc Q Pko|5k/z,mp_ Em: $&w,d {_YMPƕa @C@#oeܐ N[M,#ɡ&Yd0o^uֽԭ@073 ш@d%-L ےBٲ]LvUݯ!6P(LGNKədz-] 8 aOmiӻ.3RDGpoeň綃mY2!e0jPP}PTœ"/00 CNYh֓T7~Y5ul-F6QYqQ[b9:,lSR7UER|_CoVVE5>KZ|]z){*XS 5IZ@H^ $:A 1:yYY9q/VoDE sn,e&k_cc35P) YWJQlhDOiS4%[AMsJeI's&5:ҭmCOQ@4.rZYU$Xmį\(\o R[udP*kà(@+ \5X6tfcِ\E+V/*a:,Vߪk"yDy ےfU 6Jx -H͢"{(•m5ʙX?PftIw9t]v,z 3{5)R^bR s(4U.8Wm]8M(b[|/qC&TiNIuݒ0᣶\ FvmҢVޫSUR .NO"$j 5_jjڒ2ī•t/ܛs9]/L \F%}go@:s-[g&z*e/71jEw &V]c|XB*)yn^b^˛]7;Gbl] ͳXq3澸&kإ띌*oREʯI`ڝ%|P%Qv_!>…̚E"ҡڴJЋ;':L8g5H%:qNѡS3ibñJZ ;+:RH9ܑlKzM,p.@1?h D4HH|E_b"J*/$'eF垯_7 IJù)gpŏ~0eoNM?ͯCQqT~N3d'ے8;rOh#O&&q4_wF Vy9ɛ{3n)+,B98U $鿙,ƦmlR(E`Gd4SIFQ%?F"kϬy>3ߦʦ՝lăqAQO]f<6*:7ڌE)%.-3,`mh ҇.z*XUokX-dMXMXE\FGVKf"UrENmJGޖAfOvsDGm7H 'cxen}"nbmٖR8}DMgjg=K!WvafWۻ:]rh͂!e سZ[QCBi/An#t 52|Fq/::^O;͚SfVͷ'#i_grůQA>c/~t,ROK\;fϲeAπ{bieAᜆ9zӍU!H793.T?79z(:|js򹋳rZ# ދxέG!֌,Kr m]=Xcdz\inKnv6ߠa9CwVC".IҷPRfӄéVf|@4܋XS{[gjwDlB~ fԘ<9=wxVw7=ZzʽSd =j̆R>at<&A#K#2xm;DN-UJ ;|WIK.M.4vbŠbJGdad'.23udl>{ɘediJx+iAq\ws77C?__V> xSoϰ0j{ko mxξ |P^t6d>vMx }3~^x8>]v<c1VEmyw!p0A_s.ŷGXۛD>w:T4WufOx3JkeylxXN+f÷uw:#q>/!t.߱1|_Zmu\pGlMf1m oulىέ#AcPTu2S$DAv}.2t@0#L~avEZ^V@e>S| s JU*]jF͋SS!Iu9btS>'L3/cH=3jk@iR}G(vl-.RY}%4-لE'My ϒ %1t *IJr!MwH.mˡE7l#{^4Plz#M!5 EXmN5-$K$ #@4`̌ȖlP[-k$Kdx` / "0`D"/xI}G<_|l3:JՁ1Xn0CȠOu;a, B.bvk)灵~pbNjHMyZlS d"̩J *[Hbgyj W[L.DVs6œۭE!eqtm"p(WV96Ds4Ўn ? $+tnB|aXxe[hM-w*NSBțVXY%`q;uNۚm^˥VbuuP`cUrPqB8ˠ.@:aU ~1Uf X(B]A]F(|%iNuޭwT-whi"v5=֛lS*K=BmJ`e};/$)0,wBUO9\U6^b_Uc4üjk]XWfSLn'P+Q[Bc"V zp#Ĕw6w I MKt[q f][DTdT[56 0F)T_r&6ςWm7P5ccowO,t)]Pk:3ch(Bu*-Kr5 Z;(} ߈yY/34/rV ׁ뻕s1Vl89niD`vOēu3*hFZ-A!:x%z1[bbnZU^s$FiKe/C{p|YGC̵FOS:F=[,sJWuvb :}9nGFǫ؄V5(9Uyv;vqo%dZ= n~OWٺ۹x>ˋuT ˝ȫDmҙ<(*2-WF&x{v/1-Fz;] 3iTqk##~Ґ*4(Q7*DP9e.᥾6uBEuȤnGFoWpRpJZ>d0"`x|:{]Wyto}Zl5++?}]!ֲ}F5jt;].n:\]vn69|o(L~Ą7(h !fNFCM9Mn%jV,1'Z,2AKRI563 T1|C˛CUIʱբ5W'nYYbʅ3(Kh4 )4c?pJ)K(¥WDTPUjX;[S-[Rgq ==kB2o[ee2\~ɞ$<=!S ,:F|䰭cRRvsFn>KFq޺C,'?Ϩ:49?fϩĖ,Ȩ10}YK9~.>*sm/}}NA& FٚPwYwER>+2䉢"$g1;胼^4`ԏ+kh SN"WSf+=jEZ]*:gLafM~jY]K#dM壕eМ79ߕ8y!4HqNs/uӜPTG+U.cB8/cP/@%d֋3 &OJB_6j6ɹ 9٦ ˡ4i[C0¢W5K-S[ aRrQO']q /b/q&N{8Ή0On;Kil̍  Bgvık1~6m̟7y>oWu*3E;=bbPΒ ;gbUJI@!2sQ̅3SwG ¬!cƊK쬬n3oc?+)å^%/ ǫk %?M[``l.jx}U%KNѶ UXWf&gӈs?n=MLZZ鰾XDʨ]z>l'YnwQn6w  3H.KټE޻w+7nx(%/WEt|xq\EQx@]ZE+<I`wfgniLn]-^%2; II+|%0B0]mWv 力lUHͰ^I7; 3EKS"Ű0;i{ b@( _?>t/ň78&0F,&@iٳ^T/]cJBJlN%C"5gצ&!Pj}<l"8^Q]8Jݱ8Łq#ޖ/%/,~80 Mm DBn6_C#T.: 2(9z ca suYu0dʠ:&FcyI ߹`*0(g[l" @@pW ,[#`PSqDE:IBFV(A3ilbII-fs0S@ @?zu(BgYs=ZJLaQ'luAcPNN䪖_M$Ou8LߛG!SW旸461}-8DM Ui Rt`%pF\d EWn8^Xxn8lPY'suT<]~2ߦKWL9uF*$&b+l-&AL#f22b@ Π |d?5zU-Ym &qTMf*sSvo9N~zSTɖ?!LEcx w +MLLMεםu.$kfLp3q%YA`nkm K~蒦Ju[,^+[աd;X=-~m~=<~{=[M`g+혙ߝRV.r,merȊ$ǹvJHjMh PX>ăRlҗ zzˈcq֟`Gzs3~xm/.rno}$Ϛ}n|Uf¼[|CDְK^^ÍSO 2ŔP{a!ǕvN 9*A=wX5 G աkM%!0Y-r(?Aǝڐ/`.5n4ڬ-i7_|4*x#};*-RǑ_(4w5aN)S$(]v ns5 F 7'1MxG6`1TQysi^$*ws1mџ-\@laJ?j$3gpK|N=%Gww#>AcǒJtdXŖG*qmDVz)jdҗwi hQ^ +7؈m-X"%mjYW+FX|Q)?A2EJ'氣{#p7e)=iNƗjzq=M-m-zǎc}u;'CƠYaՈgk5*nU;Mm>h ]*;j PVc /5v=ѯHHZk*F* pr5LZ<)%a` '4 :j5!'o*̛<]tqCaz"}8?<59Sk?8J|/]'`<>&;2j.[q@Á>@;-R+ynAj$N/EE]T-}+z=q:2κ2&~7jglOWa5JJhm "\&1iI?MJaJ9oy"PÀ \uN]1*7)/: .G(rTַ,V1fʜf 0!ڔ&|WH "m߯8e5=+l7pj d0.c" @W;c*fCEs`u,}rjbSHb+ +^4z~ofOaPFmU kKLϑz&U+^o*b&p^*ZeHKMWWBsfS &` x\n.>8BDɤ<)Q8gRxoI;&^vʇAb~S/|?x|0f |ǧ6) L  {z1a;*J;]0v.6c 3.\IRMxA[gRW\uoو^tF&"Vu.3I(=VHasw݆Đ'5g"l=m`{/M3% N`=?Z١_XJ0 Xeix8rbCd@#eݰj$!cc-jƬ00 [mۺz L}?sRKzPJF Oem$'kevf^vn6ŷ}{!cml3x%k«5vd"w # fwm6l&P,Y)-l AJe`Q` E Q@`8'DX8pA͚k1LOfnrJe" dt ([?ӲB*SkI(S/vJ&AMhc>ayMC%VyMێq\໺uٵJ ȂV4[-? fR7ƷL jif+SA(հQ/Oc޵[zpnjQ/]_Md\KP}l:aٕNk8Fh=!(y#S퐾f>B#21ibc Ф~ϿιXq]i+ ~J1:,4)LYtϾ5T<9DБC*t[}AXt:u]o=4vMY u`S**D]2ޠEUs:̸w[.u5 AZޠ#)׻lugCH?OSQQ;Rw5l9<$+amTԙh` u|Fr2kǘ=+Z7?fFf?Ն"ZZ5; 5R|ɖi뾷hGZɷֈ]o}IXJ읜{lQr& 2EmYP5/?[mok!JmAg~՟W؞UKJ6ByD;eY6ԛ0+K1s@Gjruj~FU<סxSS7Al'1tmO2͙ OԎ[. TdiЭJ^IgԊ{S*^SWoh>vte:wpx7, c0hryQR q͜e]7-2xBJAQzǍ[H|K*&L8{SU q[ y UDk'(&g,+ l| qhr<4꒸;O9nmM8Z9'~aЫ U~' C։a5\LV>*66BfIClUAcȑGh,V;KBfojQbEǕQ_YcMa$ְpY\LYm(^~ Eis`"{`bF{#iݨ.gv#!xyJuUՑO/❮Y(AnqsSz\򬁴]*yz-OC{qƾԅl@Z ySSyt!^`lMF8op$*gvDO=l<+C~{)VVT-:޽Hh}cH RU _r?) ںnx@ƐϝFAn>/E~yj eA}CmP5޿T{gV-LpAf(Ӑ< `t3 ~'kb1+&ǻ[srTNqiAϳÇr$k1+飾L\Y=Kܰ /$f)8u9OZBXT0涱?Ӱ۱ Z⛋2c*p\)6P\2dj%;\xyq\3 QΫ|Z]ˈ .Lc2:>k;zk߈&I)牊/7KKug9W&"NrQOB.lՊsPI\H9S( dr^D!G<$r|3R3Wt vH*Ztglk %5 $(mR[ٷRqK)Vr\yӔ]berWeMC`_OcŭթWn=E:RcuSVz1>4$7v 6X G9ڨl*>gg[h6U%'iB|/Byv<-^1r甧2ߧwCb=tVxFӼ.pX@(K㺣Gj-A;xAlMʉvr/gu/q5][_zwV׬dP6JQ+Y>R5-Yԭwaɮr[PBP"ػYn&T)%7|xW؍,S!l8Aݎ70}%'z/5L>O bE9 }r%-yEeN"^~.ٿ̻D5#PexNz* ob4ℚbт2~2![8wK2-N%ǘ̳%ZaW@! EpRY$ ^,+VRyS/E9䎋'@O^ʥЋhD4gﭾ[x^kC뽉jcِoM^zsiI˚iUs`x:9xgu/Tn^:?qN͕o5?j؄JE|OSG B^iWK(dͤn(lnwS|]%w4 Й=Iғp/;s2黇.y`+w<3D @QXs GkB T-L&O⼙7E[8 ˭3Ah'1'r$ N%bC7p`;: Ud.n ?%J@$>Cd@#e?ۇj$!PWcejŬ`aN[ݶu;U@073 ш@?Y$cKob,',-S٨nN% d7])!7vr:^0 tΡbP4Pɒz/⣀@ӷdlmkL-dA%Kr2"C$0xEAA!΄3Jb1Yw*qbkXdP) Nr*KlJ>&~v3+uiJlyjt9L ^>5IНMs n3[P\nߚdپ$ҰJڂI RU>H[uCwԥC$٤Y׎m ]Q~գfpoVk=ˏ=RSa̎WeyڅEf^K>#zKԒSˤsw.Iz7 u9-5 mj2 jCuZoƊͪGJ;v ^U{`y[)9,S]f?" qBVcaTi=aFp~uE/bpDI2]]~n*QZgQ`J_E-8Uyoq+z8 d)ʾri?K{40Ln95&noVA>fƖ*&I}²,QlZUF¨f5ϦM;q2T iOѩ·oTSQ%l<Q*Q.f E:Wl}<$33T,Mr}d_ÕqC̈{ hxR,`2M*ù5Ԅ:Vⱛuit%h*Wk=YUJZCcC4c" _md2+:X嚂BRA$$O^Q30BЫ2bI J97sO .utm썗X_x:hy/uXwIՇhjepx5ԫNy&z̞ e'XcdD6y*<ƹ.{??K?qp*i-'WųY.G0 _Ч34>؊ V(%xQ`Q:WK? ~ڙ3c x]Jup-|2Z"ߺ_gU!#Mc{9\h$gQQ1;G?uM0@C]wٙitA ;[h+|~4&8X֡fǻiNMݭogw^TZocg)W][nz}I2dm{Ieh~ڲ\*;⃁w//0il.?)!\^َ#ۓ m)~*]#Se]G .a%*Hof=c3V2, 1f#X] G ˢEEHyb#4xC! g:b>^_1@ 1+ѕt6$056Էuž2g/5 O-3/fﳭJ}~[j)7KEOQ\=e=RVѽ~S77䙧^zdZ[NZ߇n'Kԫq{+d t1gs‡~&%_` >i1ZM{ :"ecmCAטG}`Y 0+;iPjS.ωGL <);)W.:sְx8[K;PQծ"rrmDvWa#%YV@g2܈F4|IW#6MtKJDl=yz^MMT>|F9>WDm:ο2R6J<S\}w]>YoƝE0WO 2;"gQ9,ֱWas8U D:AY5 m Kٌ.CEB2_Ҷ]}"/{xŧjVxnr:k\Jz%s[1}yN/d]ᾐ{1a]1U;1ߪRSA}UQyxo%`Z:4eמ+'yfT8Ґbmͷy65Y4:2 V2? $pOFxbg~,K u=|#``ZMb  "cdcɗ/6Tn3z8Ì[S7\i(s-赖8a;|.Bar0WM=E,ȚvEZȳng΋.9M e/`]YTgcXG,yR`]2ҵ,4[KH'Owq?s0<{2vK侀lsxo?Gn'V3Uu>RFVQy4idP-b@==,Ig;Lzo`{'GMˮ#N#k]h,pYfG7##tѼkEFoF= :+:@^2}'lJ.Lr?E_(`ʅL0bԒTC!eSЋ0cB }WS6uwoxWjveUZ#VxkEp=#WrO'F =`!jB^'Iʿ:Nix!\XR#'X&sAO:m{R-?qz xu0c BDs@#e'tڙtbۻ] b[)s{SoպY ь@2?=BB$/뀓X$5lmG+e^^ƵǺ}Ժ^-;^xUkmj쌺Q\X#+~0vm͝k] :mgZJf.t BE @ >_>3 ׂvVRC%*9U'1Zd*l+u _1 d:[g+wN5奂ThHI0,K-mH]3P\V emi!-TEe/@BO97 xFՄ%;*vպ\"T}k\L R~G,U1Ym$PQKZf/(t;$ Jw;RVaqX47QhQШʇ09*48vQvKo>UaSwgaECwtTk@vlcn#oa%aeKoQe,,W5(nwImݻG8n9X!97޻~0rs5&P=۰K9^i2q:f =Mw3\,YmΫNP0VZŊMqɔlu&H[{L[b+w؜nsq3K nZ*؅W6Dj>x(5}ncy FaƂIU 3\)Sߋ/TM32$,Hk3.S](>kL3 t_RZ q-=]n/I[`%1¤kS9bb3K//4r V<1+I61]c9bmj$nvs뇣2XjTگئR]"c{벼{UTl֙b5o<G_aIO-= M37pNWx ezœNw~͓O?2pzilNSUv]ER~pA[)dh(j )X1Ɉ)V=ة!H^_VϞz) [cd 4\b|Kz!"WV-iaK+浜=GO{Y!݇n-S{*;̝Wt}*\2ԣ M|XA+o`/̙Pa[bئՃ.(l&l|l5}D#Gz"gԍh"FXś?s{S- jm`:$&yTOߛ m{ݧnB4/z( MsTﵔz(A4ŧ=?2^|FE{㑺'oտIۯ2k,,^b;M7[)Iگ$ΣSxjb쬴JcyXET˱{~=>$I\mrәn~Zye%ۂt9.^ܤ#^T"MGTV7 6BZܾx3A;-=/KvR=m$FZbQ$p27,Cl 8j~o^hBQ`a |MԫZb^A0AްxQa3Kkq}.TX ZT/|poE;'ڸMuˤݠ^0h7m؆{i09&$1s9;KQOJC^3rk;P̌kK} +Pݞ᭤u_?l_EivQ伟C38<zj>nR%Af1 QfQ30T6 l눠(b =k#>缃K̊Nrg ݵ ޝݑ.SE;I DD95LGO%:XUܺH܎L[8$TVt-ѓҴy h `U] W[xTt~4z-My56hKVcBw\9*Wf~ȓEmC:7e.ëlvrxF.#܄w.A9ޮ*(n|Ht%hIz}2^jV8*ZeF3/5z#;5WEdkIte{m{ CYE~J9W!mhg y>1dM#MY;U]j6ˏ?C<47Me gS?)el#T7R:0`Ey$PUŋ抋a~ʼn5 R L{/j,|G8&-z"WL OcK  EX/p1YŬG(gjC14z?+/?QTxiS0v@ nHY/OޥtݯؾsHJq*Our>lFÈ}7]l(bČ+9xxSM~[>`ZEIGXh&NnNKMkޚO< ^?hsHSj-.n ( 0& iYezzW}D^_ݏenyM޺Xqe_V;vfIӣpÉE?k%[U3{%jTl !iD<$ 7J9l|d=dߔ8)N;Ί=u"-=>܈.=.K{UwR`wۈ@Ӳ=A9rMnG[A|( 3j.Պ.r*kMCLM6.a 1֐hU!b}(sDaϪDbEBo\V=B wBĒ_0 F BJūEC7ƊH)TWdl2=B)p8 n=|=/aCd@#ofPta5şmd5V8fUEu ܽ[>W70Dh iYڙ$ %YJ,SJ9Kk#M(T۾.a쾾$ٰ;Nev^Q-RAJI| RHXa>m~;7k!wVTs2$(-/ |+&cHWO$gBt=` L٬MQm2ڝ%Yѹjv'R38.GY7(![h1 0VGݻZC/-(r}[R3[({=)v6_J^3mK HVcq)l}d0*s)ۿr ;6V4W~UqAɟ-,@ݠ{gw Zu52HUf]m 4$e%K9sI'O"";<>\u4bb0Ԑ>9:TeɳR`+Wd1e-ͬJW:BбZgmcغ,rzQY 6[KT ey$w7~;28U_ZլVX"ŜXq3:rr}j2%fZ n #۴*Wb4־*M2Jk%w`Pc u$gePKMb,iUNa8咼mLmޔKk)Xs9<vn__]ϕxru0oV8p )]F*AiᣇDIB<¡OsC\_7s_4{<'|8͡+?(lƌ,WDEIsZQ5.%a_')_)'>v{Uyd. 灯 'exlC{f:VI ]c&zd넮7ڜ7| DU1ח4A*Un#Ӱfuc$"2[林WmZWtPһ yX-2/3ຈ1oN_n!M77Y:XENVjN=oaU>*͘eiWl7e\mߡУD򪎨*3T4mK-$Q3e)1 |X%xN~xWr`N1 88Č̇2Og"{3 'NνX*g&bעZ]}f4a "|\mʐV_"tD;D&WG}815-y zyCTߤ6h_x|%q<a;^M#|TWǭZc˼Jڦ;6b,2ɨ#29}, ojm5)*6?aǐ b~i5~F~5py\߰M<9OIIDplt;ĜCF_mK4 <1M8~ gl2$yNPGٕ/Q'm'ުN!1c34|(t+U m,lc>s^)-5߅S;@u-;`CE23i.Uv5rq Ir.z|=K[B? Fqٟנ Ԍs3=1w`3B϶O4{*)]3·xOn]t=$k=)^fbr;&&җXM&'~ so5}Ps̅pP]:G} bL1KĨ(IYޮ.}=ɄќNC_Onaj'aRvQwoj9Zm 6(Ntw>hw]e-qF]A8ؠgwN8xf>KK1 Z?$'gfjO<==W6J]+$pu4v(b.=f$ZͨZ(Wbpb u*VIN^}A[V܎B9ĕIrma%1vz-(OɂYtvT"1pl:I雽,RNP,JiSEšuc:S!lR#zqDJ, ]g\FDn|eBWYa(.`5Ԗ.E#(v}5͚V+]lWAqud&`r.ZqMKȉ ­" =⎩.IhJ赘"ݖJ\7svJc//?0dzF}iR̥7-& Lv9z3%Ӎƛw;Kwe<͕YU9st jsUhЀDU̾|~$1R/=Qů;sr2|]eUnQ֧SǂW-iTo{P5iXd$t@ j VKS5#UKhz&R ~yٷ8!O1cz.iBv7GdǣShHTrq(MkSieЫ&〝彸#Hz s#r4;F$FX ^rHׄzYkBHvwpk-97rBt /(rn &u UQ{()p LEͶS Dh0>/WJp0&_[qovmEtz _ º˺"2aDN\j.D\I 1~q,Cd@#V!{N5c%5kV3YSwVmN`Dh Dm e,V!N[XrӸkF{9g7}T$ٲ;U"B6*Li!%tk3{ڶu-Y[jlɖnKEB@\H_S@hn c2&d:p7䲎Wp0m͔$`Mg䤌DwjH9H_ڈ%WaZm2eŚoy$wD,d5eBFfӻJPg s 7=fmUXʇjZWu⢝[0=䄉.VnTJM297I.EN*"qF ! v4{0i(j5zQyȑ[i2DM |lj6kjkkz>KD[n_0/p_v5ka9B m9vb'I3gĶvB MJ ֠h 90#!*j%؂]Xh|S6C \fOxA s;'yIPvUL4uy ]Ae(MZf 4&nV,id4d(9ҌN? TˆG#B7Em\ѣVK WpD?kG:j$\c,烻\iP,\gk$bέroKޢI~'uMUF98{D=4)-Xfe D\hS&]Mvސ$7f4'HP c̷sLKP-Ɖ(4AWYsBZ*ՎͷB-Oͩ fd {Fy_[IFE;D7λR[ j6_^R9*K;g6 Y($wFΔQ|FɛMR)~4~CkeݛX%6k$3QIK4\aKxvH ӗ-m}Tk8K|;nܕ/vMɖꜰ;y7֝LGb1;v+VJ `pwNeQrٖpa3b ި!>$ݹ![п_Cc"=Se?Lc52Rkܾm_O#19l_GE@UKȅmh,.>=\J'bN(Ld--enueU^q& Ӧ@~ɁHg}n*Nmi&\FT3jCn[L3;xoL~rQ N~?& il&7drKef[Iu2G̰.rbù9j9_=z޳v`M[|eJRYٺs#B_;EH+nKu\QT xȰE5 küׂ ` 훿%{HE?ge\ȗ2qɰ-`q{m7W`Bwa>eDvb_k{ \9.ߌY‚\'Zd;5܅I$=+#-{6Y)V :cMYR);~zHBug#M^_J ]>) `3bNEq^9ݭT%scq!.Wڙ:tz<-tzTd?9}7knYٺkUj`IDžvn D́zOcECP/r;uKmFmcH-۳$͂n>ms3d/˖NmbEʇu[3}5$hljMp>} Ng3+SCVVfgy~vrZ@άhi|24}?zMcGs12 5HwEI7\n3o9POvdɳ.0Tt)U1A!_BZxP|Uv.stti <.X1byn3t*m ll! z-> )3Y{׺Ik%BJ+꾱 8{/ʴT_)Gl0v;Jj;twph"oXX ⇏1;KRd[ '[lB`zk\ %mD%jyHp+v.弲ocPKzm q9QwXFb 72]<͐mkt6A gDF O"@fF.8OGo!*U2\,ʇW]sV\} F;Jl+^wUΕvVyb052ŶiqzXW[ް  x_0b:՟NϡzƫE]%qig|=ّ\H]Y r^: [#7.8VA?C!E)# 9|Fp^|9^)yX 31_tPEM}8>U[vBQ %4 =a9FE^a;2aZ7$Vz4[xXLsR`uđ";ĶH?I„ nHS#  8ervdy&c0}>xv!$6z)mL/oӲyS/Ub&l]ս`-vvz~pCl>nF`$ &|IX{^F6).1"[u_r8.Gb$04#9HV^p#`OȄX[!)edDKgza,vXֿ J-7=ݏN0`8* ;ɥ8GR{&_u*ɪ WE)0ˠ|#0`CIϑO"9vB@f`DY=<"9uI)J,[*)hGy~( ,d{ z!_OR ^k['D2l*$Gr޳WN&% ,[+*; /`VPt~„_"@t'foDF7Ә g6°K{m1*Ց$EDtuvQ~)QTEu+9\,SP/%M1&1ԙd+0&Qn6ק#䞩? -zL[St rqTiBʺ/FcSt~ vyOYޥؤu''퐔wd^|];?egAa-FCI#(8~I[ !;qzB+Sӷu2*S 3i*< iD!c18Q~\:W`Cd@#et66YM֕AYْ0»{ۛ-N)o`gI(%K?Lږ-CPoga{ v:eĶGma.A݀Ň1"#8n]WrՎ\廸mk`IeFHH uBղ6k?Ihx{;4pH8m}U|,Z.z:K컣ͱ*z%S\x Je9*70s;\7XPTp09+ 29vP$Rw![dENC^3pkCPk.ĵ-QnZܛt?_bmŗCE+56 sJrXJ]D.4w:AM-aLjnQK?]ԓS'~JK/DFӢȋ~)gD29QtR\ɋ&Fo2!%WtĺKK?L\ٸjZf&Nl@ ѥ %`7dLJC%G3;Ikz\q@5be};Sq! sZ;9b򿪭Ϧ2dcs04y%'-:4GM6b80T }"-u'{'AMzMԌP}keT- d $VyP[;g.XC[sxL(Wozh(c͛{Ϫ9KnDU_-(Z|k5X`ŭL_7YLJ05.ݟ YA+U p2Nu|H)Ki3y&g st-okSi#3?_$?"74\a_ٰBd;׷}my\(!W:jDbO)ҟL6|dznS'cRfY9ҫݚ[zbV π J8.k3&G]~ԜU֞Vc(\Z&1nvKey\$M>51lutc613*n׶R`S_k[4@]=H'=q`1XO9RՇy.lg3wBEzl1E}b<ތ3F'[Ee;1zzlj2okQ6æ*xl1+Q|h`sN1>}osAMo;ZIVpVLB ɤg>g*O8 <҄o6v< ףp%!őo']Nެ >mA%.uT}@&ĉ/Ӝ2%'Im^a*U-`!{.CTV*b!-~x,/m:I0mqhB^^Lfx,nW6KH.WMH1.J:+,v! IhsNNჸJZz7`*#.X̑E`0\V:yl&[TUm} alE8Ӝ9U:Ҧ0_{K45W#D4jhrWY酪ZGJ۾JP KwJ~߷Ud)m]98]3@]O2\0@6]5@ 0YmwQ3P]-ap%]XaLpH06 2#\_N6$9|f9p◼6`O. J!BM4R_'=texWlF\T^hWu7Oi9jr9irbpQ^ <pdXh*kmZMGo2 :{f⎪O9fǍ(9G&ԏ#VF `tuG' >IQk ټO,(vZyelw)$]Ԭal&08{5e~wfA[A\S )`?*Fm5b kΔf82cE$_օN2Ք2Q@xskeX,Q( _(wvh,KǶw1KgAŐ:NYb5 ]Ҩx -XU,ط\tf^s,Ƣ*k3E).-xK@ l- ƽN {jE76!3)|!<''fy@ϔ~ЯQT2)$<:?VTvW_D~mcH@iZ6 .T74xX HemlI8zEUu<5j j{NNhd]9Xd;B3>*W4]y<IƕK#ěDP\vMc"-Hz=B{;gLr9?[31C&Z8TuB#*&tRэ~"k+6bv &,k0(J0VzHp@/5`ZTfJ~Fq_i!!#߶q8 =eT)."Ȱxo5DbbDq/WKt *=t2X$)XC@n+xM.Yt؋]Ʈ?9&0fY lu|gM;+yx%_rWxڅm]x8~r,rF\iyƠUHF1YI5N,| eiHħ)拯O[uNm땕QSo9Sˌg_țn hzu ʔ0/oGxGQ-Vt= V`cNJ^"w8e[/brwn NXh S3s]ߥ&!IjG>V of#CJ5uFܼ75|ǕXhwOj4o"[ٱi3Q=kEicƩLksڅF9'8m_e!~C˿'u6kQ}[ E'{( ehW~ 1Ye?iFemuT>o\se9 M+IDJ!Ԭ;$gK!~6rѯ~S2%+g ;R,\"Sc)\ŕR2/~Ƈc?yBGGR^ן%7hbp\㍢04oZXH*x~WپE圜wٔmmDɌ19mA)S۳*~=϶K* Wo̍\b1y%vYTB!#?mӿ=mSq4kyr m'M1^ԭYf?^þn_ U媽!(#T_ݝw mL Ƽ 1zjCm hLdaGemh_b<ғ޳K/Hn(ץ2HN>rC)%" T<Όϑzo^^+Dd[J˪:|U)П$w/Z?ai^&E׃^#zim}S^x?!RIe2+re8jujV EGػ׮xώT,3->&tD g, zX@wP E/XphKftq'Uٸf84EKM)##{I/H:pTPK/l# =SUXQM|gvn=&JbD=/ ]HF+=)Рu=9_YTZw ޣSU>[@u";h zEghM:=^h (;E*[R#PM<"S{|t)y7zH8VaOdQFM\43xqY+Gc΃kuFPu@`ѥ& 3 `xѱݼ'n۶b,G(ijX?, TL{.M-R+.@:XI"H? n$ǷC}C?=g(X C'.OE4p;aA3Κ HDx% L䏈YU2>'D0Z-M/'"mɭ^5NW]Misvx5LUa]ui}hys\?EuH2cWQ*- K_EI!\<6ѿaPLheWita= q`X\DQUoHSR>PsJ5{?)L)h#_#&]e>w3OMM=`4AHeʫӋ3n/1}Kc1=:C64Y ߟo* k(xtMq/݈vvW{ٛ?vDNrs~:7*sqp>0]A[ z5Lv?A ?`.WYAR]'ŌNB~As 'UUxjD(ɶT'鶩tIzHE;(QA)(i8˞!w3{&: |*GEU6Wmth=Ou/̟1e=GL#y(k MC}+;&F@lZ-ө@.r&Tyj`K2cOs6u6b> h!T^~4yE":@|ep'Y7U8"L2N IG نmbR#]?ѯ?ICJ,4l0 - l3P˗r)4=He4wҳ ':B8;k. 0W'7'w2 c_j w W7Isв]Kgvr~_j-5'n@IrssՐS &#͸oK8Ҭe B|̘͌kiTlWr3W=P fgwta @RC1."\CSvوB%ttݢ^ޠ4+ HШ~H.t[a1|KCz<ЂEpdܛߝ(TZX]逬"~AnGMOъ/jxYkYt]JtXqC(mx#5gQ|,SZ|'_~q G֋tAI=\uNOoJ[ܧ {G:ۀJzbJRE%2syA=;Iv 3u!M=lHN@a` )@;:0J D 3'ЦLh)0 ug *@ @d "Pp-(3Hq }NELD2u"0n\(?}Oj0)5*8u#`0HwiZ!nPy\O-0Wҫu!_$U2 ^>zTVsEϻaCA(SxjF4łT_.pVeJ`R0PYP5:@ gE ^* Ip+QgUTBJ}qT D|_#E[4Wfq8U>RʬiPe9={f@}k=SJNq_sf؍j4;K&܀  7e ִAID#?eUT" k|T 1v-R7Ad!2;Q]P`SkLBF-41B coE!r'Fl' Jl,MGnbyBOIilr4!u:JEB:0L1X&?7=h8銈cѥeZQSƚ_@+#xlؾ.tt-=ގ!cD>B[K=-җOerx2Y[Pua0𷸿8D n P¢Z,/I-Zx183d03V!{MIAmksQ9#;^[";vҶI_8;#ߚn[-%C ƁJuvx Ȍ|.PcBg Z4}IeTf߮}9nl[ۭnMe6e]UGH/Y XШ?IT@غ "$wJH33:gx쌢 FbiJMe3 HAP1M.)0Hh($fLsZ Ye! z i1D򡲩)_YJ|&˯]V(EU9:!5G1g4ͧ( 6 VQH{Nӿȵ KYKW+FO"c#\Kkم5 ,Uc1#9KfK&ԩՖ~˦L&bjzKMƶ0GfC7m"σ#t ò^M)iYȅ2) fq\i+8ڨ'A52^3#jĢ!Uy&YБ԰9E*gs|T//:G'Nc2YUרWZm{SpPoD^d%Z+sLVsQC䳜ve?زO{9J[{>ZۤtHwc> 0MvbUC lYD*5433CLKm F,I*9;ݥUV4Sם)K) P"BlwICɤ@Yϖ8yͣM}C#4DTGj.*n*# ?D=E0Fˏ ̼J7:V3٧*I; :"CrS\F3~¦xfC%p4w挜F֜A?GhߞRrgB# y$u`EsJG[enbYıL26{!ұwI%("Ü#N%i'zj^'Y['=k?UiKnk ˦dTm e* b;(,IkR&43%MN л!LTǹ[luPaOFpJمimewS)7|(D Yy^Jwj}%2WBJk&U"[d@F|aa)Ѿ)dAD3M)+[At,g+c^!\`;nuXNHy5EQң՛g qYSTY>*Z1~<͍@%Y_ԌS;t`iEr ٟؐV8pْ;cs#$ xk:hA̴JAjQvt#n?}Ib*vzrD Kz~E'VL~hJ9C嘄^)0 'n򌮦M/ӽ!>=/}QrXs=STLaj.# kv8sݼ%v&U2 | +O6ʺd겹ܝa^ly@YrnrDyԯ'ȌKz_n%u3;ףn>WA?Orb6JTUen$&ئrBzBe:-pKmkŁ ]w_g1 xfikhP0X޳F_ն=k-?;z7syw6)FzvEףJ@ tNKr"oʛoi;mYf%~մhDQۄ6{43/Dxh_|%ŀO$tCV[XHNS)pv+nOknxi](,߀jd74\eϢtեr?j:kTe̱}M;t5Z0m_VY}P.=Z+yȢy+3{hk۶RO4[fduMջei-l3oĉXVw.[pH! 1LNO-ɯ7w79;CZD VT^us:J$Iu\Z쀖^q,]IU{ۊWf;֙$GiZ\zH;JԲ lo4칓|ˇHЅ{)vzaNlzg~6ݖfwkO}3Mg\H;̢Ij ~$J(!){f$[LY6vS-zXbSQr[$ ]ƸT#KXZepTo(ym4d&!BU/K}^'K}X(]7&(&K[-y&BOǑ(q,צ &~Tw:w*{%v<"nT\nՐb5 qv MHz lf#M+ )=":sm%!>DU;j5 fޝ"ΙǨsD5UWӉ:V+7a튰w /&dKTHXSo@R#]amc{{T,FӝKo'Ng>Yʓd;,KŪk?SSœ_.d|_g\=`v~3_4;*d'GLLs_8W^gĈ ļ״p'4 x#X2y売Pv5M dVt{*_LgR"6ٵl:Ϫۿk.q\OQ;w|U=X n^6V>ey@dxsCP#p[^w??[jJt> =$G 涽I?*2$Dii6MzBZ"Zj+xש!ntzbWKl GVϐ%`eW㭫ժ=q\=9qIkƛ] 5G\-"/21W̦w}h6VޚU,nǏ&oMQDOl$Ux?{|y_X$`  lq ^VQ#Pfи`C/T ja 5 @ |0w5?CWl${vdH@օcAlaV_Pe{+ahHںϔi,*ulVs*;/%]pʄzƚR.bW?j,6sUe6S[22YN: ,ZjEq.Rfɲrw3/gvw^(ԿlN;O9_( H \J"sz"e4[i)צʏ}}0Z֒7m'd8HKuk<xҍߋ1e3o\BV~mzʳTϨxbt2hn.|-CZP֥ >ԪUX>ZI2 \k )[yn*ێ`˥"љy芀Jy{Ųos5HtpXRөVIٓ` 8הm֜z,֝zrvyU-Y%SBmJ;7@A^i*fic>1Tc+j@{;@PA&)V#fV&F^n`ߞK$ө`~jz|.C9{[tt͂^)fpKT̞H%楂L=y, \i5Dmd>2X]2} +6\ ÄZgjvʁ8{ &CΝ}y0*hM/eCOWB xIΗR7^,te D~$7^1(;c8a lINy^9 Vq}W~ݯ9Lhq]ˑS2E/~XBUurCdzvn٫.nΥ),:9]Q^.oyAT\N<(t*^fADۊsjKkkV~+WɗwD{~[Tm=fjAoFmg߅ 7%}>;.6/-IPawBD*i$ W|.+Ь䛺qv:їm<SOCe) TD^+eZFBPlBROVr^̿_$yHF"OnUV^ex링Bð\;UCMveY_swK Ftn4mH*kM&cY{f s[އWȢ[|t ?NkT,05Y]!^:v3&rVd]WVRrVb-W5 21^0N9-W}7vΘ˾-^?U [:)eNChb XzYN"M ɘ@X^<^v9q/zFݏy|g N{k͆9K!^M'g1jBX1[2kT3ddUȮOO=ɦ1#Kt;+7GwPإd_56S]ϊL̈́NA5[EAkwkB)K)SW~Ȉ4%FRyTJ|Сsi[B=Ѷ[H)|*.U 5(K6]*$Li;VJ%lY/'ۭg]mY2yi?m+rQq(܎IS*r?.B3ᄑKuI9U#i!Xsɘb;S2l4ᘢ$(Yɳ p]vJ¬_9 \3 !|ȃ,si~ xVmY50R/:YH5S圬a{TW1xU.dPjQ;q] Q%xM~$O~~vih;QJhvwD*ל\䬸qz.qwgT:J5-o} ^{ nRzmcdbh#JBzO΢"=v܌<& `Zèrƀ#ExbVZTSWͨSWDLq~:?qМ^JUcb䄩1BkIc Ad?s=Sq^hC'֛0 zw!FI~v^B ?P়5 ܧ!bԤ*(l)'8s<Ӑ5:Uy>F$xb$֦?2%v" e jJ! "Ke-1{h&(sX;4̻%og^סn{+/Qt*0w\9N¤ЧeRD6o \BwPԞ6n wҗXЪj۬>Kك{ 3jސ.kIҕ@HX] v]!DCj%k%KH¡%!ɼ?plBԣH9LCHv8P>Ѐ _67W]EF2b3d̛-O#244ojRcBkg.FCY"WNzՙ=Z7nȊ==S̤jX'9?űFJ|I 4R:v4݋˾㑁Xw>O%$ή艱GN=nbF\'h1F<|tNIBҼ .uE6q(Γ,Bs0nX!0]O C abªr08v_0=$tWp[@ .x'%Vk2"Mܑ1, vaU"T)?h""i)~wqib`'&m ,(G/#ܳE N\BՆTԇI 4ĬAZIt \T;1JX#N^(a|SYg [|lu Mf(z'@\~@ ֦dY֢YE4o?cT-(ܮ^ۃ^%?NGL [xBtz+ K^E CH/ک2-ţ^SѶI֘OXWhSF~._);᳾jt$q/G#ÌvP~Eٴ90h\*r5*nH9ek3%l\/b<+@A1橿+AJƂ->,򉵸bmqB :,W sQMms})whEpFX#i!,f8iq Y7N[֋y6q1dm93wj`#bdrE$/B`/+P;"r)E)Zk^Wϕaאv"Q^)Frܑe{&֖h.zz&^5ý[4ix|#~}qk'/-?J{)jO/gF"Ny[ ߷YIke)aA([,qۆ .vˤofP0Xf ri+ JH>0^G#zz\G0@_GjQȸ). ZU•|(>JA+(byٷ#Wg`<6}#t^X^:GD*Оz%@8)$3T@3EC "7q0ˉM[Y P#HR2n7v'/0Xg`dF d%Yҥ$Nlm[uv Dm.4G!ݹM=T(;\tћN 32M,)*h,i$$߲$IF޻nssm8;o^ $,@@ ? B ? ~xn'Z cIr6$ PcȒu뵋mOfz퀸sMҭ.$3`& h4Ж]H%:RJU *WL_{cm$a?A~.ӽi>It&k /6!9,H(g:P5|(Iw/da~; M4 y MBE9}Yأ/2=R B8q%Ր~bq!ﳄ ܎*SaگϪЪvk촛W􈩭#bYnܧ8cp[m$B tYf ,Z/.eE3SgڻEM%BֶYؐ6׮&u " M5w:\?T)^|d*UV]5Ty7gN1)jŜBSdrneZƋ{#  ;zJ? M.uv#@B7ʈ! Ah+NVr&:6;O6+j+;}ROo!ُűAOs{*۠u֯J)dGK O~1?wndda3RӬ QpS*J3 ; fiN1#B&ɭi%p,ubx2j lێd o~V`*JJS3v#5u) ̒^Y䌻OEjwO V+ &ذ{bb+E^m 낧 {3a")uě CD .lxC9Pb>(t)#A"YL/ҘY-[DTw2k(kdj-r%˦rrtGCAs,ʬ:fpTj^UuTELi?eqZ_5Vf!/r;BAv`ay(:gB3+S]bͩҿ$DAI^-MMILSp˾Mgc`eś؇99 ҷ!#w gWڝθp,Zbt^ \T{ڣ!oWk>ҪpAc,684huC_֥ j*/ʉ,+#Gw[dA$W_4Ó*Gع*X̒yA=?aNl˞Hcw,J}˟=H( c1{bሥvD{sfC(i&r~Ec76FDJ1UM熶]-$).eA b&œ]Q$IZ]\::!8즺\f8`Z+Ϡ}ІnS;gq1)-~>[q+#x{m&C{ .U6l'IJ^t؅6.YjkOeW'F<^+heoPaK޽3w]ADh22@qO 7IF%o#$A4!oDBwվa;j|| Nva=1OoJF;%J3;I $/-+u!YzWtm'̵i'i}dSB2ctI `JNѢ}+wBefxN,z[ql] :W} =[6ۻUzvu<&НN70兝p0Pa&'pF5KSxxP:R/: ˬv/ȢON<HO2R͗nҊҚ/$-#>([Y^^bFpK>~o77a{q93UiKM}vWT{zYZU҉w";j՚ۅCMF7kf_ɲJƮxEkԱr,BQW@O|U:mO>^صKFxCNNs';1۝w}/z4Ը-^g:~R/f%]֧zPK9{݁P-5~O-UV,ctјjF-B%c)ә _!SԯS(&JГߴtaZA!7mvlC5.],9T>c@eLz'睑3Nvkl]nmlln:9*qk0S/ȽD+ ) %>9Bu>T*m|~[~r_I :;pG[D ||22GMc?bEe>@N$3 m;*kf:ufRCGeؘ|l<.϶`ޠPM܂;ke5^MJ0 2ss@ߑ= k^A̬7FVk'C26vvT4b,;)0gz~Kzəs_]z\["z6^Kws1\a&u]ݸ͸Zme[=۫Edy.=pW]f<|,1HAa_%6֏Q&?݋xIM G_!C-ߝD|$Dhݢ"֋%/($LM^Oh'0P_^QɔԱJJ`*x,@@9kB(-E𞊲_Sy C՗-".3Ɠ¨ 3 \ϲHy7ѻA@ep,{>-z"AJ)̠`.I+ ֑L-Y`(wꝔiХv)u(9hj?8x_YCT Im3iJrO2LNg13GZ)`0V}9 10`; yu’#11}hB;&?ξfݸY]Xy۾[Qx]f Q{cKԇZg7r5ǑxSDMǴYV5fZSj-鋡PDLO6^;6C3o_YlfZ~"Irr;q}i2TĹ["ib⢃ܸ7|r>q&Ois(,I4V[jDzk ,{AԚlU>+Mf>T&=Ɏf)lb[ (!VbgxNdb!R9HҜRf H ]c !#BHL0z0vlF&ͭ=~/& R}n}00' n5LJ<5(V5)Lb޻f+PxNMVN &?O'U~4(Td%} XNuD saUa-Ec=sg-<?p4PrӵysD2~wh ۽y Dt:3#RFu-7%K ,y)-\!EwfuT*)QG!3s-*!=]MGٓpΡK5GsL;Qt4cD[dbaBΆ4YC# y6Z|I% :LbRg6eag֛3S X:/ECm}2Pwj3 #K% 9PNKw%?7I76# xN^G83%uG]c=zi. cZnXܐza;b1ha?@/çn,e?-52*.x>A' Q`Yz 59EN(7\ 8, ctug&bz e.$=$BNh!Udll+]7BLk R4r?B_Kb_EgHލ6y:Gs-Zj0v(K;AFڡ;ѽavl8ٺ{^!47|wتsJ$G23R|чxfjp XWH눺_}I `+ٝd>AM(%rYGTe@ye\8Wz{دSŚٌ<4ǧ_Σ G*_h3uvt!2ݬ$~DDe uخ(}N/7Y 祖UQׅ46 yC + 7-}׾ֺ^b`:`k/¬O,e}}ޭp}~7~<`,Ic:x#b* DYjD 7@r{/dwAf0;٘L- {=^jJ)[M ž/EJ^ - g3]r_YY\ҵ#~藬/d5=6W o2a%$ F腲ZҏwRz޳0fP2>\6y(S,eb5aq~{@ڞZ!βf[mu tJ!ߤR Β: ]톤*G3g&4'-Е*$Uo/5K* -3 sDles,/2&Q,p<|2-Y#C/Xt3[\TY1,i[Q%dޥTm drOG`ьBhI^ޥYlq.nй.sL rU?Eݒ>Y@q~0ręJ|h#k\xőO'Sb ()D P}i/j7֏^H5/F/V_O [t1_ tWx֓{G \ [>{ {@#Ds@#eibq;Un[9V[oԫ56'WۘgKpSQg8\"uV@+Ի3E+ lc"7C(P̅pX3y!Sye~Y_R@!ܢH]{}Cیvضb^kEl٩)}K; El4 TJ &a[bܝ{\ʩD#wӟpQڼ g(+YQ*wHIgCȔVm6^54>dcc޺&Ct-oElJϜi>oҰhć+'=z'ɵ gO-dIѺՎOPϾ*XfH+qXx.#ޖe-DVl\8h⨒r^kk}V_oN~#?K96^)mSK]t,0XY[Z"<΁EqYeѭ %'?~05+vwSPv,yw l4*N{غwx3L?†* ƾIkFba~a@bpn?ΫԸR9-r y 7K,I#e'aO*?,DWUMQMȪ !!& _xI!WPǦ4^Uo$vM*znvjo˜lv*1ƻٺou|;%9LSG:3pI"Jk$$FFsXk \ł]|^LW S wjGĻ=yۆ'b!X!XOEiM̬ _P3;=͞V'D0hI&K-̯$:-ӯo *ymp :ۜly QĿIA,XR]xy{*Τ%ymlO铋=J䘰)c 3NR1f$O͙֠lͬәU304ʸҷWZ0>Щ,7lQl$`%1S7r3 \6Zt e7XJ^/֟Ap>`bpоϰMnľԬb:1!!)ϡxg4f5a%%g|tq~`:/G@>G8g @x\qH[|ԑ8|#kc쒶&Lj\7G]wbg,Zn us>/]ggлg8h$ɔPھI E LB 3$  ;$(ڃ$#e!P͉#2][Ss0рoz@. ,KʰF:H)^4ӑĀ@ tۢ/>OxY&S5hhG|U'0[a_EoOw&;XK܂?W>>v h r3@~u8hh|gg[LIZn&ԡD)^P'B]U#+KH8Gx}lk47{G['닛ڌr:M-mRt|=pi1E-<؈U%$p4rvTRlK"~\NU` 2 )A#?xT7st-o'>n4ú";!Ċ>&]9ϽrDX3em-ׯN;b=9xk@U:4@#U !iORH-.I]Msu[uսB}L~z"`4`P_ $I !d/|[\B4}"hw+A,]oNnQJt0(HG%IxSM1" @?fSd ~nV֕!dSfF%U(b@-B\ @c==BL-)1H`^ӜVz! Tj pssjBvƦ`հ9-"ZYQl;(7`Ka$u#F5ZR81WkSW7契 cqbF)^F+{ۿ"Ö=æB#YAg=QDS*7ث{Y/}TZvI>Wo<U}XW pszTNڳ΂1)f|-RsU`WjT1 )War/oʼ],J^5(œA@n[([T tp0gUNov< 5P~r^D&6,BUI # Y8CF5F6;i_NO>ۻlY/bגi*ھ)57ĚN`MB#7 l~=7VU{cZn?MRe `&f:9Qv ::!~ AŨoW) ]%:KCr.][uKXh kgs<È 37Ю˞Ѹ˥{,gw0aȅ'xB$!~uRGyqW9k| Я"HTCXlҽBqhy b`kj4| ϘUL$8ZbR#]S26LD/$bډ)Հoӽc m=s8ƨe TM-dž 5ۖ¡ս8s25lk7<,;YI#WT$wĐĜLʻ}?'u9gm|6SC+b"\Dc,:)z;ÔLz@;tRۅ2+07+F|zz)G;h8.*,nm=o*aJk938}&<.00ētj4Iy)NIf*&IAŠ}eD :J/CGU:P%9Q#=J8'M+V<~*%WS3c.8zgh6e9ZyhY }ȶM^L 6wSt_NbuǷ5RJ˳&mCX^6شr|tJjQAbEPa~CȄܹ4~+o真`NCf)l X8tsonD/ѲӝZCiC;e#RZ焷/}}MbRg ^̹"ޓDO8ꇓ~ﰁ?b==TBxht?ۨ _Gc}}>S?@b^Vc\֍_߾-?{TL|y,p-P}_f d Z.Jeiݳ|_G?%?,$ӦVI_Bcz?Lv-󼺙7O%T$c C$"0M%k0RO̡'[F&3Xa8;:9II[y&u(gAD޷e7O@'iȅx )v6&A_El)iZm"c9;neѵ5 7t(2כ='9L5eD2iDߞp!gPAg"&Nwj$>余I@Au{@/':i,)3 "3@3U i?1p#ۚBWl]V*Hmh_QDh/ee,$ےLf%APwo(Xr^ e`әErLlzi쏜LAi')YҤ$F7n[ֶe]am[mUVds؃fAD8xrNr $Iz SJ_ߖ,A֬,0}_i5jh+Q?"s28$qKu'& ,Sb7zPo 3JF1'ȣm2TǪdIxRI:2ͻɒxqѯ̘ζsB´MTq6vdz[Qbal)io)!k1')'(% ~2 kUMٚPRW7wWZPC6^k|ΰbWurJbjHؗ= ;עFw_elH3uw4oWkdF(/aVz]bW^6/ox5n/ՖS!TYtA=I6wm?٪jŚECLMghW"<Ū=pKn ֨t@> hcE++lLŭ_/|8&?S+;-iLuEIIj<9$kOM}4–tdk9zI]5[v{4>sԣnZve,)=K #=sr__>A;n6 R# XHz:'$Uogq tOC=He~\0Pp#t>*C\ *J׆ݭ4 IHU ̕h >{E7z*XR0TW:%`}RG}&' ⷼ>W`xfMl*nl><3z:P/p9ؒk>*)UΞ;IyE|+ϫM%,H>ͣE92[? ^iByXЦxM3@ձr |Ɋ=3ho3cuM"=6B82.5N"阹CcRM~0ɚL(!OΆ8f3R frXA0WAa9E`nM4/}VQO}[%?ܻ:d_9df7`Ok>s*-|U14 ) @64Ĉw5Eɨre4C:`r#R3*@O j&4f q:IwݱFiE7_Ad%Բnᵳ/ T;ׄ9&\uɖNؑ\+i-}/Sm_?mR|{)vFpB4r."]Cl6ڈLm7ېJ5Pa+ 4'{t( V~Qm6̈(v`l^S^bҘJroA%V8/ޅD: ( %q|K\^e/h j]AE%3t:iOIəKD3eG33?jSe)L6`;Φ9,7^U욣6\狹w"b)x\@GAPiТ֏+ufG${5;u:G_[=$Qv7֠sby3k=ãc5{H0b!^zCL @}]|:(A_8;q[Dqf# \[R֎9 nFLkwOQ֔P,ajF(Mḃѓ68Q2EVdNJ&7`rxcSFfQ N8Qe6ċLcXEztkqשRguǞ֠ưމ^J7W+UW~vRH\F2f•nz/ uIĭ# @Ϊ|̩p^Ft.eܖ-GtG v[G#ĥa7E]noֿak;+b_IpALd#=mw5ZOsm@^Stey~IgQWVSջ>kq>>dII6]|y J{t5 v.) H/RoH/Z+Z *ŷ>;<6mPt-(rXJgmM/[h-Fݩ}'HM%./j-^DN,A:k#袄\8lqc.4YSFsa|76jqXk6)'7,#9hS{ ʡ|j ,1.@^}$n3ڣ O1# x8xo?==Z̕8N:)yT"\*;"rb)cرqx<~NvF^psI ^Pf#qYW3c̟CsBCg+Noݑ؞]A~tNwйQ/{yGP[h/]HfS.ܫ}­vulEn8+?dGFQҷMj0>6^Բ ud::p.ܱZV}ʯq*@^3bu..:|97>to#$ <:alUE݈4D1L*lDCwf{J>׽}(>yg߽ gec+U~7j2"쿦_ Ji΢ ^2|ZJ,mtto;ov/Gʗ83FkRyR#lG7cyl;+4N2=ilțyS9ϱBI&ɓMjYSN216f]x% I6^4S{l7#u$3@3U i?1p$MJ*eK;$KcYsضm  /^ mšJɒ-,"ä\o*Sv=}*8o|TH~M7=ltd'BID%O(=PK'4}w߷}wgvna׮k.֨hK*uVHPg[_ OY@|m?*5F{kWjByeALs8i;mū# r9oBMmI+QV1mMgcJ6sas3M  I]jpsMI7f̹uz 衄$jkw Ii A= [;a+Uĵix_h3l 4My"CSha;7h/,f`ˊK8o |fjPkSˉo^{jz鸮OكM?{b`/l^(UL׹S.q&rX# ?'uӒ7V?\m B/g^hdhݘE Pr7!ӈm> ZiיьO!-I= #N'BʏZ97]DwDeo%&r'{6TéVְvk˯z܌@#vJἊp2驒Zߒ4]@YHfH)(MHrr*> 8 3crii-$(|:sa Ly.cLVŬC5O~QVh6Whze>8 6 3f~Zk\_5o;b^g[Hmh.vI_١y&vwpϪ$3O pF@Tiº7P(X #/5T|MRfVd-Xk1xGF!H4%)[' r5xO#tLtNT{-Uu|} /7tۏ7rKZێ,q:p -[iuQpb893,:F'7tY(A1os@kzF2Fw5XMfxq^w$13h$Mq|:ѿiTc{d'RD/zU)*zѽڇ|r$׭=ts"~a~UrMtV#mh7!S=?D/J˘3Jbr%,A{ Ĺ.7ٵ`.o]Z+$1(4c&|Ϲ>c:'^(Ujc Cܟ,K_2ҳ-##MȉEA%2Ò{K+ Ru^la5ڒ ]( Hwa}w7O/!ĥ۵CYHT o5^vzfjb$2DQPmf%su(yCuO xf!Ϣ<;131y}>k.KA%ˎCFKxtֵ?)`LR׾[5,=z/~6 Br% D}S\_Moz*'%5&z R ٔ:Q5 saځ}+S395[UOA x*+jrf"j.lpJK#KWM!Z弹ѫU~*Ϙ]WԌx-&AC +zϷ.N|USg/&^2`y/59ҎK*9$e?MPy)9MȔ54%8,s'ayĪV|Ùb,[MΧG,;b",ylf6P7[ "s FuJ `"E?W*%XPі%#Td^J;rDAJ< R}6~F[GJ'T%C4d}.^/L(hB8e͛ Y+$*g{K/- ,0ӚBHq+Q0%Ű$\ޔG SJ~>^n|?*/y#ߙ,CWM Mx"x*`a; 1ɻſBDܱ9aY=튙f;"]x}1 (NknFQ鳐Ů9E/ n1+`9)}遜,cX E;ui^.N靿%65,G7̟N+ҮKk,(KsZ׮UPb59T #E5jfZvUj^%–KwJC' ث}7AKΞvcoaO,g2!͏Anp^hĦ̍EbsS@xGn\otuR{%di)Fsv/dObMHG|\8sQv5AO`}Kk۟6o/L!0:OomeS]Xy|ږ\_QtG;3 k^7V=i"m?ꫡ퉩[!“Ǥe<'vr{=u>7wl5E^;uהL`.Qef|k7)Xs+YgZB3znEzXʨU% fx: vD3M΄)jz=yN /UF&˒ с8FTyC%-Uߜ՟%QE0֮oF$ڮ%W5~ܻ%z,ĕ6F6s{foR~DqG̒k)t"'@iE@bZ:.ݫ{N=}<}c t3QSn9Wcj0іec zwZQ.V̴ b$$\ӤQPX8T6has$>2԰_r*P'Z4a\+5}L5gS+ܰ<_+dw˹@@Q0⟇҈pu`e:?udIHnb^ʨK}g{_f_nbKO{1Kd!56 z0NʷcKKb*E7M3}n4hP%.ٳy:/QQF{<$Ɉ{WA?({߿Zʥ:O~afQƚW"wg>/d;zR 6lH_J>[C8MM҇=$?)^UlB;tAP,B@U90PW]L-_/8Z5 8,wՁ*w1T2-u?486Q'$M~cIR~n9!b.=m+qqu-14TJ{ |i^t TXiP \⢽p[ [Ƽt~TKӓ 1{Yi!޻Jo?vl͈˔Zõƞl"YUՊ@A]bv3tWE<][&ܞ/nzL#8R*.aq0m8[u% +/R\%n}dy/3\!$n 9DW >% 88aJ!t ҜZυ$5ZOXҐajDR(웹Rǻ&08>"WEu?"oyUcp6h_j0#¼MgTNЂ:7u)y<\ǖdvX?pRa;^%%SRjx4w T"jv_81sM+kF_ Le^e,n1mGWՕyG\*ʡ6լ 3ז~\mq^yM*ͦomOvk[giTeBtkO9&B5v +r,OLh-NpͿx >tvz)*V82MOju'ļg{UVWpnBiWUrIE/Z@%RSdbNGEH82Pb}^{71 aE{LoMW?,_Al7)m 7D.1B"Ҍ%ɵq-?*]d- PvU唞-Ux2ZJoMM蜱{mli( P{Nq(eb|֚*M6,U.9~2QM/|@.utN3OLFHwP'\g NO|'r9d\~zib|y|bgcR i'E,J>P85\Sz-Gl1[sN Ü>25 1+=^iId\ xQN5Iq~݀H=-SoBEZ׊1I?CC,%yRZrVEN| `F32.wm>r)1X2F%^_Ʈ/.GmJ-eѽ7Z,B3qԳ78f-Nڔ|M'a{=jwtKpt@`q& =bJ Xj-OJtt 4SxCMYM?|Tɦz-3ke1ky:I>5Y>~ gZe|1s(9䤕CˁlTbs|;_J\"éj v}f혌fva,Gן}"4qeR3$gz<SjSc#(A.ﰞˑ ,`)u*{kNNesp\AҜ:̇:d>dN1|Ɯ\6'0'( _1;#\,]+[y ֹXʙ3, 0byFryd1kΠP-w {}(@xw'cu  ̇#!s@pŽ$809vH18hH!GH.q,W߅˦3BAG NǏ !bPg$ Tru~'ah[@;NU?xyw7^ܵcm?<?rϒr:~MEVP*18؜ #,ϵV>xCs9lvo+yuS1G?n+,=!993+G v-b~~yK,%{&Q[u=<yWS WȺ7Q8'kB4מkAq >,C%҂Wʱdy >[niXPK2*Vc7t),ɏ[}2׹{Щzkj><_а^^):VCW))y@v |8M9p2Y5Vc=VKRSл.vBL!#|sX(` |wK[tPP󢌔I/ YiK?W^-Ц"3s@3e}-dkQ- Z?DsnhDR mlIR L̷r@8{az/w@{DbiL˦^T: a(Oٓ,oBHp]{vڛNۺw^kkۺ6t"&V ?(I%h @O~AGmBBi_&-yD˶:/Wm0ϙ/4hr| |92wnQ՛G˗sdDYVvȑH~j["m3%45Uw1~[Q#TklRӂbHVS3iRaqtSji)O5\Ė]  Xqʵ=SnP݆}}z0P]?&%#] ƩXFQQ!|KҴllP)Md*N֮],PmXX$T^ٮ'\-njъGX^l r*o_v)rآ }ܭ|Jʕ@tY%(~0llսRT_Ed}$hJ,%;XVXmf^)SgOs_.-)bإw5n^føxƮKY!gڮ ef̆ZvKb&qV{Ym|Yn&k#3NHKxSs#5F_- -hrsaC2K/"|ے4Ln a/۪qpg)tIhLݜ ğ-Y P{c}7lssCLX2oFrZ;Ws.>PdW1[Zm6u,B12WͣN 6f[g>XwхF^t~Mc:NZ j@(0Zx+'j=o \[Uq%bqe*ue򸇁Gnw[ͭӪGvNfffJUL]fdL:fRRo3u EYLK&bӍy!u,ƔZ1%LDf3\$2Q}I.vuUx>Y=ews c~f&nC6B-6nqN]:uQ8džmnrkh!-ԛ=WL!"rmާrKAPi̴ ;aiH-lg0XOWJp ?=-_XC-tg\g&﯆:ǗxIznjr[(OWN=d|TgLq2-ѱS*[bT.r^?ZFcַ&|rhrLӶr : gao%mWk\Pi+8WTozee+a~HI1L1|k7}6(!W=+3HѦ5F$D,hF;9F^_JzRf\ss]Ʒg!܃ˊdewh]Q@`GR.)n[`6RA'H=,}.kuB{ 0Etȳ_*Bs]}Q} 5A6@'{HDa3=sؽ;bX݉@IK't ~c^6n"Ʋ6^f\|*BOLŲde^HX>&"L]K4SvIjISITZr?N]_t2*y~SWhQ_LYW27v{9C"hv&<R;qDI%zKJ ]߉aA,QSXޗ(ܙ`KC<|֎sB9y+J*mA7J谭S6?nhkU92Cd:da`]d 4*95#Lgïk gE~ʠޑ}L'=JRj{I!Z=H<1 x}'jX0NdsHC+&>t / L 6Ox;|,!/ͻEy)`nsgj7`tZ ұ}m\~whUw(ex_2_2>}wb;.COYNsÞ]{Dj i2UlSĥǸp7tj3%0ފcVy1Ȫ$H}<Y#UzFuӋw1Tف?P 3wMv3vٖ$X,ﯹlZ TSZƙ4Oxl;ّ?u4\umu"sɈ89S@\KK,-X YlTڋ&:FfOt [zݣUڟC7du6(:9 NY:iƗA'Ē@!էo9(Ʌh+Ln&Uӈ8LvS@ҕ-;00} &= zf3䔹2qefJsY^'t5avjEeV/ ٞgQOH*3=IH  [/+뒒եzDJ .:Z/yacRKx?AWoOu@s2LOM ,_r g&L}bbR;w0}ǭtX@S0 %NY\?26zbp9xư3{ 5w]LJa,a9j=#IB$sT"&L>S #.Eи`F @`C5@3^U.ઐe"o#Ftm][d^phQzhd3M`niar|\c榮rF=cն-UeS2iUjVNJGM<P0Ywwۜۜk-hݚ5.i.JP@X /B"Ix?M kg&1N0,lǽjfUiFWǫ(Y3kT 5)-EbRhx 7ߥ:Ǔ"z1{Ѣj]Tmt|b"8_->3Rӛ>p"#vbnF]:(4`[Q:Xψ<ȍNKSӠQnWbotQMTY0`0EJfmx]Z^1W=CŧLdC7`=6kIAu~<OxT\pgP\jĄ ]AKeX V-H.rU"^ڕ j+Ӏ]JAXfKhFͮmkU9e~e괤wz*)cQ$/S*ElaW,rQ=vsCOB&ē_*Xݱ,4cC?4Ak{Yuȝ$I-Rktek?s_++DcKP)":uhkw}do3b Ebod̀. YjgfvFNaUnV͖5 D}g-Dyzw?qvO;)u^0DGԷ}f2÷gZ01\kN~RRzBInUD#ã/OS}?(*مZ؉vb1)A]9F/_-Jk~sJX*}m]ƾ/k'65ʟW=1xmytFH$8 Ě'[ Э_=HKRXߪ03Ԣpal͐Lvqc+qqإÉ&%?AH֪mrP}J^Xz͕}l1IC/I6;O2E.5Xwico"W-F50sSY .Gsd2`MBƅ *sEjSêJ||NtLˣxr Mmwd tgZ©h~ µu}O 2JCאiX"?ۺCytj6`p-/]g@b`I2^*VJ4:Lj{7ahn'GX"|*6B =+1"::t/Cɸ~XTY__rjǩs\ F /V k0筗(;.op@``0PX#QG%1 sKa>B~Q`/3>Cm?X N$lEњ]Ug~5Cn˛$LG:9X*o\‡YX%j=>#v]|*d\߮nj2t|HDU3ޯVx˩N4ou(/ tL'4=wŰ|mW粱!6=wS4ŻF͊=*nT a5ې|i 'Oğ,)eAFwZ@rMf8k~;+f5:ҿbl=ZQNJJ?jlZavAec""E1dZo͈S{$3|>d2ycΡ 4]dW1~In֏pA9xr/dv6ɮTbM )eG{uO$U}}/Z2n18ս:q|+++2R1,)*WH/ߏ'[)ڪ]>ۖ^=bႿNFdM7'/OƔ`HLz- &YsUD=sg<o.SiV?f^_Asn5}܎?tS~j$'I"!MΗTQ Y:O Zq9KX.V~2s%拸X%;.cJP~AS}Mg# b)dJAi!wBg?~ϲSx+Uk9S֢Bqc Sr*!}<5gOHtR @N$ @=E~$֤#&D` Ki=Gí)@GΥ"!ԣǬR!_!R#GRBBB]z +%bQ:fXCϸ/}>袞G >zT{@Z< ;@5^hH^0~­H0cT4?f# .Y Sş-_r^V5n}M 떿2KXBbN;S\Fp+&D!w^}E~$?_Kԍy7XQ6bRM<O~ y4:o><;ޛ7w_GGpOiF3ׄnL6dIR<q EqF>>{ތ6.>q1<<6*-¹~8ϼ"3;G5׼;@w jŹ#k`"浚#uu>單⫌;ˢjȵuXx `VTG)7S5Vw")AC౟~3}=D .o ždl1sTj.q4H,{]@..u~HwmFaXĸ^ӴZF/`Y x$h)"gXFs#x$L9v~$,}_?4[ x +(%:C,#c'ik/K+|nPwxhQ6?R{~z #80=lU>j<8ӔvQȨ2{[n/G&w:mŦl&|YHX\>^=݌؝1qм!ձG_:&q~<IzJ#C?Cs@$V!OibXkUm{ݻ;U֓A$&Q4?R ~:57`%Hm[B#B@kˌY@-2ȐYkr*H!A~>K QrIr#޽mٶtI%k(9wk,0%&)!.r.p_l ޣ\?\-|UGLzP)B~BID"RR+<2% Uxe~~N]9X*0-E+DjedTՀɽe2 jVIc8i꼒TӖWZ}FdGuu fʙ⚌33Wj>Zmejz~K9ʵrcvD+P"9C@^\7Yn}Miv96N8 S9?5[Pڲne`Y䵶z}Y3[GSw 9ȝlhŘvk29cϹ/R=w% W703bZg\e^  C.7P!}Rg0tOdˋqz1s6 _k2g=^hf^HfMa 7;@\-`{?Yil% iGoR)c, F~mTe% 0Zu3(N*ꢑ}6bUge&c &cT/%֗i^U)i*h凉'HV Ƭfɯ y4lEwJ9NM;BD1EJ(HYJux1ޥ+ydXJ[Pq*,͆XpG҈̊NhgiEGQLԇ9--DzwdžB2v[aRDy++w%΀S007ۜYYYg49eRSNw{C>xiqyMOH*ŷ5b5yh(kz íPW:Κxe(3\hD^Foi=_=n=8O=_ 6הAM9N俉eȤv,6"W|[CG#|Y$=|$[/&q@Eyen:|dC,K10tj I]uh*T^ekTq ).Kf+t6wn%&YX~:C߼~]<Mޮ=CT\Jַ-˘vTv北8wkf`b(zLleEw#i-亀![^?^ɯ@SDrkyG; KD%n}lJBZTtZGKnU}YV͞JᷩWtie;鷺_oBף;dA/ᚬ׼uI!R_N>׮ñ.&l]$!B/(mڍޑZJAێ{Kڱl.[į炓bRl _+\ߕI׆Xb+ Ŧ$Xx#Q:%-]2RK%REdɏ:%YF;#9gOV\1Uֳ-ژX[ 1G=b J3LԓRϟo@' e|7ACI\r+ym1T";4nc:h*q~蚆z۩U %߄T -^:h^.u e|DA+'.HjYRu!+AVhOɷ"1C]C/a/(<|y.׬E?EYa:ЭδOR3N~:C8OgJuw9˶g~$3kdmL]IE_:L~8}|+$Ie̎/tXbI/jOT?J蒌2>W|O`F.}K*>%dgL3'd(~4~8Όc{3FUNxnϼA2I;ћ:9(3=p0A3-%2d_Bp?s D @x tC210 Lr!9elx瞧ty4Q*;Yq#ui@_LX<}GcE#Z3.spɏNVSor.4YV'8nC*![ 'B@V{^#j 6pfPD"-SoonW:دy{|]sDsaM50v*4axzqC~0t$ .HvX0?(u4 T#7I]ibB\][׼:4Yv&K Wί&T,1_ct_웖8g ']DJ˫'=T*2-Oڡa0Rk/ ^Xfܐ.wE\@Z8 Qr,a* hB,=q@L!!P˗ƣ 4I*$Yq"FxbxP$R>T? 6gP4X m0s( |{jPͅ]|Yp_dM@g O: @{Ԣi@~q9&aAVu? 7V* ٛpZxb\p9aa3acS~7 acfYl3 g 20g=݋<AS>\3,B TDWq;]S kwqaܒG(3dӎw%e sױ$|{Au)_M Q#2?̉OFCfGG>O[&$I 6FRGR6~~s0ɣo(X+}k2wU ݟG_@X1yHv}]<;e;b39ԩ3hVf_m8@c rF{//;ѓe=vW^bB 90Dg#״`l͉IbMfq-'[mhE;JH`'8 ң>FdtgUHNƻ^#jf{.9ov$ȋ9-8cVYr<ˢ/F Q[k;Ecͫ92 Э?LN',Wq- tu%tCs ca[*=fMç^t\k0?ҎPhorj{qvuhNv[K1 zyOl/(E)% uDsz=)_-s+=:'G6xxb ǂI&[ LJ@ yS~ #N}g*P&%hh{ܻ9WGzP)ERMt:wO>?!DLw⇑<xP!#@"ǍG"Z p hWB3c@#Vm")\L a'$FP)JٚP]7vCfT~M)C32pgPi)I(IM8x"tm > $Rdj>mIZve #RU(NP&k>J5(&]܉_dfHln`+ɖ,r%Hf-P9 0 x@CAa^D8#Q!{縚uOQꖔ9jYy1&Q2k`*yU"u0H0ŤI4[Ĕx2wɤ̢ZXJm܂3f6Ye9`G_m& ; }T)wr[QNE]h6Lh55gٽ֖*V#.yԉ}4;۴l꿣tIO LUTk"P[C >eR2ӤZkg.۴6VXN8}]Hi* -笨ȑ0k1T*r.ĶDvx߲f2fle/!-jY^sSnE;כtBA;8-m+n.U >[VE"C)rW*-D^TIRZ2 ۨ}ۓ*0w)T͊+b[o; .TISU0cF,̈jWն bwgHR&*;^ʯhuWt4RZ<1ݏh0,}BYrWns]j6q{n]'pKۼ]iO[GS sG%|.#jJbˌ>ܩiYR+N i,m` g5_Kv>O63" YxD=>M悱nro%MUMra>|7"'ƈlr\7x37KSsj2mhC :Vn}@ߴN;0P>o%YsZg60O'Mf6>}s-k5o9~ Iz̬75V0w0=Kqh.G)a+5Z9?Qd .zK AU3Ca'ɾB|/Փ3k1L2@xb<[C-* (H|8Gh~:VE)'5NoZ::|;UCZٰX;[z1׌j)4'ȽxbvsЮS`$\5\j.Ev yG#pVFAfܕ9ډ+_ib+w8|76b5>Se]Aü|*6E̸ 4mEfbnȉ>m`He18j3#Ky[ڃ/77xkzڹ>`Z^Gֲȇ,Y*S| ƾ$7;*4v@[=bpF"N7rs<ßb0BdYSqEwO1u>R#kmxez]|u]#ZeixAKoѳfMR41c^H0.Asn1BcZ\(5wjMǒCSu"jR`@^䀌q s5Rky  oz5j9; 2E'k5'gz qڇ!7w5~coZ#}2k #\91iK-^5/cAoPos{Ag!t .9OEdI_cyM w ^rХt#iǟ6V!EJPF dßwOʈI;k֠>ys _f>fNzגb'Z닾}h?@V>iu' yN un_|}՞HԖް\g57?dzZ1pD@n~_Bm{ЀiK0w兿$WQFs"^ZMɝ2^y!)fj~YM5?沘Eja q^Q "Biz^S7gp-6ݱfB~T"{@gvr;{, UxuJC[vt0MÜ;8yJ<s\x̹TjBM*og҉Ƶrͯ6vnuYR7Lf- S?1ZWxܿè 1/l//>Vo&51jgavxOF~޿0~i"G#gRkY~+#rEra3'baXv;cXw *] v{,* \\vwD $$X]GCc t74$3v1)n7~zHf%K[Y55cv4oL"KZ`{1Op#QE5 ? : +#&{!:PG ?b@#]D,;! wsGX9v8ƝȄ,cX!BM ,dT`"qHHD4s7Ҡo[YG ~*23v{2reHwFtUPF.*?ôa] ?zLy4"`۠oMw5Tٮ6S/FANǬ`-o*~&|r"ZudYrD,f}l<&Փ6o~κ"ήX^oI"HMLXr-,6Syuc=>5J9@E#miKQ/v(abT*^kѾEu@ڐfd|рh!--W1jq '(XK*CXƫZ9hutWFu˄fJ(3Q8N\Ѩ_&CI̗HC%]sw<`Hmuִ5퍇FfcV6/ruu29^bZ0>ր~.p7ȍuWtFln*[z(lѤm BVhG͢%ӬT? "[%&ȕVBȊԔĥᑗ獯+Rd~rN$µeH W^y!nD`S {\iɈS0"{+Ɛ" uҌor1'òj0R#_#1x|^)a ]rxYJY*GSy7:EG:"B}Fu .0 @%!5ʣ %>ZӨSTHֱMB{FɲAsػr/]FqfIUIf%25֣X/e5[fϪ4j(5E[^CDzޣjP軪3uz@, B"&si 0#Ro-zHW). I]KJht3Mخe .Cڥwxr'BϠ{k LzNRј\]UyYDլPZ[9|oZUPUy/TDQS3܋ɬ]E!d)Bv(OW "^ I55u\^U/0>%ەJ^o`Ms5-VMk4ήr&& q$WWL0w΀; }%Ԣݷ-R쩎Kb#KIizhu%^=Y.3m{'(I>O ԙҮ Z(&ogE0%0F#rON1 UuBkHO,$gm,Vѫ)Du&,FeW>q%Hz,3BQ)I&,c+\+{)nNlBzJQHs@21ݼVZYXEQ[cZ^<1JVLݭR_ERP7},iB_plzIͽu'!`܌ibSίÊpDR*Y2fWA+4ЗhTE)x "B.+ј*:e}‛WX!)dsYPmDWעv-02ʂ Qg_5}TOGb !FlV!fY$^ײJl+n[+`N=8?zV]Vؘ J ǁ"=Z[NxV44Q(ғ;^q<8\p֟0`ULa8~- no|^9ȗSm2}{N?+}zC)x?[(|.{|[9}-Y>M~ttYQ0M|7cSڝKAtqit+:BCM]D=-LVŃQ+ܔiIQҹ +|ϗ* ?˲].Q\sZ/ސz^UJ=],NO{TNg\zTB= SX]Irv/#G 9vP)aK|h*0cQ9Hc<1%qTG̢, 2ͮ"e0;nխ:=(OxG9^dFaQhY8 Y6pꪾɚKion58olܤ|ݓ51G<Wca@MIzE %;E^WD˴)&@>h^F#g<ή E| giIϗ_ky~'vQrndnק~e-ʧ h-ߟ3谋9w >&bSVe jBk3 +rxxϏ3N3?csoރoG4Tdbm{4%4F{$yqZ/qJ_xkǩM8-՟=`3EFg_vG h4Ŧ??v*%gBْ܅O/#E96Qxz10a4oz;IH1G0N%VPUh_ȱ\*Iȍ%9 I%a5j?/m(-̶H[HiA{G%[(p@#/a wƲnFv&cnZٻϞ҅,{ w19iF-d❈y}Q-8*3hɑP>4ֽ!Bvqt:payh{E>ρ2F f`;kTDŃD|r}Khr/C2pCt;՜-pt^+n Pk˦E`׵Yy"/;Z򕢥,.HDJR=!:Ec!>~ǵϺ4pǵGKM]tJ_xz;|Z+(^?M ^7U}޼^FWm)%_ KGH!DndֈS>ɽ[y\`w΁1΂~]: ڡf;uu'2[H"=Lb1qnE?Q`TGzG^?X^N'^>IޗP ))+/?vρ+XwՑ GKjcb:lP|9UMռ0ئiOK= Ɛ$Ib0$ĴE§-.7gː&[ `jJr3No/KǴ2n̎ؗجCHØ9 `4Y$f|08tHRb8 H΁nRܘRI#KvVGӛD [oDvQ"΃:6\G""0 Hx:_ݿduhZ*ݕz̏aL{Jp;{Nu3ɏ(БyGZ}

m#*){"o]9)ÔZbTbNGiKRJUrY g0,atV̌l="hQE>GӲC?RfHh0q-i>py:RM8"B}Ԇ"6$W lxBF$Y]؂ G`5`@@@  96G3A@F iƺ=Gĸxb`I{^\q?((b(@K R F܉^}-/9?N\ޜʹzz+fY=پ͖|w0݂԰l3ycuŒb]K~}&En\1̹@1F.34Цhz#%U3ZNۼrxrI tc%!C8e2MO+l*Y-,g|eCL| TwTuA)p;{\hO]!9|ύ$AbxN?wz`3Fzt&&r\@餢p׻QyMH6o5{5E]T+Uҁ|ң~* Ce/~ȲR Jr߫xG/-rH#lk:HiIs'XZM НI!9yM= u[K J><-% ,oZ7Zni1p"~:., |Z9d5AnwԶ}!kZ,/ h|+ҥ4gW ~L!-uPޡpkVv^VCFbz]B,$1H_L6 jpt2*cfO:AC>KK)8y1"jW{Li+kuZ<|eQ@21_Q:W%|HSk% }Ǘ\tŽRb8V זIRC^oV}TqZ=3|RrE´2f>Q`*hd2 vaՓcܼ ŲE+l3FavZPk8=WNT7}9[ASƬUD`g; )T$Ք>Mb~N!^kƣdB1&2UFF2QE\FnZ m9 oY~YgӜJ ߚ?U ֕=`Jy G燾(UW(ZZwrz(b2h.i8hGנ$͐40$AҚBc7oU GCAt묶-19NeDMK8oy ̪^Yd\[O#~5{3ΐqXl`/E<uFjh: {?K"t>_k/'lbē ny;aԧ17vſ~{1mh^=Piw0? A-Qxn.WY!}Nq$zr"xp92q}7Ud> Kɫʊa2pդ]VJC5ޱ96nNRF\kd#] \=S_/Yu~mv߯)R7"\i994YuE/KL3-=Uf(duS}GrIu%Ș*ѱGK%e.gz%%L;el eg?'jkjFBskkO^ ߔ.%y0;μͬ"AET[s:Y_SVu f[/MEvWBn] }z W\bV7ל*n8DHۑ:$\ρKLm$h=,pVDag4cc0K={ֽ=\ r(@{`Ò)^,WmNHL5I}7=\YN+ g܀=)[(C9ՍٙG'=9`-,M4.Aaq-Y?n͕w߷$7^70il։w2 Rrug4cV[qz3\於0׵W*pranˉBޓr0,%;+cAQ7,6ܲU7X }+b0-$5؞q5!hF&|F~a[8!qb> R<&4 zydzg-8`®i ^>S^̀y=5ٌrhzͻ.E-$T_`5"zn?Cig ĆR L5T"#o|bw.\0 ŦR'0;ޑC&aZ;-kA aE`VJ7hbl/꽰ś-ᆢti,x*d< r5Gx g2 pՇH l$v8pN>_RHe㟀8hۆÖ|qj4oA?CGmk-SG]A8p5nQ?J;cLO> xF˽Q%ﮍzeEh25 fJpcI͑7yn w)n*wRyk:*5fl)T k[H+<+~ЃT"6/N]Uy3$"%.9\.zj1Z [}=q6|YE 33N֐W{04Yv_ش}$_Y~>t϶IJ N$=}]̚=Fv&PE|Srڹ2i7&;g%g;Y| `y<|)V0M<q`%LoE.+o9 `p,^GھC\7!`jX3s@3V ?ђFe- ڕ?G;nwv춻r[BhDaoYY2%$۞F˄.KRF,τ*l}Mo)*:vlM:QvD.@逭IRRzzg2Ffݮ{KlmV5|1[dŬ%- (' P!"!N@nf(v-i-9 *4EɥKdTUb>V_ToY& \ tAdP&kYGchsZ)X YVꅲĮ,τ~idPRJujw n+= j%۳asCyz9EDo ]{BgZCN`&էb4kB4֐r=qDٞk#*}x!0,i-[^ 뭉K5(&W)!wăi=mFaZyy3N9t,\Hہe3j 3qQ]6R4;l=TNj`y_<2NKs"b̊/5hF'73Xvb;u,\0QUxv5 LN@ӡKz_N׏6sA35Clp^跛7Kreve ś ]YRt%^ mv/Mҋ3h0u9҉"+N 'dX-+5;LNO+fR ʌ W]+}3e"qힶ4:˅Ijieg-('1'Ο*WT/`3ŘpqP)1&O 9&|ɱ䞆 [R:\3K򤚸ak)dg:;#Q]E :%5w!vuZ>kz Rg84ona0 LR"Q.Ja-$XZ+݋+қJeJdq;lp w40$Ί7f!'k5&~`ty(( i$M6mE TE+:\ϭ sG&&@3ɍ1>u>w B2oz#:G2X E}s~v|͒9U &<88a˹_nni#\$f-lBG\ L,(dxexgjG/ؖKA^S+o,'q;QI~.eB:{2n {T6'7b !ɕT6\+%/\XAqMܞq-&\`' f[;S }͉zj/'RiL}36d$eLg1Yvs}o'|oFV[7#ͮ7W 5 x2thT5@ ȢbWriY\rfZuJڐٞE`Pp9*\ձ#u!A3zG dqyNP 7~*SXa:wB+/q>^Hyw`{2M,r&zܿ>1'q2-ֻXz9oZu_E!ϋhBFVe"W6fTOcqUv]6?lp5Sm>ժӇlXP (^|2B\k2>j"[1gpi95^^8ҽ@R`^ #Fχm|I,d3^I.x>3[Hʎ(T-'ͭ0XOׅӓ4/^g8OUg-YiKCem):NlPuܪB?qqw'cP=~^'YrEFoG>{]G +rGEeuÖ3]mt&+n^Oe{~OC?&l|{_?#?%3~cV|oqu7t'q|t21WMDu5YGfI^ᵸ *2#_ʲIy:# -=ʱwX/Z Ha0t;F؍`w/..k=nb{ol`4&jFK\n 7X$7!wF-#n>x#rȷG hbaޱo|7F.ځDML`] 0>?kxշ`D1_*Q-UΊ_F1d>D8u}4dnGkX7u-Or7r2=Φ^ K8LR:g{M*e:Wu{շ + p/?#H@I 끾z4ܴJ g;*69jtVnA}kw *`H (b$l6=^>'6}_E:Eݢh7>o` *Q jPK!A8'Hل |a4{GrД.~O#vAP7u͹ 7&%H2ã! w4Gt{a }V1?M8Ӿ_D׾q:N :VDt W U/.Eīl.=!q#00{~Bg] c41}^4M0o_y'#C4@#U"=KhM !dKR-si*&!0nr9'Z\.I |Ǡ%5qun70i},W=6##X+slHeHB+H*att2~ItI|K =nnmw$r۲rLXs9+dI𘌈A@AQbi˶+PCtL?B 55 RO6Ћ~cK *Jg ڸG|gkD 5yx?J8ԕ|7>LI0jC鈄NlZxK>؈pѭ;絽wxV#Ti緥絿fZ&6ٵʼNҊ6@r/(%YnR~ _rcMVODǬ +u)R0ɭ.iWUA nP 1<л;BxeIe tVtyY$Шk$fm[>]N"Ԯ>39R6, CM}m2Lt^(Ê ZmB{T Q=~SxXvMΥÏ#$y=eȾ v Μik=Oa9V w3GibFWn1Jt%܉NSfFi_P-1+fT75W`+1ޟGq=DUSVe 0.҈Q|#-١Z!KCi療6;Vni8p}V{͇ya TPCFg "xuU1@'VԒܝ,-C$X$k%jJ))Sv>lZ|aqלAjn [pzUjsQO[- ;~d<KFy[^ a *Iz[c&0ܠ^w-]ZcMczN¯}Twq|ކ 2 \R5=H==&Ǜ``V8#Wr++ g;9)*7,( .;'P  T碔Uq\NFNH^E[_yRhI?E2$[whg^@Y`[Ź0 Pfza_ Bc7@aY0(zQٿAE1@`z vTh8ϼFD ! 8++U 5{w}׳zGŎ"U+`+i؁^9 gPb<|c3Ϲڽ?I]pnTв3@ĕj܂dvYc&~Yaoz )]Kz@DZ?GO==^Ty6=.A.(A-6kT*pYYxH+(5{؍Ks{Вa3,{A2 $ ( F r}q^=4iLzXD\ 0 "Ya~C1C볇8(l\+@@L`KN;u媳q3yϗ~G8ϏAVVQcHioGn883@3U i/1F ]-9Zd"𷝷v!}D<$SJ߷%0&xKXpxkKېWvv>;@q :+Ŧ;(PU$YI?%)G,Ƿ\>Vv9j!v]ˮVmЮfƦ$4 /P7_B)pyQQ<N.?"B),îL\BlF5c!9I DsVٴ edU~EEFu XQ~kc݋u5@Z˭9⯴EՂ[pZ7d)ŻR;1;][׸:5󷭭nw/w۶@k pe{&wNkE:dR瘣bs=T;Z/1[nths ֝\y!=LhW;j%M cN0bB"&mRv%Ղk M5J_W$c&( w9?ăOu\R"V} vAI,FL)ž 8h4,2GU ܫhULHU.PxYBi%6~g۰3"EZ6$+c~VHr >ژ0H>Mry|iG'lGݾ47*wj)]7`M:"Z-{j {G]t>1lS<>鋗aӄtC@{-",P[|iz~7oy޿(#ؒRyMi}A%YK][0NmXH)I?\!%Τig@=5@PE']_#Aq^$ Jk$ײn*N@CFRiQ$)MG0lG|1&z8<4 H%M쐖qwܙw[Ȟȟ5ΐ+V%D4x}KJmggr5C:{ԉtY7Zyen]l&ohY#[ 1혔c)"gE1T7dI*b])3W&XYmEl9zL0/"eજΔ sLyQYQ݇HTk g2<( K74^;jd^M Kt>~wր `-LwYo,]˗ԬF7 };nd}>5a[ͭeOPS p8!v%r}x{>I~4KLKg*R[42|Ni=Y1-5[P]X%(!?ψkMêԂD捣VjZQ9{}(eM5g+.%{͆nץyn<#یuE8[#{4j= 6\ODGPʱ𽕏'} -h2KJ$wF P[.JyzM^-<4 n)]~a@J}I:A}:쓗5)\So;nW'ë0ZJ؆|j=< ml*GP^!5h =h_^g ys0OwG8Rl9:blܮ=]|OW q:Otۉn$d1H_ uZKhont w!aOn_FK!H?eWГB_G,s4E)a<1Q1A,vw!D$jD>UeqBT&萾d&ŴiZ;1}z&ΎV:j3cuPԫ[۵7KkCԩᠹ6d^*Wk}>^gK;/;uV]oY֢>\Cd*1%8|G.L$<npP5 m=z$T^҉s&0XazJ[' U[PY' 4 ^H2f Br%s.}#aKJhI!rԻ'%/#M!@/I}"Cf %3މP>H/e3W_4#$:̖ax3eީ1X,ZCV(IL(٧ji ?> /&]N\2:T#<9_8S5-fr*4#<R4PgHh̍Gp>2˽ᇖòM;8kru8sI)ədk/I[\)_yNܠ~C j,QRRn=K6So:<Cw$nK1 mW !<4_3 @`vc|ff]b%4~s3vxA 3ނt2ڤ m) N++; 9[䏊n䏌$n9VJֵb_&7}us!{m?"IhrnLJ6Uͣn?0-[指 P(g$gƯo(aw yg g'3Wȴßh7Iqni(curkPskԗVI2{L6!MG7CBN Mz-M>"­Qv<8=M;2{wx41pC7!EnF((H,(nXY @wFJ Pt3fnLuX`08Ԙþ7/TiP +$F &i"5dXi𺥜'VnxD/;$mN4^*:SIzTJʽ9Q9zZK{wRk?%zN~@d6J<Cc03V!U!8G#Cm:mSd~!Ӏ(A^,-҄Đзz-\MWwIoPo;8|–4WFA6^t*QCtRdHgIz@hd {}vUֶۖ[.%X$®eed$0^Bu, $@ ig;&uݳ)mb7`h{U[#%{efa޽-F󋾗 R&\I/{_ en-f%$l$FQtV,|~n?~7}eى^k_Nz'͈A6٫3_yx\W7I& bȲn3*?Y/^UNJ\3W˘BݣpUɀm]a!v gƖܗVH^ ۑ 6LJJ/US]j BL\{qaxݪcIf⵸PW_WD$@\"-h*ufO8wO"jS^6o#ۡ"fV^{yw1dB-gf,M*2y$kעXYҁiz|~ȏJ=2m2혭[ٞ#9xU}vۆR3qDr}ΩB|V]%#DY:LL.g_x}4FOO$D2{k0 s?TsƵ*6kJRuP\}-};xăQ*xt]ED6H!rl7 g*8Ʊ8YjWP QZYc/!8jB6>5ѣC>#k9hD=JT䩌\ wt|toZf c0$R&꤉G 1Iyq kc{Z?ю{AhdL? ptI4+Fv'++XCͶ?YyقuYH/a^ySo_4 Z:N#&ܩ"Mͤ-Y`M2j_*{sd5<5yIZ Xp˵/m-px: 93֞u1F X ɱ))͐+ң7 wN5| IUeA$+UxӬ(i he0A`8:gInY*2 DvO$͇[֬T;u'f6vMCf Һ.|5s~Y;I*_'2KڪX͠Wfe7Xy!r) C.ʚ{C>~f f^F{3&?󖵟Ia|5Fߎ5ZZmMe H%t>}-rDr]}@EhŊpgSPH7.8ۊ׸B|0ЏS#MJަ7ņ+~ p/ޟBGo&Gj,*fՄNZs󚍙acR)JOP#9I ï2Z+`^D/Zm![vauZJ35Z2JK.h;X %-搟7 [EzqiM9#fLV0?9ͩȸP1b뻜f>FKfW,aSēDdÙ FIgeIk=͜z](s0N26YX5Ltx=/ŕIJdoX4w3(0JP-:S)>%TaԽ@D~,{ O7)F;:r/{3.B?o ]cW{-䏂R(0\)|m!c)5(fʢD]t| %Wx/w1{Q I`?k)T%r9LF6GKSs̯3Qۆ Y4m "gRzqR7o#('ePdUnLJN@B%1gsB 9</lѨE:^.g|.0’sᐏ (=T 4Pk޲>1`-P`s8 19N]l| K!ɚWa>0,#DJ+N"Gci&K#:;"NJ>q"DBGmK_~!uJ;ٓc@MMi1Y?IJ{D hDu<;Jhx~= ?C"d48]<4X˿$~ ӯg6C4fx#'+WxgK &O^ .B-Hڳ -1Kme88|?}?WKJ zļ1RpE Y ,#FvRA-]~՛|z|s0B]QpqV+>G#b“Gwx?G${bA#2N3% Jx@?3@P`\)  <77jhؑ:Sei˱4*to0{Zǐ{{VtOr*QC&)^ihAc.ޗ$߱;uI.tȼA3ۋgS1۠c !H'e̕t\pbq2N\Gʈ!-b (ĈNxь)㉇X=,5 3 hٴ J(1,Mc2f;McZa Km̏ox콌8-W%&r+R1ŕ+] f9sK{G_Njn$,/Ư9_}6ٜ>KZ6dA]w`a}a30/g3Z2{Xoϗ`;`i#I4u*Ymr(Ym1\$VVU$JH\$PUΧOPw'ePqP;a4b{/7J"WR& ̕brv J'ZBa+ %\$>U0vWUM]w,L0!B% Pp*,@iDNԉ7:,&HBPŒsD}vC'S]2r">4SL:8WB~(rEu8Ԁm;_W[C$'rX%xxJ9J(q/hvu1z/9$5{vϖ1`e0C4@3U!3rHFc͵܀k6y+6ouz!H}D;HJ6IԢȡI$+tm"ࡡRtڵ! $`3 72 !R2Y *dn2O}>$5 |+DfF;wyg.[e֦6sM[L$ʱmFȓ H1> B>yIO!ZqWTIfNy;Jٕ#ѡs31Yӈ(סB $ФkaSj3YKj\EWCATtKŦKV^[C5Ҩ%Tъ}iVک퍲%l'  %YUYSLfwUn^2Ye@3⛛e=]:&7e吨2]RIP%o5)!ncw)"5ʵ+=rCLD=-J|'|&iN7'u, f^H^wvkKM 1Hx5yVǂf5%o?&7uM;|X[ּBNj ޼K8&_Iy)9KkM,tjRT`FYnĒ~h"yqȜffŨgdY5aNON7- &"-܋=̄r9 zaVzB.6qFJk[+{ ;EY sQ2KBe+oG02,RSfZLAŲjS\RKPT=0 uv T$aýPo+k|*A\t=+`d<ثT.7^i4RTTH]p[?j_L$#k(͉/ϗp`Dn0[X+"q2rL>jQ؁=ҧ=C.neoN2-IϥMD[Usѥ5\-#G"}o)l=SB'j/6[KZ֑/Ow~bԬez2@jB|(?euǒH`_PK?%FG;%sZzC/8,BJvn 3bӥ{98,,ŏ4u\xq']/:xRs~m.o.IrSW)6 `YHӌ 5u qr HHHmG*>].>BRRc`:DkJc*jI,(m#@IQ: ú]2 B K>ዐ罹nl#)ilF[[/1b][(aӼRp,bL T;:"޾t.]|2xDL>[Ժ+eP;3M P)s-ЮH+dAՖ{t_:y _ٶoaժeNԝL@kO OY i*ҁ iҵY W:%_2 *U*UJ Iz6vqJq68XNDeT͚SƑ(*\ @MT-`>zT'vQB&D$*L*0T (`ݸO|hϢ`|XP>@=Ĵt@l\h P~0sx,$o 1 6m 7#_~?gl mg2>/LrtU /F7py3Az6RCL!k01+.Q.}?A.F+a\v‹ e~hLA''"T&KVW@MeCMy%&; 8u k*V?Zmi7!t҇\I$YZdFYk\߶Ed٩ 03F"M7_fMױ8ՙ@\$1eu}+[Ya7}"y5Bn"Arhnm ^+CT9FZE@! "vոfm ]\o'?.pxyRŃh*"AgڣZ0n Žq{Q>9ygqFF2at@Nk&VԩL)|ߨNY]<M-Eʠ` xvQ3ggz:xp[(JP-(M)gw Re}[rʹ0XT{mॶmպd Jr@i%P 8찛S 0PMf<Š )y!#%0̼0?H뎬|3G=IHLkԂBl{=ȔS:@qD0Oa4/DC^oe 'zwߡ3.o7k_/<.f>1GbΔŹ>~4["DT]B1` G"DGS-L;ы&dD۩GaZR>SiiKϓ(C3m$f7 S(Ablq8<.#t%A+n֦b^̼%?C\}P<`xvXg鬕%L-pfK bPHiUd H֏FgJb:cEеc %zFvp9͇A?$D| )aYۈ^#$r1և+~xK1}ɠPmCt@#V!}CcTHq,V8.5:ok;Vg7͘sa=08:(H$!m L Җ\V%^j߅}.:{MdN/=0(0b( +Y I%͂X38{v[r[dZm6n$ $ D P@Q~@@E~-ә!ڃ6[ȐPCK\KtB\2f]`SiVIqG\<pt UczN!K-KkiwY`KgΣNTN4KȢ@aWo׹DyF;Mеb{a/V㪦g;۫lu[G' 젣K\)vdLIkz  ꬀kqqEWWFC;~ʊړZklQt/1|_r"/цJ^{W,%] uc.*j}_/jI%oǍq (ϫwf"7ԋ곷.x71ɳ}EH=G̃F.W.\Z7l,O:7 +~mP֥'fNJTgs̴n gTS;滸}@b,WGN}8Iθ9$[!JJ.;|%'"&~YFܣox 8:~8RV6K wJËBW}vP1>d^Gb5j-'>F8$Y/&1gOy| *AfgD+ᶬҷ;+މ7•]ͼΕq+TT=! 3cǎ(tע|/q[h Fce7Q+[mO 5}2ezy8,e,-VD}\.<5: d(d9LY"4ͺ@=8Mk_~ETJz]I-*ڏNQ~򀈵z2W~%?LE55[QO)>u*tW?[v\^ۣLpRt) u&=]B(,VS<Ca3?r\}kZѪZ{3_ؕPLa}_爇jhWFY ~N^-C)~BY&bE59PB&wrMķ';Q}M5;u^l+aU 記Xݏ a}59䓡\t/~MOҧ(;rbZ3ٚueP!SKw1R9YևvP;m0g5#UK Ue|_mܒS6ak2jN%l_XmKise@W|hw^#^MUSYOcPA^UO,UB,HNf84)(ܴO΄k~Au%KŘz4)o7*j Yԫ"PbuHmU7tTB=S6gl>yAgdpE|H+T揆(g[;/#_Ɗ:tŌ~ÒIp\1IBT#mDC+8~j#0FSe0\u#@`NɣwA>u )NrG-v1Gwr|7?o?['vvzCy4؋Ѝig<so' 36B`n0)x&D810 Ql]Qyˑm{F9OQr?(itH2=#ӺxԨ4+mo@?DB} v0 P(y4܎ *4H5kj#S{EϘ4 橈 %,{;w 5#Jt.dCLN(M2:]4H)6I<ԁRTs ojs UlqUH WxSE?(JSrb6X\fU`ae!0v܎&cp+cGIftjZefic49aHΏͮ3~tW\5d钏s6W8Vbn8\ǍqY0i|'%bt*LcI!v:cͰi\QKJa*xc.(E;ݱ%:Y兩 KaK@giXb6qIUk'5',@[].+sx.YF`DP 9S LlQ Θlwժ˳ %CF@ ǙȆ ~ǕL9?M]x|_} ڛ t>Ա TF Q{b ޖE5>Yhq[ƖҀ.dy;CU=ئZcqObGI5i5c@$1 M+> $\la X,\.(}@=/,hC@#oV!;066ɮrb07 шA@KҖ,Kieo[eVNgm´Q[{M ;k:ToLotdȭ@4KwBX%x@ @۷޵ַn7dT2)ז4$9֑ei1!4.u@ @'!  8C|H6ַ`GZΨo0$4'VZӒ4SmgSwK z++J`*)yŹbY>G~ÓE f_%0XJ[fm#li7Lj1ئxuhWsp t';6p.IY9NfG U~U? }ү?~YηJwv+I+ސf@yh{FBciE+e %jK_4`S[3swGLoίF5Ϳ8M9bUMޝ%HK;8޼n>*Z[݋'3w*,n)^\Q۴? }d{{{iq)vL,$̏ZLPNjv(.O5U;Ey <"_E`P69&&(6]۪ TW&q]-LnQx5kcQ-vW34f~vu-mZ[KBJx+TٵR܈ ;lӰntwj{/wpná6W)5"W=6ޣϨT֋k%zkfJ#+K̽CU*&7}wt{1Xp,\g=w R,1Z9)uy(%7[?VnQ:353/+D[6Hٺ.$TM/y0`}B9hyZ̽ ,جһ @JQnRSyGH\0Y話,s^QjPDvWʹ hM+dDnHi6dXqf5y,Pi;x`S "="3'O{6½2ÍK޶;崷ҋ(xϫ${{իpm.xu:r$k+r楖ɽyJ-GIoHaxFsuG w/--$. kU,*Z-iNHCc"ƩK]nClѷ5,~=_FPB@̡̚GP8kjb 9XfTk4ګpačt5_=0g[; ˖̩܎:~>EC]q2LW\ A\ck*Y®8hjsCUb0U%ԱC7WT!< ?;W+{B>jzű]W*tpgfm@X1\Qqߛgwj+:M(;5aIg?`a~\v|[ %1Y;6`>&:Q}$>jVy%B|K,-cBA}囿ZES ~`)͢ Go?>Gz/~'qE$zEKX/"^OhS(Q6}njk:LjʄJcqr&_~^YEmƉ4g4,f64br6?"*+R`9a%Z^b{Vm,مбr.4m_V&V|l3+;噧Ia+B`f5c5fbrA#.q|E)סCoi<&ߺmlqQON 㺜~GL&DyHpIH897m),ϝ/9V_~cx՚~9Ng2`a0>N:%왝VSL[m{E RXlv99ֲ PY/ax} :ؠ~?sf^sT[5u6Ǎ2Λ&O9MfӧvI +St}r)!W;̩Y7,3%3h1 Zj-QmK8ЉAa]9'/g=ulq*-9Ӳ>nԎi)X'ΎrӝaGi3'yGY2c7ҁ$YbcQ՝*}N\%" gv DwHݣ\J%VR8'G]#pa{qOUu|[ɥbXto&>؞F5hiݘb*MIMۤT)w}W9pz34(ʜ6ezͪNd(~@ȒkOlE[T^%sTNMvf,hh>wΩ#+Gf)Zbo~rSB}glfr#Z_#BuX9i'H>H?KQ"gMgvqy8J6i/O/ cg՛љxF8{c͈E$uN'U+V>6owkQZtӓ2zblVN:.{(IJ yËp +۟*GeY|DwFӀXw0M%Xu,Ala(}XP~g?@Eq Swdu' ݔD`x THyJTUSp2=Ty>TAJ~V҇bK0te9\U-Dub[nI4,#[) 2_)cEL4a ALO"oЛ>dgz'ir_75׺$m7 oӚx !6Ġ HЋ9MEqQnjȋ RT9*v8qT,\`AGtAۜ/5S?$PGB妄<<@??P^$P\Iz3q_o"0"rcD2tnDɮz9QsA:+MIAE5fܠ_J@i$S5蘾ÙyF&i ?aA"}BIZ#4ЇWFl vY'j͑CІjz;CSD<Rш$E}E۞:ү AFI|@ݧC +KճI?\$ZVp?dN' ّXBvy i`# =&a9dOI7jԞg"4 i%Cir-kU|poe"<ˇ-VLqƤ"8$"z)#C"H )а),*}CՎhڼNdxD6px3"$j~Is}ඒƆ?Ar2@nd2WW QUjqMF3ZlhJ~+P/) eԀ-aS;yˣ1۫3Ai)Šd6ZmbXl݆sZu;]4:nJ@#Q|{PȳS˯$Um#:Ȓ kcKK]Om~t2eGsOD?lL]zk}*z~{tOhVT~ɻmL lUd+i=:w~x.] 0ȵ=utBSÎ5:ʁ>G۳1~$D.(} MjenR%aΚMx矊 KуVLiy8]R,1P&$۱U5i[j_aa@xZPg[>NU^!Y(Ьu(nr$+[Wi$z̪ZƓ75tEiEҮY\iϦ: 5:Jm&ɹ^qh[!շҫz72ÔBs,W|w샡|އaz*3sEUrTwNK֌#B`Ҩύҙ1B1 0N HM!͏j!R| r#\C. ~&rv݃zz?lY{]s&5SNR~%:r'4X ;pVӾEO /ص+}[]]zlvC,*;DtXgLUK,d3s%]k~n ĶXle #4FeSl웺TTŁsV*ɍjii.ttjlejt~"Aє6Nbby?zJ xBG";`HɈHPz:IV%1 OMMd:\zu; !5;)iygD!ŭ;J6%X{Ѭ-`n:"Wq>v0@ĵg7l eWX-LB4a }khV{JWF{2Fmj">iwG*qQdѪGYiX\9C/) 7z`1z L吟n]-eG}0f#QIԛi=}NAT]znn9܏ޮ!28"Fqπf:fu[qFy۠X}NiC#9EjI5~g1~󳳌ևe4-m9.a}kȾd6{mJm;indc?7C˸ >?}#83](U)Pŷ P{!y H1NCE.& 1lN_ "A)o\~@ߌ_E Զ{C`%prQ(dftYW$AOܷW_"I"% CN5h. .cb[Ev3Pv2m;e{67d*5e閎ۣ2I:q?GΥ[hZRBbX܁ 3|ārI+`AUWLymJr5MIwriTA2Q>d!od8皫fy [MԨ饕<+ ӏyH"g.f,dT:4 oa^V.`k5FbLVkgW6o,`=e(;_r{ڹ q𷻣-vᒘeOJ;"}Q ??􋖃;VGrR? 1*/{؝a‹ >EBJ`,S\_Vc:h1e[Ee稊 @8A+6+=-Fg3b UxVr /a#E`*jDP;UUSùY53w!VE)`)Ǩ}J`BiU֧voOU[Ϩ8AKt|(8PjPWl6gEAԓNm[~*`?*^/mJſ1I):=hu=(^^7[#Uptc~,2x' &7g"@jR,_54?6ob8FMcP(BP-!m1tE=J!>"Zs& `fs8#b&HUo 8 Y OF pdmL.Dv&,; !=AwdUT:L䋧 rOPr{dpDaw;Qj=b +1GLSJ[!3Eq9Q1b$QsFj u1ɟxbjpjcxI -cm,WR,\+DZ"16~Ќ_q2&u.sJ{dtq;-;_:Ĥ4"7Wۿ3вަvndhLI5EiԗJ<9GM<,n"7HRkxu0RR- 5k3c@#V"s"@-I4H Qӑn;m.ݳ*&i9!@(SҒ-Id<8,9KmIʫw@"Nۿ{4Nnl;4 /hlkiNml))/_< Q3`4ݻvkZ%ݽִmanUҤ V#Q_ B @ @$'d|>k✋ gk\%'cbRi -?5[mT*SSb%VzZ\FP.7;R,j:t%ѥmz^p/Fdꓦ2f2b ו99?z׮ٶ0$\ CiҰ+0D|t nӧ@z.IVq8MNM.:ڽ{VIuӠĦYgCbUyk>+IS\]) @m4cKXG=3,Dik`YF&A<_oubwμ#yv,_Шͥ@,zjbs$o* ~*tjX{ŏ3cJm$X~ٵ)mDMޠ&'ԑ/k@"->1|mN` n*k}SY;vM0k/:y0IVlϏNtBT&>\h n'&_k%^eR7J!bʂD8& |OqP(*@p}+ط'B%( Umg95Q!9](|h)ɷβ[pǁqQ-,{G,u(, 1͵ê$7")?v(ER23X`ӌ\eg@!c8,5ͳ䞥OL> J_Tt낫y ۊ g%15vIsKdb9qxluowÎYm<qP7bU).dБW|E]~^A94w~j$';<>;1"zva695IUʠS_ܷ͘i5Ni* -Ma^:ϓe=8iJkC_ݼcf6U4 68Rv+IlĐ SǝuQΚ2⹣#HAJڮ܇p[ +]WS zF*Oۗ6&zlCinW7lh5ՖP& ^g D,ՒVPkŮ:=!?D]Z^$,`H([1D[lo+Q=D:Ha]=C#DoxCTA+le!#/ꡖ0\zTtL4rMruvd/ptV:{^>zۆ+ i 2ǙN3cJJ*Oyj!2l9zUdn3/tv8Jp#&Qt \2_H3]e<뙭#e*#nnD޴8gAV( DoȈ_H؊C+rGZC!|?$afS _ saecSHh N If'D2h%7tlkJk6 uְЫu-O2H)@fig]ї}Zr?W+ZNRPVI0;QX^z4qSIjh &PcPdoc&cطCg y]5}{h8Ia{"ej)T"J WU˪Q)wΫԇxTw72{Z>Onz+Sj$]adr'ē$Vc-dII0 +q5prIל&NIQO3ϟ>dː9*qE OcPݾ Ǖ[,_\bV->_#[t2P"݅4tPGe f^Xt d#wodt?Kw9CX#"GӔa~!z)&J_$#OQ])gV%k]@U]E[eߒ baY;7=PS1vDtIsٔT)Qٶ[$,q g| 5z(VY)FtOY;D2H!#Q9hr4>V1ƲkskVz)FcNMޢ]*ss >1&dϻ)4x"uI.x0]uc1_׋ xXܗR_$ɬoq7wnSW )sJT0sdru誅6~ Q13NPCoFm̋d{5MZP3-,bj$2UG +8SC?!HeE3g&U2΢xV=h":;ۿކ1̻W%&D\)U!j].V%=7a"#w bK; b`>3ћ.Mo=g긏Cf[!h3|MP :b:rڪ@D(\.,8Aaj-BmW>1{b<~z嵻n;?o'>x$K e rjЏBQr%wnǩJ}?\d0ɳ;n * *)xv=P0BYj` Ը3~fI,;"1+C>ovV.m졘D20P,E++#'Մ=W~ŜK*04@=oO##`7Aї`%zq H V<֯*^flSWVRXiITۖwy'mΦj%سdbW9èE@ UģFL_as 0QX%;RL\.cs0a7 #M&";CMb&ECP. V̤z jNVQpxI2y)n=S.9`yȟxOQ /ݑPāCA#"@>h8N`2 }0#rcdh ۍ2ʙv^ "eCĽ߁|ZH(ݬ!!Aol3p``@` 11*w%9f @D0v_%Yy%Xc6K#>47ã#C(t_2J/`(dϗ)#󁣚ݟO#`AkG^wHȶ׳?rvr{ZTc8D%.#^'<>hلr9}C4@3oeԐ M9r9flכ^@H˺:۫ެ/@^ ̠9 r*w%sMr7D~aJ'85%nRlmڬqTe"pAj IAjbh24xrIN335@oKדm,Miܬh~YPDj IH `ĸ||G|2. r92~ Q2 * Eˣ범 \LP]R2KYIH1p{#ՠrر&ն4)ϜXna@ڹշ"z:-#[KQ3:ܓcV륡:޳5^kWV(מWa?t pІH)& $,J֨ oK_4׸TƵbk W"B{ӳ.ꦴ d"\S=ђ15YmZ }yO.KoAdߖn|Tw\ʡخ4lQ{9-g"??gTq"3li9nڷO郺\Z͟ 4r("d^e3 \ +h^ftomfOGwt'i;,2d&.i%1d6 SFC{RWh~%dyu?S|iM7-YVKn. YrW#g2Zєoty7X w0EȒѥ> q+8\F˥MrJ)] 3w6%rI3r`F8: ʴ΋䜜V26Q E9N4J F9>JNڛ2K&6ѫaj2RvF}a]bC)OC[ (+fQ mܫ$ߎ7,-6`I&x֩%W \NMٵ ܫ5M-Ӎp4馛Kt(k\\M9$i>0lt| r(- D]a+?_`+R{){.ig-egGzܒߧEh-"^:}۞c0כh5쩑{ *mL*%mMsLݥ\7.UAdA/r)`g~Ng2?8=vFsJE661b03mKC{8R;q;3i7X;{lt[?Jvg^+гKnez4Gs-nC;i_(D0E8)kÏOשcf_Qdѝz oRURF˟ ϐ>Za؎k C( H8PQTyꒁo.FZ*7%SrkVc&K{Չ3ا5mtQ"d'Cy)^$6uNZ]¯Д+|]̰ތtxV!:)R8p> kE*8+vaSpວVsWs9F<~ ^%ٚ<ޢ6vssڹYdvjbL17 u^aޒkUv\ʈ7z9h )MfMTۤ" < ͥ:;H}k{h^%ѓ@:U٤c+4QL^%`L~f=gt(Q5(<|Ii&hsvҧNp#\oμZʍ?zޭrϫ^<î- 2% E8QBGuәH7AFTrJoWdm% +VpPb)O3uy*< E HKFAg1,j NscT+Ipk,=Q5 ,DɚR*_ڴ/̽)wE%=*_O*[![5C]fp76%sl9u.c횺,5WTŚ dp$o%8rĤ ˅ad}>&GlЭ 6HvucQ_yjKb#iBo%UddqaX$ʢPMKQG1JVZM& C+ ju=0%{sO07 >jox2c[exob0"-;K&gc+`"WζA nOaz2 lQl+Iz'(WL(8yK`$!CũGTx8޹}M !7|W"9@j;'"ទ1}1 .-]$?+zOh$l!JmޤJ''{dlbL y_/nGKl\siq,HyCGu-G<;$E#5~CV^'z|F Ԯy}\<{[!_\G:\A\YEe6A>vUGD}aEP\dCs(VA'qc,z1\\o9Oq];~HN}G;oڄXP`W~ Tv&8 |DdvRDNd=b>Iꐎ#*5>{mυ>ClqA/s}3cEӅ3)\7%cLr&㖶]͒`Z@ ?ٴ$x={ *am0pOڜ&lc3z>A+?&s/%@qY33+3/ :$W \59[JנJhvtbdǽ 97yɂ]MA&Lx\Cɵ(O>hagI;eJ [5Z9[fZ Nf>;0THLN;7g[KA0xYmkƩr?kMO=oVNY:Y 6TEz<ԃOxM%:%a@B p~Xtd}9fL%r:RքOD9*?B'UŸ&)E ?g'Z+֬4wm?oOҽ֠. X 'V=OFOoA+=?qٝEA66~1oZœZ>% p uE2=agNWa$|5 ]y/6N[,EIIrNBUp“HQ|{utBLoFyN>-2zȺ 2Z$>fr|ts*n#>q'Bn>s9ɣ =7i!e(BhI*&y}yR(n;0aQ߄&Kw|c{q>b1:I>bT;Z"HJ7=?4#Eq$2vN`7T]*޾lu!c5Ai޺I-wLȆ#1w,'xEe7uei*f; 9MI=;}ϻ%c"F7L *@8aޠ٫XϮ6/IB_giVoPʓJt`Wt8>ck8qI;;Aj;uA)"$_i fYꘌ̶GLUP(-q52P5 %|Ƹ騵ה[z[ {*EuǼ] *=i?t$#xB~9UNWHR{DHU&9i9E6W {022q'򕛧31I)Xd.\51I2O = ,GIz%_$z4#eB~NH&wx#a@H-i'<&~%-< ҴtDNqL|c>T趏/H dLD([|l!0!R>L(ԨA"3x'(r`CqZ1 +~ԵIQwM[ !vGםzivOkHzvk.^:`Wb F 8)wݹG3@3U i?6Y ]-9Jd"]ٵmQdh/@X@J>Y2rIW=[{w۶ʽ˪,Wul̵ƥ7˛)ݖJU~Hw;m{lƵ9:5uR[ؒ%DU" p @ @@Odcl"|c$ۿ zbjnL5tIq^g .]OOymq_=H-<'Pf'=IZ,lrF5:C( ,2:E%LTw)9LG-y"da Rq508hhs7X8N($ 1ĴűģJjGL]IM]nI :%xO6s*3|jZХXf[`άXe= k_YNnj-xVƃMf,L+}mBU7#(EVĹܜKm:Ֆ#yo鶠bPf{̩' U{#R6GLDFDM:0)+UtdHJ;^b&W5'am/`G :`G̾3=7lgY`g~4&K6't`p.~mzfp,DA!\<5Lgԋ:kv̰/2m$lG`C%:~כXEPCތ&M6J37 f:0y݉&.f7DT/Gxwf[Y7w6`u୽nhȢ$}L#xnA1f\ؽa[^Nim4׾'SO %d.rpvPӴV<$KӴOcRZpYqpk`{{K)׽O'[AY)?:8VecUyO9W]<ܚqq'yRrfO\;7=w(\6s1vj]='byGOݍgMQ7v͇ϟo~X#sR?p`P!oI ˜}O#[|nRU>wg3^R #%,y%Э8! H,ʼ_eN'%4LkHVىJDkrRAsG5D%GFF:6>g(vN;K[|hkxS4%I '#^o:%b9TUY"h+uhFJm6,35ZBbi%iY1/^]m5$m4Z5a۫^LDr1FXT\jYMmRf\{V |Q̌ cr9cqZrvvP!1HٳD´ʚt:IZ|ryi oe(NLY*ŠWõbw#>KרWxĒ^ 0Qx: s8l?õ~ ?L@=i[]B,NiwwbǛ7/TrKF9y0D M"LhIVd;eޞܵvvN|7f;V 3s lyR:Gıq~#r. @gvN\5 ķy2o 5^@O*C bzS_qr/,+9GcR}Jt+43~di\R.v-~A@l1-w_ nVBIG䙩F{l=gԨJxFRJJӞʟ/0?}QU| ;ku' {[i(n9ҭ}\)܀)|316fdifxMV.- +͒k9k٣ʯW*#^gTmv*[^ҳuݵ޿zr,zqU`f{+M@[)@ÜC9 < %gϔU2&;Xuҡ'nvf]^ͬEؠƂ#(4{sm`jyVOYvPӜ=r#:hyvc1Ȕh*wQ(dD О,d%XD@ n%8A'$G үKc) {2jK$VbHGצa%"cD ,6p1J >R_~徕=ǪF/Z:wREo/lkތe}`"Pb P'Er|9P?XUFAL ?rxXL/=L,\䝒&,$'ĈPKLG&,X|PqJJp;|t-ƛߪ <"uym+aYRMA} (e")6Nl6/f[Z8VX58/` bQQ (5X9ߛD&$C$/1HIJB.FOMzEHYrZeBqaJ&1tboJ"?3g5I7uVzey@nV_ C,ؿDz9} S^.1e\ؾ+@e< F$yGWzD}K_&XrCT_\hT׃x-!$硯)ﲝY:Kuyc>j>.˂-7&;/q YKGJ Aq#V3I͓c{Կ/=tPU%\!V{$8NtJ 6Ie.t)]hCs]9\Hּ>>aHim?ٹ^^y/n8?+[T)u Tm3qc[Ou<`~rV#9׀xTp/fxm5~lmcEr$}ɢSWM@f10h)ђiֳŵ^:Ͼg#\61RigG~/|L^0̭^!\'/A >IEtx~kj/&/G1T-s8<by<`!w6;c8Au˜bA!ĘCk tNjU8ljG ՠ%n7:4@#U0!30vkd j]5׾:1޻mZw 0  A֒ @(>HmM$Śj۫][޽ko{{j6Ǎ[m6pǼeUY6QA2F3Xm}Ե7jvqnj)Y`Zp 8Q| yIzb񪕀"&АQdY`ɽԕYI%KV 皓I jq{e1Iϥ-1\ly_%3w6ʙĤƉ 4⓵Iل?v]=OSFKta:Yr ]l!mR]JQ%X({q6('R6}S0tޠ9%* 뽣}~oU^ s9ݥ]AVs¾7qnӹXƿt,6K=&`eFC[KuʳH־Mi‹J׬C \(jK{q::en=O.!9y=>\Xn;X\)Ë;!& .μhm,ұAA~dnCg x&$>Aw1ij8.:ӄͰ]JJLBK#$X-WNأgLxx8Yy~f)v<˞4:uͬ5/о~r-We٨#r5ܒI~z!dS.ݱbH逷&غǛs5"( (|ceT=,Ʀ.認=o1)\'F6kqcNִ$ԗNvC`wJQ@JZuٴ}*u7C-j&u*ao̻[Ef8\-k,;шWN0ѠV ZRW>D:1̹Y-}Cs팰3oݯhه"*UZC.b<ƕ)+uGW4~&ZwW\oy/~t%󫰄C]Ålve,b9ZHB E*ﭣn+`a8bQ$i8HS;fF55Ԯq}O˱7353R qW=;R>=yṖͽr}2U%mb΅M .՜5Ӎ4\KD|}+O  b#.,ϗ7s'wg]BGsE9>jkYgqSI"9"?s˴Ua5w ]Vb,Gz1RJ:}(Q3./]_ 4qhaUPO5 }ȽtHkqEHWB|tlubׄl/m3#hk, : cCWzXYA'eAOR$$I?/OhERIjyF-!3uDWSe%T\7T~$Z-2ک1oHwlk*V 1Lc::Xj#\jurIOye[hRȡnk+=#mEsw60sqෳy1Z3NI.G@;rrwjf*itB%Av=m,3ps)[W#m2[Sh~cNG_;%UL %֝/ǸҔj{ry<.ʽrk@twq}p&|zOk\SýlKzwHKOdrr}1VELJ0: b7.) r|`yO\vZ|s\Kc-:T1}C'$bCǷosٟL" ̮0c'[׏"œyS-!^~>r]? -ve:|EW;ą~!saEtF 6U}*[<(sՍ0qRUj"_duM=_s2 Lط*ߛYI+#Zh jN8Y 7`4u.*2 t%Gm7r[+a(#8ftf+!=ܽ=GwQqEd$'%FtbmmHSj 95FG7]4k7E x^р<qjUbwP+BYV/lg@ep=s@C 1X0HY\fȍT "86a*;a5YOJlR:, v|vŇ#NF.HCa6;a&0zqb#c5)h-{h A蠨arԎ*(4[|wnP>%f=$K#0tq.2 ۩ @CQey\KGy K0ڕ!XsWr\H""h1ϥޫʈdKrAHS%<,V{AUf]Ǫ=b+F*mƖWV<_Y)$(s.YC`Pe&ElJ#5*Cd@#V! cSjf&㫠S#cx{{o[R`Fh DL u5$ؼoklnV٫"mƍ̖rո[l5EHD@~{$#S6H}mߺ6ֲ_?{$$/@;YN"x8FB9!?nPZX.־/QSve[BmlFs&AR0lڨОә.2׬YA*Y}h"6 \m"ZQψu\w;2J4 / $TsQ;2;t\QuTrW /o[v5 ?NfoݑVW>- Jpi]i[coH' ZZVk=Z'\ NDtmMᪿ)y̖Ӓs6'aY Ra<#8'[%j¬R dC5f;܈?r:z0#A5VО(TDۙ7W,c,) LwZck9hW ~kxv >0:fm3|7w6BTڪVHFBײ" ejZ5PJYmιi{o fi0edk=9b@ VWWv:w+ŤӴ:#Ri}O}ԹY_Q(K}sº7 OY2QB;d;S1m,S3DTS+vxoUyR<ŰjR:qءd\_ UvwѦ62jqB bP@?;=;TkuUY(EEJN/bզnXcK=)Ml=mVۗ'qCt>[!ri0p^8[Z\)K(()~7_#6lE%`! --rG&'[߫?Ë)`bdj֭/!̵^ &AոUR˃B /8jx/~DSQ;'U5a;y&uAi)g7rPpx[uiU6؆L43Ds["(ڛ6a%IM#^4n6渘6_t2g^W 6\ƌ Ɔu6PW@n$ysJ'z1gT*'c'gL!7ԏ֛v<Flp 㢼y [qRviZ5 XP8ރIɨ*NQS22&jf=uٟ|wNU=hŒ@ qc~:KXۏ}A/+ xugc0Rsn+h5T|FoRty^DVty+fSЎF|DEoqpmp7_ss/Vnq8m}4, >+(q!zWk/]c_p>/[{֬ŃsQ}'ibMOV+ɪFd+:&7,fnf $P3z@P^rLs{$uh2v~gvv6 z] v笳M{S a KRU&*?]kMΑk,akQk5;5=i^j~Xe$cJzaq)sFвp ,r^]g㉺d&!Y7-k݀~O˪5` "_Z$BPW~sM1偿-vЍ.O.-R2J‰d3[zi$e 'dKx8= cآ<舕ОKٱnq] je6AԆn_הͬmӖ(k@VFК<LJn2KM-}he4Iڡ'd='s:aMI%\E8Hڞ+l9UN C>¦^3W: mohj])7.JXڀ{ŇM54SpB/"q^1ڸR^VI-C-ΩpZ|Z)4"M[U;a's:W*y膭C:S }G|hkVK )C/ _!K"E'SlӞ~PsڸMRvdn*' ;bBQDp^]sfHUtGQF B.,7ε2OEƝIa͖ڽ$Tz ^,;%96˨ţOɣ |ܪ!z+p WN{}knu&G5wPlKP'Ԁn̚v߁ "9ozzd,]Kz<yK<%љ.,R[Nԣ#<[t`dIMfhzϘ>:N p#8VM}N*mJ,C,MBHG+ɱD*X=${^ d)g{TG#pY5$$vFK8'+Ƥ8kdCB1p$4* e2u3@&I pVH%?tv|!&15YDNN1Xy%b KV-1TS56J~ɂф2n^R e28rSL2[:o\',S57J,yN Mq3z}Pۜ>ʒcɳ{$Szn#%҄@S+'1zA]/;tw ZM$5BW@ bd^ lRwGs]r+Ma@YPoV}6=㿆۸jRշ(|4J4roa=PVϗ5O7S:./˟_q{ L“7>(7j~)ѿF4(9D_RN.ѣP?\1ȏWD&HM;SFMiiZ\9߱bNHy:/K]HW% Z֡hўYz,x7̙.SJh=faZuMI"*+gB[Ub=)MK%i.cSdlY=/3(.͖ʥ\U3zäGcbT.%1ȡ&wJGtyNV @:2JvH4zxv #LD(Ir =m"2M9MpQҋq/nfg=NdwW?5]к$q}%gAlᐋ@8Gx,*aWFd*gԣJ#ZcdQqЬĶÝCU,uz+OcfQ!^&|$4`I1owQśܢgIiLsDvd{*g>їs?xk`|qvB3bW%TSP|>UQtol/}HU^~7~zs Ƽl:]stcV p[ RFƾdXhJL&ׯ +o;* ݷZrC)FTԫݍ~(GA놋/C=T3|  bm3|԰iNib< 8 }VtV|yVHsF\'6)C 6~/ϐfNօx-DK w,ڼv>ѱ*t4e.b:=YD>!2lc?ګxhn6e1IGvgܘRq6ITt=碓~DҶb6\6E\.Ec3oW.MVxD %?]pܙD=l4r9'5h-1_XCLmnrM^UY@y~ 1d98) F΃r SIּ'3JBt7CӔz˖S8 y7J8h:5^kjVV2޶QUđMWBxv\V#tu߭Ga֘T̬໢zȽ;s7@=&ZԗB߲(j`) -aWWW0oê~1| V< k ߯1{F;N羢7|>f:~zl픫945s<^iRjHg)ҩSјd̀O7R5퉝FN=W`ɻMٍjL0vOR;{W/y?o6!(&~~Dl/Y̨65TMDvA/(ԋuFg%Q5) /<ԊVh 4^5 x='i}%QOKQm*XLJ⤙8j3ÿ15o{``)'TKO ]*&PH."խJ\O4n7DUGYY?MvÒ)F%z1Ro*ij,1Ftf\.\V2tѤZjas4G@qӠZeP΍#9[N{Hgؑc@&J|A}R{F[[crkYYE)t"54O}Ŋ{g#ٝypw&ln6b,Hsκ?RYqMBݘҤlp-V,Tռ㉚2N4whC,84G P}1UktKڨ6t7=ס*uOTٻsynbkqR2lzgJȳP*4m-ԇ[P(q}Laf[r1MA~ZzΚ}_8P.ȷe\ѕ3R|S_:fM}x躍Jd^0C{2ThVk*Ր+tB<3D% Ji÷+irbJϕ2\re"Jߘ/{9rI^ ?r3t,WTbuN-="|PW>.5qbj[H&U f"a;wp ЪM|keC8д|dvx}rž^댽*b7FY̔5loMRy a4Lev=M@Cv!}>;o;2,0dW{dJ?87uHdB}dqrpq-IѕY߭A*&~#fW qt3GG a'G1wy˗}F}2tUtsKtdCqH&Jq+2@0~5^W̠ Jp GڴT9M ݑVGn?@.H4h:J4LJEfQ5~°aQtoUУKL` e4;T܌= #m*CYfR,o, cqNO{qH @j1fȰБK}cGG0W~7'F?[bRZȷz9b\k+bޜ@tX <19T9yasݏ%01<׊G#ݴzee ).] .>Dz %Vy*6;s/t>ߒUж/⮴Z^u"M'6k ς2*'j6WW_< r}Ʒ ˆHb3̏^qAһbҥ `'`NGMl^5ׂDˠ&}/1k~1gXs)7"SLa)Tf^Ub1WD#F8#bhV=j(fv8pEd TPN|3k޵ZwѶ1Rk7j-]aϷfjo~SnU۪~_^G~˵K븕Ry@$/}c wFBA &d-s-QK  ݸIأB3"3AK: N8#eO#Qm~'1@{V/7K"§y]^o0s;ZWw|G AdvZli3%lwKlPl{ϥ'K^-`H,o߷vڶBFq,[-vٍ $p0P '=B<(zTXgܡ Ўb zQZ#2ψ.J6)jnhQmqgf&e)']VYy}̷#RU3fҬQX,!e-3hѬt{:&7')Yf)-F]Vux*TE[Q^mRLhfFճ&&lSBմFoNi)h{4OG8ӥŸp=홲[x)2}/uD 0] ]먄Ő֨E)45VDB]xm_5wbFBСi)~ٴrGUBڽ[æ6*z5*UD CH;:ugp-wH+NTO)HTE l11e(M_ D_Pߒ=Gq-4l|fC_x-˥O[D&yubg)b5LzP-ȟ>Z7W63m, qѥfoxp5h=#d,*4FDA֏JRV:C JVLj#4c`Rߗ(G\[#xG>ۯnO9ZyTs13dݏ243hfP?·~=VQF]1C;s?zX/ 32 hM{W8D/Ok՞2`TŠVJBm zK3kى}~+-~]Í=IY2uܤzJ9iZ'TW4'LXXFvmhdv|i56ULcWxrUO2;P6QG"66pm*sʬA-_9(=|_-<-&ݵWA10 kJk;PfcL'0_eu#]Ӫpo8IB|k/^F؜3Y7sfoA Z@+ַ֟QftEՃE<b\R_vZ.f5(W m Թ َY4yնU!q.W X3;wtQޮtb%vsHčy 3ٞ%ĿБH';[um\<>wT7\"AyW3<=*1:˗en <:˜kJDvoz 7Z]hk}z~{YwazO9>H\˷=BݭҞ Vp+z,Bv͍3nx1kzgE ina1U:ZP0malaG <\E-HC@1˖Uf曊 GKnq/'SGDk?~ehG5lqSV%;4D4[Xњx~85x?:Ru`2=|5SJtGӸNu@WЇ5&<~="[kVN*Ed\'d*&?|E"?=Rheޝ*-}@1alSĽPD<&&ĊReF$Gu0eޜ]n<[aޙXP4AȠ|"k"u5523[S9-Zz慒) [:ѭ|4ayb:H]T,/D ?ċ̩j  rHvȔp[X7I};Vgo]S]| ݄Nv=(+vH6iaֿ̤3柷4jHY=u5aY~9)ktܑέSenۥ +]LWr15{pn?(~cT맨pHUUΗfެj鮼dѷ玨@V߉5\}Sd4<X{5a%~6Zc,7 #2:B[rUlO׼-r0Vڨ07P}or i/bfRحn{5^'x{>>Đm^}'D%U|@4mBV+9mɁVN! [XC|}rEaZ+aCʐE?-6?w mYPK C}&Pl~Ή5{g}3(cQ䆚CP6=[3e|\[E7 ]-}ƔY~8*5>ve6"5*an}Pssm͘NXR:'" I@n#w :WLql3n-g!7H΍89HhB1qgܞ>mD!YEŮ' @7pnF h\|/l,~b#|;FV{TL6xqr1,'~y?: @ pnI/C c:m dX N Y(6_aC'[HGm&Oû?ÉXmOHjT:zORNgV%&2$Ҩ-(sf'x>l~_%ao:ݖE ˂*d ^J1R 0!0D֟0|sgS\<[}Մ`(4"TI!-S[pէYrQhnd0CmK9Awvn[G^-;VU ^ʴMv;O*_F{TYfRu0ƀsʁ8رwhytvX쁥rPni'ruDy9凜DŽXm|m"БތHdro(sE@D?(8}74m0y^.`3d &10/V&fe|1)i~s؂`mKM9|a;h*X{x|?;#_,rj-`N¸ۋ~H?xq ɗGBNxX2ܹH86(n<ξ{Fe=͍]Ǣ6` ;w܇!8z6ZG=\N @~ÀNy?367PQCsC?b0V}ʡ\e!/]u^ٜ"0NtBX.9-d)g_Ӯj3s@3ehrdk+k N]vDhm%K,I @-֟!n"^QpゥQvna*:WzTlӜ^i+Q z"? BH$K)>?ff j޷֬}ڲ+5mӶu$U%J".B  \ d16`` abH8| c 1 rsf%w1[t}n!I5AGuR+, &yWs45e͸aAYNbe͖ ʪIqKHvY ɌC9Ϛ]9YFNQ$!5Z@YQZBRg(Rױ;𷐆iR& Svv1,6jxMDPH.lz*+>5%)h5H[6!c,utr3p&ZR&j/IM0>hzfB_S-W۵*P?uת2G<-qh#;\8VuȫV9 cśrcsCo>K=i(60-jZrѝ#ƶh,8t/JJ$EKKaD3x8>,&W 俦LHԿEr#a=oS6gC=K$:PL4l81+OkRʉ=1-On\RJvIZ;zn=w.){=$A9̞R(*jobݛPS"ភ9_'voz)2bVLx*]s&:dkgӵxq֚+y\<j%Y,W)qݮq(L\ ;7e~l VxtQ_*cq&GW-Rς0XF ܑf 1J{ 죃)*\tMuٗ9+]`LlXYY o.;7veAx6f TTs%'N?S99ݣ~OL׺g{it'1-='xdfe/KuY^l{Y2m5Nd .4a:'Ne|O(äk;*Mq ߕohbSGKHd-툈N0v8, {S y~ñ-ue^S˿?1 E&u:ʚۙ}iSRMp,6d*R:Sdr;*cRB:~F\u+CS1Uf\ۜqSMRKNѝS&<I0-Mۏ RvKEJatT@!O $tZSd>\r 3r«ھLM;@(#Sn.4oF\1 ~wp/luI7rQ3}erg NzWТzI֪M">ԍaS]y..璳.Ud*ms8GXno'{:Rnim8:hdqh}ӌ+vшhЀ@ fgB4t?a[ rrHBCcz !E8_ɋzK5Wrt~>FDaRNc_tYܰl ƜG`׫D_Rpp֘u'=ߐx;MjJ϶@ua6lHWfq LqTQɡ;x&`dx︤h h0R[N&ns' P' UGwm8Z{!z)efQN2"Ioy!Rfu"dVXf*lE䭝sã^#Ǣ_n.hqT)3 +]Xw)ɘB bULM硞E@bhxɭe4wkr5|:,../\}ɶNu,"[4 5%]QSeQ9~z1,Wa5ם ,A7 W/}~rs*nXUĪ{.fow_vmz{y,I`ļߎH㥣ʥM~Zg/_&X:'ǥu ,-/x>K\+Ko_}#!sn4#<'3/8A4 c '5:!"eQr'z F6ubhq1?`CW`0@dO/ac dͅb"(X>< ,V7^IfQC[zK [Ev1yU8Or!0mѕ$ȭ>LA<[uD^bZIջDGa qUɷ+P*8w8 `\->[#ǺavXSI^Le+VCnn Zr$V{iQ>[.m%a/nD`&)C@$fm5L>#B[0*ז{];uMb-b>%n22㖚gl[i*vj2^sV>21Q '@:;Bz-t[:/rHǺ2nF"n|[o!wSŊ-70p 1"⛢뢘Vr ^u)fųdLIV%kEmcS$}W4FBV}Q%\Kr elqD*%n 0XvRwqxR3`؃(V8BJcGCD+  J[@3"DG(wdP}ЮJ80΋  }xP䳸B$8(93D4Ѐ2gt^zmV !xs/{f;-4n# >A4EKADD#"'% 81{$( ڡHw5e%-ZIgh2;XCZ+;fbO3X9=^ab2f*+`Ί ;ߦ_qۢ/Ⱥnj]o3J>A.vQI u\c0 NTE+ma99"0&ҦWտwAi3ZԶb翯)%qg1f[h ;sG4fWn}0O=imQ?50OE$+&ib?8fTr [g<ž4/3f[ӷqĖݯE/74i qJ}=5;tAmn[1"dO#BFodg<>1?34Y^Ο:7ROț9m#e/Zl=wuPC47uckVG K+c\qF^T4`;ŸBŠQ_GX #F#'BгA̒.L݄Au_`_Vz/MY8O( 1Ŷ}ky ]SliQ:}iJLd7z]~ҖD)ҳ=(@aY>d* -m؋ K_Ja4:iyA=A{YLjjt(KߧTWN ]Lmz~i;OJq]Etrxa|8UfT_C={$!E'q:v҉U5{I`?5?E c&+*D(yi#GKGQՇ*ө75W_xoQ&1T)\ yϼDI+2b {xcӐ>os9뭬ʒі8jOÕvb$EO/$v^+SmAb+c]J-@[UK2B~Y~!cY^D땻mv6#!LgȀKX]c7ِI(qXj)GźĀw=,Ӕ]P_dYYWQ!EXVLs/JSMPӋqMLY&D&9=;8lYX_/#ط@נ֗4Seƛ><͊ -:a '}l3^SI]]W-cRrb^(nE'%;WS'^j{\=Yȭ^AgDCނTgY!ؽ{pQ}';# 1aєT*9xsJket=0a ʞ>" $&x뼿EQ *̞'g2^*c֮4lF܆:|XpՌ.9fȾݡgȳT8G1=HѶV1p⍃#Fw ]0<^VQ* b"!# (pV[G $7O XD  Ջ~}ל[kn=qvaq5ta6]pZ l\ p7F#z\\/|X6 Hg>@}bų~ղQ-MNr z"v;Qc`6|JR'~4>?4jJW垣~;'RNsWˬ$c-[&2Bkw}I~Y-0K`09?h@C %ۍ:߃b"QXB,Bc:AX;| YL D0lP}1E Ii2VH\b/V)Cz4pihɄ,bZxwLچ ^0*w^VvQgsmj@0$fufMkfxO 𽸂 pbMk M&{(D<47|櫠>i||7u/L^l'F$Ѫ4ZM4t(].6Ї`a[X{3Cc03e_L!$[m7#Smbk"ݚmSc /_\`Fd ~d8B˶$Y` G+{; m/km# Q6lz*;Mt xt!ɒ ){HA޷{kֶ$[֙VYƶvommS9/@C 1 > D8 {i=5HR,鹚ӥ)NPq4Z#qiWh1j:G763!$H/]f~1x8hBRJ^Eb?TPU@4S'eXu!k^@&x4j&rRdb=}5Inl{{!56"[nkys5VV@${ Wɕ^>UE̬ڥ]OóhXvX̒ZE\p zHձ5:\ԼIV jd9Q2,:db>jsZBKO8]gz/stF`dFm)sk>.ˬߓGFfD(0"E_x1w{uy558Bz]~: *u=N_W^n!]>3'tmQHYn (̦-~m.üzCF95˼^xJCIJEuTvۂ=3t#SEJ*%OyT|QVXePE<tFm@\˧\e22#|%^!I[eKY0 i^F*z 5TpS4awbŚfT׎߃[v-ΫT߅͊80Jz5NvS 5ܮ0: QYK%!L1A9YeF+$ mJCE :N%G(ba} 䣹9ள`Og,8gֵB:Ǯ_B}MR{>?1m-S)y5}vVŐNI"TNԩ,;}1UBt,jS&d퇫vNVO->;Kq/ =VO4|6M/cʩڇG9wz ЮB,Ʒ)SnGޠ:$ 2‘ u088a*K)joԸ;uhҾs+Gi F&i!(agS6ي8vzSO1%oz= 7mSdzr+A*Ru aB9'ѓhZQUd = FA-&l7Υ4OALvͪfBiy2gՅbD@]i(s3G /\ȱO4_e#4añCԻƴnZO_~(am־JAT$37EMFvmW iS,_CЋk<4UB;SaC5n—z=D{}pw7}}Qy[ $?uELJ6-ZQ|zئK7k9Әc/Cں4kCK ^.U5ryc=P7xcͫC4ճIc@L.!O3^A&n^'*j]cuvYs&tE8i6tyy[&eI!k駵$pDpާ7 +1ki8l-u?K KOG"Q y=oFff[T&ɓZ緖_ʅ˥Y\Q- 외fL"[ycOhn+)Y%c(!QJ˹z٣kZė=J*ZC bdekW悹 2s`Ɏgi,k-Z]lqđx2>.[E7_#uyei^-m3Hŏ7#p!Ia&t5Jbo]Wx+ʑ])&hM̛;urș[ԥ3Rkco;9j SlSEN*1Һt_>ۖsW“!YѓQzMen-0-u0D^R]8F/ₜ|/ʦ&*v򧂍wд-O{zMi;7Yd3 ڍ֧ Q_/}܍UԞ OKQ/=GLưpt993K3OդDotxnMۍ/>!p-W !So^Weξ8p'ɦCg$^U  H-/PէRsYKѬ ' Pm-n^ ,6Rw)3?2M-d)k5q޲Ks-F{-El#`[L!kO>P7N`tFC !C1% y8/#̿迋x Lj׍B0h/)OT30J5z선^k׮|EDX*Dz=sFFV~`F㑨UC) &0a w)9~r ikr\teuN0cȕ_l۲]ISq;uT:00XeM'>qSV?>2%52e 0RXnQm{6~nҳكkç3.3ŗʒz>I$z؇#p+!tZ(|U[6-Dhw%Sieq|O)fmYFؙ8E|#Tƛχ q8iLtHC8Tܠ#(G($4M@8H2;N?Kp4"G Jq:0#ҏD z8FKYZv:4_QnK|tCR 1bD"/ xXH8`z#`k*3^JQI (mͿ:Ctp֓1t?ԥ(\>(yޡRm*EGn0$\YiT8/&)J;+'"Dt>F} ',@\؎wX9BxPqJe++Ð>Pi8B >~Ao(:{C4@3oV 3rFd7y9NoC:%&Q~a"30H6aܮ4wt} $Yծ/lYz{yoج|+y'2n9)gU,^`jOY^cG݄ 0fF}wvw׫m]F*;]k4nۺ[iI%x ` #3ff%KskI=Tc6c?X$Q.VcV*ro=ߓLE7Zł=h8b8P퓯^ufݑ ;Vыe~ƽ)71\"ko ujZ42ǎrW&͒55iA0urQO d|Zg8X/ G6&lZR红*:WL_\+-~ydsنڪN|)[|>WK#=KX*[o(nt~%<ȍȕ;~ޛN=:;wʨ{Hej}ܰTxunK5[`-kGEmlȱxόy\MHu^t%B'[vm];>7n*$^ޗ6R5 d&ӝZJ&]6"!>%Ni4m,EcVC#wpC07;|2F|}6MZ)f51C&adDuLkF}Rg{,vM}nۯY#X<G ''HR j6jwa୰LoXS[G#3翵N$\{_äGfME9bؚP7ަ5ߔX?߹oSQ7|16/uaޕOyU/謁ɏ!щ_"mp* eLO}Oa4zUG*n .:yuh.T36D]~-4/FGSu9mZFhE Y5쥡PLOMX^'qG bgYg _y40 ͂WmDtqgըhaVH֏-ڟI2w2 qb p,0( jG0OR oxE=NPt(.]BgzG/䇒hU7l~w &ر>Cjbp ց뚦%zU0W _Qwe=zczhk5G@{ploLS[ÿUU:ϓ{+;3ySdܝ.^-}pc\ݧTڋQX[D}[sฦG[Z4A~y= 9&gpخ"Ź"6`_'A&qÌϩ+x:()tMuJZD*E@QHiŴJ1s6әn|j~C %a@gw6ehH`FIGT;P$Wp&l^Y dq8a1mH>mhc JYW58t]mϷsh.(%Ю_YKbUClyՄhni\bt֞]D}DC>r)C H>SE&uԇb~.ߙ>ì[S?y CEz.y(oq4+L>LCF["5y+fCFVm$ܮ`?vl͆)iH=۪=%Sj7ڝ '@f3+N/nw]7TyxA$Q >i [e['1ʃ~<fv#0"KC|Pɇ&L#UKF鱈Б|ݑ0 2}mq븰 [=~o# |٧[F6Ih}F&H-MHcWSVg'N_;As9mvmN ZoG=hHljX Q8zcp`( 1΁!J*D]*pn1}\Wj 뼕*%_cƳ?`z#=$!裋ÁNѢ\HjtpF=pe|.>X;71)oxp=GRs 9-1aGt͗C%Xw AٺF@4b*՜ȒL*tfáe s!_#Pq8I]E |GC[Y_QdMPswLxAw q~Z*o1w:nSmU]&5Xġ5^^uWw%t?haW9>կĦ3"y_bchuk+}#[To.+ ; _&2N#[Uy(Gvߕ^m]?_yzxcIEm՚M>P|Z. GÜ亝0*wL.A34aFF`tG6`Xt~G-Abm;}x쌨f~H3wqjr1V%2Ao9p_b4p<p897>Zd L<]Ʌ\>"Nhdե<$yFKOB(.񗧠oh=l()?J66,$z3[m nb:)kXcnDtf$1,{GI+<?3W8//Gh=$k;PPh|gp6 <Ƞv _?yyĵ- ~u]< 94<(\;f%'>V)0'C03oV i/![6?Nn)ƑvkݚM_/ //`XFd 2X$lPɒ_`2%eiMiTvwoWؾoń2M()4N^ĆazDdk5,~NBE3wo@}z}[B,Iqvlbn fS 0 A@yD%2qp2^(б!.^.-%DL9Z*LXqC lb]Gb-DW[>`9}%Ձq:n_\SEDcD$7mk}u5}Xesw PD_\"Ǧ.2E䜫nKBiJ+JK1 ά0qNr$kHcb>f#z)[m &O5plV|ᩩc|Tl!}~Ȅՠ0^= 'M)EoԤ; A[4֫k$pY1TeOK=cнH4U.:/Eֆ2F ͵v6 =&f#Ә* ?Djũղ{ :gD"*B*ߑ%I-w`&" :9U..YΜP4]N)bC4Nüb@ںd]bKsOg=Xcv` U7t7ِ5]xm/_ls:W @!Z~_Żu]3! 4g]Gzy^߲zJ8oCu90Ƥ֚4cmR̢ q*{Պ~QqpԦk5?^Zy*珧9 ~E˃턈w*"ۂ®Tx[\jsƾDU}wl7@0hc.Qɽ .cRfQ|U[FHcRc0^CRo*kRkesJosVv”Qhxm4wߦIfk~*)-7zX`,vl,OYV- q Vm_Q]!Z8V1;fu ģ8D]%-$yY5@7Kxr H=_8ti݇$9ߟ/8ve~13="ɜ"T(WE1s Mx}D/{I돫Ybb7 YF2Mg®;c?$ zNkBf}haM㗂fO94ݶBc%ohIt\X ٢H5aͻ)NmrRǤk<{UJDD/|OB/a}OBb, )#< fSOȭ1kZR8#mQ_MG} cQDTDNTįzT*}4,+ d5Ѷ%K|((28)Tx 7(U-"͉ry҉Jg<՟]&SZ}9$q8*p9OK:F푝goX#Ȃ1蛹{ %YK[.dre%%'sor i)`~w)e$o}C$8q=Slr~{?L`xAUzGjL҅} pKS_.EׯUh gq~>C@xi׾g:Tp@%EjX޾i EX.=R@a{)Kkq;?lݹ˵DJ@h>x/Eڛ#UM7Ecz\abdA fT+"31yT1! C;$omʂN܄N$-#,\WM&yHMِZ)~4TFm"g qF!yE+{f:Mh'Փ_ا:Anr::b2kv$l[ݺn>t9όg3fFL:Mb-*nĽ0Df 6zTؐ59ecQ޸ qeHHtMKǵo!mJv&3"V-=nUZ%o \[K8,qUdhfIjNM;6hgjͬWBÿ&j@ ]͕XYe- cAlG#(4(+Bwͯb.~3a |ZorbHOtN\'ɡF?<)iVߎʵ{>H>["|ַ88r\(K[P!9 0TMC w!RD:,aVbLyp+Vz:hl%./U 39%4黹L U 6u¬$q?Zlrv+cIݫ?%kF͵9s5W7 hq TO %_)si{z3 < ]v >>:X!!}W0dG9'_ږ pQl6GxaC*­A -4 @ai+AEaG?KpW&&vxDN8\bԀ 0@?ʄ&,|/[XqU2#7@[tJ f1gxPPI+Zs~,>ܲ{m3V>'@Vb/Ebyxu.[8CN8ES)>} Lģ(,V>Ȟ9PeN&]'}G3| Lc$PF)|F8=s4ہ?q&` U_;#/jT㻔8YvbC6lzpToCxIVkJԼ8R36%T%[^CVI^ p`Ew[q%nu{V MҢ&| QS,s,]`1Mn˗P9r.Õ[4v%Mݶse4Z[#06gGkXZ@:)M-A&-R``tގ*xlNHȠ8 hbCl jwt($G!Gu#͕"E0V-gzX'2rTC*!1qrDA-y&4Վ{ACj1W1ZeHLrgΰ`_G^Aayk,g63ɗZVKB= ?S8|)>>a=+0˒%I e`,'lZ6~C{o7WÖP2tGt kEZRKiieK3b5@o{ڷ,kKdI'[ٺ-E 0@GDx98," 0`y (2R#Wje̔d+YϮ+UfTh8kEfprK*htս3Mj5LՑl;r70w6J($V밑blRZ<j|z݀FgREW}=:EV lk*5(btp 7hjZoNQ@kh%W|3Lyނ("ϵ/o9 Ph^blvu/4ս^цhD⨴[E&U~[ӿmVccJD`Ohnؖ(Z z;#\Nj3Fib".E(Q#lV-cpSQ(ܿhFtSIaV[gVV [9bI V>o2B!F; c?nv "?rT*1tIJa *f^\QsBbh6!EUn#Bc>Rbpopko-7QYf: Rۙiof6e]+0Tuy:U*Le\G.IDkUt~ҪM\kVsӪ#'N4Uq:LLD5ۄ̝ Хte@~7xkzNͼp,%Bl.4dbꄤvfz);(W6PJj,nG[ QKlE[qI &Ufw*Sj-3۷ g"YZ/=2Ͳz6iS<9>Jz+\'UM=GfϞ+)M*`uQ6( U@.į!v˝ &%"Dtg9x]u?튮>e>@I)}[;7v4z] /)(ܩ.[p#db7E J:*<f¨;eeo*qH}F~f0|7_jo9f4,l1JK 7C W{{62O}\"&4a}EoNM5bk\xvoSbXUȦ߮f9{|d*Ko kgZ`\=A }u׶G V0_G(oJ漛oqf&!gJ(&k)2%2*$ R),% 8Ƃ (qI8ݟTʣ}֛͂(fNg+{ "˫R>=g_;9B$t]!E6sڀ%zuqICOnjt7wsgGS͚ xR77;ЙtZGT=)-zU88^vUTzq2(3r9Q=>9 1DPhgO0l^O&]FFLnkwC,bL-ElG:;pJ_-|C}\$!uh瑛ΓmPh<^<#u{Y>Ӟ V.i I- a_iV_dļarr :Dq~Srb h}G0cKU(nJ{|`F&r24do7>.n?7?[ KTPYLs5ʘqNMIOLa$%woH&ʰ3 _07 8\db0jG97p9X΍@Eiuuޯthhh7>ߍ7ZIq*#炄K:>U/REp.6~SaN%2n=ޭüo<ő$H$#llYGUJ[yXǙ OI-0Kτs7(zg*۞]Z^d9z/mѺIz1dE nN \? h2}IݲF PVnH3m+z%gXժDR No},1`~ j3H;T e$z 襤V~]딅}S[5=* O?`vOTaabf$M|튌t= <g#W3]m^`('Eq·G6e3#`B#4A#H(̬UP18HQſX usf`0Btߛ_`g̙R`H:01?,#TBEwױ:ts0cSZ 0 ثp<2MقTRNqd 8%8x'9i:,"d_ BAX5|jːC"װ kG'W xy֐ wu#1v]t(:F<X*d8JXtMun%$ S|d;r`%z&;Jݹ(2nRuNvJdE1!; `z!:rFL=v`]Ȕp?TSUF[?w-x{??8 N1U;=p1p H[4-"o~|D|VGúBD{{Lj@r?;#wK~n`'|;#z ;r*J7=J~Gtx,?𘝌}yB}OyC/j*ć}/4hR;R6NcEcH#qxwr7mi d/Y珊Sܳ#C?JVzɁU+\n ZbVW%!) XfP+aU臢VJ(9O z ȨZ%1d)˶ϗLDK@%h_rr73K$pXq5{WDy9 8"J\єhk9N[v[CПV^wnR[HKec3WJMVpB,$J`NOwd쑷V$@sņeIgMjeQ=%~Ցd~l=VQT 424aqEf!tu6G/P<m彺LpwFk>6|t5@%87~^&3~ߓ;=tE)Tfc^gaf6Z%+X)͕A7 L6(Q:Xa4LHh\-gCfv}:C![a5Nֺ`_Cb3d̂bX`*U WMoeRMϝ k ࿳_vu)d%֩%Ir?drצׅ$>(Cp\z)U50K+JYVj6J JnEuŲs('0[Mfex*SpVĿ_ՎtA ^յ1 ]0ZG+IN~E/w绂'KDjX&}fNZ0#z2#n0qoIH7H[qjh`]e). PFdVv=TٗsM}ou#8|k@|Y@q&㰠g~J$ma-)GpqҢQC1wˆ$:.wưoI ވ.Y^u8tY]7l6-}[Zյ>+䆛żx]-ō>IZ}n0ݓ秼3Уli)QX +_,3ƿ\m^l1a*b[lsN9=sW0-> 2Sw5؊^l9aH[ *[|SåZS1T\ +W_(RʽqD ~Q$r3!ZeR ^l`$s4)Q">ڄ̔2A&سŚ LI9Vߺݳg;FdtS^Dd.[;oI0$X;֓\.gDb7qi@Ikc'G~J#Hv.e>Mm@S^xxKs#tu6maM90JywݤvOU8rZ !bL-R.nճ]ʼCG5"r_O.p|'n>QI{Fɇ9bƛlNs<ʲn8wm0v?6.K>< +ص@C1fdfŖر9 ;l LHF4 F tN|ķn ϥ։n!l,ٵ"w$-t{b]iXq Ю p'^bN3q!eN,W;̹3FYݶauvolJ__7g{2kW f#2Z8 \VS#u2C^Q6!b?wĨG:v;B2b&1ƶ~ލd] ́n1\~"7)Ge4>F>֞.g#Csm/#{DKJLzZܹiby/ Y=$5|.X2D}[i Qֆs\{2TvCIfףE/[Efm{4h.oq5E~[Yn"|,IpkU9|Fm>Ӊ!\/lND=cM>wPmb:qkrGSB$;==VފŎ0F.}b#k\~L"I鬈-3#.+ ClAj\Sr)P~UϣUFNHkYҜUR;C񋑦hP$sTXj~l^ FXF W7|߉1_(b]/tOٮ4ޭO1:t&_2zRY!o-Ogif$'x[P̥Ìj:MKrOdM_b5;`:o+5OyS$bp}n[_4d\^^ΐMϞ戴kijDtQuyNE`|Z5أ2ؔ Ɲh˹ry§Y̬w*n-4@]<ǛY5 >YV~ UsNŹD.S]Ο}} Z: G.ie$g!1L>D{E=`Kׄ.GB|^4f_Ty\nm\zN​+rEݣ<4UZ. .,X,zO޴j 8x i%,A3!*^5= k陏W6 .H>V}| bMI&R^1|)zݾ sр"WDwh:*5hY8ZeK ؽov^P~{vHWQ4xmH'&fD̈TB*-G޳uuَ>#ZNUC.םu": Ѥ-jY'u,)b& Tu7U}T*lSɧC b\, c( ݃9OX to⇯1/'1S@[X nU63_/RI›u>1љ7c>2=h@ v{&L$4J($ƕT:1wO $SaS/Ҕ;/ł\i - 3zP,3Zp1zfh.Sw o8qhss=(r#0SHO[XUnȣj#ّe*8׿$?%ڑ*d&F3 @v9-aLc`^Sܵ5i{5Nk)c;Z}},cL(ܨK͙[؀q=T6׃<`t~QyZQ3&4< e -OyݕD\ϓQue4D6+0#"f!vC ?\|pH ֐G(|*d BgaI _Ú5$&|V#թki ؑ}tm=%gk@o>fGJ+m?XxͷDž҇׵èOo?J2Ӭ›3 0g;@m3 AˇM-Z1-GLȉHMRk;'4M"MP~[M83CF7 8Gtv-3@t<N_=',Ex*j)t18v|2@Bdhݻ[v۪q+H16i` q':I8<,D'8!q%(QBChΚJe.Wq㑶/Vg Zh Z``^I< -ګ_9[PY95L`-'&(iU3=>6k^Qx71'Bj6З̓ u4橾siǙMp;I5OӬWQ NK5DRq\Գcqv; @[~b5mr\VkvkDsZ[GoUڎ/1!"37z#Xľ3lJ26F1޸%ekJVq5vW}wA]? wY55uɌ,';2j9'??7XhjwK>w] aVu6Cx-/6zF$WA .x#Bҋ#-[S-yO)RJʁ= ]lkxǎEdV0]9:{8Zt΄kM/u9Q5l4W;Y٩iXdϜ_m =}Q 0ގ{Moz4AR|,-Z z}}rE^o-߿H$WMĩ̳dkd>$TldH.խjk~!m~?D zF,$׍SCԿ~ȧ`YUOYH5"NIHρ`J΃hݻ%?P979W,~PUǜ]TU@z=MC~Q˗ŤJl%z.R]tnN8εa-,E]?Y 9"9 .158Y+K}:783Ӹ>rCd_ RyuU@޺6u?]/A6ʼn+&s *,3DH}"Vu.O",-c?nNU/{gI_k'It ѳĆ'xéoLG =uziaUy ÛRW6~& ` OZ#OhSU$mn~nm,,kMG W?"VmCiBm)^3}u.-zmT%jύ2(7J<38 ܧ7QRTȂÇODʫC=K>`bŔs:v8GMprݬzC_M8'Wq7X XO럊˼~Z M<@I<8<M^h&.c74 sMEbq`x چ"c c4f٦{;[2%k{ZTU9g^Х@.Ha/lkw]j5wZGOFڐ0 6]܎v,O.fƱSplK_6=sZ0Q9(SN?O)FiWGND%kg9VyXm&zEU({J$|Vi-M P?6gp#d8RZz1wx/<[:Ȃ2#GYؐ ٢bo5ɜ#̩͒PfX+:Q_zìR "fE#S`2{|ypz`j3گdidz婞W]ƿ8֚'9''g!þ)^uf>6wI .(  `̄8*xo q^*`l>C>M\>*g|AOqB?G M9=&~Lr.0Mtof⻙lR^J"N&f5<{~קVG |=4up:N~MjvJc@k)f{Xf* `mU>e `q|щo[ףS^I}y7}0>H1M>='L}lX>;dk8MD>4''? xQᨗrۡ;螆x(22>FgQنvԝlg`cv EQ>ܩ`ɱQYPZ*WV>j#G- M:=N $7 # /6afF3lR_̢1L"va%] 8 t9$ĝ)3'E=sۭ4s$;Whx'u r0hpWǭ`Ht7G N[,6t?UjlX3gqB70![|#kw<$${*|cg6KlIK-WSB[㼛zWO~v xop 4.W)ƌN`z3GYO '/=Xy>{~BGyS_' f$e~<'<}9 젮 PQ~%ZHa FHkU}Ϻ QLe#B!ȭM7ɡ3@7rTqf 4Zf\nuTW%6\y.v]檓 }jFlj0,nj4?{PCs03e+rmERr]Cm꒬@(^@qa}320!Yqiea, Hˡ0)-e ew)y7†k\Ӌ^9*ia"L4 !dI$ޜ 2`4pݳa"ns۶]j+ LH$_ /BB-|$NḴ0P[VLiUmeknC?a>׭&98Ylf%ma`j vgl ULdzYYydy-*y09B}|hj* EB#gîTT"=Yq+Y7?`Y & Q:SrsRZD2 nO;Νuseb%Bly9H̅$1әl5xEs*a@zĻH>wYzff* 21ޥv(R xc [tcf̖-f4b٤rvffJ]܍Vߛ#ef*`'L,El grĮ0G  V&4Zѯ r5Pu[D.WA+*kE}Y;嫕CWD]Pp{"e7mjawt_fMG-"4;ezxN c΍ ĄcR71nwրJ tfLD;H3RXzjNY4z @i7 ]]2T_邫hԄ% m4FkY,95"%Nz rK>ȱ@8=_FD$H͖c4mS~0P,J,Wmϳ;HNEsLw@̫c|%z(V #ӯBA2,ui&Q^{z7HSkQ0Bw4a6팏W8u&H~#H?T 'f݅jbLz黋wN,ݜ^ꍯ+$8+IbȴCz~s޵:Qr]-E"q"{_|O\BP~#N6S'HkŋvxWocS/ӭm yzi7.a 6W]*gS܇܈+M}Y U(K\&&3 qQyN:MD+2%C5 5'5iσ(dd3kd6u$HV05 YfSn}:ʥN(G//$߸*Nv$3Z"/<7ݿ]K#4sw#\{mvj[&FŜwկڽy }sΡ;v!D]O(_2S挆@3 EM )_V_l4mv;};ȎX,vO)KJHr w!`3VW7c4A8 ĺqtRJ|fXuIa)9/}5 HhrL(w1Kn%3 {M9v:~hxޛ|#5817XCenqK_rlA<uzUAe7?Haxqwc!nPp7wǀg2֔ V[~4I ZLn_#P3@^՝vF}[1V.VE- HA8$/3U3|j(ipFARq4NA\swO*ϣ|=Gx3hoh4`LV"pdʸ9,~e0!k |`x`V^ hT_غE9 9EQ_mC&E=FɇsQnRZ4^bUx]ҵ˽3\~>0CYV#cbUT-_?RW-RrlmbVmwV6-*|镏cDJUoaJFoDA}*Dp sI'CI`JU *^W%9ʁ/Y 齕ほU%*tPWnwTXCu 0|T>v:r[+5x*WN_D? U凳˺0,i$zmm&\0tQ!CJB //|N*w!&bZq#x"g殤 {CGDLkhȬBD^-HUYep2 #'\#Kj@HCS@3ECj2{CƵnv819\[6D]m7Q 33X`dF $!B$C4/%eP{am..*VvC6ʎCzQvNtWZ~G)) 6\nֶlɓй-eme޳y"D :xĂȋ i!]~2-X>mh㜡*I`8iiWPfC!pL ε@Y3I0'hٜVӴ%Jc:Svڊɕ`kftFE_=5M UQz,їMDڛ>Ryg 2\-xͣ.q@Ug(G e˱O>甫28~45*LdtcGak];ϵ6gP%sU*턝ղq2YS.9VDę*OьkC%:S ue\i.NsJ4i2u6O5.y:ZȐ(M*mVο{*6ΒBw=U3!krbnc#HNruԭrF^ 5vMW-=GA2D庿_d@1A,͔:My ]*ɇp/EY鼶;1s_X҅2_ve # pT/sF߿w8dãZtizp'~-̎N:c}1ɬPjs2L{i>Σԥ+)n_ZLK4 &KG4 t,uJ6QMuENxHWsu.!_A:}&(bT0;AOk&ARgqwY5ugPt5̢1;RKO'1)x, [,E\0 | W'9ňfƨTmzc2J{=~AlfǥsjLc!uM $^_t:[]K,e᣻_7Yb-ڳalŷ[sZ#˘^\+s^{zw2It kFU{WIsra (>/uv)&ݰRץݷ1Vmou~ B1PJ3ȢLH}E9V8'ƺ "W2.K;s醓g#> = iqt;E|֋\X#(S`swlQYG#Z^QgV2gCDcb`)gb$2WA\pPK Gd:SƩ~?$EсSg O=+;&/i!3i,5Qs~{8*ИҹQiPq%^Wg6kD]+xg\r?b&S #tQE߰0ev&Đ@?M|Nm4EV͖>x&l*rDwpl;CN <d>hG,E^/40 BO6XIq(=T!㡅J `JJ[#;:5J>RRS"w:&wGS رdDO &@n\hd,SUYJ'IG$2급󬨟{װ X^jђd;f[}V  ƻO OZ,R/Qfj ~G.];#ĢdoYKDeel@N19K\ 7~Wlһil\NX53烹4TDn5m+؉/gL/l4 F>][7 ׹zv~7)Zh ׃tUAE};\_\ Đ,MV{A龔р BPY_? ܑV0;fJ#Ԩ<knU1{wDm ;@W}jVL`z=EkU;fC1D>{X~[jSt&q EҬC@`hM:ɾg9ʭEEꢏ L%\;H'z(8C3`fAw|y |h?"`P;b|3@3U!i?h7$rF>;lOQ$5Yч+цie3&{ m- %VlY&eUh5BՐZ$9*jB-~6R"?>"ĕ4jV-V+*#flD8c[5 LvA0hKO}Jy XwF_UTY6A@z?ӖuT쒊U)үOJ-}-Ǻ/q^CK_t\|i:ucEڧ_}vwH\x4aHJl>4 AMK>x^ڒ|rx+>xRUިUޘݾV_ifaRS1[I::/OѾT]=rJ ֽ 3}Qd_?inT7#_F]T_Z>YDY?-XS^~G&v@XD/HMb>qvhU<򑕠bR]l*QT6))^Lhɉɖ/,g#[K:[Ha9e7]ha34FcjJlXNοzV4P;)]&N2WVKz<$Do$a׎z4 8]D]§Ћgb=ljXu[]+b,(FUSa˺J&VUʖ!/QL2i8-6M)n9%8p)MNJvFNc/i0rYNt" mMa5z5hz>?ck쿂W̊4آsAINeE%MgV`u j`cS8АbDhKBBLn9M@H™e3?F^vLԃldsR_^a tBsc&&rfւB2-^{>ȡ߽^y)6KXڣhݍz;#D8eO[gʊ}`YX术!.lX KT n.z(Œ:飷m\i w';N͜nmֈwN%&zE Q/캧) 1y鉭xގ2!88N4v˩yKZ[yhn=p -D:vf88'%nG_ñCirC0B{P094 &C%zZ EPri#t};Y&M0g53L=FMS;,JAߚaky>σ{*y$f1TM h1$_NFaKǵbȉs h OדY{OR+5v|%NJ^'>:{jY9- n0*,=stNb0KSA=k^g =[?;9B倘#9DúNl3C4Zyu\Ե'W߸^~?֒oY( ݎᲯ\4^}:˞ $h?2 CWMXu"6'䫨x(,<Y\ɉ9ߩَ2aN!'އ7'S8ݯdU+)A5e_\ E ]_7JJp-wϖt..<7 >?c:Ş,I7BmL]w 7/zmxJ5Vג而13ϒf4t9sk?4*0 <{u%\]y܈dRNnْ^*'_ r'NҿiKΫRh.S0RuI !ܭa52ErhnZyӁM>85`ghQޔJ[K^~%<+Ηf\S#\7@.oqIEl׼,^>$οyzF-R#n]y=G8K-wYVta";$qb+hؾYNP|P9m'yE%SWkncœ:zL ͸]y^B3G*f,_|^}H=~_Z@9oE티IfZAE!G :*;lRˈсacb2c.Lc@?KR1^|1*b1"&ߎ{5>Fα[F21p㜞FƕqȮ|q}alA|=҈M;*V?%/E-t5=$GaEςӝ!,(r} To1`}o=ڸTuRgO\{ύ{N܈saq{A}@bXը.\`V5\@}A&((}FlʹNMIP5 ,be= j?(N}-9(GA=<1a^!>SoWWSnxjR 5E b7sns"oG9ѥ}xꄰU::W{4Jr)qkWFT2ݫRGaó+i "^ncvz[W2ͨx1Ŀ1̿_8iMI(;m5V*ASnW"S@T N}Agw!DOo!P0"z 3c@3elr.GrcTg5 ڕe9݊ N۝]D  a[dfPɒla > heB Zvv{7(>X5ʁMzle2Mڕ馗=ȔP [:%Y$@Bef޽owfmMeK.!]kl7n"0f01<^rrx@Px@‰" g'2S ٖ4U\11T Ơ̥Pj*"ViR^f-5fiF=d6)rZn( 8iC]#4h 1l's-َ%Xmeu-s]Ψ.۔a,#tђբZ?2Tm!nΞkEgRJ)#b՘&>;s+3fWgz9OWZwWZsKT@@4L>x_SSiM"=hYz1~3sδS}~Esh2oEIQ}9j`lq58yt>vk֠6ۦN;jwz鴤O6RgS8{d(mNyqϭnfZ*MܛjC - ꍮB4+o!ɍ 5ݬ+HMyDmupqEܶ-PWH)+gRqX8Nгu&#T9RO14Õs(zqn(3+UBY,H=Q@κoK /:l6C]3d>/ >S6Ƥ=NS3tݱҦ@2CL3rd>{|a˿a':Z a^ }nwoGf ~dw01ŘM9"͞{ՖҒ Eðݓa)N-V,mN4܄EIQw53|Lg/~eM~j=csȾF0[N+o>ꏸ.\i 3aUIޏk*ofSi$ɱGrD{F,I9e%Q1s9j$j;Au 917T7d=ẅa:LWr 9c?yjE*LR߈R,!CQ$](f{SJ.4b>`9HNjbTqҵnX/TYDy㈯hm  N*nCCs6gIwΫoD=[no$hZ S8Nt_l:HrǬKޜYI8N4݋)p#PZ>IMt&;i-jVeKJҿEHWˉ_O.޷<@"LLħ&UL]\؉,{j9+$dN>Zi鋔DՉCkmSXZ/5Ԡ)gf+f~z莂xF9P`}`aWYuuzxW0zjT&&2rS=TTe933Ә)A4:j㼂K%j "3(3OCY,} 7g`ei6z<9Q?Ed2vTl@;v/_z>5{XŸpLp&ب_ѰҚ6}7dz?GS> ֫hv8D4[ 'ԹɋQmd Lua) XG $cTqraI܎:mfh|l`uLcf^B,h $w+p.n}ܥ͕y]|SȟaCr֬F0ճ?DI9M/=j88WT/D4Գv56ɮSw_cGG2RAUQ`Y[E&( J;)fCl VGBآ)Z bjY^=7rbY¯B r5gz, 4MXyTOM$|}02u屘x; q/knF#H1E}a'Yw9L4eC3uMsE{$O Ox3ӄp=FO9[wԡͷB?⎗Re*JjfS q< pnF>2 9yZjԜ ?s#:@Rߐ-[ubEUP_E!ZID: g[!>K`XBVCW"=KAS#B&MtAl%XtC D,yUep8V_8!]Nz@y7=.پK'Uz^"/ٱ2T7joVěÏk\jE}5i)Wbh޵P1$~3q\ @RMO^I(ߧW#<TP zÎ 48X游[~K|]$XEc&ֱ`?L?^uvbVGt^! @o _ݝWEzU܆.̽E\x*lK:scBt'vN_%_!CfB >F y# B<| 酅 x{hV!hXB`@z|`9Co^i^cB]sۛ+,n)"oѭ+q$90^qk9cqM(6m:Zi`$щ]sV _a.4RSL)Wp ˛|ް䒻]j>W^nXA ^ u֛Q&i.`]JVˎE 4d&["e¸ᕍ' pbd@!2C [%'/n"#yG[( TAQ<#-@#xr"Ke|n.q۩V[M*)XCnQJXoT'^>+ ~ϯ\ָζ  #E{x 8eɟo6M O^Bឰ. LXz" ˔Yf[Lf3bg{ [VK<&|m,^jJ̶45P) ^?>Ǧ  \`2ŪZdR,=B:<>, m> _N2\I|TaI岲jPyd݅=c@o՗UamPd0E=u)x3-+:Y@I T("J)[m`53߫y;'M +jʪ~+%=\09*B6uAt!.B3s@3elrk#"*[+MrU@"]wnk~Qz"X4`ӶR%K,I @)?KxkD^ЫxFr}+WC٢˦0 ZQv2Z;,K_+{カo~e[vTO&ٶmݖ~r.fD  "DϻIYE${ri/B#[$"c$*6#>_P*78@@ wwI=',WY}e< Ld%!;즹Bg[S5R"?ih,8n͐Y^aX%qlيXD}h+fʔko6RJtafhqr/x+uk6;LucL#5e*Q2LR̟ͽ{zg/i!]Ǥ ?~Hq\$y%RFxx" ]G (Q{h:#hIǢ4+]'khY f2nw&enX1쳙^ȲPQ2ԒhPˡRL,f e9UxxJ{{}Ĺ9 k*k~YQA[6 ͞=DUr[cvj@Pi*iVfxt(IM%@sۡ](ִ− 0J=fc)H9%W1PDG0¶j"Y [9pϾk#ں^C"jۃm- 9R rlXbsyB{LQ#eL J|2ó즹S!aq d`$"54֣SI8(,Dd' j/7:[VG{`#`YC4=A;bq2 sG?8Վ~nח{C3];'`| #8zz~Mx CjVU,c}w)fzV7{ۗrvvFbl\7tpWB=ό 1 v઒GiMǑAP1z>ܮI3n?tɄ;cq%˜YzlN׬?h>y!<2a88vN&wX÷ pi?y@GT'nB^1"Ƭxu^zՏA5kW^+؅gU765"b7  )80w\*ž6PIn h'u"}4w{~Q˗r]K63p5 {8IJ]$ֻٷD&NkƋ5ʳg!7 9D<:jKk)pv`W.&tzq#7\(qHYM'nЯ1^jDԗ[ləJJ/f9ԵuҘ I_ǵ^ɯ*פ'whAP]'bNy ,IۻH)q-pb5.c`X/yS?as'lem2X,x}~no Riryrt4Z9ԅyZ݁0oLmVdr<NI{Z'VWV[lW K6.;9PWC-3I7_c/b(^5r1n#v] \6ִ F?Q%' v+hdM˂}_){M#GVLef4Lb^ =$.6rۭ4f|^/]bFȃqmJkJK3u=}ÇHlh'*Z5(?ekhwq$մ5b|/LTYTy6[`XDFal)\țH=N("w94P-G]듰$\Lo)rfSk]"g]e俬#E\,K="J.*+lQNt Tް  7 GmF \Ί =j&z [uģ܆H*=:靎}^,ˣ[M4"੿7!|׶V`)2dGM1ޣ0ۣ0F_GMpGDxJh`ԃg X[>l@jlƣwED$I`@)+p|[%'0+Tڅ<.c\/pW` O,UC/o~ ٹU}!aƒ8;b|ZS-2, NZD>R?A ˈƟjʚE|I< D"&bF GS7U`TC}G]Pa {ス}l:o)ڭ}׵]j[(JhDHI H8$QED/j8#xOv}H\š)PT BrJY,HjB{ϯfAUPOd3KXbqt^&*>l3-hqq d$b̐V)Գƫ14~`zy]uV9=`=.Jz򆟚=z5SKcj GiSh8H-[8汐k߻#eS׮vMjmw}jyi"N'Jl1i"Kw9nd>@}jY[n{\JC.}/{'y%Z C#B[&Ļ9]PK>j2-:QS(I8 XrϬjiEKbVIw=tn< :1-dǬOV]gs%Cjc^zWcC ԙ &1Ak0=\GZf^2}s&(47,{5Ӌ9r&]hcwBcDDWB-SPS:Y@lU0R2Sqb jY νTkQBܼ"P. RM [Wl7@GdeHsKZN ף)rIuTrNܴ^C%\*J.E%@W) FRIvksʥۭ@dPE,kH>q4l7QM~ʻfUc%p%Ѯ{T ^W+0ŸFIrrږ_.|F2=$_V*V 7ٵZF $McVvAL9<5kJ&p#+Yso5zòI?|Q [֞XřGU,B}e.(?:âN,=kl0񝢁CWra뺳/?8LF *'!n6p%'>ZT Od{H ;;Td[q=h]@4aVNBdsw<&"N1 /_+*-~ tr[p"'>iLMA?JҘCjmG mi^.ޫwrTw^ D; $h z2u|ШjlznBbiC G ֘CjPRs42At B -wc <:ateCZ(p4XcɃ_ #{\0mo`(w++ G% W*`I;78ve4cʋ 3f詺zcWsbyAbr%.)g~pwB$tUm.&W``{z&(|l&L>?TdS MUY׃┘O(vR(?_/Of9;GW߻G{d<C=It/a 1RaoyJ"U@-@aSЮ nv|‰a„]RD[@}wکLT8(yu D (Otm NL"#PG- Ĉ-^?L*|414[b7$@i*p08P.X00ф vC:_4SqT)U ?C <,qX; b &a:b;x"d?Vh\@8ш 7ql%GBg?3u3!1Rn$?f$@Mw"b%w84lFB8,H6ΫVO 4Jv"=|DqsHgl1F Z*jD:4(A!8vj#N'=ʒx`SsCyVd.9h5Ns߹n[4 K*Ysy_cIɊZK=wD5$ tumn/Ѣ::T,S9ii\v1Z6-vْv["4EBxy^ z,2VAœW s] :c|v IE_Ҋߴ+6"WjgPq|i}>iٵu%C6R_YSMda~/O2eglT''~# m@γ2أk碲'N3Ũ^VIfeeh4ʇcak#hJ ne΍cq6[m1lPL6㞾Gz1ţD_:|XG#v$PNL,hzve ['ubepI)OKc ád6#FU"jQvF̏3#hIdR.|ڶ?Cf?S󘾎u)F|x=<7&@t'rnhAj+GoSN>FpCN89pqlclqp#)$$xwHxC09`@ @MȰ6w3s@3ep'rdkѮ$Rvwضm ?_\`X Fd,BI%ɲ-٨ P4"wi]{dә^Mlzd ~AG>>I'I}Җ$[~@8fh }w߻[m{le;mݵ5lTlD>AH} $K>CJfXKL9d,rsmprY67S=l~ZܬӨdUs,Mњ 8$@1qZ@Ve9Z涱bUv5:֓D?vUZ {8OIl?LnRbQXUz*8} ]-Ա jWb6օB/i|V۲v^Ӝ+mHHd: ׾>Hy+=؂WXJ Փ-WSÚf ը2g~i&K']~,o XW-yfvtWExv.;Q]뗪]!JNRX^QęE'^z`)G؊48[5 \ßM@}|ҙ<(H9|ZB4 Dt*@.8}*A>̶g" r]aot3g[ۃEo;(s׊x=l2ּͅdХ.z^G sw lwf~lVĕ(n#yL̆3'/A,q}"BxV$.Rз\F,zlu([u.6^2κ]Mض57JZKyvtqߴw;SjѮLl ya켹#7:vasW&ȇOf#O[9u{353O0EU[ :}-\P+/i~rz҄ߘLܼ?sskNH> 4 8X [nX 6 ZhN칹i_t$+zloٕkD>0ŷ%5OgZ-x':L ~(a^s3hXʾ:s瘴HHeiYc!t4>bvXwCPʹrPW [*cuVsَ`DV:mu%}*x!֌!sHoN C2VIT/3'~٬@ Dj]R<&Z'Ψt6c(!Qr GƉ* B~1CAoP[t2P5j7"?/$ܨzEGvk̀aAzW˒q}Yb1$6Ru$ X4:ۇ z.JAIv㰬bRHҲ́nDj˿agmߐ3 &91D{wc3XR^1(2/wwFd=8P??ڜ WU s1KmxJW!o`ꮽ?tw3_c.\4 MS۽"Fq1jsBКr?B[`J֌]dYJo[SY_'#;K3;pQ" Iԫ(I8:|^#`5ITKhuc q]Fr'qIKX=G&s ǜuR:1檬`÷ͥ&c,FmG5OQV5Mc(lON$@+CȠl1l4UmB2Wuq|[to\cμ>mjZ|y=&+qq[_bt_6ܥv?xY w~Bz`O-yݝƉ{pSy‰_+ qJ^:VAtX$d^Z 1udE/?!bHJe"CiC-yƼFM+ }'D#.xFNY[??jVM )L1 83 Df Ot†Mz"&ʥLۗᲦ&t`2p+4~d9T0Y!`#u쩗嶺+x4w? ;\ ;e9uf~Js-u[EV=jww|/xpX֘ɥ|!l鮶jӣņB`Ul4yZlbֳ[=@26ZŽ--Zw~GG|ph[@I/C)]P)8 H1^A vFkrOܻ$/i2iK+j3S?d!qkBTBUR =[ u)ڟRl@-9dV ^r<)0IY$bB f'BmXv] :mMA@BF\ ېy?4`opQ ~8 R e'U2y|<ș,LXO_\kŘ5:z:j1;?,ߜFFD%;sI|8*'ǟ͙ -6-)  Z14zÿ?cXLuC]7~ \8SY뭥O<o{"٧‹vh/)=mc1_N EUBjS=?X1Zt ]0t" L4HM!4@P &Q!qw8*PE*uA t:oS)9Y)vK++yґ'_tHvp,\x;. )3#\+sREC vsf9s \%nq52zɥTtBA W+]Cav@NC08%&{ t*gI|W zN})9X9?HbCd03nEC =.5>S#-Xik45'd7u--=S|\߰ KH|idI$$`Z&pY[PDx+;RND`{ ]؃2eәZUv,M1~!CGFހ{v̶fdٻnZrq0@ P0@a @$x A[  *ĥ(h1l4KT8w815PIJ59IMcnLgl.^HD@O- JR4%8&bzzqk[D5r8KJƺyc *|ݒj.r!F=cm`_M01c8-g`YfSWNh3ZX/ݑ|EzL.M 5tԳA;"otr-)=hyyj;n``hR otdlɑ3|(nj<; B'wzG}n^\dx' ?rAaRDh#q$L5/kgvɇþ$Z)i.?yFn7YywP\9 n#$Xgy~mf]݋h?[ a CTG-1 /Ӊ(ySsU j ):r5D}Kk5V e˪| Jfx68mj¯Uz.[oTqƎ dݤ|A l:-ʭ ~66$*g%4u 7HGO.1)h3ILlV$2Қ'2?w{*ܱlؖbYN~u"Ju5sU6fhmRLJR'%glr. EI-To] īQާܸ/Pym! {6SL' .eDY&9؆٤::b3ce5vﷄ2{'XE3Ҳ;y4O6ץ2W b3^9x횬#'wo{ޝj7[qGe~Qx شN16̐\@Dtl/Z!ᔶ@RIВNr[lD4WT"43ZeX9vHoA9s^[ DAq cVjT ;%n'6/¦8U$ P//5TPa2ŕOZ|*j3L(r\ S\#}9*i3V'Vaۭ8mW&Z(I|n@<>@DlM(Lg\:sON |L\X]"lbgY\B؋fd9O`&7jˎ̼,5F=ҏ`o_TԹ$E'$X]!ỴE7r[jsרT".?srZV@V 94%`S'f>Gܞ;yh>}P>ڜ#y ͕xl5BbcIv[mKg =|vɰd4򖬘F;{kqw3p ;(qE)v vUah4tUV*)V5|SAzpO[?/ٖ]aw(NEo~aG8-XĮG'v>J>XJ'N-<X3GrokX#q*BU~%?z>YRįιꞘNiJ:&*/Ӵ3R6p)Fn9̩9vV09~MDhٖ\[Vה _oEBvWխ9Ɣiy(Jy%Sx_Kў;jX Hލ1w`1p^.Zt/9Y_Wu/.(БNzisxY|QW3RXbx/+֨.s!х8^+%w+]hg3 r֎3f2惣jDp;{ypѴ{SgDe+AP8e;Rcy#. /wy\EĀR{ov?ie}OC76L}/"Fi _bW#I^I\%C1<[?ڕ%ٮ>1pSʡ ]ni-Qo;}å+5 +C8?l5:i{n-\D]2 2Ruvb#[W,Ց.v|?@xc"AaD i|?ţcF=id^#g=*#z|$^ volbÃsK3|4Nz7g\k8+C],rV_h䓢4KPQO5&4fAaf%WcxCj,.1p>`}\- n'o*N֫fnv̺wYoP uFbs5d08dP䣢7j9ٝO3Ce<;:С~`,83_/1dRx|DG! m/'HmQ=$ 2PKNkK!VE(=wWV,f+D|```$M##NNrs L((~ޑ}%~W^?HabDH!ax" {;xѣ ' 1)vd$@Ȩ70rP_^ y#?Ağa,me`E8aZuv m[v2ChW,KmI[kv. eg BS-1465<5K< d <`1bKGya/e@JȎ {1j\:/}šlzNW<Sܓ]W(L0:4Edq X-J/t]r3MҴgeh±Y ۛ ;!]6)  {"D?! 0?;d>@W?v@T3c@3eUN7hj$<&,ˑ)Bwskcnk^Q"f4pq`-Z[-!Ila >$I-JMT^w;o(Vrʽ!LtC:+eӠi(w@@В=O$d|(P@(@?wv]mz#Kmnv,mnH+!| „y#O!jJgOR0Ea [f\#q4\ˮqnvOLϩܟKp45]=_w&|5FͬdZ%<'l2{LԞMpg1 *rc݇Zv*srkl{A_(`P" U)j s: .ל`+SoS+6rz@!9> ?OфTl^ipXT9ijDu+h6p[eS$ea5Bڛ_ P>aqfݧ/ٓʊ.)h9'ӴT$KfLegEjL<{+f ^=)BN99Sa"Pxԭβ]0&k9A4`ʼ!uk&eIyBU Y.1Jgcͻn^a&S4ո}OYo0:uuSxy yNWcF)dɗF(2kҚ*/aӢIѴ~HFDo:8e*7U:[񽼈JA72:-bqldSq+X<"`BԣJ|$y;xZxl^,.4!3 .,ҶDG]s r^l^e`jk \.+2>ݫa8;ʩhpA5w3 g3zx%J@禜x^/Q](~/UCp_U~nsizj-RE-kC&sd6[,8i ̑}\$em%ą=2HENg4:@#8L+5uf; &8:UJG9 W:ʭ[+aœ-Ŗ<)SL1ֆ*ms ʊ0;@ ykVt\lo{K#Hӗ\Q HigUEڣ[\!YxH<[ +HN7*z΃ jtu01wjYvvFD-Daԕ|=-Ӑ-Zl"iiSFP+؊q';^r^O.-YLmh@ .zV P :l09V&_L P]YpǍr4[gzxUU9ofДjbH)cknAƛK9B]릹!c^A7- gJ P]Rff0rKPQIͯs@Wl3(+֟76j+;K;}SOlu%\fw22a&ws NvݿOFL>{zZs2(j@ATF $ kRv$Ei,CKOQi砝x>,m008+1y]f4W̲Ydv'2~ jwD-}4'~&S:GakQ.;Zc c,T6V6CzlO=ZZkm*}1Wzņ$uQG9˸lL4=T^dㅌ7b3п3~ީvkFJvHx/Goک<ŊSZZ.+p4vAY"ߝ,;<"NqǸ٥ɜzO)qgw:؃n?5c)_:O[Dg8\,Sq94-QX># i79`:bSlmJfɨЋ*C8ɞLr8W7h(i(\si[-tU KI[~CLMc=ؘt0TålfJ?xֽ$<3+s=7ɵ709yݙ%;~PBf걘dtp6,Y|; v>tgM驗6'HeotJySU%Kl(̭]ztϩXYO_w/jOC8.%Jp@!/?NhQK?vW-yA3^U^ͥ[N #ߠFV!{'um+Dp e,Ҟ)8ŃK*5^㧖h/ ^F'tXjf>Y7Db{,=:3øZM0I}bgAK*v!(%}dM5N5}= mw T"uZ@/%1<X8ot{*'ikxBʌT5}{ɣ^}|볆Go(dآ/bd]ހD֕śRgֶ7ϗ7*6rvZJ kpDR2ox Ã}RO~̿ۿ@A5-Ļ|X (rN_Mףkb=V鶺GM֑ko-Fa'%l1L!r+i$-4363q (W ѼqN#Jx!|2 9}NDѵ9㑚v\Fҫ6»P!N/nQ˔h3Z|]}ii=nU/ : @Pp$N9Ij$NkEinGhWZ9^YGKHDgV[j!||JF 0#~Qi~:FclD* vӘO#Ldi yJhD0> z _9QT{''1rO@ O>\Fq܁MKKIdhBA f`7~jq&|H9^}`#h8=ަWW%DiՉ3h4KKA"D:Q0>;bP>3 &|yjB./`9/g @Tg sQW͒=cDŏ# 1ts|/s(.`(?<8ߣG$ &ÊJ ]G2t]pa}Cua}EŰїyJ UnAB^=ֈ#i|.SII@׉Gr$&eHr^g=uqr)8JQ.'&W8Pfo83DC 3B @D*;SG'*dqpyHq?Y8R=[d;ϲ2P2y6P\i~w:"W ttU$.8 oכow R! i%z:4TZ[dc ဓcؕI1Yx͕=ٴ4 W|!0QLQƛ_nqK-\XTdɢJ%f u 1I /*K^  V):Tb@ #+XOp2?'{&20:p^-0Y`(n|L;<ؠ?+#H;TGkDfMu#:+-i<m(wd|V[nm֤MBV,K4S[O+JJ\[NJbF|wT jqUR0^aBJSL+探ZEI8mvXR ̜Sn>&W.h$qUXK4W*.mOyH@ԜR&)4i}ؓyy R!]dB*Ę2SB!p{K]瓳`{(/l{:F6dZٞ,XנNr*67fTا\ulEx,Rש:zVa>ƥasR$_]w_V} O䩩 Њw)` >Ny_MLjlPDJ/pĐLcٛ]A<-ت~ݰz*o19EA]ߜ[yD5E(g^n;_,j"Tym~BL<S1Bm](4w﵋#&#X gpoΉ?m.{ =wf7ywaBS=ӣ= j!gG"[{u#DQ=\@qK1M tj5G֓DB=:y[h'|Ӛ%醽uCqĽLgFcmT2Å>ִJVhk\LTWS܂= vy8e;=9ZJq#v mwy;9#-0ǩBn.{IvrZ+= p:=,㜦<%AeѬv 3ͥ1٬ C)NN@17:jO_F T M{Æ\4^*LI|wDUL7)/wC)D':2bZVD7Zmr0+# +8 G{&<8ѯeq)`䧘0ق :w~.6WϷbmX+Ó|Njgw8M ls2QSh?ZVs?\.UW # =gOt7?; =2`;hz}(s~1ijqVPs>=RQ%z`?v6&ido~؇ yQTJ#ڇ|NǤzQZيdU>4- D?Κ}'V;[4'uqi O %LPO޷ʀѳ;>Wߏ,]n+BdK㚟.I9 5]KZ l3&9f~ɽ2v1[FCKjk^wUc^8Ydų {#ы8q7xv){;pثgjcY͊ ܺ~Z8۪7{.4m V9_nC ,\Ii58=o\-e[_WXЍߐ(f0D*/0AӜo@<*K(CV7ϓ%̠)d\evD/Y!p#0ʼn+|VM@]އ4ǫX M|v Vs0VC5qZ0d $-y<4dCއDهۇ"xH r6xq!d1<;Q H(ckCI%|xHxB{,Hi%`LJUdJ"N^{8kw%~#lL*: `k=9¤ՊSYT@-5vRqm4F lVCV\tv{GKa۸`ӭ_^&1(XqG4qy\Uְn|/Mx1<܈r#©Ÿ3[⠋ȼ߮gWyL/d{Rxٺ)4ؼ^u_m~KP$tî|.>`{k>Yr '6+^tiBKsK䗽Ix|xP>ňx$/`n\hEBXYp~A耆rڝ||Vdy.FRxW6 sX_Qyĸ4=ZE^]( SCO@F)kEq~0_M# ]2W>b.u30=Dz]˔u77ot+-9+~½d*_ּ} 89>P_1|42|4W^%'D7Зп<mhfcs{t julΛ-Aclozz<&naGD\'99U9oCbo0>s6;DRTsD3A1Q+v\zw@LxMdä"66M2DGSGW=8Fιb7#=N<#q^D][7oֳ!X gW[b)nQH]^:Fduw/8D:dzhtwnez˱pC=vvv:6G}@E2I#<;_d\<E51`c*Ԁ0TK^{B~폸/Ӟ^qN5K%Ks\n1-[+ 5؃cҰ$H$7`>m|)&t7)Aѿ h焽Vۙ9Jدje5⮤ZDk@^JrDgYP gly+G<:kZ%#y۬{Bn^c2*ٗ>W|GDL P6Y_&@%侑J6(EgtՒQ*JMMH"Cbl͕[so3tD 5d8?{*U_ _Ꮇر7N rkc^5HwI{t]qR1!=~Y~yDS3'Rd@_0 pL+J|(ºʮ|%K|N^ie%!>25Oمtv.ƕ{ʮV{i~ʱI2 `BKImD 輬/cCeBI0(:9Ԓt_TE~bN9""|V'I-&'IUsACt@#V!;5~Mc*lZ'Nk֭;V7Иsa=1;0,+,@, ,XZ[ ^UcԹ Z̽kk6^xmKj iYw-x|0|@fh ww[$MDzj2mn{ZnK.?AA D @GBBByX '<T[lg~Jdz9)y3)壓k\{1hy0]|)v'f A'#*֙5Ub ƖUYǰbU/Ӡϼ5TVx4~%U>Yu}M<]psG?!?jJN>m>r ƆHى{o+NELߞ-8 n%-|[g'm5V\#kt)K`"ӣ uV/4.)A k-璖XȮ۲B'I slP~nAt3}>Ucnwlnk?|j8U)]_xkv#w]AYƈjrߵ^dQ}T0R.X[uS49 ޾Km"K <9JAPM[R;kzu,nec*<+KQ6SOůb >k ʫ1 }ŵY7n-}cd/'l=\ 'c,z/ޮ"ڜ<7:hy~^cѠE$kf./: S͢U%A/-moN` |& ~&3ʞĂ^ۂ8y X@xج3۝ι}^ywfԳ42Y8j d.*r4mLqmC´XҩѮjxSB떎K=P¹{>͎vĽ.Y o;-ҺMqֆ+7ˣnnl cW^6{z&Qyo4gUQ6kl_$%%zE:,%A$; xzˑѮkC+XO4cqaf':˖`di1nF93mԵ{dc (w8V~PV_/>ĝ:'WKz521QI*"GbHBvK4jtB+zn3Sx-,8ONJ"rWky]eA=YDa\y3LW~mCJF\W4/9*<0B  A u[vwl6<85}SOgĘ Wv(.ae"LeʚzЭƕcg_#țlPŸP}"5n忯D^bY ui#CNI#6*%lߘyS2v=aќh'xG sPP`! h G%;xCskR۽9wpWsw)4 E,yƭV%#{ͨK7ȴ㵺 "S_RZZh 9"Lﲼef^*-^ɟq-$1#9/qn#>Q(WD39Z mqR'մ5 lZ8i\Q( Qrn&ǶlfvGUѥ*.ߝ]wh]Ipvi#es0ϭ]k%67No]{ PW̓.m?s^оDJ6HfeRɆX+)]nEmRJIJ~̠q>_ v #F F~8@[3bJdEW ;#œpf> ZK X 3i<X ;JHfAM$vZ[#%bd+)-6blelAJcTZK&&qlhf) ]ab-Wp Po̔zinfL%_ItO׋J 3c,K`qEqpko6< n"O?[ו2Km_P(wY3Xq.qGj#Rt(fNEHhĠNChq 6.o>8W)c Sgn MM7 =p/ /3sv@SƘwTpV T_xJ@`H$'ԃTѴ9F!|G ,4_cu27lH,HlMc%K'!~Gc8#UBҎ@+"zr,\*0T خ D"2%@N>@K0y @`tטx%ǝbiGb弨G^cA`ɸo˔ IbݵNJfKO ctZYzR_C~a("8`>xhp_4T*a-,ećêf{G.28Z>mrUJ+";@}Hz z{2qsDlޯ&x+:?|~y4s.y~WLSw$~ "`;~N ݯVP4њM%֜TBlx%cb_aׯo.o,g# VBwIh9+t,jkGj Guk7hXѪX2 ,4-y2.N54@#oe̐ NE2&eB V4n['zѝzs'`3 @%/[ @ȄYo,[ $Ś]ѫ}{(f#ƌ7xVۛGΪ*LK0y!#8۷.-- e[~k cb8fba("1D$yc'@yϩ*mRd +1T`ȒFٌf˓Uf9/^bqx,[M&iG}iɣ+q35Műdș%{ZR=jx-L9(N^j c|(q_UeЩ% ~då?W#KҜL']?ΛS=7'6!u: J T77τZ2_/vQI?funϖPH{S\1QS;,0",T%LҞ/gCۢ9gv EZnp%^\%54<%NF'pxK \kKϺvoZ*U^ApJo9[T*1,>Q73,6'[޶)!9WAaF{>6No%I\f̀9/y}ct;Ĝ/V%1By]G߳XuSgsMOtB> !"&=/0hLtn'wAr%jta0ܒxx|B[9CD|W_>-dN5٤CO~" ڞbDNJT4UGd>-ٚ^<>q͸6y%-%oA-vU!,4$԰j^usXpgDsCb^!SnMO3c&nwÖ^_27>뿭өeGo:cj !8E2Xb1㜚>V2m{;}R(<Ɵ Ŏ4"kVq#KRrcU®y25#.jK/8uazsr>BU\Wnq;'(Y'4o"I=bRZ"B,&w[ČniPhUʆm7Q7E۽IZ?JؕO39hvu=v;O:6۬3ZttX{{䋾_$"΢Jr:x+QQ`gZZL @Q[fAך;^+)1dykϽ;.sB||4أңO i̾~|Km[ d1a4£p%Z9u?&THut X-¾j7'Ftdn{N2%SY5֑3QB${Ӌ_,WHU@ah콀MQ{ǘ*1 eJ;Q.6XIk͚,DGy̥?M($:+ ҿGK>e HsϮ@VU!ln{nw\WF%np3cHeSZgKN=L;Lu}dU?FَW,kՠ:4 Z}6!dP4ׯ]X:@eTE/a>t bqk\7Ir#$I,x>1H\`h '0>Hn!4gb~9n}kd"6}8՗FQm>G6߯Zŧ#Ǿs0ͲƎ~,`%<1|kx,}Nʿa$9X>UfcgHd jCI#wuCFZo9D^9{P'WP{$j{Z֝y*?&0Sg.>"\> %B^U= ~T }nbo-ρ_Tob/2oP-؁2JnM|pxʤ00t!j`av:XH1lCdzA|^tj:27.2@`Pb\!ˉ}Re$j]C]T3`[}W ! LTEN :KDWvUKvYuHcW<"n/3wZv~Д|r\\ z,<‚Plj~qV;Cn ;Dh%&b9+͝j 2gN51rЅǴ Ls/Gs`4jH+li:m 7aޘ5EyY'HSq t1kEa{OJN&J 3ˮN/bVlz1)1aI`[iVZnaoi31451/]9i/ $$VyKo\]^-Sp_nD^''>n_u&/3Bt@s@oIdQ,g4m2c78J)\XGjW R]cqeYf!n<A oy0$l>zE|`ڀ'l,tb`?Kܙ{_B1`9EO4g;sa1P .߁dC/ر$Z ?'5~+jgc(up kXZ Hx`"&! rH7 9P@nH\AD-J0xkH_<$-\ t\C6)cQN/Xb_$beYD<@mS/( ͈!{r P8/8Ay#m3dց&6m?6X\? VbA)C,Kr*:zS;>PmJM/ `Kfa&&R xC4@3oe͐ WNdDIgjds5r!{뷬gKdz2CX3p`i$W|M$߹k҅~ܠYmHIKkoC!lj㕪+ jʕ U*B$\|" }{=.Yfm#Ln斤e-"-U/ / B< AAD8Ҭ^.pYKdʯ( Պy)W)VI]%>eQRܚ۬KY|å&U2lK2o\ԲI)+3ĭ*H=q.k޿9ȍU11X9DwP!KT-]Jed 9FK%ը)ytM"ake9PKHcũ-LT'*ƦҼ`Jp*0/$4\q?23d&FW$#]ZnR*r&[K$"6ziIn^ەFQMQ*5БN)ߊ5%f'՜pG5dvVs<$qN+TeFYZ˫ᔳ+<3uXjry_Oİ-S HTBn:vϹFAs6x-M64%]r \g}ATiㄈ="#S[&R>U2Klv5 m E\` /k33%;jP&"saw[3x5~kd~4`J裃d9;G6AYA(~}hE*f,:{]#V(ߨQR 7Z8cB V |Iɗ_hnl{g, U_>ǕZ̘GY"D׭?ZzkI"Գ[N.gµԴӇoF/t`tGM)_ZB1RU+c77UuO*Y\Dӧje<-ui_ѴHtH$ m"R5Fm@jM6qAfOו^hצr,B|4Jmܭ@kCUj@B1NRe`=!HIn3PQsPG%")ngH_݆w Yb?O?cNӟ41NMVT&Oq6hm O3xNƱLoJ_>bS%E:D^4AO{>dZ{pj}EYw^R~hG„_*omr0tprj۝W@8IwQ4MI 9 凛YA9WA4Oe_YƒlF%a5gwz PmN*VԼ/o;t Er@^Mĕy{Ҽ\,Wh _u/aCt30К ]/b?UP,CL) |7n%SnylQ^]ꉖ^ hz(?̂)l/VNgV \VF]M}pO,- -i.{6rp94Ct`LIk2;WWR-: k4%"ݗ 9LdUA6+JT8^n7$F/#&wEŰjaj3N7YV| H~ƚs`x [ݾ} j};h,&=hi,Oerj=wt1~)7mmRQc-CQPǦ!cH>~Z˗SwY݆)UW0굟XNz0OE0F9u8~q[\SLc4T]Xt9A{]fɻ:|vOqlOqr=m؇Ә7iRc3L&0B`! fs}fncZWa,XyYu}VMz9SumrjRu) $C%!{Ҫ≛rMNhsU _dsp'zk.?M!ZΨf5JKqnc/.xDM[|YjE'zBD!ϴu$:slܳRݩ9Vtm 62Ωӌ8PnY3}V|/O3_O}N u &r^|Ǖ>Ph|M(-e+D$/ sS׏rXLg/Sb R>鶟ؠcmQ7%I&zqݮԝK%ˠHߖ*iI侣nYS˻g P,7p!Q>mfO**bf%oy4A-vs.eKK-6I?!tys+>3_PY 7uq?>ܳz" ri'¦Xg&]O.m/v \z wf# 0k} jk`5p%,s7vq5N]̪=ZvO?؝,D4pnRS1/$ ㈭=#03.[] Y6| e. lCu5٠?%Ӿa?iC7y|{C׼W秳a ?B1p)E({fq#TYf+.DCPgg%6>ageUZԁ,`69.YĶuu#k; آs1@`3g6?i}.:E ❟G!aE?df2FD?K샗ґiL<=g2Pq4wN)tߗ`)i} A,ԗDʨ*;ݷ: NCQ|юZ~30?ꩳF- Ÿץwѻ˽AW^5o7nB՟AnXD;*yu6r[ۤC%[Vɗᭃ#Pq`L):oM.7xɩ'>s=DJ+X1m펧}VSAY{ˮ_E\sמE+ƎYҚe7*>Ga"|ÈC+l\$`S]VHH/rWv ONRtѮÐ@_N/Kw_ݬ>p>rr=,el2dׯ/&t"H_Irwk=1z[Džǧ0#‡6eQ,X8ڰe?X>Z\fSˣ}?h^1cfB-38bwR\Xpǟ΋#u33} h`#!**:×A>1DҬy\ :#1՘B䓢m홽GG t~w$(Y؜>:$m>6Gg8?6: t"Pg2g}k=Rj~3Yc?>;5;PGMk@ny"Sha|/IKsX)>;U҄X094yŀq5qKkmIڴp`]xP\CsSM˖FJjG ݇%R ΘlGjcKϲWor}T={a#IWQ]J;%&,0916gE7%{N$޷g2wnõa_ӈ]"擡XěYԺ;u{XfVY_5uɶԕd]c79?539oVy!P< 3`q[^o?8(1OIݚ]"rb; tކf2bD*uZPXxG.r#Z>1yY:\=-m݊ԽFնs)^ a6LF(0Ug0u+xD BhJGF桜Vnj )LW˧fJMZ2]!ΗCҞ|,<"g!1h>0j=!Ιq=lXVUb͛uơ[f{lusX2<'Џܵ+-{0Fm6p~s3#V..Q\jzyfȚ7a_a.M澂۴^;Ah?t[/ƌaғ4DŽΟdfC_1߄O r,E2cJSУtt"Ǩ S93ȝ$sNfd3*y:E8WEzO3('W12VSUgrgRSu{CR5㘻~?[{B(:醯BEt|'yٞWӿQy3QquE*,VGt6OȠPbJB I \Yߢq聃CʷᎼ E-W/ʫ[S?dQGPkhcD% &⟽"O1U~0SVB2ݎhu*oW)z=MaqG(YK MQ[aaaN9i "шt&R+1}jf]zQz +%R^Uu0_E`QUNt~J`/ED7ʰZ2uN㸜WONLyŠGy"Nk9=gD턴V ټr퐧|V3uNX(ȵ,9.)`:S֡ǝFx}Qn#+2JC% {Y`ǞTFF4VAZT.zl6c~ %X{jo'Xt/}&/ 5bms4'mK硽̜-`iUj3zA~C\|@+gk X,$RK >ܹ^~: q(!/Y,|+ Ŵ[s5(u+'nVǔ}%Ra,sJd mc{UO[V=55~(ïq"Ԑ\eȧD)"CI=AvRFb8<˟ĉ䟱GtM)P'{Vj$iE/ħ:~xB놓&9$P ~˛W6^E {1wJ0U흩Q?I>k mQ%A$dn V>G,Rh~o p>/4O v27֛e*KIksZF_ΧotsOI3~72AL/Ȑw;ш:S`.j,/-WHlU-GG}/GcI9p'dJ4S<(L<{^reW*0Y"NY<1G""͔%CdT +RiUx[A~(xCbC*t@I(XAON=GxiaJԎ>){K9 fV 51١}XmZ_yR ^90* 8{I+2{ELzN3DP@Ol9Ww Y|-+>D<ܮ5,cvӝyqG1Oǻ<24u8_o))׫1 P}rb9ۇg: r#f"uL\Qk|alGŗ򣜜]ch@@ }OHʏ e g\v[ځ1*jُ̲%=/c'.KmBswg޾M`d N {Dcr7Wb?Kԃ̼R`mcY3}|~zA<|[l^YJbP <*xH#Xך'"O]+3w`ʖI&9XD&heve'   1M!N%e\FKݵ5dgpH :5 6F>rIF Q |(HPyqpt<O(>F?c!'ۖx Z+˦hP:,n\e4E_l;(&'9b[?@W%eK7+91TbB1m6:6gk}k3bUہ 턶6K#to ^h_ s0()pu|#?SءPO{V.F\3BMtCO$Dg%1;3oŴ+5_m+ ^7 C`U9?P.\kB,\c~R~ˆ#VmiDu<*$xJGU;YBw>Mw9>~o @3@3oV i/1Fg ]m?Z)ҏtSs׷c/ /X/`dF R,JY-,L LVm{{vLM@WBG6iC:jdӦGnq%+eIK)HY@8fh zX%ζq$eK[-rG $PIO( ,!pG5/6UCXݤҳP'qQ5jpV ̾HQűeZe .GH fZ$֯YnF#\*>cn@~( PĦZ3۸o!KB;Th,Rz8c)* Gk+#YeRb?fTw߂n{%۞lTvEϖiK8R:n+JyN+v 'S+ ;R +HI4lK@ @#[^{{RR@ЦPu.<E]{e^|hglTt -wM[by䯫G6rWǶ5 jߎ緳MZ*ٿ  01Ln-m3 QbO[WcKF stzw\J^k!&b`DLԇRW.H 5aϤ.{DMxI\GɉX^p91 }ߑw^Bu}a\WTn 4ur4nZd/'՞r%ܑd (Gq)0ȭӇ~ioJ晗W,p^)5b]?YF5˘utr7R& ƬMDygqyJ,uV>p GbG+MiW~>kϤtc V][}LafZGq]DR6/.;tx* 8+'G?bBbcG0Vqx=ȿ7#7ڞ"gh<RΟ{ć$ Q >Wџ99B.Ί?|^#Xʫ=|{ޜ6sN׋r;R9B)I{pf"n9'Vc.AqHL_gS־q[6?8XEг=4pEhk|=c鎊eqpFߤ(d;W`.JE~SIOg%./}&2tO\0n\gcZ3O?%L~_KI+Mt?t c, eƈgպؐeI般}&.z-]VuKDT"}:3wPBm(-Oް%sByN?"\ڳ9te<%p5K. Vl ݪ DUw$@cLGt{'4ۼdAuf1=A6]-䃏 [MƏ1ɶMvy,Ei򮥓/wigE&a]BxZv;lX|ih?tWEG6]#îk!4MJu| b>=XثvE&~7cǪ)D*aVo l"#0,cR"ҽLz)?qQ A{kwo]?Ƕ4Mq'TOP&_9O ^b.?X~3VDVg;|أEe5Q;AidBϤEP|ʂm?$K̒Tޚ;:BLuoA،&YJr┱l@W~̦ Tѱ)rV$3O `A'z|ty#<@L HtDyfݣSZu;'s<)تyQvX>~%Y1+0uxG`tyE/Glǖ}Cʨp1q>Cd%yBu?yTa38frVVFG z‹Q;lW%sm[bi6F\M}^(aXIɘ ̙hbJUYuZ}W SLz}S|+Hϴ+ J@"('|0guP(Fem$f+NGy71%ld.`ߧ[ )vU`6y5s&7ӬLo[%e`pǎ9: ν 髹!0^}Ȫl~z czQr%[t#ozW:JPY `_}(O k[@eVXj6e'Ds/5g+(5mTӭvF}T37Z0;\I%>?@)➒(,rӏWNRo|Mx9$N>'^#,yuJqmbA |󝥌 d,H N|f2}?&d~JHtG<OK@V%~]N>#uc4iytuҲ~VJF4ނh򑕂u*h3q;'/&/OBb,TI tr=k?tOR6b&ݷY|`?Ct@#V!=elm&u],uF"o[uwUu&S|Ϭg02F#wKIɒKB !|aR{[W+fw.ܻLv=iM`G4M=2 :bٿђ_|4 P4P4os.mM#s2ۖ.rsٗA@WAB=$!B@I3,E4RgI7UF;C g8S'rd *"FՙZ9<j{J{D˧ږI=cy7sG{2?vS"/n!IcUuAo/nZ\tqQ=%@Li[Ai=Zhi$T/al]=D!c5Q>}ThaF#5WYG=4TWWk,irwje ƴ*n/(鸇K V1*CO,OWEF"ĒֿHm#'fגZ0_yYF{$Gk'c@[5[K D:KiLnܨXž~dUYiqpiFoZ-\P$,傉-RrRn[]c;1ZAnW,Rq {h O5d[^':`%nAn] BfZ _Cyg~"US-u0O.-"J5WYqN7N ?𡛌Wb¡sbxҳR0Id@tdAO1l /6t覊$',Yfg%H(J6ãyv*[]?zZ361K r_g˯W[ ,?Njm[tz|)tghP{]vV?sˆ\QqDnb[ͱWm/{7] OͧgT8 );q:{el `xG0n2z6 )8\OuT_Gw>WԲ~Fؒ18٧0%kjHX3U20WtRi"ڱC)7W,񧌧bՃJ#rhmőEQVNI,fɑUp] Iɜ2g-$yryji?hb!zU2o7<";Hݥ ;ȕeM9=&G*˗2 «)itڡY~7t@ww1f-cr??oO %ODhщ8M7]D[tkrjew{f.~8ObHf J2W[%]ūv?T9hyx+S}w{~ƆSK5#6wEˍXĔ[z~K7)~;x3^'tΞ?wZR ;°{<^v1R|Z$x 6y/L8sr&(o lCQik`ީSbZkVJh 2^*WzMiI[xY).$0؈S)i W͎AMRu&Lhڏ߁9Fy]WB u5Lm۷9gKGVWJoCW{$Ůyf+BjM׌/ 2DR^rbERu| #|x_ 뽑)Y4J4#\lyoMg:#yYɵ{jivҬ$Ϥ%-ߒ ou,&ak W& _f)czg`; fRYw$dZxc ;ڱ+dC"H$#ĝcInyUS/Jx@:{6z^FUCJWUh<+Pg_LZrTTVWF%]Jp$3?뀉N-:٦`;I"pJiC^GH8Fw}iT|7{U^^+ W1C=*[=<4YoŦ0b8{SX\?vG9C p>]9+֐^<@pȏ "V7RhYFbL dyjG GT@GmIx@e'xItA?$bј$,9|u͓$9;FU{)_ Jpu@}FMڙ_]8@Q_~D.Qʲ䤉k?ۢ/;ߪr8WVq JcE_RZѱ bd\Hhו+ˈggUʢx+ԓz:OVz?(낽I 9Z7bSpN pQ=d) Ao W-ǰ02̒ZR!Rc3,Qal6旟~iu{$+VAcR/h0caƏ6z 29J仴nwAvǿ*øJ&?m=lo;eh زpkJ=ڄ`mBh0?pFzzFMɎ#\>lһ|n5M,e b?}!k#㳵gcH1cMS T,f}Ń:(=>B&6GpO!O$]o֒ GL^IX虧Wd[&ʧ2ߵQ*Ga9j-#>J82u{*&J3lj1m?~^[fbgwM j} `h^sC& { rX=]=@g~wX9ZmU{`vګ2weP-Y  {tkZcFÒg#'%Icp_-R7Xf6+o$9- vMV#뜭S=ygbEv:ʋ/f&N9 hT~xrJRHz!rpQXSIN(W6ВgOHi*Q2#gZvٵ-װϞף*VH gBF/[2O2׶jF| Y /%NgjeHA2zFW[%o'rh<Y@>/!&\/&]uX\(ɌǸ"ԫ'C03oV i/!]6?E;R#k粶5k$_D@_ ^\*C%K ,Y-";dο|TrT<* 6H3#wm,.Q 񊁪VVԠ=,J.rWX$9x[pIm88!11GiW0&Xڒ%LAvOS|lΣIEd2of`鮊;2@r< C*>+\CѺ7$EY. dSDo4k@O+#GF_ZGvBe|_>N)c;%qDΧ77=ئg'J]=F2R%EDH h5.8u W2xxUqpلZ'z|R )1M r>Gm{Fʓ̢E!p^H^o'~cpOVuL3q)dj'.m ΚxQ&~F.EZڤzblP~o[# ʵz߭3kǙ+iJzW7 K5pٞ- ,yLaeq{ژ:FpÊ5;(uՄ7`IّMJD?op\8ܳGd |f%;4}9&]wwxPd%ǪJ4E$+\ FfCS}cFf9NeE&$ڑ;J<ݦsI9c^( \[2bVDm6{_ E|2"0/c؆ݖk]ٺC/֣iB ֕k9II\-1ly, m[ G+ыTGqv16N`^:5`K-K s\KֺKj(=ˍpdƥuNG$̕rRW^BZFu}h5?-}f&Ү S`2֗s4o v;>K|BgIʋS>ZN ?jU[U/L涹k)lj.0;K}G[`֪TlW]SF}b]R.zmvqVZȶrV0pj 90]:9:C g~; R`l?Q̭nAwicRN]0*|P HGV~S; Q;SwP8{)= % ï ziy>`W  ȁ0)Vb Y`;i ?8o0Tgڀkta<BHRl.ҾVچ™xacΒji9:ZSB_w|/C|lb}#WC59yom^FFAű}-G^Xc74u|c:y6*(cG`V 3tܦ >y84IqP%1خ4c[bocpgSێĻl f圍T8`yT@^fEkh Ì @(*#7Jm}#<@.5>.}GX+3NCez^`S$|?DN?6.һMLlNke>4' R/ѺYqǜjaQfcK?Jm2 @!U)C-C5YH)L1 wOn6N@ݩ!| w.yB ]T*RSwPgB~z8 7ChkpXo6W:TC)P+C4@3oV g4HFkl`dG!y8uֽs^뭭_/ //`X Fd /--H[XL[.e/;m ;ݭ ؕiTP6!ӝ^zageӋ^#'>(p ]miȕm[hXӂl I(!GD}2 ǰmlq2Ks>4[ƃX,N&bi3ǒ-Sj\ ޖ1'(y_33F2=,mNeię,jjvh* h sQٌ1G[!+F^]/I0gG6xLf^mul][fk>s+!-Gri9!؞+8uִ"9c͓qNy0LF2rumK\˷*) n17 ^h)AJ3E-mRu2jg6scONI(M2әrEФ8ؔ8UDZAG0q Ufc5|@P{,ՓΗq|{h}e;MMok ̸Yv=Ÿڳ|B.F[,lG W\NrZf2кYM7[ZG1!BiټʬgN#L2m˳JVh#_fg (R;8pd "45&v1g9`UpNcp,/%0/ gD7ѿX`jYNONE˧Sϫӣ*>Wb6(6yPQعdu@F^KBi~OwBUr^Y04U,z9^" xzIXluZFHrO ܰ\#2Ap4BkT媈"Ջ;"&H>+^" LYQ . 䦌SW֒5hm# fU!| +Z썑hu;zd{ܤ\hvj3.s ۟ U#,%>;3,ttvL(&Eu=wNCO^b)uL;Sn˞&k.W+ cRhnɥO53QMMuslm{ad; R (Ƃ8IԨvJDnQY10 .U  _B|oFݰ^kV>BTR@O EJ(S؞(r"Ɖ4 Fz5&Jը W;Bg-dZ JrEEĺbs"30M~ͺz>(ا[rP 9E* ۘkh}yG #E3@ܛK1;V'ܔ D@g 2M J%۾&g;DgуpЃWg6/qiIQA1&z3R2h.%ͧψuH.ۊMƔpAfYCM z<ĸ*1ʚrau6k?뷽ަ|9'֙<헫%kPW-Ix{|Jn+dF8\O=>wFsG&}JfﭖgXDrfmPXߚkiĨnwF3A}}ؗnf,k \Q޿R-ΗC8n,>xDU>Z7Tn“?'%'АH2D&&7f8}Źq.IqQa/^䆼D])dwy 1-6f6ph~[J ܶ]9Mgшo|5-C::Ww1lzӅ9o-pT,(\7\r=eMΊ,:~h 0HzQ#U%zL.1qOvDR&|wٲ\Gt1Y/ vL,~ƽ&Jf)\!.{oüZmV4 h%~",_oQ[2k5Pys˽q{ެ]qFѥTEGo*%9Y J⬦C߳ZV,cPr . s(kFӋNQ|zdL ds'#  ^ L:xݣ)FwctOCaX]" wlQ0Ũ49㛑^ԋyLd۬FIɅo{2p|Q,bI~{2CWK*<{'cf|l.Rac昨L9eM$"m>tzLSyNGToF)՟y`>oJ@g>h`k5]z`*BPt\-dQ>,- ]Ű-#E5oԊBAEPKotCֲZ;$|a+289~\-0ѻ̷ aLHF?.sm"EqWF̼y2x;T 5861XWk E5md.!9v] 8.D!+NtZpb0"Y+'r t8R.?mܗ’Ij= b/-iTn-+pU*F(h'ʸ WjC\8DH\d|fE| o*Dտe-zcwbWƗlE;h^ RO) !yrrJtVHy%{'e'jӓl>V>"V>V>"V^+C*>W <$,P (3"FCLdlH.q#*Kr2-_)NzIljϢ=̌J?#m0TvJCZ?!Gj޺AUx t{8R)?P:tN;U bhC 9G8G `PNudّ0FC404U 34UY%7oskqkrB{!.z֋oޜ9tkw@-B!]@N߆̩P !~#@˭ e NPU! Ƞle!\$K$KL})|C#gE@}m[[.dsɹ%r\rTp,E/ Ex)(xG•(jxT%ʏ>Ц%@PUFMU'qAF @##(J–Ue-zdt OSA,ukrZb,qsFdjkMQ;a:QE-VI=,%y!+>Sǁ'q%1F@<6bb (kKpUU1:dLѣ+4HDPMFV:av"t&JIvI¹jmqAil,+wzJ|.0s:,X#{*YZyu oijRz[Gqg41QbĚثR݇MD\@U9*ʎmT!lL(fq*MФ*Q^.@ZvpV>GI@#_khghɞ1>Gc-j?ĔħK'@#ėD!_!Mb5>i-B~~YOd0F;רۦqgcZ]$d_Q1)r_h ia*8rn%)0ɏĉ<9VR\ρ2ʕkf.+C}Z1R?2q⹾$IL$*|U4"w\g[-{#[\C(w}m˛1G'|lbvuzgZZIm9L_{Dr5StcX-*.+UEMf"W#u. T{ 5sF%>y_GU~Yz>J p|{^?x%e~K_yk/XYE/NčjE, t'N[_˳5so-{qA, ԣw[Gsٍkznؙ ORov'䗥3RExL)$~h'iJ1:{ؚjڏ 6jpd!'FsY]%4b78,땳e/o`*D]{~yάÙgRpѧ !6չy?p tgߍݤӝ>HU-OR޺uΘ斓Y[g?M\sm՝+ݵUmZ{hڹ\y*7D,}}ynתaۨfXhJ/$@;ffEߺ'RAsB.=mH\$ )\ATF :"FMVFTy\ CǎʗL5j@Zv<5B;=3)757̐x4Rqۖϳ%ɹƼԱH2O+o`#YxFJ)WuJAD?G4=Cbjʚ.NKgIPY/_0pLꗗ^= uV$T  qYoSA#K?ÙdFD,sVQr{üi^&:Q\Nr6-!7ޔn[k0s5[}ވDXt9rfZU5kf}Ϙ+T=zAKqMl߾ ŸQg ?B-E/1h@Ls޼9S]PΰuC3pk8vYբ&zǁݞP:ZsR)ח:TG;]Hm :aGnI5 73icmy279=o[ҳ{}#92 h#1W,9n9cD4GF̅tI?}_ C*XGh5،~E"[ڏdb@wF5O(cÈ#S~rN޼p4@ϩWHbL^g;WŮbZu.8 ʳ9t@lF Ex4.Xy n糡Ւ{2F^m`_Jqՙ=O?Z60-o@eʣ~sEnxםyo"7;jviegӆDS1>Eh>xv$V90 Xys3~ {C ^?1FlTGWދ@=-si&8b7;"{_;Nj߯6F 87тZawl}H10:utZ+*+Uxz姴ؾNy33'q_٧.>~Fov'si|y`=͠r,Nhx?d~l E#>jG>ZSk>UQ>qpc2QP46ͯ*h$LkLSVɬ˻'9rycds!Ѕ{RgYo|DIҧ?91ʦ7Ur2Ru5pAn=|2za%^Mw罾BvYY$tJ0 ݶYuq#rTpqH Z(DRy,T`Ͽt4Tyl>(2_@1wD{1nyCTT8KxQ _:1 x*e\8L }c6 _{u8@ZZ Ӣ\]Xqqxpq&/"_V .¶r+sY(ݿ]1%EA@Y@Qa '5/7g躔 OdI `UdWM f3"|aFoԿCS 7a/dτ84PsEfdBå7-oNdu_!EQQap,N%T0دQT+PX/D[w{b/.?I׭C `J^®ڊj5 4Ɓd?]3u< :K,aOK*zK] a&Mh[f[oo/ :.8J5K/jkb<$S&e3_eG|_YI(i# ю 5F\]g2c"ͱS/eAѦhVB1"gq߬+TFqȦ/oJ bֆ_9E!\+JŠ$+`II?pn}Fv%*zPG rF7hqWh{/&LA&aJݸi<^w{?r`r|0dHke8w"f X Gؤ.aM9t`Z@9m\81ԉL?Qi p/lɏJ)@uUq&˘P}ڦO@ћ,jJK_r\'CDP;iv{4x&4p2D2qHpM2G'yVW Gݠװ:hjGY&GCA-*h#Mit0f+U۩xqRKCfH>bX,}eeg)kUFafC㺵3pUŠJrMULjކsbYN#-$!f+^Yǘb2AfY?E!i[O+ʧ*nƘexj.>OX;=tca'6k'^L ~W['1ZΜjnkLf <pz{(cL8c61nlt"p-)dFO?]@O2O# {ׅßL4NEeC@f-ЁW(0wO;Æ!r+aBXOEQ(\h(YE1,p[¾90.Dc03nECvL1>51txLmyZW%˱َbE `X Fd -$.$% &BY%exBEhvwWJvwàlt]=W 7tS"2t@ӄow(>x 4#`PonVɘYnm-۲mjK2ùbDAI<N q)'D"ΟtW2ߴ "Ew;jTց={$2:Zl )鲲beB$IE>vzEA"Z ;{[,]EZm#&}'uL\7&W5C%EF%RʢufJ\Nd׏F(AYs3O02([qgmq8.  8cA]֪ӑb5#%B(E kZL#h59N9/`eGOWo`%YX)OcDX= ~EQ ۲ a+uIE;P l+3ݼAIAtVj19:-* sZEG3E\[mO٨JHd=gֵIMQA lx!ө/-Ao)3"ďj7ܠ{boNMsTgylg|&o^1O"v'#GkzA9Mwm6 1eѬhʑTG^Vx^~4skOQmj$n˾)km9:_,vIzJ}[)CN OT>_Jnk=%t:`]̋K?ѓ^>8 ҍr=hグ*e ry$)ǜFQEl5 m1՚(j bKzݜA Hlq 11dM԰pr_cT(KgGVd)Wv]npGm+"̦$gY"G̈D`E\J_)i2;DDK`սDW6bΥ1b-vXwg5p\5 Phz InyL̂ Rn/:䊹pp_l0ݬj\PWH #A0#+8Z=k_L #%4;_IJ&*9嘻T?΄z]J_*X75(B1xRD;d(7N/WsUx%-2hWX6\5 ٣5W#%~`1hQO_C*j.̄p`q8[ g?%oͫ\،}7G<0[|o2e?yQQse ]6T7ofE:|y`dAI+WR,8r[o>,@a֫"9&-zY":}ϯ'tW3 TtlT Q1+_XQfJm8 .ₜY|1R!@D޿d|Z1QyLK'"vЂE/?ut#G`m`y& iJa 6)y8;274w04qC#7-cC4کWŠd]:r 3u]L)יt #Dw}tA{!,>Aዽ3܏$~c@}c1 ⿗rk:L.~ҷJn::0f9s>{7A|Ã1!ҕ繄D՝fLDvΚ=ʰS_i;YޯLFN$<]9>3?9?I-jݔAb┾®+`Jm$dR5 6"q0t[H$M6tŭ"о$Yo"I Vv,8b^hȤ" H_pB߼Wi`o-K8O QhZ/[]UYu̾m3V7ĨZT >y =*`+˶)&N#{/L/Z@?(01ijs\?KOd_}W4qIv2ed/[TvسzfMnkJʽҳ@5Z* JiAQ pbTQ^oԦ䷫Ie~,cßErW7tXeZH=4^^iQvjکhgnPsڍ"FGJ`876ܐ}?Vs 4păSvE4d@#V!I6@ uMYwݭo^uwZ$?,%$I-,&eKoA9 =s7r9{r=mg8E/@= ; tڥV/!8#{v[\Zkh\kR:HcIO<$'@@)`(36Ϡ9qG$mi+6pgO(-X9:$yY9/ _=iQڥhVb)+ѹImZ-IXnfP~6dْ{zNw_p۵YHUӚ2eܪ_r'oknQc_ w].ߊҀ3;{ öDpS^=VqO{CAA'!i4v-涨FpR.]P_Gޒ Y5;fG%x{42p"x3;ִ,؍r6Zfo$dշB"뗪BTIPmcflk^?zD;nUUߞ(c^6F\-}nN`aM$xH1A+4Y!DB/gH^ԧ'+q&eUcUJCs5>QSLc#t߆aJGx]7;/RHۍjӘ{mi<^v05+!3?hPs9/I´ BAEڝpo&L?/M-lxŻ2VtيyU[kiGfY2cM|tf#h QCVjAͭtzDn:6d`Zx1&Qgqgy W6݅yfEM LsNxR)} {*SSELƎE$B#%5&בTMor$ZzK, 8>*ӟwQ̔ݿ%Fr⊆fWF7)"R;Nlظ1˟얊2w|;eTN"-WQ&-/fH/.?mbV U =bݜI&jAsdZ%%BdeA%Լz>(k`jyt&:gKkȦ8 Y+MIv䕯Vh Aw)T=&#w;1fo)lyyLhakq \z}opL &"tvT<%SVÂ9L* uE3-nt/e嘩$1h)I4%)IƳcT3?pkZsiY(u}:;TaVE`~z0N7r<^Se|}2,c>VtvTzcVr}8*Xr1P4FX{l9dY@ZU3i淮یh03ۨ6W<ŭ8;[q/i {T߽v5~gέZXj\u&BoRgz-w OPGЕsRN=C4|$qJ9g?pNI:gTyMJOK&y{Aᷜ`h G7dǺ#ډHD 6d/^+(T՞2Nn7n[ú,wvqP_lɧ'Ze7/;5 d1Q璠>G'wV5U!5w|!|1y?(7]J8#KxE=J>ٛd)oy.?֢cln'w+u,+bu+aE97 ~:#ٔ.LOI7ˠ9`=LPpj͍b}Ԃ儺%VZA}"2`F'2t>i܁IL1xC>>UR70$ a|%F{B}]C,<:IHJ1bYx"srfkMmD0Iν6/0ĚMi>"P30g:~@]$R @?ac:vq@֏#1T(%;Bk|З{& UAwJ 8"8Ӛx. 8=g{6LPp+N')uʩuKyw⩴әNkTTx4giI& O`Rv# ܪR;100/HݒɧVp].^ZJk9]@K[*w@X)!KI33e9>LKb}(8`Lq$ʇ];I1!"،lg{%-ԙ_,ĺی)75ʀ^Z\M1zmssc]Pm%ߧ =m׶նֱErmv[dlUKs3 $ļ YpB9M}Jԡ)^n5EUe{ZKHùhca 75Z- r<:'HdQlvotiV`+.$.RRѻQiy f-#vQ,б55Mx[}8V0Jx׍qUg^*[uocbVgίEy$UCe@`ݠZ KoH Z.}$5ޔ.ˎQ0 Ew=o8hj?5\NoR˖ݻX#9usDskURƃkPs;j7GtܯA&?g"c?^NJD:C_2S5d2?ԏeoB?mb| ^0mp+:PMc ?ˁ=<=PhaިO0;R{F|tG+DH'|/OBm|}׌Z6NFv0cvǟ)lwq|N-kmKM7B/'mq\H/I".d;y{S8Gܫ8RTR{Q|()6m9N 95)ihi* p]5Igqig=➷Q#},[Qs&*Ů Snإm hsC DhLaղ.tK6닾gȌ]PLKOmbRX^)K_:?:()hL ~'vE"ǩS}Gl7LDQUT~\+=z*7|{X׌2^;m9 ){~zw՞C'B҇h "Ũy-3B`U c)Mq: ҵX~rSal%@Dv&Z압Sµ+Z7jYqoq| <\SI$ \W Iz#f̵="~oT<'=+,"&͊BBU7drXPM{^ٹV-0<[rdLd|*Č#m[s{"Tk&x{DF¿ʹ~VX5{e%:Hߦ cwgau<;q-;S xNf" A֓T-y )=љ#E&m3*=ܤχ t)ci2z!GOI+/WM0W,yw)sl6먩bdZlQ^yFroaZY;JOA.mƆ^ܓ[1 6zbI$鮧>x456t}ʦ|>GCZy^BΫ= 6McI>W7}j?YcYN.hS#2xЄJn'aukH\vo a3)jgR;v 2^,?sWW'ZV Q(v]5}f9uKUh_WK}@E]1L~TW/{iK{,gk[m S:x/YcbcՄkfp| :]5Q=Ğ9?*Y%hA rFmcڔ ;Evp{RXgXrOls;M,:1˶> A¶ T0Le"zز^'_@i7ksGZASUAG(O!Waed9U(?\*InGnX4{/Z='^w@W ]hSݏC+|_?t 3gW! n^T_?zs'K)? m{[ZAjv;~-\yn~UV*@p=) 9 (5`B(S{gf' $T;];!qmhk=3|Fe=HX**3Zy):Ax9,+OI~Bi"nB[UI3{&\nX|B`ԕW6@/;vy  %Μx%68]ViL{ ?,#/𠽒<8GVG:Vw=9=X/Q'en3#)F6iӶ7oyIiqE>NDV7${p4w@ITKb'w1KGw0`g4d&"W#ڴTLĿ#&8D7 yJ7H@^P 蟝`E}1IHAtO~py+&8J\8%~H}LN4\5Ɨ%q>{bbY,AL1*6a֎&8xTrKlyփ u0oi2nBY0tE _af/ҿD <=+j i6z w<'(^\`>(A,,%,("}785~bɬ8] ǑpA%j Mz`qt qP=Dߡd,(ZP芊"Ih+g:\:6ѷcaۉxlDս2B Ql %J &. "%? W;e@Ls ĹC4@3U i/4Fc[ [Sac7NV[eoUI3R /^ ̜4T;ii6DkHQK8R)Y^nZ7Mj鱫b,b˖ül銶HlrʡH+uKI>|$h Y{ۻ[mvٚq1mv˲͛l1&bQ ΋GGPD u<=YTb$ IcpQ c$aE8V+rHuΰvM+f'Xb%-ukWj !U}Am Y BFr:UY>]:,GhlkhT,7ѷE[5ŗ}^*=LxHX:8 ÿN=^'cR@e@5zV]5JYOM@c]Kc 鱴T@{[NeudDRn"&.OL,(8cjta(YFzc YZ{u98q bpȁ1bODo7 jkYϐxv"Hӱ Hnb:kvP7鬎_ܨKZF U)UOia ipa&򩚮ҰJS5"jo'z[~5YjBtmw˝j+w)ӕ Y989sb |#5(y% h<Ȥ1:TN`h9[Xy1T牧b:aQkY N9Y[r4A4cm$3{eIő'˲!YEQV5#ҲqLo6"e[%n@i[e Y[&Fi&=%ޤ:c.OI@Hq}'֨Ns@BX92lx?g iIyg',).50]H2"3 "Iy":% 50cڲ:T^Aܷ@/TYtXFQP D )ĈЦ{V݀R>\VKPA8f;o]m> 4pg"?,( )ƌ䱳G _oY},gM?3"bT:%At3Bsx^6d{ꌮG1<CNOomOCВtnSi Y¢>tWzuT2^%okpUblqX=#ݑy٪[$}ѷ =,_p̢eԐp~H\g'3bg;:4يT,n#3aD[N$T! RC)EMȔ{^C."m󻮅ȧU/1쿰(1"P/O.eq&uuSnak;gl^oͺT4*,N8vnihmm6qZZӭ$?&e')Fg/KoLx"g0+h jlٷtrlQ:{Y*g߽sVcP5.ԭ\sԲ!4R}QKZA)r6)uEz?-ջIIGzڕ= C GR= ?zz['he9X\áV"= q+X) 'lOz;NrP*|>u$.A5N-Q7"]|3㲳>^!v6(.Hfga|]tjk%X*zcݔ{HG)S^Hr?tr̆="Q)q}@]DwR`XgG1ǕDɏ)tu^^ݷ ћ<'~;O a{TF~%09ޗ+WYz! psČHf3-w ,{~a~C10[#蔫NpǜR>?xL>Is `C9ԟ+)[8|_u!qc@E{J+20xz8&Gf?G_ Y6'?Yf^{.'6t8^> [;1Cbʏ28J#I>'!5ԇ :D4y]۵q%z%7>0}; 1}-k}cGu} H,ȇFEXB4꛼03C䏉n`<}dĤO Se!qW-RlH :7`Zd޺  U7.˫/_J1+.+DhUCgfG%jM5K1L=az<޼8^?}ē2p#k5 ǘ{o'+dϙSe47'AgJ2妟f ́p/#(6YMZBb~0иM8Q#!''F̷cQO(B,d[]]yӶ)e]נ_j7̟W$eO!vʖqF_$[qKw+7ԆDۙEqy^?qk5hC`r;5ތd-H ay^UD1_^TPS@F.TDr9wP v&"̬HI"9d.^yNn3^1~jK5?ѻp7Nmeu*>pۮR'b7L&|Ko2+RNCÍWŒb&5͇! p{Ϫ-$黑N.n@V!C~3G88J̃.T2IcȖ0jawudž\ǡi-A{XBA Y|}ŢQ2(ꎰv kZ"%)S74 yv_@J'2lrSu=ߋl}qIƎM'Kw(7GEB(ROjȌ>_&qYo3 mϸ Mt%v9H7s]zD%DP@TB@^ʨ=faWSOaL[>|-~!=$l!NE˴@o8*ZƱɎbGo1~ONsFpٙ6&/=L*RnL [}2QQZ9^:є@ ԛF5ib=gQ'K8 u9R9W=:m[ nM)?bqM$e)㦲ڢV_/O D5-),S 7]q-;'"L`?bbڭ1G&f+聓{5NvdFXGQpdEOf^%V$$0> ]le*ҳmui["٩$BP""\r6F9cdAir?[c| 8jaEŒCsQM Y6 E`n9ry)d~Ӟ]&Sڬ:Tm6*n1_K6RRKY2R)bCd|6(AΚ6PƋ&)L7[Pٵ!C ֢\!s) m>X/=IiY-r?/}=ugzf },| 8oxISp#HvA׆yӴ:xMwJYy}t@τm`cC<6OjU nf~Uą]}?%sJ}_??;9bÓv=#$Gˇ5͐h9R{)Kk;q;/g46n;HaCQYanXT?s{.A"bhK&> C\O]k)d)&zH,-y<~WtZ``{d&LT't1^/L(E4 >KN2GKk\V Q1$ rBy{D.l[?en"ǜaQ<.5BdNdȊV468wCfw%2l+o MdzN3ڃ4y5 =[9M97ܫW5wqw[ǻ_=bcg2s=ɹx qvmTjRk_ӁK#Nd,*,U>w"v5Եzfn úCK5Ԥ>SM{/QZfZy]ۇ-~djdE6>vO6y)Nm'8T/#oaݓyEfi*W$])LefєU5߷.8&ߺkJ>!7i9{A 0&E#NĦQVv%nRO\īrƼo\^ҲB 'Aa3Zz€sb)?xtWq ͸rq"D%#? ^M0_$/P@;L t40 gQ%-.)|<2#CԙqGiXc)NvYl'4sLUd"RmtN4k2s)t `z/eL\Z`Ń\:P`RcTq"о UK"T2= >TJ#, `)NGi*a:*\qo+_C,Ob,GJCl\ < rFN5T%h?¿O~a? |0ZAJJy}YUF-pπ3d@3nEC Mˉge sdIQ8VNm]mSn$ۈS^a3($+P Ok,mQeu[b};hƑ^2e<*l9mرl }'|a 87{]Hr$;"1wndW-Hv4BHPB@K|(`8A| *:-f YԏU 7kOJ>˴kkJSD gz;-|z- |;2J{pZ)qܳ`|OikDV1P"K1ul ,EMUsfuM\7ۍf?AMp8eA7h m}kxjz;'f]/Yo.UyJY ncˊgt&eCWęX|A}='aOROyYWCx}S+Ks}zrkaM&@1G|b{hVVM';Ie{v@"{9zyÑ>% ['ʮ)QtuSR]P]{/w/a^UsEr5E%x.X]hsCK1FJ-azx{(Ev[vUf%Ztz F< E\;/} [xdtikMs[. 5T< SNy\NVkֆ\j%uo7XuVQP]zܶG~%2;}`P$=e%QV)q'շb7rGJaˋ3^M^{3 - j rkUmG}M1wEAAuT|c<# ~( NSI-Hm[P&ugƃ4i-hޗgEWQaxdsGHL,[9] n-~p e [XeF+9/TI`.m1}/atUSiP#-Άۓ~6<Ix:[ ~HM,:u~ t:/;`5.yXAYV*gUF6CznZ]Locdw,V6m4{'ؠc  v4NuQ70hqS-`8ż!*H+ .l5 훓 h-Jٰ }%024skƬ5Z} O7U 8nk5JP.7Wt' OߕMxQ"(^⺑-զ^EޛkTSR@Q]n&y]vT*"3S])-F7^!hLu['@6 NO_B·BƄA8ͤ427me'V|]`\7i+IkEJNcUh3lȏ~`̕OvȌvKC:?&S_1vFSs/|<^VaLw^9&,k h'ƪ㹙*RyR\pKX WAqi@0J7JBE !/r>ֱxAoTוijOUBoO.2ےFI}) mG?>O茯3Nv@Kɩ*y&9gQOa糍tѡX'_?~7ԫiG^bmX?d~_`r aaR\wfJ@8'bAM4I=rJ3zu?-NN zzZSMd^m׏,u\?uo-Z(^'e»YO.yͳ_/Y0v^݈Y>Ktht憻ЎnxxǣJFEtHF/:5rYrtNaTSj5U(%H&@S`7Uvux GVAghTV5] Uq_͋S)2G|o1,EWK0X@j;K^|5bMZp5anX$nEImI$w #d"<{R=X;v<h:A0\')MxǍWUiR_uLWTlk!Lи/Pl#bWo(@17n8<>F׈oY~LAÿ2i[]oP_x.!pJ4wC(ztXV6 Iw&NNeI9 l9Ԑy;BEmug7r6[*=L:FyTVC1,Ĵ% M{fy`~kSO& l.̧nMYͤ ռj{)L&}r]*ںXȎ.+Њ`\;er8˷O 9 e")n55t4r 1>I>*ÏW7 & 8|iKk1~lWVS/7Xs?IH|-ݭRy=tWUf)#6&!4k_4YnXu(>H Zgsܩz۽GA?]쾿ϞqÿR:%[\ ˝hX}K9{#k:oD |k*WXQ/cX}\ U+-{ GuazW:IīNKY(v^ĈBͧ{жuv=C7-m}d6޲' mF}`E9%F*i̽p2  0uքx%җPrƠKnlQ{t?F#SOaNCYjŢڲɤMkZgZ¬Zeۍڀjb [(z^>tC*~HWg=~(`k9ѹAH :Уqꮒ>}T!P{ZfL<~#@ݪN~c(̓Lirov=ɎRr䤑sFe1ZFy5_xp1wtlQ.g*pwU/ܯ&zeT* Y`[~O~]CMUD szqJ0bkuU8PySr{JB{ylKXǼnT8c b6%Å=I ˿cOy9k V"b'T]Q%SNΩMO)EHZi]P~_CKp 0k`&:oY6*WII1#MlK3kdLgRoҘj %<|H%$Z8KE<3U.*&$yG}T6u+|R^MVsdLwӪ?SCMxR̋yVv^%@3_I_=fZwjfK'0EXR"UBX\DJ>裒Y0yvߘ=Gpҟ]R[{`[fvˉ3A~Ð:PvHHF.&fGI@_ٞUﬠmhtU55EݲGsR~T-G3-`;URdbR[͗99tV4AcU.Z sЬ'x04ZĨL C~J0R/pL#INqӽ_f<%d:eOl׹u*Ni}'1My[tTY/lNxfOgk~yϢ*R5_=^L+{箯*3 doّN.殺? +U}G5&P\ǛP#fo+iX{Ge E˪sX` ShF)pkoN-:NZn[ i@S%s:կ1ʈTq±Uh`1oBiYJxçnWjvGgm{/qe{v턺9tY?n_W:7oa߿,ɓc~O:a$NIU6mt)w t<#u20ED4:6EnT<* C'mJY9 `̯KƎc/knV>tϛ{eG>t!OsoL3|q\K ,A/L#@wǶt$$\RI$%#[KU4W .+. TtwvY `.y$ 'ߐD`.9@ /^tH.DҢ]|Lޚ7O EHbM%=v="ϷJC*8eR&}rꇽ._$Fga#jxt \))`?*<{#}h1MB|'`P\xK < $HHP4AϾ !1:~ɉ*oQݬ+W]E#nt*$ r8fwQk Ah33xq@sP'Qwf $jptOH޼$Cc@3nE|A 0(@ǎm~[9mCenlzx&z @J+OP' Ҁ(YYud/ZnWw+w]V{5۽\Kxײx]gb3Jxq H%{۾nedf2nKv?s ! x@'r qH#ԀG"t**˜RW<qպNi4L { zSB6W8tisL7!y^xu.[zՌ悵*wէLSjA:ӗu1גb/fQ$,AK DvJrL>g'lZ8mm(21lfz]3aޠ FVUJ ٤MʟkR"m-Už䓛JRMrdVુSԶYkؖ(| kp;ٸ)}A!K\4ت;VrB?Ѥg>+qJEz3*8ȡ:2@l9<[ vOT;qH\OtS+t%+( A({hʣu*SHI֩tnL6tU( /xq&G՚':ֶAb.c>uTTn>]U,;?u0m EMl="f~M+ĸ&xQ+sG~٢ -֗j8 ^,.+şs{=yW:XD֘-RԎZ&=s_4kUTI0 4"&߯5av[+SM=R[3 .xY5>ҡe0@8: {-M*by7a%:JϚv]_wQg26ϣ:Q5 QVK%SE}AIӔ*6lt&vcUe7JD&2zhs):󟵛٢OM넘6l b~{Cbo$e"%is[VaVQv1_}dmlW%#z}ЛPbl|TTO"Ew֕U1*U(Vn /+fb N%eٲ1ToD?2%PySM&u0Ԭ<} &MoCy9M5ѣ'ep2wd]'#YU=AffǙI'1\"xBjiLuOF*ᓤSܡP2"L*Աe?(EIһ| TO,6Ɓf])3~}=?hyac{<'eѿlW[KO?]WR 7"cz''H`JDLO#H4TU@dI49;lD(器9_"G֨yY-*7l{BaV 4`eN%# e6e6X#t:z.Ł#(=UZ'k0b=~@w@,w"} ӘM]-*RHfq61AHn1惱[Ў hSO)?hsU+F4Ed,9 ?KL!C=@{*/"詈ݍ(1ZBa+F6ŢQvvkgl, Q$+Yt Zo/m8c3wmicнrOe4sn2,EP14'CG{-0ƠsayNeeqV0 s :#[tRlGtD}f`C$XCI -w98kJq'!  }+xArǥ7ŠDvnyX; ;gQxwm*>?$/JA Ay8٠<غ 9)XqG-S(WTopv? %}I 1(` DG"?"$ׁ_Z9K'#AF[ nj6M frhRv¡0|n 8C%VMvZhY0q6 69zbEA[O'O4`lwzWf\:>vK@d\ /}M6áTpa(Mmyn@n[3rU{YWH.@Vϭz${ ԏ?]8Ƚ|;=lAsfo>od*L_n dAR]HJ7V&tdA[ e3dN"a)/:1!ԢoP&T  Fr WUx+ǘZvJOZ;+$F2|e@| 篽cЃ&3} /1`_(W2Nxd{ix@?cFgynZ#\A?EqL]wξ#?\}k?mpӿl˻k~,'|h Lp Tr幪p*8\fcTԒw!B`]lCrưSֱz 'Om!@hE7cət<ƫdo݈aUzko8Y+j)MsEM^DH=3JoڙeW ܾi-H1Z;yZ+iוͮaC[mLn^Ԙ[:;kr)S_ wLh=.l?tfncKnLy  j$:oF=`Db;;l8klWmyS;@.|t"0=V>\g8Y~RxƑѾ'a*L 雫|V5yrH ObSr՗d /.ߵpD@rQfrQmVG/1!>9t*#.xXy.cB m[~ND͍gcu3X d@V1" 'ZA#q? T})GƉEY\ uUPE _0R66l7ݍ{ݻ{۞(PQ WQT!"830>}7fR,e$ KI2]RЪp/j}v(T Nb5.Elv @I26ÐILL~`8fF m[]lAڹH.xBT?P'> YY]=(0Qz{W "U<\#,zE&'#?= R)OeL:'C9D9ΆFq:l V% i!WP}]lN@ Ő1UPSzj!_avu]l[~ǰkvs.]^=_ j_w4awKE*")|wnݗnb~$s5SHύhnbKh}?<85A~b۝oחw(/9,ɑfJYجy[ /e~~>/nΫܹ̀D#۔^1'K4nNb9 og0Ɏ&ȼew~s+KYR>/:\E<E:>S pjӎttM0NJx?'KSQGDѭ)VM&4$0=Ӽĩ=V_RAmuҟ1Q?4^Wy`~(N$zha(7+/zx?y]-`Qxh-i ;OCX'0z #voߺaܵS U]uK֖"S ڎ?=Z?͏(%͞Tt^g [9Se"3}Ȳ,gڱǝU,;rWq:fW.lY+R'TW<1۵j7ancԒ-^wKF_OvXC)AӾZ ȷBu-$b&䳺e#cyjI qv{08<x#-F6vXʀo!ÅwY-Ib-Tfeҗ_jK8iƧwzҘ]URv;-\i)%Y"_3+kIӈC~R_ v-3h:drg0`?=ޘcW/x_0S06~rks?~e۽luXQ՚c6dOwc6&pZҼ1UL *q}ї QAu*΁#RC,%::8* KhŽ}SDν $URۙbLÞtB3c^4/;ө7sߦU"gyulާQlD@Iw/$ғt&8咉Eډ9y| uj O߁"U Gf?Vӥ}MP>3 +xqӀ:~dZvϫHvv̫it7r6?T{ϦzǯA![qxy|t,!DlϺ}9{?}nnu`;$ZUɰP 5(pkEOiUA#Qs3e:P嗢P>G˫=sdM)H'm/w]83[J3dan)f f!t]HS<hs5g{Yfꇾ{.D_SosYM2o)&IqFZ5XIL<©Gn䒷/z+O쮷2%qΨuֱ:XcuA:ǰ:>Ǥoр\ccj~kL=rCכG"kL^z:X=u5J.xYur'_Y\=r3# i4ӰYLo9hFRhtUOG#ۘ4|*7y{2gzJߥL왯&d#B7ݣCT-8>`w^;L蔀{Ox<:/6 -4|ղTIrZ@S/e+wqv2{?=bˬ]=?ۊWB[ ;ŭjSiU=0dv\c-.)-,2 Y3x0"x.mAmĵh챶<i`V1 xNK> מ/* zQ*yLHQ_ĸZE[>K2jk96ﳢ*7Ý!Z1`I1pƎhmA9\sl+-n\ZTRe' y(}T1Fmsi)Jx18jeğ}0oea} @\ـ8L^ib(!Oϗ16}Q)WgNErY:[!dO. g"ԠD$F@.j}L$y:i@ubj =}epKB&QܑV/M|[(hiFxn:42b"sqp4s{Z{G54ί R^!r;HȢC'}%[> +nE73EFR}7LxF q 8!"'w՟[b**7"4g-Yz LF>DWESƹj(*,vPޤxeaR dZ#g& ,Z,}j~wyA[x9jg-uD-o/‘jcPn7bxFHfqOY͟I_ ,hB/ಇAiB3!?C&!;DaY WٸFe*LVfN)yаpG\A4Qh"z\ٺ2i*'$|iݞhof^4YGvM__U6$&0=xߝO˃UzBk0s/Rq(˂ۆyŪJ];EEsg;>JK64TÜxd4cWXCIS$x5e{ykr+B=f֘D?kSC,XY K;Wκv8Ӻ&CC!"-|Mq?qKD@,֚&#mSLfcDYpOI[ SCz5)ngd!vzMS1ud3+P)Z }orDDokݗʟi0q?%,~M=-&ϐBgհȸdhS vE:-l-YZ56»a$[,( f@)S3<+\%5)  E - p3~_ h0zLl!Z)Pj)6YA-BYt؍m 07KO $4g@U8 $k xr`5ŝ?KYjbeZVٿĹ~&-^j 8԰ٴ^iO8fb/DjP=*x \ZXQ&0?,XK$I_Gr׃qi6o)7,2P-cL('iӧӔ SeB+-.QÒqlo ߏXe}4.|8uz7y#aʤ zKA ᕅms`bc|]đ5|p Ena9Z:l΢S? A\Ĺ3;*z5|,qu,wª8YZ$-I:&$kyA(`D~8.E yD16n FDDN i8 Ec!E6#nxEaA6oɑA+IC >W ǭk6xr'v#[<$l,_$3!LqhCl$@3ߒy;M?bBb̆lg8qI̎)ԑR؃{F]qlcQۺ ȞYf1/%6h{o/$:a. Hk "@7iKCp&KJ_T5GnXb9#T/Jˉ1/:``١v3=ɘ>e<4X-Cr.{M!-k4K;=9l {+{gPc30*m=f F*6aoIY3cq9Hۨ}P4ĽOM;wlAe8dj4 [`Dۧq wn [ol}D)t.124" 87d\nY0sJ:,RT…k4+26Hq #? *P$ӆJ,3U[(u֜UsNcQi 9s\5;)vWV=sNP$_s29ƥKgO|=Clf.6S(-~{Ԁq(. gt$8S{͸[oakD;R[|)m[QQ9?"oMxxۀ/Wb*锒ɐ&eHS⠴\(TNܜL9s0AN2 B3[e?EyE8+l zsvuͩʉD -v i eFVPlqRX~DvQ44-sjt+TZs49ݼsQp<'6חؑ)iaxiGng5)w;+"w9V _dԧ\}rS3&ղ9ou̾srrt[h9e%dJiǕzjSJ׳*dK|.[v}h!tp6_NbN9KrN$f9Pl%`mS(+-aћkJ)`lFFޯ~QIF?CR9lBhl˅mҲ|˥(eB;jbkX %/A׋I2wvwwIwa#"ۄm[˟e5Aʶd1hF"p @qxxOb"Qb"d8Dtȿ(XD<SI(| p"ȜA& %k#T QBʲ|2Mxޛm tDU8!ư ,nmNA@shLDhi&V7Тzk&[pO,&)԰M $u؂2WS ZHb-_V:u`C r|؁v矧\zΑcj`U7O@{?L,zjfSy/StjY=*H P]Y<E^-O/_@mG݀O+Ī?{0 >p{F!wюf7g4C^9,V>r&U;' lh6O; ^wWiAI VQL6:<=(iU' uw P`D͟m k!AxLʑj~]ZY1QV?l '|Wy73Ftٛ4?Nbۜ'$j )jM! sT j6^$Xa?v$Q nd#ō)h(y&rcm>1ͼ*riɛR{Mx|B]{SF1*9twWryy٠D-P`ޞ&I?Ǵ2Kط0N!LtŠ&/X,P&'w^/[Ic{"ɚ1ӆfsoe| io҄zAkNFsF rR5BΡE'h !8xxNH$CDGQ4~wL|ge~{LIb+Mh8, 7w\X= J >+'{Xg+nhW sh'loym ݼg^B@ӿS8SO7 •aP<( @#C @(P @P( @(P)VomzOrO3>NL/S !}ڀa0qj @YlA =ʹ 6ak_3Qq;M8b9,u^4/5ZΘn?goCsvm6@၁ŒLEGlt#4PmaI 1Lߥ1Ј0@@ w3@0n?$H {Nd@ 8F>s"PF|qqQzzqatX#ÜGsIS93xg Cj4PA!N2F%``~c0#0XiKM3 ;ADylPȈP@ Fr121@ bd #c9@Fr 211b+O$a9>~pNa*DWyvJ|yyО"ޕlAٲYVKCK C.(QGôD޹6q=?GJ-5%~J=J#ESSTT;4)u,RVx -lUU۶J@JKB $"U“J֞YI.baWЅiShuҒӧU u}G첐ZJ(Ry.!2 ]PTwDD$n?J,Tq͕VF$fժng#:ՃuV,~FhXl,IϽt.)֬\fmIm"IQVNK%K,\\$pV.F?K]dJ\ݺYW k#Lt=Uy^%}Zo`$RMBsUZW^]. >{^`^a`` RsaomVIm_ {5\@5=; h>_smkmׂeޖ } haAC{ym{*X/p8PXnϋȕ5U]H(OuvPo6jG HQ=P&`{PUPti*]W]e80upUXXuMYYg w`NO{NTԨCe 'pޤ7Z42MZ8Zs~$R,f0K"7~̯iUF.6BIb 0 4ӣv$ԘEya[V8>lhZFaP/'*JE͟BT%8mHqW5x=˵ð r+VDCRVnRDL۶wQ,'w+L?2!ղsGLuhV " %pM+ŒN4)nMeLϲm%AgiJ 6S&N6pXK~n +~}/{u./}Ԗ ҮAMƯ2^RawKVľE(uS/8nUd#4Xn܌L^3Sq,ezD(W=&hۦy Z 6x{wfح GIч ~ޝPkX,!i6|/#-6Bٲ}3xRS;5U;.'OM:-۴ZcΜ"ЂT[tpxm,ݎxiRyEzFoQ6*D`wbϫydէpPhu\QGWqi@! =7|$2pQgH8= xLI}9F506[Yq\_tz.Է,e qLB/tGGs4.qQҪʘs3J5&P*pr9ΧJޣ2ze5=+;B|)0//ŏ۾cr<ʷ\m״1L75gsAĮXAlu&5̶ƭ^R^='ɼ0Bza_n)_&~ ?ߘN1J= f*^6OvkV! 'bўG=Jҹ+Xp+1lʍb\*ǔ{|Sl,x櫭ƆNU4EP_CE7lZяolQQOkeda*N&iR>/WħZ [!gqJԃ Ԙwẘ,s[T^Wb%<%D[4TPlWĥ:,#_eO[6 >[ٔVKSO6M5ٽmq&rr(YJ.P 0e5TYUak;RyTek/fBuq53UbT jsm+ -|î/CMmY7.k僫ʮLW`-xʘ*Ufwp7]qZf>[g#hwRDVQÓ*K9337鿓ۨl(Q*ȖP7VLB4r&#JHHl{_!TU#rUF`YUe7CN _F`"+)Fxs_>۾9Xlr A;bl;TUUGZ"Qv25& , 7@QsQ|qvxw5z{>A8l>֦$Н* H.bvG]Ǖvs[ j1d}kfo!R/6BœLQ`pbz2A09KƹL S{p`Eh"¤PzHD^V.i3BbizBV:\;xӌYG ^yFái/KWwoo7vZR/MRį]J7~)規L0Z$112Soz6p1)؁s)9+ǹzIYh_cTlEScn$O{\IG'XUxs P/fYc©K3Ww1~]ES`KH]O&[(Mj)9ջ ~fvC}@x PGˣ:MS\#E 'f' 89_zH~7k:—akRxЋJyx ]jUX}vL#89Zd) í<զN$L(B$5X$[Xut읠rb2"_) n(Fmd*֢geɄ؟%.) 1d]cA'ܵ?,!q7հ-K˞{YmX[u㜓8 k1q!Y gl[. U1*QL#=BU#*t〣Ƣ0gh6o1M5C8{f̼Iv0a 8Ϝy$ ȑc 8'=Ò8}OdP;'aC"ߘ 4zYCR8CY[bcM%'|렬-f_])Ob£P\3Xj&74>yS=J4)qG@yU'5W4xhT4!yFD2Zշb(5<5߈B m9ф9CFO"+"KbF5K(ϼK#ui 0r%ԅ:Kr+RS)eQ>i_>\XnwĀΦT/sw @T|n Wixa>L;c0f@+λ}##c=USs%F=řr%%јݼd\Nt lS$s)\43dѸmjJaT7M‡ T"J^o˟D.dJ UIElT.(;RB!> ۃ? N8 zEe)NO"Nz g:6!zxq1EtHb2kۿ ~ՁxvBi1&DGeUxT5tȋ`HɅx}gi iA-*cy; f`6ѷ GBBoxy:p<7.Ĥr2sc萴Gh JHMHtLےYDғR֚886#asVіn0EOXT&{,+v)SA]p+Jqpf%ݬ1K#E8(f]_Qa[7.+`(wvcBD!ގ[m,a*3(£qCg֦xx-:a5 /-tO)L6 _=%!/rH %plϣ6:Aj,QaFWFѬX %odxƨͲ [},4CUB rL!YPcN{Sgq`Tg2{ZP LuuRZ6!O Rbޒ%oqr.X'&sA"SHlIq>AX2@bӦ 2,"$Mʬ5|ˇ(0YyU(Ș2Η`^dJyGƻ&&&e6fZ3ѕE$e]oreuWo\Kt8E9suC .X k&;w49@(I P"rhG3&Sf|leI5ꔁHJ Kg 2H_y8@ 8cF`jx_Ç1“z.2!wZxĸGǎ'.,< Mkܩ >RBMO"KY.xXh|Xi!s면HT6 X(:Momk RzJ_ŪFǛ,:~+^sp  J;cS%3 oNя:[ ḍJ+~qE1K|< gvnKT~(=(HK"˭KK1 O"O]'滦jב$C Z((ƽۈr^AvS*#0`*0f}ScDZiV'_vܕ~7^$t% H}w#MZY(q6R#P0U.jk.GI ݓ6H#5GL6Y *yPYA) $H%:7ӧ(XN͸ㅌJKEOLj%lāj}*=ɿ_3o#Ԧw5Op 7gZ 㩜kVܭ1ە%Krݑ>± |'XǗ%r2V\7ѲZhRaLaŧK-?E$ƃWz->:[%"Go#βU Fk; (ڽ*i1}SB 0| d18b{̎Ҝh[ ~! i^<]%w B4|ؽײ”U3$A(O*$t*tS?w$Yz'3 s϶WdW\l --v%H"~߳{/ kɛP4%$"eY4 ٞT2hks;]Nض?tU!q!|B!>FV] e>mfcLb8?u(?Лw?C4 rr'JD'UFЗ/7G w0hP)3&GMo6mpE1>24U4'mll3.s-AC\I0ӈ8A9n$ȷ2Ҍ6ќ6&5N=U}'?3N2N5Ʀ)Y@,>c3|9Lmj)fzZ'G 8#(8(",- Agb^> Eph˜wI 29LN .1"0݂ _מMQ$rF#<̒RVHȇ2ۏ^?}1?~c,@f};hbU ٜnM54HmN΃>OhPvqd+FmŽ(xuUm@SA^tVشpoNM xd@RFQ~ZKȰe X -v\M{Oᨚ9LA: $Z- 8N,~qꊹ!cQk[V7z5ug9Suc@@g3Z2wBO@s `|.H }(>-AOaO\F#KL\n'ۙ#&QG׬i3=G:8i?331udzri3T_V~iN[#w`AMl`/| '|GS_qqtrUCQȍ^P.qчyݏn"V) x= D @7j*4fc+^Q-* r2hr2Y8c݊5[D;oNz?@LN㲜j8N6ۤj͎nt)kv_Z@Fٰ3U>]SUY^v Wr1yVWŒvx~puϔ՞F_-&q.eV7튍k-ѡe`)7.e#Q u/)SJPӁ6oЉ6V̶xǠC;؍:Ehf 7@ EC^hw#N ~T$~c S70RF a f]Xig,qk~ ç_N=\Qηsm-D79Yeє: ~mɤ'_fZzk`*2חAJ|98N NM' O{ wx54&ݜ~>T CY?MnbӛU)VFHn@&EhS}FsfQ':.fd͠C(^MB3ClNiX$+*٠$ajPVhT{魔j) 1N_|>e[y~m5o>č'J@-jKܛ^0xչ-=s^ؼ)Ow(\nFR`μEUk0ja+:ꟁ\Ur8 @xlru`A8WO8oytjhd¹BlHI{S;"!u.5|U[$Owe#뼌@MR)FSnw( ]k,9xcr:da.z5 1l۸5Uh݆ o/ =žRPDLhSH!t/jA$&--ƇWUd]ީPkٰI3=;z3O=ډ{wuu x=z[ܨ'-f Vo.ͽwE./Qcr†Ұ8LZd٭z.#_13+ IK g  )Lନ,cD5?#)42뷑5`T?~R*YSGU`5!5yYFhk C{ e8afkwJ#Z,=K7 ͣc c f7}ȥDʟ_R 5mNѹܫ^c8rj7aϪ L6#25:3Rbv#'<#Qk0JDst֝ v!Vf,6&Px;I*Mhe)/9ב5u x. _ ^k 4? re zNa~ t]:s(h+cBtbwK;V:-Gd&uј'h'jzSK<0GLpEwC }۲?#C~R)03qMpNq9.wWGDo9U26|pP,I-w<)NAHy9+9s,O0y[0*Hi@j5ufTW+xw^苊NYl c  U&*SN̎aG~GaKÏdTL| ^]7RBkFn ++nUɴ>#_ʕAs9 q(rR3v5ٟj~N^ rYxF ShRew(Ό PGu9F 4z"΀ig[:ca/One\ ^v Cg@ $Q E eM]{caY?--fdJ>(#2 \c ‡Ni S+ d5BG(4 ZcFS_ݕsXj6hB3%%&[suܨ'7wpuB\%T>=-B[1_y[p6H5U0㉝t.Lf{`ч&}7R(X~L1|7oX۩*% 8Jm$C}E'6F+ydv7{XdH;XN B+&toBfv<%,Y2d.d>O,ޓ8~^q7w\Xn7 y.@Y{@eX]qWo F([xQ2afp#5q=6 m7Xk[]uO{.62TclɼB'zZY%\`nvl"бWVfDE| xdDA6+,:~=빈s\|e27 }n iA˝ dio!̎bQ(O(?kAػ!Aޡϴ|wo .ыnޣo_ wc덖Man LJIۘ·b]ByoGK_++٪}a5X];_^Xi(Aٿ;<'Na>G2 ^M/"I~LwQI:@,h8͛d2ͩ?`CyD^çq?돫S@P7n rQEZpMcOLq 'hC`jݒ;tʕ>}$[9(MͼB^QUվ;c⸴i;6*/u2TBB/l˲ Z!(}k!RlH pk۠yF~ϵ "tP#or . CrЌYc\rYwAp-m]2+x9tNE-%IЊPe~JYl`lfd Wְ-:.{vK9쑓ڭ)H׭M6aحm]=$#s r"#hMPKi%": 3`5`{lkے aM*AG@$r~d>9 3#wXvv{3g~Ϗm )չ"o>.+3GV}xP)?G uyxq3;a24}7?{ZR_(B˟?kٽẆo٭o7Зc'p^֏ 9—GRXqX،֫PLrNLtS.-_ %-[{g#K)c~fxR- [T͘ص8"84ZA4ɪha7.oxU%o]TNZKmDaxiB(+Rί$kg_|$iϡItŪد(L LəBWDa1,m8^ }"炝8I gY;HϿ2ٛ>5'@/Y j:^12 ȗorfʿTO'[*Y p P#+SGu|ۇZxoQh|H/s ,$9]oAJKXL?a@Ek^9%pFD0heq0eI, Uizw@7gfcƮuye.73U4"wLZ,~t;8 :eIHaCb`(蚕b՝!_KIfƚYӓBO+NhL GRo bFA}?+o.)E+@x$iF7JAH:0ӑɛ}{/Nn4xZxJyTȥq7Fg iQ#Ꚛ5CLN8Iw Sh;g̖&/F7^x&gbmC^Hf3WR )Z4qr|c,DfsIpo8=$XOH - j4hipbzK+@hƌ4=injjJ$2/ !4#Yt 5t1䚟E^dYHZ薟n&Q䛭>t+{|=yAu rq*٫x5H+9X$ނ3.,_m~ zOMX]܃ xO`k5MhoSaN Y:M434ePLJ`C0S j͕{ 0tXB3FJiwf LU3n\˶j2nx-1cAJTIdj؀F $ȗ4#"7r+ #L􄍏:l"fayi1/gO^ \Z}yh 10chJDо:x;6b,ۇRDI:᷷i󨹓X2dB1Of5& 'xj^ޝ|MVs5|k6d p e6BE/E}wHTh5?0w)m{QfMgY`@!$02V54lX]tuR㉍%~}16G86xm_Ϫ„^j _w#ݨOhm_YqVe f-*~k{%KKP&-(4/yiY\510'lIU5MS^-Z8CbPnxYϠ8-oZY^&X5y +-z̺NZ&(bH61*47.ɞ|IrN~"4yОY8{gαo! ְF5O%S_wLw6u  VvгY? {K%1@+<L1/l'4ɜ6h=",R.XNmbUvIԹQQA-"rzuB<,У^pj{?וȗ 49&C8K{$@4vx40a=̪0ؾB4B%UybK&CLl Q)ch{U5n$`+1a:H2(Lhb-Y?W6գa}6j0jx "0gqjS$CN$1M#5%:%:rG䜇L/Z$B|ѣ%¯' [)*w|UY>e<8:sIZhC6v1Tm~}ݟ,/;ZN>3l>|*,1Ȟf%`-*lȓq8ug>o0 >Ou=0ٌ ڎ)kJLyH)*M9ן}bϝ1iW&o=c9Bsgbr7ެǓYigB.-6F*r?j3T r~gWiFh絼Wˬ3Q?k٨~;i)_'z1Cq7<#Q;'W0$ϕʚPf= l`s)6]u%m/S㯩w/y@71O,K5|=csd3(AAȃ&'J O+gFnT,u 텧Gaoh`Ycޯowz6 @|/,O1[Mr(f)4 _{@}Q7Lũ~cϞV '/l.T Lo]HXS=S"23 ]+֣kт%'R m:)tgO}ۏy}lr(9Zl8_z7&*,q0q;U4U6;jٶ%Ni[;&F/B'j/p鶉}Lb?jқ&ƝxF_* C/>ȾJ۶ۋCљOuO7d#}bi'lhCn1z2x!c rLkਞVLjԓB6y;wY4-iv)W_L"dmg[:i&o(tjEAkکRE$DKF5#}<YRfB,m%q>q7F0U1@Lf4 "+bcEw K04gaf0D:A']֞UTV*xM7TMZ#Y@ߘϣp9MRgMلg'N\~'@˛ M&7L)>+SeJ݉3qY7iʈ:T5= "Ji'~A䮮 !ȖGI3pǵ@T}u=1] .kTjQaʓs9nXbอQ,aMH40DZ;y a=gy1R|u̗kvߜ뫽x,صEwJb[J2\p#]8B +b@ d+MUr82%HtrTRiWH]!.iB~{ƕy2[KG^Aa0e\+U9FGr0ykL. L "Y ԓqo1ƒ72_RqpmT8wF<=6}QɣgJ)|-I@c(=u;F3 .@8urcO#(/k̮lkh0y~uMyaȥJq*2@0#eWU'+q&H11H*G%KuYܫHV͡w{}%?xߤkMa]f@'=]`JQ @JԪ(ؕLԐ^1H*JO%;)Ru* CrĠeìKN. &26rJ_`f ]wr ⠯YTWvkb8傒v*+\hMJdBó k͛SWLֽu^8:`z\ͩ|OcéгˁJp!]׉FuM3VkFL6/p|g˄v0o4i 6Α:o>ɕZW-yu1lᕕ" 9ewlؠ/iC\%HG[j2.leňeҢWc]_pI Trf-W}T$_a nfx@] 'wrTKYe63 o~g83ǪH$yv82{scz~>]Kw'-v"oKECȢ@کA1YR>S˥wv ?4%ʋ_Ԑv*wYFr89qc5ĥ.ji%Iy',QX*ͳɑ~#yj\rWO(YB`4 {@#M^2T@ ;lkIˎUCn {sr(۔l2Xt,ȳԏ@DÄD㿙 F'`GZ('! BR!/MZܧs`{g&UOQ Y-"=GWgbHh[;X ݫ:[):?(l]r ;W4S㸤 vҊ/6l"2{I<宍TwP9ř'nwJԔ2.[ŨK竘\q~G0:& |XB_"$Tt˪HsȾ_yQja!.0l`pxD:ܠ_VY ˲ u(|kfY2ۍEx<3*7*G,wT qQ&(kkgL&ն\] "G؃h?^">Jp:{\MOώ+8g$ PR21uGo$Wih,[))ypmX>V6QiU#✒ WcoY!9@i k E[큥E+Nje+\Z xN3 Jnr.`؎hUzU(na (Ѳ *gWANWZNXopSD(v}:>6aUmF9HK@# cYM+3-yb el]ך`VV@[RQ mB|n@ e?7Yjot53 5tYTIR]@uV;\Y<%[\!Z\Cdž*ًs=N꧕ʓp hܱ? ~ߋ. .+8(Lh~ 82g̓4 */Y+)p_=;~S ˸z)1G>p˼/c<f.N9M(QꝞEvS3X@&񟗍  \`O}_Ҭ^hpN's.9 iS x7LDSQn*Pkf%>{8c;!`Cc^Gm%6ͪ:ѷ83_H%|5>mjd~7 k\LBk22\9W%^PHi=J(֥+E.fbrN,] +Q9.G⤻# . G {\2v3XP|0Qdlf]2Lᬔo(OT, T# A[]n_x>sε(A2AK{ϬZGN)?}ϤH;_m"9H1QE1> H+*X,-wI,PxZ8򯋫Ů^%haᝨG?PaBƇP"a!ejİPE AW+*DJPfũla"z.V<(ōॠ)9M 6Y*GB]$ҁmȁtqFBm@])_@qZٱJPh 5/,~B Cݠb$9Q\6sa u䖽vl7xL*.wT#j]Ie`p;gk$:!lM'EAKXjjJ(dî$WS<-)TN+GK ֨,+dP igP lȺQ/˭H;]YNG-T"E@Kq*9䵠H̄hIkh |Ng,PA7G_T Ӳ"5PzZY:TbT*\V 0ih?qcKQ ;tj+ky$XI p=iQ`ikq0$U9u/ۖ(PbxO޵n]dƒxbHcBi{DUs!GΒ0gC]#Xq/"a[KD4ʦ#Y^ϱS3? Tf$ g+{Z8p^H<ŋX"F4Ǻ3AdYVWB[PG"rovKJ˝e_貵eO@mCpz^Ajc=+_b7&2y $Futk) J'E7Pb٧rq ˟>d>jW>I2vc28okEe<#TxPvB6^TJzl+- J>)1){f*yΔA.'ZejʭmJLK 7̽jϹk~L`&lejz9;M) dft,ӂ>7P 2ɶU .z'd5^(=с*-6Oѱp|M}E\LjEbɑfyQ rCKW412QG..jw-  lvCP(^y"KO"JMCcug~$᡾jD~Nі"Nx۔l wSXRhhpCFe$Ӿ! rOL%9nR*pi&ZOC׽jgD^lA?BN*䉙 C[ps8bjseП PNz7lZI֫}yt{zh_$_&Y$܏4߰}|//ĶՕmZFƝyjF+%Ny#꧸[N*r}QwOb4\/ğ}vebj4}h.Xk 8$3;`އAxC**X̃cBpFM݅jPS s$fc!@Yv?f}4H*y˒p,<h.} !QG[J5TW @kIXW,#!NY찤M+UZ4"'rL{~alIѝȦ ;{,XNP qgt?Tgx٦@C6kPK,f*ХPf(c-he ":a"d6z lTB]KKK>m4"?h4=쀩1=y=IIO> qDs<頶K_f+k0՟ DmiWaa [8fggd[q#1 ,$ǵgG M!J}@DlK /A9"#!g7Gi6iBʟ'^a i 5SIMEOKDDr\0G:]zka\ߘ#; 0i aQbG cr8R *1.zWnPLXg:I0 RpmhQSFP6[;g(%9\e[kV#Hw[?f4خ/‚aYjqL`/y=52Je^Hrz{—M:ݧQzf C/ȮulfrdkSi؛se_Ή#k(-;isN|x,Y5T}E-k˅#5JWbBR.9" 2*ىrO89Nc72d `$cW\L756u yD`hP 5̩6i`zuo&3(1`5p A'{Yvۢ^,1QIu'-$28/93-d\ l[_}O>Gڍ5Ch|~nWWSGC riY"dV&_frg!NQA$HE7fO4A>N)\QrVQ[>tQj.`t@&$qR 6N=!LGILӣ0>@{dU=Om M7Y6x6R%-0:G]Jq.Jhw;6qG|އAtRmHه|7hL;x"xyJ6ӣ),0;(K.@@-!Qs]M,d Q8C$F~Y3ϋu”$#=atOFP]rqw;ar#U3%7HO N$&Q:m:*{T1:s1$0)zl3󒗨vVp\Rq~qTg"M8.Jy.FRH7L6J7md.4tIH&KU(xsS{s.`:/%N}׃Rp} ַfԩ2 i8d:^V~\΃JSqNT+`ٰҸ9*X.jr8}ʵz.:W'mHX Cv']lV{[DL n!ǖ:U==]F2UOݥ4Wg*\vn]im6MΧNuK4['gqZg@S)Zmf[zMZ6?>),3/ZӼ6t|R͜'aP{m ƏqjK`lNqΜ-<}r%~ky6H)p}جDdjv&aGZ[ >GF(*v> ܤH"27^uQuoרy۠uRT81ƾx*N`݃j}Ɖ-o..Mܔu+g8͗wUI#= TD33&8kf;4wlALBH{s5 ż3ȷ(i6kd""#L N|8:6_RKqJ)\VUFOjM`r3;.08&Yb1c?'6 M֍}`#|Q#5*v<$|062ta2&\E J:kkbzHNz5At5YKmuE(;z& Vؒɫ F췦2 5rlx"fOI$?X6I7XܩO :a(2*bdڊ:`uKk52 Y#?06L(û(~]fsI(2?;nJNr3A #EQK$dU,un]]/Ua{zy\ֲ]| 19Wf/5cv]ag%/]ljBU;?$$H7qYX P>ڽEXsw>ݘ]%%Q!m%ؤ3/.}UV[G->#?X{BE|_ -&R{ܲUv\ValFdk_ߎ]3y9]_lh?CU"腢vC/ 1|2ӊN)6V^>裣N ;g_}ZN*f.l 7l}w_>VVcOol;{oRֿMAo]pܻ|X%*Qo?<-{D||tD"Z}&}eRϬTO2߈џ-GSw藽{ÌBt; #ݨ mX/cڗhYoz{b|V}y}еnX#֑6A}ƫ'4b0paKp7Ve-"Yf(Xo@t"Xlx:ݤ셢lQؘۯ^o'Y âm Y~Ϊgm 7S\a?[#EKZ ^w \J7_e789(]4mAEV1c0v{ҴubһQ|V)YۆۮRګE;{>v<1jT~s/ms~[,\=ϒE!>~÷۸MX|l e}%/TYvەhz׫,fU̴[Зg}wiEkkDAm_D-XcR 6Z{W{ }jTԧ{|S-CIM;7o-͍te(鶤=g͏Mvg [G3ԩڣwuS;O/8bG}Uް(]s@ӎubλbO6Ͻz[⯄!?-F^Z֞S,{ ”4n7o C!˷9~Ƕ2e, ?JZMp惯MXeL|{~O;WJ6[9?Wtk*z޻VZyh<+-?Yq3+ ;}gXw`== `?i *Qcz2"6ck9g7W|3poj懮 {mh5ZOkw=`>3mtb-c?[[RbG+/X{alK_%L 5 .0c}fw,ǙXޣ ylBC%B"\H c6(465aЀkNոZv,~} fF PڑƼ 6)]]ڱd}M=륵jٓmĪGF-=7;[83L2B#֋jbym_z4Ӌ3`ٙ:z|A?9kd}q}fJnm%驽wYwl{_V7}<{9%P:6G!TZA%rG_tSQ@lE*!{pyo=U'kRe uvA||O_ AilgIѰ } n9wiġ:9\/ٷU.d=x?8Z*/|Kvb=/NCI -ǒ; ݥ,U!Sq8%s@[op>֘! (`&8Ya p:CxVҫ^2ubge31@Ն}+:]҂_2 %9^^ aW %%Ҽg=gY1'ߕ 㢎eug%Y~Ի'G: p.r&c hw^ T 8I.i00Q$'w]`( ꈄL12ȺԽ |[p #I4=iقMSS7YD֩qa Q8;+]).@HHCW[_ZUCE /70`"Љ]pj.&#(Gjx \+UhT:>њ7Ti 5 e$v/r4 vwS4u= >v0)kPH.ǘvF #jdfMMneHŹ ;A)㒏o2zLL(J3pf_>ƻL (LE^ة!F Fâ*r-<6B;};@28حLG A!g_y[sk36Jĩޓ/(?@Y?' w{N.ӻ(F Ask0zanRVE.p&K&H&<׫a2eh*k+1*<ͽ&ǜĊ^Žn&Dfd1g!660s|=&{ 39c$#ewc#ުF\Q:G+<3R*WDڡFyZCz~w+<$(wS| DA^ U :sVQZi>%%Z\(Lˢ% !, 6'.GAi`Ęw3Q)؞ѻ w Ar+Ȇv Jta !( '<#ȱ $$9gqzQ0Pۅ x a:T ԤUW30КLY'ͯIJON )キ\ f_8HO><5N}s&S-!OgM~Oļ&g Urΰ$99~;Q1}(8#we2w;~=Y8%F5<)hO]90kUۙ~yzsχ7Me^c5; #e Àt | EgiUVz^`:^ޑ<ཝ5)O{C?iYV>H*@ f1*t&0[u=ghR YW^@MaP/;^ iU4l/pp-=D [5H#h;+.P֜|T'\HUfA#c~ yN{41@Yq& '~|ʔjsӷ9X: `CJ`ᐣ vQN'|P4 |ۺZ).,Dy t{캝[:>12a2][vc_2i}[RBޅʌTEJCYy#"ȝ$1pgpqhOǜRLhz.z†MsW'`gۢK^6;Lx"@`RT2 B V mTzdXmXڑZX2c\Yp+\ Uc@d1ØڊǴCl#ZBҶd8yKˤ2ff໲X!JτsO2o c{t:bf'$hBP/I0Ywf]A%\w!̹1a/U so ; 5tI;#U{ޥJ$ Н\zADga)n 2Y=K$0.=TWRiVR)M0zˢ-_H lOpL!]#2@ c&8( /%o#KEe Py>A3^"e/~IorVhi a2Pb͗TՎ9.tB70X\g xqRArm v - OMh_m.*ѳeRݞқbV)~ۛZ#kWRE% bV=9dB[0;‘\`lWTUC֑HtVȲjҧUBX2OpZ.X+ Q$@T HW}&?A@ḣ/P{˲X;RNgi26{@%'r"qR%3S{J&($ F -|(3/۴^xnpVMܜkl]hɅ@4,vrKqf/2&) !Rl*9s߄Q=µ%Lq n2+^o^ƔZ|1ϭˀ=p?}T,6:!RVny$?1/w"S1{jL.MrcPn-`< 7]7='3!C6LE/_W(88C蕔Q1,Ah rkA8[`c[`ofpR\olͅ<< f.IAv=F )#_^AEAk ٰ69iCcbP>JB]w@oB[ ݗ@:6ПAG75P([ܺ s/Ìڄ3X)ȂEۚj >5ij? z2Q˘&'U X7[oN,IMy`"zqC#yC8y60Oɩ ceuvNwCn/#y$l?׎Lz&W]yyu\tXzD[H SR_?d< ~9DgtprXqUTʸb-oD)mYœ+7LZ"125^aH11x$ih ,:] 8!a݈Bj!#'6eqI7J[ʓ\%@0AۉP`-&+@? WSWJL%p(CI i^Kr:/9OzELoSzs)zM/wyk_PJ#09QdϗPPV%d?="#zo^&&N:P[R02r6jKibSZRb&TA/gI!w*0gUghK3k{J[4}rL"?<̙qAa*))Ja`S⃤r70uFO䯙SL㐁RTBB#BD"4Hu )ԈpEPjړDY U8)ⶶ 2g~6R.k[] a :z ~]J0Px"^1Rk `uYθ5X(= 5\*08,5PO^LJ7,NC92 D`* `2nY4<%W,4OU0k@걃%8"J=񍑩)+Saޏ\*hzȢa2 g0ߨ\ep/Gp÷ ^ciӃVBԯu]!o]-]3$Ń-:!~ݗ\KSi!ki[vbEF+YtNK@ o6jbs{URs7.p~ y `>1IjNZ# fs,c:mԿ~ }_<-TB,/&C͙^njOP:37phwjԳ?c?H;u7_m2T;PFQ;#::'*VZ^B 3f,SL |4b.{=&*.}޹E`ΊH"ZyG3rͩ|Gy>X}ZK±<.lu})KD>+m@Od_LvO`,g}d&‡zU؅Ah.>{=m}_zꟿϙ}RRr kJ|$.젃P(rmnE_6W}jPpT~SAC4~!{r g$qw.ׄ%\`@Ybk7$–F|pW4&qʱx0׃G+HA mՁ.wL4ڄ[.&+%Gms]K{c}Oن&~U3djFlTmouq'Y)`\e3]H) vxxn f̋YϾe7ϳ@&Jئnq[%O|Tz{ၩZYP(|(ff{}!͐ F0@:'pc4 8OS)X,Wm0 ]+:%~ { 8иS}Ci)3Nq;m:jzB$L=ZKD2 _MԌ[+Dio6A 5_<Ľ ~7nxWw7!1 jv-Yv+ +Ν>\׎e Rmbee6~<e,Wf| {>e[2z-</Zkr{bn?UxV+& /`k-]N@^bNL7w4֋Oγy #N{mJf댸هHBT1_yL%^}j=]Iw3gv gP &y2 #֣Ӳ͛^m{ݞ)3|ve']q#E~opow16Y島6T֯Qu?U>`ϱ;OIn>6n:Cf9m_voN 7vm1>TJ*e1S+lm#IӸ#jEyiȹcgiv[DܢacA#Vl-KNߐ3]F37ƈ ~KYzzl}~OY_HK2m- ~n?CЇ;tHǫڸ1ګRLj=L7cFQn} PʰGkW#;uM%"9 Xc\v!4I_FfI:|ؑ_lV ,_hv`~o%7%_]:+f.B|5XNoloĤiTpFN+rH$ 43o D+yy/K!3`FVlQ{G}7\eDDU_VpU9~<}IN܃*4}yKXJF#?W.|i)V}$ެytӜ(3LժR!U{u@ЊYb(:*xCI^x 'Z\ULi UwR]̒Ŷ/.%ɊcHI\%s!lRkR mS#,p+هjļ~S-'E`IӁ ש\DHGjd#gx!Wk>LS'V^%} FKuX@,[wVPUcqfÿf34daнaB2WT!,fcQݨ$PM] U^ZWGʚL$N}L"h#õ=4)yicyev$F`~x Wn$`#b4nQ?ZzJ>Pf/p'cv2A]*i\q=F\JPuOɨ\+;‚RCϓ܍ҁtpWÍwj1` j=$=C( WS5 *#6dwb8^ѤTE" 28Y?JrLް/&7!&ӭ"8$zJ ؂*OMW+K ڵ2  ~0AHJ hժuHb6INľ2X0팄#of<"<|Q!ĻDTpYYCRE}#A@tJ)nL\sHQYUOvCK?w5u`f=dw={+a QrM - h`][+hԻy xESEw-=lLo^t4Ap&s0B +ڳƴ =2^Tz3 @ZBhB~;/u'a@6 N{aZͼ)di=ﴱJxL64f ى7޹ d%7˫` o(1ƙiK3oINMvs/IlqL$IVPENJ C.p|SXֽPMbO.O }Œy̹Lw^bx 4YVB'CTt 3Ae3=%&v2.CPh1E{to X2Ͷ]1'MxkTj`M0Nݛyb:@.7x6xLղ"}53yJVF,lkd;FU~J\dVs/)].\0ɻ/9Ha!%jo0vV(♿+;=ua|B{ar0AAɚE?E:*l jw M"L%3yY1.#dpט- 3ڨ,U_\5ȕ| }wqvH3zML^x]m=[ә]6U2E ʹe2 S` Em" s@?$b9 ĊlxYMw&{7GT}ի(^Eř%1ReXˌQU6 &yu{$b^FfJL^t?H7!e<S[̍ LGi]`Ɣ"2lJƅ`4RvJ20Cxqr&ɛ]c{uy 8@*q) w 9_.p8/CU[P'!`59 zݭK-'{ m]#Hoomc_UDj,<"_ M#cxx픣m_l6\U.pE]uAQPvJ(g + ,t榓/wHַnUAv]Қ+j" '8I'L' )A x@N !4"&Hv#&!@}>y5mgs<E2I{j I p6HA fJHB:%C? oPgu5wFzt"UzhG-:)(ъQ^Q0UՠuGHGC5 .c .'hf& 9 8=kOuqas{*'1'G + }U2rG2ty3L,USuGӰhT&W\`ՇHf WA[#,p?oSN7DF΋9/!T<j+ 8Qbt=4!ڶ;8GƦ(i+a3/6y:I#G+jAu_Ja9.ҕXC7A`٧kP ha&״TvbUê Ç*꓁< /"4uڀW)'kXO> LںojX ~Ӳ4FqתQԂG쵔d~j]3;[A 5ype /:"0M>ؙPnnB8F#ױHlee6=F5!\-Yesv4[yuۯQԉan}h`58wl2h6\ C"q/RD@3 bI'z]txh蚜DH4?ா֍I@ S(8qb9 '{RS{|.UurS{c}tzM%9ܜeT2tR5} to0ϿA}Wh#y ^KBj%-z͚1;(Dsԝd9Fx9C:}h=3g5>+F|҈ kӮz]& z'+c"c"BɫA[e)h_Ds&MSrIv 1gL| Nz/?a$wEΟ1գhrdX>%2&J%eE:ܑ!hYKE[2ߘtBTk 6|fTRZ9[kBZǛsu2'dCF+orĔ XG$I$T3RZ\ dzo|\Ww@29 (fD/o- ˭No;H3W.AV䚅ڤxpጠmQӋi.F K%:5لc<`ޞL tYг+\;} PK%AR^"eAV_ xqHeW!2 3F2!E2=+SX/.9(«5l?A~^Օ|l|Ǐu ٹ4|AeP(d:F\ݻDb-Wq/Hy"ݲjnw-p/឴UfQnXMatH TcKv Qi5RKR C/ag ~G7})2O׎8:L4"nAɹ`90Qfoh)G/QdF/rfj媅S9c7d]s5w ƂW Y g$ՙwWCvvg.zU쌳M48-\Mb (ֳO1&# ȐG|/#wn !g7d,&>/:g cCBzQ`قMAܶίL$:_!_T]2|gJ[ƳzE62zk`wdg ˂ Sv8Iv1׀S{UuݗkTOulC{01B'R۹9ְEn6B~*dm#@nDW̽>g{6p.ٙrb]<ܴ_bXu>cJ-*IYNT&UI`"t؋D-KC:RTjVQ {j>XjiqH"Gv_ lJVhةe;I;j/<?(yU̔vgo<!vTKjD3:f59ۚxJbpL`,a[ :Fo(^Є N3Sr%p\EQu\ t:A &=B?Fz xs*j3Nտ*%b*PP7Qċu PBDk0KuA㦃Uu$=FyO/?Yb䞒PYh4A&`csi*x#>钁T]Iao[dͻbY^A.WuK{؎ WhpxҗW<0b]ldD9F Ā\1h;;Ci^p{xUU3rrYX%Y1^z]$rm(1,uF"H%vG&w÷-˂u'vON`/kq$]rbmbDG.ZmDc*p9{٤k%{ؾќOеo4ϽV$p?h?^&|Y( P@l>:a)F8nZ*BF WW(f= onuB]R]9R晞 [__va^QV^zq`7{s_eo2Z7c<^-\s 8L R-gƚ!?Y/bhM%6R;Ň˷FFyW[mw TAJYiA*=b$-Jk4p#9XʆFH7K(^"I<f:m6@ 5hOƳũuh7|0 ݂ػfMVLL f)ͨM&8xEh hvT_ JXXͬ93R)jxƢ T3Ÿ;ph1|G'U~  HpP!Lh>FFMG-AYŒ>_4|'_ʺMo%й6|GSQpr! HwRC{>Ö2?pM5<kl0Nk^.,cT-͡$X3kiYnq4nQUVb'זݢ,?k67Oa8+{kcڲ!\5Vkd1ˡ-#GU(6OWz 3,2X^'4whHKCk6Qz 7Fu99FnY<=Q{B we4^;IԹp6%?{ #`^M1tZ܃fәߺ1dgH =e`x`p@p|bBぼr{ޮ܃>׸YX!"{:J,B݁yswWX殚in< 43j±rAgbX⇜~ϖAj<y沏B8fdG:߻ニkܷ߄{ӷ́ߴgX~yc)i$ qMEJMX~2O q(ެfZ"*hYbWEӭY{׍R m==τ< ']"vh >||!`ANd/?k jfF,axc`ν|cͦȾ!_*紧4g\e*_b[a @"WHBy~l) #5 DIIC`8nFp0{9G>< m*@$MyZ)ڠt dLls* a=zW/0Hfr@iS!Q$aڒ& p* vNHQ͚'>R#tu)Hstx|t͜߈9{3/`Ffh-ǢSnIE3j:tC&I6O_j \azH']Cǫ~ )_UV۱ .!!-*A95>  ""+-,R >8 .ԧ0NJƌU\y! IdS! +NTR)̣d\fvP`8Ve(~ Pi)NW/)!G`_PЙjiqrM #yhNӝcK(-ݎ*QZ嶈HB}JTt3^I6*j?PTWq28h[?I 2MRT16-6hCڑ qTx"R0PŹ8ljskB9O K"$f;AvD.@W#^a=4*#6"}R34t_^ZRqL!YysxY,I"QPfJS"ֆg3M.j-:,hJ.Ν)H=ki%?O!ѨŁd!S5u9R Y\Cm4 ז۾mi_J]?&ki=nW/Gx?O_jkl+ppӅ旵^XYj^ kՎWa!קpmڐQێŋl3/DLظDq_z4#zf'&0N'fǫ|>DYR;p>?;4$DSIM+(F19I_ˡ.F5 ,+)z~J0l_KIl#TJ`#<e;zwV^h*y4B"eu|BQU_reeը °G;#ʽE)_c{ӿo%9]%|z[T ޢ_1TD$?_>!T[v`!qwB2(䮻9ܙ ;.dFx睢sH(wdZ 7ҽ q Ff&,>zCUr ɫn(^M[WbWƤ}Yokף|3q|x{l>DE@ZF^C0S{)e7ɬJ{4N3`!{T-o$|;EBSFP^_y-:2l17%m|  ə<w|]y|kwO9(@Y\}|K~gnT&#W}gXw٥LԿ"Ƃ`(+[ca>Os Ý !cIUYɴf `&648PϟF NJKOT؝SELA^p]gf!#{@"z( uXrŨ}qT3qQP7C%rG<)P4GxBm*FLP/!jP9%T|PBsfSyXU,̝&ӂj"jD}O#br6_]?s4GQ⒤>iZ-PJm ^^ԑTUfrhEi \ ϴH[,d7.yJ,/2]?ZL8;S #nYB a:4Q3 D G5źEyu(^tB]Qʹ3WY0!Tt=V]M-p"RC@ m!Hs#6Q137L6V<53!Hب /6E\ ϻDo6|͏|~N&\!v_ڄ utzsB-k7=_n1s[~6H*\6`m<Ȝ p%; iA5rjNq "D\<q.@+ r6 2jz Ffx(w*4h+WZLc线 QL9jT;VDRw99 9Rc/st?*enU &M٣)H | @ xͯDصؚGEW!9A“էJU&c<!krnipLn% 2=(z[ԇ郌<\DDԣ;"(!i7Jd/aeۢ$0cė:y3ċ'K dlevV v/:^;GRM\e-)&KeS.ͽO%]N^`~6dqF35HQ.JENLj$>$pr7( #m"Qx<~?X ^,/aҪrG>=,[QԢ ٪X)kX8JYevFA3_%:rQK{o. fO nA>;˦_$(ƢNGcZSrbwmñ).KI3PI{|FMEv.Wüg"# *DS\OOuU`׽p,Ƥ*!z⁩zHe'U3m8Wf6e@73LP;|:M7b ݞ.7N}q]]saen:|q l^VF晻XnĽ';ȮG\vcvC]sNN/I(BjAMoJm !% R^ ltbgfH#;5A%)+iJ竜:.D8J&W)g؜w5317k%QFftEۀL8O\93D<@ ǟxdãƐ.uO&o.۵d=|=tַ!B220蟅*~CYwhHM5̞+!@J#&HRX.v";ZnObH\v/ 7N"-  USi7Nf YV, Q ɨfB=v\!vqo}Υ+@Z"B7LP/UJC MYOHL`ag/+]1[n( *8Ko'j?:zdq Yf-5QĢ3 7E҅Yy9 ">PH f|J_y`%A=zgb#Fuȅit牿KaI(~ijDU)D[yIRP59_pZ;f"]}e5\ɱ)ij]|kqD}"0F-2rn>"LDmE:L^eBI1]?V6v07T̪DNy*:3u1LHE4}J7m$+,7hVIi0̇X:@a0&֤j`M;p+J(1p`2h:-/\\}EG+@qJmvS]DF/쩨k>K Ȉ"I!S3$=R+) T P[qw6|y4=͑#sM{KQ|z4fL;lLtsVo}$ =pH=8y4/lCkX< & HmZQ!mV)BV}i;Gz G&ks18xj U6q s`/̝smv=T=jh&Y Vg8΋(#M<Џ% QJ*'0Rn.FZ96r}7X;{f}k9w2Gm&>n6$3=!̋{4^8'Rʽhٳm#w~:0Zd{{f6&GSXGfwY5E*i|Pw!ƙrk`䊣i+Z6/tGy i0evW}M|mtvr}BfTMEG(q,;Oȍv$B $[f@75``LߊtdIj99C߁<ޮ].|ŀmf HY\ bU5ڜ)B ࣟZ䨅&4Y&@?Ҿ'a5'(O"uLQcP*aĆ`6W],F5\ZgAR<,ZqJ2`~cv 'Ns6}RNhNeBc1n<;E!ɼ`&g$mHH6w b Q4|7ZSaY΁(zw¡5ev$I%~hqOFiAidH#Ljr S8n!z]T# #pZEp b`t&r&4)GMdo N|'.L=]uvo/sGB:a KrJt %HmeL?g aL4[0L] F$h!LئIn(t"*t,%Guǻ%4`is?UqT&ho0 З.j WO^3GFn6@BGݰg\]cfA4"H$LDI&4[,kƺÓFs؇0PީVD;MIoĝ i^Ɗ: 2iItBȘ~N/$+j'/kR]NOke9DXMR7ܦl ,s4<jwmM"XI;Nx߯ vI6WG㡝#X=mj#z_Bd{sxyOg N(ZS(015)w>iѧΡ!`o>=inV,e2_"~srOKM3՘`8nFXQ}|7!$@_8!@<9Lj ߤYJ}uP%-Fbv€7_UI;p:='3DݣICjH&fǰyBX|3957M km dJ^':o^x+5}cZ`λ6xvHL2&E׬wHVQ`P'!)sasa/T޻GqTk݋JQA#/lTnq5ZHSWQ=ui. p9yA|41"׉N%CG*MC &vS)ܯC[z(b,M}9uYKMBX.L9Ad~=줡c(/S#ע@r:6B.biǀ[t?F0oB 1:MRiii08\r$o#,%d2' ͎PaUE1`:y mȏ"4ftX3C NA.hμKq9I+8ԛd^UGѹArlM\YT'pu=yv0*HmdtAxn""!ӝ&8$>ƔL bu&ިak*`G{h9P1m[=;_,'l%`mBZBc f/r'DN΀gJ1X~ƮaRM)/G5$xH$eH<\M~I ȜVR)h-$c\ūȍSpGU4қh  9(_֦L<]zN \lru#;Xfn; :dQm>}F [ p ҒF"ԽPKxr ꕦraS%7&@^#S9YV'C}Ru=ZXpa:+%$=4֞qrSf9 xzam&^1 Vz_go!kԾ4EmN/4[諌kZW̯4cQ2<,%noh@2!v2˚+{w`(̛g^< 6RblacEc61'Xn&f>M~Ҷ`r}-nޮ2MK.xwCW` Ҩ%Q;#v5 D%g[il.rijSˎUfCJj[3 S9GWVȊrrYV9&4\z<(4l!u$3QIblmpg9 x$L+gĬa3f^ɦz##3)nCQ|Lrk!Ǚg5bM&BO "}(P#A@1of:ǁ}fUuٚYCvշS m CVwSf}Lgv"4Y`z U,\W7Eέ͙p c\%qhGV(pi`+ZFd o 8*;u 8'*WC߻%XapN9؂6+<{ZklGmkwȜ>}Sh۫tII$c#'G ,8 .E=6E2;x|Lm $ҽ$.vL7ZcLzCKb˦vv-gE>t#+[.sr/+w\:FE_pn6+Xv8ӈ3٤؀sg5`Kgu|| U'&<п(6N噓CU zQw6$uO<I] cNȀaa=cv0+M.?salF .!1AwILlou]xcL6|LHU<"ZIT*4_PW%2ś+7]5¬KE xRpgqz,gP>)P)V~ 10(LOeٶn&:N-]? T59'N'ˈREOFZ͸ORʠ.p{5E{Z#,ٟdq%^Dim8JMLKWѱ ~,1la FfR'9b`QXxVԇ<3h` $] }}a!ZkTy{z~yV3 P"0̯y^ Anm|^>G0>!_o-o f0͆ 2p @vXW% {|Y=-z-yr$7zּtᅇpUQr_շn?EO@sx'O^+xzN0soi'yzRlur/[Bf0zzg@4g4/RKtcbJ x\mO~~Ph/fIZi۰Hvy#-k]gmZ8(3tryd2qZOe:f}6Ί?J\6¯!bKÏˏMхG0F-DKca<@:40mhEO1FjDǃ>TazcB:\ t.(;'f98PQ(Q9}삮"kS/. U-k؆G׊1VwTp[ԟΥVrbV]\NA Zل;MB `hнQŋආa.aIbj<<XX7&_#<5!E&(kmIx\DLcqQMKIg6f( 8Eqt[_!H-C$?cjQLd9>(.j {=-WVU_VogN'6|Gj?O4z yqss.y ^,v]RM4,ݱdƘVZ 7(ډu>=VTd_HU QKk~oq7S4 T[CksoefՎOPٍC-}~6l,a /1%ևkSۋߌxl H̎M*]j}2.xG\IfDd@]1 zo| %ꕌ0z"TޱIo.FxCA"s5 ݆ퟏΦlzһnZd*jہlGua\øOitIw]KjY^sW{ .Ϧt3FS{ sliQGCHw حSTpXj&{[O~ U6 \9< a%-^N2L-Q(w ޝ6dW#^7}R.L$_zNz3ʵǪ6%"ʫy\aQ0S[HG2h v^9oݷ<֝\ej8M6&i50"grD%~mm i$FAhڵĭqj7,O_6[dV)^یe-ClEou=6_:e#ol,Yz&W4n?ѭ2rJtUmA>>Δ *u2a9lcެp>xJEI0M7vtT ގPeB1; Qmľ`76n+uR׷a>7dzbOwC#T Ci5گ6ogОJzf@uţ^5\&F'y?-=գadڈO [$U%e%E' #jJtrvs؛#X^=k@ZXOcyet$uvU{Z|fL~C(NaԠqT.t7:gӼV %[fNdc dzOo[J,KMs1{Tlŕb_Ӏ`ndPwy`g,#I$D!rqoؘg6Xxjzٱ$Gj*u6#d [^VvNҗZ{ q'$t>Df;XfP:~;W6>kp?<:KYzǽJUs^.)JWjc7vjH~ux+2w>I![Dv)ıԚ\IW`DՁ?[psQ/}hys72 kd])^G W,,뱫Jk69^Heq)޾}3搯d>!u7^AzV>RH%YnrDLgOgPwq"A}"brz@<[73w F7^HyBd~Hr@b_`,HnC}mUH4Pt}σQo`79q5iH+'Z7@MrUfǢw- Pȯ|1|O'|] $nKwzVYAEA5¿_7ޓR v?c|FlƧ^4z=E9cJ\|.4p3O L8ߵ]S#θ0ǎG]۴ߙtA.Kth\s07F L],?FgB^!52 !B߽uLM_W ߻2M]ndJ>"c%댻yeiNQ:[X2zx Hg˧R D4fq*:I ?ۊ:fz<]We;YEwM.phK8K>~ު-aɹ_Q:@M  <}m-e\)ֈ<;T3Ղgro'?ΩUpȫ6\st&bPcvu 0D.RIR HkxNǻWܫ~|[;n~iF{/pa *RDb ] * f;ۙx LSoGQnGkߜP_j!)rœJoY"}t(6 ܭNq_X|hXɈ ]mE/%'rlY#o3kTŽz ?ΰ{K7/%It{}+;N2|t|Kcخ͌v$Dd @ܝS#J8z`M+:FthzPg `w[B5* *wp@f %rȰa>i;wi .=lǪc"FѬ ek#g-bsqЄn,2kf7pkNGG|c%̍ _՘hOh,z5RL@lV*R2I~β{`I',n!YVjuP H;GN7[=;Xq8>.ʲw1?PWtXOZFޯyy.oSS8e8lcyC.[}G隲\Hی,]1`so弆3o?,G96(KHM $?1547煦Yb,xΘnmON'ulSR !>[ ib9k%`Gi◁t9Ƅ'y -LOu"? ericGm8< X[Εm_p:r mqQ!>]mZD_kb.?=GM/ȯRBn,c[Q~e^Ns6Bv': >ف͋Ƒ{MPRj%:=˶¹Vbbh_WZo[^-m0y5½{XVK,W- Ja_x-Cm^.+.qWb!TAJܒDT>az-sxh:\t .ČG=;,209NXB"pCD&Lp5❣fIj%>;uUɊ qhK֕Ed1pO%3:nMc_{jH2ŕ"7|I o u ­P'Ma\J"n=qndP9LNC`"" aGqG!QN\5;UcVo`p4LsEe_q~oWzk^~օhŏ4yeo۸( ZTu=$OxX H-MADY-myV+YfC7J ȧcuTuKG0ӫK*twU0_.&f>rTa{7qy]3J)5#?%6vjF ~ry2nB*Z?@^MW%t_W54m"_i,?z Ge5o'_lG0OXX~SV?iio,Hݐâ4xA!]o5?wI/y~C:xOoO"Re"po|ydoyyUE*6&4~uAji pzŻ(NKt$(*^ᯈ3V2YYF)Ruw+[ m'@<x:jFxñgŕ eE>|v 3TC mmkeazdz)JџoMO\c7=W.WJlߴHV# ~XRb,ص%xOx GQ1FfJ5<-'|R3\:6m5%VA'ő a*: .z,Т8֔^ Bwட}{J]?9i .k%{ޛYmSB`67P;ar&ܕ }lF8AbdJzh1X/i20vS;H-nd;^)H"";?2/%_}e#:^ vd}^1{罌' )TPBS D6#Q<袭&;]#x§3Z%daz,iيj]F/jE) Mޞ#WC떿4#70a!Zu艠d |}$yI>t{kK dfݮ̸C/yRcy0 7 UIV"7&; ZK܅Oys/?̒C _)Po 88-j2pzx-w p)H,| /wGAb=1 \uhXAԎ<>C СZ!Jh*"Y{O!@b_`, >#"}#BgyCC9`u'6X}]Xd›7{}Ac%ĩT+7*_LS-4snb;-ҽ:ݡd<}< ?}th=?.ߋox'|*'o9<γo{I{|u(p}M$Ǭ PS)zE .&?6m<*'T Ѻ ` ->>/ Vb&aaڳ!ڳ}i:=ozCÀgCuG.d?OBRJzzCɖ2e .ø̜{O恳SʵR_2ϱyW,G|.n ]_~Sƃ Ԍ8N]Ig2N'ۇ.BT`MRE#?<)kK'V l> w3o%=EF ]TE5q0©ixް|z先 Uȶ(dOJ:NqrɬD Mlv *VQȩm&CzJk?8*Yxkg "̳&+f'm]CK WxZMSá5Ʊ<<@w O0YjY(x½lߩa>>><&h"?~$m%Ts:2KTPMg.E_rc3ZB3?";c?L/`ZL*WvJ@-2.̜+ =b{nV+ #9#$7NK=3`:tiѓ@LxH-B#1!ytn%&IqAWX征_ ҐNvHn`4c|,-$?SBdycҨ"kYcG+%R >0;??Ȱz^˥?/E't9BC@_!uXo_Zԃ6̄?5_K?Ս3s2,-EZ1z_qn<Ł!#>^>P4;O/yM+%<_Ȣ|t ?)`,0( ZR",## /;SDC4.m{HjLcА$h [3oh!㕛+V.B(β$ÚKL9O)d?"Z^ȝHt?#q AB &cz?6EDO/32_VKN)JEk6cq3<7>sZB6y}v96ONfހH ;Ux,iwH_ $#gNUJrRu(SaF[, 'T314*DҪ]1. ćB2z9XTs1׆`O c^~b4FeϠVeE:^ls'y/ C2ey}G_6B飁1YN2@R 5u 2n~zwf7"ڡ `0V?G :ܼzCBH:ETKFLhql [h򳞿AVA֓/0n&f4)ԨkY9n+VYZ\4T8(Rrf[uX%Iž7_ɍyt>9}Y3Ȳ(h{k(Rg %=B`9>R3nh}էF?: JL^FDf i.p6h}x[L[_<3 y16QHR D?IJ~gwUTq5 9pj$d0`&7/\JUq&aKe+&%?5x=>Qy/ƍn+),}O<ٍRP*dzR`{qP\v>^0o7QTPY:1u`$鿺2! 7l™'V-[lܝRXVh#֙<3ي[5/hmRH!̘GfOZhn{R:AZر'Qޓ:M eLP2QQ37s$!7PڶKPRl!?xGP/ otIR@!MZIT0ƤsjcY9)תKr1ࣉs|s'0|4`lLwDRVIS’/JxJkSW?~;i(ue=HN !'V7$FMQ;9f$b iZGh*\'XsshCTqGiӕu'WX6o8g+[QM\)S4R+;H.:[8S16BYQ- [i 0)aħ89B6%.Zg}T(vL8qU :ybj)VRL{stia~dHyzKFj7E21R PYG`W=ӣ"%B5r_TTcR0E)kS.&:(GxfFQD|΃ ִT&$cJ"m/9Sq'}ZQanQ\ UIBEg0 p8t~Zޜ,L&9O$*iKq>i'6%b1)ZDZ9Kl$ʒtc<hMsVwrJt e eY<$I,Kf:%Du+²ߔ6I 'Rǔ*},\l/jdJ~(!U65d[-0^Z)Jۍ;W2i'b% ;Hz-Hѻu*tVI A( 1ᱍ*YVK-]z|k%f:LZ+}tFWc "H"bIYgCGCrtSJc(dN(?e%31+O0baHB`1f.ʻ+zt!Cھ<*HqהRK&@Qer`vގ,]Tz^`pI|YZUJ˥C EsVoC ioE,(LzSci7fUr 1'a(vu7Yk[ һW&ө?)9 }x磖zp0,ޅ6E5T"?RVg^`z4nʵ4 gDvR<#ù@*-V ۚAf.CSk%g'N-sxqUJkI~<+-in8} Į': x>*)̤ Ëc#1F (1b(\_ "b#p \X_u!ߡ0cs"$eh2N06/x$y pc/4ٝHxc'Y#n`}a ‹hfV+<xx,cguFv!רdX9LQ')35)Dt%|[,EUعy^a[U -;dB3!0|RQsj]xYPȥ̠ ;SqJ+L Lcڋ@v0v"kF6дvΈPW9ZzHB(i/( F-M*i mi&lƭ nda6PR-$RRJ^~ӈ\+ 1\C{dEƼҶ5 ,cF&GĦj˫x6ejCl-&"1#qhHW%9v`Gclibd lQx7l  A'[{4B՗>]ޯc#_}t#guǥc GLn!`#\c+0Mt쐦E\: Pu.5v gk:|Yc;ۈ<oO|xl7d%_DblF6=%Rio!:;:;fd0q@me#섾veo ^LU :T^E?{ 9*Bb\Xeq Ar ?a(iOۉ +EYі Wu']OS;rݿ>lCSG^F҆nl&!4AF{~W"<@Ᾰhn;gl<=,쮿#fZ$z:ژ9`;I 'j+R!M^̈́/]9h3(|o7Џgx^HƶYgpھN"ȇghl_a 7:@zP(ztO yVWI_=Džgд}ExvbOzXٞU }mI΀ApBmk:,ilY}-e3pU6[ KH/%L Sq H(lԺw(KFm]ƳT0fL&.gzَzD5"= hY\?,S~_ qT;t6/'k[/҂ D[|uET TzLp15\4Cn(Sc^z X`x#xkDh 9_ 9rϝImQ;"䲒VF _Tȫ`O Sr2zʠv72DiH?& *,.乙 #:-؊4*:-ϰy2F>V~k׆,f/ 6 J\]k3Fhj<_J@1Pȼq#Q',qʞV1L椻ܯPo̯-!t{,ٱrl xheHS`hΧEJ8'@9-gVA1*ZRLߘ)\/chd܋įpn6zM}KOƻ>ތ ZgۼkdC=![=3e  %8-…Nt8D"y @ ~lo.{VLM 4jzx#&&MR@suW\?NJch%qJ,޿9PX7pCKLo\)Vq&(Z?p*5?U Rt "2ΰI(뒰& {3W7,4|y ?Z]lۜ/Ĩ SY}د q]ȒX\hL|x1$#r֐@1 Lq䇚7;m:Xs`VV! Hf=u|^A^X 7zp@k%H](JsV<콲lhc-nZ"(3Eۃu8_dѫnLSg)faNq&D[=ߙ ^%vF֒ٞ*>ugܐAUUlK,JKAvY Zny 4fZ e]pᕬ#qq*EKDVD%%И%+aHW|J^6RmħF>qup.Zj@ݶ%;CXB2F.iAy( ([ph,+bTXMe„3<MH'& j.Cke"0֦Ƴz˜{+2n\q%Pײ :)d0Yᠿ(};R&7NR痰' Hwϙ`^b\%U@%$nq+eB`Y|oLsuXŏi<יgH{h]*"UZ'B3ZƝ-[LdXp$t^W^[O,d{acY%p021t{qEBDQלeXU ,U3DT3ąHC${ e#Y/ݨ<䟿rlbg;KWI_C:vӅ\wV;s4tD.@q]à$/ 8< au &^2K1'f}Gq1R .?ܦߜo AbhE q~K@icJUzvm0&wDlsb-!bU ۴P"l?0j-_G%,IPaS͸˪$C0YrꢲIfLsJ71&aݬKT0h,٦;([60H[e{'4[-5^±i^g`0)RkVg8K>MFqm ȣ,y (Ay}aVWI5Ĥ'{rr,08KL+g:Ex; |cnTb j-A$ԳvqQO)/r U1^^+*]]sJ(<*2>}p_0\5*9"XU/@걹P෴\BRAq2 x1ca I9̠'l™VSa+2+bmBqzky)dC4PiV‹ v=W&ҏ.+||!=ڶz>鐍H yŌ|rA/0$)*a_ENnš̶!_Zg4D6h'iYy/P4nYL['IW=\^R*p!HWO_nDV\Z+JcaX!yW_b kj " tW8᠆Jz9^W^"I@Kwc-pe|Ps۴Lʸ]*CzBXcbXL'fѷ Q: nC@ >)~2KXEK.UlMq0B :+$)zi&Rv;E™j rUtj4&?MCrG=8UmcZ8>5Ye1RPD6wSY/8^#Z2,ɬe !8UO)*вy5_cZ$ssakָ$%9~-ZP%k⹛3ze̕|;*I 8B0<ČvSK`=;aͶ`]l\g+A=RM9%yp-k`o UVerj `Āsw5QJ0>m3^WwӧUJNfnΕU6A\JY&7W#m)֨l ;eu3'g_3-n:}DX8 T!~‡ژu M ,JXhPvXJ}$t -xj$_.΀q>`|}C l'vR":xu܍C`2-hd&zPbתXٔ+ I,fN;Ʉ'>aJ8fB>1ArdpʸBײpFHM0 2Nf N _y'1H*}@>ixwt}yVN=%ڱVd'="=Im#z i~ˬ><0;fr_!pP'kevO ;W{~'OMoD Nɉz]^|sk:Em.xU3W4EO亾(BBow&|@.hk|5&dؾ\޺ډе/Jfjvwd/6Z ?eC4 wJz\erOl8.迨(lOz \$ J1f]Zہ3q#< le7x߈@99i G;-rܵB9;kZ 'y„C/כr{c 6["PY7@@&vBbkQg vrMFLu%}`m4ǎGc4+frW'1sdZ'!پ`_4cAnZ?|O9.@p."y7lrjv14>+;2ҟ?cA0NBrAfNe۝/r}*濈밲3ڇ%xKƑ` fO0TL.L>4\n0l'E^32xLv]pX$$SJg U( hͫR[VqU\I}: wduyRE ؁5G$(ewRK Z0\%cFnѱ_؇Lڟ00)`kr-h\.3k.;9+b: 7MͿ,`6 EC,)"չ4ށO) -4V&L@'IWg8Qt'o]qP .)IFa@1g7tUX@hFNsSn \S~]!7+dl/G=I%(ae!]>$payRלRӧE''1iA 9 eont8uQ/iMT(IfvF֜uzƪ|fˉ.tQDe*]Iy }HqWcYo0[^ N$ PσSX v=~hq5`2aHRzw4{>f$NSE&ה# bz\0nY)8%:N_̍G~K9sSLQǁ.x]Bܵ¨T ]G^Kp%^+oYb <vh t[|[ՃC tz)tatiMϚ>lܿ%ё /^B#~4$|DYŽf `o7mo,p+:#Nq\ t* Wi9I 棚8r}ԆzPUg|.{Yu/5ǖqjXrgm,֟W-;.>91pΏIdԦEƆžܾ6xwM7 UҸ?ui(WfTS;/I$7.Skҡ/ChM]P߮LGp/E +CTy{èXotŘ ~ |Oq>O+/P V\z`G|> [P?SӶ7MBR4 QrݍV!)׮lpGX,A˲ē U ԱӈaN6264J06}2 _ ߗZdTfL/7SV"/@WXeOG&5ehx'6lldU.mҙ_;ϯf FHIuv 7AJѦ936wutպƕ'\>s ӛVtfGUt/&&g$Q@Yl{~g")1&ВS= I5u5p$fCqm72B*\;@+Z,Ron4r@=&-On_/TO.'e I yoJ|+m`>n!&eoki ,CYӜR ۠ Vj00)2L،!$f >AabX IN*!#UeWe S& KLEJ_xmP+ZXdAm-HN}5W="jvdpBxȿu[$Lg7ly8L0lj Jx[q 1 ,FH4@x s D=QMǂÄ.]"jh6D2/nPhAzdGM |^4NDDS;Ѐ^L_3"JFE ڭ'X4BBF~!қ1o>8a0F*$>2˛٦SCH[l-nViD@FP4)tkȖ58 ^us ?l$5KnY:q4G;tJx72Y=GD<1UsPn:j4^B,$^ߥ4Ĵbw,psWt fҕ^`:r`7iV5x>ve=z)'# o-72~i2Tnw٦ LS\REFw;{Gx'd.smFHwC>l~;M_8eJsSH򡰿.zV^jF6ҩ;#>#߷|1]߀hm?_i4b0KS\Iठş}^.ok4|ق;/"[.*G$EA;D*1a<:1f?9GDnϤk'KMyɓHȒU| Lty[13N{A=Hxшmy̾H{FHFɴfk.z(&nBui);Hf5^pv`@D(9)ye+1x\ǀؙӹaϼDȕq̑q a1#'BԵ>U9r))KZ!T:,꒵$ tjF9!緶Z$a4=V;툜cejx6;wĐ xSwSvt[5i}7o(z֮k&Rj/_}1X0jQ.sx=` $oDIEUiq1xUDq6Ej-+w^i@)iävs+4ftDI~t}8B`"4:V|Ĺ̀.-]u>M4G\ w2x"tp4!4f='}YNUuU!{& "ru'7O"|X8tj._sdsTT"io/ mF)̦[=k)Sv-meܧٿ8B$󤉁 1rCdlByDtO,ٿYͪj֒FWj S.=3K |ݝ Yr8a8;dr˳T T ő:Eҋis|߸FF\B\%*:Iۈ^cLRԁј"\6G>hs>W,枟xQw9f/}t Mw cr m+uw%g!Ϳ)Am~?eTZEsW 5x#7t JoPjw޿t0|:ZYm|_KOWJNRxfҠ?˝EA!P/SƇ`6? y'];yƐڴed/#Be& xCTC'MdN渁m\M}9K 7DJrUid:%&2OlO-%$h.,|3GJHBGSZ϶ `]0`\#0"\GqWEæj7@ς l a+)3 .XF7smGZF't:CZ7b05vg$g=h*Lu腠up,t4+1~r{+Nƃm o.}ݛUC챶 %lVoX )WOV:]);GH0@3,GHL- 3P$8\!KPn Jr*cn# P|R%Aʞoټ&E<͙;4Lw淓0maXYrBpJf)ٲ$Y2FuqNr@%hIbQXR|b@5b-Rkl,X+ܬpg}ۈEϞn-XI 8!"g{[#K5:`)V yC I1۵ ف^ZfpᴡQWel!ec{ӬL%~FmH 1뎏 rb豁 {6-i/d0^ȑ]꒧TsL(#_}wdI$/=;h]̈́(~^[I~/aS,"6AGk+{ 찢zAQ=77/ɫ;#b![tTca!gHoj-ʯd naPYmlN<1)f:3uPUFN #Y&\H(Ȗj`. VvMثX=,pخ Qaϥmyt7RݲȮ);x7.zL%9e֏VFjAa\j8Ap 2yEz?h$xAF Xj0#:yuP$&t FD˳5) `YG A(h#!U%Ire4DTnY5HW*Qj1\ UE"+h53㟿@Y4@k;pl~BǠ>8@EŪLRRy@A48.B!f5b̥-x)2#{&ErFV%P$[~tX8HӬ&F)P7rg[2e~x B#V6"ʠ,t/<1*V'л`TZOyt|gh՞Xg_')q)(}v٭[w6 'hZ^SZâtZ":,-76`N ڥAG93bWipF',\2zK9-6c-32>w8U)zd^}_W ʃ ZAmjZ9zYz;T"aG;\p/O( KhVih_pFfa,PuMrA]K/kۉ!}Yׂ~P ^S4ީٰuozݦ*>yՠ?lovGwulyOtCv}f0;嗱xN&^}#>2˩k^ޅ7/p <7|5$R=C"k*^ r|ol/ho+E>װah;wɉ+Y hۉ|m/L;˩3<=^}7o8tO/`W G3F>}v^~gແB_؀07M_,[jɆI]8p0gѻBϨH~D,ay_:vsGg{3T6ݺO_$FvlcvxdM}$ "pxnec?RHTe=++@..6d~H|qu$)SZ1(\dN'(:+i1@J 1S[&ם眷g僗Qּv^]P0S j&e(mdVDкqL;ɓdĜ(MHzYSG^M7dKcYj_e,uj>ˆc-^&`3h6&|ŚqmSeNjl1-^EـӇACP2h9_!7zɈ!l7 T6FtS%君3nReYYm[eĊO|]5U &u }ot73;3kh_-rKS q7smuЌ~U5z,')C<)ofD|| Ac;3{sG _BXʘ2'թT$7<:kM&I!#]v# H #FFdN[Hl;XjtR$]*[)BȜ1 s:babdb: Q-؈vt5r Gz.vL(}v4;&X+#y\(zQ:&P3Z(׋ UǨl9''DzlRcV&m[U +,Ap|Krc !wuܶQl W/|Ԣw_d~̮ H(QZAl0~5špBO1h4aXf$ve,V%hSkVCS1^:R@  "d@_A-ܡcm @֒l%0s fX[m,jAbKvE`Aa?8O@k_׌fWWpp@iFIרRT\l^LNZyM<'a70M]!-Ag'KQuqG:x]=\ߡ5.ݮÜcיv8  ".4r $hxTDJ1 7.zFB<J|.NX|{z%]/g0pW.MTer?Th-@m?u &\ߞ$<x_U d`,T6Wj {z Ro|~BY`"ƧZj K;b%67(7 %ٖ_ "'CK0 b cᘊ@6MSpGxtf) /y$GzuPqFѻV% i4͢"rdNBlNk|˺'ba`̌9bz!ILEU[%/7,/;Mk)LNuqʕx8p,8'Ӳ+=2'"e.ph=w;Ձ]I(={($Q] F*H'I)y_A!Y`ٛ3hP,;Rs~h2T09 [> 9Wxh?%8q;>/-jSD2Q%HXS02})[Qe7}* H*_vl7ч@\7 mCU7xtFi=:VF8 ׍XS$ZX " -!n_J8&o7e2-⸚˳,/ rdHoL5\8,>IK*E* ּi<=3 te> eप9%kf uKM{_SܪjoC0;#:U4Nv!PM`wcsxR<+'_bD.+@f"~3e/JxCuk}׾?eaMXR12K ]șI.d\+,o/V&z?uH;|&&k$PS4H]kX0n!* pfg>rQP4]Z0d@d ހAb Z&&iؿ Y'"u`J.+qicEh8<X<'wm;,$-1$qeqf3[V߽ʥÂDU,>.RY ^ONٜ'&xbD=}Q@JÇ$kv_.3e q3_ь b3FbTGVjI; n>]\aen_HeXbg:li}=a??'°CM6j֒BϘ(lOw>˜qLj >쁚wuԨиcy^#AD2]GD9٠Lwz"  kһ̇1s:wmvHepzNH+0 3*SzV=sF}}05;P&VWQo2NaHwNͯ>S/q=õ9O`22X\FJ3VΞYj4 P=OnqZI’4t\FY+敺GS7)YTp@=cRre8< G9"[l˖/$%R8gѵEbZul^5ۉ@fk-02YPtoZPa]sӠy9HKtaa\˝岫ZMY@KŔ0)ˮʎ-[s9D_L05Z$DJv F DPBZH\)J]CW@ 6,\pm<8^^8{YV QX /| 6a^0!ЩO4]hAdT[% C|뉷P#)HMy%&X;قzjoF@"{xGP$%fq^|îͨYMfI~ ($+ L 2O( |^x%Rlpk_ %F(^"ޱU+UsEۺt@BOI|-k궧r %"Ϣ\_AxAV3\ D'6j1+`.l* 79 ta {Ў-ЈWcm(ܑJvC #VBÙ2>18ª@qBJ,6LwFa6 BQs>IC:- ZꦒPck녀3,::;:vV{G~`Ͻ'smCpcĊN@It"XeKGorx@p!5hJGk72Kw%i`q2Ui+ѝvEͳdʻzUd,Gjqa.l'frvb Wʱ=)O¢ۀbeUFfp~ͤ)D*u12Yr7j9Յ᎒LZK#t&dqyxGnê{A.ɯͦ{8f/xJ CA G >\p[zF$NTm1D3TJ )1A4k$G m| {;l2B¨k3׻NyY/cbnBѹi+ \ɠ:Jn씞ºaiHx.ǚe zbɢ7TjexAzp,׳kHLFF,_8:㲾ѱ7X vAb;-oUiVh)WC4%!zX 63ep/V<KrBm']-VQWn\LKm,.%)hY0 2*O2pZGpTY<'ZXP-.یIi;^<Oj^g}E ԆLf\m= :3 8$Аy$EE ĥ0 A&Vp([-''AI +jrL2D\/ Z*zH m/N 8ាDlWEl[M/.XX K2W}yn#K "aRımkd*|R)QԒrA:,&uۤS,1E.r"Ыd]؀\X9G#aնu35yٵˠ6?KHsjQP ϶d|Ծ(VM(ؠn[&_I+i'ZuL鞞`'Odt8_Z'AʈO1śdprhl7 K]p-u:gލO[wjnGE)ɣ>`}@x|SH3[EmeeuȊ4#<@C( :Q25DFLEm)fY? ɹm._ S kj<19b|EVG{0v5H_bV ceV3 a墨]~)>g DYh%ǎ,Gå ;0O@OѓL2ras7憁UMlcn.T Kݙ+1jkrRx. _RMcAB> h0,``,<ϩZd6rki+2Y oj!"l;S{ gClA ?~F~)nV-O:z: 6ɰ5 ֯6sfn7éϗ) vx^̜r'Hϲw> t^wv~HQy>9xbZxL-RMH\3n;/>w.:gѵƗvr>^qx Xl' Owɏ*>m-{}`_;oԙ^=5Ͱ3~4S˶mW a B15ca,ϔ]a;ʬ+}Tb6^{l:nӋP5 L57 '=[2Zr챹nbO>0ͤƐw 04t\=H=e.kQ vYpbXJBF,Nj8.Ȇu)~&UYHRPpTwqOZpXIVQOSz'5l]}Duy3ˈ s)e0kx-9&nJGt؂84fȁq #hR8{_KAﶽ>ELӀeX?NJ!3LǞ[,{d-1ټf3zZ@qr6{Iˣ&DPHdzE/&R@,HٶuSeF[tװGi lUÇAVY-̽ +"x\sJObGt8q]u`1#6W4\;X$HM#iځdPEFM;T"?՝>{ϝ"&bZ.nԑO9rh)ݽgOڽJpf/#%vX.CF,fgw= ŏ|2 <ܰsY]LԨ]TYMD~ @7vOnS,ЯtAC:=}DYmO`uͨ*+ٔ?QE!iSK(K=4bQsTfk,߼`2|#9m:(d~I 6Q3jCQ AB+ce ?) !5(~{in#m5ˈ^ G6쳗-/qC}~M1H';eCg|uK=޻lm]#< yRDݖf&*]1x앆ayz XIJ<?=Nm):]vgxV-?#Q*~|h b/%G+`F]Pw,?M]fwqKą}(zLsvحOy -B8 ,fjE3)abį0"ӍKdqp!8T !;GǺ⺬?~gfơOEo2k^A"'+b J;@a x?C @J8)]4a5(YdCYS+o\Kn]Y~1rC);יrK SbGg MDs}T5?-g1y% 43 Dȃr> fSZ5 4nj#H16+dߴg-@Da)nVz ~ S{do`'h*~(<6Eɶ: 2X^3^@q"G!u';*g|N@ o}i1{* =S⹩4P\kMc)gl 2J SC<>V 2OGǾV/RVwX&uM;KJ?IJnw{oE!w}k{Ȫ?K*d|\*$emW3̕lzgG`ݏ`ZpZ2UKiL28b,o(ɤΥW๝zRz[sA̻N~&@@d3a3B MT=XrL~b*H~0W-ٍ uwN[}qs5`⽤3 !*= VN,Oyt~X!VkofR7MoOt6si3I[ \tA->}.QvGX"B^d'L~/q晔``#qUk]զpOɅyx}a}="ںL8_cwsͤUB!ʓM;1r 5(A>mdNZCa-nrA7uFvVWV9t?UTE`> 5 EAtI\Jf]laAiya;Pu.n'H3ڠ+w3Lc3YlI] T+Ù)ߥIO=MB..)&c0{L}) ?[ﱐXb "B;S p# (Z u١}'AHC[?tJ7pX`RB;Z4EEJF  NQK#R{)i$h@(pҩe~=n8_ilH|9VA) 'q[mڷvCh9 TrNdLjh؈a Cd31;$Iz9ۏ6IȠҫ0ي(UnpbKeCZCy=Ԏzb_yDXMߢ1w=E )3[7!k|ӥh/-zސ f;Ơ҉ic.zĵO`N7 &7f[.k]z0oXo U~]G5 P/mzC8rI?<'#N+5D$DV_su];R "vGQ"2_~;TBȨ>zbRM3|"HhHO%iYM&!IڙlD$QQuK7?wAep:3 J{M=54d6WM^x'U 70SH;{C@b~Olw?č>%#\KE8JH{XM$q;WCDNdomIa3Wڒ6܎iFn12hk,mg n)t"w9bCH VK|H:gCz4nۀȣ~/H60&ϩo(JojQmY!MX${Ǎ4u4Sc4#7E5r*F.O i:℗K~bd$뽜 &0B0}N 藨%cO_ N՞Pu3T/zuT!Yc0V{HT%Kn Ι/ua;!'>l?`b[!&o_88zAΥzt914t|M#MMdͨD+Mu8IzܙnY#Zδ58 MgG;C'e#M0|w< Bk \8l+ҡi蝛?Fjӷ#G8sٴh$t{OyCmJ>Fj~,m?j.^y}cބVWRKvyJ~'G.}KFHH6 E:7Dm7ﳕ2j"Rg|DWƿpFZ0 m_D탫%N(.c;pdA_*ڜ/foɑ6pqyڂjRDGS5+λ4Es6!"&#$;рIwG* od[]|WLhK5 LfI!-Lrd]+#t l_m tWnhX!r.S#eNQ9a*+Pigp&<6^ekNWBXF2jB7\ 3a;&OðMU*b2*q6 BMΓ‰ !0B7e춂\i ӸSY2|n@u܆g#NM$umUV n '-UZ}}٪K5spE!{ u!m;U@tG˂𢸝UEHYw$pϷp^"zGі2AnWH&>Ԡ"F3e-ϊ6 ǑL }sGUK ] V%LB,wi:Yv}ilZI_uji`bFŒk`09[B7UX8Qׁ*<ԭ,ѱ.8t\l9b]BMrm-#YM^V]1vy]}"?d=0eDl4wOy'|# qbϘ6:`Ku8gih`m=, {L0z72]Pu#_әT砫`3$I@j/V ģBۂTi?b39g Y T0vMm{&߼]+Wuw1 LƐ1SCZ{E٤Sp!2UV2]gkZ e.] 48A ݩ%e+V…Ը( ŁECY \ҰZ/ӻO6DG֍h[ [5^m,vhSD{#6s (@UZgXPb`KRy tdnw]^S)^6J3@KO=A"FjW>C,EG˹%)AZ< 6BP^)Y23LtSBgy" J2 7.]s-б'%mѤC ں5@#%O̿ukYy᱊p@:L$ɕ0)bO(fĂ`.0|Ѷ&)JZI}𴀪2 68 /H P ɲaojKF:iꥣ#Mv$Ɩn[pU>CYeB l? s7L蟶 (a3;dƈ[bRr &h xD 㙴!j1t6zAѣgInnXJc eepGG$@ᛒ@[?+& ;Mi ~W{rjc A 2 G+=ڰhYI\-4Y&4y -. *g{V8ǀsC>!_NB@}&k?pPnGCA`h]q^ױӽSkۡTD;CءnVᯪ ߊZTTOv}NX7*m|>w,.qKUQ}C)K{N;A z/'u--Hyr X51Χ3gEe9$"akok: +gpm)0&$zf;x2P&q3('9.kyFbޗf&vɂM &oq!N!WD4e>7-EALFz^b-,hW-iڔ[k5MBOTNiK 1j1$9("; > 1a^$Q 2 |@[ d }Pfn!% EG~ m%EdYMH΁H% C J/ゕ%y-'~.΃ Súa< VF+2R#Adm>>,(o&\h$jv sNdT\0#z1fud1bv܏m) 3Q =8ط:6Leq |W4?;iMdԙf9DN"^15OU.CSlU|tKyOM3s$Ph]{BXv1`rͼUPxbha+/a$j;8ˏZG F2qy4pw3ࣃ=e،ČӰL%RQ ѰMW5;@s[JTC*0*FAsz½d޼AX؄FGZm>Jü g֋s.㰡wVLh|T\HKEa56.k HHiG nq^^`kN-I@'_G:ORWčZ#g ŵ&\ˋ2Hd= d&v;J7K(k.C@a$yJ5?K9rYs9KLp[8g? JlX PxSz5$Jpk`-0(g{,\DrE}y(Q mbUAdv<$d4Xn^VI/PIz}r ~ՐET.AjxSTRjH7hf0Ƨ]cR] M!)[3 Źqo@+M0wLi`WbB@/*.PJNJPA(FRR~/{:h(u ” BB eeXqLeq'e,`=.KUep|YYBfWS^bhUd?KZڭ)rqxo2 [ IOc &iū0)TPu*+lvg!0[We%`<HWbPO# ` 9£BIOzytQFK1+%؄Fro$~Ht2)v<8d$YZmLmή(ҊªC/O^o*o&fTE 6, HYst4s51 JV"X&;9(UA $U .'#t=CJV*A5g 2 H \d}wc[˹7"МurpO]Z,=xm ,Y{cj:5%~LH?^o)ډˈܲ RX5exZAɐEx@-RUdF"u уZQTd\ޝNb{rݺ{DagP{KdOhTn>O s!?/osWbWDWH%蹱=w}E4Q聱Pg a:b7@_}`_bZ1 Bpt"A7"pcXJԌz3r0z^Q) WΆ]bN@r>6,tx3 j[Lۿ%{g˂.EѮɧ<)inuNd`#M#8  F󈫚L oXR'm8UV7EpwU7`sT,*(`z|vX:Cjߣ;}Gӧ̤ 4n&_~ K%ozg%"Ր+g"=Lmֳ> CE=|4'/+@Wj#ݳyv#,pb -͍:zceK:_2/;MK`3uϵqv{ J=Hӵon]\b붓7=׉m?wkѵ%յ=D֨k[0P [khh(QfhiX $HA=$sdUX={rg,q IEZ$C6BVsl@@lme9Bs[~ 4lA(fZ2J,.D>pEn`r507 c4J,d[LkV$ƬX.^:үWlʵ6 c~d&!WXG+- + N YWgF @C_Fn V*O3(I&D$V.+\ l/Xbnڎf{iwsOrVV@8r3]#V^ KՕ=:_$7_KZЗlH,! BB`/1I.w ?G6֭E(:nSY\5 !VC3rF{3B-93R*GsNO;CT]@c8[0m-wԡee6mі|D- RsúGqǙ"qUԖ0 =`'1BY +IKK'[_#-ڠU_J\ Gr;hqrq([ Eku~_j*G!bWi;c !JVY|z+{AF8 Er. ulWvzP\ܢ z"?wemR&-PP°idRа{X! ]}QNsOXoHyc۠K$R{nq2K`!Ey/A)S#>&r lKV`Vұ","羋n-"or>k2^O؀R0z!ht]zc|\mi.%Шg-P*q t}w4?r6GՅj&/_ۭκ*\yc8Pc!M'^3QG鰁/l.?*mk)0B!fA񂩥(>eԤQ; uvDJv9z=3nh4vnG>,D,+_#.nR)!v*[Ӂ(4GXHL4ǔ PkP~[r}w)p-05g[G# fxv>CElmY\7Evint;s>g< cv B逤3cz2IX0rOwN0_J6[uߐϊC_P T ĥE`T,((j!"Ϟ S=`we &<3 fά}{h2\K8Y ^g-߀\g>,#a)iWJ+Vx K.td,Lj̴<(4Yé!i*D*_hksՏ@VjnA(W(hU[߆.D'd^Hm'MC{ Hv](>,ixOT!˼ͮ>}AR/=bDfuMyG+b|CcD[$]Zq3G/y54 mw f,ۚ2d ڬǞ+h6>.{nDP! :+NB':{`);mE891(}{Fq*-w'="wM4~#aHK5SC*L*n ((j'mw{xX2{bJ}uM@G wߟڠJt!;I,U\r@ަi4rB#2@/X刬D]?B]og""=몃OJ6?{zl?H#NnzPm4_%wέ,dK=:_Fb@>a sylx~ha_8Aꌽ fOdu΂|T %RXd-I-ShúB'ߟt Qdhm(ud[hZyǣvt5 Fusw0Nò5H;y4>T#> S_?SKE6IM6 Q A#5+ӋLlg!wDGM@dq_KB}0kiUl_]*wsH| iI_SwߜPyF `)z} y !zsHH[hoCii#RB>@y(/L8ZBF$HTviIZ5%1˦ HM%v9'^aK% =dUy|z``B9=vDt.ep^\`qX2a$'YŻ6[P0o-!Yf`tCY;lF(F8|a=e jWUn)ohur훜dn6j{¦6[ܶ@Zʿ: Ym[,> G7kVw 'W {[9 - z'F-_¶|$:BH4u?AvrնбY3F8Ѭ_嶬qsdA?Ul8ZDE2q<Avf$$R##Q=J١ Ew&.QNfU6]fNc Ԗ梇~u2L.lϣ~x;t`IbOBn:ӂd˩ҫ:VJkJ̳j#a]4$_VPsVQqhC3\/%f>aP T5.-m;߆Kxڿ(vϡ ̵90daH?j60IWx|Le+`k@:|oDk#ZNMblcϷD!1cO9J|& 妠؂!:D'8ӆqW8#vLZ u%3rϐ@j灜QӜ]9#X}Hn6 > ׉9sN r]B~qO =޵3nt"sG"bu56ɁY[Wpf~]iC<ׇ̎nqKFԾd$Йl|i &.=#\3$f;>=~3B^W5>wɬz6W**j6&Ge4\g0$%o7̃fWIvmݫ^;(<vGmTuG_FCˆM [-:baIf0;5)ζ HVeg&;b;?bgF<<ׇ!9 !;$ m%\k3k 0?/ fZNvdQ򭘧 ĉ}ٝFo|hGv=[1}?_oO.Pњ(ZdD7^Gw? gsS{Z}MEۼïw(^4:HvЪ,NggUsۛ}n5GCNlCoPoW}& 3D {^C#bm"x, 7 P,#q+AUvȕ/"c8JLjcV<3n'`wf]U v`k:@H f -L9쇊zPGfL_#0şO J N+}[g@19ml{5.g?TS`:7zr%!yDJ N<+T ?v\SE:0ΛO h#q$sE 纀9IdG_`&wTm)^~P:⎧q`~w1KG5^וt}S@ӿ ;G͋ 7]?*~9gi6WRoY@A_hJ,3$N)3~i8ǔ5 gz%laɢoeUPBW@y.Gtpm:مFO@eGԚWE%e P乔;%MxB+Au7w;N+M]l,c5kěΫ\1K08`0ֶ1AT IF=DTJ[_?:B1#"Ŋ" ^,. 4`[ID5qZ;vm]WD T5Qx kXQMz6оV?>lڰ+1~VT}̰vjTyQljD`Zc-HxԗE6~yL3˺ZO/W[̪Kki>6 Q%la{RVugT*/9o[?:f 6Wv0,9@RAc2\bfIL0@66 \8QglzOEK[i˱Ehey(zۑ)5uX1o^e)]yEbi?> 7jU`oVUxvLFMiC+b Ah_.#?Ap?|92}Xd#dRʯUʡ쑌pC% g' v˜Wͮfޡ?˒ {tEGl&밎AhZ*BTI@Ͳr}L*DZ8:n%U4|/H`w28 k m@ w1\x;BqOHb}ҼL*DA#A[5aT^ ' l2}--1]\b!p!2l(lT>sNfIfmL2gG,80Q; 7LYBļht2;UZqŸ\Z蜧s>W>%bPcm7J1Ы(#dF8nPEtu! >2HXE,b}E9`;RlN 8G) ΃e:y8Pآ'P-6?VɦU%#.;P.A\!4 ("(Bׂ|&3Z}`i(-isxې˛V,a>Wƍa ?J:uTje1!1g#NEB^'gǁAw6(@;s+ $}3 (U=SMgP]N̠}ޠ_wlO9g-mjGź(M3-ݔW"m%#4cH](%&8>%ּe*-طb yb kN̍$;!eꓠq`wD B&• wm&Rj`&>.t@#u:XnRL(ָ(6`"̻[Faaq[mo!pX*)́XgI,=xp=$0`lX-5<`st2Ep!k赺*jӯjq~/Ig' Q8 ,6 -(;mh^e뼀'%$_\j 8xߘq?9Mn݌:<*IOj 5zHS.'u^>7δPFndL!DgE)A'-=&͊%DW%oCM xr83;t}2oh6εƀ-} ev^N+Q}`u|ob#"GdSR-`z^i#&6Ԉ[:CBD<ƐCKuvWu#@Hl.ϓL"$C| T@zT_=4R MrܟDLp8L@금Ie %hgFz+ro.zY]1XYR01ĬpڃZP.,,$3}<-ȍK`6RCL~#a>4-5.T.j6`F:gl$9G65TZ *".puS d6#QYםΜYq >wNm F {ϥF7M,U*dЃZ\[i<~G5|}rwߋqsOMsWLЮ>n,?ۆ2]r1=bƿ ,4FnAjF(y֓eѽm8fJ QTR; lH, a@R}ѡ #L{O4.I"** CWm@Ëv>sQhY]ODz_䗝Yna o9`=yg{pzS|(]P xh~? 3b"q8x4XL  D3S3JiX~=)Ś]s`-񌟄L =ts8o[ iNSjɨitpwg0n4<Fm uXhS21G#ҬsZj+`%^y9yd#L~Yk3UprCiVtOVZy5R݉rIr |J ~SxD4mm^ZmHA8%cA\ADqzlFGdŋcSP*|[crtw}OIP:%g:q߹A7e'WƏV:3,bmʔNWVK eV]`"Z%.O]Xo/Y.P^߳t~{HuY)5Kۭ X|D_R_]^.)ZGi˗ć'^;.9L*Pe 'h XN."]̀;֕2MnѤٽ'}XfL+,jK6B+L_.L]Z SҜUk^mMH} ]qT Ξç|!$|wwE}皭0y E#O0:&lF)?-@/}/e@ZZ|߽eoH 5KUSk/Y;*]P>.[n+Z5C5vYlغoF {…ĭ]חp ևi;}ų"F]vZMf_%fyuAoSR{/^ɼ.\}^껣%PHl}m'֍XMR5T%kVPZ'ٍDbT* vA]52(fynz7"q9϶)wd΢G5ak[(5%Pv}me)R#^kʕ.Yk|z?{dH~;5u醳E6`,us3p|k6XK.YPU\P*A 67kSۡ{}s+=A(\z$@Meݡ)'dԦ\e&ȻU ܽݡnw!ȻnmڄcKR'hj{H&75 V mJvizO<'V@N'ݯBNyC^ӡ=m3|%h)Fޑj@~"KysoU#]F6|{20;Jݢ^}2_VXǵ!g= U\ vuaѕqPvxqAM;Vmg7(JK%e+A_fVEBq upd/.L\C, UZj QZt6Gc-*Sˎr]+^@#n|.IAՔqmlflނU34PZS{7ڃ=n]zK&ߐ(Rj~_zwJϷܡea/ZqZ]6]^udDaه-o6 jn$i0ϣ NhX3sN Ǫ^//'ܯdYXLR;|Ax3r˨}̔Ym~etX$ \%25_ }e'6Iܚ"J0P5 S uK~֐5=\VdLD=~61%*xDjIfVfhyʠӳ)O d7eïO?^.ABLc61UٷmT0!M'*%JJ8/^9>=="K0굛 0}p?9,Ţ2yp xVh_ی(+:YZkREL>2uYGv<g٠|~oyܖU8rWq"X7u2*wK<蕱!"l/B#>vX(I(=Ak)`B3i`n WxljaH"Zq(W/.9狙 qb $ (rXTIg$L`Z}^<IYn|>ܣ: $ OW9Aܘ:sj&+K2Mad:} =6_ݯ<fL@9\abE0Qn+k p V/n 4}ʳM* R!<Ģ#4bBi r<]~{[^@GX0b"OUfO)95xeD&_;~ *nAf &GeA L ZOķ?އ'Zą-4|baAycnIM[M|ٺp/m[z]NGXZ¿59~dV_)/2oC3yՒVؔiفPְ DԛX,ywR.ΗV_ CNr656[*au{>9yjTcq r%MR0pbY9Hڽ $gBƝ+.7o\_zs#тVxhA^\hp]r5Kxj/;j]$wE ]vd=1s> jC7LYg-W^bd'46x(9Ws֨ZGMvO(2;RD9r@TT*(VZccDy:K@(H(UE4Q#6|lrr&oBJ.fbo|#5YB\.ա, ]@qzh~Mao(J t6YE)v &J Р GF:_pGj/,Z+99dGNdPCG0ż gzqRuTyR]Js죚LyWȵ H@)I2n ?d*n>ĩhˁujPWrgOJɒ;kCiJD[J, #)XwzoF}h]./\dqֵZnYYV?[* Ҿ)Ǒb ۆ6.6ՑJrsбpwLG\Cb/T蛜Ez!,w'#TB%sP1Tх\N[ WKH[ŻwUyJbլk%"[L/Ũlҍ_Ć6ɍK,uST$"&a¹Y_`y2uR~{AyN7jq2= ͔$z` RdA]5nayrPśMCDG3&t2o"opʞF|1ֵq^4ʖ4BybxZř"l@#_yݠ%r-M`EK<% >Wv,陂xF 덺L$r)TT.sv[Q2 )F4hI)[.hC-c*29I>e & hgD2NC( ؈o;Y,{GaEnv G,U*5.R-C21 \8DŨ>kmB1H+e>;UMvDu,fzkYکs'76+`. `~Iv|Ƃ9^kR*o9Cd :S~23W;.bkQ bV OowX4O|҂]R{ԡ u0%4 4ayT\E]ՙ `QX?}[q,xnr|^A(&&Lb,:n5?+q\ K`U^';dVp@6!UHz] UnAݯT]42~=>UVy2heKш^Ah9XgJ;mŪbQ.eX eaV)ӈ4ulJX?GW㉰*at^ q &GE3;bp}4I=^~LT & 谴 G9EmEWR鐔fv"j2сB\hHa+gI/O\/Y&G1tcJ|z+Cr89F0)"m]ma]61btAKZU^[d dY 8Z4ȓ-h]:;?5LP<9v2rc䷵S" ?k# [་O:ʠdA!LJD'`4tFE׍t|U~QZDȃuyl$B)*!@?t0kd?޶69 \4]2i~FY_xR]椴+eu}df3K_lMCG4k 3Y RydNOH5٣QDDTEGS_&DnM6rN3A㾄4߈CnCпP=궸ZˤSϱLWtF_LDl-nvOC{-|o w>X[ިqݠKT0ƨs`W jlsx2=k칍cHL]=dX14I@[lc0iP kedЪIl7`];M +xÝӝ=#&4馛:sV#4ka%~ٰeft%98nu *U挽3 Gqb(Fg?YuFJ[V%/پInRB´FJSޥQJ=/i,?xQ5o7Dv/ x\X~YZ.Eы~5@d%^sP4ې/jvMhI}B.a'Ѭ;⋹zL%"5GigK1bb{NF-rx@wHC%*iu?z4ZRloLNM7b7E vRr?,I;,_!с+n_foO:dXYQً udu&@K\[cD]{u޴oW9jjuo\ Eq͓obܟV ,Lq kfl+߱qg+3'NMܦT!cVC;|tӾx6mKŅ R2L;]@NJJQcCm.p0B&z8mq?t[|.$nlSS~iSac `Yc!!m\u*ëSerw[ϵvGWs\kӗ a@ o,*J:r|4cNp#9@u1,C:V`ejRuy>ܥtVQZ7.į2GQ r ArZqoXعGiqwV~gn%j6NwۅB񂩜')CAM+.cp_^t1䱮n;P/s&?/SÀ_1'4nT6a; fW42~p2Z} rګja*٫K ޯM1BhJr5/Bz;Ha]/}]s}s}_CiX+0ӀPˮ`tr' alvyp)n?>6UNJ;lrH\ \uz\sm&W4@w%?j˞Q\$zϤN-"`T{90BحF[킺l  R_;F2!.v fAqoYJ?0GCy9Xd8Aϖ0ćNYvtމFn1:փyݰWaX;,h ^VZ4G/:]OO$}G\{{'+tSd%Tz_i7z45 0Am@݄+Lk0g(-QP*o[HMWAW;B%GȬ4g z0L$nk(C?VjmBA =: FKe\`~`I,[=<Ha%ǘ>Z\e:P+^@FJYA7}z!/yP4JP@#A? J- FBZ@:]~2FYL"zUYTfAfn-ψ "*8 2qփyjv_cTpSՙ׉Faz9:#))ѫ+1UNÍ8q떌,59[8ԔP,m6][4-j d )2/S#TVXXsQ2{ʪdCk3b~0.cMt"(>=i_R:WFODE<=}/؊لĉ"AU[a0&낹cPadeL궝r&C`)4``_GYFD 0w+(r(Av%oKS+x!'LFe<vː;  a+ėbZNGUZf(DMp)"uH`tNmAD*mj`4 ˨2 | 6]-{wT CԘ|GA=X-w\"ovsZ}\nS[9/ i{TR`d#=F>C_ea,HxnվLjD=6؆`<-}Sw>*7LLM0Ֆ|җ-# ·-CS t(}O'&\g5ǡ71w:`W)"A@˵Ʌޓ1/qIEtedI$Vj$Wl7Z1wa2oSHC^̕)g~7-vFpɘ!e7 7އTM;Q 4dЊp{綂DY &'f7uxeSg>QKŐ T]mC?L%G7V{ n FM_Iߜɇ5jI{!e|zH$|Ξ4-°Sg-ɞ߸:Lߟm|ĻK=y[gGNbf]RMH+B4oPP#׎0c7)+(XbǘDYe9 Ly{ofA~ Yw0)?^$y8e|'ZQijRˁ>(w!u?Q!X 30wPrP?Ucp'ʲWrֺ̤o$9 @rǷE/$9殼<x,̈́D$6w(<{QbR9ș+@>mvmc'0\IrB1,=s9{p3"*ϝMm*OFZHGZ U@sy?;""t,IK]1`~2wŸ*4Ԗ@H) 2PC 6_DH`0̘B،6+!`, h̪n$vllv(ڋNfeb&e $]j[i[E"m1Xl@;Nkxo&6?5ujH緍y"89#f2/u̬3cEq 'idg "4;$4K<4>Hiswf¯4@0\dtт$hXGxEll uXZJ%լB$uNtwa/iWg cLxn76]*+.]Xũ,p(eץH,x+&kpyAZ/N)[ ^emyrަoJ&_`Ej9E M? .q`2Z/mQM)hs*isD;P&!R͠|[k2fG,m1jtE}KX:3$e=#/7TQkm1ZD=8?"rX!Rķɭ) k΃˸ !w-ČOE^}'C]<קeeH䄹@c<['<5Y/2nwHY"݇ݥ/gXdQ0Wi8չ=AKpg3\kyƪ D=d6_1օ'ŅIS d2v1aj*7qMB7'r/,.'~bh#}|9(pjʵNR~ND;Ze-tյ΍Uo؋~\,c" PuYoJ D@{\[-q|%0V{ hr/?qY,h*M҆ ma Pʝ%‹&͐#8Ab9Y n Lf?Heb^ˑ $I25 z ,X=/XRƀwMq{≯ﲹ eOe٪Ū=J!BW|4PdN1ȹpDħíŌ%cx ^-]`J+Yd*fX%e B- :b]M6׍]`q,Z+ u.XJ):>SoYOdOwe>on%K$vh:5|ujK|)K]P2C2-Jg s/mLYz c MĄ^|yuճ{2 b#Ė NڰAh0jD.WLEYor:du K8ٲ#^&#ωh3vawRN&QFpp0"NZd[۠iHU4]˳z, 4CTHe'‘Wv]@"N%a %aG(e2;,cfvd.x5p,*Stڳ5%@$pL01Y$XJI}B[5ҵLێA9ȹ׋_=К]-E _WQYlpydATXotYǀ'\Kp8l01R-ZFށzrr 0CP @V̪R=6c WDK|Γ;{^ ܅i< LҢ]Y6n@ ̗g<=ac^y(`CޛpY_ml a/ُ0a5* ?Q.Hɐ(}dY 4"S4-HX;61rg's\\>%,_H$|9]*DɆ('2UԬO*Yj}Ж)FݼLNcV@0>[P[Pwͫ&oL0_%Rhkw>yV"V$?{Zh#[g@$x!4e4M!sM$iYHTq3_U"*Դ3+朞9jU.ƮV4y?ue, !`xD,y X~WE[Kh/ n@$ܫśvIc;l)yMK~Z^#x },W?+Ҡ^ODu( ŽxrJi|pB-$k~bCeܑ~^V68L!>J(ijˑ-9girC\Q2r)MA[5:Gf`u8]?V]^Ɏ-ٷp) r"[w1@J!A VH M̙m藽JmZms[ʆdf@}m1K7y '&5I̤XHZU_ipn:8gN=obdMXu)Vts9{K'x[ ߐr#BUi+Jh jZtV̊eZPN: i |.rYU] j0%bBd~4vf z ޡ?dzo"FuE<5  * hJGq&M*5mwcϋdߚIv{:<y)Hv鷋Y&_f{|'(IŸoN( I׳gRU@nߍiߨa$H{fM+Bl3Kh.|S؝&j I>1dyN jU49j| G:Ohx8VGw[ fnee *+w q1FEd$JbY}6aﯻAdAC9Zt Q`vFdXҧKyRYv݌ $ 4'†}V7 #蚈;leʍ|`HȌ7@Z {Ω-('4tDrX /[}b?[`6` WacHweD8@v ޽iFّGFp=5AA?w~B]]Çmi]}Gx7vZI+*ު*ׁ=I~Vv>}TGRGJjuzF+5rߖ!~6iN3Fk 8:o8}~ףb}KklⱭMwu3"sy֡s,AQv[-Mgޫvj@}hwGUk-y'٭~΄=J\7F::v&?vߛXEbj(<,)'3 C䧫GVn5Hz瀉N+a%MעGe m۹+. 銹d"|e%H-A"×A+\J>e?oMIeȦ ˜F*R8Ä#Cyō <^y'K wunf\yd,me/bB"L :9Dq:R 6T:4">RAFiq3zD{F&-{hdKNte& f$y*7bƇGWґA`dD`* :qac'biʆj1ʩ%?jaOGԈ#&!Ys *HHa%pбGG^2zi*ylDXIkJSd+ ~`+r:IhN> ^-Z_XcMN.$6"y @}H"ftuk-1N2 (kK|~BD0-1B Dd{Yrn+I]R_Exn111idpG]ZiWn8mm\EMqw;^KG6;hԞ =>/-9֝9 1"ʯSl $9VB%k)ӓXp'Lv!iۃ`t*%uuU z2 8g3>WyYWaU_j]bZ%W@5Ӝ[+$}N05y~ES̄dm gǟK= ñ-5 ] J;| N} ''8tjV+b37u=Ky%[nT6l A:Nq*{CUU_7`U캮-!49J:<ԗ$y"cb^t1 <H%><~tMK>.۱|),Rz8 MN68j_dgG &&`Ǯx 31NTlҠg8JǢRlNZߌ aЋNMocHt YU RT6Gӝsm.M嚜`g84jս {P^Ɗ(i 9*'5 6=?\0 @L_3+AԖ=~ۈ={ $] +e 9hZqT!^ A(2\!VVnpYtGȜ%i8Ո@gNxt78nt.y{c=aMlTpt*tSg:3]?S f ԕ=T@RdW'9de%pH8w54O KJNŚ*F6/ gaC"f{jdXbҤVX */l Ƞ 3 /6 "[IfEK>sY6%֭_zgioYW=Sϊ~y8=qDc_Ni"(Č3EIZӮ^`Pg`3l-\!./n]E[];JbC4zy.+_ⵎk'IKd]S}| &+և![h(N4CMhu91j#L$wq~Smރnfwl-x˰Xlz.g~0`G sNtiat8cg4epM{~ϾB^8=[tE ƤܫW+N~Qk(FÁI[O}O݆ߒc8,AkUN}nK*LAD!C83 m'Q)Ҭ[:>juIlD)+3 Q5Q|$݋ *}4WO(tZw^xlR>ae'MJh'l JVQv\ZP/m! /qZP2 Ba)^I1&nysBjXP|wMJw7kdP8B&/JLVת<8Ά))_fO.Fz塔Ck2+dn+w4)DFƹ&~QFLiƇ}(dXoCFOj.u1lQ)ؖ<|Z6t҃*jdfxUEv]bz|X%΍-`rs@/݄fZ2V+x9˄{Jd?}V^~_F[_x5 Y8IQ΋9qƙgŻqbd~]'ǖb C ނ3V9"ecZ+KpE!)&ω"#Dq8`=˺:9̺bZ92`DǢK.K#Z1O cetT_;)O򌩊ipGd[lvV~x%U#9{d|!(> h wq+H=ӲB^2q]a:aU2lR \3/9$ɪ()e-1 1J/x4ֲԘ$z'VQÙ&W~8zeY()F%'.0$7}UoØ7.LI"{a}HhV<$-y& .^xX2"@=]R)V,X!n7~(޽JTeOpd9Ls7i&y!`}c$M4{w7pXRkIXB՞>kEfcthkZyk!q]zEv8bo yKUyN"['F:+ L.9*_ubOU:;YBT(@>Z?χN]wG4uH}ʖOU[8 qRM_:W׾ùwFvHYӿ`Y쀂 ̢}Z["T;F,tGZ[r[$"]7=zK-oDB..a% ɯu7-5  }V5,u([I._g|=/F@wrAH{hu!K虷bm']ZI4beIh 6@1C&0ڨ@R䌺2"6U5!1$xWTT/@T-X=CY0{1Mn-5{ ׿{NDlv\&1-Ĵw4XvFy X{l$޺07@Đw:;GY y#G`PHZb| J JfG?AzWOG0XcZO? #\0;%];LGL|U F[cr*xdT13޻q[DA)4a{pIzBoK;JܧsG --CSo\P(|K L-FV ("NZx#qdҶQU9R]7Ly px<k\r8LƐ{"e,åmZh9$0S?\q!+9A+&4`4ً 1|J4RWW奷ܑ>on f__ )@-˾1X:b~@E}u;ϕh[^gG5eM{˦kfBfDOM-V[VO'΄|aYTPo~q[ % hVM&>922mֶeRh7nLt2M54A:BX%VuCU ,& kDp (-Fyt3oL,Oj(1HCU Qf [[l;~.(f L~;l=$j:#0nh+yg(b0"u] bРF,'Ke 2d}Ș>?xbh '!j߃-! Sw?4vɱ.{T 8@/ߌ?4ƚ 3w^ag'Nl!7E3n_KC<_'3NwSj)PV^ލ@AΕFeuYS$2d.N;_l2N0MOebwpg` Nk˖;tBꊇʢ_TrVΞ4챩eQp̲6RPtBVs''>V$^L'yZ4w#y0gԢ;$κLds Fkb-4K U(/BXfAeh,KFO0f+nK&2l޷LEnj6x_~aDf,#5p:am:]Df'֔ !iŗ|DŽ@ŕ8Xf=w #pgMb%Z@|Wyta >ȓ!SL/V?O1O R|̘/&edF!1y|H2^8_y("OF]%dڿh:H 0TdqͩDrˤ'3'!J}!sM,叆<0OtEzyѼvP镀d~Ԣnc9 c_gqݪy*V_X@go6iN;tO -azȯK'2/~fhI|~N䩮=MGӑdǛɈgs xU,>;1\}z-NuՀU5_pɠk nl9R$4&>5X=rmlrSm%O|q-cl is3PWfK06M{t (QWdFYFXp;{.dau;&L=Y sDSuGȧ!fL !*u&]#i~r l$JestDɱX8S -?1S[3RlX^7 u-%տ/}3gۭ| P"_MD$rAyu;NQGN78Ce)p^Le}Ô }+OLʍ6PfeO.*k30Nڲl۝QP:+ -S >ѫV">s6\Mp;A+3l~b#X)KsTdb^LwnPcpοgײ V?ϙ #O?LPљy7tS*'8 V2[o\="md) @ǻC|P"tD"H_vH:djAC},a4.y ұ|;Kar%МʏInC e T[I{`p617IUsD3*CȌm-E|R%N&v+C OC!pvIҵ.Rػ Dqk'9cI[5sVM[c+/[zbYtkp|G\ *rc;VgVpE0)֖\ +erS|IaO Q2MĬԶc͓W+靍/~uʎ JluִZvœh60l¨y<sG"/14+i\B׭"^Hev{\WŽrR4%YK3wRcW`)ڐN/I<&`!\Bc,uLޤ,fX=</g5,.ھhVMBu'.ȠlZ}Gx7vꗡcfk;Rk0[1"EǷMLѹe-ckq$q &R|Չ;.~cЃ|DW^.oq]:4,!\߄ul{{ֱڨ،j5[#oV@֪~G}~I F1P$o$U3io ffVkwTaiuF(lkΛqKgI"IMߺ]]WBSF3`ٴld{=K/tCC:kҥ޽a4md>NiفIX>itg]v.܀FVU,Y9?&#/uli:JK7=>k%lU5@WɐY  ѤIG%G x/{ӛsKyQDU۪Dڀo, 3Kt¼c((RN,V/cQsTpT%T6'A1;G=u1BA -k4nZhIG}T4J-J1ޫ@+zg)DZerOѭZHK5uDq=~݄e(HXQ!e/F9\ ֫\$K˨PRM`43W:ħ[VB7W٭I%XJ= [^ӥjPRpY/] \m {N&>jW;)'\y.U#I`_uy ߩE4gFkl>` @?zO}Ud. O|]O9HTUtq#>=5J-8)RtjHD℣&)_dK bݝA!p0O MTU&74:.U 誜淋*ZPMD,lO@@!d5A櫳i]7 .lAN1w"baA[fB4n0㠻治p;)yΟiPe۾wL{;y6HQݓ7Oc8:ww$MRkF1 8ITpnL/ 3:: lm+TVvE5j"k)X0>`t:6c [R];Xk{KwԢQ.Mln{ݴFZϊ.$.z.v.(NBl#py ltS~.ԍ -SRh5NE bF@k+QB *1<ςJNf+RiDHpnxpݥBM!p?hE" IV..#λ}wXu~D'*aG\st.']-^/H5Wt _J|F݈eclݭ13T"uM&tL w Y4Fd]t:~ *]2B'3Jfk|X0r6P$Rt-籿*2|Z}6} os)ՅΠY#i=b9dL}h FJD7|J) 5B"J7.,PT77ǔ֘;」]\I #&s^a$=u/A{6Tf wiI9r'< Ng- l^ MJNzխ<^wF22rA؎=FJiϺf4MvzP>WAR$?(wh{fJ X_}|X^#I9N^|1j}O #a fӝSnNn^nxJc[ca!%^0[Y|XF.w{oНd3rZ)|h=9j֔.~ʵFl Qۗ'O 5*ov 辥[7`/ie H8o *u~_F7`$JUkը ܭaɷ0yVIdeFK^{ !B  h`|GzAre3;VoX:Gq}! ;Ovnp 7vRT6<8W opz#ڎ쭵V1sRL=|]φ t6`#ۭN*+FpSV) \gcߍܲK(r6X~+˴ 1,BDM֛%ۍ[.G\KS,酜 ʼߗZKk*;diƐg9N:, !f?[8;sFX)I_H3,_co0g엱td5ɖ6-9p a}׳I/;4gZ?i>4ޡI2%>nh `OKz'BvK}( Ue#+x|T4޿yO4[b3{!¬=캚{S0㟘4kYH8c?<ێR7 GS8wsbgؚpPť7@;$yL w/UǤC0h)aLYmFho~# ÂEv@~?Sp~9,_~=L ,f/k}Z~@㔮a4[[H?;C;E=e ,'v1駂\o_qO]eF^蕩^;FGȕ/}v&l^_j3Кqv;sg}4nk/z8h]Zrs>.j?2SP{ᰉj:iBf3~Xwjt~[w:u{ͽNٳAk?v #G$'vMZ2H^_*/KR=|=lΎdAOWkP,|u*8X\DP4bwZx[Zxi +}H RH8;mŝ?[gƺEóIMPnQ 6 J&Aܧ<7մ[j< V(/'mb eLElC$%''%԰@P$kcV͝#Cy;;*Gz='TQ/|lsi&"uzB8g G_;$5]CC^R%!G9w =.&QXh~ chBH/=8׍&{ Z3ohda%є9a9n"!}K?ώ.iFa~0~3NY @W d2ƜW7_|+di.Zߖxo߯u^.+zk|ؔ၄VtH?&owwy|3*'OCF2%G'ek.) *w~ RI|^=oF>TC wOlHKf6e@/ ci.6L1{Dðo, #w wVl7a[ݷ g}t#MƟ]?ʇF} oSo8!2Rv2( Q]}ڿ;kc3ry_W5B{7)\w *b^@ ܋~h@C Xcq0Ȱ@+fIrv$qὬ{'M t,ƥxRצbҠ~F "ՊS4`񋎎!ʼ""β|x=ݾ9Ap~B%ɡD:b͡,D94ܜݽgկ:TaDgGY^RL7p"-6DB/G^$hSyIvapC GF7DpE)TT x1F&0|W+sK%KU~dCXZ_Lَ+ EQO) Xs$ ZRkV""_sZRQ.!TB cSC:< ^BO}{[)l]/_]-ʺH+}X<4hf?cHYϋysY'UoO"Y$DODbb $flWMF h`N8DkAᑳfRe5˄C<{H16{` f M |-(_w'GK!}ke |k*X3@V pN 6Zu}1J\ޠ%x8݊/L~><3/C}Q$K_~4d{A~o̗EP_>BQGl2o/yoO2?d{fG^#T>i/ QgfR]RaOK3O-p? ZdN欄K q.tEy\GmN}ZU@=\vjZuSl֎~6}~p-aX&cN =8ET=a1"7lu8"UJdhrDAOm%>HGY-f0 {"_\p̣ޑ\1c⇗PAґw?0]FOOU9BQlBEBbZ-%g Qퟕa9A74JDhbE 6ӸHiKq?G27gE;F8-۪hDVA>')!suQזq*,KyC;T0#H@TE/E q@^ tZGD,HJe%3;Չ&ױ ^.URبZNipc:W:lx<>on "Ȉa`hhJBubqB$yh\@3Za1)"ji0ҼgJYzU B$trt ݁35c91L.C7 B, p S^_KSaI=7A &KQ$/c#nK6G{3pٸ6.m j9CGSه/[ÏÍ'Jf(t.w$SS Z!٣zN oqcoNfG0)a+mH|(4 H&I+-Xe~L =J؎Z!~( FR wXZl #K$vf|jJ"Ag{Qn0c\m ;*9'd@a.L4f_ FmmB$%DDP:Yǽ˜>{`/)$ٓYAjhuwa*-sɑE/qE!D6۪yk!>\mBJ\"9lpfAc q-ڂêʀem)R0O {kK`}4nwhi/YVAc[W/#w"{p.;ɈLJD{,Z 0xWݡD[E]+E6hJ\g瓢~r$+8gZSԥJ׏IvíBbR*<b&1R+4~;vgKH:_Y-BN ˮdId-G6\aL8\ؚjN9h0¬Z0Q5 MΕbJʖd@"[(|?v{ $ fh\rgmf ӟ<;'H>r7Y wtT1\j+c_>#i)@$YYnFqU4oխ՞S,v[Y?'"Ezf5tL0@YҨ}F"v$#5C-%G$::t>jUG4- Qy:Iv8:%9-hwŸw)]wCrUg9|W{sw>k5.Z8@$|/ ~IߡAG^:vX|WFj6jJ07" ! !YD40|[B}?3] 5Ru6y[.0{xi%Y{ћg b:"U9!>y7&x5frL)4?9r 9N˺l\l IqS[y?ǧ8wrX`ɹ_""}!?_ !pNw,_ϲ8'l:ځșؠW]()`S">2 6]\.J!ucDķfQ=u8 諒>HqXTjk%O7LE,(V2ukps w`g+w}];/dr5'^{]nIPh]UP޺տa[ll"Kjq2fi`ײ5t 'hbsIIzR,voM)}U[+s5:\0jX:B4sABu.I $[ɧ:XYqR?"C?_׻Q Y)Z|DL_GL&Eu?-=ksM41P؂XYms^y\Z ɱ|K{IS`|j.[Ĉd`SBЬ|i&ʮBqlUY >w\SekKlAFsyo9U]Vbh>-=M <"8چ.ܨ_:[@?)^ΪǷq.ZUzZ!e9. ~uE?"A*^'QW#Ah)kpS֖ s"ۋ]٬ڊU#N4%e:bK~DƵ00X>\/'b1udbkr]>ԓtוirųppSa"RGG{ܢ Kgb_5=eJքzT@:0ma=ZxAT1Ʋ5+C!2o~U9r.;SR5*Λ;Ac>W#/Ze|{q fr3z8%(.zj];W%^U6IBzsAl R,4Us1CAR/'.lUCtA|/W!疲 <㧼i( 54RY(VVYj7N|~~ef|sQ&!V,)ԍ|Ad,HS8+x&(iFF^)h?s|`ɕBy4#h2}){KvuS|L-#Sǘ?NalAF!tEW142Z-EeSUh}^J;҂Kgd@D( iw-9vL؛Wl;9,ΥK{Է[NMR!2PwMoK7XbqӽW?e:hdD + 9s^6E%1=6nMN42NK-6j%wxlx0avԕ6G]JKQ."Wd,QRt䛛aE?_[wgp*#s^oCܜ1|Rz@XE@Ig ,DUnC/\kiƖj/c? ^=.eH:Ec<Ӵ, Ex#cuy\ ?~wN䜚|NїD4<"O:͠e\V6H2oAjr{%{=/v u.KhΝ5I,)m'[@͓ iG+DGqߍ)IG#yGL on7E]X;ƒSWU1\P}Z&ͪi7EIͤ"CK24N$Hk$EM+ޘ&-ˍ*,-BD@{78k.k3X*A?Qj>< /Bwmd! b 8HXL;Y4AJ$`;b1A,Ѡ0,1\ڌ6KdGqL? Kx`#'>xa- Lꀭv=7qEC m%DQEc o7itUGC m ,+)3p_/}Gӑo_-/47VEm~N%0C6'mpWGdn<7@R (Wwaƅ @nXc%#˘7_{bLڮDDuJg^!Yl|,5>"U}.z+}q3+'٘U6wq]y1# E؉;Y;Y)=6%;u@Rb*Yݪ>kiX3pk̀6$ x&[xs_1!vsD eƸVAϤ $#+ЩX4ɨ:/H-YBY$iXTЄ"MЙ|o9fvzfodsB3Xl+R~,lg >[.M 9{VbG#kՃ3lb!=P`_-C:,Iq\ $ fDž%{8*§vAAtts&3D/(-<;0PBWW#zf+\(.yX)`8q\^ S'UxA! <՞7V3tK7[Dd-(}ag=K6 @#e=/aItp]M=E}2xT7h!C;`^y-[:iNǧaeHv[ q(϶o T69 Q *`3H6#[]$:I]7!BL_4sղIpa\%O. WP`fF3>oK52Isf]f'쑮ƙҥڕ\At h>fϘ5|4 6xEbG\ :!n|SY@4rE{Aoz:_sGkԷ͏R˽#U+hk{O^P)I1Zcgׁ]ԣs..`C$Dֱ2>ܣ:BU4E"K)\]5RS[Imn{(+h+: Y1mfv~(1a &s6űes2Yy#1cUf:F#o}tpd"'y1/L#C㞴I1AxW vۜeQI'CIZ̈́RDP4Di 2d6KҁM?>ZK*i?ܥ,0H͛R<-_].S تd.wak EWm}<ѫc(~= ř/®)/rxsGZ3po3Zl;:ϠV b"T75yP,pA@`\(S;\4 Xl _~ Nu rn(w扱f0z`jZ.3G$˓.R1"E2E p:;Rǃ8++>J9(_SZU:E);Ԧ5q3Df I B{TG"%ז_f) C~&(rUGre*{$*_ @_Er腛'p}{u,.c:J)RIk*NI 'C9nLY"/X{煾{-1*,: {z0Z[밓ϡِڮAհYqG1 /&pzHRObGŸ *軈=wn>Pe`iDv_3Hd0`Ph6;'Y2B8] ^񖪠վ}Tܸ2P³ `Pkh5Kht¡WgIb|OEX{K?, LtcN`˖Rh=RS7^zzOB,ZEk^Y禴l"j}۶M607*1?<;!-mx}3?D҃Ⱥn vv LZ eP}-BZΕJmC2B~4gZ؜ܭU3?C3]liϲKz!OKhl;"MjG|L&eOOf K+=8T>V<ײaMMGΣv ^Z8FPmKY;9R1=t7SO+WjߪRQ7&~8x}fNT:̓?s D&ώ~ۀSlӜOu^̃q⡇ q3߿Imrw;5r- Od< N&KϔF}{rcy9?5u{ѾVu;M.[ mWEYgiJؐϯf4eHo̮9ӧҽ9PP?8%i@etZBڏˎ ;iTQ)]hUPu MdS6mtfnmJ j;ܼPIyr/Ai`] xwi9ʰ*٪-9Q̙/=iz6[xr&uoo)ݔ ώdӭВ]KK9-JmHڰ/-̷yf4-iʌ0~Mg?֗ J6ԧ*,)ڗJp[-u6їAvzOvRWyg/JJσPgmᶝ :{ ʎmJ>>P]\Tf!xߗf~"OӪ|=6[vMeςpK#\v\kig2()@p-O &鲵3Fbm|i7gM>?N/52=&݅fPT:Tuw_7yƝϾMehQs3 WkatF]U/T{nZ7 I.'ɓ״jCl k'h2  f囟2Nٶ/Ufa H=A<~ogU['#< ʮɟz'/@< s6PڠZ.}%_p|U?}X/qЇ?9<}/42GOCf%Пgnmtp#xӉ/d>y mt JcJ)Rƫ#nR6i'i(-B@s>չ I"'Oz%XO@BT֭UOBII6isSQ +]?/ 1~.hS?[8ڰ\{t[ J-+rHT#`i@`4(`ٲOmdpVnQn5+NAK@"=f}vpW=I|y+"=y%Z^ W_bٿJWy~.3_8j-ރ |N?Kn%y ϲr0&S]_'8HfG#Ǐ^0!I+ӯ324DP1=݈!5h83Ӛ9>`mtΌjWE&4`0)ڡw0tu!l )Ÿ:chU̓cDtE/[;hxȔ9n{F8rV*"Qt&ahM#@s3Vd 0ĭ;HHKB-ҢVLK0g,[utYKLp$}"L>[|:},$z`HzT='fVlS#rAMĒSL sI`(AY'^QsEQƎ!_\u 6=)6y)vjʭx{_[E7ykBVV$[J gy[I^Qӣ! ƋmF?x̭`PE8t.RGN%t%N5K:=ˣH"v;)} 5AU8ouO|f$1݊` ͙v*B]e\!u\u;! *G4Lk\y"T ;KVZE eRƎ"C6׷2w,TJ2y=``s;@}e3|/&K r%­I#n+d.n=Hpw*" R>Ƣ={t[bWNܸc(TʙzFN-Oaτmur,MUCa%d苰4Z5 !^H@u1[ ϲB,$9UݧʋD&=&3Eg,HCe0 V! WwW,fWc;rɪ(Hqa`BnXo¬tb&^(|aFl'B؋W"&>niv-Yh!!Rp?:qޟ]:vmYrkF~ =j3FRl-9r+3 f"jzt}1֏9=1 ųnPP)B!"%ѭs)7| ?_eJ3ȺҀMoF<80C"G< n$Oo[ v~Ml|) f膶QZ5³Qɒ*z#7~Eҕ wrcASCo4O-/g7h%.:Ldǝ聴ЃU Xe_ j #W8;,c{ }"% ĿS1 4≺=;JH""cJ`,"v׫dSӗ@^GPlު-;ޖ)R)_;|Gt1IrB.Lgu33Ƥ"{Լ1 f)Ň"- ͊r1Md#xdۛAnMIC2L2[w\pzpV%=&0_7h3XÒ zH]2gޙ.E1u "}uA“Y&~tbE/Eƒָط6n :VGɖ҇CDž3p%ՙ9!xh ɲD^DB6R͟7+2ц E2h* C+D0WJ?bhJvODe)q hoM2f̉p BZ"}fK| N\QpiA^T-$Ahw3oa vp8(eY$Ճ )H":VJ|9i n9b @agV&`!XZHTXjE(̬ u^w !K4js<bfHLe1]ܵ)OFR+M!Y+$kF x|NRscys1>iVyAs4!SKֆm(.o!B]9QHӰE~ǒ=| %ESQ\` Υ)[M$v(f.e؋M"J׺ 0$H7yc>R,[ԭ\؅ԓMuiaCvs)NMT wp%ID0 oIw̙фLB T8Ђ$d!gK, (iF)Ï>cb1 F am̊-j&2! C'T(R0?}-ϨV0LKJp9Xm>}n#aV jW%XS^nԨ3c%lOnAe^=Fyռڄ@r@@lS`(X@vR(2MB38mU`B] z=,$#4\R Mլ~m7CY%T4QI Y| LBwIBCR-6OY554ðm-)~b=BB#?s+|KȔF# c%цG1>CޒY.46 TG՚O?`B0U;Y}VbP躚;GGD>lFgqJT& {4m'H [L ,>kx^V?iyh$[AMK'ňF۟B7MW8c&POͥ4e,oҽc7wJ0P #hBf|q7Nn#"a6X|i,?V(I[)rȤd֩%Cpe}>Dm9dEE/aA)ԡ>~wBb]_)_kRn&Vj՚tZ:ӟcUc{#LCsoM:-Vu 5sNOK U8zHW4 rODž~,nKǼ Z0ϼ.}m').w US穸/l${)h#^?l:hL E-vO9P reCZ  RdYwJ4Kk9?Ddeec̦#/Nj(4x JS f7m͢틮~S|}ڦfI #Lp@"[;>ypi9|uGl`(wlAUδF|tX߸=)0戣RPSɱhMxΏ3ʘfSFJ@,bH(4w Fg5"*X>q(w$z.ռCKDC80ExJU5&\ cD[{ֽr߯^&AȚ Q3H#XaR\=F"4v-җ.VrN\|ѱÂ$Q+:b&0I ZQM#^\(<;>zΌXDC5u!L=ʖ 5ƝaIa&ǗWigN֨睫,qߨcN \ ǯ:4( y[m0Ѥ{sM˜VBfF*\2M f)6j-ŪGa;\Yl} Z\o59[iKD[@jn␢79s&:mq5YOdd(2 )}GF[!%EwȯM)41aݶ\`l76,+q. .gZH[E|,kɖOM. ߢp+0Ďj m#iNj85]m.> AMUW7Fyu-_˰5Q"Z9|> ,4anP+j9 O)4}Ka gB||lla҂߆q+g )uEkLK2ckMh,nڢǠYJb%0Ji<-h9\rG"E& x7ij/F $WBT@D k'm'B񸻘JtʒH&9OtHuWWfQ/|r~AF%rI[3l%*Dvz51V 5RN!2dZYFB1c= M2d|ʹ08.c{Ǡ׮: C1-Y|8%]%j!<2Ro$UBPxsm8#یw}o7Da,HlUX,WZG|dqىtdK?y 7}V8+%f?l5%X{oƆ%ac}'!wJU$gMj]v'<yz1*֫ƛWqvkM}(`@}FX5Eɍl eBRݔ_=iys{>~͋<8`;^[I<jLÉҼgvvwPJAv,?> &J "Sd2ֻ$) [OE#8"qYԌ_n跡27Ahڤ`\p{w]lЙ1q 耟\hiN hPZh#2(q 1P[NhB !L $Agm;FY)ȢgVs%[lqT̈ԢKZNd[z` qvEFzJ %u\ .ؠ 'J w}g9t#!R$vyvNm-dBs/De JD81oѣͣyH+4fHH ȟ 6o~aŵmmɕ2(c;YXh':֒U#·ׂl۰ǀ:$i|u[ZpdrlpAwJP |(Rg6ŦzktsJGJ? }8䛥/3w’~U5%Cqy躖PZgյQݮ>9SNh o09]w>bLkp47gMʱZj:ZuHrhvTgUdW{#?Jvde ֠3gbsp|{!hcZ/aJdR%Ecߍ焉bbq[ Y)idP3%;;-Ll E(a*hξd=Cu,[usoOo0(Z˨@BUz6IdL{մVt Qn!8nê-9ll["`1?|ʋA>npLw'{n֜kSF+U5G x@ VEZԡZ@fɓA9# ;J]t̍^?X bVrUpM\XBVVúlJ!eYxKtӀҞ՘q -%oH[%VfΊ6Vj1h:w We!} ;:5B[BA^౰Fw?%C!~_V:o.۽N~~zy^Ʉ8];m%!{sE +A~k7k?9;c]l=Ŕ?MN5{M(׍`@;C.RM#[<\lj=!狇 ġ2b*쪟[[;yXdc^Pt M\ |]!C7KNbH͝0=6 bJ\w[O}VOWx@ Vd5XNt^ئG4%n\{KjQDo&~ ]r*v,rŲJSi|)6y_Wp;8$0?ϴ\Zu"3w]>V-aY!6x5́,7F=c/h_|XcxjHd5va'=C+(c]sB"/7N}gxIG@u^@: )am\|a$ۋ%R]UWrf 3Rn'%*^#Ib;DqU:7OvIqa x'kIkY/+C'{H.>6L''u-"N$m >@( RG6<!|,u_L!"%B]h_)<ӑ7n ZYyl B()|!tVȊ!q|اQ5X| )*RFG 3⥰ؑ(d햭삗VX8;$0BZ_КzpE!Uefu] D^%RQ% .!IUɰu+_t+'vKzǚApߌ"G٭Y)9PU_9ٓHbU!%+n .8-`F9{j((IfvΈ.t(#s-0aXOm^6V>5LCBv:PA lkm,^RHztnBmU62P7 }jSH㷊Rw0 q%-n;t`GU4l|C0iIr$brLga aV*A@BF hU'o*b1xobIB& OT t9, 6rv:+܁7FC]Z~c>PրAc"&2;э_N"ğ\F:¹}zQ˽|g y W!~S}s_frkn ך |¼+v^PWZ=J5b[W3Mk7nwUjʾrK-(ړwǾmRV wJ"ʲj/%>kA uR_VslM-nMHwen͇Ƞ?9ןUv_3T)ـjd~8h;Fl :*D76gk3!xdY_E;;]#p_ɑ\Z[.Gu>-/x*u6+UM,_wey+T@%4uHov_g}7-^CexU}=~Vߠ_-LQ|p 17δmޯ4]6MF1afi/Y'ZywB5.mW]QM4vNT_R$OP֣3` {Ւ~I)w тcj<{^A^2[ȋnuvbwM~ZnW_]AX"p6{Se뤦{B߫QBhIV0z 5BjѽNlUa>!WOo Xhۯ!gz:=Tl\>w:ȧ)j7~Tw-!TQ7-C۫ dVVҝ׿Uj R!gm;W0/kb^s#{[zz!0D C"MɥrEs^F\{#h/> $hv#\U7kƶmm??woc.Mt- Cy[b)/Ƌf)a'\^גO Ƥ+wj{Ek[{+h~}ίA+BUd&9GU-$}fC7ᆃuwuK21O]gޟ(t 7xKǫ%Oy#@*> \>KR&ݏRވiHC&O+꾕 ;I+  0̎Px4ch#3dlH$( f UDPyx 3+3*;* Ċ&`ǀ'1ܜ+W۹YyN$qM!d7B7ps1k ͬ X$UkMuu}ʆj`QI?U{1x+ ?o -޹_RL -N0]7#뭒Ö:;Zcgҕ.X")i5 r:P2`'hNkGJ0n\r>T<LMjjD+t Fxu4^!lG5^O#Ȑp351f[ lXO.,ىl M0+Lpd%c*".CzzgϋtL7` 0_BZcjiF`T#' N$,ɡ2e3Ҳ\i`0qkmH#;6`82t> +سhqfVwDt8V k$zEy z##/o@KS[@0,˴U6fkmA ܭ@bmVJ#,QAڰp򺷮"gKUZ^-t75ǭ_ٲ8ɱfj(ʮaǽCv:w%gQ::]+*70[;d1xۍr+'$!A{;qTQقc%bLk= ۳]p@0Tc/:x_<7X)%LVp F =M<pBICxs&^0IlIh6Ңv|\w_+/%NBݤ\ҴKMK$JV ]dWs +C2۾~zt;qҏ|fd(82:a{MaXNݍ}D} cé#N)ql̇nΧSIr`j1+T4աJ.WsO#,e v94{鮉Yy;RR3Ql'@68JJ>NO){_|;hB)NRW4D_އI+9q'KJ/H79 k!K <:Uz'c (s mhڎ4P*͑TϽ9}8'p<+FjW40>=)䜪؜K[!R8&#(Ni<Or4g좊?g;RĄUmc>ǔ4O,@\ W[p(?Wz de\rFOOLi~—٦÷%R({*Do(KHp&SEa7dl,ʞ1W~&+)7Th' |k&%"Mr}IBh gF?QC rw&c؆o7k@#A?9NJZE~BWB]J9ZHς:sV@_|' )HU\2PVgyq%ZIaBnR)IރÉ\.4q%ǹ^_^'tQe)\?-)-'?lEpa>'Xl}췓 *UIt6gPZً19*qάhQ;9TTГn0v=]|D=rNPgI#S)Em:6*:iuLLbZgL<})wzK#n#1 _jT:qTW5qg$Ob%'W:VZjɽJ<\OD&KdN [N_|ƄtoSmԇ4EjHhIe= B܆w5g-6Ni@7E(OiSĄߧo>5ibtxP0?*.4MHN࣢^~ܷt!ݞM~Qky#j יiu?.({K7~5z o3Ԗ yr )|UJӺl KS%z]OV/~+.8T;wnL~ʓmJnU&2yȨPq@c)X0'|.#|-rIMYNR9g|N0( t'9!(7 S˜&q!_ycx^'yl-1)a6 oD?ɍݷ6A#;VQٜ$pdj?BtQ߈@UD[SP=U+_PDMUqrYv-'1 TB!aY}֛Tv)+W~&8 d ?/!/r{|]Q׼cC^y5\w&#xH(PHUF6[Xړ75!jW-X\X+.ͽҽ0-4n ‘XǿcRܫv/lnk5I@hwEy;M_=}tӟQbZ(~,Ju4AnM-Vd Ӧs2#PZ?YHTOe(aЀ t:)rW$H&at^[ax,(XAnB@MZXGou / n f0ؤHXeiu$C $AyBa*Ar q=QŹAS9'bpHd&(g^Y)<^<>:Uu:)"'%`Z9Ĭd]I<sOvSS7FWw^}ĄL) ds= XcA`>:X=yf "}ԙ_oC[3sl6Y)[hztBo6 X] (_MP)fGHE4u>0+A3d2Cg.gM+d;@Bˌe(G P6wS\fNym13Y(mٴ4Ѯ%ֵ0Ǹ+, [, r}HTd|cHÃVyfǫ$ƈ$-wcvKjv}I'{o y_fZ= w" ~#tv`syH-9_Z{NvO=M88|G}2s;6dvvk֍ 0I>~ޠh]I:Y^w0>lbwF팚.gV1MTOE6ݣZ[Bm`ZTX*zi(vtm7toSʯ_L|&\;Cc[3YI&w^O%N(?OjڎS[̂*?2 u;< hl-1hVy8! +nJHF d\0ճjAHN68X781dqP;Ӡ P&q~{]/4翂 Dv^23 ) l254V*?9NS|P%C;]iφ 0DnhK/绠 >Yh˄D۵i(.<Ҏ:ZY4$@ EN GJ >cw> KˇB%KIJC\t'w7GuQǚH CHf;Q4k|u˿z1&`s^Uw_\Y坍%llw NL;` "af` ,H761P#ɹ;1! r?"ڌJc};BϤpQt6o[ jF|5YJ^XP9XY2=@t_$1|-}q 3"1&9X kL]btT,XzzOh}[2$*pцoM?נ]Rįi* ݪ\\Aە}pU [ά|U)Zl;+ha1F,>җ_$iG@Dg76eҀ> 턓K ՎYۀM[3c*cY TEbHeO۩f&O̖i;֟y𳊺%6~ٖs٦~e|=2L ZYNd&;ˣL"D]m-:l7VOH͘rѿ;J62 [nOo&U x%O1hxMgG#~7IXKVf+А}iY˼]֏p إa8 ZQ񊊫U-P)?gi̫LoF蓑JRNߑLɝcrn,H#kpoU֜2dLҘLZ][ p؍GL&腿(@hc>)6̺ȲU%wfRg6{){SE@ Fs7 ' %c$ѣ36 K |*!8tՋ/c8pgMrQ cb[,} ẁTBQW=򩲊3Q]3?R W̱` 4qD} (F]&LS!0 Hf gt o/EkڂXa4FOkZ1hg; w.h).V9kMB >bϜR2g|:6Z PkyG2'>72XQľˉ՜K_E)(0pRs$W# @&}q=l`"чU񾃡N̜N0h)ށe O~ .cAT*&[t,(G2J:J&d.?^8Nw@dD-شd]'9vC8IEdq։U /ul^д4FYf_"!J}h~e3:[tV nOtѩ\1A=9; rH֘%MM~fLѮPs}pT(#uSFe1=H>uKJ=λRA.Tyc[Za@}zB4\2֓12 Tc{ s'&PY:Ч= |ig)yi'p24/ڋv_B.eiYی].5 3#C\JAJ!ϔmY+:=W.qa-w5"n]QKiBQ3R1!<D h$.䦬n,TV47ٜ6Ҫ}G;MdڐJ&#,*}A7!~!z+ 1F[JMݖ}?̓Ivb$<= cG EDz)A&Pc* ".P0yoҩ Nw1c/;5.罔F;g>ABҰgzU:3MƠ}ԟ=-iSGLeڂtϭ " j W}S闁к9JIz?jt8tj7ۻFީqD>m"{a݄Vr.]o>FNMqwr[*Fx$fKD&ypJ~#ʗr}X6zбOh!P~y>qXebuYSPnp%[+Ԝ dZF INBF3ܷu N[8v3eq,A9ͷz:mc{?E,ܾNM逢YpD%9]H8ob܅S~}X.|Rp3۩ē&mńQnv ¬O1y 􁷖b}`^}uϤEo5تok(3CܟK:9ʣwoT,I;{툭AM9zm}!leQ4~(pӱ,g`ۭg@ Bo@3P_z7@;')CIun3:m͘ˆ;x>yIoC|JzJ|.{}amJ n;3[&K ?RԍzT1*-i"VUIXG^ըDqa`_Nk}vRɡϹB,]f k]TVd!5xĦ:1 uak5 ոD:XHuV ̞{o"R'.3!sNEm&VY M$eE\zZo{QdxѡxvAΆ D#,c a<W] 4n0FqST9* f< ##BUG(@DjǿrE_4[[;}NJ0kWAl^x4cxDQA;GRCp}(xRQ\o}NAկNvP+G++rH6!A>2jق|: }=襘Fx ؼI!VcVjECo>SU|x;we[]}~m;lm*Ӳ:Fa?$wimR}R&XF}jSl1؜Bñ3v6ԴHmXJV}3~~" O2?cD[ &.ɟn٩| js3N85JGpT֔+'QKT n7]MZATYc.p,;V2 b9(r@_cCC@FTK~3d;3.^4P:X }&I ڦa%N)UI〄IR|S*Hd ,!ĬTH=VXcB0qN VgX;`x[uzW.q$:1 MϽkusZӬ-x#)ЪfBXV4JtZ95[CZJ?&(T2uNDi 8 qG`}pV~^_p>t.z3hb"=4tK9!  ,kv(d@if"b3B+%Ԛg`"Sp$oݽwo"8#2 m+nz+a`҅փ{iP^k~|\[46ф+[qgqFJ O{KMի@õiX[pkwlbا ju EݢGd[i`#i~jv٭f*8'D(<_ڤkV`P`)G+\YlO;lѫ5$3{vCJhE}NxR”W4d-ʼn%4}tlG~[v#GX>!XymC0G:㥷$`*|_0,Lx'-#Ɯy;GGtX>i%w Sz,Sct:+M@)GZıkv͋l}O͝C_6ಘd1|&%>@>I ۩KR-F(`1/\V7bYyO {ü%@38㔿 _>BNde=9uNN_{Q{ߋ1i)6w "K-{[%lǿr1$eo7ǑteMQ썒O<6ձ8qB藲H8qp7yWkؑAS*:x;9t8_.1( ;:]";&ᅫ/~.qAЊs'M|ji>7Rb>&X,6)n LtFR΋69i;EBr%t093ts݋n[+/bГ$# EP#Oyr9)m%$ڲaWU7ÙwKҡ-FRΙ1s.|){ʸȠ<jaԀv 0`:<ɕ xlt@h  MMl X ܱF9;٦4!/ p vB @RE3H&*zpQO9hp}""qTtޗNOT 9@;Vg9+)b,3]fMEDn6qѦ+_QH*dJU fatt95e즕dLDIFbNSЌ| ͊ux cJI  ,8!8ՁJMim{Q`dVDHm@#V!aF !AȑMG3DS0$ƯyBY1L޵U$ ҽzr8wrtetU8_BT60, d ؆Eu-1 M{:Hd*Q3/XA+%)`#C'N5q<#/-FS=3`m j|?$etF,oIUGr;uNȕ }@(Ju? ɀFCJr1覘ٰ'h{LzTP7%. JذJ& ǘE X_j [(uR5AK ōxEES,B_%* {NRC Hk=M"c0g v%U $O*Zk9<>Ѥ}|o=R@8o@IM`nԞy, -)ALiRU69U$;ՏѢ؁cwti3a;R xp%,mx(1/H9R$?eB0PW iH$AE0SWR O(YGta 5㮡O-ѓ ZN 0$JĴQFa`~|HFCtmwM#{ŗ߻,,[ WqDSfGy |&)U8"y( <"zVfAF>bWBn=[2eTr&\BFjiS ;bEua'A,NbEP= lm<,6R|%OaУ1$I sSYsE좢Q f"'*ehDiLE7t.-3J/INXk}1 2n"K&kw qH-݀oR*)f{z2jqX`&{=@_rt &2n]Ļ"f[n Ѻi&1̼$Gv 9@?D~lTO EJ^r7ЀDyzlubHX 5Seҕ~]qtԄ}Cđ'MJpJ(+X}ڊm;bMv |8-$Uf0wI>s]R75csr7]xkNjI:nz mTr7SHWNv]esF,O=R%޳/%ʪ`(ۗpoȰ[8/1lOE4׍E# S

j#q;QHw2̭¢?>n18bmP7ڮ/mm*h(m?pNnj!F͹Җӣo@+S;+;p'<ijE8,t654WAqvo@绢ݕ2 VDgk\F\8g‹:-n)֟ AuO Ҏ66^fMEmCvLڡ(t96}d_m@}?)*yowsg@O;?v˓KM]#Ηzų*/-$)`W?*5-&I<ȫ~L| =^v 0/+;'4;`;cb!r^5+k,*$-'wx}3o?Mqg}|"A 4o&}a ۤ6#/g&A2?{52).~gIGTB6_!K0fu٫ܱ{WeuE&~" aXg SvoyUf.8?cIZ $Fv@0!ܨ~:"Lj#ۃY7* 7cH^?T誫Qr~wKsp +"#;Dg+*,b[s8 Sך(,?B}C8 S¯COxcʅ[sNC֩'y NnqWa ]LMYSxIL=9 NtoXY*}Il)&,g IJ^R0nف獦OOV5.,JJڂFD5!V*HjEX Tc2-`t%_=: '(ϒixg0F.85Х@L!tWMx.Øo dVL| J:,]{/l/*F9ƆQǸv;F'2"쥧F@W{*zjawәROc'.Gy*thL7ROO/pxWEqI RuG_Dt!\PLJcqkvrE'"desu`3XV2VbJN<%]G1;?^ xc8F߯4^hjY O|d cv4UvXC.DiWTn NO8P.>V?Â-Je^0 V͝LT]rZ*PO4or/;$qK(O@3]Qƚ|GuEEMxQEmD]S&ĽnlX́c7- ~D:KpR܅Wjk/MS`DLģ޳XCҋ@sҧWdje{Y%foBUVԠCZ0^߄5xV,"tGk:[t%pmv3~O;2Ql?:D6 Y`]3߲% cj}wP9h3عI.3>:F/̈́)2)hӄ[SXe7IZU5shTu"߉w,ӍwUCq80bf:&(pk('%|$L M5]Tۆ6~[㘣8U5WU0S!v {.|-Z~58X6k%_ҩ}Q'~8MR\w4Á8aqG'AȌj_L9a@B,+ϖ^3 ]Mbo᱾ULv>-\(Pmm_/6H+6N4HaʬY}O2砏i-bz5UiýlK.TTLhz~EpԨ + kB[ɎeʀS&;3BЁYLNৣ{4쨎yau3](%*5[uivan/_\E-Dg7[Mӹ(yo8 (G'(2v4Ư;T)gǹ'4ڍ įP^O%:,J/ojԄVEp[u$_‹̩&߲yS.ɞ3:O~Uyx=5=n?5/ؠ4tٞ sa |oG_2;0}䌦D DV:e7,u58?aP4U΃4Fcw/+ZJC4Fb2@DI` {۶m63(UeTQ)_LAޓcaP`"'ٍy n&OyOr2"<2}!;KR..DaB" l?J [=ѐj"i+y]sIYWs?9̞UfL.ʪV#gFCO/KN2hCܲl TXGe?@  "_PY%xl׶oQPgZcf+!ռlTGnwiof_fP@m~x_R7tm83wEw%9Y,ŊLQ:P8 r&#]2*4Z NM" -4A j}C8sRpVڤ$^ψُIe)Abpf n@E|/ypF0+ -nX^Y){0{ŮgHڣQK]҈3B^l3"hcLY΋K]Z 4yZr 'ޘB"im nHt9An@fkhpUf&ĭqNH$m5Bqk6ܩMgSZD qӬz⻍sf({%܃`޽S J}gNMrÉuR>&%Y_R\+;wagL_}!=n08BxqI]2} l*(wJ 7[G Q" ΢A@ƘS/l6ج1Avx-PqR2"b^Nv5+qmRQ^r0MUEhk ˙)kP\b,ÛCGLkԑv%D<ՒiS^k]:0c\~hl1¦Vڱ0mXoNobI4< IÌ` AG+qib035@TAԺlyFP~Q=l޺ pE[U3BfsE2g';F&%s;)['ePk$<ϴ^dɠqDk'tI}D(]!){J8_ֹh\H k[S㰆 3@p#4'f )"Usx.' H;+PJnv ?Ŵs6XЮiK ,'YIOԑ8+@BVS/' AcANH8,\k]xA@рm~vw:AF8Bo b;86(2'-n$(rXqD$|8ƹi_Nk}ȗ ˗2aO!Y:hTrOVKo pdxWt-$X|>>1 WMP"7a?]D=@5aUzc:"orkǶޫ o/|'`1rv)1%hs2R 9g}Wf ۛ`3}2zf,|_H27<5βc2,J2i(t1ύkq3Ǒ1ጲi8FcXS /sdqd`2k'ftn0 FKwI䵕c[1VXEyl+9}ijTj}0HIaKz)8DFr#x2&2xh!ѳoʜ#&}4pg3d7m/Wr _h(}kpN[ ){{E #{Q =U%y- < Cl#LD_۷"f0}Wz:bIz =~n}7Dj6J($$3ᮋx&:T _]o4+,)'%ҊW~w!QwƴYu-ĺv'',k1|kH0M,H8!<-u%eQs2N`uywimۚrlsu 5_#yt$R&*|xeFYP*;:sTd}zBQtԗݛd)66s8bkj5w7sHfWJ{Sg:t.A]Z04NO$x((`xeTcym絸D塁c(Xr0zX+@Lbbw OP^T׍!}FSs؁5rYުGH_I˯ BJĺw{c$\l[]A&"$G_"" {Dz*=Ƿ]%[c%c2,G;PD5R .gTv$ ê܄C}Xe_o+w8ՍͲ.7n7,2Ju$ϊ}a1MtkڗGZv-|ٗT*!'Qz tWӰХ-qc+mFfҠ=ygYp-Q~Q-yhL( 2E ]qdmNKhIᲝx) Ksػ&nl] >؛Mm(Ej y@{9ؕz>T`?"|  ՖEzU1wܭ#C1O/0%sqɣ?jjT|e ZJփ أ7siwX3hI6F&G-PLã>986֪sؓ4ôUb[ 7~iV([kԟk+M#nddܺU96dm?n  oA( H80(~ x|zs 1WΪypw42e)r=8߻եR!z -&Ů 2YRh?kD;tY9l,ʪڲkFOy<"^  Pmf")ؽ$o@E3Zϔ]rEIK22f(# ND]i ka3\)؏ LS:W"ҔagL,ˢ< %1UHy-yQ)(aC--:B!ְKK*to?&B)];r6"h5xP%BAkW!'||['Ç}&}8CeifxYRĊ9iޢs44Xu.H- 4Lʄ!*,qsK*t7i9v# jL|U r,H`L"%#LFܦ( G8cT &qyn"^z>ވ6qp!8s γW/sp]5woދR1#,k1P5G.1sKnzE4$i/Qyf4r$㡘#cjW;(Kv+Cđ!ݺfL!D'ɐ96z)S.iI~>7"IJ[e͸}JDDO~d.2٩}Tѝ \µr=![!B˚ͅ<3󿠴UbB#n߲Uj)GQfFIf=RVpgJڍ{ #~0%93ɥaU޲Sj ^g&-$t%5c ҔMjdޘj^prHxve S3p$J 1u !Ds5_Ub~{sO5BbA͏8`^2Mgo.Tu"1܂OGSi;\ 9dGcLcٜ!5f\el>/ ƭC'+wDHDEM\b]r@Ω 12Dә=y?tb_1|uAؔ {O^|eNbۥ neuAH0m?98ÉM]#Wt-82ma rф0,Ŗ ]n HƩ%~gm >:8?abޫդ4_V f Avf:mD~BBCqzsj)rӦ=ON`a͟;›D535@1C1 C$>70Y~s{șhS`g ,a5e^bX>8,!{/,Ŵ'&^'Z̄8GpնˢhO- LfVg l&h'@<\#UUhI-FZJfK˱@5>tT)Vt2U綤=~ ] -^\YkGs_ 1[L `'K$昉m1>LoN@*S }r~3YI:[2sҏ@0[bpvXf4bJaYR/ _Q_6 :$hG~_ZQCMOxjnApMU7d˽!A(]P9k.a/D{â.(2AM.AaIU`FxVmbi]?hz%a=0A_f?Aa0р .`9mI1{hp4c}SŇ7UPf),.] I}$HLN'P w"~(0'el9wmI P(_ ޢhtMۋiV$NU/r娃ef@u"`}ˣfe ;L(o͏79=)bw@i(3N h"$ë:5FTm WEc(ో2X7IBJ֡ C14%E'b XiaK͐6Ud.N:\H&%༊"6G4S:4e1!M,-O-&% p0h_ưfr{SicZx/lwaBk#N=]z^e}# pƕ5U11[[}a3E Ύ㬞Oƚ 9-Yv⪜jy겪.sfvB4)p:ZnM* kTŜO}?I2rnm؀UJxh(Mqznlnr`Ș v8 0Kg1=: nBo^U'zė4= 𩨌ܯ `B?l Z5 zjHܡ`İXjz[>ҩz&k:#d)zO_yYD~mt}RHHIXSr*fƿ8eض' kJ(Wu{v!v SZEX `[CG+?mH:v3"Q4Y&Ok-"%Juՙ#Ɛ'oڪ8a"}f~^#0Njt0gu+sM`5@vuֹ'ElH/W[a E a4Y֮a0&s/Mgq>F42]Y x\?W̙aA@) grHڟ7%_{KٍPzۊ._"H?-~gxg#w}d6>IwO݉˧oMj߱ 'ߵ/O`~/7Bl#,iޝ{$ʏtCo 7u3 |_k"qbK|-aKv  VxR \5e;ƦzԽ\xbx9 *ҪmPO]h<{C2&dYwu we}d:u5̷gпtt0.<_k?=zopD>M_nrߟI/`/"RwZob!IҔA|b')$Ri܌2zo遮I2%)M4 QěVЦC<^8ߪkX>33l8q8zCI|Ollmb7rūy$uR#v$%th<^ ac'+U0O4T~/B) #y=Z#n(MjeZ6|# 6/yݒ_ey$Ӿ~arv+- 2 S_ItUlw5]Η ϋLfeU]SSz'cj9c L?giO%\fbBB*f0oe螳مd{]I!:'I8B#@`ӈ3 r{e'eSS67$Vy8/,hb- Ҩ9Bd044h&4c5 Z~:5r Kd֣ȴV$恒w\,<ľ#!tV m/ɏ^"0 Тd Ӭ2Ӿa(4U$/Ek0` $-JhS.K%dZ+hEZ#L% JO3sq̐3DD8/soK?(l maӅ]/<± f V̛vLٓQu 1b: uEK1gshWsYszqz)s.,OJˍ=Ȓ7bpz Z6\8#9$;vt`QkqN2]O|S@k=yr8 \[Rp5dA2֠kzśpzKNWþiuv{3Apڢ0I*"^p![|[q3A}oq)]\hO/Qez4TY!3>&R/Dp†?uVZrqj+dInMzd`pA Sz:3*7lA 0}Cou} k0!;.#l~zl#x+Ow,_*&}5rD 5x/I<ޅ!Tz}OtLi901?to=w #p"2Z+}_KM7BSe@/oTkHw=V)IϏ.s@v﷏(nKI)>GC}&`eO0{%J*܅n=,L~Wj޹G7o*o B4?|ty(}47@%D@7fss`/ۺP3!V!t'_"=CtWe,`ޫ>c#૬ȐyFӕDXND?iOsH'ߕ ۄ,+33IqY~|$u/yިo S|8o Z_;J7 ]OO>4+TO O0MÛи?*1qICu5wN77csMRl.aO_Io|=uUwyha1I?\_g'x qCxuP!g?/`7ھ_ z#| y߰Kx(_E*6GUoj>tK;Q^Kj&=}<ʼn|Pz3 }/BְDP}G?CLʮ/P~ko`}uk[MD#BսI{x}^S03{-|o\SіhK7/< Y2_&J׳_CEIKHH?o{ b`0@՝gx. /")z#CЂY˿F .K {yY|$B}tLGˇuē'gv#|wq&C`V܆3jh8`YT*mdu3El7a%D A'7q$|N3lC={aBΐ<flOzG'" $SlkS+A!R+xDNj#ӆd 3δhSy\Yf2%ԝ25]2SsSh,G넿Ӈ{sŃ?;9gRW2'kwG _7L+8'w|I !`:@xKfN } qà'fO\lڣuZ'gפ&&SoF((%p}Ul$ 6)&D>[; zM^ N"V6sb9Ex4%W(l۶^ 4sZ[(Џ-?n xY Hx\A2I8 1׭EQ٦C9ϟu_śik5u eqdx8A4q΋_ aBz!ĸ:,e ee!oyf9aM2̾6Ma.Q0ahu65u_}abgvƤ'{f?`~bztMO{A :+kvq@8*ws1}}hL0$qڜN0VC ecPأSY6MO|NnqnD$9.s< c0@uc$4'0-B1qފs9H!M2^h͢GxCB;S<.yJ>g&EpYC"ICd.V[0zYd\j&K9euI#j]b_4= k>Ҷ^\'t`'DBtB\~,VM!zek ph*WFA(׽,<E [#Q0U7m|!a!P dy`}&\Y# r >4L 4j"cM뿽 O.Ĭ`r QAzV|,*Ȅ;-Zv/VPwiˋ!Ydp#,a>2Eq)\ȇu Bc$3%;zA8Ņc3W*E֔iȰ~|b7vK[Sˆ1 (2P WbXlg'7s=5ȼU[vquc#8mY+ìU4YWl[8}y@4t]]c3#P@6mx'fn^و~Qw[qaʥ.!f0̿LŬ#qRRO"p6:ċ2S^_ +JrqM m#"eER26"6آ2ݢfys 3 Mu9U~IU#f̴dST=_X^nnjlMB䉖w"BI{ ]krm݋MIq<wy<-; ۗE>`p笋#:jiv0Eb6C_vBmK+DyQXA Zj&p4L<  _L\t ,\Ūг9"Hz(Hq㺙S:(tt;y.B ZNdFq9`K4 NV?%_Dd ۀFqM܄F\k0Yk $H={ s5i;aW\dL#C_1,7bP+iŷ_-Ǐ. ,:b㩱n В]q<˱>VQGZ9߿l0nwyzxGZgWa C*F cv;Aݩ솯,1|0VcǓR2YnO4ƈ:]Qs +thXnYp\3Z /2E(>Zv"ϴZ/v#\gi^B7c{r3*Ydrv|iO+ `" ~~*6aTJ0>P&U{vtO쫺z #O:ŏwL(SuFy7,ǡDUоn&K~ܥUe^q;|`hhc& BE4'8GBPXhN7GQMs|(V)BޣU`*]\rǫߧ +;u| -^ 59@ %Zs:Ջ :n!A^$^5A-Wn$ĵ}y˜ZSeX>&Y-Fa>J8ur›ߏa7j2>5} ҫ<'SSQw }ƙRs;vXyT!IV y'뤁LOj`WTHŃ>2߷=iD:6URy~eS@G? ͥG ϻo8w+W8g:P-+`b(둃6@Is7ϡS)2k˱ma>.0P3x(;@bq#6 Ozӌޙ.Z(iRa~) Ձѹ>nL?؇ ȋOg9V%WwYB?*GhRTYlaZ|b=S\S_Q Mx@܀( 2DÄy<ۣd%12޽>QÀ@=OPڷڋk >nMz< N_KT|V{eM B`zP?P1(8#5w;Wz#R Po^oZ?_+ʂf?0S?g.{1 n[1 X?c  Al:4>]gF[v~nW`T='0#Nߡ8 nOμ-Z U~AAg~mo;ЂymVkdgoިf)7f[fo|hïdFq{ Cww4 f1hB14%i/dWZ $E\o{OE|Nr$ x^kt`~6"t~SZԘ/m%̅~ʾsgivҞ&l"8Vrx\KP+3Uqڪ^isy}]*0(_UMdLyRʆu9㿢Zs>ZYShK+  |f`3SQ<pW Tw":42Z'YzV3j:|b/̔(w=!PP?p=/h[Y ~*°"!~?ny%:,o&ľJ"5< +Bi@;UH]04t7^z;T 2.o1-?T# hZDߡ{oeȥcT,z ]Vz^e9?s]Ͷ+Т~L`;}Ux 0&偡"̦/ sNGRܻR?أ glC+L@Ğ;CkuGAJ[}sΌU8 ټDOR\sO]v ?Y]^YE}].TW=D?QXzI1+O耦V:#$B|S?TuP)jעwA+r\OteEXTe); ZDr~v|2s*-%Wjl]?¨aDTfoz>|4 m2+Iw@z﹠#:wyzWg+e֝zZRZdjjw玒*ӑF'~./{^9+lMuN.(ͪ^Wzubv\xo|;U&)}$dAGrcZ u]"f-[%L;. C"/NJ&2O( 7VwԲf5=R=SU hǴCfԶWhv|c^xBD`tҼq0 Fp= +ӜW? SC@+?J(D/ڗĤx$ړ3YmFSkRnC*w^r_ ' <05c[צZyqVv|,71<腗BPs(n%,gLi)xcFyOm}7e 򌾯4^j[?9s?Gߗ\g~~?A%FOAS#o(˞U+*2a%ςl@|m?3_yڀC:CVh0k;4a QQ WH5͙X#Yٞ)/C4܌P*xt6,3fJtL]U8 AvVWNWZ t>]oPjQK -AhXyDV\,m=Fc8b';kXn-]Y+[v xu",[Edmr21SbଚkXf#fgs4NFw}a۷ *ݿG\g;BaJCYo`5p-@]`3G|lӬH,~93X4kp* D]ddWrc ΠUŪgOo`E&eM[͙5z>XX`}yqc(M=rH6%խez)u,ΰ;x<6ƊT~Sm&LfW9Jִh! FSXYS/K(Z7SdjlC4+hq*}S{^f>;65=>kSL5j TOYҒ91VS@H{? g/T2+'#Hf@Ae֯NDTvv}^;PM&m .ֆJ@J0+2HFE)ooJɖbrZQkuGR]o^ϼTi6jL8Guh9yMnތV!E2u eWն]Y*$-s}5}VW}l7ŧ+\uiԙY|J[L? EڊL/wbΤtNW[qbCQ;X|(T}!> XQyƜw8Qa\X3Jyk\VxU#rY]ڙe)cnl4V:A,ISC`MDxWfpf'hp0yO@::e(aPFzSWL*8VY_Mbq2n=O]@ *=g56hOWMvLUvio"6>9e{yp( jD~r靷79?m?g瞜\;fw#fUuvmgt!@Z|0s (bIdc>'L4X[:cEqdk-WIAǒBq#79DOn}u!^E60RSzu,lһ99Hb-Н5hVF'FVR@}jEB[7:5xQST6@3M ׃+Dpkr|W=+JZ:Hł5^'ʤf:c܀T@I ; A`颉)lXK"w5)J.r~\;e@c]:=&F۫Y{mou["̶ (?]AKm`et٧tsn(X`7 SԎr!J+?gPj G̼a3+(ikv`: JH匀`܆C ҂ݝIS[k" wvLV JӠU:H?;x]xU Y -uQ>()Ӏvy &!bv0bLOk-ESzRw8  .'m0Z-0Ekᡴ͒X%*aڪFf(^6ʆ I.Q"Z4#{P]÷k}a7d;t:vƄB59!U'*'I6 s&Fֹ}G}z@kq}5ĵ>%6K뛻P>MU7NAӍ^=ʚ-y"ɪa -0@l8:Kp#Wh˻A\a%3f#[$ \(^D2meCjƋ}S؋,TUݒٮ>Qj :Y> Bզw%ke;U&clE. {wc+py*g[5N7pBW;HǤG˩mKK&%jK&DH6jʗT!"8%4IA׬Z= -$l>w@c\ra.8?{khA+(hb4"+rGnywpwr!fI(PM5brGK+] Km%5:K|@aQLqOctkRm\E~WɳTqF5ug" .4fB؞UMlia݉P)WeMv"ԯКmɽ 1冨U] ^c?%Ue{fͤY)E5)m ret-zܽD{3grzRkIʶ6dl"d)ZLE2y! >)CC*)WR[V.3sV.] g7b3_d̳6 8p\ O: V~SӀ(bd[89M\ԙ?zc7N.+K,$Zj7nGg\,۫&"v%"lD:.Xb_s/t2$nn:1,de԰ʹҴ#Tax6mEHJF(gl"s;BK=t#!gܵfQZ-AW>MGޖ=r =F3Y~'TМDD3%#@DߔSUVmZ>[%0hMw鳬zhb !YhA';7 $O՟8 Oā_'/bhլ? 9ْa>8S$ܨ@GEEU3>yFWNϵtXuuVdlaNZYM岔1\5Dsuo !QtaXI2]hdVVmϡn.˛  1Atm%2[юsc:6 v_D78jK__wF|FlU3*Z \G2b˥Eң qʺԼLF#F,I`EM?.ޟ]!;ÃtnE6j2Us ?XF|(LRzAtf|eoP"Ugu'~` .N_ju-7bu8Xg~pfddh+'0$I)$'{| wG#vhȹTi>5z,(Ns6IG{ sztAA /I{$xhxԮR&KM3+uIZNƩɢH"UMК} Ifߵ[e[IՇVڰ.C<)tYAJd$Ru7w$ z{ޠ;B87m9USdle<-Y ^+_&a7 {O#،|"TSֲ٬kIRzYO ըaړ-JUN2o[/ '#Y?PsS$D#J4SSxH?4t?u1=&'DC<1 a %)$kPu^n`brNmCKnv6ڗ' ;n'S }g|q饧 ė?AvKJZG=r?q/66M/0#ZP_~ zkf [Xr>xrrWeFwFe_Bow?W Q^t3TK| mTW Jy!% o]ȧIU2se*D6@&p1RFfr,KP;OЕf$XଞDz]sCJŊ a.~q5$ZK10\83z wn a-kiCyB@d!J@)ǡ 9K[?C|jta`iŰB&.k 62C7 9'дSt[v]]5eb!5!UFA1䧮 SMY%b mDP~)1 =(Z D6D྾Rk^;7y= V:2 a{c-Xv[=`xƊ-SӷI[OQC0BtYKq=ըsSJx*(uòO~rZ:*:lw]$q\d }j&X$29BC0#O m@Bܾ -NvJ.]PS[ȈUD8N=IBIqQyOES.`r&<\2K-Go4ft^2ՔQs^z@`v1`i%f? ]s1H T%l006|NEL|xVٳshX(4)R'Kn7I,5NUiTڲW.UsֵӾ̪\'X'Rf]Nϙ.1CcQؘN8(PձUex>8u]qU s$(ReiV4v*mLk4{;$Ʈauo[NXoާ C`zpЮ1Q+ޓD2Ru~+ɝ_^y(CYW>kn՚b3v7 6[ֲSu`eƒ~vRVc~>*-)}xneAE| ?k,W[UnЦ'Vͥgi g6VԑQ'N&S\%2aVϠ\"3VMP:7w`67ppm[=Owe| ! ]2ug5˾o0Y@k%pJս;l}RE u›V gkvίIh0. >wjmW1Wjתᵺlaw+M#?d j; &dz(R3Pj'@.bM+Rp:QB͐j[ d J.+"26#]m%ۺO/c)殻XXS]Ž g|۪'=:/&2i*U7a$]>ٗD@r;k߸8DF:^ۀMa, t%qrP3BW$D4 v-ETqa"SӠ WUT[1+]*-r#G4zcy@1(!PO(&K\欳eX)k5f_f뤒^)Y,.̠'XMnh"hycﻈkOAu+kA*g3%ko 7;]f_ӏibmK, }:# ؁MP*r'XX8_[bDQg%{ `~so5&9#>C5AzlިrU QwFV՜ږB>^}%Ta9P`.۬jX0Z-1+Uv;6&67WTjj]tvl[*u1ԌX+gՔQgmA^6Ɂ>{|a2+ۖeٓa75.mܘX+q|>ؖi)qͪP|L[`9R 򼻣Њ]E~5vim?!gCgIn2>0 %z63UٳIhn׫A=FhR`2s qG2&i+6:E2Ca5_srRn}Ec^-n5nwWlT=5(J2:ɫsvfnW]4t/Ɠ.̰syOsQBkЁ\g'E@ Ll['6"6+(2<"6B[0hr![憠)XHI 47B!0TN+LN^1'<TxkFAuܩ3?Pihn]}TmK,q?aY&#p(pjhY'K ȉv+2$D8,y+|$5SBVqQݱ*ڈGFQf^ dN8U q.QQ4O/73KJr$2pwWLJ㞯3P=htwgAJI2Vuҍ4ˁ=*Q=2o2RxXh,ie/ D@9 D]kDYډyzd9BdxrG>0܆7DJ.BĢL<e<)B락/, [,LT,lJt 1%+)&-ϗSlreۦ9'Q05omXAV\1%SblxFn%Ν>=}{Fpe 0'2A h1C= uB?jb55Yj &[/gfzlrXWYeۢM.{kn-pXTƀ,CRRg;Lg_0]l2net=E9}Aŵa(W_ ~2 alհkU,@uJP,7pXn9BL-'a{± 4bdmX!䰐YK66'&v̛$Bu2[:d\נH:GW=_iՉu7|=?y{|xQQYӀYvF"5 *E L,gitBJ2ʇMxhm` g lʙ Ko3zXƿ&h3%97MYE<!BZ F0Tϐfj!lri00@hAA-:Kc-߯IB'87O`RS)5L+k`$^!jN/fMlUfdUYq0 fȟJ:RgyΌ5#2iB uMjgW%@4:u!lIssS+) CO~ a'T'Lhs2,nyP962Ru%}p#i\3u\1"DŽkd C#wF.{6S'hsdJ { 4.TlL)DMD:S^ȁɒ.^8S(Ċ2Y##Gǎ.fK6 ~*D{%\9&V!Z{'LarٌXA2D>VvՓd,7ڥ}%ѰRD-k^odMщc$D I-]R1JrH͐&l'ukK n֑#43IκW1ژ@^9 T1f5ێbׅQ"z pQ}b%bΊ=D̦)Y&i\ʼn((UieM88k%Y;vFW|)bYHgk5CUR;5ЉmD n9ykxem82$cs q`q=)9fܣFnTp{E%q^>W8LJ.j(5ƺVg[Zc:KRTCQ W8%aG46h7`b`AmE]3~:]8ZT#d Og#!".9*=wx5ʙ5SpIi$jt_̣@lE7 <+t_U0!ړ,qm+Y;DX!f@"zGFLTȭܮ'^"n`p5+o}C$6\de-3$FjKj70٭CΪQ''IF,on!V aI!7n9S[vPw$[5ջ#V:EI O`2u3=_d^91tq>VpWuSOLoe!tKwdJg|$eOvQ"|'*B* Snڑ??טϏ",񯎪*fu#^+(LK3;%xz2(B))y~?}@ԇ_(?~&o:O] t5/U% oa|RGȷG fa9C008N sr%8dM?Ap˿(RASlP߉o[\76"HU\xEm=G,ez&6k?pw$#=/_n$ܣ$QW\"+Fw9@{\E7JLW'D)%NM7&8QQSN;'VRѼC":#pCoo9 hn(H07X:zb'mvr6b +ꋎ}rW0Ru$DHzAwk; G!xfgvaCT"JEbd]+ >VTp8շnU7ãAgm+<% 2fdR1I\hLʳ|ÝnOd!y3]$Ms #om]28JeS~׮? –զ858T%p.OVV<`/ćDߘZ[GSxg&|>&etq]&[PYk?"Z"Eک{Q;}|.kROד 4j/9۔w@c'hy٧}YM5%¯i~dAVԃm43(ͭw5ThV !x#TOj\xj)X̻b iMŸӥAc"?X4nv7&#E~Zu+uI}ZLjCU?vйϤY.YcfӣRrDѸѴaH`'n$>o9m;0E!඾:2aYؕ'Ꜥ6>#fI3̰+tޮF~ *WhWRXU톂 {jO"7A l- O t %oR.%fӲ-p񵫫zyPJGK<hg-iuR%?ڄ/s'cJwVT|m GN`bncD: DX2^"gЈeؔj)42^]x0벚b]9mZ. ߜ͕w\D2;iW2!/2 aG4wj{zyϐv>+LluL*`^A6;C߇ ͓65^.ͨY}2l+QWB{7(Wrs,EC9L'YQ=U| 4٢WUCgؙG'Cl̥y]'MrŌ`x@wiXz<_R"aW5ݹ6K3(JJcPqx;Ʊ\cL2Dm\.ɸ0BYC8" ى/?F`.b|hya ߏu;5ҊKXU 7Y+°";Qjm6/, &Uʚ.1cPp6^6];535\sx,O/tVe+\fb/AfBؕrӱqvl㌏ie/a9PRf?ִg5: 6ϝfiɌ„'CqO o ?xZe%pDLW靺HddCȂz 5Tu ]˙U{Ӯ#legf*QwP\R>̚ZDLLՌVa98\idgCgH})(9s{&6w#1ML<, T0~@ @^ʞ6gpL2 i*_0<@@<\GBۓ^dd9_t-R19 ;<g%%{ZĬwU+ꪮY"[VtrxT~Nr|,u;^ْd|!K=i^wJ_|?S7㚒}m韒|/6d|`o9m/˃_~'/'Ͽn&%L/?;_'Rbh~?^ {}~#s<ߛȲO #O^LOC>?1ɫ/x/P?_o(;?kM P>QF~'O_/ol.4y%>/@~#ŭ@u|F,};s}AF_ȏ}>|wκ_o[v#Vh?OO'jGYv_mN2_,{1`{{?ؠ K1sg=:uSAXՃ=90ŦLY._h,7s\Y֌FfrfӔS?5~˚jan/8S#J 41LX kMmҶ-n۷6ƈZXLdPhhRgNQt.&,@=rF)o6hft8 zM~yZ}0zW2by/IvYey71RMr=y'23I&0o⚞Lr@Ԕr*KXF!|)kcAl.CxÛ4= ^bxN&m%Z6@_o3N9J}6ZR<d=ص-Kb>owhOe"/_.h0<&4/sCZH-- t ?Z,S0D&IH[4ƏO ,Dkhȗ;$T9.I:f1(Ɯ)Y8C...($ $_ZuCYOzADP.K(B|$Џ혳MP?\*Q eBn Lx *N[UGKK@#1y~5{Qu&!2\2hŤSpOZ69tZy(@6gNAi\ȄؾaW1,}cJ gbqo؂-=~{ nMWǻ2LjPMT3Q0E%6O! #Wku5v[B3W|9f"'Iϣ;G=lr0kvh@n02Y n}3Iɔ`[Q(m펑XC?٣/xugoSDZz'W*(KH;^Cl1.*-:-@7CRi ʟG 3֚l *ŠwԸ^D;[1ޥ˚i=?.S804|t8CѪ3W\1IڣL(yjx7?/Dupٞ?o-n}UiR`?: P= X| Gp(;3$pt`A%&c׾  4tT'Fw@ec`<#׼8ޟ` !nn#{F*|Y~w[ #mNF2N藱p~>_1 vѲ)Jqb%X|sPSV؅ƃl,Z"3oj)<ɢt(.ѰLMjӿE$!K)ۖMqA&]m0J.M j, |%t"$!F%(AZ7w6VbVRBGGLizH" I?i[OٹxAx>O"sZD7h[|]5Ofʟ!ygvL8fx.R=O9{ ]qlA$ҐR% xvpllR۸-e8mϮf7d 9K,=uI87ϥ6GX5 9R_Q$ѺW'n@'taUHd/4PFR+ށ(,G. 6a~O/zXZ݇>L XE:(nroTŁ$f2:d6F9Z{l;Vg \eƷ)ͺ9H7 RuXDi.^KqhS5Tx }0qk+x4geVˢo˙Un-{[< z,<`Qpj,8aR̐y]=%@ص1B>y@\0ڈRަ~p 2<ؒp⬒sCjs)~ Bw߻O؛7lB+MZ^d1xp}C>*6 7y<8̛ғ%iށ8XSS+ "js:Q_"Ds+xkga.W*&GViU^…Lk:o7^> iκc4,:^cĸ.‡X2OJF8CDы]WϪ_WU/l"SuAڇg>@^R|'oYז%F׾;Sroղt_rWCP=ƛmDb؉UĔDfr>0x$?wڽf||_Ab}5ANh7½׫\H|"ޣM< ۦpC 1F6M!?x\ߑ$+tzF`;ՍX2^lGƤǻ5XpS?ADWfQZVg!^évX}.{X2eSDUQ9息 8!KީT`>͖"HƕtYNbFiHcj;DW{3*Ks5.Ț 战3oCb53<:|u/8ݐGy2KJ;m ⃏ /#Fܕe1C!2Uĺ,WC(.'"zUCP[d!q"4͐{Ia]65Y/B@,VC',Yp2Q3HU&!gQ[Ⳛf1~@bO腸~l0 @^}]vf8k` \CbY.ʒ XC"W>6vՃ+b=ywZWղR?H>T^}?ft!Wm-w{?3i_LƘ Yt?N/qfl K[hj{д#Q `5MY@V1V|=4-}^@3۽j)fW_XwH0 So8wLL!ېDA9dx=;kH)n"{EgDqNқlY7 p/06.% 8]F>ATt]&p{ik􃿏`wv&hmQ"7i$߂߰mFH>Gr׷؍ A(Z" 0{#ֺ*==/Իk_{Ϡ 7>gJ7{k*dT׹)NIFUu3 aqf}F}v#%g~:O\CGV#b#ey?Skܻ#IE('w#:$y؜bìІr׀6=ԽeGJ}Ua%mE'fZh\0G3es{ef?w(=B# }@|?^Yle5xYpZ'V[lӡpl"ʼnf|ofOu@>{'mڞw-ypϗ_G'%'9Z#^Ԝ&MՑvwB M]'cx<.`g2DסVc>%xojt|O^NR;et:#0'WMl6_/'CVCnx.g7]ZeDn?M(2:}f8~|չMbH? xTa= +8?~'bw޴ߗow?l1Y6AOL/i#dt gM`z+G{Æ5b0[I#{d}6bڽjбڑJ:Phk'wD$mbs>9OD~|V@GkK8fžU1%qIf_w=/Gm>=9 %ZXU XŮ`{0s {Z_]6D$^Я#g/ '`Œƀbck!Y;,`=x Ţ* TXtOi~^ HҶb{T^,vN"ŽʭbĎb0π|Za;2ʟe~IkH@2O@FwL`Ā7X?b#R^9"u h{ݍ+ՁciTHu0;ёgH^:۰X]Z |ZUYt5v2U@[,|nCAW^2<}[~E{ yuH>#q6z5ϼbEA6^~7BDD&f(eu}lHweV.ɨVG%ς N9IO,X-?~D&'nhoj$f}9EyK6!oꪥw5NLv?+dRR\RbR_F.}C*+Dc}>=dR+?Z(GԻOaxFo|%&RnRHQcVbZ^s)6>S8e@ _Zpd~r^wQ6J6DۄX:(;DtM]2,q?B|d&[o.VtϢ8Bw]#'"sIb$Ʀ_L"5!3z[nf a ~RZȬXl<o,}E,[j8vo3 &Gg0pq?Ia4ApAfƫ:ɍf~#py0:Aj3oINLVD$&S~3%fcgC2P+JL×KE5ceϮ?P(6 ǛLeqd=d b4tbu.R7tJ&g=ǹ[UQMCWK-bk|sN tl9+=Nƀ3L1t6Ǥz 5(G'0m4?;Zj 7O[1K; o]@憉0n4Gpt8/۽x'!upDO EPΆԯF]jyA59ӕcĥz|8 ⊒M=~rBL)RO>Yu\w(*pr!? ˟?vjMDP|u]`Q|'E>{czH.\l4u|_y*C5z:Y}ӂ}<˖D7QR@f,ٷm^"YY;vlA{ѭߵ99amZsY-s?CWx4!o]_RTAuC9frCz.x@\][Wq:L,A1=`đ_H6ovW5^*цЂ Q:W#ZѓVq;77oPK`mk_BZy;\!XO (i*;*g=XqbAiEr&ik+[[Y_u5ցIۜ$qvS2S5e_Z<9%]G8t?刳k k֏*% Η.aԫĪbKN$|&LܸUiWwEf榞n?oy9 u凪Q8+CEIO.rVFBZoҍ㚰}TDn[8Jk g/ʜLtvJGd8E7u;ӆ8s\. ӹ݀\\`Z/U, o1!?r oj0Nԋ:.Ykx3wql֋FSh νM˴M,NHסt,deYQ4ɒBY w:}lڭ4630#,w  'Zc}{ּrMOPL] |6(i-G.O=rI^UquS}t u9{\p\Mw"Bx79C=(gC*CY;93ulbi6ipOHUxVYI(Cjhc' 7kvpop NJ'bhڎutx\cڐ\U:f!sQ;]\gЭрRw#v!>*eKיܑ\.]Pvd.>^Smpkv%-^Zp!9>wCnsR^[lmÐ>I‰l4w/s82+v},Y;l{{YS?(kjiFN+Y&Nq8tjͨȆt*˫U'.~%֕PAtEᅡ fK<&SxiܑA=Rq>ѣEtxN {r4Gv:W#]`;eB<ۭisϓ'4;i+}G2OvF'K{3gsnVqY9֥B j3}9Ly|97I_ٌP!5֎c1xsr-`{rj{m_(9x Xɗ7CGNcӗ{>B/9_XYZSGOjIBFTn u˭GѮ3ަE,ҾXM:ۓ`4\{UTSvOÀ\Ke.6S`t*z!涌8ܤnHY@q{~9r;bK ۈU|tާKs Uu.g9ndK}͙N@}FG?98i Gu'݌l]0d 3h`E 8>6HPMMTq/1F8}3RHs2O3SÎ,8xbA,9 & Fb>T!`CU1v/U23ȤOM=aϺ]224"@3>dk&ڛ/ iTS#B sfCA\sŪ̲Yk(*Vv pXMhV q?|@SF(ѥ`쉍4Ba~/TRpE\V $dFZD':*M8x^CГ.bƣ3xPʏoEx~D;$ޡRaM.v%Ivꈀ3Ibr GhJi=(w~d (B1' [8+Bz]|v϶~Y +  PSi 4!Q1di:yX=Q~LRnRumJ% ;U.le*Bf/ ,"ZRXb\5сj0f4)A|(x2PttA-U H5UG42?O_Is(P!`xЛNΐ]ǮoM P9'gt`wl6#!ԏ}vGD4Ȧ]hd9߳)҇#v> f(VbR[fIGlkS2<{z~^wPx'ݵ8=h1깝XCw ud# 젣Lr }} 3@1X9 DJ $71˔ji5%8^hy7? p::]Rj%D)z o8'ey3RNЃSk1ꅻUO%Q5By뤿$u>wv 2ztT\~F}u0[譒-B=/D?=plKxE)1r\z)3f TS%|2qg[O?rLC{MOLPDJO $!ŒTT(8mГ/GG< S򼮂 \z̼y2Ϥ 8OfzEUBeC]$*hRy24'Y$% AqB)-+BOFd J2|Dc:J^;ze +ZLˉ7,L!˒r>Y\KIy$ ﮋM'w@! )tjzv1+TIߒq(!APf^xv}8]&ŷ PAAKUQAA:ע ۘ=Kd1LUW@EBhJ OfS7 ~ y7cQH8*Q6d|-IԼ΋U{$`Q/.uSD+ $D9ɨGY2we!IZi<6+C>>~\m(Xb{FO[I}~{?/d)YO {ԺofC+>>q=v3:Tv20%+OI^,πS"OPEC=x. K͝ΰ电lo %q;>zLZ\Y-- < iMבMb\P>@OH\t_0)CJh$?I]ѧzL$r|ӸJiIh%.g?Bk[o1q ՀO)2%H@-PRSW'ry _˫|rQDPU"X%9nXѵڍig:)Ԭh̎hEkZl -xmQĜ&LlA#ɹiػ2$RW5Ƶ0` M6v@URdIxFVZ GX-CUB8@ `ua] S4)lLDy)x~wf&sVymDg.O-]³uQVKLHDQng~G|/#23s>UvcϤ$?He_5Ͻk;yѴ o}ss>Y5U~$t-2GUX3HSf<.^*ãxf'!"@dMZiq^?r _~Fa-f4~2p*I?)ŰWῧ7 {ɋCںyMk{Xk1e6]X5[~9x~ׂ=k֎38%Kkr^DŽmH^GYy WQzPX̯*/zEuJ8W||X'̒vAu#ܺ5~:L*Mō_G@Mqw❷/郄IZ\b-bM(-QY?av3վ}kW&f 9}<,>C&k>Lw_mtO^z<}_ož6SeoߜymxC'&kx?y5<6WgSjYVƣc}칢h-HO\y&o*{k"h7"ޢoB9~w_G+U>0=7$W ֎!DX~A[k}۶S/_i}6_売~#?Megj眬ӶӃlAqؙE^A@,N6lv~KmӮ쾐s,wz{CڸY."x!:곭t^N. fCg2g9ǻ\ْv) Ћgyԯ^&e/9y?s{kO ~-8s/<v[3:kLJF rOǿOe_W#!e'~iRܑ6>m?ퟚBݖ-y6O_Tl=;c6DTVٵo_iߘS &,VoJ[r4eFr8m_I[?)[wQ_wNgXGRٴFh<"q;[-gxF%ߡð~] ) Q3og|֤zGDƹAWtύn}<劘#zkZ7mxǏ|RZZԳYު~es?fOlh= I:oQ/:vzM93$wqON8_9>]ˮsV2>Lyίrğ]}ln"_L~03*ׁzo͵@ف:֛LQ9PO]O~LVNiC(Hxizw3;j_q*}{hGm{;/W/fOݏ |ӏ%V,LrtV75Q^ڑ?Yi/m>uv]gFZ?ΫW_ןgwncf+kZ~Qk3J_;ۭm+࿎4_k)zy5W!A z_2K\\틬ZN⋞9]m#*05 >r_H3E?`䢲;G?lf5";$ih!_-r=PacR21|uWܟ0.:_//߯_tr20D5L+Bhu󿿃gkul$z&Z Ա2Ì4{UYӯyn^L{VL+'kNUic*Vm[bK3QO2wbwkFK8y7?v׼Mڣ/Eϯ`!6,q~&VF0C߃WىvsE2bKcrjX_`Ne"fZͿ#}6(NF[Ugyz\^NO{/9| WK|WqscoV^wMLyƺ6,j}`ڿX|u)?p_<*o~MZΨhC96K6l ]#" VEi|xUV,~}cspl_(r^>c?+ so8M$תO}jCWw}֞YIkIÿ•+v|e؍…~W{.ql,n {sce$ Agj?tYE^8-Pن6v8VO?d*|X[V_ӫgjw=utJӣ+W}⟉g_Ysm9egD }kc |c==^n_jlxڹf[U&v\GN54Ί9"qg|%QGzwMSEW t\u:NS:u^կe;~ح[Ql5.ƿV|ϼB:ծLᢳGaE/[2O}?V[;Y#绫6z?_?Կ篋~6'.7{n8cni~~'z { l^ O|?N7{=|JN~:uNSԩu;@NSߩ>W?UKVh6{ԩu:NSu)=Af.bJ2M&\$( v-Yt(_vVW(`rf2,a{C_)p>7 )ai=v_v6L՞,ܿiID[jRq 03e0">LW2Jl,͓Rrf Yn km:/3ITҙSܠi諷QI|޾g=u*mT}N~H~M%d _Ό4yr-%yںRWD?$+n5v R@1dIOħ_ß0O1FJ؀JStRZ!REWB@-[3|pM^M p7ξ7 "r%t p&Al< )d"kB׹at aQN# r coXhIn=1$ĿqGQa6kԢ* "6+Pj)!T>|tۭک=7kxg%4K5{g(Vi6vU!TL ۩b9%4Peݘ5AS.R~m .#&j B:x q(sáETբ#jCfb*ca:"N*VNaIHsZ="{92Z© !q`r^"O D!5Ӄ̠״[NLPኛ1 1[0U).Q? U1MBdU+?غ@;A(K=8'[ h4lu( bEDJ p>{SzC0 $ءQ85yI$PHh)2~?/pejlˣ4QKJG9] (Wtv=T S m8^MU-OjD+Ԙ:?´68ɵY”7|ߠI9g5D1]j\y>KaqqJF"G>7czXHi{pqRaԤ z6u-Ӯ-сQz>XAݓO.;UC݈IqLg&[udQ5ndn8VvrAU(M蔣!7/jL$ASKWcX%<X&%ۈHXaKƽo)"R)G56 Q f懶5xHA0%u|P`< atGd6 `<оQf`-R$u-|,;>>ЈEA¡ه $yAD3PYQk5d DHlA\0dK {F|A6DyƉݛŝ;C&‡(| %Rw(`FjM7T>vaPҵqX<ADJyp'l"@5*[wdra9 NВaʉvT?#ąEXKLYA]!Jw24?0 dP * i&Y,3I TXrI | G(^!z"wBZQEGq`R ʝUdf11cB=2K l41Y*T~Qi7as&X%lD33P¶:O6!jgK=@?1(l%'hY\D~*9nr(n$(^UK) AÙԎ'7 v%jBP\_tJa+6[}%dyZRTTC"4GaSc6|"XAo liΣ)583wq`BC| S]ӂk*Ew('S=nE'dI;b#CΗ_5܃#߿:5)l|hp80$Ep:x(Øԑ7`d! Ϙ8]GsOrֆOgYea("$qvbbQTb,K)mn6()B?td- `P>13opUZ"Bc49Dnм9qҍ~_$ )BZ"+^#y10ҕeaPS DhC&.?$l4R¼#ER2bSC yk 9'wHx 63Ah-($a ~%]BeI@V%3fH3'r܂."(RC-a'!0+&?pMxv%% V]A h8BSL aRHxބ:BrJRDǀ xz?z6P b.]D& \]8Òy,*MD( Vq,P:Jg`%y ;ڊP{B87Fq\[T03 D!frqKPp< Et>9$m Air^r muew455!%(RJ+ҥ8䎤%T&#oI)E'2AI"l^7IqN< 8Cl /Y.whph|Eズ[P%m4 Sf J qx-9Ĕ@qj=(.=D a KՎMQԽrxo CN>RZ=&שۄA\ HBqjQ!+HI\JedmǦ#ɜ$7T"C)hbvsG8'\ݱće5PElJl(Fģ,|æ6bBNI0]W࠴SEiCq` BJ!&Aԅo#j;:t[K !wP˓Ey^)&mv)'L7b!yvXG"y_(f0!,}QL|<)Y0R CU観Δ{G*@pCo\>< k^XHM.-we!)NJA\2iH%3h}(D\V9\^ \& 䰁N dwa'xhBӾZJrY=q c'u0Ǥ$\ψrߔ ҁS%3&Q֎%گJՊ*,SshЇ\R~~x{R MSa"|&X@"J8P}qon:7֫2W0OE e[\sT0bSQB p± 0'k%DhN5"P ?PjC e1x)\"!i!lj'&Nhm"$+޲P;-iW'Eb`ɐAQ e$aFe!  X{\ 6D4Z(P)Ϩ,LAt?`HhĒ&;? p;?A E3ӭU(E$&5|0ҩ Ia$80Vz&rސǗDyk&@4I %/[ƀQyFi4my=J܎@pʡ*&؄FCZZVC"h>F, DjTezS3Q(^.אr%+|VOش E1/4ƀ&~MuP7<:CKZE@cns!<q&'R+{I1SX7a(]E-v=[AP _q LH!r $HQ8$[DP&Iˎ<>Uvc%yP CQ0\87`bvܔID „6j!s0U%UBhV[E(·|˯9ghopw[|hNpF%?'|؜MJGbwaPi $,uKBSг SB ]EU{BtBfӢ '`ރP@.$g"X(u`z䎑0R+ jRGeMsIRzk 0eY՚M03j!) !qmքk v%pacJIrFO> auˡP M#<`1RސYc)[f@{P}H-S` O "4E 蔺@hoRP#!,Ł5m<4-!RE{SUeD$/,"b$ҏ. ;9 )>D0 ГÁ?v(x1'"hmg(u9̌3|{e('T!2~^F| [GG ".bQFL^lP{L}7 T mXQt $#1$UAXɂYF8r! % 4Ģb8@ҁuxU@i 4q!9HEY|@MN@[i"%+Q\lz" O; ;D!R|Q %9$">l"t%:wE!+$;{ AQ(vgQuB1!1r&S|LB| i.\`:=Hܮ_0* cSc(o:J|E)} %4 ]N[n> J{7P%H|ポQVj/U0ݶ!b$n *ٟBIah|u1(M 炊2 x米I d숯y7NfބՔFv!> ܅F0J7\3(OЧ{)8pC9!4>ZO cp %ɚ?$=SCT  WR hc!)&-/&N*KnE(-g Mt%ob<,J#%n2#Is6cP2O)s 1)*A8aE@'Z ;['%`-iA@(+iD4$0 .b0NL3l} y$7vهZD dvo)/U7tBSZG{v@R_:9Na؇($.@H"'CؒG]oIfLq l Ĥa \iE.Q$u' _ΪȔ&R%q4BnI0ڛ̤pj B>&Ih&}"6|x%74,xw)<.eyi g? F:uɭ%JIɢ6'#\jlzN{MfsooW$v#%&Z uiΤ0""xs 1QtDi|@ qE2)gQMɤNP*4qO 1J{{}p&R˜>mwz០a@ JlJE6S$'"0RFBKw(rU}WFN+%.C7? xѴCZyTTGFdjj>0'/lg"[A=SɼWpGI .mɓ4u ܡy uǦseқ9wJ9k|56T 6EWMBl(oh; u)AĉWۛ5i@d4׵!Gxt^O(# зo$COlvEptH)P!(pg= 8$#KI}3y^=WEZv %30lh388zc _> 4{W J5w+=E')pua恛hMr$,U hEu)6dh-S%nA="O b߫s6727w=UMLTװZY$ R <.jRJڵMaj}Ncw(]_X)1 PʘnA-rp(w] lOsWr=i[^9ԍ[ĭ[({nq P Bq9Vɐ.):6D땭5>wH&PSi]Y-ѡ3&hF)0&q́gj$kzn?i4RcVG&Ǧb=Kd^1fa vḟkaV4UR и(.'^r^LZuE9dƀOLJ:F1…RPHcc{N&bE-'&=z-x[^ ;Bf5@ @9lHC#RL6(Öq_~hGJI FQ ny@R7bd\HG(IС(KP#* AQr AO5>Qu%\ה{ybvIl L@#?}HQuTTm:uܫ^{ ^ !?DjZ`67 oS 6oO%ZuJB}:NRnC$zpcߗNǛ )o*(% "y-r @23YN*@~a2F%AF^Q"gfō3+dcB8T2G' L,Q˵e8TP4U`;T x`dDdtP©hFZ}4eY^+c8˧H4bm$xST0AgQ$eRc 2W ,JE/3,\SZE!3b.z%?㜤hE?P{/RPb"FNF1l}=EK8g-z#\omDrmՀF9L ӟvIBc84}+Ő4wTU/k@ 7k$WZA~T\!{H5b7\ f9jcؘʅ{S:QD(bMRoX3UxP)\ a>S0hZS -GsD4U#)ɉ߬cFrn]RNG,W)j >L9a Eoxކ 1n\qL(EL ,'w ,h()#O&*XA=)7=X΢ B Il݆!ppMhx?d;z^T#pRjncJb1@MH#lD]2p*.TcB5܅s5OxC=#1>\T.1{jJ@2%}< i(d8E0}()dbo?3qXJ_&1$ZYSxfίF\y5YѸfd#F.hT#K"Ü 2q 4V3OBk4ἺPD$ EC1{. ά1hYDUJh0OeF4g1"%$T$rqinXi֡DLQ/T0鷺kXXcF 6dtSbF~i<haF1+4*AfF7 7"F?H Yb11MŒ"#^")axH6 wրE!F)u  BPzh҉F0P7KhdՕ5OH/om&&cw/3oggR%C S5I4G)O2/M&&^iL5H563ٳ Wy֒pM1TɶU5N"+ Y9K%8F6,s~[u1_Kiede vq+Wbto`2#hM1ChB;͚jhb*Vg*nYtڧR>mM"b-jeK,n$@'7pUVr޴iec@6m-``x6\\4*j+ÈoHqEڳͬwigbSqf;lIXfǸȎD/%G(ORk͒mEIAu֛OEBF4ʄf7]Ay4P9_jЛQ7͔D›Lʍf7OdKZkx|syS9c´"&zIK8 KqD .B/^@'%Zm(ʤ&vt 5rЌ !tO6 xC۱50sh{& [AxAӳɌ]Y ʷŜgD 22s[&ۜec9JyZg:x9 HŜW?DcR*k ٸLms!țY*[*?Rݺ?u^0pz;>Bh>~XDgS͟7y^=Ou%2f 6ᄓmBgΣCP|:-W9W1G>Ϛ\΋Mts*u.Z4V7h«Sl7 @#:i(TH+\$pJePL lsqV uBd y;Y9B$g^u9|xL>yG%EuyF"c dC!V$:& x^ 'qqi%>Q?1(C`{Y?JxU|k|38j#{txq.Xl~ؐ^8u(c?/Wؠbfsٮ_4y]syۻ* fz[:k=Q:vɝ;"OF=M!$eEuD]nj e?r%CБ@H%.-iNBPK*y@X%`;DMTn>u K%t2l>Mb> `cm *S},.zOCsmo bI,Q* y$5nPN2?}e%9?B?=ҳg&J/tH ߦtjUUhbq@yH T34MN-g.7|AE{ަiTm3nYps}A,m TkÄeApCb=MV7O̠L<MJ^P2k 83n!jΠYdvZf 9%ZzB|Ӷ/>@ܩPyz}RB&2_ƗW?s YY ɥ]vg VgT#:T2 }\A8Vwe |CqC`xreņ̭2˰l&Ou*2BJsZ[;rЃx|{>LoQ}ʍķ8:Marҡ}̊K`8tg : VT,+1bl Oڙ"2dXh( A޽|0)K݇ ])FEI^=|]X"ՀHVԞ ZNݧD{YL՘ܣ)+qah؋~G3cdQdY^^5̽f(eFwhsB7W9(LҬu&. aܢwҢbڋ4X!Ҷ0Yf2jB;l-Ii>EE˔H tu"UzuEț* ,.\蠔8V ]T([_юFrW]uAWAGW&u~ԡ1e%=2,O̧nJ p:Tsk @ݍ~r=hѷ賑MT ύ+. 4Z1 Dž(Fw3ҿݍ~SPHq18$$tMpj Q{]GT#Xz}':EqD匦;8?Zks4N|}YGT9Bp2˒1WCByHVH0n7)et͸&BvLiIE2  D`= QH2A9(CæHȷG&N>5Re ٹy\FŦuIRΤ6igqoQvL,3z܂R|O Ca(00Tp:NnJʽReZn4i|{j7^I ):w@ƎYR n>b05n7ZnĺNDkObO>I~2\7=0hT9Ԃ TfDEOyJ7g+E"`CMP)e1WI9[”[_N9)isīWBړi-\dS坷T9Ή}[zrn@kz4 m=552_ֿ`1xirI[Ni';M5rns9 U⏾NRߨ{%ZSSE?םT%Y;NJuͺwh&+'TGAN' 0j2\@~Ś2ѤѶ>F&R9G髤<nRMۘB<Ŗwo O?3ӧd^5=3=mC #@1PQ՛u 5d@PHɵ+Y[EV")!/B0jv+~\.;K#^A]=BxIt;XpxOP~bTYhֶg8j8s|YR%ls3WJ"oG9,UJ8*8Nu4*ΎOcR<,5y,l]JY$xO OSnG@YT6KȖ9D.)ą\1:$ˠ(hSλ^OJhS{|gU_!jҌJY՗3t1U%-=RLYyLE\1%a>SER[ǨIiZhNlfF]R߸PRԉTͫ!rҴI`wu~RC-%Jz̍irzT._9 -FkHitBFtɽA5"s*<3g ZzLU5tWJFȳ c3V&(Pݺ1{>,Lג葎`֕ӏ3TYd`ldڱ<*{PgR䏭:Mƒ: 2A+Vm[X+D4 19Le;ĥӉMg1Ȋm;j9EOS9LȵޖNJsr>Aܤk9E$\\9wɜb*Wɴ KJ+NM9pѫd%Xh^\ Yޗdas17e|~%8UkqYt`C\KLBtJ͆xR̊ %Iw~ϿrQy?) Z>ӊ"2=؀Ͷ. %Vw\J4"t-p na1,#MD>T͹+Gf/Wc  caRή(c_u[N P4iẌ4/Ej|JnĵZֆB7KFFze?t%g6 |ͬ 4 b|f3Y ڛ^]g%XOhecr5E~N' X˨Շ!jvPdU{-$SMwOsX *RVd(KЩHބ򒵏-5 "8 ^Ӆo"#[VՏ,ڷmUX{Tˁ-HJv[Je R!\qۗrօ*N @ C"3W^&pI\GxC'.Sfͥ5ьZykK6L:DX!w'O] yqQasOM"랓)HV/sGR9U}{Xl (c HR rgz]YA$K.ec4ElRE:uuMޠÿAS^^V~#SǠ``WEٙ4}\P\C׬ߝw2aK]d/ɫiLU+@bCu3*0)mlݞжI_J`dF}v`c2B'AB RwB03i` D/=X?+̪Aa`1 l[fqI[NLWԣV94`oh4(ȑ(٣zmy`UaV:ݰ$|/f&J7ŞU u5l%jPXL0B@G1.,GAoF̤D$! ~O}a۠?/J~҂ng.: .l e67cZ;f^V|j%(& D v%j!~FjT$xCFuCJ-!:){[ҘP|L/s)A/{i1y=Bom0qĮTeS&\ᐳjP,11$ztGUJDaމQu%+]H-,*f1 2{2' \^Y\eW/+[τ$>3$.Vk2c?GV љ͘l$4`ktʹ\l o)fd&<у6a=]` (>RԨL?XHҤ͵jZ\>a KKETU)#Uh(-|KY֪o3^gt8_況uUԳC gVBsgZ۶^QxH<~E*ny&kpRsnld=ffr`;uH@CXԪ zjTd=k [X N.L ZKd'UƱ~G04U'x*^kaKK5cS%Q.f0p1YT !МA< ժȅغU#_Ֆ|@SU2x[4TUYf04^.`V<&6b`97klVhz&(wEuHjxюo uo'808hd׽ CfI،e@Ӗ1ҾDY iRvc6r,&-]͟$W(SՄu&$ܭ$YԀjU&%[8Q<NMrk%U!h AħhI[EuƋEg 6ӈ3on)b mgfz A23@wrN&;9p /A@|8uw$aQ!+̘>OGa%+"5*;,n:Lg՛m[5h>AٲvJ8g=4R!lFӠ^Xh|6>66ZJIEbyb1aಣn Rjo?8 f@/x݃*{ڹnT ӎ ggl jz tszA\RnigL_T!O`\[<*-SJN"ҸfoV"5 n3e"9qnNЁ6-Roq)nm F /LJ#MfITKWD%4EQtMƆ)@| Q.!RWUH!L\@'erIV Er[eMr^0s`JY 46ā8$.{y9UtjX:q'Ozs}IP3WvΚ#ُyO%_X(cʅa: g7gENٹe ^Ƅ>ǒ7n.5մx{eT A`WAY}MfU 1Xگzct%3tąoo5+ˉ[քow`vV PMƧV3]W6^:tx&uth6/L *.|'dDƐҽq>eSfD:'tik^Dpj̯rfgÀ~+zFD._پ z6sВek*#!o[}nEcUjnMu%@ThXu 3s:(/uyN# dLN~.-ެSɏ@IM˅a7rVE%'ˉϠAA[|: LAN(V(±Ϳ$]k.P7Z?ue>}UL7U yIT\-Aȩm$D7ײGg}rR9to "Əe*3]2 A] &Uf嵫 :+}{M><}Pr߷XAk^ {;.{W%#9-~"!9Lcw _•_,pѥf辷5Q$l+N$wt;+ew_O>2F3@d.`VüEAaHiqH&W0hw ̆z*`-t֥`%I/r1aK+&`I+lGjXAP:3p/[ ( ؊\x:H`1Ll? CVbUW{pZ\5+t ԝ5K T*GB;y}?ڪ(䝇}بeyǒVTw5۷@7n>VI)3[%6m&(Av5W=Jmj ^| )d IFr8Y8@Y'mf"mzu.QPHj|Qhpkp5 .j F] qp'iВΚԿ߆[I3TMJY +9d3"Dn:$RkTx-7v 6/d/dȪU RǬ !mX#SU X伮; .}2Dž%QRasjQ9Ԡb 쒬GR`HmSO ˔hmetgP`&U¶k ˲#JDe ϤWvo"}S6B ` iY2G|Ƚ,}=3l̉*$ Ö*7,VϬXעJH-WrgV|;%^ H)ܬn_eĬ^,ԃN 6`s|* gS45K.]U 5=|CbISD@(E%#/ v{aӧndvF=JQ%lidz6jі6/*XYn;M6)^Mb_q'zI~~IP̟Fie2~!gβ+5\@XM|Pcڡh"W䞡m_W59 hZd]j1&?ieeWjlN"U ^}.t gTn56˵.`mRv kp_wS:xX˞kw2Z-2Fn[3eKl(9vk[|UWIKJ@lPlYG?l&(l{,]Yv7^ؿᄱ]t 9 Ӧ6$d)&Ԥ'S8?e6;f=:Nli.:BD3+Z [ѵ y m%Ǜ 3u 2yA1>-`"nBq ,")tmhK ^&5 2+ 1C^/׶ C L[p_Ef3:OJ,[95Do !0=}pxRęulͨe]~X{]ss]eq!+=rE5x,xe^"e .m0RxėXMfB,> _HR< 5@fd~z/|JAlz+({Dn%E< ԞpXq/9U]21NNgBN^NgJdh)zͼ<&Pul;=βM hW%P>z+\0ЩZW-ۊ,iSf3Z Oԃ<gFp^Urpa<񴽢78dHP UyPR;<-mݻQZ2['<]0%sa Jnj1Cm%[L5>^0E-m r /T1'ߪ+yk+L^SM]gϟ|%4%`8;?z a>X DK k%[ΙKJhN7w_#6yu, }Mc=x" Hqdlq~i(C!M7_Fp7:"$1kzsfomݿ6& W!S|$b1#EK_Pgyq# NO9ːoF/5pY@X{FPB x~-0;G3V17Jf>P6eXjs70#0@+k:Xɛ ^AFBl8A 2FYnֻ`SB!LS j}dzݬ=za["σ }\4EO6L:FM [U&/I ʼ*] ::2M`;Z6/,XKpM"}#E`&JSRGSƦEp/\-i:%|8ϻs-bOl 06 ](y™ U* N4-HuP.̍Xbא-9C4(NG5ƾ s~JΥ\WpDha3Qp1TCja_z~tF ~=&Y.Â7l *2O؍jmLa;f`q uaF鬏᩾za92²`krV 8>FޒY),YQCH 2Ên\=$$ ?Cϫ]G+U=. V|CѸDvElahςU@4UH邁 刋@J3&v{@V|!%7>!VPdbV%^Dz2`ts“[houMHD!3āpUwg>)%W;YqK41V q;DqNȵ^\C9s 8PX#1]1t Z]ܜZI9Ĕ  oe PW&p#&Vf0El1e P1X:ӮV 1lM]['P#ۋIm9b!wzĎbŊlل 9,9C(4^?cŮ"W@\1+LJs%!^&7-vz68 ݞTԩȃք>#7E g!kkd&.l ,ѺpN 1vY7څW=ȱ$ؐ/#V446ы"HVfq89]_wd6u\  #^*L\> Miex OidmNDe59%>%v>V~WZmk#=c;8q2zp̲RtW#!(Iy5ٛ !D9kN64`-*SOT0e&Ʌ⻥뢓r꟬9۩ qrb2`S F}LJ '-{xomņ͖ o!jY~ sH 5$7YhʤLU*3C)@AOŔK$"U)#6Kߞ5[Cb<ʹ!Lo嵃9/)Œ8@泖E))kKa3"8Wx+O(uHƕN+9U{ee&jxL1԰`j d9 U N@idbP3nmzX-G5qߎ -o1 5:춬TĘ=b{ oCֲ?D*^>= f=BoB+#jf`6eӅ[B9%c53a̶7%66\[$wh^_s?q=&6X6KOچi3d&VYdI 54LIS̅yf%~ ^Z2ٶ;̬1N ;kE[s[/fdJU0-ЩyK^U4Mb#ǮfUiQؒqsa& 6lݤ,ٺn5ߢk![e6FTUlS3Pԓs0e> D4έ~4,*tlq>,Y1Xg0ʹ1hYP;])0Ĺ3cnzvbeQS¥ kO;$(%tgA~vPYsZ whxZl79ǔ@͆>r|Y8]y6~y\'|nj̪Se>E0A[o+π}_6,}ZPl3d"FyqAWfd @hJ:DSۀΠwn"S4z~WA]-5CхX.h6 뙃o0-Ч"`Srh~*B*ub]i 3aj4pJHhnjKT),Jꛨ-sT74PA!P[3tMi. _C?EܗLæQm+ch=-fQJ ]x¦lѪ67 8q$ ܌'\6MH hwb5Hrw$L12ݎ7BU+ }R+(DJt%t=b|!2dޗ:浇>«j[uS})i1@V5&hNU6zR}p02!Ьw1ɤEł W`ay3MB䷫6 9x}OQߢdX9NcgJ>llZ aƌĕfm\r5YW)5VXboD:~2QHY/Ml|bͲtl DiePͫs![*G нqz1^EZ/Ϟ4VY?k$w>̍DhF֍-e"pmc횼ɀAdAΙǰz!@m_j#J_c4z _P )a}&zPP^O9bP ;5x'h<px|5A'v@em7%ecG0a k8Κ Tv5_ ghLLf6rB4 7NMvA~R5&y*4'O!\g4ōKC -e7 e\$VH6Jlϝdre_V!ps+t!+̶}f-mȞA<;) 6h.]xiXJv`y]b*Y<xl!gl^.J+Sg&Xg5D!=AoAus6rSBMӹ#4&ڴix갶ϑ$x" Bm7[A1nmzTmsA5Yg+jRtt0|UHͧi_RAo,_mۇשdg^5STmުihn[x w"@ŒY>-t7d kP|[E+ ^\v ^cJwc`vbF n[m6{{*;mWofS]ֶ_h0:Q{eIY9B[36>Df`Z7X3 (hɪtV J "wޑaMn*%f)C=SFs=Z! ᏸȃtiiU;SL11mQm{,ZmԏܟȋܤEfwc^x8t边l.fؽNjn#ҨUp(n@"`X7CJ> `3s0y|ԗ6ս@6]DHZ@d: @1n-Dן%z7XAJ,"Yn*RN7ɻHG$zw'(lkVoAxnd|NğhL\W^_"3ϙ0~$9r & !FʶO:9MѰT^ʋ8z97 6jE;驈|A\5(9يb0L;Un0j+%3FpMu9,k;1˚axwFCw. }y,6P{3AĥYf7= xz0aҋS iۘI@*xp6H;I~l JY{\iXN;}-Z SAEA//9zw(wὥoBOʼnC2,RV7f‰Ɩ||D? !ED&c.-5}e"*3v B΢.4R|[p |!(+u|F;#={7iN¿tN|G _{op$@poX7`E[ζ"6d,Re,* U]l(L\Qlr ݭBya`Kҋ?ob!Gy^I *Ӱ;xkKV'<3NH4ӎpA28Rf ex16Y<Ϳ…gɴR.* jL22F3P 0>}9tLmbLleD=\^1p1JytQu`GѲ|w?+{o9g8 ߟ.2֊m3i8\.̥!-!'Bq>}~pҢu!碐*Ӭxf38-qgQύq/%c}LhbπEAY KnBYA#?MNro2(0af~A Vmr +iCz/ F*e ,*#7J"d/Ʋ̌6~ /% !l -j=2l\t77yRXy4Vbҏ*7,VT3Vn=C\͐mN2ox4rg b9T;YH\@הO#fdvv.D&J^{T<}X@yy|/_P?j26^\p49Tgl_-7Mr:V!_$a3fQU.HKp3ا#hNC+%ms瞼`89^OX2\aj6sckiIΥL|;?Mp8ha$Ԃ+6_DR~#􈢒 QTW7L7J8:RPu/oB) ԝY9$:.]:)+Q{&(p%၎uB GxhB{. 0 xtnԯzF 7S+G՗.pO2ɥ%ѭ]a9= jVkkۣw?/u} [Z[{xk&Ҹ>JJSQuRrzbsݟ(Akz{Wrj{rs59)9=+90=%kSywԇɳny|wc[~&$*LKLMQW{;8;9zm|cttvY~xLSvE5/nG]< [-*~fT_ksevf>xAH)RrjIZ9Ip4a7qsSt;I[\,}߻xsuI=i{vN7Yyz88RnJJ OwV۳+s}oGS۹)޼=rD.R?5V~Mcypqm/u<ݬ]fT{yߵ^׼~ڹ<;ϡ&SOo?9J79)=,r[nuAٵswN9.0uv9>ݞ^=c7CtE#Qկ6:xQWߟ=3kי"?.;M]Ovtzm/mB$S7;3a;[5݁lǣ~.HNzuA}{˻ۏ\S"c]Y&Wy=As7vR?zvPozTƺOvsXIrE-11WϺ,w]Vxx18c×5zܬۚ@?+SԣTԛJkjr[Pޡ3ϻ.gz+ HF:=US[{[HYW{TMMޡktkku?09*[^~?;|b=·8~7VME9i|Vz'v}*w}mQvެO?DwO}9==95sRyܤV]ϓc=@^9<0+s|xOa߻?hVU?ѿWvU>QE4㕇Om_x5* 57?F>!~ɲYe)&&w|p/&(&%p <9!/7(aINI) ^pwVgs`<=y*X[?kGwFi ’T3RT<#?a~W?#SYIݜG8=*{.3ܮѵ1Vob&XYz/!;IJvc/'пd+\{񬊔p o{f>jO,I<|3wlNO]j]m1sTc]xVx2sZv*r ;)rQ@#j+{mIqf\ ,gŠdO_>;};RrTnX+^.ʯ7qݓ;}#[[Fϑy?ꎯ0e Oެ{7vw_wTnxU^v0]ҫ7*]Gs~Gp0Q\Qڨ;KG~uH>2WY~Q35tj)?./$_l*\*ͮNNy=ݮñyW>W[ydyw_߾'J7GύM [d)g$܏~Kگ2܁W=opWp_SWk;t/s'=G(994I om g[ǚJy 5=çt1xWb]o~2_}V1_;##*_<Nw] zbu2^Y~.G"oK߭{yǵ cohޭ_}zUnf͵Ϟi3kvT~ ]+8|QT~<_ ]^2)m|'spO Dwɓ&0|H~aI[ yww̸wc*=;w6>;0|߰^ዏ{?T=|ZY>_FdMAwP?v"9vo;祫ـe&WEQ>z!3΢l37NUZǡ˺@~k~_<ǧ؁6\Kv6LLϼ:`T{5~Vg;6u]|f޾)|~w*u;ӋV?AoKl4WSv5NEoEb:fUg}"K=(_ ]9ig3zGwufwI1yk@EagXMQe|} K\=?ݷ vN%+i/İ;k`d;Lv;_ ''g !ٮ< !k;0+֗/{3S=? (hqPه' =ux){1[rVgϙ oU`YOGH~_=#慓bKo^͛Ʌg՗ JgKz3y z#*>_i'ji~7w+aV}M~{+4P4ϾXP ~ߦV;zg36>o5PW ŧ{RP~+V-wh;K|h;}ہw3֞آ=bشio VwL7oPh6sOz7W^qO㕏]tb~'Ur;t<w.G]^?'u+G>;Eˮq߃Rmݘ߆]ؽ)sH^%8'&Եwtr[TǗɿO;?b,&onCaQ~KNmAޙC~ʄc^n{'0y%@dOjof'~6SɃmfT!#R~r XY(BPܸP_~XaW/&Ccנ5ٟv0GjU{}F$6R%vykq1}']7oq-< cB͏m8rܘהC@"ksг_I!IQiހ oHk{f\cńs:s~F7t-_L {nL L w>Ǘ 4lҬȻXDУb䂫.Q ŀo5\ *zhq_Ct?;$ǭ}uky0֥"frinQ eǺ_h1H4Y7Q:PrRgR?O,eu0}>3C s\3=$r 8\3HX=GC9b-X ?-lyΓww x|W/IswNkNT>o󃷛݊:~}(]Ku'^v>;F[-/*xF0 ɁM8EfmCk;ݑJ˥ '-;H<1Ȓj}-L, Yb 񞷮`xNĠ CCaJ$ۻ7[g\,U 4E=ZS2F s-Z T?v&߉䐔i:"A9BO=$r ChG ΌM vS&͒M]z*'FhZyK?Rm1Z ]/Vk0eZ: 칠@׼0UUht*\Ξ+c\. \0wSM'f6ןo)u9KMHTF(^v`E.jf ͇;jL[5-rt4f)3-F}+vgR8PM"(/_|9~c.zQ6;SͫXO1dD9~ xardź:'Ct;Y peyu9a~Saý*J/p؏ާ?ŔevXpZ)ֻdQ\5aHOlm #7LH6u 2űQ',Uޭ`dv`"AQN[ՆlOgKɍ[JR'/yybPzy-ԗNT "UE&.9s%BDT)\Oin[BF@-㺲$J9Qrgau)dpPR>jڅ0392=<vSGY &\~DR# G9,mm 86LQn&Ȁws_pp>9ZU+]<帰O!Q)9-~ {o$"ȡMYPa#؎ 3PBy͉\\}yO/p2wx#N .05tXCA4>sCC<~  HI 6ԑo 6֒QY klV_<{8GlNQ88<֋uMvw >;% iڀ9 <|dbQoz?1-/1 Z_, 7&S ۣhY_7p0V`X뗨L-,O+s?"P@1xQ2n-1vQˤ4?b')Vc$L5ߙEtRGP1bB2*&lEX8r{92GcBmA"}#>Gc Czēqxe]]]G2Տ_s5~b5T}l7k+[7Yx V4ȭcrGϭۤ,vܝ"$1f&)2ʐ ˤ Ԥ4*^MejrQIlN.br=#wdj sO% MTwS]ə:tSBձd'od-m(䉖 ">2NȨlm`t!FAaD(> K# V4]aH BT峚!݅c LOVt£hJE)0:U&t;~:nـY6k7ސ~]w:lmJonZ jÿs1=n}:6-_Q_Rwf%`+x%nK V|}ňa}meͺDs(50=!Ô}!SgG7½\d۪|չ^.LgVcgj؉qHF7%s yC:_3_f~@:~5SoU}෎,D8S@OtEU= 0 }N*KU5 >g @xG@@" ; TP>Y9fi!) bu'X:PvSM%ds42%k=˵TP(8*gO=nsjiTEP _6Qq҆.B8Ma>ZAX>sUa}8b-+Qzn>i8 0@Y鐢w4v;)@kwg]S<HcF܁PK~4& # ǭѢ~Ѡb8=knQɛ'' ˢb\/ kbs-Fg,iA6V%aF0B9&Uq+f,S5\Hub2X>sº2KT˺5r@Qv;&p{C܃؈Q>7Mɀ Rz+'u%fnNit>jaIy $D(K=8}7Ül_:=(Y>7+E@-Csp+)u GX鉕϶Jgr \ UhlkҬ3)ֶ`$ڢϖ.]1kKxg%q{Uo%=әh3CLp'd2{v99 )4,kVXCH%3&(]efG\Yk-" r&2a'|IAc~-i&+Y˙B&i?{OY{el&7 E0ҟRZVΘ_q5Ǔ6^;}O\ QG~V1H4[쪈Ba;6) j!34@3UTB'91qZ4vBIvKVA\biQ}$1OJFTF 1wIhI;o$3'X>CTMQR5ԄWЪf<@ @yG?BRעYb M0<BFU#W{yvCo\@*"haI2I2dgı7 N}[yUFњ 'ϟsOEBsCM `)*:{`Xp"ѝ6RO:#|[f9rЂ[ .ќyn~V}sAl)]-:x ,6[Rfm?GQA=hJ'# /T)ϧf^NgD~%uR\W2*23Lf6>'?ZAU`R?,b3>E\B+ |䃞?/~k1>n@*Mu޳oe{<˟lK92g,3Qwm3z3m{Ij"<]¶O/7>QYevF{2.è+=o^6[gO@R~q\GHb2|{vÐ)U;ZLy'`cT8}t6ΆwP}Dѿ"P/yu~{BU>3pY+>_*>^:?A@"|*u`!LAp&|)a* RSR]>h:˺矼[Q 1tՐp>hE/>z(sP!tM(B!tENUkc"wocH̓s`KyHɜ<=gחŴ۸S?Tu[ZY/χ\Km:#Cpqgȋ&INت.YliIhjY&UW| m=;ϓ6zk(0p)TX:ܹ?Q\CkZ,.Jj׫Oi-VVJtf0Q4]ˠk@2 /V~1s/kj{ zG;?s(G^'|4G4. ;9UUf yݩ5J;VUl-l-/vtz,xx-!Υ|;w#;*`1Ǵ*)MFqa蒐{t{Tjfُ~TM$JE^U*`@GGch59;3zWF6VzЂ f^tZe-2>fU _b"herHp^oL\Βg* JFGjyhizl,[tT$)fA^ UFXD6P<HM6U%wa~] wKN UMfu㙡t !ۤ['ԃW5x`N?ޒ–jŁä:dD )@7zr#n3t^ z"~8V.Hl RBܲqƤpii grsfvRxӄ88?wŶX\)<#ѱ@Y)kX:ɐh/y\&!xS&)˱!}E~⿇1~t8YAh^W`ި4@_AB:E;>mU !L(9nWĆzm^M`av)y>86dJ቟JrJ3/ i;C:DL@U\Xt 5>xςD p"-8oogQ<&Kd?Zy{ P _V)YLOf;F),eW~B\{ܳ/XZ/ / 8\S /s/ l .XZQeY7#Ohe>7 -s)~6b 6> mnstFCPa}hw뀦yy- >nnm<JFy{:R{VQ櫾zw`޶+ iL5ȻH\ys6X# S_t:T)T%MR8*R8v]TK{oVk˫ M^|n<Î`h!.R%kޠ60Agi0d};;j!yy￷E! 1Iۀnz߶r:Y_7;|BE|J}#'*u$ TDY} ,s؀kn/,闒&0ƦJ I.%o :6(283oap;nMݬܿ|Qt=d;[`Fq^BgqРdq?4u'['A^ @lO 7 Ynsbƶx4B? ("-ˋk dQILI!@3~*ͽ.#ef DJ5@Arj1ٗNCaj"ljZrҐMO-,靈8 ٶdNtt0:pxa3`M Pp8p-%4If( v8N얎׏uC7̗Ug:MDf^*,'<,J=hbU/ȥN򇣅ܺs ꯆ7_Lp(:TBH9} 8{[ ]Ƹw0{!*]2 +Z$|3C@4cW]P JP W~t01^Nꊐ] G }I3{9D3㺽Qݜq4U 5vMeF0*%(]?zS9m:9fNf։aʼnt_>|_>q I:3pDDw: 쯏 = 5]-lX299}OkLk:(t XP^ .J)qC<@3B)*ΟoQwVZx:󶻥m)9J< c\S>3xQЊGS1j/CK?x ±eTw#tYsx&q9_B#LMCSo$P9 a+1dcL5C R!0^}eqG/;Cu#"^G#C{2*3qzPn fjWݦ]yW9Op5hҤܔ0{; b`I]qtd0!,\W}4pI1҈G{Gx &at2 $&;T>Q8@-JOT%U0/;2'[U|_T u΅,?)NiR5bD.%ScEJKiB9x)?!Ŀ|u6zlΛ^m3D{dh֦iZף1̰7є ȶHx+X+6bx)¹4b=$YY"Xzw[z*{n8ѐٖG DI?8FZaeSO68ٛl.J\TݎpÐ͞cllGa r"%H4 ~,Mc&lT6$VVRr5]L]܈k*aCU4 ` :l`,vڤHdln;;ٛ8 hLњ.]UPQ' dE68ͳs̖-2 wX s m\L[鷥(K@>%+*7~4(p +:ǟZ) Yf:4*"T\ 7\;n5U¼[I5+OKA$e DMPt+3h*qY,Ù)G]AdґЍ1kpyK:tRCo^724`RX#@E0uY- Q 9|3V-/$M… Q21(C!##A88p.aR VaU=-)0 G8Zo@U֢V 4Lr3dƳ[&b:`])0,YPPO& >:C8ZL=r#BV飁)ςGyZhv?"`/1-G򡻐o,]'4 )2j&)ٰ50a)6AIܭz=I ^bӋ9U,RY m'*%ag5_ƔS/wE|`qj,9BB:e\Fv g*J' ɼ+)g(#&e|MHM Ԁ(>uOM9Sqx rDrneh0 YZMN&M!!*ǀXή֊K1DCRXzۮ*%w$6Id4L6ڗC̛eD@GTB>R<u^fCyљ F˭L0Dj<ڲ L+2- " !FބI$Hv3,'T9WI2&#X$fNO B77cK> C`!atpFnG`}@{$TVGM t#+DÒDnZGEsmngeZϰ;b:@]c !XBq'xIL< y&ۑ(yv+2W 5r3PXnh`e"{p% ~+| H5O;WډȀӍ0zQw )%ccg`(RߙqMI%gQ2Tb;yOȂ!LSa*% rcCʅvd A,(I&(<miwBH_%f+[ 0'BPh|0Z#`ʚ EUiqyP2d; ucߤA`J#F9V^b"WQPdY$hT?eM>_hVT+z|h`u![8RcbQPH܆۶f,(#RS?|6abD ғ%Ga]OQ`$LClMDKCgh=em̽ Lz7۫ r&ǛLv{e,L3 Lb|RfVؐ2bdT `W`>fm1'pFQ}\sAIT0v'-9Y, J/sc1Ei~)3hKzX^0Xmں@;3Wq4u\Rx&Viq;#\̯ ) PN{ 9}A tqcl/F+W*B%Ɋўl"ndǰ9D,I N H+P˲jNIܯ("$H %rɝ";'c @a#Ȑs{ XɊT3kdXapb" zYbKZ(\*@DCev]ȪXKX";M 7NTy4a(+/~DZ5J~X[<:)@ aZ{^Qڣ^>Pu/֚zV -*ӣц{ DCEUswss72/呌ŨkF$H0J@ADDP>|ww;!E=Dlpf8~k[u w%AD#|88(oN%R=lIKOx`,x=2bkc{_Ѵ߆ pAJm!A 5ƒݖHicDPľzX+$ #^J!hͯz"Gӄ^hB@Go*?qt@;wCMXCI!y+q_ϔͮY <\z6Ʉ>=ʩCJ15^"xQO)zՑ*(f1qb;FcFZ'ٕؽ&,||?ԞBoGMo!fN,+*klE825}zDbqlrw֪p .m$r+qlwQSdT14?jE_6Vz uDDݒ0Ү*ޡ3qHAXdC_M\"t@&gE+, j$Ϊ<\hӆu=ݪGwvTT oAGzT|5$GKT3hZCI~4mQjBHwՕ/LtEB׺n4`4/Myk$E!K~<5QRƾYo[F5aۺ7-savHS5jpze0<=8NNX1uќw)7~e_;ݝx]"2sTb"R 3Z5TÞ47Mu\#Pե1 ;y H3J2Z񽐢 9Oj}GZT^7*Tf5płTUց]NAMڷx(k{` ΜR6(@>`؋)D*r*UbR(8TQc ߉9a҆XkP0RR׸ilَB ,RuA0{%?ls~a5Nw~Ce%1nΓ&D WtH_LDz %B@Au.G鈋8lzMbPY; /sQ]hs!W6R+&j #Ҩc:_D K䩞klg^bx*KM祍g?#]N\6ޡQmDLF2Cq.Xx2 3R*`?ڌ&]X#j5JMdyTz/?玲,|)p7q)?W>2vpjθf৿4Z ?ˬGdҤsm0FAYZi"V!>pY\>bV);tBikBp׼#Qa/[5V)n2 2u'fSUr~3 e/Hh&>Ou{{⧚"(K]!InA,>\Ƙ ^/`-JX)}pq$[ 4i?R 7o敍H‘kw:R 049C8 c}ی83=14S)e:? vuu}cuR0{s\ jrM/GnM AހlU[x&Zy,>h ܍.8ءݩZ#நZ =fG2&)suѽ)f͉qV_3bɌrtOyf/tB$yz)Z@7|u8e*>Ikc)&xd8sF[òձw ̇DI硢B(7kѴMGfڋdauT^DQl\yHuW]7O?dqv 0Ǯя^{-a)ɠ4ziTQ+z+|6ހ:J%.b1pE1- 3yX\+}ǩ-1-Bb+~n! If #IωseU+9Z a>B.%%gug4i\A@HV`?nPe:JyzBNy J  uBWַk0H: dÕ{ԐsјڭH`1k"{R\\K_ݕMre~S=x[Wa]˱ԓl;bqyZh>['IiU^d+%Ҩ"( FeTNt2z8sm ak$ :Ozp"5s)E[FK#ըve V`-ђi:Yv1{R.܊YYKB(UzɖVFV>e}P fd(}ߎywu{GΗyԤחTQmM^m }2eGh+V%^dϷ:۰W]:wUd2]'SW's?RO6Y`T.‹vþWr&MtǠ>W2ad~9S376"8Kh<ݝ\]U55hv rd` H+Qbw6%/be*?Y-/2"`]IRWDbC{ܰ}1w]ޅ u w}c*&hm +I&y 4o y1MͣŹ[q4+J8圧ѓW :/s[+fu7݇Fnj63u[*EL|..맑k wb,?K_dߨ{>Ld˜ W' mYbyaѲ8rƳ&|m 85⢽0/g)ZuU'`2GQ{gfUGu2{盓jl,/=Ӌ3@ݘ[Yxas݇sv3WA;Äu\mU{&T{]Da q$ .6V-mN`okn]س;thݞu!Ns`-j;ojn^Q^v PMw6v{h^V,n!i][(KNy>!y2P{Cs7szJR涕AZ' 0_Z fɈ0Y'4anp*q^9⨊ I9R_Ѐ߈Tߝw:|(v:\ CxJ8@hA:sNÓHܰY ` Ct@:S,A;jyk5ԦxU>Wő Pl(2dNҚd[ժlI:SNWʣtDs')ߨJ{!֣n_WSdp m΅"my<:#o̬[֛K>xH[v|-Oi</p(QV'8|m rZo?sGb?CA($9I^H FiÅhɏQjǘY(/:W@u_daL+)[ZlIIpεH<.;U> {-J}R剕 ޺3yNy6F-[bL-~=}~6-||>z{52n~u0װݤ$mgEjxY;tL喛:8r;awlA]R ;Cf.j޵c׍%0_ E aZ\dmƍt'丩'pnn]PO(u?S4TeEi :3R;SĘueKvW˨QS _ti7)0.:+(z[R"1 cc\GBՆ x {fgeb1ۡ^+a.1hC"|afBe2 '䡰qÎa s;q\ɠS/Z偝5,W'SgBwաBlC3Bݼ 0ܻLIݣYN0Zϙܵ=^)q@3ټp #͕3 ~1~{x2cmfQ0 !3Rm%HˎP/k'uO1ba rzt'_)ml [>oq~9oϮwH@4 iH@4 i H@db4o-8.0.184.15484+dfsg/doc/reference/0000755000175000017500000000000011621751575017364 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/0000755000175000017500000000000011520622606021533 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/0000755000175000017500000000000011520622616022643 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/0000755000175000017500000000000011520622610024247 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/SkinSupport/0000755000175000017500000000000011520622612026552 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/SkinSupport/MadCapBodyEnd.js0000644000175000017500000000677011520622612031514 0ustar directhexdirecthex// {{MadCap}} ////////////////////////////////////////////////////////////////// // Copyright: MadCap Software, Inc - www.madcapsoftware.com //////////////////// //////////////////////////////////////////////////////////////////////////////// // 5.0.1.0 //////////////////////////////////////////////////////////////////////////////// function FMCCheckForBookmarkInternal( a ) { var hrefPrefix = FMCGetHref( document.location ); var href = FMCEscapeHref( a.href ); if ( href.substring( 0, hrefPrefix.length ) != hrefPrefix ) { return; } var hash = a.href.substring( a.href.lastIndexOf( "#" ) + 1 ); var bookmark = null; for ( var i = 0; i < document.anchors.length; i++ ) { var currAnchor = document.anchors[i]; if ( currAnchor.name == hash ) { bookmark = currAnchor; break; } } if ( bookmark && typeof( FMCUnhide ) == "function" ) { FMCUnhide( window, bookmark ); } } function FMCClickHandler( e ) { var target = null; if ( !e ) { e = window.event; } if ( e.srcElement ) { target = e.srcElement; } else if ( e.target ) { target = e.target; } (target.nodeName == "A") ? FMCCheckForBookmarkInternal( target ) : false; // if ( typeof( gJustPopped ) == "undefined" ) { return; } if ( !gJustPopped && gPopupObj && gPopupObj.style.display != "none" ) { if ( typeof( FMCContainsClassRoot ) == "function" && FMCContainsClassRoot( gPopupObj.className, "MCKLinkBody" ) ) { gPopupObj.parentNode.removeChild( gPopupObj ); gPopupBGObj.parentNode.removeChild( gPopupBGObj ); } else { if ( gImgNode && typeof( FMCImageSwap ) == "function" ) { FMCImageSwap( gImgNode, "swap" ); gImgNode = null; } // Reset fading if ( gPopupObj.filters ) { gPopupObj.style.filter = "alpha( opacity = 0 )"; if ( gPopupBGObj != null ) { gPopupBGObj.style.filter = "alpha( opacity = 0 )"; } } else if ( gPopupObj.style.MozOpacity != null ) { gPopupObj.style.MozOpacity = "0.0"; if ( gPopupBGObj != null ) { gPopupBGObj.style.MozOpacity = "0.0"; } } // gPopupObj.style.display = "none"; if ( gPopupBGObj != null ) { gPopupBGObj.parentNode.removeChild( gPopupBGObj ); } } if ( gFadeID != 0 ) { clearInterval( gFadeID ); } gPopupObj = null; gPopupBGObj = null; gFadeID = 0; if ( gTextPopupBody ) { gTextPopupBody = null; gTextPopupBodyBG = null; window.onresize = null; } } gJustPopped = false; } var gDocumentOnclickFunction = document.onclick; var gDocumentOnclickFuncs = new Array(); document.onclick = function( e ) { gDocumentOnclickFunction ? gDocumentOnclickFunction() : false; for ( var i = 0; i < gDocumentOnclickFuncs.length; i++ ) { gDocumentOnclickFuncs[i]( e ); } }; gDocumentOnclickFuncs.push( FMCClickHandler ); db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/SkinSupport/MadCap.css0000644000175000017500000000776611520622610030427 0ustar directhexdirecthex/**/ /* // {{MadCap}} ////////////////////////////////////////////////////////////////// // Copyright: MadCap Software, Inc - www.madcapsoftware.com //////////////////// //////////////////////////////////////////////////////////////////////////////// // 5.0.1.0 //////////////////////////////////////////////////////////////////////////////// */ .MCDropDown { } .MCDropDownHead { } .MCDropDownHotSpot { } .MCDropDownBody { } .MCDropDownIcon { border: none; } .MCExpanding { } .MCExpandingHead { } .MCExpandingBody { } .MCExpandingIcon { border: none; } .MCKLink { } .MCKLinkSpot { } .MCKLinkBody { background-color: #bbccdd; border: solid 1px #000000; margin: 0px; padding: 0px; position: absolute; cursor: pointer; cursor: hand; filter: alpha( opacity = 100 ); -moz-opacity: 1.0; z-index: 2; } .MCKLinkBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 100 ); -moz-opacity: 1.0; z-index: 1; } .MCKLinkBodyCell_Highlighted { padding: 5px; background-color: Blue; color: White; } .MCKLinkBodyCell { padding: 5px; background-color: Transparent; color: Black; } .MCKeywordLinkIcon { border: none; } .MCConceptLinkIcon { border: none; } .MCRelatedTopicsIcon { border: none; } .MCPopup { } .MCPopupSpot { } .MCPopupBody { background-color: #ffffff; border: solid 1px #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } .MCPopupBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } .MCTextPopup { } .MCTextPopupSpot { } .MCTextPopupBody { background-color: #bbccdd; border: solid 1px #000000; margin: 0px; padding: 5px; position: absolute; overflow: auto; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } .MCTextPopupBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } .MCPopupThumbnail { border: none; } .MCPopupThumbnail_Popup { border: solid 1px Gray; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 102; } .MCToggler { } .MCTogglerIcon { border: none; } div.MCDialogWrapper { width: 400px; position: fixed; z-index: 110; } div.MCDialog { width: 400px; position: absolute; padding: 10px; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } div.MCDialogShadow { width: 400px; position: absolute; padding: 10px; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } div.MCDialog table.MCDialogOuterTable { width: 100%; margin: 0px; padding: 0px; border: none; border-collapse: collapse; table-layout: fixed; } div.MCDialog table.MCDialogOuterTable td.Label { vertical-align: top; } endnotesBlock { display: block; } endnoteBlock { display: block; } footnotesBlock { display: block; } footnoteBlock { display: block; } a.MCXref { text-decoration: underline; color: #800000; } a.MCXref:link { text-decoration: underline; color: #800000; } a.MCXref:visited { text-decoration: underline; color: #800000; } a.MCXref:hover { } a.MCXref:focus { } a.a_0 { color: #0000EE; } a.a_0:link { text-decoration: underline; color: #800000; } a.a_0:visited { color: #551A8B; text-decoration: underline; } a.a_0:hover { color: #4444EE; cursor: hand; text-decoration: underline; } a.a_0:focus { outline: thin dotted invert; } div.MCBreadcrumbsBox { margin-bottom: 10px; padding-bottom: 10px; border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; } db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/SkinSupport/MadCapAll.js0000644000175000017500000142316611520622606030706 0ustar directhexdirecthex var gHelpSystem=null; function FMCGetHelpSystem(){ if(!gHelpSystem){ var pathToHelpSystem=FMCGetAttribute(document.documentElement,"MadCap:PathToHelpSystem"); if(pathToHelpSystem==null){ pathToHelpSystem="";} var hsFileName=FMCGetAttribute(document.documentElement,"MadCap:HelpSystemFileName"); var currentFolder=new CMCUrl(FMCEscapeHref(document.location.href)).ToFolder(); var absPathToHS=currentFolder.CombinePath(pathToHelpSystem); var hsUrl=absPathToHS.AddFile(hsFileName); gHelpSystem=new CMCHelpSystem(null,absPathToHS.FullPath,hsUrl.FullPath,null,null);} return gHelpSystem;} function CMCHelpSystem(parentSubsystem,parentPath,xmlFile,tocPath,browseSequencePath){ var mSelf=this; var mParentSubsystem=parentSubsystem; var mPath=parentPath; var mXmlFile=xmlFile; var mSubsystems=new Array(); var mTocPath=tocPath; var mBrowseSequencePath=browseSequencePath; var mConceptMap=null; var mViewedConceptMap=new CMCDictionary(); var mExists=false; var mAliasFile=new CMCAliasFile(parentPath+"Data/Alias.xml",this); var mTocFile=new CMCTocFile(this,EMCTocType.Toc); var mBrowseSequenceFile=new CMCTocFile(this,EMCTocType.BrowseSequence); this.TargetType=null; this.SkinFolder=null; this.SkinTemplateFolder=null; this.DefaultStartTopic=null; this.InPreviewMode=null; this.LiveHelpOutputId=null; this.LiveHelpServer=null; this.LiveHelpEnabled=false; this.IsWebHelpPlus=false; this.ContentFolder=null; this.UseCustomTopicFileExtension=false; this.CustomTopicFileExtension=null; this.PreloadImages=false; this.GlossaryUrl=null;(function(){ var xmlDoc=CMCXmlParser.GetXmlDoc(xmlFile,false,null,null); mExists=xmlDoc!=null; if(!mExists){ return;} if(xmlDoc.getElementsByTagName("Subsystems").length>0){ var urlNodes=xmlDoc.getElementsByTagName("Subsystems")[0].getElementsByTagName("Url"); for(var i=0;i0);}; this.GetConceptsLinks=function(conceptTerms,callbackFunc,callbackArgs){ if(this.IsWebHelpPlus){ function OnGetTopicsForConceptsComplete(xmlDoc,args){ var links=new Array(); var nodes=xmlDoc.documentElement.getElementsByTagName("Url"); var nodeLength=nodes.length; for(var i=0;i0){ var attributesClone=head.cloneNode(false).attributes; for(var i=0;iterm2){ if(typeof(xmlDoc1.importNode)=="function"){ entries.appendChild(xmlDoc1.importNode(currIndexEntry2,true));} else{ entries.appendChild(currIndexEntry2.cloneNode(true));} j++;} else{ entries.appendChild(currIndexEntry1.cloneNode(true)); i++;}} for(;iterm2.toLowerCase()){ var newGlossaryPageEntry=null; if(typeof(xmlDoc1.importNode)=="function"){ newGlossaryPageEntry=xmlDoc1.importNode(currGlossaryPageEntry2,true);} else{ newGlossaryPageEntry=currGlossaryPageEntry2.cloneNode(true);} ConvertGlossaryPageEntryToAbsolute(newGlossaryPageEntry,subPath); body.appendChild(newGlossaryPageEntry) j++;} else{ body.appendChild(currGlossaryPageEntry1.cloneNode(true)); i++;}} for(;i0){ var lastStep=steps[steps.length-1]; if(lastStep.StartsWith("$$$$$")){ linkNodeIndex=parseInt(lastStep.substring("$$$$$".length)); steps.splice(steps.length-1,1);}} var tocNode=mXmlDoc.documentElement; for(var i=0,length=steps.length;i=0){ if(linkNodeIndex==0){ foundNode=tocNode;} else{ foundNode=FMCGetChildNodeByTagName(tocNode,"TocEntry",linkNodeIndex-1);}} else{ var ownerHelpSystem=GetOwnerHelpSystem(tocNode); var relHref=href.ToRelative(new CMCUrl(ownerHelpSystem.GetPath())); var foundNode=FindLink(tocNode,relHref.FullPath.toLowerCase(),true); if(!foundNode){ foundNode=FindLink(tocNode,relHref.PlainPath.toLowerCase(),false);}} mTocPath=null; mTocHref=null; onCompleteFunc(foundNode);} function CheckChunk(tocNode){ var chunk=FMCGetAttribute(tocNode,"Chunk"); if(chunk!=null){ mSelf.LoadChunk(tocNode,chunk, function(tocNode){ mSelf.GetTocNode(mTocPath,mTocHref,onCompleteFunc)}); return true;} return false;} function CheckMerge(tocNode){ var mergeHint=FMCGetAttributeInt(tocNode,"MergeHint",-1); if(mergeHint>=0){ mSelf.LoadMerge(tocNode, function(tocNode){ mSelf.GetTocNode(mTocPath,mTocHref,onCompleteFunc)}); return true;} return false;}}; this.GetEntrySequenceIndex=function(tocPath,href,onCompleteFunc){ this.GetTocNode(tocPath,href,OnCompleteGetTocNode); function OnCompleteGetTocNode(tocNode){ var sequenceIndex=-1; if(tocNode!=null){ sequenceIndex=ComputeEntrySequenceIndex(tocNode);} onCompleteFunc(sequenceIndex);}}; this.GetIndexTotalForEntry=function(tocPath,href,onCompleteFunc){ this.GetTocNode(tocPath,href,OnCompleteGetTocNode); function OnCompleteGetTocNode(tocNode){ var total=-1; if(tocNode!=null){ var currNode=tocNode; while(currNode.parentNode!=mXmlDoc.documentElement){ currNode=currNode.parentNode;} total=FMCGetAttributeInt(currNode,"DescendantCount",-1);} onCompleteFunc(total);}}; function InitOnComplete(){ for(var i=0,length=mInitOnCompleteFuncs.length;i=0){ mSelf.LoadMerge(tocNode,OnCompleteFunc); return true;} return false;}} function GetDeepestChild(tocNode,nodeName){ var node=FMCGetLastChildNodeByTagName(tocNode,nodeName); if(node!=null){ var nodeChild=GetDeepestChild(node,nodeName); if(nodeChild!=null){ return nodeChild;} return node;} return null;} function GetOwnerHelpSystem(tocNode){ var ownerHelpSystem=null; var currNode=tocNode; while(true){ if(currNode==currNode.ownerDocument.documentElement){ ownerHelpSystem=mHelpSystem; break;} var ownerHelpSystemIndex=FMCGetAttributeInt(currNode,"ownerHelpSystemIndex",-1); if(ownerHelpSystemIndex>=0){ ownerHelpSystem=mOwnerHelpSystems[ownerHelpSystemIndex]; break;} currNode=currNode.parentNode;} return ownerHelpSystem;} function GetTocPath(tocNode){ var tocPath=""; var linkNodeIndex=-1; var childNode=FMCGetChildNodeByTagName(tocNode,"TocEntry",0); if(childNode!=null){ tocPath=FMCGetAttribute(tocNode,"Title"); linkNodeIndex=0;} else{ linkNodeIndex=FMCGetChildIndex(tocNode)+1;} if(tocPath.length>0){ tocPath+="|";} tocPath+=("$$$$$"+linkNodeIndex); for(var currNode=tocNode.parentNode;currNode!=null&&currNode.parentNode.nodeType==1;currNode=currNode.parentNode){ if(tocPath==null){ tocPath="";} if(tocPath.length>0){ tocPath="|"+tocPath;} tocPath=FMCGetAttribute(currNode,"Title")+tocPath;} return tocPath;} function ComputeEntrySequenceIndex(tocNode){ if(tocNode.parentNode==tocNode.ownerDocument.documentElement){ return 0;} var sequenceIndex=0; var link=FMCGetAttribute(tocNode,"Link"); if(link!=null){ sequenceIndex++;} for(var currNode=tocNode.previousSibling;currNode!=null;currNode=currNode.previousSibling){ if(currNode.nodeType!=1){continue;} var descendantCount=FMCGetAttributeInt(currNode,"DescendantCount",0); sequenceIndex+=descendantCount; var link=FMCGetAttribute(currNode,"Link"); if(link!=null){ var linkUrl=new CMCUrl(link); var ext=linkUrl.Extension.toLowerCase(); if(ext=="htm"||ext=="html"){ sequenceIndex++;}}} return sequenceIndex+ComputeEntrySequenceIndex(tocNode.parentNode);}}  function CMCAliasFile(xmlFile,helpSystem){ var mXmlDoc=null; var mHelpSystem=helpSystem; var mNameMap=null; var mIDMap=null;(function(){ mXmlDoc=CMCXmlParser.GetXmlDoc(xmlFile,false,null,null);})(); this.GetIDs=function(){ var ids=new Array(); AssureInitializedMap(); mIDMap.ForEach(function(key,value){ ids[ids.length]=key; return true;}); return ids;}; this.GetNames=function(){ var names=new Array(); AssureInitializedMap(); mNameMap.ForEach(function(key,value){ names[names.length]=key; return true;}); return names;}; this.LookupID=function(id){ var found=false; var topic=null; var skin=null; if(id){ if(typeof(id)=="string"&&id.indexOf(".")!=-1){ var pipePos=id.indexOf("|"); if(pipePos!=-1){ topic=id.substring(0,pipePos); skin=id.substring(pipePos+1);} else{ topic=id;}} else{ var mapInfo=GetFromMap(id); if(mapInfo!=null){ found=true; topic=mapInfo.Topic; skin=mapInfo.Skin;}}} else{ found=true;} if(!skin){ if(mXmlDoc){ skin=mXmlDoc.documentElement.getAttribute("DefaultSkinName");}} if(topic){ topic=mHelpSystem.ContentFolder+topic;} return{Found:found,Topic:topic,Skin:skin};}; function GetFromMap(id){ var mapInfo=null; AssureInitializedMap(); if(mNameMap!=null){ if(typeof(id)=="string"){ mapInfo=mNameMap.GetItem(id); if(mapInfo==null){ mapInfo=mIDMap.GetItem(id);}} else if(typeof(id)=="number"){ mapInfo=mIDMap.GetItem(id.toString());}} return mapInfo;} function AssureInitializedMap(){ if(mNameMap==null){ if(mXmlDoc){ mNameMap=new CMCDictionary(); mIDMap=new CMCDictionary(); var maps=mXmlDoc.documentElement.getElementsByTagName("Map"); for(var i=0;i=0&&str.charAt(i)==" ";i--); return str.substring(0,i+1);} function FMCContainsClassRoot(className){ var ret=null; for(var i=1;iwinNode.innerHeight){ clientWidth-=19;}} else if(FMCIsQuirksMode(winNode)){ clientWidth=winNode.document.body.clientWidth;} else if(winNode.document.documentElement){ clientWidth=winNode.document.documentElement.clientWidth;} return clientWidth;} function FMCGetClientHeight(winNode,includeScrollbars){ var clientHeight=null; if(typeof(winNode.innerHeight)!="undefined"){ clientHeight=winNode.innerHeight; if(!includeScrollbars&&FMCGetScrollWidth(winNode)>winNode.innerWidth){ clientHeight-=19;}} else if(FMCIsQuirksMode(winNode)){ clientHeight=winNode.document.body.clientHeight;} else if(winNode.document.documentElement){ clientHeight=winNode.document.documentElement.clientHeight;} return clientHeight;} function FMCGetClientCenter(winNode){ var centerX=FMCGetScrollLeft(winNode)+(FMCGetClientWidth(winNode,false)/2); var centerY=FMCGetScrollTop(winNode)+(FMCGetClientHeight(winNode,false)/2); return[centerX,centerY];} function FMCGetScrollHeight(winNode){ var scrollHeight=null; if(winNode.document.scrollHeight){ scrollHeight=winNode.document.scrollHeight;} else if(FMCIsQuirksMode(winNode)){ scrollHeight=winNode.document.body.scrollHeight;} else if(winNode.document.documentElement){ scrollHeight=winNode.document.documentElement.scrollHeight;} return scrollHeight;} function FMCGetScrollWidth(winNode){ var scrollWidth=null; if(winNode.document.scrollWidth){ scrollWidth=winNode.document.scrollWidth;} else if(FMCIsQuirksMode(winNode)){ scrollWidth=winNode.document.body.scrollWidth;} else if(winNode.document.documentElement){ scrollWidth=winNode.document.documentElement.scrollWidth;} return scrollWidth;} function FMCGetScrollTop(winNode){ var scrollTop=null; if(FMCIsSafari()){ scrollTop=winNode.document.body.scrollTop;} else if(FMCIsQuirksMode(winNode)){ scrollTop=winNode.document.body.scrollTop;} else if(winNode.document.documentElement){ scrollTop=winNode.document.documentElement.scrollTop;} return scrollTop;} function FMCSetScrollTop(winNode,value){ if(FMCIsSafari()){ winNode.document.body.scrollTop=value;} else if(FMCIsQuirksMode(winNode)){ winNode.document.body.scrollTop=value;} else if(winNode.document.documentElement){ winNode.document.documentElement.scrollTop=value;}} function FMCGetScrollLeft(winNode){ var scrollLeft=null; if(FMCIsSafari()){ scrollLeft=winNode.document.body.scrollLeft;} else if(FMCIsQuirksMode(winNode)){ scrollLeft=winNode.document.body.scrollLeft;} else if(winNode.document.documentElement){ scrollLeft=winNode.document.documentElement.scrollLeft;} return scrollLeft;} function FMCSetScrollLeft(winNode,value){ if(FMCIsSafari()){ winNode.document.body.scrollLeft=value;} else if(FMCIsQuirksMode(winNode)){ winNode.document.body.scrollLeft=value;} else if(winNode.document.documentElement){ winNode.document.documentElement.scrollLeft=value;}} function FMCGetClientX(winNode,e){ var clientX; if(typeof(e.pageX)!="undefined"){ clientX=e.pageX-FMCGetScrollLeft(winNode);} else if(typeof(e.clientX)!="undefined"){ clientX=e.clientX;} return clientX;} function FMCGetClientY(winNode,e){ var clientY; if(typeof(e.pageY)!="undefined"){ clientY=e.pageY-FMCGetScrollTop(winNode);} else if(typeof(e.clientY)!="undefined"){ clientY=e.clientY;} return clientY;} function FMCGetPageX(winNode,e){ var pageX; if(typeof(e.pageX)!="undefined"){ pageX=e.pageX;} else if(typeof(e.clientX)!="undefined"){ pageX=e.clientX+FMCGetScrollLeft(winNode);} return pageX;} function FMCGetPageY(winNode,e){ var pageY; if(typeof(e.pageY)!="undefined"){ pageY=e.pageY;} else if(typeof(e.clientY)!="undefined"){ pageY=e.clientY+FMCGetScrollTop(winNode);} return pageY;} function FMCGetMouseXRelativeTo(winNode,e,el){ var mouseX=FMCGetPageX(winNode,e,el); var elX=FMCGetPosition(el)[1]; var x=mouseX-elX; return x;} function FMCGetMouseYRelativeTo(winNode,e,el){ var mouseY=FMCGetPageY(winNode,e,el); var elY=FMCGetPosition(el)[0]; var y=mouseY-elY; return y;} function FMCGetPosition(node){ var topPos=0; var leftPos=0; if(node.offsetParent){ topPos=node.offsetTop; leftPos=node.offsetLeft; while(node=node.offsetParent){ topPos+=node.offsetTop; leftPos+=node.offsetLeft;}} return[topPos,leftPos];} function FMCScrollToVisible(win,node){ var offset=0; if(typeof(window.innerWidth)!="undefined"&&!FMCIsSafari()){ offset=19;} var scrollTop=FMCGetScrollTop(win); var scrollBottom=scrollTop+FMCGetClientHeight(win,false)-offset; var scrollLeft=FMCGetScrollLeft(win); var scrollRight=scrollLeft+FMCGetClientWidth(win,false)-offset; var nodePos=FMCGetPosition(node); var nodeTop=nodePos[0]; var nodeLeft=parseInt(node.style.textIndent)+nodePos[1]; var nodeHeight=node.offsetHeight; var nodeWidth=node.getElementsByTagName("a")[0].offsetWidth; if(nodeTopscrollBottom){ FMCSetScrollTop(win,Math.min(nodeTop,nodeTop+nodeHeight-FMCGetClientHeight(win,false)+offset));} if(nodeLeftscrollRight){ FMCSetScrollLeft(win,Math.min(nodeLeft,nodeLeft+nodeWidth-FMCGetClientWidth(win,false)+offset));}} function FMCIsQuirksMode(winNode){ return FMCIsIE55()||(winNode.document.compatMode&&winNode.document.compatMode=="BackCompat");} function FMCGetComputedStyle(node,style){ var value=null; if(node.currentStyle){ value=node.currentStyle[style];} else if(document.defaultView&&document.defaultView.getComputedStyle){ var computedStyle=document.defaultView.getComputedStyle(node,null); if(computedStyle){ value=computedStyle[style];}} return value;} function FMCConvertToPx(doc,str,dimension,defaultValue){ if(!str||str.charAt(0)=="-"){ return defaultValue;} if(str.charAt(str.length-1)=="\%"){ switch(dimension){ case "Width": return parseInt(str)*screen.width/100; break; case "Height": return parseInt(str)*screen.height/100; break;}} else{ if(parseInt(str).toString()==str){ str+="px";}} try{ var div=doc.createElement("div");} catch(err){ return defaultValue;} doc.body.appendChild(div); var value=defaultValue; try{ div.style.width=str; if(div.currentStyle){ value=div.offsetWidth;} else if(document.defaultView&&document.defaultView.getComputedStyle){ value=parseInt(FMCGetComputedStyle(div,"width"));}} catch(err){} doc.body.removeChild(div); return value;} function FMCGetControl(el){ var value=null; if(el.type=="checkbox"){ value=el.checked;} else{ value=el.value;} return value;} function FMCGetOpacity(el){ var opacity=-1; if(el.filters){ opacity=parseInt(el.style.filter.substring(17,el.style.filter.length-2));} else if(el.style.MozOpacity!=null){ opacity=parseFloat(el.style.MozOpacity)*100;} return opacity;} function FMCSetOpacity(el,opacityPercent){ if(el.filters){ if(opacityPercent==100){ el.style.filter="";} else{ el.style.filter="alpha( opacity = "+opacityPercent+" )";}} else if(el.style.MozOpacity!=null){ el.style.MozOpacity=opacityPercent/100;}} function FMCToggleDisplay(el){ if(el.style.display=="none"){ el.style.display="";} else{ el.style.display="none";}} function FMCGetContainingIFrame(win){ var allIFrames=win.parent.document.getElementsByTagName("iframe"); for(var i=0,length=allIFrames.length;i0)?" ":"")+currPart);}} return newValue;} function FMCUnhide(win,node){ for(var currNode=node.parentNode;currNode.nodeName!="BODY";currNode=currNode.parentNode){ if(currNode.style.display=="none"){ var classRoot=FMCContainsClassRoot(currNode.className,"MCExpandingBody","MCDropDownBody","MCTextPopupBody"); if(classRoot=="MCExpandingBody"){ win.FMCExpand(currNode.parentNode.getElementsByTagName("a")[0]);} else if(classRoot=="MCDropDownBody"){ var dropDownBodyID=currNode.id.substring("MCDropDownBody".length+1,currNode.id.length); var aNodes=currNode.parentNode.getElementsByTagName("a"); for(var i=0;i1){ return;} if(fadeElement){ if(fadeElement.style.MozOpacity!=null){ fadeElement.style.MozOpacity="0.1";}} var span=win.document.createElement("span"); var img=win.document.createElement("img"); var midPointX=FMCGetScrollLeft(win)+FMCGetClientWidth(win,false)/2; var spacing=3; parentElement.appendChild(span); span.id="LoadingText"; span.appendChild(win.document.createTextNode(loadingLabel)); span.style.fontFamily="Tahoma, Sans-Serif"; span.style.fontSize="9px"; span.style.fontWeight="bold"; span.style.position="absolute"; span.style.left=(midPointX-(span.offsetWidth/2))+"px"; var rootFrame=FMCGetRootFrame(); img.id="LoadingImage"; img.src=rootFrame.gRootFolder+MCGlobals.SkinTemplateFolder+"Images/Loading.gif"; img.alt=loadingAltText; img.style.width="70px"; img.style.height="13px"; img.style.position="absolute"; img.style.left=(midPointX-(70/2))+"px"; var totalHeight=span.offsetHeight+spacing+parseInt(img.style.height); var spanTop=(FMCGetScrollTop(win)+(FMCGetClientHeight(win,false)-totalHeight))/2; span.style.top=spanTop+"px"; img.style.top=spanTop+span.offsetHeight+spacing+"px"; parentElement.appendChild(img);} function EndLoading(win,fadeElement){ win.MCLoadingCount--; if(win.MCLoadingCount>0){ return;} var span=win.document.getElementById("LoadingText"); var img=win.document.getElementById("LoadingImage"); span.parentNode.removeChild(span); img.parentNode.removeChild(img); if(fadeElement){ if(fadeElement.style.MozOpacity!=null){ fadeElement.style.MozOpacity="1.0";}}} var MCEventType=new Object(); MCEventType.OnLoad=0; MCEventType.OnInit=1; MCEventType.OnReady=2; function FMCRegisterCallback(frameName,eventType,CallbackFunc,callbackArgs){ function FMCCheckMCGlobalsInitialized(){ if(MCGlobals.Initialized){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckMCGlobalsInitialized,100);}} function FMCCheckRootReady(){ if(MCGlobals.RootFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRootReady,100);}} function FMCCheckRootLoaded(){ if(MCGlobals.RootFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRootLoaded,100);}} function FMCCheckTOCInitialized(){ if(MCGlobals.NavigationFrame.frames["toc"].gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTOCInitialized,100);}} function FMCCheckSearchInitialized(){ if(MCGlobals.NavigationFrame.frames["search"].gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckSearchInitialized,100);}} function FMCCheckTopicCommentsLoaded(){ if(MCGlobals.TopicCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTopicCommentsLoaded,100);}} function FMCCheckTopicCommentsInitialized(){ if(MCGlobals.TopicCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTopicCommentsInitialized,100);}} function FMCCheckRecentCommentsLoaded(){ if(MCGlobals.RecentCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRecentCommentsLoaded,100);}} function FMCCheckRecentCommentsInitialized(){ if(MCGlobals.RecentCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRecentCommentsInitialized,100);}} function FMCCheckBodyCommentsLoaded(){ if(MCGlobals.BodyCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyCommentsLoaded,100);}} function FMCCheckBodyCommentsInitialized(){ if(MCGlobals.BodyCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyCommentsInitialized,100);}} function FMCCheckToolbarInitialized(){ if(MCGlobals.ToolbarFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckToolbarInitialized,100);}} function FMCCheckNavigationReady(){ if(MCGlobals.NavigationFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckNavigationReady,100);}} function FMCCheckNavigationLoaded(){ if(MCGlobals.NavigationFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckNavigationLoaded,100);}} function FMCCheckBodyReady(){ if(typeof(MCGlobals.BodyFrame.gReady)=="undefined"||MCGlobals.BodyFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyReady,100);}} function FMCCheckBodyLoaded(){ if(MCGlobals.BodyFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyLoaded,100);}} function FMCCheckBodyInitialized(){ if(MCGlobals.BodyFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyInitialized,100);}} function FMCCheckPersistenceInitialized(){ if(MCGlobals.PersistenceFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckPersistenceInitialized,100);}} var func=null; if(frameName=="TOC"){ if(eventType==MCEventType.OnLoad){func=FMCCheckTOCLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckTOCInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckTOCReady;}} else if(frameName=="Toolbar"){ if(eventType==MCEventType.OnLoad){func=FMCCheckToolbarLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckToolbarInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckToolbarReady;}} else if(frameName=="BodyComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckBodyCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckBodyCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckBodyCommentsReady;}} else if(frameName=="TopicComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckTopicCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckTopicCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckTopicCommentsReady;}} else if(frameName=="RecentComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckRecentCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckRecentCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckRecentCommentsReady;}} else if(frameName=="Persistence"){ if(eventType==MCEventType.OnLoad){func=FMCCheckPersistenceLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckPersistenceInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckPersistenceReady;}} else if(frameName=="Search"){ if(eventType==MCEventType.OnLoad){func=FMCCheckSearchLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckSearchInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckSearchReady;}} else if(frameName=="MCGlobals"){ if(eventType==MCEventType.OnLoad){func=FMCCheckMCGlobalsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckMCGlobalsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckMCGlobalsReady;}} else if(frameName=="Navigation"){ if(eventType==MCEventType.OnLoad){func=FMCCheckNavigationLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckNavigationInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckNavigationReady;}} else if(frameName=="Body"){ if(eventType==MCEventType.OnLoad){func=FMCCheckBodyLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckBodyInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckBodyReady;}} else if(frameName=="Root"){ if(eventType==MCEventType.OnLoad){func=FMCCheckRootLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckRootInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckRootReady;}} window.setTimeout(func,100);} function FMCSortStringArray(stringArray){ stringArray.sort(FMCCompareStrings);} function FMCCompareStrings(a,b){ var ret; if(a.toLowerCase()b.toLowerCase()){ ret=1;} return ret;} function FMCSetCookie(name,value,days){ if(window.name!="bridge"){ if(window!=MCGlobals.NavigationFrame){ MCGlobals.NavigationFrame.FMCSetCookie(name,value,days); return;}} value=encodeURI(value); var expires=null; if(days){ var date=new Date(); date.setTime(date.getTime()+(1000*60*60*24*days)); expires="; expires="+date.toGMTString();} else{ expires="";} var cookieString=name+"="+value+expires+";"; document.cookie=cookieString;} function FMCReadCookie(name){ if(window.name!="bridge"){ if(window!=MCGlobals.NavigationFrame){ return MCGlobals.NavigationFrame.FMCReadCookie(name);}} var value=null; var nameEq=name+"="; var cookies=document.cookie.split(";"); for(var i=0;i"; var xmlDoc=CMCXmlParser.LoadXmlString(rootXml); return xmlDoc;} CMCXmlParser.GetOuterXml=function(xmlDoc){ var xml=null; if(window.ActiveXObject){ xml=xmlDoc.xml;} else if(window.XMLSerializer){ var serializer=new XMLSerializer(); xml=serializer.serializeToString(xmlDoc);} return xml;} CMCXmlParser.CallWebService=function(webServiceUrl,async,onCompleteFunc,onCompleteArgs){ var xmlParser=new CMCXmlParser(onCompleteArgs,onCompleteFunc); var xmlDoc=xmlParser.LoadRemote(webServiceUrl,async); return xmlDoc;} var CMCFlareStylesheet=new function(){ var mInitialized=false; var mXmlDoc=null; var mInitializedResources=false; var mResourceMap=null; function Init(){ mXmlDoc=FMCGetStylesheet(); mInitialized=true;} function InitializeResources(){ mInitializedResources=true; mResourceMap=new CMCDictionary(); var resourcesInfos=mXmlDoc.getElementsByTagName("ResourcesInfo"); if(resourcesInfos.length>0){ var resources=resourcesInfos[0].getElementsByTagName("Resource"); for(var i=0;i=0){ newStr=this.substring(0,startIndex);} else{ newStr=this;} newStr+=value; if(startIndex>=0){ newStr+=this.substring(startIndex);} return newStr;} String.prototype.Trim=function(){ return this.TrimLeft().TrimRight();} String.prototype.TrimLeft=function(){ var i=0; for(i=0;i=0&&this.charAt(i)==" ";i--); return this.substring(0,i+1);} Array.prototype.Contains=function(item){ for(var i=0,length=this.length;ithis.length){ throw "Index out of bounds.";} this.splice(index,0,item);} Array.prototype.Remove=function(index){ if(index<0||index>this.length){ throw "Index out of bounds.";} this.splice(index,1);} Array.prototype.RemoveValue=function(value){ for(var i=this.length-1;i>=0;i--){ if(this[i]==value){ this.Remove(i);}}} function CMCDictionary(){ this.mMap=new Object(); this.mOverflows=new Array(); this.mLength=0;} CMCDictionary.prototype.GetLength=function(key){ return this.mLength;}; CMCDictionary.prototype.ForEach=function(func){ var map=this.mMap; for(var key in map){ var value=map[key]; if(!func(key,value)){ return;}} var overflows=this.mOverflows; for(var i=0,length=overflows.length;i=0){ item=this.mOverflows[index].Value;}} else{ item=this.mMap[key]; if(typeof(item)=="undefined"){ item=null;}} return item;}; CMCDictionary.prototype.GetItemOverflowIndex=function(key){ var overflows=this.mOverflows; for(var i=0,length=overflows.length;i=0){ this.mOverflows.splice(index,1) this.mLength--;}} else{ if(this.mMap[key]!="undefined"){ delete(this.mMap[key]); this.mLength--;}}}; CMCDictionary.prototype.Add=function(key,value){ if(typeof(this.mMap[key])=="function"){ var item=this.GetItem(key); if(item!=null){ this.Remove(key);} this.mOverflows[this.mOverflows.length]={Key:key,Value:value};} else{ this.mMap[key]=value;} this.mLength++;}; CMCDictionary.prototype.AddUnique=function(key,value){ var savedValue=this.GetItem(key); if(typeof(savedValue)=="undefined"||!savedValue){ this.Add(key,value);}}; function CMCUrl(src){ var mSelf=this; this.FullPath=null; this.Path=null; this.PlainPath=null; this.Name=null; this.Extension=null; this.NameWithExtension=null; this.Fragment=null; this.Query=null; this.IsAbsolute=false;(function(){ var fragment=""; var query=""; var fragmentPos=src.indexOf("#"); var queryPos=src.indexOf("?"); if(fragmentPos!=-1){ if(fragmentPos>queryPos){ fragment=src.substring(fragmentPos);} else{ fragment=src.substring(fragmentPos,queryPos);}} if(queryPos!=-1){ if(queryPos>fragmentPos){ query=src.substring(queryPos);} else{ query=src.substring(queryPos,fragmentPos);}} var pos=Math.max(fragmentPos,queryPos); var plainPath=src.substring(0,pos==-1?src.length:pos); pos=plainPath.lastIndexOf("/"); var path=plainPath.substring(0,pos+1); var nameWithExt=plainPath.substring(pos+1); pos=nameWithExt.lastIndexOf("."); var name=nameWithExt.substring(0,pos); var ext=nameWithExt.substring(pos+1); var scheme=""; pos=src.indexOf(":"); if(pos>=0){ scheme=src.substring(0,pos);} mSelf.FullPath=src; mSelf.Path=path; mSelf.PlainPath=plainPath; mSelf.Name=name; mSelf.Extension=ext; mSelf.NameWithExtension=nameWithExt; mSelf.Scheme=scheme; mSelf.IsAbsolute=!String.IsNullOrEmpty(scheme); mSelf.Fragment=fragment; mSelf.Query=query;})();} CMCUrl.QueryMap=new CMCDictionary(); CMCUrl.HashMap=new CMCDictionary();(function(){ var search=document.location.search; if(!String.IsNullOrEmpty(search)){ search=search.substring(1); Parse(search,"&",CMCUrl.QueryMap);} var hash=document.location.hash; if(!String.IsNullOrEmpty(hash)){ hash=hash.substring(1); Parse(hash,"|",CMCUrl.HashMap);} function Parse(item,delimiter,map){ var split=item.split(delimiter); for(var i=0,length=split.length;i=0){ key=decodeURIComponent(part.substring(0,index)); value=decodeURIComponent(part.substring(index+1));} else{ key=part;} map.Add(key,value);}}})(); CMCUrl.prototype.AddFile=function(otherUrl){ if(typeof(otherUrl)=="string"){ otherUrl=new CMCUrl(otherUrl);} if(otherUrl.IsAbsolute){ return otherUrl;} var otherFullPath=otherUrl.FullPath; if(otherFullPath.charAt(0)=="/"){ var loc=document.location; var pos=loc.href.lastIndexOf(loc.pathname); var rootPath=loc.href.substring(0,pos); return new CMCUrl(rootPath+otherFullPath);} var fullPath=this.FullPath; if(!fullPath.EndsWith("/")){ fullPath=fullPath+"/";} return new CMCUrl(fullPath+otherFullPath);}; CMCUrl.prototype.CombinePath=function(otherUrl){ if(typeof(otherUrl)=="string"){ otherUrl=new CMCUrl(otherUrl);} if(otherUrl.IsAbsolute){ throw new CMCException(-1,"Cannot combine two absolute paths.");} var otherFullPath=otherUrl.FullPath; var fullPath=this.FullPath; var segments=otherUrl.FullPath.split("/"); var curr=this.FullPath; var prefix=""; if(this.Scheme=="mk"){ var pos=curr.indexOf("::"); prefix=curr.substring(0,pos+"::".length); curr=curr.substring(pos+"::".length);} for(var i=0,length=segments.length;i1&&curr.EndsWith("/")){ curr=curr.substring(0,curr.length-1);} if(seg=="."){ curr+="/";} else if(seg==".."){ curr=curr.substring(0,curr.lastIndexOf("/")+1);} else{ if(!curr.EndsWith("/")){ curr+="/";} curr+=seg;}} curr=prefix+curr; return new CMCUrl(curr);}; CMCUrl.prototype.ToQuery=function(query){ var newPath=this.PlainPath+"?"+query+this.Fragment; return new CMCUrl(newPath);}; CMCUrl.prototype.ToFolder=function(){ var fullPath=this.PlainPath; var pos=fullPath.lastIndexOf("/"); var newPath=fullPath.substring(0,pos+1); return new CMCUrl(newPath);}; CMCUrl.prototype.ToRelative=function(otherUrl){ var path=otherUrl.FullPath; var otherPath=this.FullPath; var pos=otherPath.indexOf(path); var relPath=null; if(pos==0){ relPath=otherPath.substring(path.length);} else{ relPath=otherPath;} return new CMCUrl(relPath);}; CMCUrl.prototype.ToExtension=function(newExt){ var path=this.FullPath; var pos=path.lastIndexOf("."); var left=path.substring(0,pos); var newPath=left+"."+newExt; return new CMCUrl(newPath);}; function FMCGetElementsByClassRoot(node,classRoot){ var nodes=new Array(); var args=new Array(); args[0]=nodes; args[1]=classRoot; FMCTraverseDOM("post",node,FMCGetByClassRoot,args); return nodes;} function FMCGetByClassRoot(node,args){ var nodes=args[0]; var classRoot=args[1]; if(node.nodeType==1&&FMCContainsClassRoot(node.className,classRoot)){ nodes[nodes.length]=node;}} function FMCGetElementsByAttribute(node,attribute,value){ var nodes=new Array(); var args=new Array(); args[0]=nodes; args[1]=attribute; args[2]=value; FMCTraverseDOM("post",node,FMCGetByAttribute,args); return nodes;} function FMCGetByAttribute(node,args){ var nodes=args[0]; var attribute=args[1]; var value=args[2]; try{ if(node.nodeType==1&&(FMCGetMCAttribute(node,attribute)==value||(value=="*"&&FMCGetMCAttribute(node,attribute)))){ nodes[nodes.length]=node;}} catch(err){ node.setAttribute(attribute,null);}} function FMCTraverseDOM(type,root,Func,args){ if(type=="pre"){ Func(root,args);} if(root.childNodes.length!=0){ for(var i=0;i=endOpacity){ clearInterval(interval); if(nodeBG!=null){ FMCSetOpacity(nodeBG,endOpacityBG);}}} interval=setInterval(DoFadeIn,10);};} var CMCDateTimeHelpers=new function(){ this.GetDateFromUTCString=function(utcString){ var ms=Date.parse(utcString); var date=new Date(ms); var utcMS=Date.UTC(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()); var utcDate=new Date(utcMS); return utcDate;}; this.ToUIString=function(date){ var dateStr=(date.getMonth()+1)+"/"+date.getDate()+"/"+date.getFullYear()+" "+date.toLocaleTimeString(); return dateStr;};} function CMCException(number,message){ this.Number=number; this.Message=message;} var MCGlobals=new function(){ var mSelf=this; var inPreviewMode=FMCGetAttributeBool(document.documentElement,"MadCap:InPreviewMode",false); if(inPreviewMode){ this.InPreviewMode=true; this.SkinFolder="Skin/"; this.SkinTemplateFolder="SkinTemplate/";} else{ var masterHS=FMCGetHelpSystem(); this.SubsystemFile=FMCGetAttribute(document.documentElement,"MadCap:HelpSystemFileName"); this.SkinFolder=masterHS.SkinFolder; this.SkinTemplateFolder=masterHS.SkinTemplateFolder; this.DefaultStartTopic=masterHS.DefaultStartTopic; this.InPreviewMode=masterHS.InPreviewMode;} this.Initialized=false; this.RootFolder=null; this.RootFrame=null; this.ToolbarFrame=null; this.BodyFrame=null; this.NavigationFrame=null; this.TopicCommentsFrame=null; this.RecentCommentsFrame=null; this.BodyCommentsFrame=null; this.PersistenceFrame=null; function InitRoot(){ mSelf.RootFrame=window; mSelf.ToolbarFrame=frames["mctoolbar"]; mSelf.BodyFrame=frames["body"]; mSelf.NavigationFrame=frames["navigation"]; mSelf.PersistenceFrame=null; var bodyReady=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}} function InitTopicCHM(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=frames["mctoolbar"]; mSelf.BodyFrame=window; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=frames["topiccomments"]; mSelf.PersistenceFrame=frames["persistence"]; mSelf.Initialized=true;} function InitNavigation(){ mSelf.RootFrame=parent; mSelf.NavigationFrame=window; mSelf.TopicCommentsFrame=frames["topiccomments"]; mSelf.RecentCommentsFrame=frames["recentcomments"]; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; var bodyReady=false; var rootLoaded=false; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ bodyReady=true; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; if(FMCIsWebHelpAIR()){ if(rootLoaded){ mSelf.Initialized=true;}} else{ mSelf.Initialized=true;}} if(FMCIsWebHelpAIR()){ FMCRegisterCallback("Root",MCEventType.OnLoad,OnRootLoaded,null); function OnRootLoaded(args){ rootLoaded=true; if(bodyReady){ mSelf.Initialized=true;}}}}} function InitNavigationFramesWebHelp(){ var bodyReady=false; mSelf.RootFrame=parent.parent; mSelf.NavigationFrame=parent; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(window.name=="search"&&FMCIsWebHelpAIR()){ if(window.parentSandboxBridge!=null){ mSelf.Initialized=true;}} else{ if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(window.name=="search"&&FMCIsWebHelpAIR()){ FMCRegisterCallback("Navigation",MCEventType.OnLoad,OnNavigationLoaded,null); function OnNavigationLoaded(args){ if(bodyReady){ mSelf.Initialized=true;}}} else{ if(bodyReady){ mSelf.Initialized=true;}}}} function InitBodyCommentsFrameWebHelp(){ var rootFrame=null; if(parent.parent.gRuntimeFileType=="Default"){ rootFrame=parent.parent;} mSelf.RootFrame=rootFrame; mSelf.NavigationFrame=parent.parent.frames["navigation"]; mSelf.PersistenceFrame=null; mSelf.ToolbarFrame=parent.parent.frames["mctoolbar"]; mSelf.BodyFrame=parent; mSelf.BodyCommentsFrame=window; if(mSelf.NavigationFrame==null){ mSelf.Initialized=true;} else{ function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; mSelf.Initialized=true;} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null);}} function InitBodyCommentsFrameDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=window; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitToolbarWebHelp(){ mSelf.RootFrame=parent; mSelf.ToolbarFrame=window; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var bodyReady=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} function InitToolbarWebHelpTopic(){ mSelf.RootFrame=parent.parent; mSelf.PersistenceFrame=null; mSelf.BodyFrame=parent; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var bodyReady=false; if(mSelf.NavigationFrame!=null){ function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null);} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} function InitToolbarCHM(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=window; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=mSelf.BodyFrame.frames["persistence"]; mSelf.Initialized=true;}} function InitTopicWebHelp(){ var rootFrame=null; if(parent.gRuntimeFileType=="Default"){ rootFrame=parent;} mSelf.RootFrame=rootFrame; mSelf.BodyFrame=window; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=null; if(mSelf.RootFrame==null){ mSelf.Initialized=true;} else{ function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var rootLoaded=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(FMCIsWebHelpAIR()){ if(rootLoaded){ mSelf.Initialized=true;}} else{ mSelf.Initialized=true;}} if(FMCIsWebHelpAIR()){ FMCRegisterCallback("Root",MCEventType.OnLoad,OnRootLoaded,null); function OnRootLoaded(args){ rootLoaded=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null);}} function InitTopicDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=window; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitGlossaryFrameDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=null; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=null; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitNavigationFramesCHM(){ mSelf.RootFrame=null; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.ToolbarFrame=mSelf.BodyFrame.frames["mctoolbar"]; mSelf.RecentCommentsFrame=mSelf.BodyFrame.frames["recentcomments"]; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=mSelf.BodyFrame.frames["persistence"]; mSelf.Initialized=true;}} this.Init=function(){ if(inPreviewMode){ mSelf.Initialized=true; return;} if(window.name=="bridge"){ mSelf.Initialized=true; return;} else if(gRuntimeFileType=="Default"||(gRuntimeFileType=="Topic"&&FMCIsHtmlHelp())){ mSelf.ToolbarFrame=frames["mctoolbar"]; if(frames["body"]!=null){ InitRoot();} else{ InitTopicCHM();}} else if(window.name=="navigation"){ InitNavigation();} else if(parent.name=="navigation"){ InitNavigationFramesWebHelp();} else if(window.name.StartsWith("mctoolbar")){ mSelf.ToolbarFrame=window; if(parent.frames["navigation"]!=null){ InitToolbarWebHelp();} else if(FMCIsWebHelp()){ InitToolbarWebHelpTopic();} else{ InitToolbarCHM();}} else if(window.name=="body"||gRuntimeFileType=="Topic"){ if(FMCIsWebHelp()){ InitTopicWebHelp();} else if(FMCIsDotNetHelp()){ InitTopicDotNetHelp();} else if(FMCIsHtmlHelp()){ InitTopicCHM();}} else if(window.name=="topiccomments"){ if(parent.gRuntimeFileType!="Topic"){ mSelf.Initialized=true; return;} if(FMCIsHtmlHelp()){ InitNavigationFramesCHM();} else if(FMCIsWebHelp()){ InitBodyCommentsFrameWebHelp();} else if(FMCIsDotNetHelp()){ InitBodyCommentsFrameDotNetHelp();}} else if(window.name=="glossary"&&FMCIsDotNetHelp()){ InitGlossaryFrameDotNetHelp();} else if(window.name=="toc"|| window.name=="index"|| window.name=="search"|| window.name=="glossary"|| window.name=="favorites"|| window.name=="browsesequences"|| window.name=="recentcomments"){ InitNavigationFramesCHM();} else if(FMCIsTopicPopup(window)){ var currFrame=window; while(true){ if(currFrame.frames["navigation"]!=null){ mSelf.RootFrame=currFrame; break;} if(currFrame.parent==currFrame){ break;} currFrame=currFrame.parent;} mSelf.Initialized=true;} else if(FMCIsDotNetHelp()){ mSelf.Initialized=true;} else{ mSelf.Initialized=true; return;} if(FMCIsWebHelp()){ if(mSelf.RootFrame==null){ return;} var rootFolder=new CMCUrl(mSelf.RootFrame.document.location.href).ToFolder(); var href=new CMCUrl(document.location.href); var subFolder=href.ToFolder().ToRelative(rootFolder); if(subFolder.FullPath.StartsWith("Subsystems",false)){ while(subFolder.FullPath.StartsWith("Subsystems",false)){ rootFolder=rootFolder.AddFile("Subsystems/"); subFolder=href.ToFolder().ToRelative(rootFolder); var projFolder=subFolder.FullPath.substring(0,subFolder.FullPath.indexOf("/")+1); rootFolder=rootFolder.AddFile(projFolder); subFolder=href.ToFolder().ToRelative(rootFolder);} var r=rootFolder.FullPath; r=r.replace(/\\/g,"/"); r=r.replace(/%20/g," "); r=r.replace(/;/g,"%3B"); mSelf.RootFolder=r;} else if(subFolder.FullPath.StartsWith("AutoMerge",false)){ while(subFolder.FullPath.StartsWith("AutoMerge",false)){ rootFolder=rootFolder.AddFile("AutoMerge/"); subFolder=href.ToFolder().ToRelative(rootFolder); var projFolder=subFolder.FullPath.substring(0,subFolder.FullPath.indexOf("/")+1); rootFolder=rootFolder.AddFile(projFolder); subFolder=href.ToFolder().ToRelative(rootFolder);} var r=rootFolder.FullPath; r=r.replace(/\\/g,"/"); r=r.replace(/%20/g," "); r=r.replace(/;/g,"%3B"); mSelf.RootFolder=r;} else{ mSelf.RootFolder=FMCGetRootFolder(mSelf.RootFrame.document.location);}} else if(FMCIsHtmlHelp()){ mSelf.RootFolder="/";} else if(FMCIsDotNetHelp()){ var loc=null; if(gRuntimeFileType=="Glossary"||gRuntimeFileType=="Toolbar"){ loc=window.document.location;} else{ loc=mSelf.BodyFrame.document.location;} var rootFolder=FMCGetRootFolder(loc); mSelf.RootFolder=rootFolder.substring(0,rootFolder.lastIndexOf("/",rootFolder.length-2)+1);}}}  function CMCDialog(winNode){ this.mRootEl=null; this.mIndex=-1; this.mOK=false; this.mOnCloseFunc=null; this.mOnCloseArgs=null; this.mWindow=winNode; this.StyleClass="Dialog";} CMCDialog.prototype.Run=function(onCloseFunc,onCloseArgs){ FMCInsertOpacitySheet(this.mWindow,"Gray"); CMCDialog.Dialogs.push(this); this.mIndex=CMCDialog.Dialogs.length-1; if(onCloseFunc){ this.mOnCloseFunc=onCloseFunc; this.mOnCloseArgs=onCloseArgs;} var wrapperDiv=this.mWindow.document.createElement("div"); this.RootEl=wrapperDiv; wrapperDiv.setAttribute("MadCap:dialogIndex",this.mIndex); wrapperDiv.id="MCDialog_"+this.mIndex; wrapperDiv.className="MCDialogWrapper"; wrapperDiv.style.display="none"; if(FMCIsQuirksMode(this.mWindow)){ wrapperDiv.style.position="absolute";} var dialogDiv=this.mWindow.document.createElement("div"); dialogDiv.className="MCDialog"; dialogDiv.innerHTML=this.InnerHtml; wrapperDiv.appendChild(dialogDiv); var titleDiv=this.mWindow.document.createElement("div"); titleDiv.id="MCDialogTitle"; titleDiv.appendChild(this.mWindow.document.createTextNode("")); dialogDiv.insertBefore(titleDiv,dialogDiv.firstChild); dialogDiv.insertBefore(this.mWindow.document.createElement("br"),titleDiv.nextSibling); this.mWindow.document.body.appendChild(wrapperDiv); var submitButton=document.getElementById("MCDialogSubmit"); submitButton.onclick=CMCDialog.OK; var cancelButton=document.getElementById("MCDialogCancel"); cancelButton.onclick=CMCDialog.Cancel; var shadowDiv=this.mWindow.document.createElement("div"); shadowDiv.id="MCDialog_DropShadow"; shadowDiv.className="MCDialogShadow"; wrapperDiv.appendChild(shadowDiv); this.Create(); this.LoadStyles(); wrapperDiv.style.display=""; shadowDiv.style.display=""; this.OnInitializing(); var height=dialogDiv.offsetHeight; if(!FMCIsQuirksMode(this.mWindow)||!this.mWindow.document.body.currentStyle){ height-=parseInt(FMCGetComputedStyle(dialogDiv,"borderTopWidth")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"borderBottomWidth")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"paddingTop")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"paddingBottom"));} shadowDiv.style.height=height+"px"; wrapperDiv.style.left=((FMCGetClientWidth(this.mWindow,false)/2)-200)+"px"; wrapperDiv.style.top=((FMCGetClientHeight(this.mWindow,false)/2)-200)+"px"; var shadowOpacity=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowOpacity",this.ShadowOpacity); MCFader.FadeIn(dialogDiv,0,100,shadowDiv,0,shadowOpacity,false);}; CMCDialog.prototype.Create=function(){}; CMCDialog.prototype.OnInitializing=function(){}; CMCDialog.prototype.LoadStyles=function(){ var titleNode=this.mWindow.document.getElementById("MCDialogTitle"); titleNode.firstChild.nodeValue=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleLabel",this.TitleLabel); titleNode.style.fontFamily=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontFamily",this.TitleFontFamily); titleNode.style.fontSize=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontSize",this.TitleFontSize); titleNode.style.fontWeight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontWeight",this.TitleFontWeight); titleNode.style.fontStyle=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontStyle",this.TitleFontStyle); titleNode.style.fontVariant=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontVariant",this.TitleFontVariant); titleNode.style.color=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleColor",this.TitleColor); var submitButton=this.mWindow.document.getElementById("MCDialogSubmit"); submitButton.value=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubmitButtonLabel",this.SubmitButtonLabel); var cancelButton=this.mWindow.document.getElementById("MCDialogCancel"); cancelButton.value=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CancelButtonLabel",this.CancelButtonLabel); var div=document.getElementById("MCDialog_"+this.mIndex).firstChild; this.SetLabelStyles(div); div.style.backgroundColor=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BackgroundColor",this.BackgroundColor); var borderLeft=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderLeft",this.BorderLeft); var borderRight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderRight",this.BorderRight); var borderTop=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderTop",this.BorderTop); var borderBottom=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderBottom",this.BorderBottom); div.style.borderLeft=borderLeft; div.style.borderRight=borderRight; div.style.borderTop=borderTop; div.style.borderBottom=borderBottom; var shadowDiv=this.mWindow.document.getElementById("MCDialog_DropShadow"); var shadowBgColor=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowColor",this.ShadowColor); shadowDiv.style.backgroundColor=shadowBgColor; var shadowDistance=parseInt(CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowDistance",this.ShadowDistance)); shadowDiv.style.top=shadowDistance+"px"; shadowDiv.style.left=shadowDistance+"px"; shadowDiv.style.borderLeftWidth=FMCGetComputedStyle(div,"borderLeftWidth"); shadowDiv.style.borderRightWidth=FMCGetComputedStyle(div,"borderRightWidth"); shadowDiv.style.borderTopWidth=FMCGetComputedStyle(div,"borderTopWidth"); shadowDiv.style.borderBottomWidth=FMCGetComputedStyle(div,"borderBottomWidth"); shadowDiv.style.borderLeftColor=shadowBgColor; shadowDiv.style.borderLeftStyle="solid"; shadowDiv.style.borderRightColor=shadowBgColor; shadowDiv.style.borderRightStyle="solid"; shadowDiv.style.borderTopColor=shadowBgColor; shadowDiv.style.borderTopStyle="solid"; shadowDiv.style.borderBottomColor=shadowBgColor; shadowDiv.style.borderBottomStyle="solid";}; CMCDialog.prototype.SetLabelStyles=function(el){ if(el.className=="Label"){ el.style.fontFamily=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontFamily",this.FontFamily); el.style.fontSize=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontSize",this.FontSize); el.style.fontWeight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontWeight",this.FontWeight); el.style.fontStyle=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontStyle",this.FontStyle); el.style.color=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"Color",this.Color);} var childNodes=el.childNodes; var length=el.childNodes.length; for(var i=0;i"+ ""+ ""+ ""+ "User Name:"+ ""+ ""+ ""+ ""+ ""+ "Subject:"+ ""+ ""+ ""+ ""+ ""+ "Comment:"+ ""+ ""+ ""+ ""+ ""+ ""+ "

"; CMCAddCommentDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var commentNode=this.mWindow.document.getElementById("MCComment"); if(commentNode.firstChild){ commentNode.removeChild(commentNode.firstChild);} if(this.mAnonymousEnabled){ var username=null; if(FMCIsHtmlHelp()){ username=FMCLoadUserData("LiveHelpUsername");} else{ username=FMCReadCookie("LiveHelpUsername");} if(username){ this.mWindow.document.getElementById("MCUsername").value=username; this.mWindow.document.getElementById("MCSubject").focus();} else{ this.mWindow.document.getElementById("MCUsername").focus();}} else{ var tr=this.mWindow.document.getElementById("MCUsername").parentNode.parentNode; tr.parentNode.removeChild(tr); this.mWindow.document.getElementById("MCSubject").focus();}}; CMCAddCommentDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var userNameLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"UserNameLabel",this.UserNameLabel); var subjectLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubjectLabel",this.SubjectLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); document.getElementById("MCUserNameLabel").firstChild.nodeValue=userNameLabel; document.getElementById("MCSubjectLabel").firstChild.nodeValue=subjectLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCAddCommentDialog.prototype.OK=function(){ var topicID=FMCGetMCAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var userGuid=null; if(FMCIsHtmlHelp()){ userGuid=FMCLoadUserData("LiveHelpUserGuid");} else{ userGuid=FMCReadCookie("LiveHelpUserGuid");} var username=null; if(this.mAnonymousEnabled){ username=this.mWindow.document.getElementById("MCUsername").value; if(username==null||username.length==0){ alert("Please enter a user name."); return false;} if(FMCIsHtmlHelp()){ FMCSaveUserData("LiveHelpUsername",username);} else{ FMCSetCookie("LiveHelpUsername",username,36500);}} var subject=this.mWindow.document.getElementById("MCSubject").value; var comment=this.mWindow.document.getElementById("MCComment").value; if(subject==null||subject.length==0){ alert("Please enter a subject."); return false;} else if(comment==null||comment.length==0){ alert("Please enter a comment."); return false;} try{ gServiceClient.AddComment(topicID,userGuid,username,subject,comment,null);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCAddCommentDialog.prototype.Cancel=function(){};  function CMCRatingDialog(winNode,initialRating){ CMCDialog.call(this,winNode); this.mCurrentRating=initialRating; this.StyleClass="Rating"; this.FontFamily="Arial"; this.FontSize="12px"; this.FontWeight="normal"; this.FontStyle="normal"; this.Color="#000000"; this.TitleLabel="Topic Rating:"; this.TitleFontFamily="Arial"; this.TitleFontSize="14px"; this.TitleFontWeight="bold"; this.TitleFontStyle="normal"; this.TitleFontVariant="small-caps"; this.TitleColor="#000000"; this.BackgroundColor="#ffffcc"; this.SubmitButtonLabel="Submit"; this.CancelButtonLabel="Cancel"; this.ShadowColor="#000000"; this.ShadowDistance=5; this.ShadowOpacity=100; this.BorderLeft="solid 2px #000000"; this.BorderRight="solid 2px #000000"; this.BorderTop="solid 2px #000000"; this.BorderBottom="solid 2px #000000"; this.AverageRatingLabel="Average Rating:"; this.YourRatingLabel="Your Rating:"; this.CommentLabel="Feedback for the author (optional):"; this.AverageRatingTooltip="Average topic rating"; this.YourRatingTooltip="Your rating"; this.CommentLengthExceeded="The maximum comment length was exceeded by {n} characters.";} CMCRatingDialog.prototype=new CMCDialog(); CMCRatingDialog.prototype.constructor=CMCRatingDialog; CMCRatingDialog.prototype.base=CMCDialog.prototype; CMCRatingDialog.prototype.InnerHtml=""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ "
"+ "Average Rating:"+ ""+ ""+ ""+ "
"+ "Your Rating:"+ ""+ ""+ "
 
"+ "Feedback for the author (optional):"+ "
"+ ""+ "
"+ "
"+ ""+ ""+ "
"; CMCRatingDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var topicID=FMCGetMCAttribute(document.documentElement,"MadCap:liveHelp"); gServiceClient.GetAverageRating(topicID,this.GetRatingOnComplete,null); var avgRatingIcons=this.mWindow.document.getElementById("MCAverageRatingIcons"); var userRatingIcons=this.mWindow.document.getElementById("MCUserRatingIcons"); var img=this.mWindow.document.createElement("img"); CMCFlareStylesheet.SetImageFromStylesheet(img,"ToolbarItem","TopicRatings","EmptyIcon",MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Rating0.gif",16,16); avgRatingIcons.appendChild(img); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.onclick=this.UserRatingIconsOnclick; userRatingIcons.onmousemove=this.UserRatingIconsOnmousemove; userRatingIcons.onmouseout=this.UserClearRatingIcons; FMCDrawRatingIcons(this.mCurrentRating,userRatingIcons); this.mWindow.document.getElementById("MCRatingComment").focus();}; CMCRatingDialog.prototype.GetRatingOnComplete=function(averageRating,ratingCount,onCompleteArgs){ var iconContainer=document.getElementById("MCAverageRatingIcons"); FMCDrawRatingIcons(averageRating,iconContainer);}; CMCRatingDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var averageRatingLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"AverageRatingLabel",this.AverageRatingLabel); var yourRatingLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"YourRatingLabel",this.YourRatingLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); var averageRatingTooltip=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"AverageRatingTooltip",this.AverageRatingTooltip); var yourRatingTooltip=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"YourRatingTooltip",this.YourRatingTooltip); document.getElementById("MCAverageRatingLabel").firstChild.nodeValue=averageRatingLabel; document.getElementById("MCYourRatingLabel").firstChild.nodeValue=yourRatingLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; document.getElementById("MCAverageRatingIcons").title=averageRatingTooltip; document.getElementById("MCUserRatingIcons").title=yourRatingTooltip; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCRatingDialog.prototype.UserRatingIconsOnclick=function(e){ if(!e){e=window.event;} var dlg=CMCDialog.GetDialog(this); var x=FMCGetMouseXRelativeTo(window,e,this); var numImgNodes=this.getElementsByTagName("img").length; var iconWidth=16; var numIcons=Math.ceil(x/iconWidth); var rating=numIcons*100/numImgNodes; rating=Math.min(rating,100); rating=Math.max(rating,0); dlg.mCurrentRating=rating;} CMCRatingDialog.prototype.UserRatingIconsOnmousemove=function(e){ if(!e){e=window.event;} FMCRatingIconsOnmousemove(e,this);} CMCRatingDialog.prototype.UserClearRatingIcons=function(e){ if(!e){e=window.event;} var dlg=CMCDialog.GetDialog(this); FMCClearRatingIcons(dlg.mCurrentRating,this);} CMCRatingDialog.prototype.OK=function(){ if(this.mCurrentRating<0||this.mCurrentRating>100){ alert("Please specify your rating."); return false;} var topicID=FMCGetAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var comment=this.mWindow.document.getElementById("MCRatingComment").value; try{ gServiceClient.SubmitRating(topicID,this.mCurrentRating,comment);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCRatingDialog.prototype.Cancel=function(){};  function CMCRegisterUserDialog(winNode,dialogMode,version){ CMCRegisterUserDialog.InCheckUserStatusMode=false; CMCDialog.call(this,winNode); this.mItemInfos=new Array(); this.mDialogMode=dialogMode; this.mVersion=version; this.StyleClass="RegisterUser"; this.FontFamily="Arial"; this.FontSize="12px"; this.FontWeight="normal"; this.FontStyle="normal"; this.Color="#000000"; this.TitleLabel="Create Feedback Service Profile:"; this.TitleFontFamily="Arial"; this.TitleFontSize="14px"; this.TitleFontWeight="bold"; this.TitleFontStyle="normal"; this.TitleFontVariant="small-caps"; this.TitleColor="#000000"; this.BackgroundColor="#ffffcc"; this.SubmitButtonLabel="Submit"; this.CancelButtonLabel="Cancel"; this.ShadowColor="#000000"; this.ShadowDistance=5; this.ShadowOpacity=100; this.BorderLeft="solid 2px #000000"; this.BorderRight="solid 2px #000000"; this.BorderTop="solid 2px #000000"; this.BorderBottom="solid 2px #000000"; this.RegistrationMessage="You must create a user profile to post comments to this help system. Please fill in the information below. An email will be sent to the address you provide. Please follow the instructions in the email to complete activation. Fields marked with an asterisk (*) are required."; this.EditProfileRegistrationMessage="Use this form to update your profile information. If you choose to update your email address, an email will be sent to the address you provide. Please follow the instructions in the email to complete activation."; this.RegistrationSubmit="Your information has been sent to MadCap Software. When the information has been processed, you will receive an email with a link to a verification page. Click this link, or copy and paste the link into your Web browser to complete the registration."; this.RegistrationSubmitNote="NOTE: Some service providers have email filtering software that may cause the notification email to be sent to your junk email folder. If you do not receive a notification email, please check this folder to see if it has been sent there."; this.MissingRequiredField="Please enter a value for: "; this.UpdateSuccess="Your profile was updated successfully!";} CMCRegisterUserDialog.prototype=new CMCDialog(); CMCRegisterUserDialog.prototype.constructor=CMCRegisterUserDialog; CMCRegisterUserDialog.prototype.base=CMCDialog.prototype; CMCRegisterUserDialog.prototype.InnerHtml=""+ "
"+ "You must create a user profile to post comments to this help system. "+ "Please fill in the information below. An email will be sent to the "+ "address you provide. Please follow the instructions in the email to complete activation."+ "Fields marked with an asterisk (*) are required."+ "
"+ ""+ "
"+ ""+ ""+ ""+ ""+ ""+ "
"+ "
"+ "
E-mail Notifications
"+ "
I want to receive an email when...
"+ "
"+ "
"+ "
"+ "
"+ "
"+ "
"+ ""+ "
"+ ""+ ""+ "
"; CMCRegisterUserDialog.DialogMode={}; CMCRegisterUserDialog.DialogMode.NewUserProfile=0; CMCRegisterUserDialog.DialogMode.EditUserProfile=1; CMCRegisterUserDialog.prototype.Create=function(){ this.base.Create.call(this); var xmlDoc=CMCXmlParser.GetXmlDoc(FMCGetSkinFolderAbsolute()+"Skin.xml",false,null,null); var items=null; if(this.mVersion==1){ items=new Array(7); items[0]="Username"; items[1]="EmailAddress"; items[2]="FirstName"; items[3]="LastName"; items[4]="Country"; items[5]="PostalCode"; items[6]="Gender"; var emailNotificationsGroup=this.mWindow.document.getElementById("MCEmailNotificationsGroup"); emailNotificationsGroup.style.display="none";} else{ items=FMCGetAttributeStringList(xmlDoc.documentElement,"FeedbackUserProfileItems","|"); if(items==null){ items=new Array();} if(!items.Contains("EmailAddress")){ items.Insert("EmailAddress",0);} if(!items.Contains("Username")){ items.Insert("Username",0);} var c=this.mWindow.document.getElementById("MCCommentReplyNotification"); var itemInfo=new CMCItemInfo("CommentReplyNotification","CommentReplyNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; var savedValue=FMCLoadUserData("CommentReplyNotification"); c.checked=savedValue=="true"; c=this.mWindow.document.getElementById("MCCommentSameTopicNotification"); itemInfo=new CMCItemInfo("CommentSameTopicNotification","CommentSameTopicNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; savedValue=FMCLoadUserData("CommentSameTopicNotification"); c.checked=savedValue=="true"; c=this.mWindow.document.getElementById("MCCommentSameHelpSystemNotification"); itemInfo=new CMCItemInfo("CommentSameHelpSystemNotification","CommentSameHelpSystemNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; savedValue=FMCLoadUserData("CommentSameHelpSystemNotification"); c.checked=savedValue=="true";} var tbody=this.RootEl.getElementsByTagName("tbody")[0]; for(var i=0,length=items.length;i"+ ""+ ""+ ""+ "User Name:"+ ""+ ""+ ""+ ""+ ""+ "Subject:"+ ""+ ""+ ""+ ""+ ""+ "Comment:"+ ""+ ""+ ""+ ""+ ""+ "Original Comment:"+ ""+ ""+ ""+ ""+ ""+ ""+ "
"+ ""+ ""+ "
"; CMCReplyCommentDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var commentNode=this.mWindow.document.getElementById("MCComment"); if(commentNode.firstChild){ commentNode.removeChild(commentNode.firstChild);} if(this.mAnonymousEnabled){ this.mWindow.document.getElementById("MCUsername").focus();} else{ var tr=this.mWindow.document.getElementById("MCUsername").parentNode.parentNode; tr.parentNode.removeChild(tr); this.mWindow.document.getElementById("MCSubject").focus();} this.mWindow.document.getElementById("MCOriginalComment").value=this.mComment;}; CMCReplyCommentDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var userNameLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"UserNameLabel",this.UserNameLabel); var subjectLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubjectLabel",this.SubjectLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); var originalCommentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"OriginalCommentLabel",this.OriginalCommentLabel); document.getElementById("MCUserNameLabel").firstChild.nodeValue=userNameLabel; document.getElementById("MCSubjectLabel").firstChild.nodeValue=subjectLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; document.getElementById("MCOriginalCommentLabel").firstChild.nodeValue=originalCommentLabel; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCReplyCommentDialog.prototype.OK=function(){ var topicID=FMCGetMCAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var userGuid=null; if(FMCIsHtmlHelp()){ userGuid=FMCLoadUserData("LiveHelpUserGuid");} else{ userGuid=FMCReadCookie("LiveHelpUserGuid");} var username=null; if(this.mAnonymousEnabled){ username=this.mWindow.document.getElementById("MCUsername").value; if(username==null||username.length==0){ alert("Please enter a user name."); return false;}} var subject=this.mWindow.document.getElementById("MCSubject").value; var comment=this.mWindow.document.getElementById("MCComment").value; if(subject==null||subject.length==0){ alert("Please enter a subject."); return false;} else if(comment==null||comment.length==0){ alert("Please enter a comment."); return false;} try{ gServiceClient.AddComment(topicID,userGuid,username,subject,comment,this.mParentCommentID);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCReplyCommentDialog.prototype.Cancel=function(){};  function FMCInit(){ if(gInit){ return;} FMCCheckForBookmark(); if(FMCIsWebHelp()&&window.name=="body"){ FMCRegisterCallback("TOC",MCEventType.OnInit,FMCOnTocInitialized,null);} if(MCGlobals.ToolbarFrame!=null){ FMCRegisterCallback("Toolbar",MCEventType.OnInit,FMCOnToolbarLoaded,null);} if(MCGlobals.BodyCommentsFrame!=null&&!FMCIsTopicPopup(window)){ if(!FMCIsWebHelp()||MCGlobals.RootFrame!=null){ FMCRegisterCallback("BodyComments",MCEventType.OnLoad,FMCOnBodyCommentsLoaded,null);}} if(MCGlobals.TopicCommentsFrame!=null){ FMCRegisterCallback("TopicComments",MCEventType.OnInit,FMCOnTopicCommentsInit,null);} if(MCGlobals.RecentCommentsFrame!=null){ FMCRegisterCallback("RecentComments",MCEventType.OnInit,FMCOnRecentCommentsInit,null);} var rootFrame=FMCGetRootFrame(); if(rootFrame){ rootFrame.FMCHighlightUrl(window);} else if(typeof(FMCHighlightUrl)!="undefined"){ FMCHighlightUrl(window);} if(MCGlobals.RootFrame==null&&!FMCIsTopicPopup(window)){ var framesetLinks=FMCGetElementsByClassRoot(document.body,"MCWebHelpFramesetLink"); for(var i=0;i-1)?true:false; var aLeft=(anchors.indexOf("Left")>-1)?true:false; var aBottom=(anchors.indexOf("Bottom")>-1)?true:false; var aRight=(anchors.indexOf("Right")>-1)?true:false; var aWidth=(anchors.indexOf("Width")>-1)?true:false; var aHeight=(anchors.indexOf("Height")>-1)?true:false;} if(aLeft&&aRight){ widthPx=screen.availWidth-(leftPx+rightPx);} else if(!aLeft&&aRight){ leftPx=screen.availWidth-(widthPx+rightPx);} else if(aWidth){ leftPx=(screen.availWidth/ 2)-(widthPx/ 2);} if(aTop&&aBottom){ heightPx=screen.availHeight-(topPx+bottomPx);} else if(!aTop&&aBottom){ topPx=screen.availHeight-(heightPx+bottomPx);} else if(aHeight){ topPx=(screen.availHeight/ 2)-(heightPx/ 2);} if(window==top){ try{ window.resizeTo(widthPx,heightPx); window.moveTo(leftPx,topPx);} catch(err){}}} function Default_LoadWebHelpOptions(xmlDoc){ var webHelpOptions=xmlDoc.getElementsByTagName("WebHelpOptions")[0]; if(webHelpOptions){ if(webHelpOptions.getAttribute("NavigationPanePosition")){ gNavPosition=webHelpOptions.getAttribute("NavigationPanePosition");} if(webHelpOptions.getAttribute("NavigationPaneWidth")){ var navWidth=webHelpOptions.getAttribute("NavigationPaneWidth"); if(navWidth!="0"){ var hideNavStartup=FMCGetAttributeBool(webHelpOptions,"HideNavigationOnStartup",false); if(!hideNavStartup){ if(gNavPosition=="Left"){ document.getElementsByTagName("frameset")[1].cols=navWidth+", *";} else if(gNavPosition=="Right"){ document.getElementsByTagName("frameset")[1].cols="*, "+navWidth;} else if(gNavPosition=="Top"){ var resizeBarHeight=7; document.getElementsByTagName("frameset")[0].rows=navWidth+", "+resizeBarHeight+", *";} else if(gNavPosition=="Bottom"){ document.getElementsByTagName("frameset")[0].rows="*, "+navWidth;}}}} gHideNavStartup=FMCGetAttributeBool(webHelpOptions,"HideNavigationOnStartup",false); if(gHideNavStartup){ ShowHideNavigation(false);}} if(FMCIsSafari()){ var frameNodes=document.getElementsByTagName("frame"); for(var i=0;i=gNavigationWidth){ clearInterval(gIntervalID); for(var i=0,length=gChangeNavigationStateCompletedListeners.length;i=gNavigationWidth){ clearInterval(gIntervalID); for(var i=0,length=gChangeNavigationStateCompletedListeners.length;i");} catch(ex){ iframe=document.createElement("iframe"); iframe.onload=FMCIFrameOnload;} var name="MCPopup_"+(gPopupNumber++); node.setAttribute("MadCap:iframeName",name); iframe.name=name; iframe.id=name; iframe.className="MCPopupBody"; iframe.setAttribute("title","Popup"); iframe.setAttribute("scrolling","auto"); iframe.setAttribute("frameBorder","0"); var width=FMCGetAttribute(node,"MadCap:width"); if(width!=null){ iframe.setAttribute("MadCap:width",width);} var height=FMCGetAttribute(node,"MadCap:height"); if(height!=null){ iframe.setAttribute("MadCap:height",height);} document.body.appendChild(iframe); iframe.src=path;} iframe.style.display="none"; gJustPopped=true; iframe.MCClientX=e.clientX+FMCGetScrollLeft(window); iframe.MCClientY=e.clientY+FMCGetScrollTop(window); if(iframeExists){ FMCShowIFrame(iframe);}} function FMCIFrameOnload(e){ if(this.contentWindow.document.location.href=="about:blank"){ return;} if(FMCGetAttributeBool(this,"MadCap:loaded",false)){ return;} FMCShowIFrame(this); this.setAttribute("MadCap:loaded","true");} function FMCIFrameOnloadInline(popupBody){ if(FMCGetAttributeBool(popupBody,"MadCap:loaded",false)){ return;} FMCShowIFrame(popupBody); popupBody.setAttribute("MadCap:loaded","true");} function FMCShowIFrame(popupBody){ try{ if(popupBody.contentWindow.document.location.href=="about:blank"){ return;}} catch(ex){} popupBody.style.display=""; FMCSetPopupSize(popupBody); var clientX=popupBody.MCClientX; var clientY=popupBody.MCClientY; var newXY=FMCGetInBounds(popupBody,clientX,clientY); popupBody.style.left=newXY.X+"px"; popupBody.style.top=newXY.Y+"px"; var popupBodyBG=document.createElement("span"); popupBodyBG.className="MCPopupBodyBG"; popupBodyBG.style.top=newXY.Y+5+"px"; popupBodyBG.style.left=newXY.X+5+"px"; popupBodyBG.style.width=parseInt(popupBody.offsetWidth)+"px"; popupBodyBG.style.height=parseInt(popupBody.offsetHeight)+"px"; popupBody.parentNode.appendChild(popupBodyBG); gPopupObj=popupBody; gPopupBGObj=popupBodyBG; gFadeID=setInterval(FMCFade,10);} function FMCGetInBounds(el,x,y){ var absolutePosition=FMCGetPosition(el.offsetParent); var absoluteTop=absolutePosition[0]; var absoluteLeft=absolutePosition[1]; var scrollTop=FMCGetScrollTop(window); var scrollLeft=FMCGetScrollLeft(window); var newTop=y; var newLeft=x; if(yscrollTop+FMCGetClientHeight(window,false)){ newTop=scrollTop+FMCGetClientHeight(window,false)-parseInt(el.style.height)-5;} newTop-=absoluteTop; if(newLeft+parseInt(el.style.width)+5>scrollLeft+FMCGetClientWidth(window,false)){ newLeft=scrollLeft+FMCGetClientWidth(window,false)-parseInt(el.style.width)-5;} newLeft-=absoluteLeft; return{X:newLeft,Y:newTop};} function FMCSetPopupSize(popupNode){ var popupWidth=FMCGetAttribute(popupNode,"MadCap:width"); var popupHeight=FMCGetAttribute(popupNode,"MadCap:height"); if((popupWidth!="auto"&&!String.IsNullOrEmpty(popupWidth))||(popupHeight!="auto"&&!String.IsNullOrEmpty(popupHeight))){ popupNode.style.width=popupWidth; popupNode.style.height=popupHeight; return;} var clientWidth=FMCGetClientWidth(window,false); var clientHeight=FMCGetClientHeight(window,false); var stepSize=10; var hwRatio=clientHeight/clientWidth; var popupFrame=frames[popupNode.name]; var maxX=clientWidth*0.618034; var i=0; if(FMCIsSafari()){ popupNode.style.width=maxX+"px"; popupNode.style.height=(maxX*hwRatio)+"px"; return;} try{ var popupDocument=popupFrame.document; FMCGetScrollHeight(popupFrame.window);} catch(err){ popupNode.style.width=maxX+"px"; popupNode.style.height=(maxX*hwRatio)+"px"; return;} while(true){ popupNode.style.width=maxX-(i*stepSize)+"px"; popupNode.style.height=(maxX-(i*stepSize))*hwRatio+"px"; if(FMCGetScrollHeight(popupFrame.window)>FMCGetClientHeight(popupFrame.window,false)|| FMCGetScrollWidth(popupFrame.window)>FMCGetClientWidth(popupFrame.window,false)){ popupNode.style.width=maxX-((i-1)*stepSize)+"px"; popupNode.style.height=(maxX-((i-1)*stepSize))*hwRatio+"px"; break;} i++;}} function FMCPopupThumbnail_Onclick(e,node){ if(gPopupObj){ return;} if(!e){ e=window.event;} var clientCenter=FMCGetClientCenter(window); var img=FMCPopupThumbnailShow(node,clientCenter[0],clientCenter[1]); var index=gDocumentOnclickFuncs.push(OnDocumentClick)-1; var justPopped=true; function OnDocumentClick(){ if(justPopped){ justPopped=false; return;} FMCRemoveOpacitySheet(window); img.parentNode.removeChild(img); gDocumentOnclickFuncs.splice(index,1);}} function FMCPopupThumbnail_Onmouseover(e,node){ if(gPopupObj){ return;} if(!e){ e=window.event;} var mouseX=FMCGetClientX(window,e); var mouseY=FMCGetClientY(window,e); var x=mouseX+FMCGetScrollLeft(window); var y=mouseY+FMCGetScrollTop(window); var img=FMCPopupThumbnailShow(node,x,y); img.onmouseout=Onmouseout; function Onmouseout(){ FMCRemoveOpacitySheet(window); img.parentNode.removeChild(img);}} function FMCPopupThumbnailShow(node,x,y){ var popupSrc=FMCGetAttribute(node,"MadCap:popupSrc"); var popupWidth=FMCGetAttribute(node,"MadCap:popupWidth"); var popupHeight=FMCGetAttribute(node,"MadCap:popupHeight"); var img=document.createElement("img"); img.className="MCPopupThumbnail_Popup"; img.setAttribute("src",popupSrc); img.style.width=popupWidth+"px"; img.style.height=popupHeight+"px"; var left=Math.max(5,x-(popupWidth/2)); var top=Math.max(5,y-(popupHeight/2)); document.body.appendChild(img); var newXY=FMCGetInBounds(img,left,top); img.style.left=newXY.X+"px"; img.style.top=newXY.Y+"px"; FMCInsertOpacitySheet(window,"#eeeeee"); MCFader.FadeIn(img,0,100,null,0,0,false); return img;} function GetHelpControlLinks(node,callbackFunc,callbackArgs){ var linkMap=new Array(); var inPreviewMode=FMCInPreviewMode(); if(!inPreviewMode){ var masterHS=FMCGetRootFrame().FMCGetHelpSystem(); if(masterHS.IsMerged()){ if(FMCGetMCAttribute(node,"MadCap:indexKeywords")!=null){ function OnInit(){ var indexKeywords=FMCGetMCAttribute(node,"MadCap:indexKeywords").replace("\\;","%%%%%"); if(indexKeywords==""){ callbackFunc(linkMap,callbackArgs);} var keywords=indexKeywords.split(";"); for(var i=0;iFMCGetClientHeight(window,false)){ gTextPopupBody.style.top=FMCGetScrollTop(window)+FMCGetClientHeight(window,false)-gTextPopupBody.offsetHeight-5+"px";} else{ gTextPopupBody.style.top=FMCGetPageY(window,e)+"px";} if(FMCGetClientX(window,e)+gTextPopupBody.offsetWidth+5>FMCGetClientWidth(window,false)){ gTextPopupBody.style.left=FMCGetScrollLeft(window)+FMCGetClientWidth(window,false)-gTextPopupBody.offsetWidth-5+"px";} else{ gTextPopupBody.style.left=FMCGetPageX(window,e)+"px";} gTextPopupBodyBG=document.createElement("span"); gTextPopupBodyBG.className="MCTextPopupBodyBG"; gTextPopupBodyBG.style.top=parseInt(gTextPopupBody.style.top)+5+"px"; gTextPopupBodyBG.style.left=parseInt(gTextPopupBody.style.left)+5+"px"; FMCSetTextPopupDimensions(); gTextPopupBody.parentNode.appendChild(gTextPopupBodyBG); window.onresize=FMCSetTextPopupDimensions; gPopupObj=gTextPopupBody; gPopupBGObj=gTextPopupBodyBG; gJustPopped=true; gFadeID=setInterval(FMCFade,10);}} function FMCSetTextPopupSize(popupNode){ var clientWidth=FMCGetClientWidth(window,false); var clientHeight=FMCGetClientHeight(window,false); var stepSize=10; var hwRatio=clientHeight/clientWidth; var maxX=clientWidth*0.618034; var i=0; while(true){ popupNode.style.width=maxX-(i*stepSize)+"px"; popupNode.style.height=(maxX-(i*stepSize))*hwRatio+"px"; if(popupNode.scrollHeight>popupNode.offsetHeight-2||popupNode.scrollWidth>popupNode.offsetWidth-2){ popupNode.style.overflow="hidden"; popupNode.style.width=maxX-((i-1)*stepSize)+"px"; popupNode.style.height=(maxX-((i-1)*stepSize))*hwRatio+"px"; break;} i++;}} function FMCToggler(node){ if(gPopupObj){ return;} var imgNodes=node.getElementsByTagName("img"); for(var i=0;iclientHeight){ klinkBody.style.height=(clientHeight-5-2)+"px";} if(klinkBody.offsetWidth+5>clientWidth){ klinkBody.style.width=(clientWidth-5-2)+"px";} var clientX=0; var clientY=0; var pageX=0; var pageY=0; if(node.MCKeydown){ if(node.parentNode.style.position=="absolute"){ topOffset=document.getElementById("searchField").offsetHeight; clientX=node.parentNode.offsetLeft-node.parentNode.parentNode.parentNode.scrollLeft; clientY=node.parentNode.offsetTop-node.parentNode.parentNode.parentNode.scrollTop+topOffset; pageX=node.parentNode.offsetLeft-node.parentNode.parentNode.parentNode.scrollLeft; pageY=node.parentNode.offsetTop-node.parentNode.parentNode.parentNode.scrollTop+topOffset;} else{ clientX=node.offsetLeft-FMCGetScrollLeft(window); clientY=node.offsetTop-FMCGetScrollTop(window); pageX=node.offsetLeft; pageY=node.offsetTop;}} else{ clientX=args.clientX; clientY=args.clientY; pageX=args.pageX; pageY=args.pageY;} if(clientY+klinkBody.offsetHeight+5>FMCGetClientHeight(window,false)){ klinkBody.style.top=FMCGetScrollTop(window)+clientHeight-klinkBody.offsetHeight-5+"px";} else{ klinkBody.style.top=pageY+"px";} if(clientX+klinkBody.offsetWidth+5>FMCGetClientWidth(window,false)){ klinkBody.style.left=FMCGetScrollLeft(window)+clientWidth-klinkBody.offsetWidth-5+"px";} else{ klinkBody.style.left=pageX+"px";} if(node.MCKeydown){ klinkBody.getElementsByTagName("a")[0].focus(); node.MCKeydown=false;} var klinkBodyBG=document.createElement("span"); klinkBodyBG.className="MCKLinkBodyBG"; klinkBodyBG.style.top=parseInt(klinkBody.style.top)+5+"px"; klinkBodyBG.style.left=parseInt(klinkBody.style.left)+5+"px"; klinkBodyBG.style.width=klinkBody.offsetWidth+"px"; klinkBodyBG.style.height=klinkBody.offsetHeight+"px"; klinkBody.parentNode.appendChild(klinkBodyBG); MCFader.FadeIn(klinkBody,0,100,klinkBodyBG,0,50,true);} function FMCKLinkBodyOnkeyup(e){ if(!e){e=window.event;} if(e.keyCode==27){ FMCClickHandler(e); this.MCOwner.focus();}}  function Favorites_WindowOnload(){ if(MCGlobals.NavigationFrame!=null){ Favorites_WaitForPaneActive();} else{ Favorites_Init(null);}} function Favorites_WaitForPaneActive(){ if(MCGlobals.NavigationFrame.gActivePane==window.name){ MCGlobals.NavigationFrame.SetIFrameHeight(); Favorites_Init(null);} else{ window.setTimeout(Favorites_WaitForPaneActive,1);}} function Favorites_Init(OnCompleteFunc){ if(gInit){ if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.body,MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ if(gDeleteSearchFavoritesIcon==null){gDeleteSearchFavoritesIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete.gif";} if(gDeleteSearchFavoritesOverIcon==null){gDeleteSearchFavoritesOverIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_over.gif";} if(gDeleteSearchFavoritesSelectedIcon==null){gDeleteSearchFavoritesSelectedIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_selected.gif";} if(gDeleteTopicFavoritesIcon==null){gDeleteTopicFavoritesIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete.gif";} if(gDeleteTopicFavoritesOverIcon==null){gDeleteTopicFavoritesOverIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_over.gif";} if(gDeleteTopicFavoritesSelectedIcon==null){gDeleteTopicFavoritesSelectedIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_selected.gif";} FMCLoadSearchFavorites(); document.body.insertBefore(document.createElement("br"),document.getElementById("searchFavorites").nextSibling); FMCLoadTopicsFavorites(); gInit=true; EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}}} function FMCSetSearchTabIndexes(){ gTabIndex=1; var searchTable=document.getElementById("searchFavorites"); searchTable.getElementsByTagName("div")[0].tabIndex=gTabIndex++; var trs=searchTable.getElementsByTagName("tr"); if(trs[1].getElementsByTagName("td").length==1){ return;} for(var i=1;i0){ gTabIndex=1+((trs.length-1)*2)+1;} else{ gTabIndex=2;} topicTable.getElementsByTagName("div")[0].tabIndex=gTabIndex++; var trs=topicTable.getElementsByTagName("tr"); if(trs[1].getElementsByTagName("td").length==1){ return;} for(var i=1;i=1;i--){ var currNode=node.childNodes[i]; var prevNode=currNode.previousSibling; if(currNode.nodeType==3&&prevNode.nodeType==3){ prevNode.nodeValue=prevNode.nodeValue+currNode.nodeValue; node.removeChild(currNode);}} for(var i=0;i=0;i--){ var node=root.childNodes[i]; FMCApplyHighlight(win,node,term,color,caseSensitive,searchType); if(node.nodeType!=3||node.parentNode.nodeName=="SCRIPT"){ continue;} var currNode=node; var text=currNode.nodeValue; for(var match=re.exec(text);match!=null;match=re.exec(text)){ var pos=match.index+(searchType=="NGram"?0:match[1].length); var posEnd=pos+term.length; var span=win.document.createElement("span"); span.className="highlight"; span.style.fontWeight="bold"; span.style.backgroundColor=color.split(",")[0]; span.style.color=color.split(",")[1]; var span2=win.document.createElement("span"); span2.className="SearchHighlight"+(gColorIndex+1); span2.appendChild(win.document.createTextNode(text.substring(pos,posEnd))); span.appendChild(span2); currNode.nodeValue=text.substring(0,pos); currNode.parentNode.insertBefore(span,currNode.nextSibling); currNode.parentNode.insertBefore(win.document.createTextNode(text.substring(posEnd,text.length)),span.nextSibling); currNode=currNode.nextSibling.nextSibling; text=currNode.nodeValue; if(gFirstHighlight==null||span.offsetTopwin.document.documentElement.clientHeight){ win.document.documentElement.scrollTop=gFirstHighlight.offsetTop;}} function FMCHighlightUrl(win){ gColorIndex=0; gFirstHighlight=null; var url=win.document.location.search; if(String.IsNullOrEmpty(url)){ return;} url=decodeURIComponent(url); var pos=url.indexOf("SearchType"); var ampPos=-1; var searchType=null; if(pos>=0){ ampPos=url.indexOf("&",pos); searchType=url.substring(1+pos+"SearchType".length,ampPos>=0?ampPos:url.length);} pos=url.indexOf("Highlight"); if(pos>=0){ ampPos=url.indexOf("&",pos); var highlight=url.substring(1+pos+"Highlight".length,ampPos>=0?ampPos:url.length); var stems=highlight.split("||"); for(var i=0;i=start&&itemletter){ break;}}} function CMCIndexEntry(indexEntry,level){ var indexLinks=FMCGetChildNodeByTagName(indexEntry,"Links",0).childNodes; var numNodes=indexLinks.length; var nodeCount=0; this.Term=FMCGetAttribute(indexEntry,"Term"); this.IndexLinks=new Array(); this.Level=level; this.GeneratedReferenceType=FMCGetAttribute(indexEntry,"GeneratedReferenceType"); for(var i=0;i1){ a=GenerateKLink(a,indexLinks);} div.appendChild(a);} function IndexEntryOnmouseover(){ this.style.color="#ff0000";} function IndexEntryOnmouseout(){ var color=gStylesMap.GetItem("color"); this.style.color=color?color:"#0055ff";} function IndexEntryOnclick(){ var indexEntry=this.MCIndexEntry; if(indexEntry.GeneratedReferenceType!=null){ var textParts=indexEntry.Term.split(","); var indexEntryIndex=SelectIndexEntry(textParts); var item=indexEntryIndex; document.getElementById("CatapultIndex").parentNode.scrollTop=item*gEntryHeight; RefreshIndex(); var indexDiv=gIndexDivs[indexEntryIndex]; HighlightEntry(indexDiv);} else{ HighlightEntry(this.parentNode);}} function SetLinkMap(term,indexLinks){ var linkMap=new CMCDictionary(); for(var i=0;i0){ topics+="||";} var indexLink=indexLinks[i]; var link=indexLink.Link; link=(link.charAt(0)=="/")?".."+link:link; topics+=indexLink.Title+"|"+link;} a.href="javascript:void( 0 );"; a.className="MCKLink"; a.setAttribute("MadCap:topics",topics); a.onclick=KLinkOnclick; a.onkeydown=KLinkOnkeydown; return a;} function KLinkOnclick(e){ HighlightEntry(this.parentNode); FMCLinkControl(e,this,gKLinkStylesMap); return false;} function KLinkOnkeydown(){ this.MCKeydown=true;} function Index_Init(OnCompleteFunc){ if(gInit){ if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.body,MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ var fontSizePx=12; if(gStylesMap.GetItem("fontSize")){ fontSizePx=FMCConvertToPx(document,gStylesMap.GetItem("fontSize"),null,12);} gEntryHeight=fontSizePx+3; document.getElementById("searchField").title=gSearchFieldTitle; function GetIndexOnComplete(xmlDoc,args){ gXMLDoc=xmlDoc; CreateIndex(gXMLDoc); RefreshIndex(); gInit=true; EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}} FMCGetHelpSystem().GetIndex(GetIndexOnComplete,null);}} function HighlightEntry(node){ if(gSelectedItem){ var color=gStylesMap.GetItem("color"); var backgroundColor=gStylesMap.GetItem("backgroundColor"); gSelectedItem.firstChild.style.color=color?color:"#0055ff"; gSelectedItem.firstChild.style.backgroundColor=backgroundColor?backgroundColor:"Transparent";} gSelectedItem=node; if(gSelectedItem){ if(gSelectionColor){ gSelectedItem.firstChild.style.color=gSelectionColor;} gSelectedItem.firstChild.style.backgroundColor=gSelectionBackgroundColor;}} function SelectEntry(e){ if(!e){ e=window.event;} if(e.keyCode==116){ return;} else if(e.keyCode==13){ if(gSelectedItem){ parent.parent.frames["body"].location.href=gSelectedItem.childNodes[0].href;} return;} var text=document.getElementById("searchField").value; var textParts=text.split(","); var indexEntryIndex=SelectIndexEntry(textParts); var item=0; if(indexEntryIndex==-1){ item=0;} else{ item=indexEntryIndex;} document.getElementById("CatapultIndex").parentNode.scrollTop=item*gEntryHeight; RefreshIndex(); var indexDiv=null; if(indexEntryIndex!=-1){ indexDiv=gIndexDivs[indexEntryIndex];} HighlightEntry(indexDiv);} function SelectIndexEntry(textParts){ var text=textParts[0].toLowerCase(); do{ if(text==""){ break;} var first=text.charAt(0); var item=gAlphaMap.GetItem(first); var indexEntryIndex=-1; if(item==null){ item=0;}}while(false) return FindIndexEntry(textParts,0,item);} function FindIndexEntry(textParts,partIndex,indexEntryIndex){ var newIndexEntryIndex=-1; var lastIndexEntryIndex=indexEntryIndex; var text=FMCTrim(textParts[partIndex].toLowerCase()); do{ if(text==""){ break;} var currIndexEntry=null; for(var i=indexEntryIndex;;i++){ if(i==gIndexEntryCount){ newIndexEntryIndex=lastIndexEntryIndex; break;} if(!gIndexEntries[i]){ LoadChunksForLetter(text.charAt(0));} currIndexEntry=gIndexEntries[i]; var term=currIndexEntry.Term.toLowerCase(); if(currIndexEntry.Level>gIndexEntries[indexEntryIndex].Level){ continue;} else if(currIndexEntry.Leveltext){ newIndexEntryIndex=lastIndexEntryIndex; for(var subText=text.substring(0,text.length-1);subText!="";subText=subText.substring(0,subText.length-1)){ if(term.substring(0,subText.length)==subText){ newIndexEntryIndex=i;}} break;} else{ lastIndexEntryIndex=i;}}}while(false) if(partIndex+1gIndexEntries[newIndexEntryIndex].Level){ var subIndexEntryIndex=FindIndexEntry(textParts,partIndex+1,nextIndexEntryIndex); if(subIndexEntryIndex!=-1){ newIndexEntryIndex=subIndexEntryIndex;}}} return newIndexEntryIndex;} if(gRuntimeFileType=="Index"){ var gInit=false; var gIndent=16; var gIndexEntryCount=0; var gIndexEntries=new Array(); var gIndexDivs=new Array(); var gLinkMap=new CMCDictionary(); var gXMLDoc=null; var gChunks=null; var gAlphaMap=new CMCDictionary(); var gSelectedItem=null; var gStylesMap=new CMCDictionary(); var gKLinkStylesMap=new CMCDictionary(); var gEntryHeight=15; var gSelectionColor=null; var gSelectionBackgroundColor="#cccccc"; var gSearchFieldTitle="Index search text box"; var gSeeReferencePrefix="See"; var gSeeAlsoReferencePrefix="See also"; gOnloadFuncs.push(Index_WindowOnload); var gDivCached=null; var gACached=null;}  var gEmptyIcon=null; var gHalfFullIcon=null; var gFullIcon=null; var gIconWidth=16; var gTopicRatingIconsInit=false; function TopicRatingIconsInit(){ if(gTopicRatingIconsInit){ return;} var value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","EmptyIcon",null); if(value==null){ gEmptyIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Rating0.gif"; gIconWidth=16;} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gEmptyIcon=FMCGetSkinFolderAbsolute()+value;} value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","HalfFullIcon",null); if(value==null){ gHalfFullIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/RatingGold50.gif";} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gHalfFullIcon=FMCGetSkinFolderAbsolute()+value;} value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","FullIcon",null); if(value==null){ gFullIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/RatingGold100.gif";} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gFullIcon=FMCGetSkinFolderAbsolute()+value;} gTopicRatingIconsInit=true;} function FMCRatingIconsCalculateRating(e,iconContainer){ if(!e){e=window.event;} var x=FMCGetMouseXRelativeTo(window,e,iconContainer); var imgNodes=iconContainer.getElementsByTagName("img"); var numImgNodes=imgNodes.length; var iconWidth=gIconWidth; var numIcons=Math.ceil(x/iconWidth); var rating=numIcons*100/numImgNodes; return rating;} function FMCRatingIconsOnmousemove(e,iconContainer){ TopicRatingIconsInit(); if(!e){e=window.event;} var rating=FMCRatingIconsCalculateRating(e,iconContainer); FMCDrawRatingIcons(rating,iconContainer);} function FMCClearRatingIcons(rating,iconContainer){ FMCDrawRatingIcons(rating,iconContainer);} function FMCDrawRatingIcons(rating,iconContainer){ TopicRatingIconsInit(); var imgNodes=iconContainer.getElementsByTagName("img"); var numImgNodes=imgNodes.length; var numIcons=Math.ceil(rating*numImgNodes/100); for(var i=0;iqsLimit){ var diff=qsChars-qsLimit; var data={ExceedAmount:diff}; var ex=new CMCFeedbackException(-1,"Query string limit exceeded.",data); throw ex;} script.id=scriptID; script.setAttribute("type","text/javascript"); script.setAttribute("src",src); head.appendChild(script); return scriptID;} this.RemoveScriptTag=function(scriptID){ function RemoveScriptTag2(){ var script=document.getElementById(scriptID); script.parentNode.removeChild(script);} window.setTimeout(RemoveScriptTag2,10);} this.LogTopic=function(topicID){ AddScriptTag("LogTopic","gServiceClient.LogTopicOnComplete",[["TopicID",topicID]]);} this.LogTopicOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.LogTopic2=function(topicID,cshID,onCompleteFunc,onCompleteArgs,thisObj){ this.LogTopic2OnComplete=function(scriptID){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,onCompleteArgs);} else{ onCompleteFunc(onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.LogTopic2OnComplete=null;} AddScriptTag("LogTopic2","gServiceClient.LogTopic2OnComplete",[["TopicID",topicID],["CSHID",cshID]]);} this.LogSearch=function(projectID,userGuid,resultCount,language,query){ AddScriptTag("LogSearch","gServiceClient.LogSearchOnComplete",[["ProjectID",projectID],["UserGuid",userGuid],["ResultCount",resultCount],["Language",language],["Query",query]]);} this.LogSearchOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.AddComment=function(topicID,userGuid,userName,subject,comment,parentCommentID){ AddScriptTag("AddComment","gServiceClient.AddCommentOnComplete",[["TopicID",topicID],["UserGuid",userGuid],["Username",userName],["Subject",subject],["Comment",comment],["ParentCommentID",parentCommentID]]);} this.AddCommentOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.GetAverageRating=function(topicID,onCompleteFunc,onCompleteArgs){ mGetAverageRatingOnCompleteFunc=onCompleteFunc; mGetAverageRatingOnCompleteArgs=onCompleteArgs; AddScriptTag("GetAverageRating","gServiceClient.GetAverageRatingOnComplete",[["TopicID",topicID]]);} this.GetAverageRatingOnComplete=function(scriptID,averageRating,ratingCount){ if(mGetAverageRatingOnCompleteFunc!=null){ mGetAverageRatingOnCompleteFunc(averageRating,ratingCount,mGetAverageRatingOnCompleteArgs); mGetAverageRatingOnCompleteFunc=null; mGetAverageRatingOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.SubmitRating=function(topicID,rating,comment){ AddScriptTag("SubmitRating","gServiceClient.SubmitRatingOnComplete",[["TopicID",topicID],["Rating",rating],["Comment",comment]]);} this.SubmitRatingOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.GetTopicComments=function(topicID,userGuid,userName,onCompleteFunc,onCompleteArgs){ var scriptID=AddScriptTag("GetTopicComments","gServiceClient.GetTopicCommentsOnComplete",[["TopicID",topicID],["UserGuid",userGuid],["Username",userName]]); var callbackData={OnCompleteFunc:onCompleteFunc,OnCompleteArgs:onCompleteArgs}; mCallbackMap.Add(scriptID,callbackData);} this.GetTopicCommentsOnComplete=function(scriptID,commentsXml){ var callbackData=mCallbackMap.GetItem(scriptID); var callbackFunc=callbackData.OnCompleteFunc; var callbackArgs=callbackData.OnCompleteArgs; if(callbackFunc!=null){ callbackFunc(commentsXml,callbackArgs); mCallbackMap.Remove(scriptID);} this.RemoveScriptTag(scriptID);} this.GetRecentComments=function(projectID,userGuid,userName,oldestComment,onCompleteFunc,onCompleteArgs){ mGetRecentCommentsOnCompleteFunc=onCompleteFunc; mGetRecentCommentsOnCompleteArgs=onCompleteArgs; AddScriptTag("GetRecentComments","gServiceClient.GetRecentCommentsOnComplete",[["ProjectID",projectID],["UserGuid",userGuid],["Username",userName],["Oldest",oldestComment]]);} this.GetRecentCommentsOnComplete=function(scriptID,commentsXml){ if(mGetRecentCommentsOnCompleteFunc!=null){ mGetRecentCommentsOnCompleteFunc(commentsXml,mGetRecentCommentsOnCompleteArgs); mGetRecentCommentsOnCompleteFunc=null; mGetRecentCommentsOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.GetAnonymousEnabled=function(projectID,onCompleteFunc,onCompleteArgs){ mGetAnonymousEnabledOnCompleteFunc=onCompleteFunc; mGetAnonymousEnabledOnCompleteArgs=onCompleteArgs; var src=mLiveHelpService+"GetAnonymousEnabled?ProjectID="+encodeURIComponent(projectID); AddScriptTag("GetAnonymousEnabled","gServiceClient.GetAnonymousEnabledOnComplete",[["ProjectID",projectID]]);} this.GetAnonymousEnabledOnComplete=function(scriptID,enabled){ if(mGetAnonymousEnabledOnCompleteFunc!=null){ mGetAnonymousEnabledOnCompleteFunc(enabled,mGetAnonymousEnabledOnCompleteArgs); mGetAnonymousEnabledOnCompleteFunc=null; mGetAnonymousEnabledOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.StartActivateUser=function(xmlDoc,onCompleteFunc,onCompleteArgs){ mStartActivateUserOnCompleteFunc=onCompleteFunc; mStartActivateUserOnCompleteArgs=onCompleteArgs; var usernameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Username"); var username=FMCGetAttribute(usernameNode,"Value"); var emailAddressNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","EmailAddress"); var emailAddress=FMCGetAttribute(emailAddressNode,"Value"); var firstNameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","FirstName"); var firstName=FMCGetAttribute(firstNameNode,"Value"); var lastNameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","LastName"); var lastName=FMCGetAttribute(lastNameNode,"Value"); var countryNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Country"); var country=FMCGetAttribute(countryNode,"Value"); var postalCodeNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","PostalCode"); var postalCode=FMCGetAttribute(postalCodeNode,"Value"); var genderNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Gender"); var gender=FMCGetAttribute(genderNode,"Value"); var uiLanguageOrder=""; AddScriptTag("StartActivateUser","gServiceClient.StartActivateUserOnComplete",[["Username",username],["EmailAddress",emailAddress],["FirstName",firstName],["LastName",lastName],["Country",country],["Zip",postalCode],["Gender",gender],["UILanguageOrder",uiLanguageOrder]]);} this.StartActivateUserOnComplete=function(scriptID,pendingGuid){ if(mStartActivateUserOnCompleteFunc!=null){ mStartActivateUserOnCompleteFunc(pendingGuid,mStartActivateUserOnCompleteArgs); mStartActivateUserOnCompleteFunc=null; mStartActivateUserOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.StartActivateUser2=function(xmlDoc,onCompleteFunc,onCompleteArgs,thisObj){ var xml=CMCXmlParser.GetOuterXml(xmlDoc); this.StartActivateUser2OnComplete=function(scriptID,pendingGuid){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,pendingGuid,onCompleteArgs);} else{ onCompleteFunc(pendingGuid,onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.StartActivateUser2OnComplete=null;} AddScriptTag("StartActivateUser2","gServiceClient.StartActivateUser2OnComplete",[["Xml",xml]]);} this.UpdateUserProfile=function(guid,xmlDoc,onCompleteFunc,onCompleteArgs,thisObj){ var xml=CMCXmlParser.GetOuterXml(xmlDoc); this.UpdateUserProfileOnComplete=function(scriptID,pendingGuid){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,pendingGuid,onCompleteArgs);} else{ onCompleteFunc(pendingGuid,onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.UpdateUserProfileOnComplete=null;} AddScriptTag("UpdateUserProfile","gServiceClient.UpdateUserProfileOnComplete",[["Guid",guid],["Xml",xml]]);} this.CheckUserStatus=function(pendingGuid,onCompleteFunc,onCompleteArgs){ mCheckUserStatusOnCompleteFunc=onCompleteFunc; mCheckUserStatusOnCompleteArgs=onCompleteArgs; AddScriptTag("CheckUserStatus","gServiceClient.CheckUserStatusOnComplete",[["PendingGuid",pendingGuid]]);} this.CheckUserStatusOnComplete=function(scriptID,status){ if(mCheckUserStatusOnCompleteFunc!=null){ var func=mCheckUserStatusOnCompleteFunc; var args=mCheckUserStatusOnCompleteArgs; mCheckUserStatusOnCompleteFunc=null; mCheckUserStatusOnCompleteArgs=null; func(status,args);} this.RemoveScriptTag(scriptID);} this.GetSynonymsFile=function(projectID,updatedSince,onCompleteFunc,onCompleteArgs){ mGetSynonymsFileOnCompleteFunc=onCompleteFunc; mGetSynonymsFileOnCompleteArgs=onCompleteArgs; AddScriptTag("GetSynonymsFile","gServiceClient.GetSynonymsFileOnComplete",[["ProjectID",projectID],["UpdatedSince",updatedSince]]);} this.GetSynonymsFileOnComplete=function(scriptID,synonymsXml){ if(mGetSynonymsFileOnCompleteFunc!=null){ mGetSynonymsFileOnCompleteFunc(synonymsXml,mGetSynonymsFileOnCompleteArgs); mGetSynonymsFileOnCompleteFunc=null; mGetSynonymsFileOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.GetVersion=function(onCompleteFunc,onCompleteArgs,thisObj){ this.GetVersionOnComplete=function(scriptID,version){ if(version==null){ mVersion=1;} else{ mVersion=version;} if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,mVersion,onCompleteArgs);} else{ onCompleteFunc(mVersion,onCompleteArgs);}} if(scriptID!=null){ this.RemoveScriptTag(scriptID);} this.GetVersionOnComplete=null;} if(mVersion==-1){ AddScriptTag("GetVersion","gServiceClient.GetVersionOnComplete");} else{ this.GetVersionOnComplete(null,mVersion);}}} function CMCFeedbackException(number,message,data){ CMCException.call(this,number,message); this.Data=data;} CMCFeedbackException.prototype=new CMCException(); CMCFeedbackException.prototype.constructor=CMCFeedbackException; CMCFeedbackException.prototype.base=CMCException.prototype;  function FMCOpenCommentDialog(reply,comment,parentCommentID){ var xmlDoc=CMCXmlParser.GetXmlDoc(MCGlobals.RootFolder+MCGlobals.SubsystemFile,false,null,null); var projectID=xmlDoc.documentElement.getAttribute("LiveHelpOutputId"); gServiceClient.GetAnonymousEnabled(projectID,FMCGetAnonymousEnabledOnComplete,[reply,comment,parentCommentID]);} function FMCGetAnonymousEnabledOnComplete(enabled,onCompleteArgs){ var reply=onCompleteArgs[0]; var comment=onCompleteArgs[1]; var parentCommentID=onCompleteArgs[2]; if(FMCIsHtmlHelp()){ onCompleteArgs.push(enabled); FMCRegisterCallback("Persistence",MCEventType.OnInit,function(args){ var reply=args[0]; var comment=args[1]; var parentCommentID=args[2]; var anonymousEnabled=args[3]; if(anonymousEnabled){ FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID);} else{ var userGuid=FMCLoadUserData("LiveHelpUserGuid"); if(userGuid==null){ gServiceClient.GetVersion(function(version){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(FMCRegisterUserDialogOnClose,args);},null,null);} else{ FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID);}}}, onCompleteArgs); return;} if(!enabled){ var userGuid=FMCReadCookie("LiveHelpUserGuid"); if(userGuid==null){ gServiceClient.GetVersion(function(version){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(FMCRegisterUserDialogOnClose,onCompleteArgs);},null,null);} else{ FMCRunCommentDialog(enabled,reply,comment,parentCommentID);}} else{ FMCRunCommentDialog(enabled,reply,comment,parentCommentID);}} function FMCRegisterUserDialogOnClose(onCloseArgs){ var reply=onCloseArgs[0]; var comment=onCloseArgs[1]; var parentCommentID=onCloseArgs[2]; FMCRunCommentDialog(false,reply,comment,parentCommentID);} function FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} var dlg=null; if(!reply){ dlg=new CMCAddCommentDialog(window,anonymousEnabled);} else{ dlg=new CMCReplyCommentDialog(window,anonymousEnabled,comment,parentCommentID);} dlg.Run(function(){ if(MCGlobals.TopicCommentsFrame!=null){ MCGlobals.TopicCommentsFrame.TopicComments_RefreshComments();} if(MCGlobals.BodyCommentsFrame!=null){ MCGlobals.BodyCommentsFrame.TopicComments_RefreshComments();}},null);} function FMCGetRatingOnComplete(averageRating,ratingCount){ var avgRatingIcons=document.getElementById("MCAverageRatingIcons"); var ratingCountSpan=document.getElementById("MCRatingCount"); var textNode=ratingCountSpan.childNodes[0]; if(!textNode){ textNode=ratingCountSpan.appendChild(document.createTextNode(""));} textNode.nodeValue=" based on "+ratingCount+" ratings"; avgRatingIcons.title="Topic rating: "+averageRating+"%"; FMCDrawRatingIcons(averageRating,avgRatingIcons); var loadingImg=document.getElementById("MCLoadingImage"); loadingImg.parentNode.removeChild(loadingImg);} function FMCEditUserProfile(){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} var xmlDoc=CMCXmlParser.GetXmlDoc(MCGlobals.RootFolder+MCGlobals.SubsystemFile,false,null,null); var projectID=xmlDoc.documentElement.getAttribute("LiveHelpOutputId"); gServiceClient.GetAnonymousEnabled(projectID,GetAnonymousEnabledOnComplete,null); function GetAnonymousEnabledOnComplete(enabled,onCompleteArgs){ if(FMCIsHtmlHelp()){ FMCRegisterCallback("Persistence",MCEventType.OnInit,PersistenceInitialized,null); return;} PersistenceInitialized(null); function PersistenceInitialized(args){ if(!enabled){ var userGuid=FMCLoadUserData("LiveHelpUserGuid"); gServiceClient.GetVersion(function(version){ if(userGuid==null){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(null,null);} else{ if(version==1){ alert("The Feedback Server you are connecting to does not support this feature."); return;} var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.EditUserProfile,version); dlg.Run(null,null);}},null,null);}}}} if(gRuntimeFileType=="Topic"){}  function SetRating(rating){ var iconContainer=document.getElementById("RatingIcons"); gTopicRating=rating; FMCDrawRatingIcons(gTopicRating,iconContainer);} function FMCTopicRatingIconsOnclick(e){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} if(!e){e=window.event;} var rating=FMCRatingIconsCalculateRating(e,this); var dlg=new MCGlobals.BodyFrame.CMCRatingDialog(MCGlobals.BodyFrame,rating); dlg.Run(RatingDialogOnClose,null);} function FMCTopicRatingIconsOnmousemove(e){ if(!e){e=window.event;} FMCRatingIconsOnmousemove(e,this);} function FMCTopicClearRatingIcons(e){ if(!e){e=window.event;} FMCClearRatingIcons(gTopicRating,this);} function RatingDialogOnClose(args){ MCGlobals.BodyFrame.FMCUpdateToolbarRating();} if(gRuntimeFileType=="Toolbar"){ var gTopicRating=0;}  function CalcVisibleItems(y){ var accordionTop=(gVisibleItems+1)*gcAccordionItemHeight; var itemOffset=(y-accordionTop>=0)?Math.floor((y-accordionTop)/gcAccordionItemHeight):Math.ceil((y-accordionTop)/gcAccordionItemHeight); gVisibleItems=Math.max(Math.min(gVisibleItems+itemOffset,gcMaxVisibleItems),0);} function RefreshAccordion(){ SetIFrameHeight(); for(var i=0;i=0;i--){ if(i>gVisibleItems-1){ continue;} var accordionItem=gAccordionItems[i]; currTop-=(accordionItem.style.height?parseInt(accordionItem.style.height):gcAccordionItemHeight); accordionItem.style.top=currTop+"px";} var accordionExpander=document.getElementById("AccordionExpander"); currTop-=parseInt(FMCGetComputedStyle(accordionExpander,"height")); accordionExpander.style.top=currTop+"px"; var navigationTop=document.getElementById("NavigationTop"); currTop-=parseInt(FMCGetComputedStyle(navigationTop,"height")); for(var i=0;i0&&stemk==0){ result.Ranking=result.Ranking+50;}} stemk++;} return true;}); return resultSet;} else if(tokenType==CMCToken.Phrase){ var tokenText=mToken.GetTokenText(); var terms=SplitPhrase(tokenText); var resultSet=null; for(var i=0;ititle2){ ret=1;}} return(ret*gCompareSet.mSortOrder);} CMCQueryResultSet.prototype.FindAdjacentEntries=function(results,token,buildWordMap,buildPhraseMap){ var newResults=new CMCQueryResultSet(); var wordList=SplitPhrase(token.GetTokenText()); var wordListMap=new CMCDictionary(); for(var j=0;j0){ isReply=true; styleClass="CommentReplyNode";} var subject=node.getAttribute("Subject"); var username=node.getAttribute("User"); var date=node.getAttribute("DateUTC"); var topicPath=node.getAttribute("TopicPath"); var topicTitle=node.getAttribute("TopicTitle"); var outerDiv=document.createElement("div"); var innerDiv=document.createElement("div"); var subjectDiv=document.createElement("div"); var subjectSpan=document.createElement("span"); var infoDiv=document.createElement("div"); var img=document.createElement("img"); outerDiv.appendChild(innerDiv); outerDiv.style.marginLeft=indent+"px"; innerDiv.setAttribute("MadCap:bgColor","Transparent"); innerDiv.setAttribute("MadCap:bgColorSelected",CMCFlareStylesheet.LookupValue("Control",styleClass,"BackgroundColor","CEE3FF")); innerDiv.style.cursor="default"; innerDiv.onclick=RecentComments_CommentOnclick; var a=document.createElement("a"); a.href="javascript:void( 0 );"; a.onclick=RecentComments_CommentANodeOnclick; innerDiv.appendChild(a); subjectDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontFamily","Arial"); subjectDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontSize","12px"); subjectDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontWeight","bold"); subjectDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontStyle","normal"); subjectDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectColor","#000000"); subjectDiv.appendChild(img); subjectDiv.appendChild(subjectSpan); if(FMCIsSafari()){ subjectSpan.innerHTML=subject;} else{ subjectSpan.appendChild(document.createTextNode(subject));} a.appendChild(subjectDiv); if(username){ var userSpan=document.createElement("span"); userSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontFamily","Arial"); userSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontSize","10px"); userSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontWeight","normal"); userSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontStyle","normal"); userSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoColor","#000000"); if(FMCIsSafari()){ userSpan.innerHTML=username;} else{ userSpan.appendChild(document.createTextNode(username));} infoDiv.appendChild(userSpan);} if(date){ if(username){ infoDiv.appendChild(document.createTextNode(" "));} var dateObj=CMCDateTimeHelpers.GetDateFromUTCString(date); var dateSpan=document.createElement("span"); dateSpan.appendChild(document.createTextNode(CMCDateTimeHelpers.ToUIString(dateObj))); dateSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontFamily","Arial"); dateSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontSize","10px"); dateSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontWeight","normal"); dateSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontStyle","italic"); dateSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampColor","#000000"); infoDiv.appendChild(dateSpan);} infoDiv.style.marginLeft="16px"; a.appendChild(infoDiv); if(topicTitle==null){ topicTitle=topicPath;} if(topicTitle!=null){ var topicA=document.createElement("a"); topicA.appendChild(document.createTextNode(topicTitle)); topicA.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontFamily","Arial"); topicA.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontSize","10px"); topicA.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontWeight","normal"); topicA.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontStyle","italic"); topicA.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkColor","#000000"); if(topicPath!=null){ if(FMCIsHtmlHelp()){ topicPath="/"+topicPath;} else{ var helpSystem=MCGlobals.BodyFrame.FMCGetHelpSystem(); var path=new CMCUrl(helpSystem.GetPath()+helpSystem.ContentFolder+topicPath); if(helpSystem.UseCustomTopicFileExtension){ path=path.ToExtension(helpSystem.CustomTopicFileExtension);} topicPath=path.FullPath; topicA.setAttribute("target","body");} topicA.setAttribute("href",topicPath);} var topicDiv=document.createElement("div"); topicDiv.style.marginLeft="16px"; topicDiv.appendChild(topicA); a.appendChild(topicDiv);} var bodyNode=FMCGetChildNodeByTagName(node,"Body",0); if(bodyNode){ var commentNode=bodyNode.childNodes[0]; if(commentNode){ var comment=commentNode.nodeValue; var commentDiv=document.createElement("div"); commentDiv.appendChild(document.createTextNode(comment)); commentDiv.style.marginLeft="16px"; commentDiv.style.display="none"; commentDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontFamily","Arial"); commentDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontSize","10px"); commentDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontWeight","normal"); commentDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontStyle","normal"); commentDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyColor","#000000"); innerDiv.appendChild(commentDiv);}} outerDiv.appendChild(document.createElement("br")); var commentsNode=FMCGetChildNodeByTagName(node,"Comments",0); if(isReply){ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/CommentReply.gif",16,16); RecentComments_Build(commentsNode,outerDiv,indent+16);} else{ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/Comment.gif",16,16);} htmlNode.appendChild(outerDiv);}} var gRefreshCount=0; function RecentComments_RefreshComments(e){ if(!e){e=window.event;} gRefreshCount++; GetRecentComments();} var gSelectedComment=null; function RecentComments_CommentOnclick(e){ if(!e){e=window.event;} if(gSelectedComment){ var c1=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColor"); var c2=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColorSelected"); gSelectedComment.setAttribute("MadCap:bgColor",c2); gSelectedComment.setAttribute("MadCap:bgColorSelected",c1); gSelectedComment.style.backgroundColor=c2;} var bgColor=FMCGetMCAttribute(this,"MadCap:bgColor"); var bgColorSelected=FMCGetMCAttribute(this,"MadCap:bgColorSelected"); this.setAttribute("MadCap:bgColor",bgColorSelected); this.setAttribute("MadCap:bgColorSelected",bgColor); this.style.backgroundColor=bgColorSelected; gSelectedComment=this;} function RecentComments_CommentANodeOnclick(){ var commentDiv=FMCGetChildNodeByTagName(this.parentNode,"DIV",0); FMCToggleDisplay(commentDiv);} function BackOnclick(){ window.history.go(-1);} if(gRuntimeFileType=="RecentComments"){ var gInit=false; gOnloadFuncs.push(RecentComments_WindowOnload); if(FMCIsHtmlHelp()){ window.name="recentcomments";}}  function Search_WindowOnload(){ if(FMCIsLiveHelpEnabled()){ var projectID=FMCGetHelpSystem().LiveHelpOutputId; gServiceClient.GetSynonymsFile(projectID,null,GetSynonymsFileOnComplete,null);} if(MCGlobals.NavigationFrame!=null){ Search_WaitForPaneActive();} else{ Search_Init(null);}} function Search_WaitForPaneActive(){ if(MCGlobals.NavigationFrame.gActivePane==window.name){ MCGlobals.NavigationFrame.SetIFrameHeight(); Search_Init(null);} else{ window.setTimeout(Search_WaitForPaneActive,1);}} function GetSynonymsFileOnComplete(synonymsXmlDoc,onCompleteArgs){ var xmlDoc=CMCXmlParser.LoadXmlString(synonymsXmlDoc); gDownloadedSynonymXmlDoc=xmlDoc;} function Search_FMCAddToFavorites(){ var favoritesFrame=parent.frames["favorites"]; favoritesFrame.Favorites_FMCAddToFavorites("search",document.forms["search"].searchField.value); favoritesFrame.FMCLoadSearchFavorites();} function Search_Init(OnCompleteFunc){ if(gInit){ document.forms["search"].searchField.focus(); if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.getElementById("SearchResults"),MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ var inputs=document.getElementsByTagName("input"); inputs[0].tabIndex=gTabIndex++; inputs[1].tabIndex=gTabIndex++; if(gFavoritesEnabled){ var td=document.createElement("td"); document.getElementById("SearchButton").parentNode.parentNode.appendChild(td); MakeButton(td,gAddSearchLabel,gAddSearchIcon,gAddSearchOverIcon,gAddSearchSelectedIcon,gAddSearchIconWidth,gAddSearchIconHeight,String.fromCharCode(160)); td.getElementsByTagName("div")[0].onclick=Search_FMCAddToFavorites; td.getElementsByTagName("div")[0].onkeyup=Search_ItemOnkeyup;} var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ gSearchDBs=masterHS.GetSearchDBs();} gFilters=new CMCFilters(); gFilters.CreateFilterCombo(); document.forms["search"].style.display=""; gInit=true; document.forms["search"].searchField.focus(); EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}}} function ApplySearchFilter(){ var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ var searchFilter=document.getElementById("SearchFilter"); var filterName=searchFilter?searchFilter.options[searchFilter.selectedIndex].text:gUnfilteredLabel; gFilteredSet=gFilters.ApplyFilter(filterName); if(gFilteredSet==null){ return;} gFilteredSet.SetRankPositions(); Sort("rankPosition",false); GenerateResultsTable();}} function StartSearch(firstPick,OnSearchFinishedFunc,CallbackFuncArgs){ var searchString=document.forms["search"].searchField.value; if(!searchString||FMCTrim(searchString)==""){ return;} var rootFrame=parent.parent; StartLoading(window,document.getElementById("SearchResults"),rootFrame.gLoadingLabel,rootFrame.gLoadingAlternateText,null); gOnSearchFinishedFunc=OnSearchFinishedFunc; gCallbackFuncArgs=CallbackFuncArgs; FMCRegisterCallback("Search",MCEventType.OnInit,StartSearch2,firstPick);} function StartSearch2(firstPick){ var searchString=document.forms["search"].searchField.value; var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ DoSearch(searchString);} else{ var searchFilter=document.getElementById("SearchFilter"); var filterName=null; if(searchFilter!=null){ filterName=searchFilter.options[searchFilter.selectedIndex].text; if(filterName==gUnfilteredLabel){ filterName=null;}} function OnSearchWebHelpPlusComplete(){ if(firstPick){ var firstResult=document.getElementById("searchResultsTable").firstChild.childNodes[1]; if(firstResult.onclick){ firstResult.onclick();}}} DoSearchWebHelpPlus(searchString,filterName,OnSearchWebHelpPlusComplete);} EndLoading(window,null); if(!masterHS.IsWebHelpPlus){ if(firstPick){ var firstResult=document.getElementById("searchResultsTable").firstChild.childNodes[1]; if(firstResult.onclick){ firstResult.onclick();}}}} function CMCSearchResult(rank,rankPosition,title,link){ this.Rank=rank; this.RankPosition=rankPosition; this.Title=title; this.Link=link;} function CMCSearchResultSet(){ this.mResults=new Array(); this.SortColumn=null; this.Sortorder=null;} CMCSearchResultSet.prototype.Add=function(searchResult){ this.mResults.push(searchResult);}; CMCSearchResultSet.prototype.GetItem=function(index){ return this.mResults[index];}; CMCSearchResultSet.prototype.GetLength=function(){ return this.mResults.length;}; CMCSearchResultSet.prototype.Sort=function(sortColumn){ if(this.SortColumn==sortColumn){ if(this.SortOrder==EMCSortOrder.Ascending){ this.SortOrder=EMCSortOrder.Descending;} else if(this.SortOrder==EMCSortOrder.Descending){ this.SortOrder=EMCSortOrder.Ascending;}} else{ if(sortColumn==EMCSortColumn.Rank){ this.SortOrder=EMCSortOrder.Ascending;} else if(sortColumn==EMCSortColumn.RankPosition){ this.SortOrder=EMCSortOrder.Descending;} else if(sortColumn==EMCSortColumn.Title){ this.SortOrder=EMCSortOrder.Descending;}} this.SortColumn=sortColumn; this.mResults.sort(this.CompareResults);}; CMCSearchResultSet.prototype.CompareResults=function(a,b){ var value1=null; var value2=null; var ret=0; if(gSearchResultSet.SortColumn==EMCSortColumn.Rank){ value1=a.Rank; value2=b.Rank; ret=value1-value2;} else if(gSearchResultSet.SortColumn==EMCSortColumn.RankPosition){ value1=a.RankPosition; value2=b.RankPosition; ret=value1-value2;} else if(gSearchResultSet.SortColumn==EMCSortColumn.Title){ value1=a.Title; value2=b.Title; if(value1value2){ ret=1;}} if(gSearchResultSet.SortOrder==EMCSortOrder.Ascending){ ret*=-1;} return ret;}; var EMCSortColumn=new function(){} EMCSortColumn.Rank=0; EMCSortColumn.RankPosition=1; EMCSortColumn.Title=2; var EMCSortOrder=new function(){} EMCSortOrder.Ascending=0; EMCSortOrder.Descending=1; function DoSearchWebHelpPlus(searchString,filterName,OnCompleteFunc){ function OnGetSearchResultsComplete(xmlDoc,args){ gSearchResultSet=new CMCSearchResultSet(); var results=xmlDoc.getElementsByTagName("Result"); var resultsLength=results.length; for(var i=0;i0||chunk||mergeHint); var bookIcon=null; var bookOpenIcon=null; var topicIcon=null; var markAsNew=null; var topicIconAlt="Topic"; var bookIconAlt="Book"; var markAsNewIconAlt="New"; div.style.textIndent=indent+"px"; div.style.position="relative"; div.style.display="none"; var entryClass=entry.getAttribute("Class"); var className="TocEntry_"+((entryClass==null)?"TocEntry":entryClass); var aCached=gClassToANodeMap.GetItem(className); var nameToValueMap=gStylesMap.GetItem(className); if(!aCached){ aCached=document.createElement("a"); if(nameToValueMap){ nameToValueMap.ForEach(function(key,value){ var style=ConvertToCSS(key); aCached.style[style]=value; return true;});} gClassToANodeMap.Add(className,aCached);} a=aCached.cloneNode(false); a.setAttribute("MadCap:className",className); a.onmouseover=TocEntryOnmouseover; a.onmouseout=TocEntryOnmouseout; if(nameToValueMap){ bookIcon=nameToValueMap.GetItem("BookIcon"); bookOpenIcon=nameToValueMap.GetItem("BookOpenIcon"); topicIcon=nameToValueMap.GetItem("TopicIcon"); var value=nameToValueMap.GetItem("TopicIconAlternateText"); if(value){topicIconAlt=value;} value=nameToValueMap.GetItem("BookIconAlternateText"); if(value){bookIconAlt=value;} value=nameToValueMap.GetItem("MarkAsNewIconAlternateText"); if(value){markAsNewIconAlt=value;} var markAsNewValue=nameToValueMap.GetItem("MarkAsNew"); if(markAsNewValue){ markAsNew=FMCStringToBool(markAsNewValue);}} if(link&&!mergeHint){ if(link.charAt(0)=="/"){ link=fullPath+link.substring(1);} a.setAttribute("href",link); if(!frameName){ frameName="body";} a.setAttribute("MadCap:frameName",frameName);} else{ a.setAttribute("href","javascript:void( 0 );");} var ownerHelpSystem=GetOwnerHelpSystem(htmlNode); var subPath=null; if(mergeHint){ var subsystem=ownerHelpSystem.GetSubsystem(parseInt(mergeHint)); if(!subsystem.GetExists()){ continue;} subPath=subsystem.GetPath(); var fileName=null; if(window.name=="toc"){ if(!subsystem.HasToc()){ continue;} fileName="Toc.xml";} else if(window.name=="browsesequences"){ if(!subsystem.HasBrowseSequences()){ continue;} fileName="BrowseSequences.xml";} chunk=subPath+"Data/"+fileName; a["MadCap:helpSystem"]=subsystem; var replaceMergeNode=FMCGetAttributeBool(entry,"ReplaceMergeNode",false); if(replaceMergeNode){ var subTocDoc=CMCXmlParser.GetXmlDoc(chunk,false,null,null); div.appendChild(a); htmlNode.appendChild(div); BuildToc(subTocDoc.documentElement,div,indent,subPath); var newDivs=FMCGetChildNodesByTagName(div,"DIV"); htmlNode.removeChild(div); for(var j=0;j0){ a.onclick=BookOnClick;} if(bookIcon=="none"){ img=null;} else{ var src="Images/Book.gif"; var width=16; var height=16; if(bookIcon){ bookIcon=FMCStripCssUrl(bookIcon); bookIcon=decodeURIComponent(bookIcon); src="../"+parent.parent.gSkinFolder+escape(bookIcon); width=CMCFlareStylesheet.GetResourceProperty(bookIcon,"Width",16); height=CMCFlareStylesheet.GetResourceProperty(bookIcon,"Height",16);} img.src=src; img.alt=bookIconAlt; if(!bookOpenIcon||bookOpenIcon=="none"){ img.setAttribute("MadCap:altsrc","Images/BookOpen.gif");} else{ bookOpenIcon=FMCStripCssUrl(bookOpenIcon); bookOpenIcon="../"+parent.parent.gSkinFolder+escape(bookOpenIcon); img.setAttribute("MadCap:altsrc",bookOpenIcon); FMCPreloadImage(bookOpenIcon);} img.style.width=width+"px"; img.style.height=height+"px"; img.style.verticalAlign="middle";}} else{ a.onclick=TopicOnClick; if(topicIcon=="none"){ img=null;} else{ var src="Images/Topic.gif"; var width=16; var height=16; if(topicIcon){ topicIcon=FMCStripCssUrl(topicIcon); topicIcon=decodeURIComponent(topicIcon); src="../"+parent.parent.gSkinFolder+escape(topicIcon); width=CMCFlareStylesheet.GetResourceProperty(topicIcon,"Width",16); height=CMCFlareStylesheet.GetResourceProperty(topicIcon,"Height",16);} img.src=src; img.alt=topicIconAlt; img.style.width=width+"px"; img.style.height=height+"px"; img.style.verticalAlign="middle";}} var markAsNewEntry=entry.getAttribute("MarkAsNew"); var markAsNewComputed=markAsNewEntry?FMCStringToBool(markAsNewEntry):markAsNew; if(markAsNewComputed){ var newImg=document.createElement("img"); newImg.src="Images/NewItemIndicator.bmp"; newImg.alt=markAsNewIconAlt; newImg.style.width="7px"; newImg.style.height="7px"; newImg.style.position="absolute"; a.appendChild(newImg);} img?a.appendChild(img):false; var text=document.createTextNode(title); a.appendChild(text); div.appendChild(a); htmlNode.appendChild(div); BuildToc(entry,div,indent+16,mergeHint?subPath:fullPath);}} function CacheStyles(){ var stylesDoc=CMCXmlParser.GetXmlDoc(parent.parent.gRootFolder+parent.parent.gSkinFolder+"Stylesheet.xml",false,null,null); var styles=stylesDoc.getElementsByTagName("Style"); var tocEntryStyle=null; for(var i=0;i0){ var nameToValueMap=new CMCDictionary(); var props=properties[0].childNodes; for(var i=0;i0){ var nameToValueMap=new CMCDictionary(); var props=properties[0].childNodes; for(var j=0;j=0){ var format=formatString.substring(i+1,endPos); if(format=="n"){ var topicIndexNode=document.createElement("span"); topicIndexNode.setAttribute("id","MCCurrentTopicIndex"); span.appendChild(topicIndexNode); var topicIndexTextNode=document.createTextNode(""); topicIndexNode.appendChild(topicIndexTextNode);} else if(format=="total"){ var topicTotalNode=document.createElement("span"); topicTotalNode.setAttribute("id","MCTopicTotal"); span.appendChild(topicTotalNode); var topicTotalTextNode=document.createTextNode(""); topicTotalNode.appendChild(topicTotalTextNode);} i=endPos;}} else{ currText+=c;}} var remainingTextNode=document.createTextNode(currText); span.appendChild(remainingTextNode); FMCRegisterCallback("Body",MCEventType.OnInit,OnBodyInitSetCurrentTopicIndex,null);} function OnBodyInitSetCurrentTopicIndex(){ var span=document.getElementById("MCCurrentTopicIndexContainer"); if(span==null){ return;} if(MCGlobals.InPreviewMode){ SetCurrentTopicIndexSequenceIndex(0); SetCurrentTopicIndexTotal(0); OnCompleteBoth();} else{ var master=FMCGetHelpSystem(); var file=master.GetBrowseSequenceFile(); var bsPath=MCGlobals.BodyFrame.CMCUrl.QueryMap.GetItem("BrowseSequencePath"); var href=FMCGetBodyHref(); if(bsPath==null){ bsPath=FMCGetMCAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:browseSequencePath"); if(bsPath==null){ OnCompleteGetEntrySequenceIndex(-1); return;} var fullBsPath=master.GetFullTocPath("browsesequences",href.PlainPath); if(fullBsPath){ bsPath=bsPath?fullBsPath+"|"+bsPath:fullBsPath;}} if(bsPath==""||bsPath.StartsWith("$$$$$")){ OnCompleteGetEntrySequenceIndex(-1); return;} file.GetEntrySequenceIndex(bsPath,href,OnCompleteGetEntrySequenceIndex);} function OnCompleteGetEntrySequenceIndex(sequenceIndex){ if(sequenceIndex==-1){ span.style.display="none"; OnCompleteBoth(); return;} span.style.display=""; SetCurrentTopicIndexSequenceIndex(sequenceIndex); file.GetIndexTotalForEntry(bsPath,href,OnCompleteGetIndexTotalForEntry); function OnCompleteGetIndexTotalForEntry(total){ SetCurrentTopicIndexTotal(total); window.setTimeout(OnCompleteBoth,100);}}} function OnCompleteBoth(){ var span=document.getElementById("MCCurrentTopicIndexContainer"); span.parentNode.style.width=span.offsetWidth+"px"; if(gIsTopicToolbar){ SetIFrameFixedWidth();}} function SetCurrentTopicIndexSequenceIndex(sequenceIndex){ var topicIndexNode=document.getElementById("MCCurrentTopicIndex"); if(topicIndexNode!=null){ topicIndexNode.firstChild.nodeValue=sequenceIndex.toString();}} function SetCurrentTopicIndexTotal(total){ var topicTotalNode=document.getElementById("MCTopicTotal"); if(topicTotalNode!=null){ topicTotalNode.firstChild.nodeValue=total.toString();}} function SetIFrameFixedWidth(){ var buttonsTD=document.getElementById("ToolbarButtons"); var tds=buttonsTD.getElementsByTagName("td"); var totalWidth=0; for(var i=0,length=tds.length;i0){ isReply=true; styleClass="CommentReplyNode";} var subject=node.getAttribute("Subject"); var username=node.getAttribute("User"); var date=node.getAttribute("DateUTC"); if(date==null){ date=node.getAttribute("Date");} var outerDiv=document.createElement("div"); var innerDiv=document.createElement("div"); var subjectDiv=document.createElement("div"); var subjectSpan=document.createElement("span"); var infoDiv=document.createElement("div"); var img=document.createElement("img"); outerDiv.appendChild(innerDiv); outerDiv.style.marginLeft=indent+"px"; innerDiv.setAttribute("MadCap:commentID",node.getAttribute("CommentID")); innerDiv.setAttribute("MadCap:bgColor","Transparent"); innerDiv.setAttribute("MadCap:bgColorSelected",CMCFlareStylesheet.LookupValue("Control",styleClass,"BackgroundColor","CEE3FF")); innerDiv.style.cursor="default"; innerDiv.onclick=TopicComments_CommentOnclick; innerDiv.ondblclick=ReplyComment; var a=document.createElement("a"); a.href="javascript:void( 0 );"; a.onclick=TopicComments_CommentANodeOnclick; innerDiv.appendChild(a); subjectDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontFamily","Arial"); subjectDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontSize","12px"); subjectDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontWeight","bold"); subjectDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontStyle","normal"); subjectDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectColor","#000000"); subjectDiv.appendChild(img); subjectDiv.appendChild(subjectSpan); if(FMCIsSafari()){ subjectSpan.innerHTML=subject;} else{ subjectSpan.appendChild(document.createTextNode(subject));} a.appendChild(subjectDiv); if(username){ var userSpan=document.createElement("span"); userSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontFamily","Arial"); userSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontSize","10px"); userSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontWeight","normal"); userSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontStyle","normal"); userSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoColor","#000000"); if(FMCIsSafari()){ userSpan.innerHTML=username;} else{ userSpan.appendChild(document.createTextNode(username));} infoDiv.appendChild(userSpan);} if(date){ if(username){ infoDiv.appendChild(document.createTextNode(" "));} var dateObj=CMCDateTimeHelpers.GetDateFromUTCString(date); var dateSpan=document.createElement("span"); dateSpan.appendChild(document.createTextNode(CMCDateTimeHelpers.ToUIString(dateObj))); dateSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontFamily","Arial"); dateSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontSize","10px"); dateSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontWeight","normal"); dateSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontStyle","italic"); dateSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampColor","#000000"); infoDiv.appendChild(dateSpan);} infoDiv.style.marginLeft="16px"; a.appendChild(infoDiv); var bodyNode=FMCGetChildNodeByTagName(node,"Body",0); if(bodyNode){ var commentNode=bodyNode.childNodes[0]; if(commentNode){ var comment=commentNode.nodeValue; var commentDiv=document.createElement("div"); commentDiv.appendChild(document.createTextNode(comment)); commentDiv.style.marginLeft="16px"; commentDiv.style.display="none"; commentDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontFamily","Arial"); commentDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontSize","10px"); commentDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontWeight","normal"); commentDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontStyle","normal"); commentDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyColor","#000000"); innerDiv.appendChild(commentDiv);}} outerDiv.appendChild(document.createElement("br")); var commentsNode=FMCGetChildNodeByTagName(node,"Comments",0); if(isReply){ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/CommentReply.gif",16,16); TopicComments_Build(commentsNode,outerDiv,indent+16);} else{ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/Comment.gif",16,16);} htmlNode.appendChild(outerDiv);}} var gRefreshCount=0; function TopicComments_RefreshComments(e){ if(!e){e=window.event;} gRefreshCount++; var loadingImg=document.getElementById("MCLoadingImage"); if(loadingImg==null){ loadingImg=document.createElement("img"); loadingImg.id="MCLoadingImage"; loadingImg.src="Images/LoadingAnimated.gif"; loadingImg.style.width="16px"; loadingImg.style.height="16px"; loadingImg.style.position="absolute"; loadingImg.style.top="5px"; loadingImg.style.left="5px"; document.body.insertBefore(loadingImg,document.body.childNodes[0]);} gSelectedComment=null; var topicID=FMCGetMCAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:liveHelp"); if(FMCIsHtmlHelp()){ FMCRegisterCallback("Persistence",MCEventType.OnInit,function(args){ var topicID=args.TopicID; var refreshCount=args.RefreshCount; var userGuid=FMCLoadUserData("LiveHelpUserGuid"); MCGlobals.BodyFrame.gServiceClient.GetTopicComments(topicID,userGuid,null,GetTopicCommentsOnComplete,refreshCount);},{TopicID:topicID,RefreshCount:gRefreshCount});} else{ var helpSystem=MCGlobals.BodyFrame.FMCGetHelpSystem(); if(helpSystem.LiveHelpEnabled){ var userGuid=FMCReadCookie("LiveHelpUserGuid"); MCGlobals.BodyFrame.gServiceClient.GetTopicComments(topicID,userGuid,null,GetTopicCommentsOnComplete,gRefreshCount);} else{ loadingImg.parentNode.removeChild(loadingImg);}}} function AddComment(e){ if(!e){e=window.event;} var topicID=FMCGetAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:liveHelp"); if(topicID!=null){ MCGlobals.BodyFrame.FMCOpenCommentDialog(false,null,null);}} function ReplyComment(e){ if(!e){e=window.event;} if(gSelectedComment==null){ alert("Please select a comment to reply to."); return;} var comment=gSelectedComment.getElementsByTagName("div")[2].firstChild.nodeValue; var parentCommentID=FMCGetAttribute(gSelectedComment,"MadCap:commentID"); MCGlobals.BodyFrame.FMCOpenCommentDialog(true,comment,parentCommentID);} var gSelectedComment=null; function TopicComments_CommentOnclick(e){ if(!e){e=window.event;} if(gSelectedComment){ var c1=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColor"); var c2=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColorSelected"); gSelectedComment.setAttribute("MadCap:bgColor",c2); gSelectedComment.setAttribute("MadCap:bgColorSelected",c1); gSelectedComment.style.backgroundColor=c2;} var bgColor=FMCGetMCAttribute(this,"MadCap:bgColor"); var bgColorSelected=FMCGetMCAttribute(this,"MadCap:bgColorSelected"); this.setAttribute("MadCap:bgColor",bgColorSelected); this.setAttribute("MadCap:bgColorSelected",bgColor); this.style.backgroundColor=bgColorSelected; gSelectedComment=this;} function TopicComments_CommentANodeOnclick(){ var commentDiv=this.parentNode.getElementsByTagName("div")[2]; FMCToggleDisplay(commentDiv);} if(gRuntimeFileType=="TopicComments"){ var gInit=false; gOnloadFuncs.push(TopicComments_WindowOnload);} db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/dRSOverview_587x398.jpg0000644000175000017500000005512611520622610030240 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222K" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( (+su' m'AY (POp?2).rlHR!AhdEtnC)4洖Ju{5;-"u^cڦMWWu&ЍȾ ߢ.|B]Z=W;@'OUox8ږ`?Z[vk0 aM8HfW,o F9c(mʟAtNp})hBry&O?nZM$]'b ?ߢ_ bnmYbccd=YjGXCNv8hj'}F2͂p? ËU,R+ q @6=F8٧jwj~;$zA Wmc68m?7?XS^5hqcq>%%~QTmI65 ,1rMlYvܗ_[D2J8?Ҫǩk75ŝ@ :~4g`I'S&dQwz\sxN[hZ7,dO-]cVTT/FN6Pq2*JēZE{A|%GO@8Kzi]Rm#2@Y?Pk6C1{y.6$ Nhr@sK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@~/ xnBIx#k,2L[[t9X#(jS/d{7(cE"^ue!vLjXtb9]ö]i )_.4= q$cC. .>瞘̨a25!,q(-_,Yœd5{A'H9zG؊rF1}xݎh. zBzG_Uwn fH $ֺs FO3_3B ƬGLq@\ϫ37XX UR7cުk\`aq9jfR`uQRO{] G*phѣKƬ0vޭxhʟXyqjti&7FFpheGTԣ!Ad| '*0k+m,%J?Z帖}dSA4Ziw7>Ub=jOE#hSҷti+Dpp~f[#UW8ɠ i< 4'%V89k-RI(']cjľlq"H VYԫ(e=A9 E$w1h$^o4S0IPA\]3(oҕGu =Ƞ ma ˅Kk Y@i?+ u+bF\(U+TT]Ry1#]4iR$L@5m/- "A*Eb@:U,Hڀn֐[ª"@?ZY-=̐¢UQ 뺥f PA$t" qR5RzP y~'S&S@ӴSO[4gT 4r##:((((((((((B ~V - }M`~ d o_΀EPE!`:?Z((((((((((()3KUwmóv 5;qs7Ӥ?gnfm+yvZZKq!FKi3\Y3bi6rW=+XJ3y48j׷KyiY25Ya:w4kUWMY2X:$z62ZH@c+kgp4zd9v:?REF`deўN=xh'5K6ڵỴB+#cZԦtfw\H\~S~4sO13[eCb0 d|9A.J@mG\[{gi( fr:OүΙ|$*oC;ڠ((((((((((((((Mt=K:B%#hUo֘ Dj~{QZ~1Ֆ]$Dmr=)5}&C6ehUa#oO@*^ 1#=CU[MNOňd֕^+(!4'b((((((JI4 cMyܟ&m5K^O%(^7r`6@ {Sw5&BUV/Me#C ]jMmS9(oR;%s??:5JOG{]")jtoԿѪuuˡ4I@D~BSt|~׳iZrw|+d?Ξ<+]O@dPrJ_RK2$Qn?5xwKY![t*iB ?<}uZ<_fiǿfrۥsĿ#0pqq1#qI*Z.g eW'Zݟ\ŷ'3Z9.P퇭%s5 wF=>թחδg_?)|R#} E!5w:mkeBr={S)(J4gZ|hWDޕG%< tW7qy7Dw ?ZWBF9rY(VfJܸ d~gߊE;M3%yb? UG=}"퍀N;R}/m7// gfݟf?ƓnRr([dЗ'BéY\Cyo!b@j_8Um[Q[\@?*?3@ikmK-ZP藐OI=RZZ.Mɠw2EciOǦGv\HH9ӵlM=%X*+-#.'7HGjZ ڂ3 S$&gV+zYW|%nH2߮1_?Ҡee8#-vM;3fHov%ڲn~5[.E+Y~(|hNh7f[<5r?5L+qU?+:ĺ+>"ne@ ĻbX5h~9 oz'Lz5Q@ݡ|^үBEB3 [[O8aD+_u-OGt\J>W?.֭`HQ4+gԯCbPEQEQEQEQEQEOU=p? [U=p? @=*&# w4 &PzκZ\>ҚWbD^Gңɱ~jsUWҒ#Ѧ2_vGY^nǢ2:Է #+$WeDFJ'+źޥZeՅM?kPisVS]&ߒaƌwdhˬDڂ6lJҵڦw(N՚dmQ5JTFzRU |증FOߊӾթבց>E6 kQ}[XsBTz/a^Pk/ ytA'~5[ҹ==Ҧ9&OY%m]NS{B%:c2>Sϯ8jBCemu~d0H}+b4ߩ_2z8ַr(Qs^v*=A]8҆[0ķfyͯpnQV(+ZDY=!]WCUK3,7s8 q*ӏXj)ng IQYSZ߅ EP:&z鶟¡o 词U2E`c~q?Fo${$5QEqՀ6"?A+ᖫ `'k(pCZ 7~֬tR~kX!WѸ[<ڜ6 >i&QnNY":=O*TGx:3#pEt#)#&8?xb$3\ў 6:;ƺ@[<ܟ_֢<[Y['XsֹK EKE\Ȯ1A-+@GpFE|^RNF1GqVyjg]4:+-^:W|^^Aj>|rI 3PK2GX?O92<`ۻUMNe H$`ΛSoP#O ?Lԣ—#eKo%TrQ]+ĴCչ%U2ͅc?^j7EAW$t ҪKҭJ/J//kξ0(((((( { ~C5 { ~C4YחEY~zU+51*ÕaBԙ 6molO*G;`ư]J9!܎2 =?X5K Z5$\ 1r>VgHo$2~~#J;=Ny>cgcki y6F-=jf\y5V:t+RʳVϓf$j䕓!^8 %f/mJlKC=+xIp8 QN[[ /JhMͺV3=} a?#{u_ɪ&NF# ,8#%pg_?)|S#7le4?5j5}d9F@5 ɴxU(Pzy9664ktC®@7]2`_H=t=+FmiR-,mr0Z(IQEQEQEQEQEQEQEb>@; rm@m³ѿ'L? +~}ip@S #1 (]j3<ړjR@Z<1x4+O')n3]Y ԛVl+Ͼ/ȯk_kz yA 1 r) b#LX(GPmr_^g^k oʀ'z'z'z'z%UIUd rUY:U*(oҪKҀ!>:/u!Q@Q@Q@Q@Q@Q@_M|wJpA_M|wJpAJSң4 \P^z͖.i=\K+֩ū2Y+.ehP2=҅<'-ƣ/٬w2+OJER^&sj> ~M4k_z_V?WGV%8:Lz0 ~M4?B*i=)i5F2GHE `V&[*k-*{w:f-#8+7TD"t*KHJ[{dIlfhmGQz{V Diǚ_ijkM ?M;Zy i(AEPEPEPEf )2=ir=h((((((((>"}5<1h=nQE0Jzem*:_[%B T[Iހ*IUdRUY(VNjJ'J**S-8*5}|c![?) ((((((?k柃P넿 }-?k柃P넿 } zTMRP3+VgKIUHE6 AΝitCV$$sԥ&sH0IVZuV +SY8NOOR&A̳Gw Ìz.|Η'?ko DF9,Fsj|6_1-\'_(|PҶ3n9;'vc$M{}kl5#ΙP+]B3%:2 4Ph@Iu}:G;)$ua8QMϽej&ѴlF\ -G?&QvkX:o];-R#~kqXք% AJèdQ@Q@y ^^y,|P$},J*վ,ȽE pk5$qȊ6W+W/VJr[3ЩS:Ik ıGnT{mp3ָ@k8*4-u.SU繈b9Y@0=k5M|D2UY:U%$t=+C**wOWՕlB0(((((( { k:Jc08uiܝTd'#r~vWS €::jX'6|qw++q7օ/ mOu׏z2²^JW~f=sNaӋ ekG-Wg%_N~: 5] џ'=1pR1+ 5RgmrԊfHdxأ q@VVj3| *jzSXZҚ:mSzG-/ov˷AGZ BKe7Rwf`Vk2B*9?cyn͓Hk7Z7CL8V'ݕhdꢒ&GAS׮_6|_5y}59;y!S}>&z}b?u:j+Sqժ]~4;(gExM` +%,^} 8޵:5Ymy bR 8r}k#^^GCZtyj<%QT`QEQE_|oqH2CҗyQ{+k柋W/qPG?, h=y5+{R~pę5<#xJ8ofYt܍2{aO8wpx_E*-M$f?):@ _ WJ]Q]oj|E8x >&#~m˼-̬M==+5&($k[Ȱٍ9){ҖOA-hB}?Mο4 -R5.#˦s }O;DYvSW fWo\!bBj =?: CӘ퇖1ݏ_? wL_2KqusۓW{lW/q/<h 8][pw3r?, {$Kc~a@_|K'4 o~Wxk.DPfkAbX?uewПE#~$φPjFerqi/iW{fmOSk wKwhͰʱdn#'Ӯki}:[ZK0 ^3?0#W|)⛕I+{:Gf?h ήSQ.i^շGV+((*u3YA)/LZ_KaޓWV*picR )n| =ĖB!9x {J ,pR0+A~ ȷeq֫W%Hr`ޒ^V,.#yѫ8S8(Ճg^R5_T8*7~m̝=ZIJ7Gb(JGЧ%U2!GSR-}Jj;ԯb>VPqD©mX)_j_dʚ;d$ ¾ԬG-9*՘9G}QO)I\t_^%&_/P.)v_m_0spkHTRPWz+C(((((((ך}yom"d?q(+y*rj N**K-x*JxhVo]ZU12<8'`W}qz|[!.m t.U-ʫ+Gd*m*h9G 47|?!hzi?UL?[Wqg//ÏM{Z uik4]W9 #((((59}5G*#_־Wƾv-q-op%#Píz\*HV 7)^cЌW/Zl;6HP#9=:+??8 {[|ƘKڝP"gX~4woAj" Y??^]KO%\WƩ=..׏{y^y1gzFj^i1BQA(ܩ8ax/Zk:ݭ4v*IL{R?5[[C Q}8}*>W>!CvY3t(n|7;Wl J- V0k)%ȑF|28]tgzCZDwP(Py?vkxM y%@O Xn颋t`#ይ:$tBĞNjhjREHq@bftJ&W6x|*s~jͦO<)?1 R1l\zMr}] TˠuA٫Ě{<3~FTJڏyQEu6QEQUOW-딅;dz׼CV*oݑ(8}jF((]ŽG\Fw">`?w/j59DיSJ3T5 _xsX0\D#`qsӳA'2k-=rO֟MI\ 5دYBV }k#Im+/ݛ!cǨ3lͿr|^&ghe,Bpxg*,JCޜ)rCЍ&Zj) j {<n4cWFYޙAo1#c|GQK쨢>t*)"D4gs+񗌭!kB=ec_^?xO$Q+{m"=ZðL{ՏKX.Ej<qz/1QWEG¯+ub?[!)|=/@d?؏Ոs Deo,3]¼?DFZ)ب'6 l i}o U?r/H>KTZۗGMz< U9|'Nm2*(ClvU?CuOPCtPMSK S`?<ա?*Eb?(@hZKj` ѮVJ?iGXiV}APr}@[= e+ss.N,v;;8ï5/][sn\q Q {Xr ـb#'š >IZYvkLQjWOi-hle>ejzD7èJ/x?@G>hh$ãU]μϒ^=h ( ( ( ( ( ( ( ( L Z((((((()ko!Dd5G~I]NMB+Vr?;kׇGEVI'BG  P,N*Iq33س1Ii9sJp5F z(ib+%fl|/ #ݹkfn>:5T(]Xx9iQ%&C#V=k8t nl!M$ a׏__A`zVӂ<..xisG>N^Ư5/hCE]~`~jvfzG0?5{&4ƯwO~V'T肶,Væ0;N?J u&y h<'~ޯjx|Id?Mx9]\U Ͽɽ7/0w8Bos*TUsB|;tnl4,]z~\(>(t]ʣ/Sߑ[|dV6H4f9oI1ҺLPΙ.YL>hxv?Z^ Z^ۦnוƝqGא=={ Xr>/Ū_Ą+# <7]l=?+u1}=2qwFU´9&}oq)42,ʲ*Zm֬r9c^N`Ypץv¢ L;kIK ( ( *ۭlHO3;sՌ6(QEQEQEQEQERgbiFalhIK@(3I@ Id5,W3HmaJj;+AxV- efa ޟN:ܗWr9c$呤݉,rIJ~0PGM_p+3(-uMc[hj'dc^hGcB0[ɫN<$9A;x#$ jTK]񊊲>BYV.EU(P1EQEQEQEQEQEQEQEQEQEQEQE"13|dNgG?vWR2RҔT*58n|AxLD&KuuYs\U)?#pb#QEdvKoq5=ʺ1TTSI3дRB b#*x ;Vb\2;O#:򥷹a5E(O+hWkseTkOeZWĝR,wѥcUiŸO)RD=NA>%kۙ4h1%_Scs<5 VėF֣}7*瀽61{6[zlWu(]HM >ʹTz?SN?ŠdR$,da`ra!EPEPEPEPEkvw$p˷ݵeF.MF;_"Wz.:QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE&r%EmqIWZ2qw>k&w2z޳k:R64Gמ tSю|>5:b{xl_3v7S7R/TuGU뙦=uaQsA(FEPMBZ]M\UķWO<$y&Ĩ;QE=# E~G{;^ | ,lUІVA~k`.^CsѾԿϝ0|CgQFh ( ( Ҥ140TAuol廹p2!^!?\xRk2DQg=|Rz\qթ>.'?(I _2i"|cr1w˻319%M6wQE!Q@T$K1@';IH^NȎ n$XFgcU$h5+ßs^ߍz67DOXgPoF\ϗ`)(J>%[1^Xz5@Gd*'%dt*•U9EvZ׀wI-#ƹ)}F{gqJ;SCJQPtQ@ ^x7աDvNvV m`ooAWosm 2Qhz֦WTZY,djG iFO=? 0+hЊj7Ҿ0e}J(O»]/@ttŕ#wGӢQKcͩVu)Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@eHyI=WzFauuLuUkOs]|B_Ʋ'&jOZYì=}ެJ+CM/YvJʎi ]Ros =?2*NmE8ݎ?uGíJll=;Fcek^XIuFIo?1to-jyܧih^ܤjk?V+48[}GHr:|\zC@4Gƀ70`L?Q_8+`H z ZЭ2<»e5ч)g{IU]tf(4WAQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@EpuƵ]*݇r3)?#]Q}]CZ% d:c< RWV4?g5;^ǎ> ls U4+I IۋBiڄ@2<6U\f͈Y͎3U/U!ճjZT6{i#H͏\sK!w?BzǯtvZ'?O?#bCUsUePQOlR QxQ|g f>Zcd[덈qךxӥd.>bA@gtsxOK(-@TQEQE!Oöm YG_kbiO?-܃#GV>iZ]l ѷQUF]&[fGxRGgתJST\iQZAEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPdb*$ wusO2rd@5|AƙljX .'cqOmxn'21m\UaLӬl$BG2ޅSS#4:8ٛ9Ү)>"rvEkzvU.;LZLVPxB,z{CYkE9EsEԗNL>yUY.z[ė-"ܑ ѾC~5,@}r)P=tU[CiJM@ӗĿ4;]7~b?*5x0]\k^#3+-?q~UU# ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (jW蘌xy~?MAٶ#b{/]^Mš]]Mg%UdG'rO?A]|FFiSc 7 x[a@;!mjäo0(~Fz)wW*Hk~\vu%O* :4_"cY|`{í~ҭ?.fM0cq~/JZ@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEUImb$d"xmVj]&SS/dr):@ LU< 9$\v7cυ 5oYо3= -?q4vE#}3T 0"\ۖ"{eI8k~0WmD,9?\`~}S͛Y%Tw];Y^P+J 'ιJ)ƳlrOҵ~iS.)BL@yO*Gum@R#_5eXfB{Z@wB(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPCW:?R$bgjԀ?JK~]sFu^61b1GҼ'Q?iޗ|SM%zw(OT( Ew]j%:nI9$䒤}zP>}GQ ÿ?C*/7|;A=S'QHž#Ҵ fc9?@9`;x#% jT xcmz^yV*  BkhQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEPzQEdJ{{ [~BִIZ]$?ߑ6xaʉ %!Z{6] |ڀ5.EܽIcdtִAZ#tk7OzQ"&\hV椠aO?Jܪv֐x~xzUcy^]J\q&;n#\5W?5cH+6PYxȹ ÁP_Q=~B[>udUjsv6L=bL LD69*@ ީW);Fq=O; l$Q$uDQpgiZۚx&wnez Hڥ1q3J|d/u?tX2A"Ypvv"8푎:T5o)~ˍ|mcӵt4TwQ_YsnEܦ(((((((((((((((((((((((((((^O&x3mt &/miLF *NG+`-5%r^[YUk `p2vZ~}jf  U=I=:V}&G=Yԑ[(Ҁ9f_ar~uH*MCW6ڭ.V91ç]-sWt/u&y~zַ"El6C[ЈZ$1 F8 Z-H%?e?'? o&oKiᑎd80=T r9]?:.q>[1Wii6ԫ kZNt1޺9D. L )Cm VmJ ǭsMOZ5 7 [.8flu}?, Bl>բ(UTt` GE :V* ,|乎Gx@P@9]>%Ndُ}u[hU `0oyD^o ߝgxf[Y9brIZQEQEQEQEQEQEQEQEQEQEQEQEQEdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Glossary.htm0000644000175000017500000001267111520622606026600 0ustar directhexdirecthex Glossary

 

db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/0000755000175000017500000000000011520622616026227 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/Images/0000755000175000017500000000000011520622616027434 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/Images/ShowTags.jpg0000644000175000017500000000140011520622610031662 0ustar directhexdirecthexJFIF``LEAD Technologies Inc. V1.01 4"@.0&4LCPOKCIHT_yfTYr[HIijr}Qey>"">WIW  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?& R<=uǻu=(ڥ]70\4{8v (IFSz;j`P2ʍAN2}OĂ"T 0Ӝd qFUF ,#db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/Images/icon.jpg0000644000175000017500000000331411520622616031067 0ustar directhexdirecthexJFIF``LEAD Technologies Inc. V1.01  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3Psv>Wگ˫^[JKM93adžr\A .jz  ]ON[r|%~eհt3*5`N&XHCGV8l\pPTsO(>xω|-$ZH g^x7>%K_H>.>xl! 0Es%,3TV=9nW'~^gk=^P{>ngB'7,yyyc{_^yO'-0jf?el/E/mL./|uǑir)&Z|Io+Yh_֯W>~cľR!~$jiB@g!\_apiep~XJ߈R!ΧW&tc_5??xF4 Ɖh <#"mX~&s>G>ɝrQn3,]/k V2UJqeNjTcE2ugUQb8c_PG+ejN9ԧYεhQĬoAuO Sk?$9[MϋV0χ|W]C1y>SNkJ뮜e?Ed~Am=G}čN2Gk%xmƜZj[HMKOԭ=RPꑱLrL~/"cJu*8rҨ씠a0XSʜg# Z.&ivi嗆ll} tZF.jK,iMtUXZUP z(Ҝq+T:Xjjp'z$*SmDjJiJU%ʔ9ڌеzCjvh6C{kZZuIahWz ̶W'-̯u R,sT!NRFPUӥi*U#ȟkQRq!Rׄ:vks'd|ReūEg,%\$kQ:QTF.g)[\ъ(ة/o[ r"7fMb|ZiyB?J>yķR.ҙ5MCIFkvydd6sp1|QKQRJJI84(JF(F\_ Zm4tMhl[⚵%j'ZZԦcOwpܰ.G)"F91n00kak¥7J 2ѧVqRRd0uXYPwԛN-i(ԢZivpwm4p6ơ"H`}DTpaa9Ս pVrVjQRRWJל嬤ܞjU?i9OT!f, #{F+DKcdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/Code/0000755000175000017500000000000011520622616027101 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Content/Resources/Code/prettify.js0000644000175000017500000002731211520622614031310 0ustar directhexdirecthexfunction H(){var x=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);H=function(){return x};return x}(function(){function x(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var y="break continue do else for if return while ",U=y+"auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",D=U+"catch class delete false import new operator private protected public this throw true try ", I=D+"alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ",J=D+"boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",V=J+"as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ", K=D+"debugger eval export function get null set undefined var with Infinity NaN ",L="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",M=y+"and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",N=y+"alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ", O=y+"case done elif esac eval fi function in local set then until ",W=I+V+K+L+M+N+O;function X(b){return b>="a"&&b<="z"||b>="A"&&b<="Z"}function u(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Y=(function(){var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=","~","break","case","continue", "delete","do","else","finally","instanceof","return","throw","try","typeof"],a="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)";for(var c=0;c:&])/g,"\\$1")}a+="|^)\\s*$";return new RegExp(a)})(),P=/&/g,Q=//g,Z=/\"/g;function $(b){return b.replace(P,"&").replace(Q,"<").replace(R,">").replace(Z,""")}function E(b){return b.replace(P,"&").replace(Q,"<").replace(R,">")}var aa= /</g,ba=/>/g,ca=/'/g,da=/"/g,ea=/&/g,fa=/ /g;function ga(b){var a=b.indexOf("&");if(a<0)return b;for(--a;(a=b.indexOf("&#",a+1))>=0;){var c=b.indexOf(";",a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)==="x"){d=d.substring(1);g=16}var e=parseInt(d,g);if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(aa,"<").replace(ba,">").replace(ca,"'").replace(da,'"').replace(ea,"&").replace(fa," ")}function S(b){return"XMP"===b.tagName} function z(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push("<",c);for(var d=0;d");for(var e=b.firstChild;e;e=e.nextSibling)z(e,a);if(b.firstChild||!/^(?:br|link|img)$/.test(c))a.push("");break;case 2:a.push(b.name.toLowerCase(),'="',$(b.value),'"');break;case 3:case 4:a.push(E(b.nodeValue));break}}var F=null;function ha(b){if(null===F){var a=document.createElement("PRE"); a.appendChild(document.createTextNode('\n'));F=!/=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break; case "\n":a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join("")}}var ja=/(?:[^<]+| db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/index_Left.html0000644000175000017500000000300411520622616025607 0ustar directhexdirecthex WebHelp db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/index_CSH.html0000644000175000017500000000770011520622610025333 0ustar directhexdirecthex WebHelp db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/index.xml0000644000175000017500000000107211520622610024466 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/0000755000175000017500000000000011520622616023547 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/0000755000175000017500000000000011520622620024747 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/SearchGradient_over.jpg0000644000175000017500000000051611520622616031376 0ustar directhexdirecthexJFIFddDuckydAdobedY  c(d&f( ?@_Xe])]*odb4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/LogoPlus.gif0000644000175000017500000011535111520622614027213 0ustar directhexdirecthexGIF89a?=;::SRSXWXż[[\WWX{||[\\WXX[\[WXW̤CJO}P]qVZ=ճϭ)W_pz'`uhmEٗ{ js9a<<3tffb~WWVȼ䡠@?9QPK]\WrpgUTPWVRba]ûdc_{zvZYV^]Zihemkf_^\omjywtvtrJIIBAA\[[XWW˓zzzwwwuuusssqqqnnnjjjgggdddbbb```___]]]YYYUUUTTTPPPMMM)))!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_zU NE8̯TU˙d -K^=4iӎ'[sA7:_|SNqWWf/Mߜެ'~ ~yҬ|rn{(뿀Cxygo{_񥲛pW~dxφz=ẂsA`Z]}~(dS=# gш P3 g(щ b:p@ kŐ]"8 Wrx Z" C?`f~fUMgԛ+|*c׺u{]cyʱwd1MVGO!Fũ}03f Q͒7="3gY׳-# IjfۤY پ{80 H2Bp q#iT\!;t& ɣF< 3b 9%jU׽N$=2҉ `d :U$Ġaz#@PԠF5.gd g˘( RmrL@ Ag(#0 "\tUQ[bF3f{8n5?Zk6 y?Ո"<@*2ӫccջeV-)*0 m^2b7EFwE|Τ|57jV|97MD@Qf_4&LGy~~ +eh$hu'N6qgCĀ ? ||6w5gw P Ta(^gD!%M_MUt 0 ׇt@c&py7 `As_S`#& 'r` ?pX*7b%bVLGpDՉ xL|Q4QZ[&yJ7p'h(#p~ w1X Vmeq`P 8e^xфr&EQaRD s%QbpZZ}5t'~"h@ : Ghh7'dP!vKF52t GQKEP Y^M4Ws؉RL˔wtQcdŊygL׏p~⧏&!@@ GH "Qi eja I T儴0I&DYŅ$D?&YYʴ?Pybk[ 5t:i:Ѡ pBbK] XEHZhDeVPÖkLYs? EVcu_t~Y930Wh\d==f#?b2D% 첄PDIZqbc&oD`HٚEsHMZ.xGy7=@ ?lD&=2mө1N&#){KG  ODZ)fShD Т, О-j87ʢ+ʢ? nfD9I"ҀMҰC{}((~8`9+f~dh"I&D`5zv .P N4 " IzItf ?j=ڞ:?C =F *8ڢ 1J0ZD_ |H@M L* 4gz&p&؏BZ0&0#~$C"7B%O#i%o 47p*rp  V~J} &j|Y?2 䨌:jB*"fD_ I:АMJ`_+ȗɓ9Zڥ 0:u= z{D#M ԧ@ J@*6?FC ̀ L r& 5L|+Wړ` T[+P %[qF2@  ʤT"JMw^9+z:[@2k4-0-@2뮑Z|F^rcLW Sk ؀ T[.?õ8}iIFJɚsĬ@ . ܤtM|#jZiL+7dꪣ6S@??Yp뽅?9˼Y !`ZVzFc5k~p [L S%!Z!h`? ǻ pMKMlK o;ʣ@@++Tt Ya_^0U,LHڞ50Z)tkKkĻ> PPtId{=hnst IZѰ&;z{ ԫ:[@E1kj^S#ܮL 1 kNX0[P@ Р)`W$<l2@p@kxF,D**#HFny'~>iS0P*  {$,q_ 5|v@QhQ3H% =0P|-߇Ljo>KZ v銻H+;P' (n`#C%S˩Nv5;n2f, x4NG[eUIPZu^ lnw.ߓ=_FF_X@N`뤝{Nm^h\srPRߌ Ψڇ<ߓdo~ *jXG M,8Pj+e P @dӝW16Y#:p\>] Nt ח}yf\ jaS`Ը,e0_ w'N6]L4lٗ]c+_{kUj g]ɽ ^&pNl+bgRX],CRe` Ocy9vL4xED?0=?QP3X`빎Ϯ/dR/;\ Qc &~WQL& ݰ. .0!ep)<@h(}kx}@m؈ I]nSu cPVQ0\V`P0Y9gpbE68"C]LXŋ[HLgϤ&Mi 86j"0kװ̖Mm݄n [ NģW=|'@9WaŎ%[Yi՞J@> :.w={N͓DpDs0b>ܠ0( 39s6e<0sQ:Ve)4ƵH 7dqА-dȔ)SQ-crHpÐ z$Uz-ٵo.ʘOyT"h%gd0!k9wV P liG .  +ֲB 3̰+U`|zgxم ̥%{ i0)$h Q2q/yYl^_r4VF(< șf>;r4%Qk5\ dM-5׬!̤#CzmKe)`+NTcAH34R=,&Do[FF>I% @&@'LF9o@9/I}'Xkyb|xWJ c0VZ1LP#CӅՓ( J ނ@Fmw)"#HfS vk6 _et^@gu&$ a Q>%@?˯ i'n<?5vJu*f*g{WìT`9ha i,`Fٗj=&hdF!ڃZΕ֞Kdmd ˆ +y[o6K_*pmį*L#|&IH0&l '@ J72oXu.H T]UAXUw;Wn}QSqx94bF4JE$kip\nV>ů~ps[Wd~@x'`a]p[S2ԕ "$pW [1D#$9 c@@4B %@(Ke*JrAˇcBeMeš}*Dtwb 鹙@0iKFlqӛz\p6@G7S7 AYxf@@Ȁ=V'@ ^c> \j'f0x8CkQ.=ҘA ָǰA:R:7U/ǩ13U!Mmz۵-!bO1L`C@4FP %&.V#Ymf QOE ZFW7ryWd5 UB{0'x"?o2*CT _P{+tK(!7 .Ih#d  J"E-1O5r1J}-iQyZv,CPcXÆmҖWppXMr`(-fI!akvQ U!B`?ɫv3p5Y ҷ{Vlk$l(BB8<(40 dMّ@--ЍlG3̶6fou;=i`j04٨kN&-gH͐h= QTp-7on`8#92J+3Jv޷"L]Nsuw w|mhў=$ȦԄ ] QiMM \D&lHYb*)NC1p( t8XjU ! ɡ;9\1`Ӆ px=:*hjccx=fXhX &q6 l>ڶ[6:L8BL6`>5H!>swS+(+pzC =8#(0 ?!,) p8!‡کV=^ʱ!D_$qh@A^xq˹=kk.<-N9XJ TC[Xc x(&tjJ #ɹNIP(8f;aDð"d0 8 d>">]$B`,r+B,(;)2e`o* FB =g*  Κ`<ن4qVy\~PDY" wDjkkKD 0yUTrq!62/ 6\;E*4r{LLs!9ЀfHfHH#< @Ja<-T8pGT!s'*v_,6\B7XpLe$V IҴPM!Wscv`]F+QwA-U LlL RU*LaK*#gXh;A`B!4ߐXE*\~_ĕif@y,x*K(k Rkfp iT{hAcWq6ک2{ $jsxgx <2H!GK% j hCe, 4ҾM߈bC\&ĭ\ T,x@8\mE V%)q߿Z.qą Fֆ:HP~Xh 鹁nqM ET.ץ`u]@qoJEg{GLrx W,lN*4fs p 8%eb>s=va7a`3 `M 1]a`;lqM`]`nJہ އ΃Z'@Ӗp(1* OJ|h;gph$ÁV WVnk+slv)6F@gޏÖjH "qZ"tMwq(xlD >S (W (=vux@coLW͆K,۫njP۵M,>=Q}rqdȂ/076Ykv?q>_Se $(*`\ hCKl{]ẉ 0&?WcѶ@ !S2)TyuQ\xlm *QX p:V(6Iy¿h>3] `Laihyh𶅟ki;\:rtlzPZ"u=|md݅>M*@Nx#(RmKi<+PCh/5`j*|,>|~̓14A I_a8>Q:V]L}vͣWO=|(.a>~R"ƌ7rNJ0w>գGPxC͂pr~۶mڲuv P"PfbDӢ% @g͘- rX %ċ4mܸic lԘ2.l0a"E *UPl2eN")aРAE`b5lٲYMg[ܸܹk` |o_~A2o9U$KTɒy0gkG&[ MY,c52 liiQ]zb~5VjaUhac=%2x"(]LgLi`5T6lmo#+@:'N75Ts 5!U4!Dަ[GCN9SOADPI<ri%b$+%APb<;^=y ٤w{&\S~G( ̼д`2imVaTUتh2-Ɋj-6bc0iM=S8 YnIN;:=>B?˙;vх Y_=َ95 'NKD6P` {0U UʕиhA3ShaF"K6P&`)<:/l3cgH\X@&A.pc6ȾvC:SOn;+_c9.уTQ*s(vLjs8:͍ึFY6KQ||GU 8@3[--£Bf\l*hX*psZ@3  3Aӕ!3 .ӡ h0> Xȁ6P 6mg 0l%\ ;W4,C@4 NH .+'٢<g<)y3D!ЩN]\xg=`A <^H +^8 g‡ؖͲn)m!feQ|rPm"@4^h48r 77p@ x0(A˩U4O*X*ֱ5Y*WQU5n0Ϩ0kYьNk*.wq8Df$$)eR^V' k*LbS(QLS} > F2a@2a +Z!Q@* or . ($\s]A }/|+}<3\c/h6X,7h9Usc Q*KR%ȊkJH'vhr[w,ӓ zǞb>S UЀAlQFpX8@2~ d01|Pb$ Ib.N8 E0:#cQ`#, pa E>K\r#9̖ X:01#,#j fg@҈40 Ci49C _-&d|xȒ)+ ]@L]6Si-P E)|5(A#V|ƶя8LW @4d \ 3TJ!ɛ1,.HFǝàm*4 |" A\ 6B$x[:$8B*dU@(@,,&634U4@ 5 qHTI4ԝCC*5X>HD!!uvۨnmlP -58$ LCulLPp@(qC'I!.(d"C"SR&R^0D91%Ɂ(4#!Y5ڎ3B.C5 т΁4H@ Hh 5`C y )(ԙ>xIANϗ dIAKA$DFEP`mgG51V0 ,mu]cl 2tE  CI:@KnfӈCݸP@7{14՝V4Am9oM. q啂tF\0 \.V0^v 1A%x*xBB%\Pn& BY C%{Z3`'_ \-@0xFN5d$\CtCEh(E 5Ʉ<@Y.Q-ҙR;ì&VX5N|d4(5Rh PzfTk%T-QBB&9"2+Ycu7J,\ Di5` X=69$vATװjdlsTfJqQ< 6XzֵQ5̯.38XP @2Ub*C%h+::%2dHgmB+fi -*V^幩y6,%34)L 2A܀ hR6, mt=b:At8dծ~?\IMKϬ&TR5Xŀ@mm]/ B-r* A1: B9 jB&C*$B^0o+ܲ.|B!؁0)c!k9,W%"ûdQ HZ4[I֜$A]WX Mp7Oұpabƒ^ +YI_HP>C;Eˑ4Kx,Mi^Í3aT0m\"3Ǣ$J"})6.m)p$h !ÕA0B'tB1)%):&8*C%!Z$s@''AyԀ&PD) ]ꢃ./c>D׀M,3e=x3; FE*"PP[GME؝Ħ:s73,11%p>*PBtmA+BB)$%*B+A*B."Pro-{^34C((5GЀ7jd!(A Q'}քC $̊*TTñ9d;9PX@8tQhl6JD3Us-A3)^0 C:L'pB!Pa'6Bb't+􂅷Ei#.k"0GC2٩qiK7 *16i@741pcQPQC27ACiwqdu*t<=U}.4=(86h6p| U4H V IWPY\ &,qg0$ ;8"B[B0%x/dec89l偂3fdA+i" 8*@ ܇OC.44-WSH@2j Oh@ *?2 *8 cyp\KtyF5tѿL@7&T]F@o8 LB~?3 Y%90XakzB{8p+\!EB1:i+C^41@8C% ,A߀ ]!n|aơ+w KP]c+_eI} S`@!:CVCDcؓ=]~=ۨÂqцlGXWo9xDg̚X!qxdA4 ː?3VbȆ RX0`1V|WPƧ^K ÔbBuWN׺Q&eBDbL3022dre:pƒe 8SYj{1`԰E !k*l͛pÅGn8r˙3:պvso`$N p `niV|jH)ckit)EG2fc~H-e.iXFfKh&9j3ko4p@ -A-5ttEG67 . ߂8,SG:юx8rSOq:̂o'kѯi4H`p f@":x7HBZh$8Ԁ@)c)_tZŠeklJVxa? ]Ng#d$!c| Yf ]9zc3j& ;;=>qst5vhM|} J3}jMU#A!T{Fg{vR-tuyuOr؛Z]sدk` hdxPVA#$j"@#jp#JP6=\L)]%Eޅ_(& R+QeT8%bK9850"!&kK2F h !i0lkXL inbE#sv49؉xG 1RI @?S> `MTGlLTc؅.&V6P̭M SqX@$TC@  I;|&LLT.a'ChtJF4qgG=4U b'E-`vg!@bP<zҘ 0_M05Qlfc#} kNQ>pUP'R NXJK pQpQ;P9Dp8i#-ިi#(4dT0h3VXDA U@-T(#9)[ǐnB_'I HatbA #_r(`7J$Cb$2Ʋ;}P0<<$АAfG0dp A T S$8|i4;Ӆ:&hPri4RT9+ojxpt~),n46,zA q8JYsyV!``%cĤD%FD>r =8:M# D& ˒xǂ  3PbM$440A0&<*7$ʄ/f#'ICH)%{,FQ%N*VRb`Vt5@JS,WA7L@ $oՈ-biBA`D*B8!}h5E`q X@6 |KD*qôAjVpAhl ۺ`K\jBB# јD<^1de.<шgLwkuxc^8-K]/դ{Cx+Ab 1ȇ>7L D!@4L̘ נ  ӪG@cC^b q)։cK )]cqǎpDDAN2J s> ,EKhF= 5$Ȇ694|:&~ljsT'Kz]Jj< >0TQQw Fi/1]l|C?h@a)@d3 "2p2 %, Ll2ʱ‹bHB)#3!s 1 ̤"l%-kaK6Ќ6>y`@[h(sjh5 pd3Gw*uێPH dyXѷ:򔓃m-ocL/4W(ccJqtxBudg,#@@$!>@Y<@p&pCX%^BD n"sZd)$F NE!^Aw &Za*f!4Fb瑱@fhMAV2.0>f5Ln.oU\hAPCSjV~n#Ѹcfv0} id!n hA`!pŠ )&į\@ PBDN  zⱠ`t!aΡ5Ra Z!p&0L^W+v.<.b/mcD ԄnM$BqLJLOkAY~&2!7j8R(:2jZ?n!JxpЃ" 1X1g¢,"T`*rqL"gr(G\௝Z]'v" *!kg48x6`x8`aR>`c:&# !n@{TeeHOL|nFԡ_<%0p!Ei!v'U#k(lP&)UkVơrE!e>p`,`q'OsnAjD\06/ 'P+I-LB`b*K1N3τz'޺GJ%fV2H5{ c&qS7w{Rch:t@(epUHN)QCzpf&>"A!^ ¤P\AjKPbаbb Ᏹt"X(za)AQ_vTd'40ȠDApb,z:` 4'`D|lgt]El6K7q'`LO MkP`4<ᾒSJIףҀecoA B!Tm)VS%`&@eaN3e&NV5_tnX']x9tTw/`TJh)xg(-i f?io @ !`!j8`d1öC@l|]1vm} _3GP@x`t~#`RaM.  Cø  ND:}HP`6\iv'U8XygCg;r8sY:sCՙ@ɮb"# ]dN"adl꤮zX82oyw0-}-1B;bb0c"r0d 45$ e0o=SIg6v6{üiR٤573Nx1k~;l/oh!ӈX* oyAԉ%'mH̒$zh~P|QEA, 8F!κ_Mdwga颐a,tc#kmj`11&0$4P5Yru7Z&aԲmR4;'o_8:02U)W)ai ye[$ Ln{;lI\-<#Dx`NAL|3ǛC!8KPa 20`xIa Yz"U,6RF؄S!C+2DQ4:5ξ#<~!Mp ,J!BXh"`(BaU%ȶls 2siZxzOۄ۪|ȢITqb$Bd7Rc1!(POԆTs*Zs/o_\P jQ79?[:}TbP[l})4$|0]WF`lY%`@1; +b;Z>$V{ǵOD_)s0m[>PۨF}o2 `r]@,!Fc̄m(1$@aFDGLCU#,a:QxC}@'`&kWe l"hih)*ڊl.Cfx."(,.ni{I$[@ĴH4` _=La[wU1a.:!/Fy*z|8u{J4QMgN`껈 x&E97M;!h5!Ma~A WbD Y Μ5hgY,#-:(S iЀ,C ?~3fX1Ȉ3LL>SN< 1 !$fW7=Q禩`3 Œ;vG @hl!8\Ee/5kCgТE6mx`D 9&xv-۶n޾Y7.\8qƍ#G:sJNݮu`x՛G{.`̛;=r/|أGoج>b8Ms gH%+^X5$MqcA]uWU6(X$mh!q `dd[Yl2WE *cUP f]%Y=T (#AHFāXƎ@f| "46$ ?p6Aj3pG})El|&P]~h*E?Qm@6٬'JUG}n_q#e*`k~SВAiN! Ka#bCEx临Wx3]O$+C$<1O˜FuB(UVs0>(!p@10V13 [,LF"L2edzFqUVc(N?Lg:=A62Xܶ !zP-oi0A jв44@wAǪhr`xo- ,W4׹oC&D$"@.'&j cYQb EX24-ƋƖmp{d굌٤sk AHIۗv&bj \Dx. Wׂ`QmkŢ51LCiQ H8` bD a8 \J_1J !xl00 %dE[dXd8Kj1@QʹjcVa|P ~n0eMwZTF\ b\>1p*M3)S)Syp:0AU6q6y'%AvU+VU0,R @ G8I 0`!.C-fpwC"c6.>|D.qCDLEu}?^q >Oǧ~aOC0c-@ZP&CH`8ԠlL2 P8 ` Y&>å C#fQqoqg ?"8Is`462 Jj+rJ^tAApUn`,LDLb1 Ljc j4 EEXA|>"w?pPa>`a~c~%1 m%h1 G`&P Ä24@= ׀nP Tps(r(QR\d]؊YS!g* dFy'4KqzMא9 K4L8 )'!0.фDov#:C&q S9> ]9q @@Vw>vu~\F3w׆!1F ~-CMn` ޠ'8!3>xdB?2Q7I1*1Tq^TE_Oq`fU1z23 Hi p/!cF@FVؖ|=WaYp ? s)klɠZu%w mC31рm&$3 eH*I^f/kSA*zT+u+ 7<+38  p0 &CpA';aq|ph[)w0dEu%%Rq-א\p9y]eVJ ho_hAi7~ KQ+S+ ,L%A0W@ &rӪMVBMX~+p{ wZ00Udqd h3 [ HZxo̵ yr @] Jg)¬_AʨwzR tBa ϔ79$ f-Vh`".:F.$%DPm(ݼ xfZ#% ]Gq=;>i}Dҽe8(-K>?P?Nm xT4qƤgqz(\ p r.`I`/m $ y9 u uڮ .@WFzԑ1/ a.''6NEt <9x]Jp*HI>D\),K4UW~&,tLGpi ~z f[% p|1 ~,βsQLF[O&Y'zwA$) 蒹I%?(I Ђ6H+hA- }s2' ,8-Z`2\n4d0hFf {&r&O[ex 3A ~'_$)嚝x1-z PLQyыv'Ywb:ut;gr}'.8qy붭k׾Z5j#l^s`kZ4B$,3g05C2qA*nq[7|ݐ,de͚%{6l%eR;kCe˒61˙H=g4&ieA]fImݺyܸp!?#W:sΡӕ.ٵs^<ճw_}0ӷ/@~]vݽ^TaH! @>X{nĊm2# )qToFr0!j Fx̖oh"n"P@hfdYF/\h:XGsQ&VʭZf-Jf!r< Њ8rA/#/ j !1i"2j0`3<&l)oRc5q^-M7֩Q߂ ytGn:~Q:6SP<}G|.罁Ǡxw e".JG#$1'N@ 9avtigiv$ƙ "hmiqTƙ b+1J^y98B.(T&+:ĒP2ό̦ά 4MAxu†M9$մ j8VplD#F;4[: Nw#, ŵ}:Ɓ.Ñ/'9 qy\#@,җh$Ea`Fp-1&`&CD3L>2|$`ޞFdf55.--TX4P:0PuأQ ~}JOFqXd LP;R ur@fG r#Apt,$iqm4D@4 DC/,TLeNJ&3{ uLY d1 qi0zX"n72N266(<,P7񍒀d'3Gl43NĞ5Y;SE5J~?~\|xwV9!LZF7+(4HARqX@C 1lT .#8AGeg4#{A4QhQtvQ*S_C̪!* ,,D&6;h1RbZ3sE,FiZW6/.{C8jaagul#JTg}Za#"%Ɂ% 8a ruF18T8"&Ia@” ,rtJ%)E{Ye؂D)Q ܴ`~ֵDWW+=Dpw '<{.5P1@?~ jeYq"L$+9A(6Vb 3FQiI`@h;j  hxQ#r9}3w4ʱpA],Y f1+ l☶ ~l ['`7U r9&πng(w@f4-Rxl=Y}0TT MgNG:v!I]ulTI mdB)Y?&#IujHH,4#aRh4FOi"&ۮk@3;<a"oM[)Mi:5ȩk_e3B-{x|0#gp<@5Q q8sS+ɨ(2 lR!6:c[Bޛ`#h$3"j 6&'bi 5Stk> x¾vҾ>Byv;A[{pCYK8c0;UZD(dzO;#q؅WQ!`pq t`v 8r8ByBq$8n r 8H#K$BQLu8Ѓr0D߸1[9p>u{h;Q tUFzګsp/9p?}ZJ#J3a4,|?HQYzج0]_хvlmlPvTyGy\~G}yrh] tuhq8 vcHpȣh<ȃHP U Hi};Lvth@;zGhwQ@ٍ>kCy,949Gc80 Dr PFy(5x~sX-lUpTp|Kt9PK}H9H Hs:=(]ghK|Kvh L, ⛺tK u(LƜTxtی8{nHvTyȚyPRJtzvEY!?{`zH#˔+lnR VI1| ‡,]0Km@r@x(Řhr9u(: ؅ $S=؅`oxuPHLXPv`)uqgrŚPo 9rD6YMrz|lxmXH8!3ⳗ!B4Uȇ8~ \8 $,Q[x8?1&|Ivb`rX/Y y3i sx-u- ܅| (E I%!59rxTp@:OZ3r`3' C>50T(TSuCaBR)=*u9X?N.U8P!Fчf46(utyIȇGClUey&(T]@0pu 1UH=0 OT$Uڹ9֣X8G 9dO)rPq V`M8U]/`a%xX]0Bf5#hu!00,;No,H4<@*ǻ(t5$Jq`39>Eu@T[ҤX]K21GvȇESJT]p8 O݆*&*G ]*Ľ釯f3p孻(D}pVxNRB/}$q, 4Qc\LUxql"-DBtxHY]hbZ9]dܑiXXw-cņ(: Eޅ{9Pk`+avs7]_6)1JtzN!.ιKAcޜ;bJ(<ƨDl4N55ÞمwU~WzZ} HmUa5W l9 ]pK`pd(䀥@q\mzdH~;rK.7xkxE_QVI:aFV٠u8c%ݍި@SRN{𞷌Zf}JU|ƻJ4m56]v pP]8UpXq&m9psc= hi`Ν7W}d%Ɛ KlE"a5҆ؔa`7{̇<#]<%[Yd"#De~@`^,< ̟4Uӗ8+v؅v;aՆsn@C[uutp`o8W:(A E[o؆\m5dsv0am'ӏM`Tsȸz*՞6™9@?],}ɮ^/o22]BV!Aq 8 =gaB&\Src])i OD qBď(ـBTT@hEnj@7t_9zЍxH@V3yACQ$7#,\&UpisA̺AD3uxW0rDo`Pn9xIyTzLqxln t}<O}IytY5C@r;& }e]pt}LpMNu]x'wCxZ?6:~eES7R9FڇKbiϒ.b4J y05q[9tVi~Kh]nsEi X|gL ZtxvGMɗ3@ӌEV hЈyKsōXXzpc̍v45§W7ĚvE8lVUN ,Vfr֜kӎp0ǖHgr͐<Ӽ@X{[C{zS T@UMPь''Ш $p@v+^1+f}s|0O~8k(N›Ry^f4Mӭb:+[ zkV[@`u@Zxw9}b닙5twgr = |#p 3N|w'䔟|m|s˧NWlɇͦ[Xk:utB9sʕ#'q8qȅ n#8 ߼m6m*`f@9^4MB6EP>F爟ai' JONz5֮_V aؑ9 |Gs`ń= q;5;IG]B0vvU^xQymI)Q` WxUL&08MHUM6NB5$69\Si XaaS6tVZ#83E!9 !@xb9p2Zf7cVlLꖏ>:\s\[2w;rAXאvEj3Gm}$8ݔ|{M| hTP%T5jS.I:5߬GaJ4zMoedQ9 萪`%AFTk>)Ыc;\䑶)+(T&-=gNAyNDyњH4aRXP]' i6qI_u7|V Luu`izq^7lQL]#Z(hXS#fs>,=޺x9 YoIۃq5;d ]PCI%}ަɞ`6ȯL&TE}t{{N8'i'ZVpK9ɗê0Q<]F+P7չ.<&vȇpd-ǼZ`s,$fJ8.-QHdBנWD) _r$|5 &ns(>e_80Ź~*J&0 ҙf> Y0hOB pǃ4^L⺋D̡JM}t+8˴2cሺtˏU0ň9+`d]9s 5bQ6KjCi﮵vDMxTPq!;+ӦvІ#F٢aJB;{lpUrCé&g~b[S-Z_9 0q iJZz3H)4Q4£00vS >8ԡr gɶ](؈zӁ_ov< R]-чeStB׊釶`.T<_͎Nn7w,BVO UY*G;(2%q8_yX>vX9 Wq5w]X<ԃlSC88<:B9J:Qf =4I͌Q _́C>Pɴ\GΡ\[e Fi؎dWO9r`:Pۓ~qGD[PieiO8ogie`TnMQ)DAW5ML]]OjP~& g|H"%@M^PO~b֦~â:rn 藾y^ ltzealaH&u_NqǰwnldžRZ rB2Tk뗼 Ri_+l-^0S'c6ў;8^#͘Jaj~Ԋ >'=j*|:֧2Dg~=*d}Rb;!H!.e`rfNnǖ*6c &=&ZlI&Tn}ʦP+BiC9}*t՞=Z2F{zdPe|q *6~ly*I1%>ʶa"f^i*n+ڪViZ5n;CrX"=ob'ԍc֎'H=IN"{ڃ|!Ysf"'/! CmLp}²0A@fJ #6F dp f >gxRbnfiRSj,+q.v~ڪ_pO.HA,_1`1)/gqOot}i+ˬHTfy/-'S1p%% .&-F+N SSdoe2+lH.I 8U Tȗ@sD#חUg/+@-%m@>S,@(I}829# _*dZ.1bl/"Cs.A.?44B&=2-^6ZCNj hl,r4ΎHc-Jǃ/C,BfAGGO״[\^2Q;&b3`u#IS4@aF+WuG& -O-pEƫc@,"2t3>5\볳A]P(znR;>ƍpFQbbrhm9׏]`3٢讦Ys CB htj5PoPĆ 5NlJ`nj>f4 gbowp'@3br. eij<{jb=uǴ17QS [k˴RgڈnC|m}xƎCzfh.eO".d6t71γk+xx˗Pj9hB1hQǃO,zwvFo}xc7 @ MreP_]vdsWY8u#9u+xSB+9y76tr)۠Q86paKGgV)CJt79y"FHQ(/.55zbdT,y>:RW "[ɦ+^ﴸXHy_լY7<46wVcxưwfb{tP&{/0ԘcZos_vxfH9|/Sk@7245mc 8Zy7;p#{+;RN{*$8R5W#Gg%yC7Γs=v` qk4猖}[eH_m3N_|ٗc:c(u7찍6{FWSc5w]nүo7fCƭ=_c8Czg{NXߛ8~CdCnT[vǀ8;/M?~wcO÷asfL}/"ײ`r}]:}?d~7]w$63[?@8`A&TaC!F@EU >~9G@P^>|;Ōi G'=|=O:m֬)sGK|(T Dqcƌ`bYgѦU؋^9 oȐs0P2>:\RIDTzLOWX@.G_Îeukׯ˯Fu}"ESSFue˄ Ӽwȗڋx`(˧C|V utӨS}{6? Ebء{>c)|(θ*;n|*t6;-TOI$Q~NH-? ; p@0:یv#P6U#)5H.l+7L/P" a UnP*4*@ mg6A ->YEJBK1C @#>B~@ UYm DSKXLLުT\%SH*I%D4 geM͈Vj#^3< 3 =7ISs6wD6=7QPKrpgUTPWVRba]dc_ĽȺZYV_^[ihewvsrqnmkf࿼^\Yomj괳JIIBAA\[[XWW~~~yyyvvvsssqqqnnnjjjgggdddbbb```___]]]ZZZUUUTTTPPPMMM***!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_z[ fE8C8̯aV[˙d = K^=4iӎ'[sA7:_|WNqWWf/Mޯ'w ~yү|rn{*Ǡ?Cxygo{_񱲛pW~dxφz=WsA`Z]}~*dS=#v(;1+T;ڞ8Tc"s1;p@o1h㋌mm 20L |C:6L"BlB5RO=:ᆓM5»vsL2Al{(AA$w{}tL5ۄC93t*s 1?U|C5h@|osp@0 0$86d-m\26TK5M2V\F $wGtǐؽO~bh(by pW1:-0:&zP?4 Jv/lP2:|(,E4FFl${?vYqp0=$1٠8ȁ?ÜP X_ SI<$"HGB҈49i @٨I#(G:c% 9>JLMQ,)ZpFvc8-P̂4b2 #B#tf59MiRC(nSq oc弇+T(`g;W/]j<Qsc @E .9!1I :\T*ЄdE1Mjx^33dP (A7ƁBQNz(VPo%^̞>݆4`@0@ #}S!.@D""!3:M6 Hj/$N՜oU3.55:._d1aTt*)#3IZV C& Vn쏲*Uu> +HO6#一 +{tkc:53d23\$$P^u@ k k4"=80[K9h˯{:k`TbנC,& e&3.2!Z2 qFj+(q:'1A򱳂`k={qP`L@*-PzڲSMAKQV`=o(@hqvă!Zq~2+Z#l,ssDxecd^9!خ3N#3Ӟ,4}Hf`EqjjW:ֱ^1XP;&*QǠ !c>3Sjipd[GIV `hd lv[لnUd3'J^j Fj8@0 #@8zkD4A*Jΐf:!mrp 16.a }ծ$b侴d DR*dn]miհF kkX4<^L}TlrQ6q/w&4b@X}Oдg⥟,}T5]RMis~@qkH`ex`5;B*91 =A^-g+SIVGKem-r&v;@{{*wi7V5|.LED5gQ^*FAxW}b}P |fN(&=S~0dl"K'B0Ơ `?V{5|+v*vPMUax]D#LXEMs@ sbvoyRW I86A҂ WS0`#`q A Q5a aJXLG Dw0L|PP5ZuZvx?oW78%} )t@~gpNw`~F~Pp 7]ʤrDJEaSKCUrP%bfVZgZ|+&t7w}2` :g&JQrppvWCld(GP- PFDK ]L)rFKeLԄw%Qhb]o&gAdh}玪(#?`RpC 2~3p9fj8h= M%HDRC?X?hP aUjZ@+s0v:Ҁ EQ15K|x\hȰ@dHπY D[HP5 @D#ayL&Ys4 Uub^th}vٛ:3VgQcW=0XG2.?DQue&`?@5>Eǰ D ʡ$I] 9SCC S?/p? ` *y DUY{HLC: 5fpvo›QZ)*% Pk]y7B%M_%o 43fLV  Tp:*pJawCCZ?P?0P{jDUHڡ MJ^:ҷ ()Sz  0~)OѣЏd JzZDM $рzz"KJ?I(c9$5( wPPPȤрfohc+N:*<ua{I` pC*Mˡͤr6}j?0 /G'~vk,kzy:z|=]e\ճ'AǤPz@)3p(Jqb>v  JZ`  g;MqʱY_VL%Z2?SIF0?3 CWK1{fY #Upb6jَtٛR: @ ;~%U[µ#l4 MB:M [Ynk @ ?{ @ @cb_PU ں(-y Yg[_xïfط4Y?֠s۹?Wk0 h@ H:Ұ{mz**r*w{ȋO?Ybjr OY@?;J1[xL 2ڳ гji 혊Ik?l @)S uᥦ{l27(@Uw+4l2|#@w%_YzFEG|t! lnjiO@?. CZztH۳F%y w}4I+*ɶR PG"]0"ZS\EQauQ4г=5 21{!?\Y=@?}?<Ul , h` ? ([f s|560}?\ *.SᰓH00;.cy~W fzJ kkePyNUPP׀O0``N}4p_k˼qdӈG# yٟ]wJqY,;9óRԓ R  ` `bN ʏЬş2:lsV[Ѯ| ,s{`^rh`p؇_lP@d25PW~؃]džhK;|@KK`00 0p1Տ!hkJ<50eH K(4\2 ULUPi^ǐḷ`#  YA>-dPXS|R-]0m q*j;P].P#C%N 7c1dבUlMx*&CZ^IY]zi`.bP0K}-@N X^gp[qO?ޔǦW^=`z$xְv, ؐ ٰ P Jp=V`ќ5Ϲރ 9ǮG|frʹpye% -M~_U˰ ;.n幞[uh?}^ξm{^qkL)*.N@ ~$&1t"|U2$JV) l*_bjDxP?}n>r?^RPcY"OZ uShOX~qO>Qq}bph}N@l+۠ P>f8|cgQ⾁]H) ÅjG 5 rM׊4TG?`R ZPR`V ;<*.o]0r_%_Q00 Ӧ)k%UvM :RP شe1m$L.z7G2ѧtOA%ZT(NVeA{K9oxЁvGڃ%}P XƠiB`gn5 f 3f,^l82:l 2dʔ9SԨ`6 2:FԹp& +m*u̮irּA]eYscRT@l;vYArTO 03dfNg}#*wR(ThZZ.h&Qf Lfa#"d9"̖`|.@4r1< :{XtrgK$qΚ B?.4>F ЁgTX| }i"tRh Jx1q…ޜάtР/ছ&Ǥy Daڇ}XyR;WgSN=*+t.U zࠃhGXּLQL;xyJ!8B ^Y&xYӨ"Lnr!4sҲ¥hff .?/h2hi@=A}')"?ޮ ,A#mSDwMiGlcC/?Qdw}bT°c夙aJDQL3qM2̘Geie.ڊCee5ˤJ+K.K;ւ :K_Cw(pdX7.?lbϡ0>#:P'>LHE%X](`Qa'?V@Xx݀ k(va54Tj.B\|KU<0@3-^Ԫ=M#2=!dV1iZFAoF@bgm]Y4D,aN&X$qyHFvÑ[As:hQf($T P{S`ǨQkK`/ gue/qu \2BX3SشUe4U UBs'BA2:CT _s+(HV5(0v @p\Er\%E_ԹU'`+aXn[ -clΎShEoWDt نp!g?sn[uN5$פM $" NCpd/tNCK1hIrw*BN[ޢ%`yo@GjF R"vh (؆RYM2Y 'zڜ<T(5` sNtJqǐ`H614dg/x_(6,CLq@B|d`'Xv$a j*dG1ھZm xAA!aD{A&4D"c`2~:$Y``@2e9h S%YdUCܸu iq2 DvNPŨNT}MUoY(6AXC{)'Y nD e{! iH2WM̸2Q%t/X@-ӌg.oaAR :䟆; 0n[83˵$>X? b2xQvc%X iXn1 <|9+-XuM#\ .?21sԋ zunǞ g}덞e3†FX*a %;ij0 = v=/$ n-g{$7%ꊗ @ ~ THQD'l+R(H.ŀ|R`S H!d z)2+v7Rͺ(苵hb.TT dTG}TH=AITJuK:fA-1Q] #j"h0is$9>U[pUo({x0~cC7a2M (pIB xpQL;ДV 8S¸ظg 1-pWu$ueTyTwyMNKK*H"+Ѵy䡅fi0qih!DjK HB@KOtό Uه`-YL8d]Vmq^_qh4+ܷJ\,]|Hqv_!ņ`CPэJ\I0ѭWc"+9 "ݙK.]5a}BhYxw hS$K=:|ᎂZ=+=ҕS(ެV;tֹ ؆0VGI3/!ix1gY, ʈ]wdB6dD.Lqqkahˏ+㸋=uK"_qKx+lFY ȀꨏR{@%^._>f c>8 56[%QQ*#3Q@JB2}riD&Hxv7#ͫipU=[=ptXeUO8m衰F1F,]whpfրA:fh@".=';5߬ݕpZil3gX DP5SQ҆O3،hTIY-Tk@Rв=%ꈃ&OXhl(jhMђ}]Jl EɶA=noL}v8ոNf`p ؅©mKXSSj5LՉ^4\'YHC.&e vKBk,I;*8_cFL:. vqh4+ k]#2NXpq8>ALԇH};8Y 0ekvk <\F?k{9#na> 6N"7rR?r~Xso3]k(!Yխ63Gs-k ǠLR_sDG=s(0ȑEX I k|Xlf&βe@I l֐ Ԫ͐iuزgӖܷwF͓O8/^\.`<| E :P`R[6 ~ J-]g.L{U82 >+>Zq<:u7e 7dÍ;%t\C5{_#@c L3w4x PGD,32WBR~_QRU7<3;cI#9aY\u@5xؗ4IϠ  c1x@Y;1ZbkL:9*,*Yn%h,etE: 5qhDvl57%tM5w=*Op?:0II_>=[uUӤCHް[J؄Px@ JSLIց3ri+`<[,I7;kE,LWKkmkP E6TI.M왓;_1@*Vq;Ck7e\)|5)5r-"E83c,hh@YEAwAԬݬ;;{kU}>mn dN6]6HߜݻԶK8 g>J|UTsuUWN.a: %s%؜5! h0^3!f2uv;ȠaY{! ,ʊaҎq)5 dCګ"%l+9qOV DȔ !\#8w;!aTؘQ*8@ LbfHe,d Y3#@& IJ %2KNw\$(C)Qrw&3Y3Hғ|!%cIq! ҷ #GLmqj9HuSOQ2`|a[Gg w 9JPPeM~ZgLE c<L6s@H>w$D9J-)%QN'HȄeÀ!9:%8q/DT59D`YأF%vR\^PXPA;ϠAwl@8# W SBjJ! a0RaVa "Q]W0u } r,g8dk!hȱ{'ylZr#=UNzOCm?28nNgX]+aX.XC_"@`9E\!(BЀ 8F:(aJd&6QsCx"^ CÐ1`9PXr2 bp;MX%2Q K`(A!@pC"g F41 iL(Rp>Tėb@vҴP-907߆gtwpB'xؠ9ftPR/&Q[ : fAb [M t. E8at5,,a5#|a A F1EX8%Vt@[7eq &1Q4n hH LĊ\$#^ qos}]KBy(u@6e,d^AG'_F4Ƚī&+$"qrY/۔=2 %@8 ПW"&r cx5JPlIy4Yr"3\ :3W{{d"mD|S?h)!~Yg`".C%^7@ 5afrȢ0J-`D 04P hIE 0e7E8XL2V9yEXCq%^ @Wc0Δ1D6H\A6l<_\P R3@t!LaZ[)Ԝ0ةߪ' (18]?f1 f?B]`%#C:$B$8DX,pX,b5Ā&INe p`G( *ƖlNdNKDd@P ~h & 0 S҃<9JLCYXF6]XC9@Qi34Td`38#e|We%)PB'$9!@&a1&1 ((_&&yB' (ô-@<" 0b34@>!H@0Ch\K/Emn0Ի8oɃpO|)gH>d HtS9u2lvFVrCEhLa 6 c,@܈2|W~2A#휋A'881((@0CçBhfҚ\h!_%h_&CP$сg:d̂،R H(A.Ld U@EG,HJf2擾M<Ι,YPiSL! r9)xLU<D#`@,9?ͼfe:n#LY*' @>*z*1|ʎ*8`0C)!vh!%< X&'9`!hH-L- Y |HC59@TC @\w|LGN>9TBP~6z`@avʦl0B뮬_*́ͮ1d'#-C318.WEHԒT5pD`v8%ٖ9 mT%PUxMSC9K1V\KE @'<ȀXՂx1F4@ *񅐥!n!C,B#tر<>Z21.,0 ðʒT!1n*!!H&ËEd="B2l9XԈg\I#^33@5$AI֗ p/LmjY7blf-x ͧ3h{e*}pMC1:LB(:+(nQ0BR3, tÂl4s(!A/:­9|"3Yˉ}@9$(kɺ60AFf\2QKؔm@=Me4/d/t+O©WN99pv)T dGg3=I@^.t@ heok@1$ '7" * 31C v0%/T9U[u¬29Tr ΑAeց,#v[$6`P/5^[Ljnb~`a+8@C+͔+ \d v8b8;EwvnlW@_H 0!5mO<}¢δMyMC53vO/%1p9Cw8twӪr$A? C53ܟUی!`3(I=58 50P!zv&f*9bwmTpQ]ަs:f8d@/bH;;?Cyw,NQUUxzɠ`lHҽS3p <A՗2wIج9rQ+S{c7,B!/p{{0B*a$ }}2g6~9SÐ9-M0 P|0a}؞C4:;>'r|׏Q><ޢM⌄Zltu)_5Ώ% L㖕J/P!*}o7}1x=?F;0`=vvB}·6Z'X;۫y o-C,":.LC4iLk`%Q a(Tm ޼}.8qƍ#w\s̝sΝ;xɛG={T7}_RK6u*ӣʗo{:qҔG/ؕMg$#Åc7n۲YFϟ Y[c4iР-X̙g `"ple4x9c lSXjbÆ9` /ݻkND}/X1mS9t>ɋ Ѡv 8 dA8+Sa[t`j%Ly]&jzj(P"h>P*%\:䉧g 0)稨\|ƥҧx:i -..o, ?Fc@p#<8X>3HbT5d!6rM8|J18`![&rQP<.v; IfG,wbu)ȵD.o'a(p_0hJX xA>#)"M`s!^L B 0NR=6Tp#T7E=9( U1gvNy8*NGdJ XUx/$>5ffiQR%@A .mqo$j[txGD E =FՇ|0WG~rgu9`(%ɦ (A J jF8.:80 @PF]s8M5bFf Xpy7ۣ.ti(&KE0#Zmd Tȣ|=ekڠ6' M5pDML nt#I8uka S@9zc'pUR:tItNQ=ᕰ_`Gqnqo/:6QQc#5gtLLcQ뱀ML@ d;11 )6q`_07gѐ6ZXc:G:jY1Xek<* v=-< 9F4f`78@ a5x?p"^pxDZRQvH[2MAͩM<ΦUV'E_t P[xgM0"iDA6Qnq1`!{,̘N:ihf'$c5rЙl>P(8y_$#Ӧ-Oԃ'1 c|w 3ŪPA>v/h ` P``rTA@8$͒,:N~HQљ \G;{VkP'v}_DKDзca^t Xo! \wǦ>zGf6"lf8M1P 9M1xo_~iX@< V QW <70eLx3;x> .$H~ P Xo;KEvѵ4nLzG5X)*-N‹QG>*kٿjg:!Б\!< p@jI+ Hc2Pa j .53-2@ 7Akз\@nc /I(yxwoPXC^V݁%qj{r دX6P,OOd085Ñ%-ײ1Ń6Nx"(-qx=qu@9eY+HS]b- ]F L" hh3I>vR"b6/U3o|q Kx*SyY('֨&44S MpK4V k4#j 5Hx74lntԱVr^{88׻61k \MmQ=JRHM^PmUXBrLS^@N0{01]>a5f~@oXjQq†%/J?5qb<{1Ad53d aNTn pǂ+B(y{amqC/Ѹk+}tGiz"}^M@#4̕SOAP(8 !ġ`< @0g!5Np =@ &`>zIpE?@0@($>RЛ }(d-''p(Et e*~M^H -0Hڡi%e ; $`pl1/V8X2'dfMO0/>ehAr"p6P1 g^1kjb`6aݪ\`@xɜ!pEWF`Qv X B,$oD,^pv Q\!1$E:D1H#A-FKTbBf֍ @*_fNhùQa<$;S6Dpᨐ;bf>T6܋=adeLmR@jo$ \5lFM/v v.InbBOb T1<1  a7\޺"Fg6}>rdہzJwXu_V%YF><!-H1nYyrY! a$ZnHZ`n&0'>L{Q{"=`+xDTNo}u f/ڨ&b@KD0vWʘ!uQ!IaKc77u}Rb!!'tYxFFaPr6I8T&(&!cf%FJ$ Hx{pX3B"gzCx'Pi\vE*&dءN0.aIWbW(\t+#{X#DccU O:އ ,:!"!UY29uUZT<=֭~3>5&lph|h,`E錫)ysn*]bٲ3l[,(҅YF e -͐VћٗRa*b@1;dX{6!]Ɛ!| 8 D)Mq6a ($?  Va.^2hXצ8qE b/zP! X 1qfЧoִǕ*2 Z&ܑO"xl!f H2$cLI3TRL8L*PSg&g IB!XJFAY|LSJé`@U@~TX`H]ykqF@"0B^[ GR[1,+5>Ƿu^'v"2.M%╠gIb?t0#22a6 gN VG+gka 0O5ψ|C<f#7a8QY{Pe"D)Ԏd p븳vUP,ڙ *v|Gꪺa|%HBaRnIu!P'`00(Q>ڏBNZ`q xu#ecU%g>b]!H |@%BOУޣgg`iXcv%@j!=.)};2Vya}.nԜ8'(ƭh^Ԋ^N:kԨbtېS`ʍQ  jtO|`(I`opR`*@{Z%Z,ECrկI"D~V$.^*)(8uV+V!,NB9n)OG,A1 h!ʮ|J43ٕfȧ| S{bC@a`#NL5^&7hrvE:>NHywRvIoT[)w#dԤZ4D[;vܹ/zճw| ?V2ȑ$Kّ>8À{͓'/ PsTRKß8P}3UU|cV 5TC %,i 4sGq4u}m2 VbcQd S)/&ly[1s[ma)3,c(,HB u|!B4I0 Ԁ6@9{M}P巟RgNxA4OCEA+\4Fya֢=cO4<:/ˆRKTRQ 8`V\c8ǑIF5 <“0L9F0up@G p% I(dDlprB ##liR٠zop(tLZr 8, 0Ld7v 4W לjk8z~+ @<7ɓCER !m>pDN*7Q_S6Fc8do p%֔05HJ#AZ-RRS҂Gтa3F2Il5oև$ C #(rm ءгF4>,NWMd빗z mѶsh[x"- 48iBG2|{\=rɭ $JF#q6@WlЀpGJ3$s, V$3PcXe d9z,m|C> ~h4#`)5 \;t!PK^7~#H:A~ #,aMqh ctP*F7P@V X N@KZ@.tyXĞ11ccap-*1 nR=̠b (=T|@ "ԡr*g3T6<*J|ˣ$U<9tC8a|"?xˬ#?2"NwE(; :~xc +n HCBMu, 3(uaxǣƒŔɋ  F4@1o$:dfg<#nj aGKNBPC%SG3 HICPwpj\.u\〗SzexQQkK4x-+ J5^@YhPE/i,2t#Í2C蝇[ fg2M* +|C\`R7ȅc JA B$p 'fr`]yM'AVy Gq_8WzApz. "gg4ri9V#W BN4D20C qAsYb F `t0KG&cN~/~ 0v3nu0rHp  &P5aZ)0$7Px)A+)Ypp27y, 'zU7!L`_SpC99.{2{o%Mr59MG]AV*c$\)P;RD1hYDD74_E|=Q2kkI ~!cǐp@Q۷~d Aet/ 0 >RsѰJ@|` xf:L@+frg%JU,us77_Fq!0!Vf"CV``VyM`9iؐl۴WV F:h հ$vu0?)G- ;'&J2FEQ=*~D>*&)͐4 yH&% >>HP J`K*"SܠCdbJ6lu A7K*7~ģ=Z- zP(i?L#WO1/'w{/@6K 0I2א| soK4 IsOEY_/Fq ~uj=Q3yQp4!ՠAn$2H@ СPP  : f++Z{t d9`:A_K)''z:FFqpCE#*#D]6]y0 j@ X yYjxkqzscz=qC7Bd)aZn:w`[Fߡax6THTF%H@s#7r.1f'{4< "9ز7i.4@Ni܀ #]CPW5Pi7 5%Sr.`btT~() &YY B34FЦB0) tZBkQKb| o]e c( 5T2Lg^ TkA:J_Xe .qw7ym5r`97 (3$"p02OKkE(9Osk`8`kŇ@Ӈqa8Ccf+ By S ١%or??;"J@uiC6YgyvFU^<_J!#H+t֢M9ix / N& IKH@4)r! u1}hB}At(_ApbAPmijmFmH* ZntA Ґ)[05'I԰*u<ԌkT Epp{z*qS%h;j\!ċ+qFЄi D/^a`!@DF0HPGˍLWRx%OFQ-`t`t-ҋm(mW}XµRQSťB 5װq fUmsp*P G %b PC@O|$|LvC2 3)-pбӚj* \Es  VM]$Tפr2qV T7.1G! օ^h"4fVxzFLSaXW;dfp ҄Ad0N@nNP P|2;^}m&]E0e płV2Py #0*P{Pc*_alhyq~/Zg477zˍ)h&7Br/T%'ԩ{˸r@R:ӄ$p$$ |G ،ZI`;W% S>P v[;moڦ aض%nw# fa=ƭ(]0Ը-p( X^W-'y8nA:B0": " D{9܍9:(?AZCS($J  Gp;s v>)dfNtPY:EsP u[8бFΰֱ$^5fQ?4*6եioxn饸ZHuvg aR-{B9Bh9cT*xpޟ$Sj}DdٶN%X"־rNYX撕,H^pn,; x7E]i rۛ3pu-I7/7gK0 O8H":*"1V3JIrMwיx:aQ$:a;;gնHvؒU:o %`I1 )- 3@ ];]]AaMx]/KpcOҒ% )q:zpU^"Bg,t$MMW8{v_A@NEDa-[[ jÇ1H!qiZǎ\ȍ =xXD-i $H,gJ6bFiҨ5@ငJTf(PI mƭo⾁ Nqș+WΜsСKn]Jvܹ{o ٫xngX:uCsÍۅnܶe?(&HpZj%H%Ai#FCݸrؕMr>xf?raq lktIwq' R*'&8:xHfpZj)#rFJj *+tk Bnr .rګ/Qgxs,{T#zladM@g} |xzQ|{0xLtKrcnq pmt@ FGp*r$q[aGj&(v( tܑav"ɰpI8pA؉X#gd(Fh)jPcO'*,!<+ .HRɹrJB Ν,{2{ SW23MV@sc96l'?7xkǾ EGsRQrĉ+:J/mtS&&pkI'ZJfvr{=1 *؁H&oފk`3XuҰwZr '09YA~,0yLvǝ]AtIG{tpfMSCmmG5 GP4$?h/kX w!$6d^hWCml+VF05 0s\SyQ*%fp:LK7CI.尋tCqaWrٖQ,SљlS^W&Pm2yPf$uAi98(UX@|=RU9 ݁i$A~C6`uЇKQZ x; hWpGK7 p#NvXڂ-rrp#Sl49zߡa1CE-]3BhR%1ć 씁2Cg\ G<yԣe :/A#;ި@Xz `ci::B=q[i #]& ̅ސܡx?Ir .i(@ *n2C5B]68a0g(LJ}tK&RWtX6{bʀ>ԙ*S= h 6xnxXPR U: RL أy == 7T<8Ur B :@ SH>93ĝ @B :59L , rYuΤɗ}Z0 Y cbjt:3C'$*uFy "U- Χ4}8$bx@ Z"EQ# /H@h)'Iv3zBuAJI]*YrTm8U"Hr,Vi!GOxtk0.bdUxČz4r8?uaPVG}igM"jHjXt("NwB WN"<a/ H.\w^: #|7M *Fuss#gվP>┱N{cyӖ*qscXej;4TALkX%P3U3p-_VH>rdI+gQP\yX 8wQC:x@ m`t4˥*/!1tw\/׽ޚcqoŔ߂I QRN?t+3@v4:4샎$p㌃`($qH laQg uȆ <{jx?t2k!;& 6%n&~ڽƘ'):wS8q.zx3{§h4s@[loL3?=~(Ьr4T/\qPCxhpPY/*+j?4{>ax_F08IA8l3| KQ8hrЅu8q ~Xqpxh XuulK[b[{ ˂x~h  ,M7z#<I4{uGб0+ "| K$k,Xj  q uNuChXkm`D]PE vKи VTz2Z;IU'!ƸqBǪeѣ40EzUR%#]p(mzr‹l$)(=xد4!kDC搇}`r vG~Hq0zx"ĢDoh&7L%?xX.)w P`X\Tly Bw807-yMJjbBpBH;`,oP SƢ)Un@0eVS ktUZtsxHs`sp.HQ(N: x8&Б `kmMr (uq(P:--Qv:# $y%7A ;y"WG}H\R4|iXa|BG UBj#PU(t 0قpwHaDY=ӥ ($ֱLu0th, vo 5rU %]'֙: 7z}Bկ~[u E{@>Iՙ72 Q0hs8 У!a;C;rKe4,' ܹ n(J*TF s(0=# * |V}4jn@ꔮvHzBVhD{/Tr({"V$rd~"6Tq/nkMhs}@0e0-󕒷=`_C } Yl<V`u0nvFȡFx|pgKQ 0 sP{hVH ? Pt~(Hj|SL&Y.>nx{Ik'?yڽb?JQ)?nO# =щ[>r Çj*s(ˊvȦ &pSapȆ@WH&q]A~㲊vo"|>wYؘ E$V j#(K]lr4lTprua.sk)1da"-I6JG?'k̇+t =tdkEV8>~@e;9V&QQѾ528+JÆ:ĤT{Glл,u +8V's6suPJD1 kgen=7z$BQi/Qhv#'EWև kp1J3'&l쾠,ܴ,^8 ,,,? y;5Ff#󦥀ui!'1#V=j&H1*#[%&uC]y v kJ TO8+6l]^gl}.Ϧuʢ,N!:_ !#13;]{F º+h 7ɼGyQ{y{Ԙׇ΍t3Za#hP!npo'_@uWӇ.3Rwo-۶mro .x\9s΁Dn:uֱK]r7R]U>AbOfESMm-/;/XhN_\7 YA&$Ю,ܩjoHvf $Ql-dc2Ɛ7 Ct:ݬfIB/%->kMs-.QEImCP[w`S=de>(WJޕrX`6*"T'N6KNpiF_F8q@q6M _sYa!-gT'v >QکwOSQ~p][O jM>6mzAHֳ-mSBCh0=or`]p_TFMIɜAs$R%=;@ֹ<=*xAnN{0ZƏ^;yk.mcǣhUj`!8|ۆ@1l*hVD(R`bUD`o9""q.zZ32kT7I9G=B3]{ w+`ޡ`2u9ᬹ: L=m|iA` !"'bg6sxN8( !r ;.uҖ4wɳ^mD#1#hL cwG'D3>CBZ%zAb["u\onڻ<=\7e<7ȡt(Ĕ?tC*pI< jԚ{8궥,cI3bL&O^ARE*5u@NWHzqWOHu#[*jaTA9Qo#ixfpg< t%ǃv_2t<>B1QDar`[9.tk³3Ti+JX6!񼖁``dS![AQ (Irp#Fu>vp*;}-6tCHS\5JPXO c8΢7!=>ԨtCa9׎|C]n(^aIzۤV>||i䠖w {%ҩ"H ĜKQגZYS8؁pÂ߀À5D;^qə{__6ŞdEȀ=`@!!JL\0\p[]O9]D؍ Pۍ`ڝa訕Da$ ZnIF }Zw">XYuE +I Pte˽̄8]fvaaa!a9 [aءvޙD;JGQ!)"2~|D pMCr^ŀXHpa$iOFL[qa!aQE)K9^Q.~XjIm0 12.c+E 4K~EЃ=&X?٣P^\f٣ѣ)b)"~!=M-ɛD \#;_юHQ$B.dP M$ T%e]8T]Ł(cIVX%XVvD\UO`\@%Y^zb{e""#?\ =&E'z"8Y_H$Y%N=bfZ&1PE>\$\\GM _ǟ!_%`2PTD \5 6J6rd!L (_`ffHv%/1AiJO G"Ԡ__&me`E}OYY$TK8}d:Z-RsVhO"H:Kr 0di0x`۔m ~ z^f{{CŸ> YSRa8TEfGb9r2(G`Gw9'\-2ZdEhMnþ|'dhD=i1hzR n֗ H=QaDQi< 2Z aQ^_6nK4M5'TZ ""M]iGNڭ>RB*JZR밮=kzɤ*+Bf:~$aG1}SΥdM%\nFdk A+"fz:\(%xɱK+l+dCn y ~ŋ~)%DC8E~k#Pёުv>Yz:HьGLYM= ,l&~ 9Y~;8TrkxQdk)n'aR(B)\gʄEnm٪Pl{1ڂn2T,LUԵF.Tiֶт,"IĚQ"7ޮIܡTH.ZN h{-~鳎K}AO0͚cmood] ^.%*x꧆(؎_Nd ʹ\bo Ph=}6Mح[gBif^߶/o߅@"TjC2q RVK 1 #0E\SLMcQ$Mnj#Za֕цzfm 7ޖ좊gk $zx;$N+0k6P<<LT}릅0޺)$n"{p+S-׎e@^n?M2PC% R9aJMo:wn pvmuPr l3:"*?  "\ME2~oc!T!C#{:sjq &ɚR@v2ilQ\o4cf۾vL5Y8)NB`ОsO83'bArW@Xm-@8[ hF4G!BJLH.^23> p>Gt)N"bk5h\YPdPt C1YUuSDFG`GF/TD8Si HYuZ#Nt@?"C.\[S~\#^bdvLR+6,1Scd{zN4oAp+qWQMuluV붶k/wv4Ko4oű^.&|uqw4b)|EL vMb6c6x{-xjWYMYy $CLmr 7{ZNu|8ܬiKCtcU[Mx<%wVVi{uHv>$zpQq3SQ,ʦs뱐 3^6jxσs5ZoKdKvz3MYKix7yag/xӵgS4Q;w9ZQdN@6Mδ?/O{gs:}O}>cq  +o9ou7u7N8:`;]dҬ@zܙX|zfp@GͰ;BY4ǔzd>焚'J\ce7[|۔SzdXo{{Kz@8k.Ap{{Q5B5W_n yLk:Ĵ21}WY55ѻ;sfk6[| ,+ݻu6zP=:M?|p7 4׃}/=n5Y󽏵:̽Ï\;~{OeMq7A[n/;hG]77fC~:{~;MsnľggGϗ{~w9@ȏ@Ppaw`A-bժ9dI'QTeK/aƔ9ˏ79Hq'ʼn  zq#Ǜ k&UiSO<1~=b(4ƜS=F;lYgZU՟Y]m[Zhջ/T;paÇOqcǏ!GxqǑ'WysϡG>zuױg׾{w?|yѣ ;db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/LoadingAnimated.gif0000644000175000017500000000530411520622610030457 0ustar directhexdirecthexGIF89a:\y&zDY˷evGDq잺CzI^tl;Pay$%tfVlD&tYp)1e}mXWj4sƩ՛{k1dv_viY u)^pc ļ+g$m\r>4zcQh&cXn\pq{!qSi} \rXPfez Maiy~x=t~Lb*m %cvNdFSJ`Tj+cue Ujb@UG]bw/dz e{.q s@6{=> {gubxAg~kZp@lt2n~@kz `v p J] K`~2k`te\r|Oe?Ukc{e{p k^rzQfsRiiktg{YnmXpn50 7{0v_uGZ.K`MbSS*gx)i{! NETSCAPE2.0! , 'UR 1b5p!!B$ T<8c48CD-H9B0D`b0C'3 \#h"?P 5l*%-XD:%J]k8*|8 6VUXHEFn( F+V pËNEL+py_ȀA0,1M<"u30ϨA7Ez*8@i! ,l@: lA MCI3ɓDq -҄T:E@GFy"M )_ e pQ /h .u1*٠:$`MiuBbSc/f9>}@$@#u+>L D&(شWd1Wg겢 k74c"Iw a1 ;H w^q a9! , 'U!Z 8(Q GB2SBF F$? pt 5b"yU:ut酈+V7VICE7 ^EcM .H„6ei@@)iѲK }КJZU5 $t(Sp8xO{91h0JZ_Cxd2 :pE!&"D>dP`rH_.ˀϖ9s 3dP:| @/%LMx@`  _`UZr*K87b߀1'n,OV#Ӭ9s\eF0)qDvKĀ4@(P 5 ! , tF"%@@H#HBDh\2p5k1N Z~m"$tL'/B"pmʊ.=XBPXbjDDxV!֨ӨS28d "DAvUv:4*s;db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/FavoritesSearch.gif0000644000175000017500000000111511520622606030530 0ustar directhexdirecthexGIF89a}aa{vvuu[[_rt؁࠳܁Ҥ҆Ξࣽ妿񌞷̦Ι̮RSSʰΎإ̌߈@مCփDόXusvsyywwwlllbbbWWW!m,mmg ;?07"$).(*3%:-'4=9+1DFJGBj9&GNQ2YS #8CJK/lmXV_c! [V^bhejll֨R XAi % DȀ "FAgx;db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/SearchGradient_selected.jpg0000644000175000017500000000122311520622616032207 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?O?J*b<W}⨢ ?db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Images/Logo.gif0000644000175000017500000011321311520622614026342 0ustar directhexdirecthexGIF89a?=;::ZYZXWXż[[\YYZWWXûWXX[\[YZYWXW̤ORkzPflCٖËճϬ)tMU']nyY\Do fo6`QT6ZZY˃Ǿ>=7}|vQPKՠVUQba]gfbdc_srn猊»̗ZYVihe_]Ymkg_^\pnk\[ZXWV_]\IHHBAAfeeZYY|||wwwuuurrrnnnkkkiiigggdddccc```___]]]\\\[[[ZZZYYYWWWUUUTTTSSSPPPMMM!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_zC ʟ~ǩ ㇸa‚C˙d -K^=4iӏ)%8oo4>~Gxq|YQmz}ikB݅q;9q*__!}7_QW?g6w%?0z^zTPσ WO` k\% ([i`8ό4C3ڈ<1:y8'`G%%ah܂:#O<;[e;Ηc(ce@`r+c!dXqBt!SxN:cS9#)砓:c#J*^1#(ﴳ:::N8|C7H4B4H,pC73ÎC#*us:"b?":㕢v#8p3A54@1 0= /bq.ҋ/#@3T3A7xkpNVxcnS &^2;쬃9S06,SXggC0 p29Χ!d! /M>*hXM{5LA/Yg/2qb-ƾ@>8#6)cG:켣&wܴ Bl:Qz+@J)/:vN7~8%v Ny܀2^ez]'   1:Ё H IF0 =E: p~ծ4D ؓORsܐ@2\P/0=%,a85ֲn,.K^ⱗ@AЂtc1@ a,ΐ]2p4rmq>Dț0ћ>xx: FgsS&6%nx;f41: xE_! g`~=B[?r`:'Ќ}+{w;>[G:U#/ t]jS;fԠ"83y#$8̑GTr'odUNF :e C=(Qpeb ]^Ce2edyMsSEl̰3Ar5񎌒MZUζgp<WHHPS>,t;*e]8ՙx|bX;x3j  3q6GRWpĪ>["nmIOl,#1H4 HbTv;U.i}chLɞۻ/3 $agzU=[iW<"5l P\cs2w s61j_-Y&vMgz @ ëR%"qOg[ARNވF6с Nc=/}8<եKDc f(354sOS \GivK^ "|7o6}ӷ%  ` Ӏ蠂k0c~hĈ9hhvP 0: inԘOP6i~SMaW iwa@ETeZ xf8 $ tvkuh{t z"m@pųx \ gGƑ}tG'rAvnWl\NOldOh We2K6P|GPuYk'dȁ @ΰ- 0tr8#Cg1_Q7uR WP 0 x9a DwyX|wM(=F(GFNM6i0FnSj /Ǘ n(}Ih8ϓ k; R"r" m ЕqaEK riS\>/mDM `Meme_ Y`F4 R`ح= QXPLD['R P   ߀#3Z FR bj`/2|D0wKBNe=hij@ ~pvD1$ TVĞL`ޯD :^Z䫮=~ꑝY9LJ]'Pk,y 5@ `ZVR= ` ޿0 ȝ|fօ#Y=kn/Z`DnN?TCJf0e0b WpİV!P+-U_P=+ʅE$î P-P-p p 0 LZĩ+)9#%~'̰&|'=}ʮulDW~%ԞQ  d;o'cCY`Td߽WkK`vQ5 C3t;drh0 mn9olT*{ G\P?Q€@ W^cTo}_!X``,dx cȐ-HLe˘1kVYg$<4iԨb)KkbŒyMBбO޼y*ON SQNZUYf*Gx>Ejl <,kY ޭLEɒ-X q2c c`H/Å15o.,Cad&@ 7O9 ̶aJ,#䍐5?رȔHvƎ$={V \fk4g Zo; JO@Gu}|.ȡBKarId<ˣ8Rf#0CU<02vf&5ӂ ko-8 ~@ R7>bpa0/K"I302MGq8Ovp9I%HHAxh9BbԀ8$(C>اu+d?X@SAe*Ӈ ER:a blU< d<1@*R\"5uȨ(0 \B)-l}֚d C]v :^`Zwtk# rqXd1YܰO|zчȚJFuG*@X$lǂ! d첗`y8a>p~a021У\,VmGQ /1|c7*t-|iRrY-n.V/8ɐaf4Bz % 9BT:{n(+8>fv+/>\YcS:f$lF 80Ѵ:ҙ€4F 9MXr{ Ђk]lUD _mBU dv1%,A ՍXy hjT+ႺBb|i2hCUh0A4qD 2( mh#sF'E̓t8 ?qJjVUQ4ڳmA͒8;"-9*3ߐTjB KQӌOZ0 B! PBJ`ZFv(ha eۄ(HAZ@۴7 QX=a/y`_JfeԀFȋF8%2\&a cC8G;)v(T7bP=dڕ`1_6b50C>5P4@2  ,c tz7AP WF:k8 xĂ#q`Aڄ %FA%\Ph΄D>;e k@| kB=r=WmA CEEW;́ %jJh8T9@B\hUyҘU5Y_]Ŕ VeYmFYJ/ŗx鰁Z( X2Fsn0Wm4\N60APQ|( (=xGЗ`}εmZ 3e7GDe]?cq ?px0U ҇gxwxdӚXLa#&b3V^q&cAsI" Q|bhh^h_&a(!P*ݪ i kȆ/< o2Lg&1}051xPtoc AKa#Fۣ`#&$<_]>*VYhn|xAHQzi4~lti rԡZ2jN~y=mJF~my\@<܎M<əXc(HxdXc+xcpi7jR[FLkF\[nט, (qy@c`َ6(9Y`;goו]w0zLDbpHU[@uKޓx^A-=!bkH!kE__^&I]%SdHhhg2Hnl<r w`>p25z~$=PM^Gt&^QiTpAq܀GEk]^Etvk,Prer4ofhSdx9iHi`[ڞZlq`x }PA&_ ENg$qij`[@Hx|JgZU&y6kHF/Ƽvozt+`sINca3@+e8jpe(YHZwOWwx/sx`v 8d)נTNBfzzQ@6SW(6s]eA-S8\5~"34hცL~p ^{r7$hᤶJ1!ÑU R"IsoJ$ )1"b[a`%2`F_u'}_w7}b}$(JY1UƎClʖ1cU35 R`MmڶqkI[7 2)xv'o=zpA߾}B)ԨRRj*.wB=zŋv֪3M difk֪UEMѠx,Z3f˒%sxX b63`@0eeK4kVi5eȄmv/w{7mb%8dŊ)0$1P좳ԠE0mj#ML%̘3mLSTV%'(Y]u &U?\Y=C<;8q,ve^`_ F 8b3,3AAt 10L |h)ljњe G\qUZ۔YiLDa9&a~DE0D@yH_ĂM{+L375d}L_=XP'Ï?*8)  W]%!YfY؎Nl\*4\"ꕍ(J؊8SC3P36ޘx)B00|քdPJe`X{-^[ea\V,1Z{.{\|WCy!r͝yR2hM;dPD 'ITK,UV[uuO=3Yg% ;c7rm6rM,d( ΡX2 S1!1>h@ $C0R,Ah4$UCAi56eo\%eC]if6\f5H3 &4Լlvo7N<=m RJ:12(>]]^r)V_A@Ma6ך hCxe3ѝh(dfZ'\ي1=[oujZ~FW"FRӜX ڕ27,'< }0*r\xKe<8fc-"K8T’Le  XL0 1+f 1l!`a8bFA`0 _BވO7غx=la6ܳV&ZB .yE#?~'rdC AL~JV =0,;ࡖС ?4m`eC4 pB>Vs ^Cܨp }bx, M` \x덡%0yR7Tr"HFzӻ g5 zjcG9{ EyA\&D!QCj#ȓ}h#5` iTC03>p*~聰p@*=+v~Xc<<. oJזYUאCkFh*g x9UА i}g`r., { xX45h/o!I]Pp_-g91tbKX.ЏȫU 6XW񘇅a @HYAVqH 1 E3FCe a52 ^f'8 OBΠ=ta ~3-h/ Op›,g/ g؃HyҒ›9؊bNоmVy1L•3Љ<Dax @\ӣH_CXlW;CG|_K 9`U@pYd\P9l$M$7؅\ XCݑ]1c@c, q)tY`[-F^/#,ǁ/0G$A5/*%wfv9)UN#4#(VA($ 2, <1B2D] 4@@ D@H&S%@9<(׬) 8WeZ?p S:&IT^4C@8 $(1NC9!HBvr'wr'v:x"L'z'Y {z \)M~BG101Ā:fF K d4\`LCHQ΄ÅCꡋD݃쀌9Le>!Y:ß܄L`t\6(6HUb0C^=1CCb $e %(yg*%+:B|y@8Ġ$TB0 _0hg 1F x3!C4040Cw|3<@5O`7SUhY; =,LR(TPZÐ:vP6JݩPUc'h*1tFC-)Rk/"h&'7蠸r-- ݒRSA'+5.#܁#\\!lB07~,G=2Hu0C,4Aw=Gl5l$0~$9< bH&?p ïu&?m:lq ʬ~\L HPC& F!lu5}~hҜn-|-A %DX--؂ܾo&N# zi$B8Aqb])CT2 !\RD3D3L 5hMJ7x?Vh䊉-]@ >^V?CYDzC[5/MjFYa4[e 4됈1^r$ /m 8B9&o)Ro-6\ '.z+V e1)*5 ̐B 8cL 73P 8FLC5 ^ ӥZ8䲐$E hCE 5|uuwB.2)AڭRv,B.(r').V&Bu/4^q! Y xae}Z4"úÒ;KLz 6X ՊbDC2ÁK.C)0ós 8c.L\.8t3[:o-|).<ɓ8C:)'HC/|7Za! ?A0,B(C4PTFACC DŽ7ءbôO9X{m6 AWuF3q c/8cH0(ĸ[P/2Pˉ+<ܹ>.dH&Pb=B5$MM8t;^%<7k D8c\*F , PFgL?$Pb @ X F,Ífqt5П*0#K?BQ29 > oCb$ !hiu $eLrAF( Brf D@ Y&С0 X8f)$'ЍH7O`Jht< 5 R]^X |{QQm[VqÃ+DxM?@ 8HBRQË5u! m(#URbd5ylڅSBIIQ؉cvhG<" =Wvadމ#Èdf~䘝'xh!jaCT%;LisUڼ"+F6fzѠA,Wz7)5,/F#@D#Im2O"(d؃88;H:EPn$s.3 -N[Q</xΡxH k@p5$ eFy pt؁ $)J&Ul}2^0ũ1`;{.m =0@xJp+a:&zp1l2 'Fa6Q*J/PraJ.@.M~TVl &@WIO@LYY8A$(0HL$^:sep N.7 d퐬a<` Xb/AM$@1*P|&d38i@0E :iRp.9m:kC*fOUz8h=^.NdX "/*.dȩaN#~$P Gd &XD)an+j0s0%wI6x :h`Kd`Ą̤PGAN`JUB~NnBPCagI+%/`SBIv1|3Vnmd!掐nXhof@A!Y``ZgC8d$RKĐDN&@Ŝ'B u|!+@A&e&o\|tȂ! bdJ d"d`T$å:@g4́jEpn6^ridr&'SPὮCǪ|(9ӊR>I?zԨgH`g".Bh#Q$(F%6\Dxa^xa ;iEHr\2M0hFx,! @bN~>@z!2m{#%@@D}nO5P%#Xea6k S˖tS'EAav1hO((R`ą`H|yDNa"EXa2wB"zĥ EtCgt@jD^QD$>kSz!*ɘdx^܌g cNBGTf#C=3a΃OȁLԓc5Xcj5`e6`h)rGmqHdvL#4<((Vv%?to` ",l;RJaʔF-oAMM`"8+j!]sO%`Ȉ`fx$@/("@̞CAC;}JgDK${BL%e%Fm&q8N%+X=CnhnJ! T!pdZ`ZZ~Љ[ rT2nMC'!^@ar&j/a$?!i"\!F"5V3 \&ʇW@D VX~ `F0 knsT zxhGBItLhB2ɦ(f.AIJ04cXF #d'<1Dol~PvDUEb#]A7zVi3vcjPFijgYC҃(4aDw"2#&Lj0`MWpBxAAnA`om~o`S ,xz q΍yR A{l@eN -[ 3034Q6J1\i%!^Vc8jFAlwYC$; ic! Z(Fez1De3s-mEnB]I}hoŷ/y4m#4 Ìc'pp" !e\F9KuB4 %5O;:/A`aؕ Wi*hwq0w٦V NWj{*k!*Z@4 ,*Ǜ[Ds|k`ġ~9yG: a,$PTyJGDILm!4EW(tiyt%iZS:V&Cp7IrQfՇÁH)!|Ev`/)!Y2.| xPr~`ʖrO\pUrL"a~x&蹞t֎яa΂‰p+$Wr$Q[Ja108N6pOB$S3%]Uc^6f5h'!(yf(Q{4rleIIy&F ;KLɖ<}͹n<A@:! zڞx- ̀u4RDL̄PW`$t~l%AL7d%n. 7k7cêr98=O=ރQ( ZEBL .~[l3O&! `~<C[PLaߛK B@2)le'dNf 4HOK 6a`WЇ#Kvid/*-Hl&9m>z/? Y* bdA=֮{ϓ+jؿy~־~h?|H.c&ad ŌXl{yB">BW/:+ap9u+bD]زeqת9rHÅ$:+%գ>~dxQ@0 Fl  V=plѶN;npxN7$\6Ģ ,LMu=N2$SF!@jzA`-P|7_t_/ D&K(r('B $BNk. /y_"Ab>2/t@QHS2 L% #H М 6P`$8ɖ[VY`ebUO3Y?ibf& (\p=s<l츳N_Xj9 NPreM5L#t=K h2VpL1@%0 jkLK IB,#B+TJf@L䴓OPDr1tq, dWC Pdup9WnL%;&aV f'?fr(pB<м(먣z3]@NqD37X#ԑP315w3,P|5JA} a? _5@!$>7тr$hMCK^-`#rNc]/RW ) h :W,!L,j'. ^fqƌ7z1 Y(H8>zC{)ätm9hFj d'ZK-\%CŤ@Rb] h!*C2?"&rhpr% %2q)c" E:$ƹb4C)D 4*=J4(N#`) 7r0$,Q]F-q;1NpLmPQ+?RClj>D?kqmP@p1)\Rd3 Pe s8c RD "]r(rX 1G(l H8P4h3)ǰ VLEu 4Љu¢ֈ7r!*JhOц0<PT A 7Ց"xcOY:tC>Be8mY7( Y8*Հ <:p)3 ŀp(%  1jeZ|Ie.^ nv8\YGrF eX @3bw *pī@u8A:Q:klcI'8ad)ϙY4㳡Me~\1~/ >A#8A;Ѻ e,JY"hН!<0x=9VA %x^ ېPp$TXL `>? õ@Q b]MI4^x5:n-pi,]zcd)Rab|dV?tGdZV=ʣz3|ƶ$юX\CWJ \JVEwC#Q%TȜqpya]%%dɫ\b!n|c|D%qJW+/yVhӦ(嬉$1XhhC ZH l5 %]w3g<1 e8FN^<,=% Fg1G!n+c ' )J wZ; gdMkq-U2|: l`A惶XHuR/>y2t(C vq^kq/EwEJ:iA1kT;A?e˘8k HB4P*m\Cv<7Ɔ#wK>#{dzӜ,Pz੏{nb>( ` KB$5d ?$?pP C a3y: BTT R+<~7 0p ֒++!V ];a6wBV Fs2 aQ F@NPG $ Xڀۇ &rO~Wgw[" 3l#26ϳv2D`d8QDeA>(p 4t$"?q 10FdM"bcC0sy%+k*g+pq ~: ! 2"bVDŽV/`.mv D%PR:PS`N P H$ %\D(vl|OQ13QzFhׇ'Px:z$Q~$db[XV(H[kPQ\/ 5SlI:]@q@` p B@Tz?g-ЂQ38 }6{"WTGMC"|0 (#J.Pa:V@ D ƎP J SXSE%^bY4~PP;Fi2 v&Qz|dw5n#eHP:6\ĉ̀)p<7p{ДVVhMC st.$Q!F}iYkWS$0`0duRbOzb%11q&cir 0 93ZZn(UV[EC%4K s AvQ 0e@ .0 * Di+4A?0҂>`p  IqL"Ciϸ{3g`"* o9_s@C$/:DV#^]Q$38X ;eZ]& Ҁk S)A2 ` 4p; i$(CicTUL_V1q u06U pRi`C-rsPGJD6hZ.EV ktq $uEjlkYpfYi~z(q"Q'5ncnK1Fe ow؀ xMC'5T6 Ǡ :n a@4*6] 6p9SrLIqB, @JVL0 6M CAj [tE :OQY#ME/3 %f@FʖįF5I~ AQe}dIxW(q)Xh)!3)h95@!Jܹ:q]$-i#? 9庵 TJD66ڝ?Uۭŀu 40/P aK}[ e+0lAO)bnۆlc vvy&9'.c'Wn'~yaASeHs ^&?ԑ?/0k ` g"p8zGyg?ʛM C[V38˴ؕ Ûo`C𭟒r>n K $tE$UbtQE]WQ08V  .1#Q533؆P6񈶵 ` ]f )P@\z  )pS"5y)TGڕ6@rTĺ! 246iZ ;Q =.U+1`5# }WQ^Rp;0ŽYDP,~b'@cFc&&'8 YʖdRH eMR@ \\f3`5 *G*+ ?562]5khCygU "H3!C{#M\JBJ`#7"̇:5@k/a;֐`&E>cD m9Fm͌2+xIwYbw) `V&Qoq`5us +2]R :BĀ6A Y  PG A8 F #Wkyd אeqEN"ll~3CYS7e<ԟD}$ >R<qe] t8\Px4px#47p:e*xyp@xpD5 &2a&87], Vu`CjI AjCtGtB/ڿj}=->Æ۶q3-EjǭPd2`=ZM(9e֝H>5L@IE53%0c doS^S :]@?+-QR Ҵ]BƠ/k4N % ]:tKڠ !rXA~Zw<]QccGܔ!0Ψqp` k+w3P([ (a :N9)ХS > o Ŵ@?P,< 5b@-o. nsYJ Df=#%a (}n%&hd' Ԡ1ꤎv%l<̈́#[4A fg Õ:2 fBW`@oю]ni.K@K$9/@oN>TGIQy:~N\kP(E{WW#~$P(\`)/"kF5` G ~_?FZj֭]F]ڟ>}ç@) 6-䲵@6|x)nKǎ枋q©n/f.mOtLr+agiIG8ц֠ĕ$?_Gc(cWJe" 1iۊGmۼJn#s1R6Wt*^zG<6fӧ5_zD`ǒCN+G:ɯ|K`;ܤʃ#aē8n;%,.v<+_qOct<`V;aedDez/8B XP(1atP$ZEGN, )l:X ϘJUTTG;pcy)/m8 {΍nQdӦ6IG ڮÂhfU)FJAS)%c.gN Rf>M,<ƥ2f :eT:tA8Dhc^r@G]fՄ։ހJiFFHd=)#<2_eJ-@P.ucNx[:@V3 h*K j?:;P 8jbqL'͝4xR- w'eFܻ:CYCuD87A| nt*͸6 5 `<^ӭom;,ܑ({!_l\ܖ)Ű%&<2=ؕJ,|Lf m2a(ï,G,ZJ;1]BY_iȎ*.b8)QRe$Q[^p֩aWS[2 7rڗBIL!>JvREQrM !oz`lG3u~,ŹS<( yg6F+B&\e['M%.mTQg#c:j.=QѪ/=U.2nBIԶp4>Z]c5-l뺭yn'\:k:SV+ӟwJ1x}"%mkBϑ=A;Q>ѥ"B  v@nLqMs؆!̿Yc ̌[4/,p0YM2gX!;pY|3LJ:!30%qC:PNcN~K%V[-POk-qA rHoq8qXŴn@&LsÚjP!֤8ŞF֜i t M=Qq\RF~XRNK7 ;s0):OqP-n蓂),x qÀ`fYLsXIGz>up|p u7yHJ V(܊ѴE(hOE-X0w0knK-QJ"UPSլ=)QPD`*>HUCm)" Q99gr.͌05px$tX q;ZFXX!.)*jEڨu--gWtYY'FqI!JXHxpu sxjІlL5L[ڱi[:"qYsq}N DNP۲%H})>sKK!RR+cBsW  aBA=ehTR\0UfPL9lȰ15Os(|` a/r+pћuxb*aRZrW$!)GO(AK Pcl.s RPۊopTdIDϜP*9M3p౹sTMJ㾸@>an{saF D{栬ӺrUav ZmRՀ!<4l- ;k I NfE~((;FR\4 iFCNK,[F 85!\djC_gk܆}spKV<.MtBQ)XPfLE֤gP*(AB|+nC:λ1:q$[avZ0 5) 7~se;]%i=2h@B5;f؜1gCe/4%^BX'&صŋQ omSayPo~oۣ6K4RR4>anU_-Q=2Up:# srb/8=*$qhqPQ4^~qV섚l(QG࠮tP7p"oSI:yFgϹg'~Dž\H\#pp oE3 ƫc7Q9#>mKl<_l džgބ3IqEXyL翅Q >ujX2\ mxZAxT#}bzvk][=|J&V D?EhHN/pdL}{&Om onKM6 deEkPEmGI r$X"L .KFRf6nJHM[FX1ZMbljpQm*8pą*Nܸq1gΎsСKn[vڹ{>~֏?b!?>E(;l:fl#N9Y݆7ApMB ,HTqeF:B N8=t#MWQGP(T 7F6۴{'U}Vᷕ~jB]w`?Rj!!W>ե"#`j2sYb89zNULtQMZd rQ6d4݁fGNCMR-PdPpQ1NuCAQ58Ym~`Zڕ!eYg)(iu:3jc9+ B%iTqUx=I r-[;^>De+RH&d$+醳V]y4蠅s F*__a!\+:ZvĆ#mI@gԚML\3֌7LQ>'B _G3+K{ [pQ]5z5طa}`$*giV1:=81AfjiE߸[^CY. t[袯_v ;Tu "ԏ. d/u*/wGB3Ҹ#bȣX:,nѳJQ*Ad";JnpA9\uIX5m86a0}Dģo?:P `h -0#?B6h& Sԝj^9E܆ci>b}\"+_m{2!8AG"_=6m9>!NQHgئ]k"ՋEYf.:#/!mJG&080JR1e?Ϻ > D`̱qp6BmxcG8:ʱl`9A!vC"H$~xQQpJ6D v;v#o"*WYViR"=ԦE_{Ҁw!قx̃mlKfsn[^ͬ;ٍxD6ʡoUXtGBB?M0G&JVӇ;Cnl:IL:(B=qJTR3EuGRڨGdxǏM6XTĨvX7QV;ځֽ\G7anCmX;$)mAG:sb8d1@"ŜԵ. Tmo8W p,v>4Gџ, k諲Y˥.g0K [ǎwlo\w`>(puaex'phc-~>F!ІUaWw׼$]y侼C7*-W4d<;Lh!xPMH*8J5sppbsDZoP@}(*H=F#(.W!ioHJtmIȱsc!WRbYWedO /a60{-3/dшc" j(̟iC}${Q,RMvG8! 5D8 "϶֫*' s2yWwx9<#bkY WIuhm|Բuf}qwDXfvӜTWKg׆ڱ8HltF^`$CFbss8M47j )pA@MsP2:a"gñB~[CDi#G"L8ر< ᱜ/֍ jEVLJ>:#}$W4b~QL5EmF7vda`*nTNV ? [%IckU$LjLZi4v e-OP6 ۈ$!**teJb*bbJcegH!:Be=&Ynph\Af` QE.6I`~foUFK;TY+"YvlhgHw.hw6BJ9L#5AMZ԰Ldմ'ngeƣ֠(ڱhgb0eEre꠾1߭(>æjj*[ENC> ߈kFfM:0(DfVn ZPJ$úN,œf,d6hҝXʪʚYfMH%2SȓY0+'*smҦZg]SF k"} Lma  b3=)~s.+ZICzncRF "Jn)`*n֊}be-gPͺ٦nUX.Y'-!秊BNUϦ /0bZ~ ΨnZu0%/, }-=QhI*Qj/+s(; p)(W6,}>.&Z\e'"q],F[o,;16Ǟ&a ݡljrd ;hɱUqqNn#l~W@47 )Os\O-09E.  %Fs1/'?&r*(MV#{q?Dž$4r ?T1^$L,<ZHfvw&!%uk!p=.wY#ȧ,8t'8c;]PC6ht{;1NEf?5Jt|O HcP[!FGr2xud:끷=GUq3p8K608ZCx@9̖yM_g7v9%R5QP; Toolbar
db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Favorites.htm0000644000175000017500000000223211520622610026214 0ustar directhexdirecthex Favorites db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Index.htm0000644000175000017500000000353511520622610025330 0ustar directhexdirecthex Index
db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Navigation.htm0000644000175000017500000003723411520622606026370 0ustar directhexdirecthex Navigation
 
Table of Contents Index Search Glossary Favorites Browse Sequences Topic Comments Recent Comments
db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Blank.htm0000644000175000017500000000102311520622616025304 0ustar directhexdirecthex Blank db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Toc.htm0000644000175000017500000000267311520622610025010 0ustar directhexdirecthex Table of Contents
db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/BrowseSequences.htm0000644000175000017500000000272211520622616027401 0ustar directhexdirecthex Browse Sequences db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/RecentComments.htm0000644000175000017500000000274011520622616027212 0ustar directhexdirecthex Recent Comments
 

db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/Search.htm0000644000175000017500000000534611520622606025475 0ustar directhexdirecthex Search
db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/Skin/TopicComments.htm0000644000175000017500000000273611520622612027051 0ustar directhexdirecthex Topic Comments
 

db4o-8.0.184.15484+dfsg/doc/reference/Subsystems/index/index.mcwebhelp0000644000175000017500000000107211520622606025641 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Content/0000755000175000017500000000000011520622616020765 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/0000755000175000017500000000000011520622616024723 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/scalability.htm0000644000175000017500000001012311520622616027732 0ustar directhexdirecthex Scalability
You are here: Product Philosophy > db4o Position > Scalability

Scalability

db4o can potentially be used for rather large databases - up to 254 GB per database file. However, this would be highly unusual and likely due to having the kind of application that was storing relatively few, but very large objects in the database. As a general rule, if you expect your database to grow beyond 10 gigabytes, you should probably be looking at the Versant object database.

Also db4o is currently not designed to scale for highly concurrent access. If you expect a high load of concurrent access to the database, you should also consider a larger database like the Versant object database.

If you want to make sure that your application can grow and scale with db4o database you may take the following steps:

  • Write performance tests to accommodate for performance requirements of the growing application. Especially look that you also capture to complexity of the model and don't use a simplified flat data model.
  • Use client-server version to enable many clients using data at the same time.
db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/data_persistence.htm0000644000175000017500000001716411520622610030755 0ustar directhexdirecthex Data Persistence
You are here: Product Philosophy > Data Persistence

Data Persistence

Software programs using different data persistence technologies are an integral part of contemporary informational space. More than often such systems are implemented with the help of object-oriented programming language (Java, C#, etc.) and a relational database management system (Oracle, MySQL, etc.). This implementation originally contains a mismatch between relational and object worlds, which is often called object/relational impedance mismatch. The essence of the problem is in the way the systems are designed. Object systems consist of objects and are characterized by identity, state, behavior, encapsulation. The relational model consists of tables, columns, rows and foreign keys and is described by relations, attributes and tuples.

The object-relational mismatch has become enormously significant with the total adoption of OO technology. This resulted in the rapid development of object-relational mappers (ORM), such as Hibernate, EclipseLink or Entity Framework. This solution "cures" the symptoms of the object relational mismatch by adding a layer into the software stack that automates the tedious task of linking objects to tables. However, this approach creates a huge drain on system performance, drives up software complexity and increases the burden on software maintenance, thus resulting in higher cost of ownership. While the mapper solution may be feasible in large, administered datacenter environments, it is prohibitive in distributed and zero-administration architectures such as those required for embedded databases in client software, mobile devices, middleware or real-time systems.

Significant side effects of the object relational mismatch manifest themselves in unnecessary system overhead with bloated footprints and runtime performance issues. Of course, there is also overall time to market delays due to poor developer productivity. The overhead still exists in ORM because under the covers, the runtime is still query driven. And, despite improvements in productivity for developers, incremental changes to your object models reek havoc during ORM schema evolution pitfalls. The more complicated your models are, the more problematic keeping changes in sync with the internal mapping.

Primary performance issues come from the fact that despite being called a "relational database", an RDBMS does not store direct relations. Relations are resolved at runtime by performing set based operations on primary-foreign key pairs. This means the application has to constantly re-discover data relationships at runtime resulting in immense CPU consumption for something that should be an inherent part of your application model. Further, because discovering these relations over and over again requires continual access to index structures and data to perform the set operations, contention is much higher within database internals leading to poor scalability of individual database processes.

Further, lack of direct storage of relations cause the application design to become query driven instead of object modeling driven. Using an object database, the relations are a fundamental part of the storage architecture. So, application design is model driven. You do not have to suffer any performance overhead for discovering an M-M relationship. The relationships are just there and immediately accessible to the requesting thread. This makes the internal structures much simpler and therefore less contention exists with data requests being isolated to data of interest instead of leveraging indexes or sequential scans. The result, individual processes become more scalable under concurrency.

Technology is ever changing and today there is a whole world of object database experts in the software community. Anyone who is an expert in ORM technology is an expert in object database technology. All of the concepts found in object life cycle management within ORM technologies were invented by the object database community in the early 90's. All of the tuning concepts of closure, fetch configurations, value vs reference types, light weight transactions - are concepts created by and applicable to object database technologies. Now with the growing popularity of object based design and the proliferation of ORM tools, thousands of developers are becoming experts in the object database API.

db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/db4o_applications.htm0000644000175000017500000002210511520622616031033 0ustar directhexdirecthex db4o Applications
You are here: Product Philosophy > db4o Position > db4o Applications

db4o Applications

db4o can be used in a wide range of production and educational software. The primary focus is on embedded usage, like mobile systems (phones and handhelds), device electronics (printers, cars, robots), SCADA systems etc. The following table provides many (but not all) possible implementations with an explanations of the benefits of db4o in the selected environment:

Environment

Benefits

Educational systems

One-line persistence, Object-oriented model, intuitive programming interface make db4o an ideal educational tool. It is easy to use and it provides a meaningful example of object-oriented world. It is also native to most widely used OO languages: Java and .NET

Prototypes

Using db4o to build a prototype system is much quicker than using an RDBMS. In case of db4o you do not need to create a data model. Further there is no need to map your object model to the database. The general persistence mechanism is almost transparent and requires minimum effort to adapt to. Automatic refactoring allows rapid change of classes without the necessity to update the database.

SCADA

Using db4o in SCADA systems allows to achieve high performance in caching and replay of the events. Another benefit is a small footprint and easy integration with Java and .NET programming languages. db4o can also be run as a memory database, providing better performance though minimizing disk access.

Mobile applications

Mobile applications can benefit from in-process database, which requires zero-administration. Synchronization with the main server can be done with the help of dRS. Automatic refactoring can be another valuable factor, which allows to skip the job of updating the databases when a new version of object model is implemented.

Device applications

Device applications enjoy the same benefits as Mobile applications. In addition, smaller footprints can be achieved by using the minimal Micro edition.

Open-source software

GPL, open-source compatibility licence. Native to Java and .NET. Easily integrates with any Java and .NET open-source products.

Web-applications

open-source, reporting support from several Java open-source reporting frameworks and .NET reporting API

However, other applications might not be well suited for db4o.

For example, in situations where you have increasing amounts of data ( over 10 Gigabytes ) and high concurrency ( over 20 concurrent users/processes ) along with your complex models. In these cases, the Versant database is likely a more appropriate choice. Versant's customer applications span a wide range of use including those exhibiting 1000's of current transactions ( 100's of thousands of concurrent tx per second ) to 100's of gigabytes with some Versant customers in the 25T+ sized database. For more information visit http://www.versant.com/

Another case is when you have simple and flat data model, primarily used for reporting. Simple table-like models of tuple records may be better supported by an RDBMS. In this case, adhoc data access would be more important to your application than well defined use cases using an object model. Typically this is complimented with the need let your users to be able to grab one of the plethora of commercial tools to poke at the database in an adhoc fashion.

db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/oodbms.htm0000644000175000017500000001121011520622606026712 0ustar directhexdirecthex OODBMS
You are here: Product Philosophy > OODBMS

OODBMS

The emergence of distributed data architectures - in networks, on clients and embedded in "smart" products such as cars or medical devices - is causing companies in an array of industries to look beyond traditional RDBMS technology and ORM for an improved way to deal with object persistence.

They are searching for a solution that can handle an enormous number of often complex objects, offer powerful replication and query capabilities, reduce development and maintenance costs and require minimum to zero administration overhead.

These requirements can be fulfilled by using an Object Oriented Database Management System (OODBMS). OODBMS provides an ideal match with object oriented environments like Java and .NET reducing the cost of development, support and versioning and hence overall system costs.

Using OODBMS in software projects also better supports modern Agile software engineering practices like:

  • Continuous refactoring.
  • Agile modeling.
  • Continuous regression testing.
  • Configuration management.
  • Developer "sandboxes".

(For more information about OODBMS technology refer to the ODBMS.ORG website.)

db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/db4o_position.htm0000644000175000017500000002121311520622606030207 0ustar directhexdirecthex db4o Position
You are here: Product Philosophy > db4o Position

db4o Position

The db4o database came to the market in 2004 with a goal to become the mainstream persistence architecture for embedded applications (in which the database is invisible to the end user) in general, and for mobile and embedded devices running on Java or .NET, in particular. Versant's vision for db4o is to become the affordable, dominant, open source persistence solution of object oriented developers of Java and .NET. In a very short time, the db4o team has achieved mainstream adoption with a fast growing user community currently boasting over 60,000 members. Community adoption is continually driven by db4o's efficient innovative technology, native queries, deployment in Java and .NET and its open source dual licensing business model.

The target environments for db4o are persistence architectures where there is no database administrator present and no RDBMS legacy, i.e. primarily on equipment, mobile and desktop clients, and in the middleware. Typical industries of db4o customers include transportation, communication, automation, medical sciences, industrial,, consumer and financial applications, among many others.

Existing customers range from world-class leaders like Boeing, Bosch, Intel, Ricoh, and Seagateto a broad range of highly innovative start-up companies - in the Americas, EMEA, and Asia-Pacific.

As a client-side, embeddable database, db4o is particularly suited to be deployed in devices with embedded software.

For deployments requiring a highly scalable client/server database solution, Versant's commercial product line can deliver a solution with equal ease of use at a surprisingly low cost compared to relational database solutions.

Open Source

db4o database technology uses the now-established, open source dual license business model as pioneered by MySQL, one of the world's most popular relational databases. In this model, db4o is available as open source under the GPL and the dOCL, and as a commercial product under the commercial license. Any developer wishing to use the software in an open source product that falls under the GPL or other open-source licenses (Apache, LGPL, BSD, EPL as specified by the dOCL) can use the free open source version. Those developers wishing to embed db4o into a for-profit product can choose the affordable commercial runtime license. Other uses and licenses including those for evaluation, development, and academic application remain free under the GPL, creating a large and lively community around the product at a very low cost to the vendor.

Success Drivers

Open Source platform usage is one of the key factors of db4o success. db4o's openness attracted a vast (60,000 and counting) community of users and contributors. Through the community support db4o gets broad and immediate testing, receives constructive suggestions (from the users actually looking into the code) and invaluable peer exchange of experiences - positive and negative.

Another factor to db4o success is the technology used. As a new-generation object database, native to both Java and .NET, db4o eliminates the traditional trade-off between performance and object-orientation. Recent PolePosition benchmark results show that db4o outperforms object-relational mappers by orders of magnitude, up to 44x in use cases with complex object models.

db4o uniquely offers object persistence with zero-administration, object-oriented querying, replication and browsing capabilities, and a small footprint. Its single library (JAR/DLL) is easily deployed and runs in the same memory process as the application, making it a fully integrated and tunable portion of the developers application.

Customers, analysts, and experts agree that the db4o object database is one of the world's best and most popular choices, because it stores and retrieves objects natively and not only eliminates the overhead and resource consumption of an ORM, but also greatly reduces the product development and maintenance costs, resulting in a lean, fast and easily integratable into an OO development environment persistence solution, far superior in many cases to that of any RDBMS.

db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy/why_choose_db4o.htm0000644000175000017500000002123411520622614030514 0ustar directhexdirecthex Why Choose db4o
You are here: Product Philosophy > Why Choose db4o

Why Choose db4o

There are many advantages of using "native" object technology over RDBMS or RDBMS paired with an OR mapper, and these technological advantages significantly impact an organization's competitiveness and bottom line.

First, object databases not only simplify development by eliminating the resource-consuming OR-mismatch entirely, but they also foster more sophisticated and differentiated product development through gains in flexibility and productivity brought on by "true" object-orientation.

Second, with an object database, the object schema is the same as the data model. Developers can easier update their models to meet changing requirements, or for purposes of debugging or refactoring. db4o lets developers work with object structures almost as if they were "in-memory"' structures. Little additional coding is required to manage object persistence. As a result, companies can add new features to their products faster to stay ahead of the competition.

Third, developers can now use object-oriented and entirely native approaches when it comes to querying, since db4o was the first in the industry to provide Native Queries (NQ) with its Version 5.0 launched in November 2005 and since introduction of LINQ in .NET version 3.5. Db4o Native Queries provide an API that uses the programming languages Java or .NET to access the database. No time is spent on learning a separate data manipulation or query language. Unlike incumbent, string-based, non-native APIs (such as SQL, OQL, JDOQL and others) Native Queries and LINQ are 100% type-safe, 100% refactorable and 100% object-oriented, boosting developer productivity by up to 30%. In addition, the sophisticated modern programming development environments can be used to simplify the development and maintenance work even further.

Fourth, db4o's ground-breaking object-oriented replication technology solves problems arising from distributed data architectures. Partially connected devices need to efficiently replicate data with peers or servers. The challenge lies in the creation of "smart" conflict resolution algorithms, when redundant data sets are simultaneously modified and need to be merged. With db4o's OO approach, developers can build smarter and easier synchronization conflict resolution and embed the necessary business logic into the data layer, rather than into the middle-tier or application layer. This creates "smart" objects that can be stored in a distributed fashion, but easily consolidated, as the object itself knows how to resolve synchronization conflicts. It also enables db4o solution on a client to synchronize data with an RDBMS backend server.

As a result, developers can now more consistently persist data on distributed, partially connected clients than ever before, while decreasing bandwidth requirements and increasing the responsiveness and reach of their mobile solutions or smart devices to make products more competitive in the marketplace.

Fifth, db4o also allows for more complex object models than its relational or non-native counterparts do. As the persistence requirements become more complex, db4o's unique design easily handles (or absorbs) the added complexity, so developers can continue to work as though new complexity were never introduced. Complexity means not only taller object trees and extensive use of inheritance, but also dynamically evolving object models, most extremely if development is taking place under runtime conditions (which makes db4o a leading choice for biotech simulation software, for instance). db4o could be referred to as "agnostic to complexity," because it can automatically handle changes to the data model, without requiring extra work. No type or amount of complexity will change its behavior or restrain its capabilities, as is the case with RDBMS or non-native technology. With db4o breaking through this complexity, developers are able to write more user friendly and business-appropriate software components without incurring such high costs and modify them as needed, throughout the life cycle of the product with the same low cost.

In sum, db4o's native, object oriented architecture enables its users to build more competitive products with faster update cycles, more natural object models that match more realistically their use cases, and more distributed data architectures to increase the reach of products. db4o is clearly more flexible and powerful for embedded DB applications than any non-native OODBMS or RDBMS technologies available.

db4o-8.0.184.15484+dfsg/doc/reference/Content/community.htm0000644000175000017500000001130211520622610023512 0ustar directhexdirecthex Community
You are here: Forums

Community

Participate in the db4o community and help to improve db4o. The main community website for db4o is http://developer.db4o.com. There you can find the db4o forums, blog posts additional resources and the newest db4o releases.

db4o Forums

The best place to ask questions about db4o, discuss and make suggestions are the db4o forums. You can find the db4o forums here:http://developer.db4o.com/Forums.aspx

Additional Resources on the Web

There's a overview of additional resources here: http://developer.db4o.com/Resources.aspx To stay informed about new features, community activity and other news subscribe to the different db4o blogs: http://developer.db4o.com/Blogs.aspx.

Or follow us on Twitter: http://twitter.com/db4objects

Report Bugs

Every software contains bugs and so does db4o. If you find bugs please report them to us. In case you're not sure if you really found a bug, you maybe want to discuss your issue first on the db4o forum. As soon as you're sure that you found a bug it best to report in our bug-tracking system. The login is the same as in the db4o forums. Read more on tips and tricks for reporting bugs here.

When possible include a small test program which reproduces the issue with the bug report. A test case avoids confusion and effort to reproduce the bug.

Working with the Source Code

See "Working With Source Code"

db4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/0000755000175000017500000000000011520622614023264 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/MadCapBodyEnd.js0000644000175000017500000000677011520622610026222 0ustar directhexdirecthex// {{MadCap}} ////////////////////////////////////////////////////////////////// // Copyright: MadCap Software, Inc - www.madcapsoftware.com //////////////////// //////////////////////////////////////////////////////////////////////////////// // 5.0.1.0 //////////////////////////////////////////////////////////////////////////////// function FMCCheckForBookmarkInternal( a ) { var hrefPrefix = FMCGetHref( document.location ); var href = FMCEscapeHref( a.href ); if ( href.substring( 0, hrefPrefix.length ) != hrefPrefix ) { return; } var hash = a.href.substring( a.href.lastIndexOf( "#" ) + 1 ); var bookmark = null; for ( var i = 0; i < document.anchors.length; i++ ) { var currAnchor = document.anchors[i]; if ( currAnchor.name == hash ) { bookmark = currAnchor; break; } } if ( bookmark && typeof( FMCUnhide ) == "function" ) { FMCUnhide( window, bookmark ); } } function FMCClickHandler( e ) { var target = null; if ( !e ) { e = window.event; } if ( e.srcElement ) { target = e.srcElement; } else if ( e.target ) { target = e.target; } (target.nodeName == "A") ? FMCCheckForBookmarkInternal( target ) : false; // if ( typeof( gJustPopped ) == "undefined" ) { return; } if ( !gJustPopped && gPopupObj && gPopupObj.style.display != "none" ) { if ( typeof( FMCContainsClassRoot ) == "function" && FMCContainsClassRoot( gPopupObj.className, "MCKLinkBody" ) ) { gPopupObj.parentNode.removeChild( gPopupObj ); gPopupBGObj.parentNode.removeChild( gPopupBGObj ); } else { if ( gImgNode && typeof( FMCImageSwap ) == "function" ) { FMCImageSwap( gImgNode, "swap" ); gImgNode = null; } // Reset fading if ( gPopupObj.filters ) { gPopupObj.style.filter = "alpha( opacity = 0 )"; if ( gPopupBGObj != null ) { gPopupBGObj.style.filter = "alpha( opacity = 0 )"; } } else if ( gPopupObj.style.MozOpacity != null ) { gPopupObj.style.MozOpacity = "0.0"; if ( gPopupBGObj != null ) { gPopupBGObj.style.MozOpacity = "0.0"; } } // gPopupObj.style.display = "none"; if ( gPopupBGObj != null ) { gPopupBGObj.parentNode.removeChild( gPopupBGObj ); } } if ( gFadeID != 0 ) { clearInterval( gFadeID ); } gPopupObj = null; gPopupBGObj = null; gFadeID = 0; if ( gTextPopupBody ) { gTextPopupBody = null; gTextPopupBodyBG = null; window.onresize = null; } } gJustPopped = false; } var gDocumentOnclickFunction = document.onclick; var gDocumentOnclickFuncs = new Array(); document.onclick = function( e ) { gDocumentOnclickFunction ? gDocumentOnclickFunction() : false; for ( var i = 0; i < gDocumentOnclickFuncs.length; i++ ) { gDocumentOnclickFuncs[i]( e ); } }; gDocumentOnclickFuncs.push( FMCClickHandler ); db4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/ExpandingClosed.gif0000644000175000017500000000154011520622614027022 0ustar directhexdirecthexGIF87a *U****U***UU*UUUUU*U*U*UԪ****U**********U*******U*U**UU*U*U*U****U*******U*******U**Ԫ*UU*UUUUUU*U**U*UU*U*U*UUUU*UUUUUUUUUUU*UUUUUUU*UUUUUUU*UUUUԪU*U****U***UU*UUUUU*U*U*UԪԪ*UԪ****U***ԪUU*UUUUUԪ*UԪ*UԪ*UԪ*U****U***UU*UUUUU*UԪԪ*ԪUԪԪԪ*UԪ &&&333???LLLYYYfffrrr𠠤, E Hz"N#cb+rĆ9^XqcG!1ҡ0IIr;db4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/MadCap.css0000644000175000017500000001253511520622610025125 0ustar directhexdirecthex/**/ /* // {{MadCap}} ////////////////////////////////////////////////////////////////// // Copyright: MadCap Software, Inc - www.madcapsoftware.com //////////////////// //////////////////////////////////////////////////////////////////////////////// // 5.0.1.0 //////////////////////////////////////////////////////////////////////////////// */ .MCDropDown { } .MCDropDownHead { } .MCDropDownHotSpot { } .MCDropDownBody { } .MCDropDownIcon { border: none; } .MCExpanding { } .MCExpandingHead { } .MCExpandingBody { } .MCExpandingIcon { border: none; } .MCKLink { } .MCKLinkSpot { } .MCKLinkBody { background-color: #bbccdd; border: solid 1px #000000; margin: 0px; padding: 0px; position: absolute; cursor: pointer; cursor: hand; filter: alpha( opacity = 100 ); -moz-opacity: 1.0; z-index: 2; } .MCKLinkBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 100 ); -moz-opacity: 1.0; z-index: 1; } .MCKLinkBodyCell_Highlighted { padding: 5px; background-color: Blue; color: White; } .MCKLinkBodyCell { padding: 5px; background-color: Transparent; color: Black; } .MCKeywordLinkIcon { border: none; } .MCConceptLinkIcon { border: none; } .MCRelatedTopicsIcon { border: none; } .MCPopup { } .MCPopupSpot { } .MCPopupBody { background-color: #ffffff; border: solid 1px #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } .MCPopupBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } .MCTextPopup { } .MCTextPopupSpot { } .MCTextPopupBody { background-color: #bbccdd; border: solid 1px #000000; margin: 0px; padding: 5px; position: absolute; overflow: auto; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } .MCTextPopupBodyBG { background-color: #000000; margin: 0px; padding: 0px; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } .MCPopupThumbnail { border: none; } .MCPopupThumbnail_Popup { border: solid 1px Gray; position: absolute; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 102; } .MCToggler { } .MCTogglerIcon { border: none; } div.MCDialogWrapper { width: 400px; position: fixed; z-index: 110; } div.MCDialog { width: 400px; position: absolute; padding: 10px; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; } div.MCDialogShadow { width: 400px; position: absolute; padding: 10px; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 1; } div.MCDialog table.MCDialogOuterTable { width: 100%; margin: 0px; padding: 0px; border: none; border-collapse: collapse; table-layout: fixed; } div.MCDialog table.MCDialogOuterTable td.Label { vertical-align: top; } endnotesBlock { display: block; } endnoteBlock { display: block; } footnotesBlock { display: block; } footnoteBlock { display: block; } a { color: #0000EE; } a:link { text-decoration: underline; color: #800000; } a:visited { color: #551A8B; text-decoration: underline; } a:hover { color: #4444EE; cursor: hand; text-decoration: underline; } a:focus { outline: thin dotted invert; } div.MCBreadcrumbsBox { margin-bottom: 10px; padding-bottom: 10px; border-bottom-color: black; border-bottom-style: solid; border-bottom-width: 1px; } a.MCTextPopupSpot { font-weight: bold; color: #000000; } a.MCTextPopupSpot:link { font-weight: bold; color: #000000; } a.MCTextPopupSpot:visited { font-weight: bold; color: #000000; } a.MCTextPopupSpot:hover { } a.MCTextPopupSpot:focus { } span.MCTextPopupBody { position: absolute; overflow: auto; filter: alpha( opacity = 0 ); -moz-opacity: 0.0; z-index: 2; padding: 5px; margin: 0px; border: solid 1px #000000; background-color: #dcdcdc; color: #000000; } a.glossaryTerm_0 { font-weight: bold; color: #000000; } a.glossaryTerm_0:link { font-weight: bold; color: #000000; } a.glossaryTerm_0:visited { font-weight: bold; color: #000000; } a.glossaryTerm_0:hover { } a.glossaryTerm_0:focus { } a.MCPopupSpot { font-weight: bold; color: #000000; } a.MCPopupSpot:link { font-weight: bold; color: #000000; } a.MCPopupSpot:visited { font-weight: bold; color: #000000; } a.MCPopupSpot:hover { } a.MCPopupSpot:focus { } a.MCXref { text-decoration: underline; color: #800000; } a.MCXref:link { text-decoration: underline; color: #800000; } a.MCXref:visited { text-decoration: underline; color: #800000; } a.MCXref:hover { } a.MCXref:focus { } a.popupHead_0 { vertical-align: super; font-size: 0.9em; color: #800000; } a.popupHead_0:link { vertical-align: super; font-size: 0.9em; color: #800000; } a.popupHead_0:visited { vertical-align: super; font-size: 0.9em; color: #800000; } a.popupHead_0:hover { } a.popupHead_0:focus { } db4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/MadCapAll.js0000644000175000017500000142316611520622610025411 0ustar directhexdirecthex var gHelpSystem=null; function FMCGetHelpSystem(){ if(!gHelpSystem){ var pathToHelpSystem=FMCGetAttribute(document.documentElement,"MadCap:PathToHelpSystem"); if(pathToHelpSystem==null){ pathToHelpSystem="";} var hsFileName=FMCGetAttribute(document.documentElement,"MadCap:HelpSystemFileName"); var currentFolder=new CMCUrl(FMCEscapeHref(document.location.href)).ToFolder(); var absPathToHS=currentFolder.CombinePath(pathToHelpSystem); var hsUrl=absPathToHS.AddFile(hsFileName); gHelpSystem=new CMCHelpSystem(null,absPathToHS.FullPath,hsUrl.FullPath,null,null);} return gHelpSystem;} function CMCHelpSystem(parentSubsystem,parentPath,xmlFile,tocPath,browseSequencePath){ var mSelf=this; var mParentSubsystem=parentSubsystem; var mPath=parentPath; var mXmlFile=xmlFile; var mSubsystems=new Array(); var mTocPath=tocPath; var mBrowseSequencePath=browseSequencePath; var mConceptMap=null; var mViewedConceptMap=new CMCDictionary(); var mExists=false; var mAliasFile=new CMCAliasFile(parentPath+"Data/Alias.xml",this); var mTocFile=new CMCTocFile(this,EMCTocType.Toc); var mBrowseSequenceFile=new CMCTocFile(this,EMCTocType.BrowseSequence); this.TargetType=null; this.SkinFolder=null; this.SkinTemplateFolder=null; this.DefaultStartTopic=null; this.InPreviewMode=null; this.LiveHelpOutputId=null; this.LiveHelpServer=null; this.LiveHelpEnabled=false; this.IsWebHelpPlus=false; this.ContentFolder=null; this.UseCustomTopicFileExtension=false; this.CustomTopicFileExtension=null; this.PreloadImages=false; this.GlossaryUrl=null;(function(){ var xmlDoc=CMCXmlParser.GetXmlDoc(xmlFile,false,null,null); mExists=xmlDoc!=null; if(!mExists){ return;} if(xmlDoc.getElementsByTagName("Subsystems").length>0){ var urlNodes=xmlDoc.getElementsByTagName("Subsystems")[0].getElementsByTagName("Url"); for(var i=0;i0);}; this.GetConceptsLinks=function(conceptTerms,callbackFunc,callbackArgs){ if(this.IsWebHelpPlus){ function OnGetTopicsForConceptsComplete(xmlDoc,args){ var links=new Array(); var nodes=xmlDoc.documentElement.getElementsByTagName("Url"); var nodeLength=nodes.length; for(var i=0;i0){ var attributesClone=head.cloneNode(false).attributes; for(var i=0;iterm2){ if(typeof(xmlDoc1.importNode)=="function"){ entries.appendChild(xmlDoc1.importNode(currIndexEntry2,true));} else{ entries.appendChild(currIndexEntry2.cloneNode(true));} j++;} else{ entries.appendChild(currIndexEntry1.cloneNode(true)); i++;}} for(;iterm2.toLowerCase()){ var newGlossaryPageEntry=null; if(typeof(xmlDoc1.importNode)=="function"){ newGlossaryPageEntry=xmlDoc1.importNode(currGlossaryPageEntry2,true);} else{ newGlossaryPageEntry=currGlossaryPageEntry2.cloneNode(true);} ConvertGlossaryPageEntryToAbsolute(newGlossaryPageEntry,subPath); body.appendChild(newGlossaryPageEntry) j++;} else{ body.appendChild(currGlossaryPageEntry1.cloneNode(true)); i++;}} for(;i0){ var lastStep=steps[steps.length-1]; if(lastStep.StartsWith("$$$$$")){ linkNodeIndex=parseInt(lastStep.substring("$$$$$".length)); steps.splice(steps.length-1,1);}} var tocNode=mXmlDoc.documentElement; for(var i=0,length=steps.length;i=0){ if(linkNodeIndex==0){ foundNode=tocNode;} else{ foundNode=FMCGetChildNodeByTagName(tocNode,"TocEntry",linkNodeIndex-1);}} else{ var ownerHelpSystem=GetOwnerHelpSystem(tocNode); var relHref=href.ToRelative(new CMCUrl(ownerHelpSystem.GetPath())); var foundNode=FindLink(tocNode,relHref.FullPath.toLowerCase(),true); if(!foundNode){ foundNode=FindLink(tocNode,relHref.PlainPath.toLowerCase(),false);}} mTocPath=null; mTocHref=null; onCompleteFunc(foundNode);} function CheckChunk(tocNode){ var chunk=FMCGetAttribute(tocNode,"Chunk"); if(chunk!=null){ mSelf.LoadChunk(tocNode,chunk, function(tocNode){ mSelf.GetTocNode(mTocPath,mTocHref,onCompleteFunc)}); return true;} return false;} function CheckMerge(tocNode){ var mergeHint=FMCGetAttributeInt(tocNode,"MergeHint",-1); if(mergeHint>=0){ mSelf.LoadMerge(tocNode, function(tocNode){ mSelf.GetTocNode(mTocPath,mTocHref,onCompleteFunc)}); return true;} return false;}}; this.GetEntrySequenceIndex=function(tocPath,href,onCompleteFunc){ this.GetTocNode(tocPath,href,OnCompleteGetTocNode); function OnCompleteGetTocNode(tocNode){ var sequenceIndex=-1; if(tocNode!=null){ sequenceIndex=ComputeEntrySequenceIndex(tocNode);} onCompleteFunc(sequenceIndex);}}; this.GetIndexTotalForEntry=function(tocPath,href,onCompleteFunc){ this.GetTocNode(tocPath,href,OnCompleteGetTocNode); function OnCompleteGetTocNode(tocNode){ var total=-1; if(tocNode!=null){ var currNode=tocNode; while(currNode.parentNode!=mXmlDoc.documentElement){ currNode=currNode.parentNode;} total=FMCGetAttributeInt(currNode,"DescendantCount",-1);} onCompleteFunc(total);}}; function InitOnComplete(){ for(var i=0,length=mInitOnCompleteFuncs.length;i=0){ mSelf.LoadMerge(tocNode,OnCompleteFunc); return true;} return false;}} function GetDeepestChild(tocNode,nodeName){ var node=FMCGetLastChildNodeByTagName(tocNode,nodeName); if(node!=null){ var nodeChild=GetDeepestChild(node,nodeName); if(nodeChild!=null){ return nodeChild;} return node;} return null;} function GetOwnerHelpSystem(tocNode){ var ownerHelpSystem=null; var currNode=tocNode; while(true){ if(currNode==currNode.ownerDocument.documentElement){ ownerHelpSystem=mHelpSystem; break;} var ownerHelpSystemIndex=FMCGetAttributeInt(currNode,"ownerHelpSystemIndex",-1); if(ownerHelpSystemIndex>=0){ ownerHelpSystem=mOwnerHelpSystems[ownerHelpSystemIndex]; break;} currNode=currNode.parentNode;} return ownerHelpSystem;} function GetTocPath(tocNode){ var tocPath=""; var linkNodeIndex=-1; var childNode=FMCGetChildNodeByTagName(tocNode,"TocEntry",0); if(childNode!=null){ tocPath=FMCGetAttribute(tocNode,"Title"); linkNodeIndex=0;} else{ linkNodeIndex=FMCGetChildIndex(tocNode)+1;} if(tocPath.length>0){ tocPath+="|";} tocPath+=("$$$$$"+linkNodeIndex); for(var currNode=tocNode.parentNode;currNode!=null&&currNode.parentNode.nodeType==1;currNode=currNode.parentNode){ if(tocPath==null){ tocPath="";} if(tocPath.length>0){ tocPath="|"+tocPath;} tocPath=FMCGetAttribute(currNode,"Title")+tocPath;} return tocPath;} function ComputeEntrySequenceIndex(tocNode){ if(tocNode.parentNode==tocNode.ownerDocument.documentElement){ return 0;} var sequenceIndex=0; var link=FMCGetAttribute(tocNode,"Link"); if(link!=null){ sequenceIndex++;} for(var currNode=tocNode.previousSibling;currNode!=null;currNode=currNode.previousSibling){ if(currNode.nodeType!=1){continue;} var descendantCount=FMCGetAttributeInt(currNode,"DescendantCount",0); sequenceIndex+=descendantCount; var link=FMCGetAttribute(currNode,"Link"); if(link!=null){ var linkUrl=new CMCUrl(link); var ext=linkUrl.Extension.toLowerCase(); if(ext=="htm"||ext=="html"){ sequenceIndex++;}}} return sequenceIndex+ComputeEntrySequenceIndex(tocNode.parentNode);}}  function CMCAliasFile(xmlFile,helpSystem){ var mXmlDoc=null; var mHelpSystem=helpSystem; var mNameMap=null; var mIDMap=null;(function(){ mXmlDoc=CMCXmlParser.GetXmlDoc(xmlFile,false,null,null);})(); this.GetIDs=function(){ var ids=new Array(); AssureInitializedMap(); mIDMap.ForEach(function(key,value){ ids[ids.length]=key; return true;}); return ids;}; this.GetNames=function(){ var names=new Array(); AssureInitializedMap(); mNameMap.ForEach(function(key,value){ names[names.length]=key; return true;}); return names;}; this.LookupID=function(id){ var found=false; var topic=null; var skin=null; if(id){ if(typeof(id)=="string"&&id.indexOf(".")!=-1){ var pipePos=id.indexOf("|"); if(pipePos!=-1){ topic=id.substring(0,pipePos); skin=id.substring(pipePos+1);} else{ topic=id;}} else{ var mapInfo=GetFromMap(id); if(mapInfo!=null){ found=true; topic=mapInfo.Topic; skin=mapInfo.Skin;}}} else{ found=true;} if(!skin){ if(mXmlDoc){ skin=mXmlDoc.documentElement.getAttribute("DefaultSkinName");}} if(topic){ topic=mHelpSystem.ContentFolder+topic;} return{Found:found,Topic:topic,Skin:skin};}; function GetFromMap(id){ var mapInfo=null; AssureInitializedMap(); if(mNameMap!=null){ if(typeof(id)=="string"){ mapInfo=mNameMap.GetItem(id); if(mapInfo==null){ mapInfo=mIDMap.GetItem(id);}} else if(typeof(id)=="number"){ mapInfo=mIDMap.GetItem(id.toString());}} return mapInfo;} function AssureInitializedMap(){ if(mNameMap==null){ if(mXmlDoc){ mNameMap=new CMCDictionary(); mIDMap=new CMCDictionary(); var maps=mXmlDoc.documentElement.getElementsByTagName("Map"); for(var i=0;i=0&&str.charAt(i)==" ";i--); return str.substring(0,i+1);} function FMCContainsClassRoot(className){ var ret=null; for(var i=1;iwinNode.innerHeight){ clientWidth-=19;}} else if(FMCIsQuirksMode(winNode)){ clientWidth=winNode.document.body.clientWidth;} else if(winNode.document.documentElement){ clientWidth=winNode.document.documentElement.clientWidth;} return clientWidth;} function FMCGetClientHeight(winNode,includeScrollbars){ var clientHeight=null; if(typeof(winNode.innerHeight)!="undefined"){ clientHeight=winNode.innerHeight; if(!includeScrollbars&&FMCGetScrollWidth(winNode)>winNode.innerWidth){ clientHeight-=19;}} else if(FMCIsQuirksMode(winNode)){ clientHeight=winNode.document.body.clientHeight;} else if(winNode.document.documentElement){ clientHeight=winNode.document.documentElement.clientHeight;} return clientHeight;} function FMCGetClientCenter(winNode){ var centerX=FMCGetScrollLeft(winNode)+(FMCGetClientWidth(winNode,false)/2); var centerY=FMCGetScrollTop(winNode)+(FMCGetClientHeight(winNode,false)/2); return[centerX,centerY];} function FMCGetScrollHeight(winNode){ var scrollHeight=null; if(winNode.document.scrollHeight){ scrollHeight=winNode.document.scrollHeight;} else if(FMCIsQuirksMode(winNode)){ scrollHeight=winNode.document.body.scrollHeight;} else if(winNode.document.documentElement){ scrollHeight=winNode.document.documentElement.scrollHeight;} return scrollHeight;} function FMCGetScrollWidth(winNode){ var scrollWidth=null; if(winNode.document.scrollWidth){ scrollWidth=winNode.document.scrollWidth;} else if(FMCIsQuirksMode(winNode)){ scrollWidth=winNode.document.body.scrollWidth;} else if(winNode.document.documentElement){ scrollWidth=winNode.document.documentElement.scrollWidth;} return scrollWidth;} function FMCGetScrollTop(winNode){ var scrollTop=null; if(FMCIsSafari()){ scrollTop=winNode.document.body.scrollTop;} else if(FMCIsQuirksMode(winNode)){ scrollTop=winNode.document.body.scrollTop;} else if(winNode.document.documentElement){ scrollTop=winNode.document.documentElement.scrollTop;} return scrollTop;} function FMCSetScrollTop(winNode,value){ if(FMCIsSafari()){ winNode.document.body.scrollTop=value;} else if(FMCIsQuirksMode(winNode)){ winNode.document.body.scrollTop=value;} else if(winNode.document.documentElement){ winNode.document.documentElement.scrollTop=value;}} function FMCGetScrollLeft(winNode){ var scrollLeft=null; if(FMCIsSafari()){ scrollLeft=winNode.document.body.scrollLeft;} else if(FMCIsQuirksMode(winNode)){ scrollLeft=winNode.document.body.scrollLeft;} else if(winNode.document.documentElement){ scrollLeft=winNode.document.documentElement.scrollLeft;} return scrollLeft;} function FMCSetScrollLeft(winNode,value){ if(FMCIsSafari()){ winNode.document.body.scrollLeft=value;} else if(FMCIsQuirksMode(winNode)){ winNode.document.body.scrollLeft=value;} else if(winNode.document.documentElement){ winNode.document.documentElement.scrollLeft=value;}} function FMCGetClientX(winNode,e){ var clientX; if(typeof(e.pageX)!="undefined"){ clientX=e.pageX-FMCGetScrollLeft(winNode);} else if(typeof(e.clientX)!="undefined"){ clientX=e.clientX;} return clientX;} function FMCGetClientY(winNode,e){ var clientY; if(typeof(e.pageY)!="undefined"){ clientY=e.pageY-FMCGetScrollTop(winNode);} else if(typeof(e.clientY)!="undefined"){ clientY=e.clientY;} return clientY;} function FMCGetPageX(winNode,e){ var pageX; if(typeof(e.pageX)!="undefined"){ pageX=e.pageX;} else if(typeof(e.clientX)!="undefined"){ pageX=e.clientX+FMCGetScrollLeft(winNode);} return pageX;} function FMCGetPageY(winNode,e){ var pageY; if(typeof(e.pageY)!="undefined"){ pageY=e.pageY;} else if(typeof(e.clientY)!="undefined"){ pageY=e.clientY+FMCGetScrollTop(winNode);} return pageY;} function FMCGetMouseXRelativeTo(winNode,e,el){ var mouseX=FMCGetPageX(winNode,e,el); var elX=FMCGetPosition(el)[1]; var x=mouseX-elX; return x;} function FMCGetMouseYRelativeTo(winNode,e,el){ var mouseY=FMCGetPageY(winNode,e,el); var elY=FMCGetPosition(el)[0]; var y=mouseY-elY; return y;} function FMCGetPosition(node){ var topPos=0; var leftPos=0; if(node.offsetParent){ topPos=node.offsetTop; leftPos=node.offsetLeft; while(node=node.offsetParent){ topPos+=node.offsetTop; leftPos+=node.offsetLeft;}} return[topPos,leftPos];} function FMCScrollToVisible(win,node){ var offset=0; if(typeof(window.innerWidth)!="undefined"&&!FMCIsSafari()){ offset=19;} var scrollTop=FMCGetScrollTop(win); var scrollBottom=scrollTop+FMCGetClientHeight(win,false)-offset; var scrollLeft=FMCGetScrollLeft(win); var scrollRight=scrollLeft+FMCGetClientWidth(win,false)-offset; var nodePos=FMCGetPosition(node); var nodeTop=nodePos[0]; var nodeLeft=parseInt(node.style.textIndent)+nodePos[1]; var nodeHeight=node.offsetHeight; var nodeWidth=node.getElementsByTagName("a")[0].offsetWidth; if(nodeTopscrollBottom){ FMCSetScrollTop(win,Math.min(nodeTop,nodeTop+nodeHeight-FMCGetClientHeight(win,false)+offset));} if(nodeLeftscrollRight){ FMCSetScrollLeft(win,Math.min(nodeLeft,nodeLeft+nodeWidth-FMCGetClientWidth(win,false)+offset));}} function FMCIsQuirksMode(winNode){ return FMCIsIE55()||(winNode.document.compatMode&&winNode.document.compatMode=="BackCompat");} function FMCGetComputedStyle(node,style){ var value=null; if(node.currentStyle){ value=node.currentStyle[style];} else if(document.defaultView&&document.defaultView.getComputedStyle){ var computedStyle=document.defaultView.getComputedStyle(node,null); if(computedStyle){ value=computedStyle[style];}} return value;} function FMCConvertToPx(doc,str,dimension,defaultValue){ if(!str||str.charAt(0)=="-"){ return defaultValue;} if(str.charAt(str.length-1)=="\%"){ switch(dimension){ case "Width": return parseInt(str)*screen.width/100; break; case "Height": return parseInt(str)*screen.height/100; break;}} else{ if(parseInt(str).toString()==str){ str+="px";}} try{ var div=doc.createElement("div");} catch(err){ return defaultValue;} doc.body.appendChild(div); var value=defaultValue; try{ div.style.width=str; if(div.currentStyle){ value=div.offsetWidth;} else if(document.defaultView&&document.defaultView.getComputedStyle){ value=parseInt(FMCGetComputedStyle(div,"width"));}} catch(err){} doc.body.removeChild(div); return value;} function FMCGetControl(el){ var value=null; if(el.type=="checkbox"){ value=el.checked;} else{ value=el.value;} return value;} function FMCGetOpacity(el){ var opacity=-1; if(el.filters){ opacity=parseInt(el.style.filter.substring(17,el.style.filter.length-2));} else if(el.style.MozOpacity!=null){ opacity=parseFloat(el.style.MozOpacity)*100;} return opacity;} function FMCSetOpacity(el,opacityPercent){ if(el.filters){ if(opacityPercent==100){ el.style.filter="";} else{ el.style.filter="alpha( opacity = "+opacityPercent+" )";}} else if(el.style.MozOpacity!=null){ el.style.MozOpacity=opacityPercent/100;}} function FMCToggleDisplay(el){ if(el.style.display=="none"){ el.style.display="";} else{ el.style.display="none";}} function FMCGetContainingIFrame(win){ var allIFrames=win.parent.document.getElementsByTagName("iframe"); for(var i=0,length=allIFrames.length;i0)?" ":"")+currPart);}} return newValue;} function FMCUnhide(win,node){ for(var currNode=node.parentNode;currNode.nodeName!="BODY";currNode=currNode.parentNode){ if(currNode.style.display=="none"){ var classRoot=FMCContainsClassRoot(currNode.className,"MCExpandingBody","MCDropDownBody","MCTextPopupBody"); if(classRoot=="MCExpandingBody"){ win.FMCExpand(currNode.parentNode.getElementsByTagName("a")[0]);} else if(classRoot=="MCDropDownBody"){ var dropDownBodyID=currNode.id.substring("MCDropDownBody".length+1,currNode.id.length); var aNodes=currNode.parentNode.getElementsByTagName("a"); for(var i=0;i1){ return;} if(fadeElement){ if(fadeElement.style.MozOpacity!=null){ fadeElement.style.MozOpacity="0.1";}} var span=win.document.createElement("span"); var img=win.document.createElement("img"); var midPointX=FMCGetScrollLeft(win)+FMCGetClientWidth(win,false)/2; var spacing=3; parentElement.appendChild(span); span.id="LoadingText"; span.appendChild(win.document.createTextNode(loadingLabel)); span.style.fontFamily="Tahoma, Sans-Serif"; span.style.fontSize="9px"; span.style.fontWeight="bold"; span.style.position="absolute"; span.style.left=(midPointX-(span.offsetWidth/2))+"px"; var rootFrame=FMCGetRootFrame(); img.id="LoadingImage"; img.src=rootFrame.gRootFolder+MCGlobals.SkinTemplateFolder+"Images/Loading.gif"; img.alt=loadingAltText; img.style.width="70px"; img.style.height="13px"; img.style.position="absolute"; img.style.left=(midPointX-(70/2))+"px"; var totalHeight=span.offsetHeight+spacing+parseInt(img.style.height); var spanTop=(FMCGetScrollTop(win)+(FMCGetClientHeight(win,false)-totalHeight))/2; span.style.top=spanTop+"px"; img.style.top=spanTop+span.offsetHeight+spacing+"px"; parentElement.appendChild(img);} function EndLoading(win,fadeElement){ win.MCLoadingCount--; if(win.MCLoadingCount>0){ return;} var span=win.document.getElementById("LoadingText"); var img=win.document.getElementById("LoadingImage"); span.parentNode.removeChild(span); img.parentNode.removeChild(img); if(fadeElement){ if(fadeElement.style.MozOpacity!=null){ fadeElement.style.MozOpacity="1.0";}}} var MCEventType=new Object(); MCEventType.OnLoad=0; MCEventType.OnInit=1; MCEventType.OnReady=2; function FMCRegisterCallback(frameName,eventType,CallbackFunc,callbackArgs){ function FMCCheckMCGlobalsInitialized(){ if(MCGlobals.Initialized){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckMCGlobalsInitialized,100);}} function FMCCheckRootReady(){ if(MCGlobals.RootFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRootReady,100);}} function FMCCheckRootLoaded(){ if(MCGlobals.RootFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRootLoaded,100);}} function FMCCheckTOCInitialized(){ if(MCGlobals.NavigationFrame.frames["toc"].gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTOCInitialized,100);}} function FMCCheckSearchInitialized(){ if(MCGlobals.NavigationFrame.frames["search"].gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckSearchInitialized,100);}} function FMCCheckTopicCommentsLoaded(){ if(MCGlobals.TopicCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTopicCommentsLoaded,100);}} function FMCCheckTopicCommentsInitialized(){ if(MCGlobals.TopicCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckTopicCommentsInitialized,100);}} function FMCCheckRecentCommentsLoaded(){ if(MCGlobals.RecentCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRecentCommentsLoaded,100);}} function FMCCheckRecentCommentsInitialized(){ if(MCGlobals.RecentCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckRecentCommentsInitialized,100);}} function FMCCheckBodyCommentsLoaded(){ if(MCGlobals.BodyCommentsFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyCommentsLoaded,100);}} function FMCCheckBodyCommentsInitialized(){ if(MCGlobals.BodyCommentsFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyCommentsInitialized,100);}} function FMCCheckToolbarInitialized(){ if(MCGlobals.ToolbarFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckToolbarInitialized,100);}} function FMCCheckNavigationReady(){ if(MCGlobals.NavigationFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckNavigationReady,100);}} function FMCCheckNavigationLoaded(){ if(MCGlobals.NavigationFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckNavigationLoaded,100);}} function FMCCheckBodyReady(){ if(typeof(MCGlobals.BodyFrame.gReady)=="undefined"||MCGlobals.BodyFrame.gReady){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyReady,100);}} function FMCCheckBodyLoaded(){ if(MCGlobals.BodyFrame.gLoaded){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyLoaded,100);}} function FMCCheckBodyInitialized(){ if(MCGlobals.BodyFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckBodyInitialized,100);}} function FMCCheckPersistenceInitialized(){ if(MCGlobals.PersistenceFrame.gInit){ CallbackFunc(callbackArgs);} else{ setTimeout(FMCCheckPersistenceInitialized,100);}} var func=null; if(frameName=="TOC"){ if(eventType==MCEventType.OnLoad){func=FMCCheckTOCLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckTOCInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckTOCReady;}} else if(frameName=="Toolbar"){ if(eventType==MCEventType.OnLoad){func=FMCCheckToolbarLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckToolbarInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckToolbarReady;}} else if(frameName=="BodyComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckBodyCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckBodyCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckBodyCommentsReady;}} else if(frameName=="TopicComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckTopicCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckTopicCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckTopicCommentsReady;}} else if(frameName=="RecentComments"){ if(eventType==MCEventType.OnLoad){func=FMCCheckRecentCommentsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckRecentCommentsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckRecentCommentsReady;}} else if(frameName=="Persistence"){ if(eventType==MCEventType.OnLoad){func=FMCCheckPersistenceLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckPersistenceInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckPersistenceReady;}} else if(frameName=="Search"){ if(eventType==MCEventType.OnLoad){func=FMCCheckSearchLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckSearchInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckSearchReady;}} else if(frameName=="MCGlobals"){ if(eventType==MCEventType.OnLoad){func=FMCCheckMCGlobalsLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckMCGlobalsInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckMCGlobalsReady;}} else if(frameName=="Navigation"){ if(eventType==MCEventType.OnLoad){func=FMCCheckNavigationLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckNavigationInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckNavigationReady;}} else if(frameName=="Body"){ if(eventType==MCEventType.OnLoad){func=FMCCheckBodyLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckBodyInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckBodyReady;}} else if(frameName=="Root"){ if(eventType==MCEventType.OnLoad){func=FMCCheckRootLoaded;} else if(eventType==MCEventType.OnInit){func=FMCCheckRootInitialized;} else if(eventType==MCEventType.OnReady){func=FMCCheckRootReady;}} window.setTimeout(func,100);} function FMCSortStringArray(stringArray){ stringArray.sort(FMCCompareStrings);} function FMCCompareStrings(a,b){ var ret; if(a.toLowerCase()b.toLowerCase()){ ret=1;} return ret;} function FMCSetCookie(name,value,days){ if(window.name!="bridge"){ if(window!=MCGlobals.NavigationFrame){ MCGlobals.NavigationFrame.FMCSetCookie(name,value,days); return;}} value=encodeURI(value); var expires=null; if(days){ var date=new Date(); date.setTime(date.getTime()+(1000*60*60*24*days)); expires="; expires="+date.toGMTString();} else{ expires="";} var cookieString=name+"="+value+expires+";"; document.cookie=cookieString;} function FMCReadCookie(name){ if(window.name!="bridge"){ if(window!=MCGlobals.NavigationFrame){ return MCGlobals.NavigationFrame.FMCReadCookie(name);}} var value=null; var nameEq=name+"="; var cookies=document.cookie.split(";"); for(var i=0;i"; var xmlDoc=CMCXmlParser.LoadXmlString(rootXml); return xmlDoc;} CMCXmlParser.GetOuterXml=function(xmlDoc){ var xml=null; if(window.ActiveXObject){ xml=xmlDoc.xml;} else if(window.XMLSerializer){ var serializer=new XMLSerializer(); xml=serializer.serializeToString(xmlDoc);} return xml;} CMCXmlParser.CallWebService=function(webServiceUrl,async,onCompleteFunc,onCompleteArgs){ var xmlParser=new CMCXmlParser(onCompleteArgs,onCompleteFunc); var xmlDoc=xmlParser.LoadRemote(webServiceUrl,async); return xmlDoc;} var CMCFlareStylesheet=new function(){ var mInitialized=false; var mXmlDoc=null; var mInitializedResources=false; var mResourceMap=null; function Init(){ mXmlDoc=FMCGetStylesheet(); mInitialized=true;} function InitializeResources(){ mInitializedResources=true; mResourceMap=new CMCDictionary(); var resourcesInfos=mXmlDoc.getElementsByTagName("ResourcesInfo"); if(resourcesInfos.length>0){ var resources=resourcesInfos[0].getElementsByTagName("Resource"); for(var i=0;i=0){ newStr=this.substring(0,startIndex);} else{ newStr=this;} newStr+=value; if(startIndex>=0){ newStr+=this.substring(startIndex);} return newStr;} String.prototype.Trim=function(){ return this.TrimLeft().TrimRight();} String.prototype.TrimLeft=function(){ var i=0; for(i=0;i=0&&this.charAt(i)==" ";i--); return this.substring(0,i+1);} Array.prototype.Contains=function(item){ for(var i=0,length=this.length;ithis.length){ throw "Index out of bounds.";} this.splice(index,0,item);} Array.prototype.Remove=function(index){ if(index<0||index>this.length){ throw "Index out of bounds.";} this.splice(index,1);} Array.prototype.RemoveValue=function(value){ for(var i=this.length-1;i>=0;i--){ if(this[i]==value){ this.Remove(i);}}} function CMCDictionary(){ this.mMap=new Object(); this.mOverflows=new Array(); this.mLength=0;} CMCDictionary.prototype.GetLength=function(key){ return this.mLength;}; CMCDictionary.prototype.ForEach=function(func){ var map=this.mMap; for(var key in map){ var value=map[key]; if(!func(key,value)){ return;}} var overflows=this.mOverflows; for(var i=0,length=overflows.length;i=0){ item=this.mOverflows[index].Value;}} else{ item=this.mMap[key]; if(typeof(item)=="undefined"){ item=null;}} return item;}; CMCDictionary.prototype.GetItemOverflowIndex=function(key){ var overflows=this.mOverflows; for(var i=0,length=overflows.length;i=0){ this.mOverflows.splice(index,1) this.mLength--;}} else{ if(this.mMap[key]!="undefined"){ delete(this.mMap[key]); this.mLength--;}}}; CMCDictionary.prototype.Add=function(key,value){ if(typeof(this.mMap[key])=="function"){ var item=this.GetItem(key); if(item!=null){ this.Remove(key);} this.mOverflows[this.mOverflows.length]={Key:key,Value:value};} else{ this.mMap[key]=value;} this.mLength++;}; CMCDictionary.prototype.AddUnique=function(key,value){ var savedValue=this.GetItem(key); if(typeof(savedValue)=="undefined"||!savedValue){ this.Add(key,value);}}; function CMCUrl(src){ var mSelf=this; this.FullPath=null; this.Path=null; this.PlainPath=null; this.Name=null; this.Extension=null; this.NameWithExtension=null; this.Fragment=null; this.Query=null; this.IsAbsolute=false;(function(){ var fragment=""; var query=""; var fragmentPos=src.indexOf("#"); var queryPos=src.indexOf("?"); if(fragmentPos!=-1){ if(fragmentPos>queryPos){ fragment=src.substring(fragmentPos);} else{ fragment=src.substring(fragmentPos,queryPos);}} if(queryPos!=-1){ if(queryPos>fragmentPos){ query=src.substring(queryPos);} else{ query=src.substring(queryPos,fragmentPos);}} var pos=Math.max(fragmentPos,queryPos); var plainPath=src.substring(0,pos==-1?src.length:pos); pos=plainPath.lastIndexOf("/"); var path=plainPath.substring(0,pos+1); var nameWithExt=plainPath.substring(pos+1); pos=nameWithExt.lastIndexOf("."); var name=nameWithExt.substring(0,pos); var ext=nameWithExt.substring(pos+1); var scheme=""; pos=src.indexOf(":"); if(pos>=0){ scheme=src.substring(0,pos);} mSelf.FullPath=src; mSelf.Path=path; mSelf.PlainPath=plainPath; mSelf.Name=name; mSelf.Extension=ext; mSelf.NameWithExtension=nameWithExt; mSelf.Scheme=scheme; mSelf.IsAbsolute=!String.IsNullOrEmpty(scheme); mSelf.Fragment=fragment; mSelf.Query=query;})();} CMCUrl.QueryMap=new CMCDictionary(); CMCUrl.HashMap=new CMCDictionary();(function(){ var search=document.location.search; if(!String.IsNullOrEmpty(search)){ search=search.substring(1); Parse(search,"&",CMCUrl.QueryMap);} var hash=document.location.hash; if(!String.IsNullOrEmpty(hash)){ hash=hash.substring(1); Parse(hash,"|",CMCUrl.HashMap);} function Parse(item,delimiter,map){ var split=item.split(delimiter); for(var i=0,length=split.length;i=0){ key=decodeURIComponent(part.substring(0,index)); value=decodeURIComponent(part.substring(index+1));} else{ key=part;} map.Add(key,value);}}})(); CMCUrl.prototype.AddFile=function(otherUrl){ if(typeof(otherUrl)=="string"){ otherUrl=new CMCUrl(otherUrl);} if(otherUrl.IsAbsolute){ return otherUrl;} var otherFullPath=otherUrl.FullPath; if(otherFullPath.charAt(0)=="/"){ var loc=document.location; var pos=loc.href.lastIndexOf(loc.pathname); var rootPath=loc.href.substring(0,pos); return new CMCUrl(rootPath+otherFullPath);} var fullPath=this.FullPath; if(!fullPath.EndsWith("/")){ fullPath=fullPath+"/";} return new CMCUrl(fullPath+otherFullPath);}; CMCUrl.prototype.CombinePath=function(otherUrl){ if(typeof(otherUrl)=="string"){ otherUrl=new CMCUrl(otherUrl);} if(otherUrl.IsAbsolute){ throw new CMCException(-1,"Cannot combine two absolute paths.");} var otherFullPath=otherUrl.FullPath; var fullPath=this.FullPath; var segments=otherUrl.FullPath.split("/"); var curr=this.FullPath; var prefix=""; if(this.Scheme=="mk"){ var pos=curr.indexOf("::"); prefix=curr.substring(0,pos+"::".length); curr=curr.substring(pos+"::".length);} for(var i=0,length=segments.length;i1&&curr.EndsWith("/")){ curr=curr.substring(0,curr.length-1);} if(seg=="."){ curr+="/";} else if(seg==".."){ curr=curr.substring(0,curr.lastIndexOf("/")+1);} else{ if(!curr.EndsWith("/")){ curr+="/";} curr+=seg;}} curr=prefix+curr; return new CMCUrl(curr);}; CMCUrl.prototype.ToQuery=function(query){ var newPath=this.PlainPath+"?"+query+this.Fragment; return new CMCUrl(newPath);}; CMCUrl.prototype.ToFolder=function(){ var fullPath=this.PlainPath; var pos=fullPath.lastIndexOf("/"); var newPath=fullPath.substring(0,pos+1); return new CMCUrl(newPath);}; CMCUrl.prototype.ToRelative=function(otherUrl){ var path=otherUrl.FullPath; var otherPath=this.FullPath; var pos=otherPath.indexOf(path); var relPath=null; if(pos==0){ relPath=otherPath.substring(path.length);} else{ relPath=otherPath;} return new CMCUrl(relPath);}; CMCUrl.prototype.ToExtension=function(newExt){ var path=this.FullPath; var pos=path.lastIndexOf("."); var left=path.substring(0,pos); var newPath=left+"."+newExt; return new CMCUrl(newPath);}; function FMCGetElementsByClassRoot(node,classRoot){ var nodes=new Array(); var args=new Array(); args[0]=nodes; args[1]=classRoot; FMCTraverseDOM("post",node,FMCGetByClassRoot,args); return nodes;} function FMCGetByClassRoot(node,args){ var nodes=args[0]; var classRoot=args[1]; if(node.nodeType==1&&FMCContainsClassRoot(node.className,classRoot)){ nodes[nodes.length]=node;}} function FMCGetElementsByAttribute(node,attribute,value){ var nodes=new Array(); var args=new Array(); args[0]=nodes; args[1]=attribute; args[2]=value; FMCTraverseDOM("post",node,FMCGetByAttribute,args); return nodes;} function FMCGetByAttribute(node,args){ var nodes=args[0]; var attribute=args[1]; var value=args[2]; try{ if(node.nodeType==1&&(FMCGetMCAttribute(node,attribute)==value||(value=="*"&&FMCGetMCAttribute(node,attribute)))){ nodes[nodes.length]=node;}} catch(err){ node.setAttribute(attribute,null);}} function FMCTraverseDOM(type,root,Func,args){ if(type=="pre"){ Func(root,args);} if(root.childNodes.length!=0){ for(var i=0;i=endOpacity){ clearInterval(interval); if(nodeBG!=null){ FMCSetOpacity(nodeBG,endOpacityBG);}}} interval=setInterval(DoFadeIn,10);};} var CMCDateTimeHelpers=new function(){ this.GetDateFromUTCString=function(utcString){ var ms=Date.parse(utcString); var date=new Date(ms); var utcMS=Date.UTC(date.getFullYear(),date.getMonth(),date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),date.getMilliseconds()); var utcDate=new Date(utcMS); return utcDate;}; this.ToUIString=function(date){ var dateStr=(date.getMonth()+1)+"/"+date.getDate()+"/"+date.getFullYear()+" "+date.toLocaleTimeString(); return dateStr;};} function CMCException(number,message){ this.Number=number; this.Message=message;} var MCGlobals=new function(){ var mSelf=this; var inPreviewMode=FMCGetAttributeBool(document.documentElement,"MadCap:InPreviewMode",false); if(inPreviewMode){ this.InPreviewMode=true; this.SkinFolder="Skin/"; this.SkinTemplateFolder="SkinTemplate/";} else{ var masterHS=FMCGetHelpSystem(); this.SubsystemFile=FMCGetAttribute(document.documentElement,"MadCap:HelpSystemFileName"); this.SkinFolder=masterHS.SkinFolder; this.SkinTemplateFolder=masterHS.SkinTemplateFolder; this.DefaultStartTopic=masterHS.DefaultStartTopic; this.InPreviewMode=masterHS.InPreviewMode;} this.Initialized=false; this.RootFolder=null; this.RootFrame=null; this.ToolbarFrame=null; this.BodyFrame=null; this.NavigationFrame=null; this.TopicCommentsFrame=null; this.RecentCommentsFrame=null; this.BodyCommentsFrame=null; this.PersistenceFrame=null; function InitRoot(){ mSelf.RootFrame=window; mSelf.ToolbarFrame=frames["mctoolbar"]; mSelf.BodyFrame=frames["body"]; mSelf.NavigationFrame=frames["navigation"]; mSelf.PersistenceFrame=null; var bodyReady=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}} function InitTopicCHM(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=frames["mctoolbar"]; mSelf.BodyFrame=window; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=frames["topiccomments"]; mSelf.PersistenceFrame=frames["persistence"]; mSelf.Initialized=true;} function InitNavigation(){ mSelf.RootFrame=parent; mSelf.NavigationFrame=window; mSelf.TopicCommentsFrame=frames["topiccomments"]; mSelf.RecentCommentsFrame=frames["recentcomments"]; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; var bodyReady=false; var rootLoaded=false; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ bodyReady=true; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; if(FMCIsWebHelpAIR()){ if(rootLoaded){ mSelf.Initialized=true;}} else{ mSelf.Initialized=true;}} if(FMCIsWebHelpAIR()){ FMCRegisterCallback("Root",MCEventType.OnLoad,OnRootLoaded,null); function OnRootLoaded(args){ rootLoaded=true; if(bodyReady){ mSelf.Initialized=true;}}}}} function InitNavigationFramesWebHelp(){ var bodyReady=false; mSelf.RootFrame=parent.parent; mSelf.NavigationFrame=parent; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(window.name=="search"&&FMCIsWebHelpAIR()){ if(window.parentSandboxBridge!=null){ mSelf.Initialized=true;}} else{ if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(window.name=="search"&&FMCIsWebHelpAIR()){ FMCRegisterCallback("Navigation",MCEventType.OnLoad,OnNavigationLoaded,null); function OnNavigationLoaded(args){ if(bodyReady){ mSelf.Initialized=true;}}} else{ if(bodyReady){ mSelf.Initialized=true;}}}} function InitBodyCommentsFrameWebHelp(){ var rootFrame=null; if(parent.parent.gRuntimeFileType=="Default"){ rootFrame=parent.parent;} mSelf.RootFrame=rootFrame; mSelf.NavigationFrame=parent.parent.frames["navigation"]; mSelf.PersistenceFrame=null; mSelf.ToolbarFrame=parent.parent.frames["mctoolbar"]; mSelf.BodyFrame=parent; mSelf.BodyCommentsFrame=window; if(mSelf.NavigationFrame==null){ mSelf.Initialized=true;} else{ function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; mSelf.Initialized=true;} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null);}} function InitBodyCommentsFrameDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=window; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitToolbarWebHelp(){ mSelf.RootFrame=parent; mSelf.ToolbarFrame=window; mSelf.PersistenceFrame=null; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.BodyFrame=mSelf.RootFrame.frames["body"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var bodyReady=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} function InitToolbarWebHelpTopic(){ mSelf.RootFrame=parent.parent; mSelf.PersistenceFrame=null; mSelf.BodyFrame=parent; FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null); function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var bodyReady=false; if(mSelf.NavigationFrame!=null){ function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(bodyReady){ mSelf.Initialized=true;}} FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null);} FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; bodyReady=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} function InitToolbarCHM(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=window; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=mSelf.BodyFrame.frames["persistence"]; mSelf.Initialized=true;}} function InitTopicWebHelp(){ var rootFrame=null; if(parent.gRuntimeFileType=="Default"){ rootFrame=parent;} mSelf.RootFrame=rootFrame; mSelf.BodyFrame=window; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=null; if(mSelf.RootFrame==null){ mSelf.Initialized=true;} else{ function OnRootReady(args){ mSelf.ToolbarFrame=mSelf.RootFrame.frames["mctoolbar"]; mSelf.NavigationFrame=mSelf.RootFrame.frames["navigation"]; var rootLoaded=false; FMCRegisterCallback("Navigation",MCEventType.OnReady,OnNavigationReady,null); function OnNavigationReady(args){ mSelf.TopicCommentsFrame=mSelf.NavigationFrame.frames["topiccomments"]; mSelf.RecentCommentsFrame=mSelf.NavigationFrame.frames["recentcomments"]; if(FMCIsWebHelpAIR()){ if(rootLoaded){ mSelf.Initialized=true;}} else{ mSelf.Initialized=true;}} if(FMCIsWebHelpAIR()){ FMCRegisterCallback("Root",MCEventType.OnLoad,OnRootLoaded,null); function OnRootLoaded(args){ rootLoaded=true; if(mSelf.TopicCommentsFrame!=null){ mSelf.Initialized=true;}}}} FMCRegisterCallback("Root",MCEventType.OnReady,OnRootReady,null);}} function InitTopicDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=window; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitGlossaryFrameDotNetHelp(){ mSelf.RootFrame=null; mSelf.ToolbarFrame=null; mSelf.BodyFrame=null; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; mSelf.RecentCommentsFrame=null; mSelf.BodyCommentsFrame=null; mSelf.PersistenceFrame=null; mSelf.Initialized=true;} function InitNavigationFramesCHM(){ mSelf.RootFrame=null; mSelf.BodyFrame=parent; mSelf.NavigationFrame=null; mSelf.TopicCommentsFrame=null; FMCRegisterCallback("Body",MCEventType.OnReady,OnBodyReady,null); function OnBodyReady(args){ mSelf.ToolbarFrame=mSelf.BodyFrame.frames["mctoolbar"]; mSelf.RecentCommentsFrame=mSelf.BodyFrame.frames["recentcomments"]; mSelf.BodyCommentsFrame=mSelf.BodyFrame.frames["topiccomments"]; mSelf.PersistenceFrame=mSelf.BodyFrame.frames["persistence"]; mSelf.Initialized=true;}} this.Init=function(){ if(inPreviewMode){ mSelf.Initialized=true; return;} if(window.name=="bridge"){ mSelf.Initialized=true; return;} else if(gRuntimeFileType=="Default"||(gRuntimeFileType=="Topic"&&FMCIsHtmlHelp())){ mSelf.ToolbarFrame=frames["mctoolbar"]; if(frames["body"]!=null){ InitRoot();} else{ InitTopicCHM();}} else if(window.name=="navigation"){ InitNavigation();} else if(parent.name=="navigation"){ InitNavigationFramesWebHelp();} else if(window.name.StartsWith("mctoolbar")){ mSelf.ToolbarFrame=window; if(parent.frames["navigation"]!=null){ InitToolbarWebHelp();} else if(FMCIsWebHelp()){ InitToolbarWebHelpTopic();} else{ InitToolbarCHM();}} else if(window.name=="body"||gRuntimeFileType=="Topic"){ if(FMCIsWebHelp()){ InitTopicWebHelp();} else if(FMCIsDotNetHelp()){ InitTopicDotNetHelp();} else if(FMCIsHtmlHelp()){ InitTopicCHM();}} else if(window.name=="topiccomments"){ if(parent.gRuntimeFileType!="Topic"){ mSelf.Initialized=true; return;} if(FMCIsHtmlHelp()){ InitNavigationFramesCHM();} else if(FMCIsWebHelp()){ InitBodyCommentsFrameWebHelp();} else if(FMCIsDotNetHelp()){ InitBodyCommentsFrameDotNetHelp();}} else if(window.name=="glossary"&&FMCIsDotNetHelp()){ InitGlossaryFrameDotNetHelp();} else if(window.name=="toc"|| window.name=="index"|| window.name=="search"|| window.name=="glossary"|| window.name=="favorites"|| window.name=="browsesequences"|| window.name=="recentcomments"){ InitNavigationFramesCHM();} else if(FMCIsTopicPopup(window)){ var currFrame=window; while(true){ if(currFrame.frames["navigation"]!=null){ mSelf.RootFrame=currFrame; break;} if(currFrame.parent==currFrame){ break;} currFrame=currFrame.parent;} mSelf.Initialized=true;} else if(FMCIsDotNetHelp()){ mSelf.Initialized=true;} else{ mSelf.Initialized=true; return;} if(FMCIsWebHelp()){ if(mSelf.RootFrame==null){ return;} var rootFolder=new CMCUrl(mSelf.RootFrame.document.location.href).ToFolder(); var href=new CMCUrl(document.location.href); var subFolder=href.ToFolder().ToRelative(rootFolder); if(subFolder.FullPath.StartsWith("Subsystems",false)){ while(subFolder.FullPath.StartsWith("Subsystems",false)){ rootFolder=rootFolder.AddFile("Subsystems/"); subFolder=href.ToFolder().ToRelative(rootFolder); var projFolder=subFolder.FullPath.substring(0,subFolder.FullPath.indexOf("/")+1); rootFolder=rootFolder.AddFile(projFolder); subFolder=href.ToFolder().ToRelative(rootFolder);} var r=rootFolder.FullPath; r=r.replace(/\\/g,"/"); r=r.replace(/%20/g," "); r=r.replace(/;/g,"%3B"); mSelf.RootFolder=r;} else if(subFolder.FullPath.StartsWith("AutoMerge",false)){ while(subFolder.FullPath.StartsWith("AutoMerge",false)){ rootFolder=rootFolder.AddFile("AutoMerge/"); subFolder=href.ToFolder().ToRelative(rootFolder); var projFolder=subFolder.FullPath.substring(0,subFolder.FullPath.indexOf("/")+1); rootFolder=rootFolder.AddFile(projFolder); subFolder=href.ToFolder().ToRelative(rootFolder);} var r=rootFolder.FullPath; r=r.replace(/\\/g,"/"); r=r.replace(/%20/g," "); r=r.replace(/;/g,"%3B"); mSelf.RootFolder=r;} else{ mSelf.RootFolder=FMCGetRootFolder(mSelf.RootFrame.document.location);}} else if(FMCIsHtmlHelp()){ mSelf.RootFolder="/";} else if(FMCIsDotNetHelp()){ var loc=null; if(gRuntimeFileType=="Glossary"||gRuntimeFileType=="Toolbar"){ loc=window.document.location;} else{ loc=mSelf.BodyFrame.document.location;} var rootFolder=FMCGetRootFolder(loc); mSelf.RootFolder=rootFolder.substring(0,rootFolder.lastIndexOf("/",rootFolder.length-2)+1);}}}  function CMCDialog(winNode){ this.mRootEl=null; this.mIndex=-1; this.mOK=false; this.mOnCloseFunc=null; this.mOnCloseArgs=null; this.mWindow=winNode; this.StyleClass="Dialog";} CMCDialog.prototype.Run=function(onCloseFunc,onCloseArgs){ FMCInsertOpacitySheet(this.mWindow,"Gray"); CMCDialog.Dialogs.push(this); this.mIndex=CMCDialog.Dialogs.length-1; if(onCloseFunc){ this.mOnCloseFunc=onCloseFunc; this.mOnCloseArgs=onCloseArgs;} var wrapperDiv=this.mWindow.document.createElement("div"); this.RootEl=wrapperDiv; wrapperDiv.setAttribute("MadCap:dialogIndex",this.mIndex); wrapperDiv.id="MCDialog_"+this.mIndex; wrapperDiv.className="MCDialogWrapper"; wrapperDiv.style.display="none"; if(FMCIsQuirksMode(this.mWindow)){ wrapperDiv.style.position="absolute";} var dialogDiv=this.mWindow.document.createElement("div"); dialogDiv.className="MCDialog"; dialogDiv.innerHTML=this.InnerHtml; wrapperDiv.appendChild(dialogDiv); var titleDiv=this.mWindow.document.createElement("div"); titleDiv.id="MCDialogTitle"; titleDiv.appendChild(this.mWindow.document.createTextNode("")); dialogDiv.insertBefore(titleDiv,dialogDiv.firstChild); dialogDiv.insertBefore(this.mWindow.document.createElement("br"),titleDiv.nextSibling); this.mWindow.document.body.appendChild(wrapperDiv); var submitButton=document.getElementById("MCDialogSubmit"); submitButton.onclick=CMCDialog.OK; var cancelButton=document.getElementById("MCDialogCancel"); cancelButton.onclick=CMCDialog.Cancel; var shadowDiv=this.mWindow.document.createElement("div"); shadowDiv.id="MCDialog_DropShadow"; shadowDiv.className="MCDialogShadow"; wrapperDiv.appendChild(shadowDiv); this.Create(); this.LoadStyles(); wrapperDiv.style.display=""; shadowDiv.style.display=""; this.OnInitializing(); var height=dialogDiv.offsetHeight; if(!FMCIsQuirksMode(this.mWindow)||!this.mWindow.document.body.currentStyle){ height-=parseInt(FMCGetComputedStyle(dialogDiv,"borderTopWidth")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"borderBottomWidth")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"paddingTop")); height-=parseInt(FMCGetComputedStyle(dialogDiv,"paddingBottom"));} shadowDiv.style.height=height+"px"; wrapperDiv.style.left=((FMCGetClientWidth(this.mWindow,false)/2)-200)+"px"; wrapperDiv.style.top=((FMCGetClientHeight(this.mWindow,false)/2)-200)+"px"; var shadowOpacity=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowOpacity",this.ShadowOpacity); MCFader.FadeIn(dialogDiv,0,100,shadowDiv,0,shadowOpacity,false);}; CMCDialog.prototype.Create=function(){}; CMCDialog.prototype.OnInitializing=function(){}; CMCDialog.prototype.LoadStyles=function(){ var titleNode=this.mWindow.document.getElementById("MCDialogTitle"); titleNode.firstChild.nodeValue=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleLabel",this.TitleLabel); titleNode.style.fontFamily=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontFamily",this.TitleFontFamily); titleNode.style.fontSize=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontSize",this.TitleFontSize); titleNode.style.fontWeight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontWeight",this.TitleFontWeight); titleNode.style.fontStyle=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontStyle",this.TitleFontStyle); titleNode.style.fontVariant=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleFontVariant",this.TitleFontVariant); titleNode.style.color=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"TitleColor",this.TitleColor); var submitButton=this.mWindow.document.getElementById("MCDialogSubmit"); submitButton.value=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubmitButtonLabel",this.SubmitButtonLabel); var cancelButton=this.mWindow.document.getElementById("MCDialogCancel"); cancelButton.value=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CancelButtonLabel",this.CancelButtonLabel); var div=document.getElementById("MCDialog_"+this.mIndex).firstChild; this.SetLabelStyles(div); div.style.backgroundColor=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BackgroundColor",this.BackgroundColor); var borderLeft=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderLeft",this.BorderLeft); var borderRight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderRight",this.BorderRight); var borderTop=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderTop",this.BorderTop); var borderBottom=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"BorderBottom",this.BorderBottom); div.style.borderLeft=borderLeft; div.style.borderRight=borderRight; div.style.borderTop=borderTop; div.style.borderBottom=borderBottom; var shadowDiv=this.mWindow.document.getElementById("MCDialog_DropShadow"); var shadowBgColor=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowColor",this.ShadowColor); shadowDiv.style.backgroundColor=shadowBgColor; var shadowDistance=parseInt(CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"ShadowDistance",this.ShadowDistance)); shadowDiv.style.top=shadowDistance+"px"; shadowDiv.style.left=shadowDistance+"px"; shadowDiv.style.borderLeftWidth=FMCGetComputedStyle(div,"borderLeftWidth"); shadowDiv.style.borderRightWidth=FMCGetComputedStyle(div,"borderRightWidth"); shadowDiv.style.borderTopWidth=FMCGetComputedStyle(div,"borderTopWidth"); shadowDiv.style.borderBottomWidth=FMCGetComputedStyle(div,"borderBottomWidth"); shadowDiv.style.borderLeftColor=shadowBgColor; shadowDiv.style.borderLeftStyle="solid"; shadowDiv.style.borderRightColor=shadowBgColor; shadowDiv.style.borderRightStyle="solid"; shadowDiv.style.borderTopColor=shadowBgColor; shadowDiv.style.borderTopStyle="solid"; shadowDiv.style.borderBottomColor=shadowBgColor; shadowDiv.style.borderBottomStyle="solid";}; CMCDialog.prototype.SetLabelStyles=function(el){ if(el.className=="Label"){ el.style.fontFamily=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontFamily",this.FontFamily); el.style.fontSize=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontSize",this.FontSize); el.style.fontWeight=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontWeight",this.FontWeight); el.style.fontStyle=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"FontStyle",this.FontStyle); el.style.color=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"Color",this.Color);} var childNodes=el.childNodes; var length=el.childNodes.length; for(var i=0;i"+ ""+ ""+ ""+ "User Name:"+ ""+ ""+ ""+ ""+ ""+ "Subject:"+ ""+ ""+ ""+ ""+ ""+ "Comment:"+ ""+ ""+ ""+ ""+ ""+ ""+ "
"+ ""+ ""+ "
"; CMCAddCommentDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var commentNode=this.mWindow.document.getElementById("MCComment"); if(commentNode.firstChild){ commentNode.removeChild(commentNode.firstChild);} if(this.mAnonymousEnabled){ var username=null; if(FMCIsHtmlHelp()){ username=FMCLoadUserData("LiveHelpUsername");} else{ username=FMCReadCookie("LiveHelpUsername");} if(username){ this.mWindow.document.getElementById("MCUsername").value=username; this.mWindow.document.getElementById("MCSubject").focus();} else{ this.mWindow.document.getElementById("MCUsername").focus();}} else{ var tr=this.mWindow.document.getElementById("MCUsername").parentNode.parentNode; tr.parentNode.removeChild(tr); this.mWindow.document.getElementById("MCSubject").focus();}}; CMCAddCommentDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var userNameLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"UserNameLabel",this.UserNameLabel); var subjectLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubjectLabel",this.SubjectLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); document.getElementById("MCUserNameLabel").firstChild.nodeValue=userNameLabel; document.getElementById("MCSubjectLabel").firstChild.nodeValue=subjectLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCAddCommentDialog.prototype.OK=function(){ var topicID=FMCGetMCAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var userGuid=null; if(FMCIsHtmlHelp()){ userGuid=FMCLoadUserData("LiveHelpUserGuid");} else{ userGuid=FMCReadCookie("LiveHelpUserGuid");} var username=null; if(this.mAnonymousEnabled){ username=this.mWindow.document.getElementById("MCUsername").value; if(username==null||username.length==0){ alert("Please enter a user name."); return false;} if(FMCIsHtmlHelp()){ FMCSaveUserData("LiveHelpUsername",username);} else{ FMCSetCookie("LiveHelpUsername",username,36500);}} var subject=this.mWindow.document.getElementById("MCSubject").value; var comment=this.mWindow.document.getElementById("MCComment").value; if(subject==null||subject.length==0){ alert("Please enter a subject."); return false;} else if(comment==null||comment.length==0){ alert("Please enter a comment."); return false;} try{ gServiceClient.AddComment(topicID,userGuid,username,subject,comment,null);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCAddCommentDialog.prototype.Cancel=function(){};  function CMCRatingDialog(winNode,initialRating){ CMCDialog.call(this,winNode); this.mCurrentRating=initialRating; this.StyleClass="Rating"; this.FontFamily="Arial"; this.FontSize="12px"; this.FontWeight="normal"; this.FontStyle="normal"; this.Color="#000000"; this.TitleLabel="Topic Rating:"; this.TitleFontFamily="Arial"; this.TitleFontSize="14px"; this.TitleFontWeight="bold"; this.TitleFontStyle="normal"; this.TitleFontVariant="small-caps"; this.TitleColor="#000000"; this.BackgroundColor="#ffffcc"; this.SubmitButtonLabel="Submit"; this.CancelButtonLabel="Cancel"; this.ShadowColor="#000000"; this.ShadowDistance=5; this.ShadowOpacity=100; this.BorderLeft="solid 2px #000000"; this.BorderRight="solid 2px #000000"; this.BorderTop="solid 2px #000000"; this.BorderBottom="solid 2px #000000"; this.AverageRatingLabel="Average Rating:"; this.YourRatingLabel="Your Rating:"; this.CommentLabel="Feedback for the author (optional):"; this.AverageRatingTooltip="Average topic rating"; this.YourRatingTooltip="Your rating"; this.CommentLengthExceeded="The maximum comment length was exceeded by {n} characters.";} CMCRatingDialog.prototype=new CMCDialog(); CMCRatingDialog.prototype.constructor=CMCRatingDialog; CMCRatingDialog.prototype.base=CMCDialog.prototype; CMCRatingDialog.prototype.InnerHtml=""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ ""+ "
"+ "Average Rating:"+ ""+ ""+ ""+ "
"+ "Your Rating:"+ ""+ ""+ "
 
"+ "Feedback for the author (optional):"+ "
"+ ""+ "
"+ "
"+ ""+ ""+ "
"; CMCRatingDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var topicID=FMCGetMCAttribute(document.documentElement,"MadCap:liveHelp"); gServiceClient.GetAverageRating(topicID,this.GetRatingOnComplete,null); var avgRatingIcons=this.mWindow.document.getElementById("MCAverageRatingIcons"); var userRatingIcons=this.mWindow.document.getElementById("MCUserRatingIcons"); var img=this.mWindow.document.createElement("img"); CMCFlareStylesheet.SetImageFromStylesheet(img,"ToolbarItem","TopicRatings","EmptyIcon",MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Rating0.gif",16,16); avgRatingIcons.appendChild(img); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); avgRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.appendChild(img.cloneNode(true)); userRatingIcons.onclick=this.UserRatingIconsOnclick; userRatingIcons.onmousemove=this.UserRatingIconsOnmousemove; userRatingIcons.onmouseout=this.UserClearRatingIcons; FMCDrawRatingIcons(this.mCurrentRating,userRatingIcons); this.mWindow.document.getElementById("MCRatingComment").focus();}; CMCRatingDialog.prototype.GetRatingOnComplete=function(averageRating,ratingCount,onCompleteArgs){ var iconContainer=document.getElementById("MCAverageRatingIcons"); FMCDrawRatingIcons(averageRating,iconContainer);}; CMCRatingDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var averageRatingLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"AverageRatingLabel",this.AverageRatingLabel); var yourRatingLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"YourRatingLabel",this.YourRatingLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); var averageRatingTooltip=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"AverageRatingTooltip",this.AverageRatingTooltip); var yourRatingTooltip=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"YourRatingTooltip",this.YourRatingTooltip); document.getElementById("MCAverageRatingLabel").firstChild.nodeValue=averageRatingLabel; document.getElementById("MCYourRatingLabel").firstChild.nodeValue=yourRatingLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; document.getElementById("MCAverageRatingIcons").title=averageRatingTooltip; document.getElementById("MCUserRatingIcons").title=yourRatingTooltip; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCRatingDialog.prototype.UserRatingIconsOnclick=function(e){ if(!e){e=window.event;} var dlg=CMCDialog.GetDialog(this); var x=FMCGetMouseXRelativeTo(window,e,this); var numImgNodes=this.getElementsByTagName("img").length; var iconWidth=16; var numIcons=Math.ceil(x/iconWidth); var rating=numIcons*100/numImgNodes; rating=Math.min(rating,100); rating=Math.max(rating,0); dlg.mCurrentRating=rating;} CMCRatingDialog.prototype.UserRatingIconsOnmousemove=function(e){ if(!e){e=window.event;} FMCRatingIconsOnmousemove(e,this);} CMCRatingDialog.prototype.UserClearRatingIcons=function(e){ if(!e){e=window.event;} var dlg=CMCDialog.GetDialog(this); FMCClearRatingIcons(dlg.mCurrentRating,this);} CMCRatingDialog.prototype.OK=function(){ if(this.mCurrentRating<0||this.mCurrentRating>100){ alert("Please specify your rating."); return false;} var topicID=FMCGetAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var comment=this.mWindow.document.getElementById("MCRatingComment").value; try{ gServiceClient.SubmitRating(topicID,this.mCurrentRating,comment);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCRatingDialog.prototype.Cancel=function(){};  function CMCRegisterUserDialog(winNode,dialogMode,version){ CMCRegisterUserDialog.InCheckUserStatusMode=false; CMCDialog.call(this,winNode); this.mItemInfos=new Array(); this.mDialogMode=dialogMode; this.mVersion=version; this.StyleClass="RegisterUser"; this.FontFamily="Arial"; this.FontSize="12px"; this.FontWeight="normal"; this.FontStyle="normal"; this.Color="#000000"; this.TitleLabel="Create Feedback Service Profile:"; this.TitleFontFamily="Arial"; this.TitleFontSize="14px"; this.TitleFontWeight="bold"; this.TitleFontStyle="normal"; this.TitleFontVariant="small-caps"; this.TitleColor="#000000"; this.BackgroundColor="#ffffcc"; this.SubmitButtonLabel="Submit"; this.CancelButtonLabel="Cancel"; this.ShadowColor="#000000"; this.ShadowDistance=5; this.ShadowOpacity=100; this.BorderLeft="solid 2px #000000"; this.BorderRight="solid 2px #000000"; this.BorderTop="solid 2px #000000"; this.BorderBottom="solid 2px #000000"; this.RegistrationMessage="You must create a user profile to post comments to this help system. Please fill in the information below. An email will be sent to the address you provide. Please follow the instructions in the email to complete activation. Fields marked with an asterisk (*) are required."; this.EditProfileRegistrationMessage="Use this form to update your profile information. If you choose to update your email address, an email will be sent to the address you provide. Please follow the instructions in the email to complete activation."; this.RegistrationSubmit="Your information has been sent to MadCap Software. When the information has been processed, you will receive an email with a link to a verification page. Click this link, or copy and paste the link into your Web browser to complete the registration."; this.RegistrationSubmitNote="NOTE: Some service providers have email filtering software that may cause the notification email to be sent to your junk email folder. If you do not receive a notification email, please check this folder to see if it has been sent there."; this.MissingRequiredField="Please enter a value for: "; this.UpdateSuccess="Your profile was updated successfully!";} CMCRegisterUserDialog.prototype=new CMCDialog(); CMCRegisterUserDialog.prototype.constructor=CMCRegisterUserDialog; CMCRegisterUserDialog.prototype.base=CMCDialog.prototype; CMCRegisterUserDialog.prototype.InnerHtml=""+ "
"+ "You must create a user profile to post comments to this help system. "+ "Please fill in the information below. An email will be sent to the "+ "address you provide. Please follow the instructions in the email to complete activation."+ "Fields marked with an asterisk (*) are required."+ "
"+ ""+ "
"+ ""+ ""+ ""+ ""+ ""+ "
"+ "
"+ "
E-mail Notifications
"+ "
I want to receive an email when...
"+ "
"+ "
"+ "
"+ "
"+ "
"+ "
"+ ""+ "
"+ ""+ ""+ "
"; CMCRegisterUserDialog.DialogMode={}; CMCRegisterUserDialog.DialogMode.NewUserProfile=0; CMCRegisterUserDialog.DialogMode.EditUserProfile=1; CMCRegisterUserDialog.prototype.Create=function(){ this.base.Create.call(this); var xmlDoc=CMCXmlParser.GetXmlDoc(FMCGetSkinFolderAbsolute()+"Skin.xml",false,null,null); var items=null; if(this.mVersion==1){ items=new Array(7); items[0]="Username"; items[1]="EmailAddress"; items[2]="FirstName"; items[3]="LastName"; items[4]="Country"; items[5]="PostalCode"; items[6]="Gender"; var emailNotificationsGroup=this.mWindow.document.getElementById("MCEmailNotificationsGroup"); emailNotificationsGroup.style.display="none";} else{ items=FMCGetAttributeStringList(xmlDoc.documentElement,"FeedbackUserProfileItems","|"); if(items==null){ items=new Array();} if(!items.Contains("EmailAddress")){ items.Insert("EmailAddress",0);} if(!items.Contains("Username")){ items.Insert("Username",0);} var c=this.mWindow.document.getElementById("MCCommentReplyNotification"); var itemInfo=new CMCItemInfo("CommentReplyNotification","CommentReplyNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; var savedValue=FMCLoadUserData("CommentReplyNotification"); c.checked=savedValue=="true"; c=this.mWindow.document.getElementById("MCCommentSameTopicNotification"); itemInfo=new CMCItemInfo("CommentSameTopicNotification","CommentSameTopicNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; savedValue=FMCLoadUserData("CommentSameTopicNotification"); c.checked=savedValue=="true"; c=this.mWindow.document.getElementById("MCCommentSameHelpSystemNotification"); itemInfo=new CMCItemInfo("CommentSameHelpSystemNotification","CommentSameHelpSystemNotification",c,false); this.mItemInfos[this.mItemInfos.length]=itemInfo; savedValue=FMCLoadUserData("CommentSameHelpSystemNotification"); c.checked=savedValue=="true";} var tbody=this.RootEl.getElementsByTagName("tbody")[0]; for(var i=0,length=items.length;i"+ ""+ ""+ ""+ "User Name:"+ ""+ ""+ ""+ ""+ ""+ "Subject:"+ ""+ ""+ ""+ ""+ ""+ "Comment:"+ ""+ ""+ ""+ ""+ ""+ "Original Comment:"+ ""+ ""+ ""+ ""+ ""+ ""+ "
"+ ""+ ""+ "
"; CMCReplyCommentDialog.prototype.OnInitializing=function(){ this.base.OnInitializing.call(this); var commentNode=this.mWindow.document.getElementById("MCComment"); if(commentNode.firstChild){ commentNode.removeChild(commentNode.firstChild);} if(this.mAnonymousEnabled){ this.mWindow.document.getElementById("MCUsername").focus();} else{ var tr=this.mWindow.document.getElementById("MCUsername").parentNode.parentNode; tr.parentNode.removeChild(tr); this.mWindow.document.getElementById("MCSubject").focus();} this.mWindow.document.getElementById("MCOriginalComment").value=this.mComment;}; CMCReplyCommentDialog.prototype.LoadStyles=function(){ this.base.LoadStyles.call(this); var userNameLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"UserNameLabel",this.UserNameLabel); var subjectLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"SubjectLabel",this.SubjectLabel); var commentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLabel",this.CommentLabel); var originalCommentLabel=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"OriginalCommentLabel",this.OriginalCommentLabel); document.getElementById("MCUserNameLabel").firstChild.nodeValue=userNameLabel; document.getElementById("MCSubjectLabel").firstChild.nodeValue=subjectLabel; document.getElementById("MCCommentLabel").firstChild.nodeValue=commentLabel; document.getElementById("MCOriginalCommentLabel").firstChild.nodeValue=originalCommentLabel; this.CommentLengthExceeded=CMCFlareStylesheet.LookupValue("Dialog",this.StyleClass,"CommentLengthExceeded",this.CommentLengthExceeded);}; CMCReplyCommentDialog.prototype.OK=function(){ var topicID=FMCGetMCAttribute(this.mWindow.document.documentElement,"MadCap:liveHelp"); var userGuid=null; if(FMCIsHtmlHelp()){ userGuid=FMCLoadUserData("LiveHelpUserGuid");} else{ userGuid=FMCReadCookie("LiveHelpUserGuid");} var username=null; if(this.mAnonymousEnabled){ username=this.mWindow.document.getElementById("MCUsername").value; if(username==null||username.length==0){ alert("Please enter a user name."); return false;}} var subject=this.mWindow.document.getElementById("MCSubject").value; var comment=this.mWindow.document.getElementById("MCComment").value; if(subject==null||subject.length==0){ alert("Please enter a subject."); return false;} else if(comment==null||comment.length==0){ alert("Please enter a comment."); return false;} try{ gServiceClient.AddComment(topicID,userGuid,username,subject,comment,this.mParentCommentID);} catch(ex){ var message=this.CommentLengthExceeded.replace(/{n}/g,ex.Data.ExceedAmount); alert(message); return false;} return true;}; CMCReplyCommentDialog.prototype.Cancel=function(){};  function FMCInit(){ if(gInit){ return;} FMCCheckForBookmark(); if(FMCIsWebHelp()&&window.name=="body"){ FMCRegisterCallback("TOC",MCEventType.OnInit,FMCOnTocInitialized,null);} if(MCGlobals.ToolbarFrame!=null){ FMCRegisterCallback("Toolbar",MCEventType.OnInit,FMCOnToolbarLoaded,null);} if(MCGlobals.BodyCommentsFrame!=null&&!FMCIsTopicPopup(window)){ if(!FMCIsWebHelp()||MCGlobals.RootFrame!=null){ FMCRegisterCallback("BodyComments",MCEventType.OnLoad,FMCOnBodyCommentsLoaded,null);}} if(MCGlobals.TopicCommentsFrame!=null){ FMCRegisterCallback("TopicComments",MCEventType.OnInit,FMCOnTopicCommentsInit,null);} if(MCGlobals.RecentCommentsFrame!=null){ FMCRegisterCallback("RecentComments",MCEventType.OnInit,FMCOnRecentCommentsInit,null);} var rootFrame=FMCGetRootFrame(); if(rootFrame){ rootFrame.FMCHighlightUrl(window);} else if(typeof(FMCHighlightUrl)!="undefined"){ FMCHighlightUrl(window);} if(MCGlobals.RootFrame==null&&!FMCIsTopicPopup(window)){ var framesetLinks=FMCGetElementsByClassRoot(document.body,"MCWebHelpFramesetLink"); for(var i=0;i-1)?true:false; var aLeft=(anchors.indexOf("Left")>-1)?true:false; var aBottom=(anchors.indexOf("Bottom")>-1)?true:false; var aRight=(anchors.indexOf("Right")>-1)?true:false; var aWidth=(anchors.indexOf("Width")>-1)?true:false; var aHeight=(anchors.indexOf("Height")>-1)?true:false;} if(aLeft&&aRight){ widthPx=screen.availWidth-(leftPx+rightPx);} else if(!aLeft&&aRight){ leftPx=screen.availWidth-(widthPx+rightPx);} else if(aWidth){ leftPx=(screen.availWidth/ 2)-(widthPx/ 2);} if(aTop&&aBottom){ heightPx=screen.availHeight-(topPx+bottomPx);} else if(!aTop&&aBottom){ topPx=screen.availHeight-(heightPx+bottomPx);} else if(aHeight){ topPx=(screen.availHeight/ 2)-(heightPx/ 2);} if(window==top){ try{ window.resizeTo(widthPx,heightPx); window.moveTo(leftPx,topPx);} catch(err){}}} function Default_LoadWebHelpOptions(xmlDoc){ var webHelpOptions=xmlDoc.getElementsByTagName("WebHelpOptions")[0]; if(webHelpOptions){ if(webHelpOptions.getAttribute("NavigationPanePosition")){ gNavPosition=webHelpOptions.getAttribute("NavigationPanePosition");} if(webHelpOptions.getAttribute("NavigationPaneWidth")){ var navWidth=webHelpOptions.getAttribute("NavigationPaneWidth"); if(navWidth!="0"){ var hideNavStartup=FMCGetAttributeBool(webHelpOptions,"HideNavigationOnStartup",false); if(!hideNavStartup){ if(gNavPosition=="Left"){ document.getElementsByTagName("frameset")[1].cols=navWidth+", *";} else if(gNavPosition=="Right"){ document.getElementsByTagName("frameset")[1].cols="*, "+navWidth;} else if(gNavPosition=="Top"){ var resizeBarHeight=7; document.getElementsByTagName("frameset")[0].rows=navWidth+", "+resizeBarHeight+", *";} else if(gNavPosition=="Bottom"){ document.getElementsByTagName("frameset")[0].rows="*, "+navWidth;}}}} gHideNavStartup=FMCGetAttributeBool(webHelpOptions,"HideNavigationOnStartup",false); if(gHideNavStartup){ ShowHideNavigation(false);}} if(FMCIsSafari()){ var frameNodes=document.getElementsByTagName("frame"); for(var i=0;i=gNavigationWidth){ clearInterval(gIntervalID); for(var i=0,length=gChangeNavigationStateCompletedListeners.length;i=gNavigationWidth){ clearInterval(gIntervalID); for(var i=0,length=gChangeNavigationStateCompletedListeners.length;i");} catch(ex){ iframe=document.createElement("iframe"); iframe.onload=FMCIFrameOnload;} var name="MCPopup_"+(gPopupNumber++); node.setAttribute("MadCap:iframeName",name); iframe.name=name; iframe.id=name; iframe.className="MCPopupBody"; iframe.setAttribute("title","Popup"); iframe.setAttribute("scrolling","auto"); iframe.setAttribute("frameBorder","0"); var width=FMCGetAttribute(node,"MadCap:width"); if(width!=null){ iframe.setAttribute("MadCap:width",width);} var height=FMCGetAttribute(node,"MadCap:height"); if(height!=null){ iframe.setAttribute("MadCap:height",height);} document.body.appendChild(iframe); iframe.src=path;} iframe.style.display="none"; gJustPopped=true; iframe.MCClientX=e.clientX+FMCGetScrollLeft(window); iframe.MCClientY=e.clientY+FMCGetScrollTop(window); if(iframeExists){ FMCShowIFrame(iframe);}} function FMCIFrameOnload(e){ if(this.contentWindow.document.location.href=="about:blank"){ return;} if(FMCGetAttributeBool(this,"MadCap:loaded",false)){ return;} FMCShowIFrame(this); this.setAttribute("MadCap:loaded","true");} function FMCIFrameOnloadInline(popupBody){ if(FMCGetAttributeBool(popupBody,"MadCap:loaded",false)){ return;} FMCShowIFrame(popupBody); popupBody.setAttribute("MadCap:loaded","true");} function FMCShowIFrame(popupBody){ try{ if(popupBody.contentWindow.document.location.href=="about:blank"){ return;}} catch(ex){} popupBody.style.display=""; FMCSetPopupSize(popupBody); var clientX=popupBody.MCClientX; var clientY=popupBody.MCClientY; var newXY=FMCGetInBounds(popupBody,clientX,clientY); popupBody.style.left=newXY.X+"px"; popupBody.style.top=newXY.Y+"px"; var popupBodyBG=document.createElement("span"); popupBodyBG.className="MCPopupBodyBG"; popupBodyBG.style.top=newXY.Y+5+"px"; popupBodyBG.style.left=newXY.X+5+"px"; popupBodyBG.style.width=parseInt(popupBody.offsetWidth)+"px"; popupBodyBG.style.height=parseInt(popupBody.offsetHeight)+"px"; popupBody.parentNode.appendChild(popupBodyBG); gPopupObj=popupBody; gPopupBGObj=popupBodyBG; gFadeID=setInterval(FMCFade,10);} function FMCGetInBounds(el,x,y){ var absolutePosition=FMCGetPosition(el.offsetParent); var absoluteTop=absolutePosition[0]; var absoluteLeft=absolutePosition[1]; var scrollTop=FMCGetScrollTop(window); var scrollLeft=FMCGetScrollLeft(window); var newTop=y; var newLeft=x; if(yscrollTop+FMCGetClientHeight(window,false)){ newTop=scrollTop+FMCGetClientHeight(window,false)-parseInt(el.style.height)-5;} newTop-=absoluteTop; if(newLeft+parseInt(el.style.width)+5>scrollLeft+FMCGetClientWidth(window,false)){ newLeft=scrollLeft+FMCGetClientWidth(window,false)-parseInt(el.style.width)-5;} newLeft-=absoluteLeft; return{X:newLeft,Y:newTop};} function FMCSetPopupSize(popupNode){ var popupWidth=FMCGetAttribute(popupNode,"MadCap:width"); var popupHeight=FMCGetAttribute(popupNode,"MadCap:height"); if((popupWidth!="auto"&&!String.IsNullOrEmpty(popupWidth))||(popupHeight!="auto"&&!String.IsNullOrEmpty(popupHeight))){ popupNode.style.width=popupWidth; popupNode.style.height=popupHeight; return;} var clientWidth=FMCGetClientWidth(window,false); var clientHeight=FMCGetClientHeight(window,false); var stepSize=10; var hwRatio=clientHeight/clientWidth; var popupFrame=frames[popupNode.name]; var maxX=clientWidth*0.618034; var i=0; if(FMCIsSafari()){ popupNode.style.width=maxX+"px"; popupNode.style.height=(maxX*hwRatio)+"px"; return;} try{ var popupDocument=popupFrame.document; FMCGetScrollHeight(popupFrame.window);} catch(err){ popupNode.style.width=maxX+"px"; popupNode.style.height=(maxX*hwRatio)+"px"; return;} while(true){ popupNode.style.width=maxX-(i*stepSize)+"px"; popupNode.style.height=(maxX-(i*stepSize))*hwRatio+"px"; if(FMCGetScrollHeight(popupFrame.window)>FMCGetClientHeight(popupFrame.window,false)|| FMCGetScrollWidth(popupFrame.window)>FMCGetClientWidth(popupFrame.window,false)){ popupNode.style.width=maxX-((i-1)*stepSize)+"px"; popupNode.style.height=(maxX-((i-1)*stepSize))*hwRatio+"px"; break;} i++;}} function FMCPopupThumbnail_Onclick(e,node){ if(gPopupObj){ return;} if(!e){ e=window.event;} var clientCenter=FMCGetClientCenter(window); var img=FMCPopupThumbnailShow(node,clientCenter[0],clientCenter[1]); var index=gDocumentOnclickFuncs.push(OnDocumentClick)-1; var justPopped=true; function OnDocumentClick(){ if(justPopped){ justPopped=false; return;} FMCRemoveOpacitySheet(window); img.parentNode.removeChild(img); gDocumentOnclickFuncs.splice(index,1);}} function FMCPopupThumbnail_Onmouseover(e,node){ if(gPopupObj){ return;} if(!e){ e=window.event;} var mouseX=FMCGetClientX(window,e); var mouseY=FMCGetClientY(window,e); var x=mouseX+FMCGetScrollLeft(window); var y=mouseY+FMCGetScrollTop(window); var img=FMCPopupThumbnailShow(node,x,y); img.onmouseout=Onmouseout; function Onmouseout(){ FMCRemoveOpacitySheet(window); img.parentNode.removeChild(img);}} function FMCPopupThumbnailShow(node,x,y){ var popupSrc=FMCGetAttribute(node,"MadCap:popupSrc"); var popupWidth=FMCGetAttribute(node,"MadCap:popupWidth"); var popupHeight=FMCGetAttribute(node,"MadCap:popupHeight"); var img=document.createElement("img"); img.className="MCPopupThumbnail_Popup"; img.setAttribute("src",popupSrc); img.style.width=popupWidth+"px"; img.style.height=popupHeight+"px"; var left=Math.max(5,x-(popupWidth/2)); var top=Math.max(5,y-(popupHeight/2)); document.body.appendChild(img); var newXY=FMCGetInBounds(img,left,top); img.style.left=newXY.X+"px"; img.style.top=newXY.Y+"px"; FMCInsertOpacitySheet(window,"#eeeeee"); MCFader.FadeIn(img,0,100,null,0,0,false); return img;} function GetHelpControlLinks(node,callbackFunc,callbackArgs){ var linkMap=new Array(); var inPreviewMode=FMCInPreviewMode(); if(!inPreviewMode){ var masterHS=FMCGetRootFrame().FMCGetHelpSystem(); if(masterHS.IsMerged()){ if(FMCGetMCAttribute(node,"MadCap:indexKeywords")!=null){ function OnInit(){ var indexKeywords=FMCGetMCAttribute(node,"MadCap:indexKeywords").replace("\\;","%%%%%"); if(indexKeywords==""){ callbackFunc(linkMap,callbackArgs);} var keywords=indexKeywords.split(";"); for(var i=0;iFMCGetClientHeight(window,false)){ gTextPopupBody.style.top=FMCGetScrollTop(window)+FMCGetClientHeight(window,false)-gTextPopupBody.offsetHeight-5+"px";} else{ gTextPopupBody.style.top=FMCGetPageY(window,e)+"px";} if(FMCGetClientX(window,e)+gTextPopupBody.offsetWidth+5>FMCGetClientWidth(window,false)){ gTextPopupBody.style.left=FMCGetScrollLeft(window)+FMCGetClientWidth(window,false)-gTextPopupBody.offsetWidth-5+"px";} else{ gTextPopupBody.style.left=FMCGetPageX(window,e)+"px";} gTextPopupBodyBG=document.createElement("span"); gTextPopupBodyBG.className="MCTextPopupBodyBG"; gTextPopupBodyBG.style.top=parseInt(gTextPopupBody.style.top)+5+"px"; gTextPopupBodyBG.style.left=parseInt(gTextPopupBody.style.left)+5+"px"; FMCSetTextPopupDimensions(); gTextPopupBody.parentNode.appendChild(gTextPopupBodyBG); window.onresize=FMCSetTextPopupDimensions; gPopupObj=gTextPopupBody; gPopupBGObj=gTextPopupBodyBG; gJustPopped=true; gFadeID=setInterval(FMCFade,10);}} function FMCSetTextPopupSize(popupNode){ var clientWidth=FMCGetClientWidth(window,false); var clientHeight=FMCGetClientHeight(window,false); var stepSize=10; var hwRatio=clientHeight/clientWidth; var maxX=clientWidth*0.618034; var i=0; while(true){ popupNode.style.width=maxX-(i*stepSize)+"px"; popupNode.style.height=(maxX-(i*stepSize))*hwRatio+"px"; if(popupNode.scrollHeight>popupNode.offsetHeight-2||popupNode.scrollWidth>popupNode.offsetWidth-2){ popupNode.style.overflow="hidden"; popupNode.style.width=maxX-((i-1)*stepSize)+"px"; popupNode.style.height=(maxX-((i-1)*stepSize))*hwRatio+"px"; break;} i++;}} function FMCToggler(node){ if(gPopupObj){ return;} var imgNodes=node.getElementsByTagName("img"); for(var i=0;iclientHeight){ klinkBody.style.height=(clientHeight-5-2)+"px";} if(klinkBody.offsetWidth+5>clientWidth){ klinkBody.style.width=(clientWidth-5-2)+"px";} var clientX=0; var clientY=0; var pageX=0; var pageY=0; if(node.MCKeydown){ if(node.parentNode.style.position=="absolute"){ topOffset=document.getElementById("searchField").offsetHeight; clientX=node.parentNode.offsetLeft-node.parentNode.parentNode.parentNode.scrollLeft; clientY=node.parentNode.offsetTop-node.parentNode.parentNode.parentNode.scrollTop+topOffset; pageX=node.parentNode.offsetLeft-node.parentNode.parentNode.parentNode.scrollLeft; pageY=node.parentNode.offsetTop-node.parentNode.parentNode.parentNode.scrollTop+topOffset;} else{ clientX=node.offsetLeft-FMCGetScrollLeft(window); clientY=node.offsetTop-FMCGetScrollTop(window); pageX=node.offsetLeft; pageY=node.offsetTop;}} else{ clientX=args.clientX; clientY=args.clientY; pageX=args.pageX; pageY=args.pageY;} if(clientY+klinkBody.offsetHeight+5>FMCGetClientHeight(window,false)){ klinkBody.style.top=FMCGetScrollTop(window)+clientHeight-klinkBody.offsetHeight-5+"px";} else{ klinkBody.style.top=pageY+"px";} if(clientX+klinkBody.offsetWidth+5>FMCGetClientWidth(window,false)){ klinkBody.style.left=FMCGetScrollLeft(window)+clientWidth-klinkBody.offsetWidth-5+"px";} else{ klinkBody.style.left=pageX+"px";} if(node.MCKeydown){ klinkBody.getElementsByTagName("a")[0].focus(); node.MCKeydown=false;} var klinkBodyBG=document.createElement("span"); klinkBodyBG.className="MCKLinkBodyBG"; klinkBodyBG.style.top=parseInt(klinkBody.style.top)+5+"px"; klinkBodyBG.style.left=parseInt(klinkBody.style.left)+5+"px"; klinkBodyBG.style.width=klinkBody.offsetWidth+"px"; klinkBodyBG.style.height=klinkBody.offsetHeight+"px"; klinkBody.parentNode.appendChild(klinkBodyBG); MCFader.FadeIn(klinkBody,0,100,klinkBodyBG,0,50,true);} function FMCKLinkBodyOnkeyup(e){ if(!e){e=window.event;} if(e.keyCode==27){ FMCClickHandler(e); this.MCOwner.focus();}}  function Favorites_WindowOnload(){ if(MCGlobals.NavigationFrame!=null){ Favorites_WaitForPaneActive();} else{ Favorites_Init(null);}} function Favorites_WaitForPaneActive(){ if(MCGlobals.NavigationFrame.gActivePane==window.name){ MCGlobals.NavigationFrame.SetIFrameHeight(); Favorites_Init(null);} else{ window.setTimeout(Favorites_WaitForPaneActive,1);}} function Favorites_Init(OnCompleteFunc){ if(gInit){ if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.body,MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ if(gDeleteSearchFavoritesIcon==null){gDeleteSearchFavoritesIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete.gif";} if(gDeleteSearchFavoritesOverIcon==null){gDeleteSearchFavoritesOverIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_over.gif";} if(gDeleteSearchFavoritesSelectedIcon==null){gDeleteSearchFavoritesSelectedIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_selected.gif";} if(gDeleteTopicFavoritesIcon==null){gDeleteTopicFavoritesIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete.gif";} if(gDeleteTopicFavoritesOverIcon==null){gDeleteTopicFavoritesOverIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_over.gif";} if(gDeleteTopicFavoritesSelectedIcon==null){gDeleteTopicFavoritesSelectedIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Delete_selected.gif";} FMCLoadSearchFavorites(); document.body.insertBefore(document.createElement("br"),document.getElementById("searchFavorites").nextSibling); FMCLoadTopicsFavorites(); gInit=true; EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}}} function FMCSetSearchTabIndexes(){ gTabIndex=1; var searchTable=document.getElementById("searchFavorites"); searchTable.getElementsByTagName("div")[0].tabIndex=gTabIndex++; var trs=searchTable.getElementsByTagName("tr"); if(trs[1].getElementsByTagName("td").length==1){ return;} for(var i=1;i0){ gTabIndex=1+((trs.length-1)*2)+1;} else{ gTabIndex=2;} topicTable.getElementsByTagName("div")[0].tabIndex=gTabIndex++; var trs=topicTable.getElementsByTagName("tr"); if(trs[1].getElementsByTagName("td").length==1){ return;} for(var i=1;i=1;i--){ var currNode=node.childNodes[i]; var prevNode=currNode.previousSibling; if(currNode.nodeType==3&&prevNode.nodeType==3){ prevNode.nodeValue=prevNode.nodeValue+currNode.nodeValue; node.removeChild(currNode);}} for(var i=0;i=0;i--){ var node=root.childNodes[i]; FMCApplyHighlight(win,node,term,color,caseSensitive,searchType); if(node.nodeType!=3||node.parentNode.nodeName=="SCRIPT"){ continue;} var currNode=node; var text=currNode.nodeValue; for(var match=re.exec(text);match!=null;match=re.exec(text)){ var pos=match.index+(searchType=="NGram"?0:match[1].length); var posEnd=pos+term.length; var span=win.document.createElement("span"); span.className="highlight"; span.style.fontWeight="bold"; span.style.backgroundColor=color.split(",")[0]; span.style.color=color.split(",")[1]; var span2=win.document.createElement("span"); span2.className="SearchHighlight"+(gColorIndex+1); span2.appendChild(win.document.createTextNode(text.substring(pos,posEnd))); span.appendChild(span2); currNode.nodeValue=text.substring(0,pos); currNode.parentNode.insertBefore(span,currNode.nextSibling); currNode.parentNode.insertBefore(win.document.createTextNode(text.substring(posEnd,text.length)),span.nextSibling); currNode=currNode.nextSibling.nextSibling; text=currNode.nodeValue; if(gFirstHighlight==null||span.offsetTopwin.document.documentElement.clientHeight){ win.document.documentElement.scrollTop=gFirstHighlight.offsetTop;}} function FMCHighlightUrl(win){ gColorIndex=0; gFirstHighlight=null; var url=win.document.location.search; if(String.IsNullOrEmpty(url)){ return;} url=decodeURIComponent(url); var pos=url.indexOf("SearchType"); var ampPos=-1; var searchType=null; if(pos>=0){ ampPos=url.indexOf("&",pos); searchType=url.substring(1+pos+"SearchType".length,ampPos>=0?ampPos:url.length);} pos=url.indexOf("Highlight"); if(pos>=0){ ampPos=url.indexOf("&",pos); var highlight=url.substring(1+pos+"Highlight".length,ampPos>=0?ampPos:url.length); var stems=highlight.split("||"); for(var i=0;i=start&&itemletter){ break;}}} function CMCIndexEntry(indexEntry,level){ var indexLinks=FMCGetChildNodeByTagName(indexEntry,"Links",0).childNodes; var numNodes=indexLinks.length; var nodeCount=0; this.Term=FMCGetAttribute(indexEntry,"Term"); this.IndexLinks=new Array(); this.Level=level; this.GeneratedReferenceType=FMCGetAttribute(indexEntry,"GeneratedReferenceType"); for(var i=0;i1){ a=GenerateKLink(a,indexLinks);} div.appendChild(a);} function IndexEntryOnmouseover(){ this.style.color="#ff0000";} function IndexEntryOnmouseout(){ var color=gStylesMap.GetItem("color"); this.style.color=color?color:"#0055ff";} function IndexEntryOnclick(){ var indexEntry=this.MCIndexEntry; if(indexEntry.GeneratedReferenceType!=null){ var textParts=indexEntry.Term.split(","); var indexEntryIndex=SelectIndexEntry(textParts); var item=indexEntryIndex; document.getElementById("CatapultIndex").parentNode.scrollTop=item*gEntryHeight; RefreshIndex(); var indexDiv=gIndexDivs[indexEntryIndex]; HighlightEntry(indexDiv);} else{ HighlightEntry(this.parentNode);}} function SetLinkMap(term,indexLinks){ var linkMap=new CMCDictionary(); for(var i=0;i0){ topics+="||";} var indexLink=indexLinks[i]; var link=indexLink.Link; link=(link.charAt(0)=="/")?".."+link:link; topics+=indexLink.Title+"|"+link;} a.href="javascript:void( 0 );"; a.className="MCKLink"; a.setAttribute("MadCap:topics",topics); a.onclick=KLinkOnclick; a.onkeydown=KLinkOnkeydown; return a;} function KLinkOnclick(e){ HighlightEntry(this.parentNode); FMCLinkControl(e,this,gKLinkStylesMap); return false;} function KLinkOnkeydown(){ this.MCKeydown=true;} function Index_Init(OnCompleteFunc){ if(gInit){ if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.body,MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ var fontSizePx=12; if(gStylesMap.GetItem("fontSize")){ fontSizePx=FMCConvertToPx(document,gStylesMap.GetItem("fontSize"),null,12);} gEntryHeight=fontSizePx+3; document.getElementById("searchField").title=gSearchFieldTitle; function GetIndexOnComplete(xmlDoc,args){ gXMLDoc=xmlDoc; CreateIndex(gXMLDoc); RefreshIndex(); gInit=true; EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}} FMCGetHelpSystem().GetIndex(GetIndexOnComplete,null);}} function HighlightEntry(node){ if(gSelectedItem){ var color=gStylesMap.GetItem("color"); var backgroundColor=gStylesMap.GetItem("backgroundColor"); gSelectedItem.firstChild.style.color=color?color:"#0055ff"; gSelectedItem.firstChild.style.backgroundColor=backgroundColor?backgroundColor:"Transparent";} gSelectedItem=node; if(gSelectedItem){ if(gSelectionColor){ gSelectedItem.firstChild.style.color=gSelectionColor;} gSelectedItem.firstChild.style.backgroundColor=gSelectionBackgroundColor;}} function SelectEntry(e){ if(!e){ e=window.event;} if(e.keyCode==116){ return;} else if(e.keyCode==13){ if(gSelectedItem){ parent.parent.frames["body"].location.href=gSelectedItem.childNodes[0].href;} return;} var text=document.getElementById("searchField").value; var textParts=text.split(","); var indexEntryIndex=SelectIndexEntry(textParts); var item=0; if(indexEntryIndex==-1){ item=0;} else{ item=indexEntryIndex;} document.getElementById("CatapultIndex").parentNode.scrollTop=item*gEntryHeight; RefreshIndex(); var indexDiv=null; if(indexEntryIndex!=-1){ indexDiv=gIndexDivs[indexEntryIndex];} HighlightEntry(indexDiv);} function SelectIndexEntry(textParts){ var text=textParts[0].toLowerCase(); do{ if(text==""){ break;} var first=text.charAt(0); var item=gAlphaMap.GetItem(first); var indexEntryIndex=-1; if(item==null){ item=0;}}while(false) return FindIndexEntry(textParts,0,item);} function FindIndexEntry(textParts,partIndex,indexEntryIndex){ var newIndexEntryIndex=-1; var lastIndexEntryIndex=indexEntryIndex; var text=FMCTrim(textParts[partIndex].toLowerCase()); do{ if(text==""){ break;} var currIndexEntry=null; for(var i=indexEntryIndex;;i++){ if(i==gIndexEntryCount){ newIndexEntryIndex=lastIndexEntryIndex; break;} if(!gIndexEntries[i]){ LoadChunksForLetter(text.charAt(0));} currIndexEntry=gIndexEntries[i]; var term=currIndexEntry.Term.toLowerCase(); if(currIndexEntry.Level>gIndexEntries[indexEntryIndex].Level){ continue;} else if(currIndexEntry.Leveltext){ newIndexEntryIndex=lastIndexEntryIndex; for(var subText=text.substring(0,text.length-1);subText!="";subText=subText.substring(0,subText.length-1)){ if(term.substring(0,subText.length)==subText){ newIndexEntryIndex=i;}} break;} else{ lastIndexEntryIndex=i;}}}while(false) if(partIndex+1gIndexEntries[newIndexEntryIndex].Level){ var subIndexEntryIndex=FindIndexEntry(textParts,partIndex+1,nextIndexEntryIndex); if(subIndexEntryIndex!=-1){ newIndexEntryIndex=subIndexEntryIndex;}}} return newIndexEntryIndex;} if(gRuntimeFileType=="Index"){ var gInit=false; var gIndent=16; var gIndexEntryCount=0; var gIndexEntries=new Array(); var gIndexDivs=new Array(); var gLinkMap=new CMCDictionary(); var gXMLDoc=null; var gChunks=null; var gAlphaMap=new CMCDictionary(); var gSelectedItem=null; var gStylesMap=new CMCDictionary(); var gKLinkStylesMap=new CMCDictionary(); var gEntryHeight=15; var gSelectionColor=null; var gSelectionBackgroundColor="#cccccc"; var gSearchFieldTitle="Index search text box"; var gSeeReferencePrefix="See"; var gSeeAlsoReferencePrefix="See also"; gOnloadFuncs.push(Index_WindowOnload); var gDivCached=null; var gACached=null;}  var gEmptyIcon=null; var gHalfFullIcon=null; var gFullIcon=null; var gIconWidth=16; var gTopicRatingIconsInit=false; function TopicRatingIconsInit(){ if(gTopicRatingIconsInit){ return;} var value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","EmptyIcon",null); if(value==null){ gEmptyIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/Rating0.gif"; gIconWidth=16;} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gEmptyIcon=FMCGetSkinFolderAbsolute()+value;} value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","HalfFullIcon",null); if(value==null){ gHalfFullIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/RatingGold50.gif";} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gHalfFullIcon=FMCGetSkinFolderAbsolute()+value;} value=CMCFlareStylesheet.LookupValue("ToolbarItem","TopicRatings","FullIcon",null); if(value==null){ gFullIcon=MCGlobals.RootFolder+MCGlobals.SkinTemplateFolder+"Images/RatingGold100.gif";} else{ value=FMCStripCssUrl(value); value=decodeURIComponent(value); value=escape(value); gFullIcon=FMCGetSkinFolderAbsolute()+value;} gTopicRatingIconsInit=true;} function FMCRatingIconsCalculateRating(e,iconContainer){ if(!e){e=window.event;} var x=FMCGetMouseXRelativeTo(window,e,iconContainer); var imgNodes=iconContainer.getElementsByTagName("img"); var numImgNodes=imgNodes.length; var iconWidth=gIconWidth; var numIcons=Math.ceil(x/iconWidth); var rating=numIcons*100/numImgNodes; return rating;} function FMCRatingIconsOnmousemove(e,iconContainer){ TopicRatingIconsInit(); if(!e){e=window.event;} var rating=FMCRatingIconsCalculateRating(e,iconContainer); FMCDrawRatingIcons(rating,iconContainer);} function FMCClearRatingIcons(rating,iconContainer){ FMCDrawRatingIcons(rating,iconContainer);} function FMCDrawRatingIcons(rating,iconContainer){ TopicRatingIconsInit(); var imgNodes=iconContainer.getElementsByTagName("img"); var numImgNodes=imgNodes.length; var numIcons=Math.ceil(rating*numImgNodes/100); for(var i=0;iqsLimit){ var diff=qsChars-qsLimit; var data={ExceedAmount:diff}; var ex=new CMCFeedbackException(-1,"Query string limit exceeded.",data); throw ex;} script.id=scriptID; script.setAttribute("type","text/javascript"); script.setAttribute("src",src); head.appendChild(script); return scriptID;} this.RemoveScriptTag=function(scriptID){ function RemoveScriptTag2(){ var script=document.getElementById(scriptID); script.parentNode.removeChild(script);} window.setTimeout(RemoveScriptTag2,10);} this.LogTopic=function(topicID){ AddScriptTag("LogTopic","gServiceClient.LogTopicOnComplete",[["TopicID",topicID]]);} this.LogTopicOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.LogTopic2=function(topicID,cshID,onCompleteFunc,onCompleteArgs,thisObj){ this.LogTopic2OnComplete=function(scriptID){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,onCompleteArgs);} else{ onCompleteFunc(onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.LogTopic2OnComplete=null;} AddScriptTag("LogTopic2","gServiceClient.LogTopic2OnComplete",[["TopicID",topicID],["CSHID",cshID]]);} this.LogSearch=function(projectID,userGuid,resultCount,language,query){ AddScriptTag("LogSearch","gServiceClient.LogSearchOnComplete",[["ProjectID",projectID],["UserGuid",userGuid],["ResultCount",resultCount],["Language",language],["Query",query]]);} this.LogSearchOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.AddComment=function(topicID,userGuid,userName,subject,comment,parentCommentID){ AddScriptTag("AddComment","gServiceClient.AddCommentOnComplete",[["TopicID",topicID],["UserGuid",userGuid],["Username",userName],["Subject",subject],["Comment",comment],["ParentCommentID",parentCommentID]]);} this.AddCommentOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.GetAverageRating=function(topicID,onCompleteFunc,onCompleteArgs){ mGetAverageRatingOnCompleteFunc=onCompleteFunc; mGetAverageRatingOnCompleteArgs=onCompleteArgs; AddScriptTag("GetAverageRating","gServiceClient.GetAverageRatingOnComplete",[["TopicID",topicID]]);} this.GetAverageRatingOnComplete=function(scriptID,averageRating,ratingCount){ if(mGetAverageRatingOnCompleteFunc!=null){ mGetAverageRatingOnCompleteFunc(averageRating,ratingCount,mGetAverageRatingOnCompleteArgs); mGetAverageRatingOnCompleteFunc=null; mGetAverageRatingOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.SubmitRating=function(topicID,rating,comment){ AddScriptTag("SubmitRating","gServiceClient.SubmitRatingOnComplete",[["TopicID",topicID],["Rating",rating],["Comment",comment]]);} this.SubmitRatingOnComplete=function(scriptID){ this.RemoveScriptTag(scriptID);} this.GetTopicComments=function(topicID,userGuid,userName,onCompleteFunc,onCompleteArgs){ var scriptID=AddScriptTag("GetTopicComments","gServiceClient.GetTopicCommentsOnComplete",[["TopicID",topicID],["UserGuid",userGuid],["Username",userName]]); var callbackData={OnCompleteFunc:onCompleteFunc,OnCompleteArgs:onCompleteArgs}; mCallbackMap.Add(scriptID,callbackData);} this.GetTopicCommentsOnComplete=function(scriptID,commentsXml){ var callbackData=mCallbackMap.GetItem(scriptID); var callbackFunc=callbackData.OnCompleteFunc; var callbackArgs=callbackData.OnCompleteArgs; if(callbackFunc!=null){ callbackFunc(commentsXml,callbackArgs); mCallbackMap.Remove(scriptID);} this.RemoveScriptTag(scriptID);} this.GetRecentComments=function(projectID,userGuid,userName,oldestComment,onCompleteFunc,onCompleteArgs){ mGetRecentCommentsOnCompleteFunc=onCompleteFunc; mGetRecentCommentsOnCompleteArgs=onCompleteArgs; AddScriptTag("GetRecentComments","gServiceClient.GetRecentCommentsOnComplete",[["ProjectID",projectID],["UserGuid",userGuid],["Username",userName],["Oldest",oldestComment]]);} this.GetRecentCommentsOnComplete=function(scriptID,commentsXml){ if(mGetRecentCommentsOnCompleteFunc!=null){ mGetRecentCommentsOnCompleteFunc(commentsXml,mGetRecentCommentsOnCompleteArgs); mGetRecentCommentsOnCompleteFunc=null; mGetRecentCommentsOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.GetAnonymousEnabled=function(projectID,onCompleteFunc,onCompleteArgs){ mGetAnonymousEnabledOnCompleteFunc=onCompleteFunc; mGetAnonymousEnabledOnCompleteArgs=onCompleteArgs; var src=mLiveHelpService+"GetAnonymousEnabled?ProjectID="+encodeURIComponent(projectID); AddScriptTag("GetAnonymousEnabled","gServiceClient.GetAnonymousEnabledOnComplete",[["ProjectID",projectID]]);} this.GetAnonymousEnabledOnComplete=function(scriptID,enabled){ if(mGetAnonymousEnabledOnCompleteFunc!=null){ mGetAnonymousEnabledOnCompleteFunc(enabled,mGetAnonymousEnabledOnCompleteArgs); mGetAnonymousEnabledOnCompleteFunc=null; mGetAnonymousEnabledOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.StartActivateUser=function(xmlDoc,onCompleteFunc,onCompleteArgs){ mStartActivateUserOnCompleteFunc=onCompleteFunc; mStartActivateUserOnCompleteArgs=onCompleteArgs; var usernameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Username"); var username=FMCGetAttribute(usernameNode,"Value"); var emailAddressNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","EmailAddress"); var emailAddress=FMCGetAttribute(emailAddressNode,"Value"); var firstNameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","FirstName"); var firstName=FMCGetAttribute(firstNameNode,"Value"); var lastNameNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","LastName"); var lastName=FMCGetAttribute(lastNameNode,"Value"); var countryNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Country"); var country=FMCGetAttribute(countryNode,"Value"); var postalCodeNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","PostalCode"); var postalCode=FMCGetAttribute(postalCodeNode,"Value"); var genderNode=FMCGetChildNodeByAttribute(xmlDoc.documentElement,"Name","Gender"); var gender=FMCGetAttribute(genderNode,"Value"); var uiLanguageOrder=""; AddScriptTag("StartActivateUser","gServiceClient.StartActivateUserOnComplete",[["Username",username],["EmailAddress",emailAddress],["FirstName",firstName],["LastName",lastName],["Country",country],["Zip",postalCode],["Gender",gender],["UILanguageOrder",uiLanguageOrder]]);} this.StartActivateUserOnComplete=function(scriptID,pendingGuid){ if(mStartActivateUserOnCompleteFunc!=null){ mStartActivateUserOnCompleteFunc(pendingGuid,mStartActivateUserOnCompleteArgs); mStartActivateUserOnCompleteFunc=null; mStartActivateUserOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.StartActivateUser2=function(xmlDoc,onCompleteFunc,onCompleteArgs,thisObj){ var xml=CMCXmlParser.GetOuterXml(xmlDoc); this.StartActivateUser2OnComplete=function(scriptID,pendingGuid){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,pendingGuid,onCompleteArgs);} else{ onCompleteFunc(pendingGuid,onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.StartActivateUser2OnComplete=null;} AddScriptTag("StartActivateUser2","gServiceClient.StartActivateUser2OnComplete",[["Xml",xml]]);} this.UpdateUserProfile=function(guid,xmlDoc,onCompleteFunc,onCompleteArgs,thisObj){ var xml=CMCXmlParser.GetOuterXml(xmlDoc); this.UpdateUserProfileOnComplete=function(scriptID,pendingGuid){ if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,pendingGuid,onCompleteArgs);} else{ onCompleteFunc(pendingGuid,onCompleteArgs);}} this.RemoveScriptTag(scriptID); this.UpdateUserProfileOnComplete=null;} AddScriptTag("UpdateUserProfile","gServiceClient.UpdateUserProfileOnComplete",[["Guid",guid],["Xml",xml]]);} this.CheckUserStatus=function(pendingGuid,onCompleteFunc,onCompleteArgs){ mCheckUserStatusOnCompleteFunc=onCompleteFunc; mCheckUserStatusOnCompleteArgs=onCompleteArgs; AddScriptTag("CheckUserStatus","gServiceClient.CheckUserStatusOnComplete",[["PendingGuid",pendingGuid]]);} this.CheckUserStatusOnComplete=function(scriptID,status){ if(mCheckUserStatusOnCompleteFunc!=null){ var func=mCheckUserStatusOnCompleteFunc; var args=mCheckUserStatusOnCompleteArgs; mCheckUserStatusOnCompleteFunc=null; mCheckUserStatusOnCompleteArgs=null; func(status,args);} this.RemoveScriptTag(scriptID);} this.GetSynonymsFile=function(projectID,updatedSince,onCompleteFunc,onCompleteArgs){ mGetSynonymsFileOnCompleteFunc=onCompleteFunc; mGetSynonymsFileOnCompleteArgs=onCompleteArgs; AddScriptTag("GetSynonymsFile","gServiceClient.GetSynonymsFileOnComplete",[["ProjectID",projectID],["UpdatedSince",updatedSince]]);} this.GetSynonymsFileOnComplete=function(scriptID,synonymsXml){ if(mGetSynonymsFileOnCompleteFunc!=null){ mGetSynonymsFileOnCompleteFunc(synonymsXml,mGetSynonymsFileOnCompleteArgs); mGetSynonymsFileOnCompleteFunc=null; mGetSynonymsFileOnCompleteArgs=null;} this.RemoveScriptTag(scriptID);} this.GetVersion=function(onCompleteFunc,onCompleteArgs,thisObj){ this.GetVersionOnComplete=function(scriptID,version){ if(version==null){ mVersion=1;} else{ mVersion=version;} if(onCompleteFunc!=null){ if(thisObj!=null){ onCompleteFunc.call(thisObj,mVersion,onCompleteArgs);} else{ onCompleteFunc(mVersion,onCompleteArgs);}} if(scriptID!=null){ this.RemoveScriptTag(scriptID);} this.GetVersionOnComplete=null;} if(mVersion==-1){ AddScriptTag("GetVersion","gServiceClient.GetVersionOnComplete");} else{ this.GetVersionOnComplete(null,mVersion);}}} function CMCFeedbackException(number,message,data){ CMCException.call(this,number,message); this.Data=data;} CMCFeedbackException.prototype=new CMCException(); CMCFeedbackException.prototype.constructor=CMCFeedbackException; CMCFeedbackException.prototype.base=CMCException.prototype;  function FMCOpenCommentDialog(reply,comment,parentCommentID){ var xmlDoc=CMCXmlParser.GetXmlDoc(MCGlobals.RootFolder+MCGlobals.SubsystemFile,false,null,null); var projectID=xmlDoc.documentElement.getAttribute("LiveHelpOutputId"); gServiceClient.GetAnonymousEnabled(projectID,FMCGetAnonymousEnabledOnComplete,[reply,comment,parentCommentID]);} function FMCGetAnonymousEnabledOnComplete(enabled,onCompleteArgs){ var reply=onCompleteArgs[0]; var comment=onCompleteArgs[1]; var parentCommentID=onCompleteArgs[2]; if(FMCIsHtmlHelp()){ onCompleteArgs.push(enabled); FMCRegisterCallback("Persistence",MCEventType.OnInit,function(args){ var reply=args[0]; var comment=args[1]; var parentCommentID=args[2]; var anonymousEnabled=args[3]; if(anonymousEnabled){ FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID);} else{ var userGuid=FMCLoadUserData("LiveHelpUserGuid"); if(userGuid==null){ gServiceClient.GetVersion(function(version){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(FMCRegisterUserDialogOnClose,args);},null,null);} else{ FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID);}}}, onCompleteArgs); return;} if(!enabled){ var userGuid=FMCReadCookie("LiveHelpUserGuid"); if(userGuid==null){ gServiceClient.GetVersion(function(version){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(FMCRegisterUserDialogOnClose,onCompleteArgs);},null,null);} else{ FMCRunCommentDialog(enabled,reply,comment,parentCommentID);}} else{ FMCRunCommentDialog(enabled,reply,comment,parentCommentID);}} function FMCRegisterUserDialogOnClose(onCloseArgs){ var reply=onCloseArgs[0]; var comment=onCloseArgs[1]; var parentCommentID=onCloseArgs[2]; FMCRunCommentDialog(false,reply,comment,parentCommentID);} function FMCRunCommentDialog(anonymousEnabled,reply,comment,parentCommentID){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} var dlg=null; if(!reply){ dlg=new CMCAddCommentDialog(window,anonymousEnabled);} else{ dlg=new CMCReplyCommentDialog(window,anonymousEnabled,comment,parentCommentID);} dlg.Run(function(){ if(MCGlobals.TopicCommentsFrame!=null){ MCGlobals.TopicCommentsFrame.TopicComments_RefreshComments();} if(MCGlobals.BodyCommentsFrame!=null){ MCGlobals.BodyCommentsFrame.TopicComments_RefreshComments();}},null);} function FMCGetRatingOnComplete(averageRating,ratingCount){ var avgRatingIcons=document.getElementById("MCAverageRatingIcons"); var ratingCountSpan=document.getElementById("MCRatingCount"); var textNode=ratingCountSpan.childNodes[0]; if(!textNode){ textNode=ratingCountSpan.appendChild(document.createTextNode(""));} textNode.nodeValue=" based on "+ratingCount+" ratings"; avgRatingIcons.title="Topic rating: "+averageRating+"%"; FMCDrawRatingIcons(averageRating,avgRatingIcons); var loadingImg=document.getElementById("MCLoadingImage"); loadingImg.parentNode.removeChild(loadingImg);} function FMCEditUserProfile(){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} var xmlDoc=CMCXmlParser.GetXmlDoc(MCGlobals.RootFolder+MCGlobals.SubsystemFile,false,null,null); var projectID=xmlDoc.documentElement.getAttribute("LiveHelpOutputId"); gServiceClient.GetAnonymousEnabled(projectID,GetAnonymousEnabledOnComplete,null); function GetAnonymousEnabledOnComplete(enabled,onCompleteArgs){ if(FMCIsHtmlHelp()){ FMCRegisterCallback("Persistence",MCEventType.OnInit,PersistenceInitialized,null); return;} PersistenceInitialized(null); function PersistenceInitialized(args){ if(!enabled){ var userGuid=FMCLoadUserData("LiveHelpUserGuid"); gServiceClient.GetVersion(function(version){ if(userGuid==null){ var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.NewUserProfile,version); dlg.Run(null,null);} else{ if(version==1){ alert("The Feedback Server you are connecting to does not support this feature."); return;} var dlg=new CMCRegisterUserDialog(window,CMCRegisterUserDialog.DialogMode.EditUserProfile,version); dlg.Run(null,null);}},null,null);}}}} if(gRuntimeFileType=="Topic"){}  function SetRating(rating){ var iconContainer=document.getElementById("RatingIcons"); gTopicRating=rating; FMCDrawRatingIcons(gTopicRating,iconContainer);} function FMCTopicRatingIconsOnclick(e){ if(MCGlobals.BodyFrame.CMCDialog.DoesDialogExist()){ return;} if(!e){e=window.event;} var rating=FMCRatingIconsCalculateRating(e,this); var dlg=new MCGlobals.BodyFrame.CMCRatingDialog(MCGlobals.BodyFrame,rating); dlg.Run(RatingDialogOnClose,null);} function FMCTopicRatingIconsOnmousemove(e){ if(!e){e=window.event;} FMCRatingIconsOnmousemove(e,this);} function FMCTopicClearRatingIcons(e){ if(!e){e=window.event;} FMCClearRatingIcons(gTopicRating,this);} function RatingDialogOnClose(args){ MCGlobals.BodyFrame.FMCUpdateToolbarRating();} if(gRuntimeFileType=="Toolbar"){ var gTopicRating=0;}  function CalcVisibleItems(y){ var accordionTop=(gVisibleItems+1)*gcAccordionItemHeight; var itemOffset=(y-accordionTop>=0)?Math.floor((y-accordionTop)/gcAccordionItemHeight):Math.ceil((y-accordionTop)/gcAccordionItemHeight); gVisibleItems=Math.max(Math.min(gVisibleItems+itemOffset,gcMaxVisibleItems),0);} function RefreshAccordion(){ SetIFrameHeight(); for(var i=0;i=0;i--){ if(i>gVisibleItems-1){ continue;} var accordionItem=gAccordionItems[i]; currTop-=(accordionItem.style.height?parseInt(accordionItem.style.height):gcAccordionItemHeight); accordionItem.style.top=currTop+"px";} var accordionExpander=document.getElementById("AccordionExpander"); currTop-=parseInt(FMCGetComputedStyle(accordionExpander,"height")); accordionExpander.style.top=currTop+"px"; var navigationTop=document.getElementById("NavigationTop"); currTop-=parseInt(FMCGetComputedStyle(navigationTop,"height")); for(var i=0;i0&&stemk==0){ result.Ranking=result.Ranking+50;}} stemk++;} return true;}); return resultSet;} else if(tokenType==CMCToken.Phrase){ var tokenText=mToken.GetTokenText(); var terms=SplitPhrase(tokenText); var resultSet=null; for(var i=0;ititle2){ ret=1;}} return(ret*gCompareSet.mSortOrder);} CMCQueryResultSet.prototype.FindAdjacentEntries=function(results,token,buildWordMap,buildPhraseMap){ var newResults=new CMCQueryResultSet(); var wordList=SplitPhrase(token.GetTokenText()); var wordListMap=new CMCDictionary(); for(var j=0;j0){ isReply=true; styleClass="CommentReplyNode";} var subject=node.getAttribute("Subject"); var username=node.getAttribute("User"); var date=node.getAttribute("DateUTC"); var topicPath=node.getAttribute("TopicPath"); var topicTitle=node.getAttribute("TopicTitle"); var outerDiv=document.createElement("div"); var innerDiv=document.createElement("div"); var subjectDiv=document.createElement("div"); var subjectSpan=document.createElement("span"); var infoDiv=document.createElement("div"); var img=document.createElement("img"); outerDiv.appendChild(innerDiv); outerDiv.style.marginLeft=indent+"px"; innerDiv.setAttribute("MadCap:bgColor","Transparent"); innerDiv.setAttribute("MadCap:bgColorSelected",CMCFlareStylesheet.LookupValue("Control",styleClass,"BackgroundColor","CEE3FF")); innerDiv.style.cursor="default"; innerDiv.onclick=RecentComments_CommentOnclick; var a=document.createElement("a"); a.href="javascript:void( 0 );"; a.onclick=RecentComments_CommentANodeOnclick; innerDiv.appendChild(a); subjectDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontFamily","Arial"); subjectDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontSize","12px"); subjectDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontWeight","bold"); subjectDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontStyle","normal"); subjectDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectColor","#000000"); subjectDiv.appendChild(img); subjectDiv.appendChild(subjectSpan); if(FMCIsSafari()){ subjectSpan.innerHTML=subject;} else{ subjectSpan.appendChild(document.createTextNode(subject));} a.appendChild(subjectDiv); if(username){ var userSpan=document.createElement("span"); userSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontFamily","Arial"); userSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontSize","10px"); userSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontWeight","normal"); userSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontStyle","normal"); userSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoColor","#000000"); if(FMCIsSafari()){ userSpan.innerHTML=username;} else{ userSpan.appendChild(document.createTextNode(username));} infoDiv.appendChild(userSpan);} if(date){ if(username){ infoDiv.appendChild(document.createTextNode(" "));} var dateObj=CMCDateTimeHelpers.GetDateFromUTCString(date); var dateSpan=document.createElement("span"); dateSpan.appendChild(document.createTextNode(CMCDateTimeHelpers.ToUIString(dateObj))); dateSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontFamily","Arial"); dateSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontSize","10px"); dateSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontWeight","normal"); dateSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontStyle","italic"); dateSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampColor","#000000"); infoDiv.appendChild(dateSpan);} infoDiv.style.marginLeft="16px"; a.appendChild(infoDiv); if(topicTitle==null){ topicTitle=topicPath;} if(topicTitle!=null){ var topicA=document.createElement("a"); topicA.appendChild(document.createTextNode(topicTitle)); topicA.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontFamily","Arial"); topicA.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontSize","10px"); topicA.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontWeight","normal"); topicA.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkFontStyle","italic"); topicA.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TopicLinkColor","#000000"); if(topicPath!=null){ if(FMCIsHtmlHelp()){ topicPath="/"+topicPath;} else{ var helpSystem=MCGlobals.BodyFrame.FMCGetHelpSystem(); var path=new CMCUrl(helpSystem.GetPath()+helpSystem.ContentFolder+topicPath); if(helpSystem.UseCustomTopicFileExtension){ path=path.ToExtension(helpSystem.CustomTopicFileExtension);} topicPath=path.FullPath; topicA.setAttribute("target","body");} topicA.setAttribute("href",topicPath);} var topicDiv=document.createElement("div"); topicDiv.style.marginLeft="16px"; topicDiv.appendChild(topicA); a.appendChild(topicDiv);} var bodyNode=FMCGetChildNodeByTagName(node,"Body",0); if(bodyNode){ var commentNode=bodyNode.childNodes[0]; if(commentNode){ var comment=commentNode.nodeValue; var commentDiv=document.createElement("div"); commentDiv.appendChild(document.createTextNode(comment)); commentDiv.style.marginLeft="16px"; commentDiv.style.display="none"; commentDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontFamily","Arial"); commentDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontSize","10px"); commentDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontWeight","normal"); commentDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontStyle","normal"); commentDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyColor","#000000"); innerDiv.appendChild(commentDiv);}} outerDiv.appendChild(document.createElement("br")); var commentsNode=FMCGetChildNodeByTagName(node,"Comments",0); if(isReply){ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/CommentReply.gif",16,16); RecentComments_Build(commentsNode,outerDiv,indent+16);} else{ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/Comment.gif",16,16);} htmlNode.appendChild(outerDiv);}} var gRefreshCount=0; function RecentComments_RefreshComments(e){ if(!e){e=window.event;} gRefreshCount++; GetRecentComments();} var gSelectedComment=null; function RecentComments_CommentOnclick(e){ if(!e){e=window.event;} if(gSelectedComment){ var c1=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColor"); var c2=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColorSelected"); gSelectedComment.setAttribute("MadCap:bgColor",c2); gSelectedComment.setAttribute("MadCap:bgColorSelected",c1); gSelectedComment.style.backgroundColor=c2;} var bgColor=FMCGetMCAttribute(this,"MadCap:bgColor"); var bgColorSelected=FMCGetMCAttribute(this,"MadCap:bgColorSelected"); this.setAttribute("MadCap:bgColor",bgColorSelected); this.setAttribute("MadCap:bgColorSelected",bgColor); this.style.backgroundColor=bgColorSelected; gSelectedComment=this;} function RecentComments_CommentANodeOnclick(){ var commentDiv=FMCGetChildNodeByTagName(this.parentNode,"DIV",0); FMCToggleDisplay(commentDiv);} function BackOnclick(){ window.history.go(-1);} if(gRuntimeFileType=="RecentComments"){ var gInit=false; gOnloadFuncs.push(RecentComments_WindowOnload); if(FMCIsHtmlHelp()){ window.name="recentcomments";}}  function Search_WindowOnload(){ if(FMCIsLiveHelpEnabled()){ var projectID=FMCGetHelpSystem().LiveHelpOutputId; gServiceClient.GetSynonymsFile(projectID,null,GetSynonymsFileOnComplete,null);} if(MCGlobals.NavigationFrame!=null){ Search_WaitForPaneActive();} else{ Search_Init(null);}} function Search_WaitForPaneActive(){ if(MCGlobals.NavigationFrame.gActivePane==window.name){ MCGlobals.NavigationFrame.SetIFrameHeight(); Search_Init(null);} else{ window.setTimeout(Search_WaitForPaneActive,1);}} function GetSynonymsFileOnComplete(synonymsXmlDoc,onCompleteArgs){ var xmlDoc=CMCXmlParser.LoadXmlString(synonymsXmlDoc); gDownloadedSynonymXmlDoc=xmlDoc;} function Search_FMCAddToFavorites(){ var favoritesFrame=parent.frames["favorites"]; favoritesFrame.Favorites_FMCAddToFavorites("search",document.forms["search"].searchField.value); favoritesFrame.FMCLoadSearchFavorites();} function Search_Init(OnCompleteFunc){ if(gInit){ document.forms["search"].searchField.focus(); if(OnCompleteFunc){ OnCompleteFunc();} return;} StartLoading(window,document.getElementById("SearchResults"),MCGlobals.RootFrame.gLoadingLabel,MCGlobals.RootFrame.gLoadingAlternateText,null); window.setTimeout(Init2,0); function Init2(){ var inputs=document.getElementsByTagName("input"); inputs[0].tabIndex=gTabIndex++; inputs[1].tabIndex=gTabIndex++; if(gFavoritesEnabled){ var td=document.createElement("td"); document.getElementById("SearchButton").parentNode.parentNode.appendChild(td); MakeButton(td,gAddSearchLabel,gAddSearchIcon,gAddSearchOverIcon,gAddSearchSelectedIcon,gAddSearchIconWidth,gAddSearchIconHeight,String.fromCharCode(160)); td.getElementsByTagName("div")[0].onclick=Search_FMCAddToFavorites; td.getElementsByTagName("div")[0].onkeyup=Search_ItemOnkeyup;} var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ gSearchDBs=masterHS.GetSearchDBs();} gFilters=new CMCFilters(); gFilters.CreateFilterCombo(); document.forms["search"].style.display=""; gInit=true; document.forms["search"].searchField.focus(); EndLoading(window,null); if(OnCompleteFunc){ OnCompleteFunc();}}} function ApplySearchFilter(){ var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ var searchFilter=document.getElementById("SearchFilter"); var filterName=searchFilter?searchFilter.options[searchFilter.selectedIndex].text:gUnfilteredLabel; gFilteredSet=gFilters.ApplyFilter(filterName); if(gFilteredSet==null){ return;} gFilteredSet.SetRankPositions(); Sort("rankPosition",false); GenerateResultsTable();}} function StartSearch(firstPick,OnSearchFinishedFunc,CallbackFuncArgs){ var searchString=document.forms["search"].searchField.value; if(!searchString||FMCTrim(searchString)==""){ return;} var rootFrame=parent.parent; StartLoading(window,document.getElementById("SearchResults"),rootFrame.gLoadingLabel,rootFrame.gLoadingAlternateText,null); gOnSearchFinishedFunc=OnSearchFinishedFunc; gCallbackFuncArgs=CallbackFuncArgs; FMCRegisterCallback("Search",MCEventType.OnInit,StartSearch2,firstPick);} function StartSearch2(firstPick){ var searchString=document.forms["search"].searchField.value; var masterHS=FMCGetHelpSystem(); if(!masterHS.IsWebHelpPlus){ DoSearch(searchString);} else{ var searchFilter=document.getElementById("SearchFilter"); var filterName=null; if(searchFilter!=null){ filterName=searchFilter.options[searchFilter.selectedIndex].text; if(filterName==gUnfilteredLabel){ filterName=null;}} function OnSearchWebHelpPlusComplete(){ if(firstPick){ var firstResult=document.getElementById("searchResultsTable").firstChild.childNodes[1]; if(firstResult.onclick){ firstResult.onclick();}}} DoSearchWebHelpPlus(searchString,filterName,OnSearchWebHelpPlusComplete);} EndLoading(window,null); if(!masterHS.IsWebHelpPlus){ if(firstPick){ var firstResult=document.getElementById("searchResultsTable").firstChild.childNodes[1]; if(firstResult.onclick){ firstResult.onclick();}}}} function CMCSearchResult(rank,rankPosition,title,link){ this.Rank=rank; this.RankPosition=rankPosition; this.Title=title; this.Link=link;} function CMCSearchResultSet(){ this.mResults=new Array(); this.SortColumn=null; this.Sortorder=null;} CMCSearchResultSet.prototype.Add=function(searchResult){ this.mResults.push(searchResult);}; CMCSearchResultSet.prototype.GetItem=function(index){ return this.mResults[index];}; CMCSearchResultSet.prototype.GetLength=function(){ return this.mResults.length;}; CMCSearchResultSet.prototype.Sort=function(sortColumn){ if(this.SortColumn==sortColumn){ if(this.SortOrder==EMCSortOrder.Ascending){ this.SortOrder=EMCSortOrder.Descending;} else if(this.SortOrder==EMCSortOrder.Descending){ this.SortOrder=EMCSortOrder.Ascending;}} else{ if(sortColumn==EMCSortColumn.Rank){ this.SortOrder=EMCSortOrder.Ascending;} else if(sortColumn==EMCSortColumn.RankPosition){ this.SortOrder=EMCSortOrder.Descending;} else if(sortColumn==EMCSortColumn.Title){ this.SortOrder=EMCSortOrder.Descending;}} this.SortColumn=sortColumn; this.mResults.sort(this.CompareResults);}; CMCSearchResultSet.prototype.CompareResults=function(a,b){ var value1=null; var value2=null; var ret=0; if(gSearchResultSet.SortColumn==EMCSortColumn.Rank){ value1=a.Rank; value2=b.Rank; ret=value1-value2;} else if(gSearchResultSet.SortColumn==EMCSortColumn.RankPosition){ value1=a.RankPosition; value2=b.RankPosition; ret=value1-value2;} else if(gSearchResultSet.SortColumn==EMCSortColumn.Title){ value1=a.Title; value2=b.Title; if(value1value2){ ret=1;}} if(gSearchResultSet.SortOrder==EMCSortOrder.Ascending){ ret*=-1;} return ret;}; var EMCSortColumn=new function(){} EMCSortColumn.Rank=0; EMCSortColumn.RankPosition=1; EMCSortColumn.Title=2; var EMCSortOrder=new function(){} EMCSortOrder.Ascending=0; EMCSortOrder.Descending=1; function DoSearchWebHelpPlus(searchString,filterName,OnCompleteFunc){ function OnGetSearchResultsComplete(xmlDoc,args){ gSearchResultSet=new CMCSearchResultSet(); var results=xmlDoc.getElementsByTagName("Result"); var resultsLength=results.length; for(var i=0;i0||chunk||mergeHint); var bookIcon=null; var bookOpenIcon=null; var topicIcon=null; var markAsNew=null; var topicIconAlt="Topic"; var bookIconAlt="Book"; var markAsNewIconAlt="New"; div.style.textIndent=indent+"px"; div.style.position="relative"; div.style.display="none"; var entryClass=entry.getAttribute("Class"); var className="TocEntry_"+((entryClass==null)?"TocEntry":entryClass); var aCached=gClassToANodeMap.GetItem(className); var nameToValueMap=gStylesMap.GetItem(className); if(!aCached){ aCached=document.createElement("a"); if(nameToValueMap){ nameToValueMap.ForEach(function(key,value){ var style=ConvertToCSS(key); aCached.style[style]=value; return true;});} gClassToANodeMap.Add(className,aCached);} a=aCached.cloneNode(false); a.setAttribute("MadCap:className",className); a.onmouseover=TocEntryOnmouseover; a.onmouseout=TocEntryOnmouseout; if(nameToValueMap){ bookIcon=nameToValueMap.GetItem("BookIcon"); bookOpenIcon=nameToValueMap.GetItem("BookOpenIcon"); topicIcon=nameToValueMap.GetItem("TopicIcon"); var value=nameToValueMap.GetItem("TopicIconAlternateText"); if(value){topicIconAlt=value;} value=nameToValueMap.GetItem("BookIconAlternateText"); if(value){bookIconAlt=value;} value=nameToValueMap.GetItem("MarkAsNewIconAlternateText"); if(value){markAsNewIconAlt=value;} var markAsNewValue=nameToValueMap.GetItem("MarkAsNew"); if(markAsNewValue){ markAsNew=FMCStringToBool(markAsNewValue);}} if(link&&!mergeHint){ if(link.charAt(0)=="/"){ link=fullPath+link.substring(1);} a.setAttribute("href",link); if(!frameName){ frameName="body";} a.setAttribute("MadCap:frameName",frameName);} else{ a.setAttribute("href","javascript:void( 0 );");} var ownerHelpSystem=GetOwnerHelpSystem(htmlNode); var subPath=null; if(mergeHint){ var subsystem=ownerHelpSystem.GetSubsystem(parseInt(mergeHint)); if(!subsystem.GetExists()){ continue;} subPath=subsystem.GetPath(); var fileName=null; if(window.name=="toc"){ if(!subsystem.HasToc()){ continue;} fileName="Toc.xml";} else if(window.name=="browsesequences"){ if(!subsystem.HasBrowseSequences()){ continue;} fileName="BrowseSequences.xml";} chunk=subPath+"Data/"+fileName; a["MadCap:helpSystem"]=subsystem; var replaceMergeNode=FMCGetAttributeBool(entry,"ReplaceMergeNode",false); if(replaceMergeNode){ var subTocDoc=CMCXmlParser.GetXmlDoc(chunk,false,null,null); div.appendChild(a); htmlNode.appendChild(div); BuildToc(subTocDoc.documentElement,div,indent,subPath); var newDivs=FMCGetChildNodesByTagName(div,"DIV"); htmlNode.removeChild(div); for(var j=0;j0){ a.onclick=BookOnClick;} if(bookIcon=="none"){ img=null;} else{ var src="Images/Book.gif"; var width=16; var height=16; if(bookIcon){ bookIcon=FMCStripCssUrl(bookIcon); bookIcon=decodeURIComponent(bookIcon); src="../"+parent.parent.gSkinFolder+escape(bookIcon); width=CMCFlareStylesheet.GetResourceProperty(bookIcon,"Width",16); height=CMCFlareStylesheet.GetResourceProperty(bookIcon,"Height",16);} img.src=src; img.alt=bookIconAlt; if(!bookOpenIcon||bookOpenIcon=="none"){ img.setAttribute("MadCap:altsrc","Images/BookOpen.gif");} else{ bookOpenIcon=FMCStripCssUrl(bookOpenIcon); bookOpenIcon="../"+parent.parent.gSkinFolder+escape(bookOpenIcon); img.setAttribute("MadCap:altsrc",bookOpenIcon); FMCPreloadImage(bookOpenIcon);} img.style.width=width+"px"; img.style.height=height+"px"; img.style.verticalAlign="middle";}} else{ a.onclick=TopicOnClick; if(topicIcon=="none"){ img=null;} else{ var src="Images/Topic.gif"; var width=16; var height=16; if(topicIcon){ topicIcon=FMCStripCssUrl(topicIcon); topicIcon=decodeURIComponent(topicIcon); src="../"+parent.parent.gSkinFolder+escape(topicIcon); width=CMCFlareStylesheet.GetResourceProperty(topicIcon,"Width",16); height=CMCFlareStylesheet.GetResourceProperty(topicIcon,"Height",16);} img.src=src; img.alt=topicIconAlt; img.style.width=width+"px"; img.style.height=height+"px"; img.style.verticalAlign="middle";}} var markAsNewEntry=entry.getAttribute("MarkAsNew"); var markAsNewComputed=markAsNewEntry?FMCStringToBool(markAsNewEntry):markAsNew; if(markAsNewComputed){ var newImg=document.createElement("img"); newImg.src="Images/NewItemIndicator.bmp"; newImg.alt=markAsNewIconAlt; newImg.style.width="7px"; newImg.style.height="7px"; newImg.style.position="absolute"; a.appendChild(newImg);} img?a.appendChild(img):false; var text=document.createTextNode(title); a.appendChild(text); div.appendChild(a); htmlNode.appendChild(div); BuildToc(entry,div,indent+16,mergeHint?subPath:fullPath);}} function CacheStyles(){ var stylesDoc=CMCXmlParser.GetXmlDoc(parent.parent.gRootFolder+parent.parent.gSkinFolder+"Stylesheet.xml",false,null,null); var styles=stylesDoc.getElementsByTagName("Style"); var tocEntryStyle=null; for(var i=0;i0){ var nameToValueMap=new CMCDictionary(); var props=properties[0].childNodes; for(var i=0;i0){ var nameToValueMap=new CMCDictionary(); var props=properties[0].childNodes; for(var j=0;j=0){ var format=formatString.substring(i+1,endPos); if(format=="n"){ var topicIndexNode=document.createElement("span"); topicIndexNode.setAttribute("id","MCCurrentTopicIndex"); span.appendChild(topicIndexNode); var topicIndexTextNode=document.createTextNode(""); topicIndexNode.appendChild(topicIndexTextNode);} else if(format=="total"){ var topicTotalNode=document.createElement("span"); topicTotalNode.setAttribute("id","MCTopicTotal"); span.appendChild(topicTotalNode); var topicTotalTextNode=document.createTextNode(""); topicTotalNode.appendChild(topicTotalTextNode);} i=endPos;}} else{ currText+=c;}} var remainingTextNode=document.createTextNode(currText); span.appendChild(remainingTextNode); FMCRegisterCallback("Body",MCEventType.OnInit,OnBodyInitSetCurrentTopicIndex,null);} function OnBodyInitSetCurrentTopicIndex(){ var span=document.getElementById("MCCurrentTopicIndexContainer"); if(span==null){ return;} if(MCGlobals.InPreviewMode){ SetCurrentTopicIndexSequenceIndex(0); SetCurrentTopicIndexTotal(0); OnCompleteBoth();} else{ var master=FMCGetHelpSystem(); var file=master.GetBrowseSequenceFile(); var bsPath=MCGlobals.BodyFrame.CMCUrl.QueryMap.GetItem("BrowseSequencePath"); var href=FMCGetBodyHref(); if(bsPath==null){ bsPath=FMCGetMCAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:browseSequencePath"); if(bsPath==null){ OnCompleteGetEntrySequenceIndex(-1); return;} var fullBsPath=master.GetFullTocPath("browsesequences",href.PlainPath); if(fullBsPath){ bsPath=bsPath?fullBsPath+"|"+bsPath:fullBsPath;}} if(bsPath==""||bsPath.StartsWith("$$$$$")){ OnCompleteGetEntrySequenceIndex(-1); return;} file.GetEntrySequenceIndex(bsPath,href,OnCompleteGetEntrySequenceIndex);} function OnCompleteGetEntrySequenceIndex(sequenceIndex){ if(sequenceIndex==-1){ span.style.display="none"; OnCompleteBoth(); return;} span.style.display=""; SetCurrentTopicIndexSequenceIndex(sequenceIndex); file.GetIndexTotalForEntry(bsPath,href,OnCompleteGetIndexTotalForEntry); function OnCompleteGetIndexTotalForEntry(total){ SetCurrentTopicIndexTotal(total); window.setTimeout(OnCompleteBoth,100);}}} function OnCompleteBoth(){ var span=document.getElementById("MCCurrentTopicIndexContainer"); span.parentNode.style.width=span.offsetWidth+"px"; if(gIsTopicToolbar){ SetIFrameFixedWidth();}} function SetCurrentTopicIndexSequenceIndex(sequenceIndex){ var topicIndexNode=document.getElementById("MCCurrentTopicIndex"); if(topicIndexNode!=null){ topicIndexNode.firstChild.nodeValue=sequenceIndex.toString();}} function SetCurrentTopicIndexTotal(total){ var topicTotalNode=document.getElementById("MCTopicTotal"); if(topicTotalNode!=null){ topicTotalNode.firstChild.nodeValue=total.toString();}} function SetIFrameFixedWidth(){ var buttonsTD=document.getElementById("ToolbarButtons"); var tds=buttonsTD.getElementsByTagName("td"); var totalWidth=0; for(var i=0,length=tds.length;i0){ isReply=true; styleClass="CommentReplyNode";} var subject=node.getAttribute("Subject"); var username=node.getAttribute("User"); var date=node.getAttribute("DateUTC"); if(date==null){ date=node.getAttribute("Date");} var outerDiv=document.createElement("div"); var innerDiv=document.createElement("div"); var subjectDiv=document.createElement("div"); var subjectSpan=document.createElement("span"); var infoDiv=document.createElement("div"); var img=document.createElement("img"); outerDiv.appendChild(innerDiv); outerDiv.style.marginLeft=indent+"px"; innerDiv.setAttribute("MadCap:commentID",node.getAttribute("CommentID")); innerDiv.setAttribute("MadCap:bgColor","Transparent"); innerDiv.setAttribute("MadCap:bgColorSelected",CMCFlareStylesheet.LookupValue("Control",styleClass,"BackgroundColor","CEE3FF")); innerDiv.style.cursor="default"; innerDiv.onclick=TopicComments_CommentOnclick; innerDiv.ondblclick=ReplyComment; var a=document.createElement("a"); a.href="javascript:void( 0 );"; a.onclick=TopicComments_CommentANodeOnclick; innerDiv.appendChild(a); subjectDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontFamily","Arial"); subjectDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontSize","12px"); subjectDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontWeight","bold"); subjectDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectFontStyle","normal"); subjectDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"SubjectColor","#000000"); subjectDiv.appendChild(img); subjectDiv.appendChild(subjectSpan); if(FMCIsSafari()){ subjectSpan.innerHTML=subject;} else{ subjectSpan.appendChild(document.createTextNode(subject));} a.appendChild(subjectDiv); if(username){ var userSpan=document.createElement("span"); userSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontFamily","Arial"); userSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontSize","10px"); userSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontWeight","normal"); userSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoFontStyle","normal"); userSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"UserInfoColor","#000000"); if(FMCIsSafari()){ userSpan.innerHTML=username;} else{ userSpan.appendChild(document.createTextNode(username));} infoDiv.appendChild(userSpan);} if(date){ if(username){ infoDiv.appendChild(document.createTextNode(" "));} var dateObj=CMCDateTimeHelpers.GetDateFromUTCString(date); var dateSpan=document.createElement("span"); dateSpan.appendChild(document.createTextNode(CMCDateTimeHelpers.ToUIString(dateObj))); dateSpan.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontFamily","Arial"); dateSpan.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontSize","10px"); dateSpan.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontWeight","normal"); dateSpan.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampFontStyle","italic"); dateSpan.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"TimestampColor","#000000"); infoDiv.appendChild(dateSpan);} infoDiv.style.marginLeft="16px"; a.appendChild(infoDiv); var bodyNode=FMCGetChildNodeByTagName(node,"Body",0); if(bodyNode){ var commentNode=bodyNode.childNodes[0]; if(commentNode){ var comment=commentNode.nodeValue; var commentDiv=document.createElement("div"); commentDiv.appendChild(document.createTextNode(comment)); commentDiv.style.marginLeft="16px"; commentDiv.style.display="none"; commentDiv.style.fontFamily=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontFamily","Arial"); commentDiv.style.fontSize=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontSize","10px"); commentDiv.style.fontWeight=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontWeight","normal"); commentDiv.style.fontStyle=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyFontStyle","normal"); commentDiv.style.color=CMCFlareStylesheet.LookupValue("Control",styleClass,"BodyColor","#000000"); innerDiv.appendChild(commentDiv);}} outerDiv.appendChild(document.createElement("br")); var commentsNode=FMCGetChildNodeByTagName(node,"Comments",0); if(isReply){ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/CommentReply.gif",16,16); TopicComments_Build(commentsNode,outerDiv,indent+16);} else{ CMCFlareStylesheet.SetImageFromStylesheet(img,"Control",styleClass,"Icon","Images/Comment.gif",16,16);} htmlNode.appendChild(outerDiv);}} var gRefreshCount=0; function TopicComments_RefreshComments(e){ if(!e){e=window.event;} gRefreshCount++; var loadingImg=document.getElementById("MCLoadingImage"); if(loadingImg==null){ loadingImg=document.createElement("img"); loadingImg.id="MCLoadingImage"; loadingImg.src="Images/LoadingAnimated.gif"; loadingImg.style.width="16px"; loadingImg.style.height="16px"; loadingImg.style.position="absolute"; loadingImg.style.top="5px"; loadingImg.style.left="5px"; document.body.insertBefore(loadingImg,document.body.childNodes[0]);} gSelectedComment=null; var topicID=FMCGetMCAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:liveHelp"); if(FMCIsHtmlHelp()){ FMCRegisterCallback("Persistence",MCEventType.OnInit,function(args){ var topicID=args.TopicID; var refreshCount=args.RefreshCount; var userGuid=FMCLoadUserData("LiveHelpUserGuid"); MCGlobals.BodyFrame.gServiceClient.GetTopicComments(topicID,userGuid,null,GetTopicCommentsOnComplete,refreshCount);},{TopicID:topicID,RefreshCount:gRefreshCount});} else{ var helpSystem=MCGlobals.BodyFrame.FMCGetHelpSystem(); if(helpSystem.LiveHelpEnabled){ var userGuid=FMCReadCookie("LiveHelpUserGuid"); MCGlobals.BodyFrame.gServiceClient.GetTopicComments(topicID,userGuid,null,GetTopicCommentsOnComplete,gRefreshCount);} else{ loadingImg.parentNode.removeChild(loadingImg);}}} function AddComment(e){ if(!e){e=window.event;} var topicID=FMCGetAttribute(MCGlobals.BodyFrame.document.documentElement,"MadCap:liveHelp"); if(topicID!=null){ MCGlobals.BodyFrame.FMCOpenCommentDialog(false,null,null);}} function ReplyComment(e){ if(!e){e=window.event;} if(gSelectedComment==null){ alert("Please select a comment to reply to."); return;} var comment=gSelectedComment.getElementsByTagName("div")[2].firstChild.nodeValue; var parentCommentID=FMCGetAttribute(gSelectedComment,"MadCap:commentID"); MCGlobals.BodyFrame.FMCOpenCommentDialog(true,comment,parentCommentID);} var gSelectedComment=null; function TopicComments_CommentOnclick(e){ if(!e){e=window.event;} if(gSelectedComment){ var c1=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColor"); var c2=FMCGetMCAttribute(gSelectedComment,"MadCap:bgColorSelected"); gSelectedComment.setAttribute("MadCap:bgColor",c2); gSelectedComment.setAttribute("MadCap:bgColorSelected",c1); gSelectedComment.style.backgroundColor=c2;} var bgColor=FMCGetMCAttribute(this,"MadCap:bgColor"); var bgColorSelected=FMCGetMCAttribute(this,"MadCap:bgColorSelected"); this.setAttribute("MadCap:bgColor",bgColorSelected); this.setAttribute("MadCap:bgColorSelected",bgColor); this.style.backgroundColor=bgColorSelected; gSelectedComment=this;} function TopicComments_CommentANodeOnclick(){ var commentDiv=this.parentNode.getElementsByTagName("div")[2]; FMCToggleDisplay(commentDiv);} if(gRuntimeFileType=="TopicComments"){ var gInit=false; gOnloadFuncs.push(TopicComments_WindowOnload);} db4o-8.0.184.15484+dfsg/doc/reference/Content/SkinSupport/ExpandingOpen.gif0000644000175000017500000000154111520622610026507 0ustar directhexdirecthexGIF87a *U****U***UU*UUUUU*U*U*UԪ****U**********U*******U*U**UU*U*U*U****U*******U*******U**Ԫ*UU*UUUUUU*U**U*UU*U*U*UUUU*UUUUUUUUUUU*UUUUUUU*UUUUUUU*UUUUԪU*U****U***UU*UUUUU*U*U*UԪԪ*UԪ****U***ԪUU*UUUUUԪ*UԪ*UԪ*UԪ*U****U***UU*UUUUU*UԪԪ*ԪUԪԪԪ*UԪ &&&333???LLLYYYfffrrr𠠤, F H?u*LX;"J𡼉+B,‘#Eub"AĨ˗/AIr. ;db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls.htm0000644000175000017500000001060311520622610024473 0ustar directhexdirecthex Usage Pitfalls
You are here: Usage Pitfalls

Usage Pitfalls

The db4o team tries hard to make the db4o as easy to use as possible. However there are still some pitfalls.

When objects are only partially loaded and you run into null pointer exceptions, then you ran into not activated objects. This is a common issue. See "The Activation Pitfall"

When updates are not stored then you have issues with the update-depth.See "Update Depth Pitfall"

db4o tries hard to store every object without any mapping. However in practice the mapping is not perfect. .For example remoting objects shouldn't be stored in db4o. See "Storing MarshalByRef Objects"

db4o includes the assembly-name in the type names. This also means that you need to be careful when accessing the same database from different applications. See "Accessing Persistent Classes From Different .NET Applications"

There are a few dangerous practices which you really should avoid. See "Dangerous Practices"

db4o has database size limit, which is by default 2 GByte. See how you can increase it. See "Working With Large Amounts Of Data"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics.htm0000644000175000017500000001554511520622614022753 0ustar directhexdirecthex Basics Operations & Concepts
You are here: Basics Operations & Concepts

Basics Operations & Concepts

This topic gives you an overview of the most important and basic operations of db4o. First add db4o to your project. db4o doesn't need a complex setup. It's just a library which you can add to your project. See "Getting Started"

Basic Operations

The basic operations are, not surprising, storing, updating, querying and deleting objects. See "The Basic Operations"

using(IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    // store a new pilot
    Pilot pilot = new Pilot("Joe");
    container.Store(pilot);

    // query for pilots
    var pilots = from Pilot p in container
                 where p.Name.StartsWith("Jo")
                 select p;

    // update pilot
    Pilot toUpdate = pilots.First();
    toUpdate.Name = "New Name";
    container.Store(toUpdate);

    // delete pilot
    container.Delete(toUpdate);
} 
Db4oBasics.cs: The basic operations
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
    ' store a new pilot
    Dim pilot As New Pilot("Joe")
    container.Store(pilot)

    ' query for pilots
    Dim pilots = From p As Pilot In container Where p.Name.StartsWith("Jo")

    ' update pilot
    Dim toUpdate As Pilot = pilots.First()
    toUpdate.Name = "New Name"
    container.Store(toUpdate)

    ' delete pilot
    container.Delete(toUpdate)
End Using
Db4oBasics.vb: The basic operations

For more information about queries: See "Querying"

Basic Concepts

There are some basic concepts which are used in db4o. Understanding them helps to understand how db4o behaves. Some behaviors are common behaviors which you expect from a database, like transactions and ACID properties. See "ACID Properties And Transactions"

db4o manages objects by identity. This means db4o doesn't need additional id-field on your object. See "Identity Concept"

Other concepts are more unique to db4o. For example the activation concept, which controls which objects are loaded from the storage to memory. See "Activation Concept". The same principals are also applied when updating (See "Update Concept" ) or deletion objects (See "Delete Behavior"

db4o-8.0.184.15484+dfsg/doc/reference/Content/license.htm0000644000175000017500000001447211520622614023127 0ustar directhexdirecthex License
You are here: License

License

Licensing the db4o Engine

Versant Inc. offers three difference license options for the db4o object database engine db4o:

General Public License (GPL) Version 3

db4o is free under the GPL, where it can be used:

  • for development
  • in-house as long as no deployment to third parties takes place
  • together with works that are placed under the GPL themselves

You receive a copy of the GPL in the file db4o.license.txt together with the db4o distribution.

If you have questions whether the GPL is the right license for you, please read:

Commercial License

For incorporation into own commercial products and for use together with redistributed software that is not placed under the GPL, db4o is also available under a commercial license.

Visit the commercial information on db4o website for licensing terms and pricing.

db4o Opensource Compatibility License (dOCL)

The db4o Opensource Compatibility License (dOCL) is designed for free/open source projects that want to embed db4o but do not want to (or are not able to) license their derivative work under the GPL in its entirety. This initiative aims to proliferate db4o into many more open source projects by providing compatibility for projects licensed under Apache, LGPL, BSD, EPL, and others, as required by our users.

The terms of this license are available here: "dOCL" agreement.

3rd Party Licenses

When you download the db4o distribution, you receive the following 3rd party libraries:

In .NET versions

  • http://mono-project.com/Cecil Mono.Cecil (MIT/X11)

    Used inside Db4objects.Db4o.Instrumentation.dll and Db4oTool.exe

    Cecil is used to read the CIL code during native queries optimization.

  • http://mono-project.com/Cecil .FlowAnalysis (MIT/X11)

    Used inside db4o support libraries and Db4oTool.exe

    Cecil.FlowAnalysis is used to analyse the CIL code during native queries optimization.

  • http://mono-project.com/ Mono.GetOptions (MIT/X11)

    Used inside Db4oTool.exe

    Mono.GetOptions is used to parse the command line of the Db4oTool.exe tool.

These products are not part of db4o's licensed core offer and for development purposes. You receive and license those products directly from their respective owners.

db4o-8.0.184.15484+dfsg/doc/reference/Content/best_practises.htm0000644000175000017500000000703411520622616024515 0ustar directhexdirecthex Best Practices
You are here: Best Practices

Best Practices

This topic is a collection of best practices for db4o.

db4o doesn't have any support for limiting the result size or skipping objects in the result set. You can do this on top of db4o with little effort. See "Paging"

How should you scope the lifetime of an object container? See this guide-line: See "Lifetime Of An Object Container"

Deleting object is always a delicate process. See "Deleting Objects"

If you upgrade to new major db4o version you should do these steps to update the file format. See "Upgrade db4o Version"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise.htm0000644000175000017500000001071711520622606026704 0ustar directhexdirecthex Object Manager Enterprise
You are here: Object Manager Enterprise

Object Manager Enterprise

Object Manager Enterprise (OME) is an object browser for db4o databases. OME provided with this installation comes as Visual Studio plugin. OME can be installed as part of db4o setup.

Alternatively, if you opt out, you can install it later by running the installation from the shortcut provided in the db4objects Start menu folder. If you've downloaded .NET distribution as a zip archive, you will find OME installation in the OME-folder of your db4o distribution. The 3.5 distribution includes the OMEfor Visual Studio 2008, the 4.0 distribution the version for Visual Studio 2010.

More Reading:

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/0000755000175000017500000000000011520622616024113 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/backup.htm0000644000175000017500000001310611520622610026065 0ustar directhexdirecthex Backup
You are here: Advanced Features > Backup

Backup

db4o supplies hot backup functionality to backup single-user databases and client-server databases while they are running.

container.Ext().Backup("backup.db4o");
BackupExample.cs: Store a backup while using the database
container.Ext().Backup("backup.db4o")
BackupExample.vb: Store a backup while using the database

Maybe you want to use a other storage system for the backup than the main database. You can specify the storage system for the backup directly:

container.Ext().Backup(new FileStorage(), "advanced-backup.db4o");
BackupExample.cs: Store a backup with storage
container.Ext().Backup(New FileStorage(), "advanced-backup.db4o")
BackupExample.vb: Store a backup with storage

The methods can be called while an object container is open and they will execute with low priority in a dedicated thread, with as little impact on processing performance as possible.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/ids_and_uuids.htm0000644000175000017500000002736211520622606027450 0ustar directhexdirecthex IDs and UUIDs
You are here: Advanced Features > IDs And UUIDs

IDs and UUIDs

The db4o team recommends not to use object IDs where it is not necessary. db4o keeps track of object identities in a transparent way, by identifying "known" objects on updates. See "Identity Concept"

If you really need to have ids for you're object, take a look at this comparison. See "Comparison Of Different IDs"

Internal IDs

Each object, except value objects like ints, floats or string, do have an internal id. This id is unique within on db4o database and db4o uses it internally for managing the objects. However you also can access this id or retrieve objects by the internal id.

You can get the internal id of an object from the extended object container.

long interalId = container.Ext().GetID(obj);
Db4oInternalIdExample.cs: get the db4o internal ids
Dim interalId As Long = container.Ext().GetID(obj)
Db4oInternalIdExample.vb: get the db4o internal ids

And you can retrieve an object by the internal id. Note that when you get an object by its internal id that it won't be activated. Therefore you have to explicitly activate the object.

long internalId = idForObject;
object objectForID = container.Ext().GetByID(internalId);
// getting by id doesn't activate the object
// so you need to do it manually
container.Ext().Activate(objectForID);
Db4oInternalIdExample.cs: get an object by db4o internal id
Dim internalId As Long = idForObject
Dim objForID As Object = container.Ext().GetByID(internalId)
' getting by id doesn't activate the object
' so you need to do it manually
container.Ext().Activate(objForID)
Db4oInternalIdExample.vb: get an object by db4o internal id

db4o UUIDs

db4o can also generate a UUIDs for each object. The UUIDs main purpose is to enable replication. By default db4o doesn't assign a UUID to each object. You have to enable this globally or for certain types. For example:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.GenerateUUIDs = ConfigScope.Globally;
FileConfiguration.cs: Enable db4o uuids globally
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.GenerateUUIDs = ConfigScope.Globally
FileConfiguration.vb: Enable db4o uuids globally

A db4o UUID consists of two parts. The first part is the database signature which is unique to the database.

The second part a unique id within the object-container for the object. Both parts together represent a unique id.

You can get the db4o uuid from the extended object container.

Db4oUUID uuid = container.Ext().GetObjectInfo(obj).GetUUID();
Db4oUuidExample.cs: get the db4o-uuid
Dim uuid As Db4oUUID = container.Ext().GetObjectInfo(obj).GetUUID()
Db4oUuidExample.vb: get the db4o-uuid

And you can get an object by its UUID. Note that when you get an object by its UUIDthat it won't be activated. Therefore you have to explicitly activate the object.

object objectForId = container.Ext().GetByUUID(idForObject);
// getting by uuid doesn't activate the object
// so you need to do it manually
container.Ext().Activate(objectForId);
Db4oUuidExample.cs: get an object by a db4o-uuid
Dim objForId As Object = container.Ext().GetByUUID(idForObject)
' getting by uuid doesn't activate the object
' so you need to do it manually
container.Ext().Activate(objForId)
Db4oUuidExample.vb: get an object by a db4o-uuid
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/0000755000175000017500000000000011520622616026032 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/event_registry_api.htm0000644000175000017500000004163111520622610032445 0ustar directhexdirecthex Event Registry API
You are here: Advanced Features > Callbacks > Event Registry API

Event Registry API

You can register to events of the db4o-database. You can used these events to implement all kinds of additional functionality. Take a look a few example use-cases. See "Possible Usecases"

There's an event for each database operation. Most of the time there are two events for an operation. One is fired before the operation starts, the other when the operation ends.

Register to an Event

You can gain access to the events via a event registry. These three steps show how to register to events.

First obtain a IEventRegistry-instance from the object container.

IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
EventRegistryExamples.cs: Obtain the event-registry
Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
EventRegistryExamples.vb: Obtain the event-registry

Now you can register your event-handlers on the event registry.

events.Committing += HandleCommitting;
EventRegistryExamples.cs: register for a event
AddHandler events.Committing, AddressOf HandleCommitting
EventRegistryExamples.vb: register for a event

Then implement your event handling.

private static void HandleCommitting(object sender,
    CommitEventArgs commitEventArgs)
{
    // handle the event           
}
EventRegistryExamples.cs: implement your event handling
Private Shared Sub HandleCommitting(ByVal sender As Object, _
                                    ByVal commitEventArgs As CommitEventArgs)
    ' handle the event           
End Sub
EventRegistryExamples.vb: implement your event handling

Cancelable Events

Some events can cancel the operation. All events which have a CancellableObjectEventArgs-parameter can cancel the operation. When you cancel in a event, the operation won't be executed. For example:

IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
events.Creating +=
    delegate(object sender, CancellableObjectEventArgs args)
        {
            if (args.Object is Person)
            {
                Person p = (Person) args.Object;
                if (p.Name.Equals("Joe Junior"))
                {
                    args.Cancel();
                }
            }
        };
EventRegistryExamples.cs: Cancel store operation
Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
AddHandler events.Creating, AddressOf HandleCreatingEvent
EventRegistryExamples.vb: Cancel store operation
Private Shared Sub HandleCreatingEvent(ByVal sender As Object, _
     ByVal args As CancellableObjectEventArgs)
    If TypeOf args.[Object] Is Person Then
        Dim p As Person = DirectCast(args.[Object], Person)
        If p.Name.Equals("Joe Junior") Then
            args.Cancel()
        End If
    End If

End Sub
EventRegistryExamples.vb: Cancel store operation Handler

Register Events On The Server

When you want to register for the events on the server, you should register it on the server-container.

IObjectServer server = 
        Db4oClientServer.OpenServer(DatabaseFileName, PortNumber);
IEventRegistry eventsOnServer = 
        EventRegistryFactory.ForObjectContainer(server.Ext().ObjectContainer());
EventRegistryExamples.cs: register for events on the server
Dim server As IObjectServer = _
        Db4oClientServer.OpenServer(DatabaseFileName, PortNumber)
Dim eventsOnServer As IEventRegistry = _ 
        EventRegistryFactory.ForObjectContainer(server.Ext().ObjectContainer())
EventRegistryExamples.vb: register for events on the server

Commit-Events

Commit-events bring a collection of the added, updated and deleted object with it. You can iterate over these objects. The updated- and added-collections contain LazyObjectReferences, the deleted-event a FrozenObjectInfos. Note that you may cannot get deleted object-instance anymore, but only the meta-info. Furthermore the object doesn't need to be activated. So when you need to read information out if it, ensure that you've activated it first.

IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
events.Committed +=
    delegate(object sender, CommitEventArgs args)
        {
            foreach (LazyObjectReference reference in args.Added)
            {
                Console.WriteLine("Added " + reference.GetObject());
            }
            foreach (LazyObjectReference reference in args.Updated)
            {
                Console.WriteLine("Updated " + reference.GetObject());
            }
            foreach (FrozenObjectInfo reference in args.Deleted)
            {
                //the deleted info might doesn't contain the object anymore and
                //return the null.
                Console.WriteLine("Deleted " + reference.GetObject());
            }
        };
EventRegistryExamples.cs: Commit-info
Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
AddHandler events.Committed, AddressOf HandlingCommitEvent
EventRegistryExamples.vb: Commit-info
Private Shared Sub HandlingCommitEvent(ByVal sender As Object, ByVal args As CommitEventArgs)
    For Each reference As LazyObjectReference In args.Added
        Console.WriteLine("Added " & reference.GetObject())
    Next
    For Each reference As LazyObjectReference In args.Updated
        Console.WriteLine("Updated " & reference.GetObject())
    Next
    For Each reference As FrozenObjectInfo In args.Deleted
        'the deleted info might doesn't contain the object anymore and
        'return the null.
        Console.WriteLine("Deleted " & reference.GetObject())
    Next
End Sub
EventRegistryExamples.vb: Commit-info Handler

Pitfalls and Limitations

  • All embedded clients-/session share the same event registry. So you need to register the events only on one.
  • You cannot call recursively the event-producing operation within the event-handler. For example in the storing-event you cannot call store. In the committing-event you cannot call commit.
  • In client-server mode, each client has it's own event-registry, and therefore only sees its own events. Except the committed-event. See "Events In Client Server-Mode"
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/0000755000175000017500000000000011520622610031537 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/committed_event_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/committed_0000644000175000017500000001545111520622606033621 0ustar directhexdirecthex Committed Event Example
You are here: Advanced Features > Callbacks > Possible Usecases > Committed Event Example

Committed Event Example

Committed callbacks can be used in various scenarios:

  • Backup on commit.
  • Database replication on commit.
  • Client database synchronization.

This example shows you how to refresh objects on a client on commits.

When several clients are working on the same objects it is possible that the data will be outdated on a client. You can use the committed-event refresh object on each commit.

When a client commit will trigger a committed event on all clients. In order to refresh the object, register for the committed event. In the commit-event-handler, refresh the object which have been modified.

IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
events.Committed += 
    delegate(object sender, CommitEventArgs args)
        {
            foreach (LazyObjectReference updated in args.Updated)
            {
                object obj = updated.GetObject();
                args.ObjectContainer().Ext().Refresh(obj, 1);
            }
        };
RefreshingObjects.cs: On the updated-event we refresh the objects
Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
AddHandler events.Committed, AddressOf HandleUpdate
RefreshingObjects.vb: On the updated-event we refresh the objects
Private Shared Sub HandleUpdate(ByVal sender As Object, ByVal args As CommitEventArgs)
    For Each updated As LazyObjectReference In args.Updated
        Dim obj As Object = updated.GetObject()
        args.ObjectContainer().Ext().Refresh(obj, 1)
    Next
End Sub
RefreshingObjects.vb: The refresh-handler

You can register such a event-handler for each client. The committed event is transferred to each client. Note that this requires a lot of network-traffic to notify all clients and transfer the changes.

When working with committed events you should remember that the listener is called on a separate thread, which needs to be synchronized with the rest of the application.

././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/referential_integrity.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/referentia0000644000175000017500000001672311520622606033624 0ustar directhexdirecthex Referential Integrity
You are here: Advanced Features > Callbacks > Possible Usecases > Referential Integrity

Referential Integrity

db4o does not have a built-in referential integrity checking mechanism. Luckily EventRegistry gives you access to all the necessary events to implement it. You will just need to trigger validation on create, update or delete and cancel the action if the integrity is going to be broken.

For example, if Car object is referencing Pilot and the referenced object should exist, this can be ensured with the following handler in deleting() event:

private static void ReferentialIntegrityCheck(object sender,
                                              CancellableObjectEventArgs eventArguments)
{
    Object toDelete = eventArguments.Object;
    if (toDelete is Pilot)
    {
        IObjectContainer container = eventArguments.ObjectContainer();
        IEnumerable<Car> cars = from Car c in container
                                where c.Pilot == toDelete
                                select c;
        if (cars.Count() > 0)
        {
            eventArguments.Cancel();
        }
    }
}
CallbackExamples.cs: Referential integrity
Private Shared Sub ReferentialIntegrityCheck(ByVal sender As Object, ByVal eventArguments As CancellableObjectEventArgs)
    Dim toDelete As Object = eventArguments.Object
    If TypeOf toDelete Is Pilot Then
        Dim container As IObjectContainer = eventArguments.ObjectContainer()
        Dim cars As IEnumerable(Of Car) = From c As Car In container _
                                          Where c.Pilot Is toDelete
        If cars.Count() > 0 Then
            eventArguments.Cancel()
        End If
    End If
End Sub
CallbackExamples.vb: Referential integrity
IEventRegistry events = EventRegistryFactory.ForObjectContainer(container);
events.Deleting += ReferentialIntegrityCheck;
CallbackExamples.cs: Register handler
Dim events As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)
AddHandler events.Deleting, AddressOf ReferentialIntegrityCheck
CallbackExamples.vb: Register handler

You can also add handlers for creating() and updating() events for a Car object to make sure that the pilot field is not null.

Note, that in client/server mode deleting event is only raised on the server side, therefore the code above can't be used and will throw an exception.

././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/autoincrement.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases/autoincrem0000644000175000017500000004053411520622610033636 0ustar directhexdirecthex Autoincrement
You are here: Advanced Features > Callbacks > Possible Usecases > Autoincrement

Autoincrement

db4o does not deliver a field auto increment feature, which is common in RDBMS. Normally you don't need any additional ids, since db4o manages objects by object-identity. However cases where you have disconnected objects, you need additional ids. One of then possibilities it to use auto incremented ids.

If your application logic requires this feature you can implement it using external callbacks. One of the possible solutions is presented below. Note that this example only works in embedded-mode.

This example assumes that all object which need an auto incremented id are subclasses of the IDHolder-class. This class contains the auto-incremented id.

private int id;

public int Id
{
    get { return id; }
    set { id = value; }
}
IDHolder.cs: id holder
Private m_id As Integer

Public Property Id() As Integer
    Get
        Return m_id
    End Get
    Set(ByVal value As Integer)
        m_id = value
    End Set
End Property
IDHolder.vb: id holder

First create a class which keeps the state of the auto-increment numbers. For example a map which keeps the latest auto incremented id for each class.

private class PersistedAutoIncrements
{
    private readonly IDictionary<Type, int> currentHighestIds = new Dictionary<Type, int>();

    public int NextNumber(Type forClass)
    {
        int number;
        if (!currentHighestIds.TryGetValue(forClass, out number))
        {
            number = 0;
        }
        number += 1;
        currentHighestIds[forClass] = number;
        return number;
    }
}
AutoIncrement.cs: persistent auto increment
Private Class PersistedAutoIncrements
    Private ReadOnly currentHighestIds As IDictionary(Of Type, Integer) _
                        = New Dictionary(Of Type, Integer)()

    Public Function NextNumber(ByVal forClass As Type) As Integer
        Dim number As Integer
        If Not currentHighestIds.TryGetValue(forClass, number) Then
            number = 0
        End If
        number += 1
        currentHighestIds(forClass) = number
        Return number
    End Function
End Class
AutoIncrement.vb: persistent auto increment

Then create two methods, which are called later. One which returns the next auto-incremented id for a certain class. Another which stores the current state of the auto-increments.

public int GetNextID(Type forClass)
{
    lock (dataLock)
    {
        PersistedAutoIncrements incrementState = EnsureLoadedIncrements();
        return incrementState.NextNumber(forClass);
    }
}

public void StoreState()
{
    lock (dataLock)
    {
        if (null != state)
        {
            container.Ext().Store(state,2);
        }
    }
}
AutoIncrement.cs: getting the next id and storing state
Public Function GetNextID(ByVal forClass As Type) As Integer
    SyncLock dataLock
        Dim incrementState As PersistedAutoIncrements = EnsureLoadedIncrements()
        Return incrementState.NextNumber(forClass)
    End SyncLock
End Function

Public Sub StoreState()
    SyncLock dataLock
        If state IsNot Nothing Then
            container.Ext().Store(state, 2)
        End If
    End SyncLock
End Sub
AutoIncrement.vb: getting the next id and storing state

The last part is to ensure that the existing auto-increments are loaded from the database. Or if not existing a new instance is created.

private PersistedAutoIncrements EnsureLoadedIncrements()
{
    if (null == state)
    {
        state = LoadOrCreateState();
    }
    return state;
}

private PersistedAutoIncrements LoadOrCreateState()
{
    IList<PersistedAutoIncrements> existingState = container.Query<PersistedAutoIncrements>();
    if (0 == existingState.Count)
    {
        return new PersistedAutoIncrements();
    }
    else if (1 == existingState.Count)
    {
        return existingState[0];
    }
    else
    {
        throw new InvalidOperationException("Cannot have more than one state stored in database");
    }
}
AutoIncrement.cs: load the state from the database
Private Function EnsureLoadedIncrements() As PersistedAutoIncrements
    If state Is Nothing Then
        state = LoadOrCreateState()
    End If
    Return state
End Function

Private Function LoadOrCreateState() As PersistedAutoIncrements
    Dim existingState As IList(Of PersistedAutoIncrements) = container.Query(Of PersistedAutoIncrements)()
    If 0 = existingState.Count Then
        Return New PersistedAutoIncrements()
    ElseIf 1 = existingState.Count Then
        Return existingState(0)
    Else
        Throw New InvalidOperationException("Cannot have more than one state stored in database")
    End If
End Function

AutoIncrement.vb: load the state from the database

Now it's time to use the callbacks. Every time when a new object is created, assign a new id. For this the creating-event is perfect. When commiting also make the auto increment-state persistent, to ensure that no id is used twice.

AutoIncrement increment = new AutoIncrement(container);
IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container);

eventRegistry.Creating+=
    delegate(object sender, CancellableObjectEventArgs args)
    {
        if (args.Object is IDHolder)
        {
            IDHolder idHolder = (IDHolder)args.Object;
            idHolder.Id = increment.GetNextID(idHolder.GetType());
        }    
    };
eventRegistry.Committing +=
    delegate(object sender, CommitEventArgs args)
        {
            increment.StoreState();    
        };
AutoIncrementExample.cs: use events to assign the ids
Dim increment As New AutoIncrement(container)
Dim eventRegistry As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)

AddHandler eventRegistry.Creating, AddressOf increment.HandleCreating
AddHandler eventRegistry.Committing, AddressOf increment.HandleCommiting
AutoIncrementExample.vb: use events to assign the ids

Last, don't forget to index the id-field. Otherwise looks-ups will be slow.

configuration.Common.ObjectClass(typeof (IDHolder)).ObjectField("id").Indexed(true);
AutoIncrementExample.cs: index the id-field
configuration.Common.ObjectClass(GetType(IDHolder)).ObjectField("id").Indexed(True)
AutoIncrementExample.vb: index the id-field
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/events_overview.htm0000644000175000017500000003112311520622616031776 0ustar directhexdirecthex Events Overview
You are here: Advanced Features > Callbacks > Events Overview

Events Overview

This overview shows you all available events. Additionally it shows on which side the event is called in client-server-mode.

Event Explanation Cancellable Client Server
activating Fired before a object is activated. X X  
activated Fired after a object is activated.   X  
creating Fired before a object is stored to first time. X X  
creating Fired after a object is stored to first time.   X  
deleting Fired before a object is deleted. X   X
deleted Fired after a object is deleted.     X
updating Fired before a object is updated. X X  
updated Fired after a object is updated.   X  
deactivating Fired before a object is deactivated. X X  
deactivated Fired after a object is deactivated. X X  
queryStarted Fired when a query starts.   X  
queryFinished Fired when a query has finished.   X  
committing Fired before a commit.     X
committed Fired after a commit.   X1 X
closing Fired when the object is closed.   X  
classRegistered Fired when a new class is stored/loaded.   X  
instantiated Fired when a object is instantiated.   X  
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/commit-time_callbacks.htm0000644000175000017500000001042311520622614032765 0ustar directhexdirecthex Commit-Time Callbacks
You are here: Advanced Features > Callbacks > Commit-Time Callbacks

Commit-Time Callbacks

Commit-time callbacks allow a user to add some specific behavior just before and just after a transaction is committed.

Typical use-cases for commit-time callbacks:

  • Add constraint-violation checking before commit.
  • Check application-specific conditions before commit is done.
  • Start synchronization or backup after commit.
  • Notify other clients/applications about successful/unsuccessful commit.

Commit-time callbacks can be triggered by the following 2 events:

  • Committing: Event subscribers are notified before the container starts any meaningful commit work and are allowed to cancel the entire operation by throwing an exception; the object container instance is completely blocked while subscribers are being notified which is both a blessing because subscribers can count on a stable and safe environment and a curse because it prevents any parallelism with the container;
  • Committed: Event subscribers are notified in a separate thread after the container has completely finished the commit operation; exceptions if any will be ignored.
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/object_callbacks.htm0000644000175000017500000001122211520622616032007 0ustar directhexdirecthex Object Callbacks
You are here: Advanced Features > Callbacks > Object Callbacks

Object Callbacks

Callback methods are automatically called on persistent objects by db4o during certain database events.

For a complete list of the signatures of all available methods see the com.db4o.ext.ObjectCallbacks interface.

You do not have to implement this interface. db4o recognizes the presence of individual methods by their signature, using reflection. You can simply add one or more of the methods to your persistent classes and they will be called.

Returning false to the #objectCanXxxx() methods will prevent the current action from being taken.

In a client/server environment callback methods will be called on the client with two exceptions:

objectOnDelete(), objectCanDelete()

Some possible usecases for callback methods:

  • Setting default values after refactorings.
  • Checking object integrity before storing objects.
  • Setting transient fields.
  • Restoring connected state (of GUI, files, connections).
  • Cascading activation.
  • Cascading updates.
  • Creating special indexes.
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks/possible_usecases.htm0000644000175000017500000000740711520622610032261 0ustar directhexdirecthex Possible Usecases
You are here: Advanced Features > Callbacks > Possible Usecases

Possible Usecases

There are many use cases for external callbacks, including:

  • Cascaded deletes, updates.
  • Referential integrity checks.
  • Gathering statistics.
  • Auto assigned fields .
  • Assigning customary unique IDs for external referencing.
  • Delayed deletion (objects are marked for deletion when delete(object) is called and cleaned out of database in a later maintenance operation).
  • Ensuring object fields uniqueness within the same class etc.
More Reading: db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/session_containers.htm0000644000175000017500000002435211520622610030535 0ustar directhexdirecthex Session Containers
You are here: Advanced Features > Session Containers

Session Containers

In an application there are often multiple operations running at the same time. A typical example is a web application which processes multiple requests at the same time. These operations should be isolated from each other. This means that for the database we want to have multiple transactions at the same time. Each transaction does some work and other transactions shouldn't interfere .

db4o supports this scenario with session containers. A session container is a lightweight object-container with its own transaction and reference cache, but shares the resources with its parent container. That means you can commit and rollback changes on such a session container without disturbing the work of other session containers. If you want to implement units of work, you might considers using a session container for each unit. You can create such a container with the open session call.

using (IObjectContainer rootContainer = Db4oEmbedded.OpenFile(DatabaseFileName))
{
    // open the db4o-session. For example at the beginning for a web-request
    using (IObjectContainer session = rootContainer.Ext().OpenSession())
    {
        // do the operations on the session-container
        session.Store(new Person("Joe"));
    }
}
Db4oSessions.cs: Session object container
Using rootContainer As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFileName)
    ' open the db4o-session. For example at the beginning for a web-request
    Using session As IObjectContainer = rootContainer.Ext().OpenSession()
        ' do the operations on the session-container
        session.Store(New Person("Joe"))
    End Using
End Using
Db4oSessions.vb: Session object container

Transactions And Isolation

As previously mentioned session-containers are isolated from each other. Each session container has its own transaction and its own reference system. This isolation ensures that the different session container don't interfere witch each other.

They don't share the objects loaded and stored with each other. That means you need to load and store the a object with the same session container. When you try to load a object form one session-container and store it with another, you well end up with two separate copies of that object.

Since the transactions are isolated, changes are only visible for other session containers when you've committed. Before the commit call the changes are not visible to other session containers.

session1.Store(new Person("Joe"));
session1.Store(new Person("Joanna"));

// the second session won't see the changes until the changes are committed
PrintAll(session2.Query<Person>());

session1.Commit();

// new the changes are visiable for the second session
PrintAll(session2.Query<Person>());
Db4oSessions.cs: Session are isolated from each other
session1.Store(New Person("Joe"))
session1.Store(New Person("Joanna"))

' the second session won't see the changes until the changes are committed
PrintAll(session2.Query(Of Person)())

session1.Commit()

' new the changes are visiable for the second session
PrintAll(session2.Query(Of Person)())
Db4oSessions.vb: Session are isolated from each other

Note also that sessions also have their own reference cache. So when a object is already loaded, it wont be refreshed if another transaction updates the object. You explicitly need to refresh it.

Person personOnSession1 = session1.Query<Person>()[0];
Person personOnSession2 = session2.Query<Person>()[0];

personOnSession1.Name = "NewName";
session1.Store(personOnSession1);
session1.Commit();


// the second session still sees the old value, because it was cached
Console.WriteLine(personOnSession2.Name);
// you can explicitly refresh it
session2.Ext().Refresh(personOnSession2,int.MaxValue);
Console.WriteLine(personOnSession2.Name);
Db4oSessions.cs: Each session does cache the objects
Dim personOnSession1 As Person = session1.Query(Of Person)()(0)
Dim personOnSession2 As Person = session2.Query(Of Person)()(0)

personOnSession1.Name = "NewName"
session1.Store(personOnSession1)
session1.Commit()


' the second session still sees the old value, because it was cached
Console.WriteLine(personOnSession2.Name)
' you can explicitly refresh it
session2.Ext().Refresh(personOnSession2, Integer.MaxValue)
Console.WriteLine(personOnSession2.Name)
Db4oSessions.vb: Each session does cache the objects
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment.htm0000644000175000017500000001004011520622610026726 0ustar directhexdirecthex Defragment
You are here: Advanced Features > Defragment

Defragment

A db4o database file is structured as sets of free and occupied slots, similar to a file system. And just like a file system it can be fragmented, resulting in a file that is larger than it needs to be.

The defragmentation API helps to fix this problem. It creates a new database file and copies all objects from the current database file to the new database file. All indexes are recreated. The resulting database file will be smaller and faster. It is recommended to apply defragmentation on a regular basis to achieve better performance.

Take a look how to defragment your database. See "How To Use Defragmentation"

Take a look at the defragmentation configuration options. See "Defragmentation Configuration"

You can register a defragmentation listener which notifies you for certain issues: See "Tracking Defragmentation Errors"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling.htm0000644000175000017500000000656011520622606027460 0ustar directhexdirecthex Type Handling
You are here: Advanced Features > Type Handling

Type Handling

db4o tries to be simple an easy to use. One big part if this is to transparently store any object without any complex mapping or configuration. Storing a object correctly is a complex process and heavily depends on the type of object. db4o has different storing strategies for different types.

For most types the regular db4o type handling is sufficient.

Since collections are so important, db4o treats collections specially to improve efficiency. See "Collections"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api.htm0000644000175000017500000001401011520622610030506 0ustar directhexdirecthex db4o Reflection API
You are here: Advanced Features > db4o Reflection API

db4o Reflection API

Reflection gives your code access to internal information for classes loaded into the CLR. It allows you to explore the structure of objects at runtime. In the case of reflection metadata is the description of classes and objects within the CLR, including their fields, methods and constructors. It allows the programmer to select target classes at runtime, create new objects, call their methods and operate with the fields.

In order to persist object db4o uses the reflection to read object and store their values. You can exchange this reflector layer in the configuration.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ReflectWith(new FastNetReflector());
CommonConfigurationExamples.cs: Change the reflector
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ReflectWith(New FastNetReflector())
CommonConfigurationExamples.vb: Change the reflector

There are currently two reflectors available:

  • NetReflector: The default reflector which uses standard .NET reflection for inspecting and accessing objects.
  • FastNetReflector: A reflector which generates special access-code for each class. Therefore it is a lot faster than the default NetReflector. However it has a higher memory-consumption due to the generated code.

If you need some special treatment you can create you're own reflector implementation. See "Creating your own reflector"

db4o has also a generic reflector which can deal with stored objects without using the original class. See "GenericReflector"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/0000755000175000017500000000000011520622620026222 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/how_to_use_defragmentation.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/how_to_use_defragmentation.0000644000175000017500000001760411520622606033641 0ustar directhexdirecthex How To Use Defragmentation
You are here: Advanced Features > Defragment > How To Use Defragmentation

How To Use Defragmentation

The simplest way to defragment a db4o file would be:

Defragment.Defrag("database.db4o");
DefragmentationExample.cs: Simplest possible defragment use case
Defragment.Defrag("database.db4o")
DefragmentationExample.vb: Simplest possible defragment use case

Ensure that the file is not opened by any other process or db4o instance.

This moves the file filename to filename.backup, then it create a defragmented version of this database at the original position. If the backup file already exists this an IOException is throw and no action will be taken.

You can also specify the backup filename manually:

Defragment.Defrag("database.db4o", "database.db4o.bak");
DefragmentationExample.cs: Specify backup file explicitly
Defragment.Defrag("database.db4o", "database.db4o.bak")
DefragmentationExample.vb: Specify backup file explicitly

For more detailed configuration of the defragmentation process, you can use a DefragmentConfig instance:

DefragmentConfig config = new DefragmentConfig("database.db4o");
Defragment.Defrag(config);
DefragmentationExample.cs: Defragment with configuration
Dim config As New DefragmentConfig("database.db4o")
Defragment.Defrag(config)
DefragmentationExample.vb: Defragment with configuration

It's possible to use a more fine grained configuration for the deframentation process. See "Defragmentation Configuration"

Defragmentation can throw IOException in the following situations:

  • Backup file exists.
  • Database file not found.
  • Database file is opened by another process.
././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/defragmentation_configuration.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/defragmentation_configurati0000644000175000017500000001225311520622620033711 0ustar directhexdirecthex Defragmentation Configuration
You are here: Advanced Features > Defragment > Defragmentation Configuration

Defragmentation Configuration

You can configure the defragmentation processes for your needs. This topic discusses the available configuration options.

First you need to configure which database file to defragment. See "Original Database And Backup"

It's also recommended to use the db4o database configuration for the defragmentation process. This ensures that all low level settings which influence the database-file layout are used. See "Database Configuration"

When you defragment large database you should configure a commit-frequency to speed up the defragmentation process. See "Commit Frequency"

If you have refractored your classes you might want to remove old meta data. This is possible with the class filters. See "Class Filter" 

By default the backup file isn't deleted after a successful defragmentation. You can change that. See "Delete The Backup"

You can force a database update before defragmenting the database-file. See "Upgrade Database File"

You can disable the read-only more the for backup file. See "Disable Read Only Mode"

If you want to have different storage implementation for the old database file and the new defragmented database file you can configure a separate storage. See "Configure Storage for Backup File"

You can change the id-mapping implementation for the defragmentation-process. See "Configure IDMapping"

././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/tracking_defragmentation_errors.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/tracking_defragmentation_er0000644000175000017500000001434011520622616033673 0ustar directhexdirecthex Tracking Defragmentation Errors
You are here: Advanced Features > Defragment > Tracking Defragmentation Errors

Tracking Defragmentation Errors

You can pass a defragmentation listener to the defragmentation process. This listener will be notified when there's no object for an id in the database. This means that a object has a reference to a non-existing object. This happens when you delete objects which are still referenced by other objects.

private class DefragmentListener : IDefragmentListener
{
    public void NotifyDefragmentInfo(DefragmentInfo defragmentInfo)
    {
        Console.WriteLine(defragmentInfo);
    }
}
DefragmentationExample.cs: Defragmentation listener implementation
Private Class DefragmentListener
    Implements IDefragmentListener
    Public Sub NotifyDefragmentInfo(ByVal defragmentInfo As DefragmentInfo) _
        Implements IDefragmentListener.NotifyDefragmentInfo

        Console.WriteLine(defragmentInfo)
    End Sub
End Class
DefragmentationExample.vb: Defragmentation listener implementation
DefragmentConfig config = new DefragmentConfig("database.db4o");
Defragment.Defrag(config, new DefragmentListener());
DefragmentationExample.cs: Use a defragmentation listener
Dim config As New DefragmentConfig("database.db4o")
Defragment.Defrag(config, New DefragmentListener())
DefragmentationExample.vb: Use a defragmentation listener
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/0000755000175000017500000000000011520622616031076 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/commit_frequency.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/commit_freque0000644000175000017500000001160511520622610033655 0ustar directhexdirecthex Commit Frequency
You are here: Advanced Features > Defragment > Defragmentation Configuration > Commit Frequency

Commit Frequency

The defragmentation system uses db4o's transactional core to write the data to the new defragmented file. For large databases managing a long transaction can become an issue and can slow down the defragmentation. Therefore you can set a commit frequency. This means after the set number of processed objects the transaction is committed on the new file.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.ObjectCommitFrequency(10000);

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Set the commit frequency
Dim config As New DefragmentConfig("database.db4o")
config.ObjectCommitFrequency(10000)

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Set the commit frequency
././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/database_configuration.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/database_conf0000644000175000017500000001252111520622606033572 0ustar directhexdirecthex Database Configuration
You are here: Advanced Features > Defragment > Defragmentation Configuration > Database Configuration

Database Configuration

Perhaps you're using low level configuration settings which are file-related. In such cases it's recommended to use the database configuration for the defragmentation process. Especially settings like string-encoding and block-size need to be configured properly for the defragmentation.

DefragmentConfig config = new DefragmentConfig("database.db4o");
// It's best to use the very same configuration you use for the regular database
IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
config.Db4oConfig(configuration);

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Use the database-configuration
Dim config As New DefragmentConfig("database.db4o")
' It's best to use the very same configuration you use for the regular database
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
config.Db4oConfig(configuration)

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Use the database-configuration
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/id_mapping.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/id_mapping.ht0000644000175000017500000001206711520622606033547 0ustar directhexdirecthex Configure IDMapping
You are here: Advanced Features > Defragment > Defragmentation Configuration > Configure IDMapping

Configure IDMapping

When you defragment a database each object is stored at a new location. To keep track which old id maps the which new location a IDMapper is uses. You can change the IDMapper or even implement your own.

By default the InMemoryIdMapping is uses, which is the fastest version, but consumes the most memory. As alterative there's the DatabaseIdMapping available, which stores mapping in a file and therefore uses less memory.

IIdMapping mapping = new InMemoryIdMapping();
DefragmentConfig config = new DefragmentConfig("database.db4o", "database.db4o.back", mapping);

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Choose a id mapping system
Dim mapping As IIdMapping = New InMemoryIdMapping()
Dim config As New DefragmentConfig("database.db4o", "database.db4o.back", mapping)

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Choose a id mapping system
././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/class_filter.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/class_filter.0000644000175000017500000001175011520622616033555 0ustar directhexdirecthex Class Filter

Class Filter

db4o stores meta data about all classes used in the database . Even when the class doesn't exist anymore the meta-data in db4o is still there. The class filter allows you to remove class-meta data from the defragmented database. You can pass you own implementation of a class filter. Or you can use the built in AvailableTypeFilter. This filter removes all meta-data of classes which aren't present anymore.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.StoredClassFilter(new AvailableTypeFilter());

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Use class filter
Dim config As New DefragmentConfig("database.db4o")
config.StoredClassFilter(New AvailableTypeFilter())

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Use class filter
././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/disable_read_only.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/disable_read_0000644000175000017500000001121611520622616033557 0ustar directhexdirecthex Disable Read Only Mode
You are here: Advanced Features > Defragment > Defragmentation Configuration > Disable Read Only Mode

Disable Read Only Mode

By default the back-up database is opened in read only mode. You can disable the read only mode if you want.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.ReadOnly(false);

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Disable readonly on backup
Dim config As New DefragmentConfig("database.db4o")
config.[ReadOnly](False)

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Disable readonly on backup
././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/upgrade_db.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/upgrade_db.ht0000644000175000017500000001140311520622606033525 0ustar directhexdirecthex Upgrade Database File
You are here: Advanced Features > Defragment > Defragmentation Configuration > Upgrade Database File

Upgrade Database File

This option will upgrade first the database file format and then defragment it. You need to specify a folder where the temporary data for this process is stored.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.UpgradeFile(Environment.GetEnvironmentVariable("TEMP"));

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Upgrade database version
Dim config As New DefragmentConfig("database.db4o")
config.UpgradeFile(Environment.GetEnvironmentVariable("TEMP"))

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Upgrade database version
././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/delete_backup.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/delete_backup0000644000175000017500000001144211520622616033612 0ustar directhexdirecthex Delete The Backup
You are here: Advanced Features > Defragment > Defragmentation Configuration > Delete The Backup

Delete The Backup

The defragmentation process copies the data from the old database to a new file. The old file is left as a backup. You can force the defragmentation process to delete the backup after a successful defragmenting.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.ForceBackupDelete(true);

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Delete the backup after the defragmentation process
Dim config As New DefragmentConfig("database.db4o")
config.ForceBackupDelete(True)

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Delete the backup after the defragmentation process
././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/storage_backupdb.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/storage_backu0000644000175000017500000001202211520622610033621 0ustar directhexdirecthex Configure Storage for Backup File
You are here: Advanced Features > Defragment > Defragmentation Configuration > Configure Storage for Backup File

Configure Storage for Backup File

By default the defragmentation process uses the storage from the db4o configuration for both database files, the backup and the new defragmented database file. If you want to have different storage implementations you can specify a different storage for the backup-file. This way the new defragmented database-file uses the storage from the database-configuration and the backup-file uses the back-up storage.

DefragmentConfig config = new DefragmentConfig("database.db4o");
config.BackupStorage(new FileStorage());

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Use a separate storage for the backup
Dim config As New DefragmentConfig("database.db4o")
config.BackupStorage(New FileStorage())

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Use a separate storage for the backup
././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/database_files.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/defragment/configuration/database_file0000644000175000017500000001443411520622610033564 0ustar directhexdirecthex Original Database And Backup
You are here: Advanced Features > Defragment > Defragmentation Configuration > Original Database And Backup

Original Database And Backup

The database-file which needs to be defragmented is specified in the configuration. The first constructor parameter is the database file.

DefragmentConfig config = new DefragmentConfig("database.db4o");

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Configure the file
Dim config As New DefragmentConfig("database.db4o")

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Configure the file

The defragmentation process creates a backup of the old database. By default the back-up file has the name of the original database-file with an additional '.backup'-suffix. You can explicitly specify the backup file name with the second constructor parameter.

DefragmentConfig config = new DefragmentConfig("database.db4o", "database.db4o.back");

Defragment.Defrag(config);
DefragmentationConfigurationExamples.cs: Configure the file and backup file
Dim config As New DefragmentConfig("database.db4o", "database.db4o.back")

Defragment.Defrag(config)
DefragmentationConfigurationExamples.vb: Configure the file and backup file
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_meta-information.htm0000644000175000017500000002456111520622610031010 0ustar directhexdirecthex db4o Meta-Information
You are here: Advanced Features > db4o Meta-Information

db4o Meta-Information

Db4o meta information API provides an access to the actual structure of db4o database file. Its primary use is refactoring.

You can access the meta information via extended object container. You can ask the object container for all stored classes or for a specific class. To find the meta information for a specific class you can provide the full name, the class itself or an instance of a particular type.

Note that db4o also returns information about internal db4o instances which have been stored.

// Get the information about all stored classes.
IStoredClass[] classesInDB = container.Ext().StoredClasses();
foreach (IStoredClass storedClass in classesInDB)
{
    Console.WriteLine(storedClass.GetName());
}

// Information for a certain class
IStoredClass metaInfo = container.Ext().StoredClass(typeof (Person));
MetaInfoExample.cs: All stored classes
' Get the information about all stored classes.
Dim classesInDB As IStoredClass() = container.Ext().StoredClasses()
For Each storedClass As IStoredClass In classesInDB
    Console.WriteLine(storedClass.GetName())
Next

' Information for a certain class
Dim metaInfo As IStoredClass = container.Ext().StoredClass(GetType(Person))
MetaInfoExample.vb: All stored classes

The stored class interface provides all meta information db4o knows about. You can get the name of the class, ask for the instance count, ask for a list of the ids and get the meta info for super classes.

The most important information about the stored classes meta info is the list of the field which are stored. You can get a list of all fields or ask for specific fields. Note that the meta information might return information for fields which don't exist anymore. This is useful for refactoring.

IStoredClass metaInfoForPerson = container.Ext().StoredClass(typeof (Person));
// Access all existing fields
foreach (IStoredField field in metaInfoForPerson.GetStoredFields())
{
    Console.WriteLine("Field: " + field.GetName());
}
// Accessing the field 'name' of any type.
IStoredField nameField = metaInfoForPerson.StoredField("name", null);
// Accessing the string field 'name'. Important if this field had another time in previous
// versions of the class model
IStoredField ageField = metaInfoForPerson.StoredField("age", typeof (int));

// Check if the field is indexed
bool isAgeFieldIndexed = ageField.HasIndex();

// Get the type of the field
String fieldType = ageField.GetStoredType().GetName();
MetaInfoExample.cs: Accessing stored fields
Dim metaInfoForPerson As IStoredClass = container.Ext().StoredClass(GetType(Person))
' Access all existing fields
For Each field As IStoredField In metaInfoForPerson.GetStoredFields()
    Console.WriteLine("Field: " & field.GetName())
Next
' Accessing the field 'name' of any type.
Dim nameField As IStoredField = metaInfoForPerson.StoredField("name", Nothing)
' Accessing the string field 'name'. Important if this field had another time in previous
' versions of the class model
Dim ageField As IStoredField = metaInfoForPerson.StoredField("age", GetType(Integer))

' Check if the field is indexed
Dim isAgeFieldIndexed As Boolean = ageField.HasIndex()

' Get the type of the field
Dim fieldType As String = ageField.GetStoredType().GetName()
MetaInfoExample.vb: Accessing stored fields

On a the field meta information you can find out the name, type and if the field has an index. And you also can access the values of a object via the stored field. This allows you to access information which is stored in the database but has been removed from the class model. This is useful for refactoring.

IStoredClass metaForPerson = container.Ext().StoredClass(typeof (Person));
IStoredField metaNameField = metaForPerson.StoredField("name", null);

IList<Person> persons = container.Query<Person>();
foreach (Person person in persons)
{
    string name = (string) metaNameField.Get(person);
    Console.WriteLine("Name is " + name);
}
MetaInfoExample.cs: Access via meta data
Dim metaForPerson As IStoredClass = container.Ext().StoredClass(GetType(Person))
Dim metaNameField As IStoredField = metaForPerson.StoredField("name", Nothing)

Dim persons As IList(Of Person) = container.Query(Of Person)()
For Each person As Person In persons
    Dim name As String = DirectCast(metaNameField.Get(person), [String])
    Console.WriteLine("Name is " & name)
MetaInfoExample.vb: Access via meta data
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/unique_constraints.htm0000644000175000017500000001556211520622610030565 0ustar directhexdirecthex Unique Constraints
You are here: Advanced Features > Unique Constraints

Unique Constraints

Unique constraints allow a user to define a field to be unique across all the objects of a particular class stored to db4o. This means that you cannot save an object where a previously committed object has the same field value for fields marked as unique. A Unique Constraint is checked at commit-time and a constraint violation will cause a UniqueFieldValueConstraintViolationException to be thrown. This functionality is based on Commit-Time Callbacks feature.

How To Use Unique Constraints

First you need to add an index on the field which should be unique. After that you add the UniqueFieldValueConstraint to the configuration for the unique field.

configuration.Common.ObjectClass(typeof (UniqueId)).ObjectField("id").Indexed(true);
configuration.Common.Add(new UniqueFieldValueConstraint(typeof (UniqueId), "id"));
UniqueConstrainExample.cs: Add the index the field and then the unique constrain
configuration.Common.ObjectClass(GetType(UniqueId)).ObjectField("id").Indexed(True)
configuration.Common.Add(New UniqueFieldValueConstraint(GetType(UniqueId), "id"))
UniqueConstrainExample.vb: Add the index the field and then the unique constrain

After that, the unique constrain is applied. When you commit a transaction the uniqueness of the field is checked. If there's any violation, the UniqueFieldValueConstraintViolationException will be thrown.

container.Store(new UniqueId(42));
container.Store(new UniqueId(42));
try
{
    container.Commit();
}
catch (UniqueFieldValueConstraintViolationException e)
{
    Console.Out.WriteLine(e.StackTrace);
}
UniqueConstrainExample.cs: Violating the constrain throws an exception
container.Store(New UniqueId(42))
container.Store(New UniqueId(42))
Try
    container.Commit()
Catch e As UniqueFieldValueConstraintViolationException
    Console.Out.WriteLine(e.StackTrace)
End Try
UniqueConstrainExample.vb: Violating the constrain throws an exception
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/0000755000175000017500000000000011520622614026272 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/exceptionsjava.zip0000644000175000017500000000147011520622606032044 0ustar directhexdirecthexPKEt7 ExceptionExample.javaU]k0}N ''`[B]8FQ[,&v؍> qG0UŃiFNxZ eAFT|ʲ)UA`GXXWLA"+79^xwS%qV]1bKf QYv|q 5[&xS*}B$J[l KqV?^!F #e W.珷3@ 5`IoeGU$qA[P?%k֖Q&a([A8؊W% \XZ+EiO=Po_74?pGdP0q,/C\usPnhplw+16Pis ڐ?Dsxu٠uT[zivmTlaUO?OOc% A)noYΛ&ys[ҌDO׍$o^ug>v2/PK(Et7 $ ExceptionExample.java p i@{i@{i@PKgdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/exceptionsvb.zip0000644000175000017500000000141311520622614031526 0ustar directhexdirecthexPK 7V_ExceptionExample.vbVM0_ԻBI [gYjdHJj87l^K{3oDϺۿ}{";:N˅M}͘w頑3s-Uo5N5sMZǒ=w^ueY؎\6@a+_UyS(PnRg [ePJ VR)pBCae)gDWÉۆ` L ,k,qIQ&k5ک^kok SB@sAɬI o73ntFwzVH5X] TT:d(E!zٙM3F~A_k!r4|kDiGv7PK( 7V_$ ExceptionExample.vb CMTLCTLCPKedb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/exceptionscs.zip0000644000175000017500000000141311520622610031520 0ustar directhexdirecthexPKخ78p3_U ExceptionExample.csUM0/? >%KjPhɻnJ4Ȓ&넲d|5)-{X̛yykHM2/ޏF7.|>nL99hCAT}L`):]͝9|]:r]ƓG޻t|d?[PҬDW1pı"i]]\1`c[RV.aTV>3BKȮ9| "S96F My$HFl&u ;0V0&M)QhAd>c˘`܅,N9`TIԴgz2v|y& nYw [̪=]JP$njKئ;8ol3XrI}i($5q?s,ߣ:of@ܡ@c SO%|_AwV&oи[xKaU$g5<>?`r ,2gdF;'"ͭඤ.Zo(0!" ! ]bƊ<y_ 1,˶'D57/si Δ'y6NMY%\C(j[Bi*5S?GRBVPK(خ78p3_U $ ExceptionExample.cs sQDbCDbCPKe././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/how_to_work_with_db4o_exceptions.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/how_to_work_with_db4o_excep0000644000175000017500000002163611520622606033716 0ustar directhexdirecthex How To Work With db4o Exceptions
You are here: Advanced Features > Exception Handling > How To Work With db4o Exceptions

How To Work With db4o Exceptions

Appropriate exception handling will help you to create easy to support systems, saving your time and efforts in the future. The following hints identify important places for exception handling. Take also a look at the list of common db4o exceptions.

  1. Opening a database file can throw a DatabaseFileLockedException.

    try
    {
        IObjectContainer container = Db4oEmbedded.OpenFile("database.db4o");
    }
    catch (DatabaseFileLockedException e)
    {
        // Database is already open!
        // Use another database-file or handle this case gracefully
    }
    ImportantExceptionCases.cs: If the database is already open
    Try
        Dim container As IObjectContainer = Db4oEmbedded.OpenFile("database.db4o")
    Catch e As DatabaseFileLockedException
        ' Database is already open!
        ' Use another database-file or handle this case gracefully
    End Try
    ImportantExceptionCases.vb: If the database is already open
  2. Opening a client connection can throw IOException.

    try
    {
        IObjectContainer container = Db4oClientServer.OpenClient("localhost", 1337, "sa", "sa");
    }
    catch (Db4oIOException e)
    {
        // Couldn't connect to the server.
        // Ask for new connection-settings or handle this case gracefully
    }
    ImportantExceptionCases.cs: Cannot connect to the server
    Try
        Dim container As IObjectContainer = Db4oClientServer.OpenClient("localhost", 1337, "sa", "sa")
    Catch e As Db4oIOException
        ' Couldn't connect to the server.
        ' Ask for new connection-settings or handle this case gracefully
    End Try
    ImportantExceptionCases.vb: Cannot connect to the server
  3. Working with db4o-unique constraints the commit may throw exceptions when the constraints are violated.

    container.Store(new UniqueId(42));
    container.Store(new UniqueId(42));
    try
    {
        container.Commit();
    }
    catch (UniqueFieldValueConstraintViolationException e)
    {
        // Violated the unique-constraint!
        // Retry with a new value or handle this gracefully
        container.Rollback();
    }
    ImportantExceptionCases.cs: Violation of the unique constraint
    container.Store(New UniqueId(42))
    container.Store(New UniqueId(42))
    Try
        container.Commit()
    Catch e As UniqueFieldValueConstraintViolationException
        ' Violated the unique-constraint!
        ' Retry with a new value or handle this gracefully
        container.Rollback()
    End Try
    ImportantExceptionCases.vb: Violation of the unique constraint
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions/exception_types.htm0000644000175000017500000001452511520622614032235 0ustar directhexdirecthex Exception Types
You are here: Advanced Features > Exception Handling > Exception Types

Exception Types

Using db4o you will have to deal with db4o-specific exceptions and system exceptions thrown directly out of db4o.

db4o-exceptions are chained; you can get the cause of the exception using:

c#:

db4oException.Source;

VB:

db4oException.Source;

In order to see all db4o-specific exceptions you can examine the hierarchy of Db4oException class. Currently the following exceptions are available:

Db4oException - db4o exception wrapper: Exceptions occurring during internal processing will be proliferated to the client calling code encapsulated in an exception of this type.

BackupInProgressException - An exception to be thrown when another process is already busy with the backup.

ConstraintViolationException - Base class for all constraint violations.

UniqueFieldValueConstraintViolationException - An exception which will be thrown when the unique constrain is violated.

DatabaseClosedException - An exception to be thrown when the database was closed or failed to open.

DatabaseFileLockedException - This exception is thrown during any of db4o open calls if the database file is locked by another process.

DatabaseMaximumSizeReachedException - This exception is thrown if the database size is bigger than possible. See "Increasing The Maximum Database File Size"

DatabaseReadOnlyException - This exception is thrown when a write operation was attempted on a database in read-only mode.

GlobalOnlyConfigException - This exception is thrown when you try to change a setting on a open object container, but this setting cannot be changed at runtime.

IncompatibleFileFormatException - An exception to be thrown when an open operation is attempted on a file(database), which format is incompatible with the current version of db4o.

InvalidIDException - an exception to be thrown when an ID format supplied to #bind or #getById methods is incorrect.

InvalidPasswordException - This exception is thrown when a client tries to connect to a server with the wrong password.

EventException - This exception is thrown when a exception is thrown in a event callback.

OldFormatException - An exception to be thrown when an old file format was detected and the file could not be open.

ReflectException - An exception to be thrown when a class can not be stored or instantiated by current db4o reflector.

ReplicationConflictException - an exception to be thrown when a conflict occurs and no ReplicationEventListener is specified.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution.htm0000644000175000017500000001110011520622616033367 0ustar directhexdirecthex Refactoring and Schema Evolution
You are here: Advanced Features > Refactoring and Schema Evolution

Refactoring and Schema Evolution

Application design is a volatile thing: it changes from version to version, from one customer implementation to another. The database changes together with the application. For relational databases this process is called Schema Evolution, for object databases the term Refactoring is used as more appropriate.

Object database refactoring changes the shape of classes stored on the disk. The main challenge here is to preserve old object information and make it usable with the new classes' design.

Simple cases like adding or removing a field and changing interfaces are handled automatically. See "Automatic Refactoring"

For renaming classes and fields you can use the renaming API. See "Renaming API".

You can change the type of a field any time. However db4o won't migrate the data to the new type. You need to do this explicitly. See "Field Type Change" And there are some small limitations when refactoring the field-type. See "Field Refactoring Limitation"

Unfortunatly db4o doesn't support changing the inheritance hierarchy. See "Refactoring Class Hierarchy"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/0000755000175000017500000000000011520622616032664 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoringvb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000000731211520622610033664 0ustar directhexdirecthexPK '~7 newclasses/PK'7"Wnewclasses/Identity.vbuR]k0|7?,y9R'w @rV"_F"5xYu|ǣeCb5^J(_P7jޯT4@8DdgWn- y˾ dIlؠ4"*ES':00G w;@.ayt^9Jнj_C zpRHL ;#Bg >ɋoZyf݉AYh nQ-^"{jL;!#a(Ǎ=y :nJt=i&s;OU_ ZU% ԭ(_5n6EE5%`CTfm n eKź |,+fK )e]CKK^{N$!|}$<ԐXx6zd c{|rsy|6IOQ'&"RGwyd$C_e Ffgl: 15i˴x!ī_7 x;=PK'7Ғ< PilotNew.vbuAk@KP`m-^TZ6na31w$nڹd7޷ao`J p?~ G*BN9%`G=eYFVڃ-q|d?'Zq*8LSt80B JT$ P4pGE{?Mw4βuOll9ڬ_Z#K2]T8ϛ ve[H݆5R#NXΚmWX0+$'${FA8< w^߱_vڬk;{xy^ PKi~7Gc+#,`RefactoringExample.vbW]O;}0ڗl\C+ $"]MPX9I^gxz!uvqu-!יiAҥә0jS~}Tal2%11b`$bao*mUn˭gE*iSzytxtsR2V1FiX(.IC$ySSGfH࣍!@5&15qc#" /Y.9Zԑu%}?"06F!'&`VmГD3^nod.=bq7@>❐H^h(^&4H6:ޘ'ߎqvʗ-@EDPeŶ 4GEDd]h0$sUb)D^. ^XڅyO="C)EOF\,rw &\rEbhL{9W{.Ph~!(a| J1&Fo[[vt4{Pc yp;g86^}0VkrMDQ.#o$_s?ɿPK( '~7 $newclasses/ GGTCPK('7"W$ )newclasses/Identity.vb /MTCTCPK('7-/$ newclasses/Pilot.vb W1MTCTCPK('~7L $ newclasses/RefactoringExample.vb TGDtGDTCPK('7@m$ Pilot.vb 8MTTCTTCPK('7Ғ< $ 6PilotNew.vb S7M$TC$TCPK(i~7Gc+#,`$ RefactoringExample.vb d cGT cGPTCPK ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/field_refactoring_limitation.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/field0000644000175000017500000001465211520622606033701 0ustar directhexdirecthex Field Refactoring Limitation
You are here: Advanced Features > Refactoring And Schema Evolution > Field Refactoring Limitation

Field Refactoring Limitation

For most cases changing the field type isn't an issue. db4o keeps the old values around and you can access the old values without issues. See "Field Type Change"

However there's one limitation to this mechanism. You cannot change the type of a field to its array-type and vice versa. This only applies if it's the same array-type. For example:

  • You cannot change a string field to a string array field and vice versa.
  • You can change a string field to an int-, object-, etc array. Every type is possible except a string-array.
  • You can change a string-array to an int-, object etc. Every type is possible except a string.

Refactoring To An Array-Field Step by Step

When you change the type of a field to its array-type equivalent, you can do this only by copying the old data to a new class. In this example we have a Person-class which has its name in a string field. Now we want to change that to a string array to support multiple names.

  1. Create a copy of the Person-class with a new name.
  2. Do the refactoring on the new Person class
  3. Query for old instances of the old Person-class and copy the values over to the new class.
IList<PersonOld> oldPersons = container.Query<PersonOld>();
foreach (PersonOld old in oldPersons)
{
    PersonNew newPerson = new PersonNew();
    newPerson.Name = new string[] {old.Name};
    container.Store(newPerson);
    container.Delete(old);
}
ChangeArrayType.cs: Copy the string-field to the new string-array field
Dim oldPersons As IList(Of PersonOld) = container.Query(Of PersonOld)()
For Each old As PersonOld In oldPersons
    Dim newPerson As New PersonNew()
    newPerson.Name = New String() {old.Name}
    container.Store(newPerson)
    container.Delete(old)
Next
ChangeArrayType.vb: Copy the string-field to the new string-array field

Note that this example doesn't change existing references from the old instances to the new ones. You need to do this manually as well.

././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoringcs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000000664511520622606033701 0ustar directhexdirecthexPK ~7 newclasses/PKݮ7QA[newclasses/Identity.csmk0ƟSpI( 6(i 5\+_u0Pﻘ!ɨbOe1<,KGwKAIֵ'jҴm[%.ut:Ee̵o-$ioJa-<+{α&E'k: Bg>erJ']屷 ͝;$3;2t0h@a"mA_EyQ>1*nCpۡ,UJP4;/.,I=PKݮ7~ޥnewclasses/Pilot.cs]PMK0=0" z"]FIH-Zy͛Bm#( v{ޞ?PQQ:"w_U4 VEn qU3KEkӊNu/CPEkk{Ksy=JB86hH䁡\9LGF" ȓ4㉲Eْfi&gNj8(!%.vDuoW2>G7PK~7f newclasses/RefactoringExample.csT]k0}v '2 ,MG`k&lc UN4ɕ&fO_q쒎-܏st=:,kdo/..፻å|h F`cLy5v;R-JsE nd6o"7 qD_MPկf{cs[%eb%ǜ2# wTk~/)3`.nmJJşA`Rhڨ[^%1 sT(zR+,BjI|\djJ=WrDq>\B[说P賻F"9:dGH,_)[/[_m=u44̂mpK'*VzN /fs_ur8+`n:D}5dRH'<;|;(9KO5;1¶ʟQ"2ݛl@ZKy "bGҲ@Mq-@pدҡe K1k[ t>ױl<*g$8!D~ޒ0La~@%㌏%yF!;PܹPXG2# 60%lYcj%JC *?w0[0Y ZfA_\t؛9;$\Т3ԝ IPKݮ7nF Pilot.cseJ0-]tA^wIӱtL[D|w3,Q!t?=yTպ%UOJpw!Q ߤ"ggvnG@{xԣBf^$!xb7r[Elh^D_EԄbCݔ,]B|5,rSc fAt{yI.o w7oPKݮ7OxH  PilotNew.cs]Qk0>iqэ`eOhl&!AB{MT#BK!7pgGʍ,E{A Su]GDlaE(ZfTA b}梎> u*N61oV 8 x.E.JquM+/;Z?kvηq-: Qh{# ?ſ_XLg(-K~K& y-0^* ut PKW~7o1H RefactoringExample.csV[o0~(OcMi;!F0M18hvr!m"9N%xA>>d|(ƿ0W*:VoD> 8[I nֱI^oWζ|o^ZK-NGb]g"?)JHn9Q28,r"B b%s ,+JDN&hkQv'. ^O rwXN$XLs!ĸLL SЈ<sNe+Sd00{ +\F!~e0bn% FL `ty|e2C!*dgqI QȞiqjZrcDɵ> M@dqvsGy DJF"Ϥ}x658CdA+6))$ 1l 96<@v5-7uTqDSԳY K 0:Y#mz׭}>7FǨwnnjskh~5C42 t 1XDʆZQ˾*~F\܇OY?Ow8v\{Sp⹷[e䊩NmTe\~T>~D2Z^N*%%'?GmC<}B%|Q/׉"-ֿPK( ~7 $newclasses/ }G}GgCPK(ݮ7QA[$ )newclasses/Identity.cs c&QgCgCPK(ݮ7~ޥ$ unewclasses/Pilot.cs S%QāgCāgCPK(~7f $ newclasses/RefactoringExample.cs @qGqGgCPK(ݮ7nF $ hPilot.cs Ó+Q$NhC$NhCPK(ݮ7OxH  $ qPilotNew.cs c*QhChCPK(W~7o1H $ RefactoringExample.cs DGPG4GPGchCPK ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/inheritance-refactoring.vsddb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/inher0000644000175000017500000050200011520622616033711 0ustar directhexdirecthexࡱ> Root EntryRoot EntryF0?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~VisioInformation" ՜.+,D՜.+,P `ht   Grizli777 Iheritance-ExampleiAdding ClassampRemove ClassampGeneralization ArrowreDynamic Connectorow NavigablennSharedl CompositennComposite NavigableShared Navigablele QualifierigShared QualifierleComposite Qualifier Composite Navigable QualifierffShared Navigable QualifiereNavigable QualifierProcedure CallfAsynchronous Flowr Flat Flowusrealize_subshaperWatermark TitleLeft AsynchronousrUMLClasssyGeneralizationu45 degree singlerNotegre ConstraintiNote.28 PagesMasters0|_PID_LINKBASE_VPID_ALTERNATENAMES _TemplateIDATC010498511033Oh+'08& `ht (GamlorDc:\program files (x86)\microsoft office\office12\1033\UMLMOD_M.VSTGamlorMicrosoft Visio@CaCy>CCC?C].B?C].BC?Cy>Cw*C].Bw*C].B?C@$$==_888% % W0%u u u % % $$AA( FEMF+*@$BB].Bw*C@4(*>VERDANA6@|pPrimate>'> ?'>@?'>e.?'>[?'> x?'>?'>??   RpVerdanarotq875 xro4X2^.ww8r:.ww63 "r-DT! @i X2D`ptX2iilY2+iH>3 5 fZ!KLr(D dv% TxP@ B BPL\PrimateO  % F@4EMF++@ @$].BB?nCA$$==% % V0'_quu   u% % $$AAFEMF+@@4?@H<].B1Bع=C1Bع=CB].BB].B1B@$$==_888% % V0%^su   uu % % $$AA( F4(EMF+ @$].BBB?nCA$$==% % V0'O`uu  u% % $$AAFEMF+@@4?@H<].BBع=CBع=CBB].BBB].BB@$$==_888% % V0%Mbu  uu% % $$AA( F4(EMF+ @$].BYdB?nCA$$==% % V0'9Ouu  u% % $$AAFEMF+@@4?@H<].BBBع=CBBع=CYdB].BYdB].BBB@$$==_888% % W0%7Qu  uu% % $$AA( FEMF+*@$BB].BYdB6@pdMammal>'> ?'>Z(?'>@U?'>R?'>?'>??   % TpM:K@ B BMILXMammal  % F@4EMF++@ @$].B~C[.CA$$==% % V0';Luu  u% % $$AAFEMF+@@4?@H<].BCy>CCy>C~C].B~C].BC@$$==_888% % V0%9Nu  uu% % $$AA( F4(EMF+ @$].BC[.C A$$==% % V0'*;uu  u% % $$AAFEMF+@@4?@H<].B~Cy>C~Cy>CC].BC].B~C@$$==_888% % V0%(=u  uu% % $$AA( F4(EMF+ @$].Bv&C[.CA$$==% % V0'+uEu  EuE% % $$AAFEMF+@@4?@H<].BCy>CCy>Cv&C].Bv&C].BC@$$==_888% % W0%,u  EuEu% % $$AA( FEMF+*@$BB].Bv&C6@h\Human>'>@8?'>6?'>@c?'>!?'>??   % TlS&@ B BS$LXHumanq  % FEMF++@ @@4?@, BmCBv&C@$$==_888% % W$qu//E% % $$AA( F\PEMF+@<0BmCBmCBaCBmC@$$==%  % V,k{/%  % $$AAF`TEMF+@@4u?@$$==_888% % V,j|/% % $$AA( FEMF+@@4?@<0oB1BoBBBBBw*C@$$==_888% % W,pzu))// % % $$AA( F\PEMF+@<0oB1BoB1BoB1BoB1B@$$==%  % V,kp{}) %  % $$AAF`TEMF+@@4u?@$$==_888% % V,io|) % % $$AA( Ld&8M&8)??" FEMF+@       !"#$%&'()*+,-./0123456789:;<=>?@Visio (TM) Drawing BHP=ANRa ua f2cvwua ua f2 wmua @g29Limx !fffMMM333?BUML ackgro_undAd- n/}CD=1BUML ackground]Ad- n/CD=2)/T(?C/TgCC/\Pa/Pa/Pa/LPa/Pa/Pa/S@#B:Wa_ReUeUUeUeUeUeUePONODS`_ReUeUUeUeUeUeUeUUbK SR;Ʉ5OM%>Qiq;RTRRggRqh>Qj4 /FA^F' %p3|bFp#| | | vi?A=Os<34Ux,,,/RQmeY q]U@QvovL__q____OO_OOY A`,X@L&d2%?ɖQ3Ҩ sUΡ̦xΟ$H")ʼ Dͥ*@dUA??ϟJ[D!# f:45ŧ5ŷ5ŧ 0H 0D$# U   Q#Wb ;Ce߿JB (0., <%iP fT,Wހ'0΢U,ܮ50 f[OmOC%ߑE#PHZ  泴,U345&6&9FaajUu 8,W8?m!%3=Tܯw???8t"5UR^ L-ak-$.uiRHepXDbT !cp/pN0-Xhd,A(,AT%5.D#E,ah-50zG#zpvXb+ aS(GmcmQP#<(0Z?84?6LpL !]oO_Ye /K_//A/Lb%N$dG\NsY%//////?#?5?G?Ok?}?-R:_obeiw_Z-X0fEG/U* ___ l1z 52qp?v ??vD*U/oZ_l_O/a&gDjA)Vhzm:id2(;o:2bWoio{ooo?pԟ1b6ӬC V@ PyTTl(iO{Org ^TEPJJOO5rRV^]Yx____%&8m=&dO贁Nk4cnY3[֋6ftΑEѹ kJgJ\n(b!'þݿ3xoϕϧ 2D&ޏiQ@Ug8י,@M#5GYk2VhPp ͟ߟbqa5oo([, j)n!ѹ?@a/+8 HNe{q%#z9`ޮ/,>䥖 9@A21e,9`Y4r` Ac0entCokl0rz9`9`bbbͱ#.6!m54Z1 /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^gUS#u %U13 VGcGic]WRNJ Jfmb?DzG(\?z??HDB D# ?hZ >TEI U@??@ĸ?]P6 >-u`aW? Su# SbHN N*J}5 `?Copy_rigTt`(c)`2U06`McosfrԦain}.` AlU seev d `l>,>Uh9 #H@ Wa"% bJ*!K 9 8:"   6MB/>//_5&5365O? g?D&5v%27?%rAH2CdH=-\ 4 )FW& #RKB ~ bV@ebo+Rao=aܬW oP_V # $%'&4'A(N)[ *h +u ,-U./U012U34U79UGSeJK+T8UFDfP h> /T6D } UI???J3P S'666== bb ^aȅHUд\?Ke^ %UGu ? ?????GXFFflGYUQ DhRepursnt asocito: btwu )ocl ifes.bԿ?m:mԿ8?>?>? UG HD # 3h@>TB(E=J AUa?kP6 u{` ?A_M u#u /u`!MHbwSu J fB{R.2JAaAK!a)% bJ J"?"I/KYM#T'}->U2N贁N{?<#2rnd"#!"?𓎾&&v&Bk; C"; !92?6"2?; .4602]?o;T#?$@&7c#2a4#k4%E $AѸ#5 `UML BackgrounudPA$Pd-P}n` /C PD=10DP1!y#s'I4]RCVCsVDCV CVCV"aA%?S@b*D V VQi#J78:?AlaĿo@qt`?smIg @X"FL/A-_!S!ab g92r!0;A3b?!1,]R / s4]Rru$y2Kx@1Rظ#ЪqAG;v`?]CPpyPiPWhtP(P)PU2DR6PMpcR%sPfrqrp api0R.P'Ql' xs+epePv=dIQ`Vps_1BP2cTm!#tEQ< e>levE q ʄ%ل䋫5ل  3لɨ8FaP!pg"b$Rb! "r9l1Uh]Q)3q.a918T&&rr-TsJ A4q#@gK Ac?(P4C?wQ9FaC# gc#sVVYcmx(jsVV1&& r4#;!B#aCꡯ%[l!+w]RrWXɿۿ颫5 f?$6% ףp= V׏ϡϳYS#!g91 WV#xҚWVpheWMFaTA!!#X9191(GTAg¾?A-<qqA6#r! Q(-DT!p0@A?t092rcB83P|* `M4^s_}r_VUDBE;!^L5j2 @m(h_XbmXȴxEjad࿘-rq!3|@/ i|Ӏw2b]|/XEj7??/Qcu/SB_Xb_?XL/^/3Q7ReR *<0N q q-Am Ⱥ y+MKb6PYeepw"p.BBR __-_?W5JVU׵4rABjOOOF R_A+*_V|%d_b___VV_BRoooF=RSpapeX`i&#bOpORodovo@V]%_7]pEWiF)C%)Prqr3`&BV1g2D|?|OI6QQ^¥aa|"CC-BC!1vwj!D1qrѾѪяQȴ`8&A7@} ż9!DD2W MYiҐ xȳ$]|%-Y6P&l rwT@4^hޥrrr |״܁=-/F ˰.EMq 5mB1A$C!$ÿ1$þ 0 x bP-Ē52b 3ђ9@0|?" ρuv&`uj `Dޒ1@|ʥ0`uD0!/2`$h١ AۏP`N$x,]ȥaaD'i1֑|%wyT)&XfUx'0q?`!0)_ xIHD:  ;h ,>T  9 BAUAhf?A 3~@q?@IS?@P6 Bu`p   ۢ b bA)u,]uLA-4b .J z3h6> "& !m a9$YA * /ՄJQU5 }Kx(&""&'3ah) ,"?!;nhh 4;" L# b"U#BMIAM"gL#l6R"-4m0h#!!';`?CopyrigTt (c)0W20060M0]c0os0f2R1r0Aa0i0n.0 AUl"@ 8s&Be0e0v8@d@T$l(0@Uh%I 1'H6$4*:#A%A%A qJG4(\AXB@HiAb9 O9Uk$;W'01!05 ;VO6+"VV"HD # =h ,>T  9 CAUA23?Ahf~@q?@IS?@P6 B[u`p    b b_ASu#,uLRA-4b .lJ z3Q6VA "& ! a9$A * /JQU5 }Kx("E"&'3Xh)E Y"?!;hh r4M" bU#)6h#MIPAM"gL#c6 c1JBh#!!';`?CopyrigTt (c)020060M0c.0os0f21r01a0i0n.0 Al@ 8sBe0eJ0v%@d@T$l0@Uh%I 1'?6;"aU:#A%A%A J9PIAXB@H(*e 0AbE9 F9Uk$EW'01!05 EVF6+"VV"HD:  ;h ,>T  9 BAUA{af?A3@q?@I?@P6 Bu`p   ۢ b bA)u,]uLA-4b .J z3h6> "& !m a9$YA * /ՄJQU5 }Kx(&""&'3Xh) ,"?!;hb 4M" b"U#BMIAM"gL#c6R"$4d0h#!!';`?CopyrigTt (c)0W20060M0]c0os0f2R1r01a0i0n.0 AUl@ 8sBe0e0v/@d@T$l0@Uh!%I 1'?6;"a:#A%A%A J>4SAXBH@HiAb9 F9Uk$2W'01V!05 2VF6+"zVV"HD:  ;h ,>T  9 BAUA}3?Aaf@q?@I?P6 Bu֐`p    b bA@Su,uLRA-64b .lJ 6z36 V> "& !!a9$A * /JQU5 }Kx( $E"&'3Xh) Y"?!;hbˀ 64M" bEU#BM IAM"gL#c6R"($4d0h#!!';`?CopyrigTt (c)020060M0c0os0f21r01a0i0n.0 Al@ 8sBe*0e0v/@d@T$Ql0@Uh %I 1'?6;"Wa:#A%A% A J>4SAX"B@HiAAb9 F9xUk$2W'0X1!05 2VF6+"zVV"_0H߸-B\ | W}O F,R`#S9DT=Uabo-@+SWao-aG_ S`o:pgLp!dpT|pw&UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^ gUS#u\ N*  _'+<*9]b?HzG\(\33?UHLD t >jh: JTP5 QI>[U@?г?P >uA`bJ>u`em? >)5< <U{>`?CopyrigXtd(c)d206dMcosfrain.d Al seev d3 >`2lTJ$JUl 3 M w >a"a# z; @"?>Sb3")#N: #)-%A=/O/a/s///)<ڶ-4"/^' A/??*?<=_H=`\ ; _a)FV`)w#Q*AB ċOb+@ekooSa o3aW` /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^gUS#u ,  ,C}C ,X Y RH?+mbĿ?HzGſ Q?z??HDB D# ?hZ >TEI U@?Яĺ?P6 >u`a?j u#j bJHN NJ%}5 `?CopyrigTt`(c)`206`Mcosfrain.` Al seev d `l*>0>Uhh;!;!9 #@ a+"% ъJ*!" D 84y" 6MB//D*53:;&?U?/7?83N?8?}9z%2?%rTAHZB`CdH`\  )FX`-#]V.B} ԋb]@eko+^USa]:aY`&/PUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^gUS#u ,  ,C}C ,XUY RH?+bĿ?HzGſQ?z?3;?HD   3Ah$>T 3 A U@?г?A?P6 ku ` ?Mu M b,2 2>eJPPJAG7 ??  A,2񕣍5 `?CopyrigTt (c) 20" 6 M c. os f"!r A!a i n. Al\ (s`"e4 eJ vr dT `l>0>Uhh!! @i{w a"%50J!Z(J"PE hv2M>?[:(53;309?R?7 ??86A$O9%2&?85rTA,BCa,e H=\ 9 W)FZ`1#^Vj2[B bY]#@eko+TTa]Ba[`3UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUGu ,   , B-a mgX K ? +b.nĿ?< Tҿ57猴?Gz?_ގ3?UHLuD  >h: JT5 QI!MU@@ 3?K?P >tA` et"D a?怗U!!>ub>uU >c ܔXJ>U `?CopyrigXtd(c)d20& 6dM c oKs f" !r E!a i n.d Al` (sd"e8 e v"v dX lJ$JUl 3 M ! >a"a# ;@??>^ben!N::X23cC:z%A//////9T9 MEJU@??@ı.n?@?@?P6 .n>mJuM` ?"u` 5l Jb >5 J`?CopyrigTwt `c)W20 6M]cosfRr#!aiun Al> U sB"e evT d J`ԈJ8B-# ?9 e!e -MM=U'464A7l$>Uh E 9!@6 ("l7J??? Os@HD: # ;ih#$>T #3 A AU@ı.n?@ F%u?AA?UP t`  ?t#ŭA@#3Zn>uNT^u N b TJGU ?? TAB=!=!5 `?CopyrigTt(c)20 6Ml cj osd fr"c!rf !ar id n. Al j(s"e* ej v d )l> 0>Uhh@   #t[! WaM2S5S0J`A^dM ^pT/1 N6MB@y:?? 53;0 O?4GBI?eAwO2I/5)2y?5rARS_H߸F\ : _)*Ft\`5w#Y6qB Ob7@ek o+TaoRacboGT]`d9c\;7UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUGu ,   𻻰,K B-La mgX K ? +b.nĿ?< Tҿ8Hf,Y?Gz?(.3T[7ֿm4HNё\?UGD # T h(/TYTYU@nh?@?@ı.n^?@w?P} u` ?u`e h[ b)2 2.[Q[JPZd)`?CopyrigPwt \c)W20 6M]cosfRr!ain. AUl: s>"e evP d2 ) R`(B8-# V? e@!a-E ,UZH&124d=7HD: # ;ih#$>T #3 A AU@ı.n?@w?AA]?P t`  ?t# AK@#3cuNuj +b z> JGUG ? AbJB5 `?CopyrigTt(c)20 6Ml cj oKsd fr"c!rf !ar id n. Al j(s"e ej v" d l>0>Uhh #[!t@ aM2S5S0J`AŭBNTM Nj"  6MB@y:?^: 53;0 O?4GBI? UAwO2I/52y?5rARS#$UHLuD  >h: JT5 QI!MU@@ 3?K?P >tA` et"D a?怗U!!>ub>uU >c ܔXJ >U `?CopyrigXtd(c)d20& 6dM c oKs f" !r E!a i n.d Al` (sd"e8 e v"v dX lJ$JUl 3 M ! >a"a# ;@pqʼ?>^ben3RJ2!N::X23cC4t%A//////9<=n1+??7 gAQ?c?u??=_H=\ O _z*Fl^`D>w#R?qB bY]#@e ko+$Ua՗][aGL_W`]cA5cCUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^gUS#u , ;EWi{@+>Reprsnt asocito trbueo Kls8f#> wh vl1`rq6t atg6Fo/jc edch !cj .mb?HzG Q?z?T?HDB D# ?hZ >TEI U@?Я?P6 >[u`a^?Mu# bJEN NJ%}5 `?CopyrigTt`(c)`206`Mcosfrain.` Al seev dE `Dl>4>Uh;!;!9 #H@ Wa"% J*!? (x y&% 6MB<3/8/ 1.53>?W?i?.5??/??OO..5~%2DO;RrAHBCdHo\ ? W*F_,``B#PcG]B} d]}abY#@+Ua]9a oa`PUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^,gUG ?,  ; w HU}O ;rj \ N A+mbҿ?p= ףҿ Q?Gz??HD: # ;ih >TEI 'AU@?ҧ?P6 t`  rqo?t#TR w>u7jtu Y )b- JU5 K`?Copy_rigTt`(c)`2U0( 6`M c os f" !r G!a i n}.` Alb U (sf"e: e vx dZ l> 0>Uhh!!9 #j!@ aJ"% Ji`tz`t"j dm6MB9?Q?`53;.6??M?7?3?*HO9R%2?35rA*BCHD: # ;ih >TEI 'AU@M?U@UP6 t`  :8?t#q0 uTSu [ b >UJ-U5 `?CopyrigTt`(wc)`20( 6`M c o%s f" !r G!ua i n.`_ Alb (Usf"e: e vx dZ l> 4 >Uh  9 #!t@ a"% J` ?TZP`p "  q6MB(738?`8U?g153???J5? OO?/OFObOtO5%2O;rTARS#UGD # T h(/TYTYU@U?гҳw?P} 8fu` ?(u2;h b &U`?CopyrigPt \c) 20 6 M coKsf"r3!a in. AlN sR"e& evRd dF  `BR-# ?3e3a-dE UH:1F4Q7_H=:\ ! _+Fa` Kw#_8aKlB bSPL@e$kTo+UaXo;acocNGUb`PUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUGu ,  ; HUO ;rj \ N A+bҿGz?Q맿p= ףҿ43?? Q3?(\?UGD # T h(/TYTYU@?@{G?ҼQ?Pn} u{` ?u` K~h b)j2 28QZT[nJPZZnn4U`?CopyrigPwt \c) W20 6 M ]cosf"Rr3!a in. AUlN sR"e& evd dF ) R`(BJ-# &?e a-E , UZH:1F4nQ7HD: # ;ih#$>T #3 A 'AU@?ҫ?P t`  rqo?t#TR u;hiu] b1ʔ $-> +JGU ??& ARBG!G!5 O`?CopyrigTt(c)20 6Mv ct osn f|"m!rp !a| in n. Al t(s"e* et v d -$)l>0>Uhh #te! WaW2]5]0JJ`Khnd "  6MB?x:d53;6?O?>GLO3 OHOTEI 'AU@M?U@UP6 t`  :8?t#q0 uTSu [ b >e J-U5 `?CopyrigTt`(wc)`20( 6`M c o%s f" !r G!ua i n.`_ Alb (Usf"e: e vx dZ l>4 >Uh9 # !t@ a"% J` ?TZP`p "!  q6MB(738?`8U?g153???J5? OO?/OFObOtO5%2O;rTARS#_H߸\ # _V+Fc`R%TdShB,b1T@e4k5o+\Va9o]cGd`ol c@V"L cbXUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUG '  =@? M EMM k \ \U< J&bXtEݷѿ?<PڿT #3 A AU@ı.n?@]ڊ?AA?UP t`  ,PQ7?t#z#A@#3u NuY br z>  JGU ?? ]ATB=!=!5 `?CopyrigTt (c)t 20 6t Ml cj osd fr"c!rf !ar id n.t Al j(s"e* ej v d #$)l>0>Uhh #t[! WaM2S5S0jJ`Aŭ-NTMvNj`" K 6MB@y:?^:v53;0 O?4GBI?UAwO2IR/52y?5rA*RS$#UHLuD  >h: JT5 QI!MU@<@3??@ v?P >tA`  n&]<t"D a? !!>ubo>ueU R>c nXJY > U `?CopyrigXtd(wc)d20& 6dM c o%s f" !r E!ua i n.d_ Al` (Usd"e8 e vv dX lJ$ JUl 3 M ! >a"aR# ;@pq?ʼ?>^Wben3J2)!N::X23cC4t%A//////9<=q1ۓ+??7 gAQ?c?u??=HD: # ;ih >TEI 'AU@^tE?@3?@?@ ?P6 t`x a?t#"D a_n&] չuTu j +b lA JU5 `?CopyrigTt`(c)`20( 6`M c os f" !r G!a i n.` Alb (sf"e*: e vx dZ l>4>Uh!!9 #" !@] a"%) J`9TZp ,k! q6MB(738?`8U?g153>??5? OO?/OFObOtOv5%2%?;rA RS#_H=,\  + Fle`[#\dKwB  /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUG ?'  =? M E MrM k \ \U< J&bXtEݷѿ?< Pڿ8Hf,Y?@Gz?&.3T[]w.袋?UGD # T h(/TYTY#U@(袋?@?@^tE{ѳ?@X?P} u` ?u` hm b)2 2BnQ[SexJPZdxxU`?CopyrigPt \c) 20( 6 M c os f" !r G!a i n. Alb (sf"e: e vx dZ ) `(bBv8􅤍-# ? e$^ d ,UZHR1^4di;E^4xi7HD: # ;ih#$>T #3 A AU@ı.n?@w?AA]?P t`  ,PQ?t#A@#3udNuj +b z> JGUG ? ]AbJB5 `?CopyrigTt(c)20 6Ml cj oKsd fr"c!rf !ar id n. Al j(s"e ej v" d l>0>Uhh #[!t@ aM2S5S0J`AŭBNTM Nj`"  6MB@y:?^: 53;0 O?4GBI? UAwO2I/52y?5rARS#$HD: # ;ih >TEI 'AU@^tE?@ 3?@?@ ?P6 t`x a?t#"D a_n&] չuTu j +b > JU5 `?CopyrigTt`(c)`20( 6`M c os f" !r G!a i n.` Alb (sf"e*: e vx dZ Rl>4>Uh9 # !@ a"% J`9TZp "! q6MB(738?`8U?g153>??5? OO?/OFO@bOtOv5%2%?J;rARS#UHLuD  >h: JT5 QI!MU@<@ 3??@ v?P >tA`  n&]<t"D a? !!>ubo>ueU R>c fXMY > U `?CopyrigXtd(wc)d20& 6dM c o%s f" !r E!ua i n.d_ Al` (Usd"e8 e vv dX lJ$ JUl 3 M ! >a"aR# ;@pq?ʼ?>^Wben3J2)!N::X23cC4t%A//////9<=n1ۓ+??7 gAQ?c?u??=_H߸,\ < , F,g`e#tdf{B LbCg#@eTkGo+^CWaKoXa}G h`ochi?侳k%cmUFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUGu ,  ; ZHPW c Pd\ O A +b?h: JT5 QI!^MU@@Q+??P >tbA` et ?!Z5>ub>uX >cr XJ  >U4N44 `?CopyrigXtd(c)d20& 6dM c oKs f" !r E!a i n.d Al` (sd"e8 e v"v dX lJ$JUl 3 M ! >a"a# ;@#2?>^b*en3J2!eN::X23cC4%A//////9<=4J2+??7 gAQ?c?u??=HD: # ;ih >TEI 'AU@M?}@?@t?P6 t` ao?t#TMU 1cuTu  Vb n>Y JAU0J005 `?CopyrigT}t`(c)`W20( 6`M ]c os f"R !r G!a i n.` AUlb (sf"e: e vx dZ l>4>Uh9 # H!@ Wa"% J` ?TZp "!K q6MB(738?`8U?g153???5= OO?/OFO bOtOv5%2O;rARS#_H=_v\  P,Fh`p#Rq^B \gb]#@edko+WWa]SaGi`9rcscu UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gUGu ,4E XUI5?mb?@ t¿ Q?Gz?u??UGD # T h(/TYTYU@?@?@??P} u` ?u` h b)2 28MQVbZUJPZdZUW `(`?CopyrigPt \c) 20 6 M c os f"!r >!a i n. AlY (s]"e*1 e vo dQ )BRJ-# ?ea-dE ,UZH:1F4dQ7UHLuD  >h$JT 3 M 'MU@v"u}?@?@݊>P >tA`  Go?t j Gp  >uMZu>m >b J )JG>U K?& UMRNK!K!`?CopyrigXt(c)20 6Mz cx osr f"q!rt !a ir n. Al x(s"e ex v d 1$lJ ,JUl  i! >aW2]5]0` $& \bXx,91 6N K?n:n53?O$OHR5952?5>rMBC'Ae2pQA?S?e?PO OtO/O?O??;HD: # ;ih(>TA9 3?@?@tv[>P-DT! A-u `u b_u  l" EER cu` ?u#b. ܳl> J=U2N贁GN{?<Lnb&B\}.t  G|"t"|"'$I$Iu$/$'"/517-;?0U115 k`?CopyrigTt (c) 2006 M0c0oKs0f21r01a0i0n. Al@ 8s Be0e0v"@d@.l>#!Uh#3 A 1 aBKaC@J:eG# '>"BEOO_H߸_A\ M_ zFj`xw#D_DyTB lgb]#@etko+WWa]BaGk` zc{Rc~UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^\gU Gu ,>  밻Y `;l p:b|=x|@ tUﴱ?@N{_? ^(_>3??HD:  # ;ih#$>T #3 A U@@<۾??P ku` ?Mu#  Sb,2 2n>JYPPJ32N贁N{?<CLBB5 `?CopyrigTt (c) 20 6 Mcosf"r-!a in. AlH sL"e ev^ dH@ l>(>Uh 3 a"a# Jh#<+1B%?@j}GLwA>?n44i0>C7,3%1n;3ك<|7UGD # T h(/TYTYU@?@qP?||= k=P} g nu` [W? u` o+3[ birI r ``?CopyrigPt \c)206Mc.osfr!ain. Al) s-"e eJv? d! B8 -l#[ ? e^| rlUH3_0H=\ L_  Fll`Nw# `D(WB9|bY]#@9ko+dXa]Gac+]Lm`UFDfP h> /T6D UIV?Au?3P? '-6 bfbK66ȅH? ?[e^ gUS#u , _ ;C OU V\QH?+mb?Nh6i?@N{?3 ?UHLD t >h$JTB 3 M m>U@? ?P T> J>uA` ?3:DuNWm >b% J32N贁GN{?H?N!!`?CopyrigXt (wc)F 20R 6F M> c< o%s6 fD"5!r8 q!uaD i6 n.F _ Al <(Us"ed e< v Id lJaUl~M -! >a2Ka3"0<3D^JDpN>;W?To?(5!A('11-3/?!?3?;UB?S?????B3hO&OOg5_H߸;\ t_ /F,n`w#|RÇZB Ob@eՔk!o+Xa%o5a o`Zo֮UFDfP h> /T6D UIV?Au?3P?]2H?>P ?ze^ * 4uC 5߃ bп?䯲p? 4 ?HD" # =hj,>T]]#MAU@?;ofP-DTw!?>Bu `u bWu  -B) n6Bu` ?MRu#]"B<,O7Y]AjJBU`?CopyrigTt (c) 20 6 M c osf "r :!a in. AlU (sY"e- e vk dM B,?C$'"/% 7-H? #0zGzC65dhyMKql>#!Uh#T5= 92J*/4"SY[~"B"E;OfH=\ lݬ-sGWKF?$p`#orߑCB} b]U@eko}+4Ya],aq`/&UFDfP h$T PYYBUI<+ @Ill??I?3P  V[+1F_R@k|؎VrsUE \:BIHи/й?d E"eB^ E 1!#u \ۿO߶w\߿ w $3 1wwU1X>w(w.1OwwVbqql?@? <+ ` `xV4@[˿UHDF # hz,TAYY# #UI<+ @Ill?@q?@ ?@jP} u`bA@buuL#-$.)tSptT^ja}  Y#7RU F  g @#?ag*Jg*g*a!"^ Wb}++U++ + &" YS6"YX6q2@!@!H'p`?CopyrigPt (c)020060M0c0oKs0f21r01a0i0n.0 Al@ 8sBe0e0vB+@d @> ]% ^" 0#^ X͇'0S&!L$05 wFn da _'*TĔ#q1q1NS9 5,?Q'`L0ck0T+@x2ER7@i0> 3B {!S!` UUW`GUu@r7@(0){-~<_oZ"c1)gR"rQ%%_V#_\AP WD+@l+@t+@> 34`Ss!;Q Uko,e85bboa"]|hah }H%\ 0OhWK_4 QFr`Ǝw#hRÏ{B b>U@ekBo+_YaFoBajGoPPUFDfP h$T PYYBmUI?UA?| P?x *+1: bjb:$:!H? w?+B  0$k`0Left,AsyncProY ouU , MLQ sK qg eY"es"oNM"wa_ !ma ]dK liY g!Re^kUGu ,>  밻Y `;l p:hDrag onut heqp ad. l fWsycrou5.a mKbb6Y||= !YBl_ĿD4`.e?@ٓz?GzG1 u&??HD: # ;h,>T]]9 ##!Uh#3 A 1u6 aBaC@J:#l+=BP6/5BF _$?aEUGD # h,^T(YYEU@b6?@pP?@yY?@L?z|=@;C\i;P} )i.;;XNu` [%?:bu ` ek=v b 4؉U`?CopyrigPt (c) 20& 6 M c os f" !r E!a i n. Al` (sd"e*8 e vv dX 1`V sU_1 2X cPm!#543 5t8-# ? Bd&+"e,1a-%UYH14D7B(aݓM?MgdaOC T!!6^D JCC #%nA%JC,4&@BHD: # ;ih(>TA9 3 AU@C(@H13?@53?@Gj$?@?P*Fh >t`  fSrol  Vu =u#H?  by l>*JGU ??PI?AzBE,M $K!Bp!p!5 `?CopyrigTwt `c) W20 6 M ]c os f"R!r !a i n. AUl (s"e e v0d $lT>#$>Uh #3 A !'& at2a|30J6J7>DMDg>ZPB5  9J:1/!_H=\ Kl/1'E슋FLt`rU#`DǕWB TVabyto#@+/Zaxoea_cowG,u`Trcƛ t4"H$ @Y,b'@ +kA>-4b7"AUb UUUUU !"t4"H$ @Y,b'@ \caRC-=k4 A#t4"H$ @Y,b'@ ;kA>-b7"A$t4"H$ @Y,b'@ T;kܟA>-b7"A%t4"H$ @Y,b'@ :k*A>-ķb07"A&t4"H$ @Y,b'@ :k_xA-lb~7"A't4"H$ @Y,b'@ d8kŠA>-tb7"A(t4"H$ @Y,b'@ 6kA>-ܶb7"A)t4"H$ @Y,b'@ T3kaA>-bg7"A*t4"H$ @Y,b'@ d>kA>-Lb7"A+t4"H$ @Y,b'@ >kA~-Tb A,t4"H$ @Y,b'@ :kJA>-bP7"A-t4"H$ @Y,b'@ 0kA>-b7"A.t4"H$ @Y,b'@ .kA>-|b7"A/t4"H$ @Y,b'@ $?k4A>-b:7"A0t4"H$ @Y,b'@ ?kA>-b7"A12t4"H$ @Y,b'@ ?k_У A-b7A3t4"H$ @Y,b'@ m$A-=k27 ;456t4"H$ @Y,b'@ |mA>-b7"A78t4"H$ @Y,b'@ D?@ABCDt4"H$ @Y,b'@ T6XC-C-?k$W A6St4"H$ @Y,b'@ 9k| A>-1k7UFUUU56?@CJt4"H$ @Y,b'@ $n֦;C-4k AUFUUU56?@CKt4"H$ @Y,b'@ nk;zC-&k7 AUFUUU56?@CTt4"H$ @Y,b'@ n;C-)k8W A~@UFR@DU>PR@UFR@$UFR@U2FR@UER@tU͠FR@UFR@TUiFR@UFR@4UER@URFR@UFR@UFR@U<FR@dUFR@UܣHR@DU<MR@UIR@$UHR@UNR@U.NR@tUFR@UPR@TUMR@UBNRH<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H<(H< 0H<(H<(H<(H<(H<(H<(~E U RE|UǪ REUԪ RE\U REU RE l ./DVhz .@RdvH/. (UUU!"#$%&'()*+,-./0123456789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXY3Y?k?}?????\?5Ro0twEn0ryO 5Ř`&Kp$6 U!01yOOO !5O`bAPR1 A!P@9k~8I(G&1U"C 90wys0em! 1j!q8?oLG!]ipplre2Ua0i0ncpaps$f!4RoSF8]^{:^!d0cucTur"t@pp }=Js#!N11CUse%"c@er&!m>f@BAꦏ$ʏtݏ-"dpqr0AMwrVFI"4FuTY="i0vprpa2 #Th04DuKch| ğvן]"p0qcrdp<`kCC!%7UwYU"pxYqv I Я9x-"exr 6!oqBVUF-EG>c4FXyk$5"hpt7q )FخKL!ǿUz-"ihHECG2DVϮiϠ="1qd8ʝL!-?̄aM"qiL#ҕYiM#B]ԨGˁP)SGWXl7"F/egMID?_k&./@/+]q!N7 o敀mi+0DHգsonpi|+: `BHr;2snWfs8[C#pDrapT}BqA'~D?`k+Ҟtb70opՁqs@AZ//+g)uNi+Cx/8OX?5MBo#l?~?p䐝Dja,?>?X).ZOBAu !/:V]5?4y9aN@!L1O-O8ODӁZO_ yLf"OѕOOĶ_[IxR)OOX)kmAYWD2!_&_8_O_yc;x`ͫMJAڌ__+-*H?Ic/_ մkF?Ooo@HgK{UǣDoVo-bvێwJ?t.ooookc{=rK DEJfF+jUKke!F>(&M2K!~ބn=I+ۇ*b-K ` F|^C]1 7lk^i[KE ZƉ Qz+5j Ge'+R _MNn?8ɝᛧ ïA5! "2D- ;meL=Dhz 1;B;RtA8wF2ؠmdHO)օ4;ߒENeZ-l~דO~ṑBX)n8K6BLG`)bi$9܈A|V(Thz+cRzOdN1Ү`~7%E nB% ehB?Up-"$6X)2Z0K25V_-dvψϒҟy$ngZXj߸T /_AoU7Rߨߠj>AE?sLߤo0jOH[i|tsJϗ#GJ?4 QC=h<documentai nNMxC5淮l *R8z@V#=3=prsSsc" J_ЗIw0_>W&rQsVbSlSty!qA'~D?`kҞ sy'hG SA$4'$aq$ 26dC_e*F\N@M/?E Pz(B[ E" &FZKn]e*KaOiGs )!hErQBA %/FOnM{"0?B?c>_VBnAǀdj?|?" =K&J?1%???#? uB-fCC,JAA*O-cF{HFXj}pݰQrݰֱr>+Ipp:KkB6L׿sRlf%(qЪNVkJkBL^ndnSf6HF?m~wjϬ8uEВ!HGGd I:L^߭qߏe @іݡ}OG ,*߆:exGBLb⤿DJ8(܌o [@uHE1\G 2DW{Av 6_Gfpr$2fB(!`o֣gLMpl#/(/:/M/2i ơj [(E 1////EA x>y[CW1?D ?2?E?a0l0s(?3ꕜIwK???9?owء?m0O@k^i#aO"O4OGOl/@2@2FMpY OOOORsJqvC#" __._A_}QSR5_A~`E___"cN?%OԊn'o"o4oGoolm|D]%hCTS>GᜌooooiRbeC2eMpX#ExLjQ ܙA_$1aWo=zTJCSV#1d!w"kc݁)BxJ 2EtbmO<#ᐏǏyA} UeGwfv7,&? pLWlP2kg1K{N_鄟Qa$Ȟ@"CO(($6IR3꘡i0{-KNX1)ů"gown<]Mz&8qa8C^VB͐DJa͐TiD1 T6,TwJpضxBod1P]+CygulYj69GT5ddVU_0>C~m)UlAr@icf5n˷~g_Dh Zp`as"^1 igBl2‘0!L M'08VEAmc2!c28f>قB.ɻU:y7Ocv[m̞LH?bڌ> LYSAsMxNMe"pS\DW: FXj>?قCh#(kN#YunˍnDBΑQ1Ei)>Ors.;M;->U YzEۇ1 responibltyk+lKD8Lsmatc<,T`ض D;t2F CRSdcKu9e=i ѝ^BJgr/vlJ'f@KKprsnC 6 RHigr5UKN\Z.@R;iU}eil .5OZ OM^ iOe2N:2u'_$_ Mv N`tF3T_o #%H4hGE__rXt fWIe$b__ $PKJ4yo o2oR7Ioi2OUpjt I]W/C[5koo P#"MD>iΩo<@Jh˳*&1D+>P 㘉HB˵@ Shŀr~MO@z#1 "h:L-y-@u۞! OS$ɯx>|}JJE0x2"ȏ0N~n_(J\7\H 85i2SAdav? IÅt ,OOFi*74SC;b)${``B9t ,>B.nvI`xDGpp3tģz???A?B OӞXzSÍE?yBOTO&+^My9@GaC/]mO_A~TB#MOOפUۭLojO _$-G4@\>_P_b_y__$Eބw@?},__&+68LQM ojaKN?L_Fۏ9DoVoS*C?E?oo5 EM }CzoooOB/IH^eǟm/_%,g8Cڠ#IH?=F\JCƯ^V{F PZ6G02ý - 2@Sx7{J\nŒ؅QO O:WCwxr؏We OZ]Er#cDP`{>&cN`J5쪪@?#VT>E.AnZ П r__D"Ojg E9@- Vh&+ $eCu?ϝ)㘯4t.UK_ *Яf:1PE[ $--Bfw ?N??q*v Rd4vڍ* $a aE!KZB޿ȈEc.I ~@vߒ<6] AڱMTf*&nL!DϤ$-վ=OD?ʿτrvH?9U(/)ZJܕFAȶYkD'L Zl&+'eL6 uVv:Bt%G= 6K ܲ,T`ض float=ڀFETQd-cumen10i-n::Gnec,ci9/VH!_~CY]pcrss1dcct wJM8oxrcsbltysɓk\1gEWTsc)m/fi]s Wu!l6 \ ݼ|I(A}Rdv L`%-uAA[zK 8 $HfEE x |EOG?LۈͥN`rމG",ng:mgaqL㠙h'v rLn /h?ƈwFyM"&nPx!D/V/8nSŶB(,//t yhDn?R///? b-o+4 ^!_"C^?b)L?^?v ,:bE^?OoFbi??8y88M?eߍg OstjKGK_,HOZOlOOw@h/r_1LPhS@OOv (l?K{K_Vov=gQ YLIyO M:_L_8#MGmJx__t VrXK? D^nӼ____Bv-iA`4 zEFt Rr>oPo8{Fj{EpG6|oiۅ IE^7aoo8LyNv Lon>LILZ߮Wq9K:hO /%Ƈ8oG&"uA0K1:⾧gF#WJ+pba}O׊LbHjBݴHhzg+bGέDe=xNJ;G%=έ%haL8gGj|ƇWe8:IDULD/aT0  'w]Oyuy(rl)3 zoDK? v _wW@87z2Y{JV1DZ2(:zsEZ(fxt VRM3~rh^!]Hez`qgW|NmqϷ7CG^3TF?B6@JO.8_VB@%!3ok90o-J?3͆q߰"%e;O~,NgrL&8v ;+M8KVKRha6# !@%?+9㚠33kFEdžgWq@t"4Fa#] j|chy% E8_嫗(,A.5GPD|$@ak jM9GۘȂ!3d\|]MG[T8 \nJw5CpgX"a$.td~WK?LkJo5f4>YI?5K<"j/GVH )jhk>0cC?d:"덁J6 Y$/6/H/%[/f x d{/d )RDE?~X9ޤ//>$jJJTX/@OaʓFhM%z?0?KKfJP #\?n?ns@Q I!v???a&?s`o@z/ :;7@?%$O6O|ޢ[CY"fO_aOEǦ-OOKIL?DN5OO.CE>WLԔ _2_D_'[_bQn;|_)1^@6q\ono1 DjHi?M>:Ҡomjħ+NI֐u__tV{D*IIՏI_rwF ?dBo0oD=T(oe otsSHiCi^롣DHWƏ)!tKFև{,w+NB+EJ,q"4O=֑O0hfoB)Y4>d6 \L?zJ^M!*F=cB3P8PD$69EM ߌ䘲fx;5Is jS֦ʟ៧2ṳANDiE2\*<q|O6Ɔlȿ⡽iMG 0Kak"I[ ]c _L7x/(*7}24FXr3' w]Oysequ nc (idl)K؄iwdoumWtaUiIn(,eHXb2W:lIX($NO1e2Ipp ritb rU|DYjfr sbltya {K4]ORz_c)mTisa4'(u ge hIrU9JDZ@Rd Bx1ؖND(-#2&dmK=Ey?]9 b vj-A&4+\顱<N`5w&!nRޗvHܧd )Bpǽі/~?N2J^ΘFlqL/^/&u*A!z̸//b ]GImQo//(7v ZB !'b?ht?dn6 ?0?/80? /!zC* OO%EJ?M un>?Z_8MWJDЎe!N??&2݄}JQtK^1O/Oe a^ @N4^O@pO/BORQrP_&&xD#lF>_P_d Hh5GF`gS12_o;璘OV/c__&loJTS5Lqt_ob KKKcWrwr>oPobo-8uowoosI99oo<-F@8~`B ?#6 :L&ࢿˠOsK"|f _ D/=M$cXD6sqN;U8SYcMMd la(O#Pc.FhP[DVdW1gCh1gȾTՐpPckgق "OQ2ě^Gȁaz1a%JEd`+̟ޟ\2mk{I='-63J\2o-98ǕD}uP蔯\=ܺ@_6RPLҁ" $yI:Xӏ&HӃB,t4"k!KG #$6d };9BQ@R(q;8DeC|ZL5/E@qO.M+ma¬$ s MF*﨏/&d nZHcIA'[ܿ21U!F:4Ǟz_N F[FLϥe pQMNVRBԎH' (H# &%J?'c :9#AS$z"Xߨ[hnG&l%4&EF?IAb 䱪B_@HْYP'9K$ O* MI`&[MŰk&t`O_ڡpyNq;G ޡOOuGFQ"_4_>xffVFmab f_x_{+PJQ3xH۲__0b u,F"&گ١DN w9HgsB'a.bj|4JwD 7FIcRcD+ˑb`5YWg8LxJ\DVoRp8o`&ԅ<ာadaUc0f0e>@ucN Asԏm)Dwq!g$o~x܈GW7 mo36mH<ǧLޟooF^pL?+ Boo>AʭZ 3 wL8ġ1gŵCh1g!9k~8I(N!Z}-ġZ}] "OQ2^LġĽ }-.b*MġяFmHeDDq_0DCv6hzz!*Mϼحϼв,T?ض`8%7߿Oa߿yߋߵ߿@g ᅭ!3ᅭK]u"ڟᅭUC/GYq T`ض`8o&^3,a"4+6CU"7m8"9:";'i{?@'w]Oye!/#/";/M/#e/w/$//%//&//' ??(7?I?)a?s?0??1??2?? O O=3OEO5]OoOgOOOOOOp8Z9k~8Iƿ(Nq/_A_rY_k_s__t__u__voow+o=oxUogoyoozoo{oo|o}'9~Qc{ #5M_w򆡏ˏݏ1I[s򌝟ǟٟ-EWo򒙯ïկ)ASk}򘕿򙈿ѿ%=Ogyϣ򟈻!9Kcuߟ򥈷 5G_q@]jf3gŵCh1gD6sqN;8˙BԎH Y3 XB_۠}QK$ O* M^f4/)HI&~ϢX+B?,L7$V=ܺ@6RqA'~D?`kҞ);-BSe-B}-B-B-B /-B%/7/-BO/a/-B y//-B!//-B"//-B#/ ?-B$!?3?-B%K?]?-B&u??-B0< <06OO'O9OKO]OoOOOOOOOOO_#_5_G_Y_k_}________ oo1oCoUogoyoooooooo -?Qcu);M_qˏݏ%7I[mǟٟ!3EWi{ïկ /ASewѿ+=Oasυϗϩϻ'9K]o߁ߥ߷#5GYk} 1CUgyaW Bd B@d Bd Bd& Be!Bq@u` vu @?u` ?u@?u{` ?u @?u` u=?q@u` vu XyAdc%Cc0Cc)CĚc+Cc)%CUDF hLcCxT CPlCNUH  U!BDЛ5FDv`:}#_dKUB lZaGOaČbo@+ko4aN$w`3VUFDfP h(TYYCU??F BP(?| Pu0 g@U/5=> bnb= ab5?eнsU/:/RȉH гRQ/Ы+"B  0a`+Cl s ,ML st te$ruc u\0#of w 3m0d liOng!eB^ ?5oUG*8(^P941/???OO&Fu E?)7PV ?WQcu Drag onut hep s ecifyaefbKj!ta5Rv s%m%lrtuGu.e,b ZUiradTltnh%p.b~׿j4F??inɶؿ`0 ?? WGҿvnᅲ1e뿀D"H$?9h3?UG D  # h0TdYYU@vn?@.c2?F~?Fi4F?P} r=qt` rdb @ bj   2AQu`P?wu Y >DS'>X#h&X#|&TZX#č"""""""""""�"" :""D""N"&I7V$Y30!3 3^2'"P""66664 aD @ 0aU>B`UML BE@ckgro_undk@A@d-y@n` /Cg@D=1\0@ytZFK@>D>Bf>C04 v ,Bb*D%F 2A,B AI7GI  7 0?QJ T 4CGCzQ@Q@WA`Visu_1@2.q@hm!#g54PCBw`?Cy@pyw@]iu@htk@(q@U)k@2B6k@MPcwBsy@fRQrTP aaPiB.k@Al(` Xs,be*Pew@v>`dP3D5GC0! 8e0!~aa0!ki|: YH;HdkEd0!kUd kkUdkd>k|dZkhgɳHcPsrEB>@Zu@4daF(6ybTZd>B:BR$kR|I;Ʉrք <ㄐE>5d +6;Hktf8Qi@!T&XAg'h+h Bg5B'E/4FB*h#U@CGbr#kU4@@Qɜ>#wzQBD>P|W@~aM4#I2Ѧ` Cv?C$>GCZC? .?k#EuF^2& evvjf W# %wtCbtIa-Q&VbaF>OƐDiFǁ@rBN9tq*bO UigC˙S`R>`Upb*QiPt b `AaQabj*>`c6dwPtPUiPi(`asPr{@u`hE@vb~C=a$esPsLg'H"( >Bp<c~aw>B&#DRDkR;HR% g`zQ`x~8QߋzQ,u`Gu`MarNفYb#>$B` ExPwъCrwBwח67X2ABa+C2EE @Q,HZl~66W"4FXj|66iW(:L^p66/-A@2QdNWclt588^ 4ǂKQKQr@4;Ht~YiU]UF"IDPa&uBaP'VABW`U@L BG@Ic2LAo%dJ`Y-b} / `MP)=PQ4hy9YR!V25u?OT!OPVS QeI@wSOeOwOOG OMOOO3F1f=CS k&$-_?_Q_c_z_M(d___VNѣ`_"kfHjo2^ogo(,Ḿ@@DAsѕy SRmac E$ro!o3oEorrQ2\fr 0ci5oo(ooo4MP(@@Qa)e Ly&WrO'_oT_oM?2O%PƁr&Rz@&sPQ?Iq4 !HG70Vo1= 5¿Կ{ &%N&EHOd/v/1姥6&0Q~+^0v(ϕ+ߙp|>d$6a$@%>wb}/d6/Pbtτ) \n^H43,^qJ0qQBb81J0eD?!;eHD: # =h ,>T  9 #:AUF~?Fi4Fw?F<@P-DT! ABu `u bu  -B 6@Bu` ?Ru#]"B<,O>ڧ Ba bJABU0zGz?DM \bB Bt` @"t (hp  *('$$'"/%)7-3? 6MK@b6 T1115 `?CopyrigTt (c)@20@6@M0c0os0fB1r02Aa@i0n.@ lM@ 8sQBe%@eJ0vc@dE@l>#!Uh#3 A 15@&<:0^@OaJ:OGSY[pB[/_fG_HD: # =h ,>T  9 #:AUF~?Fi4Fw?F<@P-DT! ABu `u bu  -B 6@Bu` ?Ru#]"B<,O>ڧ Ba bJABU0zGz?DM \bB Bt` @"t (hp  *('$$'"/%)7-3? 6MK@b6 T1115 `?CopyrigTt (c)@20@6@M0c0os0fB1r02Aa@i0n.@ lM@ 8sQBe%@eJ0vc@dE@l>#!Uh#3 A 15@&<:0^@OaJ:OGSY[pB[/_fG_HD: # =h ,>T  9 #:AUF~?Fi4Fw?F<@P-DT! ABu `u bu  -B 6@Bu` ?Ru#]"B<,O>ڧ Ba bJABU0zGz?DM \bB Bt` @"t (hp  *('$$'"/%)7-3? 6MK@b6 T1115 `?CopyrigTt (c)@20@6@M0c0os0fB1r02Aa@i0n.@ lM@ 8sQBe%@eJ0vc@dE@l>#!Uh#3 A 15@&<:0^@OaJ:OGSY[pB[/_fG_HD: # =h ,>T  9 #:AUF~?Fh4F?FYaD+Oج<@P3žm>Bu `u bwu  -B 6@Buv` ?RSu#]"B<,O V>a bJABU0zGz?:DM bBigBt` 6@"t (hp  U('$$'"/%)7-3? )6MK\@b6 1B115 `?CopyrigTt (c])@20@6@uM0c0os0IfB1r02Aa@]i0n.@ UlM@ 8sQBe%@e0vc@dE@l8>#!Uh@#3 A 15@&<u0^@O.aJ:FSY[BU/_3fG_HD # =h4>T]]9 P#AUF~?Ffl?P6 t` ?A@u#`ҍSphb݀@3 b&uLb .T u%8Ak  U !ea$$,  sJU2qZ ?Y/k&?\.?U4"k&",,'8">%MS${߮Gz|#@2@#t&$tA5++S#.=[IS#PMAM32 U;[7#b6$6>%BNt?L)B|$P0r J%#,%,  S#0A0A0G; `?CopyrigTt(c])20@6uM@c@os@IfBAr@Aa@i@n. WAl@ HsRUe@e@vPd@R?$l>0>UhhCAEDUI@'XKgDJ`S#FVC$a" "34bM8%1_'nJe3ZnsoogJe5ZeVoooJeE2_;IB)rAIBs0idTAle59 6Uw4w'%;K!4DD8Q+ v6"vBA"j3y2;F!3Ă# 1C;J,o/b>%@06T HD # =h4>T]]9 P#|AUF~?F4F??Ffl?P6 t` ?t#` u!bA@3Sphb@3 b&uL+ S.5 553u)\A  a$! % rJUo2qO ?N/`&?\.W?4V4 "`&U ",,'J-"3%MH${Gzq#@@#t$t65+D+H#.=ZIBH#MAM(2 T;Z,#b+$63%BN2i?Bq$E0r +#!%! %H#%A%A%G;`?CopyrigTt(wc)20@6M@c@o%s@fBAr@Aua@i@n._ Al@ HUsBe@e@v PId@4$l>0>UhhCpA1l1:HT6MK\DJ`H#FVEC$a "3$bM(|T_ n:e3Jncouog:e5JeVo_o:eE2_;>B)rA%>Bps0iYTAle59 6Ul4w'%0K!)DD-Q+ v6 "vB6"j#n20F!3  &C0J,_tq 3%506%e HDD # hj4>T]]9 M#WAUF~?F6f??Fl?P6 JtM`  ?)6Jt#`  u!bA@RJ=UJ{uL5 .?M ?p ~bFd2L&?<Ju)3$ AW kya$,# . # .>JUo2qq ?p/&a#?\.W?>V4 "&8"';D}#b&22'?= "'J+j#.=#* =j${Gz?<@@6Jp t2)355*:.1_2V"M%C$_3F#F2C5!BFj#a$a%5 " tB.#bU-$FMEd"H?wB3"#%# j#AAG;`?Copy_rigTt(c)2U0^P6MJPcHPosBPfPRAQrDP}QaPPiBPn}. AlPU HXsRepPeHP%vPdPNDii eE9 pIU,K4W'%K-!D0. VpFR "%f62lJ^Uh[a9QXK1"T^(`j#aA\F</qI'B "=#Sra"J 18~iu3z}sW3~2313tA`:~u7 DOfE|uR3~1",(2a;at:DriuEazw#EutH"v2;J)rA.ag@~8.e HD  # =h0>Th]]9 P#E`AUF~?Fi4F?A?P6 t` 6t#,uLA-@ J@JVu  >  Ra  b, JU2{Gz?@L6p#.$?:.&*W*ye!bU 񁄍I5 @@"D<(# F#2]r "6!MAM@[i! W";]#.b1%B(#*1*1*7;`?CopyrigTt (Wc) 2`0P M0c0o%s0f21r0!Aua0i0n. _ Al<@ 8Us@Be@e0vR@d4@l>]U@hz1(#8A( "H*@Q"W"}A` b @ӡW":]#RJ#"J`(#F9u6Q@$"RM(=!cWp__QU3^_o UZ5[mP>o_boUE12`_;C2rA%C2c4iDAAbZ59 t6U$/w'2Kqxp5;!)a5 /vt6wv"jD 2!$56$!3@wv+3v 5:vKk._H4=+m!@ 0V-A~Fw`#YOB TR]abi@+<[amcaGDWЁftWĝW; W dW Wb bnb a#V5?нsU/.:/ȉ%H гQ/Ы"B  0s`4Gen raliz t o ,MKL s !e4_ruc u . 3of w 3m d !ng$!e^ Q5oUG8(^P111/??OO&O8Fu| n%  1:{<B:72/Drag onut heqp ad cls/if3ct3 e+>si b tKw eC&mJH n l)n!vs e)4 Ieult.Dzd3mbϿ?,؂-؂ݿ?_3OP?  UG HD h# 3h TB,]]9 J  AU@U?]ϿP6 u`u`bA@u]`u B72Xu` ?pu#$JLAVA-&-a)% bJ v/"9( =$Y#>2N贁N{?<@w"<`Gen ra_liz t ]o A r Uw{A(2r:"#2"?:/!&&-&H8"D+ 4?+ 24:0!+ &2C?U;";?3#9?A%"b2J3@N?8G9#BHvGY#WBH 35 ^(WBKCBЕC=CV`UML }B ckg"Uu d"dPARlUhE@&Jq41c18T&&R)r|)rcs L~1iXvw7'0e!40ju 7qeFmW9DQ?@@iq?AXWB 4- T(Ra3 w%s!qi0@|:w(BN(BpheacTA$t(OTAdOAc# @?q0r-+ h !024[WXb\ukc2rb380]`\%"bTѯRU+!gWP,ɜ3TWw"!!2!!3BvvHHR@WAWA5bFb56t(0p6sբ5bT"3W,Ya3#BjBB !Th]]9 M AUAA޹@q?o@I?P6 .Jp   o@z3AE&9JuM`0b7 bk oRubnB]AvJuL`UA-!Jb #m Ja+$Y3  >OJU5 ?"E!\{"3JG"Z#5 #?& ?Aq'rBIZ)" &&-"u3%<% bG#'66$Q%Q%P>?">#6 1JZ#818187;+`?CopyrigTt (c)@2`0|0 M@c.0os0fB1r03Aa@i0n @AlN@ 8sRBe&@e0vd@dH"i&Abu59 8xU]$G'2J!$a% F6"FH"lTJM >Uh:U]1'~6Q4*,#3%3%3 N(@Z#QSJ^BQrRT?H"H+}!@ K-;~'+_AhFtx`#Q weB _Y]ab!@+[a.aG oWā> PW+ UFDfP h$T PYYBUF~@xUFM"EO#FN`Qps-8R? I@ 9Q4F3.n#DQIT5 `?CopyrigTt (c){P20P6{PMsPc.qPoskPfyRjQrmPQayPikPn.{P AlP qXsRePeJqPvPdP/`VsPs_SbP.Phm!#5 `6P5QBk{5MPS PW?:A$ v" tN&s9rb xl重\n#2Ǎq`?ofM?iAISZ&{?9:=n#QQnr`PfPd#dN贁Nk?=#<>Uh!#3 AubQ20P2JZn$%uBOH P"&3Mo83n${ EEr"$? 2́5!݊'z#xârba7@4EuBL^5USxt)HNJE2ڍϗ̂eَ9Ʌ upgA +dAb9 4}ǁԐcF@HuGvEBGu?bZm9(9 ̉ܥ?uB R@b-Q՘J@޳޳ ϳ$"$"  MB8=e yB?8g heiϾ71TA6r2to8hT(@B5ciܯX wr9'dPf!OD0n 4zb\.h4F??lD??H=^U/BHм(/н?}J]"t G 0k_`*Note,xMLʼ s a$!ruc u #oKf w #m d linIg!e^| kO UGu ?\?JϊQcu~~w|̄ޤ̆nDra_g ot] hep adny aex.imIb~[׿??2|&8i6?4?6BP(p8 4࿈=UGDF P# h=0TdPYY#]U@BP(?@p8?F~?F?Pn} t`A@Mt#u ?!u- b[*d d.   XT|5(N*?@+"" """ "" "("'&""" """""L7U I42!^_ b a!9I8`UML Bm0ckground0A0d-0n` /C0D=1\0$0y 6U451fN ! ^W b\FFIA!3ATA;1;7*Bw`?C0py0]i0ht0(0U)02260M@c2s0fBzArT}@Aa@i2.01l@ HsBe@e0v@d1`V@s_102cPm!#54 P2 P[J!4E 9e-aE]f5K6RCUYH Q5TWp-1da_+5lT2f23!!EBNN !!|!!('"(!E8%c_TA^dd-1a!(+A>31 u`!su `]#i` JzAn0e0AN0It_RMX "qr2af5aj@ooa"r(x4s"4FXjx v| v3'9kw v| vEEwяkw v| vWi{ß՟kwv|v|7I[mǯٯkwv|vb&8J\nhzv|vE -π?Qcuχϙkwv|21# _m8%c/e3oEoWi8%cXI-^\E`MK6;CDRp@a@ S@&RPa0Ac0E0"1r@[2???726 9r>5-f5d:L[Yx; C_Zd)B33EWK6=C+SPa}@e%&O}@Es!b)EE}6dҏ` %0Dr@&@A'9K]8\3g_ߐ`z(`Q2 f22EBI/5xb6$wR8 h ,T  J ɨUF~?F?FP Jt`aA@tJtM`0 t=t#HJuEM?pu_}Jb2 ]kVNT]M   U KG& G&U G& G&G&G&5G&#JU0zG/z?H@MIJ#4" ?L%!N}% .b;1U#`1`1+*`?Copyrigpt(c)2006M0c0oKs0f21r01ai0n. Al0 8s2e0e0v0d0lJ$~U!#3 ~16iwadBalC)s@(4#&B&5 K&G( Jp U uB.Gu0F2EO)O;OMO_OqOI!HO~rxnTO_Ha_)e^U3_E_W_i_{___o____ol-oSXr^ _oqoooooo4o% lYS^]`-?Q8l^aɏۏ#GYk}dlSܢ^A+=Osl!^i!3EWi{俟ÿտl! 1ZUH LuD" # R>h-4JTaaM# MUF~[?F?Q 6>u`M-@FL&d2W?A [A+>> b .+U>tA`  7?dt#o>uluTt>Wb R Maa J && &J &O"U&MJ>U2N贁WNk?H@9 v#*p  b*#!2{Gz?&N:Un"eHD"3#Ib1g4 ;`?CopyrigX}ts(c)sW2006sM0]c0os0f2R1r01a0i0n.s AUl0 8s2e0e0v0d0 >`吀#+OP OtaF!lC$""O"0"L" <#pm#'7I tB.bUQդ7?o2 "n7# )lJ ,JUl! U1@r2/@ab`Ut(}4%JD@fSb?]#tDUPH3ybC?4D"# D"hc# f O#TfNc%JEGCmbuC5eChb$fbf `  Ac32mSgrM krrA2aEP{Pjztrrk|UA8Wt_@ oo$o6iT%Dv[k zca ^$n"iezee@}3UogcUxuPbU%jz| }eڅwgaowy @Ȁ2HiWiMpiE(WY4'_2q[Z!T0q5 (V2Q !i]j-ҭ{tWV!yc'(o3Z1Cϒ(_H߸^!@ {\AD'F4z`H7i#_V8w|B C\-9Nab{o@+t\aoRaGLo{`oPq@$q_EDUFDfP h(TPYYBUF??F BP(?P3 g/ bNbH_)@ДئUE W>/BHм(/н?}J]"t G 0kk`0Constrai t,xMSL !a e$_ruc u .#of w #Um d l"g!e^| kOUGu ?\?JϊQcu~~w|̄ޤ̆ Drag ont hEep s ecifUycd%t%Jsa1 rps5 a Omulb mieGaarqe.l%d`rb~[׿??2|&8i6Л?4?6s5EUH LuD" # R>h-4JTaPaM# AUF~?F?RQ s>p b @Seu`M-FL&d2?ZA (n:A]>) = )>Xb .IQTp>tAq` ?t#>uLu>ubA%J& J!,M Jr& l"b"h&r&r&&4!`l""&MJ>U2N贁Nk?H@9 #*} bJ 6>:# 2{Gz?Z4!&N!+#""#h&3#14;`?CopyrigXt(c)20@6M@c:0oofB1r03Aa@i0n. AlN@ 8sRBeeJ0vd@dF@A >I`@!#HOP "/ $-$S/u(/Fv!BFS$"3"f#v"""v"A@#K%M4" tBTM%B$ VVQ7?2 7#TRDlJ,JUlU15TM@aBb`S@w2(}J@fb?#DPuH3r?qb""# "/s# 0v #1vjNcJGrCru4"Cr$Pv+rTv ^fxAasR32p}grMo rAw2cqE{j A 4eA8Eggo oooomTD%k zESsa $_"cye6/eI}33os\%IbrUԛ}z}_u&w9cq&Lx@Gww2!Hi"giM@piE%Y4m'2Kqk!d+05 m4"w2DaiOmjK]o{Wf!sַ׶A 3ζj8UGDF P# h=0TdPYY#iތU@?@F~_?F]?P} jt` A@t#"$2Y LX u ?AHR\fu4q Vb \?"" " "*"4"\GG"G "G"G "G*"G4"'X*"X "X"X "X"X򤔅7U3b@2  b ĉa-9U8`UML By0ckground0A0d-0n` /}C0D=1\I00%y)F-3$5"71 b ,  ! AIA-3AVAG1G7 w`?C0py0]i0ht0(0U)02260M@c2s0fB|ArT@Aa@i2.01l@ HsBe*@e0v@d@1`V@s_102@cPm!#54"P2 PJ-4E 9eqaG]r5I)+CUHQ$5T Wp1dPa_5lT$2!!3 ! !GB  ! !|*!*!E!8'c@_VA1aflf?1W u`#su `/`|An0e0En*@tBi0tBAf {v$2ar5զmooa $r*x6s$6H(Zl | v3#P5GY | vGEǏُ!3E | v}şן@ 1|v|i{ïկ |vbRdvпω|vEASewωϛϭϿ |$21# _m8'c1e5oGoYi!8'cZIq^^EbMW6;CDRp@a@ S@&PaҤA E01r@2???726crp5r5dZ; C_h܋3ڕW6=CS@a@e#&O@EsP%7IO`bGE"46#C %0]r@&A8h3g_ :1*`Q$A#$rpp2=$GBJ$a)Q)Qzb6d$yR!8>STt>5@?1Tbh3t!Hu@!*`VA;5nB*Ut!5O%%+Db$zzaWaQ62t!GE+$/@A(5t!aM*$$AY`6aY 21 iamRu2&M д/PR@pFAa@pAAyhp2mgp4Ad"B BA7tXA$i@Z vdyA1NoH'@K\Gm _AAXCrep%yUK3%(y3aavaPC3Ta,JprPpY_FB6iaq}V0SIzfjUH duD " # R#* > hY,TYYJ UF~?F?@P Jt`Y5AtJ=DaJuM`?j]dnu#xUb VNTaM   U K3& 3&U 3& 3&3&3&53&#JU0zGz?HM$kJ#" ?L%N}% b'1*#L1L1+*`?Copyrigpt(wc)2006M{0cy0o%ss0f2r1ru01uais0n._ Al0 y8Us2e0ey0v0Qd0KlJ$~U!#3 j16iaPBaXC_@(4#H! KDD(F#AF!Jp U uBG u06EOO'O9OKO]OoIAO~RntWnQOOHaOe ^U_1_C_U_g_y________ loCDr ^YKo]ooooooooooo# lECp ^ w+=O l>t ^aǏُ!3EWi{ lCȢ ^Aϟ);M_q l!̯ ^i 1CUgyӿ l Z_H=!@ b,_.L*CFD}`ߚIr#`V Kw|B _d]abL@+\a@a*q^ڄG\~`8Q>P%qvXPUFDfP h(TPYYBUF??F BP(?P3 g/ bNbH_)@ДئUE W>/BHм(/н?}J]"t  0k!`%Note,xML s a"cPasr !of w"!m d l?ing! e^| krOUGu ?\?JϊQcu~~w|̄ޤ̆nDra_g ot] hep adny aex.imIb~[׿??2|&8i6?4?6BP(p8 4࿈=UGDF P# h=0TdPYY#]U@BP(?@p8?F~?F?Pn} t`A@Mt#u ?!u- b[*d d.   XT|5(N*?@+"" """ "" "("'&""" """""L7U I42!^_ b a!9I8`UML Bm0ckground0A0d-0n` /C0D=1\0$0y 6U451fN ! ^W b\FFIA!3ATA;1;7*Bw`?C0py0]i0ht0(0U)02260M@c2s0fBzArT}@Aa@i2.01l@ HsBe@e0v@d1`V@s_102cPm!#5?438"P[*!4E 9e-aE]Hf5K6CUYHQ5TWp-1da_+5 lT2f23!!EBNN !!|!!'"(!E8%c_TA^dd-1 a!(+A>31 u`V!su `]#i+` zAn0e0A%N0t_RMX "qr2af5ajooa"r(x4s"4FX jx v| v3'9 kw v| vEEwя kw v| vWi{ß՟ kwv|v|7I[mǯٯ kwv|vb&8J\n hzv|vE -?Qcuχϙ kwv|21# _m8%c/e3oEoWi8%cXI-^\E`MK6;CDRp@a@ SJ@&Pa0Ac0E01r@[2???726 9r5-f5d:L[YZx; C_Zd)33EWK6=CSPa}@e&O}@Es!b)EE<}6d` %0D r@&@A'9 K]8\3g@_߇`z(`Q2f22$EB/5xbI6$wR8 h ,T  J ɨUF~?F?FP Jt`aA@tJtM`0 t=t#HJuEM?pu_}Jb2 ]kVNT]M   U KG& G&U G& G&G&G&5G&#JU0zG/z?H@MIJ#4" ?L%!N}% .b;1U#`1`1+*`?Copyrigpt(c)2006M0c0oKs0f21r01ai0n. Al0 8s2e0e0v0d0lJ$~U!#3 ~16iwadBalC)s@(4#&B&5 K&G( Jp U uB.Gu0F2EO)O;OMO_OqOI!HO~rxnTO_Ha_)e^U3_E_W_i_{___o____ol-oSXr^ _oqoooooo4o% lYS^]`-?Q8l^aɏۏ#GYk}dlSܢ^A+=Osl!^i!3EWi{俟ÿտl! 1ZUH LuD" # R>h-4JTaaM# MUF~[?F?Q 6>u`M-@FL&d2W?A [A+>> b .+U>tA`  7?dt#o>uluTt>Wb R Maa J && &J &O"U&MJ>U2N贁WNk?H@9 v#*p  b*#!2{Gz?&N:Un"eHD"3#Ib1g4 ;`?CopyrigX}ts(c)sW2006sM0]c0os0f2R1r01a0i0n.s AUl0 8s2e0e0v0d0 >`吀#+OP OtaF!lC$""O"0"L" <#pm#'7I tB.bUQդ7?o2 "n7# )lJ ,JUl! U1@r2/@ab`Ut(}4%JD@fSb?]#tDUPH3ybC?4D"# D"hc# f O#TfNc%JEGCmbuC5eChb$fbf `  Ac32mSgrM krrA2aEP{Pjztrrk|UA8Wt_@ oo$o6iT%Dv[k zca ^$n"iezee@}3UogcUxuPbU%jz| }eڅwgaowy @Ȁ2HiWiMpiE(WY4'_2q[Z!T0q5 (V2Q !i]j-ҭ{tWV!yc'(o3Z1Cϒ(_H߸ @ RqJBFc\e#aV5^w|B C\]Nab]@+D]a_RaGocUP5q$f9q_i(WSP'B!tW%)/"K-STW_1So,5S4W=S}ESWyJSARSqZ dW2eSoSDWwSS$WHS5T}b W..StYؓSYԝ/?Uw&PDjWLW?VW-ԮW6wH4W\Q cn%UU U Z+=U] "H$@z^@g "*^p1?4 i= #5GYk}D C:\Progam Files(x_86)MucsftOfe12103:\ULAT_.VSTi=7"4FXj| D C:\Progam Files(x86)Mcsft*Ofe1210]3:\ULOD_.V STi="4FXj|D C:\Progam Files(x86)Mcsft*Ofe1210]3:\ULO_.V STi="4FXj|D C:\Progam Files(x86)McsftOfe121w03:\U_LDE_.VSTi="4FXj|D C:\Progam Files(x86)McsftOfe121w03:\ULSEQ]_.VFSi="4FXj|D C:\Progam Files(x86)McsftOfe121w03:\ULSTA]_.VFSi="4FXj| C:\Progam Files(x86U)McsWftOfe12103:\ULSTR_.VFSi="4FXj|D C:\Progam Files(x86)Mcsft*Ofe1210]3:\UL@SE_.VHSi= "4FXj|vD C:\Progam Files(x86)McsfUtOfe12103:\ARBOWS_..VJS_8(O *@VqXC!T,eq+/-er/}O@t}|s~/},tt T}܅ }u/4}?v}/}v U!`0?1 ?nۇm#@ LFDNTyB@ uh$TB UF"H$ @FY,b'@FxtOU KLO|HhALk1Lu\>D>~Fׁ(\~?i4?F?q0t>ׁ1 p_1o3H1: BlBAA;´>_q_qI<ܴr=Ur>5T6đ1:(?9lEf-ae2[W{c&{aPDPPU60@3w0A`B`]D`-40@8xU-`E0@25aP62PPr7w0C}2u1,?;Us*@ E1(ce:YgPhAAIAA>Ccׂyyph85~Xe0 !e%e> ,,B/J!*| K!'9TfxEU@u22ׂ] G8(%E3qOKq`1AH ř h1AFXK4?F{s?F g=Wf~f#w SH5 H EdtTfZlEn:/3ZPEfّ ft//S*/9>\ ux./ /Tſ.H??ci'(E[ͭ hXQdg_'2UvBb! [+Jt=E_u}}3u$' yH`3&o4O__'_9_K_]_o_________o#o5oGoYoko}ooooooo 1CUgy5!%7I[mǏُ!3EWi{ß /ASe|E1ɯ@ۯ#5_5S[:XLK]xZ N1 յ,(oTxp%ffl?g$[0P,#Z؈ g ?!@bPU!u,L, DUL/.'_%6/ /~q0B1_k}g4F 0BTfx_//,/>/P/b/t/2?//////??(?_z]?X0}???O5޿oa:'G@ Q#)9GZtKO]CXkOOO#UKuvPrmate X @'9KcjXBUY14!RY1Y1q_75__ao_SuIkXx&0mRo9lɟ`68g{V  ooh?:EyE,:?AD99tG$uOOHOOTuJ_\_돀_D,U_Xl&o˃[l|"U,ae4eB\eq5e}oܯUF"H$@FY,b'@@mo(@@M? r%^BD}K's{sXBXA b@ѡ4e*7ġ!S\؋~?i4Fs['QᬡNe1g t[ي[ C"E1:DD$ree1 1G!! ;#T@W"=JT>WTB6 qTȕ%eYsQGf"dRW`&{QBF3BRK-ʀQ8R0U4I 9REI 8 W71D 3 4b}Z!}Uꅍ[?[.ET@ ?bsQ Voe#P`NCd0eKL1p@O6O#%,0冘@qqB"ª\/}dK zycqouLA&_u  2oيW#%8!/AS}GNN 2&&8"FRaqm5HY_SF,܅q$&5DѺ/ 3 =8!2a.E 졍FXK4?Fd F 0B$M(B%oƯJI!Ed4)0w^CB"  5wsBTJ5 J^wgϤ쯕 J.E<"4C4;Qo ܁ -?c7EW7 ܅7ND?AE{EEס"9,dv^_f//܄/U|DB/|Go|OkWo_ՃGdґaĠcʕ7?=ґӅI,a 7;I]SOa\.?@]$!@@N&d2qHtxJe#@5O@rFvrA}~DR@Y}qq6s0!h~ӠՆ_hC7fУEvW`&{P0Cڰ5ܲ-9CBK4U2AKBPDE U-ɀEE 8ɀ2Pu3ɀ9PD}\e%?c@ @AS}MdgáʃPMaMa찺͑ڰbaQ"pBx8~ȃӠ-W=ie9MXX|M7'2U2QrT0!}Dm cv`(dSeQVmeuiaqU\9eY x+d<+dGP-DT! PbtΏ(:L^p⫟t!ڟ@ .@RK%S[:XLzMөWU,O,Ѹ6U_@˻ϊ\cG qboSq1ח!ei vRr?1quq=T\.?F `0"@@LRɿFڲJԹRпPLaJր@|u`u `Ӛh=T: 7Hз:5oK+!@)~p SN @z3Lޞogr8>p1_^p5Ceաs.9Canr8WN9иP #-T}g tNЬzsB} JSRA8]AehT4@q?@>?O8jxꤞsau$ƯjedxLT^옃 Mt@c̓D(`o ?oɏ?.?R?d?v????????OL8[6@A*^@6F@-4@BfBAATMAA&@E^@-2@U6^@D 5*@D 3^@oOOOOOM&OH4Z!I5 m _1_C_U_g_y___/ -?Q}[o oooooooou?ҎFX=|Ϡ/////// ?Tfҏ"U+FUIU UUUUU35U69:;U<=>?U@ABCUDEFGHt4$"H$ @Y,b'@ FӛyC-mLAUUUUU569:U;<=>U?@ABUCDGHUILMNUOPQSt4'"H$ @Y,b'@ LQC-m+AUUUUU3569U:;<=U>?@AUBCDEUGHLMUNOPQSUt4)"H$ @Y,b'@ aNC-mA@:~ZOR@U9OR@\>~ORH<(H<(H<(E?~ RE,U RE>~ RU5`0*? `0 @}>!@ LFDTyB Tuh$ T UF"H$ @FY,b'@Fx-O(\.ga(?.sU!& /  2-?-(s mu ` !24+212u;9e< u G1&%41; 4>4 !;4>8<1;8)>82>54U4HeP9 TLQ1M&Q!A11 !N@QcA#OMQ<1ssƥAQgQAStQA/____B!1P%O?Pv1 vaPE%e ,uE?'E$d"@@Xi#@@M@"?FϠk?de?:C#(tQ2!lS !u:RDr "Q) cADr^vHRz2"/x&# J3-#y3  s~TR=D?2#"_bb1z0G@< l:8<65o3E"?U G?ULu3LTLuLLLG(\&%~?i4F?FCo~;g t+I"T":m ))!A!AuBaaB;B1a1a2}1}11rq'bA>@6\<6qh# uEfY(W`&{3x90]EuApBkDCpU4e8x-kEeU25]6`2 P:^7`C}qE?(ceF͕w AASPuBQQBCO2yy2ph!nDQ\u"#(/Y@Jedo7 t Km%@Rdߪn4xϋ>lY!1!1uBQQB B2228 Q\qaq4A 1ce!cFĿ7M?FMc?mvs&%c—?#`l .d$m ,^ruE  @S#sE٪Ec#5d/7T1,uӢ%7ce//Siv4Q1BATE-y5X#w'2rq(vRp!ô#q-vUS%TMzЊG^:V^AdOV51e@ߟ@OmбLoe4$7iLoh$<$GP-DT!  t&s qLU!3-3V5;?M?_?q???@??;IGoCUvOL?Ynx`&3kH3{deOLe3O?OQOcOuOOOOOOOO__)_;_M___q________oo%o7oIo[omooooooof4o '3EWi{ /ASewя+=Oas͟f^!'9K]ox%S[:XLөͨPbtο(TL^pςϔϦϸƨg N! hL?Չ(L3b@98?JȞPE w ʠg,Қr'rL^p  23Of^),^@^ Pj \vU͟/z.'."?r/q 0B0Tfx RA  0BTfx//,/>/P/b/t////h?/ ?/??(?soo^?~o?00????Qcu9O[JgPXGFl6fjG|OC՜OeWO __/YQzqXPr:Pma?te :RC_U_g_y_@_&_&Ӆe14&11/o&GEOoaoom omnE n*ߤxo? J,EyEAӧ?Afصղ2DVGuOOHz9'*_<_$_H_l_Xooß>o럼DUٴ0ٷ^ٿoAﴬSG114~1@o=Ig,zo񘹜ݰBC:q@@xoA&@@N#`θx(“Aq5ωBqDKADĈEBCx- Fr Iܳ a!#tTSeDQ8zgQ<+B1ED@11 q 3u QE ,E E • yS\zW~?i4F7?q@3Qgt@3΄|ݶ3ɳE1T~%qB:$ҝrB $,B00B;4’C<)4"ss>C4r"6 ]4ؖ IKm1,Ef#t2Wz`&{9B23JB-182U04592E5]8p71D342}Fi5•Fy;?;y4F.% Qm1uy47QH!EPA77h2BDCDSqp,/"/ SU ¾QQrS/#@%KRQNR[ULt__v___KUS__ on OOTDu_1_CYԡԡ2áá$q3}<֚$qy1$ ᙳqcyF7M?FXtՐ~ 㵩אuMz}}xr}?ySu5l~ׁdv׉#"uՐucSٻ͏y•u }yAc y%n~w#'1 ݄3߃N؁ZҮBB%@pT HObY[@/L]SHy#XuO L<䠰P-DT! &z;i5n@n]z 3*Pbt(:L^p/$6HZl~f;//*/<,5fUS[:XLd(7Sv(Q1g X!1P4 T12:ٔR#/!/!ZBQQF;Q;Qs;QQ2Nr<4=ARA>Naa6hAXsȐvTqhp3xFfœvW2`&{@0CϠ5Ѣ-9۠CB@p4U2A@pB@DU-pE8p2@u3p9{@D}Qqt?eF9\wx儤BT\ZEsPZABQBQBBϠR p7h-nsȐZA"ž2R&Ѡ&#ssZBH/œ@Kedo 0\wYUfLm"ϾVZEAnD1>ϺT/q&8Jͩ!!RA1A1Byyrr/rqt4GFRDC/q2܁e|A;bF7/M?FSY55W Me)JZEd@`WoU@@^GnPsbudLun?vASe72???OPO+MWp>OFYHeBѯ̩LiD9<" ;S2TCUAK]!UeZAa'$SE.)cZo+Lh T%#/5/G/Y/k/}///+cW3b?[A'^UT ,TVvHsyt[@8Hs>//q?'?9?K?]?o?????????O#O5OGOYOkO}OOOOOOOO _9o1_C_U_g_y____h___oo%o7oIo[omooooooooo!3EWi{ /ASew2FϏۏ#5G@ֶ`S[:XLoBé ׹ٵq(ǻ#q*ϊ@98?JP HЄ7G~ݴ* .HKgAՂ؀"۳yřѹpѩ hUJ2L):!!^Qc z ! 2jVhz .@Rdv<N`O@A_.#///A/ٿϟ/Y[JgP߾'Fl6f'dd/#|?7_?q?-EAHHum?an 2*a?????#p?]&OŁӅ| LE04'q6yqq{O'~%OOk_ OMN_]m,:]@\_?Џ~%>ew a . __ĿXQ1_/q*Q5&ie6ooN?AhԓŲ~ooo7e*?o鐷o*ض>ضM_q̨(a?A.3,>Ʉ#|_mēOaso$݀oN`q Q,!R Q U "+@v2R?Ԣ${$awLT/1/U/g.פHif///@k03m~//e_?)?;?M?TA)A?r7W??????OO&O8OJO\OnOLU8ݐ6`A@6@-@BBAAA@E@-@6@D*o 5@D3@OAp%9GTa_~Q\ ?GX,_>PjyH_Z_l_______EWoɏojA6űoooo `0BTfAXT~ -=/?"?4?F?X?j?|?ߏ7V9K]'TadyQc'񒡔?W5I3R!3EcOU@Ovb"?@xoA&@@N#`?FϠW?"t*uҫKÿI?O*C2$7vq!TCS-fy+)DS'D8UO_-8.WV@YmlurUQש(e~"~$~,A8U~%e~&v~Ԑ~'߭T\.Si~?i4F?o'Q݁$,A@aщ[/:[(/,(4Q(b:x%8Rb ;<Ӥ! =T>7B?KLjY6$iu(b)Tew923>s8049hE01 D3#?356%ؕ +7E6$A"C8U^P8Q@21aCZģZb[ae,nO\/6p//)CT@K6u ?t4(P~L6}0K]o8UߣߵL%!V/.!//::."+(9,qa*Tq+$7A1TVT7A7I.!!5;#sF7M?Fc?F@;~(e,s¢HM$uw98UBx'd  wr}z  w.%?t:_,ޢe5//W)_;_M___q___/_L|%Q<gwANh!^~1_dͱpi꟒m1e14Be9eo ;x_$<:_$GP-DT! :(daـ(c$1:F1-5?$?6?H?Z?l?~??;TፅFCUMOJQnUdxXap_&:;SckH;S݁??f OO(O:OLO^OpOOOOOOOO__$_6_H_Z_l_~________( o2oDoVohozoooto>oo&8J\n"4FXj|ď֏ 0B@Tfxʟܟ$6ֶO%S[:XL^1өpϐ%70ߧg%m >|!Ϥ׸`(ת3` y@98W?z RP7&6 m) @ :V0q耥2s_ WU9!/;.)'.w//Ts CU i{`1!YEWi{ /ASew//+/=/O/_s////0o/'/An??0?ώ?H[JgP߭7Fl6f7St?3?GNO`OUE-[Mama uB~OOOO.OLO.(};U@4'j_{7m5__Zo_]?_L})mKo0m5/T,N1i } oohN?`:@Ey#8%`?AWղmG|O+O mO'9KOoOO^C_U_y_ ״#U=O}oFӜ5G)=!$1`\h,ͷ۹ᷩϯ3K&d2015J#@@Nm}cp!15H$bT6b$m!Njr!5ffd"WͲW`&{00C 5"-9 C]B:42 A:UBD-EU8239uD}Kn%~+?+~$F3Vr!e~$1q?, ߾?KYkK p,0iC?A*E%Ex$6)L#x0BTҿxΓUN`$,U$FX'? /*>OO ?JG"02A!oKeo!% " S|SqhL c*\$@@Li?FԆ 習TUU%,!VE@@kau[`Mu`S!1}vb"\7㯪%@@JWg;?+$@Jpt4g'@z3Q.b4oFnAA"bg.bp fafJoon%|H/g.f! vPwB$r"HW#P Co[0kq%)*R tNLPazsQR rs!1u,$aw?Amz̿@*2q?@)3? tu$*l$($s /P(e/// !18 RR`9q׏A-ok?OA:́ṔE,7>AK=?n$B?U@pv2ROə].O¿ܗ 0t3!UܓyQK A a*M/~1kl̕|` isڕ%u@YƯخpZT A@F.yD#T8s"0/tAqpAx'ڤg>XA>CtQPČBQQ2 j򋁋?5ER6Pft guWrW`&{1F@00F87-pU9@240D0-F11UC1)24AE}hqŖAwP-DT!?swE*w<:۩*FswnTݿRt1~ BAAAABD!D!2!Ɓ/?e"?F?X<Ĵ"Bũ>jBt?XfI6z0AI1q$9 U;@Cv%/bWD/V! EQc/BTfxo9k2zn#?DRс&Q??&Q'x0<cW`{7s???}Q$D"@@<P BP(?@e4F?j$?@[u"i?Q&zTp8`(gl6 `' E q6Eu}.j'#z/?QLqx-%Xssq{ 'E3 S G i"Q<_lEY-/[_J%dv8%RQ@m$555zGFp'z#xyHfoq{a`, D//'%%X!(7rtG{a(u)e/l8?fl?m4cehPL2 (3GClF(1{psBM2U?a\??H14pK[8q0vEA!X!lAD}X!YE]OdeOU8 _wf%~%ew~e~+U0_΍P_b_ v________j:o,o>oPobotoooooooo\(:L^pv$6HZ~IRAƏҏ䏻////TB!6bal sù^5G?&8{EPr0mate2^1?OO)O;FܐGOYOkG%=EӅC^2LQ4GrILQLQů/!F-?QcŒ焽6!G.uQ\/ p. Ϧ/:A5pŕg?AdDu5lu5ϻx͟ߟ˜ߵ<53EWsEWԯŔUmm /mzb/H/xCG󢁟A#mUAAuQvE ,ArIA, DcC@@g`6@@N#`b4wѐ V㙑Eq5BIBK61"!UEBCu-ڱF jCp !#^Ceԇ8׈DI懡]?4LQvA:eTW,T7[%,T{7[x,T4^ŕ,T7[@5,T7[v,T4^DV,T4Z ^C\#D~?e/T{ QaQgaP[EJGaTe:d"11xaaŒQQ5Q!Q!v;0t2!!dB dtT11b6~tQ(Q`FjA4q5fcĪrW`&{A3p598V@Cp5r421p-B5 - Bp07J 5pD@}gAuvyV=?{;e=FOerGqTń=X$蘈aŕCPőX!X!Bꄰp`a"QpM8oC>oC`ő^R"{{x–QQŒ/c@K5g4?rG%L=͟w @t%.@RTns C)TEAbtv2EBVـ;^O9pXOAm/qD3U TT_t1EAHq;eG)3FNt ?F35)ј@w%'M5 ͿcՈRͩ-t%|5'dݯ.ZAs?sGHv%7-V -EA϶4ZJbEv-5n߀;e^COHqxPt%9 X7'2rGqh%!n1nA6,3QQ$!)Qao =x%)5t!1µp?ɲ86$ ^1?=?O?a?s????????OO'O9OKO]OoOOOOOOOOO_#_OoG_Y_k_}_______ oo)o;oMo_oqol|hS[:XLh~hP("ϣ28UXƘfl?HǔSZPP Ms̺`=>"3VU0N"%9Q^%4աPѬ6 &2UmU\Pe翥Q.Q˿ݿ%7ǗcZl~ϐϢϴ 2pVhzߌߞ߰ߒ .@RvH*£ '9KThc6S܇l" ə#U(:6M/amh0aԠ+3EWi{y0}a(ʣ4}1d)#A#AUGR9K]o%GOM&_GO^) /"/F((:|)8/s s?Ae\ee///%?GY?f'եGOoOOU]dOO]gL]o~88\K#G;<Ӆ_]h%Y,V'>d)i}4oA @@x@@N&d2RhoΘjFCĿ55oU!Жϒa`"adpC(- L"F(" @`cW oHo.:|ev48V'^g&F3#AG 茜T5 a %1 t%  G}1 FE SK#\6~? Ueӏ' * 1}1g$QP1c*Qh%e("Tuń1:r"RQ''G;FB:I< =-Է>:P`"6T6x_Ѵ@sdњf($Wr`&{1U972-UB&@8,4 2 ]-DC&@-ХBV2C A6}=`FEp#?۷nF%Hd`%p.Ht%Pt!..Л〮Ш𱧂2Bp#yϩt!BEr"__jt"8/@K gx0HEuRLk}&Bt%6n@ty1>ET$6aauaarqqFB2121FEa,їA'M|bqǤ`!6J$`!`)֯s#AѤ1e(hqRqFN/t?F݃ 5gew Mq/8.-Y/5dAT, `'&)П?u,@ &/wZ//FE\.??ʥ /?8}/&N/>R?d?1>OOwfᯤJYmxX.W'2rq(>dC!^dNDVA ӱsq7ߍfuJʑbu=YrF:)D<DgP-DOT! x&2 ,eq&QMU2_D_V_h_z____[rCckNoj6 Uu}F8se`h8sӱ*__oo%o7oIo[omooooooooo!3EWi{%/ASew T²ďA#5GYk}şן 1CUgyӯ -?QcuiUAǿٿ!3,hoES[O:XL[.m%7o >O%?=OyAo{w //./@/R/d/v/////// o??*?ε!εNQTua8/CGAAkDO'-DgOICw!|TuĂ\\$qqRqq5! !np0_J.S_RC5J𕗲Ăee$#NN5w!8/J/K]oh| v3~!@Nk5/{ 72?,?.UAEDv/όNw/$)* >s@K_cڣ`O+O=O@,>@ rO`5rOO?OOOOTA?^@H._'_T/K_]_o_________l0Acb^aF5`0a5-`E9bdaCM`8 8I2DG02T[2^a6G`5!`FgoyooœIa:9Ϟzd!oay3=OhoTF.oxn#wBH ,R/PbtlO0BTfxz˰&CÏՏ A@%9K]oɚO __0_B_T_f_x_ "vqA}yvqIK_+eU@oU@њWu>@@~N#`?Fi4/F?l`i!oc$``AyUFѡ-C!s4auoo!86!yƍC,)U"=\5U5 a5%u5&5'-55J@a\pvtd? cvq a>J@!P[O8+{Oq\:UR%% r%%";ĉ$%k"<ă= 2>b%(5!9 ?9?.;2,@n1UD]0BW0-,@0S0AU2F16i09W0DT]r14]0Ai3M02W050:-߫927GG(;eA؝u;Pq,B-A>]0^J78_ ϩ,9pOOIT@K gP5(UL!3N`ruaPAAH/Z/v!OOeqeq"x9ؑa--A9DO.mLƾq$atvaifD!!AxqFNt?Fm?F w Ȱ M/5>.@-_/u'&/7d-&-epؗi`isd~//հ ??u/O=/.L/>$?6?>OOg*<N`r2 a<rQMǿotCQۡPbt߆ߘߪ߼A(:3vp ^A1(5 5|fl?}q@ #I%(P )9,p, 5x%/ Av1b-1@Z%Ub 7&?>%7@>O%?'CUAu }/"/4/F/X/j/|///////&o ??0?B?T?f?x??HO?????Oo,O>Oo AsONOOO_K6* "=Xl_OXqa_sS_ __9e MhMama 1=Oa3ㅀXe43ّّo WEoowo%|q8F}h KܯEJ})i> N xOJU2>B)xç?AZOOűW__;ҏ_o`oroo%>>UXjǘߘ<ߙG*kwtATwkv,4ҹI%sP( B@@@@?N&d2% 7uQ5Wn3;VQ~QP-i5 r BF ϭeIa84IaHRّE+I  .>/U E21 \4V~g? ʼnV"CѦgmϏmMɊT+%::${$$$>A$RB;$ww<$=$m>$hhN"6 41j l1Ufg#t62W`&U{ 48ܐB]U92o2F4UBM-u08]7uD 01 2A}24]5M}5F&;?6;m$6F 1&48Z!>aP>Cu0QCC]D]^p//R/_j >E=a=a11>OCj @%K9gB7MBUL9!_3_N_`_r_E>___n:NOAOϕTOOMYVV=Ҽ==SA?@(E?Q~q}q7; ّ!Z5xϢ'FNt?F7XQt`~y$`uM'q}Mx@~}y>d̤\N`#"TqY`uV;v`;`uSًy`u\.M_yB3ܞVy>Nw5@k}!1!g(s͔xX'2rq՘!Ŀ}MecQbUVs=1U$dyi(uy>Ӱ<=Ԡ]P?-DT! =&azY^U'c1=I ܡ 0BTfxWa(uUϊSUT y UD43C=Ӌ\ ӉᎿɿۿ#5GYk}Ϗϡϳ 1CUgyߋߝ߯ -?Q "hzđ!3EWi{ /ASew+.?Q{ q}Vh%S[:XL(C#(PbtֿΏ(:^pvܟHW1 %a7RaR^p{OOOOTί6rl !#U1@WW_鵼UHumanRQ____VPQP__gUg)c0cR!`4Hg7ϻWi'߸ϟϱ!V-2O%a 7 v߈fO؀%eo#?AT d:L^GzYk؂u\Ia/;e@"ϫF%dUF?F 5>P? @X,@@P( B@|>@)Rp<_WH@z@@{R__HbpM񀱳QVb__^5aA b%g!iwF gBHIAxP`@ .92nlD*~MR!˪X2zAAIAIA2!!"!%v2DV t A!I!a1CU|$tG 3̏3,5vBb/O!X5{{/(:L^)"ǟٟ.##?fV{sԱϱԱG'’///j-@@ (3@ BP(?@e2?@kP?@[2f;!BQ&g}Gw 8`t~zX5q5u$#?QGߙa-f%co 5soA<=IOk%%{s/U@m%%7^Fp'z#x8&CO]Nt)H8NOguN 1?:d4@\88OC~F@~Ƒ_^vTmDJߪڸIϥ:L^߿3@(oQԱEmM?i$AԱќieac_torn "0_B_=25jTfi⧣8BSv3B\S5BSGBLS%:BS_7B<SABS0B,S1BS80BSh0BS;B S.BS9BS:-BtSg2BS;Bd S?B S:BT SMJB S=BGuideTheDoc*Iheritanc-Exmp l"Gestur Fom a Row_1"UMLDiagrmType&msvNoAWutCn 7ec Row_2BmsvNoAplyDwat Gr phicf eLnkCo}nectrHairlneUML Shadow.GenralWiztoW Ar w(Dynamic CoWnetr Row_3 Row_4 Row_5 Row_6 UMLShapeTy UMLObjectGID UM_LEroBeginA7glEndAgle" UMLPresOption1(UMLSup_resOtionNa_vigblty UMLVersionDX1DY1DX3DY3end1_a mend1_mpend2_a mend2_mpNavigbleSharedCompsite,Compsite Navg b l&Shared NvigblQualifer&Shared Qulif e,Compsite Q_ualfer@Compsite Navg b]lQu lfer:Shared Nvigbl WQul f e,Navigble Qulfer"Procedue C7al (Asynchwroou_ FlwFlat ow&realiz_sub5hp real_sWubhp$Watermrk T5il(Left Asynchroo u" visDecrpton visVerionUML,Viso ExtenuddDaaClassUMLTemplat,UMLAutoockTexE7di"UMLPresOption2DefaultWidh EnsureWidthOKRow_7Row_8OperationsuAtribuesNamePa}rmetrsUMLPagweGID*St}aic rut re-1"GenralWizto Di_scrmnatouAding Clas NoteConstraitClwas.1Clas.20(GenralWizto.31Clas.32Clas.41(GenralWizto.50Basic&45 degresi5nlNote.28Remov Clas VXX3L+E3L,G3H,.G3kKK,%G3̍Lp,E3lK,&G3TH,(G3L,E34OS,CG3S!-G3S;-G3āST-G3UPr--G3H-*G3L-E3L-E3,L-E3DL-E3G3I1;G3HP1.G3lK~1&G3H1*G3S1G3H1(G3mK2#G3,mK22'G34HY2-G3TmK2$G3$S2G3bB2 E3dH2.G3L3E3DS3!G3H230G3|mKb3'G3mK3"G3mK3%G3L3E3ԎL3E3dS3G3S4G3L*4E3S84G3ăST4G3Hs4)G3mK4$G3nK4#G3DnK4"G3L5E3S5G3S05G3$SI5G3Hb5)G3DS5G3dS5G3$H5)G3L5E3TH5(G34L6G3m66"G3zX6E3z\6E  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWU Rt4"H$ @Y,b'@ |L>C-$%k%*7 AU%t4 ~m}>C>-NR@-~>7RH<(H<(JE>~? REl:~@ R{ * g"4FX 0h(^@(nQW)\@jKzQ`BJ \TPzp.LUjPHP  ҔvTYoR$px!)4UwR'QP P1rd5 P25`6?U{>*ODC @H%a!././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/inheritance-refactoring.pngdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/inher0000644000175000017500000000252511520622616033720 0ustar directhexdirecthexPNG  IHDRlԓ3sRGBgAMA a cHRMz&u0`:pQ<0PLTE$$$000<<<@@@]]]}}}oIDATxOh#Ua BYћڱ K)BɃc XtOEXaoX$\ *HbV"aYtRtkII-{&/{3Z e Е`%rm"󷑵futt#`l26Ҿr^U `in>כagF"#/u)vYt-y9Gظ ]4 n5SWA ;w E>VJnHWǯ%̴-ku;jX+iV 5LgD xfJ"dn~ e''իvRCs>Ur|¿YJ{ƣ*/,k~@UOY`5MkAҵ 'jMV [Z?B9ChvL{ < SJSF?_zɋNڃY>&~,_\,k$*>UMS_eXc5Xc5XcTiEga٢FyZRѡE {- `ɖ8%連偓l͟I2L V, ˛an%o Pƪv`AYt2XWG.@ jm -ìocqۖ}Q0 )lZy9(&^jc& SZC 4uiN\yܶ0\37|HS}kN!!s  *|Z<q&~rA37[&Ə0R{zoڈQ5KeH.XcG@6"-r󼔟Xc-hYǵj9Я/kEfizzZx_kiY4&'DZsE%CZjDڠtr4D{p|ND^Xc5Xc5X~Z#תu -S>1\kFo4#(Y,*xZ˶P@.8k'x`@ ]]7oM~V(L扖||kc 7.AtJ;"jJn/_DӑhZXn_] qs7=݊77 kjVƚ^]kSoM-m Z4Tw*IENDB`././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/automatic_refactoring.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/autom0000644000175000017500000000744511520622610033740 0ustar directhexdirecthex Automatic refactoring
You are here: Advanced Features > Refactoring And Schema Evolution > Automatic Refactoring

Automatic Refactoring

In simple cases db4o handles schema changes automatically:

  • When you add a new field, db4o automatically starts storing the new data. Older instances of your stored class have the default value in the new field.
  • When you remove a field, db4o ignores the stored value for that field. The stored value is not removed from the database until you update the object or run a defragmentation. Meanwhile the old values are still accessible with the StoredClass/StoredField API.
  • You can add an interface to a class any time. The db4o operations are not affected by interfaces.
././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoring_api.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000001650611520622610033671 0ustar directhexdirecthex Refactoring API
You are here: Advanced Features > Refactoring And Schema Evolution > Renaming API

Renaming API

db4o provides a special API to move classes between namespace, rename classes or fields.

Rename a Class

Use the configuration API to rename a class.You need to rename the class before you open the database.

Remember to include the assembly name.

configuration.Common.ObjectClass("Db4oDoc.Code.Strategies.Refactoring.PersonOld, Db4oDoc")
    .Rename("Db4oDoc.Code.Strategies.Refactoring.PersonNew, Db4oDoc");
RefactoringExamples.cs: Rename a class
configuration.Common.ObjectClass("Db4oDoc.Code.Strategies.Refactoring.PersonOld, Db4oDoc") _
    .Rename("Db4oDoc.Code.Strategies.Refactoring.PersonNew, Db4oDoc")
RefactoringExamples.vb: Rename a class

Rename a Field

Use the configuration API to rename a field. You need to rename the field before you open the database.

Remember to include the assembly name.

configuration.Common.ObjectClass("Db4oDoc.Code.Strategies.Refactoring.PersonOld, Db4oDoc")
    .ObjectField("name").Rename("sirname");
RefactoringExamples.cs: Rename field
configuration.Common.ObjectClass("Db4oDoc.Code.Strategies.Refactoring.PersonOld, Db4oDoc") _
    .ObjectField("name").Rename("sirname")
RefactoringExamples.vb: Rename field

Rename Step by Step

The safe order of actions for renaming is:

  1. Backup your database.
  2. Close all open object containers if any.
  3. Rename classes or fields in your application.
  4. Add the renaming call to on the configuration before opening the database.
  5. Pass the configuration with the rename-information to the object container factory. Open the database and you're ready to work with the renamed classes or fields.
././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoringjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000000641311520622616033673 0ustar directhexdirecthexPK }*6 newclasses/PK6J i"newclasses/RefactoringExample.javaT]o: }vOJ)C-P`ٖa/P6j%GbdCI0xxIXk#gl܃''T}nj,\=Q}6,K]< j3w\θBdT3pZCU h~$"!?"H{|">u+e1_Yކ]RfO]+Q%/Jj#!R, r1S@8?^]y(5XAaLNNeE@y$1kT2BYE @iv}4WD[ULEek*ޓRARdֱkp\p/,⿝eL7 KMiTJkKXq ST*F8?giIsZYoM%blwR%*Lc |/z5sK~Ԋ$2 ߋ<-*F7 :b4d;hAzP;r"| VLrzk_H(R{d&+̍INrI0^wP@gvś&Sʌ\N_$JOpE.zJg2TP.Qi1%|Fij>{gMS(_D f,Y[GzQehiY]qpfF;Ye2ژlmг[;}@u-VWNī-q nf#{d 7XkndJPhWO=ۯm6F՚9 r:e*b>4|<[P c- #*-X75dl M}~w-n.<8>~EӃχkni󮢖G(hL3a噭ͩ\%xjn}D @^K׎8ց5X ∩pd}(~M?ׯ8RLKOֱKbG.MTU3`*n7чRݽ>?tmxE1Cڔ3lwQ˺I_niDIo []ΝJyNk6_eHj3UVPK( }*6 $newclasses/  4ށ94 4PK(6J i"$ )newclasses/RefactoringExample.java q+q|߿|@x4PK(b6cw $ newclasses/Pilot.java q|߿||4PK(`6M4$ newclasses/Identity.java z_q|߿||4PK(M6fP99 $ /Pilot.java }q|߿|4PK(@6Q $ PilotNew.java Ct|߿|`4PK(#u6ڶ $ RefactoringExample.java ]w|߿|`4PK/ ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/add-new-type-to-hierachy.pngdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/add-n0000644000175000017500000001723111520622616033576 0ustar directhexdirecthexPNG  IHDRmsRGBgAMA a cHRMz&u0`:pQ<IDATx^MWz3-,!<A۸x# ٣`sk˂`,B i`40A`YB(L#C@ hA YZ,K-w=o듏u[uNszkS]9:syg}.ӧKm_Ͽ(Z#K. o \padU5 w&:s޽XA/킅L]MxqFׂb1Ts/_Le+;Jo ]=uuVw/MΪ^fkkɘXmi ܿߎ;v,Ŭ%shX`u`yiAXsTېXmޅ0P!Ʉ_U뤁/\r劒;w. `U2h񴔶OTJeo>4&H9:"֎!{M 0BpD`a&jz&n3NGYk׮=|0L)iÔjRJ6؎9jG-n`B[3xJn'4|^xwo^9,805V&rʁ\re"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u`'`u`"`ue"`u``={湺x`iiI~kkkwg}E,?~|ssɓ3 zsv:`kׯJR|> V>~YA"=lM7?k:mP[RH XgYn-)*`Ma3Ft"@a#aky X9k*I5ŜQNkXJfQ`X Fɀ5X BXM3`aF%liUV`kY X; WvZrn-l2k X#ڿssWS W̯~65ejR뼳fg8`m-]xZzKoEyϖ_WW<"6ooU<9ν - 59%U.:2!nW,M3ZQ\}!na~-,5q-*,`վW8vĒOWxZ.KjaA@ކҴ%VqZ(Y<`U(Q!!7Z/a.7J`++ R%.WECFg[FU3-2L4LrFp&xOuURi!D5tŽe5RJ<~U4Vcj}*6V0g_ \۷6dS`8K;oZ*XU, ` Wfee0&ֹrSZ8ThтZpn^ Tu^EWZX[5Ж5<:X'jg . KU [\v@u@G VlXV1SfwqE\ ``Xg+Ā5XUruApi'RԂ]\avrYjņˢO%*ju95,(A.dE:묊eFHBFs=wO.sr۪ ke;UK U[yB|QVn ŭ{UvNLsqdEpuנjyX[KcF"dd ŜQ>FQXd+;`Uj]ÌJgbC(F1Bkw k&XJfQ`2;FÀ5/ v`CոsΥKǡjy XK:k 3/TM1ck UV&`&[&5)v`ݷ'z@wY<#TM7Kk:mP`wn?МRBդ& ֭^ sA3V ^UN\ّ#G&6pxڃUX:YMI U׷/\p9)|ҵ;wM Ѷ) Ut\>o.\m':U Xs4nl+VqHXcJyiH֌ X 9 X :UU :Xj`'omzqr 쨚X:ujPSz]RQ5>|L^`M.1S "Xsj`GK6mai>|-VoaQ0`8(*)Usk@6[ ǎXʕ+ڿ{uD6,;wΎ+6 Bu0 !m RvuD2)X}b᪔@`ʩm'O[ > X;"֞?Xv!+ gvUʾ `~#)دB F2#ѽ,*`> 2)!s6T);nҰ) {g޽oN!˴66 切vGU4nJc*ՍCӧ=SՍC|x X}^VVV.~p-],`-~V-||R# KKD>+  Jk?d .^"sJz?@^? Xϖ^Ȝ S,$tjkzXkG {"sJkb{*$tjkzXkG {"sJkb{*$tjkzXkG {"sJkb{*$tjkzXkG {"sJkb{*$tjkzXkG {"sJkb{*$tjkzXkG {"sJkb{* MMNBX__+դPP2 Ǐלds_|(h hRε ښ/؊U~ꫯ뀢n n咛5\X;KA5"4F1"k>tkOt YYн.iyg?޽{۲ zzpq*6UxuVV.z탖S0iUZVV.dz>KX|W\-ݻwkdB(o/Q<(Hz뻭ڟFOm?C_v6$kG}eǭ; 9w\"#: X; Hv@`4,LaW|k׮(CT `L/.WӃe*R DR st<ݨ!T 2j1.ԢVO%Šw2넋WS#&`U ScX ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' VFV> ' X`u2!=z*)ׯ_#k(IENDB`././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/remove-type-from-hierachy.pngdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/remov0000644000175000017500000001751011520622616033743 0ustar directhexdirecthexPNG  IHDR4ѡ+sRGBgAMA a cHRMz&u0`:pQ<IDATx^Ody[+f,;6ajLllbO# 7qLh1̀, Ftp͈AaB@1cbEhȢgً^v󍮯^UWuߣ(^9^z~VΝ9Ǝ ܺu4 뭷K6@Xqh[ AO!{pp*d+dǴxVIc(Ц@vɶعfm(mnnؤmI> t@)UV'Èwuu5v² ٜaR8&*M$*ؔ&˓ةw܉Oè[j?uRjZ)Pd/mw}}=^癬bg׳HhV"Mm^R`^J> ٜaR,Ȋ\Z udd^bXCVoD Ԫ%E@bz!Z@qR'QR>kN=!Uoc711J)-;ɷ;YChP[5CV ҩKed Y%Z,M+iz(}K&kzD @C!+JrXmUw8 ǚl˳P`(TR^t!Ni~GW%T=ź%u-Vcո.G_CkU֪_e(P@aZYT `,upLYT `,upLXzjg^ԫm)JX(P ׮]Y3|UtR3ѣ,8r`u0:H Yc`u0:H Yc`u0:H Yc`u0:H Yc`u0:H Yc`u0:H Yc`u0:H <~pRIX ,\r;U3-H (`oM[ӁUI@(k..,9DB (`u5YT `,upLY=z*W@WmU pxYt)!W(@&F~F@v{{, 'p kb:51 dԢpYL08vʊK-d[ H "Wfss3vEj~ghg8B ;CȶL[, `RHd Djjj6!NLvkkKMJ'"kj)njwIYƆGIhs@wdFWȎY5xy6AV/H=k<7I#F:Dp"KMD-zZW=8 [}_d#Mll_ְez(ΘEɄh3A6tdPJbJy4聬 g!4Zbe@lʎtW4diwa6VPB6bnQKI:AvpwB֭[i%]CKqAL@!s\1 `i&;B!+N?w_|qhɪ Mv\S *lJlyN!;r![j{(+!/~񋞐sk< ~{{Z_~ W]lLN&kll`d ؑzt/ O k'd|59ޞ+WFs50z +{.5duU055H Yk`5H Yk`5H Yk`5H Yk`{iw7Ǭoj޴?#4۷o?3#*|ȚK޽[$,WѲ\``"! W huܹ8 d[[| [E Vqȶa36@G?׾ՊY ;i/@SyiVO+,-eM0 ;xTGUY [;s@DB@ي8 d[[| [E z [ glϸ ;c~: lәd;KQ/d,-eM0 ;xTG [8gl=S_OSv@d.lQv0 b9 dSlNQlC![&gLk=֤h9 dKT d Eh8~@^zW^y2… zM@s٣#c(/}K?wׯ_0\ [gy7oݺ)wpv 3F`^'|=B3Oם+0dl ͛7;qٙ[:T`<,Rc261Wq-ٙ[:T`l.\LԞ~첋 ibDI g[_rn -щBζ0*mPܮ W]9Mr`$+09dl+¨`zVkKuWiah\ڂ,taF\/Lꖮ@㙭k {%fx3Zu(.d i8|\ȖcT! g'˗jvl0IpvRW׏B4Ux#s$U,nxANn\RZ81qtY8;sY񣏌{%OBFN}BN2[ BX+#֏充K>$ppvl 7n;o2|{'&no=GY8b j6m ȖY s \KamM/>l*pΝ´jg(W|ռHKrl1 d ~Z^#S>`e6qV;#Y*ztB%}QdK,:aU6Q294EMu =Ӛl® 9,Rm*/Ψʑ㔚aVN$Q [dY dJU|M6-dml}3ټ|,5h8XFS>Գ&N$`vС ȘVK[l$i52Ȧ%&/2de\?;x񡧧4EKj R<p Bu ;Pd㟚"ՖXW~#Ս=iaf Y8H3H3B└zǵQ ʧ3]6+oYlR zi7>MK zܙi47ݻοǪ.=2\3?g ??4gǟ7hTbp6@vqM(bHgiHMl^Q$v7O},/?~U*tb~5,?p@f>_ so MGouMV7ő,6%!C4NV!;09N! adz Ȏf=C! aǞ@vl8 , a'@v;u! a'@vB>]t! a'@vr ia )B¶2l+2ȴӂ,mkNٶ(dYl-IS+d,mwvC¶>l` .! a@ Ui3lgZ ۑ4ۍ@BnIYn]cح޴j-Or۩_[cNƷ4OU'qC񍓇^ -\u v Vd xl 9S` B ;E-h7=-v%O8@'h/3l+=13V E7<7oZCt'4V![a%9՜˗/Z8~*4x\¨t "l,Ѳ͇ ![adYݪ|ZCѣxH@&-@fbZCVsYOm&Ͼw [2d677&=̻/d\&32 [2dWVV=irz (_6Yu=kv"I\ [,ac*GüX>{Q֖EHQMd plsْ [5d#ՒBxz\ץZm2= >J~j"lמTfgg)fK]^*f@_N!|C!|S]1wcc#INy'.kOHcdHtebSs jOӐ-CVPb UڡM@"T«ʤ5XvP 2IK@vj*[>djZf vu_Ȧ%2')l06![ a /d׳ܞLȶyLDU\9A"V tR+b4OB,D#*-גp\bW^{YKKKGGG]z16VHӹ~޳'/VƗ8W2ټh'JtFK6kzl݈ d`B^A[r&6k1m mQL*TkBgԇd.9BZV <.нYP a*( |[ 뾿z\e"ݻ'|V2>u>VRX.Ըa\#Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*poVC~O%v լLvxd \a*>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L>@T #Q*d=L} ٻw;wn>paA&yLMs)doܸWo^nosktkmmM&noo{LMs {pp|F1i;z d=||X1d?\>P,X[h$vFîF-C6D_}_KNѶzE666hD{Fܥm@4G $JaZ@ ـ8茴TX>!N-pMaH( TY% YU Ytmi"F#AfQeA\!;L dBMKN [) dBVHdVZ=H,G H T _:'M2ٴ*Xǂ@:ֳ\@&;Ģ0 @ؓ{7$ Ώ%U^y#FL6o rAQv0cMO=6SF뺕Z@iP.umȺ:K\ YAupLEb0U: d\$S]_cV%RBXzg}[ ?^&;D \`,.@X "1*d.@X "1*d.@X "1*d.@X "1*d.@X "1*d.@X "1*d.@X "1*d. l݊@gPb27'v W eEb0U: d\$S@Eb0U: d\$S@Eb0U: d\$S@Eb0U: d\$S@Eb0U: d\$S@Eb0U: d\$S@Eb0U: d\$S@Eb0U`͛&)m:K *V`QTPH IENDB`././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/field_type_change.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/field0000644000175000017500000002067611520622606033704 0ustar directhexdirecthex Field type change
You are here: Advanced Features > Refactoring And Schema Evolution > Field Type Change

Field Type Change

db4o's default policy is to never do any damage to stored data. When you change the type of a field, db4o will not update the data in this field. Instead db4o internally creates a new field of the same name, but with the new type. For existing object, the values of the old typed field are still present, but hidden. Of course you can access the old data. When you want to convert the content from the old field type to the new field type, you have to do it yourself.

You can use the stored-class API to retrieve the data of the old typed field. An example: We decide that we want to refactor the id-field from a simple int to a special identity-class. First we change the field-type:

public Identity id = Identity.NewId();
//  was an int previously:
//    public int id = new Random().nextInt();
RefactoringExamples.cs: change type of field
Public m_id As Identity = Identity.NewId()
'  was an int previously:
'    public int id = new Random().nextInt();
RefactoringExamples.vb: change type of field

After than read the old value from the old field-type and convert it to the new type:

using (IObjectContainer container = Db4oEmbedded.OpenFile("database.db4o"))
{
    // first get all objects which should be updated
    IList<Person> persons = container.Query<Person>();
    foreach (Person person in persons)
    {
        // get the database-meta data about this object-type
        IStoredClass dbClass = container.Ext().StoredClass(person);
        // get the old field which was an int-type
        IStoredField oldField = dbClass.StoredField("id", typeof (int));
        if(null!=oldField)
        {
            // Access the old data and copy it to the new field!
            Object oldValue = oldField.Get(person);
            if (null != oldValue)
            {
                person.id = new Identity((int)oldValue);
                container.Store(person);
            }
        }
    }
}
RefactoringExamples.cs: copying the data from the old field type to the new one
Using container As IObjectContainer = Db4oEmbedded.OpenFile("database.db4o")
    ' first get all objects which should be updated
    Dim persons As IList(Of Person) = container.Query(Of Person)()
    For Each person As Person In persons
        ' get the database-meta data about this object-type
        Dim dbClass As IStoredClass = container.Ext().StoredClass(person)
        ' get the old field which was an int-type
        Dim oldField As IStoredField = dbClass.StoredField("id", GetType(Integer))
        If oldField IsNot Nothing Then
            ' Access the old data and copy it to the new field!
            Dim oldValue As [Object] = oldField.[Get](person)
            If oldValue IsNot Nothing Then
                person.id = New Identity(CInt(oldValue))
                container.Store(person)
            End If
        End If
    Next
End Using
RefactoringExamples.vb: copying the data from the old field type to the new one

db4o's approach gives you the maximum flexibility for refactoring field types. You can handle the convertion with regular code, which means it can be as complex as needed. Furthermore you can decide when you convert the values. You can update all objects in one operation, you can dynamically update and covert when you access a object or even decide not to convert the old values.

././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoring_class_hierarchy/db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000755000175000017500000000000011520622610033657 5ustar directhexdirecthex././@LongLink0000000000000000000000000000023700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoring_class_hierarchy/removing_class_from_a_hierarchy.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000001461011520622610033663 0ustar directhexdirecthex Removing Class From A Hierarchy
You are here: Advanced Features > Refactoring And Schema Evolution > Refactoring Class Hierarchy > Removing Class From A Hierarchy

Removing Class From A Hierarchy

In this example we have a Human class which inherits from the Primate class. Now we want to remove the Primate class and let the Human class inherit directly from the Mammal class.

Unfortunately db4o doesn't support this kind of refactoring. We need to use a work-around. Basically we create a copy of the Human class with the new Inheritance-hierarchy and the copy the existing data over.

Step by Step

  1. Create a copy of the Human class, for example HumanNew!
  2. Change the inheritance of the HumanNew-class to inherit directly from the Mammal-class.
  3. After that, load all existing Human-instances, copy the values over to HumanNew-instances. Store the HumanNew-instance and delete the old Human-instances

Now the objects have the new inheritance hierarchy. You can delete the old Human-class.

IList<Human> allMammals = container.Query<Human>();
foreach (Human oldHuman in allMammals)
{
    HumanNew newHuman = new HumanNew("");
    newHuman.BodyTemperature = oldHuman.BodyTemperature;
    newHuman.IQ = oldHuman.IQ;
    newHuman.Name = oldHuman.Name;

    container.Store(newHuman);
    container.Delete(oldHuman);
}
RemoveClassFromHierarchy.cs: copy the data from the old type to the new one
Dim allMammals As IList(Of Human) = container.Query(Of Human)()
For Each oldHuman As Human In allMammals
    Dim newHuman As New HumanNew("")
    newHuman.BodyTemperature = oldHuman.BodyTemperature
    newHuman.IQ = oldHuman.IQ
    newHuman.Name = oldHuman.Name

    container.Store(newHuman)
    container.Delete(oldHuman)
RemoveClassFromHierarchy.vb: copy the data from the old type to the new one

Note that this example doesn't change existing references from the old instances to the new ones. You need to do this manually as well.

././@LongLink0000000000000000000000000000024000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoring_class_hierarchy/inserting_class_into_a_hierarchy.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000001466711520622610033677 0ustar directhexdirecthex Inserting Class Into A Hierarchy
You are here: Advanced Features > Refactoring And Schema Evolution > Refactoring Class Hierarchy > Inserting Class Into a Hierarchy

Inserting Class Into A Hierarchy

In this example we have a Human-class witch inherits from the Mammal class. Now we want to introduce a new Primate class and let the Human class inherit from it.

Unfortunately db4o doesn't support this kind of refactoring. We need to use a work-around. Basically we create a copy of the Human-class with the new Inheritance-hierarchy and the copy the existing data over.

Step by Step

  1. Create the new Primate-class
  2. Create a copy of the Human-class, for example HumanNew!
  3. Change the HumanNew class to inherit from the new Primate-class instead of the Mammal-class.
  4. After that, load all existing Human-instances, copy the values over to HumanNew-instances. Store the HumanNew-instance and delete the old Human-instances

Now the objects have the new inheritance hierarchy. You can delete the old Human-class.

IList<Human> allMammals = container.Query<Human>();
foreach (Human oldHuman in allMammals)
{
    HumanNew newHuman = new HumanNew("");
    newHuman.BodyTemperature = oldHuman.BodyTemperature;
    newHuman.IQ = oldHuman.IQ;
    newHuman.Name = oldHuman.Name;

    container.Store(newHuman);
    container.Delete(oldHuman);
}
AddClassToHierarchy.cs: copy the data from the old type to the new one
Dim allMammals As IList(Of Human) = container.Query(Of Human)()
For Each oldHuman As Human In allMammals
    Dim newHuman As New HumanNew("")
    newHuman.BodyTemperature = oldHuman.BodyTemperature
    newHuman.IQ = oldHuman.IQ
    newHuman.Name = oldHuman.Name

    container.Store(newHuman)
    container.Delete(oldHuman)
Next
AddClassToHierarchy.vb: copy the data from the old type to the new one

Note that this example doesn't change existing references from the old instances to the new ones. You need to do this manually as well.

././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refactoring_class_hierarchy.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/refactoring_and_schema_evolution/refac0000644000175000017500000001135611520622606033674 0ustar directhexdirecthex Refactoring Class Hierarchy
You are here: Advanced Features > Refactoring And Schema Evolution > Refactoring Class Hierarchy

Refactoring Class Hierarchy

db4o does not directly support the following two refactorings:

  • Inserting classes into an inheritance hierarchy.
  • Removing classes from inheritance hierarchy.

Note that interfaces don't influence the inheritance-hierarchy and can be added and removed at any time.

For example we've following classes:

 

In this example you cannot introduce a 'Animal' class above the 'Mammal' or add another class between 'Mammal' and 'Primate'. Also you shouldn't remove an class form the inheritance-hierarchy.

Currently the only possible solution for this refactoring is this.

  1. Create the new hierarchy with different names, preferably in a new package
  2. Copy all values from the old classes to the new classes.
  3. Redirect all references from existing objects to the new classes.

Take a look at the example to how to add a class into the hierarchy. See "Inserting Class Into A Hierarchy".

Or how you can remove a class from the inheritance hierarchy. See "Removing Class From A Hierarchy"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/exceptions.htm0000644000175000017500000001157611520622606027017 0ustar directhexdirecthex Exception-Handling
You are here: Advanced Features > Exception-Handling

Exception-Handling

A part of the db4o operations is handling possible exceptions. There are two fundamental different exception-types for db4o. The recoverable exceptions and the fatal exceptions.

Recoverable Exceptions

The recoverable exceptions are all exceptions which don't endanger the consistency of the database. For example if a event callback throws an exception. After a recoverable exception you can continue to work with the object container.

Typical recoverable exceptions are:

  • Exceptions in callbacks.
  • Passing invalid ids to the object container.
  • Unsupported schema-changes.
  • Constraint-violations.

Fatal Exceptions

A fatal exception will immediately shut down the object container without committing anything. This tries to protect the database from damaging itself. Any exception which happens in the db4o core and is not expected and handled is considered as a fatal exception. Because when an exception happens in the db4o-core, it could cause a invalid state in the db4o-core and then cause further errors and lead to database corruption. That's why the policy it the stop immediately any operation after a fatal exception.

Typical fatal recoverable exceptions are:

  • Exceptions related to runtime, like OutOfMemory-exceptions
  • Exceptions related to corrupted database-files.

Handle-Exceptions

Take a look a the list of the most common db4o related exceptions. See "Exception Types" Handling db4o exceptions is nothing special and complies with regular exception handling.See "How To Work With db4o Exceptions"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/system_info.htm0000644000175000017500000001731611520622614027172 0ustar directhexdirecthex System Info
You are here: Advanced Features > System Info

System Info

You can ask the object container for basic system information. Following information can be accessed:

Freespace Size

long freeSpaceSize = container.Ext().SystemInfo().FreespaceSize();
Console.WriteLine("Freespace in bytes: {0}", freeSpaceSize);
SystemInfoExamples.cs: Freespace size info
Dim freeSpaceSize As Long = container.Ext().SystemInfo().FreespaceSize()
Console.WriteLine("Freespace in bytes: {0}", freeSpaceSize)
SystemInfoExamples.vb: Freespace size info

Returns the freespace size in the database in bytes. When db4o stores modified objects, it allocates a new slot for it. During commit the old slot is freed. Free slots are collected in the freespace manager, so they can be reused for other objects.

This method returns a sum of the size of all free slots in the database file.

To reclaim freespace run Defragment.

Freespace Entry Count

int freeSpaceEntries = container.Ext().SystemInfo().FreespaceEntryCount();
Console.WriteLine("Freespace-entries count: {0}", freeSpaceEntries);
SystemInfoExamples.cs: Freespace entry count info
Dim freeSpaceEntries As Integer = container.Ext().SystemInfo().FreespaceEntryCount()
Console.WriteLine("Freespace-entries count: {0}", freeSpaceEntries)
SystemInfoExamples.vb: Freespace entry count info

Returns the number of entries in the Freespace Manager.A high value for the number of freespace entries is an indication that the database is fragmented and that Defragment should be run.

Total Size

long databaseSize = container.Ext().SystemInfo().TotalSize();
Console.WriteLine("Database size: {0}", databaseSize);
SystemInfoExamples.cs: Database size info
Dim databaseSize As Long = container.Ext().SystemInfo().TotalSize()
SystemInfoExamples.vb: Database size info

Returns the total size of the database on disk.

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/0000755000175000017500000000000011520622616027620 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net/db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net0000755000175000017500000000000011520622616033620 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net/db4otool/db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net0000755000175000017500000000000011520622616033620 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net/db4otool/db4otool_usage.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net0000644000175000017500000003003711520622616033625 0ustar directhexdirecthex Db4oTool Usage
You are here: Advanced Features > Enhancement Tools > Db4otool > Db4oTool Usage

Db4oTool Usage

Db4oTool is a command line utility. The general syntax is the following:

Usage: Db4oTool [options] <assembly>

[options] parameter allows to specify a list of options.

<assembly> parameter allows to pass an assembly, which should be optimized.

Both parameters are optional.

Running Db4oTool.exe without any parameters will bring you a short usage hint. This is equivalent to running Db4oTool with -? or -help parameter. Additional help information can be retrieved with -help2 or -usage parameters.

The table below gives an explanation of all Db4oTool options.

-by-attribute:PARAM

Filter types to be instrumented by attribute:

Db4oTool -ta -byattribute:Activatable MyAssembly.exe

-by-filter:PARAM

Custom type filter:

Db4oTool -ta -byfilter:IActivatable MyAssembly.exe

-by-name:PARAM

Filter types by name (with regular expression syntax):

Db4oTool -ta -byname:MyCompany.MyProduct MyAssembly.exe

-not

Negate the last filter

Db4oTool -ta -byname:Db4objects.Db4o -not MyAssembly.exe

-case-sensitive

Specifies if optimized queries should be case-sensitive. This option should be used in conjunction with query optimization option (nq):

Db4oTool -nq -case-sensitive MyAssembly.exe

-collections

Instrument native collections for transparent activation/persistence.

Db4oTool -collections -tp MyAssembly.exe

-debug

Preserves the debug information, to step through enhanced assemblies with the debugger.

Db4oTool -debug -tp -byattribute:Activatable MyAssembly.exe

-fake

Fake operation mode, assembly won't be written. This option can be used for testing before the actual run.

Db4oTool -nq -fake MyAssembly.exe

-? -help

Show standard help list:

Db4oTool -help

-help2

Show an additional help list (development use):

Db4oTool -help2

-install-performance-counters

Enables performance counters for this assembly:

Db4oTool -install-performance-counters MyAssembly.exe

-instrumentation:PARAM

Use custom instrumentation type.

PARAM is a string with a full class definition, like

Db4oTool.AbstractAssemblyInstrumentation, Db4oTool.exe.

This class must implement Db4oTool.IAssemblyInstrumentation interface. To make the creation of a custom instrumentation class easier db4o provides Db4oTool.AbstractAssemblyInstrumentation class, which can be used as a template. For an example implementation see Db4oTool.TAInstrumentation class.

-nq

Optimize Native Queries

Db4oTool -nq MyAssembly.exe

-ta

Instrument classes to support Transparent Activation:

Db4oTool -ta MyAssembly.exe

-tp

Instrument classes to support Transparent Persistence (Transparent Activation support is included implicitly):

Db4oTool -tp MyAssembly.exe

-statistics:PARAM Shows statistic information about the database. For example Db4oTool -statistics databaseFile.db4o

-usage

Show usage syntax and exit:

Db4oTool -usage

-v -verbose

Verbose operation mode. Should be combined with the other options:

Db4oTool -ta -v MyAssembly.exe

-V -version

Display version and licensing information:

Db4oTool -V

-vv

Pretty verbose operation mode:

Db4oTool -ta -vv MyAssembly.exe

././@LongLink0000000000000000000000000000022200000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net/db4otool/including_db4otool_in_the_build.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net0000644000175000017500000001335111520622616033625 0ustar directhexdirecthex Including Db4oTool In The Build
You are here: Advanced Features > Enhancement Tools > Db4otool > Including Db4oTool In The Build

Including Db4oTool In The Build

The easiest way to use Db4oTool is to include it directly into the build process. This will enable you to get a processed assembly immediately after a successful build. If you are using Visual Studio Compact Framework emulator, you will get the processed assembly straight into the emulator.

Use the following steps to enable Db4oTool in Visual Studio project:

  • Make sure that Db4oTool.exe together with the other libraries from the bin folder in the distribution are accessible to your project.
  • Open Project Properties page and select "Build Events" tab.
  • In the "Post-build event command line:" enter the required Db4oTool command:
    • [path_to_Db4oTool_folder]/Db4oTools.exe [options] $(TargetPath) if Db4oTool is included in your project's references, [path_to_Db4oTool_folder] should be skipped.
  • In the "Run the post-build event:" select "On successful build"
  • Run the build. The resulting assembly will contain all the modifications made by Db4oTool.

An example of this is included in the distribution in src/Db4oTool/Db4oTool.Example folder.

Possible usages:

  1. Native Query optimization: [path_to_Db4oTool_folder]/Db4oTools.exe -nq $(TargetPath)
  2. Transparent Activation support for the whole assembly: [path_to_Db4oTool_folder]/Db4oTools.exe -ta $(TargetPath)
  3. Transparent Activation support for MyClass objects: [path_to_Db4oTool_folder]/Db4oTools.exe -ta -byname:MyClass $(TargetPath)
  4. Transparent Activation and Transparent Persistence support: [path_to_Db4oTool_folder]/Db4oTools.exe -tp $(TargetPath)
For more Db4oTool options please refer to Db4oTool Usage. ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net/db4otool.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_.net0000644000175000017500000001140311520622610033613 0ustar directhexdirecthex Db4oTool
You are here: Advanced Features > Enhancement Tools > Db4oTool

Db4oTool

Db4oTool.exe utility is distributed together with db4o .NET version and can be used for native query optimization and transparent activation instrumentation.

The main use-cases for Db4oTool are:

  1. Optimization of native queries at build time. This will improve Native Query performance by cutting of query analyzing time during execution.
  2. Optimizing delegate native query syntax on CF2.0. This optimization can only be done by Db4oTool as CompactFramework 2.0 API does not expose any of the delegate metadata needed for the optimization process.
  3. Transparent Activation/Persistence instrumentation. This will enable you to use transparent activation without modifying your classes or to use transparent activation on third-party classes.

If you use Db4oTool for use-cases one and two you will be able to distribute your application without Db4objects.Db4o.NativeQueries.dll (the assembly where the Native Query runtime optimizer lives).

See how the command line options of the Db4oTool. See "Db4oTool Usage". You can call the db4o tool also from Visual Studio. See "Including Db4oTool In The Build"

././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java/db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java0000755000175000017500000000000011520622606033674 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java/complex_example/db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java0000755000175000017500000000000011520622614033673 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021700000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java/complex_example/load_time_enhancement.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java0000644000175000017500000001776711520622606033720 0ustar directhexdirecthex Load Time Enhancement
You are here: Advanced Features > Enhancement Tools > Load Time Enhancement

Load Time Enhancement

Its possible to enhance you classes at runtime. This mechanism uses the Java class loading mechanism. Instead of using the regular class-loader, the application needs to use a db4o-classloader which enhanced the classes when loaded.

The enable load time enhancement, you need to create a special launcher for your application. This launcher sets up the class-loader and then starts the application.

The db4o instrumenting classloader has following configuration options available:

  • A ClassFilter specifies which classes should be instrumented. In the example, we are using a filter that will only accept classes whose fully qualified name starts with a given prefix. The instrumentation API already comes with a variety of other filter implementations, and it's easy to create custom filters.
  • A sequence of ClassEdits. A ClassEdit is a single instrumentation step. In the example, we are applying two steps: First, we preoptimize all Native Query Predicates, then we instrument for Transparent Activation. Note that the order of steps is significant: Switching the order would leave the generated NQ optimization code unaware of TA. The db4otools package provides a convenience launcher with a hardwired sequence for combined NQ/TA instrumentation.
  • The classpath for the instrumented classes, represented by a sequence of URLs. This must contain all classes "reachable" from the classes to be instrumented - the easiest way probably is to provide the full application class path here. The classes to be instrumented need not be listed here, they are implicitly added to this classpath, anyway.

A start of your application might look like this:

EnhancerStarter.java: main
public static void main(String[] args) throws Exception  { 
    // use a class-filter to only enhance certain classes
    ClassFilter filter = new ByNameClassFilter("yourpackages.datamodel.", true);
    // specify which enhancements you need. Typically the native-query
    // optimisation and tranparent activation support
    BloatClassEdit[] edits =  { new TranslateNQToSODAEdit() , new InjectTransparentActivationEdit(filter) };
    // specify the where the jars & classes of your project are
    URL[] urls =  { new File("/work/workspaces/db4o/tatest/bin").toURI().toURL() };
    // the launch the application
    Db4oInstrumentationLauncher.launch(edits, urls, EnhancerMain.class.getName(), args);
  }

Try this code now - if everything is correct you will see that the objects are getting activated as they are requested. NQ info also should say that the queries are preoptimized.

Note that for load time instrumentation to work, the application code has to make sure db4o operates on the appropriate classloader for the persistent model classes.

This means that you need to set explicitly the class-loader for the reflection. Set the thread-context class loader in the db4o configuration.

Don't forget that you still need to enable transparent activationpersistence in order to use it.

 

././@LongLink0000000000000000000000000000022000000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java/complex_example/enhancementexamplejava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/enhancement_for_java0000644000175000017500000560040311520622614033705 0ustar directhexdirecthexPK ϡf7EnhancedPilot/UT 0Gɦ7GUxdPK f7EnhancedPilot/src/UT v0Gɦ7GUxdPK f7EnhancedPilot/src/enhancement/UT v0Gɦ7GUxdPK 'f7$EnhancedPilot/src/enhancement/model/UT 0Gɦ7GUxdPK}f7է.EnhancedPilot/src/enhancement/model/Pilot.javaUT ^0G5GUxd}j02ء )=[`lIJm؛R]7i)bgU)+Bt=xtIKq2*v0$H`Aжʭԍ4N9 {.j#!jjG F%27u⨐+>gTG 2b/X +Ќ(5(#Nӹkp ϰ*'K3vvko1n_[=6|>PKQf77+EnhancedPilot/src/enhancement/model/Id.javaUT  0G5GUxdU̱ 0Y:$R NNiM"oD;wyڏ`UuT{CK8ɀhzP oPKϡf73@EnhancedPilot/.classpathUT 0GK3GUxdQ(K-*ϳU23PRHKOKU qӵPII,..H,r8ԼJ̼[d% [er~Le~Q^jrNfAq^VJ^Nbi^rv= xgGO? |嗖 L+Gv2PK l7EnhancementExample/UT 7Gɦ7GUxdPK e7EnhancementExample/src/UT }/Gɦ7GUxdPK (uh7#EnhancementExample/src/enhancement/UT 3Gɦ7GUxdPK4f7n7EnhancementExample/src/enhancement/EnhancerStarter.javaUT t0G7GUxdN#1 SX=TeoX@ 'MM:&Tq2mwA2ſؿݠ^㒀 ,2u<3n0Nn,qzӮ.06o#8[ Cx2?B|-wtVӒR.vR 0cl r65ْVWFC#;NAb3 f3.2+BxDz?#:pp:ŚYhER)#a\HW K;6T4sߗQ0Lѱ}&IӠSI>t;|뫿t)~u~>B8R ~^g9KOM`kJJ?Yjf bIww^RֿR{PKg7ߝEm 4EnhancementExample/src/enhancement/EnhancerMain.javaUT "2G7GUxdVS6~N 5}Q*n a.7ȴ΍l+,:ݕqsSز_V+%<| AZrPvnU%|͙Jb3Yk^(8QvR WfZ"L_gYL@@0*4? `ODCRYa}h@?g¼:q4~aI:M\׬Gɐۚp4{ؗ5-g3UpTV,AධJV:1}$jpZ,Д蝌5;:j#WI, 0iJڐِH˞! DA& 9!@0jb*&\E$1"FVODrDrBI]nƚv6>9(쵓,e6ln#HB2P7`ߒ3 9tx3Nr,X>\ye8 BP &k` []D|6axvaI%VgZ8P3QPYQ*_?(瞪*LT0E O& hr8!ipJ;E~-cP:ht+(`ޛ0֩}/v"_> u wQ.!"EzF1ݎNsvjrePx׏OȦ L}AhEuz WLgVP6V3&g 1PnܐҚ"l)^CD>HQk &K'dv|rHPkXqojE ܮ12|c .iÆ-1fF9q4`xx]TӫaRC !A'e9!.$А+ ;HT@ .Bn.[$hG :qM23}9hכ|>RC7bo5Non*xp;W\Ri4EF*W~{3ClYmJLogP2ϙm3/lw]:g{-L #\mlBݼmHPK (uh7)EnhancementExample/src/enhancement/model/UT 3Gɦ7GUxdPKf7f3a; >EnhancementExample/src/enhancement/model/MaintenanceQueue.javaUT .0G7GUxdUMO@=0䤭UJ@(Vm!^wup81bޙ73oN'p!'b ?dr~p) 7:NWUbϒT0U,}` 9)(LR {J*lɒ"t2=LQi 8z^҂i _t`KQh(Hd-_2`OvɊO^`Q`sІ\]Q1C.}lgJ idcE0x,(p>Y\f>wpmB ִv:&pDxL5hr@MC8MIgNVɃԸd'pCZt~SWB1%XxT4Ѹ%.eLYk'cpq8ޭq0n8hr'gś`w@bgF?uo$SQ+.l x0>FyF]tB9$rlQN;_In)y,drz8$'a=q$6cs"L1#U%,Y;f>v7FiKqÈ9DZJ! Z v0n\FנaO: V45aWۦpw%@]i9s;K̭HhMaWz&r!uImĶyu-v0I;?PK* h781EnhancementExample/src/enhancement/model/Car.javaUT OY2G7GUxdj0 St ] {:"3sl#+'4lb }Jݗrt| +=F1oB&rbehVGEpR2bO&zh^6yXІ|5 ]|Hj!׌4WSo6޸B͋Ot }s21!p=}-~ Oyޤ[/Ŋ PK g7 EnhancementExample/enhanced-bin/UT =2Gɦ7GUxdPK l7,EnhancementExample/enhanced-bin/enhancement/UT 7Gɦ7GUxdPK l72EnhancementExample/enhanced-bin/enhancement/model/UT 7Gɦ7GUxdPKl7%j;EnhancementExample/enhanced-bin/enhancement/model/Car.classUT 7G7GUxdS]OA=n[VڂHֶ|,"QH F" Od%ݦE@&(m$}wf;w?,c=!dH`ͤ"Ȱa,G Dk~Eɭy(-WzUkG7Zhq}-0ҳUMyXbК9z]`1?qe^aW I{|2K9?U?t;vW8]-|SNM:M Ԏ5a-VS5myVd%ș0qMq+a ERʠM>'X>P6ǨוWXzK]kS[65[f-iksFw3"lVlV4Ųf7p7w_lUܱ9ZT\{UU$Tliw<Bc4qma/LR=tЂ|Fo}HI$D> (FT)rgVF4imڈ7Kx+ B"C MCgX&Q~@< B$r$AwrPKl7ke HEnhancementExample/enhanced-bin/enhancement/model/MaintenanceQueue.classUT 7G7GUxdV]SU~NaIX@ X(KHJSb)TD*]SXX6lz0ӆ*3UG9gd $Hy?7n`;NLC9&%/WbôaF4)"c+nji'hҶno SV3kf8w?k]T*5zS3/DJ$"M&rGV[{ұ^y.ߟP℞m' w%qz$WΩs-`5/3|, ,'u*&_Mj6U!aJC\|1MjBR 5KXENlbK(C"u;QVhoۃsQ䗲7Iy+>x}7P%`F$BGC(K?2 BUvw=x6ÈI``1zW*ywJT*U8BWTRu)hʦfn}AZR'F.Bs`UeJǡ.tDj{PmCGW2Zv1S(0{r[3K<~Wʈj!){}ϕ |X:#v­lcǜ*u#]WIxȈTru\}RŧtLHS2;c-X#+%x0 !=1 j-./NM$;IQ` =PKl74i?[EnhancementExample/enhanced-bin/enhancement/model/MaintenanceQueue$LinkedListIterator.classUT 7G7GUxd[OA [rtE*cHĀ&BvI$xf{a.g93_0&bj;&1QwMD1d`@}vB*DV].H[kqG*!mETC#a$Dqiж#0lE+!Bg v+@SI./TW8бx~6yΥ$S=^厽yEƒZ0JE*8uFBWM5KE9Mϕ7spL LXD^$7arT|% %;|u%`%#E!U#U)rY:/CjƯρ!Z实'-l+څcyT헵G϶>M$O$xNsdJ^@ߤleB)<$W]Wp^Mg3&f1da &1E xbaq<ł OF ,a\bC>:QM6MuҮ/ Xz+BпEݸEMܕ:B0" &#u(B6AdM1&BS_'6=u)['h; <'<cRzG?,sg*Q;/a#`@~"roxPcBqO| {PKl7\AEnhancementExample/enhanced-bin/enhancement/EnhancerStarter.classUT 7G7GUxdTYSAUCC ʥDWk#.<^GV)Q)MQ=¥Vlw} Ђv8[ N. {B S8cIu[A/G< !dvRx_RʨYosv?1`Z.e0peYZd> ȻIF vaL9e%#^ udd| kjEB̆{R 356\D-wHUNGȗ2$pF261^Jg E5]uJAq܁=y=_t*Fv !]Gҙlf$SW.ZkM:% 4ta' I SfHnX.[^VM$j Nv;0aۘ֜;H+a &7, UpO%FZV7]O20/ jj?ZVzGz>ƃcAdjU%i_agEfBy|\ZT@U,jJUԓE=x#~ ve~KM~RFe5Fz%'' &~8p,U.PKl7ZU>EnhancementExample/enhanced-bin/enhancement/EnhancerMain.classUT 7G7GUxdWU&w3;mII_ e&mڔ̓ u{N;YvgCQQT@E-EdYC? ~l6&ts{^sϾ5\aP/H%E _e&~Eڽ# e}L;lY"h=|l@~Is4lә0FL ]k9K vX &MXðe85h㶒${&%\5M咴ͱm;i$ǻ]#83!:>r}MYP:aĐ7t|XS4&3.4bOֲNBtA|t<R̈eM-+1IrggΝ]|=# :?#%g1~"T.?X)  8Jf&2?3\3-SiǴ*S=V=fF~._Ǘ]'YG3:xZGl 3{aY<瘇|< cH V3Ciɤ4۝)?IF:JKZ|dq y`u)3LEğ8V/3B6-?cVU)"jx3T>Oֳl#N$JXJ#/*Oy_SE{i)e2{ꪢ ]e0S$rzGU%E:xn@"U ^EaZ8_>CLUGcU@ ӵg`#%0 PZL}&g/eKq7]xţWj~fPQ\[MOF]ߦ%V],۷{̈́(O3M'i3wG J_[cTVm:p"Z%\&vIG*i%E4y_3$rrrNgU2VXuN/*z~R- Sq*OY6yFv`a#\|ǪuP2R vikUx*X[wK~Xҟrs&O#}T wMuogxQ/'"G,;Z|JX eW}cJ80K/Q|\Vzfk9K'[{D?P)>x/S3cՄiSsX obX_*Vy<)x[[?3CQ]Dm࿱ PЄZGkK`#h]K4hC4 MCчQ!P3F8#3k@`hW Q^@dih pIK%ryzkfvΐ8{y\Z< inAЎ<5CIey4<6䰱MDڜÖZhٚ5 ?<Oá<a;)K[ND!h)vTdRdtk͈y@j@w􁘥tϹ(pwEҒߎ:k.fG!mIK{4\XъE,)C>CB #i<NI$O:{A4# l#m4'hy ;Ag41`wȈ3{ж{^E X4B2KAFDwq+rhTu!; th4:PlB~XfrŽl3҃:ĊPKl7V,@EnhancementExample/enhanced-bin/enhancement/EnhancerMain$2.classUT 7G7GUxdR]OA=SDKk\i>4) ibb|0PvJ#JD4G"ڤ{Ϲox8 Lb*iؘ10X*0k/.fT~w#Zұ;Z(ҙ]lUx]^U4.Ng\  e Ljm߂c.sb4M+FH;pL,ޙ:&4| TlvI hx|F7rX1Yoݯ$2`~"7l49!yLkN_sR/:W/b1k)eJ4b@a"@4YsUyN=Ӽ*&hB^&lakŝ_1 @<XQOzB:L5')xVAX= A \e-!`3xGUY$س6 吂Ke^5gKֱƚLo- (GE:tI1&}u&u`a/G;,4L Hsui;T@BQM{ʣ7By7Q+!Ig`Zĉ5o29\_n|]"ToVFOҨdZMoBGF#6F \!ig ?jv=Ɓn8p`/IȶM5]Tp$,/Ib?3N;XK#3fvbs~ Mfq9P%z%ShÆW>yw?hhkT·C|8pZJWGQ&V&.=>#]*Ĵ#k$%I[5dWYrpPK l7 EnhancementExample/enhanced-lib/UT 7Gɦ7GUxdPKl71%)EnhancementExample/enhanced-lib/pilot.jarUT 7G7GUxd ffa&s$ ĩyyɩy%)99%z9ŭŽ"\7ns?bnn0Ńܖi?nƫpLuٟ̼hf/ϝ[}l |"U;%mG)姗oLmgrrmLytoK6m/£ȅɪIJn̉h|@tog_A%x\`pF% 3#~[+~[yrϭZFҵퟚa%W=/+ }zZrZN)=Xh\^[j^;xxȝõM7>Z%\t}%~kYKV&1/bu;)vEuCgu/]^`J_CLjni5>FzF)Z}J 74} yi_btS.nd&TXrhuTM3;;lqgE#uN\b(Ug#rf'aPZl mKFbQ6{^i^%l+K%
{ۗ+jJsgl1.|xFҪm^SVvzLF" 'Jdp񇤰[gl|反O;Vj]߯ܝZPyVG[ը* !"dͬ_Qm"U&Oe'>}Lk;ѩ7 ]Ls6ږkq_#tb /Bw͚s({w2lE֞^i>ǢN߇=D9+j]c}Gt-f6;}m VEs\P 싾^qqo/k[,sI}a0lق[:}zU)UYϊ,G+ZQc?}NEj,aXh_⺛֮7ln;gf|8f?k\w}z.z?#(ed`cƗhD5QM58D>޺zyuΝ99񃧏2Szw@ D#VYtG7 R(x2K ;WŜ:Vfe3U }PK(e7RIEnhancementExample/.projectUT lx/GC6GUxduPK0]k{\\(^@=@-,/m!߶ &}fky<XdCa-?jڨiݞ`IT|IAtHQ* y l:g#@+oh@ ^*MdR2m3mWPe@,1mmhM`t D_<>wPKוh7 EnhancementExample/build.xmlUT K3G07GUxdVMoF =k+m׉'@ ǠŬDhgc/9VAIᐏ/7ܡښU5yX,( XdWL?z]Ao 4A^mEQ[UFjֿlЅUS&] ԝW b AdQB/Fhӵ`aTU8=[CVy2[wLUgry7t|Wf[m?{uv\C v\ S"-WKbG4|msue:t>j2*ǎ SULKrgIByPӷb]}sE奨,x9@&YZcz_ؤ^US v<ϡ/ ]1- l4)HTkmlI0AtN]=J} 7E{w IՙDɨN89?(b,=Faiڎ4c#vII-Sx=C ,cڸ Nޢ:a @mܒkmT' NgKѣ 6ҳ׵U1T(KΟDFT<)OfmC8#O#?vzO#yE~ lq ֽ\7uKH_ռq_pxn0 EcN:{T&~3 eD=2FɖGC`?>Xnyc yS۝4g#>;󎿖^{܆}|#miТ$ݸ6O4'"Ý5cy5\;}` &5ָ6'wۣ/?_PK Ml7EnhancementExample/lib/UT !7Gɦ7GUxdPK;f7&C"#EnhancementExample/lib/tacustom.jarUT 0G7GUxd ffaBi H@5QM58D)ϾgNx]:w +>zα4I [㘌b $&;$d9$e攤%ص!DlxИ/ȸvKBȄ6R-c{+PJDyiK>mu;}r 65Yu-inw[b.{):ˀع'љ՗7_?7en٦W[{h?vmNxO _ZwOC˝X^@ÔGd投٨qʼ=yw=6~*u.pJ9b c$'>A[d-–36)Y/w qldA]"3vM;q(F5fo561 7Sz/_%}wܹ7<3o_X8n>㤥Wi|Xl1!e6w|{1wj)d=z`VaTcD^w;ռžײ,U6c}bɜ"ս[EҏҺgmp(ⴤVN߲Ԡ5.ja2>P.+)x zfm>W2mY}-?yynBqM3!ݔl> z9ly SY%[YddZTY\WI_۱9ٕ}tɥGNWʢGgMGM̍q͑M.SRɚ+) 4mL lT1/x.%9}]/gkW1a3?>8W׷KzW L" 9 T@6AbB"nE1Q@x2c PKBl7D)L 1EnhancementExample/lib/db4o-7.0.17.8420-java5.jarUT  7G7GUxdt˶.:m۶mcm۶tl۶u:oUF=5jr@|,Y -O-.#B1 `\z!j*z~=*/#."D#-r+=6*%IM3 -IM116Y@7Ǹo?&`G%&5! xfB$U&TU 3eX?"m=]]_[o+?j3E5ghhfcGX:98Eu?U42`Oc==CjmlfCm=kkGD ^tvp3vF+C#c{=+#j3=kG3FF#?vbldm 0+y@F.6Dw/N[YR G_gibo_h=KK}=ZR/38_YMkg#P6@keg?ss_?hlfdi425eJ|[=4ճ6Ϳ59wMҳ5)?Jj? ;'#{@'3Y7rp+gU743gr,mRܡyOA~?5aO>6Y cbdmdv? jbs04o$OvOpt7u@ʯtW#:9m伷YuvUqe݊틝5F{z'*J#JNSWibn.GKFW pP#E t@ЯƗ Q׳vw{ dJ{ X}Xʄ! ~۫/2oo}Ge eYa;fwxwI2֪bѦ5RF>cnI`Ye:Zrinƛ05eL|l{RZe!^I{!˧M2qh7MmlB1ܭ/؞np_zw{r:v:j=D=ƫ.ϱ\7<Vrs@ ={ b ^4 R/Qz#LGa|jbٝIJbqaJ'isWe~w3m4+4[f3Ԏ2qAv1 0=Tg[-FL;^JZnTK)>[._N^2~.z{[2[f!nnu ^%gZwW[F;}UUp2~O$;};m}}!xRoO׌;}!M]odiB5kֈiiňB~m}BaՀՔnXzYxqp`TWADo)#/]CZ{645Lc@hkoTȵ3_ ܎EI'1{FL+T0& Iő}d21M7V`ѩ)ວw63qFkPJްn&s1D^a%" |}:Df/e_a~sɄ~umPyUDTE$Z6T U 60bGHڋam3;{~ҥw?.崒\]8 RdLb6q ᓼ0B3.؎ mAv2SU9tڰzW8[mX: >ہF}nĶ>jA6CC|k@dwyD9T݆W6P^YKich]l gE*-Krd\ƞ0.QƯghZ/fB[GBhM:p%H5V/{Q(+[#\vA/)\a/)F鉷@pwADftP-Q'wym!؆؉0ݵ÷Z}S2GWE5yYAֈ*- y9Gw||wAv(@t'ALŵ׉i M_<#l]!0Е^Q6A˧RKTmqxzEEEd"qtPa}˕cCiYg:N5GȐ1ϻ5 F cSP)6`?GjOUwWC2GWggtҗx4kd_/RF;e3焲+Dykύ.<ՕyTb|+0YGs1]h=^VŌ̰^B/i:/ r?D(t*Wf^`"LxRЪh86:ukSb}Y4V(I⽡m;miS}V^ eY̾ǒ =׋nB E+p+h!+QUfߟCgֽO*1X|?!a+*ɦ;s@Vf@X$y lrԦ1Sj|"-Ȧ1AOݲjmL|Uv,螂p|.=A8WaO+<~ B+FG* t,Nop0Cr#r^lr=P<[SttR$L%^|3+r1Iv\ GZzZ]{A}|Fax A(sU!>3QK1%2W%Lv΃<w 5X|)Y$N lFrZŖ?a0f܆^r6ޝǝ!ۉNV~d"J_~ aUyCr _)4j-ެ:~$Q7-C+'LVWs*0v&\V|}1!.A89&-#*%'@ċTud:$(2`9H'>W~r@h9(>U_}c_ª]F<ВT`JrBPri',g'EJb>u cl\ά7;m}MYB:DhOeyE;re-xTfMhꪦe 녌LN%iYDyYz1j=bpp<`(q Z+ܱvC hfV]^ UP8 ۃ5Gcl-3+<Hpd_0˻$)I6Pt)KjQG)gf*mw)Wα"l(;zb.bw&Gr`8tR+ِpPׄi-ѱ]b$fG2qgI(#@ }Y<֑$ KVi$$Jw#|6-K}PN !Ղ.@r$ (Ƈ/Rs4dPB^kFy=QrT3tI +=F-eBÑz4#XMTeJ*yTōv $1.G~/:.2At0fUL[cǚ?I0˗rn2d,~Q b>si韒W2͕AU愥`Fn}'&IO΁D ׅn˂ݮ d.#gn5?(+ qD& IY`-1^rp-gHqE³a_]v P/FЍ%~+pef R07?ǪW _~zkkJҭ=!KYzV PA+ iK#Mw%VQ~׭8UY8勞IbuF7o i))$0cgy·(>SM`Vf$85Ġ c͋d`]4LikӂPӓYo^J'[0ޱ_ȼ#jFkt^Bbp?vzI-)] 2EhJ"I&e=( j "d{\n{Oy_{z_g~( (?Cޛ~~oXQO&ް 'D\ri9"0g? {']?e`ejtceb!ߨ){`6֨ XEGmz@lR%ėnx pe/|(_2I# y+EE&x] ʊZWӟ-]A RGh}Q1?;Um9Z|*N2K{vcjh̡PA'%*Aۭ772pv36T(ˬ򡥃]|Ǘ\fOfGMߙZ]9=-=iEG{_Zy?ADG"u@Tޫ=q%,n:GnuҎJ\4%t+LHۆuJGڥ+QIFԉu<+R2Vn~{5/K5mZ! ](( ?lIʍ p ;z-`8fȘK`21WNd-sȈPXMmjȓī-)F8 8 CggJ4g]*%~lأ15Anwb"J4pGYDۑ {% ?heo vAyem[%'϶bJy_.`XkZܕKs]anpd;J{6!j'`h=Y(l銥N&Ȓշdܲ^Kc }sLP,/ݒ]T>ގwd_N5Nj)Vma? l>iU(bNjKᐡbKE &dREF^_CA)9i^>84T…X^߯6I WdIH8%fb䮈ߣP \>Gq0\Vqfo FmwD PC¤g N:01IA{Drec 2r7ʑUK(.6D ,~=ʉ+n'- *uY- A/b*E⌻݈b̢a_HϾ'U#ǐw&4-.J;"ֺ<`aB^Z?{g'47PM:PC9z1=SaK?Æ+}eIM,ɧ^GB9a++«فˍ%䁰7Zgdha4|Co@-ىRIMh ̟سA:bH\Ϻĵ]b )huGW#LGs%tJWv43}ci/<g^<\x?A~yi+$y뜴g'u ث%,9*urzp_qCHK4m~`sGwKS<k_0Z1nMBiwԼftCcMQ@F+d:Q| &Fy.bdo>ɽ)nqG=5ґ&{Db,(em$`҄|W0%&Uj4 @@b̽O%p|OB(V"y4]Þ1P~[Toʂ@I98Iew~!2\; A<75Tb'6'7 35҆)܏]_sS}# zԾI{I|Ki vfxk]b#ytj.w<yKf[]FgD'Ya'8oxAo\#nIzWy126Lrb:qa?OP{XR"k%+ufm?)S՗8'9Au,'NT 36m2pqqݳsvXcIJ 5kߕ#5Y`M `lZ&:lna>p}sax0y=n6BkMO GxkR%D‰7=~mAtRUBbe薟wf*2*o=>*&H(,};3pS`"4ՎiFIQ6.]4WKwLN8fq. _67y?L{K$z'A}vlD/& ›vshwu:𔤮}'c\Bpqh6I\9{H\EteoP^(RWJRsI%GKCnR)2R+&փYJsb?OfF dEhn*^Wr^#RkBsS婐uSU[^ʥ0JVIZК' V_֫B&[naWno4Zqי>x< ۛ .7D45PS D,um 7tҷg-zO* rLœXIrRJ5}F 6kQ:֥C X%*i1SvnplzjwWK& @ =4"[sUy"r+TrcTIlotGFEΒh7 %T7MY-wy/CqTAubF//Pm*$k)Sfvf&ŸVڒu&Tt;iFc k)TlKʳufŊgRax(/Qyv/ 2ey-f;!`#07Nͻ4#XB`zS .{=4qom]7`&`+6- wrzʹ~94+ YTsuɦʡ2gt|\}2fKܧ sSC"{8H,B'`aI6;oJssZwZDɬ#/74 LFoV9b6NxfzzWl}4-iKi ^?s< Y9C|#pḄZ8ñT GPggp(m} ր 2  xlcnO`?%#!j`f`7@<:rr`,,l~=֎cRwխ딙+a BBgVnh#Rk/wz}Լ#1D.n6y17RJ}1`,iV𥠙 h_>gxOm"v&ֲb@ <8ht}=!E⌠=b(.64Ñ-b{l4. .l8~*$D8-Aw^T;VIu0KRj Uy{[/vX}Xj?ޟAO(qBM[K{, >1jqQ z8AѷqJzJ(+&Z_ћ3[X:%!F~bKZ96Кf含gMq-PɒΉfS*XQ(/լgm`G11q };]d+*"jj)#3>0$0@X *J W1V3Sꗀ-\S ћ BT6Q\PB6M\Kw_Vށ(_*J/ r{ y7~bS̺tm?%덳wLuJu1怪%ob{['3`s<諲O7 Ó0e '}=$nn|dxpS?꯰zIz%\\'ݪhuRW7-$l6{nKs.YAWD\o?JVߑQx}qi3r7O9\.OA9.1d1!rp"C_:f]Mv ,mԢ0tN!BŤ#gcK"@'L,ҠizLFg! ?QPFl[@"@ܳ@Z:Rh9\cHդsz6FHLLbGY92LqC]Ph[(@ F|ch\][ :J9 9^!VaJ8VIp@̘PsTA`L$TN=]JA}rluhnW2s!uJ5؋pZ ]j8fdY`y>:I 霎d-DXX#aBW3 YЈ9!NQ[C;ґOw48 q 3,T.ÓFZsg fUB8)QO?1W^ai:@2uKcx2>a{2kAAf+L]r3P|doG=Ņ*9KനCb&-uU'w #?XG*yԙ}S-sbzKxmA6Yr0*0Q/NB2QQa$RO4?ʼ%8DSS "V1l أ$\fi[J`5N-%ށ4Oh'v#]c+b2cU(":VLȔdE0&.& :}+Ck開?1- B߅C (<_ .#MaMfI.6;A`}P'>:7)BI0M+: sjPU! X}JH5f=:2P3)>U)=NJjl\'.K4aHH'i>}7Q!F5bNSj4<7v-^/5X6;N&qvbO,6Lְ9KV1fctβR3Mk5@>!0M]W.d c4vm+arm͐Peڑ ,jEd]1+n5(su`ue؅o6 CY~FN j#ph~5M!l unfKF )hN9il6kMId1<3Kt&>Τw5k^[IY(WZ"tqP !'#d3F/Aw>Q[Q=971q5dwe1562-0vnzSvzJJ3ݘ'2.).=ǣ";s,1>@ɧEQ }FW?g^W_WUSj{טmi)6_\K8,hǛNHsj M2>"@<<dCQ(n >V; aC[P&PǨ[nNz{6 6c3c.] 8OE@pWj;قCdV^=+u}qqsoi (tO,Т#T }m&" eexREWa :Itt ÐsGŴ$~T)zu'< to%R;hY-{Cw1l(j1'O2F}i@QEU]IijhT}h N32*OZ%|pZMc.pG-Lͫ*Tߠ%/O(|6ʑr &)+zq T>"jP#4YxDT|q| .;r>+G>f<9 Tu g”ߍ 93̪ 9|G6@N= /EIh4ih2b\ (oo ]gz'xr" UgCImnAb7n<[?i-wu )n-º_(o}~_kanw4sǮBqi?)1bsWsP,1+ԉϥ<670i:H} /98 堺Mztf>jFel:x=C;k&2¿Hm>W+|zJPJ2([|JI;@/l`ӐѼ͛!i44:˷X !l?yiLgTԬVq>]v'k8c8_ 2 @Wbw+oRW4 /ԯ 6PCG2xxBgb3ber*5b)TQQp(zQ)=rX;w.u*Eg(Y:F:2c3qg@~hړF?k5Nvb %Ja^*Xݴ so0M-qJ ;EHx0+cTa#ⵙEӪEmy$FoOYCKK'2y wgq~-"p jvVC:.*u\CQz湂}* <@p)aKRYP$k!7ODYfAh8ڈl,|;iLBQ\" ǾxS~3|VdTth{{v6EC3 Y :Zh lwQ÷US1_8՟^J1n'g> >Y#c=Hvaܱ]a?Z4}Յ19Hq]<ᑸv;25yY$ g& =)'yj\4)¼.ZnI1\Z# Le@EZsnn_ [YV.[Ia*c֌l~1QSS%V#| JMݏơ˺[[Lv\_B_T4U1>`RZ(g!sB|T̔zRЭg>_fD,{*j +?iq/QLF]:;]ط{o1] գ.~k5o6Uf'֮􄬴Nn8(]# ڠ\\D&{or4|'!hv(T?-R^Kmt;x4,T<+_ 2h8Ȩ}-tpAk 0(Ն"(9' 7(p/#*z`*m(*F3,Y'uey\ǣHjBs*.Ha8R^St{̙g*"PţL, G=qً # -hԷ9 7Vl4ۈCpWU Q w Xf\8\D;j &ӤzMi? $9Fxe$US達,u$]t:o-7]YWhC  czDCgyU\ t}J7JgZ4oqv^1L7kGCN2%NYtdגTj A[ȵ#VAEޱfE2gU1Sj\ּtBdª|\\TXZYVc|ػ]^9M>0P8X|?\457%h\_Z}Yqo u=TMKYo jN#T;KQ[PkX\pX}k_ašam%e%zHRY3tjӄG>=Eܛ=fxJ>|<9"Y-yQc 7jQt[#䕃je;ƻ-w8-D@t$׋/8Y;m $`Y_!&I'HsɍIz%/˱A)6v?X%Кf#3N#Skt!!]D#U¼Tv&1MϾnq\a]Vr鑼A<>U7==$.AY!=,S8oGs_aW<w 8oN=҂Iɂ9|9lrۣG\~?^Ilb ЀY&)3k #?@3p᪥ ~іEtG"@G-6m59 B|fzi=᛼v<|[|X#D4;0wծ(64+eGz oF1(/ߘ?E9ajnzMݚp)Wntt6E.:b]`;z5PyE'q.{T#l_HxQc$u=bt+m>֜=1؍E6gzF>Z\@e1٧lO|HInsu3. IJy Y͉!cV'yq!kٶЗ(u\v5M~Z+SBkzRdi|"~E7kBͭ'tVC4vI< ~\ɂtR(R\JT-:g4s>"4k`)ؗȢ15LCaG*GJ78-%osaǍBe5Ը`H1FZó}yi.갸!עn h U.d>Xb5ý)ՙڤ"$jOaĝi|9YsWQ]%Dž8d AmTFJm@[#uD qbFD4fVQH(1mS9&Q(g)QLξ5 a}wo q,98¨%\NN0;呗;vG4}\> /3+)iK;9J'[Ղ̡9جzM؛Y?wيvb"#-{Q!bf^ǁ/EyDff>xlrxGl>UDn֬nc52)%)/<4 c\ |؈/)a׽vXHzk+T]ƒWU'Ujr,0l*ά ˓AZJw7s֠c}H~vۮ%uyFq+ gHaT5L>)+\C~bϩ>"=#&UOZ J L'{) ܘH8iWI+]XH ׇ1mGx Sly -3"#% )5612cTVV귚叫cZp)֩! MSӕf\ &D$1 H1%im,)F_V:-=o}}c&A$ynw<},MJfO5&=jc簺T|)b hh!7(m+IGl'6ix bjҔc+M*ٺ˭Ѻہa{[l5b`( hBԐ F*NKT6I{cm+~&rE?ТRdCc*[JBa\<  @55ENU)j7ˀGI'cԾwarwj!qUqIRoY2B5K)Ro1z H|=`y@{ SO(bBGpY.)&^68\$ mҼ ~'{ci7Dj/4_@~Kiz)*}hjh/4g'65ג!)US Zne]'u>!K{F !~@:AR姧<폥..Ax3R~h3q=o BqQ4Q~37vPǀ"^A5:D%_hdfH*~`X~f2CҁarG.DF%Y& $@'*`!>!ƌC,8Lat0瘵L{hQh].c½wd)xB"9!LJҳvy 7t!~0 vN( yt-m,nH`Q4] B-* υA'H5J(`b:faL~C7$Fh'qٽViF6=`Eb9:OΕz"􀄈qy J)ⶑq8sil/܎ Y.[z;`\ӝGqgrASgp$π!*ۡ}q_Ш bca @D?%/]| ,s1~*3*q @:]si]]L="?b9=dຘ9p^g-<;-iqN+.]uDQ3MV6׆@Y}|}n` !2(a烲x e_ִ˵!8\QZ3ΑbvS7uW7~됌YHՏg>["9G#\|PЖEGDI'ãZiVz fyjCĞH^B}(~Y`E@?ћp0|Ÿ Exeav_êp<@qREmb2"YIOH>JOgMÝ2!\O!2J6,W.*ڥw6YPpQ$5//Gk9Ʌ,oD.0]4Q1is8xLi! RmL÷w;ײ{wifٷ ؖ맠{w{FZRmntJO#_zǥ;}"ڲ+d~0RV*%Yi9ƊS' B> c{tW R.BB]mp,\FJϝCull9_;]U[ͤ&4k?/07ok 'S"2ҧdL"DC%Ayh)'JYuL *w3B'} a$muԕKR(3r9,@ҵ3U30gl;oް6Ԏ;n Г `f<t1z̞ .tlZ+ Q!QKF?Y,]gcW<ҩ}^/sm !(@X~5bA"(VF_3BLAfv/{`.!#Ye}ԪKR2IITtz_9RAfSQ`C'l;l]Ҟ'W]9^6\4$31 *b;D p[z {u#utGl=#(:(:w袕cvm}v'γ$E rCa apzlJpAw5=E,чsͥ xm %E9zMJ/h0" ؽ!7.{)sr<@dtO2BNCy5#L G3gN'_A&Zo<;OMM~P44_},5bf7 "8 AmIưۦDVq 2߱qtc2k 6Khr7eilN.MƉ1rm,) ;pCr䂚Xچ4IJwXio:7d52?pIL><5/DrJGH]*e=BA3K᠙ck DU1 ~((k4z%q㙩GkS;+~|r'}A;m3jQ>;naDI:ucTsx;bs2o[lP2}`B L=qoT~"i *vڷ'Ul1DN (΢:6y^ [sE? Q|ycE#}}fspG2!/a|jMBUyc<*ILN)wL0"[qNKI;wPJ Afz@{<*++7 !#ݝ~ eWQvREV oH|Y`tFۨKRȟLṞwrz=n7t/qdŒ,ܖEm_O(c2EYGHzSEZX2N+WtPk <ă{&D(Zv΋zЬp\y(449CZp Yd.@+Bp`Qhp=(@+_N1ɬH)Anv6 L-0iˏ90>vXL/JZ#%Kq\tZEpUVFIٽ <:y.?;Hu n 'U9~>;qOU<]r»ZJEwDĭQk"V(L_U=ccPaAdLJ'#>(O` sߋ-&UDS0D 4ңk%(bgJ.FE\ %y@{OP O&Ӧdm?9n2gWI?S߲Ɏr' /(U|PX}.HWOnZ 9?^Zޙ h~DZn~W)?}33f o`m ɚ}~Oo]cm4"cp"m苧_KB 3JfȬ'd ?|hȴje[_{ *I{pL}LRIw L:΋(Su Z,oEWJNfHF -?‹a"OUj1|F* 1S=oׯVب=DSS*ƃX_5G 1Cl)(S K너elsڇr}HrIy! S:JY~>(t `@ d* )USꙭ+(N.櫚f3x|-FsmWoIT#Iop}WH"JXe3-7h3sf6Xru_pBr`X)܏33ֿ{Ԓ`:?r (dNS: YW6tv|,ҽ%`HS~eD&=iZUi;ӃHz+#;ZYx@C!}GVVc -])!rq/WYK6yIk?ҾGTUcPt[Q|o'ۋUge*j)}Cx jYqIY ZL1>!_ymހ~;tײ?(j~Ch\V3hkKC53|Gkdl4&'Hy|iv&I {Bw8(ti?>t8>M//<*eN?WnQ?\  Fl& Eg*C\*ZO-n:GvU84iN(_vLv=%tqjT*ŭl[81M4d4q] "}{tQ4d,$p:H*s :ID_[ 6C932C3B%`9Zw޽ Yͧw|f՞.u 1OQKPJj$3M̒ >$Z ?IaA.1ZF}adRVɷU31BFt9FGse8 m%;Ҙ0z{U5 1PkK̔%eC,4(J4|N7vϒl4>\,Džuab0K!F#f'8*DSNJRՕE1@YD:RA`t`>J&4ddܴsiJ#Ҥ:dP.!1{QO0rj |e.́LӚ.hNȼsxD#ЃQA$a(E>0~V^5r :͏n%oh|1p:jlHl!l8҇~k)B,HvCAPBG^- ؘ)#<]-gx1P,6( y^?[$JB}x ^$<g$71Jy2 kݞU餜Xڹ9+sFg Ä]}=p>Qa0gJAyDbo[ 5~+C3aC`DV+D^S@E\sAxyO 9e;2+v=+#讏a "f1@؋( Ρds#% _^#6όbHdF0ؚ+f^_CGXwg"f́9l@6"S-/:\YyErR؃ yLhOT0LQ&i 251CHOLs l+Jŷb~fs&mp}!8̾p21Wexe2rw}+}j5]"m^U*_ܼx<r=4@vdbL5&EY=4N *C!o|nE`V>6eSoc[o<;0v|L&~|,֟4d'tR6r7u#dsV%O %40B,:~-49"$XJRȃ%O@ьf(x ,̑j`nk>,w53ɓfONO%f;+ |A'W$/Sp&3@@:?{ʟ)dc.m۝ NR-jYK,A&WAW6 vsR4慺)*E"ͦ˄l^/a1tn"` \8y 5J6Z*"kJW>2a|N])፛@{4dԣ s4 iM,g(-7d9^~Zv8ђ 0ȕyzoiCݻJw$_<zi%uf] #hio0Hw4"VشT.x"!!FjWcC+X\m흓ʟERR:tXb t {_+?`tN=O>LhSk3,29[k2le ;Uk=ͳ/0Hq҇ NEKA2p m=nYK[.`dtFmZCD63"+u箖-?ʬr>z$*Uպ%P$H] W6U+ZĎj7JQdJd%YƆ'q_K7Bw;>Z(L%53ѩ>/܃hh|f louvZWScqFZ*ET3~I^] Y4&X0s'\κ *YW x qb] =A YDN7+ #fk~,tKԒae{`@^|]Zn,vc8[~*5:rc74A͇,5 'ɏ`TPkyGr"=T'i$rw'Er{)'חO'괧MQfRkX i_.uRZ%2wWY/H>5"E!YN(-zNCxrk2q8 ABa1 bniDqn?i h |;"^XaA0 Ul?՚dXrXsKh1/dU^'|nG 5P0=Chzݼf ST{>;-ڄX-ً%/toޒ "Aw#>X$JNunDi1pr]ݻ I!Wa`ij‰Q$|+V{xc'@fϦ-@#%&a,5`A]m}}$[^{,MAvϘ$#ΞQUuuoh$i?SWHj]; Z}fϤ./ݥA+?6`k77I7^Z7*C}CN{tFVen2:2Re^ ˕K?UNs(5BoJT*!s.yTx-s3}s5`[$(c%a3C8c}LTBkl;YHMߘh9f6%+rW(5{ڮٜ$[.SE!}A jP}65 nϢ{G !(PʥG>0l9M 4V i7\UKdGOUXHgVŽl5cʒi:A&,ߥUVY 2"q:(9SxxaXp5gܡUnHxd08\duv;ف*N1$L.cmZJXdQ?Wn8~Ѹ4"hΏ-Vi~D2on!knt_suG6aYՂqבčPv&"d,`@ʇÉ/}!xHjy6G3+"Kk=ҕ}댉 ȑ$c5~b3#kP$s 闅ʔkfF8vD")SHXu.ֹDBBh$˜MsS0mE$qkD-勦VSn(YюIٌu.NVpai(R  .8b)/*YKf! 礚\M5ݮ'Ў*Hq#%H{sj}B9+l)fjz3tVdMS6'=ujbU0S tT Pwmo~.2 5i@gbŗ3R[[t\%4lzXkT}f`Z855D߲R "׮ykڧ'5ZW8Y.C>YTPrh@c(mڪ=pfbi=L*M?7Hĭ}W[#X+) ɜ-Wf@gҨZfK?ػqv`r= xq7_:N8J'<>>g:t|xJw) zW: z^uz @s{4 bTk~,9Wu='u@gĥ6&d6= /)ap2wZ'"=a9Z0tGqZXܮ*7n S$w12$F[bcv?:BBh3^q__zݱ+7/ɐ[1VfM:!"b#HP}p@D`jf"fd3)Ec&{ޒ5)YZn dtJn Bd2Rׅ-)IWpcq#f&c;v:yp *z1Ew3~Xm)t7P~,eq>7˚l};dv)VW|ue vZ\PLU;E\3R5o.׹rŊc#C̓ɽ̤'P&P $v|=K˞< (Q-mB:=ȗ5YY͡8)ɹA^0ݵ^9UO,<ǟU7c-P$Q2aGTyv7|M2F^)Z!D"€rog3@1h*@[=Z\k(ġsN(H24MBprxASxxBI&x@l0>y|oMDsgEh;Bĭ6=$ 5Z5ۀAb_Fo'mWWDa}YGB;Z? <dc:8*lꂯ*$4<71DApveK㇣,^'8%s7c?OUBMtY>@+=+ N(m2HbM}'!܋Mny -v CcW;$%'X++[J0v]moؕr5x#]|7&WS!×AIsGv yaf⑸QClN7 $5]'OPtPØ2 "l;WfyRϹ rHAX\51_ M跿1qX:8ė Mo <[ŏw~!@p n,Rz.l>t'3ely !,S؄4 P;j}pVBUc,+^9%Á2Йۂ4&&4Wѿ֘ć 9%yy(9 , Z#QAfvyjj]ł+bJj1}F=sy :Oz/>\PЏW=:e#: ;Ͳ@+. ~d{A~ z!Jt"\z"'`l">H۝O'$CQ4 LG*<ؗvQ2ܩm@)=DjQnVs2Bs]CK1Aђnd lEixXB&.A(]ϒrp$K>a?iݛ&9;$Y`m`Bo,,Cl(DNǁ"SI}j(Z #*1(Xhx_4v59gf)}]*\jdתar| 'g<0<xAb2l'Q!Ձi*ڀt5"'ʠ Z塾3AxVGr ef7u(45yUV2VG[ ~9tDZ5Qz }WX(PC,!ey8UY@p$f~&GJX~1MRm1eh e +Wgfa )RG UZ.ƄT=@q٣j6T`Yl,q% NږyU[ן,+z Chd-Aʲu 2#a -;H _DQ8Q>4ii+[\\IH!<!)=*RT6qAPVr>i#k)}_O6,_u>LU{SdkRl 䆢R4-50dA`UH!r }U 4|\~#rP˩hx@v!Tmt $|-']`I8pR?AUzK?t3ήĂ.} lYCKK{ Htb*: JPxj ˢ*9G*2 *OJE4<~կ{n8&RYzo&6/'ȏ"m6 s69L&.*[p\BvfO}G<xgXU?Wʘ$Z23h<!Gg M:5r?)OݕTsEKOg<.X{}G~jC봮{2Zi#Q*yW0{u4r5yVfTcU'3bq|߁yJ{̷6A iQ- y6d9Nnvn!M*(;-k9snJ[p^Mta%7,h{Tsל!oh]aT-UXW װn[n2:q Qq\ӼOQum`c[ȡn C/Xna)e3VT)şdè; ae/Fk=eh/k[O `ԞX΀T|#6K:^! ޘiw^^4.Ci(j(_%dH]|"ll{z| l~Xdgy+xL YK'7r'^ێ̛j7y?M4 L yPl4yw*8 3~d}.2 GaX^po4 'tv&с4aa?+`+O=/C\WjPvӧyX}ֿv6;s(=vplcC2 xk [( $/7FLj篭7YH~4D߷ &wi _nNq̒f3y SQ1%0Tύ;8 &@mdEzTRB^PMpˠYQݜ70T/{U@DQ!KD#?-X`:&9oWj. {q0JPf8޷Ohed`P;̈m \lIei>Py|WH(U:~=i%ZNZob96(jT)@v˱=dT#hsPaƦ'zph<* G4Júل" #  uaG054"Z;`N rVNE$O3]3 *)S509I9PRa0Xh5*3%x e܁v:Oi0 9m U ti5+`ح%QK`R׊3\iS%[{=XIN~b-N E#ywB㺩wI}%##/ohOXCV~IXI2[c@IY C iyeYGډHk0/7"B= ai +v/&٬83?2BP}nT`xg]f%[rvZ{ vxؿ$r*Y9 {!O qgh~d]IqIӫ˦\a8ui_[M M Y'dY:"D+':7NȢ^ +#8u D3TzHѨGq@,wB[wppʛo>Cr(x1vTnYRГQ`5˴7VGNךwJTIۘ [D'38m8OAS>Ą1sHp>멲$x[^͸ aWE=p[$*ԛITRSǽwĖ0DLDϺ@D Kօ Ji\7ǏG#[Ŷ:%je睁ނlkX~ uzY/0WN܌IO_ BS.OPse#8X0A6qbaNf$]ԄܦiG縴n.Փ-{6c2}H"9`lj>:r'CdFez(bzE}z]%{XV\;?-Jp`AiFC*ҶeXPM{ZAbS i2(hADRUIg\RbQpgO,Mt 7+GQB&c=z6˾8!|txUan͘/fsWޡ'st5_W\lU!Aٱfh0Cq# [Bn/D 3"aƩGk2$wwmQιswtW葃ncHg#Bxv0w-=zZYaVVġ~@)#4Ay4(C̠d&#F$c(`t?L#xs\W nj{@C ׍~h->OC8{@ ؋W UWpmC=p#a:h8 p1j" eR$Viec@\`~Cڑ\[ qU wYӆDfDeͫR{y6U=pp~\~8vs@r9nY_^!"K3=ߛXrf_2jgsFW* }ͮ|ms|݌ms$+9ی{ɛE 1ݗQG^}a0]$a5jѨ 0] [;f;܇v/`ifd=^w4{H#.7X'"A!k*$Was} 8A9z~D##BZދ1i8kq%PiX| 牣X49&)#LĈ2|OX&n֪SpY9ON.v 4 kWX#QeG$z71|A_B)JKaP+B^GF2Bn=kv{Wꡠcɽ|frYC'+Z>{Ϋ75)YF>c_? % #CB]:VxYO7V4˝\e,^B+shbFFȯ9ֹK>KSvC'yؾJ8'ڇuofSˡ1D62B 2ǐFqrr!m-[qɼ3?H7| M1'](TDZenw&} b,=R(uA0//D3rւg!MpJ%#$ M%1ȱn)r*$ k1)4]Wʠ[w)[F:5sk{NҚ1>B~qXD_<:):٢EKG,IyjN2m}Jp :CqO[*ᖫ-Yz=f~U_ o:oee`e)oV U)\>Q̈́UlF~&%H,+7Y@ ɨ|aop}3vQڬS{ h6J^H,(x×:~:EI<)[l/S([oIxχ@N0S1\WIX# i>}S 3:c٢}Ms~A<źJv>"#t&C9't4IYUçwﭒ.ԛ %ܷ<<9J&{-9 j$hU)(Hx}Lt`)+ R4,4k7GA9$T/2&?pG]-,uO7"XsmO.$qG݁ c+MN%\?ɜŔ[>"d@BdI5W&/5J87ĈמA# Etʴwֈ<q*kWF_Ro,r50o&FK fgp饅XGF81%A LYlw>㥠-Cܤ97.?Pht `.2POn~<`01}DZ&:m^?[)fC܏ob19ݘ5DE[} \[q#\/w x#RE\cAlȱy]k|wlkƍuu'ȹoZp~=<NK"Tܙ\ & Z5DGX$H?E2 Y y#suRT&/%VT3HKi1 z҆͆UĚ~;|)߀oD>GG{3}'LWGOL &tR?{Y;kobd^ʛB@jH#"J+hzc{;C ]v\G^DmPU3>/W$*|/cC%0(9ǯ#P AiN16yzCXB&L[iF:Q,Djbө WO~y rVLm}msnfb̽/sV xoӧ uиw%{E9L9Oy$Y𪀚ƥ J'rduZySo;7 VuGf-d2lf1{|n uD˴.=8gEe,΋orns|Zr`?,DU5jlLY4vr`r1x}}8zuc56N1KJoa" 5Ѷ7L)wZ7,KI WM< E>a`T[@SR70P89tj`tj ?f E }[E'6$aP,ct- \~ D"Jw9{}c\RףHo~+% ww{WٴIz8֠׶'Tk(>FY&Uxhyo{u\-:JGϪmlcrNn۩[ F{*L,g:ᨲdoix)1}O*8~)?&YӰ_A4u+*-:^PQׅG ]lMĔ84j8\iJŦ2A 5f9ˤ"(44~ņԒK?@t\~쉍Փۨ!,ؖZX?<| a,p7pׂv~|.пJ񵲖zfqXItbp/H%2WΆAꁴc"`BE;#!=kt9ug\[<#5H2W[DjRi: (YhSg*SsLm*ZY 6ohw;?6saz&hTF]i2X8<_e3_ى|6)DDŽ9c0$%«{TB?lZ _h/6dim'&eVHDK3U=Xtrcԇ{*>}/vbK>rLPu"$Ԏ76Ӥ@&8wѬڦ=C>of~P,€X<xWof}t>H/}E*>V`~o0C vb j3&e4@TBJ}pno [ =/6 3cSaֶA嘴jFr`u 9XO.(~·m?*- .Gx=]\rQ5jQQ#HzcIuH^`AEp.&d70yQg ӄHDY`8IKw-Nj^{h (9Y;| F|AT2Pv)' yr(*Vb!P v&睃,_ҁL%֊ȍl֜MB.S۪۪Mh\&䮧0}Up`UsYSڮ+<(]o 4Ϲ6-ꘘG{(sf2ؕ xb}.`Hjs?#Iyv* Rs8c̆e29i51ieViؕ5+#sLTiqlK`;ِ- 扝]ẙDrb%wݼͷ7Zq°qӇR$G*wu&4 4cJ;ƩI{Jkc_7`>Mdf6ՋEC_Pei6Tz\ L[50 GB'np IҤfp"0ʈ s=,PV9fN1/7r[`bm( W1[!h#t9\ t( : F!/KbṴE%eo*oW7[~> ޠFvu8[M_ߎGxj\!)H gХ8wJx'>7d! ql ugz#?Jcl4:ު 妑xgW5Pͮ|Gӟ fzu46$h Ұ쇅 F. 7]YyH]Z$'kcxAVL]2/#.uKC ZhsT74[ƼzlG.z R`% --k{ƬW5-b5:pEQ%SjVb?.=۶PP!e=w*l^kqG{ޜ#E*l#Zhr\3m}1 -_L~+vӷGߗN^uj#A8Sk$ͬ!].nu~-Ẃ& '` e SuX υTb3WM&H:Ojدb|sbM[BTf x_9DLPeƪss"p>M˯W4o*pPƕϙ`ޕa3A1)om}6TRR\Ȳ9Q=ꭐM$5{*BSّYQ{{dT8maNOsyt<` NC?%wEmMo.MW*酎vPsri8c6D/7IJ>Q3rF1 㔆4 @y:5)$;AM8AG'ӂ !DRew$ЪNZ.lqm䵻%Q6kxFaNny${,G7=3<¡x(]&J@ޞCX#{8$ijZȑi;{4-^rdu|7P>@#Zp ۠QJ@rE&.E3D50t;jB`@EoirQ6q䘪q֬)Tc&'܏b4:28ԏfFa:5F *QUȔHl^hhW9LF&?GP[tI"( jiJk%yŲy_͏*T?уɳc)OULO*Vǩj gj*cZ v]HêʶTPDJ.E܏ůM#1 05]A&wH+4k8ċSjcI`cS},aΚuZp'Q}ÏuPp!tNwO,(0NOMΠōKDj֫&, /}VpطȯӻI0WMNX6t}O/[,C 7@?U^Iv{!`YnW7)n~CO+Q17RKT?<WuLׅz!R7iuq7Ei'K˿R-@񤺐I!oXKi%+mJ 'v} * ڌǻ0ۀ?B067o2f *~ӛϟTś{M)üj]=ZvU5)200d抖%&g8Qa..Fz{XlXm&i0+;ѳ)! UQ8P*@,z8zPv"Q!lH5Y_W@XF# DZn2 ΘDo bˡbM] LΗyy[ Y|gfu&w o*ݓsiP0*FWz1q2%kBrګ@=vMQzjTauTJԬRAwݓft:H9#cBI N`z o;"$P%ZqIUԨlpظ0j<W ""T_4mayNnc=q-FlisZ\RI!Ld!ZvRR?X}C㖷U2 FYNVW %GwZٵ9v>MoPEPKQ=FC/EM]GopBNȠ&= s~ dRӬ ek-;Ni_Cz 11 Zy~)zcbCsWՂVV֡iie%gQC7)@ݶPRߪ[҈iI5hQL纅\}XuS{/0B釐I31y: E:wBHMPP7ghyMhԥj.8_ lx~AV#*ѯ}C(uExEmJqRKΧ]xH:hz.&[?{ww::eG@T{J4&֩fݘP:$c:;IS_ƒd0sey<ᓴ6)ZHw{ -zS8{ 8B4oiK\̑-6FV9"zH%`Gg.A׃Bv7CX>mpY~1 s3)l}WmM9- '¼Ԭk[Bb21ToJ20$--E.?A=ftu ,3z@`M[W 2mqHAꄾW{)DɌvS:Z֦\k g.NvDdn R~X'BhMn=j]F /}8ݼ~_wP㇖d' {ϒ0>\-W{v i)`u?\l76ojB3BϙْXMcBk2c~#gĕMØvO{ D۹[觤0`!.#=W¿9@,j =#_9`/.(J4{Hinj}@&i =;9Y盵l1(vo>Xw{wu gܕ@ v'6՟ %p?RѢJ Jȫ,)I2(w9\,ܮms,^d!&VG,jE<ʐ/}X˔~ndPɻE-(!`3QWLK{N UrVs~p|ZeSe|H5G7=td9,%B)^I.dvgf3VL 1efEԟ{)(E;J1 { h%Xe$({5I=ڤ_Y࿮VT6T^bį8*$ԅM5Sy -] 3QM''[s*[]>ƭvSYy/Co640hnaz4GP5YX4 rC)?uu͛S1)F&pm%W:J+GFzMj+NÐTU2%oG~JBVA떽1 w`O<7D0ohoeA~(Puskj_8WnKxv0(Nk%l,3LOKKYc(?*B蓹NaZ;z!V3Z":$1',m;[-}'ʢ!ھ l]X(Zjm6UUkڶUaηWF!Xz淆d}Fem.~pG,t:G@>1I×Rrs=~.N?@qde.z@\lE*vD2 z7.R8U\#UA kB a(ؕ;ܥ.;O"m3v0q};{ (,E]İL QGV:qL,lna2ILUFOR\5nnbn5,gGr&B14jj?xX09*1MB+FH<$bA QվO|RK5Fs UNRw-!2hZ@RVEXkʧ¢Átđ2K 4t㯽\ݕr(J'r22`= c,:[0̏Y~^$kHd fPnrzͲ}e@U }Ag6h-*t4 iIXx֜0n+AoA&(&+Ia|[r5Ap+k;QV|sAs5b ◷na|0]^* _:I6Fn*W #q-v^UHtqfU]b0P4]vtQeIL~;/l5=^`aI\1As]zj5:,ziol"pq{)W=JIùfQP&NH&ͩD0^B vaYb G%j_@8BKۥ@ʨ*Qeȱ@`i@Ӡd@+c D"[K4]g/Oakug3cJ}z3 Z Hc8,-͍oP-~^]\*'a_>lxs)0Og?uzj<8U)P͔-4lo֨wBu鳠+'gqEС-`[WEA:<1G#`\8 =:hUC >`v˱1G߂qj5 ؿ:Y82bh&\wN1V*?Fo#Ɩ%ޚnp(pkׇJ.hX9&mFFyF3y˴g7Xm__KfjB:j) ZC Ū3A(Nؒ[X&Fͳn#`"ݨ>0 &ƺ e\@F+- MG_AWP^^[HKM`E<YDRaFD l]W6ʜ{-TWZRQo=zFR#kKlÆ nC>ͱ:n7 Ԥ1k1@ l\ \ϸL>Mݹ QC})͟9- aKd?%ġ4wCuJ$|KL}zBmǍ\9,}ɳmPs\-ϥ9y';_/^0ֹEF4x*^:;DkjIcs7::VHAo2p%dt&YO]sV ~3q@? /B\_k4 ~l?([zM\ KBw['Vl4b&3a=pc2{#/91-/P(3aa&yU(wQy [{P L='=2SO"Qb{7 uaI61m0@dcQrU)T~—Ƌ.oXu iۼ4p9|F.w|,p 29{`5_?>Ei?BbSsCu&xW[Sz8Q>Fv7 ݐ'Ue]_]~}D LTl$u=@'?8<TI.3LaAUF3vR*SGYvˑ:jdx-.MW, USޮR|`ȑ()[o@qTqiG+k4\ -oeSguYcׅgnYIX'dÈj;bs|7:w0Liߒ.[DAoj/Ԓs5r%F L )LLY\? %`q2r|0M§/ oT#x 8B ui{1i]/3$1>I dT}jJ ]&Y5y^1dEJ@05sNkWլw7n|BCWz_:'c XQ05i̡E5~!.^z uϙ^G(ߜHSYDrE/*$.͂?u ~5r"v,?^wFcLQ%&JjiFAؙ=NV^c@w/+Q'ddEͤuh26cBΟS: 2HLj\{z|ǽưo׌~$_}$QCV@J{T$#z2G,*y"]A:@Р+P<_2`M_{s>hTtН[Yԧ0BFgrR}~x#-h ,I k>cx$Ҵ=~bc\C p!##јeipt< XiM6ݫ˦|Œe(:iǪp@8}v/%_( cB$Y>F8Cf3~PL:[FIcĩƛŸrңYv"dP9,(J"{r=*=Ev?SAMC?~M^({0Dٽ۔<_b J0!zGk.W _n@?(Iff^7KJ8~:>p=_@)qCTVyU>4k?3A"tgP^?b;[|WK,smc}RHqPRdߤNt>|aF[=o5%%B6jb]o"nn:*xX*|؜F4T:@i.dB媳X,N U?$\ T_[Tv†CW!ԉXW%ˬ5fv`F(MWZ T؞@f90[Yb]$6+S u"]p2⥽4).^Їj4Oń;~Rx.n3|=!3O$̼?u6`̟t_ Qq^1!g*ܹ'E2A/cOsW +pF)BwI q yD)Y_E:d7`,X|I~il @{y?KKm U^*{ebDHx!%wRܘ70Ǣ" 7B򸾳Lr鏏P$c/T72U.u2X/(3rq-)13))--z]A01quF.E=W2 ~бtGAXv#^Ī[fBCDS_V ZjD_y/1Ai7%0h ZR?AL ̷Vp`r>8A?ܳ) E$#1RbP=SuiƥS>o Qk_޻y=q "Atb$euIׯ$ɘ>pR&s#zɩ!p$v/y܁\ێ8jizCz~s{}02^ ̔Vj+_fIiVX8"W)!d+Bێh{K$и!ҋH o} ջ|ݯƎW:.X4xЃ;P&J(eлRa нAi3](ʄץ%YI`iӒ4aO\8 !^{ &L'/FBA<2gn1x v~PQy ջH5n)I6@ ӴG-R $#m4kH.}ahW: O#ml)WႬ&mM B+|~HQyM*$wDEtimXA+^qRy`( zL:}=@ "Ol$l 롍1M  ըlMz*lU .l뉓D;Mz^v|LtA("%HUDD1I!ddɽ9v|a`"zڭYc }BAUGB{EH4KHKE$ZFM^(48#}۶AiI(D ys :aEr+ ss쟍̼G {1w-(K(F̓,inӅcDDW[_T;tեAv;3gCN!oUbj<2J2c_ۂEch象@Xuh=U^*9U-2H., }UHV jY*6j $2'I,Jj&iQ7̯B/6%M$Di[Cmaba&Ŕal[ff,nhޯL~ %ëhESk_85)ׄ\Vm$5'${j;mN^SXB⺬Dt|v@Blg/9:Z RD0Y¥ a)8US[^ >LmI0VdDKavÌḰltƎ^Ǝ~Vw9#sK`oŅ s9*LUG!  懖ۙqElnj0:%F hm wF#[74}1kRO n(ĻŰ>/ =,,KOd$qHe>"[7 Vf̿ 5v"jf A:z"QMknch^}x|KBt iOf?N~3 ('nWcuSL";hu5W13/_O>Rw8@: kL8A~52YUvЛ޸B V7[1571:ۆdA9y+F}WdXO4E 1*j| 2##^v" 020}-=#=SהJ̙He>> ?7+$E)CY^{`17M7u5Yɋ>Mm` 3 g9aqPժvbT ‚G?غvO7_6haGaə fإd1|笷˧}$< j_ 0oJ4A6c a3}C)3봙>K#Nڀmi0+ +JhxFWqM;wV1KF 4K̭ Wȏ:ޛbcCJKǺ\}f:.x] VzP 9-gu 0Oryϴ4C>9Wn [XWY%z۴pSA!r<RÜD}w?;de;zp!h+He}"(<:W0ج&,M)9SnU{zn&4i-Z~eBPɸl¸-A6e 3 {}זێy r#us5/0GOўN2\ن`IF Q '-Fxb+ [WlܥD i(7^sBWSD '߄\I~/~wzK>c\BH\E4 ` 'D굸MX@:bфVDZrvg'6aE񳱃@qMaA |&@[6!1W1 eϟꍉwaMZ DJOLq}˨p<(",^d.(*ilb&n"4R:d-k.s_r2#Fޅӥ\=|ԶEDp\0D/ފev|RsuxbᗥI,&?4 yE۵L]8~2vǟRM˒~`XG-90V{ye?#8a;ht݁SkbF8Zh4]m2# qk]fa\Vi~ Cls?[5uvBBRP0q^ME[7e<]>Bcȩ ʡ ·HzhTaL7, ů|ǐLh߯` =E9mKux0 [l?'Td;i`qRsB/  H޶0*JSb5(*bϾtnBw䂀&+glD)UU.W5L,_Ϛgc6(EEA1Fmwf܆Ua+nlztMBW4R:[x De9²<LH ˂jAbrvz7m.O]Ww8FZ)K8pSUCm+1JNx xͧ$ϰSJlw_o: )g=B3HӂBmk3` 73faC#w53fZfsӷyABt 4G77(HBmR#1Hroȶ5j[E'f:qЧr Dqaws75fD9T:oǸ@^]{*U7rɢix;!ҾX;,R*o wC0iZ|>$1|b}&+ѓY19?tze-8nڻ[? LK\o3(| CH倂yhuؕ\%UioXiM{" Uxr=ڣK'L^28@!HU  hMHP܋QDaN߂MbiD( ֆXZ:+.#MZC1 kPHӚ&]7[vKV|˻0$pa}gI{Z3#p%kCpd8gAfn6f /<đz "F̧X݊葉&T⳹WD,(o |;⅁p ׃ў2Tpegf/oELQffJn~•gCwj]6A)>KRmH'1cS'%!QE්{{9ӯnJR/x\_ZzdItmJ_2_yFe=IIVϦ˧HR}8vZfbIѸ{KHtOW`>$Fo#45OS33:7+ (rH,qpz kUJ}F3U& -/tP ߅$I_aWQ-X[e9 `6)Z /XD!ԛ)_Fxde Z[mg8Xh~0i 4uFaZeZvuc^ :snG\3U۩k=.hbi-nC ݹe<D_;7,A7<{ W x1 L)PI[3u U?uhH`H{d|ɮ'ڟ!$3Da9 wSl><9*>.,M]c5͗rgxɭc$Iٛ8KVPc1Rg)@iZnEuE/&-▆6l"|~Éx1l_*o:ܮORNwLX0ܢ1S+2D:4;e ijnn7Ʊ)ʊ O.OΠ7R|mFm7AV1L]a8~ͧo[ GEwo%3CwI3l?b̜ "߬E<8OT.S(ۓ[4=*[6CӀuDX+މX}#rM,7U *ȑttU)@ozItڽ!}DrLW tf b4hO2 N /hlB dcE.gOF+o@Öx696f|dUc&8f) г;'m(*lve`Θ v#of`ΦI"N<=~=IZS0K6`V4:pk{iK Sy67\($az>]uP X좈=mQՎ_jAi`E2PKSVM[6),E!rsC ft {ed$1r5Ta2mxt -Գ[]smtΪO/Z3b^9A:v-s<8TWO JSBh3G:oFÕ.ܿ WQto =rsSYBF82 -% 3]G9 9A D4K':IlDC+$3jrof.?dR1,8 .#eY\Ԧ^6T;~Oze5;&tZv+ȟey E>pGbe~wKt#|&гr0q `tp8kXh<@9y jz"Ps# )@ ѽE~PC^} l Ń[9MiصĶSNTP)"8!eW|?Tyĸ+@h"FqbqKYb$C!TS )<COL:4>0cB-<9.zWkCIC1Ѻ[]BFςJp2Qd U{~<߳~%>|-<%#Q)RjOsKXAPHEY4$,%.w3G"X]fJx0:v?;I<)3 Bi+i iJ"uxӹpd:KmyϗHFm*h*,lvL4rru_BNU{܆Ux9c399)SFŬ;zbPt3qf8N.2H8794`{u舧21eݹpw R:W-;^D9C\Bϥ/%`\ԯj5` c|];#b$ +40s.h}+ԬAם,C׮,H Ll;]uؘ| K fݒEvdeX84ac|.nR{4]/s0*YiMo9F#2q5X=Hiyy?"-W#@f.΍>c OK'ꚾ] _@*HWdB~Bȗ&7,mrNxeg/  H>@\FfܽA4U3!VF>p_J\'pԐ$#Y{\z 8$y}@۾LtR}k)Led|]eǯ\ 8@IU^$(WIHIh.4W~ OC|/qv:O}2V: -{tc^N ÊXT's~c%OtD.BpɚUq j!d߅77" aв6T @]"Df%K\=,j,blݾ@[H]GOD\-4(N1Fs8 ))'[<Z3DLڊ;O1v^\^0߉u2baUY3|UFL06Urlv%9IF'i:t .aVvP\Z"~S7z@ XJA[Q,݆'- JK,/\ehIK>"~!@?*b>rx9gqQ(ecqQ7R ҙ@ /:Gu|na5- S؈P+*g̊"S*-5u"l rrݐ=*ȸ7at5EK&cp-㩑WNSr\ßt0䊛|sF2GUKD~ (eLX c ck6R[ɏ/w \ 6R}?wՓϮp ֺ_9${6S>/c!5JpIѥo+|5ܪ q:w ӏ*; <-}OT>R<-a3hM!d7i[&,#]Yzf֎tVȿo[qymq^&lLd5L1~bS.q0a0_!UY~B̀nffc abUJPsዕ윌jo c hgj~J]M4Y|R]I[P|ݦ}K`q,Q4?v*c ($^8nA){x>-O\.rލ#2`LXsiRzi"LT,B"? ]H\7I vy!Wm~Za[H=!W):o݋- W]1~ɘ,7%3寙M<`ܺk&AG?y jw7pUȢބN˝bY 9s#dߩ'֬^~% L19pўc@rWqlԃMSXmp =f,hsL á(/6]nƐQ tmi"Ly]a>-ܰ i!",~$bve\ ;q*ItbMQgļ0d ,+&N r\Cƒ3`W5*vu <z循Ilw&ENYe!Y|S~<2E T(`J/D2Yp&Ŏ+Z5"@FֳUͻ t) -]7lFFOqX~S1'LAUYgZMChzYzqi}:\a Z HԢMCm{񦐕? rA"74*#4+ ,Ŀ<4{dk"~4$+AtVU@HnL# CW¾,3s0RP-V% !rʭl,;DFY /BeRsyop=-]0N~<d4-nB-)QBqlsL8K/m.<A?8?tHN.&i牼YQl+zqj?zq;LD@dUv U>*'Losh4$?} ㌦~Mc枙Z"ÀVJO#$$ifdتRL|ƒ ͸FNG[h憏 4hWWZh1b@PhY6=8 `~ǽ!]'.lE|VƸ4=EL4R)}C=0nߝwmzD0H4؆UAyD`8u1)bn[5 "X,vp$X6J% IKtDU_pER1;u('ї\A= ɵrg3K r'׏.nHNu 1U>`![K.RH&`Ar*fТ+i^d]5&7 >{/$$$%+xxI./lFh }U/0z pjW4XETInP~|:>_c])-6 >qjiFS\[K6%q,qXn則͂ WM~DZ`K$9 "JlK⼞3͉t^Lz!xk/bBVl+:L`v LOƔLY0"Y[v)hȓ{4Ղcn8?;7TLlq&siixUdp\]HVಶ1Yc *^#td_6C[כO|(V?_|z}kCx7AC1zLCi&`͗knO马'ĕSfl3}+_K邶9A<4Ձ~VV6z UASriQvH\s&˔S$FY|DIm ?CY?2fF7&k A@~ P!/ 艼ItBI,a(TKYKD_2z3cđ$8<FW6VrLHsi 顢bTVV\$G>Q$h]iF{h\S6xPeND8Ih5?f-*/sN W7+{2Ŷw5:ކ-ԝlsefB|$*ҀkBbi2x CC F_dӺSI]Axv92!d vr\gOJf[|ZQdS৴t}j#;2vAe7vZ9:pAPw&eDQ‘O*6ӊf-o&OzZmGPQyH~/qT52{'㙥Whnsa{,H-Ҧ S-߇ ٞ6W0:I\^.R℞1A2/ n4;?j¡_߸sY6n˧=?Yp8v1׈A5GM %ˣi8M3+O))`VW&^&-^i)rAِ*E3SB[6b|.g,iC'UXH8#^ z:u[~^^׈9"R:1u{oO,)9(Y[:Oqse U)kiA {1UIfj"* g3z#UTi9>ǽv,t| GEȼF-G_BH4F8Ko mtdGJTw/}3!,moAִ 3ŏUn[ E9*th)6 xCHU}@KW~o ./Jw *I mf% Ql ^ZEe {oY`akԱ-тuAuPx 7. [nښN=~RM+{6o={8ogZkU!rLZY9'$;!T b_:]F"WwgZ'[z{}A,@rL,$rL@0ȇ'$r !/"c |^8XP$ZIs`ψ.IC%9K"4:bEҕaM˨t;cz_ZoA]K"Kƴ8O,Ib"ubϬL%+dلb9#h>DԮUh[܎x8@Tl6)C#h1?Y:@"B#[-x)װ5 )ec!b~&DplA˅sEB\=CT9֛9 U[DZaMQOrMa?A6ƞeడm9d{~mM8L}gQ-Oi۵3d^s>", ye*DV`Wv\㷦܆ܿ7iqD(9@DiHcg$S)ꉍg9P,P.?{ȅ39oa ѤSf$ )Oˬ,:^uo vm&x.-W6æ!a%K] K~He !k'?u"$ōw7ihdò{)ͧ!A<G:TV _*[|vc yx5Z Or2,o#}V0 40[+i8Th,+dIYהe|]D!uORa'ui%oYMg>O!#sn|1b[G!js9d&E;"蛔*ZÅO}Gc$HMiu]G IFP^ o=--04+1 R <斳vZ%CS2SU;GmRHAw͟*roEѓ5 m]Rx mH+&Z%sTkd8^I>#XRv"J) >d:۽O)\o ) @B;X9yL(TiSz!nN&dW )~);v`NBBMたJBE7L=(>;7*m Vz9>BABJOQ|^\oٖ)^ ^h }eS{p]l+sÅnX=nF(l8.m>>5͑0[ҕ\]P/7=Nn׸]f O̰{L4/ FLlm/I]&<hCg!jF QԈ!iCjb3n Tt| p1" ʾ#oڡG7'n9ݒuw9<61bH_~ =>9[=V(\XYYXܿl_sdϷ~{+3DI #kԋB^x`BO8 5Xgn8ڎX6iq`D~vH^5|qȝiI96lrgBP`S˞ ,BUQA+0gqv=an#F+?Pw?I1Ꞽ)N${AmtX¾~Kf3h2,v!{sgS?lo*X넞X#}VL2ri ?|! . 9u9p8rhZ/Z6->ūgޔY"G$ޥ\Z+ % >|DdЮc<6^+@]@ +À0 s0TT|+ ]Q^Q Jm 9w|>ks||s]D+F}RڽAdܐK(QUI&^]K]kL^ҫ _>jpyW@} ~w#_Wr `˳G-h>CPN>8$D/9EdT?KyA{_ϕ NBPcWCg}Tyd/qsQƀOk{;Y0?q%Z4S/"FrmHʕ j؜PMvX|*'>cܗR(SFr.(}cV mr.%CV5~(%B\tQmߨ{I1^*>T G Mj *U?Ӝf֝*\D{1?ܘ!l&dd25xT F܋?MvF3rgdY1k̠OiX:.qé묶6NK7 l-b #Gq53=;uXu0V$:/*0K ~еXJHRm ḥ|Ql @ 0uVp@&1O;ųH+hV5=PS|&fS1=pJsWhw'$0 &0 - nP]6uͱ>/iIXf7X8ȞD`%{(92oh؃2Nc(O?x/տaϛΕdJl&/rIcOH[`wr;ܺM>J 25F񓺎DL#+h RDQdS2ʩy$?b,KUOE hS23۴/-Nz ©}D[#~2MlfX'"upWa'i =zCxPƛ_1cNY=t%;2Ŵ$|i.MJT% @}jva7fXR\6 A^aRL "2ZFa=w bw{V*VB3fAj:k. :[ ;a=B6|cĠƿmC7# 08 ߍ*320^_ 9IkI/ّ#(0br!L_5Gz}׸땀_ n0oFUY_cN)e6QLL 6Y˺9Oo%"/f%OIe:QP^M)U+GS}8;7:5? >hJY} >J?]zit}b]:*;+׸U/4:3ho!'# yP P ۇmqQڀT@dc㷟>}QӢTLV}>**/[JCT4TvBqM6L6ͬU1V`S ]BkÀ2#jsp@x\!"Heflu5tP/ڛң\>Izx,Xj5T @K 4+8wYb?B[ǜ@b#Q~gm7v]bI+gѬ¿>QXf~/L1T s;,s#A W7I&*GwifM]JfV]xwt;>Ҿ]KR<#MXwSė.EL,`e@p>h ^BT\E|O(|B 29>wP ¬"l}E+TtWZBZ8B7ڛmgރ.BIw u3C֎tlߺv)ݔI?T›QYnL k7FE *Ȩ}Uz0% q1`xVB5"nUmR9[Y(E:MHH΍p}z-nPO5_kHV(XMQY uY`~Zmęsyʢ)J?-UCU`Zny$`^nBT|ԍգOL*GN$(Ƿ%_e&p'ءjt'o0.&e&noL:#ɍSU> r* w6(hy1[Ҙ-j4bPlh?i,3̽N4 ʮ-RS/dYb2fVsdt >Vkq}P9,֗5 !$6"̵aa?`BF v:ah0jn0P-Dr>-ڻoӏ*18'!ycGp)Γ_a'aĄ?;;FrGcœDC¾ &a5ΏIG(EʉȘ;Y YTxr >%71T|њx?n\VBj(p"l k~L_Y((=M:N:cXzNj95ZEڜZlQC#<4(d'8jrBg-Z ;VycбRl~N#9k@=`;/v [MM wMlME.{b1Z>`кVKRXvG]WJ[$.YD1-Ө;FXBڬVep!\dmGJrk,[ Vjd }ߺYCt VEB|8N38~{$T|O8g/Cd^prC$1,[6\OֶhT9xTD9e}p&N᜕27D({8EgOI=>Έ--c0pMtbr*)e#UW滍xXMc*QQ#Ccec)to`Í(K^Lf /bFj5rJiowS8GH1e&VIc Recke5:vIբ?+<֧#0"Fq *-UZ,>+$0(Co30)#6SAY068]ABQE(daبo1<#]\Cwl4UI5G!k6S)svc"oa*s7+p7\Bey{3`GgқAnKj dSau{g1wҘ LbcTk[ Ѝ t'Ep$ mB3yTJAg=UVBR7Zlkxi&3jDѾ-_wۡVXXkm_.;:g㒨k&ޚ,(?Ѱe\bkړSeau,A{1>n;]h5ZtRhND1U)+-E#/;+켴Ԍ}̤ DIiZ ,1˼Lp*6x`f0 &A]|@|v7y f KshlLdi L$YiJSZ |S^lKio!y"FBN IwΕҒX9 @a u i:`&T< y;?8BfyM8^3oS8s幵yEE*ϵ=i#("B]ѫ1HX P!%m@Hh ': U}ΑYD#0SwB/@H}9騺o]Z` ùfrS/`=s:2Ƭ9ww$.TcËRo-wT0iq+cͩJl6ꌮA¬'X% ˱=[L38}ӾNQQMULx6fPhqZDz |zp @,ә>ʭMmR0T!:gHGwl/=>e*#7/]2QqMcI,X#cT[Ti2J:cއg2wG[9wAE5%v␻HU8DG9, " W* 묊erG9x%5|>XASAu|a4 2XӇ0S GHԢ*ρM IJcRQ|@^:':8ZVdhegZ^GJ,3w㮗¢t֧V吘(&~)t&->kq.( G" ~dO|v dNѢ宀rw+4aDg(<(_t|?2 ͺĩ&¡v5sJ[6_%'X_0EI+(Ea`4 M"tFY+A)Iڿ:R)pjMY:9(>~䟅J ٺcHJlu$v8( aV]Hf˽KΟT%DpꏳVhL Qz[Dej^Hq{L3pi[OֵHopI K+W,R6,ީd:$L<9 ='-Ml \r}T?8qp!C_oJ!8lg2#:~h50IC8MFٯm_M %(fmux\DO-r d0d*fQw%x DCWH :}hTv.$UgyĖQE6fpv)Vh^NmKUeSL` \u,5ͷfȝi -!c"ޢp eRI"N]dK"yeatdzC\iA:lk Fv5q 51g<,$n8Lo̬_P|] #3ls*hYۂfn"j4mnaS]"nI~Hղ,U!ŜDХ!M3:sHU˱`v0= "GS& 2 ( !#QiHlA$hB]I~J8/&pH\z60c(of\t!dN!ɠգH8QRI}4LEFiDEFQs-tVɄ /WBOMe5p]mm8mO$\~QߛML@Q0F]mHm^At k؃!2 /%94CC'<ʪ,o\gre>(#f-}E5 Jス@Z`S3NZ􃦼56r'9yF q"/@Ojnh'$'"H:#ZsT(㬵B'wErvď8i@ U҅B=v C*MN 9xJh5(MgƠ(6+[ԭ~.nx"J 5۠#_ 8:ߨB|y2(0S &';"0о}*:Yoh\D[ˌ"*gɾ* W4t7I8)‡"o_&X7+//bjD},Xj"GR0<DJzv4*4Mʹ bp<(fCC0#j,TR)<T ׅj5X-ٱxdqy*bo+DSJՋ|I 7V*>m8Cq!NmVlsv0z4P mې.eO1pOFd9ѷ[ S@̒\!&q7.N3W!:HVi- b}ŒaTA_y݌Aa8zFL)I7yEKK՝O/@c؃mW=&C !!hz0>HbbVr07[᠘T|4Q)<טj%=h s &Hk ̆ZadLجSG:멶yC-p7,W8-Uq;t[ ,j&h68ssǎҳYK]fB3= 2R4wRV}CK5[]j0 Hb ~Nfkr[qx6{jLfg.JW":#rڃ*TO?n$ffsff* .w :Z^ aē7qieFkj ta{bz 'c,99Z4 5m( u*<Ѹt<<O9l({-S^z\Ueѡ,P-K/X|fRqߤĵLؓեs\2'\]SdEyE]lL,&GE@XiaL+D4hh|lV74g:.dAwk?ۦj]F\VJa[ң!Iо9QEY ZhZI͉0.1+E&6h\ypa`Jx5i^`rM7~OEO*ZauڜKP܋57=Ἦd$lw)a(`?Ѹ^ 5ඞ ʊ?5DDDq`@GeɌ:0 _crw o]KpȊ~ <9@PWݪ:[*0Q7ABnX >i=|nJȞBuaɊ^ʈFihv݉\# guܴ( жgJL~>{Cȗkd=:bEN؇72us sq~ȉ$cdD[4-k7p 8{hzB L^$QTvX?^:D'!2`iwbvK =wJ_N7cz|tx[*fA4%mvM_$XH L onCֆn+_)6C/Φ8/ogg@jvcU 7UFhA[u{|-ÙJ C`g8r5wd`[ϙ6̯,3T\d ]Ҳ"^ O6hI Mo*.oeDYETy䆡j*=eCd6@ }-0GHKCs;{gKcߟ?&mBX>H kk` IVk7|C\uFV<;TbGO!|3}}<:kӗ÷vj=HgZѯ ҈ F?'d\KJvv 9w! č:n7ܡ2g45u<x7jn yl3 ]f0};u9lU|$ KVy-o?Ӆ#C7NSϙJmQBLS>l`vL$zA8S=#p'i,+}@@ل=fgiS{Nb9#q[|XMO?P@c2w*73}iwhW^hlt#>,Pek}Vwnj\+l5>VUTl!Jk ]-}]kBQeK6H/TkdCv a.γ?_o, :!܁lXZCP?OaYd` 3&䴒靖TtJ#d@L~4,k|iNV3iHE +uӫǮLK>pSD{s°y,9,N^⽚E=\df_͂:uxyG4(pQ? &b1nyb֙j&G*,c G[l?SDpP3DƯ#HG9jO~ =blH|q0qlVEȥ}=3@͉Pkhi&U>[[JObVUopV:El|Ef7J7 NulT%~L*A[6T c9?~T M Z2yje?q#)AF^w=8&! ! Avޙ c"dlO(=`[maygؠ2f *b:'¹?i#CaD\tJB,!w092+!d8QA@0,|d8(zh64NF˩>xZLvqG'pR7lBe\t)Ybkng)/I g 76L{]7;+DNlvB i_ vܹp<% (#TL- {vd*ǘh9MLϜJXFUdo*l"{&%mQNkin d[Rr8uDۓ8G1߸EH ,W!kA>|9oߡ}wgZ7~/v17%eo_8 tI9:AfLgj3`ˆ}qf^G'%5+'Hlb`b`d`ziC06X$Jߡs_x_Rm|BfAX~|ä0@OOؘ ! C \Xc~Y6jPDU1:YL~J3Tό<^ޜ9$xEǏ$2Gl_fcNH$eMK39揾X~jэ~xz-Y 4-|vե̃W>u](?q[GjŧNSo\Cw#q]Ç4>w&.L_&g"bikeG4UIܲ"9T iRRQ-.Zi9Pr}cݛ U-I 嘷 C ?pV٭tn|Y_k瀵)V_NׄHߊ_L^s~V ́.b_,plkM.,|\Й&sɯ3r;Bڏas }&98r=H5AWicJatX]JoRyKBzcZP sb&A)-]])˄9+f(jf6hx Qx7Y9VaDN+LZP fɯ2IzQ-t5*˪_S,ђ$#Wp9Xag<""Gok+;cV$8O6ETqs}beK /i' 8XYe}|"~)h?߿z6pz\Gop־vNĦZ#>0:;CPil+# "WFUm ,䱐I1ZAQk^yl.t@3̧?_c⹙?eg<*. 6 CXgm8; OsVֿa qL)t\G6XЪVX m>JVރ9DqD@Խ]N%{lEAʏx*vj^&s)*۾$ЍQ/@_;&=Rc 7ٙ9mV1+[Hʀ9be*:j\ 'or(T7GƔ1pZ5آ+IKtTVt@ZYy<3{Z<0xJ魶4p龍9INѧ8>6pXSte#UCsr? q \TgCS׍$Ryq$hd9nRFȶZ_wD"_lODL/ %|$Nb=A!): A~~\"d!- t0Dƛ]T^?VkYKݟ\%KfƶUOk6HO(/$I[Y.̾>բ4~Jvwx5fXv`yM ap# ?RgQ,H?eіqivQ=\ect.~d (JgOc@zi@AKLj2:C=G%K'ѕ۟S릩~um@cVT)*5ۛt[ LN߄$C Ȟ]b!opP(ZJ"si%ui)X3JbzÙh*h=+eZB*iJ$lZ3A)?Ti촎PRPlT3ET@>sb~UH/>VNVl%)Hb | {2_> eR *P`2{x]bUШ M }&?YQL?r9t\DZXH Z_7t%Dyj_S~_cUyUYHI$_>,Y4|>5u3}#E緅ݤ2::\^BB Ť"{d,?1;*/$6O+5S]3r|zr7($G)z31)Y){ )Y:Cc#@2|C̔X,K Ȼ8g䍬L]>bMqK"rEm@{P/$__E~lj Sfnz;Bt>gз O@B.yYsfW:Hbj|c<) kbj?ZZ4s閔ƅwIsY(eڮ|:i(}YۤA`j,N[gki]ZZ[)BZ:jG<(OP0{#q)u>T? (eIcCz zWZ,CZ"R7}bH|wBȬN5Z H `2Z͸(#sU J~_.b}}st-t~T("g d&t\6qRRZD/E3qKL)gBT2H\dIǝ 9>j_EU5h{Q=&bE@AuدǶ:o ,iF^b|NG#w$lI >,>80ONPA58AtPt\OdQz}">)?)(dNVj5;|CqOᑒC˦QJLTB\&8Yɽ#6g<@fOVSa~Nt~TIw4i!,o -WZ .~缮HW0#xyј[_q/<,- ؼ^ ҉A̎Vsn x>#(꫼'tÑ_Vo't0 j)›+6Ǩ=ρks R-H?xD>TH.{Cyw|Kphjw|aʆF՘#c}əYsdIcDR a@@wMWn۷^ɡqY]>(@c[i Z!A+@ FU-v;x%r X,Z7n:e ԱFj  1mȇv H0`2B탁a r="A TU4" v1~p]|tb5xov7ڽC9ÌP^xV߯I nK%^OcdXѫ0 Ww 9!w4qulv^%SvjBYLYnABWPHHܾf~oBgbߪ|)Duܯ͟=¥a0@$[[ 6D-O'іd̪%r9O$6ĭh I~ :5KZ(ַɅ6 (12cWhz0.vMgjշW< ve!W)=@@eX8Fg)50l}:0ণ˕;JoMYވyfqK"Fk2J=SdtI wBM4-(އWTuƾsfлOv<ނp.L2RMYtd7R#j=.U\Rȑ,MQbD *rmRHCW%zH2P+~v cy/YE[G2Z_-3p܏ھ `6& ևA}?[SF/|<X'[Y׿fDiڒUEE R@,@A+k<~=XjϰvYovUWp vڧ4Q߄~]/gA7]ϥRrɘxϤB߭sG߄whI`'tMOppggmeՌǑ>[lswHC|v6I7m9da%^ԁtMJtr+\}$Jd[OV4hl&;#ypNp+6wbxd_yFj @?_1n@< Ao~ گR"B5?  L waטޡUaݰ,N碮Ge"8X>L=\ ]$͝Lcr׿ -v.F.&NQ $ &@ZB0B>|`DehIx |FT\RKPPоqʿcbOD0GDGDqBwD,mLe썭d*?<7=78gi4:FPϾz|4MĉQ,I"^FJr򰰀wXāɂ[I2NT2RӣCr652dcF&*,Ş@& ;|Ȕ>W(ÔhncnHac1P5eNYCK[W[eK/S%SCc/.9o/yg(rjsaswr)i0Åp@;wLl<~.(o]RA& 1ڀ!K~CѻpyPvvС_ao-; 1kt$ L M ?$/R0՟ݑW_k&~0Ƌ̖S /LDbZGOb%#\G[m)#?,~]x-`RC9ϙ}nvk ;zHR'B!KT*a;S8Ј/]0`%cF#W8IrZ gqd 둤)^8}u@E\H#ܯ_x=FE*Mؙ/d:ĕyOUD kXrS׋SKś>[Yz& i2H~6l֘b?!WWD>A^K^2$%5>Ayv˛Zַl٪+0^u%:s;45#g:oW@NDܗgWVeTxBey^}na{u 0P39*-6TTjo~8'B'hVuEw8F Gtni+(TJ3'km@w`Cq:qҗݓ] 6VIAN8UP TEsi|?-eWGjvsOD3F%W=oozusYz}ޡ1`n9bЅl1yÔ^[u~Ekn{mbx[ȗE'EN'sŃF0*A/]:i~A.ʾcޙJÓ;6IڐSDmeIF'^m\tbD XΆDȕ#<Q"Dvj;:BׇիaBFzY3[˃ʜXz 4!${&O ϦҜպ 3<盶/i􇝡  0ь^\0ٿs8aT螙u^XƿKp}H;cXWbiki8Cr= =IUŸZrWȃ~07ǟ |Tk}->mkws!(O} _c#91tŔɐʘ /d&̕8?Y9ͯ eȡ :Z8&M&x16+jb6Fӌ(Ä{s)7j:.(;J1FAXμ^l$7+ҔJ@"΀5=ZjZ{(oD  u8eN{e+ gaF -bϋ4B-mv̂:- >4-Ls8Գ n:p䙎q{oAB{$EE^,gQTĉzeYCA !VQ4m%MT2P1] [n.+&EE)'1 ޽Ryk(%ȣ0=Z?| ,L=YGl'l'ʀhQ PϦ݃\\] rvdTJ)QcfKxjǟDI>ތ5n2cI^t:O@<),xًhI]U{=d!UbaځN޵:soAv{9ݺw r 3YK_3F}ƳЉq7) D*#y49K} `M%XiZ=8NS--("j/;\E|->lyu1xJڪ!F ,lsӸ/ӟլU'4Vc_ #!̼Ɩ);%9=D{Um)ۄba:8i/ Z_0cC_#aN(QaocrL%FNeX8δ34dmVo,g?}JdI1Z&D@lU4ChI\2#!/olcݰZhC\7w/f@[8EZdQmڋ"L`L}}` Zeo9Ky8/r(,>7o ]3ărBLbV{eT1 BШPTc`?(6pn-J& UMZyWeIrҩYxy3rUy#} D́l׶Qd,N;s5P}Y3o#^cWCn:F A_]GڛP4_[W)Ur2G? PQ Ūd6g "ȉiO'I `_yDxdi'<"`ʯ)I8#Ndʕ+x"*ń x"r@?!ݟ9̶H,UW}#W0KbGV6NT?`9Vu/h"\ՎJgĬUԳL}Ak5=s̛-`lIW$ /0",DsvR#y)W Qe?F&W7R%‚2ѧ%͞ oO\gk{;f6}2ӿWa^cOv ! Ji"c{H?m# `F+} ;w?۟QWSnP!x$^ _Z\CB R)R}qVjl׎(XG Btɇ^f}2i:+ܲ3Nw I|~PYYMvڜ1Qt~|0cD<3^JrEM1:~ZL vqc,=|'#m<Ì#G:&v_%dVA*K:#CwmdKUjFMxҦX#陌˞8rF..\PÇMTg(+#lCm1=sWB~n0͚JU`pT40L?KTo7DH ]ynv*T2j#p̮Vp:$\;LeBͣUX~@7tJ3W?lR.8ϧI˴EZoeƒdН'L.#_ң,JҠKsSҫn4V8bԀ9:,(BƧ#i<4út\??`my'|07K= ?`qӿ- ]NfTnmqBI)-ԕM$l9O|{KV2wNp?=~룥$Z醈M- Rv0Ugÿ*ÂskʆǍ #᫨ :T-CjP H-fw n ˏq`xVws?C] ]~b,!rȊ(e9L.\:pJ9%?GNoÇ*)_="H!˾@+ܗ89t~1a88&* Hpcjq48'dVr̂M㦺l+AP1ѵ3U.WʧTŹۍlęr6ׁ)I9: ^=RW4QYO^=?PJTNzdG3E^/v;#)V'DӞ:Zא7xLRDы2sCA8-kPi]Si8 op1:a Tϟ_=H%W &f6~ VIg%7B;ԃXLi=s1lL/1$0a5KP \bI;7\vDm]Q;f|*d^\-5mߦmOfp/Ea:2߆tc l4:-&[|Ug B9Ń*Mc#?G~pm,],lYH phC.lմ|+ C3Lujn)%JG]Vga Ux :6 4 伕v{%s3fӕ :3D! PZs jK.Gk-"tTNӛJR'{(zj9W[+O;MTme߻x1m8iʩqӰY !:?kv `0u} qƶ]ߟ(-G2NRUL#@N-ƪAAqar3\'b yHV{n 1 ?vRP k5ΐQeәZ0 F \xKr,[cV)&?!:_uD<Q0q$4L]4qVN60nw]/^_79FA8/C,c'Oggp1G XH< Q-)4籞c7]9-{%4ZifF윒Wp--dfLK kT-"[!:R2.:dIIGЀ~$91dko Nt 17oG[Gh}8\ `Va$%8ڜ#)NR)Qɇ+ډn) :BKCq5"%۔Gr_(^  58GCV_q>w̓cA`AL ֢'o -qw.87M̀ȴnws^g9Hۣuм >ظMֽ2ƷN殿+mOȹsJK`D&KҍOD?H(!I3F-H;+HH9;<(hqvRZDv6ڋ5I~(K|'2ҒHُ;bm<z'l/ ,03}dA x) .%I` ~##Q=Tw{[۶mmm۶tڶm۶m۝֛ys~HFV>jժU5kם.^tZ]f~u(.,rnctߝ/ F'Lgۭ.k[ v}@}5a@}E?#]HGn>0{k}^1v)wlst粩ڱB2mױST0әɂZLCFTk$uf&7qȆn;W sGx)Q~73=y* a`I7#jrl"_nղ9SkBF5ݼ˶Mykd- qOoW 8c>Uf<ya<9[N28Ü{RpauK(ǡ3sL߫)$':* ҫh{+G%":օ*Cޖu[DVe=񜫼PUY8ខ ϬhTɎ0~>vDN˓o_Qx I$w} >/6{2҈||b  9I*$j6)Q+j\[>i=[ C @Wiekhinc*ll?XҲ?h3B>I^0J\Y2ZO''e`2  wwww_# J ԩ jpW*ΡS݊xInBwj pE*چ׬aџJY9RrƤW9$.?f}\_LX, a7Yx-L4)"^,  C-z5Xa4h.}/:FCnPɷ!W*yBl|U?=FA49׻YBCcxP4P,}IX*DS(Mn'gtqp2Vb+0(En l;(k+ h-@M=J mK}C~(MmЖ寴pig[;S.BA['i1^߼ DE@}=unLtإB0Ćet>-@S-&B? ÄL?7Vڎځڑ~dccQfdcuf'sŎ&,kl.)Ҳ$='ј t )F\ɦxUf1Ң($QbAK{8⸘F@|QPLpէjU]`+.%($}M\zu~R@g-E"p9TV荝Cz® Nj`o+ɆHmc;  BE[(^?P4`ʷk L@tצ_ 0#:=M~H@nj,x$x2I `=BH^ΑИ;)eUWi/}_pdaԄ5Umr%͚WVղ* ?+]k>x#e=NA <*CpuIx4Mz9[Jk<ʵN:3[}[DZY >^m{G1Q!׬""0`>Ͼ>B`eՂ*JZ]7<5|/qeXa/:@V+Z*6g \LQyʊ(.,PRxCܼ" w3$_DLE_QdKmKjs!BJ(0rPa&(oP?(#Lr122&uzGԵUmAu{ ٮqEc9'cB9*xn֝J}7)男lB|E}aaH_P^orzcIh\7:;B*$ڞpMԑKZ|qKR^C!+D˖O=X.w?'r3Nݕ&mSA@ Tk;ۣQ7k*z4!=L4ezү){gD9SKU| 9;Qi~-#fQ zpHzv-̣%|7 z<5id4- ! x_&w'خ'BxV#S'Lx$v.(|Mp"+7??1fWz0ji4b͎p&䤘kr\5+} Il_r>X=ّDA~9=2Ȥ?iwđhAη(̀[g~w/z BHC>W:Óa|MT{D] ؒvFz*r@ yW$D~w@~/e4Z*s,7-*lr+N2rk;XU Ɏ:}v#*I_Zไ=QX=F&jzV+Bz žD9Ĕ 8u灛d}g8' kv[' eP?\7ì G&8qBSKHb i+h2w ![&l4Y$O{?Ms\eopD>v0hebl<ݞ_c8&ާhPs, ֜hH\E/uoFF0}W# & `Y.bo >*M%i)+\wHP J|oewjLi Fo; h nldn;,L4 !<8797:w~ *W])"w4P`-LtX$8Ύ+dhF/vB$o\$&GE GFGEm`b IQMD`%!(e._GJ`.S@/ǁcbShqts39|y{JK݇VR\lX;WWEqffȏ0)D ^ґ[6W躘:O &L[%!GqX3mGjfiwR2(BES93<ܪ=$L8M?b`\=BVe]B&e!8І'eyT*xٗU rJ‘?p>׆o]0"谝xGEya# /X34ʞ+l:3F=pcEΪ/ :8_Qv!pۃvX"V7#UAMDRnk5 KΏm]q{>X&[GEmVEI𜙑{-jS7W ;+JpfrƗY'P%{{3N=5!u3ڄ]Сp )U{%Cc+X=1`_@#P:@x(`xy朣 }2& y3ZYBKVzNF,D|bERP-pn٘h1q`X!%CJ>?2.dI)e3PAS/8Ab#\JŽU@B'+nD'S8̶t:;/φSN\և{UŧOZƍ7 Sr;ʅay!ߑΛ[9e@:"z 1ezӌ(ecބp8RJɴ3^?Gv8}Ư ~ #LLo 8_y%SlhY7NHؔ*$qgW <?7=HRWWϺ[V9|z8G0xG%&c yAIziA{A]t+AЕלfkot7ND3݅.͐\Ym@WTU*p5LVsc b` պ343Req{SCohz@}ť Q /r{\$0SR+N>ȳ/5HϏ eSZ\?(n^uFݓT7/Dݕ&]*~ +L/NPd X\D6UL)h ~y҄C:*Jz`s;6? nm`4n )9-)_ N5HNt++#=Wbhb`&`r*ΡV&of}o@8yy(l Cu6$:f,b~:U*U9gw@Y8ࠁH{>jֵ-g(oO2٫8-Ԇ⪪d&/. nwu%}~Qj).Lϳ&A%cnD95kY|9д_ ~]1jĠ`*ąbA. zbH$Z>'>mzf&bLDToɅ&,qw*|=zDw,ne+KC-LMM 3I޳%*bM얯|ˀ*p;0O<Ǚ>=>gfO5=~(Fo[#dllÍ(\ۡm㢀)$-$+>$aoj=F/"/xhneܪID"b摠N 8KIcWܯ*ߗL߉Ohf̬+V>Mid:@Up Kmô]Ep-tJ WnIU_ls_Tqk_ x|Eh ns7qrpk,, dE"Uj 3_/xuo)FDBЇJr:!Ī`ho 6\)7zvOeQ/&z{ tG #é׉<9C|hdG5gj3b3k`öQD#Q&HϹF;Kk_0oکIm[{$ACX@pn@E9.eU$gScМ~5FjU]4WȀ ad r+fWe}ZTZKGI"S#0G h7nc 0*Z)"[ eU.}oPK!0hR78{MxҀ_'7u!h -&qoL1]+/e rToʹ:{ɝ,b_~p+p22q%cjK-]̅mX0솖 sMP/D@_&_erTM.u$A }tHrSα Ϫ M ]dF5&]4 ,sRLE.X%بޱlY|x4}_#;=3kzbMqXk5;R~}U eZD"/) Q@Ŧ}#uj@8Mj:u{lfa[vW"{Q>r;Cro&AvDy E`OM'%Uw#SFǯFc4hP P 1= 1 (Rp=i|:5y*Kjt%0(nM[tZ4ۑ>SsyHvw߮?>ַ?-Xw?[㿺ե^c_0<~D#LDF$z5JDkU8LCu]8TD7 Ը~-+!=H<-4(.ִ1OPIg΢*J?Z{%!k6&uo5)) ##0%Ͽt(x|Fw䶀uwJw p#ž /6ѵ3-b:G·qP6,8#F?$BK4vt3Tim8J`^AG}dQ|]dxT-Joz|'d@Vɰ t[>N֤2,>DgZl%wW=ow94({kc~rhk=2/Ce†kP`9Rʔ1iKGz 닯]t?x'ݘ0]g/廮-UonJ|ي}Q<⢼_DbMhg:xd{Gf[|i?%_m7d!jK!@hkhV9@V"c6BH'wwP#&I2eafc^89J+c T qԕ8 nRW5:@hȪn&Vr'JZD_6<yoկHݝJVՇ3Cw0ƄfߓS`l[o,*֚3Ԥ笵^Jk3OpժHH{3s%6HM- <"yN[|sJrChf@a 0 yS}{)rnOVŕUse4~Chm"2IDA.ț%ޛ%|ۅ] 4{VYF,9ݻץuƵĠ\;63a7no+l0"uLU}sە3ҭf, 鉚7-R!#ܦbEL8 VF{1P# 3)︖Zj t Yx)O'oW1r_.\Rr؞Vy~&J0"[+`{`jw"]v籕qYXiY]D؏|!k5[OP>#b as@E9 mZZ[\ >'oyMs"b|Hj;U?@A!$52٣PdJuجAjr٨UÐ O/cK,Nw=nCk~&MLFI?j Zce"A!ab<  Hlz sK#:f u#P jODzDa>wV)o>z-l7RVydUru-3^ax3Ƀt^eΏ dG/QP"MV`Jw"EhFa}Π8 6(]䳾s&/osF1 -.3f\:XQlL)g`8\+[NڌĚ{Y *:oBY&ln Bڡv .d459xxxX׮'D#VK-C 6Nڲ[_ATz T| ]Y} 8(~>¦ld0N9Fļxtw|PTSʞr- JRYYʼa)U`-G?gL5 >{ԭ`Z:㫆]x&X՚grm&YU:j ,?OgITGZgg VKLǕdqd1g[KģcZI)s0:ȴE̟x$g. f<67vŰب;.M4RiO8/(^UD9Ɋ|(<Ұ(&QdL8i e O@sOFn@H;r}}e{|lr2-G# ȭ^D8ɦDЋm!l擩: x A rS:dj3hߩ/_YE%>dǖr $ZSH=!nzEgeI,NXHFd֠^#ѻ75D_CT9SwUJkĕ&'EJ_CYJѴNh&9 6J 0jPeWgGgkP|z6[o'dkpJ'QF10qUiD8e_пu-Ds>x@s"#*:>@Ps[@Z&mu芑6#zXQ𰦁3 7]X$LWaNY0Ѡ-HD.[hKv,b83myx/35cNꌳÉ~GY$oLZf:J ᦷ^dVb'tC&E4^UEkJоcdz9-0 w>@)-JP b* `ruM}Gqf1m'o+Ur, 9O ;H1ĻqzNHs]7#1(e/F| ϑ.p1(L5 r'(MK"87(7]۾bAFE+.lܑm(L^;&0jtH(ĸM5L['^uZ cV(pk<߸cw0YWe<[ϓֲH".P%: ]f[v:|Ƿ 7-2,Oi:Bc>]moׯG, ϪOF ƫ,E<Z"IN}j2[qۍn /pLzl}u,k +a:l"|ח 6NJ_jmxX Q2T}* P Pj˱Rh jT\o^]Hh,g(=R ךwɰqZUUNQ`6Q&4Dц< &6:[ y{$_SC*<2M;?tK3Z;b65:I|ŐG[u+}Mnm]O D4.ࠓXELWB~J>{n^AK /ԣLj8=H(MúMkɸ Zc$ML.6M+N3=7jE06xŻwQ/ C39aWB{F2X)oPЍ?u`HC.VT_˗˕ ڭ{D/UΕa`ZP mgk R6 }_Yu-gdĚ:(>3 I}%*U+3iG=IDq]}ƥRbH{x-27*򔗈Ko wѻ ݪ<h"c7YStW*ҟWƺKRs7c?=ed'B3"=#s<w+,Z@ALɉ˧wn]NzF&z}zMyL`hLuk^";bt4t20r!m7,[iebEyt[3qLB3;C-qi6f f5k$W3+ԧ寫_'/sr\"+?YH\4Q 6h>R@Ҕā$B(bʝĔjэ@ g@%bBn&'^y}t`| " gyY0sYh ]; (jوdgdC A!8'N5ab&2Y;fTBtVrR*ojfrqy~ qSUYxWDLeVl{ Et ͒t\iK2oF~mb.5Usyy HC9_b!5=Qjjmz5&`AK? >6VHo0Fv kތ'/FAB/Մיh\ٍ~4m21:LJFSZ)ΐ^h(jGq%Utp?9s,>/'Dֿ+A'EM6;W2YCU{1}9D`F'%{Zb]lGwWhVY"{J0%hJs TTKŒVy34`0%Yut#8wlbl/>}K}Cj,HRe2s*3gg4^p#E؀`16t-'*-7H7y~Ck?B2i69.oTRbhĚlHB+Z"} &/jCr >&> 0JRFp#lPVF=Dz, Hb)Ih Y/[GsC򳹧jKtjt<(ce=™;sB$($fQIwMN\: jۄ[0 \%oi%7w%eYܩE͆E1?_" Cc%ɑ(/Ai K|a%^F'sM&Og]|UY{n&V0oB}2[N\t6\9O}{QkKէϚOe/{a=:vҏ.7-E6rKq[KztlGݜV .=WW}덚%rQyfcOɏ_1]jR=2T࿿x;`7XPϘ+v[Bc._~!&11S03(|Re/ğ 'Od7T=UGC3^H@nRhh yjx vpwޝԱ!1'sMkN. H}yNџe.MH=/*(E:]?;T Gx>a-0Ld爲*\ R?&<7koa˖@![g@9(Hc`!#=8"=)K~U[᷍7⟱ o|_ƗMFLǐ:g !1TQ#t-Mع8ytgȸNޱ.k&$|owϐzO#;H5#GT閔8ef3J,g-CԵs59 鲠ҞM85iҫ7P$,g?Qb@"Y=/ڴׯܫOǻ6]"S+LË>"437u?A2)-.$nqY:dHަEmR7'v^"]bΕu]3YM!:eT:+x,g.Uܾ[a5kށj v=FҾ_ނs}&K6[8%GZ.?01ddU2< 60qx`zF6DKAZ% "e;SƏrAZć/Pf ]#!*?x@p ,Tc0MEAMFA>KQ2"%dR$*# ~``)y  Nd>Ħ8 [:-OkRB$ů_7mhdG㎈g$LԒt6nzr$܂x̍\GڧUu&:R߯gLw=cM؄ү㳼T9FǷpW.S`q7 z@q2j#i9F}qB/?P;먂Z-*Z"/kc@ ʮ^9y˗*7Q=hOyoΠfaJ7xI?_Z2xL뇜 -D=0;`jTCvIl+% ;KKPF q!h ^C/,-OKO?Ar_|ei #E*lbJyTYo75D2Il>#p iubrMg_0eU;^oPxa5 nm=eH`+Ǩâ![\AØGEƢ.`MnK,Ej8-<`0>bӸ6rkC_2$y!376ʯ ⵷B,\1Lbddʵu@ۂG,a$9/Z𚱼wCg_DZxV3rPzv!~RVRq+@ḀFASW8V:V& dVQ,sЙ :)G=1CI07#a^(a$p-}k -(x/-oQQd;B.x,1 a 6^#>"q>V3L, KIK"@8 Ƙ<9 aʏ< ژt"QB8麥'cN~ȬGo=D^E;w/(FqϋD#W a`1hjjP#a hSy5$zDǃ:n7 >:=Lb7=DU5@Fy9#|<)զ lC 3h0 "tg1KNJ3>S1KΠMUk"ٌk> ;K )Cc?-SW߮8"OTn?_ ~=j5F(j8÷>ϔcCLD2Hk>\D>A9%C"0ݩRQ•G4 -Yq ˜x,X9u6w!dH{q `\i7adע3et4EVu2;OqaCa:ZPk|\|vqRpD'ªl!5Ss$ވNE5Y)@ FI$$Ykq;?(:xHD[F=%Q26#mIו ;i1(Z m0'GQ?DYu&9SكzNd2U:9ĻH-寇8] }jb>yթ⬤ьRBAWW!oma|{a6CP]|a3\⧜J9)ү'WvckyYfCL-DWrG^ UEB"gXvЬqxpIGtمï1'ܫ? m7Db 0 ex}Gω A+እA,Jve1}؆t{xZD{?,~)92_Վ ܻ(57T}D .Aj[Lm4߉ jk?sfJ0\ɣըΰ>.5^ﭵ= WN 1>` ,Yӊ_?EHooȘ?z-i$ ,TH-&ĽiA sv5N\/7>@좈\4WD#zz|{sF%vNG 9 2@c`Ɗ DKԑMM,4tBZzrCtỷ++lruJnutȑe>k"DZgNw.F圜.A Mq턖?y6ifl+H!xdz"ӑxQ":  )É%IpJ[p*@|UJ,#Li,JI}51y{рrޠOd6$>i܏jloz7j|IЫlyom3![>vC V$"EIj=> rBefQ!HEn ^b'67T O/T*Rcvqw# gu2dK|- D;Efg1FO:;)~AH¢?dhF1TE/H?pdWpk;>~D7˖s )g kCťIiLX阍[aQ!/>ډ,c5EQ@Ǭl ;Q1@CٳŋZ/&*\y.q~pNM!=r_?+1C4&pwn?C0a`4Q D ʵĐ#,Cٌznf{Iȱc?guDUTyn|sMu-4.٬ tVy8%Ta#7p+Mሁ፽#ٯؐdtGq/ߗ /%.<bR*qT8-n=|U`8`FIlF#3"d#t vHj0,.6si1_nsMZ֑FA=T! %Hn . o^3BBHdA֍nSSlSlL^zp2AwH6 .7|#Pq Beyv<󡖮?r 3Wj&t2o*29E&K#ag}[h`-Z[8"Q a6SrGIъ?m~bAu5'AVco};c{$¦x=8\zܢ2KCy(?$T,υDLF1_"i9JJgMCF4DBy(E;@I0zb 40A*}A0H?tnD'fn,E0tMeŨh/|Uybf%+AIreC)f-3>lTs)o<K!o6fgLťmWqzn3!o*$fN撵`Qz&TFB$WdнN0afu!U }q7ۭMڡ$u0d ݇jRŹQ VofKclŬ5# ⱨW~JR)Śs@TPJiKml쥞OS.DUOg>U1s}iWO+<}<dCl?c:ojdv,~< 1}rPPMdCHmvPʚ!DlVR^$qy{&2ww?_'({ʨ+՚S)磃uf,̹|j9\!W ȉ}}I6ҷ%A9 3MnOd٬i5,3Q]o8+zKb#P2 KӆيJ23F'ɱ?XܢiB2 ZU;d8q2h4`J㇁%XY kX#5xK`"O_WUo'Pf_ȧ̿s[CKM1$Sɢ Ά ,·&ŠLE36H^Z_SAy{ä5O̻kEeGm3̱FbFlR.p*@$ yG~]p%`I&㟸FMO=]ǐKxq\'<B z"6dzd#ZOҰ1*4Hc#۵[7XOT=Qum@ Nul4_+jys &jJo}1r~qi};;s6r^8UņiPUEpA2h3' 1J3IeO|bRֻZZȋ~z>H3FEL`j k؜6Rvj/X,xmQ/ui pA PP1ue6ьdnkǀ%:H|vonlry @YuZ!+Xގd8<%M9_Sx1T(wcGQSgѧBy18`(ĎuȕuT# W$+ e?L$߇{RJjM,8Bȅd([ "U|[י+1ջkceY%G,Ld3Cv+ŌlAi mi>%s6LBw%NӔO9[1{3C.¾C4*ݎ02219]lVQ_Q! P&J~7Dz,))2U0z!K9 ]ĭ߰ L3?##?8t/,%9 YBioB+Br`aI$|PT=JFv`,ΈoDm0XmajCqS6>/`Fel}i M 7s(+JMkx|:Y"ӞƣkBxYL#v_{$z@fjWZ~41G\Ѿu[N <E=KvU>) WliJԡkD?S̠ֆ@ :ΪY5ʊ JV5D8umˋĨ-adYdz'2wˮVDucc5vn*j}dxz4u-k}_s^Wj%>[zmtIL&{?ptR3=zK5Z4"ȤZ) hQt()[8,CVm#kߪ|AۀMGOcF01@NXxH"짂t 'd>~2 ᘒga%*rKã}/+5`x#hY%r^MNѤj,&J"Ϯ΄6bwP !lKl ڶ ׅŏҼ9"p̿yqv~پ{2|B2Zt1~A*Fﯛ˲paqtTWj`_O:QS23){l@%aZͧ$`}ˆ|sq #5cڡ5dIbM-aCtKaj;TL e rM-ʹP+EK(Ԇ\˧CeFzCxy$(H*H \\l-wn1},0tgA{]3{V|򥻾_Suվ47h57 [InGh_:| PۋQ`tT܍ @&#;2!,k'VKQ)Xmhhf?r9suZdl>G1ʡN[bQ/]" vőw,?kD#]nfldfl ߹ :gAgHXHԼɥ2;Z%DB+EFoy4,@r7fBFGSƝLXx'wx$qޮ(FQeBm0A^sBBߛ]?7iO_'7qT!1 Cvfi)/ @Q6k/0:`eij>:n 6);YH'J0[)E'sGZ:]b3KL5zi4`\0}|L߆Fb_i /Al8$1k:S `!?._2U]7n?9_j^ 0~>~%skcE'}k(|d2q %=Eq"d iRHhE?-uݽTV6z_GS>dۼh })QȘ9Ȍ . Aa0eE Lу<\ӧRzZCt2OvEs_ZzWLkrТ0FüA@uj'mʲjYa*nؘpDvꨡ Tr`$1e<䞈h6W|3 dJ (sS6%ӣs + Y ܕ95ޕZ._D9PI(NqS#liEH Yj" <}]TI>141ta^Ub/eş~A<E`6`D {/4JAi}[H8Sg͚OQra [X_L723Y-)H'=P4($aT0t4Eac`=^n0aIoEjy3Wf>}LGLLOO)5rmWΎ if5S$0i҉ ;({SJm&I UdZy5M䖩Q;s#IZlΤ(_4u DEܖ$2, ٯ)B3/N$hFx>V\܆WW֠5)m0i} <Ki۵_1X؂tq9ќR| sNaNSWRz-_\|o'A)Z=S@mu{tp}hb2+04mpAu'=~[f[[yv3I٥7'fU7LwDPJ-ap: 5{hH޷(ϮKx&vo?D~cj #{3LQMOH":*;QF*siq ďET {6[QiK} @`8"heBdobU.of -^/ XD?1`%"VG&SR8 b`D=]<Ʉ= ˆ4ܸ,I&_I hOᷣ>ns7&mBmgA8uo.aϰjZwbO5ӷu{:̬W?1_Y%dkbRUyƾZB?]g?(yתK ؍ШG ~05+S[]̡Jy=>Kv`|pOϸ9|L`R#Ӝ1$#' $mM#D)-Ľm] ?Ƨ?t|(SM.m{ N qގF: .re ٤$xSj䩩LLۮͮg%IzzR4N`Eck=w PҼuo$7/_柈xl -oi-wLs#:SJ) uP"kFFCxO1!j1E0\n1tCEФVԘg yH1ʋ 4"۵E!5/CxSyA.mSC*_(3"q3οSS?lB)g@,HF!1_@POOZֱV|i_<9Lm,~6dڗT[ZEݮnbR`;Ӟ`ݥ_6K5UZe|*fҀ ~c qA?/lFB:9$aĿ̅x5Y;c[ČsNS4>D q踾.Qu!Vln;,$quQ`jduеC n&Li'J}Uj›,VR̃zfC%>ÌۙbHüWhL6'J}uiɴg.=WlcئCm"?s j]\)`TO 鵹Ugi#3q.ejg!S*YHVrtk sl 5h$37 OGtI2L'&/LG9<ṋn5|8X! m@WO}i$ݩudL Ə-cHg虏tĎjtB z}X'g.&}ͻAR~AeҩM)TxIzdݬp"Nз9b|N%:f7 .r32=]2EM+@-T+0KgΖ]Őbd!snKD= :DSuyg͂ :f6ީd.} z1rNJגPqWxxEbz.c>ͯh~BF3%uVwR& .8o=anPx?9:&KixE9 :ΫՈ @ꂥ-G;Bi__Y;IrK%pz2="A7k v0ݯDhRdޏw,p&9 Uxk";Lg/+aH_vGs`:>b^ȤC^nNb5U}D 8ѰAvnvVq Ռd}<ߘ3@%TxH)eo$Cܵ$H‰l*LR6*kyޮ*&)/^<ރuBMXYk%c2(c]UYZA~Wo0fsGcnch`kcal;%0vSOc(^zyzaUTwGYxDGDhM~bahuqrs)'E\mA3&%*#ku!)91]>_NƪW(CZeeV;pSGYrF)R4Go! a-Jg5KJq5an/#+=0+<+s91o\dnd~3śN[4tUyF~pQ| (+%jF&O~=2 $@/C ?=pK&J1|"2 SCpYD,x1:L~+ѻV"ZpQ)dVaEVp\, J6|TycԷ_4n4ĢH<@4d9z{_ތ$C!%cھ:bz~6ؒȇ41rQarh2ǂ u䬵\ۃ@YeuINz# "@F\t86]gb"=4Xa}M⭟bGch;iG4L%"ÓS\&K+FT&!+eJRUf pv ҒMP<2ʁ"3z)xU_4_ J@n?J#(DLmc@2ݺf '3. [hZ7c(.Мmy4 2XK`~!v@B!TK C$`-h(Ep >95[%kta%NBl|{SZl=42=.f&bZE=N+aAD=c %%EW6so7e2 F]V>Xϗ=lUmȔ-Ћ9⣂ilm.~ X|E!d6}V@ǩFkaVp`*sVUmף ;3Flj0m/~1}KP=8bR: [|R/5ۨXh;\~jLC+XʋB.RP06_p ;0LRX.:~0Iv~ f\1@n-x|P[-HW.71/=bZ81!%DP{P8Myn76uݟ+y2+9vܢO'zhA5,WyqeFއE5//P %{ _&ǩwYXRt_>&-;7#3l2:%n[9^‍۹KsY` jKMl졓 m>>vqBb@TڱݘU )Mr3NǸ'M8ev>*3VǺ/xOmѦ>h}N;"fď0Ql#NVJ?8HhsxdL)Av?j SDD,K"Z0K.W*GS!V4Yl ̗XAbI..t|zhӦL@#\9>~xZU /VGiOsseI)j6{2+:J}e̚*Joe7IuMu8Vc(e f4ǷՄb-#[iI_ʫfɱH5πt}-6ϦۓT$gpl*i@: u;5tjT@DnY&4J N%AMf`VkHoրL6f p =A5>>li=u9 zn8RH[wsZfSUN\u`2 ̗:&1RkdЕX~*#˹ ЛD1ӈFj| _~B"rG Okc;g~̮k(Pa "g߽+l>r ~+>AM02-];=T5 $5fdbtPiAjᾴ5ayʯFŒVuo߳|qmlIB;nkmg]53Vk_*bq֚g% pa9͊P]x ҙBBĮ~&=z(}#(JCMWb?Uw0$XvAf}兹!KZP5Nl'^TV9j^^4fؘ쾾+wą M-܅뼱wՔfI显, 7x7m5?<$"Ycdvcy{L!:a<9ژuxg9GHj~Rd̡ nB hk .юdv^ ]-ҝ2خj' PcqFKo>\b_QߙЦa* i e[iTF(exôT7|(ƑyLt# BgL{OFC⢤Ni'rR:76:楑(uÚۀzI.3Ao|,=.z W9>H~Ko?vjϖs,+N#Bxe;Ě/mЎʿϕ5_Cw]ے3C@7T0(w˽GBՂڢWV谍oz/(şW ݢ0tn ^)5\ bt-g}xLs^K%O"^˒p2Ap}to5Ԕ@K\\9IG ;O;FWzpjBz ovFuf;9'a m ;/_xD2ѸHH n V܉d+U2LL+wah#z^.b:~8! eAH+?o1(OmK `@# S@|DwT2KA=]w @VR?z ,wm(* KCXsxe',,nҘ ;BFXXPh,B1Qi8{~ EuKF7/;yu1x{\s3n&RB*QGQFHu&>-ݜf ᕥ&)kM?|^E2[2J&ËL ;9i_@R~Cl/^4j]qܼYp964$I$0-ǔI6떧hs(ˬOJ^:Pc|Sg. je])yFBzIA1Bk OkJS2K8Qw3%Ei5e4smZKw͔ XG }R,>X+Q"4 c5e)^"^%W_E!BPoY!3÷6Xacl%ܞ@4^H$~'OeM=B{+G7ZOjpػNk*c~5㸶ȹ9&T)6,ྲྀ- 0QmWR/˒KŨ !bUu-yTcu7?( dk %tOTcj؈6$0'+ZuHl $2/: ab#1_ŽhoiAb9%P!yQ%_gƌNR7 oԋ0rf AxL0Cꆺ[@rb w[øъ/f QFx%B:hJGl}(}KpGex$Ia)T[СV_k7p2WRQZGN*:+핯oJ +(Q/Wxt6(J}ڗ>}d9,2)dy>,A-nnίAc. #@jߡ62ykKk.dpha{>C`gװ=^Y|QFg߯um'TCs\E':&M렳0U(w.GUj=4`ł=NQi4-6~!*)M^K xcp/ p U_G&!HOBZp\'O.&aB)wjw۱ljKk96ɽABUJdg)Ob ]ON\IO-'g:H(?[,C- SNUYcfؚ8vO \B&KV :HikrK`FF;$ l:#:+QNVyvkC M6/H1iF*BRgi%̍%}rFtڱ +פ9ɠ//<$I eKx|yJ}]|yLձ 2T{xxz#,h.V{f*DYU!FB6_dRpo "7R4HXAI63^ݑ_߇m=Mط&`! ;kنF*zl9poxQA:x)-7c'fia/=?\7{*aUF'm;;Z6/T*l+>W  ?˺3_\j~AIv%B&s0^lo|VcZ?lU l؍fP^{{kszkb<+~1p>ɛlWLӂSW^$"HRܣ o'KfL8s"( 3PoSϨfE,ǴQN;K\zs:ƈzi0D:a b=ޡ_<6oL["%2NT 栓R`I{sBU#6T p*|F/H=ͶOq:XC9JS!ЪEuLk5y[n?5^O:L?0h?!uqhW$'.s"*#:1*A!d~YHKw F-yY40Wܸ=: |WF>r Y:tqp]S} Fz*)>:[dGge ݟsc=jiMQQ;A({aѠ JEcAQhjeaV"B=E"ZB`6!A'Jٓo)V!3kxm:: 4 9R"R6y:K^gvCᚎVƗg׋V.{Bx',Kz!c.IЭ@5ˈ2ݫEiFZr!Q\9 zxj-nani*/4 &||Rw'i"0xRl?aGF{K=2Z'H' ~ #>'OO`/2\#6.P`J:!T@ͰCpkUIqoKbyb%~dL}=PR4$!<ew'\^&VR^JЦԁ,BPŞ.*"Sڀ7&%%9kd-z Q39"~ku Mf2﮳kY)8O읬%rQö+72I;0èIGk(){a>b uAKvjE-Q8#5!d n"(w҃9n{$.[h]&+De0&jju T"1 ti,0YaK=m:Y(r8]d֡nMԲZTpaȢrxߣ?\#Qz)M ,LU]2? NE %V|r:~ o@C6< &څl -G%$0z0ԇ7Np63i@@(ÉiD9Gwk$/>cH/qOaӊL(dhM{D`ŕ?RbyZ)c>q1-A0~K3(p9"i2}e~~xNDAg믷xئzݎH$,L0[5g{,W-g~`o!e!XPD/LhgxxXn! g>$p9f=mH#p."ay3aVȽnw uΎJ56hcfV#ݬzlʜ>/qz:&̊ ^t8q''h)4wlӪvTД;.H^mgBOGk)o@(Ժcnm/搛]Qlm~Oox[" f{Pӫ>/k`Y!0 ,@VQ6ƚeQ(z\ >rp "z +KB SQ`^SVN%D?7^'[x_ ZQiIJ^Ci)0KYQrwA'vRQ[)vb ]jS'܇uC&zcb!hzd$&N9 2~HS¼fq:Ơfԍ%eɕ~BEy PUMZhTG% mvfQ%Sv[)V0fl;Fa6Z1mhKhH De:*=[K3 Rg'5BwWdؐL?WZjI( R0wa8( `nx/iOi? lҒ5k"NmjaLoC5(TD5Z쇍ʍ2$"# TV UmWrm$J?v<gʰ8?&𷅕LAu)RAFFΗ"yaR\87֐6֞TSkӛ3 (sYE{q$^j_#obtaRG66Ԡ9)w1j tZBiu%;4WT0pzH ϳZkmRkq-MYgڄZWʷ8k٪RBi/-*1-L$2C+Mcr&lEy(>&ѦrN9H!.S~s) tNi._iu{LHPFFP'T[:ė8ku- EKT >Ms@ rC=9'A&f^\`\pVh'chRى+a~(?c!* L]\r[v(}Oȣ T;8k<[SK #6z1Nۚԅn;PmsS8,,-c^V7pvEh)c|]wW3`0ײh-_.knq*{zq!~2A%P>i+bSGE0gƹ3"lڏ6 ,p,L~9o厔^-EbuVy>wMgm򊣐mh zv]L4yZ7 )iTKBK H, X~)MLv}[|{؄HT,DrŜǀt=} 4uom-~C2L=9KRD+nE^Jʆ%5eK!h-lFgK1պ3nAEUUgMfvq[G (*(+)K>YLb<6&gcZm\lRsfYr#e1-|YO㱚,c `TSa;ß4[/#LX7$E&fc9RPxbWTR;VD`HQXJ<-*M&Ūh]u`6B~]1#)"H$gV$JY%%cQPAr4aUZ:5A@! .j!ԥW~_Cp{2Gp]:x S.x}Q]DYKFuDmܶ?HúƮHX̅U0ВIiQ-.nʹK, :-we 'muL$mopﯣX-+%>3`$kj+ar QյpY`P4tha% ^\ X=-I-4+1%"7!)C /Ƭ b=guN?wd$@kE~M Tyt,.;#JLQIXxힽ79;?wd~/v{d Ԇ7JcRC']𓈪uۘjN1 ynI'"3azDž$  )DR@GLH}I&"1b&Whbޥ9S>V͆]IbW_QWMn ͛DИ@g C8WIUPahbH4pO^|׾LH[:]0ZHBë,$: Oz7%j")XP} v :̲ Ji UyȝIrGA + -o%_ ؘC[iBAn i' yq{&ɤ+[:=a ND+ ~v**4 ~M14o@k 4& +f角2Iq!mPgs`{i9+\s1Ff?3]5#L#tM Gmsl{3>Gfofs j $u $]Kgnw1d zԶPy̴yx+`?'Ĥ'.K'w~ndžE?>=A$>2Ͼ`nwgeLՂ޿7(RG m?,B.AkN*W4iQk.6_( @cf[U'ߊa^ss8r;XHhc[hF`V/)(I8鹿eR}Z%q 贈6bʟ8F#)U{r)CfIxЎ`|~ޯ6 Pn@xB̙e˔lUoLh!^Ȭ$P$тVDM[LE݆+BXb;^q ָZf_X)mE5n$dk%TvKi S}(뾼z[O^Hi\vkHҙ &* tUQqA`,_ c}y]W\Y׬Fp|̴՜ʗ0K{a Pf-,j܀T)1T|-w1[_I(-P\BaCx/7B\ /41сYXr!XPpS즙.s$eω(U(;.r9/SˤnR SUЄp[; vg8ܺr"oYJ]{ji"_6yR1R RgHtpstkƅ'y찶# (ryjʎ ۙ #9/EdKebp|;yF,tl㾓*?Ink_G+oi5~R1jhbj`bkppSÕCuuy-XjZ;VÚ95% &+ma("M5N) 26eafaXAdt R_πK0]]Xk2~gX[H_\qW[+wA){&ձ*\ *S{)#ʉF,IFG s˶To!P?炕+o^ä=]R}?]ntצ /nxqxE ᐐxwPH^ ^St{|zw]><_YW^iEށ"ۣ=g]=㴱qɟzޱ/o|ID|)H1՛`.6xWD$7ˀ}L"K>&(Ojp4$ BrO@68[53gj`+tƯ:ؐ [G47 pm DŞGX--W)DYTiB_* VQh*H7SxEaj .DXwi$|)%ەbug}:$#+\i2[| ~,Ӻ A3OcD 뺷'Zq 'HH02 -: K/=|S%̟[*߄(!/֦f֤*EhZITM'!^' -Ypom_1ْK>4FY$ Kz8g uTL|`4" ,HrӖ,J"i1H|paʦR65i34<#Go7d³g>Q@d?5DPQGKaKTMB;h~n'8h}KNɩwɼ5Wy*މ5ԁ5{{X]S_Ĥ\1`|RWa0&ZidAbދec 3MFEJ\g'Bx8@]YO{%9 ֲόaݵwi\M";ts|n"0e %`QJ`w0uS,2`)g&p+^Gà!̱2>VDLi@ՠ>' q ֭_'@,z~xh6BSO,PCs|^L19W—XRqB^LWK'f1r5TU\ȥ=i8& % %Y[\B " Fbo\ī'XgPW_z2:9K!Z&S3f3̿2 [Ijũ>H.>-yR'*#y?wgxB~\eYA8kӲ#c MK/) 0e߫ , H:.&M;)0gރE+=Aq>ą/ &N%V7QNIa7IQ\iUgߨ/>FMBۦEHz~$\ ?ceo^} \;?=4)`Qe[XR ìtI\TwHu4/ƃMDBȣoi5uZ?wԈœaug p'ߗ. ֧AaZajyBv.I@[ӭ, % K77xN;Z0MJɫ`me~-ςTFv_ V:;a-mIgSAV0RR"YX+̪MO#2oJ!q\⻛^*/Q&ʜ9z񼶑\럷گ7=>^ Xaw[+ܓ#H][b޾IOP}!^/t<;[]ޙ&{ <`9A3%I3WlޛA[=ʶATa5eP$ ۏ.@_F;|؛:57\+T2̱W@GJQʚ4L <sYFz^]FiPIIRٌNQF;(1ƒxLQ W \o13K8h)9ә 'ñC _UƊZ49muhcj$9 d# (vyuK8 `ÖY]V3? 0 lHís^VkLӽD Oeo|T^S7K;uhZ|-ƌbi"iD&)Dqhfnhj*ZDϑN5|äRPPv/Mj @-TkBm8UKϓ'u[Ov_:-PvHl5S~ҋx;+P״[ !;oS_2b֖2䴝7qPͮ,o%S|W+Cb[d)Y ZwBV yi@+sԞFbrŔ{zd>'I\fAe`U{H:jFc }śi<A>Ȝ]w+&=CsM@?)e7IҞ4e@vn]Z)N؏eaJMvʃ,RSdx=V]qAC*+CuGyOKv5ZeQX0J'r`Zq:ej}wζ14?.a Вp6떅\8P$JqQgQ7 Yc`$GH=3ة%ǚ ,caCL*ӣGk$ l @rbq wQrprH =e1)7(Ӄiu 궋@6܂M.p' p|&&lEL(PGݕ ٰk[:gH>6RYߙEOTaj-_ +|LԾ\hB畱I=UG|MJ{$5OF n\eoDAy++󺳓]tK'ILP֓V,;y=_ Lۤ>/sC̗rEl6fz\ Ƹzov*Z>>UʋqtH;|= XI GUoD-흒NϨIg;wX+;Z ipgrǻħo ^Hħht[ngOP3 UkjkQNMfIuR5zuL뒶Րô8s;j,+LR@.*XUZb6 3Ai ދtiyrTN8"pPddNՇÿU?)N5WKVa1S>S0Ld؛ZUIHgUNFvux^-YG +kMo+~2`ӍSu,&\b>(:N{HƒQMӣO3fYlBLA56p+GmTȄCWBAqTX}pJW (-G* -۾tHXTT-+uV$H}DT&ި]EōbF0'x,J(uG#JSY9[*rɋxam5X5x=R>#uUr 4wuiZ =WhD$Sz bws,Tcw6q2P{Oj{JP2!Y^壶݉zFdZ4=p3gjTJNۂ_7jq̀%SQ74nQ; 7D[2YPm}3_}aQQyW|]Qu[h =(k܂M }8L$P &#z(#A0+7!m +@}Uĉ_-"~")E[ H|òP:jIS]ǵH23 3In Ⱥ=nkm8ͽ̥DuC=Ȋն27@hnˆ$H$QVG]= ׷{3B<7(5k%[PJ8`GF61lMX=fуy:OxO%¯K%A%$ ZFe%īK]JQ%};'B7 18hrKz1cFBBzSg|υ1i4[*A)sDZgr<ڤ3f!Ezs|ӇT n>H(SƶB=_>V+4tr7|NXQiShOTs|&swheiUߏċ1@xۉSCsMB="y<΃]o (]VD9g$(Xa~RSa'(Z;P%^V>U=Ï<׊,Y>(Md^*}/8 Ǟ=s^|Jl`F%'< Cx.-d-E+Dn;[&J?4986ǭ|R^i?[MGjTu߰dx2-AI4ъ5r ؉ |*2Y0kE E5J`rv:,na.b/Jh'tǍяny):jg#;NuE 4%mꃊm#P"`F)VbS rYn4NspѺ776$Y(+Qq*ϝ-|?Htd>#CcsJUr#fUMKp"eq٥ԊLǹ#Nːl^+bS|rKN^riDZx_hIo?]gy:ޖzE5xBw ]P}*塚1q206p2VU1\]9L0b2xŅQ.W4ui/z1 3x#ʥ%)Ǚoǣ;y1Z[.~``e{~$w#xUk\BƂ ޙTvNE:pIgurٵPcdk1CR'Mp 3RLy}@Iydg7A#No9 97baxa,߁'7&]H ʕ l qi/blk!g\ ejnS F4;ɵد;mccghRi7XHc7(47D@Zl4@r$g(:C23T;9$?L 졵ة5Lq*4<*0%#{}aj@0Obݸ}]#gםby^ 0H\cT)1_kTZII %]l-o qn &qj~ir]\v ZRﯢIo_RR@ 1FG^#}X ;/T~KZ.wŅA8ϼx<==J֧^&.Du`Ro){쾝y S#-F/5*N Pr,zO#b#@Һ?dJ9[(W8ZkMF9T M2#J;2ƶuLEԜ$KρVF|aLzZ&X:i&Fon2օ7;gES b+ ˺:]Fң˼VP^~ܗc#\;1*;hً0s+csHpP;ؽb:aN9Pc~An"R0V<&CnOfSpM(M6p ]\9}?3Ą5T7d=ǘ % 5 99M2ȩ h% hFe[* |{'2|y!+U|>wUܙ#xA `Zx|epp[Ëv-\o).ђ|=ZpbX.\u-|vRzbHC/d'/ !B@5n%_UeռR)PRa.WG QQ|[[ѹtstu|kuµ6d}KO`\r&^*уTZ=0;ѵnM|`:2r "yJB$ĊA%YXwŅhʁG(DĨوbr)ftU+3%fиFK pGɁC23j[(36^#l\B!EeP:E[ѫrDݣ!f ŰAn|IrYZrEEJz`CzªYӇU0+&oflafifUWb.@/RiV3ڕ* Tf~jHC j)řV [KfW͚4ʬԻW@R4{iځHv>CF# Wպ]˩|Dzf=,ulG.mlݙW4H-Bж{"[}vl ^C>b\tj]R]Z:6s_ ϼ_v?.Z Ri/mZ.??~ qG4(ybrz'sZKo,>S/IMtV76||{cw-W~|tk<ѹ~(= @|Y͕vUXŕ_5_1 !ёjyLU"Rx&> w@Wp#{+4e.F2Ԃ<1K"1F$MDcN .Z(XX/ ZNK2l4naz4b0#%mu W.)2z>jt1Xlߒ/E?''F3R= ^EB&IE $Q5D]E[%(gJP+?SsjΪIvR%-+vtA#;?pJ *o_;c27Sdl4N~nVؔ-;_k;BY=zہו(PѤU"}f2VZ\17W|L<na?.Uθ gRko|z:xF08ҽnR!> =OF ?'*o,>U^+z_CD|X;~?/P509w.ι-~`b~ƠQn[<-`5IQj;H/GJ:\zp/3R|e̗@S݊ǽ B޹c3LNKZ|َgp'U@ug% >n7S.5{\ _[Hf໷[>g4NEޜϗXW)iv[*);3%"0`o'Uƹ rVǃZ:T!:xGB/L7e#9jaTLd/[E:/^f.&!ZTOy]z\:yzD՜"EQO& Ӊ BΈ*Wj\:uBB#IJgs K ĝj60s2L.'=HqFYhFz2*8y ?v q)j`Dh A ~L怽9gA(6P@ lP eu&1 &Q G^ǂxRTYc3ߘu}g01H>H qqh2TPo=f }nm<{ j3]o j&VjWw|U\|Ʉ% 䖰佐v@$: bI2xB;QJT)lOw,Fp3yyIkR6W]Kj#6IBwlt586 ֗DVrI@[vT^8-ԈuH'SBHW)h$gH5|ca{.d9b]v. HsWvA".YI5VP-E36.5&O9 #-$WDc!2Hc%EȲ [֒s0 ~m~"_Ϭȉ‹|[`CfB  UW` BK͗𶰣CʮF.( kQY_&mwq7 7ey;yjhqUr!DfC` Siq3NEƔ,'ۊA/6Y>'CnvW}4"?3NS2Yc#~gm(rQ ʑ&I]hPI():|eEPX쐰Ai0m1V.۝_WGcdKs3!V|OB-ZLɝo'.ˇ|Q@ 0| nDB)q4y>m+ CopJ-~B"J4k#ϭ\FD S.c\'AVw"n[fxőB\ 2Μ/FbAsD=N8!yV_#TdhR,4nB_1Æ})CCxlxC-4PU0x A.ZT~1u6lhkoNlXQiexc@PݠTikYm4n0Kk!&P pG(~z66/cy?+<4ϔѧBf.0 8yտUc'd어8u4anѨIYx!BBy1~{Rfؑ(U9D$|Q#D=is2wh);1(JĪD\ NL`N6uDPRURM kn wӶvWX)J9>}VZN&hO>aG6 F+;P %k>a eZi@6:33c $ѻM Մ2y58 *5#$ !D\3 ˙:)q71<4s<10TTZYK趐w"! (a ;M5aMv걩~櫯|ی?K^+g+[XmPۺk"r +0'\ܜMw<$Ap EO60h,Z>Dawmpߦ?A<g’\SoJ.dkBNoX.ڤk.M(c1p5uGŌj]> 2Y yZfFTɳV%D4Na9?o03\]ć#5h.IAh9}a\ (3= G0p13/+%RꗙK"SX`R|L'&.ag{Ey=kb#'A%Z ^hPG.d9XyI81IDs0J fnn(#W쨴oWx~ē)I`J\c}׬$;pc"hEeWJiܠE!L;GvQ3 qݡI@"`+1c%NZコ&'XŐB#•3N b` JG  3 ŭۺy~e&$ۍX_ov{6'c|+{JU¼ឬh:X|w_?C?(BOVb,ŋ!⌴lI)p'0)fZx$yo)yɺh=` 4޲b0P>Qd >b7;Ǚ cwoʛ`=z~ۿmr~v 6λixknɡY3.V/gspiE 1j9oL&h҈]b@mQ)kM=, w~7Qze@w}WI9+P.ؿqTo7 5gKp-&=Ͱo!"uG͵i`W& tk/aM^76;)QzEэ~6;WwLNt2ڱGJ#$N1oUxg0? kp?ޟх1NHAAǴnqlܳe fT!#*qi3QtC!f׃i_{D7ط6kLo哀z `#VmU8&\4>ǘ^r wLk-~4o>1E?ц062 z3ljPoս!.AwiKKbHETsIB@I3:GzOi*xпJ!@rLF豾IBT1 Ð6g6C'F ^g2hu-rҐr>9?wf7X5N5f~0vgz&Dz в\&Z|{'z#ݿ^ނ}Ne~(tq#zxyo U]_Ly`o<1q 3{(z*8'"=PvQU<K-nfUy^&~~R%^AYxiW.*'LY('$Gv&߼D۷~CwLK. Cb/z5\KXZPOda0& 5w8Q楽]"N0N<*BQ!]42VOQRJr',R+|<3aҏac>'D\<{l=)I“! DEK{zSk֩Pt\K41K~]TR(GE8mR;?<`r!dH]ak Q 07%dF9 ii9rSd;nP2hUfIfM{FFJF~#99!f gQ'"::YPV:kFN8"C甓~BOU3rGG)Y$|1rTsVbVs "-Gqz)@&VT z^53GRuiqjTcg[NjN]U8'nϤ3%3 N9_ACjqV55L[9!I65ё{ jlq؂j+{Ѕ[Ѫ*ZJFOde";Lp>䧘}ةP*W!JpZΙm$x$' Qi!r8R9w}R0<쒵qqg64vI2S(~؜1YJf:2jY|~}x_2-.uR{;F]/E1̩iJ+h }_ +_JBOKn gOgBhS S/}X4ׇ!a-} {3֛nvy]!zUьB5هZLs wɹt:?$T@$UjOB6? ȁ>˿UrU 沯P]GL}HI@޻Od1i'Ly#H.պ-N;6 :] g}v5՗k0#^_.[AGi5.H`Bp_Y,meŋ$ÿTi5m's19d"vChܸtpe]jpKE| O{p>[@>k <XK1/A=˚āvdp5o!f?`((%"HJѣMA0Eӗۦtbg)=*^rFE9{Ha=js{WڙLrawp/)\K\pQ, %%zX_UmCPf&$Rsі>8We!~NR<$'Rnf{ypz6z_@ BA 88Qb%p96Qk "&}kEf Ɣ2 >-+17 婃%cq8zAhY~PI98*AqG"%2r:@P?`Ԃ9=uG^n< Gox2~M1 v@E+]F(P0r"((뤌@!Wd}5o!A9n?VJ۟jvgV"kY7f浡6E<H#qhgITmF'7<;W?<>q::BP"}KkTй 9QHK`$b5eWz=U~i?S5!z3'b,\&SLh-'' uje*Vq6uKJICX4SEX\1Itl740TJ%`uXyxw4ѯ|21&LŖ8U]f8.`Bqiu1ӿL"Vdlaִ=p߽m6e_!(D{Rn9rFʖ^F]RL;_F. ߠ!gM!K q&{uf<'yB 6^C7N1 ;ͫ#gxK5!9?#Y. `lj|(}HwKf{kgj:OcϯrPG]jnq$/q~RZTcZY@5R/7,P̍NTu@&Oݱ6`^wm]\ t˃Ɖ-ZkZ)e.) .I{RNt"s[c}w\?%Ђՙ0`ZרElrw# \A*\kc,f( %b FgFM{@(4kSf~x[yV?8AREK7>J8v ]F9aP2=Z*pg:;;8!$8iŷ6jGtq/-g 2o=qWBdER%| 0ZW.@_ =D C! |'(0@@H(8m|N{`TL"ɥg;዗?b}&5e]SިrH:q&~' ;w1'f&KA/}$"ezU+QVxjwJu}ciURs :PS*>f>JV1:sLM"(ΊV.3p(b1M2av_SHnz:QvkkqE{ҎA%`UN1tkD_1oHz=9ox `) 2֚. hqGFvuiP㫰$Rmn;MNY-N>$ni*8PO9w _]x sCnJ:5y4{4-.gґ}Q`'|8# ^f'TLD^(, EDK@&ۂݸi9D"YZ .#`j^=s-VH k!Ӽ7@9Jyk~"|j[NeQܭT^>tӅ5ւyΈ֥uJ;ИOğI`ъlFuX*陵Ʋ 3g1XT5 !AlHq?z̍pk:-1*B ) e_&[*膃jŒkDG na+M>4< m?nBmƥ!M 0 .6\-P,t^C%:#Q>dB4 !I"Q:]*{Edtq 9APĦ5* r/ãF:ܮ?I?'`ɰU_5X]SnNG [uiha]4~VF8\=| <7hu;xpsR{;v lnx;23ߚ#z)HR6^EqhfP#R[ #\/{A~@:m;ACf #kFvNߚ_.~S[Ñ5%Ȫ`۷$Icd~/txYl~j*^[X :IFkO[Z+&ڻ oeXB&]Gm]@x#C0^S$'^3G bœd9-ܫ)XWuړO.l G h!!#ٱA87fQ-]JQsLB))W>3Y-SKmJPjM9xZ)fyabYE>{DV\O *iK3..o 8=ߝh杻O^8ѨM$W'7";B[RV;;Tula lʘƞ|ޓ9k&En3YdD>V@_ƔS'/_{$D+rf`&Nj$,.aCumVV@T: P Βu\:H罜0fL/9Hmo۶m۶m۶m۶m۶߶o97/f[OTœQ\skQjxR #@_Q{v>-JxdtxytV!ziԩJbz-ԁ\ԧ"ߖ] ]}^pSFvP2K&Q˝~1*" $H.ylOs^JqT5$Ir"FecN豴k/K]va"߷sYɽmI~ Abu 縷ޯiz!j.1a _s[꼶{ERFLjQq%Am{oW9zRrؖ'WK!nAW K.2x1Ey1G>]ʑ+rO6<=>͢<|Q+[=3ۼGB~O i8D൲-Ң["!5MzQ{ُ!$ "M-q򲠋"#xh;x жX\B#v`ϾHޮF4*Ťyum`紘w'6;(yf]ն/2ꨫ՜%E#[! @2W݀.=F^THfT%]}Pؗ#^:!GR7Պgz9cϙ?sRlzMl:ϕ|[=/ЬE{*gQ\&s|E4]D025=n]`5mn/fy`  ¶lc @`jc\$&ǰNy\ؤ5>>'*hҷ~ 47%vmDK2bXKC*#xV@ WªƕזvJ,}q\K"='yA\H^m{iZ"ZND,8d~hRBő:/s' h'6)8V}M=+<}Q4/F^Y)-j)cDF_`!g4@J*Ӌ3fMnD>+vIuN0//a.1RN2\4j^cW&!Ȧd D=pҌ#$ )i! Y4,1 3v1SwV^.+ )ժ\ _xAIZ~jgO8d:夳S H&.g_zA걄%Yo1-ɾ? `Nx !ԅCa:eb~Dg)+y58EF3ѽߑz$+@M?M̮s,Kt`alTw)xy8=CTE+'fֆE49Y)AŔQnM/H:Ss7!O$zRh;fRK$b)6u鮼rfʖ-/ !$m0!bXcӢP@)?T.`%uUr{sIt022QƭإeӎYSH"$D('~nOAXgimկnblѨnYŁ@~wK_"~kZp HZ-n)dV*dKXbn1D2#h@ȿ5Tӣ6qm2FD+Goc\({z35`("xDs^uxA 5/KdάV3"]i~_LX"HX"S^eYQXaՌ[X(Eph!LC&!i hY5A1(`iKzЌ3Cׄy=uNhא`KO#| ~ecr_C' aPÓܹy =l^U&,zWDS-&X}KI"iE?lŊt(qghZeuf*[(OP4Lqn;2rSkgxt2bEge)Zԕ/sh1(^e t?Yb)݄;rÄ< hzb XiO)@иtw$dDT Qd,63 r7 WKM NF]E̹)늪ve;a8OmsQZbTU3Ǘ:; {]YIУZCJLhAe` D3R!uyo/2DMg6)8r9ֲo{!3zt$2WKK`@~¡ңXPYfaCB cA6g j/7; iAp46$#qhh/ŧaP^m)#*3U{ˍPOQFUԣE yAUш:#iǬ|}ҡr!;|WK3bzMOyD#p^;zC }l+.ܞBخޏSiSl;S{s3j ;S| >;&\CrƺxtZ5-8a?4`S~>-{`K|E'td~}l-W?ت; @D@_'ٷS.9t(N ;p ]g|DQ nB깘:N>#frBWd ܫG[B"SI;UzkwJiđ2 \H9'E 9SvU~A{ AUSvϼi̮zܮ>:&kp>{31nՎv+Ϋ `|S3huyw릱z=n%?7G6}t*_<'T|hÞ{ +LT,#i""Ґ&̀BiH)8XI6嫥8XӲjW22V*^[ȭ c EOhտ63pU".{5:5;і,cȗ2RKi/#UM/ DUȘV`}dSce!J%uġg5%BgY{5{;+^ЁOqcQ Ooj&._X[SS0K 0셶. GMM Q\@@귿7gAHh  FQ|5~G.2A!QT؅T|5x")btDd4 ̼&Y٨۩V) ׉;6٘(39ő̇k-ճia-7=,lZ*!4-˞lfq6p2x}c]d%G}fkB܋6<ۢU_`{.tO|S/pޡ# )uY;c@Gt0q7/[R;(Nj;}n=(MhW~cLԧm?Jzq>PJOy\L9b&3re*t);Fr> רusw Kl_sό}aȊL >(b_oBS 5\@ pC(ԗپZ5[[L&2~! RzٓU1>oERr4 L97'sއcZ>g-XJy8پoe[Q,̴4:k1I)`T4v9kݱ)>Ceo%֎UN' eN| ^ lL%[=@'2A[~o?aLӧKCJĢ+?^"q |R^? @ĀgOrq?qo=q|ɤ>nW죞y7۽9Y &JܚX&li R?Gc̈́x*\W!)u1=k qN83ǜ 2nլOq@m m&c'Sa=%ɟ۬5${*Ч3J%\bby8t]8>&4]^dlLX((Ei;'1? ) 3)Alp 7q+m&u-1k:a 4#MqIX<۸J~@^/OOQ귨?%Tg0$~=>vs&3"l \"={h!mQBHHsD@xoִFݟyaZRZWdlmr}˺!cJ?pBr(>]k $+[ྖoW&p-l_Ac$Kt]rX54χB"yxt0U}AdbHX6HA}adbB8[D~I&7ѪrCLW6l-lU=M :tNiRp ㊆'\Sz7|+n9r)^KObPr&C8+Ǖzh5 k$Tj:46ҡ^+dDi6jUtքkD l@qb ZpL7/(\3"3wх=?Op@($A|4HTd^;xtXGOTn[>YhA˺GX L!V*͸aϝlڿ}0y'‘fޕ's*89dN_&f5L .o̞3I%?v拡fuaoUwDg~h@!|3*ozS% 9IS^.^)M= >Dy=xv`K ~{Ѐ%PTsлT?#pUktqAYs;{GCk; .*}ihd獍W$%%dj\$eU%'e%j&/$''YΌg312 $%DwccG$d71[ OݽL50c0trv40r:_E6QfuVň@X4mV4. 7e:ܣ 3䱌,$+;M@oC}xwz)1j\c%Ԧ,+XK}5;}@"h715ʛ؀Sk;. ͬWZ_gyg!f5v59Jח޾,)(JQ K}$I9SUvH +̊;&m7 OdH*^œ=mδJ:lz@:yv&J,x@cRD1Kc$?b3BF3Yiz^@ +[h,Qo,urJm"GorsjHyo\BJ4+v0l'q5΁PKR@s*br@o71jT@Z7% h66exejP'MtƄ"Y,눓 ir*64X֜l3=O: DTV^K4XwҎ|ԡ\uc]*ͅJCj6jp)0Y;t1m"^hmq+EAoXVGDC*_zq^ҽQpɦ)OaZ|D} |+AU0wi'U%xJsPbҙg=F}~)VЮpxFN+fη(,&-̌ϫ(v h2%m>j$@D,LV+,spCzcZ F |Zl 2äaem}X;LYʇ\o_*`W.po}rE"8UbzDQ usĥ[IXQWA+ʠ?,׮{`|(jOTmBۦܦo@ea& el AO QZ}nTG4L 18BOF`(a 2^2sj曹n%&=+6Z6G2!2glzd6h [VH|&V fnPEi |< 媗E:iNRd5‘Rb [ح-Na熱&<9Dyȕ/ɶDJWƖ(T׽M6:aRn tzt(!7=͔.XA1ԅ[z2KHm!C\PriCTtRw'rOp\؊m(؅NrKQE8yF8b/rc %QYcC͢*LUnvM3tfr NI&ut'-W[Xq&aFIfW84JZ&B'kf69I$L?j{xS{rۮX v^*XeJE ~4V]-~m=O6Օ_կBl/`v=]|-hgw491{jkk'{'gٿ(ެ|h o|1GB-no6*(Rea:jz9h,k߭kaxP/?EU %,??`ƨ   ZBSa㄰bד]T>g?B#*'|)+RŔWF^Ogz}?`_~ K``/#G?{H5m 3 7Hl 2!隮QTX(SgPN1eB0Ʊ7P=A8Řf[봷&A5IdH,b?5ef5}gV&LGK’Ғ`ɜ\gHIYfRε> tJ(>+nMuWa/}<tGl NA>i?q{}{.%.$ǘ&Q(017-_ H!~,_8|@4)\ѾE|~. _]t $)-A>a~]H8 V)(ˀtiۓ6`,++1%ebZZ u샭zB ]IA:Udv7g 3H*NwiR&),XF!ؤC/ I5d,WEz`2&JS&ܞfQxKA*r=Hf@ʏDpxnsD%Ft: 2NXgXl (.u*aQM ǯnҗ;xܦaGz4ЂAeF+e#}ByEڻpk[yX2<}.as 0¿xڠ۽)}6k#F~8>zq~?3S1qecԗn'Î%Ug4j7 k"+{dF+zDU/)2h+M^C{0| sѹ'8S`bHvh| a>$Th6r~S.ܼuCC ~RVuq#c)<3< dČ) d ² Rs$uSV4$P" SC9vwmWN^X$vgfSݶs@.,G]!H P޵$zC\K- 0O+exNERq.L F (8Bk./Z+0-Ez }'ӈz7hdD{˭Ʌ{hȖDDe#XTM9H`fk-!l[u5v!eQҰ<$MXk|",Xd-wJ_s/぀$O$>qoUl@9ǂ2D~ݓ-HQUNqB2^ӹ{@;I ;R陡~Yʳ7%x9'9do"Ƒ2$m\g(BDp'Ő;;e(ՇYʂQFqQp1L;?,ntT?2:E?/ĉAiPr,c(DaBR¼wm\MJB`61B΄LSX-̸6F&y0^х1Ԥ f]E3JPo` Dսt)d>MaآdHp TC$UH{EB\$hB銒X8K>7t{q U8F&cjn͚WLW#!(W;*m)`gJC j|ţV^s)Z)zTZGy_R2.[UO&5Y6{W Xl;K3rUsU+BXV0k?j RX/n|G8+S 7ƙJpܬalBXc@V3&D fxKNGF` ztSt&kG"[aNWVjִɤDBe){l hPbo!g _ٛ^Q)#W7dEUʑhq`._K(n{4FFNWM<< IBi)7$ҜQ\VǛojnvA$r:xV4Ss#*']6HaT0:B&0W9t:e$10=sԌMH*cKt i(cGH/RhKe(4R)JZ+u}ˍG i?>=\WqIvv >2yYxbg*u)֦R7"BBwRh=3+(qh<&PRh<&F;gTl dC5 e^xFL";m3O%IM:qT+}]kPbD4k(X* |nWN5'U֎ f:2єdqL6:M+-b7zIeVfD$l.sBԃ #۷oI<9$0UyI`ʤX4"rE!Jbt7+bg>N0&z kB\*=ز@ ,KaDr_~;>\#/NdEr1\xiƚƬI8rinE2eIx44a7Sl8A!ѡ:۠𷼤̂kfj۷ʎ OOZᢳC=UMX?=\^A}4Gwش_i'&&Q [⡳0cAƻ.c1!Io4: oxTYw]҉{j5&4 ❎F ̷8E᫔9Gl/( 8"j&ΪW 0hiK{2]:FDRD^ỈJLHw _5E$3,3p>ks$Ʈ`7 2<2^CcF5i K^G;.fኜˊ  7`7+i|0k$-GpPuPx&/՛iDaIq?^(~,_]}g3 _Q$T<9~0D}SDh(%SN573=-m hҲ7 X{)Qk f̯O!FӺ],7L=G,^A%S+Q_)^w?j<i q!>0 9Srɞӵ麱PIڤ7XF?>SCw7ƾ=¡G4S5{e\q7̚EwP4/YXƯt_H֬N={PS *R;<>Se -_>S{/YߴM~,պR:cDM6-5ef;Ӡ ]y_;Gi?&X?W U?yT4j |95~m9e8Ȟr>$TxZ;6٤{ڿ-Ut_|1wr( >2r-Z`+1 P:=?ɋU51[D[BNlb~c=zjͷx&ESqU(dNd;Tb~ ^2=ĦGJ_άҩ 8A;IC /V\UkyʑDZ ?7xB3wSx{3%iE'$c[CD=DVS26yq.VO)IpQ~O,|[ڮE[H՞ wx4[Ӿ @<~蠶6U/|tBk$ÒAd/d5@xΛ}%?0ΝsQ}u@}5 >TH@C} >P} >  >H@C{@cPt >~T&/`KIyUOxr)?R>Hs/}oVɆ=,X>0|`AHA*2rG`'xtFճ CTWK8x ͣiUߩ;JO!̭3fȚE!ZJD*V0 j*Aʹgk%"c4ЧjK~gL2߱cT#$J@,E.7䝞1Bwgmr7n'S-+RI&ebU Zvr5hY4&s+z q T ! Y6(Շ23^MItWtW6Vqj'PYBt?5m&hZT̩,C X}U2?wIc $̺N?0+hE`ՇVaAax[_3@:)w? g ;Pe *_0m.FَCJSAߚ$ [(]5ie Yvd),.f[\Әm>۷mylo_ZubҦR~k0ڰ4Y5pAnr4\0Yľ07W+¿+rҰZFLJ7xUmg uS?Ѹ;QчTUNH fofQ 4Xybů.Nneݼ 16|485#p 3EĂ6Eg*`4(9^2S8,5E[RaHC`"xr*h; ߔQ:Uʊj}uix}Nk~ .GU!Rt]0X :4>e21o_HGVGEE8l"Rhzc!o`TX+ "dw#:^ۃߩP5ˈЂmoΰ^ Fe4׺ZS/I,o% "liZ5])' řri,• %ו-/V]pYS :jɑ#[%F=|ߑ7ԃ'㒐dScl{NٔU8IS#;2ٲ61c\کK UCSGǹ7[;Zi&iy[|Me4:pnH#qdO67^`/-ټܷԓЯzi}G ^QרּZfj{=ȇPv$#q 0`scJc1z xG6mt.;6z F{Ƥ)#ي͈%I2@VsN 3aI]o\LylS!e,1X6`]za<5,͚U~75-/eTTV-Ֆsc 2I6Z$&jl 4W~ۆ47fZ/;Zـu+jgY~x?0ni;]" mu8L*"X F C*.U#VNHkYcN}cG!|T Wz|"T.5u~l~1@=[kL/[wƢ}皾X;l=KT=wDӷA_7?f?~?ո^?( iHvo'raV02^.?yx%/,h[8ˠY%9)4x) -%.f͊ 3DΫ^1+T42䴋#Sz/<˫(N A뇟ٓAXZGbk@x^Sz6y@z+ '衧>@~-5K&Y"& =^<=KIPM < AE(/\ 7Ix7ZYDJ7xW_;|5w'y`1 ! $W29 $Gm7\:g]iP#"f͞')m>!dUrRA#qye$ʍw%`EtM+<$sSF1YT)gt>oo;ۊպHvG!cAeym^+URZЁ@ʼM<)+0Pbv69H=045Tmmm'w-}  CW,eaF?/Pj'B5Ny8n܉iQ ^cJ5CQ5 r/%x]%s 5l &f1x4}9(uIhڬcztbV8%17GD*]_WUEda;"'RИ%,5eVhnp._%d0/dtIarSܑ(DQբSI ֈbHȍWq{W A̓Fluawל ZmF[neYϜ)A`+Jv y~Tzq^~qCqTM!#5xQn.\CGfIlk8/ULymM6Ⱥ%^+divlIO* `Ț VKUhuA %Z5=(&;ԄDkvuq4HƵen}2=&Uظy햻 d&&t+KniUf`՛sf/!/ s2GHHAp?p,25"Ouـe`^ɑ6B[} o0SU2mʐc1Pu)O-5KLU?9@=5-9A0No%  z2ڦ0W!MQ4-[h}Flju)]dau%W'Ku #[~Z3S(ׅTEXL4-eH߁߿ Twr&͐ݱY[L-fPJy(scSWscY֬؍R$$U*gU4I,=fAC+;>/1_ޛl9:\ۉs\%1 p23Y2赼'_::3\R6oZ$Dߺ&Mx53n> SeSܶDѳ65ӫ# 88sfD+i62. + (2Qq8u ,"=AjbV9V*sf)6Cxho }xf{)]}x0d]jhA+) sU %I޻{'i7€:g0 'x/‘mFujE%!G<{fC6O1ܸ t6vɣ9|w\Sm`Une FЉ\G+TDD djW) \}c9pΗ&]1\)m)Ctb-i?rF?d Ad7"=.IfZ"y#Ȅ1c{Ŋ #iFG:2Sp;A\;0xgcGrԹ ^7+.9HCAfg8ҌvՊ)h?] 2r9bo'GjS8îU :ExrT0"t.}yW*3j<ۺ5o\Ae;᪅'s{bht'ó?tsq̛E&9KU|ap02ުa7hOg#RTX9kX^bID? M=zHC1ݒ9bB6IPэΣW9!NaTwaUKy1Oe6rN*JF.fvTW[vSYHbE=^PfG3D7ы קR5R+̺1ף:EB~b8ogs5(D>(QTB}SΗkXD+k=krײUXq5x]yy0nٺnN*C=:Õp׹_ٮbۚ u/װ`z(jzo9'J 9̒u.o"7oٽeMrc q$w;:/L}[ZO#X<1'Is%(:$ ؓ+q>YWzO{o_v_ %Pyψ]jNeJ7g;hOX[qD jk#l k 6'^-8DȾ^>p垠Ӣ#kf E C]ovOfw種䞱='.AO gEگQ{W зm-nbϊ͸NgוD OZ.>lo^ M6'x-awcSs7⃿7jC7i]7]NOj~ -+CTnov8L8Mڇ$.n/ӯp ?. F,f! Q+Y6Qbj]8ShWYGu*zhsbt7>oO =M6]CI Lε-EQAwNҸn!BإcL>>)^(60MBEq E2A`i d\^E0eDC,#j4t0/F;.N[y:8Y!S+Vsnf8ϺCtpnvƂ&wML- J0yd7Πk$G=@_E tO xX8Hؚ?rbiB 8r .%a9,[[A6dMh(_۷}|x&J 6nMnNӻL|p&҇I4xRE!Å>@%gK!52Tҙr2LbJ nYb]Ʋ>5ƈΠ{j KWqrW6ߑo5$W.Cd 5mLR iv؎/Nj7uaU1a|V\_unT[y. E-!ݚV,K2|̂yLrT/;|2t/f@5zQ*ˢ"`(YYs. dsBvڿ2稸w /#Ri,f37k}B+ kY7פ `) :pZ+<'k=`&τ _Ac ?)a '{g#-7$٤iR! pm$HLyhMrͲf؜acaO*R `J44)<ۤV#, < wىQcSCx$󙼩&,)nVdߋQL8`x*U#OgP(D;}+ca:UW0[(ܘh /`H9R]y57ob6\wH.ufBuŤAޑ.UDk9~] %%eqaDUUi1wG)@սfފf<co_ # ڂûh/ gݖx#> fsWJ"hI<7RUXb?g97J[TYqC C۾yo h @kEx/ *`}hPAMq@+BVA~KB$lt-'^H Afd*2E^'_?g%\N~&h%MAaybMaiOABLs50:6dpHxypDQ@5ݶfKɉbFttc69P铊u*Lۂ`RS=):O+,kྲྀcI%tGظ%/ܗr s^%s_P f-5yDsyoP6ARsvWE܍L-l{ܒ<د֍*'(d[0CBp4|:Z9͢˸ځћeqݷSצ-͢/G@{!~(5`a 9c5etlFk9w)kwsH]nIeWXv$1=M*FAotc$ )n{- cj j9@$m,ړ; pv\@SQ`Tw1!vJL0nz [QklŔIU8Μ| riAbrA|8呍MJ=n^UR nF?'P|_ E0aڥcCp>\ZWN[aˊf!ss b-m+(u@*eBQJl hأcyؙhb4+ǹAwK3ʼ9T˝ѯgH,U:|5\3{Cp %֖ZD?ꚛzGj;M˜5fpS)mWNMY7SIGH2MܶmXi5k?/eJ>?~`Y^?ʮ\JhDI U3E]F( r!{XUKn?y0ꢏe+M |ԓ\d| Ȱ&0Γ%(l%4 e)iSs>,Mzz?krz'7\> $9 ^۟KCK=[(uB:X{Fq#xVN**,VJc&'RAh$fB("krWVx&1G 6yDlœɊZ71Kkb푓LY9DV;f,YJp [hM0 83YGe_JmrKt,ΨÙLT"&=Wp.MaHr .& 伒kQ$<{1J86\-<>opXJ#8Gu*PRi]1ijXkZ;b{[?Q;Qbʿ -IҭK#VH1Q?'ܯ{x"њ}޷(ݡټ'eҤo Iڅ7»n@A ]YUhi>[_֘RJ< ߝIu %׼\LׄҗRc=B=EaWm7ew=sDP }|UgH6 .cbW@?eqs{^ 4"2qne@^g}w}%Bԇ4HD!'|^lТfdP\\P> B>lfXSrAD@nlrCJ(3(Cpt\.=;]²GoSmednB\F^۟RҤVt_:K*'GT hHgn1ezhXr_C)?X1mBpP=T(?oFa-[[APokrN11vdtعe}GY7Ѹ23)p⇐i6# }%LEuC`q ٬+Նs(}0ÅD }F1DjDu*sI7k yNF1|kb@,XjK1VgL;4܉NZ͂h}:Fꈍjp|kWW~mώ/) 쳁jx9ƴq{u,<>5^|[;>T/4f@5xwA\rw&dܢ;[Po>ɨ䓓GW;`0̪ 97Ħ(^h5qZ2/İL,t SerUv} 1]_/F}'~#\C|:+NOtR]Q?<)(_0K@*qAz+?XM!"'d 'O &LJdC^$Lu>T)Q Qє_Wmjy5 o܁R7&,{)}h>.I ŒLz`E|N7{Ӆ,`_1HLiZǻw/BnC!dn=\o'fLɲƌBw]~Ec"mUWQۃ)ڟg GV<=6{={eGJ>P=4+=#-SO{ܷò(͈3e kV@fs0N ̭"ax KM %…Z2KW+,`.ޱoQOn;605gUcgsG# Zs[o|^Oz!W/^c_6<}wy\ ,a7"L/vܢ#(oޢ ,>43<Ǧ!~b4"gɴ#w^W8!eAX슑) O%O\^4㣓謼=}ǧzz oj;w~w_V'$u H?.;l?2%?;'ɽ"rh~Aͷ\w_21~ VZȏb6h1@Y먷/v9HpЪSr2g#({,a٫uSYvau.uq" kx;@xzY+]sVؖx AZ2EuR@Fn? o]1(Z.ZE z0 Yjv6:Jjq5CC#<(ֵKM sԈ @Dِ){gmfݲ>6pV:[ \9#qVՇ+l\4 JZLw:3Q%$"AװC:ח#'l4Sq8k=Wm7`1F8t%}B*.IPcdn;.ї3W /qR:3+Qa6 щз]^C6N@:Py&4aSk%}؈ǕK"G+ sF$9\R 2bm2ؿb BG-bب.5] mBDc /WOJ+Oi+WD=}+C':鬯Z4t%. f t'FlGs|N` 3@c% kzO ]КЎg-^gZ`7 s2V !Dt$ _]1`'[oP֮WN.D[bOXs??-a^NY@)yNT[{-$P Ʒ1;Ѣ<;֒"y9zm@LJV6t18ǥ"H&h"eFdF"Ttm{!XA}kp;^F^qt2©VWO"\3נ:-[EM҉b*Ib$@ZgWG &C$x&V0k< =`PG XW kPĺƟ ¶ `yLF%Z;YY&4S͹!az\aE՘+Rd%laih%Zs6}>/@lj:Ke(\:&hB#XX{.H Jc m{{kOl!(}䊞PNnCXC"tXJp!߭ $AcߠTkP5Kp7Vy+ڏ@Uv1;2V=5g_قi @ƗLc2}Ol┿ɂDQ wFgERb4ۺgi6$5]rq~8_hcI^rYp}=TzM\2؀pi a4%̉Q/"C%'X~T]I\MC|W}[ ߇^N#w]} ~i(icbʶLPɜ:jU=$`\}.;o־&K gPm̯)»s:SoQ{gto̬Ԟ\iNht9 -0ȗ/oo:{^1#9 ?>6Lr|#ߐ,Nmp0ͽzU=*UX!Ob gl1[`_=ߘ__8L8rǜߤ_0#E/?A9yD12::#*i5mPWEHWdGoWŗǮe{H] "ee]c 3K`D8!P8# eG$H:iF i%dD0t&Oޫ.pGE@37 %d==7dbᮈ(7, -aԏ+WafAB, Lg4Y ~ Q`ВLAנ,/.+<`m ;/bfrQ]іΊYBp2L;7 Xx:WSl sF$r1'kuNCzti6A6цྒ͜AG0w~t-,^)_"N%ai]NBY'tnP^)?Gs6/ОH1^lEӱFrv]1.1䮇+\Ac Op r6% F CB5:&d3!5pub5wʳ-^I9Q9&tyuF$k,c//Eu:RDw|G9p&',UohMwj $#r \;M!%@!xD P uZba:drqO-}ޔjl ӓ/@8zᎫYVR]5!vWvI Bw9OgiF! //!s2"shMh2>l :rcF9Fg`*kD+(--7zAs(k'] >$c\RK)Lp5$9A" |{xLnsD(a"pCr(LTEw9{udٜ*)!I 쟂e.Qti۶m۶m\Ӷm۶m۶u"+dD>{ކ"I Es2JdiپLǵI5}aWqd*&ιcas6FZGM5b+.>sN6þS4 8;ˇ/6V:?d(#Bf]Y Ft\\mm 3?3XF ,+29R]B lt 4s{"6f U/%:M\#'l5[{DS6T\Uy u 8@ق71\$l.:^㠲 b[h6Ewԛ~t;ڙk(yM+{XPzM 2!qmLL Lp1YQ6 @@m=d: h>yirX^կTCZ2D_Ҽ`V'g#Am Tm.\,LZrE:BGu<2K{%:6l?noZO*+{ sntBM29.A7>j Jm*U$#-|}V!`[6L^NjR:&S:xKiFR AT8'/  ކQR)^q]O; #qMR]z]>:f&P8҈泎Lo.c g&Gufs9"_fvm,h1 nろḮ'.:iTr{=Ocf$%/͏3ij^~$!3}L|ɀRUb汜h\U}i[ 4Ru S * $ȩ$Ya^oc2 ڙ Sv߀M]j: ԛmψF:.4'N -㛫1s3df׿I9$3Il^)hm:7E!PT"i,Slefd7|)XYlcUf߭Ih"n>{aUu' TAOSJ\ĭцtYu(;8ssx|pR18|1cDW£U@a]ܰuf*Pn s%9wM|}52kv_@׽F ZSFQm dr2 &87yIQyat0er$L#](BlcWiۧ,]TE;N 2X놣{{oޅcF*s)${thi;;DA5`e%aԠŘT vu?+B)+Y*@UHZoI>$!`Q&QhORDZ؃yłUNȃCJR)ҵJAUYaݵs1KS#]\Z<{0,TĹEQqFsu3O8ss* sKS⥊XD c%ߧz0:AM-e&yya9:L@nfb9qJ-D(R9FE GIЩӤw)uGFi_ ke<+/%j0sK%/JX $[d>L`Svԧ)K؆$A˺ιop8"+)zG'ydQ +H piͤia-4Fv4 %ۻS٤ bX,'9l8Y.H[gf\[UױQ٘+g&^d3'E\Aw NLkɫŀF^W<(\FY۫Ead]JkpdԌK+cokh qAQ 2mbV1G.TIq?I +LҞp\CwE431tGh[wq=J%사pbYew=8&nJ&ΰ20`}YwWN[bQ߳'V:TEQ31Tc)ŜY_3 *lT5b\Z\+fOM?rAp!{Yt*A8OA4Eˌ sTր6Pɒn_>l9o7sMkmh*vB1=39З3c2,{POL.x4 =:'#1,?dm۞i"PI'Kx?m#a@O68nʎ=-lu6%%)^h%:dc:RxaD޲qkt0:`g .ZDvp5j`V^|?BY 루;@WZ}ud\G4% EX<_{-!=] 綾{pyp5#Ծn*e)Gh\E"|%`a;eـfKfrReu]=E|kEXM()ܐ,}81!6 {i*h#y4-s"MmڐOJ!] 煷- +MI9UfxlNedg}31)NKR.g@6[}qUuhR+%K5iy^LI5@L /x\'b:ξ* #E*(]EY{.1jtb;'mz#fsJ ^eE1593"&G6qx.Niti7%s7ƬY Tx\Ϥi}NPկ~%kg`PRG:BnʬZȩLq~EH0OAN0= 1p1QWg0&y4\xK2r1H,KkHԙt55 =Ĺgzq:"2NM a6Nr\xd,R@o#lBT[7V;A3Yq9GntTgA.zc|ٍC{N{n tP/ r:U| {gx h8 hE ]:[5$:^IY59N-{EeD\G5 olmUɈ>۝i>3liϳr\t3)ӫ35 ; @&>%4!nSwႷ1UDY*TG*MW~ Ib9$e(7v"+{fk-8( 5<4u&%\bl &IXgb V(>ŸE & EͮINQ-$'; :  (G.$Gѐk2>pΫ }(m#ѐ0Hh(ʎ "Q,v'PhZ94h.FۂLGQnU#(~{H ".Cf&OB^ -|EvqtN^spK~FO]_B!}dV1Lw$Gnv}Ks1ǚpAxݹb 5Ms9R !pOxGF`D+c̪g v3hź&~K|Pvf6 G~;'e2< Aa|1>! Yi:iUգw9ݣ؎i%`$KX[{f3茤xyot/Y4ȫۭ^ȗ/5diU< 7HOwoks:/n-/ei!zyR _4{wJꋎ[F ɣ+Vw%*o\ATg\ýXs$[x4811p`E ,-j+E W}yR׳`[?rjڼlF$Mt-R4t686@rª葳c4v -/`RY=] f^("/(o%7W3@żX"+']511|㿋hWdA`/OSҭ)޴yk&3\]ah9{{JЛѭI< k\ Y1i\8mߎ*|eʫ37%P)rg6zQD%d* jaW~8~QeYYeyEy. MUQ'NY?SНI3QdMJ(rGGT?㬪$"*U}ֲUEɩp;D6ӜM-S4L AoDyΡݜwF=!JPt |z NxShvl3$8ӄ[zΤ. ͜T9mIwo=g&Sq[d,Pބ`AQ*"HZUtu 2bL4[.mA:D"":}c$ܲcu/a@Bo䓫%Y!Sd`FK F Oi\gNq\') "W 3KS z).笹f][p-3QtVz dI҆ra8rIlTkeVWR2|p=6*ıT[[ Q 5:̆i26c_BpƔ`17N~r9#W9wH)@+6opH jlrO􉻒"qKSΓ̣X[p6Ƈ؋c+Est,: z8F8{D~ n )Ar\j ׁCk'_0g*0W鑀8#4/H@ 8+%4%bR-N/o!W$܀%06İC\>דּ=#7eO]dW@7߂[ $]7n=RWvT$q>~܏Z\@\JZ_q{iZ^-дp6+Gq@a_Qbava^T#Q$cW=-`wmu^IbBԍޒ9[s5#LCʋ~x Yʚ]h]4[u[* $!fisp/;K=S0UA|䫟.0 )G??ˈSOݢTg`ݾK?@c/}eXz`{e,cNsS<@s@~n}qM`]8J_dkN'OgNMOQUFKKSb^;v笎Rv|v[E>qz>v/Q~DI ?c 4ap5]nl|ț: ɐf nc[8b]D qx$07je ћ\ A;eDo3K5,sL&T+[ç׈E-QnGlOK{c7c`Af4&=%#:s=#Rp:#R8nd+KڂָPDpS ։6V;EbɯD,:'9kK˯DpNsvo] bl]mLK!.PTTlpηgIKLzΟSr6TVIB! mdhWam°:ʌ=Wǀ4OWpa峄d7'Q\Iw&c룷D7B0`CԯCY0-r>D S?AXP)ߦlʸ>g!*2dПnԳ&&1ڥbSpy n 7]8=Oxbe{s ψBhh6!䡦1 ά|e f bTܥ#L#r{KzU]~ quhe]6^4A9'[EֿsYHʃz sp0L@ Jpn» Dd&bE$E])H@$"ՌJq`tKŞb';\HtoM/I(H)K2mȼ~Px5`ZOe Br&X(2YhyVU"Gnn:?8쓜Cpa{~B]dЪ3/:?w97'P"bR 0W&=Nfp*dH1ms/$Y|*S;2=$rηT]u+W}L.5q֯:A0M[_AzTz"u1F!Y{qܵ b_w(j΋+Wv8DOp6j4+b;< 8 9hfҚFٺDhO?E J]Ea?QpAAe>8ԭ|[K=C]S@0\Ujm4bpeUiKﷻsCثt ]erۃsQbsxQۛ#ؗHS$FFV sv˒Yݧݿ68AnFfS-b"SeB>)i9`YOM1 \Swx=PsnO}ٹN\WYړ*?v\2mRK[ XPu>NX5 +$ic y⎘9K>PC}bRxH5gajLKMiMޙQW'A[lHבS8;*L?a9Nꝲ~f YSϹãF3{^*dhL3llM0-$rXjQ8:YJx60܀<2O~0pQF66tP$pʒ7 [[ZafCD؝Gޞ]>wu)T*SZ3$֌컉Cy۬ae/ :h%>$ߦh<`m^d -G?~Lރ ӢmlnGӾfFІ4 Lء5~\/N[X>eaЄƆjr i_eė + l$RA|^{HLa#ӡFoҌ%jDΰ~xLG&48*:J<0a02@#%z%6؝,0ՉM# )e$zyL8>g}V~dnӒCس^N3;˾gh}mwo]rϴc#|iy93GaA /'1r66I8G[߸_1u}bW0/99OH+rO|2{׫i} :[`MNޛV> zO$BOV ;R#b+?_0@:ps_7O䁔7IJBb1S/WCp}FOT(9V{h9לl"=E)2|L8?{}>xX=G$&a(em1nwTE7}LA`Ҵ70`Sz0 9Q`GJ7Q(7\Qg A@ nh )8o9$x]b]NEfd?#i5+\OnRjH~I4}"57a>f'C|ZW}$o/ =`Rkخ0e$)}y``m˪ju/85}`njGnޯ>լ¿H`:*sDS&JYϙ2߰]YT n?t]{B6պbs*Tw>`} jwٳ1EIO7läѬt5\-!5E2n}h+d4BI>&: qBB`FNΗagD"CXXn|a+8sYagMH.:]Uw +8ԥ8 ' i/ ;vݻ4|%غ҅9Y-~uvBP-Xs҉-F74+43|r_|M{#)6%F#pAخSRl'k\|GS<rjdE KBo^q,2>>yn D\LR JUD%'gE e-9$YM%@G$Ivq :s=LkރZ="M^Fxi S+@=a8uIeu rb[+zp'kTCSشԨ=_(7MFheM`IfSiVAi񛥕\JVGZI[*. )0aDdSUP!}ŃcRY8%Jwd}J?%y_ p׶AI$|u%i ˔O:5tN*ULuז e2MWLqI~FRykkD}$VE hv>% T X77]Z=7=n7(Gk :!{Uh:&$`]d2 ŎwGOz7tTyM q`S{jʹ|J.S%7&ft@K;N/EkfE/>KHv {w9 u%z䑉9J((|^nsV5'(8=<\'s!)"1uvQmtwCXPaY>˅>T_|D;+] P䪇#ҕ9E!b c+l~"X3as^Fk*T$}4NPF 3KoƼ9"aO+^`5_cݿ hd;+yD]Q]WmPS ˯Ň:9C"1&d`xs8c~oPPk(~Hts'M`\$+ -JHʘ9zYSL}SA 3Jmx,h #36%Q4+H=hmܾhn-Lk?O2Sh}l)hPzP]b.G~nxG:"=U2LS԰\@Ÿtd8.;SݝS*d=\V:ԛEIP[@ .QtX|Tݶ0r<+kS]ISq= H9 tͰ!,A7sR~2'&:a ˶$~ފ"k\4%Ɔ \H]>9a@ŔRs?ķݏV ۖd!vt^هpGGcfT E!sR0٣UQV`o1Pe6F6֔O Ձ %~kv` 3y3 ZWHcRo}șzPfwp[S\Wcc#efꆁcQcJjA  9Y7;)\H푧T$@l5pLR2~ORe{yz C'1; 4jеlS6Yc:3R~@]ݽ!j񍲪k֣d##W)4S:v}G.VOgnb5"4znW􋀂Ӆ2)i[Ph\0 [?dPt <or'|h=Kf~-CnQ >$%\v"7+s;l 2K? iWhڌS *x?qeN]9-{6Y}B!+ %TNa*!kӧMylƁ9s_R9Ũs {sƬ6X~+ƥhr>gK_:5.w5Jo9! 䞉"Z2!0 BX(mkXS\Hl:S!Ά%/M˅̾OEjI|/9ٛҼRJOs2OL/?Ck|:mINDnql A5$+]MU3Wkx+YR'#r #v֟m e, c;*ZY7ZtURʠ&S6+ib s4,K5$V 9V_E˒0eJt9pu&*xEީ.дo6FXA,$~p?_,獒Ud}hIB 5Mˠ$)G˱HԌ# #SbЙ2Ʈ9b;b;Dq`˚ YZmiI$",+2QIZ^!F<%n'pɵ+$*ƟDh7 ̞I6w4Jgn*;>4ggQU;)T//3J\0d >cx>W=I]RcQ0i9׍ہ Q l/9$=hu~n"q 4sEo{@ysb(s&!%1ޓ =1A̔iYFϟ?VEdXӯq};>r8}ʼn,#t1޴s^nQ աQqa搣8Jϭ;Y@ 2di'QpRќu61'[Ho EFA0979C ߧ ~}ƨvES3@6H"ZLȾMv=B9X &ɑ7ʛi(I|^)LEP&R$K(M4?XxHda2!!(%@Zb(7uwL_~z?0S΋a06w61=MDML LD-_KV٘ѼռL$HnG,eXT<ۙ BCDuciv^VqSQy^~D˟`V?[V͍5NB 2d>ޟ(ALL_CУG3:Pt$Qȥ (11(m CQe>i><0Az-X$E2-`@U*h)TG]K`l3#!#arfPɥ(̋ݓ7yQk#oL{T{Gq#3 =Xdluc{ȗvy]Eekj{f-3g0)οcP  @ |7鳞*&XwE L] ,LLq`jAwEڦk$d@t8UguҬu8z{mכq), @͜?Հz =5N>E6NWȞWk^/+> Ý}wp'w^!45#Ҩ wQ>!O`9v(`!4ow)4q\}" $wF4ul[V(ٝޜ=Dn;Q2ó |NeP-giɯ+n \[N(z^ ^p,: ҽJT UZƌqT?. Q'R *8Y[}[mɆgt5ʝhFM0ZʕQsquKZ3c9XS^60XXV˖"t} cWLWٌa3[˸d-V,A_pdxNMm;4Sf)ש{jg1\6LzOM.d0giA&JC6;G{/Q;5?C<ʟC=7^蜑FΚ!_yyy$J20Ր erB@ +4uVt!ˤ[ӛ)M0 ANFz%KÜaEY&(ueiQɾƠQ1&Piܓ_XUBڌ!€mNJ}ѭ!H{-94A IV6%}qKww;.U)$v~ƧJv~yTVҹȿ?]S{S܅m:\] .F֦OS#0z "Vr7cfvHi8E #2Y ы2\ZTFiu0M0O=՛KblFs ;F$mZY593KOu$tNn/oFLT$hM FeK7^'@_lp]c.<_aQH%TKTm؀}"lWcʑ()0q̝*)G΋UC3,*A:R夘6=D8 *C! JnG`+ R_0)cI#', ҐE aIZGP%;!(C%TKԙOY(/ʂ;< n+/r>3м3[E[.!@24TVpGoҥI L "C\Ct.ģŽ%VL!T6Oh<PP1`?s]j1jH([E1s*>\&A ΀EC3TH~i˱ȉ2`d5%Am]zT׵ğmǢ\ ,$Ks%D]*BC*Bt>Vom5Pd9H䆶/Ԧti:zHG(;^n!ہ 6.Ąx'DրcLOA{SJ$*rۦ@^GB;,kFu& "B,ؘKujfcA%5jX;"QJ^ cIb*^z\Z;ҊY&_]`+)'E3 Ɠu&2`ޘFgWWOQQA}c 6_Kq@f+S8_[U+KðL#x$aS; ##wIL/@ $"Dhv+ wZTw~DQڪԬ%(4Cհ~wbDw&GT|M.ӓΒ !'i>-+%P)Iw gtD 6;K X:0([|>{tGIO06R /vf8 ǔ<U'z`{e'Id Hk|ʊRR{heva)qR-RZf]q. mnWi(VWwEOSdh# 0|n&Nôhֆ=%f~BkA?͎v@*I~9'V.o3Ndj4 ՀJΡKGdw$[Ēf8U{,\ 135f %ી1 2?ՒRJU=E\ Q]7B։-(Xe;(P㋕W -ziιx Slևvb0okcKCpՓGt ?^SazqzRQ!:g܆o)(3Ѭ]_:zk<;4iB]5P%'`O꧗UxfKYfhR 8;QDvPڌK.R*?( i_sҋGA<*/8T;\6wݽô0{U ͚$_Fe6^xjlieM6]J!LWNyh\qrxRB-1Ϋןӏߍb<[X@d$ԟhQ& #>n}"ndU$c0yh lH[ZKHFH =VMPNG_Q9{ Y/dϐ´YQ*vˆ!CqcB#Wj˺,@G}MB<ȩMo,B8df*ǥ!݇WlqA.񪺷'&`(_rܢ(QQ ܮ~fܷ1l%vPb\v'$i̖1F$ -ц[uc9F+EIBdl[&1jX^0'grmgrC 2SVjˉG$R⎀QYɿ)l &`t'rqY#vsdon<'u. 0&x˝G'Deܑ,ff HQ@w7`ⵄH+3/ ю3-놮()}n A ݊1]fbDTBha#u"7#iɜ9;O+Ž1PݥP?QYj6=7̴Bs66o "*ͺ<Կ1#{{[^u6n]sfmC( im@|݈=Z9l-LKQm-|6뚄32gM?{-ƻ'b-`weU79>C,@Ҁ`Uzn uvF;J3pFh77{=s{ql\"pT}5zO eTp] 'tdeIk,]8%7YG]mԁ SAi{WpOn1-Vy#Ք'{4٘)Ξ厤;:=  tJp:,czI5;>zUi5z6-Sn\nº=JY}U%7su!4A`5CW4(WK٢MZąhғ{Pӄl_ʂc0x(cq{[PMVW=45Mʹ&+LP^i}RzrRKmܢf8w&Ӎ| \j@}gr3rŏ:K)$9XwqTx*qZK% Řˢ5O&Zpq1HeZ{5F{,*D5O)Y A0dGeJQ|Oc7/]? F:YzVh،dZ8tiWwt?zVH` j'", wF3XSQ5;}H矊IzVH=7]7]r@Iɣ]9K_x,6u[0g~0M& gIsh1x9\t:9>:FF1 s~! =&ϤDåo>RNӈgDuPA PWIZV|ş8Buxj6)wYB#a;/)".Me@ GҬGIE<9i?? E'rLHVn;@f`:ƾضO=cF |K57Us;tkh2&}!{C*@f(.L,Z͢RLθphDss=s)eu^כ3_S*HT"|,8UFe:f2ڲ9uʵ! T&SAAF!Uo}Kp>K)o (ʞZ7M"B7Ԟi];oW/~8@#q5elAj24/YQE{\2(\4phM$<s T$vD(ےBQ֩'ڱ$9cJXҚ(#uS~x3h'MF}hYւs%Lx'3x05r–$ąSI^*{|j\OEA+.ܼSqGa4+ez[^lH41r5Vҧ%I}YcՌ|&il}u_ ٸx-7yںVU1 eW: 4J1cnWrգjQc u 5uɦxLﲨ.x)CFQnTS#YN2EIT&cnt@OC$[YȑDԫC3V·KL=rw7lO}澗 6!I7t &E9 9:*d:Rʚ^uWvjbf.$OLT9 3LQPW%6&ov(_`0 ƙR|ړ"I,Jwf ~ BXJz U2QVoX|_:ZZyfO[IKq ZF\o`#(]<]7WZTgu0f=PXJ_ƂNѥ`z$&4!)NOm,6 NQJ:*x-Fn5uY(/P1P*,#LJ)Gͤұ\[j`3IEHYSN~b#ԯXm f%\QdAbZYdlucu?SﲮpZ.Lg#% L%mIqF GR64~U%7q63ҭvgx 0m'\NP:dy+6en'josz3g1i5FKw·V-X"޲OU^sѨ)9ߙϰR֫03 79XvY>Eߥ\; LDdKa k׼?¥P Q"n74>? D᐀:IS$H2GݧJ$Ȍ1fza@ƱֽÀ4K]&dEK K_`4uLiKr5(h%_cb֏8Q8e͸䇚vv&y|| ~^0GՁS"s3C@h5k4Xd>1s6H﵆7ntk~suœh<% ]ֹF+㎝ʶ{>kwI(T¨4(1FȘ YJ"zƭ+8 ZDZNJKjV34TcLEW0ۻ*w"NxF:#CޓmD'FHEfk^NƟtyxo͍.f7޸ۛ=G}`Pn8Q9OÝZz^eqd&6@Q?ض|,ӿf@'glG(PewġQC!JT8z$N>$]d<]aTkz݈i+MVl*@b8&) xE (vs M A j+lqB:Ct ňxQ6} 8,^@Ys" _C]Fl_#) vʔC~JRPPF l!v^"b$<][mSen)Nc\-a;~GN(9*ݿU԰D}C׉ lI[iQRQSt,  9G8~cosNzROg~>Ow:m'ېAn"sҢ~ qoFmaupp!?G|rwyQp 6b̆%GVy>*8&4銊Yq$Fj.B]D`Ng(6bhe/z ٯXdL3.hZ OA]V0jYpYP chj'I/U-zmͤQ>(?p',AO A4F09C!:H1|JvtdnS2D Oà/.[~a⏿6}y y#0hׁg׌'MBH8Qdd\2~\E,";Y*|뛠c1(kC8CM9q(]2xC=TCi R)͊F;d'BVA";TQG1(0,f* 3iA9K:򈨄zUf ,nЙby ;}[f8M?NߓxC:y)΃34wYLuB>\0Pɕ.&XҥOR1(X05{ P6%gtܭĠ:!2p׳qOqz ɝEMj ~1O|YLgu8>KlvePvGr,$@P̀i^,i)/]aO?CGw1r>V;8;ivs?I(L٠~Aa?W&0Mk\twt͐o:+āƛ?Gzc]E; )0ʡ7SX4k![1yGւ,'* C>c,U.QV.$ *+cKQ&P|8V$RMd5h}@VeVVZ Ŵ^+`(&4/x@>E7-ˬWh`AN|.voqrhS?3*/:8?2G%&;[:1\;sp``c\ rфhEJj֦ z&5V*.5weQ;OXe@0#zg,Hk.:nZpaW ϰC7,IkUYv7fCW>OZ M.%JgBD' N"nk@ Lt*Ҕ4 ;bbt[%DFuEoGuĵv]L*1SܵMEd 0XK6dِr$ԕחV`erֳ>nJ^4Z"O*hTr"dŔDYmzv-$fZ]P"j|4AYT] lhN;l֡-:Q + nS j+0ID>R͹6]hBGIT`"Qt輴m2qF҉m*ĠoJkr>KR(6FE ۧ8/GCy>Ӆt' ާ'І!(K Fz1(p Tz{|w˻[{̢wF{Fqj ,BZ>HC@2ZSݐ- ̥ =+mlahak&!/1$Wzdrgad&fDD4 thA"291CA|>4\n7?6N?N[NZ8Db̀1m*Qm5EQL*~) J5O˫=WN(PM$8nպ:^p9SSV.9=4ZMKe%|B%,4(m[uz)ׁ< du2VW4E_.Etfgl8!慊_Oz*岤!:MmڜG3aG|B<:{q3 1OuEFmwugmU5}|'jlY,+KHSִڮO0VIS `H6"Q :K 9Q=`/y;AMq^ExŮ~O HksaX+-~@)/yWJnx@.YaZgMD8eO %rFH+̢x=u럃v`t&IGn1 BDB&+ugRX) š , { YJUʥ "kwm$һ7D)#zd: u]<^RrbmS9{7PK8Z6]6?wG+-#ܰSc$ ,EYYJGŽ5%Ho#eWIc4n|8ݸ||!V0: S;Ɍ S@*%+lE k"P@OBZ\sB;u(]jMXrs | W0@Wo\2Ak:$\ >4U+seе,S!?vB] ca&_, Z#H.u{kHfT^@C,xR˹M08E1`7`;&@R3"8q APaWD2sPP)"RE~k_\p)LʑNXܲwut3!NUzBV04ƵC+9sB(IX Kʃ-)r}y[{-n6 I+ R?* D2Ⱥ4MCE17$A @ (LR/'}/8lm}Qm qyqY˱[loYt0p>oͿPd6+DxQڭ }nj]gO?)YGRR?%ko>K/P;tBy`* Zĕ{`Wd*gPSSLӇ0Xτi4Y!Ki#]! P Lq>sg#0tTD@|}M=ʄBEM#88? 7scjj7lؕ jd#+6 #~rXXkM!6܎Ϭ7 $F./P>D-_,0pWjϠKgm>hn M`f7 bK-!R ]1/ˋy2Ƹy)}+@)L;->f1G}1b׎C,_;j+6 }) ϳRS]YٯL Y6JH--:/nm+u7<ƘThfkfr&i1RgS]Z8lɅZRvrٹN%R\yLfвc3kX}@Dy*qd1bzOaOw *M?\fat'd[G~!lSŅZ:t]?`( 4!~_Cl2@%xy%-?mT!]v[%Π:%b4'k}.:\;#'1, E4 6ZAȸo@Q8&eN*:Br4X P}X5\I+n;:Q0;)9*9Xt+Rd?c G2[낋L尦6ꕖp0ڸTnI P?T7|tɎzP߶eia' 7(i 0.57NN*åhMDpԐ/ƕb,DpN3hx)>܊*E, P6yO$A'c&sEQfd&XǙvt\J7Cly=S<6:_3=ˊNwZxY :4W?  (X?xV XZWHNbrR7ur!Td '1B^bxe qS*q-@&)EllAh[UMA|#XFO;qޟͺYIlԲATDVfWRhѲ^^;e$t{u:o$؇!z۠qYPkWu/ Y֞U֞%6?k[tI}MvfDz)g7= ky/o;k!?dyiԇ-+ƸteUp0hSx2skq 3ۧ+W)FY&Eu;߫߫^\fثnǬ>[Y[z|{~cE`Tgqb+bdWbG׋iW~bʵ%B]gY]Z[8[tBg d6 ɒ3r!UJ)snPd3pd$zl9}o=+1Ƈvqؾt3;pemK< ㄄2d80[0VIW&+sl۹#S`CYa8RS[n˃c[eKW;;Fm-+s+9nIO8,~MɐELCoJRnuwѓ@3sYL*Rʓ! u6"6% ieFljEF;sՠ%{J4n &l7Q?S0rOxRҡ?);K6XmKP0xS@8ÎZ"(\ǻeKHkꃮgW? (7" rԗEgqGoKm$Qyu5ڑWmR9>1;/8ϡ ,)s&I o$bj;Nw! [ܞ3 uet] ܓCʳbkl~)+bFJ9oFX>`!-1gqzIP4 320sz NzqrY'Uy&29v`n7y:JroGBY^@EGG6809?.9yo)Xy!$}:my-hu3bR3.ҕi-k>3\βu'@7/N$԰^;v(Ev ]`&0bުolQ"ijVhٌ!+xIhni('JW$ @+džT ?9[$/Dtk4=1cъX1fP+c4H{ٽdNYgaџH?dn~gQɥ`_=(d)IyU5~] A v>5XXd! Gb92ZIkWqj'NG0nSNV %'] MP[e+])m@;]cc*Ysl Qgl9Rط.2X0~r[qOtv@RĚłKBCPƓ1s[ 0)Y 8'3`M-8'M<8{ElZgT՜}x[om=({N:U"\\:5HUL9{ΆәtwG{Cu%0 A8~J>]~\X%Jٜd~hoݾR.\Gno$ͷZ}~\rIk\vF (!uΡYbϻr_͘4'r~Ik5!p[Zy0bw9$3 .t~fbQ(j_frOwgYHC~g#9AٳO$Ū sfF pq"amFD;5O{{oߤ(gL']T-]Z/P~NkέNk.'/j)Nzϭ Bi u4 1{]tϭ2Q72"[y֖I^=~ghW޵82+3jEO޹1WЉ.x9 yM,rmg([⤳~~]ճ3{KG\~~ ξd>hm_Lq[l]2VGQ_PJ쳣 D#+U09Uo,}UlBσZ*Z? *f!{Ԓu噳J/"lq*b|1:樒JHhybMe)=&$=VAcN68Ǖ\ʨ).H}Q46B7 ;/%HgD(:UK*ϗM/" -2< K\2;(T;SRE:G&4Bf<%.Sdt&TNޙb`:i%Ҙ+U[dNI10uwHQϯ 0Oy#*ή MgjjTS.&P:C"Z83]?K+%,!]nya+|uaQ|>YXVȃFUJk1<:,h]eK&[a@KGXxOjN{ ,YYR moJ\[H8bN #bxIiiazn'zπgg?3Fir&AH`v5`ׅ i,(. \H`uUzg}LgRdN/C}8vݿW#*X-$@P('^3ncE4Nr8L.>+|o>V7ѽиHs1eqm#.̚$,?`o)2<~p'(e` <.-i\M%l`܆Bdqᡷ5Kݛgzt5FYZ4pFa xM;2B/NNX픤7J.@A9$A7l!=?)ԍF`/]QϙӋX n=0+eV6wi^c` Us,š3P~ЬI~p x<} Qxlnο- v}&2gd#+`XkQJq0OWi {=pT0OAEY:XţBU&q~rf]TÌ@YY 7`:K <b5WO @#< ABSXYD + Zl54*dv`F+jd+SyD!ɟ9x6Jv%oXXLw$H-96>^e0~Rhd'D%}Fglֺ0 \lgUoĬ$?dL_p "ԜrƇ4>$\22` b}o;Nht*;TqDžteuTKjuJ$] HҍjbK&$:x*cugV@iP=xf%$o,c\?ʁ3ɼ W_-hwwa$5ǩR5 MbD&۹n@T\`+n)xBؤlǼ0S VH]ۓ͉ ˨ W"*X7*$皳g=@#eInAW: Gۢ|0g߶U3BTe1˜>!{Pg%d*H8sLcHƄY3m2:XdJDeVCN@\J;ZXcxpw/bLĦpP H"AQZ@꽣c0 ŬJlRMI$th!bVY=7g-.#,NfF#63Ӊ ϫ 0Ѵ:do7,hR\A 3: bM+9j N.gϰ:+,#5 [Mgw߉US; =-:Y{,?%Dε=[f}jvCW0[sȳhfXB%8gm\BS^ZFΉ7!!zQ{@y|UfbrԷhG6jX'm\-2J@aoHCpX.!q+b9nㄭng^#0 )8CIA{H#t *>PrR$Vh!%YkB3Mè wBo䮣k'\xf„~l@MiTH<?@Jksv3Ji4,r@6=ӔO%5Q=e6a3R=T{>JHϬu58Z.g@X*#H(RU)びm#=6PMNn)o˟2}Wn$x !hl; ,4UZOg@|I^^;(A2j(.#݋<dӽ 0Cn{Bz;8ۄ^stq:߫Dq0t&l[ɺ)B6>#{"xl*N% S M:X*!7&/&$[X"Ð"}']'9K.p[ùɳBA ΠU;sfs:xsH`.v5l߅i+F~PAY HwHkKFᨡCJh)*iwGǃ -R u#wO)uz,"Q)3xŵZ r02䴋; ^XX4LkE1Xh,+6 >>Gkr^V.+9hƇG\xJ e jL#Qm/[#!lv緓c:EQavgPpR(Ӹ4M@ /r# 1^*Ы5S;0'69z)󬀋%lߵNp9'aM 1"8 4Ŝū3cpLdqIc9t[ˀIc狏ÉG,a}UT05z1%~Lr=lPMc_V^tPmD2%XAt̐NʑҧuV iN? k Աa.Gg8[(H݄t?B '_Gå"Exav]A=QU=J֢ K-;-MpVoNqw/? ;;Oit:֑eRMaů UCܣq1]x?fQE7@pm#Ea{U剡5gUa @%Xd,lӣzA-|{w/G' I]"|Ar{Z{ϊg8]x(~x_DdT[)T^k`"5>Ć##u+m-MD٧bh6M*7m^ܭ3n oϿ]_&#P l aWd|vm'%)H(it$846+(40baX7~IÅ3p lV?FeyN[BEa@!wWzaQq0 x+I- hdɛCahTVefԄ$Q;z_%ˋV_T`!gCD+HVy ^)m.)l:K7F`M#^UM[iDwFQK{PTV ߸5G- $ zHN;%$?b&zJHEZeyy|܉[VZz!Ѯr?,hݵ!oD?r=%[>Y]IE>`>B)ktj !G0#$A 0W%K '#u:vs% wkGÀU >UGlV2X 6O5 l˟ y)X 2>H6mK}s'v lCvq<7~2qM&d]H&_Ίș1e c?:g W*412U̐Rf^X7E7SRlu!Tܞd/7æjOGqݓ|ǛC ktܳSG!PeLGPzWqᅡMwQ8eIYX`U10^F_~€kJz3]T?z/ЎP;ۮ^/{)( ޙAk4bHZ=>EPHE|AGV]IdY,fz:6: W|Tgơyb=U5_wQĠ=V zVeUă 7mDHn *QJV*gjjC1\꿳]r&$c NУU&>nI~U zܝ [bV$m* va"ūBWXoh4z& l~t1[NhfOĩ6N6Y2/!>;rl=7(-}l^|}xaŴ~$|d=ڴ?_9,F ̀ѧƧ*LdP]{l9:z _ JJ~S ;ތ㏓~ncHpQhqL&,]jdD&U`۰ʹH[)Q,b}t a˔ö !>4]NUgr G AzŊ7̿peQAWQɘ|Ud|V 7{=`_hFf? Ut*K6cW:>t#!ym~g {<#>Q|`Z"g1C.i]NT_2/peu|[=:ؒC5` 09P#+%gC Y-5 0 0|V?SkCԵ]n$tޯ,A|M%;3ĩI=F\C3-Q_` ̑ *M} CU?f j>?Pr>Ǿ畘9[7~hp Qc QjiǵɝEM?)z*4B2$!UHN{=P!imKs*7/0_) L/Q6ԟ9 ?ߟ<%ZVZQ̡V´!ħK WX(&YV"7bըdy~9S!f)$e2y_a!+ ?y} y(l~kw {o80=KSk,'}L D3TOC sԉf&?ξ|+.SQ'?/6G"p REWcj, T$(b~hHʽ ުqҹKNzATE 4J| :]v9䟽 }'r$' l!"0.*Y{p2`c=R @ @/ֲ,:t=~B ;.:\z`6l !|[e0?m95D>* 0> 3P68(0z|侷 $!2-;#ZhKTu7ꌔ|J˔#Kx L6'go,z7tX$ꞃB &y/]8탐rÎYAr-_n}0f?({LWq;8oKCH=3~:*t0ߛC5N6!6-WkpS@ªa=Hz{~[>H7T;$?xW!pJ<CT?2=崆x^n^:I2vN^Z.t||q/=rz%V ^Kي[\?:+1$/? 'Ȉ1uO$a<cꎉr5+A>:~ĕo\*EF '%&a|FE*D+W<ۃU r[30IW+s/CG,ݛ15&sgK\ t"}5\PgڨQ2!Դ s|:TgX|{ b{FBp'}# *4a3rjz/!7Gh>WWrOe&BB.؄{&}nfX4QF8*꧰i.Y׳C˥1t |mMX{.wJ\W-kz&Կ|BW`)غG>;*&g<|Tf I:C q b\ " #Vt3Гj6@Ed%Efl$XYLLd)r?RF9dk$Qy/=V1'p.XQ(s/9Mny|j,՟2,'q;ClTEd!yDøĖ!!z-\t:*dX0R| 2-Ӂ͙]Axgn(%(iz3!n+cOUUIuM To4ɂ1XR\ayS8'yYYdrÑj^=Ƹd!nGMOvZ"|-F5d%O׋^Bib D%+r, 獳kwpw}ht2#l,j$$$: S 4uH!Ly*x2&)HHIbsG SqRh 1n"ŖRgRdor<ﺸe[l=+xׂ.+W-\8twi@b6,lGI. <B><}񃙪J?h)#v-f[9 ոΆ!^ ,-IL/FWL`wE6m/k,qv٩QHp!"u6/9q;ruKX_ՕOycWB:ky+ryUG; <鱠ο^'kvT8-Se9m/ XX c-U|Ȝ%;wC x˼OA_K0^fͣY4 ] W"hdMGdxSVs8 L7fL}'Kv.L\MeQSr[̤e NXsl\<abދN婹 feR36%KbӃp׉?vc'.fffGR84(-atggm 98uDfgfB\;-26oeC E.PLtq'F4;g,q߅d1()*Mތ7Jf^>ix_Z65N= 8b atvCcMFcƒ#W8u5;WCq6wF~r$f}eWBl)r”'YV_i㬓E^x'1Lm8ڵ5u4X nj{%8^*U5=F|%ho'͍_wJk7hsN[dpР*NE3nNQ=Io [SɽOtu^lD>KS?R{DPߔZ4[;(UO|w\J8=Ne7͓Yi"BṞ9\Uq!QKoQ3s1=UgSdʠ7E+9]%iSJ2Oj)o b);/pR2[q_^8Y%?yTr|gM%h T0PaGKPV2j35jξ8QiKAFSƒS,21LWnimL7K.ʘ2>./f^'5'MnX`N7*!sZN+"a"R+y(Ld41mL@Ƞ j8xNgn^5>o `4:tkJ8ruB{ohlpC6ޗI\Ut+&\ E) eF#I RB['ki`VI=[r f҈j-u;v!(Nh5+*2l6|[Za߆p2lvU;puAʼ[J|A|ؙuZvLx2u0u20TߓgLD+2j;Y{t?vp Zw=Jt kưs@$Z 9e71=%dv[I9Zn"}q[A2|ix{Jjq`HTVN2s| sJ,. p) &ےGR^DK槵t@:PG7P"G M 9_ʩmV\|S3ղa!mr(^cyC=J.A2wݡ37]H{'etžH9GiԂcz uSJ#=ȔMdŐreUvqHC:•TZzb53 `!w oR݈:ŜRfd-M!6w%d:6a }+m]# ⧱sɦw0B$Dtzmf=?"\0A'ںhP"h ZIjF!VZF7\1HBÙD?|r 5Pφ6\V8>X[Dچ L' \C2݉#ڒ;pĭADG/\޶e;6ochd;^EL7kTO5]tOm)ZLkճmdI}k9̂r"$X5˗vN .1Kmſ8 1ϜwƷ-U>ڗ"M5NN\LsD;x"v1Ёjg6*B WbLs<%.a+We<mͳp*v="eE½]n]ܹۄrdx܆]G tr{K|A5 ۢ7 ;vg5[jrXBҙNZ:Pdc$ڜ@.C$jzM,#r9->O \cU33HS%4[&Œ$qÈVK \ݻ&&z)8%}+am#Y6]>l*#)9f)2Џ)b*s ^`ƷEn3&31#C6N7J:7ryQ;¦,#j 1@VHNR(AK^ &TǪ5X?S77X?BbEˬm-nSD|&8E#!`D!҈%8zW=ٝfe*;!lϬWdY% 脳XLDX0xQg,<W4rYCGk8P4#)Q5Go+gn6LSEs eQ,xb[O]'6IM o`G*G"HĊgeQv*p|0qO ٴ<-p NT.6I"lN(5Pɰy nleK a,+Pm w&KCWShf8_u#*:;&Ȩ*7dxxF]S˦jx q/έ79Zm+jh.ltO砍[~?` gK8s#5"TzCJ% _l6=ggU^IJbټQˊ 8(in6R-$ʎk;/.ǔaڛCgR`S*5uMC0c;GÝaଠhV_pRlt,܈]2SlDnWbO?٨Ycxv[}sڍc@YobJ-VFV1e)7E&^&wƢ#ij)iFGq.!OHN$tuA @W5鷬r"ե]g#Žkѝ*N&Iſx&=M l6%KbU })H ]BJ/%L up@Y/Z$2*?/.6XC$.W O4 ߼ l]PK}] ӊ֩8V$KO*UGg ]VN"I,6XЋO@z'.`c+ FONM!w _?G(W GiZˬ>pZR)t4!0HKazV?RfPb -4}l^ {tp +Ox)Q6 *.h! d)6lXq;DrAd\,0$NTh g$kC PZGJ^oR%-)]h8 :_y'>Yqr *Is__h`ag_4JߙWܜ`uAY|J"L;݂ #?pa8_y$D;0ZD{4$P-T(I;qg@mF뫱mSC J[NA%]M mUe e2ΥH3g7Pmlh!G"'h%s*L#Qx{%ce; QDr4 HT{PNMa֨@O< &1Y ^:|B)z6n!g8TS5clM^TݾxGʸF*_P ^=uJܘۉ\gͱE0 T;lլ >lcv0{-CqK.)[,0z>#-&trPP8ݴ@ҠŽJKp3Veu.zVvsjt7LI^Tlq8ӰȆxgB1YE5͒Ŵr4=i'}p0iM67ϱn&,QoB_?6Y&6֠UVi\M8{Yk4J6uSG") ^1p pGۄj1=NLsGюqeN50ƻDc5 <`prcI\9|h͗N"N@#c;kZ!'Trq4ߐZ  Lnͱ\Svk+$UM$Ic N1EleQyqn䐎%e"W puiɄCRdJSFͬdJ,9C,0V)u7QL+j( 'B}:V(rv<^Ѩ)FP*7q̊mb4ԦOt \RH×\؝#qJ$f?-Nw{;v2#7xD-W9-عa k8_#$9Ha=zm<"Ev~Lzϐ2Vs$Hb dO@qf w4O+蟘|yuhluV_yW"v)#6wu=9b{%1KϧyBW,b'h\jSjPWݎS}j+ҏ .3?chmTNUZzlqآ[l(pӎOĮ6IṯVaQĸ9׆u| Lf#.5 %g0qp~7l'L Ȑ@58=O*lu谈U!4Re xR!51hM*:Y0襧<YX:7݀BimW(=ݟpDM4'EG onͅM~܀&ͥlX۷hDv܆NinM'݀ݦv'qK>K7w: q@oɅq䳯&N:oFX 2Ư32M :aߦ˥MqDp'xrp&Y1=5=) qSXA|@S3 l{ѵ 2a\s&l)h`qx:)YZoiaᒍu}OAQp+z3b[tFPkvAyi]8 05uO1 TXռ T*wܔb9z/J7_?%uuPF@YJgZjFկ ^qü꽥,*{gm48HPPwȕoPI}ytюJk=nZ+OḅZl >8#5K#TpQQs(AY#NJISq:8 ackP$H%#u &޲\3CDmpȦwߍX>> K{~" D nN MOFf]((U'6j0& ô`QnESPc ~8BE|HB=;G _T R!|_ZX˘886 sC}FV52?N5i^)A,APLe}_f\]_nغbvDsVX sC5(M"!IaF| wޕ&nU㐨FkaMҡ Ѓ )h6;TʍuTAK| q<uCHi~Ç:8Vӈ;ww~:δ\qj}18{J+LL|-A΁[$3h*)(5<ݸd(vT*T[g'HK j篇>QRZG+K8TgTX&%PMYn]N<L6B΂_!`дxÀٷBlT){Mϟp$ ] r('٣@ ^k[wjzCZ'Sp՚H,`@ϻ(B̕#~tӢz6v6۵j5մxPڋRG@P=,hfu+A;Lψ$^0Bzw~+}d1GW$w+-! owgNH}e*q#|iFJˮGfȞ)Z=d]j+"篟adR)ld(X+BR};z VQYU.vQL{rW; oEܟ6X [D[0=ŧU7Ë99zgRQG]]VuB!  36(7+<]$ D,Q{Ap;\lFp @c&SOYFJS# "V V D>sPkg˵Sp:Ē}ג` nJ(2s]vi@d$l{yǓ!S>#\VA |n~w&TTojEbm'` .Vba|9HXaHA !%k>ZkL XatTXv-{Z3E[Eh*¥˙͑Q`oieb(3lidTK ʛ7i ۱l@;Tdh »8iodk4M?@տ)`B+|zd@Hn#&͆@׳غ%خŗhְZj&hl*i,,ᵶnB>ޛN>]3{R:i3Nfs!k/#F+_JQ|sd))gO/)g0ٗB;:Ml'wBOG8F:98q=aFUBxjG}Ayk@YpsҒY?5Vh :6Rxuћʰ8nO;9)Mk97Q҂S pvVRua+̅Ƭl` Gԃ=`RY+1\>1dgl[ϑp[-D;S0yaN?}{p?g̬tbֺ}|^HQq&}Sz֞t98'u'd9=~.l_7Dem99F9,tó9>ؾ:8᳽9=sܸ \+\[y>Ʀ>]i-W | ku2ٜbAkV~oͬ拽k nƗ]l!y,[neH\h͛ЭǁWE4W/jȗСT磁 G'rd!*(1I;}~?Wɦ:F^BaP" ®FnOQU"!egXH3(젫EK} rRaI0H@PszH oS2V, W(ܐ /.![dlcp vՂN+MQUoATNP䠢PVH`R|\OhP$ fcI8(R(n s r [u29!,d6M/Sos݂` }Nu5rOfTϘGAJjҙYxzih} 1Ž+ZuIӚeL,( kU ;1j=?Se-#D*c ><>iw5잌+5?>΍"'3k+4&Q" p¼TH:*>ǎ`('P*J΂u jA@! &v>n$ɚ?W߻ fA_D,DC {A49D;IBD>U[ x͂rqBhi[U,YLWo<b102*e5ܽ""l7,8ڞ,WwH'v|} lky^nH=67L|Cw`R)ޛ?U= S9`9bȗg:-PY[y!6jr^w`okгZ"=9TiV78y^/4=/x❻ 22o@v od:,+c>F{_{X5 ?[1rl ))QhJQ:о=s{#{uYa_-!QfF)= Y÷9>z8j*xg-brvrxzd+:ͦ@l5`7GK,치,1IQɨTZ*Rjq]7U,fY<me |{Pe:-LPX9=KE\%DfZ5I-!CdǴޑ$qFߏ>qdJydU(貮F?2jf<"1 r 1Hleb}`$ YDQ%ts-3!%ؽBIEiUɦL]ϰĺi]{8bx◃x(^s$yuOkJ/"o"!n D)|bHsyKaH Y 8K /]mB^\Ҕj,I!+i=C2mQ@TLlg^tv[YohOMBJ7r9hH({^5O!NyKo\b6H6aq)0[ #VNr˹3Yƒ]P!m!>m >m(A kȋXBL)/P;.Uã "Cvi({k&:/p|/&~ʽ+r1yU`c$DŤ\t%&tK/H9^ІμuŻHm X\J9較!aR ݓ] ˣ`ZfhkX+4ȏ 6(wqKe3ГwDdk ©Qwo^1%vc^ܙޭujJ}ʎv|5vbb-ud5Zuv*:uAoV ICHbB)U訳dߵɗ{mJ5Õq/T k_-]Ą 6G rP+S"a#] ct-rK64kw{|rȀvIXVBcpͬ<~C Ts HЗ'QW$؍Q V ae򺘻jE<Ou{W>ȵaS9S#C]bQ,:2O]Bz|!czT,zl>Wy9tυ%gg2=>=//>xQe3OO7ߣGvArƲsr;t|f<9,582XbcRMxxqr\, ?:*|2xApqi-CZWEHV n ?)`!c|h& |cZ L?'Ӏ||㚁Sž.IF|sno( xmD~tw`{%>[?0X[&0xt&M),I#KҲILa6ty{yF IQ9HA h!0AcNP\0Ru;>x&̳cMy0'-r E:NպHklq פQFn\SWl V+[޳oMc28MỂZd'ܔ `kQ=%a` 3%xcī0% sV "0p%CO)ʐADtL|prE%Z5;dqo'Eԫ+o/drr8N]wcZPSK'G[FN ݋`-ыgɼ uTk_o dh`૯B朋$RAJſ`_$|r8 C%92Q dcuJi}_#n!cWMԁ*9Dm}1XYqrZ pzXU 0mY,n)uRsL@I;ebֽzB1A7y^NCY5 R' I ԑfo&O9Z$;I>yՔ-wp5'=y`mQ Ԟ ?4IH\O".eRA6.QbuR`f,JY:,#ȔBYɑ23,,EQd>Nn%1Wi<:OsK&mA<!0:]i~KA+pΟux"0p#ytudo#R:.M彶b%}xytq m}Ŵ%dk7O@Dgȴ4kmA=(οic%}T3J M:'҆NjʓI9 Y|yw\nYUx'̈Ш2שXP1$id>zv {~2ku+3_`7l6qHvg,PP ط|;.)%_){tA:}+=j~.HK#p_rJCg_K\IO&ײyVH6jP}'bW#H22j_ p1a/K0g>^ H)eq,I/sd׊;:/ y-ҮRSj!Ux _K4._33bg/I8cu6;Zբ7pTvΒøzP4iRUVa Fg/4b+\٤[nKٕ%:ӂ{IZEZVg.՚ TGH1ΏV-"t[p4M )ݫZܫc8gWHweGh%. ל@&Vi %tDj48J`Gk } `G-8:[X Y[:TG[4 QNP6dX7` 7dAaG*BU6pCfn9 kR+[hV5TUlTPSVz|fs3>~^}~{|~TYtX 4Hҽץt x#>ؓ<),`玗yx_{t MH UH]HeH zԃ쎸Zi{ǜIHLILHIHL2ǏA|DC~ǝ H HHH H AHiImʟ)݅[& c*q`ETIK!9eEW v$I3q/9/$eR-8 G!ТR`Ĺ3T -}X!fln+!@p + 8ͨIviڳ1^,ܻ^EQ_ñ6MS7b_6ú&F7+ig[0"z}Mi87l',?SnU/$)Nq6. MPoB$i$3\<1E9{Oz69;tkW~&A{u6V()ecDElLa!)CB2l‘ĖʰPGJ\О-K%~= OpFH`lǟ3U`ި!(^5[’:fV>ISN)Ch,jN@a/2N35 ]khWDҽX=Y@)9bȳF9 )ydLLuz$49HeQ{(薔ȲdquI&f d%䗛皫RmTA^J5V4 DAsC}MqtK ʼ&:t\;vEUIKGη~؂G0@砒|華M\ۏY|DFF5L%yTS R Q7Jg"ImZ9tG!$$a)A XDȯըYr82WNjIb8#YMc PM-/ dRtTp+S=xX-{!sUJGOB3dy< !t(v,2Je5P@@u„VH II*Vqk-[_4Wʫ ,sHQbo0a9(J9<:yf #ՎE6,cs,1=` 1DY~DEߕhQ홤N<1A*7(@wŠ7XE Վ&>G@H@&1خEZ%RܮNN@&!~@ Yia nKtp&F*~XN9oî4Nz@A{P ><ɾ^MM=J5_}Po Am@K B"@w=n\#m{<<IvR졹?3#D"R]⮚ U:7ҤD>m܅vh($nBM_Al<##I7?W ڬY Wr+nڔfEb!P%"*H# $pm<&)lUouU6m͝ 7:?=9êZ{w[p} !fӨ0MVP׺^zx>::i1csSUA@e);@jK32{K[WkSjB έTO/OZvYU\B[C9[] nM4;:Gѥ̬ǭR7+ť{tfDi{1lsCaLbrl&͜iIC]@^kSs>=ch"#9(-i%|U]@[LoP=i$Y;DP~lxdSjfe+JGW@|VplV+A{i?ilP{T@H;l㊹5F;Ԭ 7`<2?؈$`\/@&YSĥJ蟡! !MKU}Xjҙ37g4kQ$J6*l,I Oԗ^;s/'V.[uAJǼt+bFsomN֋Z(UN1PCRk :&;'N|m^ )xߎx ٣% ZF8tNI)]pO<[mTaQXl1&rѼuc%gZ.ݿzcO%fG:=+n&fJQSHrZeQpf#go)'ԑ[GqhPxtff" u'0! XG9"벞wҧ_̫yp7-cfBŋiŋNUBvd+W2~J«N<<3S)ڸ\(%c!B[?̣,(N ЇZRF̴Ŵ Ubr.)0|$z? Wu^%1# Zz>WY@ ghG=:]<@^@-2[c![3}UC4|LFIDxO9F\ҘgaWyt!u ܓӭp*>l#9 zӹМ>0s[ޜk#@3x9}]_:4ݯQS )oܕme֘>zՁ%?7550rp5?:) AMI5(3D1H@xub-^SB2ڦ6|t=cN6iЭT%rݣ: Rٔ/3}I,V'-$y gV(Y(E=6>f,NfCo8a}`~AiҲmX$ aUt*f*  4b8UY(ϔhyߧ710d. Z۴bpJE} x#7GZ wAY4f]jol?qۏZxgpar%Z]Ų< s;@OV*<_wEPPP1'S]=]@%I pN esC-tG|#QGKemohY> ȰFHpk \Y67)rpi0,mxw8V>O͑<ӝaز."Vm7lD,@5<$N(^B?Ea82\I$mDheQ@_72wpdHI~>sAJjCLߑwϚ 7 k1@* - 0%$$ d"imPX VKMMC Iּ@fjSkcMMK ] 4/]t7޴Sߠ:1ңdJKR9)k)*-d,4eKɜcl'䕍83+ISz"R+ P[`9lkE3rtʙwτ,fФ( f}G R@VHR1.f,jyAII8 4*D6*4G{Z H6;K%׎I'֭c%)*b+A6u#kW'E'F/'G~@I=HE?Tm@I[ 'milx2Y֠,5o%o擼I>`_{qBMyC5ܼ>Ib# o"ޟHzo])cuWG8HFʄmJ|Ra'X& 'T 7<#?]b I擏&ҽG>HƎ۹;&|$S<>> ? <@XNX.Tt|Kdb!"XN28ʻCB}H~Ot}cJ$1|`&iF;kg-ԓ?qV\\iR3,V;ϱTm):-,Hӆ#v:$6&fSz9FugrQ96/D3:vܭI.%8iAIb9fd9T-\bvꮙOf#Ĵ /)O5bĶِ?RRK`LP6΂n.2\]^fz0A=Ywf@ R׋$XAOЈ:`QoTaƟCQbv!".C|!b¶].}푮{O׿ loLd])uA"h7.s&Ӄ^Y]QRѿ|ZTPQUVUqQa)ok)L3yZ.8'}Lׇc!@ s㸤(CpN I}1ZcX juǦSԝ+V?žSMHbmjyْIL@-4Zv;Eܻv4c*C#֣CZ9λSs;@]sYбVC˶ ȉʑ-q!+UXKR pT1|~YgL'tPHFllFԌOe4;e};u`Or5} 9GtnXq8'^kO_4.7aOn^7%7b h@): hqI;1Z^YEm۶m۶mm۶n۶uZqgiI]UIU*n9Za[:É7ps~kGG9KIOuqޮ(]ۦer{qޢ?=tТ\RO$ڈpÇƦDGmFϑ86>53[mR $0@SF3 $@V 6]OAt0HpGa1^>hk%˃'#;Cst -Aܗ6) e,"@7 Yךs!j݂"N)hWp嫡A6)2/6c#B* (!ŵ4 p]Tj0ipUZ\0i:;8l#YϠ9lCS$@SX<`PvU5?QE0ꡜIDhC5%6ു%׸ZD JpKy,\O1[Zk(By´Fj d!#[V&/6$gIS!6116ŋ %n# 1ַ$lUu;}fj?ZU&'4D '%E q{ag"l1cp EQtN 5)%}=c!ӥ%_mlUR3ܩQV) IsdVl])OH5@Jp@h8R0 GVF m%إæ#w*; ϼ<&Aɺ̧χ'f:q}ږnW8O0 CJưTd@ gX]4|HDj^ċ)DWpr?`i.XB$U%5no" BXzXn4E*1UAT]!X:όcE`rjv?W o{ܐy@IFYZC $P c7Yn=H6a3\į@2;c~gÆ) zf]|;, [7 =|% o ض;ݠz׉Sr U?ഀcZ[5Z;,j fv}(4UMdM@>NFDn<ވ#;r GT>P!7-θ( A87bUM,px/>#u+#I.in_*i Z|F} '㑰C&?/O РG.E͖ *v,_>СhEfHчzSy0mMZt(*v Q aeq4&a#Eg#K lg`Kdo53'![Ky$;Yo# ql4Z{ 9]X]Jr=qwQn`۴M?Ŋρw;agk<7^DaؾT{}q;j!}eCuȔ0w)[S`1ַ̇+0%f\,/2>[F `<1IGTE)] Jb8*ސ}qd4`;o!t%.''CFY┒PǞU$ lk 6*/l7t)z$ePu3$k nWh!1KsY%P+ˮЌ;o!Sm$b.6"(F:lat-"UJY[kx8^8<09}X}ҝQhL+).e^…ja(ᥱim% R(ʲND4~63735$@T}W X_y|$c%0! l[(TLwX3i;^#s%l|RT01zFP·D (1%|e8eNr'g@F\2"k|ڡXjC?TknkƷcttKKI?-*Al4Ey,6Ac_ffyFX .iyjdk%*sZ 1duEI`l8U5LkDr宕AqQ~vAMJeEg]V(ZNȰr ȬPCVL{ x$riV0 新5 8K7l [QT̈́ln9 NVT |0.@WDh9B6 @ƢՆ" ؈'nXxlQ9 c jNǹ&!LʝFۤc:0oW/nCn=[mSI5C љ;@RVȽh|%˰8c3<_0>>~?"sOa=Je 8rr">{G1\a?eٝeOOuLmU\!PʁOOe9*gndmڮ>au\ِ!2?rktJwKqrR&1W15\?y =Mjfqt;I+3-;"bI*T/2[5[8DPzʜByRri (^ I^􇕕qشng6*`O:t{twpsMqC Ԁ*pA?匬|uuky)rч7Ea/-sMh?J4P.]+P9t:;Xb5`¦Y q/ϞӻGˊhD.tV>fH y]E]IseTsQ;xwțί\E_IynGCf!/U46^~̞B +2}cj>pUr)WD G5ran!B,XR4ry6=j̨݉rG?z{4,_Ԙ^沞_yJ2_e(h:jM3tbP.]{uv@|^oag6pW61p"|ӝBLW/\DtR'$-$o[쉫x3vţ7c:f7`[\t@ܟr8:d~>J_DH& lZn3b?{DV9$94e 3cN֫iNvuB=J ^|R;ȭ9K+?/]qKJjѷICYit'BJv7Ü{gS+yT)}$_i{D ewlq *>;,RW7 yGW@p3ve|x dgS^ְ2:]5|zV R } ҭd~X~we✳ ƪ0Y' >l^gIQKl_ d_Rf 9|&{$Oo]77W}/:{ʼwemA0XO/yK.8"#jSYA?V(:pTb=fW AIx r\=K뗥o5}Mi8Pgj^0g;8 j.Q 3X|w&wKР#~&ל6YcFc}q~VXz$2rŃAU{ (7/f!A|opb07:"JoCsפ'q/V-eHa0o<c"C(ԃ_|w<; eJaX ^PH|o؅ QŠ."+)'ڦ3)=[*| K!P{L+ |皦urh n﷤/ʥuAFxoLD-Hfg{}qJwSv;K,y,Ĉڹwtbj61^u7͜?]{c\g_Y>ϯ>R$PHUd[`2'>,?9A>~پ v5^f#Q"I1 \D?@0̝ L}c<TYŁz~!NVw`7hlH!f,y\}e 3cȼ{L33(aRAYQ kboGXuQ) t 6ޫ9LͶd_ Z~?0+C§J%60 ̓ƹ5ECe> zK~=JBgd %- |Qc{ 抳@_HӔ} syNz.Cn`?LJF+za7c> v1t|)IfjFfBhc6VɅ|PRTVp2jЎu񔪶ntXVH+\&4w"t+LY=J@r Ćw]պ #9×Xm5o 5<`5O _;EYbTAC\J8g&5&6W\bTUtJ~dCF&/7[ԕϸ L ܤbSHZa+fF0EGROyJhD٩zb#XTV@Tzok)à`E71ޘ_X!?66ƇZ;BZr"R: @ 2` CdEiij kե :gRW,5 "G^tZq )&T(rXYL\.(v| "?IZsAh}-SU}pRqXTCnMF,%%^z)evJ;l?ȱp$ D=mY&gj}76$NϏ1qZd5 |~3 ~dC¾v0 4D:W[c<uuyZvC挜ڊZGa_W(N2(,'>T dҷ`>,ptre>,{#>H6n !w+Uۄ!Ǜ }aq.co ޞ&_ u~$nVǂO"‹^|.n$l[>Ȉި@>;g'8Ţ=Rι~N9ڙnyȬWG/iA1)t^^.Fd'DpMZ9Ԧ,NдA8$ډIv蓃(+`}A%S\۝7Ŭ\Isg{_'!(ţ~$mn;OeP.!V(=诉v4uh2DI91Ȫ!~Cf 64D$8#l"rtTMu?FC2[sF6Ѹ<-5if'i7kĤ<>kذF7YV6ٰ4xt$ZRM] \נ=1OqzycJ)`U쯉_N~?y՜F[FmG`2 lp㆝:ZNЛ]wx$ad2l[$ی4BOH1f2%.t+4ҀmZ3G@79ޯ&h XkV}66-TlkR Ԛ x)߽ 6I&Qq6 Wiq$ӂZe(FHa#p@:NG95 yZ^%sJJHG+>SҾSګ _@ClIk$-DI% V)\>cefC+T)8Q{a* >cT|0^U6TYfA,ts&6"Т&cn/_pIF:@O '2囹Sc>5 ӹhDNR  ]ڄ, u9 ){t VeS)528 \$7Dgo6*(*)QP(Ҡ"}+TiRdKS:FUxe\jx$l*@),O޵P=6Mm&7 ;ר;kuLG/J$ qUc5 1JG8}Bg*$۴FkX'Ӂ+u"QT$D9xUn_t WA?+Exy)T)D΅.3qJu#㰉gsrnQt]GI⣘b#7:5N (X˔(,C=}`O'k` lҎ=e[VRLNhkrQe@ ,+7*<҂s$L\̢b˒e @1kKw%K#~NM x-B҉b rQ1ҢzubrNڦ;hԑ5 ݿN/㐾#V('# ԩqrðH= +K,7|JUq! 7yL|1sf0a=ma40ny {|y9&@1g %}`h,-Xz-˷.M?Um ؆T@qׂWL0" 49=+~Ԙ^Ik,/_aP ! LW+!{u6l;^+$\1(-\MA!po)漢4ݪ$ssd -NȒqO=O4R?6 ,|X/-גL /UxmG ./IGkT38XIGh 2vHGx  O$쌲>HeHU e$(U2a(X૰*JV\߮J&1l1ð8NSƼ9h%ӷ=# ںڵ`գII?.$NiM8xZ5 QiQt%較2hQ>c.r7[I(;eh$=p {֊?}vլN:27^LeL?J>*/hv8RO<|H u Og~Q0= V0j"ej%.j{5~Ⱦ SR[=HK$gQ)뒑uH\ ]'K!Ol$4xI!_*ML2Xj§5 gDx`nzY̭,#ۓZ#-9=\!E#yJۓsiʕ,)~J%)ύ^}MfwwXΉ((p]"etU RVX[F#Tk!СCCӃJR?V:|:%'~H7ZӌJ/r,4&m ,_MsO$4Xgۤ+iމJs+-_ra\~E^m*aM8eQfq ~Տqn"$AUk LW8xV:`Gܢ&l)~NJ;{6;y>1rIp$A .#]j8Ӆmm}VXWT VBl0d1%wyX9)xgnلJZ^ D{8hlj kO_$9IK=/_>M&rOKw3lB{%;͇f?IenQC 1 6qO|vx&x*M'p:* 5׋3[F|8D̟ܥa{/2Lt487e[!|E NZdl rI7AR_9B.! Q%iӿ%{̾ݕ$R<3YhB2Ub@U~X;ݹ3k!mwO=qkgUlXW؇g3#qUr @  3䪳YX!)p6̣2-ީsX#\OcHo k"ƻ7Β -ҋb5kۡ .ڛsұ $\ 6  {ZЋ\E5;ODzn!ĻnII_=dF uHI}vt@ wӆq#V?W`6@/*i˅lh_$PSŪ(Eӧ!+= ¼htv =! YU+̈́?AmQ 7c+CAkgRI(u:kl0Z\iS:$f> y_;ѽLC#Y+=a 9{Pk_ o:n\(Ixa{<e{x9$kD g|F4j%x9 !EnlXWl vBzLc0!rȆQgۊ+=YgaɉݩӮk16i :_^ w7ESdhgF)]h ުgHF%ym:zB Vb!fO6Ija^O) t` [ņi9+V b5vYqE` Qo4qN۞̓OIUn곁FxlA˨c6BG7W_{ ŏ3XC^]-~u)-~d)jmj'OBJ@ #䋇 H+kNtS*I+>fV,Ӛ!4§nI#&1xG^RFJ\FM!zoKp Ͱ!ev+-1h!"ï ߎx"z0]2W\PC x t?mt\~2YF^)W'WyD>?~/q5'񲈎}a^ u",[:Awal?ëЯhVQV 9C)ƛEuz1~BaDH|ajI~ ,u/y^Min\+`Yġ&L7nYYtg˭T¶Nƒd 1& Lv3m dtCա~++3RфQw2Np˪>(qk u[+)s E0!SӴȗuO> i&M,IY爠TR[|^Fjݢΰ/k\G2JL,<, uM $nEUv%c>/ ΕB_LO:`^ѼwOmypfayhiK[39!<B\z?!';baCMzZx?!oZ gLz9oZ8(VoML2A1 rz(ǘ;я<4wb'".!얎M-ݲ"dXdrw+XVb(6)9N.|A^4?˵CDÎ֣,v̭n넼-Y.\5cp,;fQh-B{Vj*Qu??hݿmcyPO)~H Z@5V;CD=ʞȜ<V3<30NA)nT4> 20jl"4jbP5/֤;6+3={I=aT^>~ny橯Q9 U)t*S] Z -J'HmaSQTGVGiD@!$BCb)Y*9&E Q*$ ֝#hiYݽպ,ޏ:(U"ofo{2m~~:3~/0͡N &z3aC srhoܝmfXn8I4`$0Q*z $Vհǩs;j3<1B =Re;6m~+<4 vHL')u{rb.3tN]n(?5"e*45PhP9t&x"L:4Dj]Dc(_No6-zLfpiaV)E!`7ڤ9$l~&#.EĔ$܉|혱 ӕd%3Q g5`7#UHK]9:9{U*k ucxR,kI4sIaPRҋ a{Kxu8錞7jDxQKVRs k=.eȈf,&%#̬0j(w@J_g\@UC}CM`$MBS'Z(\'Pէ٧@:#5iM\0?Hk۸͔+BU1MKhy{:B^Yc@tc0>'Qr+oXJ@bdC.*RsOy~l'ZL{r:;RT-./1[ k)Ր[LB\7Z<TfxHEh[ȇ뵞t3A^sمlVrBTlPjùp;Cj/ $,'[[6CkO// :ӕF}DgI`Y4r;-w5Ad}LAvo:5Bj݈Bfnګـ'fz~ E?qg Ed d [Y&_nY p̢?d9'τ,'vRy6Lq<;'u11lg]M e`xO#xvD~|]rH+b() BY"Tňy3TvaXF6u?9wMss™n3D<#3j 4R 4rg9ggYo\Xb]P6H֒$ӇєRjNmZoqHS?W$ҎaÝ X9|ι ZPr% l{\d,xOj΃b"/-*% \UbW*UL@4{> BrxV?P{UU|k:l6Tt)}/_ZEQl܏gQNFEY })Ľ)gzS@$Ův }=VT_YĘy*qGԙ`-̚T6m)U^B݃uۮژu ?>E6>: :9ҴݢXĥwE!$jDR D@8y4x<Az 08TZ[8]V^$kC$kv?W|b:#f9-ش[<%w 8.4pB;/".:"p[mMAشK&t ˆ_)Cw"j7h46-L,4ZB !\P[8QOG!t'JVr[z¥\EA*CV \V:9z r.kZ2п3 S:2s暎V'wX;Ao*D%DJp%(: {тG <)\"i #>4 V謑68.vhieF;Q) TҲJ:)*g~.x$hm >Fɓu=G+u`UFl ]lYM)`FަꚪWe-jU j_e7,RWRY> =&*)Ό$O_o?@-0J13((OtPti:X Ѵz ݾrL9P-nGVfԀ#"{ͭym7h[pzइx_Tb/AA'IR&|n(Sxj / Qa"|i`nhG]d*m_.aރ_/tCF CwHg gїFI_MKp@c=P@Վ P>R`b ē`Lۚh D\ ]!env:sdM095Pod,aϰC$l CM ]GgEx<͠zH.o LRo6 RSq/'HZat-8S$bc0S&q>ާOEyu_q?K&!JW!{6{hx9[в9 FʅYֶ$4E]A5yx4]GMe'۸BјEr٠By )UQ%bR"~@ȿr{3˓oX:ZA  .JqqlO8ٌᔍE ]qE8 " Y pNmyS[J=biOCcI [! Ye~%aI [aV-3!z7Rؾ:7UؾG;l,?!{7[ؾ}w֯ |{a:wFtGxY#Л@7k?#NGv?+~[B}Y(Gv:E}cMEĿh&*GSnO%Ǐ5ܠX]#Xec:N/X{M?,ёzz74!ZkHoV98Gv>(@bE\TA6ͤX ![(TB1­z|.Gt$wvoV"d;3*#ӕZȬ$ SdM7Ytc2zrP ש ݼEԃ _n7=]g.l!JDipn+ J=fɂ7DxR "z #4‹">>OFgײj@OD¿]t£\]tEG\Ep#u<"ۼFl;=(?NFtPL-{LU~:rÚHL8P#mW3ms F(7rT<Ny,;tNwy@wW:^najȤby: X1ޛc9MǭȘ] oNd83GǢI"qFт%7G.㺻8G5]8fb.{r3)pm3khӔTq\OFӌ(yj/(E]p||mfNF@žƅ:%1bεǵ&Ը&yHcx Y1ӣ7q>˕f hV!MˋA=,/鹟U@a 6q6']paLhY)rirzp%@gF%ՌU%cZՃ.#tl۽;O'ϱߚIeJN&hQZ@ڐeGj=b7.kΫ(mBWgXE<[4v X"qUӉ1fy62WGg#˃t!<H*8K[%c2юIi2/Ik+4^N &pFnK81#RSFGpU:=";=@\lmʄx"]H7U쪂8K ̱E40c9^ Q2oĻyV*]ddQw0 wp[7$tekhN)eM)h'Kאָ4P +aDG_#^paI]ʝCW\#f5qG#BWNq;%h"1XbTS,EݐIE2Rĸua~RnS2|\S4cx~A84{PdE쳃 du\?D(RAǙ*d z}, e'H6pIf)<\SrѧlX\|S#NN$?ǵ¼Ɍ9a}tD}(m$p5*8[ٸ2B+k;IA:T2CPɧ!Pz2"JM$Oɻ ˆr|ێIvS&NHUFI = 1:j5j;iu'" R&Ȑ{:DLgo2_eګPT]9Ggl$}sܳ&җKG w*/D'E"G!YJ^Ĵl|7uEL|2Y^Ӕ٩/0γ٨!IC/vt 1Uqg][ym$gL:[muL#+SSĉ4,͋oLT#ͱ&vpn`e(;ZIF2}7T/FPF)#W|mMP]jͫT tn*9VU*ӆhʶR8!y7w#ڨJhd{ǪƢ8G.6ƨ>NN?$מ:N< &V?%h0|ol(yVTWh Kk/`Wߝ7?Go\<~O/}/w֩_bO(һlV l.(x_afoD'/'Kns<;865̑1 N!jb^vX??--6+\X̛|!aP b T 0"ĸ(9izBi4:s6|,dcbz\8͵(ep `;T yߌngQmAzA$)9T ȣXxjFb_IV^\sQ()>XO5LN(k&گ=P '84hVSAlL^ƨ'L-6II3#P~|9IZxj[4%+@BQ6Ў :mi:_J8ЎdL0Ӧ(4E=)<NM@yom 'ͅkΘ JR3C3XԤU8AnOI0C+'C)hjkZ,ZZUS4ǑMc6bܻ.swHafpC'{kNx @XXK wld/`1,(0W9I46)vL(;aDjp esKc].B 4CM=R5&Mh4Y#TjnY,y`QhP(s.;l~89hK䜩Af*H59B/{iқ8/&Ɇ[T7g:};,21sRʚ Qr]?On8O' *]"UF)KH1lԵ_l2XFZ!C o87B02;' #d jsџdz, ]!lY&إh ˮ0YFW>'OwNCm7ioBogF ;Rj۴eDr:Btm(w;n-|{9s݁])>.DRX'[ÿ{89>zTuD&%hhivrfA-jryDHЮt4=MB/oP*Gr+|UV~\ZǏ1ݍCtV=q+by1Q~AOaO6V`6yCtRr(-L 3d ´H23Ɋ/8nԆD=톫#Ϧk;'XþBW s[؊ GFp ?MJV"x+}G9(q㳥gJ;K+6p1 bww;i :!3XƦXe9o׃Gފw|B"TYX=GI LM4AuA&fYVh-a)s-fjn|Q:Sw6iܻ,"z+g!z3+WႶwۦY@_y@@'Ё4Hj(lvSHC^l=FYYx1QH_lzɰ H7ܣɱ^ɷpygƼBؼͼͼSo}{Q47HBhGlEdyC˟{cm^|/7Ԙ E1)WlIնI-'+αvm^J<e>=!s-OT՜ / *t"?N/֍.97(drr6M)t+rgCG*/u4 e0)u @yp$&7vhFDWf4iS0_TJO]`6B1ufg#vfv1Mi.Gd1kQF)Hx ZHƹK$1WϐBJ\@ctZX;f a"%kZI"ݵfàd6kZfQK_,j`T`7f'Ռ۲Rn4VP7웹Q#yu*JWɰYSxR[B&#XYG%Vsʗ\|`rb_b ;V^`ur01\7Kū1s?usRyf쉕= w\+\ i\9YXoĔFVbxMeM]4]zSæ˨+yS; 횼1ɘsDISmh Jdـ&M"\+pP|2p"Enty{b`.jN[_ >H>J_ןfE/Əx ?d { !D[iʏ(;zbs[圅Z6, i?0精`MYCe8tf7o/6x{H/'>~;_+k+1RF iBe ukv ==;1ju]-$ߨR2RA?D?9,mU^ş8 Hh`de԰Ӑ|4+h*mshcB>AćM==lARZ9j%R(J@g$,%S'mu; gz!, L!gjop9YEXFi֘@@%U?(RրcEgv>19R ?W^F4Ȍ-y ̘:!!d$5uqk#cO"USKفeL=) KgdPhOF&;_bazKsNqu)eyYgJbfege<"dOssl =r:WpHs(2,RnIsk K #tEF^B "ƶsmŕ {/ tCqyA=UC`§֫m'1 >6x[dANa/ sy`qGG㍗9Do^K~4.>a0zP/MnOQ7Z,#QyS̎ }݉3K6BmK82䱠Sg}y/3ҳ!D>/.D_8pN"DHo3}5o# ~Ot['1 _$J;=ܖJ||sdCo`@~oŊT6C%va1>;ma /o/aJ'Cc$%.h`o 'ZWB~t [9AwMl{=JAlK۵dOpB:SiHO~˶l1YREgR*O"h#'-%؍mS4 j=w{*_000a097067077081©D10Mؼ/d$ĥa߲%"i10Odb|H ӈI͊ h5ր&F&&@F9hhj4+)'47^??? ;¥a10AU7|gwW/!Yl Dgg/-u?%ˆʋQ8d ch``PcK@DBW0a"fNvƦ,>B:050;ə~4Mqw_/C!>/ih<<);*/$./C=Q+9-6]'Q3"/9%S)93U+93-jzf`|<_L LT&aaiAY ,p3 .5L  -U2<d$8lyc==H.edU_r+eOgS)2`Ur :=3EAFdfRԄ_,W9F&7Qιɤwo~P[ ;Jc}ELrXtaOD;}*.ڎl4RGSo&Ph,;%ld-6ٯV_ͼ4YߙkA'|®W'ïP$,ìq稅j)(Ӏ#JEyܙMLyc]6x81^.nXZq bo'.FyԎ9+ #҆zA Mr Vyv"Y(9Xh]Wm1RVh(& ⽐2qAc`r/ `iD@4;|^3.Ϗo<áK8Aju1FK(^`Ԕ 4k@=!.S/3j[<ĮQZcuQ+Y8*7GOq$e:l N*11P (ɞ^h0nHuuZQxa((K430Cc> hg՚!sb T^MԲ~lDa ֓6P;~K`%(T1d$=*gr;MB-D,ː\)Z(#J٪+O-,2j_x, V$:BZ 85F@J&D6JM+Ufٓ1in5iC.HbBbU0HP;ofLX@ydE@bAFk8j) O;ikw|?j5㔑zP~uTSwZ+Qjp[f5J)lZ;@!g~&WzM'eday5FX$~Y"ML{bեMjMa8[yQh_*x`h`jb`%?wRs?jR`?~I{R$/:0Dx?H3>FY C@77X=ؿ yt=w4!7Ā#e ҘK%)"N'U T䋸8@R(!q/=|* ^ G'; u%Oմ[Ӭ?uY]̠VbeG'7]ۊTRd#6Q] `n(G1f)(C ofiISkevbB[JuO=m{(5usqY7[K{{ZN0'4FEMn]TX_Y7e - [] eY؃D3ʚ=_!Gq?r@eutj@. ܖgzZej/RMqͧ+jT2ʼڃ-zn?S}],걼v&`MZPxB~&7J$\=q@n̋\tS"m^\jVX쿀l:kw)HyXC_(h#3LDmI "'K|҅<؃ od:+.֚d51mK=R9E轲jǨGldihcej"d`/ k(z&FP*/[fzB?P,_tV <ނ*` ?Nh;]qꪻoh=p] %Maфaa?x;x 8_@t$Cby│7;v}aXpsɃ7WTzU$VDC> #q Iӟ{f_%qs/Nح0GuJ_ 1) Ԋf!!2#Bk#m q!mC7lJP:vaw*ܦWmy/͕Y}Ykr3DrJ[,0fLk]q~$C~/(cQ0nj VB+.#C]|rhS| >ݣ Uh>X@̌wѕȃ7{=4LS0.\Nx@Xfe=IZeyH74U5R%,;u8)H-栴yL]*{?lX{T'aF%Ui]90,{su[ MeӻlB׷^Q[-wѺWWuQ/_mJjokYO(_w;39:xP5Mܬ[Ys*qDHyM%g;NHOAAD;qp'!`4<վ7@(:Z '{cf+nƠ4[e$C(|1# f7"Bݪ5'*ʝ^hn3n>\b⼉;X"ɇ? )!p+%´UY$?gM7a71 )afax/g$U@`4, LW?0{Ԩ*f M̟7/w8Ɍb^qQp6#+!`V>QF c Cç~'݈70"$ǽ(7M)lřd [ax-,0ȥR0W"h{_=s^bE,O*y!IqrCt7EtlwSas<2Ԟ88%"ZQS udenW*GȿWb,6\岡V=ra[`{=xҩ(Qͣw@Å67(wAu8M`AL+ء݁N`OӧA󯵆3 $P?:C^DZ2]zM铈)8 8_=vzdRRDEW9 !M2Y[;#B*jБ (l(?9SY?{(x:՜ Q\l6A]0;'!Yy HagXNx֘Pٕb{oϠg'ҙ: H<3ibZJ *BhiJB5dYd+>̉3=AIYcΜI *p+d)c^68gu_hnc1i{k3UY #%WZ*V&YЬ֝{a'XyـbUOKba)Ċ:"z=qiZZxԥv>\$þ班K$)"E"$Pi1M8jI~Q`I$uUGM<ŶXrGXf$gz;SeM ;mǜ~Uz0y6"{ ki.JRs&>{b$= $_OYo缼l6-G PkFaҴgE`3ҹ#}M䔄bVovܧdY75rOdIb|x&phݩVV奰M0 (2v~0Rx]QCgި!/Pv1ػo>%7ĀGbкUl̥)FXLu2!=j^M7|)_6w2{/89ٛjȏE# !U#e[6lPF1TVFE٨&rU2'=elxrOejZ?‰]\-܂$b[f??㑘I:{B<4QB[L&{^;iSWʒV:&ݓ0so]u+Cfm;f!=Ps&Do#ߔ5ÙN\?cxok-'Y۶Vl۶dŶm۶m۶ݽO9}ߕ/j̺kU5JuoECBڮWX3kj""{R|XKӹ~wUeZ w2HΕ(ܠĆ r),A84¦-^M| aC'hWCxQ+X'^XSZqd1ǎKL?[c*U(JOQb)SY[ҙ5J@/C ]tdJQ5ܙ_̒ΤzS@k9K"JeJ^"͖qB>+]_M;:. 0[;Z[;@F^ p /#po@qnfq\|نIqev\yFeNy= n@1v)o3{0mo+=V&UrJ.}gg-T L&&Լa0YM6o6Fǝ=&_/3tX6GX v2I;%*Z\UiiHɀ\[̬L"ʊ* ͜L*(ِogӵ:*﵈̽m78[CKO/J8w(&ؼXIt K8J 8ʣ:gf/9f Sjd]=>9`W5yoעvlv/R~h`bcsHBz;5vBmޖ3Ӧܣ3uһ@q-ZipY& v 9y!}LτhnԬg&R{AGa;\%2Vd;ty9m[5`Eaq\(S1lar;UBxag6 X]Jpmp,!-a#Jx8eЂ&Q%~{' QxJ'%riF>O%hIyDB6,.%leBe뽚Q2L3;"jb`N9De[2 4EMkW ȟlt҄bûaWAr Ȉ4`9MNa7DBgCTMwloހ2Pch?ea-;% ` O ;:[=aReiJ{[mJ{"Q ٩*~ 2G\C9?eܦG`bDO-{ stX 6IXrqXH%KhQanfEs0ؼ99B$N]PsG6oJ)\Q-o~iDDxWF,0 i";YT5T'$bԭQC03ЕR-N7*{C%pck,y}PZhܾCM{/sKG?<%ԭl-N-d@O?;Q:tMvt/p)颂]/g4Ȫ+. GS_〿^lAZi;Z(BmunFDƣ RHxxUL4="91""I שȼ䄆XhRG|Hd}MALa L4yɲ89a߸@Ro6G>_dP~ EQ$S,S3RxbfqIKYQpx]>ZS0󡉉&Ube2yvqx| #z̥ĸQ3 ^M 2 L4ҨCLC=t_V%f rKbq9] se(Q'ܫiiJ Δ2Vk{YlkvDDmtQɢS:RRR}VAO;^!T8WkQo{}'ls_-Y3ԂrK oL/͆b%w?`GE~:%"s69Z/J9 64|60V%pHXOoj7Ы^gg=+f!sRX+3jQ~Sd_!<\4WEy-7y"%74,&{1!*b_;/88"Wpy~E.4OpSBQI+#֨yھ!IvW~#D"g,Ԋ=J5k3۔k xpG MJ/r.;x??Td ~{Q^XAi$t)/$_F#JՅuȟ/nl1Y">}Ԛq5uۧ.\~qsbґ/\"9ٽhQiWn+DŽY򍟯[-]eZ?]|C,#prA%}xRdZ Hkx k1YZq]3+5*FGd"CMr֋l=SFSJN}&[JljtP bb_ H@1 4F!ND;t\.S+]5P%Sz*C2 wq>8 UPe~gf DsȩΜh h7  { > 0  7-ŢZN#DE(~ R\Z w.-ȿF1A=Gu?V!}vX[:b -)4i4^ńĴ q2|tՏv{@BBEH&SiPE[s鹍Qu<R;ẘ ;c΢<gyP}ʾyd{ Xm5I6h`ze&F1$Rʣ2aB4ǻ/zJ*hvMZ&gyU`h$0:g]6gR(KP)tB1GۯBL.:6lq(B1bK ȣ*Zv7= ŲBw/L6_(2 zE2*f* P0_#5;͵PȉzVJI_'TMV^hX•ќhh`b`1*e2iB,2gy S2dAs襰Fw,غe:2cGDzopRB#[[Kꬰ[,u.lrbkɂu.}[n61$2d\j2sٷ2>i*q~~ T쫣ROv6ߟ??\n2$IK̗즅s$EZ7NJQZ#@1bS(Gg?pnmF5Lg,x, F3 ^[GF˴C;+> \/xG[  QN8LQ<Մ15z׌xXT P'\F={'wMҥĘ ʯ!6SF2ҫL=Q$,D+0(Nݞ@/p2sQ#Dj.էzD9;ZǺh_NyB` oJb lI&5 0b ]71M7{)8lW+m@+3+\mT|@!IwjKĨ(E{=kɈXZχ,R ]sk!7Q6Ef\y«*k8ysNpgæP 'ym2HO74HBQy~p̢#$d({ׂ6Ўf0pbWpDrq(9ӽ&<;~UΧ"~%xinn%v3SU,( K;l?'>p' pRx !t)!xZơ1dyO؁)x+1?KΦKj.=+F$>Rww7%9{~C= ޣM]v@2_hE˫G*$jI1uDs~D3̰55b&D*-PG(q]݊gq{{"}3= sm' F)h6YEj5#ߕz hgk&'"fK l@Oq.%O&H.\r(֭ck:eMi*ܳ-NCmK={h7x:+ e.էQgD{ğmF}{{w Zu E =W Qt% t[c}pCJ9pD>RӋA9X*kTmG[a8I*>ڸQrnWAlc2+[5&|r s1SdЍ{Ũa»4#/qE8xoOCmO^kB!H҅!D-T9,98)H7Z#o[%ȊUƎqX순=tVT Z52=cɦ4Zf!7Rk^ +㢦bopfl#{"G-X[kWf=RڛGBH1l $IXz\PU UVK.7] A:dhfxp¾!ձ)qhѬO&2LCca! x;+ ylQyReX4rHΊRn̹ fVzWPrOo5X4*aD|(q]Ɨ¢IӊyTYU8ڨ!?o"PZ'Z.iU5ʊu@3S 6kCNGc\S-|f(лRB0;P$qe1rUP*}dA=@|doE> 'K\Ypg"oMi_ì-nY?6%wM mj~}Ƞ|u+}}+Ӹӎ#9*+ʑw SgRX[QaR+)QBB(u* F.Rh/S) bw܃vȡ8"j vR`adf8 u4g/&U IG-z%t Ssg@o/Ƚ1l8k--9K2]xD`-2K~! >go`<1eS}e(XjsJYY^+W|B<H6W$sPMXY)cm"q( o%2l/1䅗Q<ā۰Sgdq)_#_ HE9"^?xֆBdve{C o1W(<. MaM@;S$u;A[~ZdGd0vdWVH+fߍN`75$It32*= ^JSZMNX׿8ኙ0t#Bۏ)a<1-;ydgq_"Xl);2]V18]0 V8A6_oA}!jnFXuxdJO,Yx]xe!Ԥa+mQd+a>5#VW,{pF2!#.1K|^v4/ݟ8r _oƑ772pг7N8&K)8;CBY#$%%p:+͝ Iinwn0g-yݶ?ܿjjRTtu=aH}-*RʲXt@hW{lɿbS t#IT˛܄vF,ia.8D)θsyj .p2v|sV./jt-%Zk2b[~y^ƅ{koU{^v9nNULb ǾZfc#-xU8Lܛje- -g7|T^ԴR#sY/hdq s@l NBL\]@AP$"3XϐxRCeуz$|<#/VJGٜ9R[nFyJRͿ6`Y={G33[X5Iǽ ;i l|3|E|DpE;]\[+zĘ~3z?H, JˮԲ.d*aj:3U! G׺-3W{>2zO@sayn?FUS p򿽖?WSAA`t`>Th"3W2riEkN<ėCu'DTbv5_ `>k?Eij33:oElcAν Dcfc{fdQ(/8\cV7$֢R( Ƀ݌n]&~lb!kZ62@kS #@l>Abӽ|/+gr!;ܫ u8 ׸1 ܜp 85Q=p3B(;vD"y.&R~%$bȠ6~bjI)6htGg0>N??0U\ a4x|Yޒ2^oBjFG7 >d2Z.AbFaDW0#)Ĉ"?@GZpl!9|dZ%+aG~RY1@qې3FeUM 󓬽!Gg vHℹfM]i6urk\PR W()n6pN%-tpJO^xʸwHiKBB?sPϴ cˑc/LR~LAh#vsO5GNY1YHq')thzzgCq2{$7,H%!ڭB'D/-9q_plj \q L@B)#G=,$*[,{iA 89c)ZVZThURvc"u?g$xH_du&/FROu\w$]|p*jD:kH !yMScS:${ԽzI:B C+:+_M^A0F='k &xV`Nq]iFں8:-,64=FZS2'<3%!O6i7^ӆN r8.^fQ 26 N RƆ]#`+ BuΔ+"@hEc9*ô$N)_ہxpY~5wPVϵBJ@w㭓ʊ8 I?Q‚n/Ji/kSYzfʬ[PCAPQ^#";Rvd/ga([΀{j^xiޙdiѴҹC/kvo$ya\rIEs 3c\B[g*OߤZHyUOS*%ȩ Ym)#SKϨkHXfoH+n~b ?b_l<9hfkBshC m>W9 ^eMas|LqSŐbcz)XQX* `u.ȩEmcsa L|Fr.%) Bc/>siu[jnW3br@w-BjEGeFo^6\ [u0D_ߴ3OEcs$Mϲ*<'C틈LRL+SP ϩ n@=cT%rK6DX{ }Ir1ͣEEP+cyh_pŗWe`N3Y݅ JʷqQ ?!1NLHdJf\s2H(V+ʁ,wY12qfCȡ-=ѣ+B@oaÙ4okR.-rt,t`Uݧ!v2%w h9b@pO^MVvOs{-VhcxTgc5+]YAI 2S5CsX&|| W='#{]nPm\SNm%دQ[kr34PӪuz|p; ^*@Mjx|+0 5eOg`GMǸdf`DB%÷3XICX346#|ϏȌmK_ȚWG5Hѝ %FFI_ ssrv8yC⼢͌pJ'(!"\L= 9LFD5>=u/n ~wp<(+<؇Z*Q]goD({ s SpmS,mS,i(WvC/q{g/?5zL]U%9aX-Xil3 F\J+>%IIKV" ҂75w[E_!:?!zƫl5_yя^Ք^^ Np!ƺ᭜%YrRWdIVH^T'^@[o8.(H0G~~a[WNOތt 9d"J(p}3QR6a}usA1Tڬ}΄-Vq VK <ډP1wE`l#?)+xP8_'KacC]ruќi|sg]x}u ~7keg3_f+W[rqgؾZFiz o0L ̣<Eu9JYnlEt04H< sA@@0U_MOFK:}`َE"ߑMǖt@.כWY_.7ad3P\*7pշ1~X{jq`z8ªtc{}9fښ nGuxXmSqRtU0a4n4bdo:N5Z.D!h@5}@<>La/m2Q M4D*O`}./-&gfXar_N 2JDT_XVK<5%r}ЛZV]xJ/𐏒Zmɋ*Q\Q Ԋd z)ZևnTE 9IlRAy'Z=`at ׳q$+kvlВLɾ+=4W?Cnȁnx^8ݝl9\'("R4Q+Ύ8T(IZ$~9̡"ct&)QfG-aF 5Wd9 3M3+ SWsPBpKL6c *_ME:^FVBh:o.g)Q`5~JPuoiVvUF"C`.x f~@P|Gcdւcը~^Vc5G=[H] Sd/s5ȣ0<\fm{,T7vRG*1 S~mŸ$  _MM8ׂ J> n&~P"=c+s75i~ꄙ0Pm]{_d^KX=J'r/s/<" J3&D~%mp۸E#gq#t1,s h|=Wܶ*1bIZ~zUc"!#WU{lW ;ҶNYpr#Gs[dTbGjf~OEg?XV`Kchjʠ0KoJl"OQ4rP[#;J[.=CG`%$?a˸xq_as;zRijJȅ֜ u͸8wj'՛C~XB?[/kd\bgm>|@iq "؇ ?!B$*I #b^FC*$^GśRDFBa6݁u*Wq; wiqY#Vyo&f^P](xG=?BXiCɎ6nȵx_ң'H}xi\XJ(+:Iyw"(y6A6Y^x53ݸb:gp]7GE:pE[dʪJaZ!(CCf9l~`_VWcl準NԻl~ j3G:28hǯS8%e6'<4ReH l"}aBhQ!m$ak`Yii\X!8]a璊fp_B#˻Y01iFݧssۙF{u#YobR>ʹ-|Jbt'f4Ae@7 .{hDD䀁ʿ,΀{LP8R!yF/JAhb̏DǞG!)8Qꜟr<}e0P2MfWXזB|`6ЍVmLJɊDM( Sa@NkQ4+k01#Kƪ TOS:=EA]MPibL?p/WP!kHš܃M"Y`Yh </LN @n!hK ޖ]i8XnaFI ҧP:a'deQ]h1y'+2H7Ijh]aC.65@zrVyc cf2 !#xL\jҾ(3!/Z{٨'$kK-Yւy(] UUB tGTj'lvfL!9BRte0}KtCvE쎒;MQ-Wg!Dtlkb29ޫk5fZDFaURi29 ؓ3Jz E3wYa)Ybv_#ɚ`us?yI^NyaSڊۆ#Dq0 Ds_K(QA@p@`5|h 2eUb 4|u_LXc@w$WLjjUa%]Pޥ|.Iܼ}$&\ ZrpTD+ =:~³1#'\%Յ dO`ۼu/,<X.Ɓnz@%x|ܫ?Nǁ`0}! f&0k1/<=_4o]Uyt;>4oWbz+`.қiج x|=a0"/*~_:NtT§;e:~P.c ݺ=e]dH~W)Q=YNE0Fd$;IMh-.Tz?*T V)+2oA׼~/S0tofӶ};piDs=dbD/'.%jP3ӻ}۹fJCo~Ok" M d#dxTЕCz)HӖ67աmfaW;A4sp.;)+yY o| Q ]Y^snn)?jI IYlTW]gH>2D{hEyc^ѴJJb6Ll __ѐ3+N s$`P:m-CL@| \o^;!<&z&:e=p ~"s CV2^)!#62-zYU5RLH* g[GMvx*)qt6ԍ0m`i]rzo('NjDZjw=P_ u/`E w0:tE05'F9-|XV}?a A (t,7]RsE^k$U5 8i/hI_D^"E*ж:Fԩm~иԔӂ`⑲ltfᱪU_?')UkuyuEr&. 6p3居e{PI@~rh qhaI-r vݣN z}/W^V\eO>+kx7VS:VeN9"OEa!';91}.v;X!2 }+ׄwb.|b;>^/?y'"jhwH)uDajlwrXOԽ*r00#/W0~D#iX:qaUHbO.j0ʲxRKHP*m$BkJ`H%~bmO_ HZyX/'C3$!k |d|jT-úI0ڐXjUYma ҖʺŮ˅{qX7EKMn.EЗ<&kk,swkB0{ӞM삮QQȅc M{}ȂG]Џ줆Tg֥SmjvrxF0)cGE=JŌ&2ah1u߫'I4-76ض&%GMz/:f;P_k I<[~BH,0Xc V5N:X/S\Pr)3SM [.Ц#G w?@h7(K$L{en!r$!fԡ|q0HwF%{!:X%at*۱q tU.e^!|N3K۝w|&#dL/ ڗ^}aV~/ B8'5B<YN 10ߒFbFv?/6L. id6NuN\ MN@*SʸSѮ(Q$¸P!rHb*TfLUtP2TEf^B STtX)`8&a_\ \e/mM€&M`& cjqĪ﹐Uw:OAhԣčvUXjDiȵb ,y iB Zf)T{/QylWis NP mE0s҆FyE)o!-%8 ^?,QgE,bnН96(iu'&d$p)^Nr "%8)xMZXuKŻpDen0dO~?zX\jpNlCV#:#w;^Ep'+x¾JOx\O„J ܷcf-ס`PSL!L\u:z`~;s@sVLKC94Ɏ(EZd,2;?PwMm %Et@̸Dp;#cLm5Vao@_@B%@Wa!+e M]\qEW@e^]`Z7 /9w5Ȳ<. tȒvл #+LCjDZX~uLD0 0=/%AQB+ɼ(13ML,1~ňk#ޣUk/^ȉӘcd^8>:4,3BR./U t$쎙/_HFfIFذtYCoF3H"1c|pb\)Ck~-nf֐oMxRG}oXKV.(*POйLf  OᰥQdO4S7>;;R̓Y{W$n6Fky~-wL^|vqGxnǟG oU8G8£-p,R)V\Fuqu#U) XX0+O0A،ذyMB2rB+ޭ0KBAbTDuK; @t[lk3K^D֭̑ "`}ݟ j4ng?~k)jV8Y(W<B@Aq5~4T p^$ߡa[v^ +2&,?, ֊cy3?1&jJb8CVCh;_bMAKZD_YvOCؖ>XɴW:Jf6S{1i/tnuxlZ`}fry-@˸oXB\=N2͕6Wn՚=c29,4p@ KI@H Z4T~b*%@.J`8sOFv[1J~ ǧ|K 0h*!Z13VWC^GҜR אvKՖM‰y̓yX6ceW|πGJW{N\$Ҫ/}-ӄEl~c#B i0EB#ËCN%Ǜ;nbs|KE"TEF">݅P)NN5I<9>і$AeM%@+(X5W⸹}- jUEnv2o[r-I̩I_9幎1Oވd_0 ^:\U,bPO0.Gm {º<<q AN*P sY =ƁIFN;y:ϧ|*g!,jm!/$: At_1$PɌ15BF7a T]}xFq\]]u1%}# ;*A(30ՍA 훲U QhAD+u]U8ea19FecGYDH#<3ovP`v!z0΁q+Y 6v)\U1- yd꛴KK%䯱 C}R-Gut PTT&U0Ul P*mOض43j$jFjY?Lrk+ɻ ~'zbک,k> ?ȓ G# *%;9D%DalYhN|db=Eq[iSesUVQѶK\*J:EM(CrM6!K;T<Û% nb8p}9 Wd1bNT1)4N$_jdftТvL|r*} D;>u ' l ϭ!׌J9RY6N}82dOh\PWl2=16kcQ7nbC; L:eqC/Ů. LP%df$.T9UMF =k.* Hn6,sd5Q4Zlv̴ QR4UQzؽ+%-X!wȞ;(COau$#d v`j'߂;wޠn%F"\3ze x"ø@GDQSe {JfAv.+Ç_6]4Փ#˹8HOTmͯK1]pfsCsK90wc3Pt?ET<꤉LrPXliTY#5aCitt2M uOePB C!ZhhjjL=L(+$<؛.^{k1>]ph3U_*#']NuYzĩ#K`a"Uо(2o7ZyYh$ITv+nD>JD]4jrC&Vc,b%x~nUv0h]#sF>Ekh]BkNpx茝eS\$T\6 UTo ;@]& C;_DT9i ANm,[Ϗ&<J2t(==Zw|6T۽T:,C&tßjx$4.veO6)Q؟`o)KMsbdTZ(H7ZA/;qv/"|9ctʣ #Ŝ纳]f}4wMMau77ةzĸ15i|Bm0B֨ 'K`<:^X_?Y(ıLx}'mZRcWGXAZ0mR?)!)G_Isg7KmZΏY(Ñ#Cr6UX<.J}H_dWbEl`o& sxE+)*)i` sG.k$%I݀EI0LJ pw 07}bKM>ÜY[qJR|+u4yo4cƂ^޽g^i Ig!mؚF-" `=I馨@?~C]N'4PQf~p:cCC fFCF QIMBPCΫ&>x5ȑwa (",b;2^~8&/P#s}ķ|'D#0>dJ0w%G={ ^qFQPnWlKඥǪU- m9Ĭ&6;!_dgOϷ-sb(7/Ol)oCv[w:Twh3 ?]^5"T8pIr6``07]{I=P;7 pV\ZU}!z8rCjZ[5[`7|Io gE<}c+/2>NslWȴBE̋Z#qŸԤStxTlweNR# (;Z8RTaU{3#1 &ɽD,i |і_p> 0w~;^j:Dv%YۑaQԱdHZV:Ni{ BFUDɼAgKvx]bySm1 %"{U%}ѪkZB@V6&C(숙J_b݅jCItLw筼~'$ަ"V! C_E%Ss'=&Ҿ3el}p޼ ڀMY6*z0 t]Fx8P:ck:q"9$%ʄV MR"HU5Ă 3 wx@b]Gfa zRL{~u\h>g},uG&TM=5Q%̨ 9,|'J]6[ Bu3z.#Q-mՠ Ő9"SY5F׮lE;Zz=?pZN}R^ݾC&Ԡx(PF.7К.ZФB[~Jlx.1^Z| E4_#ڌ=~E[>aF<&\H曆AjɺCD NOvH͝Wo3".Y#y BqͺBE*^ X,;9=;{22H"Qav'E0d yW9US}x2h(H𼙏;"Qb`票Nߴn[x.ŶA ®XB_I٫û͠vآfHŽϮL , -BuzO+o0QtΗx#-qRu[=G(zxߍ{:UkKZ}oy? ̐r*bH%Qf$p]ώjj~O(f[d Lڇrq,RML` F =_q< !4b90!wiGeg4*7EK6muqbjJn.V}H02ٲP+Ͱ35D֣(a!cASɡS9}KkោY`YVXhNFkqm(5>hk7dA/(_kZ}B^7}2L%C@= XZ8}hMAJ&OT"KHμN H6٧E#'sоB!ZrCG4}2tnM_Tx3ѹ9mPgp18aѵhیHt 2|jUhJ @{QqMXcw@k TP()MӱT] ؇#ecB42#I,6Σ4*W w]!SNY\XG xI(%rnILujo](KЫDh]E~U' ,Ֆ]+"D`-M֑f>~cz1!Cs3E'ìZ{gȫjKRd&4&@pH4A䷦qY.ͱُ[1_WSHD!~7*,Dc֜;NI&պfTs&";@0o`+y%}чeݐ.ק*s 9_%FنN Z.sErNejEn**32EQ^LcY$yxzM~#f"U!KP8f!s;#;pi=s`I%Z0wij3N6fuP_{7FQ9nS0"ˎpjLl7u7SS$UlW7s4[I POl/u>\PڛWHxRXpIAN5UJWsv.\xb˻4av yfnODLȘjwg\1M{2^2Q<cz)먴>N7l ʯDW"ed'n8.b ;0'ƌ¼`Cfvlb(Qt=^dUa1^ɉ*ʃ7ykѩ(nSR%d?Z/ ;gdhOA#[Gӿo:a~f ǤhJ^D$aX4b٢3rLOL]Z٧$*>\/_8$nĦҠ$<}/.}ID ԛ\qNĬ=563G4e\bGbek!k'J-{j~~CVʢJ>UZߊDn!kuP娰 y It\T4MMWn6hLIn@Q85[axGؽ$͑KF|~ȭs,H)c$wmrRk> W "Ûג@lP;Z~v6è~uj#+mŁL:JV3Y@5RTxLD"pt\4b̥w E˗I4jBI#c"FWf*qo]_Z%x'iǡV]ÜUΥV(ۿV. )6d3KfFr(4άHj `!) IPUǨP(ā*C~mdR,S/!-!U b w[-s NJB5ڕb+Ɛ A[#B /Ć#!͕NZMl4^W&Y3*Gr^#"6pcюɳ }CJ#˞wPfBp?h FFֆf&cH-Tfh(~+y]FSSGkl= d_)9kAf/D^`<5a˳xHdLD|T/7N*ˠ(ǫ{JRX#%GM7`aH_Rtǀ1[z0-uu/~ۭdͤq itX2W]j%No)aQ!ٻDKA[s˧ޔP$tz4,_A'j!8|<\RC q_\Db7?r Te?`\'ljd?R@z[ZZ5m*t|b'rA&7ts%aQegNDPD܌]2ݎACB*p-1*]]n +m.*G1;4&gC:״u3meϥaR,-|"uv4mϳO"t6ϫc6eW]Ngoa>6a5r=Y9pB4ST Ns3U_=/;)#d[FkfGRuIX@2Gݺ3C:xQ;1?{nۨx)@f]]g(lR9bث(K XE-'g9'=€D7㶏'.ۏOQ( "zJW^{-b1;փUE41o%nRdG 6j>2XEq)>#l(ThK/+1zn:;$4t B }h }6vqZP:VC5n&ÑO9-]-Ϸ0?u{Ih@kjbhBeWeT߇%~:>݃) =mWnps_o~.nxd33 :J>a \ 0rM=Zaa:{8OA^I0gTJI*j.< +OfOKp#'Ї$ )aTp*v.u&&6a7fnQQ4]CrD+NI'dƤ*k׽O99{GbX ?ka:(t,X2 L:t| nzRq*׫ &uh,ȡHqhryVm 1@x%|(_a&V꾭J >$A1z^J1 E5/IhVA 38ay;V"s* xC[Qm5*a hBȸ5>jI9}ʘEa_k-7+Y[X۸XϹܿɉr/%>w J,# (_Z[?6nnR#!Y(L鈹<}1_ {i:cSŊ|hAT\KwfY&6`Y1; z^; $byrSʺbYD{{uCRɷ\#W>ar4}Հd,BwF):, q}bN)9X]V9?pF\`+=0}ݛ $DYzQOPM7Ƿ7kT$g P4 _ֆ|u,If\?.ipVl۶ضmY+m۶m۶w={~=_וCRG27ptr?ȶmL^Uzm&!X’ YPS'Rd b'V+̢.!9qNȀ( N0!1Jj7Ӥ)bCH&tΤڼyA@jZ捹19&,.O"z!g_>+ޠ!qd&oKaBjE2G?~oDWvN )\p!hـ "B\.-osK~?_ a%h<=TWhL\J|x܋"n*7y3=ijCKۇ5qLG6U+wJ2FGob9[,;|=L@qaD-LQ45vtZ8ĠOx⼵:.L|1p*)&gǒ9P0*#' ܕJ&79A)ӵFFVD ?ls+rG/0T=}F&A!}Q'EJ渤|D^toAUGv]<α,lɺNMni$1 ?;j??IUh .heY+yP·q Exw LݛF ex"pҳ!93q?O%`$iݞA'!Ԉ~`Ax]8F/j4՛OCb}4aiJtmTMPb޹x}o GWɈ Ll&& > K~ZjI:[EK}^cքGޔ S-@&75on*n[=[U QKL/|zqZ%.G)/"VC"Lq֤5,G%_Q}Σӊ x(ta/ %G5Q&!+yhC, 04!&KS|2-|6?WF cyYK,!?X@gTՆ."_ۓhhkPÊY=۶V.@E.zp0CTD(p^:  5=t:1cYVn tUq(?nMP+\f"ifo9\W-4y(V &,h3 Nȹ~ \' rIXn θlMY,We'7AK*i0t${Ca\5Yͥ{03:hx%޸}x[T,珼0`8l06 N-}bymD\Va71Z W=Wtn·+HD'9DDX=Zj>Ҧhho n\\an $w+v%'' {^7$gR)&q*`zֽp@g b06ĞG5PO1Eg`o뚬,ᢳ156n׹x&H j2iW-+')FnY^mK&TG'bNe*U>70_,'dHw/Gߑ9sQ~f5kr-*VP t#>Uc*t8Pb EfaDQA56K+_`E#{lAzkJ ԷG5Efgje,:G6hM#pʇ8y"_y7jl 哣~%k%QcO0.5yp //DbЀ1]TqN%//U}k}cp)FW ϫLs@e!d"Q4V+5AE ͡z3 i]12> 064qr55ٗ OKOEY .Vxh(6+sLBd o.υZ[[w\7ѿÜsz{F*J{G` 0ǫنsg5>| |ǤB:F(dI#Ty3 Ɛ`&sQNc;i؛;?d}hOЕ!J[jlJ!&3nh_Ϲu2"s7OxOqL~K'JԮ@-+iOmNrnfN`ov3(TA$Y >|lMЩ$L`oÊhֱDzMk <=I:sOTd״OCͿRiXoD=r- E=9LL@ _pQh)~OBiD=G+S&^uhs X(m-\aAic"e%ؒ*1&tӎr^ o߮Y/=kQz-Fn?My~^E%3D"h;XIbLNDE!6BJ GR3|BRǸP[!5muzdێOfպE$ƤQ%4eoLj +<Dd 1බN㯯O ),`KV++Nr}IM8 7}""CA?ah[d=H#ڭq|f)Wf²׃_X-v 6Q?~F#& Cu1:"tfLO:V~Hs#o= n[S=d=]BѦTDME@YD`oL響l,I\dǢ :P' NWka^4O׷@=N`AN:8!j^,ܦMhAo zJ= %i%o[UptM+YDs2kŽ(eo9?u ;]dhhM2I.dgXxRCq4[& wO"!,O$ɝVv&7v \PEQHnR_[B8 Z huκ=r &\Iuc9! Ϋ@p߱i)kx OUOwM#l~=gUhײ]EUpPO-LAOoSt~l-7`464?:v{$GZ!}"f~9!~뗄L ]&Z>w1<iOBYJ38"Qu$#ejΕ@ohGy3KI/r7< * 3Hkv-@qyk?Q:@!Ac1P ? 1zWCvFD] bo0g,UoO~p񮠳LC[I42\ T# EkȓA΋ev;'w(OWW!DaFcQJFT1uYŏ]#6}|l-ʀz@ Ȓ"I~Zխ*<0̝V2,@nU f=X*Knqu{[ضL;SI\Ǘ(7w$0XpHb25[]hИ9R(RM#DBz B G¾Y3ӡ!(rV\+?)siMX1)Y)~5J^Q0e25[_zZʳLlE4sW6bPkˆf-I6.[s9r?P~&AM̡$&h> :NoZͥ[:N09M2^9~{\T6+`|~vрCA1яuAC0} V sg:2a0CKlcmaN9{i )P**'0- hIb8c<'֪*ug閡[@qV8cDzٓ?SF5A´vg-RZ a|j|Xq1Q[C*ML)d=33߷.Wr[P˴Pj = SD$ӻ͏Ggtb˯ w;7ӟ̟84֒@.O0X[D64Dߛt0? 5 {ϟ㇧K:Ly}kpGg* Jՠ%G 2YKgR3[_.WVN$V)|ŚYڹt$GmIL~ Oh3BnCRPPSB&+JK:|–&,3rRrMKC]G1e|LFMK*7ꤟjgW2CDzF/>ȝaO"BH zנu'.°>kqDWg!fc/2BV*0ZVY7/$WZAjsvRz_ʼn(bY+FxySp-yVL:>f )@^\oEU|\n߅)ϯ1$:RY-]ϔz44Ke^R;K Fs]k,f7d&%B@b,Mҽ2K'(Tp/MtzCTw OJu'N.UѸgeύt{iD :RK A=b2Z!τVb[ϣ9N6#P)* ŒpQyJ5X^k *ַ2A?_k$/,UN<Jפ(-OHQRI'EMUçqʰd0LBK`sT~>A n싗72QIT~@ω5У4gQ=|Y)pѭ5{};0S&i |-O zܦ'{Cθ`5|]O|P)g1~L0őfĨ2$wKв7wܲ÷9v0-hW|KoKWv0yǗ|B38v^w{>-^h>go@-^xX7SA-__`tT?UwY`tLo@I;vdY>0-*1"g$ "Dcj~*-SwLA}ZPy7S rtU[~ixA@*]/Bu5J%{k2~ DkSk52ɓH6$pS0.h"7/iCv)We}(sHױHgv}ULs{?>A#X1?[1/X+INi~O|_I ~]Hb3dG}/2܆ j9ͤ&2?/ D\COQ,8hS'ҒKY`}_F?%Fmڊ4Tq~N&JCǾW]̂(IOΆu{ձ7h"e,8C_FW=%ib@XL<\ZI*vHQ8(a&͘eZP%ܨ'n)h5MgQ0ɗxL0lLI5j"GT5xBJ@[j.o:oI֕L_-]Dod^'%O0 Ϝp;ؓa:/0dХ'<9}\`)Xoorb<1=<9O0Îwr#}_dJ-<9.0K (ڭ {m&;Gq~ܮtfYuRNVOD M R2|`EP 1qb̞^v]j1@8 ^ܐʉp*%ASuŪKXYVDrQ U vIVv 5N[ 5&^"D5 TX~XZRc2ħr\@t0n!6C;5:?ZBdV)n֘Ew } jv1AW݁e (Tۏȑk53ڲhC/ؓ7*iOI* tExR-jBOߟ2'J%Cl\_mj^eH`ш%O^͏d.)I1$H_܅:qLny@ҟ4p'3!-&TT8$B RϤW[ ~{^91| FΎ~ lt?R佘;:h>l/lx,_6AK(?6 &DPE Is +СLY-l#;\ahv,vI$zXMDۭ;ˀ{3턬-5v@;؍)\luXaxz$AHڸJLhW*Uiƶx`̸)J5Ðn;-eK)&U3 rJI MI/}mF!6tjc޲+lec\ޒ!Gf]op4^>)F7 H`&i/AvR ҝ. ޶0l\L*lw#qʬ02c"/}]&bK-'Csp3sgtC'XiLSVF;9Az]18 N"!7yBh mSsL#Fz@ĔHHrL"PD4B]k |"^ Jl;s=ΐ1Ñ-qRl_LiD ?!>2 0 Z&{ 8D/=H6EA}Cc++c#ck[UжEGjT .lpvYMy^ PAf-VbFFE9Wnw}y5z~\ K i"wEzq{N;U}bY!:Hg)(Zuz)ȳ/W0֐OiBfƒ/Λ6ԫWE>'R/3^:[*"E_K\E\_xלq{iU|Z{芛;i}jçniy[^R|Y `P[[P@zPEo&i]H)1l]Y++X\hϭ`X]E@GrJd o*krkS:-XN'd.tO5##5 K6C|,XxZVm@r^n|oػ\G,#i)O."ʼnd>]zE@32fљnxn^ 8kqU0…n‚jibLx:ZڹrTcf7CZeiW7XMźat~:iR=k<. :_Va=ӜGcڝn٣Ga"Dmtz^p[qU#洡Dp%M[맰'fR̲a-Jn> 3o1do]N)P!Z#/$Ìf&,e>[k~| #Zz~~in9xi;|kA y=I:ZDŽ!_\u=(" ~ >u1 Yh HMYϽº&UȆh>3f]Ov!7te +tIPtґs1Hq"X|Yg.G䴀=W VQ4`)]s9Dٔy]:C"0!Tl=9Pνd5Z:$zh OB4:~DŸbB6o|X!ؽp1lhĤ̂8pYڽ(!VJrP(@w6B lr=8YgPHVYN'e*3M)tyȎvj,9 u00yS Q5 XN[\\~ Y!!ٶ6Z2ʈi[Vs7S^mqK~5Rڌ9kN޲eVrvA*<8h>/>|FX_(iYŠ*@O ]idYp㧄{RC@o ,=zuzVH>n>֜8I]yMD M>v;e7~4=F kQjQuǧ# f1KE2r\aeAoLh<8 zrGGR5]pl:">adTOtC,Q;ٌ2 kf=/ERZt -`2Zm$?Ct>oyWM*PFثu.ͩԊ]Tr rRD!{W.Vv3ra͚ս^50Z!}x]K[}ȩ9u2H&xS% OVxymz3pGRx/rVi5<ԕe;*EY_;Oʟi+y1\m)Vu& ,=jTD0hn'b:Bؑ{Air$Y0~ qzÈT.vi>l1@fZ+cʺW18|ڑ|:ћiKM/4+V:r rY0=)Gh~+DoyE)MA07 ș>r֔3|^$eun3D'v1@]{C`M$mJ,`EJ0ù.SP[YV73[|u֎80rv4$ϴ:! r1Pg^T/ņFa+ O{~aj5.pqeV` EW蓻>q2~Z$G'V|Q*398Y1&oB-|lKؚ]ToӦ{1+hnÛADO3ï>tDž~ej1,AC c*3"Dؗ,yH@YXƄqO$"nyA,bQ By[eFz4;bKc 'Zڅ^ށ8υ^5qW~+䎭sr2[Σ2<̐Wn&}O>"iD`UNڅx&G eFd^.}s[$fk%HyEqHՈd|22Ʋ^(~![hhMcD.klt]pN{':0^l̀-w`^2BSvDy_4H Si 3bMJ3J2Lk4Bu]3-d(ҠRmJ\38{ CD[;=G-sfhpɷ\u[x6.^UFAl5Gc`FW\+ + _6ydµ9%ln߉ >%aprh_ʷF"F~-NjylhIa ee*ZWy |-l!^o¨SSjf`Z703^H] ]]8Rty@O7DѡOeiߥxHߦy0Dd|u6B+'T[`YuS?ͺk)y`e`>0Ma#(Lszft l>jƈ~pgX pĩ}D@ך܊2$=54A,J)t] ~ޓhO)Ȥ7nʡSi|]F<} 4; NYO1+\dn+R̉3(PO70j#E.? j&0 2j'y*zi`=XQn9:=$)cD/n™悹 # \>es"u@ugodݻޙږ<Ɏ +W bmvhgxy?NZ^ϻ` 4DcN$@^4~M;^IFNIJo"ɇC=AsPizN48*iٻ{@y:WÍr<ߡp +F/yUXoaN%Uг/-;- 94zcgn³FPa2fLݯ ){'̎^~'@xBh) ܪhX0QKLI u353) +`^Kϕy o*t䯪XSaTcg䷁zuJGsSʡ&j-{ UD7a5ljn[qY\NMF= Oc[yѵ?xDiDkSc'5~|˃XH몾d)pԨQsTCk)ȦAeCv\DD]x >gdxjB+ ɿעgL+Xg^X;W(O,YWI0BY gs2ۏy?wB-oxNؔI2>f}ԏ?~Q?tΊZb~@`rjڨQ{fz= rtYi5cTZTS-Wو;Yu PPkQ7\V(1g\XM bX(1![vqBԲ\N2U]l -kZ$Ygbz֢O}DFw<ږTD>˹öyK(K$2thRaU -bzQ٨voV'CtAfϙX*ѥЉZu[P 1|E mZM8@6!U i}e m”+}^MAAAo1؟b&,xu*JTeJyl։Fw>PT{X468ybZ9aT*Alh&$kE'ċr?sΒIy?o2v bKM4jiq)1٭ԅp0#|5HTU#=Pf CsŇK {<BS~>E8^(fNhR3RP]VRx%Κex?9 ]=Nn&}[La'.ap\QG IDa@25M~`[u9=RhӬmq#$T'rCv|QUoVxO@wI-V)-B 4GNbFA"g7G1)δѱHk@_XzFԾXyy ;^RVFP7M@"x9pzk.ʲ=svff<%k?t&T8cM2MR0D<gw3 =Z0h7jՈ#׺A S@irRF\ `DcFKqM6JPeEE7()Gh;AtD'o/@ WK(\a&k_UVOO⌾*ԛO¢cQ&]0q =0vϣO`{JfB._3E%iB$ 6fLS9F$ (8biʎLoP'OVNf2rg(E3(} fz^N,;S8fe@nPj5+k3b[5躃_!\gA^jH74ߩh`c)H.z= co$p&AYg:=-cR0)8Vf3$-sM}:&t}~zM.F1 TO \BdɈ#i'ȼӔo(j]>NOtH0^t +35J()snɮW{'ƲiUH^.=IRxU/yTJys@|`b(w!م SD|R4l)*ONS K3 s;MFA!y"L?R Qh`h`lR?)d0%r Re*)Մ~ {:若Ɲ.8LE (J7YH_{{;^7?w='Wѓ䁄. $gcec'kAlz$Ѕ 1-1{KZűK=>Qaf@s5E͸,ujGj%*wPmq!{c3 :f5uhr!*H"p<b3:*g{lqQw[yYae"CsQqdTI!ugsIũiWG`[5E걒cڑs* u!iPTɌB[Q0aI4v\eLCLEV% A6k[vDę KĵY\fvESl$6{>. P{ C(zYq)z13M$YW J%BDhkI.'lM\^Dh۩VY`(d*A{XGLdmÆ\`P[Q. z@3$#|.reeݣu UPw;97OUbfC ;+ތh"\`ޭ siJ./^˞WÜ]̚iu'='jut9|VɖoAMv bLJ4G)D ޶/W^[t[+we1TpA G2uevƔ l x yTGȷ_tY䯏*Ū2tzZ"hZ1 ItAH&y`J)dSe #x(uE,eo: ^TQZs rRƥT hu=sƂ҅eWPpDtt.C`^ݶI}SY\||z|9<f'0t~Tf-={={¨tn~>Z1Ɋ5  Ml ֨C"AftZ;(R: >]831I ]""*5CNi,mٮQ $1ꎟ=I1+TWm3dzHEXNdd,D?E&k,g2wm֨}, JjSqo7O1k^]7vv5 !Tzb1O c}Pz+o8;)f^q捀W2@}!<4̔9Iű'n"<3[ONf/iqOFiVsw&!C`p;q&xD^i2y*Ns^5J4UIehttH}20U^M92CL / ")ঽ f#:h˰Br k{+'7>|$5>Y:Y[-:`AH %;CB&`;~|1, _>-o4X겺oYQ[Xd۵6i/?$|LX[ m`DoSj1 ys ԦryotÃBFM:w[Uj]2G\gJ$C9@.S}Y\ lEZN)f,]Vw#YBJ#;K_#͂`2 B=?35u/T|#e*+f6X d_P~CfiS.CkUXRKP,w$D1nV߉hQW[O@k`]Cӵΰh2%ERSKPyʥte# ܬ͔[E_ׄ $:hjjZ*OmtK>_ՇNJ*O'eklJaeY6-cC-;0 YC?8CYWD ;l4uC.΂!67sck4 )ʼx]R?x KJ7,\"ٔnssz}^Q.cd<2uYm d \H @HBcrc (g.k8 qd<7RJXjZQB^?RU7N5H LP$ o2nGc:!Ɵu/*#r9"~煋A]CI}}+z`[9|8}> >sJst6JTU% wR>x~ņph"2FIkcXbw|{1wڈSm3Yric@S0¨CJm22IAG<[ O!gQ‘3?P8\֞}LFqG])3e~Ӳ_11Cڒ#Ћk&piHq \uPSHNր_K<9&ЧIDF0Bք{['4p Yv>}1S)YTJ@E nNEkG&J9Obf\+J(^NJuz ۹)-ľ`ȪdŪ U /ꉭg IݠF+pfܧO/jp Iϸ|n@T~5A9YkWt;43)]:Dbuq] Dz=FW<{HjQM"TDNwG[Z W㛵9|=a J/MFuҷXgn5Hΐ7#N#QB'ѩ.P- թN!ҭQ@D]@Na*rH9>?QQ)3^'Mù`엏 +//jk0 ԃ<x1{4n*QՊT/?ǞrEŵE*o'lKFK zm^_IawR}Wv{8,M.vTttKNF1#W'7jTN/t@pY Ovvnf=L=N,{ N.jJةɁ ]!WDs8~]0&>bHWꌅB`: @h# )/3#+HdBJO/2gq=[FF`RJ\tIw>!rb<#mA-ߥ~MFc}a6t>vpϣZ6eI!hWi@EI7MXP;n~5UT@AȕS(‘Y( j8ѱIW<-/ϔ/6Uo{ T.˻S'c'['V<UA#"JS(JBc58H K\QsOAE0fɡ]ѿ/rrkTivɁ@`ҿor||Mw`/ a!Z%bkM;-*8OFMtWL#W%2Q(:F0/Q/C59Pf ɾaªR~.ۘD4V^xL_2fcL&' ~҆xƄ,8@2/8ddg54hjJ{ͬYY=' UMX/f_vMFa`h.=mh&Tr$L0N3+-[ہڄwM-Z=pUW|X# L]GiaO(JZ)Qtƹx-iys5yRVwU Q8y'n׽彝sMOvȂf6W+ $!y䛄,=AuXI j s4?SDh߽ RWAڿY4f,%Ks6`ԧX (Ec%RC[,sdW]VgMql.hrNEgVE#F'35Ha$o;V AoWk'\5KMꏿ`"O\CI(*Ɗ|!r *5s>De \+PӏlDe؏ PdO07ͫi+yH35)t#>i_+TщqpP0G! LrEn2 # v) ;aw\{.n]AT-܁ueuu]؛@?)[P.HHIHMΊxq ;Jg`ŧ?NɌ Ik~ A1A@ X^_k? ֶsq*Ajg" ;_@#"Fx #hJVk(J3kq\3q?WP h,R^)Dlۼ]U|'IhB:1:]n2 g\syZl 06(bb^sThMv\<{(|&hqW/Jagn+e 0 2z$ ~B0x 2 e'?ЖkZy~xG$']XU&"1VVrLC"b\uGXeZY5#^UIfx׃PGKow v5B,*ҩڤj<|Fv+ H/fmZ,= zNAz.,Hs같LOB72o!^63#bIO`*C16 xz=Sz <خG"$1N17+.߰_o97c);K yCcQ֔{ K~Ws3_*~޴ OD4^DJl"/2jn9pyyciGL&OC2q{5q/]o' \\*/(pj'qF W9lڷ5e9ФuX2*ucf7 I=SLDXe:cT%fAg3]eR0t뮘{)Vm =*[ڊPl p7rж5i񑋓0ce9 -!)shr?Ai8%ˉb{IŨ5]C]cjb[ƢI" ʝfIE>IBVO6Ӷ2p|]py6 Y-녃93ihiQC[G g=Q:df-毕~\6f+dɈP]2_֥ky~/&ۡ. T Iv a-xf.\*!/ *ܓVuFHb(77ғf$mo^Cǃmnjjo#O 38`m_X k'm,F\6WHPp] ,>J$k$WhkdK*a_^QKIGu[9 {%Q3h D5[#z |;m̓@AP9HjB3`*pcqvNwTq8|1Ob+uO~"Ҭ;q@Tk"bnle$ncd&iO{⬰. x($b%g8g![ /3*~ BQo%Z0ز[2:yn/晲r`# rm]&g 5NT[;'đL^/7^Z6WΠ}B'?/ ؈Lo[o7]^5)ȇwiU\ӈ-~vAϟc.zK}}|a|"a{}lTVц}GPt:Ċ#Oϲ ^+U59H+PuXM߿?-?j 2$񟌲Rwap݃`"#'S6:]{eղ1&DolvؐP)+b?yMQIsGJ&Ta-cU;Gd]-ӷ1.H%MEdU)p@U*4byp}}tF (X7Ŋ;^%a򂱗6id_vMǷgg_|^v?aՇk|}"rj[BlXNlNYS|;Z{"Sdj[dz̆&j쓄hq& 99[EƷ,Zb,9V34+HDa#NA[pM+Zev~r |]835?hт!ea5Q}[jGag8L S豳zi+IMdvW\&p{7IM_NteWc]8Br![36WyNL |}gn d< jvPGHݳ3 N$P[[80{$«kEWcedҽ6E}ްE4ҋ1? 9x#c`"t7DuugD>Ag&sQ m%6"Sv0=7peȔ8b/9_s>E/Fgs{#4%yג͟b} ^9+ ssfÎqr1R8?/z~HOPUv6E;/Y0]l ]= G= ndj`< k- Clp<@pxu'QCeC:VKLH;J R;@~?=t@ 3KD1#O5>efbћTv.l b^)4 fL*\1ۗ]Ρ0}d^Qy*o/Y{Gh2'{}@/s|"H.E@{l@ekr`K9zO4ޯBHr{3ZQU̫b߹Lة7UHiØtTnM8'wci S f->< &R,`xt͉AN1 ~F؂LI⭞__+ˬ[ä1IH8Gg J|/fHPhysx:6WP8]f^.KV|M`iˮY[=ZAIqE@-1.Y %mBb(aMed .!pcY-Д21:Jy}u CCgG+vhC/ ^6Oq\JJf5BMN";E:{/r?{lǧўZYHڈ{{cY*U'?V ?蠊_vBXL *yB% 敿5z|{nJ3]lw>P8az%S{R7<6}]x@vnn@lEɷ(Ewqg]p{чNH;Є"Xb ӹVR)|; 5)m_r&X|zN Ц+RfȨ߈ޞX/tҷi_OґSγWiN\O2$Ev,jb*(N˓]toW+Zdo2ר[𛂛X/E M~=v(s =M2viaQ_l3LӫX@;QV?mҞ  KMxqZ86_ViB|Oы9Ja 'Yi 1KD;2VZ2z|j8ևf;a5?m 8X+rthQXA}aY' ox|gčf|-f9t3Š$erM(<ak~ DPV{e=0TBR!XWc%RnH4iT.kZ13^Y-b Պey,$\pĵx#iZ#<8y:f.JY5ƌE 6̱#$En1jwPC~klSmQ49X't`" ~y̙Dy޵6٦sTUxsmX nyb +[a+AWvh3紧Ow3oK,S4LgHg3bT8"%c =Ugrk;bt`qq.kWk TOy|HM & R5Mz[> MM>^]@+~P䅱}y5}u~( Kul]'=.hPALLG]+6^\A/ê ]-A_,Ư63T2WxV7 OD{Bi ԯD^hxp j_A+gRo`,#jfz[ 4A$~|6sxW>Y|In!!nIz2z^ZUe39.ڙql2:`LI&j5a, P_9fenI<Ț߻\4cgГȼv:k);!X$Eh=:XM^m[K OنlWWM{b? olVnۄ" F@X"'wD)T /:>A|1152&6..:"M/sE@r4̂Q|jHN>$(G. (/. ((Vb|-J~5d="1L="9쿉bȆz41魍&Kkw?"qb/\Ǽ8)rÜ ZM@XY`pY<H[_N"}G(06.:{@t屧 /JmR_:fG6AezH"a|rFGg6S%{m4XڜyT"Yʊsghy./ J+'苺6R{9&*xm+?C1Zb0C~Z²l&P kxmP amoO gc!fTK(hKDE JWVq/Dhj׏ؚ>cpVk+"Vn+lUƫ8HDS1>Ig9OEmkDxܪgl/ҠSwnDE]mqVcH8P @9B2`"R12a_d >PvjEi۴uTŻNHp?w, Sg+m;OnXynYn&&,?GmwLZdIĦE` #Jʉ X~8u ;F]3ȳFͦdbpZ! Tocb7n)g[;wR<=(=JݍH`^L!zPݤ˝hځ,D uu  ʾg38 W m[h]IpW7Ʌ& s4;o0x֊ta&F}`zz1L"S.{{V;[\sHU}te?WN]jGc6Ô+1P-稊lAUIV GT26ʼK12k˺ y!Qs1R&0WTGaǚ!0 #a#B Ef+ ;V_/ 8 wG.OtóB.1.@eH X֎}[%V8ט{.LZEq кFz_A59*x>I {!uɶNUY1"9Eij6.|xujZO5". d}s[?k LEI_q%2s{"a-7{zUT4!_Ęİ!L| 11p*k[rtzᮑOd]s FmnA)f<=$@Xၜ E˂USIc$A<H1^͝8-)㍾ GLďu-uc̋>T {r EhB-V)ǵy>)LCtTK. 9!h1̏Tճ-qg{uWV/e kM'ILAik Ucq|A?4BxI*4A|П>w2befTAJ~h,}3=j|`3F$Igd~}{~uA c#ݬ)VsBuRzH34Մ7SEǕ7qȹJ6ndڣ՜wz`[.H5_z,ɃA //G8$NGS$Lp^ ؑ!:/ oBc4&]|iLPI%bmDqJ[}k7×B 9} 96.F7"Zk~w:BImiXx4epK^8o# VVrә:W+qzfWcA7cW!Kx\Iw&ȀfZp^%%DhF.h_ZRcZ*GG2ۇ t-B()W &ZS-' xze  (rUDgj"q\}ћq)6X+ w2DYHj$)sCYKj{ ܦ&INR *ԥD9SރySJb!m>&6 V9)B8$u64ViȶCmEH03aRU%'^Ҷȯqtci:w(C*ޙ2TCPg7!wEœtɈ`% Y<6R@'lJ\14LjǍ>nGX RT0ps g%d2P};/(.Ƕ6gX?a R/)\VHɏ#KxtQ{7 "St䅾cQs(e:7u6 dQ6[a/x`T#;Z~\ 0U0/Of΃iG4EDvc,cӍj$TAp,0z2vdr79REYJ,OY}"\H/ͅt^}'w VG~3ߛ24ygq}Q׈VvP@fS CE\ܪ;n# 7 ʸ-gy)ѝ@cOdu0捶y(/6wV6eK.n%~q^s+h:&o3A-(Ag™}0m 28|2XQk֗V:ͬɶ 9h2Q9ʰ#}7igH aFr1\]vRHsކ%¯FH3EW]; rnbR*&q͙8أD8U`@%zh\nq?')kW6/Xr[F.]yJjԳ~RVp%0+* k P .'Jcy x4IbzCPg /_>bߒwL2YLȈZG@c\C%Bܗ?֛kӂ?;Aem;&szB5HҬ\ 2k$!9g϶]ƌs:c˓O=: }W(f&]q< ы>cN7+b'.~Mfǖ4X(pA# S).un*eyUQC_#KpIpthw)L;% Z+ᯜ9xyyEZ@AhS6\J4A &{o.p:Q :?A/Qkr}AKRH_CVbBX<'==<ϕu`vȟYXO$'q)d4%E4" $RY2Ze\%"Vm CzHvL(ҴⅡK!Uc\)&̅ZQ[j>6^ ra-r$$~+PgjReݥ f@! ,Ъ1ě+k8AX߇ZT7a̮as\֡Vd j 5b*ܪV'WN/ܵCPj+mamJV7{a8k1{^7cZ29$~dmԎ<ae#yhZ"i:.:&t#>xO[0KOgo:^w;o>VG0zzq 3U,swr[Wc Y11_dW1(Oݿk<1.[U݄uz= zlPȘL99,5Jr{*D꜀)Aw5G 5 hq LGm*"t = r&Bڐq)@؉ˡN=W亸ܞ)`#E D|ĥBgl`ȕ62G1=@1pSc$Z{e킆kMߺmM\;aZaȕdVs|ȦĤ#1;O}0BO= ?dllLg+rF({~^DzMMBآD[\3JhV/" 5_NdsYk Ck@o`("R>X8ds"tlPW3ߞMiJ26Ħhd)8putzXjio$\ X5 _@2aO,vTQXUս2mi0{ߔq9-y3vt͗0䖤B%Cj.:3:3/K|5!ɒT!)u6҆DCZddӼ|"@a"J*Ӝ+EbHRUbKiq-<k{/ *؆;uyhnֈxD/m NkFSPr-@1=;+:c]F &s~2BnvQ};$-ۄN뗮뷯IVL7 aHu}E5۾!.z 860 )B|6T4a@1젓1 ǩr߬ɰJ/@sv`A### RCpj"B<݊O *3[!2h'iήھߧJA 9rFy6Ruzi0\iߜjW,q%!6 uѨ('zuQjZGwtCeh8# #ӂWڸsN哏o lŦٖr@+0M!cı!f#$ΙzM 1TY:p/5r۴`K7 xLHt<M)ehr6%e3s~u6zW. $M?RF%&g)._ SC$a+?>X2!D.={dzfgYNaI{Vs6.aܖT_Q7t'ebx PXhhc/V B"3^iNKuD蛀oZLQbl {۹ UJgFM,в h N6't'0K1b4`-G4aG!$4|w:#$FO='@WS .1:Dhg5jmBa?Vbu`o3j-ߐJB~}/uAŴ LU4IqK1еf yKdz/ nk˥u +ϥ:iRᤂ:@]ÎLEUiepቊdaxS^7@mEZ~,)^uaGUN%ʸ<]XU%_yRpV08&AE **"L+5NhYO*sEQ 컟TDAn/bRBŞ u׌ :bj<,u4xs\ ? ^=2:|h!^hs24ׅT*s1*KP'X H9+tgGiL7s.6-X|~vsAwi6niCH*K\j܉ *֭:, ޷-B :7ۣobKJ_Á_2NcU(duc4]ט 5n8h2k$q'kǷZVkoHknEEks4a獿*6as|vҁem0!K*nv{!|8sc[h 8E2%yTycEn~Ad9I"u}ǶOC^!)7"LSZ2FIJi^}qTC/-B%Wy꼵׿ߞ1eENl)aĉmS3ks!xY}P,Ux<{"mp?e !.@yAZG@$ ޢ`C%~;3͋cH0t(lZd7PQ;WN$_[g=`u K -Τ' e8 ȼGN0N8 ~YhQT.XhT_,τd{ʉ-` wu;}0v OSwPB xLŌr5/Tĭ-5KnGo5%ֲlԕOTg'7ק/çl_k~g-IwܧB Gf.("liMꓸ#9BRl_xuI'TkrjE7Uk#W+"N. M a΋IƑ(ky#J((m?(`9õ` n>p C$xgCPׅ\;E' TsqtS|pOHg>y %bno*v)<:1m d yVXQ5:R7؃&0m֙rQ(!3F3zK8S!>q$\i.7in ΛCᓮLYI]01+KvͻSÜ&Uya}%d?L<0s[xN[ҭښ`-h Hf8`݅&,cIˆ݈ G٤HTm4|y j6̺2) );~z=S×F:_("h4et%g O! 3*Dcag1Q8:;y`B-:0oIAJIZ7Q^Nѫ6AQZrZa k߶n .1\EǍ4 &q9V(?4."[ݟz3o$yC_~dS&Ώz j%Cqc*JU<2:ZC|V3L'.[9C>e䵞 &GX;q˗*(.? oF3w ='rX~8G) t{M [8+R5wcmIg\^?2̰?h}-i]Vs-قn!YPo7C撰iK4%"&.^4-dtw0+MmRfdL.Բm&0+` oqQ_j+#-y`p`q5f﬊b|?f\$3U5oN3ob_|TvIw-Łߗ~޲1c;mIPl/~cy,o`uY" M{䟹"ȿ˸NP&ڒ㚬aNR ٳ~J뎆Uh &n";g7 5 s]e 8شz])ݞ.Fo,tDh 6֩ = P3U+>1b-%^M1ɋXbwS I eDAFWpJ;XIQaĵG;iˎ{`jֻnuO}S6ēUq);;V?_mmj@3gm!9IZqC9drJu-xA~%uALA %e_9C'ҒJA-82=VGN30M/C>3 ZS,s.}%|h;9ȍ_e|%7Gxv׹ ]ͩ}>5t:B۵h YEQΣXjÑ2(k$ qHkS ֌jlF e-֍䌄Fͤ*y?W >\SxMWsE<(,Cv?/XUmє3 _U2c򂨂!HtY~}邻@W%&+$W_ېX; =" 7!Rd8Y¦jTY z Q1|w~;ʑ>uܧ"y7OUÚfFqw ՊEr,ROA6]AE:_nw FLQy~Db4UMne9sD@H`A|O7ECN彤𙋃}gzҦIҍ=seeFjLw,2)[[K8+i)^cE݁}RRҵB c">҅#h\Z|诨q> ¶ZZ>? ;y`?& 3 oc|4G;Mq@O!xŋ[)D O 1_| $ۇ񟉗_܃./ eVg,? DŤr*z3Ɗ;3/lVm>uqfNPFoMes{{݂ `D5&1P'L'6ӈ)*;v:M]2;5F-:H[1EhtV s/IIjB7 tFE`{7#e2򝦏h|owiqqᤸw\X6 ^FR$8 \WZ9B<zV7 ezQ^-#P0u1ugg瞙G@ߜ;[IĎ+t=< IMfY|[b*r0@ygcKJ!t@t@j< IJJ'a0fr%!1Ac "_D^@vYtez8=DQOџX"4"  7"- @c(*EJPEHDT=c,Xan:4䚢B{BbɄZ[#>d=.ċXN=$ͻc.<z "}# ZOh /kQZ ХUӌlq-#5$!I+y h X =ę WJ% ġm'"h.ulrLԞo~>Ƴ흥OXΔkolxAd89s/a~qv[qdǂmXwHF5mn3nBXtnC: gmldq`2tfHzfq7yIgW䬏}ƧɵI(E*LAyDUqj0 nvII kUܧYv6/83O7+[ x¡kkl,$'œv]@"\&.M-$:N`, x4i`P{-3K ȊE[CTIi 6u;4yl/A+6 &ڶҶuLT0Ϛ];C\J꼭}M@ 5 e<,Am4|cHFc춰06D { ,Cr.$$nXe7CvAH^ɒ8wҍEmk>Kq""!y+$9;?\M>{@"!X?QM3g MLtݧnOx f]شd9Sc>8rUfcAumS}{ Hlrc>k p[_>K>UI'N>=!F+ji]wf=tqI&}JվuȞʂceDUkJ kuVG}^رKweeWH 5 zkv* r}y,>VfUX+lɭJʲr:boQoGzފA!(Tg$ʤ/{ 7IXVWȟ mTB84O| I =#= 'syTx.)}8PZ'eQdw6Y+Ԝ;e*n|os<;:OU,ϋAZ*[F,VK=^0;ldK5']mRm(K<7鯘I=0~tZb"}:K sjb$.Dp8$Eد]7M ?^y`{ e-u̮S"Y^Hln/O|ń\w} N.i7{>X_9Oop}G%|r6%dotHrrP`H; \K5C:*]3DD c.\ZH/|#"?qCz, 茟jm/Cިk%rUQR E9\?KqQxAv @χqB Zu: {BzR)|L2V4/kygo/mH+ghmlO>xf*V?~fe-&L}v[,؟OXB4m## S1P/1U@K\pXSIS{&|]]H!ٔ4$P& B^Lh<~pVQ.W'3m!Ph4Mv xe9~,saC˾BY?@b,." x`s@&KG>#؏ @PC,fCtm!~NC()i$dn**;)% %"$Wt/go@Z{ĺ ( fjN$! 2WȋG 8~Aw~v1LOv˲ Pv  &U(kܬ!YhYw8{nyh~Pނ.BOSgj<>džV V?^k[~RbUSڛ&^K d\ ( %щ|!H0/Hnǫ4xTq##^Owoۨ=3iVƢR<a<*HQR; ^py5bqIRyJ"%F}JиYQED~!3Z+oR P(oM7 homq* wRH&d#n݇,D/8˵~(39#%ƣyBwO5so%͓Y4oh=დmEsojLz]ͭ ܎R/BݘQÂ:L . JaE#FD W"K (Mζ_Cl1Xd &HPRmDIK/2x]Pl[4&A񷔿ʓ| t4Z\™!`!T6n֜4'-ڵ$ e#-GCOC!]>#o<>LdJQ[~=a?^僄(?|9gE?ddlsvL/樌 ջFkFvIf=KRF}|r ck`cHԏ_n95qx= 0u"3~oTL3$@ 4𬬊O8\&B5+KGmp؈C5Yj=ŝ3MI)q|Yl8P'MHr5½ʶϹH tK&u͊u}x+p@k_S Yiy0(._XX$ZVb)f#ш :ҷ_MvCkpPN*,c 4}+3$л:)-!4\z9ؙ琛Q?'6-:mW3Tn|->^Y{Ӟ'vANrQ6ܠt9Z;fckZ8?6 9d~o^%yJdm'ldkQX:P8ɴZ-q\_-Ř7" 530gtl^ JA_?&'Ow&G+@?"N$;@R6-Z?L4jNMYvAݧYSeF20v@XrB3Mm\X~mn +$!^-׎ /7ċR@Xz8v00و-N$:ᾭqpQ^E%s.G`4FHK҅[իz\i>X1e/יp(WvC@]$%"/T5isdzC,"SV`Ou0c%8ƨQj+ YLYt[ڈԜɇyj2'idqy[s&"tXAv'ʴe0 Pqƶ|},,psKtvV{AMSJ#NPJEW0 i%0adhn1* OWH88> 1Cz%2 O) х+f4x}\td_R`IaСdckgrIBvpb9Bw}y -9k)]yc.:,B r%V3)#nQ,Mi n4f]u6k{6U3_lt6)PnVE^=A2Oa!Id@1Bޱʏrֱ4z&:;F/R~/4R> u[<\$ 60TC[9?ʒUg WR 3J $t`S]oqOE7xP!AA) i0ZcئFs4&Q(9%(ߪjl_O$vi7ޠ20I''JUgRҴ8ټp=H(My9 $6t{Ja M-$!@O(Is=ItD/H\vF[qRلyD|D9н~:$Ww=+^_]0xU«mIˈo6x #x M 48h4y9cRCcZ.~VX^ѓ N?ˬvݾ`(\4U \vRu7 1&DH2f^9'AxnYĒ% ӫR(3P׫P4dɘA$?Hqq޸dOWµh|zT' Me@sQ&1>SUCG]'$\v(:W7ܶ +_ݬAo86 G#6dṻ;YA@~9ΊQEYL=xA6JھZ87I\Vdp(:?*᜝Ō݁rpГRZ0o|HoyCoYAh-|=Y}64͙C6E#Xphù?{`W(w[xo/@CxRatLw-!mWݦ'f-{Gq޷@2F<BbNfMT! P 9' ?"1atU-mB-na#R@#1U`>k_ЎWU8\?)(732#0y覾NN`RX=ܠ0:׮ n:K!I~Ig5=c'>6^Lluݎ]2QT&B/u/LREDBL3.'˄ F3h=&Am|6)ol& ǽ'cu3uS=jvcINqGR~?`F(p'l̛[HOU* &JK~wU'a"h Wc]DҌw;NMtTH&*VcLiR\tGvoZ3dKH+`ek `kh?E>䯐+|Z}P3dV@m ~$VNUԹHRnC=zmBCbC9g yᖉ=َS^w_~(#fbs%qbyءRBXXĢCNlzƏclc&BUɜ Vjq9/0 gf8 : {*e<చvkrIH!w"YH15xczAo= UxP9roHa}Qp=ϓȑ[צq4:&gfKL%0c k~ꥐ8'  wʡLSIB*lTe9#ުMo+_R.x;qg뷨5 - ?z! 3'sHCWEg%<"U8R̘ ПP4Ҟ 'èń 2@qk%hk@ g; ϖؕ^JU7TEDA0.Gi7Dw6j}j8[2&~oqA4#S7ג%?E+JʉmAv_| t!%?2!jw9!ЅѰ !he(L%_qU{#35tڇ>b#qps1њgmqBwb`od$bn?r2hcͤ4$I VפI\I{=>g^ (P&?3abl0E`Т5]w`eV?a kTlAkJQ]έnsfbb~ޢi)Үx)pScTqy,ZZ1D:û.mVs`04(Rqe }4 4@$LR,k]_ ydU7?V~vzQ"X__h)kv~yV2 q_tO_;s؀>7 _a] ZNS7&\z#ȊjG& wH &ɤ}G$~ 4Aa7(3'UTTxDh8a&aa u>sbd0}313-IՔC$R3YwnW`~Ámo۞nכܝZ]d|AH'zJvjXgd[\\#󿩞'woA>M2mr5U9,y^ H0I1f'fSqL$BE:>EcN Q%Fƫ $=Y1$E@$ ~'gh->7,Xwnު u.=Mٵ )a,rh*Ov1?;?FBPQ͝17ڤ,gT2GAO$>n2"2՘el5Bo:IJS t(7 \6VTStD&E$BQ ?1Ƣ8JJ.BΡv~F"ћF9Q +JmHS4mݡʦL];SW> 'lN̒`S[`.R>=QZ!v;^:),K8G|2bb$y^s=tq`A_t>SZv0QTq6ˋ\1m~cBosüp r1Е&߇IqYG2>ڰi(; [2>)(LR,XIGV$)P}OЩ'RDg*Y3%5Sv6­[rg{Gh˻blȜ * B<߂]I#C8z` ӦJf흧/@$bNh43Ce @7?RRy-a9APSc:(҆P/KbQ fUJ>osM5<*4o;6ޥێVOoj,dh_  E{IbУR~Pa"Pﬡ.'CD0*CG Ctxt>_s Â_~zqk; Y:n(s}C6IcP ۙg+(4~K3 aC6qO7VU&uu||ʩ,\;qك6|Ʉ[Efl 3֒=)17t|MuA73+ mekAjSknh@ȐbD5%RhPyTicQ#?VkmfD~sNkR-j8( ؛\@Z^Ec pGy-!c9+OhImul?OjWIvI1Fn 9yz.^yXmְ>#ad8wi,Z/ Y=PMAZw%~Rpo^$qYuEezX0YTQL - )8h'8.Hcj(n` 5Qʠw@ة h0;jb&ISS 0d,Y 6n>*/tUJz{@]לhKy/q ͏FFqsGǰ8,*9qs׳EdZTq@]Hedf50R]af 5 )TiԞPa-9dxP |;+-QW4=ſ$"R|\U4^Їxerq Z;;&x*Kr%tKY̓GowV4"GM^CpIg"<`AɈ˰`ݤ<-( 7T/HD6N>w+͝ЗRijr}c5(,nR"wu,ퟳ6||/@LR3 _xNݧ-<cW?w2,q '<͜1<x@zW+cIʑ?I65d , mmmx^nJKO: ?8HL҃ ƌH.zn\A[5A]U4[Z;k[w_^LHnpl6zrU-2S&iFʦ=bK.|q|ɺ5J|zeιv}J~~ z`aiO w1(cGС;:Y9{p&'ʤcrsR !7̊"3t $Êdšۏc 7L> 5VL.`E`-Ӌ-JƓL%7TLGY@*L-Xt(a'@c* cNjcU8C##ZV:ӣ>6 $]L1;:U \)4#BuiW/V:n5}N=ݧ87Rݭ٧"US%pF<VRu tJxӬ_9uJʪt [^n&h(\d/nJ!!^+\;kV/=:I jYP*6:wnֲ1@ /i5 ssrfotgW`A=:d uwjND//!.WUiɟ&\Pt{BPqV //b.0=g~ {*z|RVX>(E# ]{y`{u*GwMĔ]Gw,?K[ԟți [g nLR|ԈlḓHͣ\SW8򝞧>7cd[w4){|{nca(uhF'7Z&_)aq` cOma= :qti*l{c!]ׯ~Q;C/g3G{hZș~I2.ك7@y7g%JW?{(QqDTҽpپp7Y9a]U//#E%% RZJkNVEmrZS(*e}ϋE-[WjUzB{PʎBfyDןsfl@@}fCd鉧hveFC-]@N k?ޣx?2=\ dF D]]FR{!TXnXĬz7 J>;Q v`W- 1 mV1'ee2t[o~)e z<ުl_:*Qq;X(uML:m+I t,2ȑpu " .o/O@smC[k˟D tX̨†{D!b9|VČ P x " L"`sWa>0{h@Sga`06 դ_OW!(Z`i]Gћ[Kϫ%=JwOu2<SaWϯu/ݕ#l򪎈g8ٞj+oۀiPMƅd d H$l^ؽbGhI'b>W+h݈@vlOA.;(L DM`Ns-M6vMg,ٶЧ Jp`9bo˦ d4{mWy{rߎ>(zNT+|{EJW/'5 kV*?w72ߨ9&?YudmN7A|)T9y˖>a6!]ߝJjsz96@,ߴˊ\ }B|UrNyotМɺK[oOLt1ϓ&N;]n^Y3QLeơ򍲦{ހ){;%OtKp9v~<rXĞ}Mz)4IDJgRI} ]`ɿ>6ۣd*g&̿9;W]8F4O_QOoIX9'1?#1^TM@xo!GuL6M]Hik|7dv/['qg'JoŴ› [&odNt|@e b~)zн%7|fpv5MT-srߑs 8=]XrikZJ%KGND-x{ Sp#no(Jjڀ\2򽳰";ch}Rx.lFţ{VM(z7l$F(-_-2pIlrD}|bxR|UU@4) &U]idҜ2=գIAh"0θ)#AEڡl+~M qZ&Jl -VJߊ T&w߸aF$X]o+Nb >M'p@_pµqL@g}PMLd5ry\FjK礬=HkBRzcaJ^eyĽgT*6te9-\:Gy]o9 z<acJ֭%Ί#g12VszxԳfni\=LwS DFBO#%LֻUd[;Z6A𑶬 ˱Pu 1;32A]/U=ۊևH<"deZaxLi eAA+jRS +CoK]`V7"bX 5qt:C7k;o~ y䚌p9g~-<ʔ!*VqnM%>>P6q% d66CzMMԼe1e55io0ytŝkɣ AGs0p}kZgjatFԡlR;C?8t 4pg$]bS uMm%X%~q5&-+\\%RKW&L+1Sa|W@]= $1WlJ0@@[3(YQ8ZλZ=Bj0(/ܽYVl Gyr\%Gk,>Dpnɾ˅-aؾrF {Cm]z4e}Gd)Jz5!!2x(@hi<-1O>h_0o T~c P Bk>^ Ev8kq\5V!?ץJ 0C 4dp,tFfcv0HI/Ԍn$!LNgkzPm` hHSBoIS,84xc"7',\\Ɠ BjQWh\C=?GjNY/Y3n FX\++&S d6~2{ܑހ9Ds$Δm^c3T'/`Dɺ[\C,-F j=+'F&vkzӂ'|e !_˼(ٌ8ލl!R*eߡ졜Y0Fr4#=P8l!2 fPO'U2IfPtޫ? Йy)fWʚVCplTJGL E nmT3q"U?~zx0lㆶY(JTLޅN ֎;;vT}Z̰b{{y904> qu R).-ڟb;r lVWׄcW#bS1Q. YcϏ'8;.l\x>;YWdڝ\qZoyJ.+;kk [{M\lWEZ:ehrTi%JVY\3ZSryW/G=kNZC&JmF@86KO}rX xMTAsh"p{LJjJTJK׭QQ0$4kU4Į$& D}ޑ֏۟GKO濨F [BǸtsB(0!  cu^B i3dЏZi ꉌy)jbB[Vٕؐۜr$JYXY:44L'&ōGY.qqJ9ѓV2ҞWAw$fϔN" p!$?jƪ zs8B" w簄}P#U s2ΙQtq/R^WwK?wƵ &8\\iEŃa*; Cqܥw+5;#屸׋;uB'2&eb+KgC s#҅L{͍ioD O!AH)A-4 A|}Sn`') onف476Ȗo488?ža2@M.lv%` 4n*yqD+ ׸P`9pu`[zH`,B5jq+6;F 7>RMLz/kڥ{~_ .zb:FGlX-7F0 Ό`ۈWC ͭQ]ڍzW\kZl}ئޡԏN1 2t둥B%3L)q35poYzF Y^8W73w^? ̙Z=ˈ;ejr1gg[6f9zHu6!1DJdO(]h|~‡&[>7@ }-8L? xO>'2⊂fp χf[y3sVq2|=8T∋/Rf+/6x_ظ>#}Hxii1TGv9>ۢvcc% i2 #!xmį @3tp2-XGlٖIԅl>3%A+&PJ&lyqf ~_RK-{"yȭN}=@;aݛN=)hAG=&NȘaw,1:' /L֗cr4ݕCR8Úp/E=h YUQ\:gt %.ގ*恞}9Pn0P wp3#]OZlT܈D4Dg$ZIi.IyHGxV~qԃN{ q,/8nma qș ȶ9Q"{Jج]8j2li`X<s^j>``(^1+2GdJNzj{#&U3J&A GN2#㚯A^?qORz[K#}+I{'7Es[/f}hxAlo36v%@S Յ, qȤf$S@a'kTHli'){a %I A ]91(MncM`3H5dHSjc@[A_ 93n99$=l2vV| B κY ZWXsxҪw$x^<*Eji)Kk,|BP, C\"`L7xo=b$EJ~N1Kcav=Z J2ԉm@C&jzH+v{]u3rRI#,=\_41!rt(זX ^6Ej?^Aӂc[.~Otŗ# Q#_6+ A&Y)6"SنQ go;՗q?JϊlcINY!0֡|kY*7_M?ۤ'yI `zGklZkgR1"Fmo"m^,/4ՁPl8,$,YEE%f#%)*q;Y9̲ $jCiy[>#XѨB7@3%.1CEɎ~5r1V.3Ih@|y>%]L&#9N~xb48Gʛ49fNU1Tp3, {ȲomZ`D`A41pd393PyWQle65@hNHQ˽0ͪI"+EY竘+kխIB~%4\D-e߉86B4YY'o:}q KJ#5D1GK4Řk826( 7k(sjz}P}3vKOYUbX,.:V26UWTdNgA]5%۰ARMyaV'"gI^wMU %Sg홹d+YERd y4qi^qA?U; CI_hLgAYy2ÛۋZyձQJtI Bd<Ŗ&~8@7/qNHɅDAWildcL}~^|@bSPk[6Cfś]ň yEêr.&, Iӹr=7E];r  Zi't[aQtfOWힶ]66%涠 3 N5CMR1 |5#H(L;Aa-:0EA3HI9ºrZѿh!E6x=Վq.g'ݹMPGY9*6\Ac8(мfZBޠu?,h'"iP[?&,YqK4a!.iftG͛Yqƛ9h6Jb.[E \&WާDFL[Z>-YV&K'c^7LP%y `1B ~59w2ߺc-R7JX(Ecc9+}'[S¸_>aҶKS4PNY\]I:'/ HF1DƮnшHH(H4iNtGzc}gS*rjͻ"|bJhTOѳdl7YM3 FƝs'rK|{̩/q~z#TXSj}pxUpg+V r;=YZ:uŷ07 *Pge*\{6,0&3,8g,DbĨŶ?.|x!c'#ַZ8 8ga^@A+uÄ jGᰭA`L]ćŊM/w(\o~< TɶaK:COMj_.6R'@l/wǶ(ʾ-ܴ yWcHS)^-{~l/ XCn^qҧlzʣ'' dnKm#t9h3|ֹ?} RkD RFIq3v6A-|% r]_YoNVy}wxy: V)ͪgͪak,kh PV&3A hq1I-xhohtHXr>㾋>=@.e'鹣q{fjkU_呂uhMPhP94}ء76 ~^>4?B?sa}[Р[\@PW$92?0|j<~eZh ?D$[ lx?q(!49dWV,;A6ymIRk;'[lWMEt4ĒUv)ay="ssu4zReh lp,ݪ@pu X/4'fqmfS脭kKxe|ux{wb"t,RlX)E"}ŃMhH_RM%P ,t#3AA,Ax}7q=[7k(.4!-토w4[Dۊtџж!w1Qۃи^QЦwQ<|#G\*&b2\wZ O4|G{t$ oE_8N (tz&[.KRw̨M0ұp۪XV}@]@.EsT:`!v{(4}XDDxMbOQO HP ݽe:[ffňbY! D߃>u^<+b]0 \-f3?a߸fN]=-1֍ErrYL /8KL&l R d2IlWE.dﱤҶ<6?oK$AA>wWl8=_A ]j\7o@g<AѲk1D)gDз{=WN}5_5}K>gpM@8%Ty6G;B}TX۽q%"@!:{y x! QLޡTXJy[A7-:i??P~ ^|\g1'&oCVк+ϖ\m*[CJ BN%Ke0漢yUřbȿ~qzH~ke#n`clg܄~ឩt+)ELIA!q!{HP]}IJ}yeby.:J4W쁁@mv00\7P1Bo =M?>>ziXbGdmnk6212#Nu2{]fzV7*v6`lJw@UWqU GK.) Vo~e_vn-_t|]zi*%_vz^H#re͔_kӬɟ]sp^mU(݅ztNuJ.n^`\gj)j,쪩lD%40HAy k@CtscМ2E<~FHE;#Ʌ'e!&Bh@ǹc,˓|@"r UL6H$kUL<@I65p M=V3cr:Cіf16g NX3RQSMUj'Bs%6 IInAOTx$[7j™V\vCtՓ;83:o@ŏߠ :tV,u]_҂<'.|b|i@>KjH(ݞf pA V,NۍGFzHN}kΏn0;gc;]1<v|]oŠRbl䒎 ̓zv*PLrY1B>C.?^{]~/z]Q tcmey R"Sucmrs+'w.O>%S7}_|eh(lBy}N8YL\z LeRN*B"bO`R$+ھh_WMx 40D8ZL!FqF3H *4$jdK`]`habk->j2aVRٕB=53ӣkil/UuEy`ì!uF%CK5xHH A虍]B %t*J')'}owpR5)>_:lxO3kD" U* ѸQ~ /H1]i)n?%s:Ebs@!]FJ4ĠO5eWMR<5`LzV{~3-Xb|UhG=lpӪ%#d#[Es/w-:y6&5FBGtQSބtIOCOx%2b~5;0}-LR*Up~*_]BTfv-"Rbs⚙{ƒ2Pc*uqfã!u!sr;HIpzr'eV`uHGĐ9 wםqPQTzQh8oA M@*Oipbf] tqxN- ˢM_Q#M/ Fo, TW&8s?%XA{%biֽs=/w)I#j˰87hZE%kB5YߘLj+[k)ҀkGI~ :/aaa>]*}9$̗G CtNęRA8Om#gfkr)<SgC}u6g7&~;\3T4ilAM,PC8^hM ЌK_Be89҆[PXk}*y5a'P\P:ML/X2x=^ cȆ 7%qELP-ra,"4ʴe9 v{;h;a>d"W2 ,R,HԲuv32 'ά0'oP.AWPE?ZSy4Gᮗ'pPm#[z z91TNqLMvzI<$OG`='V3&q,8HN_l 8CIĔDtsM$_mI1_͂ҟ8@5l͝L ,Kόd %ƐA>cL:L$ib\in;-P5T$4>iD#oNӝYi1+l0?`ͩH*PO. 4V.k"#󶾳 ׌ u>?b%!὏A$8f(L# " λfrW<4cBMJ=Po󋇁bb'Xm >w )=_4Tọ-&$||JDž=~T3Ӗa[EXe!v9l+#QBgj.}am.D鋺R0 CzEue9`ϑ'FdMT2. {f <ܝ\.uoM)ioǹf>yviDM M;# gyQԀfPC#mp_/qIu/c2;ݯW])=m(45zka['fZEsBdKֺxgl@+M,τ6(עhGْ4 +/S[]t2A_&jhTAcͅXMZ},чXy1~DqEkZK"~}`\ٝ^tHChYP|`~4, "@m4J4/S x]HIszxmyz~u? ,""(,f㰷 Y\Ӄ?A\􌑼iuTih6jy Av  PzuΊZ!IKۏ!x&:HvUqD Vq u`2\@y<;>qyV,;|2k18cXFa+Frނ, ǘ_NظLՆ 7 ;~& EqR򪟧L><))>~coiAIxdQ:Q9.0IIl]Js$`xHO?}/]' -z6RG|O~W%?GHD|*^$yx-E{-g(aڈ?و_3:K,M̓2AF~#RG=llrUjO -,YpUn'{&JG>+O[Cm4Z7R2qRrr6g$.[Q2UUxKt䡨ْaXy luM*p \S;z?u00 kH@&$s]jg93s,0ciM+Iv-/ 4[j YEGhYm>i;*Qm4U'OpJ:{04e4O+VxY:_*8ab9 >o3򝖏czxhI<\W/Ly-2߭2/tit ɞ:Rh3` '(L}?Ҟ:PaAf 8m.{T pf .0%oWoR`/z`( d<9V4))Zݑul";oБtNFEX@YjVwݩ+_X߼VEI"8҂чàeC$2 50tF؃$2D+#1v;SL:C갆թF=:# Y|iL H w5.ǎưU/OULk&1~A%+8sT4i;CW-W o]N>T R0E%7ۦcC7_Y04E@>@]:sa!R3] PJlN]d=HN՝R |9\5}8X`uJ1O\D'0B_uvƕ"sP/vE2$Cfh1b"s))XsTLX"dտ :~5).AAh/Oj1_*`${aذI'ntj.ͤRnQΝ}7#\n) ؉nT@5mYD'>'}t=؆6e0ب4έMaBPaKڔjPqեܜBH}iC; gBk'hX{UKwFk[Ž>А!pes5ز(޺Hh|3}W5#PPz0FӅjoŝ|?̆iWצ({sku:F]| {̔3"%l.@J,}l!K+)ƞBj btH5p)P@|zl緝 ㎸<^b!D`G5O)nT(ϧ-OOِ|A'|, `r!$pJ-fd |_ ,Q.~*bv vq!l`M-\Aya1 M5pb*$Q䭤,+Pa+2R8$E8A $lnj"7 A{ZW_FyP AT.IG1V u `.Tb7/E2% k‚!TdyIգvҁy# n9[,A&?_6T%Ν ,jh-Ehal+EͨoQiPjwB[Yk/_gjKV)KB-+O\ K0.ևe)VcU'BvxJն׷ FJ}h6s1zĂWd*aR=lΞ)1BqHX㦴^4IsvFzDU7iYn kPpd/ b22fvb U2&rC>-a1Lr%_ јy˚;œ#z2ऎ'3CqMJtLӺ)v=1y!« ?? 'BԻyotE5:'ڱ 5:|YX 5%T+u*̍#k]v7N#KL1z!z\ $_qE.YG4lpg0Y\y ! {Òݰo;xb}eU0a&8@NE$hɄ`b'+0@߃3:xǺ-`#rC+7"b6iOa^8iuwbeRW?bKރ1zxi`wni#O8G\*ADȹ#0N7bf C?r/7$- ,_a8wR{ÑEۃuq 6-f;ڈXpȁ:Z46'hٴ;5ۗWЌ"SVD{M"m)uQêV"ՔkhRm)@8,W-߅!>X$F謕Nimvx-T)δWʢir&*7"SHr!_n5 &*<~u{6ž1K~&VhZL 84;2?m SHUv6iuGQQo^ -Uq (01&{mŧC]2CC0"%MT]ti_z?45ɤQ褝%ɶ ['dUd8la% Τ0P$a7WRR66{ PFSf&0㩠?][ f3a?9b5/oZE&~,GI2K@%V׻x5 /Ge<@ܴOhy{=+"\Rb:ᛟd7ԼBv4HhY? Ї.Rrѹ8BUT &ulm\7HS:[`ZPN cXLp)>ȷsx1yhjǑpP/r+x)?> Z:,]m@ݾ.M~˙[7;AYeS@6nS-WU6qs>BоmV@K0@7A*ҀagGV Ǵz_/{0 s$-1] Ǽ@C'S'>{BO#X3`ǚ,l>:p7';izID2j@>_aJ~̯A)?!pZpEX*oUE#}o!X:}}񿬸Jp1^Ԙ'ۓcXOA푒2tG+! {wnBô)ƥYM5M.N!pbH>7&4οjO|^(ɋf7 U5.9zv32PP}3ϕqa JD|әٻimҔ4Ԧ iijs"gQ*wK\^R$ ږ4F]5_-H4 v &Y=̩4=J>ԼX$;O2Kyχ&j+9.3AIٟQm(y&NFf6JNN&4Ѩ3s"jD,Iy mn7TxtIng0Jh}Rº$o$Ad܉eb#~2΃3Jkz/Spt,L]=T38#o嶐=0A ABABvj=O7FaI4d<+KzY7d*{(ݼAax.jht§t yT#&{2ʻA .;Nˁ-.>dYi2 _J2x%- t,q&Q.zPD]Eŏ?(|ͪtl葃cuغGذʘǠ=V U[W<*\,͵o^G$iBuxO89F$կVy\d 2KU9}yƱ)s#FG޹KDllҫ܁8*H^ IPr8%\ G) flɄ=a4*-:eBN9}뤁m~ )prNj[ ~q4]\lU Cs&Et8{|>owlB!!pT x3&x@Z^|JB~klf0Dk iVJg% 2ߊx88NRsĨ<'㴧nu<]g[T6o+]a4@sUkɲc'svN};,VYn^E[#<_rBx>ap} OP<%A ;b % +̅B}_[ol^_/v=^olD^7+yޑf:ܙ |N޺rUCN-rc{K9ںps硳D5tã3Lgٳvt rMqc ۙxw;Zr@;g&MQI.؝0, nJw'. ;]dX 9@$u u.v+6.h |\U4H^[ҍD{y@.PCdܸhmA|q!XAC$NP]^IB>^)&)0*ǜ2C%܆<uЇ{$(@ 7Ќ\FX CZZfSA׻^r}-h"6C֌>!/qgޭQ5x9/ @ |J7#R):O;?{oc>x ](^X|xZ+NZqo}Bv^> qrHrjdNtnЎc6P>P%St)^>w^J+n?vw~~~վE|Qaˍ&v+*mB0CLz(Aaa4t)JǯxrDžޞ G#њ`cе?hLqR$murrJfZuxQ.9 df1_MVja(e,e>J/]*CY)D) WR(l6*FifqʚXHd+MY<>9˯u+.fek.tﰋHj[XjO: hZ5}|2eϵmk{բ!qKz^h6h& ކOrjY6Cr>S(m,}8b.OvQ:ObS\.alMpb`o$9(^úLguq.0P. q/%B F6Ԧ bpxZX+PEoYO{~Y(g |pj6XRXMLᏲy;ĴܭTHwxC|/D+&?{ꇄJw͑ajܚ3ݷa&m*`?5H[m!pR# <2=F: 9M-ϳt *(Ʌo* XMcdDe ^eY:vא=[^eJ<@^@ 嚔s\Ѕ%H"ȴj'{0L8,< ?M^WfGV9"w0FDT_ep̞I͞!V?mPQw'݂FL5^y!= ,Fx|Ú%ǿ?>CJi}cPΑIDcy>v:O ANiT/+t0^{mۙ+S;rЛl0cM-HBx+ ߿}ɝT \che<&a hԯ}WUTR3X) Ul@ GFI1Fʜ*F͹͹ɃB;3+ږ@~`j> KJB"=GjDlTZ;!61FM=|ɡMLULp3?T@!$rFx0y zLR\q-7!oyh[`@@fBQ9CAȚ6_}*gyi7^??a5ԸfUo;¨>w= wY{g&qo8ڢaEAwi>,zN&*jwPTpu%7> hhCߣ #!OCdxo ῾?--?ue͘DۻӋ|$*ア6vlwoCN2 DAI!#tБ1R}Sgz{˛Կ\=O &-2&N~ ?A40AVcbq p@L;1Â-] (Q|jStjQ&ea ~s [v wI3sn(=s\_gʌbHM *N:jBE^QVQ*q@Ug Fh4% -W$PD1 `杆u,4Dh=M$`R;A{ P l5hHUB?,l6g?RMPa{0W[ {wC-vG--ʑgv`VtȲ@F2BDh%\WFGCAK|vzO<$r$ +HnrJ$\Z6 q~K؇>V *{\u.͘2tʲ53|>%) =\.UiFߎ؇dJ@!z{2HKj 6oqT;W=1H7֯g4%׆h/ 5r7 x(G|sp)qÑJy2zL!mt? $6au2—UIAq݂**,uWʩh8ϔn?DIJXMe~AyV˯;e ,X-wB dHrV 3ͯ&/VA>0!.J@WōnP9P5 @_Fs20I/{1pY~'TLki'9&fvO@#j:UٌMga!Ԏ8#w'|R(57aq-owsO]V{kdNƢ&GC@jrkSBa5g.qI@=*$+0AC:;x[9& 9mF@ga!U߼37c 7-FqfI lblBO  U# H7! U KA*$Cy.J&/ګ"Hyj[zic%*g,8{Emq֓)8ixf++'3i,['-DIl H84ꥋkz 1!3@$D! k=$୙A>ѓdv5ʵ%&z3 Odz.6`zE9Xn@.K_,sA@UBh#Ysp/uCQl6e!5^'gnC9t0>[2(F_qMX:iHYLԹ[PiDQ?6 u6)/]G߈ X7VF)iQ9)Q[U>W޵gݴ E1+,ݷpoy@w77&c7E?tOt?8xD=g:(b*B:#VȎpVP~"(R*'V#F)}vO4{(u7W)bZ b-Ω uW p*ܳ1NƱKqF8Z65mŗ{&kjnZV۶8+"mՒ"Mftl+?+Fs_/-ʢLNO+HG#d)$g}( Q$g;(.L?WIv]HI#sɇ`t L*4)M(9epȈPrr|K P(Vwӯ>٬6TӲL=Iy=]v.;7rQ ;NҞ20Dp\LcBwTw?7$B'b[V_; }Ac!-!ud=ceSy@P+˳7AЬ6׆Ro.l2q7ހS|qRv߆hw =ɾ2qX0H}w.>jaCKDMj ^iq */"n(R z|m3j.vxl>s2ZfTl7elD1wl #hCՆc2@}՛ks1'F!M.gj=E+hNS/)Y^,IQfj]Q|\Or&PUbT ~ͭi髟nw*W| )Ps۫WϾO Dp U"%˥ȿByDn@hk@&XQ$sJ'ؐ G< Yt>մ(xDH}>O$&ig`j9@"@ߧ*&I()""S1_Զ YĞ7Kl= k.+Q%yFOHO9sm&&jS {~SBr@VzʥAE_e"OyKҲ/A!֙oKpxܷ+_;-i T$_FW5mJMy}v^SYPN3x}"qJA l[TjV1}kkEӟ!LrX|bjXl~*8oB>E!aO7.MtәEh+(BiҟG ͫϛŸ݊LF}8&$mg9θC :=C i8)W͎&#Ņ<_{5Sx~h7c zgrMiHSJM P6uFuS*vG edf*+TR9#UyTʙ ?%e}jM{T+!7܍|od(wn[tGl}ABa=ʁX EHtX-ࣾӶ @(Sn"n-Oְb ; LN_I~mR^ii@iqoϴ{+߲q]+O8c7>=Ҋdf3rYW`&?޻)noyGAw/y@s.o7?'lydK0i4tE(Og WIIWV/{n0_x!D/,wBfxbrvN C/t7K 3qZ6"|<\akw}|Џc- )<ax01E9^'0d9}"Pt,T hI8Д~ר ]ՂĄ}<=-Os:1씧T`cTJRLQ>Gv'Ʃ4|QK}6:'qAHT;q; XY0d%kҘ,ωwA@v t_%T%R^Uol쵇$u)S&`lֲN-$BHHKu8JNgcbGIl=Qg;3ޗTHnZ{iv?]4÷J@#B D~ hFl8U5g] UH3)iT|;1baq(z(qII%p֘iRAk]DM|5W^/~rٴ7 {ԟ[H"_2cg42P,2EEfqC20[kȀ>#"xgDҰOذ3/zkV#Á!i\ ϟW\d=~]`?,\qF‰ m30`jsMxv dF&:乍7]}wFԻf̌|LBqU X |ȻiV@{2811 X朜=d.ѩ.xRMEϫWRk^j,LoO>*@Z0h)$eph4m4<DRU[_BaibVkflKXW"wMW#ܭ1*)ب܀lЪH&,mM\\Yj&C4Hza"c_t/Xr۷,ڦ2\=^$X[vMopr`XVE->Nv[9[U"4ʭxGᮄ41ssdF \>ݝr]NI^^ ^5;$,V>%pvh}bTN|no`:/IEXqxJe5sMNhZc- )C+D['jVi(,J.*H=.TFsiDNpT!gcpҠ)'+i4,9'ڽ" 쏺dĹ}MR$ǽCͤt`PiM+o4@$Pd;+-Hρx,-n o܎%h"D4,Ff6p~c&iN&$1_ę Z znSYt/+4/d$Ԕj0Q3*nU.  0vpw01p2[rH p8A r |kPiJљm/̸.GQ "ha4×Ep\s_^,+ׁb+ڣ)`Cl1d*2b+GsWFi.$[aO˯S@g0L@txc#*㢱O`CsۋAhEyC2bkLktcڐ:"׎f`eŞ->%D('xۄs y )6+,(Ey\B ;Mp#Y ~-Zu%k/b^nKMQ,DLڌ^tb6NiX4v + `8~bKFVlcCU&1I4gQǺ@"-s¢X"of9{g7\i&UBF̨9x`ӍtNX(k4ApS(ܒ 2^}l$S2BD/VftM^=#vꊉ/Dpg<^0uyop]0op0o5>=)g]7T8G9a+$^elлlb@6IiFoSEVj#v1 ТnWc y}}W[Lj\nj P~b5np+E t[}@oF^ qtSeLvj2_=3Vf+\<)~@~WEt#( S/?U|h,.rwJv-\ZF̯ҭg/9g2`Aa*μq ANEQ}sKypE-6hhC|1".1O+%ԟ2G Z&JwEfsGi?:Y1pe얻MgI& g|VH E1gbP0KௐvlF=2;gw{g{'!+IѡMF//% Lf'}bp,@d83Z[HE^f7\$EPώ A ROMuuUM(Z"o74a2 z=ht7baz`PWl\;W'+\֕Xf %F#")*e f4gZs7ӱx-j/y k'"BwR\E3y6&8ρF7Өb!&S0IF3w^&zoG\ސ"rdχCq S?ؖozdA /^Q)b Y~lļjDi8Z'< >0; U^F?>aͫC;\b }F 7+}PF<vP=ju[mmߣREO LBY _;7 Νj{=*ܖo_۱28!0$o?/!g"f$`R&e?'"y /8L4:nJ8D(*mUva>@ =@BhE\(` ֌OWcL^7`kXoXȾ 5"*ẗLJ 4ӳΎ -F@3J#:;cxZ7]V\;4]U;{E͆M͖Ofh~ћdpKF#PŔxPBؽaEtZidQB0V`y{. cM$>=ח'-kvkE|"m7ɲ4E|FB,z$Ε %MnU*}pjcuE0 ,߇({ݧbpٞ ).=e}Q^$[LasNߜˤval˕~ٶcȾO :Z͓rm2ibDMַo}@6X>gwޠ!,_-{ه^G /yK㭗H#9V]%ß*!n  aݥ]7ڔA쿠oqEJEd. d{O )RbXǙ }Uul{-D,/x~^uv) &d"=hD>iy"L*MPBj7k9P>(}N+Wq)QKle>)w0Lo:y~F'df}/D#j?0l([lscX:lnl#e`ṍfI,VɷRu@T=*ń4a}ol- %0hzr# + &j#I>}Vk@Bt$?P &ݒ ĥϊI4}8)ZGqӻ|,!0f"߼7;u~ԡAYK,!M \SH=jߦ$ht QHc(4(R @ReMɜ) &&̺r.LWs$!8l:DT3i`CQ,`CM6+PmRbEEP1QkK` mχ$贲udvy;yzȹzGۡ`nl(&rwL_=Bdtm|J-+ˁLSD/ߧYsUHG16e;I?@Q$4[f T[/F"6f? E&k96&V)W 9-ci>PmGy1L|{A!l˦Ȫf!<;ǴP7tѸm"Yn$d|L(ZYWh9pv F].PmhC-]ZGQJK;:ʡL#AM4J-`~%Ϥ,16q2wrG 2OSg1y4 pZ,wsk9VVT_<&Ρ_nϙS3t1r.D0PF: 3H K2%4MbQO$ϑBM 챚HicU^W}ܨԆc(0Zw$O&Ehf5C[JףpEqmȟ}8 AwCH s$-Yޛ~Iqc~4HCAFyK!O;>.:j^ DʎAF1S|2% qXGa…ЙK@X >=t^}vKϬG[8W-=ck H1vf/M{#oRG5V.Ґ,3 +חB=(8")nC) A|U:odB/+ B@ 5NQy&yt%D|jndᶄNKpTįnxJ8:JA$ipQ1”I #P=j5*cW1c{w[U\"070:uPɹ;XIx@s͟%-GdONϳqN)[2vfhVcV\YbP4PC@|wi!ߧ_rܟsytZ<3%t |f2HP2b$%>]Ӽ+`/nz (ҕ&ղ%<~(w[dLb_r3G.8տaM{T!ߍc-~[QIӖLDw $U͍,ؑgrY.k#|^~2AQ؀b19T;\jKn)A+5m/"4\T] kH,ͶSŹ$g )qLq~H rU(h? s m:k61" +=MA2}>EX8 z,Yt^񘥃)ڴ%HLcK(rI/ $)Ō{H˒uc vG~0Yi?G[i,UOS.¢Fm-h Z9\,Sٹ^sRyݯkL;?~ia~Wi^2,*&edc췆P: WA ?t >yHęAv^AAh i*#0mTa%#{,$r՘ShgF² X.Z8bp4=f2mFvon0^Fl)KڛZcͭs9* Yw*iD|SWv@/@ ՝ũa܁u7ԥv$#PU}u,r#Eh(WX훬SA,w?UuJ~Ewyʃ㤪2i&K|QhY:; 54suxQ?9=FԦC:eOPyEKNX)X̕aɸw*fB X*-dZP @s<踧EtEBӆ`Ԯpڤ0:1|:8#@6:i,X3Qk. mz=@gTSaϳ"\|C8fb^6(mNJ$,3Lĥn 7 m|pU@R}xϿq4")iAԠZ/ΞD)m UGwJ!f3Lgz L11L:RfGD;)sHS/N$z!IRoڶ}4åP 5XOJ3kn'`P0\ȼ⤮l62H/ P{2F~>YgcdK8#,ʦPpCN9xKs ERJX+\+˥{ eF:}- i=I`0mC){l(!^ѺP=`=8ea<3$:-k\NsמC-,*P`w^K+p\y+:miC:0EH偰 BmLRWT7NmWyp0xb)_ŁD4ʸ]*IӵO8'4RZY1pFn Gx9. z|7krtvjfg``ruF~ϯTF_*(ck2oAp!mY:~G}/\C{N3.) A8.oMXE*$}Lez-QCo  s$diK,*LP&NKB"yIY} J=#5R̭h&5\}[3e燢1kKj#Xg=Vf{Κ?g-C5H7: ZdJcjcGj,~ 7re!`Ƿ[ߤNC U:ܨ$Ӕ5;*Ղm~zC}3HMW4IC\,TMs00rEȣfgoRI޻c[KU@uiВk/$vdOb:(׻jN<\:OJڇ,,_ Y/&eT"E@`+[$b(8O4UAT!e $Ԙ*LiaUǹ^?yNrw@50FkpUC@֪ՌF5hVJ: ^0JAJtQg#Q˥=s,:`t: Ns %Z䜝W%=54Oa}wj;14Pa"|O74Xh\E:ޒ$Վ`?` LM]0-Lgӄ.~W\".ouKNR254kj߹:::LL:r'V(`9XU5…9-DI fGMN ?ugOE^kN󫷮^9'IL,.3d6%QkYYU\<89x ww%4i_]=85K>G#a˩s&'err0i8vA$G HZX9ڗ1],-cRDmӷ|7#>|)7#/Bi8֐>Q0tܛ*bhW44/r?qhvCGg4]R82M1I @YkV^Kxsvjc%m.渑; L$ZV&i r^Dz;+ W֐Ahߥ V dѬ90DzZ(jbyK6ϛp0r^Yi"dg6`fL[AYL:_.>WaƦ<:n(Ҧ(Q3w3 *{pAeY)Nobz9>VK=ۉM n;5S\9x0(c]B!Usae]qAd!ysȊ8ۜM7i$sCiAS*sMt[9q މ8 m8XhoI;87np$LLK2w3wD9S7.24 ^#c%Dzy|0cRM[:k%&MVNŁK "TMEj!7c:,`r~rd>ޠsl)[:*aۥpkIr^.陵f^3+b_3WỌgpqcxd LϢ)=LYtv)D\tr t@̀] q7UNJ"uye<]׌Wlq /m_ Z5-"C38V$9$_D> a\EoGqNU k Gӹ۫f//i0NFvAYfPb oJőQCy@=هc竧ia 8 q\M\e Gh9gRd6QgJu!]U}QW>GU 2>$9pВ%nxFA-+uj \kfzE WwK\ EH$ FT a~Ŝ,ob'yêFQH HL7 fƍl#wg#W|2R#;a #GzwdhD[fCS1& -|4'`2Ivr:Z.Lp(NHFY]Ճ A~'Jg>HLim6gfyA̪|=E-s_LtڹV4}}F,hv9:"} di,jV!v2y2: N׸n_9ſ3ٞw0|Y`15%DmRQou4I-K,.Ztcn#c1إL!K05fr+"Ԫ-'m.Ѕpqa-7! \%t9!# ""z%N0 n.l~i$XGS$6=0-#\%|rL&38Չk}*x~Hk*dhw[%ktI %,)iv,[щW7r35Z:ؘG?3󽮚ը*Wk-jUiѦQuhЖ+;@tnI̲XudZO &JCs8dp|?^Ϸ x _A7 ¼,92 s #ĊjI<:nǹ2XMܹPr Teg"o32nɤ2"`usv tXgeҹT|`ME` t>(oiwЦ??kw&p`φ+mVi0*^*(s9#ZScX'5Ŝ,e<8| jOF*5dq C3HvC %#!$Ӫ J?+mXR(`bs?ՓzH(r m%H,H+O)c4}[z;?>& ?NXΤCSȎJT-ϴc(-TիBF*.\%Z7IjX_#zZ!"]W,1kSJ1n/7etg)(9ؿB[htSQ Dl۫(H̠!Y|,NVq>ػn IgE=n1Pܦ83/͎7NN~ɲTK rycuEmQWG#8CS}3 -T0:} dWce=,vVVidKWRОmqYo@1cClU([;KXa&2B9= -CLED Am `~)QܱI4cvAZG];:guT[bLC^pNp ; /V;ufi4̷3ۅ¤=uE_h*e1#^4@ ީXm_gmSBXUM4yY" KmrE``مL <1:E[JLuHQZ0҂b7!]4#ؙ'ڬe|$ ۬z4 1$^/@eubGDT$YdBŁGP,ңPIEI'K_lO 3(|(\bU)Ձ-Pkđz!68I*#эIZ/|G{%SSCgSeS[C {vH@1jV3BB"ĂJm LmTz &R)/Du /!1++CxyWR V$qr{'(=vJ Plp;fƕC ވP>g%=A!Se7'S0H>;ck\|Gv;S}-yZNa&i>/L­X6rqKvsKj'&\PO@:U ]ģLi0嚿Z;]?+"[g3Q~!dRn^R!#ݢSC†dP =cEgF {72D^UT櫯ǀb( d E>}=5 y7/盵AIƂ|gb'G dO%{g*d1^UhÇCSQ~3 4:D/U:*]ka ֡Oz'A->llAgW6ҥa<67F!;-◿h?w숻ڹXښz:7rRy^y AlpxUCPldnؘ5KzwN]44k:}[&[$==8EȄ(B2bV~9Yɐ =Gbg8٣N̎9T/wed(D9MJ:$j(65+痃t\\f\}~I^_Uj%vKxA@-l~N*|٭2y _e? X*ԏ_E:R2BsŋvW&sS~Qyn/z31h鯟y[Zn8FRXiP}uP7diPj;.cL1+36CO^B#ҹ=7]ƢpGUcۦo\CEH3,V7yR?G.u3,M9fv fdcp<%l ~hFbNjm'"]d"gH&dc|-.U~U= U/ѼiŌgp2A='_>U9@Gpe -Px[qG-䌄XjO*C:Nc|EPB98㜯r_~:wS]Tc U{$BU6~#)^11-sN)VII|)9I~ npRvV)GFVnuz[tVw.quf pYB[fhv^0!k}u~,ְ.}m17dfm —ڼqSOsp#EOtjlThȺH 'bq 8hk`GD+Ϗ. A_1ec%lŽK59s9&_W0W&3/|Ӄ(H\dJlA F0-SӺ򣿐UºVEDC45S"U CShe]p5-:0}(S}7{iLrGfʀvCj'Jm]zQD9<{0J=T=PxڊfP-t1O69%Z"cxYv@Xz"2?>Y1Í1jTWC~t.YY?G2b;k.@@$@u#J[H .@t[r¢K 2w;gup!AM-.zP㠁)٢ՌT3}<yU%>/ Hft);9[Le=ruw8/Rn6ܲT~"Fl1mYŢ-Ost~jzXSPd͙``kHL 8˛F{||"{ Vᄥgl>;yRobzǿO@ tl(vQlWXG:)u\b|'lw 7>(FB`k#>>=}1\8dKMINJ:V$DCJDɯ*GoK!+-1N)hLEњI3ƆgxE자)|#ĞQS=ZG4g\RyqF] YR/3US*]DՈ}>- x] ~ 1^y`E<'`u 5=qGL/\pG)mMЧ?`Y $!a3U~JV̒2xH_1! .O__+7aqmgXbKqmac%O 6d0B?kFva!9EF`0~6fe H=N@g@AWxt e݆|^ʕf(\sJeqy7udNi"]!)m{AaUfJ{nMCQз{7_ag4Ĕ  bؚٻQ*L!(0u?P(ED8A,^#=H|HINdzı6(rf_^=R!bm( @DIJϲ\p2@uC!\Y[N%R:ҥX3dM-gpȤƦ{1 qY9 w0쯃+{8^o (`DA? ryCLKO\ҟFahQ+ZaFHo}+9:0$:0EDM-05lHz0 !jJJh]iiCHf9&"^t 3Zو2iHjzSf`4STClM%tVW:́HfOMf-斡đ#9]888ο'5@h:QHii9,ƺ FtZT`4v%^i2RPxLmP6s#A|@;s # Kdc;R^aoREl qx;vVRL>re5bȡ'0ttqPXͶo "K"6FUԡ㪷WL9㝲C[[eer0KٰTy i(>q[u,:7ZN|fLFцg=j& \Z OiV"a׋Dz GX~peB35LPB :3q@"9 .AryfmFiIRs͍8H5L8CDo3o޽uVYODj(2frγU$(_`\JO K@ڔP@ɍ)_$pJ$p@!,,|Gϓϩ=߀UdqD2M ܹ!7V0%,ԮtD,uΟš  qfmyKqg`Y" lfdbDK0؏2T1y*BۏD#z|C ,tlYxM1 M3H!:AWK4Zvnl$ m1O r VI!pߡAGD5uc U,t4cwHjP|f6!K X57v'5 0~:/X"]r e[WpQ8Su$1judAZ4CҕhsrO$OuPPҊ`d "T#ugWj)U ]BLT::!Cʑg 7ھf~F B܎, qe#Ҋ(:k6, GC"d6^wۖmmaPR]0s%[ ^0!2vO)(?*>Oym>έ&2OOOf7eCWk~`lI"~61|%rY6`E:mUfᛓ3ȕ gr.#ԘٴhD~ Uc{IVmжE3=Z}a?ΒP]YD,fau:>Ze,+gl=Z?g"ٖB(-=fߒ,q;?6?J&YO~j1$TA<.+ a)zͅ+{[#T* RvdS@R҄ӌܺ󑇯Cj, vG4@duʀ5.p=1YR7C#$e0#5ewHe@fZl X-!}&ZLOGb437tmabn0-:_7Zmn-Eu-ő q'0,Rl j\~}Xc08oHe5 :"f;6ТraCZ`0?qBSkWK}j#(.:;Ca0C 1+ؙ:J>T?M[>#|(QjJYL]jAX`DG?53R麓(Q1U8&ՠo$ŪXB^(s`x3 JFBfÁw8eTTg][C(Hy)krVDkI|eS۰Oi8M{w/5^zj#NuXYĄh2 _JqdM0HB ۃpہ\hzUf2#tlgڶp u2ˬcx\Xt J3~kr+TJ#q:Q552uO_j&||Umb)|VX>'[v$&慼(ע,5t o2m_x=1ꁃvmOsXAl; ;>%/TvSe0 rjO4ǹKDKhm@2@uх dl6.ZeJM6>w{)Ĺ=c` YenFș)jm[!뚟07pphΰ=vX[b(*7&#oV&tz$ΣxVӳF: .͸Lt.8rOH{|bte ukv79?]tSs:р E' HvA}Ti̓Rch28Wfbo]2޿HY?.D,Usv( Fs/Z}SR Н60&oVUdv59֢ B(-w`Y"R irA0Mjao'DGfv |?Չ6@g c#k60CF=ƍ)|< /, 8}/UN )+K]a!moY`%.dX+Ǹ =fWIM !!i6p 4~DNL8xMTǖ H.?ʦMFS-o?;_{&_I܊wS䣦~J}ضZ 荠dPI.|]y!>p =p}B%⇷kz e4 2!i{[Omu7ˁA_f4=Q+.PȰ.߱B^çX?0Na+w]8n{_DȹUBv5D}*w{]nD?],RAc PXD=XJXKOTEB\5 t]-AW8p=bdgkébTg #X4DefWlUbd kO 0#+yK]WH׋"Y\(N L.N̮ҩ ,8DYW*5r锄`q˄Y*5 "Fhe88T.(^) 2.҉4rm`qky:F.)kw@ԋa=WEa= 'eeI oXPĊuG-l nPUĊ: $*Ċ:I$ZciQ KCm3&?$ZcuK2[e.lPvFt)ȊkEhR .hRrPGɩ\oH.7S3)gfI]Ԁ3K'PC<&ͷqZu}X!_z/Ɩ#~t{K8۞+@,ɓsŒ@&/o#Ptf%SjC$OEBjB&Kv4>H~ &k0#3>LBvA@H΄ G k2GJ;fx:{ŷB݂4jX(=6u(~"%8D9TM$dQ)7]R`4!t@1sD|JFfTvm/ʌAZ-14({Ϟae&Bc2b_PcWNnT"T84|6iËl2.U")!mi іa;7,m{,a;g5](R+lR16ОgBy8aW>cyohZ{qp{󟘆[3'Fѥ"L.QKqC:7,؞T<Ơq~9|Q+T} Z]L#$3BFUX%VᏉh.KAFYt9g0Hhg$Û'MΘ~SJP\lԂ8m8q/h$LF@as!M?be3#GB` f!`5i3lFboY_u1q϶s9ni% R[22Tj񏺜~ 7BN^(ſq*d:Ȃ!T'h%:X Ɍ T"< KGwFHLUV1MjtpCC,mx萁H[)}fҫpre sŔ6 1jηYZbȚiH{ -ky`繚&戬Y 9 F포)@O}!U4dW 7рd1GD{ԂI P6X]0t6,B1wqY8}f$RshZ[U=1 (Gҡf`3N`/4Jk2$y 7ofM`Ԅȭ C| _r+ZMMC'(Z6t!>!vb$A/QiWDCPJZHMLB>m r&XYH!G~D }̍ng:`#,.㳦 =tH9Edn)F$ƿWH_ִ(e-GdhGyo[kc>'i_l=C&*VL\ sifj|Z<ň=ؤʐ;PfA?|K~ye|p@X{"AM.s8 b`b#M$SI/'?s<k ,;0I[ 7?LrQؤ(V?AÉ2OƜUis(jr-q`^/P=i'FUTV2<2B@9Jodf*nE5ٛN݌@M,TMFS"צқ%MA6̅N{xA\mVh(ѯYFAATsx_yC{%S8tI$5q Q3]؝NGu |Kc,GIʃ',Jj6P D K:~*WwqMXO,WC¼W0ћsvGHÜJrߧSb8[Qj.їBQ6aSˑeRocgz&E ܳ+ƧknS zڄG 7֡%a(k,vVo|F:v\:Vسi]FP7pZ#uxl݁ڒd]ϟR*,AYɒ0yn|2g=ܜ!*c'v1s@υ78{I(+RN0^ß:8s-^p冠Y谱)7_A(^;p#4]q8[p.Ә8UDs}F¡4rÔ.m* l8e.Ǘjh# #7}g_nxV49xC~4pr,GnrL `J:TN[:脇q uc9T L+}sMCqH#{xЉƎ;árPgOlK`r\ X4Orlb bH]rϮP;?'9`swQ8X2cpa+ Cfch6L݂DsLWL1F2 FZ;A:YލbV 1Vjlض>YhSEYeab-k_ěb :^Нuf_]]9ﺛ-< dMwR)$bvFA4^mS 4w(nTH=QWT=jd'y~4վ7hԣ-UIx2K8cSI+&15ތ`S+]b&"8߬n`FtlW_XlG޲eR%5ia%aI0R&9! a: R1a R*!)>!)$Ԉ$eWZ<;$%YZ-$ebj| $SJ|R/$ IOI)_HIٔDI R'!->> $> 25(%V/9 t81-!(>+SrTݔO˿s٪xz9 ?yV ڶXDňhL5O ]Oȁs4#˦͕S ix.?v$NlL]?4m3mݘG\/5!ued Ը%rt)Ǹ2bգ$ qLZ^գygάL,mmĈO'@^/ly|sCxKÈjjRWjȤtbC̾ZWMrJ̾[WKdeY9A’h#±]՛l[1m3>{;j}F#Ӥ4m8f7':Ysi=}`ҮkDٰJB> ւDh%P_H0>&\kFnEuǤ_qWz/x4>?^✭`$P?,ۮ_A3X!\0fEb M>Yc<'$H3-G\lۯ@hQmҲm㐝ԴmUmÁ֐Smز/n?![5 [3:ADvv6Wd_"AT~c#& g%3 Cͬ dٕeڵ%IH? Dx/׺A2f]GYqyCxE ueXuC Ep1B1^s]?=GV~ 52p;{ d4y7|dCU~?ޤ57G8GK$FU[[ .C S $Z%6@IyPz%Q_ }43c[mz6 /cDM<{'[xY`XAq& aϷ'ZޭO]@ ?.a2-v4]i&\XK|Np@mXPP)>oa[<giwi#jrz5䡏VٚD$ҟZ52 Q!Yz`niŒ,`,ny ɮ}fkU-3F,^;M&GX u$hWrGzfF..޲Wz0+(g\1tZHZE<69ydDk0yP)8bG N>D3(pJ -3m gߪ]T&hBMAR2ga `r`qIGH咬$pK[@';,A"$bw Dn9:Ɗ ý4V0yCxM4']: ] Nd˛9ZF0n.6%K?\F ¨vͽ5aF04Ы Oӓ/-^$$G9.IĽi-#Bv56`kcBcC -["X|06YtbJečǦ59G6)LD?!쎗^$F9 k널uZN\ $n,~D'+P{ :OC?GVY6pq}c;@n/WX 8]uQ1\xAaK0,pη"JB< CoD4݃Y_v/X=_8A~3/;3bLK62?1/ދꇬms0I"?23C%I]m4"975* PV"+dw>->L6N@L"O`g cw:;ßSd?Q]qwG{ G𻧇)n,"z{3Py[{ 0s<4cWPz;쥸g,glIE0y8<|<^$/j:fpNyMoV]f&̍]Ui^).C"J|CSB@ S.ڂ̑Z1z`FN*hz2v4fHaV 1,O甶 J*׶,P,VK,>jIUWm$ᆽKg`5KwoG^_Ԇ6 nyc+^P? n"rPuU&34M)_ӕ(cdK.y+-pV1G{TRVuΆÚ8~ۂ1KZ|Qrd/u<9iƥJn盧HČR,aC6D]ܢZz$p_<Á--*>Zҭ[a/x͉na7<$)fW"wq~*ij hWuoC5)vcs{eWy}S fK2&'ӤYx/q\5/ _(AVҵl=vkp:Qc'̻RKK,Y`>se񛜰FJD<_W `L xc ŢL ШaQ%_=CT$5eMҫb<ã0@wvJIgӑp spx"Ddn*{Ao \x~Qo2nُ(6zd-BElIEO^lFmk#Xnjˈ`2 ' 6Ղ֭w^ $"bLBS7'\]Аrbf9,a_E 1rŴF!i#ljq Fg%őЛHM)없e 3(glF<#dFCn^6*\ Rohɦ *1Ԡ H b#:N~'!)/-œͨYy4[9'C|P#Id-Hh'NJ%M&>Ha%r#o#htN@\{STIѲ)C@bp[ Mh&p"UC!!舱3#ﻳЄGHJgNӭo+:J.S=кE#T8e+_P},}_P lkGSpF| sцԡZAJ8{(a\HchHNn2#%JgrE4W)Q?Bl~t8Х ۶vqՆC aj:{*QbfBwi3ȧV'g/ b2DO 瀉Sj&U62Bˠћpz Toinew^!noL@5KOʴK`Y7߶Q2h~%&Aơ|;IÓLaViPo8yOdU6[ `)ZEIZ ^D LWFq ސ,% $R>_UwI=Yfm8kY-lczXuma|X&MԐbNmѱX-r/m?$>U XcRI܍AE'C¤mZt ]Ʌ v{ Ўfxh{u(+ Bm4CH:8_')AVpD~V^ VJ(6@:EY$-oy„B[_g+'"]lkz4؉r3Ae=qB]uy:2H4i6OIUM\e†m卽,#.uķ`ШxnQ;@Iqk8Ao2O _ 1Em^JBo6s7Έ' +['Ꮸ3Oc؎ݢEsH9:CZYjbK]>klbߏ[Y~H?ks6hm:(ʏ.ai&YF-|KDEaQBȎ&!,HͶN/8Kt~ ^X_Sd- dg&OS|Sy~ȩ8?n*#D: q8tWs ,3:e4(7eb}&)Xq BڙڎY4{~l>iUJ{'mO4LdCNH nQ@OJonZiNMIc~(t\Y2F VkJnѲWVYרw2h0C*0ixE-Ǻ\JYT'# _Syw#- .cPj4Moxk!By*ɝ&E 1NL1nVr7Rs'Y_ n˪~+l97{qrNq478ײ,#*sS6MOϳP|(7\ġgFuA&_:ݒٞ$% .*P> 'pT4#zUf +AK!FG-I6|ްлbLmeT1,*t2P Ij8MBk-k lKq~.Ed "%Ŧ Pen4  {A_F 񄩐(W#6?]#Dݜ'aQI5mdM*ZLJo}*?Y6ˠj6:;EGc*ŴMaJO}ѥoĭŊzV:vw VOB$eFpc%f+ ֯_l: /'s' >dƏii eavz^kg 16gs'3˃ڑ_b,e yj˿'V la fr ҃1 N1bcNvw,h`nɃg[vy31«qeERk7FI3~)xA¡V;DO)- 4T59d i9湡cbMб*8O@U?eV]l ]lY%o3 םN4Tc_a`P "۝DPuo8R,^"V2ʹ~| ׹M*a1+AQW E!.dP C#kH*rm809clJ/ DhۮNfxöJ32t=ø)^ێ0s|T{7r4grϽzp*\|ϸueuyrP摊Ýz@U)w[pBWN͜z`LY,4y$7 WݑNO ߬w]9H 4=,ͮBs ^("C)@J6v8hTUaGX)̌\{MPX<6 Ѹc֟2{Kpq 3uKWؑpNyAHڍs. Jy]"KMأJGT-;>,-fdV&ML+O^T+<r tlD" Kd9h:L7:B`4mڻ:8Ju,[ҒR|xᢑ md䜐<&h m??iJq:2?㫩 뭜,nf+Wti(g, / P~~ShC>14Z6F0̶He5=a VZ⮘9ox8QM Mv V\s/(Jw&v5W ²zf*ҩ.GijJ'Qu2]S۽|=F z7GƅJ+Eg쩧ʅMQyD=Qa @;<.[I$ XBT++?T*ͺwPᾃ۹P Ȁj_h#u]~b( r`E &~¼n嵧?rxeRLFdg.47n0eh, r @״KBK3RΒ'[q:#XIӓHcMso,tK`NSj:84TD3PBĻ^LvܐURQ/TK(k!KZ!p!k1+E⍥Iٞg,1U}*NiiU[);>+)!=n ZŒ n|iob77'bD8"wWC T\ O7py}\>g7>575p}TU'7EIz1 ~)V\M^Bw2s':~KL#1^.A=Dv>o[#$FM4LѠ\ AlA_qrw$Tu>yCWfh\[?9[W7B7_w|=0Ot=Ams׀};ׂ  m)8n0<߰LBء(7mMQ6lU۳vj7I]J۲ݹó2tBh Q[^w1JhQ-}YƎ2*ރd[}Iʏ:*2-L;ŐYI1P͟h/KQZɍR*G$N eXu$^L4EYwLbdZr r/Nrdd4@5xx(y5~>az Le~+LcR!(EYKZ:g)KR٘|e@Jc@ԑ5J:9%"aS ̬PIWd@NݕRSITKo1>Yoa w"541k<ɿћȘ{}40#oŹݺn/]5u,b4"J0$ Qǒrڛ#0}hV&5}ƭlX\~gΕ4$q)5Zg)at1bIzR+cJ-d NnH$e+Fvg:,C'<4 Zʯ!&a$EКԳ(w WNM*su6FD~֗U܁gP!4 ,M`,įsoY.m c=Fk:(Ozőf$#v\䣝-#"SuY oյd[yow(mWp©^\`HAq 57~$D wv]yOygg8}^a.8{An; `m`mHR1FبxD"`>O&#`AgF+] &meTWTŅuS;[JzڟMeAE0ƙ0 ȵ1tL,2),A$H 0)T f"o&y#Wp{-7.˭haN:OEZcSS(Ϡ{~kҥt\/&C4.bX8)ϦemT&z:b3r#&<(2=HVR(TqEB{[J DҢ11ϵODUGpPљO3C\~+mOZֵGM31%VޠNK9=d3ן3Haz}Ä:MҦqV΅]v/ cWM~,: #@ }hL|3 h DIyA*F+GS*<Ӣ 8+ 7D2X ׋P3!Ec:дKZr R;iG~wh.Ѝ tb݃#)Ѐ%JoMPZKnղV֨&뢪 F"܊jkX?δJ!/es>խ H`WѨ71ؙq}}ciO WLwS"Y5NY\uE5ErK1*1~HWO4c▶ bmIVsr8K_f4BS&d,h26ȍ3FI؄}&oG0(#'SXO~Z33lcy;M-8;zT72R/;jZX'UW,pCTcڑNYDϟY/gCq!XŴvz R\vH*8H{_`l+^4kQS=])=&N}1q/ȇnju[kϫ`6d ` ^0&wsKOw&)t>?=#EO1*JnYSpxxm T 40Ln$ 8Y4mMγer˥)9pJE J؊JQB#5,J=$<*7}M#0׺vd5# mlѴۨvHK0H `ऻxIȹmbn} -n"Sy\{}r)4~ C$\ϸi7,e&\- ̥Ҋ/6X^33AUXb}աeIW7:J@zHh] ܙb=Yr:T11s :p}DCkiovMʹ;( #KL(ELkEa@~f1z72>jb*._dg 囷OÆM! qkР`մP"5GC%؛8#g/,k=լGʞgS R3Rl{ا/ܦz]] -M6^:ϚX4œZ,C|M_Yt>Oz7WucOI4@LfVԔ[Bt\\najzd)Pid1VX-NC+@Y}0⊳YP8)Z#R.wW9'+񝊼@lu7OF2q)`Aj8I[`u#[B-3C&,I n䠰~>]]])CY$Ã}Z{ +B7BGeꑭWYu[k 2\ %x9ngQҕDU$ަzb}ZKz-W~g։Q{V?; $Sz$Y_@Op'i`!*!C+?!E 6h4*%6)%Fж@6C\:ns_qoC`ky;qrR(VNLI|Ϧ_oǻyd#,]eE\t;'#*PZe:|ѱq#UpNP%PewN*] a^.4EXvLi:#h%7g3m=UxQ텖iigg$Z$.KP|N \kb'+Ίr {BC&D5pjH#r a>( ]i,~M 8 D!tSS j8p<\?-zIit-+_$r lRkOWx-@ Sj}gon.ѥLE=bfber=wR3ȱ{+& MYq^X':0Dmi3cEeIĪH]co1췶Y9fZwSNgVu XkCbQm.ND4瞳ZҁD_:uVVӒ8Rؐ=N|9!?k 6WfjG1gU9U0t6y~u3y >G_;¾{&;,w c07Bk-a6wĭM!244LSo og<1g ng [I7!t=aĔk?;B~Waԟo;'kЄ'wwx u%fDo -ytJKb喺j+ yݰGTЛ7?(ZeS[mJLJ:O5nR5akf7jM(UOݠdi^ Y\X!,qC=V"ID,cg~Nbwsԫ]NW.+=yb"pZB9l7vw(Dob4R&%ԈEJj\MɊTSyhwYvĥfi`Jfr*؟ @( ƯF-uRv>nj銌o,SжWUFщYR iODWR!Eu pMo1e,RԲL=q>n 2I3?wE1wKpkoL]~brQ]EAgs=2c 7<éArCt\@uF #{^ [ cW3$MIEr!턏| EAh* qDId%#s8p2V4! 96ӧ1ԑz2ҥ>dlPIn6r"f:eB?X3'=艿)e2xTmX/4Q,i3͝U(iR(0owv\pt֤!'޻z 包/ٕ~I-eiPG sp;kFIlL bHnz .A3î@5^4e&w崽>IAkDMqSpwaDAZ" ʖKMFR o(?J!'Bˇ' #~X@#IZ([,km۶#vضm;vضm۶m۶ϛUu*@X\S-\kFmbJK<8A=Kk l+@GRm%qG0/1nG" "W8j@-#RsBt*&K2ujכֿL3k$@zY|[*6pz!`e9N {9ChP>JB},Qi颏-1\Fb2Up~"Z1L[En&u^ȗhTߣ Lbt .b1ؗh6:Ya?&<ɥ^NaITaUqH E}ɉ]a\,mKXsr lZ G3OCt&;5)QdNf 6[|F?.v>*HE%x|өQ2J&2&:&$ף`d#~Q jř__ ̡,Qq~q~i~ӦFFzz uw@ 'rNf}QV\G汄GAaQA T/Dfl/G Rtt|䵏6jy;# d6u7ԯQ vQi847O܀8R{N&=HI8-?TY>L cو14 \a*טw&K;oxP8c rQF3@hQw[B/FNӴq+}t ֔Vl;*6yטr(u/qrlE͒BܰdTXaSR"6]Ueރb }@ֳW?ymVH$gh,B['D _mϻqlJ|[Ǒ9}*3I먌9}zneU*~5#I1 U4(h_RYfrs Gg<혺4(p)G|mፙBv2,zpFwr)l R ݀2ssN?% ]4E„kaBSsC\(kmNƬL߷ [܇%TX'71.ҡ 6^-׋=$.%àE*05N/;B>h1}p/1:cOsZ{q>t6 +dڇ gLccH_fw9?dz7<*JxNl^ݒy$(TNK="v1ON+3QE:p[[C|mY~`Ęl`_N[/KؚJB 7Bq 70z#:9%\o:ujxhR 0o:\&?ӧ[|wI*Ϸ7]-;/]_ F bDdR:}սr(ABlȑeBymXFTI!<ϛ#nGuǞ(ٶܔB^}{~b f#$m,e83i׈5AxB9ĝXFo1k8L֩Bbg$p3FXtz'ϖtQ JH&3&sٖ1١6LcxeNMnӜ-Lk'=?~ttݣ"~d^V=MZ$0YSI[le_QH,B\2fa óURf5vqG@3.m,Ҍf +ypT(4Mq^?[VPr4X<^Uk\n+q &R ŲS;=qwPa'b : FL3 $sĝH%[] Sb}b 8̾ go֍ }kXU˨_HxӒn8ׂ<9PoH{HﴈΙpc;f 'D9ѧJT?,a[W:BzYF4!(_9li h@J͌{HL1yZK, ^ގLIյ’8ih0 :Of A[̀*b7)Cz]"XGс+r˞?ZyP\9'>!=:![;՜eP1_R㫷v)Z5' Le TCv`m/!#Mֺ/73)[HB݊PЇE(_6^1ݎmZ" ϺҲL`ER`de*|J/'t>)S29ptCȟ_# i^<|)Ddk*3ti¨xڐA%(=\4!z?f6X؁o?NtUUL}t+Yf_ D,JIg%Q,SA3;O_BtJضWyR87Ҧ JMHo.;>Obb2S  :5U"+iI; gTA#Z;;Z`orEg  <8]},e `  }!qFYmSA6N)yXTN&a:xLPfDP)7`iYp3՜4mcL, VwH'IanUл;j9}A/9,xh7_Au^)t֮<"JJ3UĽ"kgEFB : 0.L.x~,0iskTlwC)m"d :ި w$ʹBT[2 lmjr;ɑNtL'I:`!n1}XZ̬M/;_\_1r;1"ZOƝ:=`Bb6Ylyo?="eCb x-̘w&/C/9Wm@8F]`_Ǔ&{a_>ol-ߍ+2Ns,zmXhv,*sadbMMxnxG`{odc15HfBS˖P+ H &rU+?}JxXۃvmFqYx:LwL]v_3l"3-J,Α;}n}H=gh8+P9ѕ7/0ܮ., (zA: 7\^1FR ?2&Sg *ik$0 e'־V(uԮ1.gto[UPN&ڹ9S~v̿9-6Yc@T-g.DjcGګ/8ri9:(=/#:T!Q۳&Geb*zh\' +01v8o},&b2\9/s;*2mRB-2Uz[qIRca`b(XYkv͞<;6?Og]a04TNɆ3UiJP]hZڼqO BK Ҫqtֿ]clGr?IḈ0P-Zu~zj,!^QԶۍ0Vog$ϩEWja@Ur9&3Hovԭ/rB>K{"OX\Wx|*X2hyEuǹd+J=8b5+s[7Hv'K鵺a5M:rF;Oz*p,^Tw82r /|Dpvgf:J6YeA60vt)gר?MB%rclm:[MZhf_]p/R:V K4O"Ba4k_+u͙*%-O1GIg фb,"tY_N!f X!NҊAkzx BQE@t|v6jR\-մFx纱Bv&»׎A NiE |_U8 (kT8}F/0x_E\x6t/)z={~7D"U6 ۪eU̜K5u 8EVaK\ 7@)Ko,QY*{߰h?꺷*.ZV $j Iix)IeRaЉXEM=Pّ\ۡ|./ƚWv0ow0Cq^ORɫE}l"r ïVܠc3I&>}c(]A\wH߲Sd.Q$i߁/E7ƣv) ]Oӊ}@peڅm ?49X|n noxEer@ӓHC`FzֱRyx׀ξ&ˎ؃ok'!y']:4^ٲ+!'! l!ԁ`g&?rg? |#@Mm4oh/an B L7^G}r* Gm8} а<,;/" m& 2f(?6Q_7T Ar .[ޢg:_^ ]ΆAl(kit"Iֱ9e8]JM ]jId6:Ɂ ~2Lk..:~}^Xz+v^^N^ hT@c.[q[WfI nw+l%<8SLf+gdz6??/Q2Q!nd3']YJ21GF˰3RE gЉRVh様P[CiFu ɭ%;ѼyyyE"#ZIVy8@VLLزtVUguFc%,Jd2fWr)fԎEhkXC'3иI a8 zimP:F'[cGItS-Tjj#Ek:Ȗ.v-N.Z:۝8Yբ!0գr ?2::g~3b&}N](E+HFko mSm!.6`FLF6& f 4 g,73Q>ʔSw#{-簆Ѐ;c`x~D#uS/TxApuT!PtbKjwv[cQ`fwenvȳQ_inOW &+ wAm _B{A}[OMho6 @|fB~;asЄ@|fW}ݚ~V[|WyCQԸm}17GI+ x']_ 01co9#˘~Z۷T(=>drZV3K)m 4_Р✵_*Ybm&oyLHCD#:{a]4Z\ѰcFםHƈEwﵛo0!p슥2CZOYu'eeqȋ(Sa36gemUPkFPZzG>cB9{DpnHowo[Sc08`x5(%ϓ)Y '{{-*ealc=-mvI酏H/wLU?Ė HEȭ©8хpeק^h1 9;[6؅ݪzSZ5rӽk:vNDZ yj8&/J $ MKD6QILj}\| UDޣ%t$ 7&FV k1{Ke![),c;! )UW'cS=i" B82u2\ A-Au*&JI6DjnuF]*HBLWwo36Ԛ)n=QO-=M ]QnӆjnY;mpNX9M`g Yhqw8 C,BY+ / r~G'[Q\ _w*VrN  ctfqU JyAzDt#DMm??p'nkxGw[,vb]9'km/__9Fxn@-fo_W:7n)r#*.%]G95:H5ssGHEkyawVtȱ^EJ\- ! -pK}ѽ35$ ,ךMU2ePE_r62O> 3I;4)&LvnoGq? t7W#WvI:/ǙѾFY ~VaH*eEsP^MlA juEY}CB(%ҳU1DatvՔE Ck aH@%=PqB+Bb+j~qoq}I,U^$+$j\t3*h-KTlMgWJ1(?WwUOy%@E4^%G$8FEy6$g2=]́El30K]xMB Y"Fv6^{gRyE߸Vs阩4  Kx7;hk1!ђ@Dv?YEL !6-#̙xwџ'oA2Ѹg -]Ls^8 nL]A܏FXaU w.º.9na> _&B?5rzPn/V;~[R_X^)TC} p FAӝkm'&0YY=+;+'oj)d¡aoZ5n4 dR#3:vPBTP|!b<#K@Pe~|ozȊ b2dtwI=п.^P26v15ݯu@ <@f`[0@iő2e7.Gutw#x? "MC_{nL?߿TGA܆0$@Bi`L`[b;f}r* ȕn`nG$ WtFțg'tЬwy`R =:D܂) .I2$VhS0VD;Q J^tnO(m,aZ晝hg<F<{|Bx'=eI.&ESS.F 2f7ȵZd":+|3(: AmI!>@=Xi̵;5q&IV~ QQ)E@cROh2CP6="3#u?CN65PmhoOcjo' pDm< I;EA] m"o0W69$ mLJq32æ~ J۱QÁqq;\H6yv^i@ W?Mzn6.sWS#=FYl09˟P4`ûmc0 9Dner5 tЈ,^ǠY<bPs{{XeK݉ۅ`Lc絒\{Z!rZ=[s d WP&[^%$eb9hOZeJ(+.A` yk-\3gwIb HRG [f˰G{=c!iEO9)I&Q 'y01,{4Q#1Ird,/ѐ}qfJ}fFUoR s @6 L-0kE1IYŔIfT\Vj0 "xO:\|}-+oJj3 M| W~pOx=DQR^=--PƔARE\MGύsϘ+H'(+jztS[2s1+Kq5ݏoxz EQgqqFM^x[nkqq*s;#/6%9u=,e,4!v062#]DZ C= F$Y7`Dl_.BFծgf ""Op/78@d@/&6$`=CkL:.3PTJ\CٕX̊Uۋaue"|@梢/^3I4KbRNޓ])::I0C\T\n0(Z5&xC gF]$Q9o9},J򺏚i +O]!,ʣNGwc3v1q#>d} uE#~kvZ8u)2JHR56ؖnܢӣ4Z%M3"M^d`3΅ڀiCPo4 -Br[lt+nԫ]ݴ9*18R"])geݭ<=Ymd0`25\ K e5 m@QfF?Hu5ߕ~Bf#ûSٹo9>:Ogq N^U53Xj f>+v5gn_SGeWXHR. ỰӾV+wTm|x{&.J&$5HIc績dnhFʟx`L50 ItѪ/y03l1Da_)r0kթ:KY?]z0tᐫhP5^940D]2+8 ǧ&a~U\ YU(,XyxFg٥na="W)р[;l2}Ȣb|ǝomP9q?+騌;qW\ Q*l\<3n R"ħ/'D$UpT#V%G<,snN9<}SPK $Bg)l]jTaa~v>|E.SRN&[o? ޓCtZC+ސ\oXBHҟnBHY+a5µ)kr/xf6|*rpGݨPy9\/.&DUBkPfc5 Dl*1V>QKaEFU ??[WNйYJ~qEQ{.9{7{5 /hDu]޾lʠQ/U6dd;j-4'p Zx;;d\zZX\&-Ǹd?Y R.NqL ]u[Uՙ24cd:5%ǨK43_ΨUv{>j$cbl*`u&V=^7Iab@ub'7(0BgԃUW:~S/$C"[NИNAIH;}`6$yx0~#TH.׎҂ÅdZ9M8e B7,[(?yxw ybD%-КhMv6+Y57nc=?pg|8 ! g+n!uXMm Ȗ~ '{Hu%`{ϋMpX_ ~& Ǫҟ}!'L0# &WFS7jKp#i$])QpYͰA1k=Fi|t.\8:uk_g@l^_'+/}7z k^orEEʩw4y*k)+tdɞVh;w2>,Q8983 ΌYDN\+oKF}h"fȄiĚLL0 }`wkx$Q*p\Li3><ίj4E8uogr(8&7E0Db&8;b&ZPIWqcZotn{L/]H?uLSb &E]&h@i OR%RS#&4Cٱr~JtVD6QE^F%|6ƐLԯj uuȍ5됲\ [[~D'sA#rD6TWM줧v3V|0`Mqt A> `yˀS+w=2r]Pk鋃֎P.="9p_a]!.ᑾ3i# ܴUrx~y C>8\L\Ll\ܞ|ozP"$D׉zkh/ԛtÊMSBI6Gd=jܾȁ =ptqPJSfm04B:^bMx;숚!oxWr'e 6.Taj` h 1J*usG'o"vT_O**b&}dh8P`yTrr-uo0fcX4֥wKK矓ܣlܫ(ǁ4ϝkko﯍ۆHh%?#(Dq: R, e dT}uزq zw4 v|ٕns3 n3ttn.(5n2gҹ yb0,H&?4UɖHO0!p VK`Ky8R#~f[]8YB@8ޓȀg (PqBRn*w~6]|Xяp#F^AJ 0[6h\lK k+G^ɽ=Mߛ4@'-0[*IE#LLAt/`Zgqvxe 7RdJ%;l6tmlgef4eN=S ,E6zK.IkN!@*Řo27o8ʘnI)>'f;; B̌2&_69ɴcG;-nU7\&6"wF ;"ir"S]ϐD/<.^>!B>AQ>B]jO2l/#*6QOBz̧JF!w83@v'3D#iXU_0Rb^Amveޠ|fI[+J E\u mGGlYgIr*5\]M9hlFRh018.*#APB*WAnb NQ(%M.f^qoOcj-иHXesLϜ8ecNB 6xvٝx Y>pƊ&9FDK6[o6#F**! -Cd _C6ǟeuIM=659Yc,mgЫ" 0x =tGpUHmST%<m5e~KEFZ3;ƦJTY.(zyTK lf@6) 킮=50A?6 EI&߮rs?sުfk (BBjs(#SwQ~ o?3שk4z4(wYNN׵ԩϜ0&)כV[jo5n|FިBlgѶTy8@qA s>ԙq^P: ne%ݼ+];q뺒?n/?CSXg_dm-RW!FJ׆"JB#&5TL[sZ^ :eV2j]_ŪhEEz -~TuGLYVY@[eK7BabY~#fǶ?]{+"/__ad`(ihe$ocdwG++9?l=?XZq/(KTܩ dP+pGaJA ,6s<23BgV\o*  L;TMM,ۘi3Urj#M^<\Ӟ#^)kScpa@\ʈ޸>|g2dq$@Xz`e`&!Oq˥t]6۴ shEI HRymmpZ%sN ?cOETmH|iz}p)ƏN}Z @ܺqØ`D Kb*b?iGBm횴))Ēf 2 ق`W~ؓESwSvTH 1wkˋs/5J:VHM;H\n;t[݁'(}]N߆@,6*ΨH ;km7nx;9xKpxFx؆xG{?БpqeJ_3 uR@xBqqZbkd"?0pLELs0#g3?HHoPpMu 7";8kp J_ES[}d7(ڙ"qX”V`*Lռ=Ŭ=W3Tx*^ЏʸU`*+sQJop=[z% DĬDm&͉h7:E&iϬ-{׈-NX E#,H&y͝i-/Ψ;"s:yP.CQ.Inך1 ͵vJX/riÍؿOt9<ײM'TήS&J O:%UZ05)oa堁O)݄fSOAQܐG*uh=Hf'.ardj=Oa*TWJPt [~Z-h`xAGePm x"KW4Dx{FIJ4kQ&0&),׊MƼFC~ǣ3qb4_%|,ɇ1۝X9)mƦml}'* 3w4sm1V ї]1Sqу_kǤ,qbӽtVe x0}B{)}*^˂sN0?{o-?E~bDp1F)'%`wWIt~a΍ (@͕-xcFS~弦2-]R t@F/"`FOG蔻 ,6W T/RB=cl%TЖ2/O-;k<gS3@N5تƼ c^6:}B#U|Q.$ %MLDJv-7 誉/_EZz &qf:RRMXNNzL@.-IP{ƴ)1xxr0Uxo_u.1V̏hQHc9 k 4+ag|+-J|4O˽$96:t0H/mՅmtʀ޸ӠZ"z@ۡ ɼѻndpzz57Y/peR Vs\X(6͋BXko8PM]X$|d""5-x8/Kw[ş\}GTDJ.݆r@9\*Hl̴{3p;ME /L@'&B +,K>w)+\ҲbgSa<%Tt(xQ6o~[9; }?n.ީ~*k^N}8TMKCqTK= &BSFXL&Uh36i~A](豁RwqO8ܘ*fl.dZ {v׬tn9Vjetvm4o5]B97έ37˸EUyԵ=e6mFCs560ʽS?B`J);o߂VZKهV|V[F6w>0BA 3咄:pvbӑc4c^.P_̇oǴ9` 5;ō/-d!"dr.d%Dqp( >ފ?BEb-8jg6J.)Tyj۟3]!6=Vk"P Ba9E. h_ݟЀٝ_ &DQr0%~)5 Q% $lj a]p'n8[0ߗc# *70{Ih9tANE~Ŭj]hȇFG5DG^B (_aoKޔL@ancEVyW[|ߌ ȳȍ-"eҬ i %>V؁|u{l\R`bx#OM`R Ci Vaa|mټȖE?B'-y2#wVϲAC6]8w!|c(~ہ ._oݿ=[:o{ƪ Ñ5VI AlmoCٵ'Jw?dv{lMRc6Pa f_T56AK&wб7̐]qP`vm&/;isUҰ61l5csʱC_vPUkg\^HH$i5ZɇνdƛyN/ 4g$N㊉؇?wt2 0<\_s.Jnkc8=;[<#kov2SVL^V4ֲ}Ek1Q9|ftY9 NmPډ#{ ֒nYU/|U32[J DsѐvMs3+!R[1.80# 6K~8 E8*I~<}0<#DF~(Eq F'4`M0*}Kj daF|8#u0SF;~VU(4;Sebm XwBy-]@~g|]ZYh)R^: .@V'Z$]cShE&@b@QMж]G֭׋1cin2r#GR(&KXMƠ-zd^:ZfHiɼ~7r2=BN'{bbInA~7 z2}W#iڪFsͅs:"iz&2EDEZ50vI{KuP?DZ7x3,ӁNd,Ծ`D7}ahT7 v& R=1/SʥEyk!~L#yB68Ek'#wLH]GC7l{.SEjt}FW+26pd,"ZY`h,,iu k%V|PnxG9$&qQC*anV2p;.'oqMS@ *fDCحY2y y$B;wNa(c'}"3Yu 35_6OLRPa!Wjιm#Fc婆FZtRI"վCÚ~&rnu w _J^L21{Gʬ`W#"z!zZfUX\+QsX%@:'~9 { G_boְQ:ePּI6 g 1B8!gcrE!T!;E +jsI]x.)kr*o=ed"9Pf[ dFǣ0KѾ|XXv}5}5f&"J\C ΤZ; DnKrh/N#@0pFbA<1q/VG5UZkLlyy&1IOfF`4j +yG0zij RAW@E1l;jPXDLufyl")Hl TeBw:SH~Fr۾5S~I*C_v_u-━q}AɦnAKem Y>Ujbr쳋3s&gq?oxU w*=[`7>oȊb⏤Zk3z`Q!L/Ѽۏlvj;Ba2?E{︖EzrrH(l$M2 &qڃ GgB ȑ0јS:MJ?8();3 esob Nq$N处_xa z7a4-8 zxYFgb"w,])vORS8:|mӒd?F>, yx)0DqG5(4Bdxϊ`Uآm)K`@1e/4N29u]♛\5Lrȴދ\%LjET9sЯ`C+^XY7+J!m3]e_7ŠW t]al< 0YB?l<ܝ3Le~B[~B].zwNasv޿n/w0IAoڣ uK& ӌ}Iyv3@^k [[*3GD 5H Jյcn[Z=N?kl^ 8 )2ϩD1ƏKcʖmҝeF#9A`}^x7?n^x'Hxy[qr߹MOhAbxB$z`_%tiLnmT( KH&#۞s=k@^pͼ#/}?0o4_Gp)W2l@??$կv.x >Jpd cZ^l1,)YD.jJm,EAW_~j\5Mb$MLm]2C"T5gJD?I",Ƶt $umc;|ŠeIm*G[Q [%Wm偫oUmڪN";_'#ͽ6W'/IC!t%dAGC]ռ(PΚ;}5 IlݣiB3Ln"H(ʠKh{IF['i1a"aw'.`9fXR'H&LKgbB.'oCwI3-Devl@(e rpеtKNk[1wF?{) `[ }@oe듆/07WFk?w$|Ox ITI߬ ja%mʮ!Ёbag쳁dYv2C^{6¿rK'̇ƹfE Bc}5cTXw]q33BM·/ ]G)Rνhz=6sk cRG&Ôh`79}[cA4x{kLA^~ /Pz:'5gJ5΂ ï'T8*s5ĺCq؛"+^&?5Lfe@QeaМZvD3 ,#R70Crі|QhmmȸR^('#4VcDؚƋxbIiB'A+]l g,dcyiUA%hMܩuȡ4ĂqF\P_-/cLx~`x慐g~p+yAAϝ d`(%O /اĤkZ&<';$$\|sgLj-{, 88,09sf|0zdbv#` C>:]aTTpޭ ̚#vB7a u,S֑ i4M> %%S5$;b2tĶ%Wy]x t7$UhCX09@ݤNPb(~=./ˋoErKry-Bs0 "yC'2U;6 1 [7,.G0/B~+R>'4e7/Om7\㋰&t|tHP=(qN26R݊V;8(TJR%D`dݛptT) K®)ADDRwW4NVf̋\:Sn8rS:q`e m7D/Ca'/\NJ&[]E‘YNN?ёl9v)(\CO/eˀo+N~!ofސ͍BnVS }p,]i~p$i`]nL\`(flii9\ چ{N"T^I5XݝDpm~j=}\`g)WL 4?8p5s5?sYC@,7e5ؕ/sBZ>m ޙl$(>ҠBla[D,A"c ,=Q֍HC?53!4MFbhe%3WXX,[V#Z0EN;e=NI ͡|Ixu^N^g?@O]7^Kݽ>p~>i un*A> jcm-ʻDH;)@U<^=*\%B:,zx& 4J^ig9e "r#w:$VO6S!;YYzȳHM/,Fڨ[U\hȂ.žKu\U:Z%{M3?Ԛ[rрߵU7" pkp$6tF/|;7xgyahTVڕR&z!s,y$C_T{1GZkCf<+j͒ai9S.NZ$BƑ Fޯ&)0Ri[C$ =.])Ж= 5_<*Eu=߱n7KВOQc $ RV#Z3T-9t̾pWQ*[ Bq,,ZW#a S5t)ҴhdUBazbm'!nI< ROf*5n`y3L^q׸@ `Le_Xfs]5<8зɐy}[Za{EN $L#N&!{@qgq28T@Y8Kn{ck'#2kV"+%#ǭE]T( E6H-q`5=zуC֢^=H D΀Lv[ P?7zʗV esM()yHzN]h,A|N%) >V@cy=qN<SLJ 4agTB|'gX?07_+O8o<Jq^~u;[X;3"`n]eh!GA D wP >w}`-:)YΓ"%+|@(X1#C,.34pI*NU9_;d] {cƢgvCҼd|V-)~VrN}C>hlJ/z"uۤonAqФ?8sk_"w˘yEg0.Zn`|)N7u^Q)ﰆ205ccY]\mA VMQd :OcV]e88nZHcz!,qnSTp7saF4caո:_q7R}L(޾-pLfҠj'm.}<0q O|?2Ts/%1{ g76jj~lDO{*ƛ#wgPTor }!IG(",^}1!#I^׸甦 ;DWŏ@zPVޚGo/,D8 '}9yj?![V8E/Jl O:[&X^zimXϽ?NN" O5eԋ~ و0DGv9mڠX MSVv+_k[teoic~ <\g3W -vFhnb$YFhw33w H|qOvV;AOLOPF І>9,Tr׷BfR}f [N8(h%(Y.2O{y͙,,u^2= ;CVC@>ܥ(nZpUnPp^x d)_/n1_pUNnmsw# sL&kUEΆ ͱJ0?BSDmPոK&1S17y2:o%=#KJd9狫Ȥ,Hv%GBc8ؒ;̃YT>v735&]ڂ߫xMƪXlaŠX::g07ȭ+|_!Q]HHWQ9+% $7afH-_,ʧ 74ɑ*O81K\kUWM[c.ۭiw.Ade*]A9 ۖND*r5O-I8w6E˕HL Xw0& KlYAx|wt0?þړ0'.JONUK1 %L[ tBۖ#-_~ v)$#怂flTHEIhz´ĝ"H>\ t~OCAF֗nG^{a~YA ^;e4`$7$&Ni"L3%POٞ=/G'Hͱ G cEc8_GiCa{FR6dL[xqmW'߻5*c@ T+2+r}e)G˜LǾ5%Z+ah?a][QK+,i,4jX>7Gllzxx'=|1yv"W䍹@a)ŊWvOBm'`HG!KŜ :9Q[TZFozATt.^1(3j}YdWcz& V,\3pXg^8'Z"S溶I; ^d|Z Ļq'X=NEN2WK(! J7gTŌd!Fd*tz!'wHzeҘn{Z";y<3SV:c?pS ]a:7iӶprpѢ-)B;\/g/3ΏQ?zyL4ki=D K9jгϥudc'31Kl]Ӻoj[e66Q*}z 'y޴J6 ӂY-o\ܯv76F8 .4m,Im[ǏZuo{D7Gǂk19)Eu6 ʜ>e&q״YҔ wMQ,g 4^rS  #yutj4,,;oSGoi q'!i/>hbޏ8 gkǘ*ʇmLϐ,-2-u墿7;C*Da(t? F` {Aq70ui鬮.Ǜ-ݞo0;88jj|  S;Iۖ}1|||A [$DFQu clO=yP^",n4&tn"S**ƹLp\8y:vNGmB6&j5VՊ̰\6Z.W'U@sݪ6ђbJaEm\>18T|\Bn䪈b{BgxpE@+). p]dJn{Jp5;d0uii|H䖗 -$BrZ  D>~TxNL7\-7D| ֽˇ{K]J20" )d`yחsCU9 s;]i8(+Dw[zʺm|xX(f ZD@T<*ɹDF2S|'WB޶^8 &I[f??),1}k>/#_wȫܓD *V퓥FjoeQO5K}xeSBa:C 6)v Z"1eT9KQՕB< '+r .a8K|ߨFIY]!(:V:UY1^d)o^.Ez]k̂dL+ 2Q|*aZT`}NgY jsO'y"/$EUM_ GGuTn33b5-h2E cP_4ƕ]0/(LJ'&q9Øk뷇*9١cF5;$&nL;IDRia^#p=[]9C^EMK=v!oƹ+J+gaPA$ŀ$ $bw6Bac3*i:-YWNMITɇEֻ IKv#y(ǚ2U$ml/Xc,pxlL( S(I㰨\d"Ԗy-ZUJ..bumBV27Jswbh[DŽ͇Ds275!2O:t|P8D,".7d@,M8 lѮ|}7L""KَڌXƍIP+5Cv1M.C oomxH:%ne yhȈ;5b 'yI3p?V?##_*Gx^1B@tDKUr"_;"o)Y8^Q/0y!%B1f3! R!(IރxE!PAIRNx[n1!7񙚉[Nȝ^ ].ƒB: ~WWT/[6c=Fn?b3{XaOt{٦7lw>X=d.rǃ!"hgaf<6f夶[Xށlդ~eT h^nY.%rO"+7Lg~-&v /?8m&\e.J\cC=p>ڪo: B)2@_դ: h͋~`t@Y~YGcֲ">[[9l:\G!yHwcY8~uQa1a֑j -<,=uHpw6Z} UUT45L4RZ!+24+ki,b{3z;ꖛ&k$"Ba cmπ}).C kSYA3XP@#%y .9KǔЧ\2Jv2qD]gӜ5 燏B'3 e(W+ \Bml;Ѩ3ƫweA],l-0E'Wͪ2l(&LR2*X*rC)+8*_0G ZmP77 >㐊KY? p 7Rb4fE \u4K>\}f/BZdf_1$&ƋxNb^2=i̼ aZ5p_jRVWOHT )Et; \BzNJK*$2԰*/T[ĤD.a 4}:MX!M-_Sͽo?I+lEN5S>Tmk?Up]Z]6& QQpȯВ ʊYN"xd ϰ.am+ԸvƜِfֹƴ{󹺂98AvWdoVcN bO5ݏ 970`ym3/*_7>QS{n&d7TpWp)ׅ7|2pܙݳXHOlH;%&ȼ \L;_""1XA o#l!QȶTF؎;a3_vow؏_yS^Uڝt0c+ s&ǿoT=-efLò8/d!{~좴f6LGKqb&mBٖ8ײ1=\.mtj4j\y_+NWm | 4fՆYSܚ8<DNL ?wVS\5br hU$sa[ņ}C< 1 5oSLZ8{ۥ S;J7S S1Az?Oqe cR9,:^CNBTj)4Uf&震ò)2- Ð5Rj03C|<9k?IS*0 ʒ-fJÅ)_v,+Zw;61ZlA>rSX3MqETSB($ [60G߆[r} [/BNc21gӮ_78C0:l~v2gqCDn;Abe2:|;-rChMjᧀ!ǘ< bJhMՍFK~(՜[D*f̖Ӛ20z3P̚8 ݮ1:L9- *BYNAu]FEGks{#~PUŖr?[Ϝ}ZO_63ODOV&> d.\D "4P=9dJypm>.Dgch,꺃H)jo=64v.!5W$^Ҏ^b y/<\M~X ZKd]Gu] mNTbtBpZ`ʒt mTa2`zbǢ3Lfs _hZ58緪zuIlq _ B&U7hvFMHJ.mA'~A#D#҇8ʽyCP8,s>OӅ<4͜|F9|(MpVU!T1kN2MFBï& R:ahD*`B%zR ?E*oP k ={kSοK3WI#t'jVRY('hQ^JV'Y׋i{Bj2'KPI8w RoZ>Ɂh};H|gXYO}WU ]r; cKׇ+~.L/!?Lp67VqZE汢PB# S/( J9@8C35 /#T]h]L﹕@>[*u+n&0>u0yz>0О:pMe?-4ԧʤNE9! ]$Xt=7UE$:Q1LC)Qam&{-`GϲCtm\GJ"Hbw^`LYvnZX!{ng\Plf- RtPA&]ܵ`q's7[&DŽ\%͜`no! }M3p ,ى,@Љ“#!%}JX|OUrPNܫ-X\j/\^ 扈Wa+@^rH19 ~T *BFNOGiU3@)s0u~UF(m( [$=OIwzу8鐤LL@kG,hPr> KW\M-V#:pK!#,lg,^w٘SMar|5-N@낎F٨9#MQt3Dp)_w{w27p Dk8A+ ];J ƭN!n7!+) 0XpH?}tQOD[%#"I$j}yκɺvAG<swdIi;,!H;DHڲCsuYR3r^F=n:+!.Ӕn4h>iz0cxzug D qR .5V}*H{jukd׊e$I(SEP83R6BQ'}t|e bε/![YPJ$5-]mNxm |e,At%LPiEMN8)_JI{1H z{(v9#nopKF:)KGa71gcQE1 Y쀸 8lV l^!k! S5ovq Tiߟ`]'3I3-H]ͬCՊ-{f%PD@dBxN?G,c B^nb 򹁴N|(gmUD!L0V1/+ |350<S 4(,t&MX<D%P-5Ɣ,'-`}Wq;)./b\p0yӮ7H7òr:\(w<^rЙ.sUa+P+ Pj8ĤMCBl=^QO龑CH˧'If~ o2opO?_ۿPQ6e&m Tak̥?) 9%ʋ.s#s Kuy2m{WV64+!imtnK\]4k-_b)MiLCݮf]``s GF1'Ҧ[FܴhB~|O|EYLsqqkV!Mc6*WmB"C!ﺫ@b6;(/)FγXS`G(7$"Zyp3 Fi6Xkp[jiCwQ$ yU4p)sΕF03bz̾'}NxFdRZE4sB+)x YvT9#*5G$trqCDNŠCF ,/R).U{-`oz1.ށvo>LSW,Zh8X  !1p !^3םt2%[_NkGo5'P5Ч)Sk1*v7 ʩj뤿?)`Bqėm5QHI2?~OHk Ӓs?n\ؚuaڢ9 m'g)zBY&-’XW@$%1ql`w|r XLj$zl/;ڑ^;.:!vetrg62sD>b/{-zV|*5arI}!A@+}=t]n>' E)^M=ՑMLjt]8ɲJf|Ozn1_SArdlo2a%D!Ȉ~=ͭ<0ιo Te#[#, c *A$4v% gO .%(De<8{;d7Qq0N?Ly)*;H 6celxn.D6 xɒ#7v.ɪZjX*_ҌЩw Rݠq !P вoR]ԩ=m)ժ)=oLN spN3_=>\^_d?-U:"nMƄK"Zb$ OT6f*j # SzΤ w~PC/@azx6W^; qbn*1$6τcRJ4 Tb2*\Ɖ#,>iQulSI z}5%+26= 2EǒYl;J=n VqrZWba@9݄l^5j_.tP4uQaQ%:Rs\u옯֩822xJ.ç̴d"3'P4BXPY#+y֜= 3r}>v|'$\]8 ( CSAV^>*1Aby3~h!HպjεE}}=oi@Ϫ6J2]]sƖånW'jFΠb֛\~%6  ۉgt˩wYPFQ/fA6iڽs50lmt9&t Xd2<ħbgw9P!qI%gCIHzEQ %DAg KDonᯩ}T|~%q)aNK ̿y*Gx r B|?ocnͪ "P #de'T>75(SJpP@KɰFa#tVf6h̭ ذV[\WN 5(<+!l,eIaKҟjooiz4 [D3Oһ Y{lj.>#{miN}RI[&#L$R3);yfD;>*^-hn,(E^!!YT{E9x4aYljbπg,{hs92 b RKKhmF@.}0/'͉Ĭ/ -~3d|} :w:s|zÿ< W @$\يm:۲dTK%:J %HxXO VL-/×e#be3 ci ˏkV>d}bwZUhumمu-م;.CuD2.cd6Bay}=NctA{P_4g,*`h0tLGllW]FL~N9;R-ǎ $;BUlC+`4I8& ˹R7wbЖJvw5+$wa+Zߪ-J]8 ޽v!6.[+P'$J}h1 %-H:IB㕐FZD}C(ldz[ܐj{6+NzS%jxbCZm"&?^Xcx7%(V7kL,>FDRt/p&FV7Q[z }Hӟ@yɜʲJ^oEKu˙$Ѵ#ۉ=Mhk)~K4D(I 0ɒT.S lAcϓBjAsd=JXQ7[XP(;TOkh+\y"֫(LK,-[?}!p;D0rAGGfvx$2EmW$2hEsugHpFH`/z&#rrXFb)[[7ad=[f(#hЎ2wOO+1B8ޑ!NƑZLj|KpN p:fMLWH -nuM/}h1Cɮǹ\.0ͥA Œ~uTЈCa,0~J)GJUF.'>غ bs+`+_9\ >ްKe>[TyIŸDOT%l v&k>6mִCQD\dMV) H?3#C*Bզ]«RtIgMB (>ޚ 99Y[,@f@pQc9w qm2x!UHGȜtyzhG.}m{'#e6*Vl0UvÍdlMRr R6ֆV'IQ6.RGL.%R26 $zqNԱafE"Bj.[̭xeb2S p[۽dV:nuk+%HCP:ƒZ֖Q*/) h5K_ڀk9n|k;:!3NWSwA$/՚srզ@ ʝvz&̒$Gy c%a%f=HgƓ5_̻#]56!V*+?|z.ע@˵{+?mCny%g Ҳ9`ԉ',l0&pn %'w8/x0ۃ_c ,l3c>APcvjLaAeGlLaxQS[YʴnLt!\a0W)8lwDKeu'=͙gl;}|qB%儑،fi*t/|"ܳ>3T w!+Ą)ee7IՔ95e(-?j:_e)e^v[' g-q 94|B8:wCUeB2$[k.6і7l ̼O퀮S!deLFx0/W(9b*PƏ|ra)&F75y]h^~6ރHaTC%B,C: 8@PPo< ;mGPdbkt+xXLLKaԸRrn]8 B$GqmfT@ٹ2b~%L%N@.gY*9?o,mgkΟzWumGq $֊k!w`nƆE}yhc5u&cw,9y wg nlIsе{L &;5t fZxLn|TH7F~ʀVxN%Z^gZ7&aX̞€6 _Oy)[ot=24Qi 5E~b:TuciE iv"n ^*Dc'̼}mS}L`)3]NB=M;_&!PtЊ ݬ:~p>c(?)R5Sa$aÈva!' tCPeL`zv2 :܂^=XnMO4 }RYC%b^ݭ ྮSv[Rҿg4Ur#PTfgxP8#B^aZ.V+s[]jxBؗ @ ^RSnaYCOrLtU`֞DYqWC6]JURbPJ?^ޠb%Fw:ݹ\@7*(g< b2ĸ\u*%w"RdJ6&+!~3r-#Jg/]'/@2_]Wa2!6e0H&<:ri+ǖiPGPXu$#I=y; BТn|0C"@ѲVң .Pp Ӓ-6X] ה)ЋAg^`.z \kF@Dؘy-leoÃ0M A3 QsOzJbHQ;lx _QO9, 3aqaKj% [wS7q^Am1J 85L SA-OIkۣ~SƠLR33o[t>??.FqvHR^T~񧒁SD#ԼQd%"c -XLλL1Q/߯wVRo#e|c<ֽ])ճ/h4T3ݒ q^Xi9r; Qejؑf;0V?@@{%BL~Im3 ,lJu!$Vi!yCk`;pШ,Jx>5;i%dY 8!,0ҍ c_JÏA'=ΞEkb1M. i>uM+[aND,cs\Q b`=.[EcmX,B4r ږ|eI)7ҺJCS U+iFlO|f`0WX]2.6&( |@1@h_VC%M^52H%E4>=OgL<TfޖosEp0',&]N]:zׅQUb#rG"#/c*ogbe?snr^-ڳ,M)}9g懴]+:2l\"'J%Y~VecRs gҜ,Xf)15-mșu?t,g]aI41r 5ShIXzAlj Sޕ#gy!7oX^w#mNa,YiR|١?n.e؇+y+dʚ (V/ԗ3cXΒ%DCa$.j|댬Xi qXV3Is f$߱ ^(IbOB+!80m:k,Mrh~DUw1._ٌ l("![RGRƌp=J3&6DQ 7j4)8*Isnuo5QRF&a@kT@k]@܅F2woYwniw@--Cwwww7UGF`YYXsRJ0S H ]cYBW?Fې9 *Օm0s |cG}-+j+{q`Om b, LѠ# I': qi,Sf\EcYҲQʴw/LL Pe%M2m7 # Ѩ͢r>Koz@Drz;/g1vN%r26(*@R~-m1^ڇNV̫1ƦGLEZ/ k=`ژ{E )Ko&--DK!:?Y%4 [a>͐u,T¿ęW_-8{ƨ+h5yy_qʚ#oU\Q sJL`z8^8P3엄q9ȋ|+O6E[h,,SVlTtz,|J^նE=]99Uќ+gNFmQ=fy{ÜX]~E"']r&4صˑ?yw&\[qr&W+.1GfڍCMwsSPh9qrO'-W+fCIoԱi 64T5MަEDP ~V'c=v@<κS4 ރ>;\!̞ $֚<A^D)LܤL&p*_d?L;LnJX\T1H*4tSCMfVWuǯS&ѥpumQn}LdOVGQz/:k N& g=dWk?hc+R2E2c`{8~>|8F]A4DyW@xvw(,G"Tr5E#5 4`ᔹX)Γw˺XXfYE(DߪaUCt$˹3aje־͉K]Z"~^w[M$æYG(QQz Ga09σ.0\ Ic$ھ*XE3K0 AYL`}2p6yΏq7?"5%kagcm_~'dD @iނF 8צ gA6UkLB#T4e7 s2-3,LieQ[r6@a4 wJ8غ@aǦXC q$8WЙ(a,1RZz/6! xٻ Ы7O[/6-:Ɓۆ?%o9Qq`!)q*U* 4a-eul Ӷ|9dwh%EKNl03<9N'Ͻ@zAnmVGMYt(JKɛde/vH ܏_b.[+=Qv <<7COO[j O=ɨۧ =~`Ũ;%$5)+"=r:6z~ H%OS=Tǖ,$:UL)="3L)ӭnIUVaXӱlt;.HLw,j#"N#FIs U.R┕i9NMװ@"Cj2R,/ҞL2mOX=<_3|ulɆ6\f-fQ0=#Ka/DWZ;KsiD"\ ӤiX*0Hl`,Bn^4 l&{GE3Q`WMOչҶ{3 (ܜGPsQ|'@8go!]ac,(}L dȊVD}i\LcOUuI1J^'PNr3+/277ߡ'%tS0QLXlO { }`)eܥ|qYSgs٬{.a+=k!_7JH?xy|p|?܋?+40. 'mAI,,7~$v?w:}D;Aڝ":a2]ͱr1eF (8R=&U1+#+R ~7-\l>(CB;6>~y}uɄ$g* ۈ zf:؋jkXbQL ͌e<XhΐŊ c6 #7!6ܾB d쑿%A }ybVQz\ܘC:%AUCdQMK Ƚ sz6:j²,XthTkFeAЫÖ kʼn@ʳA#Cjg: TK 抔k_[E6A1F(ԱobLCLf~Ƹ2C~I'жwZ\#S$ ugV+QDX&/8hY10x;F;DZ*W8F.ce wĉ y&sfNЧX3G*Z`ɍwp)H6|ÔI1udlmzCeQreM?9:P%B?ڀ sX{WGU!B-CYOMwy k$ 1;;c@Hdkt!5 "ȧ %yPu呎+F0c 8ĝ4sB`=t'6wgdٴ%GL < ~A0ϫsD]@( cJ@)@_]ݜb^c'xTM x]Vl(Ң>B4yPQ(SVa_3f ,ҺI2#*p!ʭUs='Qmx򇍌Uf0P;?^0 Y`EA8;ymi<R: 㤓9JgB*d!sZӠtҭ $miEQRJ_ypUmcPz@BG~tA p3# pKtk+Cwa"e(4'<%s;eۃFlM1*I%l#ALI=B}0 V Ω{}Jrqog:D>գw >qO0hplGCn~'"BG~(wƗS"iB!Dyq)`}ŒpJwx{lzSSUHC1˰ eI)|-eJ۸|LyQDuuttʤQu3Ly"<$ J:F0FD%EvuIvRu|&M3)KmIqMã(THrۏ3k0b+Ӌv ECrc=*MG2 ՗*7}Zˎ:r&˒49۴-3 ƺc=0!}M,X1xm "2q$E4 ? QgOt'ث,KjЮ*{UvO6awj‰Fe<ƀN̍0ѽb*#["ŀ R. sݫw[0򄵃{ l90rj+&7DL}cZs?<2&j#=x#NvR'ٗ9AJA.4KH^ ,5+>j.?/ :KߥQl%흛0Yq"Va%<AhNa}_Wp+Iة]nިOQLMq(O 0e D219OЦW.%3r81FVJ -kHY^p^ Q4ש۵\/_y)OA!_cC0+)|;KZ>z7ޝq7Lw~;;kBL5&W}ې9B9pQ^wxwx] tM9jBo%Ak}XjD/_<,Ww@ҿ?۰~Ǥo3I^n޺p@,nzvզ!zs&Vz+A'-S:d4{2Z&(Ġ}:ycފK]vkpyoyTinŖV_d0h.49Ӏs&*}POƛ\ф *Tۦj,ٳ:nHay'am$u|Rf0EjCa6eaQaUے !ێ\ 87e/$)m̖% N~Zę;224 'm9gVVJ}J0ZYUV ^sR ab|g'MTی5JC!w7Gʊ O1j\hZą)wA/>Z($e4]hs'P[/Bq&"^-d@Økx-Td0?}Ӓ.=lZ#T&3zL9"Qn+lkBFMQ,Et,H,iW}U-oxrM>ۥww:kV'o).~ G1V !/8ߤiV:q9F1qfJ1E3ŧo/[}?S9ɳ)8'zϰ0&U@2 HP u&f3=&+^yk({(^"j*){Bj+_h_J"7!{ :_r"n!}ܕ8 >go"[¹?^#S" :khQzAai!:.MjΧHF*^#b!P?4c|' H,{:UTQ:z^Fߔn^ca^J#w).qGEPEɑ+FlKꢊXϋP&Q*8PtW򊼨$()PvIUO!y_m™en9wLrqe(LrԭGkHNp ڛn,0 )J!ȕ_ɘ7P^ xP5ݽͣdfcz^YRcj,IlY3K|BS59nΌ7S Dn2\*[zWn z"׺YTF6AGn1*BWs Rx$RDuTjkm^QpJjqګ\q:5Փ69k{;g[ݝ$,_E]<Q\K ^8<86΢5T.)}аL"B^n^;X>S٠=:6)Cb NEk`["3>tgUܟ46>b{*2KRRt&57OQV?Zƃu@O~Npn]BQa/&E,OMj@F^ /ct1} ؝ ly[\$X}'F,c^raOPf)DAt+|-V%F+ѥ-I=CV(f*9?ǑJSq1p Ie^x<_1Cy3ng !GHkv˗:=D-W`װ+{l Zh=bxl_H,Ⱥ\\9 ;gIm` KB3mx]#A=t4Qؔ.T᳎=٥Q'ΔP;}.d\LS95EQ'oW@hwiTR2N+t"͒B E8CimIGXHCbxIKwvh_'i?0EUҚ+~S&m).x#8 L_4i*G>Z_lfMH`f# EJ-+Jf߇hrDHϞC/L✤̉1gM3NX/#Y,Tdk= %?vWX[+Af,ifP" ke 8Db$̏M0m*bjQ15!0JkdGx2Gaލ"6-3N-Fp3O", i/VhQZZj~ˋWΐ>k(ce~}@$c mϋO K&+c '5|E uHjyira.&+ɶ8ȷJw-K6`~ĵAHÎo~$p:[~$'l_F:qSdnS58IzT cWDd~EX#|_ [f\3W]l6h(W]& &{?RQgы%UZmtWR %*2!K;ZfΉ *"*`;=~TGd0\,Lu1gEһͿI_Փ"7Aq?2L @٨5 |7ڪV__ȃ) DbavKXY#($q9s:4!N[X90dL_3.hZ}h('R_p*5ig EԢPrT)w[^dEퟧݩ)NM#h*Vl:rK4̊\vL~ HOh"=˳8`93˨38*J;Kd Ègx֥EG2VsN2 (^q&F@';n#BS$/ƷHXbݟ19Č<4uaw\AQ^Leգ 1/%REg/@lYQ'8*% @r3gCgc-{՚f4ⅼP :a]Gn%Ӣ[f[F_K NO43$-k%ZHX$H-2UrG>"S7vaRݗPקW.Oby}vzu|~8:2d'ɷcV&$8̝U,8X@H9ROd/~} }5z+ i_WS궖1_}̆cSa:9DwxͨNU~Ba0i݀AL Ҹ :ICq>_$ufvw5wD܆:E3qTZDrŃ)5WֱH*}uàj XdmqsMPv2fciӌ.ڐrQ4/W{cAS,-Z4]gT(P<˺~+k4w5!<0Q!6|+äLX`Yʔ_ߘ<6>~)@)tMP~B2$S:&9h3931Iֺb8ע[(XIT7|7*69\e+aA4 $w=?slsoׁVLsYS3ƺ%nIL/*]!m4ƓTVGf TA)5 ]`o'*wF>.-(aխ7 iJ,FZS`vcC8xX²J!ZWf~|Y-,ΣX363Cs[nRq.O4!.rχwhzZwIC=ARڮlh #St/n#9!(7cOG]wCBĢnYD;NF45.se}|Z0< Jrݡ~*KϤyF tD5?0l(-"1yH=lHOV`ڵfx=aEK0>q齃7 $.D5@LKl"Z)u\-+YX fp;7u& Q:65AA(-bA0:SH6i( d?e=U5q<l|g_wN>_~|;nᆹOͥ#< xLJK Ii  s#ZMh[~Zrv7Ig2ybkNh 3}8z"C3fÉެ%m.3V FQbD]maױYKs8&ə A\`j6tnQqI ~Y'좚vؐS"<6Z<F &(4AdBWyϹZT=57L}͜zsg w~FjW)F-U02R1Z3y+/Mժ۬8VTX\5#LBxf Tu[578%/dNoآ唀{$3dTjYE@`T_T fIQ8NWCJ%X[~+CX#p|LT5#å'"Dg Qщ@f@Syu"wB@}[]Wu0gA@$gKR S|- Av4 P !8f^%ew_U+&RZ[hF:zd*e2EMU d%п;]؟otp?kBTUcbm ?KڄБ+ R,D\ ę?"$9/?( 8!MvVr@LaR69c0F[k|6:17dT'B,)mp߫lz8RX֞DdBw"BXkn֐mѺ?ىtg1Nvذ ' 1 i;w^׋Me9 fɫB 5Qʣr+3&KrhJQ +T=mH qFѻg'zLizK,Pm؈'%yONȵ kI17eg{.&#L' cni]4pŃؠIK4)W_\S+00/Jߚ;0+ Dٺ4O(oC?p% H~ G'ށ$@I'&CBiTSO7WT QķE(w e'C!! t _XsV9N;_pL:;9phզÝK<ǏJUnLw/k H\* p:6njMtAc+'tގs-r>|5f tN9I6R~_CyȨ^I.R5`$+lwy|{{POB C(w'%%^l}hpUVWɆ2u,#f]hhHw*7#s! J=+Q${0$@ o5r<3PW2wzSKk41=3йqqݸi׸\aZ~VM{hd_)*00ޤ rk 9/J"uCA:'^"KKz<-+Wk#;3̆?Bo=2(!Qpor!:=(50ҟs8 l^Նe>K%.qgs9p]';lasz ]B]cDŽBjm„h u>׃ZVH_婾bm9C2&l6]x $ S| /"?2^`CƝWKGg\@oPr}DI6evhBG/ m.lHvGF"I6g| ֐Rقqz |-Q@-ACfv~"za8+D(\rݲ>t,qBKG[mV2xB3@aN_i=\*Q~:`&dBM[4]kX/ _VbxX(.Rc⟦?'2 (]><(~x&+t8,&"Ju( 7G,=hė8e˧peD*"ox0Ki#UyZk %4M訤+hɋi,bhsfken 78^_i%bf"-':^sjsF}[|'0*~Labg%O z<;9ƕ 5j*_@􄂺24&:4!x野5ѥ$vSS@.~^g&@/JLtU{+wX·JPW]ډK3dH$D/3" | {1 ,fi{\r\l-B!Et5ߟNw3e!SӣCw52 qobT#웵‘B/H̜vIec@5P}[VQ,<"˺̉3Ԝ~L&ѵse}[,%9dCO\M2u2N]2JJn)Cl-ʯ'ļDL#)jNߎevaeqjU p%W݄w-cDmP Ǩُ1^7w g Ġ~q?j\a'x!$3k#0:SŧFĢ3zR儁39xv6\vYfߺr]zxccpol13[2„heJsΧPxAJ[h Ƅp)ң Yp&;UFZi_(0~+>Aw2ivQ'n+|G=jOWǫ՜2tg*'I>$8 g\'M;-Qͳ yNTS{%53 oM<`|%y线 MXmc DF7 L+Ѝ7x&sB(K)Љ@?=Pe]? !HH׷Wdh)*9BƯ]\Wy40Lݤ*~T?/ =I0Bȝp zؼC_tB :}8/H-wHMhC3ZTF|p(=/\L;Z=w>MB+=Vwgdp]Cv?35퐇zKcFgwX\c\#AF1{t-kQJ)^1Vi1w81p+Ǩ[wS j)- BeIێc B5b-i1biS|NSbG:cp'wV A~V*IU8s&a`b$Q :559yC,)"CfG]mb]7`n%cw!+]K/SVZبaT|)"ląhKr \!֓T\g"}ubdVu a,f潐@B),YE'wt$ĵ^%Nbŋ-VK,q<?L֜Р.LW=bkQ7=MCB@^]$Q5VmbsiyNoGA]N8݉UTh3"fjP#O )]*hun12a۔$f NʐrƁ| IbM}wH_T"\v1,))QGr`WbWEb DW5ҜPK?J bKڔ;$0?Ԛ{r!-KA=KCm]ͭ nOH-KH bKM(3.)=V(nYT꘴\`~80< wї>;py#/im6 8|h/Tڈ/,z,i}vZ!tIeԿNǻA3xgBk /\Igk~LD<RsI``}྅A~DvEiHzG'EʿJ2,X!KYIi%?j4uyvw(`؁ FU]JCdwaJ]kEԡ(j>􌄪U>U,bxBcp&'ŏc6%爎lgc#ACqu4'";D+9ڴj,_&^-Q:Q>Gkf&E>*;`W|ɲ5y׏Bcޖ#}a(ˎ~RgP[ux*S< \;d2w=,WP\W. e9IAhV$z Բ#Kj:] uGUخ6Έ*lkYcY5|c^I t$ *%Mriբ돤bd9s˫UAvc)[ 9 vh͏3Ardf/XSx>*` юHp,Kt$:64Ɵ?aت )&5!ܗI ) ku,{/:ȲF[8C Db {Yr$3 Tkl?{?+u-ZXXֻR|Ztɵz]dzQgۃ۩"i*]XR~D^P vV&1EG+Vxy;cVƒ5 d c5sM]X!?)^fŊ]8w͂X841d! ҿɩn?'KZ~)7ܿ>Kj*/qG?k0?5&*|ZZ|xp}6  Rx8O v~̫.&.]\MIA[H/cCQ!ߑ@˽t<&rPLiamFǭ'_swDZS6b_'qK+Go?.CrfՉ5&̶`۰7?e3TmGcn>=9'(v~f)ZiAcS|aݲ˚}K1)M-Ru(d{ӰH]5'&6K3K1/ w#oJ%[whԈEĹZ >)I[{_ꛔ<89BeϖFKkm/ 0[FGmCd[X7C>(o'0 R IxBLY0 ?.?tOͪᩯ kuԚx!$Bn^9v9/o@dgߑG>$JQ@٧B @1EgG0t!p][B tӍǝ(@OUa2SҔC-p @NGj ^̐ncsﺢЈld0cMxQ6RLHi~^ikN* &H. '-,6XYʢ;D 'ٞF=9N%oo6!]XFf!0t'|\8@X/\6 /d;{H6"^@ݙ*uCۣ \;13BK] 0ţk+*Oaw vx+5$z^]5>R _n奍c?)hXhq6#Ta@ 礧0TY͔@va eCAs}6wIw!W*E.C=!ms; ^; ĻTʞU7,D|h̐ DMN_"(iv8()Agʥw"S{Z/|KD tL/ "t?eK9Bwfi"‘/%TH˶-ʓG tըIS؁Idu "$J:&5MH/ǂY0K3DEjiiXglhR?`aLxNlA>Op`܁o^z6qY 6Q#8 G؀X^ɔP0uzRE1T^'.%jtvn#%]Y Td}-3ΆfUꦼ|fW.-Α"PFos=7ZKّ;R/eP`Jck#vQA}`b-\?f?J=L @Q/e#^ 6Bq1^_g'=L0ކJU@潠xLwa=Ԕсe5PM]by lv*K L r7A-;7 bB3AU6q^\X^OyqR8BwJ 5_LPV}aGXs&OAf9s RR|Z2; ̵ 6&Dp>NH)^pz5 ”|IO K|7EGS=ae &xlvL4vkc1׈ XUAg#pw t \ZJ9ƒtvkYv ;7s_.E]`A GTp067հT}i2W[4 #4A毙[Z ĩCHn,!;q^^O@?_^31~{=Pzy U@={A>ګ =Lͽ 3lAB.4}h;֏_-A=B 9BT7ܽzҞUآ"ύr`Ifϖ3ɥU>֔h#bPydh sg?_)L-kތI=Y%V.>VyҮe'Pld?*ᦽHdNobx-2{\o9)r\20H <:e%422=K Ν^Rer|eL=J >6D>Bz|ѓgM>y:w9Z@r,I3A=(%hp$ BM{ ,1x nh^CD\8sRJ_7-93f*44:xM[9>dYha@~1!,WF7Y'_Ä-Dبo`ɢ1oh5=9\Xf?漲j9%DT?׾]ºB|+|sbB'8VӅ(֧8:F p4^ @| |BY>_U}*cM.T4xjQ{w *v?Ͻj3ĴuAWćiRV!P{?@!D KV- BjZvP,'},9iG;,ʴu_nmaVw#\w~za-(15 'tJ_Xг#MO?=#;#7Uu@Ú/Q[?Ź_6@Sh4(k_n 1Ci˜S="uҞZ]}8 6 &H1Z#?Y8&A ar'.B̥9Q[T0X="cj(-\xC?-ipm۶m۶m۶mۙ+m۶kwUs3qGCP1J ]E8t"Q~C}Iŵ4ݛ}O$ԗNޝ/`+B%R/Kc#ܳ~YuiÚo2݊߳*Dϫsbrp >UR4+~aq0V+;Kr'SM "/ H="F&k8o <f ޟ1GR 0(XEŘ3U*/.>,/^TzigԷV͋zUQ(R+Ӷ8/66q7qV$VJHE(F. z޷{Σ/ }(?s8^`Ugނ*J/B֚ Oaz 6ywK3/iٖ f{ dc6{ 3ɻÄUw@7v Yx/yS/MG9`o듷πS ՝[ܽn^~?Vօ>ڡC;*t,葦*~'aZdN6$c,@D{|-UL吨pU86+pe$f 6‹(7[sA#2`}E=\9ݙ2O\c=mv/42/Uhr*kwC,(leTػRca+ Ahݓ-o|'"XoD>{lsn0?ؔ9e+% =E[bgq|kO?7ѐw>u/UZSAk㧑P5|M|V9daYZ?4U#Դ,l\SE`A(fAbZ:B;$Wy->vjv4N4R!glU>zUڙL}C{޳?&NNhNV3{[_R2 p5SUWR{M*t;ʆb2mt=8wo`9˦t8읋*zc xc;>__}‚=H:%vN{\F  7к[IhzZak2 (wZM:2xw6 gO_ijU֟qYJw:(0v{r;A~+(vk!K1I?y=YƒJ㜵_zꃛ?\z_hغ7ue7PfaVQ7j1[i SOS+0L*w_ @܍!6a%hؤ7i fJlqڗ8[ Iٌmo |r-҂?=bBRtjzX9eju96C-hԮ> uЮ \Std POa$m rVk*AB6GĽҠ ^_D09ú˹ tÂ5^'0U9Tl}`[HjWLF+w_Cjy%KEROkC  Ē|F т\4Jȧvys__hqC_V|Iι%?9@)x#kzUÍu9%,<P߻y$AN>CpǟCGtnjKvD("m<&p*wY"BI35tpd5%Wzҍfs7C[J +;4:[awll$M !;!qu5uc `/D'eL5>#HmwKgoGɊPTul'\vS5kPjneX!V(=s \X~~0.A/ yh:pYhd?*0$)R}YHU!0pcu%Pt2y Z߀,ߢma~믧It9H*2T3ϘGQ@Xզ* {蚰`3ɢ_FlxE(~:ջ0l1'fA6( % B*7rT^)@w.R Ҋ,:2$[/ǜBxGmݖ&|O@&I]2"Ph8 TW$vP'lSNAX % |JtװR{ת**zlE05'kAϣHԱp 6Dz\J@JyhԤ ^'٣_#d5}B”e[\p|sNmS?a7hpseUOs6\SbGiK-,D^O1=7J-ۗC&o=^U|vOw8Y`ltz)yሷlאscPbtB=A9>}3Q`Kvm:zC~6`-+vv5>waNPl{R!X0wbMR-4Ea+{16`|R#5K!3z !K{S$ӰˀPS4`S0u1vb_Q\E,3T,ZsPkXM[֘\0BhW|;}'PWQg|LVlM#)4jh@ <0NO I?tީ<9{ߜ"Oyz5Uشnla#Y?|yBH7i sI.YbJԬ`dW 7h? @kuc޾8١X;Hp#s_T'g(c~=l~*V J]G#EBzkt*>s^w5da "MX.+?tJKJΒR:BdCogc_k+/>N6GL{D[f8{K hvY7>;76mvP4c ^1:pRET/NU &@pq>G N*pf`͋l{SBkv y񳤥(c&Vat'ªr` :2"d7p62ZiQ'F}W"jPGJѦR~|$p 8E\ѹ P9Ry܅*ADhouo 4N$+ϽXΉ?aY:HR . 3ITsnN "Ĩ $6ivA•N@wqc[렞/v01B<{hĀ>m嘅v@D`q̬|4$vJ՛g%4ahD"՛V or{Pb^:/2cPHahPOM+m(UyZBswʅ,iܗm{@27csEB: iۦUE`1 0'NPV'EQq/ =ՑmdDQS-A}" .Wa-}l'Cq^@'È79! ? )5ʗ_v{S`UJ~ur~w8ij,qs' "@).(*c%r_uѼ* FDzہռm4ҼqEEZ$nvA24*+/X/ȹïuyGC?! ?WIJæ0RtkXA,2t*F)&_c0|rEkWF\=WRRCsD7@Dmf-X!Uߢ@:ԨlN 玈( hSesmz;e%;J=p|s|,/Δԕ핺˳Se .NrnR~l0ñ;>t9ΦgE?P:)\#@!a/UbG`8bG{OES(,qzϔYOVe]K%,9Ekzʙ\YL"ÜŤ+Z;;GE}ޢ4'S|!Fo=Rk:C3&xz#aF_{+u<}IudTde~əָF֬FuaW@Oh+x٣C>SbPW~[-y#:Ác%/}]۴tU&x jєcF<تZ-l2Abvi"?.gxߖz2:!"xc3#kEI2QIt HuxP D%$!2F>Xth P`/\%Pl$E8ArkZ4(>h?7єzR#[dQpQ6K6@_Χ/N %xhZ!F) Q~b줻rڧswf;X(X b,Kh99Sv՛('o' Nahl]H,}Jl}LQ8XGɡ3>fpj4+{!KJ%W,HM7F#XɌn^6X9gKj Cl%D`=R|BfJ%Qēf3DIeuKҷ|T/5)5Vk &̟&m]C;~L|d`h$3cEE؁ DREEځkE_ LB i+ =-\Ň@pJ;!i|5`Y+?0OvDQ+.3 6¼=GU2vm0K4@t‡=NgwtgnQi h-lу9E,A|$-zH6恡'4؛Y~W_}B w% ʮG$8- 80(7^AP% 6Sji+cwYq:; h1O jm~%&gZ@kfHrjdiF+ؾQgxg2`Ze&91Yq;{L{jʆ6p+WHՇ*zDˎczĽ\!z[.A^А[Ŗ5:L{ㅷ]$OڱKu$ 3lۦH*%,fK5~v u2MvgP Qh1 fj.WH&&`wGY"hEH,Nȇ7CDliqd [t޺жT+d~q f&%RO!M#{\CR w-ݟiXRc@]w )VJ<>Cb !-D"!5AoMZH#G`9+ ;'7vu^m;Lkb G9$>L/'eFώ8i{vB>JGD '3SLץMٝو4j(@4=,PMIlUTfh)mH"e|h'| h>^/ m'&TMɯWCd :Ն4궺vԛoezL\x 4j Jr:h]BK:51ݒhHJ6}ώ& Xy PjӰhH=|.*`l_k#iKD \FCHgAGL}hL܍迊Xo^O]NO oDspZEc_Sk W^d|Դ^J@ cڱȧ2$ZQ5E~Y+o߬V~~ + ;)gyw%Fυlji"P'!(%pG m\II,$(8͞sC=cgm~揩0ۦ=֙L R8L ~?ʍǛ6߃}.(PO*N6Sq/3= лSfM~]@Tȓ"`nOpuzS Qkaj5 =,)OZM*C͌'1[9)mߢu%XJep9MgUV&‡X{;.EZ$a^AiNq $Kx$- L,/6~=1FU{f`j=џlx@$D8FLa\ۋvg붎"'~QW,`'xP:I@=1Qv+ʧv,`]#}{z *wO{n=͎OĪGWoZg((a(BVvF8[Lz`iu#F"S c]}Bku{ ՗3ck}zЁӯ}Z[\>k)eyVVIzFHYʻ2#tD-s6liM $i4g8G=<"2irLlJq,ܛ؆d!%x &F V{لK -/-O0%nCO"'Q~svF-+ vNӑ5mț_)8cnfX4^Sfy AEd>T3aB"isC1CcBIɇ9JDL"Ivc!B(X͓:Y`;J"76$!DW"4*B3Db99KK$Hd(p٪JUߔZWвTkZcՑwݑawhnzCّxiwN(vDhom87ZXGq~T_"|A*(M {Y#Q#ޠJfAi*_~ob(~y*ئPP<ܰ8#;#b˸Q'_< Ȫ1ZWh^?H\MrxitAZBXhZ;Yx嶱&g*]\LҚ&;s"Ɉ:aGYzv>oٖP!~%/s}B2XM\`WǨ,jZ1ƞi8xd[sZEk3/]ℤW*`SxJD= )-16*'T?jq\B O]klu~HYRPeaӿ /=bX**#EY a}>og|Q&և2R g6?A6qN̤1Wك)i5.}㹀^Qb١q(^M/ zʴ*mg:MrĶoۉ<=tm_;΀-} u []m0Xśp97̛lx ܶKʍ6Q#UvUM}YI,ӽOw_7o{>wo٣FKT݃UPvtLIw{ڈK5M!4Ӎ G sC=lNu/Q=چ 3Xly!swT3Iqi/4V6!a$Lm[mI7Xa؛ȳ ˊQ "9l7JP}kג#Q/C cLiar% @062Lə0UwJ@ VDx,_O2:3mc{r>I@!ߋ4I7G؋:rV4dڑNdz5UKy2)"/I [߷δnJ>ΟNMOt 二O^\IWۦMln ujgw\L28:uUٕSB0Q^5@kpV\$MEQ2}{GI#C'uT`I9uڿKV*ю=8UI2pcϪ?c0P[ -l -lML ̄}|7eqJ%K;ĉTIv?+%e*o76Tp$>\MOg^vhI.w˹Z)ZFy_'9 ,C/s0*ZSWv1=l <[@|,umS "V_W<#6hKԁXW<2_iRkk#FN6N;Nĕ5ݧV=r&'XxHo$j n`y@.-S:Bhp'm^s͇7.~l(R0m:׋eKibN:p`URh}r =aD}>%߀)JRppՠUQ' {,r3@%v4bwg _ Wd+tz' O; PWs o ]}}_j) 2,=5r5V⼿;ܞB0>-Ǧ[6j:c4DR@jK+cY:+ANp'EՌ&VǐH7@u8nb͙Ubx;&pp!8G.gH8Ah.o;jE&̌oJdKh-V-W,{$㿩} #%7K@=)Xgop4yLeoֵK#/(b"Np+';n d@KnjNubFH79| ѣEi=@oJj:h=||uB`hO&1sDZ3ϴ)WTp}bӦsfLPKz<q ۼ;IPrs츢14)ǛyF4J?qR=?T2˛xpױŐ,S:ۚZپ5"bUʼn!`t1uvV8L.=1UhoS(oyO_JKsߞv΢v.rQa1B=luB/>!`ؓ-OKw;s;P#WW>\~t > )#F T@pC`Ho4%XAI+ j^4_FѲrC Dǫ;WS#[(83c.(3u {Ȗ[%]>{t!6J(P"P"1+I!ُ$ccxȑE*uI@>]C3Īw;lIPWndg`Q#3t`_pyqI҈r!}L;̓)!=h>*))$k5be)ݥ}/M G{L*4<0'dS)QBH@jC)r+HQ[b%uVXZL.hpD u& 2- Aȥգ{Crr.i#*2&΃`ׂ;-'6#T'ܥSӈ-b貔B|EBx(42vkE/ѰnL{ZXC6z,FjN#QF;7JsڸDv )MMcC`DlxOcѸ4ݴh4L?A4udqK bzowX' yy&||0; w=+ps4~mw0n2{t"w|<l$[>ۜ!Q;`Po;^A}\o; ^7@=H:o;[t7](}A8@>C=RQl/a4ܕs?"9%R)ɭɤ`'/he&oSWIWZ 3K2=T} bu*$Kw<4޽ؽUWS'_rXbdNP F U*Q4]/G/%_V Yw$uL~ Cy8E aJfzxTGkM&hIۘ,iA~ ]?;Í tĝJcrt 7+ZŦЌ2PutR3ΫoH5-C|Cڼ m:J<ޖъ,(N|9KqG 'T+0W6.U%h:r%Pna~^%C3&5C(}6S8ܙOQChN <&^ %XvS8&h@z,T4>- O4\ZKۈv!>SAUM8oZ zf wI_"u+b d kWeb³CSj&50sҊ<$u_Z+SGqm;mG' ZŊź䦐c.HYt~ crK..[ܥ`xCo~^Vь\*d䦵LoV Oj{%o}g/+jc*Hҷ˿HVt7=rw|ǞӮEz;ignE@Pt݀s_6aiل9MJ$h3kʉ%K?˾ WDWM036֪u7͖R4b2S6WGy:]W5B{; &Y_!WFm֮$ֱ7t;)Tp> Xu nc*W-cA_¦AJD86YiԸh T$ݞDMΡMMhe$qm;K$F-hZ 4ڹ\2߯M r]m"N89fB7ZB|ğPpU~vLrru$ċ/S{W^k6h=a"{ ^<o'VLMHHOS~mY+R0(QSCXs'߉F"&`6"wx,(&v iH -~S7Ag_^;Nmٹ͞B{gT8"J]GV)ƺn"D x`&l(BVhcϗA+A:\ kO ?"X#l×d0k$[noϘBy2FHÄ&RHn!/Uuc2CD‘e'׿Y,keKK s8S; 1k HW@ >'2@e]nPhC'(җ=BP'֢#b tZ8U a;MoJ,"10GdHҵiѸ^M2fjS=/¥aU`s)Eɴ5!ZR#3/wdNP4l|aȝ4m7JN,zŽ}’/y!;0)p@-7Q~^,mlug9 lCw\b8K/6;^yЧN^~@ PRJsȧ(r^cn`QX] [N;K^oeYY37 < DS5^K')?x@w="N&ݿg2I"#wEkOm˂Qapp$ge"0a+4e~WPMHg1EP4D1[Sl_͌äaGď ]Ϣ+ =1A@Ҹp mHկ[ +EҼcGBҼS]x w xIKEMKU鵶Y-U3њ5@۸Ok^C ҃)8Z&:U5U :I3[vUE<>)5~*.آ<փ$G]t3IMjnˍUBh$MxiswmU9$)z 곅PޚgCg)߲p޺^I rmRQ8s@qH{IlQzw@:AAv!ː|1Xf*a!+5eG@|C@|~I>J/rH\"~%Y~y鳻 eߋ8b%1VkH))CN yNz8ށLM)UQM$q6tVjV&Ah*S(21#tzux;7_Kw.dxcl~ DXmIY[QΡ8 `-"(itf!Off=Ҩ'30Sj7^Lx4liyJ##ֱE@o Qnz~@J) kKCBET='8n}s'ZkOqgQpnXe/# 1iکRTmlI$%{iuP+TAp./y%HD֭۠ԔMrU]赕/g_tn"/)7tv7zt +:MQ7#|M؇0G[0t `5Qٗ2\"eIMуpn٬Ewy*9ak4ad F«Rd}ƖF9k4M|8$,SC@{;B1Hȅ076ŝ ye/U Pˉ5]MC^9-d+S9)Oz|ܜ5|H)`l FX(! u]5(y2X{ФR]x^)Vg^Id kB37FQt,~&w$t;Mae6@X:" |;) TxF8E σegR]UP] ~S42J4[\(cCə2|RYjeGe`g#3YgVdyD@  cMиMO4/O6 dfU%ďc6)^ пM&lH/u' . dUi/١T eri]>_8e С3g8 ժD8(!+O Ed!B6^cV~}PPM[}By*5˧[Nt駏*ۇp.*9rZ)&0ϙkUh6t՝ jٌgG_9Ȟ0O{>}ĥ࢚8tU? p@> 6{gVE{M5ܲ{vwNG ߝqA&&}ж2ZTZ1!L ƣ ~Ul"6qx;xǸx]03Mȋ%$xO?z֧͡[(JvY.<)*4LiOy5Lm8}sJMC@Cr%:966N_h*[4G[62N* -Z3H)w܏*®m|v8}KLEr/?W6^lPIG`ĐM{%xv dFSmܓd[':ϳp*R4'TB˿cVAC66LrX$rvf 3z=&?#\#02`3`=_[x Bx<8FG bRrd*N*.΍ Խ pOOF Y't8">8~V#9 D0aÞkF{FSi?zu~aOSTb^׫nmo#N>/ #CF~VhZ3* AX *.PmC-}Y &iX&q{%>YT% 0H0OutjЋL+:`)Q ޛ*hIhG9P-}Z>L0u85}=g.pSA$"M״LI3N`k(\¢"fgg+~fl6f ͞ S)Lf1XM= x; ((o=s= ^! 8š .YU9܇)@X]Vbc@Xj}C|\EY0˭dKBR}q*\V=h7UxvW=] (ԣ.I1?bD0> ;; {;1P2xܦGSirG>5 ; :P>nȻ|{'\= e+w$!bA`OJwZ=#2 wWDO"+N=(9{ Iui'r[Ҏ_A"x1du=U)5pO"euI`}Tc;݌{&@q3Dr/zM+eqIΞk| @d, ''4e@ӮNs֒9F]Q^*.YxN2k;`wpv ` ccĹ oi6A kS0Xjhvs UEi슳RtC%!" B1A=:W4̢:䉦N 76Wt~OYYO׀MVMI=E$}dkOC 㗞e`B{de}܇xA)3yZM'9U;e(f) !Cr(Ξ .ˍذ FT+q@[sSK]%, B}pPKabdJZs`85ٺ+]9P71Q'VA]ݎl?_!Ԏ}cۓ/!T]qCVxgHPy1Pݮ)YNڇ'P4 .Hl\ ᥦ ч]uo\;s+k6\W?h:T ~j>LxĖYnB"l>t.vFѫo07kч\\ :Tn^s6Q IuY>-? Ӷ}4|sLD<K~)µ7^dLQrѹ_iWVK:|ʷ9[u{cv@dAp2$L<=\JbQ9ٛDz#^m$te-ŽA3&p@뛜>,!'579&sIRIO\G m ko-my>WVm)>\Ff8M^3 9cn6X" `I| ˵g(Cڢ Hb1 /< I1q唘wA%+.b D- SEy,=&>/2о rSةj13BV24:+,s%gl3J_Tv^3=/ 4%s!}![ B_9#E4c'0uՠ{#p[Bq|-@_=/c&IRfQ#g9dC;duuMNߞ,w圁uI>⍜xſxO%?@;OK _Lѐ uG #:qoM <z'%q'^Fj>t:9W[;xoX9=fIO=M 7 KWg0c|??RH{3꤄aTZkt;i[7#MHIk횦g%dYqx`VBS.\xtYDƘu1Ut3pn[`F%EG"Ku*t)|чc vfYGwS]Kz5 fk%6FF[UA` D J)+ 6i3ARHlOLLsOrf| z!4q&y M*;(hB*F*<_Bbe*̳I()f!N =ֵesL*rm %hOp3'~JEt3}%G "99ʡ"i񢗷o¼t+Rz܀dc٤%\ɸaz.RJaU(W|ma|QYi˕-jBIZhjDcB+$lҚ~ p̾47MbrĖ܀+Ǐx_yf;:Nn~_zFlA6ѦvNٛ[G #d"艱EtUŔŤG3RIEsqj;HG;b݈ [G7gN=Z*mO3R)g2INa҉l)'WA5~nn+,żn>S O]r/2WRyXXhYXKAF3kS_\i! "Y8,)8KM!"nH~Et-c;ēK~.8H՟SG!1( Y9]*+"&qB1roꁙ-IX 3X V3α zVԲ!-̐`45[H*lC33VC- wƲ-C_]|wT]^ig_w u }m[q+R6DAƤV_J2 iiP-˦ʬ l[(n>"$tV?79ǹN73J| qzpO0{qodžep}hvE^l}=s :B'}c@}<ްth^}Gpv:ޑVS0Fv5 :uɩQd靜 V1I]XwA`; %pDB !:/^H&J[O&#a yUԪ8\*Gp=cpzKPlx+e{I';yjxɖWZD R4LvUaqD=K/PeF &-9h_.614Wgm͹i61 WLEb$Xzi1d2D9KH-:2 1K7@vfӰ`&p΋̡S=>Yʛ4kiزUٻ+:e82EPOeL^„ª[h8IB ll +ҌfzSgx[pviaDVexKVHs L6a[[=U} ۀ0$fv*2gU9j*׃-P=rp*1cĥݔR(" 7ҥo& J c(.aT$ZҮK` jX"ZS~)xFl< i@< d_7R(0RWScה^ 88Ҫ2)Ӡ;M~ / +9H 6R>Suv VMHe=+'dT̖oC^!Y8dDՉi*䫄,#9 G$kװ䆲'6jbK{4)JZbbdnltC2\ HeCrkUr/} 4F~Px_b5;i|1/YR~ ^## )P q(L Fwyn؟PہI!n9grR5]+:OO)oԿ[?55[Wv0D cơܚB~"`ۋ,O0La# @DfF\=raФP=TeVNG"iIPF92Ati@*^#?S행"DtcoBR`GhcھnwNr ]ԁ4=DbծFvQb^7$vQd0OYP͛O~y]qaƁ/V;=;+n1,,{3/0]9uR$<Ͱ]=`<(>lj6RNN;"y@,tVA0 yP>"lԸ+19!U6@!Y" w*桒{ɛX*eJ@8"`nXcOvmxf’1w-u%ukɂMy$6%rIܜRE{ K^-剻Tc1ʄբώiV#<&{-J |[Aߵ 5Be~:̆-(|jۥ%g ͖1}LSYp'MŖHyR:=N^1g?nX`дu3M(sm֯^'b*R xIJǦ| Qiaaƣe R3C/_H|VIȸӴ0˻#sd* %lJ)yᅠB0PuG* w_͓G  _' L17p@8PKƭWn[ WČ  MGhKbbu-f TQ6Up_?=Mļ>_Ӱ@1Jߜ B>֘;nK^ ݌JmE*dxMOMW5z~^6}DB5U8xKX*.^㼫8f~`{dqkP#)ɃiSZs2laiȤ2t(r]c׵kK&={@" TsTH/#jFYCk/';eԳo0"{Ecd"kxl ;Vm(f2rWɘy^oO@0.;c׍Ib[6>e }޼";qC"'3B0:h!R0:td z rۤE'4mO!8:(lmv-iԞ&\7j"Tե4Wņ^\u} L@Uuిm]49#DA[ NRsi!XoLhV>}yaJmO A>eƣIkraO$vK!^=bQͯt6Y>V:rkkVX> žcE:wǥ;sR-:=fš¾':%7T嬽\k/vc!,9c(?DxSscRv=>zܵeK4!v|f` F-:T<>P.WT١CwNq>F#mqNb[b*/zL"{r̰'? NZV"^R[*F}uѰ*id-wp 01l 6" ఙ LF"gPeƁHgHeD)tc޾DDl,ۚCn}37_ND,bgBp n@X/4O쨉i+k%dy^ٍ lV!WAsAͻ D,I,5'^7+o=xW%Qmٿf(m[t9ئeyE5Sq"YP]kۙY 7V?TkrAC#L3?-a,aQf]~@Lf1Bܥa{F#Y|e 7l( h'-}+7%`;ithUHSi=C޾f\, {[_Sɏ{Sc4HZgw-y> ;797 s-Mxy{ɠĄ lGq2Z7t*QsgjX_,.3Ğ"B‚/e:gv"O@s*z2hh؞NBLE[to9nNl2/*zSH[8ϨCW^"aRGmƗjK"n+9m:qBм7srTEL24/i@0 Կ*l" JB/<2 EHHsFFgN{?vE R'n x/1k4Z*y2v9p$Df jOKav8f(NJON!P:Uc>Ag$:"jiy9B lUpd%Pe'ˡ(2<9Q3K?sk::fC+φlRpm}HDcejJn6{VT+d>`,I0 ZukV*0ѩ0=F1d@zAZwY2A87{ 2ZBp;d-VKw;# [g(փ=7}"C}`> $yrᨁ(O=P tz#a!%}:z%̡{ 9#?Vޟhu^{V2R}Z͡,4 OB\/JIX39e;TW $>C+g=dOVГEkqH>i;v[pyY|GNs 枇^!zFL%z'H!>tħsA)xp UE V?'uj|$KKD))*%#II0_ ߝe9ۢSwTm[$@0Nt!1K[>MϊS}4 i`،RmQ|w 3%G+c+@Gh$:/`#}Vv@_&w/-?|Y>V-)BbØ4+EQFrK? qysȏBd/:<1u,v=Q#y{^ }:a^>9{#Y%BVSaV[j}T?ߊh}BbA$Ÿq^7 ˎBj؞&!^ªžp"›KByF"CTu -̹t;,R!{Y`rQ=&z_PӉ+M5E:ʀG.#!X@N$d`鯷jl7uQ k>FO3w:R7 j;j?HNV޿ \*}*fꢋVXtr˕L{!( i} &GI;QuEe<(Jfgl7N%ǫg:R uIx~swJcQ&fDvX_9^Hh7ɵ^ &K4m/G}a9Rک$j()xq< է]|D +#GP6-6R3-PqRpxC:+> cJ՚>_jqB= e8 M&[.۶m۶m۶m۶mm~4g'>]QqG+ו{ڹW~Ϩpg9SҘUi0jTqB41zZx _e~]=YTX~,ņ:L, ^ x%c1~m au3~ 34Ю=GY뼟`Tų% |夳~ '1]  ޱ@30gW ߭ \) ߃?NѯMm{qyi abk40v WpPۖ)@g ;0mxJD4Q<#=)U} f|ʚ\ZKQE+P 4^qBSE P0ee% j-+JIf%3%6jGƈ3izLnqF`)8Z%܋r3 n)|xc5 e5- Q}I>XmNH"& wV iy<\Gp +< '-g4lHM6ICAK^*χMi{F ?i-&_٤J1R~1n[0+pIɉ%F:%.w6Sk[}jGh=Y !kiWN_%YvB 's4-"\ZGxvYyHZQp"ڐ+pzeՓ~pPVyAÓV'BR&jj nq#9 Im6Y9j->p~RڵP|_C ’OwѽjS#9v<;&-qTW\+ߟ|R"̶>4TOAiᲀ0x\-1RĊyĭiKCqCX zqzu|}Aa=HcKKjhYj]7Hlf"wĊzUR3јfUgtKB~k%a'~@aFGbFQffQh7Rv$thka3a Q+[f(1z"dT;ڝ % ]k'B/FFz 8V._qʠ2#\fRK m`$$DDDOaDpd׉\!~`:p%`$pxt($Q!:>hmќ(T'( Z#HḱhXtmPcDU. xvdXƈO5t1nҋOP ,C{ ^g/%D$ ,dGa]KKE_Doˬf,4Oa=]WӑrN+s9jH`Ҥ.抲sv)"[6Ul=pLuv) ӂx9*‡kYP/~EW*)u~(_*yV4h% $^|VA,>x1U=SUaK|s.G b2ݽrg 8 zp?}oƯǐz8jc[YG3Sb[ROOػS@7$gc|'& F0Dث87(HJY~ (: n*yd!qkD6/nfGIo_WlQ SPAA7vS$<-ͼ 'xZw]3(Ec:rڝ(Z΂d' 9C5c/r:c  l ˥#=>K=7ZjKTp\ 0Z|{6sDsaB}48 1dEbwykVB&$C3\j[hZ !av9pu!9,J>3Fa|~0}0h'=h7п* XwWܛYz#( mWv1s,eՁSqFO}wboUOqq喻S S #q\u`T86ΗRtʱx龥&jO?393DY$CjRĵQqB UI?1g_T3ݹ\# %;b%JTT7M60xFpNtw;l@Y$T\tv6 0[YATdyA'';$gNrEFBbQLf *'Q!P$$\כF"6ucO}KgZ2$T2blt%sm<Δթ3D`\W~( )vLz0X[MA݊dҹ(:lA+J*\ mAJso;֠AK!R%ՁKFvx2 .](?v/_z9)u^THNaq0xahk&i9-yQ ؏pZN%Ŝ\3m>![5N1CO(#?h %/",>'F\<:X%G'굣 3Ï[<$7YƟrε)L2wS])͢ $O%kɌN^"&5 +s^Phne+!V{(ϐWB|F{-At:: PorJeq%^GrM6U1~6M.D\BJH(ŅjYv(Rzmرnjގ"[;r&Ö4@q2OJ>s|?~~cT{H CYDIEQciEQbA"?25SGbS1au慽0 ʆN5~R$v8 ecoSʹ6*;\sib1b6ZtlnvMnUhY{&zSCmn"ݑ_8))LFYKX8ӕc/pPw7 ,B`b97mI?HfLLJY9,WO: %#2/Vl:0+_ K!rVΥ#$Yȳ]<ɐqZ`WR ~ FAjt~.v : ~GPT.vkObq/Mo6w-l ~Bsά] %o7Z4CU w^|uE =~[ !2V;&/JpeF @fqZSW)3X_f@OE=QU!K^euiM0'.G<G,t ,qs,MW0;l 7뾫ʩ '.5QÌxo7 v CR}Vlk$3[s ~C/'VyVԱsOrZl[*Sl'nX>'p3 Ӏ8`Vyf웋3pau_/=~8.^PZG* 3"_Hn^K œ%K-B,śP |hŭഝ"L2"g x[AJ9crږ*~,t#nSxB0gRRuDفQAGpZΑ*.dFf5cd BloD"OX*O*&N#o.L*L|&k[!0LC"6E~Ql }zQbv5>2G}L 0fooK€}_D3'߻A)u(Ё5u{O9F&Հ+ArOFnQ~[[7X +Hnˡ/m^^%# "Dl6 ,F%33>C~b gūg)t;f^ 0a9R(,S>Ș4Fa(}6>Meo9F"%RXn:Хi͉͑WKc. M[ݼecK_0Đ{M!4q2) C&"bc̾ NJ(1T*gwH4<\+mqo֐tnr.c!+tZDi64R\ 7uz|:ۍӜq3BI& I)991FZP/H>,1RΊ08*8(b k0L^r"YObmJa{gKq]a,]|')kc1^me'_47 H֦"A#Q+n#9~E-r~e⃏POvI<w&o]"[.Q:bX0ԙ%,0Ģrtu˶mm(׆!!\Pj[Z}C?wf DSj4D.Ʀ_tL-5NEt$/(`)Mfe@_@3Drm4xk)+1hս֩nn(3ׂ݆+yF(,K\d!I&{ՒGYoedDܹ"A7d3e,&:W;Ն]7h*'Oм C~F 7R s5ڈR)J"י WUAF#)/ ;pv%udw0s];mƁgQBDL1ti`l\K @]E3\F]Q-WL ow{M/ "h3yv򺽗2}֍e<5~(W p>aUSPRo=Ԛs03 }44;<^vȃ/be~ t&%_bU7 v`-xn,a# sL,EiidZYsXOOXHdrɶj\ð"Pİ-4obWl>;h2Ln rp ƤI2 7D+R+"{$S.u%K!#uXESØ^@p` _߃q%r6W'7P,?gdR&Os2q}Ф5O쵑`Q9uD+J9a;A]sS0j %f#"~!)J؄n\z*r wc=P?p^=1ڠs3ɝ PJ ʿ {)5(c IsCbUEcdYV"݄Cqw . /DpW8ML;"yD#@9DLI⒓X8^HJR&@Ŕ@wK<,9?SF:-''5q>6NaQTz|ݒZJE=^`TI( ޘLmT4a)Blp;I2۳o@*JIrxeEcUZWwsɅ*9.϶@KRѯ b߰WN'<*7l&}CaX2Y-CHH.ϛSra.f|2njkQ߰-v)H`x@ {k~5„,u_ĮNt@8 :BȨQN8%\aV']s8$ٝhNA7'9HL:w}l}f;L;1"4)Bo&Ie 0:,^uYaws((\e @j:k| j9]*gK I2\P| (OScʷ< gBT4r$Y]e*p"Cdswnk۷5XUp} V?$'i">NO&~V bwfmsx6ߨ+4ɍW?r.#B;:C 5F|h"Z4W|Aqmgt5) A࿓?6 ??l EBB=bXWvTwCBsY@LeQfoL?Nk|j8ݏQ@nGœ }H 0ϴ`SS"Idn *N)8ZЊ M:ѐO*RՁ;R9Ӑ e Fϓ5.jsc t-( GK_Ռ>Eb65Ŵ&2uG0Nϣ`[r$q6Tc!3'j ~0.amz'AYRr8>@)k,aE,}@ߩL|(Xs%AR߄tM鱗' _N䗰f]=39>]م[A]gW|OI$iHuS$IL |R}ufAʵ2; _ qPqzm#7Fј=ߑMx&xbR\ΰ 1Ӯ2Ľ)SlLp9 O 엸#dA!""F*EbĎ³QQcvH?2lw:_|=A٥\iPJkB7m#KAW^Ds$Sz,~R6$mĄL?$-s1x9̈$k0R~V4?3+v*I3 =~sͨL<ڏa2K 2;8Q8&8RN5=r߼_g*$L _2HᗱMآDe>4l'B%#_Bî/`bP%юE_ (M\0? Ja&L[uzIXZ#$HZA@f,?+f2:dp3T]b8DcikE\b" LC=3V&Tްn~4Zrd匬{,6=THvJ_HXIŲ6cr:💣'r8ӕŗ͙䄴A7ޓߟa!&9P`wm1Lۊä.Q1Pc2 W{UA@w}1P ]Ae{`| ʃf^ {Č>4h—AۢaL?af竱J&i 2aWZRljw2JoQ^]n9NMmrOs3NK4:H%T:Zig6(ٮLw-A!~8!j0Ѱ}R1\/ QָKɱsiueƥ7H2TmˎD:A:{(6ڻ1rùuvY}q9X]15RoٚM\ɜk;6f}nϲxNm޶T.wHVnCVfL=ɔ1xp udOV?tc߭K|eWM &\;g#(& (yuDg 1JN\'.h/GL;H;f,=\,,4+V"% U#W]NTD0yC uV5R=d:}XBBeY"%Tʊ4EeGU3@vf+Wf7eqGps/UAF֪ ᗍ.,e5w?ߟ .Jֈ{$ϳ?5O[ﯢXi~];'n!jwûfy@)7y2C^"r:Xy1̷x\xt.xmBYkYH.P+KEY#՚|{Б#)vVWYMZ[rDA\ cad?VѨ QVdKNRfHT`bGIʼGqOv#,[e xa%yN Sv| aQh ӽqOz"F6qƃ= 2K_3K:E!`Tptt3k/v40#JΚm{ƻJ6^ J{`8}풭/#][H "ibf{xê4 G.'WJp1ʭXAdӆ|V,L(pV:ä$49=acC*Mےd|*=P};q T]QP^Ǹn8IعA?) uEl"L01 9yvAiJQEc9طfP^ U#C\?|z  /ssliM /ꖳ /0!kNҒJoYm!4y %X*B*yJ _0g݌H=/G rҜ$%.䢄f&1f&zb1h: `$0?&"" !%#:)乄ڧ0>`ngCC8s +A74u")ø囲+]VNx۬45*T~n]MYX2ˤy)ssÈӱZ*uy5XZ_f7P*ݷgDz gEp^ vxB m !f @UX@J43!<P "HH)q$5m{XɅ6"*kѿ=s9C sąv,eI~x$ lj{O e'H?@rB?U[םc,޳ KEV Wz+ '-/T6^YOЧ4]]MDVYhꈃMN^ ܉}(a3%%sQy^ Dq_`#c,6t4K!ujΖv9]CjҰ8@eZ]CݧC91MWL>RڽEup|+`wgBb)ٍa̚$\u[H61Kt*paf 4 (+Il?Ӻ&"1wjKM\i$ٰTp Bj0]}>em@A%xZhnfVۧC/0%ID"|l6d-dȅ@$x/EAF06xkx7 GW"^IXn2*R@x1Ehqd+ D>h%[?~ /"^"S =~MLjmy,/^m=F̩uQ@,&`d Cqp˜D/7>19M"AG~鯃1*iDc t(Q2t(eS6aoClWJ*!QQ кhؖSLT:*F4w>\| `>XRSSohZ6*n"C_e;91)ܐ6W lm#7 UICzpu h5C|PKO``W!b?ϑ TC5EO ߷.#`OtpEsFF$1Cs3O͵UCq.ꦗt%y3iD]$i(xQ^赥 mXVCcg_~ؕl0xݯVQC*^CfRO@S\nJ܁]u1~9.y_9I2Ѐ;ׄxSl(SsF ɓLWLf,+cFe a4i:c>~<ھ5X׊_2Wh{iNq{{Ý!|L,-*acP퐴J=nĿ}Oz2`Q‚9v^+<$6n2ؤ,PƁ=,ce}"OKWkPySr7舊 CYf qjrPp; \/jVzk}PM_JV?GN)dG#Rgݮ!ɥdķLq>,F.QZv^,\[¾дrOQw6)h!8鈌"nlL^˾.J;穛_J"%ſ|rEGI@Bv :o{o|?@vVHar>@ECC(Nnz0+UMBYb[W/A-2NA4Қ`ix+c4'8#l76v &T/j"rC++j+kf-kclA2,D7^2r]]}u3bd-Jhpu~gM){q,|TIijYH_b )G@ۯ9@_2!:BwaU4=΁@ډ&W@JmLhK, )tl 3#PG98\,S\$$J+ @5{rXmJ(҉8nߋB"g//=?f"UeP;3;MQ_ί{3]_ٕ^||@A4o*$E02<5!H/) Y5J-4ra(B`݄Uy // LY$$OǨ"o# ?gvnl6aeqȗs(e!<بdsB2 Jɵ0c`MѤ !C~ @&hl N}V3Lwʹ>qQeϓtQxRó~ؖeH4^oX/,{c+_;$@13:8Sތtq |R{.9tGxyL-^_^_> u Ќ'>_4 q)L>Čdᓼ393>{zxǛǣɱqڸ#$x D3&l>-,yLD"tL Q"AG)hּDEZQ R~R"I^E~gl#"bisL1ʞўd9&ڪ8hVq&l5nT7;Wi UdJq$.]Sٯ&#C"UvZB4k}WnZ[kJFrZ誯=Ji4WiW?)nZ<)M`!+ml+ F@iXfQ]6t*Ԧ)Se$ ojJJPZޖJp֌?eUcLJt+Ӛ !G!r |!^`& 0|n'=E}cDn1iw\Z)'I]r_d?Ogj,¢e -Y)}x[kYk:N5Ss) 86pʫ2.OZ:x#Th-xgPƺa nӐ}:\h+^H']nZ jH/WH/?/d ф#G 5p)j@SW g} Bg qg 3)4SIr^M~ܱܷue(V˚s[5g[o˓,8t nX.66U8Ϗi6˹.b&S,lkgG ɥXwvkd8}g ?Y(WLa{r^ |zv[p8i]Cƙx u w-0QotBw1 S[ƥVkDVncyDVX9Yo K._zzsG` A*%*r] Q+-/ڹx:?}'f\Y1 .( b8HZ!ZYb/1BF#?d=V>(zw\T)P۾]P3$wkc7zz0 7N(ȲPXtjXCGK:p| F=pDwJFזbEA|Q)GxEt%>(yD dNx@IڰrLJ@)ToT.iGN7ٞΫffdKEG10C1̋*ib,)4$~O;(!L.b-]PyH}Jɑo*{C4>{y5̜#w:\LsaV;P3x#g:|τxÒ? V89S5 NBD6Vƪe &}> `4%wBR4rG_IH Pﲇ Ȥ^|!BYwPQ(#cD!:m"߀R4H;Bƀ8P=o1QD$?yg@+@_h C-+U!C() Ļ~V+R+*4,E@Aʝ5 /gҟ/޾滥 '(ZD!*R $2RE.epI wM{[RxFFnxRo3 Q_KۢKؾRXa(^DĤ.I 3u#Ƣ3ZrAhLDe4bv& e #5"aV3%\MHy#x@iHn`kg{XګIN]ٚ*x'3^Wan6n#T'PENS,?d](srfGz3#0Ef?-RbHl"CXpA}' %au!RU+tIͥf/ kңXrx~'3Swa:&T4l0xin}RYcDxUX4] \R9I+'Df!?ZhlzAJ/`%rt z88S awfedlX8N6_+8d3SXj;ѷrWa煁nحY=#ov-X1t*V!lj!'YQKp!nꝆ P~t𒎸$Nx^ &YPŽ_yG^wzn9'QduZ(z3|?N19p3} A|6`">ĺFa |DPRJN5XNG$˒AB4PARȓM2XDh>-Qd-*4$_a+ZDS9;o'"&jgahglj"fi/d& &49]<\$%& B%1(M<3%1--'85 „4ܴ,P M /5J#kOձYBE Z%`KdU{V^wc43Q<By~ _W >#C0014103dKҾl\ŸOmPdzXX:7LnЬF-.&-_+IZ.+,~x #Iӟ3 b`:FeO&h%ǥh_! KfkpgSz-ÿۡFK1ڵ+K X;TA$A#f4ĶJ((6#7k՞ҳs8OˣUL5CPM'taO1@k >m85mj0s\Vak/Tv\>ghNVIp&|'RF#la7WrDyJ-e)g$w?AEBe"P{OKK0´A/7c&R7긪2.ņi~ >F>e?JحFl݆p-U*gvJ4M\r-*y; Cpހ 8r^N W/h(&@ި:uοvm̈eaC wKڙGԪng'm3d_Hw~ D64 Bk9 n@xFmo}}ѷ<ڶPi] vRfKCˬo4B8[Ե(7t^8dbI.GA.\K<[97)9kˡ:G ]T,aZCV$ t59{@bkr0z nWv*Ѭ$!6 k#4FO1OAaJ'%oJUB&ڋ`YֲլY&B*Lx:H(YO>B[Kٛ'a`!|=ܮѻgm8cQy=|[!϶ubbRispw]`(\:y'P'9;"ʯʇfߧ 4Sni}Z/Tdn769q`ٷT_į6EA+m4)?R]lts? CKr'\3YsQȄ%#ôqc~YNPbp.k(0^~P(W Cn@>x# BO7(!@y-M҅g3]ٚ6Lsn_Pj1EC_oD? e]'lAK5FDV &ۚ1 툼,79cٯ7rġ\'ݵ?067,5Λ9r;tTW_t_Uk}70h$AuOU%t8"ne7ȿh9G|e76X.LGzY\}w9?& q[JEĔQJDZsUҕf@ # F^ӿ@%v/~=:T1b ]ۧ3 OU]_ق 6SM]ZRjt!i)sDEvp[ / nKeHA,mPMrۋF& Oftɥԯ;KҗPyÌQhEFtRn+Ml ^0?,=;dGXrNL1E)^Jl k+kE 9b7I!dO^$~,Fe(^TAK!~Ǖp/+5%e&nBak"jk"%B$m,=bD͗˜s[b妷^ ~PXQ SW4j˜ka',vfhgc7HN'(Ф. D_C9Rx,МS:+Zڊ~5q4g ) Oj֣-#C J[T8} {PԜ: f4yn2˘Sn}zf=Cb">dؘ#mQ LrVhԡ 5TA%9[}&Ty7…!1rz%XHH2#sZ< )3%jjn 0jaHrQUG8dك(J:&w@g/WN=3F{JNP ՜*EW 7imȶ&X:]v9!ij<+{ܱ"vG0_șJwbFBAoJ0&|)Cqc#r"~"$X_]'" \ȿ][ G ɼ(牌R}9*M5}.ZgX12LoXZƆ_%BY+D:^T?@(+?Āw> <5+2 , 0p,6Lʉcqc^^)PJ1jLCr=ym|W !#p&CYq68N!^ >(kb5o!?1XE& %`8tڬFff70tLOFA[3pn׌{Uz,XFDAm j!zJdqbjlHNJ& R{yEn-g܀Ìghۮ 1Jia:4y vr _ʦ׍٣?!s|g_ %6E(eacMv]bWPzKz-*[~!$ iΛby5 Ul;|vppZl,fL ZJi7txؔAx+$=^hcL!8L׆$Р.9܈P>f>>ƥ{Dب!v#MۏOIiʤQ1rY}7ҾPN `pA #q"rM&<Ahw1RjWvX`L.9EX+#Ue{ϞsŲh t $ChMɛ-N Tdo̿ovYK5 6"ʴVuD6psc{`oui8Mlg^b%DaVŮ{WueQy7yy9U x,iC#_pA 8#X;]  mJ6#η>Ɔi7 A(+i rzYJMV*JIa.a1֖=/Q˴|_jBX,)I_actB5^v .=@'sdEaC;K??RUfQ~+η-j-~b#e)D=li] +6G ۉ+ڼ/ُޛ9z}@[(] gT{7]WuvRsKuoEd)C?^G~rsW;\'*-d\ʻb1/"h{<`BΊ{'#sB=|8gM8f匢pHA85k]9 7˳cє &\wqiiwTAڱ!B[5v3!yp ͗*N#.-bLn9\ 'gDa!y$`?6}#LLBձ_CgJʮi4sǬ!C! _1#L,,Wm҈E l>06 C!fSXz:*Ko"KwB٢z |6X0g` iwCzm{H~ lLnHst0+%lzbuݍO,I4~C)]o _eCm)!$[~FHRFJlu[X_Ȗ|ӔIT wSZMy͎wos-Imw ʃdq/^qy R"fL02^byb;d jY_yn]+}|[l IR̦Bnc}uǏ?T$<ˁ'6JO PcWtT͍Ab$M MmjOi B3/TŠH"@7k41dTPV7_#׶jmq[O9]76ruXsnv,+˖: \s/zĬC-iZ~CAin5/#ko]@aS<DzQ}aOYdMw1ZWZOk5T79&ʄdN@QTqRu$Ւ -'* hsN|Oe}v}ydqP x_'ၐblJa>ѱ1y8*(LA4bd2ItRQ=ssz:!-boM+m#~d@Hg7#<~\t3CKT8(F13ZAΤh3gd:(U^,H]C-CofX*osd«9J!REgxƨuڃzlX8&ݒ<./{UhGS8l+cGHԉB|,+ 6#ngA3<-U|Qf.Y!fe`CG%xHnGxB-Af(E5-+]eܮ(_g'^>:kJ,0ǑOfv_j;+^1vgロG\]O0xn1ϗ;Gd?j<>"XrCD|FixjYe%GDeN84#QfYpqϠ&q\QV"  f˩8Mgvv,+ YΪ{AIFIஉF6_`Pp ؀6N0`SQ mg"De\)fD*s6$&v8qnQ-\Ed"O84Ms?-K٧A 3. @,}Ȏ '.@``-3h.k_.6.^b>uШ0H7YL.Ow1;-^-#'v~/_Bh5u*I :?}k@-;t?+P7!:+k.1y+Yyٽ$. GѾ2iH(6"jdFc37PHv `F;?oטaZ~cre27@*w06OZpS}Q_Mn>r8Bđn5Ǭ w@C!;'N~QDIQk\3ah M&DA}K/|H Q -rܥr*"v#SERH 偔, T3mAaRU U W5R(fVMɤYD'u ҢKa87 \Dd 7Xq_Oo Q.$whCFFiͯd><;TS)fH@mRmj54 8䑇iT(\ΚCJ&vD#@B weqbwQdwie=Vl:Zd>j8\N<.[4W>^ϲY!dfe X'}k8 W3kW_r}2vS ^ Х? $Æ"ב:Z70H\fE;iSbR$K38o~+H4'$/2dG'_A^`TpAzu%k$D^s`FfzN Ms8s..fagҎ8s1}~dC\u%O{~;jy.s-*]LJjyBCԅaYǥpVNY\Aq@9,=Itp6q.&M9UvU;R.`)L5֯_p.:;L1g[~_.'}L@ ]Sm0k`9n">,}|QX}[ E35WeB{G*rKwcI.;fJgu(lUecۗP◺Z_ocSEm ,f;Ctf@V|x-gIuyDz_;0o_q&;N|eKl(ۣނwރ A8 :hO|w 9x&QM=UGp&J`M]U Aޡ!rބ=z|~ !ӼёMeeAe|`Pꆲ7> P Q)jWwRHf$2=-LKY. vYZj e4 6]~j`猂=% NR9#|bzVII3@Кpa##d' 76P74Ag} yq {.}+j2Nu t/4bCHuԑ|PCWMI {ܺ $E6D{yZ47坺7 75*-iՐsEM1>Q;E;ufvPc:V_ףxNpg|1\BbH2rW . f)!;pɯC1'M%HT8*FLp ?_}+ '!]2&=+FtXt"wHa:D.kB\[=2 7Ħ>!\$bIUGuBsȖ9t`N ,~fJKct~1[WiΜ#^td`Ĵ3|45'pE"N|IoomR%) |#   Jb)KKRFu$=<#,G&tkhhOQZ6BH_]݂ =LeR+:CPJ 3C~Cw2 2XwDM=VD Aڒ$D~kPFxxfBJ[zyuq؅&ߔm˨D'?L<3vЉvOa *l2 s5G. TzF32I?j>*NeI8NYR#]@ iAZQDp͟ r]7=u3q[uiGg$^^d %5ˌZ'FsdGJ ]]!Sk+]KWO2V:TȞ7˼N "CzAA*w c+8\ۍlDu ]L~  .ysEI|>Io@ӲpQ4s|CM?ܛmL-NJ 'SQL(5h^5Ԙ=}&>vi7q{Ru-JFv3.Ɵ)> n-1l*$Y9#)Uַ/OXq(;23xi}{6b>p?a=0σoľ_;}I$Ƞ08CuG_L!z͐뀉Fvj^cv^ KKKڕ̴laO)ܧ {ՠ0_ ]U><Sc*uřEbcM$$JvdNMHDs^3E[pzz@3'7v+.蚅MS=7_@$COfDkEJ{{q{3KyڏfaΏQ TĖ`!xPc C.=Cscddf~g-ЏNH,%MP+5URƄN-6ř \RH"=Ϊ86lX*XhͶk},İɛnCId1'Yhq 袅sKy2gxPwtH7_.Um,8*;Yh~&٠VU,6L5(vb@T_&FXʾ[Q*nHYYKſ&JÞljսDASM^o_Nwy`F dnsmOv{-lȹГi!vcY?|L6M<|Q.Q|E )芙$g¥V5m1wt8q]4w0^p#Ew00*myyO`MP9֮Y=ncQPUSfh1GSg#GZÜJ7ˣr\#\d6>:ɟ_ qYw+Ub߯9f_75o mPZM&_|3'?ƧXO `0~0NK8ެΐ[gQJWۗ,:GBl) {U^C  M&R . Ƈ𝄷ՌjՉQޅBʼeqfjؑwkN3|pEIBl‚1zkIkG8/2#`Nefaᗤ2&VUQXێ]8T"-I\Nvtɿ UB8hỹ`KNTY<ݽے]ld5?k81٤3m/1Tþ,Aw< m-?RѕGVD]JֵDz^=’e b 7۲lvo'FŢ$3Oql\ue6?c8P[ DF`M &#ceD~iy $"0t 5oyJfoz}.σh78ض<0Y;\.ϻ/: ZLw+Or(pHsLs#%$ 9Z+@kWPlW;mwiiC:l  ϸ@͒5Tb 5B7ĉ5  :$ NR-F٥׻ Lϝ/ԭuE*p:@g啕DҦ]4KxӋym@1gT3cxܻ-;`pRU ၢ%f$Q*/G)s8.R՟xItINlV?פoċ@ a4e[r ;atȆQD@=P0aM!Y:!B^cRh[C½$ O3Oٱj%ͦ^w4vUݸ 6TFՖ^ú(i ^SZ@p(/ 9&{#APn FSyv݅ק7RC;>s(o>qiw JnW2/<7:]ͼy;sH4'(D\dN{W\zbf"4,#Y=ok`^faӺ7HoI ԕV*CX%JJ8$z@bQf^ʵu P9@?'S+F 3cO0>tGZٚ@=@R 0y#soD4?þ%6#q0A25 <"}W0"g¤̘KՋU^h4G@ X߹  "9 wEΪۚ<:60I_~f2_Aݨ阮xGK9D9@t:@YpO/5~8(sDTAձ xMiR|TUQ`1pDS俜ݴTok)M/]\^!MN'X dgA%)aA0I1^C%rFj?ylzs#rIuQ6_~@ww# 8X/=qvǂY<F$}1nA>E x46n ʤH#cG2O؅n(XRG¸^9~E=dq7Gb`RPgQ[qP{z@#pnvX j.! !nd*E.y[&%xo"f\ܫP#ˊkf扺@̙zĄNykׯւO:r̉/QR7OCixyu$=zss > sME^@D>}6p'wPSc W4أ& 6< tu#eBTEHI_=tOM ԎϚ|Hv)E$_-TH?p'c~x2o!O' !xl4^ ޘӃZm#bp;\%d$xcŭ8,z/ 3Z@RS{$ѩx|)0zL"Ś; a)1bas5MIdI7_Yps [#+b#K'~x#-j| d_].}$P3nK?^YNZC4MF 8WyP`@-{d$"|( % ̔( фsyyZ+6u%GI V];&ugl7 s܉hR-ezec%{W#4aVnk'0sNf…5jaEaKiGydY:^%ႉFE;33;hs&)k6GEʭ6+vh((!iFK&;OJW&wC6u6mv~t"1eP_#4 nJvB ّ#QS$V,؄bE5Ҳ^FhFŧ'= /]Y3@e̞<ݲ,,6}R z;{s5kH hĪQJRhPŪQF:V*0q_ Y!;R hE_~Ho;lhO69~^xT2'%qj7TzUO7ڍ׃^Q 64ee0.xm}1(]} YQ'(X Y= c1UH@]X}n竇>:s?:r+\95Nފ5>|E6# .ߊH{(pX)?KtPTmU)uQSLJRO=YxH[`.2.-7)Tk[$G}OsC.v Q*3|rA߮?={3֪`цgyQ8,>Ӌ ^TML,j prx˶?a[I?]d{=i:+>f~ X'68CKA]=3}xPsSG^e%g)1O0@-'fn@ r aIt{A pGHJR2.\(KZ66!l Kv(*W<4Kἤb2Wҙi^:v]T#r BzctO6pNA#oo wVޫ+xZ$[S8-P4n|w63@,lB4CԚe>S]u Imo7BL<̣=lZ%=fm: t)-,-Xd4ݮS[ZFWW:| q9p;1g:)}GlzZXצn](\n,EN7lrR,>9ۅX_i7/Ol"\⵸tc`׸ܳ?A:ܶdq76q^;\V(WV?#7#-EnM%UwrTTmQN8`F+yi}aeql*1f@aR>]_mO5[Q7k; Xi3xzTX#=5WJ8:'u=qD5D)64Ư(0*?{Hkʹ}}{R4~GH] y 8+̦nnꝺӯPaưUKUdĄۧ#'uFnR72VG(74yZ Yá윛 =N-yT<4pUiU"VJ)#\Л Fymv nykܒm¯"{SBǔw--s+!r rMsĕsg=vnZ+7@=f^ SP][W6LՖ]`z;7`khYl/M;4AQEr+\tA|nb_صǖt^$Qx#QY@@HDH)ox+r<'@9|!nkN'O^#NЁ0,x>B֤!w~lPFR_{sh7mM?Aɶ=YPҸ \SOlhzF*oWX.mH\U;nwF Fe\@nYΜC8 0"C6q<5o3_p/i 3;0 IrLƲ k^3 9qJEH&\ +fU9Ѯ(rEu2{!YC|S ^!1Hc\ W!uؤkR"π%'m댽}ԥL_<6MUXC)UJɡZxiyW],-'ܚf/~qHiqo +˂9/f<b/ ^%;uCI"1}1j{ƨa^tbq<: |PI:@=``o Y1K(I&Yי ~j5+Չh^Qc6ݙd9S.yPzw2j"]3d7;3oogmЫ:;Dvdv!v7!(S;wWn:cĄcyԤ-}`U8arSʸY+.M,P!aⳲ/#̐Bbw13ZR.YɘkVKr{iHщף1P]# QVRF'"اտtuxi^1֌(~ ` p~Ɲ 7gِjHc\[G殈ͅrefh^!2UF\IMƙ&A`]&~ђkG8 a%jO賛=B=%z6Zm*P~x Ƕ_XkfOkb~h0,#君/32ͯn{$~i%@Sowh!YW?E/ƕf0m_aL Zͦ=3VCpT&Vs,L"FD'!d [4"oq@偳eF<' NCaƄ@9~꾴#$ !2X 4 q6@q'71lvgmiв@FҶfY/W(Ъnxk(dL2Y}3?=}׎b7*9so~ =7j'EsQ$lӎ~ՀD,7s"@~oCo"yq-DǢ3S&>\mUUmMs`o |:sp&u?ΔzrQ~,OR01)ِF;e<g}]'~gUl<#X|w 7oH>)i}z7:m ~h_{,/`(-6x+8,Nj[`ߋ <(<=q(!G]z ~++`6˳}X׃|ۃ iWkFX7=ON2qat0nϳ/`JHo.hBv.՘JGR(b:-)asؔ"IVC1`64ϓ̫K>D]!XlXQ@Ҧ8IT@FpΦSQ_aM:($"i.vjʟu(4eN@XY4H$K1`Čp-f!}US.$t5/d%+6lqĶQ ڤNIlѲ~mBYF1T4S<bu )+IV-Jb:CX+)y JIP0pmWu-]خ3IwZ} YqlIӘaR4Vj ,C٭JoU lއ)Ul)yⳭCNสTC5磄|\m6*FHЈj8dSF WCz$]9i *vyU\E+vP8ZE= 5#\Eb\mkj<'-ZlMz&H[Tq@F ]*Ea9 0@S41vfOVY0V>wT^%Oe;.v *8*FtN,ckFE4 (`,a Q1jy?nX?3 )Ƚ0$zƝ̘3=ۓybn^8zn&_(ř`&5ow:osaf>_+XU0qpBM>rT9_>vYGxz'_1fX.g~`G!FMFb?8qB:ySz[.y\Vs@F e ue.lDm0€֒ иL^&2$WӏIh?N up[U L9,.X13Qgث"\r/yR#gvW<ݻ<FTr[΂>|MLmHw;R&\|ǣ_,yUeA٪r_َjy*ʬF Eϻ9fe_a'X/^fN(٬X@ )#M%J*99LNG>iJ`Mbh[j:Ke֧z6&WU 1Gqgl ]~5u C1J*jvc{7֓EvkT['868s~aD+LӅՕ4;݂zzz _{ٹMƊxHñ6ukUxg=UAڽ*'MHɈ!'MʫHl9]5N"}*7:^Hv#FM.[á=βqmPBz'ľCX;Lo]*NY}+OV"^n.j} Х\Y}4/m:>]>}sy`9<MXoOSm1%`N>vGv|yܛ `:ln" zd'Jzuht:k,82{3e -B iǁW~PPp.i8[0 pP?ۖX}rg}&^_ۏB?X7"gۏ.eSV~2&ؕstk^+fV>.%K|_L8i-B!'pR? lL=HL6g 6Hwt"= 6#pxͪذǛKBmxd hԙ(ݛ7,lemCCOK!s@U竗V;Є5[]5hdQF%|rFx Bx@^ߠ5:4x : .{Ǿ`>9u 쬮~}= $mK]jdbY7llD=" -eHCd~*ѧ>E/ga/g4;!/ЃL`tU.8as,묯K+MJWŒ(oe( =l Q_8](s2㇊Kxv$[{O0ؐa/y@d:T .VP̣:ez9[<)@z{а*ĺ7AUeD1F꙳|-J} [v"jYe2716l> ^3̞"R 0(w 0kݹ㴲Wx9S!?d#:)jمG3d똙jҙi[xțTT 3(Ѹ_G41͚jk S  !8Z^zX0瀴Yc1h'we"F -.scuխZ1зFA~wRB> 5P^_LJ h ܞ5$3[eej~񳼽Y04|k?o!`=VLjREܣPA)/X=Yq?J+P3[=]O;mNY%qj{(9VG5F bj:P]$6vY ,|9hAC_pAsi٠q/ḽMy-k8L.?d||[αv-bCeL 1!Cy^jW#f^.ܒ+M뽸z>ΜD sUdК6~ξ> +:h)nN=w)Ysp1vp)ӊTM6(«G38n m {u:)mAyG3Tۉ]r"  Pզujت(?&}Ь*J[QKiX@K I;AJmhϡÄ^9#P.'et;n9c[[ OEbY /Hց:v GVx V +a-3r1j#Iَp?kMBS'dz Z܂ ;=Et,6`/Y~}ZO8湴gFƵёA\I> lYS-@X҇߶|0o11*m`/JBےC G.xh$+Lv 4j~sR!&ƭ&- MMÏ`h򢱔|t%2"AR {MAb[>N_C7pQ*(<:0Phg0%YPIDH6[ Ҕ%8-%PႢh94^!a^5aCga_1$w{1MRt}&o^v^? (OxT4:;E)JynDk\L3R?].i:m=ri~:+0k/'X ^@ʻ9喐2$9|"@~.w阸thT5]){q92I=(M4nP%Y^ަҸ~u0aE2-.) ">q2EXCShzd͐r%'rN+ZFgɱnbR $5{RXm؏jVS-4O=gP =IR G:.)VmWW'P/m:ҪԜ6fZ5"~G0ޤⱓlNV[Q8Tг\r{77iy@w} ƀH4`[֏} ^ -a_ W@w%øpfAD?[*AK3~O쿠^-^kG!^߯Y0~aiUv}DdG*Eف`Ijc b \px͂f uldE4f:%KVoQ8dGݹά=)m@OԿō??TVTCE@!XWT0)` H$+rͲc4Z7-\tLTr}>z0~!3|?`̛ og?4ZIO`^=~1{>Y2/˅'14 *?4ɽK}ֆ'0/R}EP|zU|$ytvnFj䡝s}e&j|$-_* q9Kn|loo53ȼ5Q[ڂ"QeܪYw ={6(Bzpey =?y0߰nr^uΤ'PDp`^~ M>o5ĩK9VL]}oY*6Y]3A & "/pT㯋UJhmlk!N {X䧐 " UkS{Pь t74XM+o>֧z* ߐsW@2V\WekԴKi/IQQaXTL~* !7Dt7\{Eh*؊{K#2rŚWkXio.ߏJK+>ؓe%9k kmtjBLK1&ԅ$0RȬ =[Ifn ; e -\w^u:cɁ /BPeY~~cA7zSeÎ O.T HP5꜑nzDKI~@0Q-Xa v,џ"m72v,IlPB/emH}s/e}I^X8\/ RHam/XXTb!s0 mf@1|C/Lr=uoKЄ\U^{rpAU9?p7B;b<%]:0I j}̨zd'̰o.fG3뺏,b`v"vGa'8W~.|3gGx(2X.4bdh/x譈 E:*K-Ҭ0LK"P8[̬:|jp gD&^QД3Xh-M1KD64Bkk5ahS HѶ$˦Mۮɭdz4&PJR.K,1#e}+g{92&G$M)\LLGˎ9\&mdM끯]@,'.> ]Cx,S F{(4dޫ(`=ݞze2dc SE_),w#`%ބ)զsGEyrP/-TD,nAjа,*Q=sv-cxzWrJN]'v~3(Tе2m[S ^5߬%^ī<9X,.IN]NCz,E֎-٠^S*؂i=!q`K@جD8UM } 1Jn 2Qz52CONkkl zHE}rʊo>oow*wKLo764vVLj <H RBQLwrDYL +*'3ߢuSgͬOlgd G5 d`Ė~Q |vXMsՀ㩼uDlpּD#Rʵ2Ɓ)lkηB5Ǚ#N_`gŽdMnsyaBnD Q=Eq7ZpZMg[,d韈@u*'^+`*g_/8s7˪xWV}c& WWZ_卍Kcmۢz5p vw{SJL.8~WJ([ty{%{(;NU+|_y ;??v!Qc+[(u/^xAP 98[Ax_ 5Onotz^TcC,kDA@XvPW'8tp% +q)1jo|nJ_Zm r[.Ttyj3mx('+u3CNźa 矟@٫4f3yQ@i:1 Ӂw#:zIeNz8,RU%hWbaD?ZYQցjRмTqrĤLPFd#U24cV*M3N٨Qz䶗oiCDO7{l柘r_l; Gi(z5'z쩩npÿr˷ـ$9P9`=BXPHs~ H, yvHb^Mvņ}ŸHqKǥ/*W\$gREȚ#TX MH2gO#ZJHT(*hUgk4eU&=|M肓 ,{Ei  "T  |ӃI7MBܴY={ U(%jO AZ W.9JS_% (]~? VE6*=wEtƱU7u<)dm;(`HZfZzXH\۱`G-hU_oT.cR@=>byQIQ`/f1c.Z;6qQkj4C`=?ZW^Mo:I!uފu#NSyrzmkbYo@o@K8/&夦XDTcH pc(I~fLޱ".w/.r8(4!kuhK?_uXǵoZڱ<vF. lи2=+IӃrpfʟU%ތ%0ͯO&]Rh'3DUUݥHSV[gv,pVP醩0l{Edlث:r_+8n+17GhnT/<5Q..u+*[tJ/ CX[q8,v 2˥-RmGnګKWy(إS<ʥإyIarcv"(U Ht R=Oj'J ".mNĖQvXWsh`cHgO3@) LU2(Dw<^{P/8 3["!z+Rv$c$OcCTZ52ݠ!sXwMj0=K9]ʎ{ ظC"0هB{~9WcT\ ` _;oYBId4~Z^4s! BO% V 9Rc"{qcu4?eJn9dU E+:vBlKPJn@'̈́o@blG%P~ N`F,$r2p„:_WYõ`v;v4Y ⸦$mFSjB M{Ɇ͏:ˆ&:KϏeݜOo~98G202#}‡-'[~ i"4 '/?]>3z}iz9(:WgTP \vR-Y7T12>Fhi-MD~`wqԁ\Rl" h>yMbL<ݐH78ۧM/m55BP?&Eۘ_]m@kFbIQBTI|,NI1 kͲb3<>.0$g-6c&=d6 Wrt!:f_ Hq,B d6j_djCCy#yT=p%FFM>WNxΐEfDqYju *mHGF}woUUF ,u+Qshˎeԝ&K?)E5 ,juUCnVÖu`'dU_l7^_cʬVLΖ#D;O=3ihUaF3ލܝx:꣠QY4M\sѰt׸)V5oGکдm77mNQΨ>z~ `dȈ=vЇnY6{+8CR(cT=Ndpr\ Z|V?u9+ (E4N%w1==1S,TElA*h6ґUpfڠZa=ں-)=7A㼂 :G +DN$zˡ4nhdYX€1DXl{%jj:frh1ꪳϹI0ő`2FatQujo]8]- .e:' vlٳWء F?PGH 'Kai^R*_O`e{qgA[[ Jq"xa{=`Cɑª\oX4n"32ZX}䷒ rp6weћu/Fw6쎴fv:|WNl`1EڃU-(lG$l4䣷]Un-BI7w^lҕw&~ykI-__%-|az:{o&blOE@:kY:pFWLL$phw"{2;LӘw,L'2܏8Dg01J\69T}EUlv9I6ܭ`&jޑfHF$ |45eѥ ؀!T/9>Y6'*Ͻ?MrQ } ,CýV ~Xsej]zTנpW> òY 4;yZ = ;{-kT?U+ʤ?gKOd9K`d[( :{AbSc@O .U$p&U sP3ZU mJ)0!XaĵUK(_y.'r|soN̂fGWuwΤ+/\Gc`8;WKOvxANqAtgfn (O@kecQ-S{`,A<Pa?=Y H~߉Hk{r!C>{C:bHeB\9CZr65Ze=DAvY>ʹN\[3WmR\Wɣb@t 6;GTyKJ, eG0A)V@u,ddITqR:8N\x5~ zmg A[7em<"kʛ-bRl+vl i(1UⳀyqzFpTlWMVyTi@+Q*jɞZ嶼h1ƺaOu9 ݙy£pMKZK0)ZA!`\%-)xlNlZY; uAh|l}s^՚^D}J Ur뚌*2/ )ꄩCgꈺZ!ǻv5O8j;+ĥ& $8ecblU)Ei 5j$J읒kYK);3M1l e5,s1(rt)HS@>WwM ^܊KibKAп`rREÞK5+h5 T +m*]?@=oAy8**^ܲ(( Jܢ6*yu 6xV-or?d{pE@_6ՍVP@m(@ŷTp`.2Yj%a|1ҎNFN JB?Bw1XQ\&FkULUC{!74I4% hFª$VL K.yR>bZqbj.LVv#ȱ L$g}p4eL^#+] "K'Z=)jD1"p&!셳p]<}5D+f/B'.N_wRt PFBEZ VP"d!#"0`EL, _А (:xˬ([$g-sOwNߞ/ 9҈ V" ZꍳPe14ڐ4?!ˢDl[JGd_Pmatl({ l)A[%uos_Nc#?n)kd]5hZ@L*OڬQsizMRQ-]km&HQM0w%Vg[+좵vbԺ]FΒ3%Ъ9!`l潡$E*Ngu+A}JnҒlBڄ97~O_Ȳ\XwI3>At =P5Y2dgu23*M )YGnCF?ZHfC`|f`,֏5[XϵCk&_x!X䗰AY#,<8;8<ȅL~jK(A)}[f:Q 9/o-?4dL3cWf_Ke1M;`/)#$BD13(HX"M?Cx{>?f#P0ɡ@ݍ1yǷFQ 8FQF02F77 }V`'ce}Hy<;Z$HYz5C-7xL0v1}~.0TYL%w&Bd{J]mP;?Sdx a[&̰.&H:qR*(8ނ㉝4ټ,($0h p*~{ w 3'LWJ_ޅy5iI<\?/eCrwh("]He|+x"ZLR[IBmik"zx[t?>4WA &*0!i2f؄Ma脀aN~R1IIC[əeyI)jI yzY%z y9Zx9Lb`si+-#K9ȵ <070810Y W{Ff3~Ɗb FL( ML@`)h0@I9y f K+hlL3f$5;ұ+.M #r/<0r/rG)k(,~ȇ_&K-Uc*Y,Wv66@=35BpX[;ae*Ad fEC3f4G.7[T4gTWTZ4ѧW2ITWRaRW`'їj )Y.EOQR6c s `iF- ! <]J `@#Qq'SCO I3֢Pi&饔0DDzSfU%MO 7 yT9m0 ʖgrEh syh`0$is b=U 25&QbթGQ;Ps+!ܭȷTS4i}/9WGy~W٪3oX1[@ @[A8m^# ?YWCyF3sH$+ ei 9 ,nfv3Ƞ|X+ڃ#D|nXpcۦCX#9Q7%R"SЧ5NXIhIhg޷)!kI`^e;NRǼ5ICÍk(#<7pz jg)3@ |,Eȟ!Tpu_H̻gq&g1c%F:g]N2Ֆ榆Ksژr]6Ked_dcSG*Vc^q 0VT+%^nTw8"w5Xo5Xh &OzT:X\Qp?⏂LW3f DgBm+]Zը@z w$`QZ94qT;>14R]lOWxyTRFd"A#[eύ`:J ^z)A;H!'fᲠ~e\ii"`U@it(쵰hb3 C YuxuF*czzKto8cȹ<7GrORY m͔䮕YlŷFe?Lih6Fz@ƨ˿'/ Zsf  V4 B,<ԝ%H㔃J0ۖ%x8~1۩~>YiYk;([q(^Ks8(V@Kp$e}ct(W tÀe^1o &B= ^߳0\;K^>L7.n ORtи` O:) R{I3sd;BT]W(+"VWVA,WV!qx-\{O(\XfoʆƤ~xQ5Ą^OJgZi<ՍX?r&"F1آA @ 8;n <#D+:_ǀgb1LJjRHPii—*/)JIO>c UYo`yw ہc7dig.lo2[@M9q.aIV\v;"Q rM\[P=M+.F"A`#S w& ~|zn>0ToT;IXXnvejW 'mT7~"v=VhϤP oJ%H)ןg>f7hO ^9=jbO֕0_07μj`/}T(B5{JAP75"9ܨj FoEK9k $zgӝә(|VbPe#5apC[d*FlerhgtG):jPDIDf(CZ9ZH #r(@BV+.my7KҪR+`)ڎS8f?\u=t¬I5Y1ފk1ICs+[I93xcmXZwTtbpF<dihL {6(L3Jtkg6f^HӯBYX%aEzPi’gat z0kF$p" a/urj>BNw0W̦r}n4֤jOj>2a>8`lSFrm̠.3ě jx[/Lxh6F

IWNJz_J1@6İ]6߰/4A pd͊)ktwAUL憥;"rpڙ`xR<; $(Ʀ5^+b0ZḮF$UY]'Ϫ&%|4%&ͯ 39q:fvJot߅|7ˬwoHHv ׃w|-x{m^ٞlj _kX S^4|uw#s)k[XOP[}«ߋ@k.9?ӴS?=EėNԥM(q<|gw_n/=$0QHքPYwhGBnבs(MfxUV>,% UNKB 'Q7S5&MLd,Ei0Cz1Dk׬μ|BK13yrjJb 4$@<3(UUjd>1 );5A1a=w(Q!&Ww0^"k:,㛘fk(."G}^R:z.Yds ;1"b fIt{ãHy!5hIe 3 =g3$UT pqa%|RS|v,'|Ggu4e>Ú.o*`NdC.ejh|GLM$Dt 6Z!5M. t?i#xEsnC)@@ƞOkZ m sHo Q}0o&Dyt k@CtRj4m)A!; :~zф7rqK]WE+Bo'*ԫ6j>3Pd_-ڧõŬl47QI5tt6Z~m$rVVj7(*<#،j0B’;( YbGfa1勯*;Jn;@n g'2|/GiUvD%+z2bԊ<:TּهрaoݰrW3oLOf,L{%^35v'5 sZ̺儝oK˦m[Ξ2lm ]2-*4!˙b@!. saz+P'\$ h kk@Z iE٘/˖SȡdVn`Qy=Ϸm>#O38nTB>)5w,SUG7,>'@("PF81z[C.|lfo!<z ;bAB)|T 0bafhϗg9T.yaOd!kH(JŲAg2np~X/uO*%(_f[ծ[4g UIxJ{apfx}.QVv,V1K'$"28MfR:C4TbDʫThk5j=uA#m؉gQ/;Әc!QR IGoN81裋7%! -hhץ:}f(N[0bABQwC RbiZ>#hp EdmRTEt,L%A3™85e#L,J6jBL׀D`XEĆ4>g#c5V" 4NW ᰟ|(J9cj5,6q<-.m0sѺfs@fXN$"ٮ*Q= 3V]A3 c4:SN쵰ƍBGktQ(:!~p YDWGQ9yJ@ҥ+jުA[*^!/otHv]N Eۘ5-FOtIX;@=o0n "^lPnD>[n*[p"B(zel>_>]i5k+wBCGAw[bAFeo=}\* Y\hs ʹ\h[.K 46\sn/W""2\0&{Ó0U7bDa{pDꜹ乏0'&%U+?nae@dQ<ޡ⤣]e\QIӱ6,o%)0m?<~&- Wa#EQ;oTc© d+-_+4Į<|O:;'4|Ű轎AsP-E'c!๿=(dJn)jݚHThDq1 eN̎k>t4|wԐ'%ZA6?*?O|*7,f$7r #ӴUSnzfAa/B<I PQmi4$c.WNu^yOߵOB?9xWA_h0HJ5 ncGc7/ k+$?l.AF=dЋ~U/"{ pnQL{.ߌvTڄLZ|>8L:x-g"Y ,IsmCU!Bf/4.g C1|ahIBDdo8ze|N7t4-*`6vwCyDŽI^9hA4[ҐvTweX֨SQ7'i -#҅Yxh)#0k7 -ss<)oIhRu/NV;RN;}.2I?䲴5גt"3) 3y~kEw't1._fO8dST~VA'׵/6vK̭œ"W NpZfπO{ OoaX=eǧ9TpE|zc"!_IvgaDMedAP} B$,d~ΎN y5d%-~+dXmG퇧^&BzDBu)xsIj[d| $#Zȶ/tqk)4ʰWY4i3Uٹ );1 PHJRi׷m۶m۶m۶m۶Ҷ;ʹm<'gfyw%yk_U֪k6x،s  0aVM$.2wO cUouVЦծ}Ȣ#_+iKؑlU>xZAiUF*jLIbABᆙ>OX id>.:m*cElDŽQt+2\B*35n 5 c Gρ9Pq#4T0Nqܶ(7ʃfo')պYCtK>mCKs1gA!),b 'odҊ9Hh 9uT#B+JDJЎ.yS٢y{) 4v թh|`mN@ .,?#9Ӵ$|;\L4IIN@!ʲh,ʬJt;:%}Ϟ-n4Xڂ;-|,z]Xu ۼws㮄օ{V_vg;a NMha:O0_[_;dz!."/n}˿eY둉kYt_J lun $=ZkW6D\o~?J L,MaoccjS)`FGe(s*B'"<Ǵk-5W azYh ٪) a0zak"#aNVdQP#W^be0?x-X?MYm!-X<nm2x%|T MaqFE2y',h%~M՗ήL1|lҸQq }ÊL[-(>$Z? EG -9@2?pGc.Hc2tQ6LF,32l fȡðiV+++-lmm˵V]=/Yy; ] >|6>4@6k VVl|āSxl3L/Ä_G?+ #>1TT^TK{D3-<)Z$F ' 7$H5nR! yPѣ^=rN39\sjPÓ#eޠ<_ D] /R“bAMp.31QS}!AٛN$06 Wӛ )Rs JyH֐x!}7cKo~~Xaby8 6d rD@+xhQTUR}lXDizf2 =-djSg6Ԡ!_5EL\:lkquB7z:eM6& ^ $59r rB+#Sx60DF7":#aG! Xo>Prd9Ӻ &&BMdfAO&S^rA`ٱ"J4^6xq܌GTdvqv\UF\w&)">(m{ aa긴!3 LD[K؆n9c:Ϋ"}A!jyPul5v&@3QS˷@,>r9;E*Uc|ap:[;L˓y䀛rš k;[|T Okí&񘜱H ac4֚uM8@:II.Mi}9(r[2L4-:}H^i_ .WPšX8D$in z4"g&+epx{(rK$ 2hJi4O\u,g1J``qZ(QQҞ]G!@-BxA;NЯds!Z.p=]jS>s[jฝxO`%Ê # 8}Y0/m;~O$GS^!۶lnPW\\]|R(P n1;x sx?:ܾ;p8o [OԭH(2t=Y6G:$A&1<Oc(,HdU1>jL1TMʹ hU.ot8xA|ՆD.z)Exxm@\D-/>{ޚא%Qg,x{2c|1gJβ (6lQ._"p\8ac|AqNz{'q.e窭.#j3@i@3]=Kyx`wǺw30||e,>~3;=.@gԚD+ʼn !Pwm 0^P fJf9/:nx]a\xgo\;0Ak.p;ջxȾM[Wtv$/_e;{\> p]n "Z*88 kv$ HT!nj\ou?iRAkË] ڴa]g UkmjUK) t!ɴ h~ Q=n@6T>Va,V"$AGM(uɥ^\y̾.&S{P6ђ_ ,r܏y^B:_I%WͼN Edƨw_lk-3찥X`ߦ-ӊ 5ᄅmFo iYKY-= 4%-ߑ3⹮"6ٽD)wunb*5,NH"jx>UN,6 B_I'`;\۶!I0z|2SS]#F_ad#4]6rVQpU!0,ISDt=?fr\`;q$5E/aH󌻣H .iK_ôڵDD2~W^5;SZ~U|aH!g:k_ܟWj }aQB$+<aUiu\w8*0Q#;=9Ye5́ATÿ]7<4a`LeNKe'fL^{)t@ggƸ A` w~v%0cU>^5"p ],}!%y` j>W]$'H6 H9dN(OJ$9y"EsE|+?ԨO͌P^EҐQ۸(rPc`vgfciO Ks`+K]pC!r.;VPd`"+GtFB?+"]J 5)`Mֻגx NʚL*e  8Wwσ)Z)=ϸfgj/-gXJ RЀ7 OBK 1хj1 z15)ʲ8,y$ZLr(9 X, ШkFΛ[F۸4jmCHOd, XD*l;c2Z/ΈXL#)G"k7L1}[ hI] _~q-$8!WXGErx[,2hnTZrؠ[ D;|$_4{Hҡ (S]=?Qۼ> .#` (r;ӠI]Z<5(\Ku=nPt‡4*г)?K~bܑ/fAj[[KsJ70>ba\ĎxRLw4WaKڋAN1k NOi)s5ҪUK cS1Bl%Oȟs𮥚tf.(l`#pF]!6(T+(i-ؠ~ʎ3"^A2Dӗ!}jI"G8@-Oh  R$1>(Ɵ7ŌBOb+kV g.;-~l={O9ȜCH|6-"FiC$~5&$~_FsmS66`atֵ.qƯHȲ)^\`'"MYA鄚L 4eGg&yD ݴ"rnLP̡jᵰ0nԠ!x  G;夬u#zV??E,6l"j /BrdShPѥu1@2'F\,:rybs5kz .fgmPte9^SV$?w!{B'b41]o5rj^-/π,[WrzхN$jьi% >P{MA+Bܴ?,]ufsG6wUGǁS(nJ`*߄EJ&\ݧPqGxh]}i3wm!;k ѽfJtSߒwC-4YRԆ%\۰^m"ICoI7P+c=-f9< ^g5t6tFPTh\_ui]ӓp!ܞ}Ҳ#Ұhu8ew&;.cF[rFFR[3eO~0!xV)43 @;>jZW ꐮ9 N1XWp])\wW2r:k0EAJw&'r[_??EzI[=NkBڦYQ=*U _^h }F9k:T(YH.tfqwZ0T :/[XN kBA =aR 9ع̏/H8Q5QSCv4.酖pDftſZE(v Pu~bwY ΡRПMrrIjJ;q2Zԙ[S?i?.K0xώ\3+&U|0(ޒZ]P6dK(_wo#'E0eOHnSD\9a 7C")aִP6yhpNHM:Рto`> b -fE\J pzT׉TJ+ZȗJ\/$r@kڿj _lA4UJOC&j:hd|<] 0 QB$6XyuI2I ɩ֩^YYV:s#1j-5l7=_.yVt]5_6e:Ӣԡ G) _UTR_rd]9Z fWdR 1elE3Jԩ@C bc{aᖷ#,*ʦ^l׽: ݇>/VnqS Vĺ[8q53"HEy3iU A+MܓO&R D O*wt.Wn})i"!2Ƚ04Bzuҥ{>r{|8X+F^?SU])6R;~3VqȈm,hn!wqVL7V MRgE'v|b{H*p(J~L-?g镮VhsI/B3ocզkOI@6!j=D.qg .[ \|;24a[YQl"?c'4pH.A:fW4GkM'CYxM51jXt6-܁L ' UM@aqds,) *!m;S%Z|9Җ 7 UqhtSR*^ʒ~ ""C1Ene\i[i"p}Ϫ0D69L;ft+[L{Ԃ/R4r(2Ҹ)Tw:X\&̕;^8P<+ ZP8cD`Jy0Dz~+޶;n{(4|}< 6C%s\Db`4L 5]v n@`%6$nhj8SS1/˼&g_j8~܎iuc:޴O(]gČ/6<9*ƹ,짡Zq2mP[@֬;srC2)ޠ/QĖ:<C?1xx4J},)aav9ИՆ0uHfJrRKqUgWǖ0^g9kZA _p `Ֆ$([rیi(\*]38 Mr3쟞?A{_V?@]'`HH )j8/o|Ծ^uF aGFn1҆hº kv5QnI6#g/{CfGa/p gcBb VaIl$%Ǚ_pYmTr峤:L+8M ]MraNWW),s eildE۪U5uvպ>NHÒUtM(̭a-t4tJUMc;bŠ`f*㪪bj5eFqL8[ZM#\e.0-Nԕ@СAa/ Q7FreꕿP4tV,O '=9N˜k-70a+9257ʨȵͰ2/ŊHu/L#t{yE8z :9t 7խD'v4r3&r6(yuyUjΕĭ|9KNKMQ1u7C0H)58tަ0 1M &1G5l9DeGِF $W0gWMJ`ۉ6@#zSCaҁv_ܯfCl`B=D^/zXAz]@8}r 6'Ð漿#}ѭXx?;||jHzYKɉ+b3;},E 0s"q0"CH0kBs }Fȏ{:W7`{̃z%<,M ֪Z;/!)AԳZ<A@,{LH0-??*Ysǟa-r({wwV{?_n|wdRozEQaf tæ&3Jek6c;s =+8x龦k?ʆ Ƈ>"l_)=jvr3DQekuf0j%V%X%jNpum^5pvPױTTd^4t$+Fz/j\R\z~ iZ"]m¬]y:t]85ӮD`9ݐwuoszV -~d0Gil4riwv1muő 6꘯Zq%7!qhC} _ u$R&Nw޴gQߖe#"s"ҍd:^o7*\:Q >ETyVj--$qI;KkbGi|zdtqq ur /b`l0AҘF("B0U\<-|98Kj4 #p?AxSc1w|C0БE'"/7\[b8 w h0Gmbuʩ(10p`83E\e80X :/Y'axfJ0f#SmDTt|gP]^*H%)t"S+ VB`jC-r.R #mD[z~d8|sB]*YO Ẃb#xj0{@z1QD$T}S|ŢT[l-34 <3ccUAř4`)zҘ6"h"̉ԴP :T Ϝ`^WLu42$!j:Zr'M_G 8'4sH\og:o<_?*rqK,ADj"\-Mׇ)t_1Z0dc|)2GBD(˲s2o|̿~[_Q/<Κ4UCɡ~W\ve[Y\VVƜ+CO;ahe;fӎH$!fKj mu7>#v*U58κi<ajum.ůAl"]&qv_}ab'bv lyѵkqZ{;AOܳ&X4qXie 3q5 28(fa8,tؽPNlS/s ժT0 _߃ =xJ Nхm0ʺ8 -17Hc.T/UGl: Ц{Qͣ;lUɚ! ܐsǛK~OJi^!/5 ̰sV؞(9W4t |M U%Ta /IO#0 G-fMn1~8i:)B 3HVK $ 1A0pA_8WGYA25qS$ bZxLR-Xma`^\0<">$c}F}6gc2?vHo=w ;Սω,//P;{X+BC0;y L <1K}`|E:C\VQEť‚%4;j KaNE;<ԛsA/w>&+_l="w_Cpkޕ_Y fo9Ѿ|h{_U}d|t`7?H :L{@]1G#cZTg`Ҧ[NCG:YWɢY5 P@㵋FkZm;Ah umG3F7t b!j?$҃ј% mSۓũ Iݩk"g# tkCI̐8?i5eZkZ[J^f3"-3PclfYfStA7PiTy0=ɸx#?rs"Fʎp~N('lUr׼ ͛NoWTs nw_NYGi5e |v[0_FK=t.HMtS\'kî*1.~UԲ+^)Ą(k:ai.]v.l.;qT;O}OX>d旦_ w*tFiI&BjܜA]c+*#k$$)5"@fBvZX-U.`l7";-OL\c."Q;w1%W瀔">aBE}U fWb,,i}nJհT+*cW3t3(/$ffztX K/ *DLq!YTU1F8Bh́GזFNr䢆Ҙځ҉eOcUAv`Sԧ1&va;˂K-[f1e%YJcnF?dwdȷuhvzfy,7/RNtZ j~9 fw؎ aULYK(a;(Roh)v*wfbߘLeRܮvMcI^cDe3rNf3u &F~ uŤtTr:4HVtK\?+\mtgGj{Ҕ i#>k$Yj8N*TvdɈOrѻeǪHe?ڼ}Jzz`(̕;EDQyꪣZ.\ ỹi<| IgZuӦ:2Dk|n ull`K;i,4 h X ڻΠ!2L;+Ҫ"17"ԢrTI6%o}6@#rA#`J:[9؁V<͋~`2C t~+Hu^<,X)0RzF`e|j]l?Z )+M1Nd|!Hh@'Եȕء"2 nb˶~UUv>/ eY2dn3w>#,uFMqP z?5`_z-ɿ>tZ'VgD~sWr^A jȄȭ 51JH2̒Q0JX923mW3SRˉ:E\dN0 XSĘ0& !I<(Ă6!*} aR]E@tt9/"CE+}TGq6n%lW{eQyfł;gtÂJ75OYJvbh(Z\LGpJ4B#*u.  fKI<39QKK' ?"dy[$w:QXdFv$z!aʴg; /RpG8'>W9󑯒Y3gGsz^@C"qIl(QDr %c0yAK$bwiRn|v#\?=mBJheeg7@BZD*jp68(^l n!;ݾ<kw/`pAA&ܾC[H1 enT=UA=Kuty-bcc|{jG_A [ n5yv'jbur5Y2k,dzE~ɘV~YOoǘ]|OPmo c-Шl<; y.Nxoq#r^ACڄ0e;Ce `C wmn]uҕp{٫ TTnu֪+;'5mZ\KB1 3>\3wqSXP(65(hBC,L<лl{:_=$Jz('E߬¹()\2$Lb1ygc,(Sz2POSUlNVKѬ`W 1UPܟ߀8PKM4DP&"l ?SXmYHÆd{Zn mIxĞsK{SsE5ע!BPLxxxg$a0b;.G0n;hXOGqϩ.„nHG#aZ!I׾!(sv]Zgݧ2y=zA{0|Z0oJo+ ŀERp B)?Fw9$ p@Þ GEo 됹k;N$@x@xf6a;l:͟,,6+.?{؄;BD)R!Sc@nQ,AIn.XnXJgV!xh{!j;l# x &(g2YR]+ͧ_tSIME VUD1B Y:Ic #_le 3'8r_WIC]p9­:芃$H/Lº$( ( K6E \cڡ̵p^v^g\mBumPah3o8 ι]F&lR O 2jTS@S3{; ٷhܡ*\vuw? _<*gKDp5v1.lI @R+Q[ѪϻU7G D04DüUb~۫@z~HaM5UBf̂aU~d#-xV?ai}X/.JLDAT4XB[nto'Y\_VM'IvS`"b֎B̔u{cD$|q9Y@1/#u|\(o9| O"uJj1: iJ>uRoP2䴩S vg&ƒw)1 T*`, 6N2wK `)_QI& a!zEb{DdzVwbbjjљ__qFIь:@kH%aAaY hpRT*-a}s|I&`\`=O-[jS#`5j'[]?.Cy_2Q)D X euHLw?b׿ .5\Oe0x#CPc s/7["n_IYtp|Szg.UI5*x/@@Jq.@'#5L?PKKMmWdnwnzh4$Kނ-*<@!liB)́##k2V2|(_RlU$_3N%nUtW!&+)2U11MxAP 1{ԍ\Ą=hQ';kDrnj1[_G[VzVlڎٔXsQQlBx#~-13߿JI{^?Fh877057061CO"10|&9.Jje}8rRPp'/z B>\V@O.i&e DAة ,A9H#(UHYKs{gtWT a|{ qކ" FW%B:K+A{f6n"hhi^tɜ!"",Q]_ 0O:K:L- ( jF4GThOIYZ܈ }V}7TT)V[} BŸn-%/Y9̲l񭐵oK.:홪j!`ug_qTԻuTMspJLtc \||nab%$3G凜l.͖o-Ȱ7z}۞9QP$|Tt\Q#*1DeQj@Uyɨ tGy5eL;ܞb[X0a~tfSUw{Nqx`]5P!=!S d"/kn4a_@Q8eq@`k $i is Xy )ΗC0'vk1ya`K?A!?' IaNTHM^]3DxYé*Te|Q32Ed^̳sdD(C:/~@(`##/ AZ*8Gpybg{gz?5&mDد߉~lUOYTU0*耭dm&@(p}~緌^~>~3`WѸ8@@ N" X$,'Ti 0]@rD$/?Cbtg U~Ɔh @\yo2IK}N¥`D.!EhS1o7="̻V:[ 3 |Fm̺~(t'}KW8e#7+AXLrjDeTK/(Z{"EMV( XԢCQhI$@b Gx<"˿/*!IǜpK^s||w:Yk0sh8@0D67S"l3ϽtEP*nd.{L&dDKӃ-BI2mr|PT^{K*Ezi.teћ 3{W^Hw7Qlj96aSf!TČmvԭ]+3qj봼4viO61KR[I*6ٱZ?iQ|ZT5zq"Ξ&ت_L؆u,JNe3݄ ?`6[#kHeɃ:P ~ s,QsN1D0Dd[zɛ(9daB54 [z@'g %bܦB~C'Cm. dM]ԎK7?x A' =}_ޢrx8hCi2dI  8H~ >9B2BcbLA}'9ձV,,_%VH f;py62Ŷ~iauYO[&ek.}w3y!qM0&,.$C|n^h{O;k8aXܴliAӾX1 P#ꈼ!<!,H(/!lahgnϑg(`IH`kZBRkZkd X2 \/9[q-_q,6̂~~&r|ЎF?:iV9 %cqʈazLv9f1$Jc9-grnl1B:Ar'bBg|x;0AVdvTb!~2-86PøcbZ:ghʼ=bT yTelǪ[}կof‘%U[$)lEjpc D&HgR\L\+.5alBH3fKPU8N5:BV$*L% Bdm|{|zN(Lz3NsNU^ ϊQc1BJz sbS`ՇShN1ԣ=9ͭS70UQrʪf5{Ss,jo_z vq1[iY»)QþʈVS'(7#U^h)Do %Zkg[-:M֜CJj~mraGzb89vm<Y.xm[yo:r>i]vWRZocO,?L?rRuu nK!I65%-Q?G23}߫qɟ䈜5u!:pf{M׼cH3h0'1P c9Ή1Nj$8IN4NČF$2FZu*Of1%+UV%䶣m%6 4^cyxTTͮr: 2T")4ٔZ&Iܼj]eK fR['ʗ8PiuPSKTȀl~SɁˍz `T]R#.,r撤+J"!x4o}f9Po J'E34!㌍jN \ qP>.8Dns L0TGq ?t[/G7D:K@ IBO1z"|0{cuIJ;\q 7 [ uHV7D"o6h񉆺EIgsʶ qQ]{e曽;n?|H#cr6طoc0w[8CowyA/##3ǐ4GmW;( $Qӭ=G mǠ|Oؗ'frlx,z4AA/*lQEY0$sW;zm׃(C ,eM_65g[@][ @)ˬYl6RHR+Z()jSu;?__8,/O39OOger~{Y R g5sJ7g$7z$?* K78kvs?IFz-~t=$ |ԟmtɛP7v Lg~g89΅lw>AJVڋ1Jct$Tn~OE߿`Mk^o҃%mhW$ׄr:)<2Xd-*Y87)x -/hPD'=k>3yR֏%YRtfAT'bGKJ!PiTpbi_̒K晤񾺀 E¢vqSr/vؘ|!#'0/xs%|,;jMqaOvA=-8drHsM 2LZNDr V964!q+Q J+PAkbD:_RM.|ZJ*17mr$8&(VC$9mϩr1 ͔Ժ5 NbJ&YʹD٥Uʻϵ1:T;[u 2$*wKtQSRϣHԫ]š-JDI>=^Pn 28v[ꛭL?6hn\~\zXu^\ٽr;oqQD=GbuУGn&z; $cX,Ɯ#j=qj =G 1v:-H61/XpIq1j[a sM ҲM-Qx̞yi~猋?,SM< 9}1$Wx*[+at1,ň;X}B肬W{3)w.s Uq 3d>z5 ov.m-_4Fuѝmaf ѝprTyyGd w =NgX{93&݅gZyq[i&Z-Nj pQ+ڬ}45EЬb\ZHEku<.#1oNRVR<'t1IT8] **$ɟ$Zh9Q=A…Lؤj sP)ŏLoqjKdC $jz8"ݡmBX.k9rvXmhf"V U~ߔ!_{F.E0!8ʵݝ(䯻HԚu& #P x|'b 񞹨?64P N%~ $ngw&:4_ܺI]$s\{H:^YwDG戁BzO6U/_[;cpq4k}Z#8:Po~M4+k6ٳB=6L4ɼ.i Դf'pxrQ9d蔌h]a[%wA%9N<Wwi.RUZ_ֆGtVi̤5$˥%8mLhS~䥙,,wu%LEOiYz< V+ښ++b3G6\*}?J?%}!o9tGw6%;#8#,qU_TC3ڑ9CJ띛q,sž*/T"7* `瓚Y1wOb/`&UDﳞ2EugeWϯ̚2PqvcBQPM3Ɍ0#(1gEk G? z=ƒpީy3 }Na[4iU].Nm2@IZ0ɨyRHު/rZ)KiK}V<K*&AT1fvҤ[$oÞqSCa'+Ǥ73 o\?R?Zo+Y(^05kOԪܶr`ڃIW =<`;ͣءRJjX^~R̷R7@鲒u U}sPa4l Q*zF]*MvjE-+uEqҿu~X }Žδe|7&.=6,)WL(I- 6"I聝Pn#3,_g+6_މrKwIA8%d7iy&τ:K\jsha5bƥT7"V%2L^W(rZ¼0}#d֠fބ%^ź1RgiDvk!?ɸFqdM!. N˖I/S00++sE&nmFRE%8b@ghˠ !9(ƆZu3(ߢ|e*6\R|e};n"|6\X.9vjINԲzW}Z~5N\s@{6nigbcX%ſO]0!@UTʸ(R[َmZHEIy^ߝA;s+9EĀssuczդ!gb4 ZPT dXDkbCmJ vv`x 5Lͺz,X塃~3n}g-GxebyY),NۖBLY' p0pZqmK]x3]v;U]A'*^L`N7յ ^EGX8^0CyO+}vؙgF!,#5s*b/9WjՍ#xl#|xߌgh,yƜ1#AKo,( ,$<xWy5iHoM2ѼOkx$´2&h%$X@= %wrM* H1p{PčQS2Jiucы$1DY"^n$x+n!C0',MH/+7 9YS[{'?<8 x 0d.Ņ@)b2R~`ʃ%-٠^S%tR$8`'qw^2 x<~<0{daWdv]/G{dpPdD># l66lg"@bƀ(J_ˣiN==VS9Oc8٬ܳTys%hUOV vP:}SԆE՗,@g3ܮ\w,ryoY}V=EN'9&gEYɽ[WI6!SY0dDXN]_ $&kj4vˠuτ5q?=(cϞc (Y4ԤW$>)Ӓ0R9=jvBwX|o&Q2.w45DzEiqdž TG#NZOA8{>8Fք:v<AO|5'^KlƖO^{1nmwaMO6Clc _ ?-~)h{!dliC QD KLHdxpuW4q(a6|esN-$ Ks=gDx=~G8'4{dK8D3x~TZCP2">y5QG4vpll8$$zV.tɲd Vy q&F֪kBUќ$]"l[gu?1 ։L.}ljK'R^b%tL]PCϵ?Mވ9#rejЅ} |mXA<3|kI]w _"UnV07fcT|6ۦ)i%ۇ_,mLŶCUtMQ}.ڴ)BK"ҌڳIiH2MZM?C{*ĐFNBrf2'}gr~}>Ly N2a ⨛TfͪH{{Bw.d3*05z'*O1NuR6LN٢;[3"A/ JRUuXFXDm*_{ؚJReih"Mj;C([*,!S?]Q0iĉZ,@2?i !Vq6 Hm7X7AD-7[JSĐcU_rhfV_,rUxs.{ːnfxu2Ҿn#m>˄(?D]X"yh k>[ rR ƢDF9 91ScǸpt- ~^{pE:,&)܉sX;LO)č,5lIЊm#N.;i͋]k~ \@>@og ro3xWQ$%SdƹNAQ>(P6늡%ˋò;O>@F"8@øo|\"P&0+>缫 q ZnNS8J3-H6oit>`B=ޠbirq¾T#吴ȸEs Yi3,pg{°(oʳ(㗒!09j#yt^̏J2=[!lLxa8Ӑn$ _u_r\ [O!1e|?#@]3)oHf|CKۺqA' '5#aO%l`һ2U-%0/#a(f@;R"Թث,4SM5c2s\ 彦 V cOikdihg%dar^D33,t~}[%%M\03W@W@]iY]y'.$d`o/|;}}~ a6=&x#n7{v|2McFR#-FaƗ%MÍhTǠ@߲Rj ;tF@;cmU&+Eh7PfRM<+YB?jqVCWߙ}<:v{h2Ba2[)Iuu02]C)SL4 <_08Vj+22EZTXJ -m\r(}(E;H\E"EW,/΢3f0l&0 lM޺(")̳|2 _<͍pjB^D̔uMbhoc]l%a 2D}Y9pl S66PL6e&¨oyErvM}׳Ԭ."j& lSt?yc=.>]qh _]!=Dȉ;%a.CCs(KG^"Pwt}4E dK~H=&O" I|72>c }"Wh!H+H0%D*㕼Abp:1'G F,p?qL[y$m9%y~಴q|Y$:Z|D[%l #8\~~ $GC#9xX:vh CCaI0Bbon+ ӱIKzMvgZzXEO.Fף]VuuHpK';$3mK@,s"y*hw&c9]v 2K[oqJxҴoi[)+Bg肓؃5(B@sYЏfYv$KTTG(?-R~?:9[ ۹zs'B%"10L,WѴN*>_ Ld$ӓR3T7[f$';2&Hғ3BZ##c24103040p0$徵xWmdjh"jf=70;70<1a$103XYr10 Fbjd3 b`nizQ r~z\ݑq$l Čb|2ZֈDAFE~rFz~Jjo! a ,&@ nQB7(/~'Vl'f!?aN~u~RI~fzVzFq~UFzRrVjMTC -8Ad%hX\eM L t?#_QcgG1!$zU/'EI* |A Coh$Ӝf)C">NJCz$?8?)'?9#GG1#9;= 12A^|7S -)2r`t HPT{;^x)\ߺ\A?# _ -_項{;|3|^WE$x:CsK;szٿ2U25t47aSTyoO '#oj2r+}$ʋ,Yjiiڦ )Yip)M0F&'A R±Rief MV[rfs2ݗ d{ GIѿ lj?1Q@L1?PKÏ2-X0KZuT M! bIw2d6%{9YJ~hܝ?$'= #3_ _t EN]#KK&'#=)3IE `K;so-C@`?D*T>{w B${fXSc|D'H{C5%P$(-)Os/lF V(^:lV޿^A9 t;fOͨ9)헙q2,e6TWЬ^ 8\u.76˒>)!%ڼ:<ӷZ7 IT旷.u%}St~S_$$cGN<<6UlMXZNR"pTfPg8Jaqi$jj$@ߥ)7JLԐ3qpeG͌ <*E4rى[a-^'%FFzD  q]#=|q}]2y4l3bY^fƏc% F6*G5yc'TZW O w]yl`*V} _B{/Ft gJ/~?:(W DuUJ }D m@`H0U~CfX]:'bz#l^mҍ0 ۉulo__'oh|ay7#|BBBYz$A(4>D{-EP|OP |0Ż̠ Α2L<;z%IHSޗ#0fFc3::B'9hf\H\morǖ%y\чydRlktę&3|?<q;MIa>XɏNjm]ł1ǝҔ@`5B\[y}WR]K4Ą͋i?LϻTl/ByArS7^<`R/ndiw5;]8"' ۵E?Ho(4PAUMg4ޑ8E+ud}I2aFrK! Ǣ4]OVjT[*3aD#ٴ(]= {4硆!&@#uӣό;ar+T[I.6PY8yלb A^Al/ Z7tʂvٞ902 =Y;ѿAÃl4#UtzcV 7j.O{5a$I;w ./_="g"T@᧱"F@NTN"|fHDjedPIoņO7nELcr b+-0Wx詻ka mV~ȞT^`[_\&H3ZԺpd kEy Jy֨+W%2kiޝ͆?j yerh4X_$ݢXS֟/IޑSaCňcG@ж+#*K-A!p腺mnc"?3s_d&<~n ާ]WQVwԹ;=@g0\;ƀUڳ02JT4=3]5\; ,x[b-M,X¼I&;49cd0`[jGA#&r0oaG0LlL]?%4QZoߨ\4>m^3aضm۶m۶'Ķm۶m$3I&={ٳ#B. n|fQ&`O oHuP~߄- Y/] vȌ!7JC3+Q;uE&n[BkQDHg}X}#/ QiArBow@hQzߡvL\q4 c9{Db\4,(s|Ka){UPI(';]} TrrOI/p/rg5#V(Dn?BόCso X)bK̤ܕ\ + U@E?[3݁^QJ~~`&MSȎZtRDŽQ3=<.wd1İ`wP#c۩9.wڏ9$GH uЮE* Öb|ci* jM; {',8N83S xNǍgСEGﺊ??:Uy~I7iAMKme[: s{LM:u{wCDtf38' }؀,M xP?:6tI׿c>2=gb˓Ġдȗ~G.XCl M!J!Aj|Wn\[xGJ+z/w_'q&K3* 㠗w_BX!E9G`:k2F/)?XJ8#`)~'Jб QP2s2#BS#_Yvq꾤_bWW\11PgM h3RUADFV1C"nÕvMY'Na `6l$@#im4kقF'a=IG 4)/R)mi;' 7'65fu5x^dY _}_?SL[eb@ttq7ʊC<[\<тaǟuuӧK>R9"q %c̙g-E.}V␰GqFeG [8!qnM^V055XOUsWX8nΉY2L{`66d RVt8>ctJg-+,kU= 6wpGsB ›Sx@;pWɔ7~IX:$NpHZޮ\ZѭF-&Luͅy\J[JX(芛[iM)I[ܒS 'y}EhO9) _~3EO"cғ>~ܡ! ()>8u+?3:wد c=bLhMvF\YEB~S2^T$c> ClE/EBs09(m/h?n?l?mp}?g A#^ y$kDk} 1_viRDP}uTua_~9rE〉U}-cl[?d h޵"#qR<r>뀅 ;=0pcQ_K3ߺ `ze Z΁?IaK/UTuqzIAkg8Wa## t2?o]FrS93E!DPq"q iGX5O0}B+jFand~+3]@ `e(5Jelga *`ږb,)t81DKgTK50r7w6R e„/X< ƣ8YWEvK=ؖkn9 Gl+9˶`%0E_| HEFɺ~|7r|G%&O"qlO\F1'A(:ck5MQHl74P1=fM3;= ד cnat)x-4!6C#g=8a/mֿ9گ\*;3*CEqDӿE@Y,*BoˇP60?0u0r9BFd~@0_r|2s:v.PؖNHLr"Y8~H550k8+юqN"MQq[ j2fBqDACuڶCɷ+]0m'Ss7W7O' ¯e7R'? 7\+N|OώԭYki}hJ+{@fȊ+kܹ8s8=ǂt*FF7弑;Ⱦ!YVr\ LV58_5rIA >G|2-R^2K]=hNStT90UYtek<(73?Pq4v`Ș աCd3kOjw+{ȒPxG2_k֯kc L@7nM&DC8J?o!.^l  e.aj- ! C%"P%,qsͺyB>pwl%Ȋl1$%Bld)ew fVLW~ 3*v%՝e6= G)ÔRϻzb O e S*v$l#'d |RNׁ\QXټ7m8t54Cv:h)qPKV$a;(Pu2L(| 6C}uivO-*9 ɊHȨOkYJN"Qvl޽HúaO!D/IxwҘ^?Tz1upsGE^ X7Qg-e ; "`]0&0/jJ n ӣ9 |Mz_ &t!6~xdc~"iz`E^hz&QXƯuܥTj#^.Ou %#L&O㝘qU%r&R'^b]OZQbހPs)`P" SW:"v&!j~ Baw?/K:i0Tf[fMHߪǓd0&+ Q ^5%fjʏY3֟O(/$Z<'?#\"U0?҂kL4O RU ĉh<~)ahY}[3z%#l .!e 25n͊} q-2 iBǛ>Õt'nW$?BPR'q`@$ 3>DbDM(M MG:-Ec&땓JD  s2d6^_=蟞qQhj۟1AL-#<߸Pτ':gnH.#Z$ <(I"

zxH0"k&nh x0l?A.="e(\ _Jy^cQk?S\#A%tH-xȴ`kA1eՠ-j$ I>{}CЎס#y?,;&JR'>[F>d b/Ō99>z?YNoL3^[K3~z>EΙ|C?'{C7L~U}{Bym)z*ri[@Vz r<[ثW1UL!WA j9i-ycy>BsM{bPˤZL2<沞oj-fTde8q8Bc$`;"Bh7  d[< ⇈jXƿ'?d h=ok8HY㚎`&jEA 3 ܊ h`o|A h͓~f`~i&A9SnR۫}CZWoT]'~m:jh^aօIzkq|Nw |O Y}F٬^eMb?@thV*D옽`rrN$ʯyOmXm$"0L'iBм]9મSАͯmwѲ--|@_ 8cC)DϢ1Zj@Y򏺷Tr"Vgtق3/?+\[BK B@!DC`cdUHJ#pH~MAr61}NgX $9V~IGPp VK޲C S0Hy_xhq}apA0;X-g.%w1Wu VA6%HKIC}%2 2xO Iw#->6S,)EBm3#a 匩AFxtu5S}d0^5\վY,X5@ J}dSH>c+5m?M4lѧD&ߨQ59E fsceŦQEwjiCtSl?sjȯ0YК{!!DGpv Q[kp%ъ,uG@t-"fwI͒kP>pdL,~91扬)B~@BSu7+)faxAGN)#EOKh ~O}#e a- Fy gC|;'y0K g%%QᏎ:?O$I0']~#_!҅PK<:cK}).y *20 '-z1<%dKtK3a )xT]WΟ cya;N[;^WBL\.10:ԵT0eqҼг39uNZ2JHH`d`xTgOp^n>f~5 RRmvC0ƣ/L.Pvt"YI/ }0r\Ly9q: jTK겯M"Hkr9Ãx"҈p/3%28K:wڅROq#lIss3޼}`X:]Ѳ}$7HUl)3;CϭEqE75"x!JXv,L!okh0jAy[޻uR(|'V?2d,DBC$nW<G [mEv~dli7J,=Ҫ;9 B> .r%tG~KDQQ@\J+ }ʤW]UvT x2Pd1>M;1'&0F#2/jFEx[_HdY fa1- pĺIF#fi-{˾9emMRц4(͹Jgxnb6E(~3mJsNYhc#%gEqR^`` "92Pm~K4Fv*t@꽄5k2-^c/ }IIĉb2YUthһȐЫne3cMeyBo ?i (A4Ⱥ?l#ݤK榵q C V:댁ʇpWP`7{ AVFHYuˊ}F! =h1BGZ )2h5Y^,yi90lUXʩXh'ͥ STj,|V**tQ+j:-u1Dډ{xm5{i֯+-:֚䩫8C=,!>^b+o%(-Úe 87"yH\D2?w';IA ީerlGu1qr0 SMpQ|+) &'2;2Bq P0#,63uܝ %NPCüikDXN_5L%p~ '(jHs>G"vnK(F=<4yX}$Cyx~{P cm'+?=0 B})0鑔"}ouYA\l1f͆➄ 2hs }*4Vϕ mρ *<"AՃϛl3}pyWø~[6sNȭwfiI"_[gXAy?.0aN8!?#YRgw~3o[]=:7?wgܷOo<[g1S&4~2y~+;djp"Q 5aX*XH1gAkق{7؈X@䇷r\:|%'ζ^v&}6[Af4vA24Į+Ȱ0 Ymɚm.agrx$Wji}YK-%} iSG]*검Y%T_#6'd [!b-&| ?e*4sJ+y7͚gxe9D];wƾ"GT$G^bR[^CHJ29!(.t)BUd KA qi(sUBv2M/dOIbyuZlM!n2c}j/qQ6(74[&mr1)>(y2)4J4b4=! \  % |[^2:F ELC1?1$1!324G;\FQp6UtoJ2@"$?HSdt2b$W$hĵC$FȝH45 4 T>d:=\@c¨\TXTM֥4e"P~ȬzH(1%r(|vw Etǟ]^&ك&> ȏf<f>$rs0q)ɞ }֣sM>Tu+A4F\lB^|B4o^?Ha"A6-XB9GH[:mu#Miϵ a 29h4!u:eVYah"f5`na:.Xnd>q@ Qnj0F!-߬"P)zn0HBV%.jplMrrwamĔ` LåV!(4Px5"ȕ4+xEߦn\AfJ~?%W nn!,Ug+e|_J3f.^#?nZY{լ:tÛh3e~|*fӜea)n=)OmR7 q;,a>|xȰ1ꋙ2ecHrYJ# %\h=^Ӽ%ܯVA%ۘ;f"8bPc&? s'0ʥ!,U}ó.'?0D3ܝw""[#5Gj5ր}Q@8MS${&J1JE%x}pàdҼˡdKFuLeG.7-ɀ.;%D)EiC-UJ%[[* 4X:{Fԋ`j2,`R<ע,8CJ᫢H}<]K3pCqH\Y'y͹rZn?}5@ĩ?u>RE)GoHG#u# IMH$4 } gX߉cCce򚙛8Q (w[ԽaNkC+a8@Dz9])zX>v`+!+>hߓ#wWdhYeެ6}|z0KA1s eu)l"CnpH1&&ecG6{㤿v2GC~5RhmCy i,jBs;.[ȉD%iP&+WˋH,(I"M @Xxr1*# ǯIsRcK:}zGJ$l=?Emդ6uV2uwa^)顲w2M b_Gd'?FOP&OFnB \Ѷլ6C( ,vћ_힤f='M8vOw^o8Osooky?HQ0@^]u;]Q`&;Yj^A|4]xb'd}FA}̓r/y6氞@͟GlGWJG)ȧ=(]Օb\/)g=*>Q-轫(;(g&P^'P=sO^W!s͛D ?2 ?s)_RXT'-؀U~CwAWXTXhzCm#@k4޸Mt>G>[~9H{x9;Ht֔vb{E.2"u&/UٓXbXn0kV21'laĒRmȊ d!pJL 'b4Urzd:lP4K`E 'CϵTUz]>cd#j0U+l@|:S^|l8+U7e۲lOZ3PQQxYdI`:Hf(<^N#l4$EBڳd|.|uؒf*&M+y6T\6;O'Քf8Diak(mGmEt}-3>4.ie2e!?I:9f+Rz=s"B;|'n:BX ߆]x3]CYfx}< 5zY=g9eX 桙ڬp7qF1%`=L -rdC#{v\q9 {6ŷbhql OZ==rX%I<(^TAEQ%!3?Q¨a `RBIDAU"DEUKʂ"\PdKDXLYuLQe DKقQlUT$QKA7?pk鐛O+QlEihY ҮJ[Miӱ"$*N/)fȩ7Y5I]r z, aCiP`V6 beW[)H:ߨ)EuiσY-Xdޣw: m4Q[F 0q÷RvCG>nTknE),鴕(hTRf̻u()d4w[sۑs*oٮLi0MϷxD ߼iOU_:*81*.uOX/z2]c5:'9Ѧ mBH9i* E`p_4IeԞNhƨ~#`ʮ@ Sr[Csv)HJ[TKEbUҺ ˄ig8XKV#u~owq"y,hM+iPHMk#5*+UGL̖IV {v2'9nMsӗar&<}8YƵ dϟ-} HRn4H;KfF>[t)ԋu/:]>CX3ZOGs/fz׎xz{7iiEw Ѕɣ⒘?xK#ܜ]"xn.U9op̐S?r-L*ViU5xcY+xu4a/~{ߦ6#l6nI's:h.TZ֨VVZzCx-?nZXgѐrF X"}p|9wxHI{QIlD|ZRw5+.+hhRj>M Š͝8PuX.RNChJ\>9f ==8CXiba jJI9OuGKNΚ3;!PɊX/8pР=@Q~lQ3Lb` K#;x4R11  b-=-FJlAWVI}{Q}FeѹXlJV'(w€A ~jWGMA.-zkX @jw4Dȟ՘=x6f4?גv(tw}2#CYԷźX$қHc%<kz#h\Bq#1bSrxĜ=ŴDtqQ_[uN#5-fM8PrB~XgՊ 67f 5ww m 6ȉ=% gZF)u=g8 Q+QG#fʁ ְy5(2{P@w;KraL&a1_3__k4/\0 5lW JSN'(o-Mz 藔 BҖ^̝ؽMˢS:'" p_m(@r B=۾f;36z8B؀6RaDdBYƑ|F{O%Vઌ(͛ؠ`冘!"fB՛X xC_kD bޢnͳTl,Yw9JP-08_M K5=j,r`$ڬiY sV4vV[,#k;>vHNI)[Zwi#;F)o@B;Y=UMhۦez^,La)G^QH2y! tdR<{#0w-<:Z;FHnJ5F!R ܋GnJBo#az|IC_+)efK=z]RPiЁ!l. P`i,22V?)#%1C 79~ d_7)0& cY_4`Ա O o0Y.Vj]"" W(9zj$$O JHq:to uR0t,_$]˙&VT`iۖnCLHT浲8x9 Q봖iU 41>~BedjOhqc$H/=>0mo3HA&9&3{wuOjuٽQ@Ap" Du0^g")"0N;EDH-BD2!ԗ6xe2ixhz{ԍj?1BC٫vͳ!-|bwrBt#t#' 6H\kaP'BbqG{Yhx2>OؑhiYEj$9#eƞ IVQKd(s"/8Vg q?NJ͸̊m6y=9[/-#%'xbC8n6$li1d"IT؟/t DN[z:DaGԨ+Y&qȂ_G ń&GR*F?TR)q)j| KϏP鼪'1=OX2x<ˏ/ k8CsƤ6~'ZW]뒦3 TȭGM _W [}bĻ|a^ CaDŽQ yK!rW2cˍxɍ\i)K݊q9H ~]%긋sQfoVƙ^F].# M{>;{waBXsAC2.Thi(9# Wy,8sѦ-*S9/8B+QVFhDLF&z$s9V͖6`ʁS*!':OF1JR3+M)įn %p7>ԅSbLj\;r+Yxh3jGy Zª"RJ MTpæXT!ݫڄ )X\^qNB\/^&I9FP,MqMS/XXCɫbb5.mõ(6Ǿ8^mCSd`߄t{=*+l^rfPKg]QsZȷ GFz[ڸrs!6KX2rkZ|RVHc0Z+`2Owfk S``H^ F&$整 5̯CHblhhLaϺs4+"* 粬QFA#.#捉dճJR`;\bjbPA^9HVtA\Eq4[2^넓s g >* պ02%W:pDj W-EcpmbbF*9jhN*_ s'ߍ0hlFT*pX64;W|%a,jʝ | u|ǫ泔wggf;' %۵RY {Ǝ/tſ,9caPa¯Ij~PsPl(\F5kg.#e݂L}!7/4ztnkMeקQgj(4nt"ۜ-F7)yq;RU*NX_!zX`.`LAlLOW կ*ʟnfv>Ta'&6LH-6rvV%aV!>`ʛ!oM6hV\n 5x?(2>Ks^ cZWM=QA˨~(+cBSՓ+͔7&ߚ y oÝ3cỵ$ AcUdqfvO23\EhdB&~D a#$x7 $4Psa׸o0I =m2{HdLT4)7{}$E:wӜ^Z~N2Su'Ym\֗淩k`HⳚ31;#v& }oyeg]3;n9rD1 FJ'JJ!`Ɨ 1/,/\o +1ΕtnP®)h E6z%b^$XڕMD$)~0> $I)δx4E4Gr.V`+\-pU4]p!"! 0AZ5 & l4 ~!@=GT+C/PB߃~I嬈⦾ 뚹cvp h N܁> 1 %jLڰے),~_a;"v ď8)D ᤂ@#þ4 ) $݅mgp>e J sn0 73ӝ^o܀M}eLXXNm60TbCd[ȕsCVB0TxC 56躵>} MuWl:Tz3RXjآz<6 JKʤ^َl`mt!p>'R%zZ|j R%ld jUٻEae6xq\s2Ϙޮuptr>%&v|r) Mr7 6 ЍCsX6n;((v1.'71R3ԏʠ1n<'أLM!q221E">J7w! >frVi KJpoE6Pl A49 3Ȓd&1gC f=dEu ӊmLE O<5:A'wE's)9rngIyc3^Nc:NPd <X4u&-i͏ ~eA^ kM,:!QUԃ6U$ZB )d/(P$[yEEW?Y,i mtه+V JjJaJ^9S$[,ٳ#ILKV&'qH9MH_(в[@YAœ47)z"Q{k&]r/,M1hKt3hI,T ťׇ1T?r#0<MQl^^$YUZb)-6:]R̛(7Pɒ]ÞtOFUGD-Un­Ehid$&T2)_i0{bNֱ+ڪ|&#)o1cp\bW.B^SU|Ͳy&t19tIcK9P^]NJK =yAM!]eTHD:׊\T&٨ AA-;i m.'Ϯ 44~f1/MAM`Ah^{wxlR! ݠQ!Xi<K7lFC+Ғ{)=ŠvcFm̖eءa2” ݈n'Y^y2}ZڊEJ1?,}<[H d+x nG`B6QH{"0qՋ<҄182.XWkc}9[UpU~-L(Gqo,1 JrjKfX9Uu ;Z˾\+4 ?t@#4mP*cjL&rTY M`{ʕfg uMu'u b aJe*,i9n3Ucds4 s#qGTv-j:kG]nhoeʥ?L3+Z51xɤg$3̟޲\ʗ>/Zš\qᔺp,*:j8HD1cTcZy >`a% `%) 䩄sv0=(MI3{~Iqquno>WJUï 6 ȈK-͖d* L&u[Bf֟?o_`òNHJ$Y(;ats὆F7ҍi1 mXA-6]t }@l,cΕeGΌPHb1|V.DB%\xxB4?$xNu)Rqb0E!3EWrr S5=8_Qa$`UTX ,?q- YAiWˇ\];'D2,SvZ2+:" gБ|_.dWgd;XNK:<컼Hl$ۃ6}X g4Z-jwMjR= *ۥ*8aG:~ݟ!?]#TQނR2M5 }+Z:ŮNr>>J.ro]]ّ 2U@3J{n%OrH"!k|ԬR+klفv{= v噆c?dK}B$KK8b0CdAFq TWXjt=xt>zp"hg@È֓"hZ{'@V~>3dV^MJeo^;0RK_Z _>m=c Zyzc$M bԗM~Fw rGKRy"TzT䟩E7 ؿSP,O0vM*0q&fS6WR <}~Zl3ͻmI~0RZs>7Hk xɞoƾc= `=%°S#DеFU?Ne%ˆoF:M.@^:~.f]Iy<(s> 7m75hv#{36m7qǞTFS2:_4_ 2MoJx>2y1J pTMc  ,`弶$ žT~ud G~Nw/g(mlWFwr 7 $&Dx/ϤyNCw|.(&\6AU \Rи"5=r;zv=YL>ybۼ.pnDX1˷|A -IG C"w_USCZlVH-k;+t/!8E<+ga{;.v&6F?j> ޲TNߺBD(H/!W!)7KKO:PTY9,>`9B ;᥁݃Ĕ$ {8A-ISBȱ/(0K'{c̢q2IJ*H\) ͕Շp.b?[üA.v~{9 Rդ囌wQ*#Cٳ„٬ɸρ%7x4h:qt%f{8*5 rNj(w*CG9ecLΊ*I(f ; Ï9fiiw|(^#[vW{o\ +uu Ietۦ78BfD܁B I= G?nN,e!rwʈ"smXe"n,wZ^UbDBQdnb)/.Znu3ʂ5>Fs6`E4]lFt Oz!ҘR^d kXN5֫;=4,&8;b uE\##k>K&Fnv9kAG,Q/| D;}rEcDucѩ9.i}&~!F}>Pocy|%"bbYFU;"/bioLӇYeGxTSheHZvP((u)}}p}ˀfq mn{SoRQte},J,H$h$[t;B}_֠7f;]Ok!u!dl,B| &kp%5*(¸_*l+3}~_z%*pDfqŠJ=_&AఆYQv&{Y1ԕ%AW;,L2x8[$UjZc~: c!c$C.YC1ZBڍp4͝&M0^&\_i?XSʮN.+b ](ԏdH<4:4a4VKӒu]77p;A,VƻX&iJ[nfvn_hb PYď AIXH-,$( MF2a 5,=K 5Zi͊KħqCZpGqfST9 h~X׭Ӹ k5.]*L јuP\f'!͙ "gF}W<NXWЁK2lm5 sC6S2ꖶ5$Lqm7 MZͽH4.֧t=B݃,)nPsee]|RŋW̉EU[˛$;k|(z;(Ն;"IR6T ({^%~BH]V!'0*`~#>yz d ¢teIxPh[2'$3Ӭh/6Vd.pjS@Ťz&;:?\=yOL L\K?'}0'!UCR6Wˈi_ ZI%Hٓ_:φtq3Q?j\e q>jq>f p@^6꭪R4 ƻt7φ$<-CS͚: xی$l[|O[<;NMk{-K{aMxVS-S.IקqF+9v}ôZO%-8(;*Ln 11x=7k0<,\0?UY~AKCs;{gK;ys%X #- KA (_L4"@J ^[Sq8sYI`ϧHlWLϘK;d44';O?|zo;?>nR :"QƱg52$EaR9{I{&kQeFP{:ɺ(;tfоwyۍ?Ü\j.GO굢!{ Y8,BB!ÈE9YOMroq{QhBcܜGc252rT/ijtJ61d\KXrQa$Q"bm%JB@|)BΤzq!]+zjed\A1Ip5(1%aX y5q.zgwr&cIOO/E%ΌŐ;xƓ{K& Tl(4+~;t1ǰϻw)v,x͟MICx[̯! ]H1.Y6Q5'C|`NIMeR0N*?'$//Ǯ;ߘHQ>BS#U2l J rHo,_F#MyAoֳg{^gcNhkɔ0X, yQ!0M`Ndfp60<4fY憋 |J8AQE̫[hͪ $d٧%$q3:0~ ͠FEH,;Wn{+;F4j; YMë)k]Eţ6qQĞ.3턭Xrjܚ =U `y[Ag`h6<iuc8+u6 pU QJC/d[JQ H!S#-Rur{rdJ܋i I\#Iak,j%DOq,ի@DB[ȝdw/dso:TaP&9uf\io/+0hjaaY. xGu~ܳs󝥺ȄXPn0 1MKߴ:)8e',n<-J▋9*4tHE+ufPۗ 0qfZOU_Qk6-8Ih!ބς[,#8W,ct0u75Ud@*ο..|dBx ۜGe1-XAR?x-t?c;)U C:Rb0hiyH&w9^ԌLY4"Q:o jQ q26Ye96b4y[]H)C*f_S_%1h4.S5$H:7=36h:18tjd5nKpG.GIwnXW*Sv'(0wĢZa _R*Ţg%~R``zqIZZJX[zkXBs@`CzQA.츤,fA?g AQLMF HAƌ:SP`KKNgW俛sBҷhUCPq\sk=X:[XF@JOMn>ήHc11,xL&O%”<1L8.Yx ¯\B R_9[WɖeH-ɵTNi]`+jp62 Iv{`#0Ax\> ՗w˿ߩS?w KFmA4 姤fŤ wS`b揍*n"a7&&FF`bc3_'%F ~p e ccdoCl5Z[N10Y #i3&_HOkfn`hN_&k0J' )YN2KuDK!_ߢ<}?u{KigVU>sRO̲\cQPpͻ5,K>3\\p RK垦s/p̙9P=y;;Μ V_T1UwL?;]P|>;^^RAi.uN*(ڽܡMXEy,?woEqf>fY-HjBя[ח;hky3h8f"IƆDE&%ޛU /j>XSv ekBYBcUL6`ˮŲ,y 1HᵼNGc2eJѧ~7v^JEY m*(ıJw*f0+L__Ҧ"oG[✪)?TJX)(|8[,{ZU^ QnzU`a{Ikpƽ/ nDc?nP?a9.rVp0HX?Varb~RjK"1ӒB 9]1 Ep8Cײ}%yXR6w "XZܼǗ'Ѱz) y[5.$\iWNe1JZrU?qy`1wþl(Nzqk"JvSK&H]P)HS!نn|@yl7:e7%xyCA"sfכIezK#6++(X3X͋N )6E 1'X=Hm;s5( ^xj"e ԟEVXI_Hȿ/KmLS~b"M뀑\D,~I慈!]$'+$يb=b/`n 5Q,o ?~$."pQb9$Ӛ`4oOo7@}^8sIҊ>6wCC3%/F d3fq[˃ѠKZC3o 7 :i *g:b!uNj|5o =Ó$11lJbWSs/4Ξ1R,x#c+뾧}yO P]"ZY.-sQsR#$bNAY"0%}+! $e g9fq8LhNݑ3#͘tWsEx̰= >M&- ;RohH3f^jcaΞ2A@;~AhK~5!ȓT\:#7uFAWadb&#_֎Zk6O"/?wzaҶ[j+M^Wfrb݂ZS jF5XԚ3c ??!A3O|?zI< V bV+@-G6fh>HVy5Z/jOjQ_Чهg p^& ݣwA|VhNVG6;{=dBHzj7|`g(} _ IB zxdvqKAt2Ýls7Q0a|7-dsW`2!%4+Qk0p͏|5R-*O[V'ӟA0z tP4ҡ]~|u,eJ)4l7!lLW(Ffj)PƬ6-BCU $KAQv ǟC#U52(ZeS@ zkh97ě ٮ*W~s R5nxuRx*&1_{crd'2&mdȆY0 sER/ߎ{߃\DGoxxIE)4qw*&ʋ/CYxsNd"\eEIv7HCdQ{^no;_R~/rw_.0+FmڽBczR$Z=N`=6_"B^ i=oVV$;%$}yܒPѿ5dTk"4c?6>Y^=L y~>`1.};κ'iL&UީYV@{OTE1r9lvAw`QRzN[uN`pujoGkGC$1I+qMēOHPpNqIN֐xIyС1tkх{VI:s]LG7:ȗXȋqnXy2'Z70쑳X>Kot}"HJK[9]J`I*xBo~ƤdTK:=!r UP`tƍ7no +&i9yI B`K;FAP炼DF:¨F~ꃀו.Ey!C-:4pe:¬0>(c{I]},ns5=ܛ Ml'*B7y(weR*WOobC ]R}fY$F  Dgkr& grd;ltH jaOZcg~=\w݂JT'_{TH]Ru8?(ێɁIAXT/fOK=ʶQP蠇Jl^ua&5:U˰rgܾX=rƓZPwD zp &e5Q%n(ϴí F!Ha éR(Qn¬o},[]K7A%$Nh9Ԛj,OR+x)*ѱRGAv Ie]aZ<]wҿe=hkB { ڢ]t$HlAVmuR)ާn=]WnG M|:+ ɛu\MI.2}d=_k^{lUDןoVh_Rȴ&n,40E5rgۦB'%@ R Ս7@ U˃DBE媏Qheu3BN桠f[?Ϲ*D PU1xaVS`g8nwD^/3L>ߠzHkk燁rnWENDF8VӍknuVBGa|t1]Ԣ#.3,r?m~<{?R<=/ӒoA|!F?YmEcmM"E)2҂9g qTfWdci@rC 2HN{s}}׶'(] rʣpSJ"hc>9 NrH!WQz~ic #3B*yCd-EIO0Qz>iI}7 iӣԑ/Fhy:s!~h]I*lt*>'rJ͘KMA߲Ee+zg_{HO%*ь8(kMHMHp[ 4-- @Pa`kuqӡxCxM u_u?o3˹ĿmIF:Lݬ8p.}R(s:ɀd4nhHB.)x;P`^\>VIXzg'zHHŖW~>*<>^D63T;1!59sqt@3tQV9d.j5GIw:EǙ0sXg|s&e  ~'<c Խ^;0UtQdE@Hbmt(۝ǀUF~}tDbnߓK):~ ɹӥ\U#3%ْ@ [^?ǹ.t: ){^99='5`SkTGޣ6b3$9}p&,K )1\(&P?wVs.Bt$` #!%g1dXd-l)`pM1n8 |cVe]kGž`EZhuCB LmU::e,bxf(]uW-y-c~_st3M 9䋖@&! E(&`j\Jp#K EշZ1vI\&%B9[J54_HyzrzW+XH6k Z& Vy,t Ҏ1]XI.V` eyBy>x{]-g.&B t3ElVLGMk٪4/kl2 FXxQ+Q 0vqS5ϗ%PUc.:i u#:*iJi )9&|=y=/=<IɎ*h4{ْ_>*H :U[YIwQB 7g>("xLZT(aDe\V:m/r, $+]#{oRN\ל$QV7ȔϦ^(liFX}^\KzU#gmc fޞfu ̛RYauT#`r0dB;Sw0Tri!x5Do{ӝ,Ϯn]FeE˛Kl%Ce@Na$ECDž Ʋʵ/rggYoJ=yaٿAbOPexuhX;,ã{嬆+S!`miF+)`_cswд 2_ͅT1GzUj(ڬg')E}]b6=X`i(ZJ63Ӑũ0F%Գۈm9[#gfa 14#:Hrgq,X|qŦS6ؓG*٠,`A@>,vXD"R~`k!5#K9Hۘ޶%y{l٦ {6 aq"lf. @@Y]/h1Jzp|EW4#M4\If\8U4af; Ns^ :ѓpou@Wwa| onyUy`29TWāk"jnDve|b% 788;/O]B"H(JcYb EL2d2fMiZ%EmZUARPK+"?[{f&{{oSF?YLg>v1R`D:mR؊-1f|ǃmlK_[|mF=5ޜ1RdM4|q(^#*7zg)2=( j@}\l@Shw%H,T\q~JѥP[)R[2ddnaSh<7gİ`Q{5#5Dqcu[r+Mĸe;Dñ|S| "o] xn3X%/n'6 4[/nX>0G/_vQo\mm#tLֽXlY)n>n  W\3{[| yצJ]4BV5r@WBoD5.5ӡ"Nܸ:lp j9:wD3Q2D817`*[S].@`GF`ř!D5+1Ai0K:_9aZAG0hF_gXEx- BJ}r<MF;ybsJ]$_hwĸfS]M`˧ɯJ-$u}`~/|Y=X4OZ@y-}73hRFejST$݈G])O 5 VƮQzlNo)hwMj^|ڔŻ)]8=iRRٻOq] |j2Q- гc Y"g~C;zn05BQB]Kʤ6 MտQGurU>2|Onޅs([zI9GF%6KhyLPOSr ?dkl-mD9$^yRzq y9{3O솜~hdU{~2Aަ~.L:ָpmPl}l5F:tp0t^w+Ն6 ,b+^mgRQ&ıd B\[8q8W"h_Y;-~!:' '< ^&= NCS]jC5Ӆ,,z3~yC%_2B>«1 pDyJc[pb Fu5GF럤赺nCFHD 1OuD@1z!b%Qg$[/y'~Q AGf -Z_Ȩc.1{'EidȧUiSYRƮ ;0 2"=@`8Ti`Olf#kvpwu͒apHRLc MȆE;m6uXS'sy>C[\~yhhK${7ri*007ŵ=׸gE*5WQ%$!?+T`yQJm쐈7CIې(׀*2a8\1NH=Β!TnQ04!W靬b &$W, ELu`"|ܿ{o4+mMqw4X4u2@PDoT?VAvtɯBi)+旸!Z4۵S+i'd.IA|'=Ԕ9][!߱s:s>ڽR60+[[&ؘ eVY7ϲghX%d[܊VLX!otǡ+*hW%nJsVGeoNf gzCp2&#BO{A/lpi&ķz}WUDjW8Q$49,~^}{_z&'yqYAzX=ز-4Hَ9ۓV!@4\kgYՇ %@c.vM%jv='˨Cxj :+.e4D]t\p7Š㦌T Bk49:d8G74 5]5LWQ<ctcdzb, @*Jx4U(J8I(rv!KݔIq# c%}3SyX LNgúd/cRHr|8is+,bu@**0K*{gPrilQ=;*>8=)ARš%?kD^̓JQOZ66\.woި _cR:ET{=^  ut':._g$k }~R3a&>l0"FʅufQ゚jqഅObwqU%}^RM,5^ћ`2l[̕!|W۬ɧ'~S2',蛠uCB"0yӉ8,C(\TϛQkTEg#!'b7+1LjCQg.K/w !߁ߪ䨇pH'4`#zNjZ)4jtF$] #6 O8EWGN͑GF1_r L.NGsBz꧐ 1ԕsA6q/v?mP0_B[@kL(_5nуi=DeCN-"IB,.2QnÌ7,.Iv1;Y\䋾o7)d-vE{4,n7>7:y51uE;"I#˲2PSoInao:Һm#q"rDuKMUۄ4C 4-`% kŪӕu˃uwW(}ӄ"0$x2<䝸2'hxǩ9٘+ I$)\ ts3a-_sbcpX˖ֆ~}q櫽X/p2V0ky hm=_Ojz LJ0VHȻ+~OHLΘ"4 *11 .aMb[jA#F}(]б!Iv$"IA.Է+'$[ATTdC{E9=Y;ݞK^ZÅ?c9IEDo bem(ciȞhJ=uZ|lM+;7M!Ao<|bM,踤d=Lp' NH hgpBoKoz㲵JcސB]j!2GŁ]:~ֽ1 t@hQ W|`hҧoMK_ `<i7FU=/&IS+)P+Π1~+‹+hE"iuPHAGhM^,.2/n&\KPxAug;sBpY&ЌIۼG|+ol{*5z!5xUt_{Kx50`|Hw<ݎ1ao~Bb/SnZ@`H{{VZƽfGCZiL["P/=}/|m}ﴇ\X XjO2}v27a g2t:|E}22a\VosYe/|_#sjI^! 5* @}N;ߑ)neӅ{o1UN8| B'z)Zh{&.\iO E=c(*38wda㬞n -ZC+^iR `'4G,xg?(?ds=#yiF";2rzE2d* i}JʔWjrBK *ˆJM240ˡ0(Pϣ*_qS]a؃P mEOۗ}>%dapdDTzb  # ?U>췣O f%N@ Kyw$\߼\2 ʔ4PCQYB|i [WgI je(<:]98еT92Փ 9T9QCT8 =U8/T-d[$EVByWȣU:Ykr%YZjX|~Q#!2Vgd=YODM] KH!(BO p4#>y;rqGh/Bvfs~S`0o/HBV1O[o@ ݌zlKbmɸ)ǡ& ,D~( #[7H!vipk::1ز} wn9@̖fNeKR3u٪t. } 6LgzϏɀF(uzq C2zoMe)$pBB@$^b::ѝŜMvP.Ғ6}mW.vPX A8ʡJA!'MhWME˜ m8'GH4 91pߓ`".ȧYBx-6qBCʇ# T1x(K Dyk|s'%?ps*E 輷\~r7"/*ANqE$֋H4x{ʇ1}}k uTUY.w:weEc+cǞ(d^͛v0KU_ #-ƺhsQ Tj' J57w^bx2u=k1.c$b70UZ/LdӠT"p米FI ?[-KbL_s1 /GeMAWffēPӯD.AgHz&F5"\-OZ`G/| 삯cK"hۨl+ߚ}yH2L?^s_~7Sq𭏄"heN{`7B5`qlX/hk1w OOIΐOm̝O# õ*{RCdrz4~#9USflhFr`ʌgTef*$Rvnx#9H$FbcHs"&S׹)/ַɇ}ћ~|) ME LrO;dpA> CdhlK;{OɷSH~}MԡO^n .D %C {`/bldwͫugǐ_PDXC.sq?#[/o<7ҕ3ON>_6LIZ仞6]z=I!J뎋KYZQh<0bV*BF5 ( 5jK>Kb1Dog̝_p3sϜ92L|pI)sf}jcTUZ$\U@Mo Tn< gGKui88hJ{dY݄ lA 6uw (Acv_HcP( s@87&%YWT:嬹8BNTf/w-?;2-"P}V/t"Y_7͗e`UQ&+uzc 1˸Wק7)0)nix[ܫxOW#G1T tjwU'J<qGPj#% n\.oFOd@0krqJ\R^/ o>x-D+̰ŢLg0EL9h=\^d`r|\ZSnXp56SLSC ˍ-˖KH5Q %/7kg-{Be2ҷ-1ш@ ;`RGR0xG9]yMV7:aiyF= %,AOjTEVvѭ\Jldq`Sbe^|k."к*(铼,FB QAŞ7VQs!ȏ8&I?UbYGŇh]>=ɨ8En„]mqG\Fᗶ8]4 bD}8SnOq Jk$_S^SI P6,jWtBc`i|7^IJ*nO`m +65(*X^ - C&_"OVy4ʚ=ͦr#_ӒS =Q-a5l+k::-e+qX5<4On𠴫p\3F% ؗ{8?ݎ9ۉ,_ ivhhd\:,@;h; <"SQJNrշV"y8-m47';"Xy ( |Y3 >IMJABkJ948!QJ]]⚧QgP`tGSoM% _Ny<9m 7*eـнl=)Δ]Nߎ&ehE6#0سUk{AI)gDsҀ"hb#7e>0a OqrrUA2cڤوW%3#^ q )#J[3nԒ Q*>ة)3E)t{vmo'//s›FsT .IFDgq??IFoe9PYjf8e7PzH=DfZL'm}%2IUD[Zhv'r%;1zl*v"1Xv$jEEN !ne~Hs%%縷 'pvEkRl%D7aJZxC 8BENnq"J/%D s9Lπ;e`[tC-,X. -w9y+a]kw)ފΜmZ p]/R7莰c ".XxsN~*(FNhF:P#鯄,ޫX6GX=8MM G޽"}5*5kRks@kEǷpśTD#Tzt |RX2PiXNFj[Fg Bnf'qGE6ƀnl@`Pw& ߹)*uk6h$u,Tu>|nbRF0kJ|9ӼDةPL>H& 3Ͻۅ/el-R. b7L‰e%RR$|&1deɅ zGRd80I0>~X( jqlojHm+$J‘=H.΍lW^ m*'7i-3T=K(չX>uU#\I7 |#qS]~𗐄z{jfbQhQ[2 켚N.T Nfl~l=r20֜16ˢTй#Q?=)RH|S8BzK'ֻbseZ-P=8H(VIt $/"Km$'Nz#rƆUvfSw+JFSf,A25Z52A{ƾ j^t޶&_?7ehOҧḳLrCOp? {I(;@IjLw! u` D1C4$F˳O8^d`?g7d..3 mcI@yVE|iaXU& 9YMVVvn4b}k e!p fCGrNAeN+d}E&|_QBl&|(IPBBzh4 Ӄmw+65sڟ_)CVPc9?8TXR=05dDieKq=y`o+`=6?;;r~Sg)r(BU)PeM^zNo4HhVtdHKI *%5Y|ۨI P*^M<4!_iߗ^F5̯Cݰ9O GAT2.hL 'iڐ -aL^"owڒe[ـwY8ZA&Ql幝 8n6%|cqTLg?/40 -f+8>nHmANhI;}}KA_ݭ)Y bԧ@4 UDYei.'L⮢x' bD .MbU{RObB@5zUUuW'G8e-4O!.sIMяKfw'KJԽ "3 wx7H7;,<wMkc9!Ǫ}>ҥU'$=wTAs>bg߽b`Bڌً,&sLMEBH*M0C\.Ȁ,`E7=ű%su  JT;qp}5Jl Efm13LҤD$g"_T'}NYQC 3WvQqCc\Q\|P̀~'hJ\@f=ywhQ/Ϡ@e%~>s̃ M mt`nZ^)?%\;>=eJ0ӛ oip`]GPA>bfh?BN̉RЁeu>Ю UW *7\ ޕ_,DOdȧA{ ,ْ<Q2 ^"o$ySUKcR9ˀ44N6$C~ ~u¯Lvy >(8Þ]Mv4|4IGQS ƋR)YZWVHoQŗ_Jh_sT Jsv=IT N[qi vuͧ&T Rsw^<[EQܖJ;~ɔ 8ZR)nUH께vO*e{jo2ORȻ/{4U2(k$*sɆ"U1fYCQYEQRZ+'^l@zw1HHSmx\W_qOCԣ/g>fL`? ן6_ggq]DQ@MEMF\AdE,Ⱥr.բ|x Qb1PP#FO[x hv~f{O?͛7o~X|o}מ%Re8\D]I0$q(o~;=|?wXeGkցLM?嵻t3~5B,na377q jB"?XJٖ^qPwֱbŰi;ʺ$rc=_ %!@.EJE8#~9?A%5 oMDipg=a'sCu,i_ޗ6 E3i\idh#̩(ˢT;_EBR!~LeBb/#!G=5(]AOOSn#`h،JB7}O!oRMAѻcJ=<exM4iu$9qկ㍙5QDDuOf"MGX;Zfz!`gO l,aW%Έypv6G7ųّ?.^d%PvCjueV7W3(Gܫ "+fIo_v2|K8Vg ZO$| cc2mAq'n݆64Vyn[4'#~ s3"5 p]"Y[|u+c|~s3qO|o-['iqSloi_pg;._{CED\aYq&N7H)g<;;*Px_ԇ-ID]݆ziJhT9R.JvYޤH\&(eb,V-(ھ>ARM7 7ۯh~a+#8v!p.u@ ey8 x)+tJ"E/jj.yʙCr(_Hlp(vD)F!]kq33Ǵc4F} q/'#`G%E9Z&(8*6Gܔ!!FOrNaFq͔A|RQ(t)+0ZoyG>UqͯIgm5>:sH;q7d:ok+Ys͓?tϩxGMϝiOʕ \V8ue>h PwWd~t<UQ怾ܞk\hK #_szJZS#TovdyY& ~bЙClΑLl[6byJ@5WGK{˛iӕ̔`wz|8ڜXYUrya%i D% ȬK\TT8LnnO4g*0]ZrhTZ:vjT0D*4:;aT:oT{e8i¾;+ZIۛʍxu,k?g(TRJO ]j!XZ)޽#~!`ir}Ai֊3/K=-+J`TQƪ-K!O' b' g:=qķێħ}<4ю៯};0}B9s<<8`9 t ˄$%.ai'x{Dia4TZ)wIeT~+;sd'MO?>I *Uw3˸'LWjXڙԘR'h^vQB'^X.$іey ¢Ś锡t؃eԃ5F~XH%w;}6jUmj7Y P5;DR܋> ߎ? ߇]`z%8qp0|hV3ZnC]/n6X;?Bϵzib49 7e𽻳՛["8 /k_X=1,7fSifd=xG ^%i:w ')s ZrF*XƘnW fo:Q@ߑ֠܍é cr/'it,cW%π#-l>8:=.#'A'2 @;'-O' 1O?`%4'@4ɖOٿ6Iv85 !Խ.D5,*% @0M3{^#4,$c~#B!,%1B}Ցԛx} 1ז@TBBނ! !,ufrRtC*F`ݒrmWA"c|Z5t *AV<MKNd3;^n{`㽑p0_X5-?:U^Rxq+ۡM`9JFUx޺͓|7c7Fd2.~~T$-ǟ뛡ATd5/M'K zʉS,9aז,嘶xv|J)VO2S,]/}NᯮwFMό˜>إrw])W]P\vj?PC gL`J*n}(;.Ok9rXʦ9ܹ6Q?*Za陪R^PB,o9!%D) 3 s|;>dkwZ%e趓<zpPAE짍6.rs} z&HKpgչ*_\9gujnF/|kzmݓT~_m݋ٞO;2{CgD/0L_hYSsZ,F݁=癨 ҩARt,טwq>csρ=\ 0}B8ୄЂT [ʁDEi~l#B҉>514”L 97;dQyHicF\֏-dHPV_K$S_M$m~"*t..&tFNtvt2V&&-2v[~k-rw._%'4}b˧Ra`yʕQ"XDX!A wZ%7%Xl牭TM!FObȂ@e8͠qiBU/X{v%88niހgj>>a"Xd$"YG(4*n5`< Ǖ8ioB~zol1v6M^ _K^i.Q5,<ܗ(]އ SNo&%UX! .,nD-dx/N+Ɯ3y&Mƀ˵>FuG#hG{!}Qkfj>":Q5/vTE6#oa$whqgݖW[71˅YmBo }0d^=^#|X1k^IoX4cQYAUш8,ç$]RஓN7OHLHC&%1ځ?S ؃ç,p_ߋ[` ;qNiDi.= O hmRXP*6hF." _3R{hCCSɣhd mF~s(6# =n{DI :B9( ;ΡՎ$Ş*(: iz9#+b44 ImZ/VkP S: 5VYʰl O9{( S/Hu4'r?aHΙ.oEJv "e9af!Ua̼CS+JO>56t"q27*ZjJg2!PHZnXִ7IbCem.@61?b'iGk`7i7Yӽ|zg :Q ȟ$ʡd?0fAXuG x1oC3bA#2dNOIrjDƓ8H%|^4'˧KzB+Rr7MGq;$e {] /"PbD-GZj!{!"m^%Z"؞xtg٠| 3Zrݰ~|;3a"Spfxkփ&b\a,kVG,Gc [cqS}`Ɠv+&5c8~V3 Yb1j;}lXkWxW;૆M$c6yم_鑄<}}Y&{?(Z/}2__"̬$=`YRAut_1jbSܖ15Q-#PyYd#Y;dv^%Que'TЍr֍Ƌĝ)uF-P2@D,PcYG;.根Zd"@+u> Bq9,KnD  d?5x AMz\ƻ۔IXez5""׍8XZ_ȅqa5|VUg%wG!-|RrPUKqH9":;]TA?2~ȫX*NCY!8S&΃w}P 2)6 %=JHVZM3 3SƱkx>mN\L1t]13Ag3FtnѵŸs'M:4 m)uVv|_<56rsY Ud =;>(F(9H&[5 5uS l2T)7(ݼ4&2@[x7.3}~'TCh{a ֡/4臢GE: m9>*]7솪3 :̜l! Ē;JzGnxb.E' ,J..I--u[ٹ:8 98'Z!W:%mOo"Q0F£3 Oo'LHg-^jõbJ7s[yZU|n~n֬>mgP#.}m;;uy ݲ{P~p)>O!S?/kyaH$zDIlK?/"ȶ.`</ض=uIpZnzKoRin)ͼ0%wBQKcߵ1=vH\ aP xwC}=4P$TdY8~(zWWh ptצZ2BvO @[$^"F3'[C-hQkwr\=j" sjRYT b=O,"j|"_px)lgny5Y;*_#_0ئ\e E>> &<\>!i64.RR%VÈ5p^C\Ϊ{-)1'޵,R\yK7vis{Az3D6ᓁrND4/;\q,S;!fg8I*u+>PE젌R%Ug8.DF|RT7Pn1ps-puX ( zb}TK@c6ZV@͢Z`n-ΥT× dlH%;&tlc@⹡ Q8! 6-{Z|+APK1TYMYgBrm<̃}2iWŝ{cZ>OH sm|BV8u ԱETᾌtC32euSƃ"EʆAZ7ffB"N* =J~$oD==lqLk[ Ѯ8ufY'wJ6Yw+"{"^8 ƊܘpK˓~B>e~TRU:K`xwH琀Je,=֎.g'& ;Jk m“yNtl!?_9 2Q8ށLwqM$H% 2-éI893wUr V7)X4ʬ0EE Yb"*2=Ԙ*ڤXe NpGSEVYBH-jYCF^3F7Fx;Q-@2nRE|\T\x\oakhǒ+_oÊ(m/7Vsgi_2 V&N(jW\TTR{e}ge"/A;"we-xw.u$O<0f䂋69s.-0d0f_,"\s,@ѓsAaT`s6]Mh!lc`u{ Ixa2rH\>)dyg0{X6c+{{%@fhza0փD9#_6{xF ^ b/˓u6}b;.Q OT^.&d[) 7r b0h/()zvjB=P4pNEVB0)Hܳ쩳8AQJ-eh/ƺʌ!+}x[.`=tSzQ[ hUZ'* 6o .f\nr3_#^Ӷ.?8ׂfw %6͘aj.Knu]wG GY>~3 XrLXWM^D9tH{ļmP{[rFm;&3mNurm{-/zDq>x0>7#7lNmg{D݇+CSR$h;'LFW`hÙ` `*! w\BךF_G繶@wXc{y7p7^Rj}wi/|oߓ# H87r۠ ,}j}89P3>i4y}onw؂OqIe60Y["0M vչ;7(:9D4٧7`Ð/G鋄o4c%;ܟ/tn*1ɂN@XAqOSs3gHo̖H$3 2,Xg}ԋkZ5ERL 8\)&no9#Ɋ]2 Y6ߣTKuj`#b[ 9,=McγPG8Jfޝ AP[Gq"`(r@0 5:5(86Y3Or">!?SǍ&emrӦgV;5"1t隙LevT³0 XD.KT,3#jLy[ƓZm1ygBjMqTM"~N0BbnpR_/(tpڞL֛XrX>R&vrXr$׾٦y+ ;ט /J?AFdn`_T o+*T0+|q|p >i`~V$M5ۖ15k_?3(5tPswQlis3,ǝǬSoV/*o7 5Fc¢TAwMGТ Is5K dX.M~T=^cSh &D@";dub-cL`<kP쩴yo xOKOI69Z(L,`Ok APۥJ0B,yR+p.U Y뱇t:V WmUDd]0ARdz=8?8B"kO-; FB\l_Vx)2{n (r^dS( /|~}OӺ й7d3s϶t0!]d)V0ݦ+(FLdA쓰 =+,^d.IJ"}=|v\1hk!ejWλ_y C+,`{~T! 3yY=W€\}Tob"psp~}tR+,A Q703a ~!9k}D_[6wдYB-0`3q|{Mv/OܒWb&٬z0V ՀyvYZ!l>vA@̻߯(G_Q|X|=c0ǞeAx^Mr u/ K-'T:9#ȾԨ5å(IT ֭7XXD{ߧ`IfWlcysy]A=og^N{zh| n gT$MR.;˦>$cN=O9 =VlCTHWY<'$:,*4BxYtRv5OFDr[eKcE'mc+ֺi ,|t?A|ྟ$[bB Sr\uN5:OA: f`ag=q.R2a>'3ԶêI [قk7 ?3i&u%{-RmK e.Z( -R&s]BrGkfV]%ф݅h'S0DGKݲ2\/JvMC s\ H%j/- hH5qmRd ) \PNiP] ĪW`BB @Ud?%a FȤa!;ȅ=PL#)pU}kԗ ,3n*m2UFɖ/}'Iy1Ќ.02QzG<)ok,Mr@)VG)@ .j籊i%u'E6]h<3ҮEu%1RTyHt8N4|F W']#xh2t;gpɌ3 J#`:)wWը-9)ȸ#TH#!*|GJ@;NWie' modG>~ߟkVʮz dsX e ֯I(M3ICYUI9/ҧ?B)xCD@8-n -x|{Z?ǨWfFpC^g[AVL?u «{]sw&HRkh&v]cV~qSjM2FdGvUn@MÒ]E68HPLOa>[t=,CH>t Kv+g[̣і'J;xXCA~)Q̄E.nʛt"=B]1f7}@txDU >4?MJ;B MrF=Q̐Q1_:Og[?H G/(Phq:ebVc,9-A8Ds(F)7iJK w>8 b faaJAũyYB]Sʄdu($Ah,r 1d[PL1l( %+TM!淘`Q(Dhd TqX)e-5; Cv)SF+o3FuX1(Pqq`=uKjŮ'E sP&+B`2)d YvW]V&Iv14Lz8J8SVEgRkps3L~^ES&Jd c;(`sw͡Ū.'D1`-ٯN@wDӥ2Y4*5K=WF{sݢhCc?[:|~GhdbI"2g` .vElY0n'zȠH) >x,cjvPzR' Vw?,su\]2>kTdp ,KAڊjݘ_FNLw شl_-=}aJ!YikXi rp+ :#!')qdRLw<4s:hCA @v B?!Ϭ?FBWʨM+r&(U- =e+8 %$w2-ǀ#j. x- 5-Ts$FuT*V[ KIKӥI޵9_Ora`V [3;TKeħs& oٕ+9Km+Nq^%(BxvvH+#f٥ ҆GSSNY WǠIQ>DP&LqCym3COZKJOY@Jh+v-uS6?Œcxƽ/T,;q-;uf-+&T,FgO7P5fyQZYHy/ԄyO#j'*wL w]݃LˎcgCoG.oqK3w@;%It((pč/|=OsH>!fYp>)>0 QBXȔ.-$t,^qu#ypb9ctiP@o a`wG8egںU5]{UvȊG`n(=#K;P{e?5 Efr晝!F)HOS/$+4@ l9! 1ashE  #<\:cv# х%>H `;]Bd` imcdm(c"{+mk\p| PJn&JVmdöI}GǧӉWzťвIzJRUb٤2bl =w@wj{ȫkZV ؔe#uG)jzk[9xS2Tw+XhW!CJPE BXך ё^f eykB@v f ZdK^^]6:Avwhoؔzq_\Ps1n>It!Rי̄`%(IcmZ*}tZVO3vZCtIaEhG*;IMkzlXPPt"B:nDYdg(}NtqmZ΋;*rĔQIrsr/֙elzfV],״GMFtR) 8'6  Q)*37%r/9Jvvб+wFT-9PvgtH΍M!u$I7c?BLLR߻!m E!lΣs ъi?Z"ѽd~$*68=z0/';>[H t B}ε/miL"pa2 eU'eaos aQljg*k7Yp.]*<% e416Ii"/fڼ$ X,x b/o$D#څJϔ$L3*w,8L,S-3~n#da~Jcf|*Y,biߙK{=NQ$zoF 0i)}8ߘj.fؽ'%>@Lc+ 11O\ec˺.EيpCWWKDv8*$BOf¾mNHx}K^?3ͥl㪭ڣ=7k}v TO%T˱v]$-$鎍f7=,XˈΧu\c \E MSI\⫖a%-3r2F'ӌ0I;2bq4R¶2}%%Fr22ve确@].DjOVcMuTq<>t`-se8ك=l x#*\2RkrZ6SY 靗9@=?ϳ!Ӝ#AG N!r=Ok "TQLJjt2E?pMŲ]u?\^Pŏm-_条󆹅bk=C9$=)|>8'J-։bȀtΔQ Ǵ8_@p6a^uQ^^+4m@L\-=d l L3R([9m #Xu9&Bz,KIH<'1$ŷBL]ZscM@}vQM0sze{? `Z"W=^"[vV`-AB 쑪mAmYv+֢w2 ^<2eta$~TP Y.T? 2$ `S9˯BnV9t.;dUh!Y1~ GiXIcHQfԾVt=n b&x&!2X-r2K2_H I7fP?j>'׻}U {JfilW0K4/d7e7;w{5"ɂ" d\F/OS?IM8yeqRu@i~;RIw+0JXªDUH!O Tp(eP, ->t*})<<442DگiC>yt ij)]3Ѯ`6.f90 *qi)覬դ jc~( >a6y*3tƳqJDS 5BQPjOBDl,{Wzneh`{ͽP9e0]U:bv$+{pS϶q( q Pei;B3SRt6"2T2oys.4-|^lE)BeI}f|l#j6]D]PO`DL'tjIb{v2q%Ђim=ew6(7CgxpsEv0Pkewmg1jӘWVЄdl.צ"~0- hAݾRL;wS^e grM;"Mh= >J=~ wX0;\5 ~zw3 ͕.+Vec!Q!q$ňfLz;"Zؤ))r'5 (\"$@dCSk _5x:/Ф(Co.N0lջA芝[p\Vl\IwwGd\ @FR!YOw0:@H0,_7}k` [AKRԴ.1t421rrrr3R2ԓn όQ/gxOO?z?GTmSie ?eP p9 Ӑ"Ա93ujNOp[7VʰRz-dp6}:?ӄN*1բ|85RX(WdiO qx*'ƣA b)?`;2;bf)*ݥL@Ri^=CLJd־C5: ـ ^>QED[4Ի).H)`rYɻrL^ȸ=.}Xs\DŽ1oDޏ ?޾BL (x,s&Eb.XYХ_]sL=סoo{F< e mR 9QuCHuQCTE+)n#xBϙtP${ 3t)'qy{ un= ~ ¸UΩUBA%Ik!>??Fta֙')U'5dOu5c( :eM#6O?'}SI-m77rw[WGOM͖-jm>>vuD_c,9URtsqA쀩vhdAw` ,S_,<kj}:㷃k(?{DmyOCnF74٤CDjlpZ@L0ˁLmMD>? K‰͈:ZC8i]Ӈkk9{w撖L@2DC14$BiGY=|Ѹ۪.h ׷1n3dVFW(z]iu!܉(2R=sΩS^K &#L1d8ژP0=KjsGeL2.}}ԭz&TVad_SK>abIhu%$tL7v!wYE7ɍn(Aĕ 2Su~U{G+tzLw54Ԕl%6ܭ;uЅN zrThXA^P2"]BӁvLova5=EܑqkNY{,~xHyO^04CmW֍ ٻruB]A|y; B#%sWs]R^ÑQ[]߷R 4WB ==#>`V9 6@V aȎGA?ېj NT\!A<8Fg(#:ø%as&{!L1EKjNGS#!Yy"{q?$ n$hA"OSK7Di:wC;4gh!&iKʹZ12RT@'}.%{4 )fB5g <V Ti00s /Cv0gF$:c(–``P6j6Z$Xni!#8ia,+R;iCі{,l"NR ~)wcvo@`tkgrcQԠof NY:{t=Z} Q*lSstN&XmF2$YL m O!65lahF}TۜbUx~(V˗ѵlP_; b0ެ4Y$T|Ğ Ȯ8'8>sۑX,KO]99g >?&>1yj͕H&<1Zi#_g}[z`?f]dSN| , 7t̊hV F Mmnu]ϯ֡weѠN٬mZ[EIϧt{Ra/RuSO+OTUy@y֌7n'S"bq-|P_%q Y+?~C0`dj$etr+YĮIi+Y8{VZ~ӡ>RlYf R]ZS~ &*UytcvօmpKtjZ^^` =$svQ# .džU j‹xIWj7$&!,^.J5 ;A(pMa#1>:T8" @gQ`Oe?g# +y<,.RYN !gc ;vGcS X&oUѓeሿ_w$#-8V}9oXgs%{UQ*`/t2"S_} %b{{3wI!H5U:[;@dvQ|'< .: Zmb/ܠ_7~ gPCe˺qTEL49 M)))$ 8Lڑ%5FW~q"WkP;l$yJ#`Y\Ґ\|F[dF? p&wYȾ5 m*x@\9B5'#Lx5xؙY3@]"{[ګٖ?r!AKsrH"*&Z8/)[ˊ\~W۽Kq2czF#>p&wD5酦'ؽT~x*ۺ 53a10,|{:is"t7dm~8ӧ EbyE:L1+P$ᘈ ܵ[g5`o7%B&֭tьqN'l|Ǒ&oc+ _[QX#y 0aԼhAIw s5ً M AYa뮥+ n1c3ƣkN.dGҤ%&*uB#UƲ U |1˳-05>?OOpiDŽUL,2oWQbf#Bb7UbO*Q '[hSΰV({6hS->xh~0JqhÏ2vԵ~Ʒ:5u)[ݯ}>=pmL}e `mno`de`fBklc';H |X+/!~=C?T#=)JmO`OMjGvmy.9 B cyW3ø$iA/e)ΛD K ]6&ZUzĥ84FRJTV[Rn}z6_s?o=8g{=ﭞx' ɈTch\3bUKgP܎~cQj N@>y2/ޥ@LUYS-C L;1|#\'- >:}@}6ec:xQ7 W5Q;K>>/OhS:eIR`| yd\ X" >ELQ"n3#R3UbJ? AoƓfϼ";Q>vt5 up K;[g[̔ wu,S;%s3wj8)YW`#_4EB3)S hBF)z @ȗIvkKfF2{nl&.WN|ڧ!l@HJr )4aؘ]pG{hςE_h _NL,6ҘLZ?wIDkNH9;=n<º#yL$_%kVH$ @ W|9ۍ6%G9i)P~ (?oːń_) ?aOq|pyhe (.BsW#!3tʿSA+אpg{+4+iMotlz} ܙs~%pJh\Qhw{.Nk3xW1o%&Y_ H]ټ۫1NǜI0!+3 攠a~U˗O; W~4עHmrp'}74kҟTAŒTh<װHvpU t t}EoeBk;w ܍:foҘsC59"M՞1(-#؁jx{nksȖR"}"rVSHE8񜽿ɏ1YYw{yQ&RC1H:Yx;R2'n(ޱrlZv\j}(|GO'S\Qt,o2 \[ &?S}ٹO[[ptAV[7Ɖ-/p2s~ek!rv6͹hwO# eRz$g r_~G%fM_9d'OH{xk|Q>jPUp.6y5_{5(ZRҺ9j^⊅.F>kO|eSS߉,js99O|h0 8\q @$B\f-<.dY $~<*ʞ/T?}ؤ-zwXΎ<+NǪsv(0M#Lz XmRf#rx")Su? ->9"V!ilm.HteجYd}[}]~!<:&PP2AZt׃ \48 zl] j}on8fX?T;珽5#tB_t[-ęEs h^ 7{A>[˱;g :obV.@ܡj/Ezr(PuN}鳾B0NR΍g%H WBh`P 273a x*U wV!:v*$҄YE %ʙOɹX飸{‚=w$,;/se.gG6'ɏ/MCz1vVQ!,W J<mkTAr4 uDh)cA>oև?!R/Jgr;pZ|W{RPg]-iP}eb5rG00Ta`9u3FL?Rh( #~Ul\ľ% :g$Ø,nC-q pIP?6Z nm?gcaWrpT!>yJH%(pдz`t/`[Pi Xkpu+k(NX(Xכb@JO&Ґ8Fo࠰1?h~a/ 0JR˿:pH\Qb-( RPLKB܍$vڢSvV҆v;l# ꮴál>VCίR@+: g"_~S-4̡U=UZOEɐQޢ\`Q`8d۬OCÏuY} iC3d(ߗxޯ:aC`Y倜,wc7^;$<vJ 㬤9 SL+$LjUTSN@ХPlŻ*uucӡ{2[ZaTID;R|l&Sz>(^lKQK+p tr(+\$:CV&HX(>#6fY6tBo_#=!A7k|J杫Hbw2oNYtoȽFnK~| 'W`YQ¯ oS}RåtN8"N\{/b̋(zR)c&yլIJHU2}KZ ED { $- sʜ,Ha?XQi +{ǽN~(&Z8:kߚ?JOG:;cWOcWs!?tE֥ʬaK1V8fdP+iuCS?bLNl 3,~7:+Dx9I#/Jnb!`ұ^\tjXH +G/ǀW'b߂8]ȴTϡD 8?D=9,2#g.s9 DVtv(f#%Ci7AHLudȩ2Ķ&cVjG#Ɣ #pmah:#F1t.lzoUx>N?CJUZ}V&'ʉӄT1V$XKx/< w%8ƣ͕]dJ'.Njb" , +7Yi%⍲cۂl)DDXҘR1Y.s=h5רbl?;2ȑs7]@CH$7YJʆcy8{H_֗TAGgovSmzkd ^P" jݴ'B@ Z jEГF,cVYP_8A4৊=[n*>NqAo|jel;l&}st*;yol6ҾR!_ uY^϶}3$0"hYnc,uV{S:&GOa 0nݰn{2m &n{uSYfmtH:TzW)QfSl`;0 N!R¸I_׾E@k ;/xv6F&vJs@&ىb 1\@W^^6n,ՎRԼ;`tMվO ,@*WXN7@·vpQ`eH4v5abQ,L;#/Q0KVd6,p!:u^fC?^s z p(6Mlh_aըA+y1y$MdeC3\k C # 2MN*kkJiACvl /ѤjԴJl}&V;qݘ8n;G]U`˧" taG^^]AKJ'Ĭ( ?=o`KWkZg2Wj/]J?tM7d6/ Cmβf0J ȬW1$`A<*MWP.$@FCr^E*^#:0 -2YP|EB_aDDS/:,P)=%~W769q-B`WC M"FjV &nHB,bFD͹կ6Wf*Y\$aDtL ۷x2`RńȤ65s>e(Y!x0gTdEbΞv8nHfL5xV2B,^d:5Φ:fPb,l-3/d纱 y.ĀCR[jm1h91% jzH SeS>/Π zUȈT̨DwfN^6K9+N~ u2YRJlX ld@27|ia|U>O]x`lk=VGR1#Vxuv E:|,nRˮ<&ʞ'rE7o+]u O\N+7<Q- #V{Cl(&{O@M6c0~N|R2y僼GNBwbH+13DM–>[eDX*m2T~+fq}+jR zLFD(?1&C`L)=xqOMY,ǫuձ;άq=XP7 w hk!.ۯXЩR A_؅ Bf|>i~k3=mRd f.<6&:`dPnGn|&.fFpS| ~tU w~:'+*F̎(3!G0x k+th&!Ph'0@1{1P)rqY$.t-SYf|g\;tm[2-a5zIj/ 1"14{#a쾙PresvW{L쓉YJ^rB4tNQMFB^: _N;Sk1Z-8 gH > ╺>G A}X8NQF䵖C2F, D˴ӿ4r-WM.!>%o-I$OrL5C\ޡsy#[0yFV܃w1{v'c?cwtq2a0&/u3' 03Nf@e fɺ٬(X X:XOy2 7I9{(6H맰JWzkgO;"+ǤGZlhCPGnSێ"erԁEٗ5HxG m7EDLX8gx7E9Bj Ze)NtKA5z%vQ \5}츫l%w:% {Dz_u]w|]c?9ɭzUi-+$[zhfky"Uv/ Vi_ H G.gFn!OM!dck H}粃5 u<-5`şiZ۬#jv+`%H2? ߠ$2efE5>e%Mmǎ_6= z0eLjKqb[Loke5fըmp(j6%)=j)rOOwKg}` zzu RVp11A%ڻi8^f]%^Ҽ_m6'jmXQlq}ЇB"GЎ>NlL1M "JK ɬq< fN*)Ldc\r|b.7ǑJj7^}+{歍MeSm G(%l4Є2:'MQG:"䬞L ȹRf?kx'M[ͮGc {LAVӥ╯6q+=?qq\_$Q2[N3 /ⅪLqCWe8NW> (?G*Dxҏ ^Ãhp(?6Zh`n/?@k2%Eo֋mf_L!RmJP>O6S1 7]>+lDEܝDfbɡaLofSZ n(G( 7Ak;&EJ^ ×׶:_B&3:zTY? kk=DcW*KV͚ʪ23j"ijԂC)'=c_vlהcݫnޛadbM`E4yA9cnfAE<{n6@(a)3 W|`o@֗'3,To1Ҫ:s@{0GIpeڮ|&Xq%$7X1Uf! CƩe+W5T<* jep5=a#neXѳ"VMNChD<$y3dLѸ2sjܘ)auIhc+7E/jڀԕ?ZBclLcٛ\68Un5-壜PqVK(X'uTC[AnjMC^-‚m%*S50Xw+q1r>> CC-K0n=34ZBD(=>bxJK8ڠ{XFŶdG>:(1q"2B9SVPZyl=H-I_?9"¨*"琒͞Xj ҉d2C2o<4SbɄ\vR2IpmpeRVk)J+j&4? 35eel[7$@)憤̎6N⍤IZvmDD1QcEN8q GL<5YF=*|Z͛wBO[Ǫ$ladST}x/|&/ulny$7T_u4X1/%&_a+$A ^Tn.h>,4'Pmb7=r uڗx)!aL&'8Ǖ7ZH)1ȟh"z9٤<~?Cerӕ:H?}I rq$I"R9T0s,l(HiWD]%H;,51Wc뷩d\2twƧJKFaJ,.GshZdZ^\0@D\J9k%24;IsHki$$~9<tT}7p>wf;z.OU#b^dk}Mv7ŝUv7~8hrL\4;W259D] {^ŦPz t Noo O#:Nco ӹ:VnVh F}Թjǻ~$=j#L7LtAVEPuxOAw q0ɶݐyx7woI7bp,o|HGKG0<>[BqĺO|@Zdõ+K0hQt!6% pI>o҃{t7{ o™j'ɨ#j>BqG%8o+5Z)F4 v{lX ve,7\paYY,w?Kn~vgfgzs\cȳҹ5QzE堕Ht ]Vd((Ъg&sŐrS18C&f&Qn d1k6²7շ\d*-,Zk=ub#Lhn_ˏ볦٧$T>Yߝ.hoҽB>#$$<?~L?ㄿpsԱ}(tv(~cwp:#1ɀQ}Û(>RO~BNwdnti } 1_DH(M|5vɒPe[,7t_Ko:ߤbV Wll-"̏QsYOal!n;l@|U{)3L0oh[ >Rn8y (CUQ9w _GL<i@8̺؇E;iRf_@P@dpNI׭.x@v/%1]/rH.?T_99j*uY,O[5l}≟`CUVտ!03 M2ES/iZ61@{&Mt5Y.7 iH8J(!cTn&prDՏ1j.+BTy|cĤET? ']UX nntYTKɳëivFsD5rbeY츐;a_ Γ՝ŒNRX j[QylW8h/ˉyRaXZ%[mzfPȳz>PkfP^shF*kߺ lB9)Ezs ]4th"`{8"^U?0Me?T8pm*1Latt::CV$gNfcWvsqFLJrq4ic2$>V:d91!b-N`fjbjFYmrTӀik#9v2 <_^J6?&lY@ld֌8qE _tmԔE+0jى.jE]tnRL0(ŊL"Q.Qu*<ɯʑ w!!=܅p\bM4bjC{`9tNEAc$j˔ܥn]|%QWGD_`{ymu*#ZI>Mq~}._ؕۄ;dc̡j_yº4&@4&@tTD_M@2Ym: 5JoLvZ&8:NXvڷo P+]]Nb)SIm°@ S5uI !-(hOI:}rzg8FH=e4t'g˞tA82o]]rDu޽QVa l947[b!`$gc=Gc#co O}|NAxۣI$?,/VזTȶU\EXkf'dј,կ's_܄JDu2*4{:۝X[9=8 Xz$rPsúL苴ifxȬ|P; V^"}RTQ[y""Q:~QTҡw-)Mߥ04!Of³Z9&bT}{~D"> M`Ǜ;̵xZ #{r^9"4`4ąA %ejw.?JU #9 VgVyyG=zFPD')v|RSU6 >PC\(8oޠ)1HjÂg>jID͢%,۶m۶m۶m۶m۶m{~>܈wtDcfU dNڂ%t4)9 UѰw>[m~K Aݴ n};NMuΧ㋱6 vȦ'Kg;,k7e. %QYjݰב(NQ.v†@P|t{]|{R1qr,ze"tʏ${ U+8ʕR3YEplF7 w[]~[v>˓tl 9%XmmO0~\,M~F|ROn(={BD40w&k1m2dc^^|P.X%^Yx.\{t4bgj&3k潔2/?.j% qt}8X2kwv88< _r> GP7Ѩ6jV\L =[/B#Q/ͮC.@$ -q/\](EygIA)M!:#A~nEx%c\eG>OG"{q7<[!ېQ~~3?RȫV=*$?q&jm&h`oNR^SKD ,nRX#+إ"%K K"NE>[IL' 'hdz_Py@K"kE$yLCBVSޱ!yᢳfD( 燉*ťҳN30j=ȊlʻڅF*OȂ3x*ZRUܡ10e[i}$'$:dL&cKP[c]"`JGA 7PSMhwAѤAx;ʋ3y}BST k?7L5Fuw.S}? J7Wb;huxY.{ذ_eJ<F!R^TQi_Xi~=H{A!qBz+ofl+# SS] ZcMRPUs WOW'*i8(j.AT!p ؘ8[#a*V2&5)# |K!O[WnO /?gA~(A_ >ަ < :m(LsaLvֱ.$SJ xFj!:w6^5C [ANRV?*naKnFcSG¯Ko<\^)'i8ziZV:LC+Y)n/du7;yoytڻ#Zo:#`aﬥŽ>%O@2JwU Tr:Yk@&6Ip@9GK5O c~Xy=h>y/rAC1 g(r0).]/4E$z}.k3@_l^3"%0/lH0 !lW:fTŷqivvGn#t8Ew _ +)$ؽyʚO9}ְ"JA[sQ7ǰڞCeZ9U'ɐ χ_~fgs x ;qd7e~ ghQix.G5Ǟٜ@DmݧSL2`)ϻGltMV(0$ƥ To74/Cxlk:;D{ŤLVey4 O&&l~~M$oa#֯ iw|Zj*'T2R*S2ic2̑7q1 `?.CVu3e$""}5~  \I'47C,UVFQ@n3X@+joN<&fM}̖V>5k F~Fi92'=RgO^Q`b PPWPHbOS=lTD%GhO4]vY܎D /;P@5^dHI=*i"5`pѬM-Ҟٮbnu)`pl49oa?e~<-xLٲKi|x9Y;/u9dPAzLAU5{&X ]b&F"n"XB?KG ߐ\M83t D rrbx/SU7i{G74Q[4@"EZ~x.PŏL|ݬ/ɁVPSr g׏eQzX8i!.t츗,bgEҖA^zhN#eCz5 tx/x2ԕ-+q1׆_B5VGQ'w;l`8NgkRfOW0΃ve= (Tsw&XOQr݀z35q>B]S"75CL&Pk|'Ym+?N+6͏9f "-tg/^hZCX/߷Y=[73enkaBz6jf6e #vE`~FcO?4D{;XbusvXA{קGU}@:{V9dwyϊ͌7Rעs='T}X}ӘWoC<-*.o頻)09pubR oԢHҲt+w-kvo kGƏIsQ>xFw'AV=4Nms^{>:SPBpc{P̧A8"{Nk5O6^HHFSPD¨л-dQEe&<*J n5JX aOaA(跳שQ4i{lNHm4ڊÀކx8|>[(*:.%mL%C~ɠ+<*@N<^"<) IQc-C" .IbQ-*&2 g^|aJk#lALfx8!-&1m1n[<6eʾYKp26 X֮(5&~t,1̈R3n+%BϞ~w hHDV@ zڔXk7t^50tz4Zӊ\{W/rh|#§y^*+jߢ<|C>Vz̷AĞ{:7mJ2~u\!IcK8AC`R`SWaL2祴a/eԑ8E@v~ɍ RĐ6kVp/cZ\Cه̣1m?\cVZl/*kxp5>j,TlWfcvFHp* 'c,dZZڪc:'c *G+RcͽB ׀$쐿woT2.%kr~hw|l'Kt|5uQIt\-3EY6I4ꍨXNvAXyrQW6DAC$(is6ń֍:J*':"=fKЀސI*iڐ! SSi6P}@˞{s;tJVA5բ(!5kڵp&~ L|62+L =&Xy2s-ݠzH` GFHW[EQ9d-; 6$3Q-axl>2(_QxA|2@O}W\*d%ƕs; 0A\s2̼*@+t Vp`#$C,mL1~f75͡f `ۣ;XՂ5uSNh&`m0ރo╃q&u-%!Ԋ<d-[5q[hWK4FcK"$Xύmr#]Sla9-d'ɮ#py܋î#¨aw7͂>sk 8bEAN;JQUoQVPˁ4OƱWSwWRN>n';9$@XHG!)/_k*In,D2G*);9n5p;f^M 4%츝^nCc;•A|1 5R˃FHٱ_ܜ*\Ow\:sY@¹Tȭe<eD ,wO1*p5Fh=j]P_9Tf~Qڼ0'Zxo BOG^{=9Qe-;V*E|./|hl>=9:q +Sbz.5+}Pej"|>*즇aJ$قFTXfAJ]EBjX! kHPf F械P@ſ}IkMS BǶy&m,f?yY>G|S5+,W[硤R S3oSSG~`d/_F b5GbpKQeʬzYu{S>Z=tW8w*Nd&vPHhB^z)ѡ{(S"jQ<W{H$JWL75BMstBz;o| gyv?3c9:L {bypZEӁCʟ_ [6B_GqEk^ac=hs@i~^S x DP3cff/8"4tay Յ%Sv4FBG36s`p\CFplYC! Oh;UpJ,fPc rƹ0<eq6b%hLc6xfZl3Lc3NIZfp ~æPSMu.#Ff3K OOLM ]ӂ}vX xGa/ohGhYw?XRWO[ H/1eJFgky rW'cV@ܟ!x2e0I~_8r=ޮsjqϭ e@Z nUpzC79@:/z`&?3Qr?3q{.,u>&.yizr~MlџكCa mE߂:AAdl0>m1wa,̇b \B4(yaGGŪs?F={gѶ 21؄l?G'-:w$Mn>_?sԦ p@ll8Yĺ`q`OոC-]T!c%i-+F+ .nMCL](=" 5@`woC|TEI^HgG-U1 E]!4 Kڗ.0eg:@B !;vǠo|G8wCo;iRVd$  /Զz7L_0O$Bz> t@+|%VfikW x]Ү+uT6Α˭w/ ӭ"ѯ~D/5 ̓wj̃w*zMI=6 14eTI#u4Q ikGTKt[DىgMuk:uH=W ]6_zR(hMR;[(i^BG!Ym}=PvU@"` *t7kDHњ;B-=fz-s0,o.e g'+5 ]Mr c7 88sI׹(gNt" L￿abC-|ְ z0}8tb%4&}F <ԃ\`ȳ7zжCl_ܢmYIdCc ʄsHIILIĸB~P%S#"ϷK `ӄ @'7p*S* Xa9{n F+n#x!|ڐ?x=*rq <^;ӦBm>@ "|FbCfaG"TU\qpj ƭƓnN%d4pZU8/[L܌|+c[ߓ*Mz:OAi鸮mdȰj.."#h9:@J ʹ٧XSkޡg 1g:6c#/He ۜ!sucbY"c- CJ@;Μ/f%x!Ptiتj0e`"4YHpG5“X0wmnI;{mv|C7!p~a GfUm͐b˂\P=E@:lCcGJ W65gln ~2~ eccKyB6psV_fM1Xq?7ys?>il6PT>\)ygG.8sYvǏ8e#MEPu 2D[**aYY@܌c2뱈LnDG mj5690vBv3Iv[m=K-8w3iYJ<mF> r[xp]c[qa37IO)ISK7\|+GO.|=x.}(@ |}X^^JqxBYj "IPLC *KL۩{1?. OclBsExgJay![CtGyuȶp}U E[Q/p*a{P$ ht!{_&12KyգZXP!B> V=Q CӺrM*&(Ij=U*NL,$Ir*I,꫰ * ɥ[XmM 4hY&]{{IԝϤ'ƫ.NA,>Lּ؁@N7uY#XBghWQApkY3?NTE+D+ <0H=/gC.Ob{Y'1r*7gʒ1cmZJodaVRUb)05Ҭsxy-Sޕ<=OY͗s?-|g:7z87mY?}8?$ =>'4Sj$ΨX)M+k$}͞I8A[ OnХKm}m0miT`!FG(dAAɛ"xT_v>e˨SmaO^Xqќ.U(SGJ542I4bɠSi8C|6Plҁ mh]:~6jE^jmkĥ^CG~_p}v;. Pm@07m ]0NҭpXm!5!5-ɏ#.o!4ʖC;ӈ{{ ˡ"wC.M3Ρ@;N@0{;*^d{8r^!Si/p!C :u/ aỊ4R_DơC^-aŻRuUǻ6/jYϡ6ġb.²6CtW1YqT+C't C5o0^c 8nc5M$G58c+0.d86q\Zdq+lx#.Uxcflֱ£RxǣG6mEX\mkrԩi==-cSkeՕL Wz6sUA7TX.щ} =.xԱH}mq=_Bu #6a-I7a!~ zbjn`t:rfC! pS:t3D Ml&4D[}~I_&CSAW6ت/ h'4̜؄؄v Q՜.=f_jUL#$b3ڤx2p]HCZ…yY^{9m(z^9g~*ꄾ)ڱkLD 1!:N?IO+륥ߥOrǏf^;\dz N$ z*x'^!LTqTVt xvwa#/A Y{:'w6fTBG{9r{RJ=rSj8ma޼ZeVNK`3p$ y\z!=ا ˺t8wjcm\gnis-8|wUn4k_x s[CGC~LKs@j W_ ȁԥgEfp3ϫkzq1)f"nE2ݩ#lPEwyLp KEmr?CҜCN7CmtTi`I g{|7jt~|7:!F 8xkXxS%k|ZUwH_JVCe*Z0 X0*Lb] ctz3FxȀٲL9VfY/fKxl `督o.A.0]&~eռ~mV/%7HaUZttVbvݜ1?Gۯ7OCO۟)\he0=0#Ie#vdf I¼8'&@NSlDUjS2$u_E^tck aO@: PACs.p< ;BOeh< U< 5@<&0Pk-!.Y #2*"’ %p'm8.7R6dFױ.[wH{iT>_܍?5Ћ3}0\A P? H% ^>k87>ߙ _ & eZg"99Lo9G8ezF4}Ǭ]nwBue65bE0\1IHnmX E=0K{{=6:[մp׼G+ųn(ѫ\BKZExBV Pg׼\z0s@@v-_Gz"* ]@U!,2^2]W^J]Z*[͖!@V5DX-w7[ ̄F`@a곿g'aqꉒ`$D-c:ԣ>&.a0WaSڲFȌ7Sb ;?2vJ#a%&B]!I23x;齲N ŀ8`Ya &o'[^sRɼ&] mi C pg8"{s zlԣ^Y 9vN?AFP~ǂxFYGxbdט9C<w:5ŮӐ-QKg$칷NMc{*CR/ߦ H@1V.T\C0WTy,>X{F#m0Q斖MhD/ⱑ_(CW" .BuQ9*sf\8d)E/6⡦ ,YV+C? u@жцv[yw f -tXw736ʢyfvљ]ɦ]=$?KR5NGl)I*PO*5K@)1XUct`M,tے)G0BOcץG&@ 6j=,[?u͆9ä$T<VEт7Y$ -M\xt\A>~*U6:}6T~!eFcz\84\sŇap+">ee}6zmdx-jM;_ZnpL R .AgfOάЏޖ`vK< ˙wTg~ mP)6Hb5dyW]vet>\ߪOȡ}+*7t,@È?k>ۮ !Za NH[;(H{*f>DW[ժ{w(,A{mH OA8qjoEءbXDӰQ,0 rXrU&:\3[ WJ¯"241OFdvԛ | .̊zZLxl^.LS`a]wL[loZ_FKFzFXOznQ `ݩ9o5كT!L&W6K:@9#W'7+/Wn. Aꖄ6lD /z8x,yCx-dFyhA'ֺbKĘE2X;ecTE[v^SH258r5L\8LQ8(3A:TsZ~-?hºlzݔth|j$qŠr jtw}g-p$NB˹ڝxvŋar(H4i㽬TǂpȬۧGV.eZ8#gԕ4ą,qڏz/Ul;ihbbT0 Ӧų"K?`ږ)ii@DOKƈ8]jHn!L;1iQESґY'+Y%Fɪ왂#;CFn#uJ.F'gKN|_9+dP%߈~0#?QQVj\{f=Mq^eHQCrE!GmlNp&s+Wۂ֕RG^ kQfCku·Oq(B6a\5A:nmXZiEB4s{>Omuuձ &);nBisxҭ9]AB~{p)-Sh?a?Xctk$io_BD;fTrrրJTON#LrlA*v-פ kljt`O+\ވة>Yc+n;GBk:+&ٓ3̇l}#_O_ᵳ2+gW{ ;6(yGa`6 Z>=1{p(OX}egpק M05:#zdbV~$ Y_Gϒi81]9ax[{ F^O9c1wa#6m{N)}猓Y{yWm1<^`U)Sꄏ${?hb|L!P,9%y=?E=^O֝fֆUNR1fwn¤eX9lh"l:Fe y/92LHtָf#eCayy}ݦeC+̛=MkHfK3%7K9{D*M9{$:HM>ӔԵxJn[x2"n6!La}T/q}TR XP/Q&4zPKyQvfTZQ4QnĬ6I)m Y%oYi-YU)gi%XnI5QX4p_vdy].kG7aCGmk h4n^Q 񬎉ƽ9 2VcDh#ͪ OH66@{EW0. O>7vA+A #:9DM% tFmjU>Nȇo݌UsLhb3Z:DΣ;/+_E)X5^EӃy{s\ޔj^Gof;{إ{LOh&e]ؗ06Ւ9>or_&zZ5!)mchfE藦/LRŻb& wk]b03V7D\] ܜtSxT9.)DYo}C,G ۙam IC>CL*['oSC^BhogR(K _+m_)T~-Bk=c!s:ZT0f<"Wz6GFY΋va=cL_=*Gc~BTo-]FLSQWH:B [.&` W2C Vd5< OƱ5r-fU 2BV6 V6kn:Q4#t,U-Xs+簱 ˙,.q܆A>[jegCkv 4C讥뇘ohe yq,8i2%e<{]DZ|jPC7 Mn jE+ a2g!4 \Ws O\ձHAR3=0:fg@9>憼5\ʖqUoszBB~Lzz;N艝Gwǿ/hL.9]ϲkO8r춉:iKa Ln/[#n0y<VeK΀Π].kEDS ~°x_wf .KDK o<<'l &~K  [+ JO3$^έQe=T^(φfzbi_9Av*hyv tëJ+qrhoL(' QSKQ15aN<80ld4X; x}y9Be7Lm:-) 2*N-xRA!$ Xtf1´&j )$rSډQ;/JkՒAfNQ8Ur a!o{M[࠷:^f.%nx)*J_9] SM/:}FN:KEQ>zN1:e]pRARk^T@FJp4+cܦ,EItCq`7þ wW? ׏Zfâ-deusW0 Һ7xjwխa7e>f3pɵާit139 fe[d@AnwkvQI15#e?ӿ]GPĤYk!]YXS!-!}~F3KAlɌg$m,b>WV: >\1Y v ԯTu\/vԘTl6ˊnM%OZ?T F‚mz^UT2tƦVfbmj/ko%5L,K I3cVv;.h΂vmS ׉)uəh;9) yo$>k`i6{ٹePjiJ>U03dߊSi=} HV'чHغCo/%e0|Q0p.| |#.WA\ )BH]$@y Қ0?٭Ýp$ϜՏPf;->uӸUfQkH/A5qh[؆p택ѾOtdgm]|c!eϬ/l~|9\2un̺jsKe `ry9& ]E S^_e;|xh^ ӝ$tSrET~&<_xr)E~04\{\*4()4= Gpl"w4X: r uN6_Rcں&D{ -sF=Ŷ'h3Kqju\b'J\jwJ?Co uKdثoCOzCu>ÆUbUzlAsO,\vs({RVbta Q[tv D\~Ssa|Q; `hY]xR l-(ڱ] B>(GHǃh爍KBaaz\/Ey%. WZ3jE1)2 ;@* 3]< &޿(f9=-i~##|uwQ{Tyn ;!ɗ՞O}=ge;2, l;~Wf̯ sv 7raǺ!Wۋ QAW-LĄ=mC̆YGu: uJxutsQT>I- /6IEpu _s8kGLBKB2onl_My{'vi}᫽NҴseoF{7(K7V{=0Յo0[G޾έo]ޡc߈gWA;_$\!NW_[/h_$힡 r E,at 3XWàrgLJ9t>WOkjw%(<$2X{av)ﰋqGYl_]+U\L%Qttc6H* .Hm ?8r=͊&0Haaa̤p"@1B9|xD?Ip6J_&W/oEC>&7/]컬p/`ٙpRs$RsʼnJ Db7L+#@I&Xw:M,1]^Q7S"-fWF(ӌ8~{L(AJ5 PڳBT!JID,D  4#mp֜1iU1Iy7@'M>orSyDsŗ+!G~8%%sawJG:%{3Ih 7Q>5VЇk{Q^O `;Nf uJTcHA/?`a&Eszη=RR? E5\J: `8o}/mS)] (>Ml)oxIVqwvFnL6zC^QfPz*B¬L-I4jվbCqL|@I zs9O%o+`Nd]4(M'>'%V 9X%D Zۛe.J|DKg*ͩg>˒dN@KƲ0Ukؿ}1 ~8!!~c ፀ c* alEJúDpsF2=+7F")KPvMcf~*LD2顓gU%aZ)%37$ƲBfOTr$ƒp#yBxkO<R kiJĝ}V)V3rcq, O,8~c.xCEl3(:=(:lWz{Eb׌ ORHؙCQ>/#6P_tLiRXEh#Ɍ ]Rzry ]>wC%wLȞAwȝ{p{U$1Z<8oslsva/.MV3, yȽʨN#Y 9WI 0N`hU|>^ {tܒ<؟Uy$M41 ۚWZ} 3{AS/FĒOޞGg_k}غwN{D8PEޤ&dUp3xyi>+ƅ1+DQ͇>霈biPJyRd\xn^ )f7S%d9c mtdp%X^9e:CKD=n%]fH Fho(O(2w~o,#F u)yYxK.?^=Gcpn^!1_8!mķpH}]{(QaޔJORA,,I )GuXW^jkt fl _gL\~FnsM/@Swj.Wj˽?Oj !xͩ haDI[حL}`) SU&@@R>#@A?Klyg@TͳHG$ aC(!K* ,XY\M_ B2\@ Nhn8~^63Tx|/b~ t%ܸ~> .YSüs¥<_ V{ 0c*뉦"1?zyIvTWk1[\GdP mV<' `O> m? 5`o_=_z2;C\Re!7#LwԵ?CoqUJTrQT<'AOP/0{e# 7Z\ZA\XYʋy d(Sb 50YP\ ͣh)~;jzĉ%G5- 0B0>埕y/!_ٗG~9K!:l ]&.ow5[/QGf #Ғ( |C -^2$XɱcwX %>H(LR7b/)'E3rVKDޤ 41F T1B90(lk xMA(MES\C\*$%"zIA UQy$q$ 4*Vqf L5qsxOz_o(c*|%SdiF]wT*Vf>C| gQz:` :1)L 32U !W)Ľ zρ`oehՖ3,{yRHn6>r}Оzb.L0ccT}s:![gyeḗ:A, %4aT)"| =x=% }R0`mM}Ŧ 2bZ܌ C͘T{ ']R/9}LqٳT*ZOP\!;zt+۲I% L"%[ĀqHGDC^SֲE2%Bj8zT&l_IDRx[j|#Ծw6y'%m&'A.qcԞ{׃$C*}d Zڄ*Te\ 3MNG#rW"Dp1P s#cVŶF3JOnfT5w [K-aPlD[#57Jy'Q".gZ~;k1.K]`m'6Eݑ:Kox ǻzHrV0dzW+Kf|6QbdI8bqD^z$13MԣA`F٥(=LA8E)8; }c QvuYG=܌e,۱<h_7O>1!Q+=OePL jz06L4 ׬sZ `kesC~s$!rG!QM7n:q h)f(41x?d{1#~:ipi'0-=P"E3'R" xXJ]/$|#d0?o+=!<{;_ocsю#}ZL\Ry$cM^,>9ɘN?VIVrH jl?i5 "b1IM>U<߶2#_ѣ c?c?Fs>T!)Zj0/'G'1dFـ WAG!WEO>`rx/ׇ@nk;קAoҽu }]Aq~ŏ=PH=,^ϚZ7%?*N?9z zϏJ5%kغDo!*E5&7f= kL8 [&63~+$Id NwOJG;#/bUh񟸘'eg9Dodȿ`8 ~gu usͶTNCXi~NiGY•|&8NNUuKSr1eCʍ+8 # qRC+y3Gw RB.cxѩE q'R]LEe+IT=JQ jO!7Us !I $uD̜a!_6|KRX[ɉ@P2yjݘ,ļY)h@ܗt-,z1L񿪙#JgM22FePk. ͉6߬bk*?9ۊ!;拊(EBI4Oʿ ~V"t:g11D66O0"SZecAShpr})2ShyX@W"ָJGQL P,Nȃӕj(ēӵ0_y! o2 !Y<4ɩD߶D*/>r٥Sj6znFLriH14BU|8+A1j- ĩʎeay=˔%sȜ:,B" J/=6Bn:# Vnۭi}`h96)lbsAjLq ,x<XI1UH^mz"@bBVS@[pyBNq宥fd:lځP}DvIaL(';1w#MmQ**fSeյZ3sܴy> +L=Ck00^XJjz$2詯CBz̰Ŭ0 ltm7;#/ڵmKʳxS|ey?#.|Z\ vf2;M4bR)UlHx> z7Nv/6{ʋL#ҵH#o>;e0 zqnh;ifgWWhY_vna,:JW "}!jVWcfi ȑ~I=n-]kf)%ÝЇ &C}B +.5% }WX 9/aw eO~w 'jO}wrsR #xa+l]CB1=/\DS8IzR/>IKW8K- KRܦsL^KҷWKw?:cҖ(2>)0H&k043  C DWD1_sTy3\΄r(?߹\ٮG' PBP=E)C ɘW۵և"?7{zS;0J4|q(ƦE(X*Ҝ+fW܍XvJ9?-#'aqa.H(s6bQ|MGIWZyQ^$:~ [ʒ+c3hKZ$C iCr1r CXo}؉Lf~t94Hf!{`b9;捾έD#% -y Lxn '\IJj`tE%zt>&o0|iN Zo{I/4wl] 'Wm)I$%X~J-q+H.eSka(Vlbͽtx<58LoLJ崺 _]Ur~͊eYf_d`R pZlEEmU`}̸e6lDlRi8Jfm4x U{ykw`^Tw9pn#hz~`K(!&ˈ:i]EyyK9G8m^1Wa%Nf{PLOFNU ug2?1g-ӅcYV APXXZނ"W4J"Q7$do`87>St9vI28"a#gغ;Һ1r IL(9۱CkhV;`|"񧺻GuI:islkFMHi2P:{7B!1Eeq4$ͨt!#`ZWucPgB&~G y[%dž;LE{k#eG3I-y嗴bXb-uU+4%iGUkv`PFEXK^ӆb미Onqz,kl7%oU@I͞>q ]ta"t,lZx< kY|=(Hu5ҝy;Ǚy{YՌsU`)FUajĠ/X)"E^c39KKT2@RyB!?TqHAIȏXX z+q' EvXr]DE "*F*-$cm_[oLFFDןfE# ضb4y#+SZ E=.Ś\*:f˚a=\ˋ3\LUIe4Z9\8, I1EK\{\mI}Րz5Ft%hh"bvB\ݛJqMٝu< ި+8񴺺޺ӱs BL B.,FBgHж{u:CW?κmvUɁ_K/˹`\-M@ ]ܸڂ:lϺT`(Rd;dq`6uXQzB_Gܡ# m {Ʊ<3 &Q|l! $(yJѦT+r[Ίeiaulah%y2ӼzyM+6$LJTtP&\(33ڹFPC̰Of-CI Ha:tC.au``k~IbqNE1Åj?=`ިsfƫtn-E7M%XRģqV\! .EH~ YV7NeAwC\#qvwŰ8l妇bGE:Dau ȉ,Ȃ0<UIQa,ԈUtG? eWZn"PlN~-|vFE^w͐~t'u,VEyZ ʾLӝ.S@۽ql+o1m-d- Vfw QԤ6){ub)_ lˑ(s_<.UɮsǧF}g:^֣G&ݧz&ghux 9̣:OAuǟhm U6^eRO%eLTԣV`}Š+=>M;D=~T0ȓDN\S&vuϛIIWɞ"R~ORe0̲×Wޠ AݜYƆůrii⾷4y`rj4sfm }m@I;oHeK?9, >-b&&vkI",V@xt|8AT PBv= g,؋;Ecesz 瘎Ǭ#=߷>qh-kB%sBrQ#/-AJ 8|a{-(5H-C˹ e`CjY W %i3+c<.Vacª~||=7y|'' 4 %` 5QUtygjw[@FW $7FqEEr":{ :+l䐄`d I}mDd,n%L*jM%Ñ&ldS}|QމӁa|A6c?D V̩ʩnjXSlAGgσr 66>?ݖyu{4/PNIL Yp  7E"Gz6j׾FI5cIegdf(q*PPAc)z6CXmUUXmSeGap_dgA$_Savٔ|, [ޙaqa}@D!ѳjby'X(Q&]49J>Sevhs32Sn9rj4$:*QdE\qX&j>LC6GX+eLtt3O6AÀ.Z.[/"FdtLhsf`/D.Jвh 3|}rJ#gH?ߺ]y!GY[XIG'C "A ƣ@o؎T_ '`rF~gx/YY/BrSLEB2e ł1*%*VRjl|1rn2lm+z`0VzZdl.bq#+|/慞h6hADHC֞7\332.m9{<./ Qw= H0! XOۇF^G1¬A҈BE "E2lKP\5+!P+ jj"KUĵؑ܁&Yc4d:V< V2el2eMGpv/?<SQP]7YR/! __1vGkڜl3d(lͼ$gV'#",m:FGڎqrt5yL2aεw;f.,a8,YsGLá) Xq3q|EN ?%'FCUuV?9x Nwb礅N+p(n(ԱZ#pOΗ(s.F 1{g8&:A\JĖhoT<}{. 'bFG,K/}Bn>Ս9ٺrk%Zǃ,֘dH̝D2Ǐh.se>*}b]Mݳp9mW)A ,ۡTJmO[IΖGIc= x M} e)k"IKyNw{/c&PVAUs4T( SkU /C:g%{9F__*+EKhL/Dlٹ{JLdP%N.?R h@&&(.hpy5Mm? 0hp&Bktټv|Lބ;X6֧QKˣ)n |C؃ݔ"kh<%NU+,æ-|PVQ%,AՈ@1 c$@Z((Y0Hz.(~E e]3mѮNS6Y}܁YŤ؄r ,_&;~!Ia#bv=C( [J|W!Sdg: ­ b-Q p>V +Mh8&h ܭ]@Km55Nːb:$qΛ=:y_+< 4z.`;qP=젋W|AA-H9uJU+tXA&,.~/AF[(JPM8FGъ2Źi>SIxXmo^+u7lrlo讃sG1 ;3r>`nJ?w''/ϴWkKcԾ}Xd'K;h8(c^XZPF_)82vK>I 2{i1[@exYG՚AVA=~!QxqӶՊR98}\v'y}Ysy=ghC%hDvikitI([fLM #ҟӹ`ܐLfQq3>SDC!xH5pࡐ]C9-`*6R^ԺgcB _C=Eyz0$a~S1*a>XK%籹A!Y6XvGP Ӛ7a 6c:L 3_gcͰML5bpnƋѧ| @B"eokv? rz#1H&H|?`uT|ǽzȢ;`vf!Rc22e'(3^ B{xP{vvj!;R9f&>9.73e,6 cbb?d҉iΑqz3 >gP5=KP(ZU΂=X!e+2)t u[X:&f.1MSI[wŌ}eK #6C=nCC,c52w~b-p~ V :,[%@2qR0:8qop\Y B0_~H<ᱩo1ḭ5nV~H]v]t.(s%zE)@g^aufrvQ| 97eDxC{>df~Fr~r[jKF}#9uFf1'A{,2$ת=@q{yIH3MDI3Ԙlqvi2w#8dp@ɇ>`Bnޑ,o $No)} Ȑg]˃#},k.ѷ8w9<+>轄~n %Ƀ_\Tܴ^KjUjMy(Zr dLb#)*r_(A$ѳS<ɠ̷*IAebwҋO_02vZ X@A@O.)@ SxjZة(;T,7r4.=FG1ѝZGA鱮,U@dtB,Zq1%NTW*jz0D,)L ~^F)!zMr.: ڧkUࠊIdȠVw#~:VtU0 \я3Vsޓ|7[U*8mM 2-ƣA}:TQwA@;_nA[mڇ4tt]Lڜ2FVg0FwU:o=w0x%Y5OK(A"TGoQk E*Lց`[zU!` H}38YqEKL%*Uؾ\IxwbX(l&r/榗xv]TR6e&ѝZVhV}e r^3d'tu=flB n{H]x4%n *cbO9W42=z{rHIo;jtn1W?ՑBryL [ʕ>bО0%9Zz4u(r!̈Ћi\"FX0/ _{($7_0e{5 f^\pX梽6nO-Q}c]ˍ/Z]!UL$ 'b}7fKy*Dz+ F ߼`1V t;ByFƖS08%b"<(8 E< y⺵9`$ e!98r%?8F@(ut۵ӗtlVFYܿ d#Iw C1g1o|0HZk).}۴!Q@EyNb1d{h 1X~Rr.W䄉 i9b)Z_<LCP8 Z^R2zcL= P*RjdD$v;Pz솚%LzV@baM&_c lZ^uv;b\^6c1n\hy֭xc 2[D `alY^Es=Z Z A7[$qVg0:ȁ +4q=նUB9$V؁\^,AWvvFaP~< xJ9 AZkB?h| B=^N >jvh({Q!8r|LeW=5b~yZ36}m8=5qZ2{cHn Z +j;ڦJZbl"-G1:Qd1>F H9Hqhɭ[d(+D? %0P`10,K@{,Mܰ!eE/ye<Ċ$QBS.# $e5DJ#}9X% ENGST4X7Vvugta Q~y||`$XzM`B"#BS-]2qh2Aqs`p{h poD% >.zߪcOR<^gveE 8B4"4~"[$Rʋ]0ttRuYDq`P# *AȔg( QVe Ħ,]f7Np]pȅ8$zFa2ē#R{h1 fyShYvŘe/bFIJ*qKKcjguGΉ1fk9dIamc&I[CƐ)EEQP2ʉ ^d'(iq`C9i\bق{RSܗNȈ0u#2#3jyK[ڜ'Ut\sJYMW &8NN$۹09 N.p ~kN{QSalt_&x>ЋM2gdB@(57ṵ2&ѩTm÷Mj :(i\ޑ=0b ywŃr!S@!j٫%]A#ra{t+g: ykvRL6'`ӸȀ'Lr>_\39؅o/G bJ' g ی:Iĸn7& |d(< d%q33r'e$g&+ք/URu7^rT,>&° =-GS8grxxBяx'0FaeT'|˒񯏍c㾓㰷-EyrugJ#-!.xPᒂ=2TYjPUUWUek""39w^NBG hbsc5$ƽ40-CV ,cz-P=߸ǒ0[ fzn;7%f[1_UBYCMRK`F:%ٖwr@H;yr ˺K*( ONhQ7_m cG5TLgp7CYn,O$;eLhQ䬷C갳sMceOs!y$`^jްR,I@l5A$j) Y| *(k|H# rfoŋ`< a%ʼnW^_ K6gDg:Y'{C@<̑kB_2c_m& ~OpA}V}8+VT_걺\M, ܝ%sa?uLZK\t pah6zBick4Up >:LYn{Ac:\aNJ8u P]2s(k0LWYTɥv{U.){0xIe@'`?keʎN? "Z: y/0v+9.8y nT5$?9*)R[\*^WRGkZ1%*ͽ%0H2yYl&fUO'/p!u3>8YJk为H, >$O7DEY.26`gh9P^ J.kv49XV5ؚ,|t>F]8xH>xo{!/k8Uw5Y"oAQygeT@Lσϒ>,;ĖrpvikW}afI拸ފ=9,99TIYRDl茄>`l;Y5~x7L&MM*3QiD̚>$sʼn1U;FQbx^Q)f5z&z@0 T4zDxx=v.&^{ho 9fB`6q}̊"*$4tކ[f.{"t͍`i7u-zSԜ%B6dl[௅&BEXȶvemIIPn1s&ަ}{ϘBQ8I)nʛ&cܘxڬ!4Ǩ_?ȋ6kZ°R4qp^=2G*] kܛз2邎ݬl0qo:7v9Vm5I6~or T_DJ&Bm~|)7})Vq~rȺp 6)zu/$pZ4û'ԓA\Sºi=\xhDzlw[J 癐(jASpT b-c 3X{*#6ޑ}44`i[>nF|?dꏩ6a"n> ~(A|‹5*xbIeil0J'#Ԓ_ ( _ )n` (yۅԛsL 8<_Á#iѦ G`mr@\ȇ܇ۺcQP؃ކxY틩CLJރ[fK r& $@0b&%EMg7PÖ>!BTFfz$#X8w:rBZb?! *:y0.:Ae*O AS.&ׅ&6m*83;Ix:Ϛ=lר- +Ğ[H $ʼn r(}ɅՎ}KC@G#!!NN&R(#NO.6|DKSPw=2c'GUh_6 ywlOU5j&TЉ_7OX"*Y{VL!'FavԥrEc"m4 J TnٕRa>2Y4"N{,@CΉ>iǑh$PmF Q'UHA,DgiP)v(&X *& .)=-@ϸŊo=b!#[sH#.*ťKL)K- I& VTMj|JijqN슠T,l\J|h|HtPI :iͭ8o|@J̊ȝ,KAn.L %T$&&@rBe-O|{2dP {; pe*%80r2z߻P` c{ UO>$bUXQUMP$+L57Zs&Z }2'd<MJ{݆׾d*XNCu{<džauEqu$-#k&_B?Ƿ4h^bHp27.)ӏdHU?ulXE*{ K-"IB*Y9ޕt4Xbh\={ mLm7rb.u~sFM^M:̳:H?k[z>18O~0*LgH?\>f.EݑhM666Kݘv]In&R?*D/tlZE(xV'[I\sBڍc?ޥars |OgRChMLt (W_JqDgfM;okso@/^N͠#4H==DtU9$. T6%yDg<Cv,UWx m5;ʫvv6jOy$L"*TB݇y^|@vxX˜qh3)UЗL4Æޏ%݋CC[' x4:\@8}GQ2#✇Y*!19}6Ey;5rl"$U QyvÑ*?"Žj( (E`%dٌ!>%Mg`Sk`p^Հ[Ԑ}!rr ]BBT13 "Y^|wGDp0r7kLr9p(!A\҄҄h_uUS+ElR3(t0Hu!s([c=Sa;h*_AhյX,ѵXG&) b\ ##Xp*? Ը=ePZn;:"px io?;ԗr 8}q!U៭Ԩ߶Gj`nXD7L/1j J4CQPm"> "@V9M sQ*@UgrЖB 'q'MmO ̱x[y͸2@|]4:#5MT!u~spx ~>o#&BI(u;PnCP J󀀞`!ݑ/]k]AoXh2}p/8ц%s<ԑk#AklkWRJkkc!\W_Kix>f|CVlatx3b6OիN-%Z-b՛U*[F+-E7,ROWCROb slBm$Pڣ 3{}Q^/o)d{/VLIlҜZucxm/z9uK?-BΊ(=-"i4=Ƞ<%`IJC}/;Ye%z)o tjy3ReJgaaF (t<9 taF  GiM!xYljY|5RWَChJ؏y*&) qTS`cIaFܼټʰ27> VcڹT'⣓X;p1QjY~wMtK<7;ے씌To!Nq^-ш{[H=QpC9ca 5ҁQͿ mgdX -!\$P;\R γ#|hi&q)L?-([9վ!I=m)S4M9wxP\(Y?z.qGfDb/Z1326iYxm|"A pj8ߑB4q |р;g!R8h%ٿĨ)}Vh52˩-.M:UK4|h`_=B!;6z؃7Ӹt7H0Ws#7d}VM,“ 1bxx<, e~b]0_eD"="Ş C`tMc/% ˌMXe־\v N!pўh36y;+8һt)sGp'"{$~v+8]ĉ(X܎u -j6<& V6&*VeQ4Qu=nwHbԹ*m1$s v-X1xU^Pz-[8Im թz Gn!,ɝnZ~!7Gw[0cIDp 愰GzD^GL ` ı G 8"GĦGFYG 9 cԮ@GyZ)c/~Zq(ﰓ8G)Wxr\Q-GL=ɤ-Ho0a= s[ϲ]=!)sgԬN%] `]T%c 쩧w_])Bĩ ݹ0 U]M=GT|- T;GZVYL&@:Y?Q1% X]d8,Xفx|H f˥Im"UZ#ظg c Q-,ͰV!f =ɮGO",rP:Y#Lkr5M󗩹mZG@wňcN)45b {'&˶2ö=%|2Mo }@ڍ[e0w~KNryEr{sg>}`_h1UO>A +Zb2FLR>ehd8/-+, i9 %Q\'̨2{]voDNjI@xAbcֿϷ} ݍ\H3ؙMha?)0YXϛ1*:8=EMtȐ)I*H+ADWtݻ`xmhB: *L$K;rI<5Qh8p+2ɻv-MQb9VQvS$'y1ԐC C.\„GXCOŶW{4LtFӫ5xy~Ͱg<7;+*P B{ G^nwAB jzel?Bh\㤘Tg8;*0!fɇkBN ɩZK )[wA"SK 3rc{푴ycﲗx&ndN/.7g1HL?O݋0rdWu~DGGPuOku6b4zH<(KO= y9wOc U=Kڨ%ODKR<0rUuΒTNX܅ҏ)SUg&O5?{R&lO9Eb)&AE?BUzI( >s}+`|KgR̩Swu>^~Uݢt__qnt 4ʍv_,53TLVr[-[xXVk2*i,j6\W+uݶo fxɞi} ^=M χe[ 4qϜH.;xV1/MvI#>Z@ NjPކ(`)CS)+YW:KV(,WѢ5ݭ N0 yb4Ѷo5ݪR2[7ĝs4y:pGD`>0_l]l l;~K730!7ѯ-5ic6=7b^7(4I i[m KZTfOY:[2 vp`/p 7} #dd-cVahC!T}3rզmp[kfvt)yUUTӽl)dLu׻}yl#;;[?Mbd1%>~G 7흼a0]tz }aL}o޷n9oA&2=dL{yh%9䏪Ƙa׼^Mr y_+w EwAtToYk_镛v^[ݮ\Y r2߄AlV6̋) XʹdXWw-U탰`V ˸g*C{WYb~G G$=%\3 VjGr&Hz"9T%\";qlU`?gJ{eʵV>Fs]+A#cHK~Oŭ0VV8,kT,kY轰r HU+\"rjꈒU-rr>,J-\=㺠ttU<7wJ)Ub].DWjښ,7wƴRGw ".a-iTvT|9_(/Zy]Z+\vun}fFA;5ɲ BCˋɸGQ*bXŬ1']5cA!uJ>g`͕ZvbR7Uc3C9Ǽ]7<ͬ OP݄͢cF6E3{bbИ޿2+ imV#@; `C U~I+_ҋ~V J>Ѭ I]Mhې3U)yC"B~ 6VG%EUF8|Ͼ.I#PMQ3>#ly&}-T:bR%QX0/Nڞ&e5*v_A |yNz-w&κ|a>bAz~DaSu駌,8V& py i]bmo4r# .>‰21I>r׸~D+3cKcԣ) ZB=2?\]xa=:HMoAz@p%{bH(#PPB0Sp<ꃃh8Ta}Kpk~^PCH1A4cKxh Yp4_sPaEk 54ҫYPAJ4kXOVUh V!]-구`ZX3WQe-oWqg-pj8+["Q0 cV<f5yWlWWǙm)A i2CM6XWUm=r'hbKZU$xDZhmkLYCE-,loeJ!63 Mm0qd,ΝmHsJP浚 ;թJZ=XxSǘvBn9Yxf꬞.,l~^Z6 =Er,6q&5-nXWe6mHvJͭ҅$ҵP-O;^jxqWZ7@?9Ze=K8qtԎs@FVڥ(XjEN[:%4ZYON{0rYyx Tl |p:^HEǰdr h-X!뭶 ^[< [D䆐mئ_o0W{[k8o 󄼶]sr l4/2Ts_>usӣX%1/gՌYt!]%!|s]:(t&37ePrQ(MPE-^M_Y2'k )zfxq )hoiK~EM_F*|fG֋Eu|?5K/7Q'=YJl7F6 K+g[Z_¬H>جV)WUo'x˹.QѲ!YL %:vZ򁦷MK@>2>rlO{GƜ.k{kknoZX6niᠹc=e^̙isEEˉY!@ _Ys<*^8ڜyFKH:sy,HY.:&;V\kӚ&گsV5k|<_MKX2EIz+h^PS C$xʜ+`7U3c?0aS"cD] ZO|oA!@|E2UTdb4ǘ؎~%JSkn[T]MgfIɒ65j<9Km! Jx^u.aM8O! QO`m{LtA2ҽ{,u2_b!R1:iXFarFEAT L4y^d1kN㇛*mo dc >й`[M5az.j3Dۉ'z. C5cjEA[௤ gje kJ`Wfaz؏c}uomЌ_!>,3ڤ8N57i- w>ɩMN$}!*~HFmƴBSH_f+lU8NG ! QD2. =չ%4 GCA UijClF ,DZ@A5t-Ĕ->2Fl8m$y#%&iQVs v6>ϏDl{[VH,-ڢڎK2tд𼃒~C*Xw pa6eM͙SrZ'=Oھ8c%sbm1.("99"2qK<;}ynXyd8'Z`W u櫱tpJ7H'w@^ 8V_|7E((sBǙ'CDHna*t5{+:>v T'(m2ol,> b)s" }b=ռ@쁳@?y:!f<1sbǦ}[d_:7")&I΀M Mb&ڿ8-G;=wp{9~e(N9" %/pGsE)"($t80'{.GBI棒fW^l|vz# 7 oxZwtpMھȴPqHg<{su3m\Mbv?lgQSR|aw$55S7ub›h%Ֆyܰ[.p.!/HGUvBvbLlDd5(TԢ:ULX׶AxJ詘5Mw<`AUK'ӿzz3 yh|hFRR^ 9],uXX0wq*zY@yo hՁ19Z}-OLI4muU`XJ,!Vۤ} eBs֙ LteygmxМ>a.! =mV-wSdc7tchQv "v~נ!:Bto6W(t܂."0z`+EGֺ)@ìePڋAasw;TȐ*Y898 X[F+aʾ<[@B@SK+/Zn@M Ix-kNJHu'Z0L1Jq)ĕa;@YG#ǔpfjLQ],柏ј(qV#K,|۴v!f<Qʼq7n1j+GKl\2!lꂖ˟tyy"Ёl2eFP3mҡsv84SMex ޔgE!)§'БYHWtl /:) ]fT`duaͬyX?9aLj-[H%j R[}I@OI(Y8 %i 7ˑ>l!*Vu;KLT] o*kSBN-1e%X0M="?&H^D_: "vj >DD<_kɥ]r\˜g<.,FzXp਱Ҁ 7.ʖ͚ltⵙ# R,' I.b\w)EMImnٚpWQB*T8[ERN"ʸjIP= aVϷ`3-ZR~Ԍzbn/ s}0b h-IQ)u4;V/"D6pSƉ;0mg@nɛCz^Wsڊna_|I/m> 3 i0X@#je *vnBl^\K!|jdh@r= 87r:l_N "Qz/(Ws3m JҤ;=. ;v*$LV{ XXk`4s MQ'1f0ѕ gɞ SG9h= ũ> #s0\ *7@ Π UhZ?DNwdӱE`3s&kEp'G2$fwPrM gz\/|PzXzpZT RZ)ډd&\@{%$Xj%PW#a(jme;rѹ0 DO)Ρ/Bї;-5T ]6*~2j.o\ٽ`ڽGi8FL % Ew^K틡HˡH=} FHFTJ882dkTyEє>脩#ӭN&n٬T9qHH_"I+:<635h66Y'V8xA&ZCQX~45}7n<ڃBNhRua{d41{p)Ve(ԒHSzZ0t̴yKҢ\,Qxf#d,0mB. ZQ_n\zOQSgԉ #0Ldw.x\e NPbz$}QpFO>+hRX`MCʹ:ߖbB!:Zf8R&8I6 jS`ɱkm&3OȊg8sf?kvwi9nL!V6.rvj~=jscy 4:)pd*̰*PK&)1#x~*r 'eϝ 1֘ :qqǔ*E 춥3RMQ`,3y$xilk;kg)Gε7e/[2|D7v s%ݳ!Eȹu@`T Ͷ,TSe}Z-E*vV-y- dO f5`NDf1qh]걘lOH`FɔcK6Aw$4Yw&%R1R4ZSrߎ <*uZ}fWFkpd a4 ׇяCs&"+#eB夠GQY hd6XhS9֝u<3+Ɍ6Ju#;KLO{Z:O3Gbs<HUg1b<50~A]s!)L4+3tl̬rP臨SX'QE"Bd&;BrU \$h YxCHv^He47xKȄxc50I3-]I:M+_5yyzj>:^)ݒgwjazTx8dV:lL=ˌpȼ+~q%M]^2bA3 ↩|Y3 NJu'by%cH`X$ͩ|KaЩF,r,hZQJ.Y0 &:3MV.8:7+XtrkTp*# f"c?Ro亦Rz3)]WVYVG5 ^Qkvɋ ]y̎2=FZ|&X^{p@_l&ڛ{ 0$z,5,:bD3/*sߖ~y) \*`k\"l m^#8+f>:7ݿg UKAO9ٝɔrsS9^3~vqEDKaSt׌w|6.D.G ܘy? !YIG3|BhZU]%HjZSvĀxN]=p^t0f Mg莄e9K>sN>ZnG擝{e9i(nL=qzav$nwc47qUh@:~wR(Gh2\H0sG>0@ ssS7"Fqd#VÞb?g]?d @IGnIwvY@4+ο?I6\YgGRRl3SyAXF: iϐ bK cH!08x~DaӱfZ91IhJ b,cDEPfd]E_'bU2Q @6}>$?I!{AoAU'8^kib{vz+xgO^\/Jm0" ԴT EE*@Ł%J {'ydX%\rl{Q{Jr.iҟd#H]^/I}ֆ_L ,s;~/tYw\:n}M}GIG"\{\I75WsS\oN>w@&5|z AtIp13OU{!| ?Q}9x;3gg3gꍩG?Yf?{"H]C,^;Ơ!Pv-\OԈ/}tlE )~߿qVoKрV>I:n<6@D'$.? ? "&.4`%eȀ[0*i[uRYWQo۱jqkQnaJC˸usew/gZ,)j !m`㚩1 Gx?J( 0S;sb `8?'(.Zj#DPEyysN.We5 `#|UGƼu?zyO˸<\IYQr79(|gG} ;da_]^QܕSh(ttduG;Zk.ɮqTĠ4=L@o@ q!GFX7 [.Lzٵ5mGch~ _ć<7!X qr1JzUn?چC2orHЭiXBMzand+2Qd>y,'!$7/rφ 4\^Ԁ/z'JڀP>hCh|j=l`OL'f7)EʴvfF2Bvv7$ְϣJ fDlྌ'/2mlF8]wa8%F,V/7&,|J yO#JHaʅ*APcٕawjlm59].!Mat\3EA.ps0 b\1GpDeB粬u2j emXC&Au+AҚMyL~=4IN=42djg_v<;ҩͣCz gؾrZyc)ť=+od5a:>Y(dEkjIW|+`9|VvL2Gu_i]L=yC,)/Ee/kzӿ^hdY7 \:tsZq7ʶkR^M6*x3 $jz`|w&kj?4z4` I(Қk=w_>v$u-t=!倦QQlql8BM:.IХ +S;~p۷sN41L_#rXN2jhL{n$G rr%'[$xH5jQLM,n˵>U8yIl'Qէ9S-MCgM5v!apW}wnbYrVv ,/3j%JwHR_Lf>8l69 KB6)2ѓ\՗+{kޘ7.9%kl'Jybw^E@OeU^em49 1bSWg 1Zeh8<C8FUdaS)6O9&;TpҏJx=Xc@Ɂqqu)nǬ_ >X=]Es[= !2:j~`-2 "!kE~Ǭ A͓0==5{x&=EFVzMͧ=ў'zؔ[:j:-Z2;m͂domW; ȷ lv,pH_J|=V٠[〽2JE% etݤ=wbmH}%eVUU!հ fܦ%oYɴ]ćy[w(iL'$TwOܽWxu0wNf!Ogr?_ߩDifuJ( @uhLW$Urķ`WV5 [30{D-$eQkS%aez~"ϖMu/=np:.Wu>o3ؽ꯯Cu{fE]|Bj^Z B^@nV(!M^S_1xW7t!̛@bi/H.1.f$`_C]Pm(i%rB<AwnL(m^bim`3e(W;YgbXL\Pf&)>Lj_3ohG wBbqٟȘ؃QQd ahy84LjxSL@VUoHhOv+iczoۡFY$^= bׅ&@k}gO"[P2b4 d#,Vi0}yۏ>qy%mć2mL<_ª sX<yETXs1]J"1&[Jl;Ŗ#JK2'23lG( '%Q32U3(Ld Bٳ)Vv8uhY$dGY%28N=gD8ʏxE =5 9E9_۶m۶m۶m۶m۶mO]k}y2TRɨdjiU^EU c):i<Sa(tDKd){Lt폑+J)ؗ%Iȟ<ȿ岥yPc~ty/ωcn,._;)lV...VZ.`^{(~p..{踶QF8Kj5yxiNMvS h`# kb?;>ڰHL'cڃ&˳߶#[Ub8VdP-O[QI6 *Bc5 ^du r7a Yi๖6_JD&up73HY Xټ05gMO+n+eNw.RɇΨsDnM(pw-c+:+ʚ}I'ͥdX0x ]m1P9Z~S{( /@j4m|ʓ?# H gQo 3_`. ኸ0QGvFӯǟP X}kKLFw+7RcdQGlIhx}U eD{7'zc2K-|/= Rp t~*GDVaoHbezc_%uYbk0 |(Md2< Pi$4XbCSs]^04% 㛄K>kL> n͈}2La Gn,c]}q(bڒۄT> 7Cc.E W$`W,`1zu;B%<B[\}G>Ujs0l# zD=[Ʋߩ3}e?Ww?ꐢ4e~d4;LN_ A}h87h LJ\4N6-`^x0>N>fox b)U%DU]bB9Onln-Kฺ"1pstVQ*ŕʛq~Xy3>y5T=.뉅 s}(t߆ ln`M:H:hO[gEP8 rJG0-1dX3guOӽBDk)?` E1P~;S_>`25rP |45ZP NL'M"*4I?%[֊v2M”F?P-3yk^as \vH08B.bDQYe.:URXOhIi&tRoΝj2ӬV:(qGAx\^GB RwOZB+ѕai~So9P5)$-}!d>OWM0ەd~YR`w K5 +tVF] 3('D 0-u䧓4w$~.?<))ߚ.D~[?eDrvd$BiGBiΣ Fu~/7yp'bED,6?SȿpO%ОMop& 6p-b!2qrM{ e}iCqƘKd1"k/*DRY}s94oފ#dI̐ |Zo Je r$XP"q#K̓12-TLqoQm[op:n+ך+SF1NVZC~_z޼\ ]*P/o3 T{K H^ KT /CD,yPYu-˘ q@St P{cEg}nҡњD.cS<5s ߻a' \(7^Iͼ3DFƦqp |Q"|Bxxp  S@ZvT iP,k745r5inի[>r;|oA.k߿<{;?Ev`~~!uoO 24эaoo!|L@, 1E-pү 6PXMuT =<e t,8_9oĶi:(m2d>qBt2YvՐ-777<ϖ cahuiV3+RjNpear@8;,JWDd;.G+8}q{?vر#dwIcOfVD>yw(xNlNj]o0C4ٸUז.Hs+op_`%U @DրFifЕԡ&/J<*6q$~!SA*dhUXdd+=j,4K6zln58w _L XLnWnƞUFm>o]'v*q@|*G4*xA:m.>s"y|u B݆}H_Hj7߫S1-W1~} Q<Ʈr`K`r;@5K n_njjmb-bx0>L "<, ՗=VRI9h!qU"8L|ٿB{p: /cTMېqWKɽJfi-4?rR("'l /,Eػ0 vBjv1GaYi}n\DU؜~ 1> ŌTw߰$9T!+0xvϬHe^h%=.jת6Ol`5vy'.TT?=-dcӒl+ > WYόJ II 72= d1GoqbPINT5' ?5 U)ĕ a|zC9UvK; ܙN[BJ\A8T CUfT_%i ;F<3Mq:ػĝ#d{&KuNZv1dC5E´wӦ&g^ԃeq[곬A;I/XJYɖP*׃~LLU`gT|1\9fMXyuW#'4U2]7vMwX)n},>ӧ\eezu2V;3۲kWcƣa41)&,QEބl6+ n9w7i.W)׬35]g C2 Q yuKԣ_>9xGvSM8,OKz`JǟI'0ܔGCI7dse˿T9E8t&v; Y oqff:n r➖, pUЬ owOtrT7oXZ|n`_MlfXՙ,V/Pq(#$u/qFV ,–6D.Y\˨)|@,OcP\zQqV1,V0+]PHQV~G܇ЖvT?*ꑕ3릷//?d@r$f<ҧ YѦIBA<Vwi!ui5g>!UE ci-k!=ĕM&@b *,b.7ә)e#6!.h^Yj s:ӲrQĤ2w)kZl(6lU%{9s:HyڋN:wOV51'5WQ?/h7QI5 V%]/ Eo #0`B8<c$x&Y@ MNSXR0hUȀܢȫ1\&rr$D"x)JےO`>=wQV=V2V%kA͇ɘoqzOϙw³YS z"O׫흶bALj)=iݭѭk?┟i߃/W  S}$a; Eh 0dW p\^rnD*c1@4U`M%FջrK#$gM6 *ALmg>G*v`XіSӄ Yaɟ\ boC=<V<7DŽWQUFH̸-&55 'BPNJ$/5cR92EDA7#4EUe%+ˋEY]CRJ宅Ts$(mqdcɔx)ؔ и*߀b>~*!3L$G:qUD(l&~޻{)FUlb$M;?VeM:/e/$>"cVdZ^ X66?lyYi!T}wE.E|M)7˾I{V9 yPM MA@j~PD ~Uo|9q~Π_rk螡aAu7K[1!:Ea+ng]a1YC1Pޞv+<:YS8reK69L 6"ʬC| kǘIBp$o0jv]pksY@Wf^iB?zzӶ{%nHL sC3BFn\ÄP1%:ܒ 1i5IgjNnY`+mF޷+N~Ϧи/TCnn4,g*JgJUi/16H>5|W;GQ_ s9A,a6e05-F ;KgP. qFvX]MVgM} x運g \ot&+P=}ҍ?u{W.98E 2^;>FWx/s} =i/-r>lBgN>j4 /lVqdJ VvBZK; v~+ųX&|+=>kdPc/" FJُ' <}e(>{'0U.e~\֌5$5?jh5?>(װSם]RV^?գ_`t׆y`Es0?Ģ}]SSogO]}N>yo}X67%D`獤p:2=8mPa 70]6 wElrl0cBr0!)РHKUxˡ-󣬉ʸ=o<עɕiɊ$x/5F7?U? t c8~{A;*Q/m`jAZޕ EW+ bV*bX*b$l<j5G~hї3ާ $Er*jI H`c&î@`/!5-W@b3YʕzS>9MX(!i+M Ax(5L OwJDzv"]!ɉSӋkYH x,$X[C]\*opM@k2[^<2B"](ゎ)U8b dql&-}'ܷ+ sr̿H-|iۣ!cD5XLWi))'u=4O(UuuED)$r^v㡼B0$V@u ~7FRFTلK( C-8S iJE#ۣSەH@0*cPAe c{^DA8d2h4|J3TK % αeXQ)oKasvy8nԖV$;7^s{YT1k BC^uJŔ9`1t.n,z2!ΎT- STGlLKS~a$%ܻ2*ٍvSFPQ()״NQlI$c_AΓЁaS<Ʒ؉B BldD xLz.Rd>TC|jg9ț厁F%Wx949,I_}m4GњeV@sV<(b٦B=chqc N{!B V\#CbDY=h(Aa<'Ncq#(Sȑ=uz1¨C 4ltEťȽ#a pcw9/|CQ+!n9>_jg/h> 45/MX$㸇!G)"ZtQLuGmEZR)9V0q<-XqC "bi ]Mml$gĩh@m hhWY]-M̭-7U{ R%ȉpIi"Ό +;|shR`6_=ćcHt)]SE2hJOq-n }#% 0 K$woʹ]]wkmG\N;'넥/ذf { x@iRWf 6y('f~HS ?tl+kh7M7r$~OaR-[eé8IvWOH%z=@[:rzoAn8e(eWM`ՙ?ILc+^Y, m!Ѷ>awM">}l!y %LLFpŃ+tz wCyo1=*|(N[Ϡ5$1_)7"de|<$|pMRof3ATL|E(FcWgU1pzgzĞ@6CP*ĆsTSUOqRf)|xyFnf"u3W7 {?"jAދFQ lq2xgR4myo(c? +77751s"ă73dld4 ާzd,.O!6l, N+)E- 4TѝR*y$q>3AJȥ,~ 31 u wx@Ƥ1§sLi8f82EK7ꈱ?gv6NnNf6D-i9ݧW1 F" B&H MI.h`ȯlYYNA~I2 P mbcڒvy'oyc2ҫg"G,agU2bn,#]f937Yc#Й_7W)e-(@yR"87tsX1$C@  }נ+#]⌌_DܑaODˤrSx d rmF[f\"'D,ozfj{SJ1zGm\ v^bA@CCj[2R%O ZVW5q 1s_* `a^'sHX^Ȩ:=yl!ʻ Ҿpyx VV <& sL\  歊2o:jZy4Z R5 ;YVv8C&@tq8p@M=⳥!z^븱G0(>J,ʦy82`4tupf>KH.S$Oz+UJ6,uJWU6uPqno&׉U}L$g G4UHQg&y.Ns3u 3S9/.cXeMk+dc5g|yE1׷JEZјu ҉Be +初Sm@no,w |,mrMSUB.A11H(AS/ U?6ɰ4VYXkKl܀2'i$ŐS5ym,Gail.?uwEY}oz*|,h}PioI5d]6?A|Rmۛˊ^HrWVKt 8q'XG4u28pm$஘qa+Afas~ $>K>V_8$T`]GiAdkM)}CwQWНTR=`$j.M(CK^`aQs dջ8J+DBwpa>U޷'зit#h!Xkq\#*ìJ=dka@zit"G3jH*C|)Ge-VoT?kw^ )h~䈧b?`x@UxY0T9( Y4!%&dJ?NE $>ywt9YTx1&,9uj}1߰81t̠JQ *>RW6Kjw!{pHݼ2TƗ==P^ږ#+wNlj3opyG#J+4c]$ Q!@o i Ыk0gz.UC\wh ;z4*IDeig WTT$4~穑qƍb0ȓ_%yq1I`^= @+*/K3N03Tz܈Dj%WP{=)N}0p,ۏ8WD%j۰'ȓz@fUYsb_З$\i4.~NGyB#0,׬o<4*& ?k0{.Oԉ~}+:LwQP4j`Sɷs%'1WiU/aR=ZH-8󴯬un:|88 Rm%Um(/2Hm[l"L#]YWD1i^Q&$ h]wNQ|:].^7ZȎnhd5S:1ц0R;2x n@4ԧ Z&2%Zݐ\uQNIaxtwAGM +r58fJDZC 9IQϊf+;G0o -b1r(ΖNh\bH$uR ^*a=~E_^B3ljS0MV9C1QPނZ*ux)+vK+B^.%3xa7۽[RüdCz} fX@+*ٌ3[-0<js2/K-@?s_:%A ]K5vOҎ{Rk /4 ȁysX .m|#U4 Эm#~q"BEXMIF8=`MTE wQxUsl&)+_|z"UCty+`_ZEqiYe?#D,fO*[jwy lFC.lq~Y?_lLځٖ`UNe*v<Qz+ ]E f!Am˪;b58Kz H.U<taqojw7$dubH]Wsmꁻؓu1v1 ơȩTcB,7GVC^0,@w1 o|Įa#o[rKr+`kQ &>Ȗ]Uha9e?c]>/"%bK˹ښvӯTcaHC'ȟ3=aǂ4EErDY_u/!9O.߱BGWT \H.8!4@'mVA(sY}$Ա6hZɤ7{d ++ɫ]E ;fWNW٢4Pa ^YVف 7SkcaƵzqd$P,^ö6CQHfE6 qc5T.;#꟟lMW4R^l+\6!'Y[4-I7&MVs;)W3?$SxE\%iv"*5]{DMiћ=,[[f0rnhس&o`"1vDit#} \Aa'vaww)z5_zNa( WG dhDM۪gqWƟ3˩ԣΈ, .=m6ӛ7Ċ;,v^7=JoɢK>N7E_;;MO>75(/vQT)vbِIGy\3fwkNt/_5c'aÉцrE㈚Ao1BIr۵cҋ>ns9\sTH`{.l[1L( e bVG3-80Z5 F_b6qǤVļ!W桂.Dc1 0lG-cX>Gac3\nQ]gn1l:ɩX1b"%]%h%R[RG=q`1N~x xW+(U΁+JkՕ+-HkF֑T&Fa3vpKԬtK.^ @MM` } jj5ōR J9P|ʶ˥ugwujsMuBsT:T¾{cϭo)m. q,*{$JmMxkPƁr&Ga&SR58Ff$8($DK`^ `{Fe5dB%uya@>*P+HLň+.K0f(RzWmd-$ ZgC}O6pOunXetK(>@j]ʕȀǭIpg0qmvIEs[C{ISS~#N@( $fo6:v <FsD B=}Q(J^Tfv6<jdjWBհvv~Kt6tKAԘlUvI+F@#(JǶ81yZL; ]KqZXP LmzZ5ICWq b,{Z%Hh@i50 Og@vEz1JH`U[?{=w٨9rTL8Q9*|COM? zo]v2A0qi* A=""dZ)f6| t*ҁR) h\BDyq eR45ia |Aq25d5Cnb4[u| h0BPiU&r#ʄ鎀 fBNK`jjF$j DszpMjh(r$~N*)d9T S#Ah-Y1ي!!;ǰir¨kLd-OƲBB}3%V-6`Wmn(m숦c#Gf}H]2o)W?PXH{d;A0#%-a%P/ Hֿ\%6긶~ jnXq6&i9ȚTlU7ܔf!MM)dMjn(E'jMS~7 Me_97rU,զi񮠍NfVeM@!rk  S::~_nCEnaV=Sס_tIޙXK2sQzUWy(*W yf< &o.W/#:%82 KapID͕$j;61\urDhh3 KYpqZ!ռQ#MbIs ^vG(ܳPbjHPS"HA).USY֌ۧ}hW dMg ~$K8x`-IqJr̘V.r(F~(&?V۾v;*Mi P=RS@9u,2;O$8}.-U>O2Mo7s#>V'2L2 ?N,3i XS%yꍖC d=u_ӤPR'eZy8\(<""H$E&*H4RW[Z;:$8go.CN D1\%Y HyK.G<19ؾY &[`8B)PiNߤ 7=Pr#}TdygeC8|0o͇nQ_}3du̩'mV+>Hs=lɍdXPWTBho`"cu 7~Vh ~pQR2c$##AL7ZWX3|ҫ ~TTK>EEԭw05LHɉX0H݁ôE$fQ:.e4 Ib;S[QlE*vuQ"Sd˵VLXp( s VK#$Q~y"s0.|zuXq0XÖLgM{hyܝS'MuÿF_ϘtUiK$x:呤Z1UIM0g{&I1ċ֖·_@A`f^QH~ 8s>ް4yy&tqI8H]VZg6mWu;c˼յJ2gעǽ3?Nѵp[:f$0_-,1zaSCT[Sʷ1"_+[(>Zp{Kwf`h_Ca0SD0H`ч'by.,{wXJ'xT{rӥvۄFxS|UĞ5I$nD3Ȗ T(y)1Di֥ o|'x $w[wWD+JYY{0+^8lQHiSq14VD5WV7:5!AW6cZL*[.60OM\k/q,$n_6, B KhCB( 2!XַIDFQsiM ct҃h+i@c +GܙUyTU;::RŃTkN&}윞 +%,|TQ3;0#g=dR (k׳bh4oF*gq* r~Q32pVDZJe1@ )oKQB&2Z葠ZlI[9NfK(P>lL8Aw0NVty#^[KwV>:z虩ć7ؤFp KXx8dx$ sUҖO]'d$$Fy bʼn$!J3Way4D w$T~ eii\h8ykJ JW236W8¾(v^`Pb"dMVJZnC;=SGCdt#1JjrZ:*5w(:߳X,ܠ{:̨Yn,_K"X~6K.೑x ێe_L6.b]&[2j?6Vg_vhfְ.1g3(uXlӽ[ݼFओW['w.yI h<2nS{_@viD]_3)mش,N,V`.׹EH-5j0#Hv`~@历hL[23(Z⎔v%yE+{;Å/5rszT{l&#縨N5ۨ%>LI~8v Uc ~eisb2y yS1B oNl3?K5鿫Wdnc*/HV["PQ5 kEj![)!-l07noO6")\͞s&rqr2~A%F: *m$_N_~~ז4Nci#C onޘh14%ƆK饦Nl=97fqFC;1 ?`Nje%UPL/Z)twkشIPVn]KSh,/8q|Oi6wb>F;ׯ&'j-FD]Ȅ=B贩2.oT)Q@X&ˆv_ˬ0n>Sm)q3_`)pqS7'v[8i=A3;І ,JnW˶ԭo#R 7'K SmLɣ$ΣA,}O?*}xwY)nv2ҝ!T;q ܚ@YYiر ሯT7)oUOgt 4CI1뇹&<7 xoƂ~O۰!ZmB*%br O/J'.}٩bSٔ?)elekELe$0+1Ōh$L-e~|QemV6zW#4o,ϡgQ _1;}~tݞ7<촯>h%K-%iT3:D5c2uC3͚5v$p8&Ӎ')VN*8zfEA'n2S)pЛ1XKRLδXo8;,BrؚKӚ%FCZC&1IrYUھ4Bn-L0:"J 69wM񲟸/ȹ+ L!ugLVLθ FS۱G"(ขt -ÓwX2""Wк'$>1^  " PF*U ylC =P{t/!tB^09cݧeWR,1S2+kK^["2Si1MiC2 'Qo  L{OQDA7 {Pz7RwGO Zkn0kA.+¬M@wX>LfWgR>p/[r}ނc >#ʾ _=N`-= aD&(M<3/%p>?5ch8X pV ߇{Di.\;Le^WJx${3ԕ!qP"}w7RMe?9T~tžMc_(Š b?-*-.yG + #.z&\2-q09iG}jnWo4? v(ޅڛJ08a | ҍ=A9O9S@;=,M AjC%;]Eנ:0[t MJ+QING^__9V@p/kݴѹ}et7BZIe%I9Z )9uIpK <:02  $ D+cJlllmÏǚ+U*5N؅f (b=?#4P'byrTIBJ(DK(( 1p|$a:֚?q'@lFZ@CJ&PM<`]FtIӀXxcF-?eKtI!Q֭ m'0cAP56"ktCWURXyC颉l@ ŲxZ$b_*k(em%P&P͉ԓA~eS7l b"s=0*0{#[t8,>ZQ=B %B>o7-KJZP84:cCGQCyd RHw'Q=s&,k* (Fq9˜ k:Jn3ALt?/8zQ~i..~SjPElh&>Ƽ6fĩG_%[E~3ƹ Xe:sC: S}c%PM@vu[M(ʝ@ ɋ@ dJ)3 l-FVn@ALQ)|=jJ 1CNS(,4K ROsxz6ڎa"OaE /֓XȾ ̊SNH\m.uRz>x{2$?FC,s}kB SFRslA ;%\g /9}\ndK6< ;ђi,֭E͋'=G]}mY[C5r,;wlՒ$՞'~ȲȻh&S&n܈[j m74 %4.-JMʐ@hi<!'zAe)F&ohJDn6?b%oʍw ?6RNY#^ot 5he!>E5'8[}M1e$ՙ󞢈^YW8Ӷ'gisAswqmC&ĨP&p'սvgwcP*letH݅Q- 3>a[2+ܳ-_o|N ҽ G}f GUaC)Ms?|*Dƣ*a`xmiY#R_-nApYڈGi7oVDV|O*\*?u'ꎩ>AZC@I碻 S&0l|&!rMD)N߀1&g !d+J-_ m?tO8u9lM6B\B~PY2m.}Bo,紼,A,4&aE*yq!˷4aa]r.$JNǛ^xq9{5RD.+]9q4bڕy@gU&#PP'T3&wܣ(bD1ߓ- zq#<0 ~j~~JbU0n ( aFJPe{Xo֯]z7JJOUpK0>vl~_RL]9Q(WL|RU`C* _lGpk15fzcZB\?^s=xT?t{?^l!6)EmE4܏r<7#?ȁl$k'mE[j4:SycqS48+_jaDmJyi|EnU̍}mxnLn\"N>*>*-HXmxt4 ?.nJNP-Il;X%E1GYG*VkXy(LH;[ԻsL%jh<rWϴxs.sKw _ovn'i'.1 G '|Yٰ<4W:0f.c=u#s;s;hojZ[ȳ"[D.{WhZ,[Ŵƛ吋\7Ѣ3l"|';Y0 K֍b`$$^eS..hn#J2m&&  \ 8O…gG VՌPO9jԾ8fH-e4uB㌎'a9bIw2=2B |2W][z971z{Lǩ(:vTynT_ ū/zh+'7@ [r~?] p StsJ:‹MPReyvDRbLjsӄe=63''F!W0߀}_Lߐs^ȕ,FGeR8Нnn> h Ap_@߾bcQ֨)ژ&x{# Rȸ&"{oG[]I 5 |w%(J]gRgII=Lf7YI= 㛥1 MD7cZ2²* H̴ ك]B3_+[kdWPѓ|X!xZ(\ ABQ4n͔!%|0}N#5t Hqmu; -bdAngNj bn,\ztryl6WsiZOx \M3>H/I k-}3/mWV'0(Jԭ]uMT"Hd5S<0p~7MAEp3_v|^[,ud&Hh7ITs\DXׂSZ9F2ϔD1a.GL|vOZo} "h W2w{;)ӭ@++U:JiyJ3Qk%\d#7%˟fiș6}g˝y^4!^ʕfyd*\&Ѥ^m]x7{dLܥ!]AcSo@Uh/|^KV4>@P 8+ա؁ƎCڢyK9-)G8s6qh=Ɔ;PEX&i(SH1#;2Kh*'Լ${ϑez[R(v!zV;4/D)hX(_ -衼vk-ƾXȑ ykoo)_H13ЧݠdjK&imD,ېj_sok9TP`#߱0<{"&Vp<J= ~ ZCFml@#PBvs7mQD5lģ@UP~3-}=SA/·u"vϵ%$zr\2Cr R\o*o.uZxzj+˴^Y4T zæ"fo 1.[bV{Y{ftLSu cxżL"P٧.0ϺS0fS3O;$1FƆN0NnJͺceuiqB0ƧO"f Z,/+A" yܛ6>*b[^Z^V4<-=-|=sH>[_MkW=CPyx͕@ܗ!SSE(G%5u u( CGtO.C[>R&|ÓWDThz2-Ӵ"/RUwWh5{d ̑m&m> -Sf5ࡒW@!k+TuA+Pe>% />2:B.RWT*H.s.aH{*XdZ3RL4:C{3W ťHHS7Jj, ŵ "8X"Z<࣒$j<:<\Hoz !ZH -&CD vtJ=/s&mϖn,(C}48H qL/jb:t Z\ fV2{g"Y|f+2zԷfh [WR` :zIkh?ndzW ]8q o;a7<ڝȍ]3tWĀ*yE]bNV. թlQu|Wӯ;((WM;1FdQ!T`,M%pRehw-NpkټRsprZgFڞpǜ!;+bTО+EL? z2Bn*&nkL葂rxoPMX/0K5s"h'3J,<iF'bכL@U^Ɩ]ӨG.LS+1dG<ϾSh>tX zV55m},a_묳< \Exdq~/ 'BH(]&^PL3Ŝ=%OG'q8٠cYdA0* Hs:Xg-:a dY>`!rL9p6l#-SE!Wq/ў+KGej浽+'|H@O43' z^fP yAs'5Q&I-/7 v@feyA$dF0fMB4N;x|e_ځ~yDNOkePY9z$]ٛ L6"0"zKX@%.)Ԏu.#r,*XTApx0Hn?9R=;oRWiwEMB|ykrp1t-3׼ITx+fb(\@G&cKsx0B|6ԻYcՀP rF/++,+Q'W {OB݊D _^XoE H)8Anyf kW`uWȐ8r\idùxJuTKw c$ڔ5'߰,h~NM)t(ݝan|W1Nd{Lzӝ{QL`X;wwl;i]MքT -Z׶m۶m۶m۶m۶m5vsnDՍ_wk=_cS|uR)hVcS_(q#g0w'bUo^v֧{>1ʿ"mQD.zSZC?=8̸H8'Ѧ=]T^ uS`B$S:by7RV:v`6гin>E6|͹Ҧ6n2]rn[Շ_kzp51k30Z6KZ QKz. &tM595 Y3~X91+/<19xUzHMDsJ瞙;1ӹ/huH7c;519=@1=lw^[Ep>6I,}X믏S0nT3Γ_jJx0ezY ̋|w|;^ 'f-tcê]d*MG$iu?|wVYﭦ?=}W-MDón ! Uv)n&ۦku*>mɹtxcuYù_L/'P-ca<=:$F}&skxQ9>*y^;1 (M.(O̚H[fi-ztH[fSMfnu=bY$\`)qE=BWfH~ܣCIj=O6N>]:{$ݏg*O_##q")VU[.}c-}1ȗ]F&qɉdWN[Y 9\+ɹ8 k}@}*qP!K(!{4iBuGSvUu|pg!{_&ؼ8C*cȥOyoHG_~Z: kSsY@Ps <]G,oZ~䘸_9b.XfzOm5^/Qi1:P3%E6~y=ҨsҝXo +h8iTGom |-KC\nIe&=x3P1BF/*e G_l&n^ 珔+ڂp@0=E t{ߢT-c;&LYy^V?gK3h!z]*T\ yě݃ཁsE59blr9#&oXкJ9ܙnQR-Bkac"kOoaf_2ܐ*K?{&qXێ\fBB(#Ӟ+1q t9y깎APC[{(DId.F@# vu,,tg-{w#~O- vE A?͠B%?~g>dGNU9kNJΞY1dMcœF.:Ɓ8W4 npվLxV8rց/Y!v:N/j!Nj0_Ig$ݭxME?㚴6 [ƁsYgqz;VxF<Ɵv󎊬 ;5S)q}0>ʅ@l5ɓX=iʠ X7R 1gwymx@lJlE[28Wн0X6*7`~`>ξ&,ъ n(cOEN }BBVNSAIL{'r!-6 f4=U 3~AgMVf㚢Zx'YfkA'tTցi{IG5VX=>E#%d^ X'5O`]?ְr棣fC_|.v, G z|{=>cZ<'x%ņ3N*>㔊)dC0)WV)~&|oV<O`_iuEɶ3\07%Ize‰FSVU 'nnA9I牲\ueᦗ-),ޏ"e8z̏"y'Xh4Fw>LimaRɻy:!C-[=bO aΓIVUϟ]1(7QHd7l!@O 9G!M0JTlAu2)˳%}N>:3ؑJJ+z8PcBU GFfMp)p]sFMwS. }ɩ֌ylz@bƝ2%y5 D:/j5΍]/VH`Fdm$SvMv:.Y MB ^p &TP@Fk6dN]SjXh43Kk!C7Ս+{IІu{x/BqP 㭻;KV4v sJ5 X;8U\$U@J+®VqK!t0TqRB<Ř)1ar4P[k4( /RNBӞ:uM`}=o*yƳ{ƥEDD?®iH*v9p*n֎b$UȞS홄a!wjO$ZLԃ{m6ERQogDֲ{VtuGHI^5EIT&d6③+mI|QѪ_=(P `r T>+r:oh[(Ux[\,`Fr ihsYR,ZjCC/ڝ"$(r *G[o6?` x2Zķ+GWՓXG+q"L.ܒHdXµOKf>[g#P&g"?e;P7Eg;&NBz@rD6'2=qδ)L=^9`X "%TPU4N_K8 ÏxEp/,zK8'K&Hޭmۤy(;ڌ+?>xB}uعkkrFWpd!촰{ Μ`K,!w_K׍C)eL$U9Y"Y,;.;z%08rU[,H!0Uf~?52>C}"APO:ZDu0 O|pMWe]o&T9`?:T$a&C)5] '玫?aGvJH:8)ެ!{Xo_{ca.5,'B䏔G{5ygۑ&SL4p9w5(hV/a1{cԿ@^+ X}8D40>aj!*Tb8X}'ݨҞ<:[!s'qP$waAJV~E-Ӿ=a?ht殮Ў/Oj)r8b+as7N]`'q7&f$fNK^ށ/~D v%Xڗ`;ae %s_R%Ke&LhcD(6q$8IeӡSO5՛ٔ* Z{ܡ28 gR8Nސh\?;Q4DU~-}՘i:bmBUG<'},&Ϯh C!Do"qޟΫaSHܿ.!3bXZqp #!PTclW`y'6@} amD+Ț؍ft͉u+US*^2\*\~DwIvGH>ƳXfvQA~VUolqP|mm= SQ(xw|?w>>5Y?{|=忠 GK!HId PH܂z1ņ)fق*^eҢkm\.#j- :xe̒|@-b3*H#uh#f +B k6 8&l@l2NGNI #2=}Й;m&Q Y 1rCruTH҆U=eJyOnҙ٢lj&ImQz` M_i-mT(a:RH'(ug媲dMVV6S ue RWJ];lu.IhX li$=0[60d5#_ViI)`Hfg*V'Hg8V2;#KF݂l`r}Shq 0x;dh#@WŽ#10\sRD<>G!| ~ DX版1 {ϸ}8{?8=0ٙˆ37$Aӱ&a̐Ç0HL\aKd)^Abcy%!%o? !_moxmW$S&[UF 46Tupnr S2\x<0hgG]ĝ8zŸI645a\-5TM`*j7Ń`SHi'J aIB3V㤷>di\daj'}cmtKpwbj;U^͕-ۍW`pm +˲YS BƦ)>Ph\8cPB,s+*™ J3 Iub@,Bv@^\6 2 #YV(?8׊̍rB79 䂟V/LB1S\`M;z0=puz0Ʒ ٍmF|ѺlԾQv!GD7>svD]vplPqZ"7diF*tWCF?u #^ 6@Eal6 #x*6xBGoQBQa PxjcS jPQ=>OI>5=$-SUO>9Tڄ`>-Sw2rhz̧Bk})ߧz WVo>DW)S\bU]AZ(+Zn`TH3(*(/y*j7{Ὢ"m^ztAWj_xss+%? 4(f;2=I^z ?4"8ZSyCo!ahk/Dq/]{A~SlaD#兺bZŒW[a$6c^&`>b}nYB?ʓTM@UB/Rԡ@NU Gp)k.DC9.C94]u*E剒7v4=RXixdžXE Ϧ#/ȁӔ-߾f>t g&~7iKzm Y{_B jB)-Z*9 "%|%ifZJ v ۈ YiDFBp33'`뻿r𣀳f:P)'4|2TcZZ#n‰&yQ? V1fYhꉝ!'.L/un<Sy1':c n\] ~>REd:tWhjݲ#Q2xa|Tʔ o~ ~4h|fyRn}_];4=gdiE70X7L"*_9=h/.Əyܭ0݀ddZ[)9{S!dKh0=ʸn]SeZኼSU$J$ld /O_ gq] unݢGpC IYG1C6p"CHt l}qKlGyB{E9?>¹!||92|8H^J$maKp7ϾG!2jA ybsAXEtjd# FAtL=ʓ܀Հ4u56 U176B*4m{|ݘFҀ} irn_W8u 3brDu^8AHX3?_s#~遹~d6؃{7r'،LHh#g|[1ވcRXh6n=ZYN1{TGġ=HGfX|DCf||$1#H>=b|ݽ]e@G'>jG;>zx_|J[3=3)J|*#u)Jգ)_}N?޷f{o@iB -&U ()a!e|ߢ=TSo0hU8@ .+ F\ F i.(FZd5] h˫#, =h (+" _*+"_Ŝ>x U4B4-h4F$4DVӞ8TjqSEJti&х&Mp;Ʃ$0iUUNA(9>+`]R FyR2 *TP%^83/iH&ttx G us)`=MMF 1W 6ZQȐn؛f(oT#ܝn^t:,DR-J71gy3ΗIbG$Xǣزdւ%AgMm(2_?PZ|2?_^K[27b4|ws%hr`mR[lx-6hrwk=\_ʝ(uYGkov4m;+">s 6 O[-Qf{TBسhV{q8hR sadZ٫|i-X- yYSaʐmTH #.gLL%iT` $_fynwIWWA!;mx^a)f6ϳ8_,:ԡ..apY2Nߝ͈hy<ݛ : ) ahmpٶ)+*IwޭW9N+-Y/]Ʀe맲ҰK=1tU6 R=H.\eO ]~|O|00[G)HwHHwxL8s<"چO`s 0"hquf\xz׆Z+ gUXwI|Hן{cc!)y#1%B9MDsd ԿOϊݴ6 wCCp$ *G?bbx+kh}%1~Ub43e<_/ uHU_ Bb0AR!5HR@ Fیx2lZ45V)2(SD+k*V%//73I!&B޿?o~{JqR Ù@4Ӻ#˸u LXw5b)CZ ^ lc"q #Du?"(0Hشq&&S:q4^Yc uW@4Q BS` /0cAˆĩ)cXS)O"(:yH);P0`6:u$f75C=.%*Ͱ([7T~\$WY ErPXќ;^3PaZ'}G#Otؘ(X8H\ʳF5@@\ Sy!hAO"Xn콧5f.V%"V99ÉCA&sz&x RSgkl䰊0c_ԧMN4]{N=\ f5z񜌱TVSMaU3i1XTaO^DV0΂?Q*Ro@smw"U !ུ7Dzr %ڡTSOJS,}zUɩliuTl)+6tS:r>y*:S#Rz+0Ptsݫ xCjE m;yhƳYx8kȼUʓ%" tZ_>rJ Ŭ4S:/74祖?^>NF/tvkkNŏ؋ij a!j=~vk̠ 31lLOsʼ[MeA6m6FXjVks/je4ְ`Q, e奜ax$)%ҵuSk߫)k,2\SVhލAhG^@[8J8] )E&bŕ-}qf:t/*Ԝ\e|ӨU򕷷IM&Xsnz+H}q&|#8ʆip>|*=APt Z$ӨoŏưZb/D2ҟ(rΕ LW*a2K%l7!~6GH}*)5ad) p従.׵)'Y(1W Ϭ'ݸzpYY~#U@SԮe~͟K5 F0kȇ?aDZ]ƓȄO_Lmy-㯷_)/aXM/$u+a^$DcS^ /0GUL+ PpELLcF\鍸'dލb'-ZJQ c($bZ#?<؉zG5r )mHe}斮>Q.l.ѐ[-"k+n+Ib*MJ 1h=ݹ qfwsiqe.iHi8ӯzEl(h9S/B{4,&nՌ\g(gA( }AD2$ELzdE[26d\y)I]Y)M仄N*%H]S%r pٴV&!6'iʄ]&8G^JPMIyBvSc;Tۘ*YԩЧ8T oqTTC 暤B P@=9Ď!rT#{~&|8́iT لgqp'Rv+w`empx⮀ uD]څ.GĜ _Q=2Zyö=.xg8'*#&c#8Of.T?;*|ř6P3Ԯ%H_n Պ`7Im^T j}C7a3.}_Ũ ? *)ͥ-#qb;JOvFeU3Xm>&j))- v#pS޶ Bli9]RcptǪpvS4Ywc&QSN6D㌚Bz!̤|,J,iX?[㚚{n\Dkni?ns+qgyDߘ+dd{N`7f}T6&CNLC>>c_܉Ra/X'/6 Sni070WoMX8S0wt{cO0ox`nލүO4pS8J#&y`֤Lo`Ls=\"mߝh.7d77OIʭ3-g%ZPXJZ HjȢ+%)da,OJ3$ .L[j K–DcG4E'gO:y{wV ;@jwaˎy%㿽 mcc#Fpj8o@ٳc)ca_^ tl&Rlyh 2=o?i[qNw>UT?k*􉐘A+3$E ,xW![8~-- 9]GfXzÊ/5Cjd4&""+gehK$sjRXD"EX?! \jظٰ*&1¹0:-f̬>vIbL9ΰD*\Z䚢TwZc9C\q68+3SkSkwI޹M.^ 8f!g/6cD1h TȊ/Vb~"„65;հj_&xmj  %s3kgAPgak1CH#I<ג.H]V LȐՠre+GrWbMۓߚsXn,O@zw@o8\CӴ$/+<֮{07ou٧BŮײڭx lO\'/ @߬f^ ޸׃"q;:/o5ı Yon1x)}\yN=ٳyCݳy*y<!Ŷ "qh"Śv#da%֞=Z!bC$yC{v:2d!o0R]VN"8QG~]c&ᬌ9ZP2ܺhL#2K3*2 &Kcؿ LhTrD;yO?hSO9lƴx9U`+DN W&c9QOsʷYi/_97 [33F}NQ?iKB߯ VfG|TyFp(&O>e\Tb1s+ #HF3b@Ҝde+lC_֗pɡZǃt5h<\VJhB8 FK=`s\W8|#ڳ i m@+VHJYWB-4cПo,̰% ѿ -;|8Ms7w,pλ ϹD<z0vZL!'eM7psY->w9iLj+nQ97O5L~HrP|i0TIf/@} 9!Z}^"SknPA[3?nXz%:s,%iQ0N% %I@'{2$Ԉ黡C5&#h餯HFt v;"+֩N*(ZؐAN َWʓ8]&$8voKw(f/tCaR9洸Mֵ=.?oE,.1A<bR)abkAM-^q2!"ղKCGڋ^!tP~931F'6fk'0u~F9'p#bOq:Kt3ۍC"OD9qG̙TbRaxC9ZH{IUB4iPW#s1BFJ yµ69,0`aWh!}5RfhenDńrOyyCn!wz=)a$k\Kf8$8C5sU-tSLņ-0j@׻jԖQ#?ݎx-Zo}X4uUߩTWWX{0.;ap<˃U+kEsbyy#_m='}6I6uSs䮀 !k Q P473P~qR~]zS$摈)F#d=5ߔ-޸-9lCp^~W-蓝b'j'^wC5EC!bxKS_X?;;X'O? w,78>t&1ES ߱8-Lտ @qF)H2MȨlI;UbWO)%KZvn&mo&OEUrr]eoJtф*NQ|yP _cޔX43G&*$2H=FY榻j^Qv}HE&NK 98m O;!88)',]Ma{̩̉Pe%RfɽfXJ'7uKxiX )M(0nRhz-FH߹jymb'E /VncE\t>Ki&"W'[y{ .Ck\ZL@*Ygg8i_.: $7 ^_deeZOx"]5.J@%U0eJȃq@ (KjNr5K8xMD<#PRZU̩IzӟT-dD"(@-SERE٨'8denjŲ#A$IDñ`"aGCb44q$ ikFcW ,VT9Yp;wLA1.HUlKARV52#.3,/"" T$maN>ӏZ3͊[/"= r#3XԲ$M&srZf$+^v|膅ph ]q$˫%bD|:3([TZR4+KIк"Lñ׀NPX qT>ֻMsXGk3 D6$%z.yB`D26O9 [AojdFC= O Б?F0Z$$RcM-̪M%cBϦ6$S jʪl6[Mր;ke#bK 8fcC.#"nsek7ߋGaki/0N[%%%-) ]"-gZx)*WMk-6ZV=0Vj:c閴%g8CcTuC1j9X2zjv62ftFHy|6 a y M"{UF&9վdz2ydU(B%cNal4`#岃*䱾IJeOz),6UyքB4zIKgo#]Tē2G@6Gl;XbcTMS5t>6(KQtd8'Ow:)%-'7jSŞso.LYfԑ!<;M"&@yM6BS`p~0@ &!^ؠY;qSQ(n#/ہGn2`(GM[2Dws5^VpZ {Qao107v+4BHdnfff/'tenƎBQ/D OOP=jYCS;aՍ1/k! Xp AU+J hKB }=h/K4*O3d'|>䆹4pl΄ q9҃l_6p/o9pEҗ HmdPlchC:)+I ʕܒfa,ԽY}?id?h5:/r(i%2mAImx#t܍JĮh,) ACjt} ;S۰snu3o¿< q'|F~0ӿOq7}Ngb@63S)tVBvhܚw -垦mX/LX/~\'n^[ {&r[4>i_ ?uӾN~~~Qf5O;=F?>p̢`wGU/Wo#GsOWED|JE%y'},Yo_ ݣ[L7Md{?'=Љ_7s/ag *]n_1H`b)iI4qc|!VMXl!]OfS{z=M@qG:bzL -PZ3}Fɐ"zWt{ --y﬉D#e-D{PU#Κӫ[k~ݐ{u#mn<w0v(6d(`~PZn('~AjlnKqŵCf@6Gى-!_cn ͑-v-}KIߠA0 >1Ȱ 0C"5<~wnyVмNc5]_>'y!-._f #WwqMV|4-&ɘjĺmF8X a)<# (ܨGJ@űgj`*G- cߛ~QD#<"wsϿȗ4qaf0O6E_DG_qXA{_Q=~3"5 YF+[0\9ChbRP/Ip " Qє@f.4!"m:Ĕ{tu?8_cP[:މ^_~ov$e~(%NpGFI(E)I}C1ukhd&Y׸nk^YLVeI*%g| y&2)?p+E'O7ؤ v \*vʬ6kPc_Ha)ۥRфχkff3Hٍ#h]HLkҗu-i7i X|[Meg^:?SPp כ# x /2e}!-XkYqD"8 Qj0L,!]@DNt}ͻrUI4pGŔY5'!CъV A$,{TkW87; hrd,*`Og" Ad(񟄎<=Rg V T8;XŅ'Lg(g5}1 &SHEZZfvbԸBuƫ? ?JaLv82ba1C"!}X%vbz|Hc X1\kߴh'9%uQRwZv[amѼUgBVuQO T@FBU +'@~i"H'n:$^@փbzBW|N2Α7x o >тͱ&$~_]:2*uPղqN![&f$n˔Ljd{;v(s<HU 6WȌO:MqrF%#rҎ9 XJ7YljW-uД ZX* 5qQ6L*÷H,1"k(#޲y|g  {;ZT#W큵/t;XBT%b;c P5EiS0nUu;L6?"@DBC?4gC;{{JdgA 3HEЄp :RbEdE @YAWpײfU۶JGzi=Y i9˙߯/Lz|.#~L6W=Se*TQy24M|'0L =DnN wp'FnG[߻q gG/12"/C/3HyτQ09)N`J, U9PdJ#LµZQZ%Lj?]]v/(Z}30/И(`gFhD*'c"tI!б2b9eLf-2i=5-E78cUHF8F=O|1B,gPTF'^ y*$/`Etԅ3Ȅ%Qr}nOX0,DT5dBq2㋥Re81Ɉ2ŜXhdH#tRsl> KWRp3 NuWz {QIN}X5I1;ԙhqvNB%8n- 'cEϨ.p\ESI NoM%ķy*nMMW:#ʰF41:&hw#Lqqz˛-K!"ڶ-^v(Cq!s;2Rlݛc>YspOݹzSrR4W[s:M#Em7w ^.= {)uOh~"3߰7by/cjM$tѿ*IqbIpgG޵K\[.0tzd<&nZpHZ*$C*;F$:B̡ejřVGM(mQyid2?A`GJ?=qxg1A+R3Km9dr:$#.zN.a~QH{'f+`2'^6u MQomǸoj'3I&~@oW#K6-x{P~j,[;AUԧՃpDҤ>Ȗ]5\ܖ-'S41p (48-mT4kf8UxL'fv [0&S\O'aOnKK bxũ ; Ř=Ebp3G [7]}Ny~HX Zg vRQ /rz)20t2}$2%1vT%=[O~zUWh_F]5H2wc7湳uƑ`} Bvv6l;Zڲ *Sd4h nSĻkڱ5q'`!; OMvv+nd(h'Ժ(bU;hac+"Z] =dShc.hNgOcGcfA7Y؁d܀3F3 ӑ*_ V7hN_⛃?*vh\o7B+uh XυʩS~ ϝ2Vr~{vP:R;bS7|E\ -zrȑ E 4灳K"9uFm!/M3957;*"u:3n'ٍr=ڑْ/"Ub#wבX*dqҪԂɿZf攟_柴)nRT^zYup*+wX#/FWv[UZe&ڥŮt7ʒ!fUNcwe1`SRrC3N6Bvskhjܟoo7x˦ {x)Tu 9q R] 9q R]`!}˶ɖom|2Qf\b95RI#ɭɕbGo6M'JJ&_-ҡ6;6taMIfcc8w?Tg2y.!o !E)'.E:7aGNUDn#{:KŘ DAt@uiן#_vwL\ 3Ls*둆~/*s3#sPSxVfN&>p (6Qr0ҬG$F&ܥՓ0#Q%bڒÕZn;8}=+1Sa/ALZdqIB6pKk vl vԀSv 8+2*d*ְQ5 zF)( v reɏn gE֕tϴ+: OANw% aЪJ)[E`FN){μZ{5JU{Ǖ߽KZtʩUV-\iUV oUW^YQOYqww9kB \MJ ]Ʀ(箶 YuRaYA{oS丼B6+*8!p?Zk@±*:‹Z9M#Л8e!pcajB[>Jj# _k 4VK/j瀬&i|I$@aLYCCŐ09Q56]?k/R#Jݶjk]nmڨZ_wٓ&I2??Ͼ9{|"/huݵm+nŏUkq%G[e:{Cí6gsbQzu`@$]G&T8ҤǓm#Nj`YƼCE=>S! :?`s̐ɟ?bBCD)wu@kԦ;[`l&KLI.čVGaRM4=KfVcv&ܘqN3Fnؔ֡ jL2iR"FUn pf~0k~*ƙzsu4 U+pPC.+A QOv`Dq*lΪvUrZd \kӋa*&J+Zݷ#ERU1|66[bql-z"v2X|j^v-lp`@ҷ!I;<* iݠ\cps VvW)5#Wvtgqf[ެ-gd\Z̋mkh:,IԲZV;WTAdLS*(0cs. ~K!fWtz43TSD*v!jń~=<.V4r&o.(]]0}*'rhy9j_cޜ^gmņiWcDbN"q#sGPmp##AIo4JOr XY&H|nAsh?h!VO$r C$k)fd)?sO1v&͒ P!զ 5в@]TW5uvz;}K_y$-MiC2J'Qڤke(kBC8&0Sse@AKw&9JW*T`'=%iq'%>6K(=5Fډ\*VxY#H]ʔ!fg4sbI}ūk֐c668\\Ê&H LTFBxafJ& u ?]s0j~SdR+9}+c.ve L {b"Fg*C pッLwg7冪HwzyىG }FMZaJM=cu$W%6D?!pt~ǘ9G4M6LI@]z";4L3*cb]h7MbJ2yqJba|CVƨmW #AZ;<|}S4ndqmY4Rrj6@AdYVo*&ps̙;fʢô!oR̜ڬGڴ-wқwtgɊHn+%,%'hMKfzؓbnƲO9+#,JC](-UVsY]#pDO8aܥ eΙ(` qpCbbͯVM\$r'mmxx=[ `-%P8A3/7jr!G>]i(rW(GTqf=OJ;/iR}X2T}sE-bz*ꖛ($Xg$S[4 kϩ"vJr7ͯ[Jeq||5og]ҊbZgXWBel[~;Y ]5mQLͥ+GL]aONt1Mc}dqഎ.=1ąQ)c5䢘K^€.P4H?̓%9üi zBx8wtEQ,W&O% g8T\qʬ񈱆/JLO)m;p}~Jy7©̊v@LfE93.8T햢ÍKQkW+I:R{C&6#ځ^gZw._4^ߖ+W Sm H$R˙!х8xp<{I}grܲv2%n[ xP`K]\Re?Cl,{ޘ?P rSh؎O2dž`7,7#z.CDJUۤ y?)~foiOGA{{v^Y'p_yl?:OŁr0FWpԱM;}1ّ^?$Nif|;$=\k̏M!;N3o(fjt݊~gf/KkTrͼ9SYw{~7F? XEC3SVx}3u%_`5'e 8>b{U Y#Ρ'8yKqU` S4X!O xhgLQou3~,uVԨg>߿xgZi$KJ% /=I}q$0rԗm$i%m%GE~XWTWEP *{#0W=EqEkDdES;jΛLdMqӌi4g'3-8OSBq o; ܻgw]D-s Li&bB. %7d1ǘ9{6F5+tbo8yØ1K~ Zs%cUl\z>qɐ!eBS` RI%7t8pu5EaFs(cyƐ 8Laф1wtc`́'a?1xƜ Su!WarpX9uFҚ 3vӍT uA<`e+^^';7  Pc. kIX?LHp6հ)}4f]T֝?A)eʛАVfO}qUN0vmg,XB̾/vʬ7\斝n+/Vb[ezfћ`dԝ.Kἧi;G?E}XLK[nE{ۃy:xTAlP.~PIĢ="&-TLsLǹYm*Qj<jJ]:3ΆY&NTh3ܴtK+̙҅~' qDu3"oљ7V ӮHKkFe<C:93è Y[%L3GƟ h,GycaCtGe6l>;n Ym;5OEvu8EuecE1[ɡeU1HA+͆h؇PѺWhʃNjlY^pMgD/D_w&uXYct'k6vҶ#wXW43k84.8ksڰkd*7dՇZhw(f`ŵky8 r4=Ű&HZCERCg TWiVrstZ11Cۑۙv7]؇:>p@ſ4u2t2$T JȂ(˵mxP}nCTڑXQ1. v̹K"RE=ʹ"79ZXa{?ć^:EԮ;a(z[xf$iG[Gy'jX)Ta*u~6si¸[\&t4X&&o?9Q0hb[BK0d1!d/)l/]8Ϧ|I2Yzx72sXe6-w^?_[gpga@‚҅0-0ͤKsk9b>}]0۹_ccW;K }b#TCF/ud7*<&bOrw\k\\sre6i)swH,Zoa:H^Q`Fy:[yiN͎jՏ$v$ 1j>~کp )=AUpQ%2 T#Jo/pj7HYakxucj迻6!}TV_8{gd \5B$BBT `L2#Ӣ+]5Q* *4mkw[ժմrz2<~y#v=^g(#)$U׷% peG jZ[@tJU _#QI4+\6ɋ^迁88G%0{,s,5ވB́I8c`+, .N %!"͢=gMs`3Hf;V75-4$DKp)XjTy.u7OGe_z;tu,IQ+BXh ԮWcSW]JyB>"ԃ=ZJ-عxd*[q{:IKTe\/afÆsdJ<-j3s8njˁ$'#>g&^-L1)Cr7gA:RR聖7d ic$jv6ZLUKYSċ s: w`v]o̵9PnL'3_PvM*ĕ"GOkG? 6Ӝ̅~ ]N6DMn؆5r2y |V94,/Μ!K2﯃d:7- B9؟< tu$T*j&=/!kё,صNtBD`ƸNC6eGo޼Y8KI'XEihyCa6a4T:3y5R<4Guq6Hd")u VgQBɨlB{an \Z+ lTM QdhFX?Ct]_m=@a0[=iM &FCg:U㉰TX\8(\X67Idͩ2o'`v(WgX5Ƚ|Iƅ"4FH8KoFq"w*u[wp=B,haAMM`iڹĥ8C𝍈'XZȐNO8aى Gr.'پ XKS"͹>U76U#E|}'"i1 qK묉1U;7Lj¾lHHɐ⣝ܖQӇ#ZOgyO<#ߡ*cz 6s]i1.PIv붮SDY7ˢJ ?Wk`b~,ᝦBW:C2Bm^A~bcydBK(63֌kn)`3@VgVG#҅~, n 2*jsMD7:ȹ(qVJE$'sbd7Z-lH'y8)k')>DZqWhވHxFsTwo'\*sMfyJŹTBջ3;74#uiy\Ln UK@UKMŦA8HP9seNy ֒m 8+Mm6T {uÀ«`eĜeEUc^ۊS1cFQ"|kTGJ^E { m s擢ң[ oGJ&2,$)2JM|$}$īR]¦piUgZ#Wi<El&˴$6?Mp֖g N :rGM J, CsMC?s 2Z$jJb/юD8/rg/%CYRק3TSz%Cnh6C}W81tIfzTq(b1xk-] ˶m6e۶m[m۶m۶oc{nwU#1j֬|2"gdF&zD5;/91  r7#X4@'* ubY D%>sgxz&gȉ(GK%wR)ia?XͼjPW9oT?>hW j H&xl2bz:<mLU;̃TTA=j6:h#~eO꿵`;b.ݽq*6HUP~olxQӈ?!u-lH:W@EjJ3KP T腩jAYޮtZ%wA v} ܪ+ ݺ(cf+}}&kύ|;!>Lwq}f+' v}~nLX\/DY@|оձϣ3f=t 55 GFԟJmo8i9Ccfq5%w0oZe Se1w (1GPNbYT;Năl^`*׾ml8|: [opHЀ ʥLPL>6mSߘRxEciou :sZXN2!}2>:@ 3,xy1OmRv݁HSuKAվfo=܎~uySh%+ЮU+n˚Uu7~딾r:x2DMGI'Wy&GZ_5>15>չfs~Ck'^^wv v ~tOu|AǷ榛vԯw0G\Z.slҝ=|ɺǯ^<'YgB`~ݴ|Z;.QʑM}̷25D?6~} LKnfZ=u&afcq#2 /b {3s; ^]ϸWv'<<]jYϾudyNƴ?  7I[8F:dp4ȩ=i؃m3a_T/;k\1HU3I0O T[iKРunWuqG'' ˁй'95)L!i1jkF^|q ]#:DwMCw=8*.B0#+ Vվl?Gn}_"&_]EP9yƑɰ9;aj(j DC1OD wa M4J\Yײ/xE/ZHω&QZ<\ui u_bw?(JY p8l,E2  _K?8{ <܀畁rҹ}jx纑:7=/$Y؅ T~{/(jf!ØUg2j1diWzΑ~X\d-:(?R !*’5vt#f86u!6jb,BEQA6*xL[]j={-F _#*e)T?ti$ !۟Oqv_7\vI5p1B37;ni5r` r` vwW rݎ=Ht=\| =x|#ݏq8d-N;dA-|Û>z+8|o[f[Tyg+e;dw&{$te2D~άZ`$T\PwQrv rQ-TF]Ac{:/`xJbC-8+yx:{u~Z vJg8zNp&U:Ā㞉^Ke_7|orWA AiߍAzHbn4Xr 'juyÖ&\6`S~<ysh%_Crh|8&07Y%MγJ}::ɍ$|cu }F;s dGX Y_;AͶnI9Iy8(>rl&Fїyn=K {D,~3W6_70xtQY't%R Mc@B B%} j ݁8*iZEza(v-Yq >1tsJ,{uڗ[I9sNlCbVV\>&C.o3{)Һy.=+@ jtSߙ g8Emby>$&9=Zm A-]8{mׅ[}mN + ;mxS˭_4 H=0M}e@OœFGF#:gߪ&xU {TABvT@+c<>dXc>qxҶ7$@h=%ƓA$A7p'TT\6ibXa[ILWA^ ͛" 0f5w ahߜߑ]2)\qߙHҾݜs XY xWF;,qCb>c Bc]M=F{-g}"񘣮Uo@nN@kYdͿ|cJUi8b#F 'ٴM2;_q揳%,B GU9)Fz; *[ʯmA(pCBQ W̿vlJZ;$oRA3YQQ-e@#v~ (`BI .7gӀKQy2֍g!W?6(; Pt-3<eו^};ND=u*RApzpJf7iq^RpA)p5>V_q<?av d-݃xjz2-3}}?4so֗1: gZߌA3!|׸sL :t=Pi^=tI"HF/Gb/,A%#QiNK'/cj5q@4& ~<5kՈZA6!F}*'qg89!,=Qj$&ihqCTK d;k2 ց?Vhl,תi6&eծe۰j}׾mVmZ`wm-}[ //sx'u-r 9}"Z6o EH.Dkr7}W; Flf)jH5dGwJ(mN!btﶣ=;ɬeaE|K յ٨ xWE?!Xs'WI,C0,M1dccnSաoVt|7gߛ _вl&^UJTi*#@EÀXq(|-U˿siY𰶯&rGTt5zJlXRع=>Nf)X[]K\}|fXޜmV[ P9}€YlV} `\cs(|Xo1Y̨tM>Ä_©wy"-4InW>W@_g<y v_-~CП@t|w-N00B+z56'$Y64ArqB`Zpq2΢3N=2;3#{̊ΤCyn ñgIKʎӌ+-,uwWؾ=.-_m v#t\w?G0FKC'T„|pHcΗ ^8s( d|H9kZ>VUcE"nm4j 7y00 : sd;SRƘn qɆT|]~۾(<d6yiB 0{uΖLt\s 7=rFQ pqBU>QQVɔ۔x.k xϑ_{OLPVs,t@k¶ p"F,ƌHvt\kTP;9EtpZLY(hBm5&A?yW;V'H&tZ|6"ZdHy]XR灩ᡢ4m>I]_cJvwKZ\X_Az}8gPɡJo%!aၡe#|ZmwuLC2ϔ &;Uɟ8 f[IU{&'rSh)0N=/QT#, `AT=AEy/FYPԈC$K F,X(S Җr􃮶P$(|+zRڻN&}Cf"1 TD#_G2TOq>Y$='(5tA!\Jpp Ihgʴ2 |)zGS}D;ARtqT}}sMTF ibt0-M#eCCN}}iF"t&*¨ϭ$FGxzgm=rV@>ZmP=]0̝;t][>;zmkmM|ϝ  7?7~P ^;ln?S/0l/v`u/|O⍌t7tx7l / C4!lH; .?rjO#mHS}g/nN ovN 7dvN /}S7z[)쳗A^ 7Bac S;WɚM l *6z(Ȭ>/s.p,uôM`R5v'ͧ e7R(S BD̩˼<Ăf̳uaЪzB8Y"9.>An^>Z06Ga:6K,9-mD"LjE5)t{ T5mt?q5_-V0#\\|z +VT!()#(!KV(ꥰ'RQ/j既x>MH.:MUd\_ѯ6{ٵx31Zf(͏R1-? 9Rψ2)l6ګ{;C_" $0YZ".J%F6[B >,O߃ s+gJQهi4U/gy2A FFlځSM] (k -> G l.Ԡ"#*cӡSSGG=Tu21~J265hl0`Wj ^]ޣkHDl)g8!t8?bagGaWUĮawtc5 B}}H:fyϳCb/V23먵w:bgB-DFg?L勚]!)? lR=iUovq -]Q8Sgh|&#Tu p"MswsAuvuB vVSzuq$SmG?DKiӡz"0=D<%V_W'C loXnjF"tr]J˟8؁`Cy]J[68WGbC g) ' #2 !>xOgw >5(`(Ե/{0A9-*1~!Ȫ1$BUre]yQ=9 ʹ9g{R#v85dէ.!=0R[CbB" ,֟7(7QʒXu5 VU``e7RdpL_Ft'24<IG)o&CvoTg袅ϵR֞S,(-}Ew+ˈS5:WWY-}Z 10$VÌa{3Ѱ cnf*)9ƢS* (j^=P4[3Vft'IT/@aکVn[j!,"@dOLn׉\ŒAlY.`qp9N;bB$U}KߘzQkDG]Cw?hBaq $'AQa\p(X L 5.Oky,hWV廋_) L!A|Ca64lGOf%uSPl: \Jm$pf*܀[/|[ǧt#l'[]rP*k1;Vk/~_cl}~au AW9*Bm - =pLlfQ| 1Fm}1 _\)+ф&L||Q̾Cc\,-7cܩqFo=bC.UW,ޖak?:* Be{@YM9}f:gF) 9d'%W-K2t#<א bp>bY"Y1u^]$]5" S \=C|IJųV`=:#*X*Ŷ_N hAH R>Q.͊m}ExK躘 `DQLEwQ=Ļ% ~>$gˈ k g/D^y kS h{fq!*,8phWրNZՏEl**+To$V5y|65ZS?/6YԨDmer sܥ-/Z8su`h_duF>ZHO5hW?bGPl&x$Cm.xա`;O|>Gv=/鵎#R>vHhi+dHf;K?\oų4iHnVPcUZi6ɢ[s -.Օ: 5S{%weD4I-5<6(EZs7yޟ߱ۇCelڤLsFU7ڤFl=Z,4rj#euni _[5nRl]1Jq togXCXe: a%A#bnD' nWD8Fބtv:x¤jMZү/FIK\[6DE^IMt^I!(vp8=^oMIAfn!:8i=#P]*AM$${qLh5 TD]9:¸ta1:2R`-QɺKaK\ a*vVr$T [BˢZ Jr܀dxGEq.NO⦩r5ژ蹴!`?^SSdip @hG߿9:5itT^g⅟J+ʥBK[QLE7{l 玬a񊤚-aL+$[K{;tx}# ͮ”PV| 1BFxf2G h 22P]y݊oWy^y$ yy}sxN^L-pAtsTٜ0 G҇%y!,( |35"-RQ3}1E+ 2J̼rY~nsM)X+|KlNx7Zۣ96=xsd:^X8v-7f/=cQF昿qO5~"rNwA)e%cHY\ًviabwRDYTGh iqҟ8|pϤI?$=A_wo~s sٿi?Tn|8kh[k'Y İq[99eO('SD{`q: {NNAwԙ|אJag3ڣ>O阆{ oҳ;!ץ쑺oݛ1Wћ1*W ƕ0؛Gwxa+3K_ XiI+=[[)}Ae =ϙr8=ujs7#3{d{8uC!1SJl얓rp~+)a {E3;}ەaf:2nhŤs5do:3yL0;퓓aOZ];|Fʥ~\:ՌwQdh=Du2_lN_h5;dtQZy"Nl}$ |wĥ×JK<~4eߟd.M4Mv*M_WSѴ %P[MzqKmIO^ZMɺކS]j&.BI!r1Tƪb s }1\\^s ]ltl[,6voӖ#Adf{ ]Mr:t> m/ `="SeC?9gǝe=)i >2f"nd; yn- d%%qQE^CFCgh!5_}&G0Jrb;?GTSܖ?ˌ5D,״%܏]@eRRp%Rk ,0iSRQS3%irҧcηeҗf)1{nohw_]'nBy%eV7hx[Wu5aniG?b֡Pl`KK_Nw~+b~Eؘ7 d" Gx1{ʆTi􁋶H+ oֶ|ؑ<猜mQ!vh@ǃA.FMy"J9 1Nd1f 1i<%ύ_a/0F d fNxvJ:8 =K>ѧ>٧$P L1I32C7B5w1-=<'(#|",/JP1VCWx\ß[zqnm@"n収b%Wr*F+oTLO~-a-2lGӡc\n5C373oGuAJmeC )XshhkJo66Cڣ5&u`I}QIXT)Œoc}fK a L5|'g}Rʏl`OoH auVE,luŰi荄MƠ+=+uI=WS/w.PCyRR`Ex BUͫr+`NJ%%Ԯ-m/\89loH?=qO{rD?~wGLJR, 'iQ;\$E+٫<9oR8R[d?Ş@bŏ`K=3{ݎMzjͻ9bNҴ;Ҹ4&67fMnlA9Ѹ;*LrNțNizRlviM>0:R'C~N"{ ̦n9'%$J\+x/icx;hҗ6+K[uD C4;0204>:`EZm[-h9Jyˍ'ѵ .s a1bY5j`D dT|0s*k)iq!d#h1 7 %Ƥ@4$劯]N=`Һ%L- yLSSE3f6efxJg$p TS>κ}~*au(aS>;UzA=H)~!B{D$s\":9iϲ&%M]zRdR:_!vESۼ+ebIGW͛7}A76VP.o2U7ڠViXĨR-jh݀a@T({: ]:U0<ȕ!C/;oBE(Gސ?N(bP"J4V0,oȁ&NT(5<8z!+O,Rd$<[H$ɖ/nRp{ސ =\;d<)?P\P3=h7,iOҮ`m8=so@9[ n:쉈?jlZ k@ʵD/[\Gd:-Jk [Cӂra)U2+Feb%h-cPbMk^_Mcʝpeia%\i}mS[R"۴|݂a1Y?B4-```+ єh L$F(x=h7A Ѡp`+hU$- O0hJV$MS$m;Z0F|ē:C%\4`%CJP3RT ! _pǒ B0r?J$ DP?p'Krǖ& B?@LzOz#G3XFNC*}jJ3fC"U%@H}Cz#v.lȱͰlS͓\3( tL&ƝcxU7͓yWְ56턴e,:1KGii,DGUs#TNo" Hg`T yInX4!%`- fK^p֜+ΠH;#n I=Otɧ0$ ,hR1yҫS?v2tVC2.^Q2dJ -8?pǀ]dIwIitHNyC PC< B|IhB ڱImT }0kfc̘Ѱ|Tj#L#wP'йV<8ZPg329d#n979Zw`h{KP^:6s?!ή2sǛqTЃU:t϶4E*9^=pJG ΄p?,seP+s>@s#&>gDyrm@}ϔ}Aj) *HœyBp(I3 XYF%rFqSMI<<9mj F[{HS=B>xm A_;s:8Tj₟g\&T_A^〷7P.#=Ω0{䉏̴#{w09Q2zFoByHç w>͉@Y8䁫 B у=EsW@}Ө!Hɋ=(Yd˜ ԁ2g.47g #:0 MĀY=(&e2jtԙ=7gc"Y ҧLx %s6i\9±v֛i@DSsTղ}`M\ꭁٲ"F[fu'Cw=gS.ӛњ0׈:f9e2Mdj2'r%`&yY|A f v,\P b 3c-6N䥆cM^mojP?.GG` P_O?g<[H ܫe"M4["e}drXjG{搼T}?95 wqo^Ã|I_.\`-p0SZ~`r?8t `mpit~ïxs_Zz@=&SrNYsB%B򲑶F]<ПeWp@=TQfG4IӂnZe)SըX!r/Hu2̄ \1EBXx_oȆVPf׃2NMC_zX<FWZv8#)#="6a=N3xS_HO,O_\(?'\@0_&o@/J-&jBDs#>рv0 RgȤ. WAS4A:p0LW7M E>%&BDF:dX ݉XFXW_@0TFclPHdRBSUgNUU0,YhdPOOGdf*(պ6Xkz4~C`t,(ڈ5~Ch-XWzӴ [˥ o%"Du"C@ խAQ5׃ӼֹE!8 H$ qHԹCEèGkhg@Dy!ֳ*ֹc SSw cߣwe3D#3l 8,Ϩ 8o2@CǬms4&3ۤ22ErKI۷fGI[6I+R#}fr\/ekV2Qkp.gԬUvQqbX+lmEQ{3slTJY]TA!,X<^cI墆Ϛ Vc޶@|N,YOU 9@*?[QQ}fڬ)Y~]޻Z˘Q`b <9݌Mй̱SRbgƚXwneE:xpZPPx=Zlao_ ~f}]|)3JMm 05^1X+k"kR PWw%)J? ꍳMkC 6osTO`_:cyׯ 倳)bN#iX6eh#{nǬ*ٺ"L&nKkބO` LK;^8*7-ûo#|Q"*34A{)Z6Thf`:-=ʳMTkp: mpJAy Mcx-2c͖ epGZֿ`Rd [pЌF{myH+JM (6 /e_:\$# +N7MӍ(UipΥc1̾=*l]ck#̶Jm1`t"xE<mji𲽤ְUϱ"ecҝjie)<]ƺ'5Z 37  S@|1=Ɵ7qVMo$^vmxkoMhjM]Mpk}0 OSzYxc`)eYQbW&viLϙO?x㥂|A] ;fQ8ǕϢuc$H86b6 XD[fk潅9jge"D;3,̈~K,{Fǘ:M"_׫Lӹ0vY-(15ws2EvJpS^ akBKrā[j􌡔#FUfJYXwۺS4{'2z2zbYys R~~  >콁}{rZQT{FJ[j 2cg8G\]Gj8blɑ&X8ohupffY.T6ܓ.q6ʾ.~ap`+c++i'p|*1+.m̖m_Pd5S~;R'%};3G˒aHO:ɞ.oomvm)>XZLΪ6/j>N *0C2p`!DE2G iY4VƓlm`K^8Wp\G/XՆkJ:eg)x|rA궉̠&Y/ym%A%cmv (z"z]ڷFZ[Z9I!;f%$Nl4dw!g \׍&C;=j8 9H)~j@O(qZ}^~]|]mqT$E? uX-‰B[`Vp[FTr͆$F>dڠ {}r~GݿC`dk5-' 0tP|&(+ɰtF *Btf)__4 S? su^[ z-?(ɖD่/,%\he[)7v'7% h۱yרFu'ߵD܀ cxA -M7 Q/%12F4Eā>si0sB` *ժzg j2睞d%Spͤƅu2p>8%j?`oM::iC!(3GrCŖ1P-PƄcs=- 1<\׽ZUx/@"Y%>\ Ri|ɭz%0).ͭM-!H' .T^%;p#v^5Y%iGd,d%bVj+GkzoPuBiʁ/2!;c\j fxd/WSpy˘sMmYcIkQ-LRN_`9Xi]?[b*J+V>}pbG}+tYwHYWTk苡S4ٶ}A_@rGѽEn];YE(Ct?o0Bj˨ \ * YAR%G kUG' ;[ I$e(CbyebﺩOqF 'vҙl$KpL8p"Nhz.N ZpijGF%|s#EnOp c꒞y$%g,dbSo2񲆋;dWDߛ FUޯrxXRE$? Y">TMǝ>}oe[#!ٍaL(?RH0hHF7Pzo-f7EP E@qZ6};DT'LPtdf Ynda{MR =X3vew ѲXTQ1j̝|?fesx3Eu6'`7%ik?<)%nf Zr|GI7X1?ivny_~snDN&!%WkwAU=twb3"1$EeTiC3yPbueogƿ%ZzC^% kn`ey.njV _!ҬH+e_ϺXџrCc-<͚cI.>>HusSͳ>H6}U|i;y'N>5BYZ:2V]rOFzH0L M\~Hj 1_J.u5kz.*̲`ur31h1Nml#&_0nIMl\BB Ƌ#Qpc5GC~b_z<HXa)~:6 u/jǿqrmZZcPZ'j Ȭtx9^ǃޒK2ġe< Q^x%~m~qXo8|ri"pT \5QT`=΢MPK9)|Y}#i1"j xJOUݐV.47YGw0=B?Yf3]UVTUrùБ `UO]GphfQ0O#ŭeq`Y1{֞]-ESs1Ӻ5jIށ)S"ح%%YwL+;)0s{`jxխH ]{7䇸|}x_ SO}z,]s6!~G56?ۮȏ ?3}qwF)HMǃrwJ;Ϧ}{6dff!m--E+AnJI0U[x_<(6S$59AL #Ńԅm=^:P`=_)ﵲI9x90I^m|բ+p9XQP]CU5u Mol-5*z\tXm"{$Z5ƕpBEŽI,r[Vj dI(t# Hm0HC*ҵL `)JҽLQFJ+x3)LAj&&I :>gHD- su?4Lˤ[ѤW콐*.q=LF2XzF\R`5pW{rGg"[u`A**S%Ϻ1iƷ LL~Zj7 nOKnBRs{8Ll_HwU06RQ\q_A&Ǫ.dƲˎt.J#hiI=dNIKSQ_{uTM -bqq/NMl &; $-SI >uwon1"~L*^+2DKL )2UJ*uX!}$_:pa>/4rj9>u_a*/úp͉X*l~2ӵa(0xj wخƳy3[[sԅCld,.9rQ-GDpI%r):]e6`Y0lJ(Hcl;SaQ}5 4ӳ.v:5*c+fQnm}1 @LZ T]VD%IXZuԲL|>w =m;g7^+'-'zB,[n:ӳ p}IWi]gr|_wUqv;o0Akkgljx9^_g( n٤#"R2]Eo]` ݻ;gR?^ƉF,c#po,8zޣ% *žTY>gWS |}*kWqs[d"w?gHo+/#c`O?K}ˡv;{[c[|\; ݶW\2c6oL/5wt ӟ;P5?nD&}q$h 9,8܈t?1|`/`.^i^ѻmr [qv{Q^!z{]QrH l/Ded+ I?Vl=rS;.ɢ^Qo͈wR_von;a{gDyMm_f)8r;.bM¬[o&~Gxfbݿ2Mf\vQ_ã__o6?x8=8sn<'R\ Mmue";*.WtR/2H P5Yxwe |#ppp8iYh3-basߢS1ӦhQkO Q %듍J(0Wy ^' {Rx)X3ƨVFsF70$pSzg \sҚW9<$9%-Xқd,X)lfR`X/{^XD*UMw&I {,zFh41g:OE(2M9[bp6e鮇)6P78Rq>LZe22M٦7F%z=0&f -zLVn+nR63ho kL2uG BP୎lnw inuϞJŃ f65I^0-< ֹ`9\5b_HWHXZ(=~f1XKc˧OS%$*~P8&>&7Z#+P1ֽX|( })}Yθ[SRd'n/y7a5 `VyW#dhK2adJ*}Q:XW "+LO@q!:U:=1ŮhjW`G[3/Лz0=<d t*UxFpҭi=Kv 85"`F&?]2rt$r@[סp Q91۪EE?|\#b뽾~MׅBxQP0Nb\0IL ld7׶7ow3GfH9Nh"ѳ0i~J~SȁĨ >AEgyho;7;աwK u]?@Q[G9SPqs,z@H`^]Nr^@GEg}7iB`Z+>9:9}j;G4Ɗc6X.a1S6sr9N@ 홅k z 0m# *8VG#CV2O H8E$pJJVh͖z;=:\$ a.k);@͍?mpqb(0V\׀km )%!%-nYZeW-lQB܂4J"-o fN8sN&t0Kr`Uzc9q*hԏ TZ~،Zi$ f xYzȇԼ M$7Nv=m]pS19ۓ~ agb#Hgs`&<c{&C>< jQ) *Լ5i}0s)O4ZQg`xȪ(➬$#M#\p|޹ =ȈRX++5ӟ1!VJ"AsĨoj/d~d7wqٗ@NYG p_Y);ȕ= ۹YyIE'IY$^QKS_ ɇ"sI:H Ȏ5OH4}hYN Ct@!G3irbdIGAb(i<\Fid` P!U3m 8DJMu 1S֌Pg-);NN- T]iث&K&1U3aBK©yV\D|y\!HWߪ?*XƢ]k1 k_z`ۈX  = JC 4UZj/-|Qm.tT)^>yylx@h{DWZ1H;Y'@J꾏@m Zbn.0G*AFe6sΗJgUg~RLy.$Kg4uWTQ'L&>sRQ^?0ٰ4F:aIչ@Jp0XC2kehXç]Xv=ΌI_==g\ imf1v XAR۰- ؄.en3jɨ/u״ی'eiܺeZl7A TmDC]zȽ\#4UE6 @''4][ 3Eą?0J<4R"9QaOѫ߷`!4"G_Jժ*FH$ݓ%37C W nb7WW1M3]|SBft6jniօ8rAN{ UE$E$D מ7"jܪ*l+lpsP,}!C'YZq[hp+\qt_D5c\vfͤ N`7O@m*Э+S{ B6Y,s[v)qmz]YAwmzm}B+ a_fCՇyEW%$ 8β`}Q.aۃ7jbɺv<=No#- k@Vփ@op}ٹ~0/>tߊ"2,F(23C}Szu/ #jF::(=د$AѵI|Ȏ{ 0KvM,J"a[7ܕL}~Jоֹ-*ȧ"hlc6ɔ-]4h/h%u ЩS Ud2b`92Σ>uo@Y%nj^ㆍ^# ݙ=F뭿eH|Eޡ&̘per :^ % H9Stڬ;ܽ:٣ZCs4o/GK)#d͡!!46w6 A5(='$`q$A^hp"T D?Ԓv WM9Ep VA9 +qs{27}jgkPnȞQK>d(K,*.uɶ4(0W2X.EKS![lUf-ȓ!8U#R1ɸ8}r6tV{b,cg-[FlPHeu0U2PVc"z+n%chΎ^BH,.͝npJ_bG5kKQq\ԈU5yq^B7y0=8Cxya^RiTU0{;jɸ S-q:Cd"U1?m nʠOehPZbTݎ<[G)Wo1Cj|P!|s"f;f!8| ^+YBGlOj~::BG}]{%JRy~՚{_JIshn)lNB+oƭ~rh5ė4Z⬮mLʊYW~!BR VHcuDBт %ŏhy_#Dŏ?d/ .~'y(:e 2Q>Ӄo"m Y'nd^?[{M!f]ceQJ62#nS9dE}^Tbhs/#Y+KSaUkT4oc]Vg3Q[TI~5^+ b:4|`QOԸY]lUcu`#8޼FVQ.(-{.M`6!B`Tn!MnȅL?E0cx I0cjp1.쀇0?54-0eX>Ș vb-0e2L49F@gL`#0$*m nȇ7DG@gj>DDv~DPonr@^,j<ߖaq>3$%=3D-PJtP,=EpEfH @ 쀊4?2*PetE|^nn#3DF hȌ 4?3d'=:t+=;/7+56'54+55/50+51@wؿ-&"`q x|HLh","B(= DY4pATD!#6D\DJZH|Ļ!!rTc=JĤ?D:=re!-·t`}r -B+s=f6+--!82wz[b<[fBg:`}X.!5W+=>rg@[nDOߐ!?xP4А ={Zy{pDi{Rĩ{tzФ ف A,=x;x8y;~8yD7А7Т77P7/זe b++f$goh` ME|=6$?mBY(Dώ6v-;ͩ56- -x[|#ό ._XT}io\ ')[; ۼx/ )rcGɍjH ıNhxa9sB{ʔ', Mݴ=XGb3ʘXĘjjkYe}MT陘r;0b+)1q}X xs}q Tġ'=mdseE a~K P7c?{ 52\ƦPCJ\15KlG`nCö׊(oSE؅^cVu[~fmHU|r"H!$*)+ZwBA҂wQRTjL:&H$ҳwbb iЁa ,>O e 1^fB|. x-e^JzFPߤ@=zZIY) cVIh>`@S}::F`i'&{@ ̶d`/3k#ޕ7ePtJ= hR6- "AE[1pJvYɽD D'fϋ\AOnW7\??gS a1^oyW$RR: '5KVtٞƁ6;L/V2Znydgf3;ah6M6}wL1H% RݩXlxݿt'Vݍ #+,q&8 QhPkf=(JܢbxZ$Q#Ā9 VqB%b6H6X.7gX <&;ǘdsxzrY'.a j,D.=2UGPXBR|V( Ug%O &6\CJHz2NQ5Mf]e۶m۶mm۶m۶ߣwscM'#3rʊX#g̵͘xIlyʷNy2y<2&)L73 ecsLd7uҔH^R`y`/^[y+ZOv?"a0Zˇ5{fk!a?9hzV {b>:u6n ,qK$/9#tF;͂ojؘo-",ڌ^v&.~ܒ51EDbY. C  HKD|&g| l|R 9pp1nz>-owSחhڴxL[Ksb,p,0T/b*-mSQ@TUm,(SRЎ?(F*:k' SuW4P8({k@O*VZl0*yocAx* l6oc\N/b\7*lJZ`<~JwhЩc<~+wzӣ2wT@LHWY^XK1#3.'Vӿͣ>w.폜ӯ7L8Ml?pFVFZJ4] 6)ЎTQF.vFxxV#0#TAD! кcɑ#6%䭫2pXU]*ȬY)C5"Qz>I%<t. mZQ"GN*U?Y'~yd"441sW}ri*֪OG?;;>upIS3C6s6fS,UG$JC!c%#f5:\jRҰ:g1$p.ST$ Spå"x'NF-,֯|P[bܥgvs$䫖vK eTlzsJ,h,JoEns†Bژ1p^g_C?Y㳤w;F~juP[gIzmu&F$O;[6^Ъtq7$VQa#MX;lC079lCFnf-7\q# fs-l5 9> @N<H =ڦH꘷_9ԕbf=*Q gOANLb8#6$s6L%Zpj48IOޔPC.RkFʩO\ 6~:a;/*#uO5=bA6x,:b Ȱ7楈[qum%G;Qa%5}K!k!k{!QVt"K򬮊}e|YAD6́$21,貦պ:}a/?HW%}Q|$j`&ՒXK4K+ B^ (VHH^×kb %2b MPJ;CU(T0.i'^vF}0vҒ[:̿HЎ!Û3W^uZLPnOoNB#\̥*5&d?=-?NhW$DiFqGڌV3iL.$ypBmɂRκge-Ge__qn5q[iHh>GS&7!׋P iєttH˼2?ʺhNI5 Y}S?h'}''"U%+3{No%L^ (ȴ;D&O{znTˇi%)ˁ<?*E-L edG+, X}j60=:ȩT]bUV]~j.d=?.VpfG+)<{Sc~j2ƼpD^qb$M3rRZQcIAscW)U 4C4ƺ7*0B{1E7kɞS(֛Lb>컫27DuYQRT?vaobl狨N;ٙh/RG nmp>[5 sĸ)babzbHFiE*^P!A!+#5+S;Ԛd78WsSC򔖛Pm E{r;\#L6=,ULU"EB{|.Qh%5P*}#o-:z2ɪ2: AC* oO=Avt+BFx-D1NEDQT'TlY<{|w Bw]l.y ኡz^% y1IyJ:v+%u{I`N\Z.Dwg}w- ,Ny\:.twb^#w/InS,S0z/"*}wGy"4~6wyHI>>GG+I?1G\I/XI\/aj]wZI\0/yN7" i]wTl/cc_A:^tɼ:cF3 ^ : ^L˼:N3 ^@^ ͼcV3 T.ۣZ3. ^p`^<9o|'!)pѼa%>qyOry NdRxBOir,NlR?|fx?%?)pg|?%>m(@.iK}hT?w+\QǵO[;2snyd.::zfvxFzdЙw>WyJq;6aZʕ̉{IZ3c'7`7?ML M(CmC Mu"nfg7u@7q?-Vcmt1t-loo0>D͆_?N36θu6S;6GSz-6+-&|W)&J x{2y!Re;؆Ý%ُ+”ϠgXgtP!XY3ɸd"'e)1S$Ü(BZ%[J(e2K+7\$  J+6l$JL@E/(Lq 0j@Ik`e#Ƅe(~YA'ZLVjBPUhžYP+@͍i64&7޹ʪP%-Gs.+8A:@M(/MWs2+8684JBkga&(*;0,:+;p0,+s`lg(/7s0 ?sz0rrD+<e|5^M}_Li|5^Mi(t~E)l)wbX)w Wz2}=5Rc149T!SJ3?l1S[囯@wM7V}0-J7V{e1mJ?R%S/S+s$¶TR4RBd.c,Y+$5Qb+"*k4g,g1TⅪ\l)}TR\|-w`RoD*- Qm*Y-R~lT_[0VҙA, HRo(,T7^9T`(Ca+Qo|^H=ͯlP5CQ6[VgJ|a-"* 1' S$- i2%// -K{Q,77=U^D[[T"/ޫ`|,W-|,OB6Y8hx,%)#;3݋T SF1_HVs¿=TΔ R*1[4PQs]TT2AұXlXVs}T PBC6],`QsbTPRA6_lhVs⺽T*K[VwVޔ,V;klK)"Z.{?^ꚩģ?z+ױUVt'R"W{,9 eFS#Pl1}@Fv^S5whvq[ H97lMN^r[ Jyі@#GR7b#ɭG7bG#FoNې% $N% s+Gf w xNufs+Qwxm =܊fs7oήnjsMw-u Hawoǡ\{r5I8 P[pQ!D`1d?1D9uNVOB#Xͤ;RWB4ᝈP:#9g!]HkA8D?ߐs2u0=F·x-Pҫo$W_ 8 6Q xO m.j?0" m?"0?+08*"%~ 茠-8f/!%p"%]`x,^{׆~*ۖ9x},vQX6RX׶~*gעzcvWk4֎]!Xgװ~ l֎]%jg~ lw)Ž])nJX~& ֎]-kg~w-} jC\-#qγ:dk[lۗWiV%+{{~4쮃j֍j6]LmǗfk6]0\]Xil]+r+k/֏]X痈~쯣֏]o~N3@cwԴ`y? W >915!% II_쀨ɀIL**%jfǖJo+,g u#[66)X΋=[v 'H_`~^=c9+,'Ph@Opo@`@`@`@~|=;N%\X-<!Q [`Xva;%m[`I@}F{>?}zJ{wt1lu}vto|wvb:)j©b+9"-X|r-ByiaU#!3AM⃪a2i!Eܙ%2DKgt5= EƸdK4C ĸ0 CǸ%gS "|qdc UGDŸ]58AȎ}5@A D4H) {c~lP0nM ?6,9ۿ~ a_ؓt9@mK.h0n;M*͆hG bD!D w|`#&6  tE¸m6Ef6l|Hd!Cxpcfwmxsk@ojW} ;ޮ0qwH>HŵGt}Ѯ4˹!}UЬ}U!~-7}s/QAЖ܀sɕU5m=F6%a\z)tǜ$uM1j̷*±j~_=F}M>^p!~=_w1=fM%l~]^Y=캝oE1tt^q=M^{u]\'5mޝyNӹI syIr}a<7w]#E[)b]I~P8Vh;"~|ڣS4I--ˣds]v|:D Syu]|Nnӹ5򘽴Fsr-9#sS}rn-q2>f9ӹ~u;&㉩~]>[g[oBy-'#5Bve ܒǐ ?VȐcKxg56Ptdc K3wqV5LOQP~-ï[ǿ/!?_YaypK6gHrOؓO,򚳲 v)ӈK.<'YbU`"5UÉ1 [aj Q8ivڵi4PυW͌#.iN6?P=Tظ[zͻ!U)\K;-<4-<5?+p=)|x2i$`/((<.*Jd= .轕.н.@....-0 .H.`|ڟ|u=x3=6xS=ys=yϽ|$9MbԪpY.n?zL>~T9z\>rJ)ꖊ^.|.&9ǝ>e{+~tp"j>۞>=>Uz~0tyyCy#G|c&wAO6x .f$ a~BEژʙ*Xv`,bO (mH l!%I F9iǰu7hfGR" 9_dr(t𦉍e ( ›Ÿgr(J&m#-AXAUAݭ-3VMkKRz\Gog5CA5sb29=b -ǀgPSAUhwR'"߬-(8r2=%--"8E\8ub( Ear~e`\(­R@_eS6A[wlE~ bVnFͤ l;,HT?(GywڊL!~acJ-/ ΅K'L=C=-NlbդI H,fQxqCQIAS5, 6l|.M}yȩ]q~6`#Xt{1/ 5X֚{hג$ujp8iRtyGY7F/O7M`]zyLdKzє~ xMPArp/S5[e^}NS9 oB/k5VES&Ӱa8AR_UO|(lc#XpRa!p1*j }aNLocY-աPFqb-o\~EbXe5i*R?98^/i G*5t%|ͯtDqR^$o1df9p1_m$#;ًaIB{.=hM@Ej<8 xk[?MR^w)lL[}t㎶Cˆȸ::W&"/P=kR_Υ%V/^6ÇN^ȃb[Evps}z(?һ:ͪܖfaoo/y*.L'Re yXMNOXPQP" B{ք/[rZjkscݫtud,3aׯ= e749E [dw,`e4H`P4"6<ќ%iJml:|4Cߩ5&aC`N迼,'dF1 1W0how ~'i/^Іc;rvr(=lgE ܇l *'XOx~X>$'  :t >Vmû 0C ,%@ t@n̫zaYW SCe"_ w}tm@BǁnyFwVo YJ\+SG #7çDw ѥ=%we8Gz,dfїzҜPG8{O߆ s%"BXSa?̭d|| :0E3T:~2$&H=O.J`ӆ> 0F6V4l_`TPy=]p|~e1&zG]=]yd߶4JCZMɼޛбhg4+Q$mwY҄3J (z Up |~g\ꏣ#l@0r.RϬѦ(Σ6aNCT9+3i&."h`ۥ,4-1-^囼.ʃ ]]iK*POn%LdW Vxg=)e{rȓqƣ,s]ZC t9(,}t,l䳤V!dDj TJ6pF=0qʀ_Q5hW*d3S(yܚ)E˕L%͂xbcq!xm(}M&#IT稻`K8Xa̚(>ϗȍk2& tyP L.[ >mJ[?5 b}~¢`f+]&nSr`lxw`_RFwp6'),o HI-"2%4]](Jzdr ߴG=9ށSACEsXfF"RhØjO"y)@t,qs+AJ;"]4\ =%6Bk;D,B=e,my9X{\h l?H4"RR5pW SNy]17qaЃҮlzz<ݯ)ݿ;%lFlza.+FXGdΑ\KJaG%snDH"֎{mqC;Py1(WT;EG9bm4;AEg5nF%2倊[r8"FMg6j크Ud.jպLЋR3ӼV3"ZEֻcaJ ;6N92}3jYZd3jU|ֳUS*ިp+YZ+oAl.PoKXLe-so]o\-K5vѫVv[keL'qdمGSp"! i Uf '5LeVyK%8Mv#ru\1g3&ctF,rNG"%rGIߧǾc]R32i&sw F,GxT$}KPṠBmAb~s|셄>!W22G_sA#g 6kL'AS~%)DTO8BKQ AaEM[r5 ~C-Τ3vw\M;O\w͑wVuo߮)xrLC6O|.npS.h hYP,{\SA[J/^B>`o/9 ^ΰr*Gzp.f /4vj'KvlCS^/Ͽ n7b t*P,)Gr̓ck gLkC̣<{ Q[,=xTEG48쫓[uYVkzg&&]9?Dإ;z ӠB!f\ _=TB)dstp9WktB5e 3 o_!hq6j+^MS)Jq/ŢktsO˱c~XJ>ۭ~OCS ţ^S[/lg%3|(az%~ڑ8kKE"6K*{f#{6h2SѼ Ca-Kun _` r *$Ƿ I_^3Ÿ&"%~mtGi/ͨElQkV#cO&Zx֬gr`M8h%IvE̜ӭVpB#Z?g)j qP^>i9 T*L,D3Yҫl*UϷ:?j  X@6dQFy^kƆ㛞zE Γ}s -u@KCk:Dj!뜓* yO`7)uY-@R x'~Uuw4]J2q2Ylbj|$r`-cH7FP>IYU_T{@AF0rY*SNfM)jߜH0 c/l7X^Tٓ 1ޛt!+!QB?s]sfXSa߅͖%pՔЈu嵍 \m2UKJKQ!qJ8( ȏ~䗺'z:F&P q?b>J@6T`˩:/t H`'} 7̛6ps (5r&P,2qHQӮW!fbFW'R.ِпκ׷qzqS7{6GO3'fՈ闫GsԅIHı&PqX)x**R:5͌})|ްLd\05;xWFeQ_Ȑ"J6(iM>bg^LEujam.nbuq]&4i,F3pa6Iyȼ')bPNO6KbpѳFJPY$Y[ǤִUٯw4]IM=y6szA#% 0C~4K } ' ɑW74H!J/r0:W% EBDQg$0gCK-ewuoQ˴%nXV (pAsgBA)Ku'BOuR5[I}x5ޣmpg[LQ.V"Ʒ & gѹ`:hUvQEvڜd##O&j` zki=V_6:0a*!Dঐk^dm&ߛ:(& ;{~X;mq` I&MJy5z=j KΗQFX ՊP&:!L 1,i8}k:&&^_l "Q1M#$i0-AW 1-"s*V t:W -*-,& -pk=-4V-hҭ7'UCrTH6l .U,Nv9zݢč`Ah =7XhZZ&F²OAg " N֣rȝ6_A6N^o.ŎGx_{% 3ru 9R C61r%'Wsbm@øpGA\b`Q+Yp\M\ 9kQh5pmebK3!YUCژSkT%QzN\XYn92d۞w_kM; ,tb%:OࠖZ~yo*.}]-bngţf"5e[Xr٨7<%RE 1KڜA5&$Z6F/G̺!a‡>SK]7- ՠz&ThY9d?d)<ꬾ^?] VkPQ1z2\9iLnY8V=3TzrPJ4lVcz)kS uRY P$QY$18K&̃v t\X*jGXEm]`Gmh`{GA)q^R(ZS;j5TiB\Cfjv1R{zj߹b/UPm?K"nåXʕX3& s.KF߈W #u;WmIh"DwqZ}׭K1chBÛ:~A΅f+MPqB7pUF &8鸊F]Q>}ğڭƱ )ʉ[k@"&k j)'>~G)y3Gٟcd~*o*}\nCj_mȚHO}܌ꀐWw8b׈m#z_ΐ<ǿz5lqwUm9VsSBhj~Ps:Nch' qaZy(x0^C:j>-rאgUr]~o2,"e_hreWȐ\N̬DilGi+ 2SNB\̤w8- l3)clU(^~ôa(me.i<׽Q3t-7v㥁ͼqaUɀ;V/5eװ<ޖoʾsEof/B57!B`/Rm5dӚFkfU]hQF>2flgeU{/XKjI+66&QZ=DH::}$n(n.Zl\(/ ˪]H%o/?[ / ׽Y3SֱR7 r9Ђ$$9yy y½$˟hk5( !8lwc$rlw ]50p|H[sELgG<2ueE/:dJpz ^CmPm9 1)!GBrI~$}5ye #߻c*ӝsF ߻h-?*@ƟQ m3z)5$P,vh`# a (ݺ RH3&PK g[LgHͫ/‡yEy0j~0fUmN:9K߉U5"ïYPg$/<&A*`SPcO [ 80Equ~DwXOWBGfKD?= ڬܙ/A畿:"A*dv֟P?țtNu maPvU:j|UY#\7Ga~Fd`A:5iTBWC_2S]7n7(dwr,9rZy8xt2܄G" R6{2IՃNw_Ui dKaIsa0PrDfTBma긵4֋Ԩf֗vRvGH.޵2j{έ%TkL{1MśWK`Ve8K"kvY382fō{-O|՝3ҡ kdeOR[s_$N[TpZaZv6 >ge/9h$:Y+uo3=MpHD>*tX:E?rr5! th*鵷O޴4Uόꢾr$ߐ꺾,sI1ϪG4¾,|HOqQT "- 5λǘcJ1 9&hFR#< =WO1;/:#sԟƾ}锴 RhSd`YPGb J6 .?P52SemJHF!n0 1MygS ´o;eJ"6˹FED:)4ȰXJ`e?@1tk\U6xYN}tvw9*m.ڂBq'F!m :2߃O[rեQ94 AQru Kc"W,Z61;_:lsD}7&4 zr0wNwls}bnhB YO/2*A+Yۛ1|f(RhVX^^jјu (5*WMaߢt^]ED.o*Ti+UqIBrY4㛉B측 tpҨDf*8R4u9xk'[ZYgF[DroDho IRi 3)n +@ijoϾ@,+uK\&u4w l(P b%$잽.VqX vk&Yȿ4:{">{"vb"3a~=v^<߸?mTH b mi8ViIftEKb\Gw}@б`=A`9dyvX_Xot'xxPY9,=p127q<]+HoRqE,MhmjE"+F3*S lhőc|ҏ-xxz4DHM&+vk*D`W1@]Q%]n haWD/DG#,wa%%6Gl9k(bqU¤E(0pĮW҅,.QhK]g9Q:R%FI-շ-'q/ɿut u$~F 9EaJp\͜\pȐn_ť oΗVSY MV3!Q0Fh.͂1VozJ]*h/+Юc#/>j6XG qA6`Nk7wܝbe 2A/ u}秃!G iSr #iv$+UpgцoY/#ĵ卌ۥ9^ "91D8P?\Zk a%"W+HMNX R~Ϗĕ-^"#Sƫq׫5϶w€g Ǔ6QP)ɝ;g&ddZNL]F+0_,f7yObHGTQL6zL;7?YݥQ:$ b_Y5)AÀ~M;2}44+' 1U C` =  iUwJfȨתV)E(UAB_)φ1 CvH:wܚ8xC[D hgP^ޔ췹0ҖH=}#4CD)u Ed!n9ZL:#Q?P6'qۣb"݌9r3d* ƞݼVٳyƗۨ[DvqRڃG-]6 2]KX*D*x&8'ow v9ygBfrrkH/1 q\ChPw+18ͰqL1Q:MN3YP`{zBQd3|qHi:H&wgl]LSlo:>'fIDzr*Bq#_N6zm,B߆ޥr7tf&\o |05W:Ǭ7]@7]SԹ_6 ?g+-U$n!&t"w*Dԝ?/i$6mZ'Sjy̞kN;lB'2C)?E&+uPUqdN|7tOoF4pIpb߼1 H(PWTrr eZ(MEMMJ_ɬYO!&zB au[)R&p?cW|:,ܸOza,ʏA["{1sxt~h6)£ӈ vSAKW0[aF2ͷmzw.{Ԭ/}_`Kc Jk-q_j%"nqm(NB搭 `n ^PYem-`D"16lpsa+TJ)^ҴFa8 2l; .1)%Ze upT>-Wp覎0q:srKsJ# P;xI<(HU{ڋR :Y4R -vX9+:P5_Ji|̅ я~Ȏ2qo[p[\(h .i0޽3o(γpT*M$|nY^IfP5g<&\*|Ξ9E|X4W,Hy$ǫrHgi bT!|q|WuHB laTGHݪHCOseeZCH\`ɉc!fðيݪ@F 4^T #ZO(SD.bv0+Ť˵WsI ͖gDXn :m;"FCdtp/)+Wj}+NG^?JPegVME>7$2ߵ+EMlnn`A X%̞[oYȎ)wk>!R&"do~ղˡjٓOv\oXŷmU"MwJ>h8'JWDWp]z!>0EXbΧ!^uس~RF2.ފ9 #F2l ,NB)`_pBY{Tv5AB{'ܓ.z6V=2mP/[~4^K-Rg[;۫P'4Hwz4 .Ӛ.}P %7?"1g?uxN5I^m)[Q(%!N<Z \I0F#Tin"[LhJSj;M\%jhb! đuWx*/8nhN4GRŬ-[e)e/!\Sl~ؖVJ>KlXFd U~Z}E e 2"Z,D2L8ćo.sW]M>:ĺykvkzݼk~coC`#'k/̽ ÃZ3 e勶vsCrS<#P8;Jߧ jWJ9X^38/ɺ :hr#D~Koǣ h[vHg@ \t1F/=ɻfu!![ZWMqeҕy[%a^&t+Hab]|{/fg4 mJ[%Rj^.v%2F*7 dk %[ȗ_įC)4bAGS=KUqՁyU3;U~Ut2'b,3n EzO'aKE3T2 kFUxԁc]V_f'aݱ\?>5x!qOd_:L8 i+ KVx~B7f`^_Dm&P^:׎,A<"׈į,se T\6uqtX]x97r=uzx>p0}".=.<0~|xPLz`ru"u >䫘tW>`4c:uB8}yb{_%u " I_ :J+@7f2༁{Ҩߎ||GUOgedD#|C'zսW:Q<\Wej(=-p/2O~S^q;<ӰX3x|s"cptcnYb?:6o6}n qQ9Sn`|PKm-DN}l7M}v]̆wL b9m514#6WQ Zaw& 88wIޣ@I"kLf:+Lj,{X>Srhf;zM.;_u ,qfx#.M0S>1"F&tҳVd8wZYP7rVgz2S^r\~g_KzK&犓?`Dc0 A4އKᝡDRJsaM,:p& ʳ&;McM dG/'KfF8Ƀ8鶸Jڭz;ln7ANgF^՗|A2 .؞Wߣe`^>] kUI',?HX"=|2eNQWxBqXyjߣt_!%Q*WnL5xQPX"R3|鯜kc ,I SJ(=䀉 85g|a>]yURC r4'Qs/22pj] 9Va᰹挍 iz5 n,OfQ$/ba^7`2o9^ LC,Ɩ'ŠT+LKVbZU]¨ZnV n'Ys3scv64f.v{[*AMOV2M+jC{WPĴ$F;i >[2K+x[nh|eo攣>N(P5 x #C2M ^-)ܫ;53THZGpM"hrf;cz)K[(R~IkE'c$g W[P.Yܤؔ73/w[y# X&48^vL7߹ -uD5QQ&QIz LWmw6un÷G%8/, V@K31`զTGt au|U# SJǶB~5|O #Ցʄ"'6ԃ@$sêvRv!^"r͈($ 9b#g )d0#ׁSBd"Yx}ח<"QMn32PYR֣Nsh3+ԜW3B"v@&][q}tXhw}X1uh_Ř?B1F߱3.cMCb!`Yw@| ȜVlё~bHry:aVs4\/Axlҧ[rrR X/:B!`i)20 'K9n &/zT+< }Sf}:6[8[8PDx6d>{n50:u\(;Ġh@U4j?&~=Ta /hp1oe/1]oMc4ƾO,t} wƉ[l[:iE@Ϥk[×Tܗ<~#k*J87 P BlKl::EsI`.MoYq ,b3S*`:H_lO:@ap4n ~ŕucu#0suf7k FU$hbTm{qn&WgɃ  Q˄_4PY6PQw~NI}C1xn߁|'/rnFfO$q"aqns̋W0 5'J"fOZR/W됓@@|WP5HK~ZÌn?'s'>d"/^W/#Y}*w0檳cxE:OȈFvg\(P3p+d!>;)/6=s%G ُFrDV?e|<](Rfκi/NCkG1*p*UޖH0#cMJՒf]񑴏#*{*H SjU*O>I9ەEV5-Y=^t,GR83͵1 [3L [ӓy}*w`菵!$쿼pb |!qǜTm7^Ф1se>BZVu&{SV{>oZÐiI رqlk[} kwzʹ_tҏ Oq(?8{~(|9WZ13EjR OtSg4Z.CIFIao:0p?iXTKHC+%{آnVb4MA0bk&S]^d {Farisv4CW5}O\:to֡j90lKYT63@ fp^+ V-D̺aيgܒt6Пf㴎t $]*t{$-Ltk 6.rQU"˭JF#YLZ\U`НbHx"I뫱)v'vIEgO.7V#PF,zɩ) MbC^VOag-c~%B[K'q+ǟUoDJ,Nm,s|ʀՊ =a1M(e+sE܃l DYeG7u)z-p޳!,OAmfXD [$N50l7k$1iIN'e*1GoX+gb&_H+F'}8U8X=e.qy͵Q@ VRw*t-[$/ uu OwRw $6c$\sի}Yi6sMOd Ǎ=W"u <9Ș^ka&"4l4kZ@ QxyTP@ )mL/OP?=- -UK{v%Ds*uLƬfeJN U>gmGi CiRZ10l6JW\X^5ҔY#@ީgJaS7upNׯ$(HߠS;3ôZڋ&,S!ʫ*C B([q+<o 4 fIkJcE5#fŒ-m%IGX`De`!ܴ^@}*"$v{Arbh C^d2PnԠc?b(WH@ia&ZfqG'8.& B=H|I+bG9EM wX'ds;CBmpv䋢/Աu<`b 4eIgpI" D~xY{I2sì%o>0GB.|VI[Rșȁc>hģds[|F<#,5!q I7׍o[矐{ !$=5`81)fmly+R6^CLViE3Ȁb;`lyX-8:hp|wtzC^`BW F';Vi|}x6 d6*hVm9)a=IUB4'-ԧ7"9ؓ<7NBG7=Ae0TvvtU1L"IP.4b%zv%l87_h)e{X嫕rʍ}f7ψf4:RpF<ڄP(^K?AeH֣c4\`ES" ?4G[2,R$;u6TjVQ5U13 Pc5=AdLjtC敠BZ&hng>*Rf>-rUoVȰB)*HMtVu8$O6씽 K5QcOUQxT/CZa NnQ|G+x:$\-5JYkR;h'.ӳ&; P^_@clCi S%;:)B4EC:+~DKxUҳ#IObYJTб+Hp;TǾ7]k33^RUeL< eತ)6zU {?n$Dsqp;)TFA4VH@jlMǻ  YϾzqx}㉌ç҈{xp" E?\)PNʌ#a\<ݵDΗ&2#J7*jZto.KՎ,Q'TB&IQTCu^8 D)kiPVUkbTb/M)ka`PQVo&1>R0?Uݵ!YXAq?(=Wǂ,9Ik_A뒪 ' Tlf .Vא8d`/PRۑJ*Z Fu}2wSJr.-Bzdr]1=y ˹:`Aǡ\"T貣UG7͌7@L/*qnH4 D{rGK6{%/$RM}_uC0 6B ފm& n"N]SzT)6)GeKaf= D :6bœzk@4.@r*heծ&RmWXmW-n> hzB?;)Y;X]L,O3YK}tt w4ƒJbbjNjl_Ї0p! r.lXa@45sf)͛E%sV-mEQ{jP]!-5uQ:Ӱc2Ňoqhi V\+trqmfh mJ{hM1]H+-.cbzU3, i 4`1h0낷1 k =SB?֔v,g UIC-FaH-Bzkg -3H}|cpzť phY KՕP RfӕL *SXXЊQvЁOb36&P[|C`h2vxFʣrGv!Ue%}S24ԲXY}i6aa4'J/~Sy*jwCTh]jlkx KU*JҷY])=2e+pPkˉRXDzuL$ gu4z<+AjVjGne>mncRwGW$hM S+g M6ERmOI )[g9O0Kc5Gb=@29RujW5U.=Rͤ`Тi:lC N W'YrkNz&EmȜi8Y.bsIY%1Tk<,DMj ) IINTR{x/͎O/'\Z~簷wNWHMIɌ3 _6wx9K׉wYnރe:gn^Հ,*sEe13ТqաZCL@zgY'bEy0D͞ +Ru)\g apPb]3l$7.m9jz Q[" 3Q` #/;4r⮡6YW96fIOE3F %$|Xj'gKLM :Яh5QR:t͡\Qdgw+Go[lOPfZˎN4ό78̷a1(`$ͭ5Ud bzbPJŃ;p/Pp^23VcSĕt :^bUj :npH@wFg DW(w!ЈB+ʴ* S8Ƈ(y7 ze BT4#^LEDW~./)$8WG³Zj]nrA%\lZ `]ldlDr|P% ك[$.PF!xJCz&ҔI0>FI<բ!d.pH#e)T;T+Ae(goȃ;ԣ!;יP5NnKO Iº_/a%+8[xa?p~*Bsfm^/+B3,HCcr!Fԭ+5j:nO^A(,J%[W{ Bml Iiumn&ZNjHkFu*1h$y{WCtʒQa )yIUy(uXJFvP-CB{ űxE |ЕvR65B~D1Lߐ'7NG Pe_dTUp J|I9uqZКdeRr$;pf#ٔR *lͷcv ɖnjЂ#P  |Ȧ`]\EY!W k35ehh%TP7ZYd [45E?Sv>M&D~Zq+OT!N3n1mμQGpsN7koS`8k;hɈhbʁ떡GPg1#Kq \͝QaM2GoQ]6ػKrH0_3 ~ꃅI"?pC ހ!pu sKY^ ;kXN UϻzHW"Op ?JVHpκT|0pRgm`t~28wsgKA WNTfEawMҤHb|elw 0ߑ%-KUAlQqD}w4kh-m &6w`,ry;p!{xφX|ni Mܗ}q z2Օa!߾܂ TU*ܹTD+DGB圪̕L9uAH]w]&Ik 3{ ֫k/3|gT|z7R Wr%p6Ym`b ȝB#\ؠI_/ ٟ„ S,2P!T "x m[v@AV[85o\ VFQ=<~J/-Y'7F3ZL>7StORRJZM3+;9#( |=`; +oضm۶m۶m۶m۶mϞs?3٪T*;UI;髕II'/m21lho ρ>+w*$&-%2{&m|ٴu@틦wq;'; k 83 2yv-"ןؾ;dZݼ|;+;04Y`}s,H7>Ƕ 7=Z7dJ7Wu(=7܀d#\Je+墌L1  +7*0jCpJm,p0eHO#rrN0F7 @BN‚|U{.i斶ޫ bZu(+rhdtVi SMH`[vo DVtO4o28z%^E8m@hڼqVZf<ܜ]W޾'y͝y7i^+. T,>2TEFt߉Gig(=\Py-?e=`"3\FͦžK-6_:=eb\IA [̱tu&|au4v3n@sni5MIޏ^o +< `$8I[s~B{yقh6m {6=zj˞~&1N$H-۸2fK)Ȳ PkXݍJ0>{z{ |0hzbLz;,'΢I$Z_FpzX >:\j6hū_暭zTi~ihlv6xHIJX>m~2sE2.q "ͽCE{94{8dwŇ0"ծTz (†kC bMCυNC+גM'SCԷfk,)V;_ Zd34 #m1ܝHW譞?[ċQkaD5 Ѻr }Fv%ҵA+zT&0֫``AT觱豯äK2x3bN~KzHSODaϧH0IKi϶r*zP̆zօH)<1)zW|716El!-<O[7z 2&mFvQn`#at:W~<<O?0Oؽߗ4gpO@?@ ysgOO>OLy"sxgO@߀>~y߮|s>usJ Qۉo4{wo_@? 0vQ}Bd^=tow{ 8%(!tVT?:>9tXP (lsVf:q{&PY\m1zù~>K>@}͂| MT<~ס!E|JԢ8>PwO|Ll"UpAڝ6%2nݢa @\lFGiDy_d~Cw 7zu|xJmֱZUͻ=BY}P7G멍R^\!<"j68S<KBx8Vyca?2h><` [Ş"vQEDLxLBN8a e_8OvYr`X`AYQ?e&% GbU|Evq[ .ezim-} '$-l:#=TY4.g> ftó8yiUCnRȸZ]RV~@Ieݗ )NmȸGA[؂+t VY<H[l&J+&b R̤W#lmڙoQ_,;J9[U G[K塞1GOR9sžNYژoj+e8_Ād8;H[hQDUV"feޣ%P%Cnj.2Z/ —!a_et5۝>5*@؝Zt>6&bz^V6A-9xy.ܗ{FQEKrj"❄gO ׳wЯ5$6Ei4 -Q?y~^KѴ*~XR>0%dAvR =E2PA|"WF؟|6}Y=-A-3);->7T Ccx74~FG<OVgxø5.џ\U kB"Q֥dAZbR^Z'^def>=$b#%npc_RIt/ Ҽq\@͹br$vBWbKblS0P}4Eз;S0v;`/񔕵L Ngq99`OFd+𨪌SH3sUQj3S-zRyCJ?=^.&^Z 3M.aWҷovo!y<|`?dpr vhd #9y>FMD! D)bt|T!ܫCS-X'0BoS泣<beسHL+뤔6?ؓJNw,Gկ}w?_}a'G"HYknl"~²/ (Pa_G$<177.dz\7T -R|;-ֆu5o" l? |U[46 c{%RlDhCC"7i|_۫J*Z+#`<{W5%17W[YX!2F@;}Vp:QaԷ6F()aj0x󚠠=`J,Qw>o tuk"B&}?dn$T;VSn56zߠSc^*n (]l۸}f:H2mU9⾴>F=]d枻o6KM`4!RL~Ů MuV󵶫镅 4~.f8Է[Yq3{c(vCrwFrf]nt 2ޮ3HnY F]f")B@^"xj*hE([mGlZOc|=@~W޺zeU!rPb-~glp^NBu \__?sG8f 'R5Kϻ(x w}<9DQVY`a5UFN~^UZ!Ixlǹdԋ=|=},\h ^.dN ٔ>Fp>zsv\I-ġ+~0\{t?tE⡰/`>E=+ǽƜ1B vS ^1R[޶y7yH轢qG1P#iۤ<5^wI>dX4*A CGdϻDJmmGCۅϭ=w'+&ދ}2 V |-W hz:Vg twuMkz.tguMhV71[g%W 7㇊lv_1׏wOۘK2vOۙj7c-F7v wVoyR/ro_SW\\s/۳ ӊ//2G-./ՈB,Ar~d%TPu HۚR,za[]8ktaA3ЬHRUH a(C ȄaR)%*:p^Tr+ᑎaBY.j4ۻ</LhjZ$ϡu$ea4aK}D˘Z^2:d3ǡҵaK} (EmŮ-CEgC0E{ZZ~YՒ-H b/E|!)zG|),ew} dAVa*EdGH- <+f+FygCo ~`lbQ {b}k^ɿfo݅E2Lo@EEpwі{q:TOm@pk7~+8݂4oP`:Ē^%;$:?u*l2B܆2/N}BRٱDPvB*g&V> P/ԮIїnT \kRǃ/bݎK su Ѽ((H]y <69KM&w\>q97#A@:qt-L=S1RDWD(*)fTHy[96m^l\m ̬GXكJ1] kJHsLH!z}#. "kvG2a5(ՉJ1,yHg&@掹/yXMTո[ߡ&>ڢ06B C7݀ V`GeߚaMHƝ,PUH_!Rt "G̹`G p㿟bgh$ZѻʐoO7vitb Pq4)إB~̗&<{ypbΓ4F-!BRv!+عq${P޳k@zR3,)|`OjL{hf?M'xX߉?m+B^Zv;1 $ ZZ<="LRX(E%pJGVRTLjkg*1s7njc S՜!CbUV6*L'+5@'h!\d NsG# B6$h{[1^|hM3İwu_hD H>{di ʅ+8欏?<Κ)nH~n'$u?4s=&UB+hzajwsN`RrwUm,AɜByx'JMѯiyȭjbS9F&ضҲ1IKtke-9ٿ9\r] k1P~ J S @J3?7vFE" nJcgXͣED%5M{[׆Q>(~A+~"[ZG&rY':UHWׁgZ,Xv5&xȗlʊ C="@ & Dg?uS Q'2Hwl LU_9hȑl-AqKGN~kgdʨAuPbyӭE| d7v ŏ%z|0k lfO*/ c SBdb=o!2OGk@tݵp)־󶑇n`+-̓٧uj̱Bc={9}띟 ÆjпlQ{ۿH?_17U!ݔ}~fN₂%HH2&ӥUTWCH@;k6wlhxoVkjvty{:d'x#b ØT@:A,bT_\>UhtV )Qg W Ʒ4IyQ D(Uo5/eȍ5P$B(ႻjA"?lo(8kr-w 80+H$%b3ڛ#`/cDu8, nKKnzGBgyc*_cd؋X{o0F:d %Cb .?əwSRRbFSG =ęqB_!C\;*@ݷ3/9y=MtR`3FcCT44WsB Ʃ?=g?Vb'C,#UK ,gƙJQ콇 11Js&1(1l G>e0V++ 5FgqXxg@*:YӁj5^K?f'R7@E  ޿jzAB&(7L8b1$B87+,V OfCkY'J ,e~ML~ rZq>,owKٸ^,hŊ&16b59X6kxsVAB2 oȁ-}?:=Gv,N~WUZä?P n{.pȱEI3 f?Ň s2%\lQ9 "}*YTXn>+j=|0Lf] c=E B?3Qu` ,&K!2Ǭ@K"LQSLJV>u!`i樀Hal)XE28RP𥳐Bvq 5ʐ:z2~5d-;+- 3jkÜ pwcJjWYv 2!L%2<94PYLw* 3lrK 3j^;a>D!M50+9(&]%[M/ZDu:o$QS"T4d"G˻4EqI [Car|%q-%>&%]!@J[ŜAGaql5a\ca7B@9Z5Or՛W]!eKTwDJQy|@L.:aeOYV=aPVnL4B5.IX-YA`윎#a!bQ@|il_aTLUC{HKUAL*WhjW٨h[}2WnxEԌ81m2\*DB]" EiIhUn¹aEF=XGe?ѐޣ@:=|vԠ X]̆})irȱy)%HܦfYCn;ѫG%^rIݐU;>yI,2)'k"ҶqVcleK 8 @ş/^;~k*+S> Y|lf2w(X4oEA^yT 5U~Vg+aNnk צ;NAz]Ρ5EX;ǛCXojpmopVO!޾gro] MC=sm""zTIa-kYChj-҄'x0uJ@4v6y(;}g/Bu3Ȯ3-/l $~Z@e`u53Mqf'~p;{h&o;Y-];a,6q—Bfh7|`:ĜO g\lIc@bꃽ Z_;Z@|x%A$<1d٠ 'lDP3[L(zSN3B]! sVL C砌&z!immo2"IgBy5ġnBi|Ӿ"bIWNֵ>fU-lën\'/_U0뙼.%z`>=oo}nV_<$E?"{_~<%En#i˶&&RVskJkR( r E`IoIr:r>„K FHv?F_5d(o)P5[QJWxݬ` Hb;@ lb-^D?uyCO+礵/K7g)*Cϋ|Q؟ pqU%)̲j pUEB:dSpr|wP؉2.+cF! \䤗T1֌ 2)A/ɼ%!\nBxqʾJV3Fj+G{Itb营Ga1hjUKQɜ'9u6GSTQxWlPƘUN2*ҽ-8j ~@OQkLgSlǥnKJK_6}Nt%ZVo_|<xYZ{npp΃ . -.[.he ϘH*9^3S.q ?D˻IQ1ZB1jHqZCn mɮї"{J[Xc:~k#}_P|($5ߘNe֪S69>Yq=8=W;u긎V_sixF_m?^[*U%PzEݶ/ZӘ9Y[QG A D3xnw'wsS^Kg3zX2R^':H풟/)bڝP< d!1c,"-sU_QN ҤȇCYU]+v?is1! V%{"l3M8TJh^P<I 3E572/p3Y +87ǖ݄DW` x0!(KH)/=NhHQɢB6Z<ͣl&ߦuEV{ۥys1]uu=kŽA>uɶ&Vٵe,VDp5 >J*{LrD&3:lsoaUDZΔRS}fHI4FZ־[/N%j$d:wu6&_-Џc$gHok&`>1fhLLLV=;2P&xHV{1VjLӾN40`fksurq| ɮ(;W`ykؖO¿jSxme^ T'L&gMpE[yɑ(q1Jt).xgq*1JJZN +SK-P)}KSk`^DZ,cy^{S&C”e*# P3h9)KJa W_vB-N<_`c8%F][rʪlXKFrx>(M0BIBNLL_oX4~'ҬJ|N@ C+ JFrL%ib|Cdx 7y5zT)KqyL$KQͤ:= S}2cH1=vCM%k,'G-t緆{5Hd5!&TН8VbaF 9JW> Fh"l犥'#WjnL9g=]KyEјC&Mg = $_N*a4+i^ZKG>jhZjqEQ2`;O2t{_*-P4._Sv")I>6u60}/+X1ۙ3tŠZf쑜0Cum!w >8|Ŀ-$[MH7&u`W\~B6|zC+(3Mpo1M_*(ƅVO閱K;4/z̄C)/EVjYH*e +s2/3Kck٭P{_~sL~<njBf`.]x(dq&E%kAp^9:x :`GyXz*Tqtttvaƥ91/0Ř̅#22[%_l#1zja"yvÕӷ68Ju"bU^/0G|.YJ N{'HC!oEL\]ĠԺ{a tFB}͟^. 3uI{I`ǥ!La-n$ S*(e[]c.SRim=W%@EFFx‡ )Ѧ+񈢴d%o*PpрrSk !Gh8~i)5ys tm xm3/#K.*{LTlwt1peXٳ,+_,Xnw:-e qV  ;Ar GhENg }2Ń8^ܔCppW(1?:%5{Ǥ@ k` Z'Q5)9:GQѺr6` _u]xN8@mC)YRAtǰJ$SʤdK&-=~=)heZ@;;pdr^(+]ݻ]`FH ͬŒg}IS0nQ?Qm^%k=\R6GFdݕbi 8 NN8v+j0e[d|B$zD k5cz7@^9 \0Rغf.OUXމ78>+頽ẃrUv)2[{, >LW,nDsWnd@VP `эf{B6u9qxTLɦ\lOi?"#[4W=LE*a4RڳK(*#ezӼەqcxDSZmBQE:1aǵ$ؗv~.2pFڑwF+w gO\rp)#Ɲe{-X͙C}3d=7_1Ge)%faZ3vA_=HZ^PЅf,EƮMk^:-VLuGwOu;\ ;*F.(L!DUUGE!fԺ<HM4BtJ 9qQ(z:y?19N>h9~=| 5m ĺ֭Yx>v}tVT.|t,ٵXB͸b`{L4FT};] #]q]mBypya Ps&Lrd<1ј2 0I7VԢ(ن<} bF&ĺDe\*c*bL)->tMbZwDOTg['0T)>f ff7S2 ٚ_Eܴlġib*(v*"| ڟ5JXعvz]RqXph̃)$I |NCݨ{89&\pa#rG`SrxJ˔Np-׫JWa;f.!|*yj )-̠44ͳ{q/A=/rfC{ ,E+klZ ]9*S֑xpvZckpM n|RX@qK,!ۗYkF eLF] Ig?{^;qr؟R~jhiX? dc3Y壏 Yֺ(m ٨w0dU2o{J++v$H"5żizg◐O0wݢ\PE7EtTwtܓ %eMF=vi,ŋ~usmz {d[m94P)E{.xFD&P]yഗ#9wW|h+- OtLnmO  F[Oqwp<{-H 2+E{w1C[cYN q?HZgǂģ:)%5jNF9AwH=G\~3Q eXFcUSb od5fӲwd'H{NEyCȡ6*7U<x[jkƊplƄ9] 43-Dфm<}p5dD6p|ָ'l~ @ +mTQUbV%w.]:LZ%5ު++)q8ԫfdZs9vh1!]s0OҊ0S5ع.UN5~pЂ?BpJ<ib#xH|lV;*%~N8ԆV>6^u-R>dOa!aVJ@UԎsdvfpbyIM]ފa$)?kK:t+U|ʚ!jݔvhY14tPޔiN:Ǭ%zZH)sWD+;xέ;sm<+ ?wF'0hC]kVQ M g fP*wT+*3ϖw՝wA|gwORAe?-M2s;%Ԏr-&P\{z/ (MM*xæG3vhxcګ؅Sz{v"y]vug/gՌ]ZG3vse_gהԊ8`R\x:p|5Iļ x=ۀHgߝOOʣI Q*ДOB_RGw)ڡ{ 9bw{(3HhG w4j@邬՛Rl*v뇑 hRt"u+3L#!} kȢm?{lb2"RR6Iy 4 tb9V^)2 T4>=B Fj ;N?=,zH>]R^%wJS4:>k<}ȧȨF{o>_ WD(r/ UAX+×LٻyhwD4 ˶ /Ǘl:!xS)JyHTsZ!Xh8;Di\)dǀU2҇H?#%>inϘ})I*lppRCwJ3x6Dzz"2 ؔwnϟxB v34s2q/OEkM%$,hz3 |F~3 <9"%vkv#:5ҟakH\?Ϡw{t3X7391_ddLP.f.giΫ.L PA{KsnPb[h Ы7NTl4};`Ƀ}! ?+ܕuqZZ޶czIӚNbD T|:;UO;o~mnJ'!G͐e9F_ێ߽AD2LA?JB դ <Ԓ`o R&I|RaLCPТUg|2]P|@N\DK鉫`"ɡ$)7vb7otFEr]}EL`&$(Z5->sot$ 2o(ׯOB`ۚҵVGeϾ<7u\Nj#e^A}ƣx3<Ȃ|`]-HR;_;A$!>&Ob"g .#ĭW _4wgjI.k0{Fk=}iDg}0%9\DM"M;\ψ_&]8)[WG;A GL4 sHԙ?-z.PG h*5Ͼ $)%JZG'(E ,*ZLKy#೶w$ D1 ca**'xҊD^? .;x =p ٱQg/-pm5E]M7J"JҢ` 6" Al5f-*.KxY?͓j6Z1ab*ϟ $<ϸҿBҕ5mU~bRSi,-R] P){/s#n~b$7m]Xc2#fwFwgub ՠJ0{kV,;iJ#lJ%ML)jVuYj&"g6]VPN݃ [1Wl usgԊ'`JO6͒]Ś>s[, vTVYlϬ3 b!B7OG0 e ?N  ݢ@[)EGzmkg !_'EV;n0DKL܍"㹐Z]EaQq %/g0SZx.eiP6y7" Q.5vՐOn)m࿬SΝV*Y|Y6їd4(EG_ڭ> ?w;@FaJn==rZG&1X<g=l.վ"y` CY$.DdCfA}rF&NJ`ƘE'd7~ǎ啍 qb桙q<jhPܮ9.a,+pXt@fY_" zE"Qe"WjZhbOh԰sbevMF 2I{R)4ɼTr|3AnmR@pum/[<33 kpf\+rC\f,U 6xMTiΥZ 1B}i2A}VwW Wj%r9bYNlui+.#:Zk8'|Vo iITov$%8DŽ-J8VQPvPãbM ~AdU6ʓ5Jux˼Uj:̦ CS*/zji6e@-C筰߀?R_dpк wR;Y'cǢT.ᔱ (YZ|h~h4f"ޠ<5[teljirOܲo]kLNJ7{'{͊38jS:|D'l$rOT2m\&6sE<#9M_RZŵW[5QaA44fqL_MD>K=.%.AK8ʆٶa:2V|<#ƾ{6-I=O.r fT }=V[3#8 e #\ WZrLRrgn|,][l8,u%7l>Id*t4Z7et60?MWX v~l2P5X#| ѢTֈXK,ޮ:e*zz}\M^gO9wo~>Vc3߀7ϏEkI(ܻR5Mz߀E:Dt2mTh.d\J+U5N0+bF7HaAO"[*_ٙi,i8Uk,׈nLZ r+PӬ_4y+Dh;mէU,cbh|qFKߌDnMZӌGi'UP.pFw=5uda*yYvF js$GaD)GD 5F.Jߪ')ڂ qҰJC"͘Qו2$!7.5hf`n;wUYXNQ{egчCJvy"mjMی$ќM0;HCb11hC`H5ޞE}I/ר$͏)WQ@@x-ζfӌPL!1>ovnq~ļ-giC; ߵ3I  kYG# H<>T6+3[j(TSr6Q"Wd2R ۭ!X*+ cLZ sovx(Y%je6 fz6 mAz+fJ9G6WhÂgy0a$jJ´+HYO*YD+N4Pv(6y:`D̃//ok /M*>d5tǕq(C$New9cDۖcnR&>0j{,jv1WpgO3M5TFdK5Ppcg)֤CR\HgmhuOsK(x0;suҘX@}4Œm9čfyeV ~+x\u>T3*Qx=$ ϥ>+C _>/Wd^| L0EqMAF>H~#./|Bta%:pl5lÇgd1'#WUl)՚º\C?>capZ]@\_(:;LԎ3bσiݫBr[FZGvΩ.zt۹cҪ;ٿhWN&^k9V~nNT('dv6XDbUāˈ@@ Zu#QA&h ƭv^N8ΰ OaA(+-N>߶ZMiǖ$Z/>C"Q8ČZap4)B=fjjj|h 2j֕ *IkYo[q:;L,YFRcI7P E L[e - H}Šn(MZ$д{\K;(jG DUېR,92w%S8Z{"-!>\0[qan;Ҏ 1R@e &jrP .422i80.EҬ']P,/*Io(+Ibڊ:bPilg"zRGp١c5 i۝N&Yؗg(KbײO;cWm^&{.MEy tLLNߢW䈜AF8%HTN 2[?!ilx ‰E XG\pzENUӾw)_'ӝ%Αc[zɬ /.[lhIHW>'O_ W0ۋ pPo)Ov,؏Şg`]qx>fIǘ/Do1 1,-ǽnMrM)0[<'U\"Wm'[:NEas>~zE}@0""^+PwGU+P*%o*eO;.;xSV-{W ;'@꼿;қ,Y#wp ҧ %g ̛Hׇ]ft1=La}A|W_uq GgW&ʲbw!Wx$'x*"eWuON>g-,lʨnDDgROҢʾ(M|$79Y˕`Z,$W TArۆmsw[#ְ)ikX+.ejV\L8A{t 3S3`{'|3=+dZu4ͱ;fL ~5w'l=P3T"/+7nne#e aP;P h4VY$T%0l]sH[8!WfJHh %}y&aj!8|Sut| {/RI>ȜDHec3} _w۽ɤEqHy]$%o.T^~{Jfei^D `P{f赪V괾MRQht ]M+g8Z_/ m#͂aS +" PP2mSz{'PMF'з2eIg[{Br)2Ar9U䇲٪o2١W#gMCЅ>F/tE;t ig:'%gG PU'l"AuM8-,Ow:P7\W +W;J;S3UzZܝ87b4Sd-Jssp讈f#q} Q?kބĎۅEFVvCG֑ Vۗ,3Vr#FɂX?Vjˁ-D G],2wMK3H`~38P:x6MG65n+mFtʀOg)iLԖz'}=wd%Ѩf@$ ?|cb- 鲇^Fq4p[􍓣K2zK'rt.{w"Q޵vkk~A䔯i؈x*^EqQz=pƵQشOϮ\>;M–x ï6Iڞe\񡶕m{avdVùٷQ]:Tҩt%fj27~3D$W/%^6dsdrS EE1TaP[#JhA5M>Dŝ Da/R%D\[gXz27O)ynalT-/ L*Mjrm4$Ng[0oo|y}|b% |Y ŠEpbBs"EC41pv sE{)J'={>h ܓk86|38RtA!KEb+ITQPjqP@B qyKْ>EiG('{G-*tĥn#'*d\tCV})L_#gt/-7b\cO9w{mChBƧ!,$6iROr!%v)@Űd#㡺axK)brGQdo SޥnT,0LXu DY>꨾` C:%[¶Z/7gg{ARȂj l$u2ָ*d5jca֯RiJG茌 N n,wr?|Ld+_C' :un=)1?2* FNy&?<"ƇG3R\TdR+2Le rpqh<*nHGCesP>)Z F{լu,tAawu3g1|) U ZBMdf<.NZaUXV\LVq}lsuF^oXĽ(/)ft&B$ϔ/$;EtmQ=$|PX+/™-U ҀT%jxڒm=d~h/UI1M}:6B̾,ӑDd _1HuRL]/EqB: S]GQ'B߬WFԲOAtm_`ˉz%'+oB_22aAR/BJ.HW)Q!M(N`SDTHE}U {o M$?j^J˿& F}q@$Dc% 0G·&DR֔!h0-wGHpoYdevgLz};}_UOk>Qc稚WPh9[nLQͼ?Ʊ[0;Qo_i^ Hm/$9@Pty—&*DyT"'j: np)]HP)8ݟ7U[2/w~ 6 #u` qǧ9覮;R%%=u?v7Ls$J $(Us@ޯg,(Μ J9l XwKNmC/ɜ3 ~=yԇ|Cg#Y;>Dm6W!K 0,5JѦR:SӮp']np03Y1=$&D3; Uux˶‰5T3 < `:V!RI?0 ^<nXz,fi JXC]&ń$KE<: $QPu,] մRIhc?<?)HPOuLo"0s]'/o@I߆ҾZCԵ9"A4鈔ZƩ2 \ %^C\u, N]gg) C㷵0ULy:|Kd' =p 4{NՑڡn'ܼ1 "+Ix=J=omV|pS{ MCrؒks-DPj8s>旅/!Yܠ: kLF' KZ؁c .T I]x\kT+ `Gi.XZfaL9wUz΍)>*eWf2{-cXWX0lz -@ p!N !zPX>x#If:PUuy/YÔ t utLDLhn1gJ8$+\I86 z+VWH nw//xX-5C?F{]QA37i]SkvAhk)wkzip7oJ0ɳP^1 oF*Z)*Sm21? v)Ck w]zj mowSƵϡrm͹")?5vz֘pw.Iwi#Ī@ lܜX&t%rt 8 ZI,_dۓH2+b ocSmK{{EdyV0R2q1 d@M&iėF6s`]S28mxhbaC<]Jx 3"Lh#vtaߏ?࢙Ͳ&U.=9 S<2j'' %KڙH(ݕ-ГG/☀PAQBf&#/I2J]̣rIo?Dx+$^ g.@| dmqvi?({5ECTBgTbї%99 5d @~'y#bxU*%, F)R@%K+[\Ae+O^ J$Py]LY09'SɠfWbKϭ;hTW0bV)I;ܭرq0 )!4c6kҳkAe^P%(qϧ 48SX\lAN4=Y$EAȏ813fj}&ϮZǞ`BN= o)E2W k"C\?7 աEŤS^T̯.MM 8~D Mx4Ǩm:LĂ.q%5URynh/oDI7bP` MJZYߤiVٶ0+yr*3Sę:Oxowv,vҦ'ͯMe<7 W=149- i9Gh0fn2f )YZz>^mOD*h0.r6Җ$3CIc\LA*a7C .k^F3x?7Hğ[-Ura{YP{  nh| 4 OpvQ` RFFZ+mtN&Yu"4>K#ru5PBaru4}~և{7z5x(B1c6VUT>/c˺-6M W'ҙ j=#*+1"+GCDږje]{3vqx&Tjf!A & 퇷JZV)S)u^6#$iu9AF&TzQ;x۴+PES_;3A_]/Ťb]줭֌1f B4oN^|-v>R/b;c"_CR yo./~Eeh֦0̴Kҵ 6H7x;41Y_{K/9,G2'5NuupU<-=翩V1Ď wÓ'+*͆k[JT\ᚙ4ϒ9+1jE嚜:/,m)Mk?u) ,g &e[He$Q Aydn n@HpY0V5(eFc--YYt|Wd}uy˒ _骸Î-xͨ,HmE&hף"/D%WZP͍@6hX ORE9A:#v-̇41y`W@awek9һf^ta1|A) ;c :TS3U-aD% 4ʅ;PL"1jXLTsrGMdbôp:aFkY @nDE+M' ,]= =f\X3[o4Řdk^@ݒaHtN ^-1m2/Z ,ڞ^Lr3J vJUtMUIѪe u3hjpeHYaVJ1IY+<4]A IeJW-G^U,`^3QD=Ӎr vg4~tnPe1x#||NF7vX=&{4%T$ёϕW;Yl%MZK=J:I!l?lnd\s d;U$MDa,fZhzyi=|FT aj.M(]Ҥ2$:H! 7sdz~߇kǷ8Fy}'ǏM wHon%X4 \>zc jK5f4lk桖v'I,׆i94KCk>b!"Gov'*ҫV(s()158T;/e7-ԙ#vS!pW::C6iWú *9;xv.(3"J9U t'3gQm?&ezt+=<s=뜼lE{Pz4Sx[įDR{L-1dh 1,7>FZM2P*%A%zeǿc ^ٗz/rTgʼnm}(-L͘ljb]u;L2dga0;^8. prc\cQ`cCIZǷf`]/L>p*@֌U+@gt5hwtqslz0U9rRq;Pg=ZMrLf*cU&tq'SgýhhnrfũSЊC+ȴ_nĹia'KoDi(T,/mw@>Yo퐿qV8d|p:νdq?{Lz|ãXd۷ `LGLBk %[6QY6wDjoȟtUF%j D7,Lڶ5TzKXrX>ۂJ~!OD#؜vH<5!1 J ʈC iVZvX dVl܈}0RX]H]VYDgLKIQ2p mgŧ aGoeTu1#ɬ.H]!|Ns6J$Ur[eh戚G1jKt*ΰ3i6!ٶ&A0' (L ݦHp5FEEFq8牡L(ePE=^R"0Uq%iPIPuAi` ZFfް`oe6۷W^4wKQR%aF ֦T] Xkf^~I^ʨ6hSt 0'>bCYGO`~g փפ92}n0yyVEШrx PB úrVm=,t]aqSGPJ= >Ө- /s emnT}%$pѿ0> f1 3}sXe1%!WOfyk6_C%?s!)PGDoA"Ħd ϭD=UzD 2I/M5Q Km@fPhYCIOؿ+D– Cz)fF#` ;1(t`QIr:GǣvTeZ0 Tq"O<#^tc޹bls|ZnK;33?G7_G\k(a=C.R48l&UGK=lUP7FVͻ3`~S>=覐l!*u$U蝮?[/ʼdzFd$ 5jX;ppA?]<[c۶m}l۶m۶m۶m۶fb9w#vD];3rZΗg9@3RY1Ӏcrݗ&}k w\,Uq%xe膵|PW"o֡hiQv 4z&!ko)/"~K)WuԿҸ'DW'2Rs^=lGr68;_yȝe}al^Q.drd>$d͈eEYkXC]K-~,jxb555ޚwy5Jii?+^lY q> `gT1iGLCٙpk$x\k'_X1KU5 K2]=i|^VmʴB5 Nn QpGHJ2>}&ZJG-i j˱.1IL5Pt̟wbS-~=BCw_趭TqRJ&fsS1?cr,;a%; f =yol_qe|m_c8nm-_'B`U֙ C;?5MǴ6cw(3[kP=mT'G dEnɞb@۠qBiZgpM5x۔4cRu~~6_*եb~8 31NVy98,j`<J8tl7hGB?&ٺRtpT4ƥWƘ4'=eG%ZE鳔k~IWժ+h;S45cI7l`ь7c #M8?1&;QÇ>8;R?7M.;+P[C`??PzEۇQ{H؍{yٻKl|V/vÔY]z1+OũY+Y+YSB0uΪɿ1d]hi /] aLc:=Ȧ,ӘUِY I %6‡b]hFo,Q5 *8T)#ZRQW6ue7k¡+FCi͒B D'D y hnYٽ!RoQnYJhPNmҴ2m5.-g#˂͂3&;N{;=k:)BnhF(%y(iG'}f͈ m9eNtq7nNuZR7\ |"cjXYԷ{M^(ܸ-;@!W<?} ʱը;,ml<tF;`c9l^eU-{tM3FvSPG++P^=ڎ`B>U5)Q>[5jM[+-(0tw[g*E;IQ^M+ ?eZwu1Jmnin*E 0 (^#0aXPa!#Gt̵j`x㓆/>BXEv0zLdQhRoS`#( *&`u'صJ]C ( ɱvѲ):`vn%ȄavGbqC0sQ,tR\"~koF/G7ӛ{2 Vfq"<іKo2VKX9b.n)#:vcHR`"ٷ1 ᶸWX {qjm<&Ϊ89浤1i5VvmHD@)ƃHE`T/Y }{S$%=ܒmK˖9RUlKF]]p7YȐRefIX,6p(ohnPFq;k  C1 19xMhtǝ)s(ҿUa1,"T)GNI 1p=hĖ6A)I!z>,͝5c݌9298x>1uK=JA湅V RMv1OOM.2Om_s9|rP}_y %&W)1EKgh} K=hZ ',ZhXdeq#OMzK|0sVД>>=xUl9rh÷W;D燩=mğ,QQ0d#A%?i6"/ ɌSt8cAG&47 (X 0|^KA!HQb!>)id$\N%.|l'i ټEeMzWD;$qHғX,`YC`=/t֗w*퇢KܵE#\R=*b.roˣK W< 7?AZ&[{'o<;bAW}N_AԞu=#"Q4?id!NմFRbEFDHﶙ$,fy&;>eldd0]~G1㘏3domI߈/"R?v=꘏3&z}ѿ1#N#Tȇ1U2ฝ2TËX$FEz| фZ. [ %FJ+s-O# j݂нy$SOS~@#`@,$VSY5D!V2ĉ%\33^I S<:AZ υqeYk5(?لM uzTgu$M  DC} Q%OXa0mV^Z3.X'\*kkTbSzr4YBXvJ`XaƖT> YiXZM65L0F5ض7F @C- (&"F7q&4͛(4F"՘tsiuF./G2 PɁ*Aw|=WP߱+(| uJM0Nkƹ@#m(E:v_5QP<>>$ qA?im(4yF  AÃαjC>aR(m'8[B!,](^ ҉$ qBXet*@pMD['1qGQ0vR Lj~ RB u ʸex-%S̏_Dg.=xCfs bdހf~amJuC|m |+ֱMJ-#Ň81X_1'g?o{x!;['g[gUk+Y(-ɣiǠQ& *oG֨.pEOSJ-㟀(/`O>O-btܝ:GZ 7OZبfՒNvM^5GLX̥c"_f Pf -6-fn[:u4Kodҫsb-C;O:ӝVh&[HΌY)Sdr̞N+HD=/Ej-P8nJ%ō0b͘9Wχ3ZS`e$)ƅIi ZCO;Dž;zr0'VD=](Ҩ07,b,jJxѤ-)ԟ Db=TxG!KH̑Sm~ Xy)Rff X $YkFcbSYy÷z3eΏq4ea7>ywկ fVt/1kPwOiZrR'Pmqui [qCw"8D)q j!!§/m!_un,E3y}Coz/z:ŊLM=A`nJ3g&53{Ϗv:xTor$-o֝rD[-HNhb>]/x"'!m ؁^] +, x&ϚBCG*TD0(}/I9VC"41h 7wW†ޡ0P;>J7rwn͘w8qVQ89XI.[2iƽxJFnݦoB0GGRUˈ.Nvv^W.zg$jA/s'<=m>r\+! 6]?.]NT]x6P,:]op'z Rdd[yEGnIBIüCgeOx\ PmI~lQ*;2A۾<7/X3iS#EW4FI "PqL`o(`8w䣜f?;mo4a\5/^]ZMIDUv?7k˾PT\9sJ?'"+yRR)㲡aZ1I!2¡H{xr~ $68"WB1I33O!w}܂(wky}DG9ك/̓r"lcZ ~Vfj6(IL$ϏhI&k2)] +Ry*ʟgYu  dl3˱KQπՈw ˒@Y5UsB| HSljSYGl)Ȥ4,ԊwR\?h[bu@ Ļ7/UYPtwm#Ln9A:B5[5v x D'fc?2l8N+eKw3g<;'OӺ6>J _hW0M|GɶrK^w&RA#j ΜIdGƕeͭe+795+7fɊ__זNOÖƚZ߷HhlgKpe "W|%^kӏzߠrzᾍ#Gqpczlrd~2M{Pw惻B*aB*D*A(͇&C!+#HHomx+JZOCH8DR'ǔĎl LX AĔNcB㢧iRrS>SFFPkCFgZYkNl]Ot"AZ59[sPS©x۷8 L eB̋S{3qTG@i&'BN_'>~-TN1E'IvPlK.k4$Km-3?d h#3ՍHikW߼RȆxo~Ѫ'81X21~u@)l9FPCL*D cg+M4h`޿*6V \]2,\O\V4Iۉ;3<0@Q3cTdFhj~&A IHj2%*6K\-m([emݝc:f{eCYyb`bE.gTf2bzeeA_3o$5"CFc6}c)Oђט l^ !"DV3RF=rcgO"zzJuډ; DUU0[^fQ6BzGg@X.P˫40b/`.&>^]N8'CRUJ,~"*U#Xo:|3"m[ $)rO!Hjyi+VJc܂ʾl@QIwORfADy.]JEocl46H{k>4G֕>iDL8V!( I͙e#'BڨXSϝnCόHb06eGVOvlr/q:v$nv͑A#9*ؿZvx@ܾRAC2oio6/A; < |3QuT6P2UA+Rg4:d#[Է}]f9/.Rljopd>pbCtS TwuYH^(1z:hM [vf=p>7AS^EGpk`Nņ\(F@ɑ$gxuUC6iiSMTe%ɔz EuAO a݁yIԓMy]kJl<8JD;~ E g.g+YZ16z H*ϔ35|Vf.}E_3 CeO,_: ثFoۚ}iw'W?%7HwJyw+tkLvAxM:|ʊN9I}]UPx>D4MonCyQV2Ċ_~wr*ޡ մaJ"G4g~8I0 ܌F81EFۧMfrn>OLradBgՆ3荹Q墈( HOCL)ex즇Yu1Cf(4VlO]'gȡ" ÂN4bHl>6䶩%5 O%M)<' e9w|*"!?༱l9:}"WFFm^|]ZvRqU46l-1%od0g{+wmNVg3N#qߛ_b1^6c#jEZ1s_zZ4SxfݲG.& .vXwSRݥk#kڳfIG-(Y169$4l~n0FYLT_xU| L+=M*uS/â"$ .٤TniVm+u(nA0~xd7 ~`yɱQ(%jր_S3K{0m㸡ꉿz!\EA↿e=rK9SD# @\$MT|_X3Ƴ%/m޵@ʦ9~ZYLoރta:! Z ubOaΡ CjKak$tmO|^6l{iF48Gtף6kN)Ҿ^kv#F"HMFQ_8,ӈ7fU'g<9hZ<8!_^X^]>D02f\ o= :M0X0Ͳ5ْ_oӘDИhrJz:AmG;wNo1ݙ1/^؋Е ?ț'ކ+5h=W[o@>֥I=dq1Dp+ ɑiY# KUkm(9v8MҍPG\?0^D)./@c%ΓO5 HkHD+xgٍw`wnƴC#<{-&·˙bx܍~]Jf1^Ƙ5_q9U_Zo9 _X{;8ҢԬ B3CM;nsM ҴZ~vDK&YH?>krb„[tN2LP;A9;Spjcjo!!f[$\)2"6wvI7[վze#o}{M|b=ё.R18&n**hzYMx$ N?64k(my2} = d`6e:P㜻! ;xpc؞{1l*Ⱦ74AbУϡeϛ@'ezDl@nm EPaIq5 Fm1A֣pOOZz8@6qGw 0e0SL7 ;UbŪ,MJ64_R~`.v)lՠ1~/4d98v 0񀸢bH?Ys=G;P ^}xI}*1/ND>-bn Oa'm5# %N7sTDm4ԙL@R  c׫g¶sBϕN2@/4{#+3:sgkxaAqBq-:/p@0A^޽ϩ'͙Q>yN74`b'bntE4 ?~>Ӭ wL x';}>\9봌[$Tطpu~ T,jhAWb4]8(E{L/A=p2_dFqdGWKU| mSsfzS+oMu\d_*MQ<1 [k [z%{#  ֢鮤vzb㡳R//@Dd@Vj ÆF1 (<,3XӺ~,MA$MiU`ƏN[I]X;tY7|jrOaXǿHh`S(},=#@u@\LоuΗg€"Sgơ%rKQ($uAET5$UvR<{g}굤Pq62J)Q@.lR/O%~HW[z)gpc:)w'ڎ VUGZki ѐ pȲkyξFAyb>4fرcϺ-ZNrͭ \C9IU$\@ e eOgf1V6xDo"HD ~EjNf[4|O $`+y5sT^fYWzpҀ8#ՑckxaT Ձچ|-%>hҳ # 1hpy9_oSnlN^anQxo@63"  $a3h@~Yⓖ4/I_K* 1f@M9-1+5oQ-um@V7h83埬cv*PC@~f'Q=b 7cV=wH jY 8i |YSSLwa7V7]PK&ɍbr#(~=gD`~v 󾣄!mXrW\k=_Ҿ,@ 7.Ί.߿5zr7WtX} %"H'*QV&Nllװm[;e{]`={Xo)VurpabPBMR_Z2Z~yOb=ԶDᠼ}~7d9 dVYw}t.-Y%<Њhg9ĝQ|(|1+{K5iyIlJBO*tEpW[-wtrJ՗y)DRɣxO?.+\ :3f<ξW8h.Z I ّ奠76j8׵tO: !`3HiG$n ;-. TxX lS4WDɞ,ّΜh 9ƪ^nʺ)dሮ\Yils]&ݓ)=qܒ8gkLn6ehUB:TfU\sHL;޹f'I) /X%9 ,}MT- KE~G6lݻIb:ZA:yw*uZlBZoW="C xj7I0 B v;lq.]z+]VDŽ'ڃOkew-8zpIh RȪ LO4Z''_B9۹ ]&#%Ib9s+ 'Xs'/*[v r( ƟORm"wts*/?3|i{\D =ѶLlʳΎ喝{1M' corVl.rE 5BmGo anDK&ZF! w8mLTߛC$ڂ1'!=>S{(·52C6Kڅ( !s6 wA'lAyLsH HGS7:f /e9NPnڋɍݔz [aPt.*1uT=k]&ȧOv2%ŞXL`"}N<^YFw-JHX1W]K 9 %VL sB=js߳;CXVԬdapAm*>3ŰM3ts;\ Z~o9'->_}zh"]MA ?g {B4`KЅ؞ßap}u5 bx0pg,0 'ǪYO2$ Gi:yx0ّL[0vUxmRb7֎c/ # i* q-GJKj0Q)RP{HaJM狦on)y >3azD's2΃-r^u`xOeq/gåmk]d(UrTao_d(e0\{}A AcL.Ð##%}YbD8/G3 ~&[`Ø=kinLLHDĜRL!Hs L ?^} & n8!*R =ԓϤJn_L0_L G(5)=B(Vұ'#%:WSқQ$2?CHRZl=?: 2яU;c -<4QCGpJ!9ԛa 3us;d&)Xdkm$Nj $K Rk}\ /!^㚣jC0Q|ْM፼K'Ʒkޣ|k)ƥ5.hRA\+xeS,MLcʸ8me^ai_8uh«3].4ji{YE{}1љq;Q720G}_:POذH̆e)ibfNqwoK3f(7lB)z<xcXUjVc'6gscg'&!2NIb|nXmYWsP๧3MFwg󢛬iw-nOΜZeXB( $ ˭Va[ (+?<(h2$yΠJ)Vc` 0fX&|FRk^{I@ERn7 eF+-ZRO͸P%n-A~Փύe? [3GlEm; [}G5;ػ[ 8Gg`gŠl-_3Jnm~Yb6ʊQjMl3Subkz= irOBŢ(ǢmsŢ@DSr( Zg;4G(#B(fY"d^RW͓{8-Sz /A Xza`݅տ j[}atO]'DoboFIz!صA5 s߼ubm= ضŭ "h{h( Owsg!6!YƴkiKXnmKyQǼ'm!=?0[:FIIT,%3Z`Ԧ,bXҏؕ@(%%K ~5%쌥?34IlU X7I}S'>%e*_P81|NlUd5x` ChљyqK2iO|N*v$5>jR{<o{Pc<) Ϧ]{``M -ȣSSP;nJR+Gnp Q6ANX6PLrIx˨L2Wk{ȨR_|IqR5UmhJ.Ky5@W)7sΨ5YU)5_T6w,Te @XF\X*(JҪRȺ6k7jV1hbrGVW'ݺ,7~}p? Q"?zc"qS3L<q29ʮ_9_L V nL{}X$?wIEV#ID-}CCzhK:`Y6C셒 L YEzyN|#$ -*66~#,Zn*Yo)o~6v9o3Q#-2l-ˠw3_r\YǸ`n!}se ݣtk *O4 #OtmbHp7R1(5ňI,7JiKc6ƻ꼓Q}G5e]L/w oIc_Z<﷽LPL+8&mk@0f$˨|%pkЖ2怖V-#=A Oc^+:T#`R#p60703ws$dBzvL̐כ"!IBD3u0ccAFv8xFU"4TijZYN8n7̅ee8|ewLgy8ǎl*~t~x5.+ہ|0t٤:9( 9τ FG2+>J錇&0*~[ݶcV<镈vi-<)5-A)4Ze`=^9د]2Х߅ZeOVvL f L!+5W,ԟƫU!MENׁu!4#^[V[;b]2FKʹy+ppS;G J`^[WF6/̮_H)\1=/RϧJ컪 rG"^"T<\F8_BTuêb㸔Xm\}H)=)NPŀyS_eNZ㈬I`4kh6IUIsvuhISU1"3-jU+O]s FDe-Zt-hLXriKFR~'-l3)n_Ip˳,)F(SCD=JqyX*PR|[YIș1_/:XZ,jP]=TӉryz*qD)^ OzZ9 $)$0Tn w.<-ؼM0GMA@y#x1-`3PhKLrc-{hKW\U;b=u_hP߹')NLg֋CT9Ǽ 5tZTu>W&u*Z4hp# Hy3{kV&P/=ʦBو+"-?w,t\eWS7 .Ō7Ƅ^ DLBH'Z5á -(vYlntf`($7;rV^c@lS,ݷ2#$v@Z}zR@S";ߔro$3D!1^DdKQaZGusA{Qis`KW<%8*$˱6ǔ4Dg`bS] xءڝ6'?779+!_ecrJ` j&gc҆ =Sh݇E*7ITe""RB20sID$ʲs=sih=>p]Fօ~`3p=;2Zt#uuϜK8@s.c;Ae*1me gU"I70"K ˆ]Q& o]{-9=3dk^ |[(Y.UI<|_eҾL}O}JD򈕶|=?t~>K.9bI5}U4V^OŷhLBz+Joc1w۶b}9c?t 5@iZCZt 9ykMqlscI_M_ܩYP 9YXeuEpl _J7T+bAZF:B'oc$bqc&˔^ `\6W3T9Yͼ7+nZد[ɒÀ 5Udaq *'FtIt+徶6! Ɍ> ,v='V &5wh'F_7ޱOrPAߤj!b]>Ϗ?0θc8EǜjǴ"NTP9Q``ĔGh5П=iev?з`R'wr, efPØ PyV>*X%Y >l9̈-YNY'%}+S5eEދ#ef$K"At,:>QVs閭7]!wf&+FwSM]I^QCr ء,mM,xE [*'}3x B 67L:͹ ̛-2dަ&%:Œs"?FEferT9U%)7 PKAk hKOnue9н~uņoA?dAbTԂjD! U`}!QR5ljV!-,3uB8v9a;G6=c]^{{q^LaQODy[ 3g$ErEW!_ASR+,>Wa$W[/]'b:P?ĜB{Xnċw$] oox%V$:R{>=B^>_4Jhl&lBnZ"n R}s_|\pB׮yK0AQר\ӻ?[>:˧䲤SA:H?F /XbzU>6mK.0rO.`rO/}{c)|@W0F`W3;``eDh4*?HF]R`4#ryC2?y"q^M ͋:Ę//Wl;N{[J^I?gDѲm2W _TBCuQX}5cSHh2m뵲50XV>jBD*|<5_KkjrI xƄoqUs {~Gޑ1_L_s3c w'H)@5yXT]6}DHwjL0u*_X?bs)W90}{ d7:0(oO7WVSߗcE3FB3N%@Ox7ODͺ%?$:X;^?,>=;?7Hߤ9<2jC=t-}ut3<̰ `:(@16, 561餺;.> 6@z;~?0F = @ `Ә P> hH?":$ [ @_] hs  l @Cɟڟ_C lо9:d> H?#:=@ ?L Giԏ xӯdv0z]!N@>O։Mh_ h|^fw n$%mN2bHl*o3i{ ηiyHzߋզ Y }h>>.xQy6yM(8_uEsk&וgyRS~gNےneU95hbM5DN^qm0Rpq5(f(֢"y+rHeS\oЁ@@saf}Dy='2:WCۓ/wo+V?lMll`DM6dMʹ̋b\M āq! Z{@\h-/7Or-7ع;,{Dm3$MSTxfY|$:V}jj]T4L{Υ-!4GI`},;%5f ;qt=-EFZ;㚡7Y{lQO'o\W[yS>L[ Vl1*ZmCzvPdې-vXAA 0"c3BŷMmP$Pgs/.QK)b!`8*1Åz 8.j7O]D}1kd"^#0@kA.}}sȨY[0GPbQIwF^4z)bPx$*vuxpwwM! 6?]}s0XI̛204T:qWiZ@eU`E뽀uCs@ 0[Rz+.Od%]VԄT,YL"V^ԕ%0S뱻p+߮vRa{,B>{EUC~XAE忔>s`&|fBdPp~Rn `k'a)8+|&%{ ( A O!zOLN: G !.$gʜxBbm=!7lB*Nl1Y" ;pp 6"6Y(ɐ+9$69IFKQyRY\񊼶;4myІnF!0QG0,QζŎukx``4 \Ĭɔk 1I,}; 1h0Yjlp *!`C@L|Xu(eS!g9K4Dԯ`6m)Lٜ+hy,cv(n z$ \kA!{839 y u se}o @G$q$(EaU4qqp@F@es6d( ԓQ#aGoQY3Hh0]QۓJ!lX-fpy4 Oj}_ROwǙ-J% fRJ5qyB KxϏ o -auaib?tLsrdE"~ad"=&v$q=6ph6σBqeZI^ M& >44RLXe` 2Υ7IQ!4Y( N $eXHj}Qŷ>2"b Ý9s^a2k Hy<6Sb/LYiQoš/Hi%?s߀jsf.Sp' wmS}՜G#,c\ud501S+"o-_#= l}ofE2mVsR{Bocغ|̛9@ֈi{Eûx@pȱ:^X,eq(_B(;8{,_g85iǾ[%~Vhzqڨ;/;?7V}ƤT*Sabl@g_h{  %wآm]J%x_CSBe_P$t^ǭBOܹ 8sVߚu27lBF+ؼZg[OPZ9hzoR>#̓^zgew9+CjZ㩪yleiiKDV}e?oQ}_I"K]~?~.s륾.yRws;|B#o[+m 3\JC@*Ƃ~&z[#z Aq3.Uh:2Q7IyK6aQmҁt.'=mtSIH]_RDhraoZRjsA Eb:F 'E (,RTA-M 8vd!z ɫ6ߎ85%}d?W|.Ńś,R ~]/ܒ|s)&v=HR R"hZ2w֔n%]厽HNa]0'Z=ISx[ه ˝T]vy<>6ĩ ͅY8u+j%XЖ.`Ku.L;/sK"Y:_ :zyz<=xFoe\I]\z<2݂5.a<n0OWps~[no#O Z68 DEm hY#v?7 ~27 >q8qzG8ٲOdPJPCg zB>lհG2 0c qCFB8 XzAIkC\$YA4ySl%1YUfXv~K o.sC}#|ٶAxBש v sciKm.@G'' !磒[Y;K X0; XvH<6k+I 4*rª/ )]OpUoD\A-Dd!!S^Ӌĩ>sHouåX/XO&~۰y+w2D!ބ.oLjnc-q0ύ 3Mw::XZ8bH’al(Į(5,g[rT+J#J3IՖOT<<A2$Gqi$R=\J!>]-@NCeH*z#\@#wP'ACqy'e+&(*'DqR[! GI>|u44^08(<=M brpWv?ؚ>m_܆=n I+vV#d7~&.,`Emw 'ĵUҵe2:(=n2qv+vȷ/LHx+oZz6%QVaE=uMƬ1aIz*l_[g}41>:vykd<"b^z&=a o`x n;r Y~!Mi-ך!2$jX*x ѣ)tv|Z6tF ?[ɇꇛ(Z aiz` w6m.U2jt<ʾc:;ʚSoE=V/_aP?YTAFoaBdjf̤jO g{) d%ntBT\Cz؁0pzp((Űn܈;q>0!F;7O=,:Tj64!Wӽ0#>06ѪQ QhYDMv\a:mǎ{g;RF!Z=W.p;Z` Ġ<~Õh yZTԆ)'&}bU}@u }[jxf=`FoڦFkkͽp*[3 NvRZA[l!ʍppGōZ[;%o=|7 BR>Ngh즩aϤn M/znk]={ŗ?onHoPrsߑwB_$~wLl4Cf}ܥpͰ܊0/_1%ܥh`F\D&K}9DqlB I4ӌVe3aLJi8aoqeljy|PG&=կAI b:hlcRua3-9T:,}W 1VfNnUiZǓ,R.| $!/.kT8Ԣ\?iMJui{ejpDM/q>I3Ue13xDє.6 Z^hºoެhO2扷G#d_=ԗį#aDUᙕ]ChӾk.NaC|e@uO.d:"_m=+z*k ?zm%ޣ Sw΅̎:@ nQrCVAؔXl_],֪J2݄;>5^ ̧XtJ J <|Mwc.q|_2{hz] ~oh`NVDCH@Mc -M\dIh(Z3s2|lϢ|M.)!NvdN$DȢNK`FHy J6|31W/!2oe^‡j(:PqThQ!pìt *-OliOH67iQBٞ5B> LAV qzԿi*ucoHM߰6b hOҭ2f*=4чϗ70sBw)GED%@Rx9 )U{ #(~BMr,O/H/ t';FQb¤*PnU-ȬXt:k0@aa|Gخ0D_ύf$nQ!SC]ދ|KvZbCO+HRo[ n⚗;.eI¨4j._3Sǻ&.Q ׉,{45MTy2b }@dY<3` )O8)o~]%ƍHX$Erl3cתD.7Ki#U֪FO eh8jP9DωeJyiW@fx.\hYFy+(͂[P*ndWl(4]!ĴwJze, lP 8pdTs!! -sGJW\JfZ(dVVb=d^ 9u^ҒOsSҵg q>V_>\嬸Oo]DS|_ϐvC zS"I3hr5Gh"ױQ]mh%â<5/$+O_|ZFx8ȑ>3. ;0$wú+Gma3CHRrGY2n@p [N{ 00l; i/0k1M_/$/&C\q_SUwҺ8mls?ls&U/B7,9(BR r 2Π!Q[W=Cn!NiO8kW ӤB$y<8Aw7{T ߤ_* 22MJC"l +'!c_hq~/z/ȟxC0G7q!&Ui& 0#z(98;/'U+%d5 _64ehխʁE(],(qlU 4ʞ 6ߊ&H7!\wD^c1$\JE+ CZ#v#0u>IxRDD)ukC_!2Tט"Bzb|ǖ?N7+_z@3#6Q{FȇB~ Jb>T?tׇh&(*fU,YLȂa#^)u{D^f4+c-)цZo9QD~B=u lG*J""*FwioRK 464'|}Y%{a_Oi4O aCE$ex3;?.)=lI,V P͠JV`Ze'4@}ʶn@ʇ`rvp/$ھ]\],V?"is }U_=-LA*Ed5(D5QKAPl-SdEG}aWqPG8'*o?in㸎{NOIk}'}~ v?ox8S\(2 B)>[Fnc_ +P Ejh HaqOjDFP֓fXāeP.6eA/RҍE3koAijh?pҢ%10fFA.V 2 h2%9o[bq#Bf4Ƃwp; v}d5ӐLyP0@1O5 G{)Gh5g|tOya 4BU|Dwpo  gsD-:3Z#TRk줾mz0ZF-HU9%i8-B`MCtE,Ȇ3p$?T&㲴"}@Y:/^;/`7.EVqް!v6QP3Hm.Za*K)Ė c>s2GL馸*!>)\kp5#s}jȃֺ@%RQVw,CxZvD# ,G8XhEQwYj<685h)la-J4պ.^q4LOsoPqU"4븰I3Q=YcghBA4 "@ow7wPveC7`sEYVtUG^= =oiiutoA*FE ?T.B Owg3<{_;BR`[6GE@}lEywuaBN}ݘܞ)oaa39;3ܷ5=u"Ygw|GzbJ­q$߆{2Yg~:k>\ }.cۡ"+hRm}bo,N>x09,?g|7DHGsMw|~ZSн%Ǜ@-$yIqDGf<29Gewb9t!泑)KȂeߖ.D6w@2XGs4zh5܆fG_~ s.VEvZŇow,i9;CE-(DfY1]q2Ipqߐ-j2\ GKO?zּ\R./Q+M},wYH1}R!= x#]!AZu!ԆܕMw YZSS|l6r:bL~lP (<2tq ,# ѱyV k9mmvg'R@jt%ah?Tm';B1= SD}Xpa5(5qY1;tk"?FSØV7;âsk2|'rѠP3$AJ]D5<8uxͪ5*~(ޡdMa8wLh*ѐaA0s7'TqEq9-QrIbU0#~h'^Ctd&#,}!+<򂷧 "WNs)xDB,M'Ҍd8\زw[FL*d# r M :7rRKXOTD@L}{[C P%iEc> QSjXKD=Ted؜1Qrb (r:ԍO3zOKkR2QmqtbZՐwX]#Na$U/aү)VIPscRg.z Ԍ V..{-ZFlrv@,r朇TvX XGJVRh$5 <#--J֌?m{vr( (SbAl`:r̗?CAvQdacJԈȃ]ܓCږAƖt,ƉZ>MwLrR u"W1Ƅ0{S8WO1G/\ jfi]C@#\zR=ʀ;8ГGnh3n-ˋÃ(yƠ.|aceRQt)JhV谏JzG R&sbptLv0fCt%QhvPe SRΧ1#ST %N K-S=z¤D0_BbAbBEi"1]^TnTX pa̩)wE09"wS;J 1M€JŒ2UH ,ZրZv$͋, Bb4?GL&<. qԈG{_uu "uR/Ӈ~_ ~gQ+nT}l_'eKەׄ\W6傭N\ԪoSU'?=M5cdܸC\_m8ﵤB,tAvф3- h [RĒJWJR<n ׆x![bP`/"6-'h* k${  oʉߕhʸj[eM;ooY"n$] zڕaqn!B@R/1^mȵ@ޥɼwy~">Uz#)׽dx-d~$7J_bbSWk)SN Cz@qŨ Yʕn`[3 ƻDV[J/9J/Y[ϻ\ٗğ}ı5 iwp ].;:9IhCCl]ǼuЅuT f?Mri0NDQ-ymIK[:~+hV&`mb>u}H[[SYWm(vZN:ӊuTQQ*%qb͞4ؒfweio\޸lȹ[<u)Eʃmrin"Xm*VM-TKelK?Q]؉+ ZޝSq0&turY\ٝe +\I@];uێ`1n5 gSSo-2]L;Erd\i}i^U vƮ̞q BMB._?pYI&cmA~Etؒm8̂X3aXP|N(L+>oh7zٝ~*W~nL\_3(A~w䕼ہ'b`M3|˗w1W{/0#w/d_H ; +Lq=`=[_K\ GH[Ssl7%r[)s79zܙߔ+EW}^~m֏JVOdA{_ RQ,t!-67Hا :ooz%׸Ap IcF&Ƈ]dGPmNdC© q9%2j\8l}q8aOb^DM ŶeM3yOaWUn\u%LW_כ+zO^'pY'F }+}%bhQ2yb}1N*zW<>ye:Y|WN##y&saXqgu(}MzM'&pI۷/}e70и:9М_wϢ<3mǔ5{ Odh=™i{uoÔ;JFDd":с]"+Ba |7ܛ~kZtǧl>=~kדSFܶ;+Ϝ"ؤd7>_?G!lk^v0Kn(#ٖ)+h6v|X'm)"nN(hΙ ^^/W< 1Yu܉H">LǗg*S~Xc/. (p 1/]A2veҜ"].=QZ^IEo<^EoF"=:'>Pn;o\xs؞,ٞ`c4(G}ZEʔ"ZÞ 3V\mY#nҖ).<"ψ<)ᆆBz4{͍Oz3~tgC=슅Mo;LU"S1!n/R7}d8U5R[^ۓň;mS-M2Bigh8(֌wA? 7n9p/ɏ? +R_\K\a~{݊IMc̪K$Њk.# {aͅY==#2/xyOiFpX^[UTN1(/ieAUUaFG,'kS%n3J=/l.C0bfE >L`$2rK %.EbPbA8a4bv,º^={Fj P.$6~@t_ԉ_bDy{N⧥Yt⻠8dI4G )PHR|Ɉhch>nu٘aqZ !uhTK24egP^Ete׈Rhnk^I|Jω*RStJbxQNe4J:95ѥ)NQl٬4N|xJc+/2<9G,hD/] .1Q NNnF`9ܹE.^L}^TU";aϸW'T$qS6dZ@Z^T2Y:+'ʷ#츕_h rmSn\r7 bǬSO钸s$gͲ x|.$>Q' {b>D)>Ɏb]Z,"ƅ~z5>FªA)~ڂq-*HfKu~Uɠg >O"P+9evW?R+!bW6v 7ONŷ{L ssvA*NgvXrQr@.L|HNէѡTY}j,g߅}P*4( [h喩gi(kHL*:S.Ԓ]%,v+RΜ9`%yLBY蓓ZJY">u L&Enba C"<}YQ 6Hae,A(aKʎL|f_;| _Dpm/; g g ߒ_z!ivѮ\rSГ]r&, ,•fmQ%@*(ShhˑIqi1-2TpNj?#_Өl>tt~w UcS&\pq{Q _pEU/I^coɶPOtUOU2>li7P.guMBvǣkNO۪ӕ/Ѹˆ+.\U f-˴8]' ["H)ZF58Z+!LQAcf}O*!uS[ᚿCNC"`͜FPt,lb}j/ Wh'[ . ("'G~†ZAJĒ٪hihYf4OEoft+>?>R[U'd^´U'2+j}K7QOپ~%v5R'<<)vrB<*ש"Vgד%Z#(yhcK;W$ *Lvv9@u g@!oIf/\Z/j"F#LJ033 $]QЉ.>dhxu /{:〟Q /}r_r|}-b..k ..}()`\v΃~}C@k }-~Ou1E[z6o gek ^ #3g()x@вMn.1%A`,,{7m?[E Ͱ {[ Y CFșCt 'Ό5MF@M33}̒Ō+%BzГ5c= =Г7]7 V&@`lл @L7M@`|л ؙ0L-3y?;A g|C[Y-;څ?GV[0h ⿐ !`[okV", Vk^F4V<"V!sccZ~?eje>Y_o"ZFClڤ47Fz=-[֭1v}N+'/yv÷mP~-0 &-6Z~ b1 oXLWVi=.>5xsʃC .wfa4y~fy{r: t#K [u5UZV R "yI=ի~:(}=5k؀\ =|OVd*êT |XBDh yNs|DK4n}ެLj+cQlT%zLE5 UP]^`nXbXzl1Na=D)BZw]i sBY 2b ,R*=Sd+IdY :R[;pHӶ-f@%*%c)؎#QkBYaf!Rh/),uqVmekK4` dQR*)\>AE8L= 46W^_Дms.KtPZ3S$m̛~"T g䖮 sOkN;^I*z ˗U #l\^td$(;Ց˟;Mv"Ao.q=7 +W|Pan!RQ#rRyK1ZeqN160`I$&̱CD)TFsR =؈<{y%y"ꪌ+.$U> 3N L) _K?FdCYX"ow[&G?r Tb"4|Ǧ"9A#Z͝>l?׌JL(ɸw_XB_xb5͡%MZ 0D"CF=wFrՌbXժ!) `bq$-jMm#E׸hwGT (WƎVf4uУke(iO'()u%\ըeN3&+ S<ŷ[x\X* B =4zŮɞ\NOB14m>D ¶/9w2OW6T<))nDX,)JOzKLWW{96Z'kPAV22"D$*4|2+pƍQpV uX(W $^ \9(nX70[!.b*59ưH xԪA=VCywO42װ 4/p*pMڞ ;WQ#kkǍw TY4ᣛ0][>D*ƫk,Íd%3 L/Sx00_]A̬VǬXZFo$]KL!2LMZlݽ]5$RhqZaZ>ּZӒHflkR!v`gK/!BϩN %Ojd++d"ڪP+AwF 8OĀ'¡2hJ.S p군gwi3B:!נBՠ:XJl.:?{cǣC#h.Q1]NQK\aO`֊1Úe- Q#ܾ@/YUFqIprkبJbL]b-7J?T ?T% 9up%0x .*`Ci,g%O RY2?]Q~ˇ:y_GGbש 7'Aj }w {;.kfsv/"?iL.-tM~EW-Kd .z@ \ۮ_;s#k7.I1w4<&gcDDS^*"{6:Ht>`XTgcDZT;phT4/J3A`TJ/x"+TˢP[p v0(}>&U(˻rYeJ@5*u,W L(h驽rޑ&Iz ~kFGB1CW|ƺ?]cͦQb^O)SĀGRz-u3(}6h܌ȩꐗf{Lc%TeYWC~Vh ʱe cVr#FyO7aXF-uHAY15NH?+nvl7Ck$IZ)2섁u3=ďgEd~Ie41Z*q-Ts,o2PzU,CI; y9 YpuF5,IBc(LAP!CПAne)@$C=L\.)xQu+CTAN18<)|iOTf!щķh(~į_pF0O_l>fOb;Ҹ4LξE]G "%SٽkrW r)EP^Ԫl&8itbY&5v#sJ"bAH L*LTVQ*Wm]AI9lDiL;J/ٍ̲]T)eN0e%C_mo^u\NbT_WZnj* }/O9ms`[ə#;רN8[B]1`]Q"> hØkƮ-&9l!k1`" F$*t2f̻TWvndW]1S LT(,0o6XԎUEE_ I]]| J"2eytW>ss'CF\f tRa.J3KdEOɋJ_:QUe8"j#WWգay.g/'â2i83zS<~ZP"_ WXUٗ Z'332S4v՘i*j:+~s2XlNne;L* 7]1)M"P4LŦB3;36ZC)x\+K)1T:#GsvwNK ;$>@nKܠK 3f旲vWf.ۡۨOKE@]0o(緲SIT[JEf<өrjYMUN["~XBEN="uc<[4I{!gȚ36&@oDZz`lB)?EG&6+3 nAzC&f_s$5HbiR0LjhPөk֛J~U'YV\{ĉ)։_5tmc*Gύg@L$>hMuCN@}cS\I Xٷbj?$o3Oۏo=<4Y%Hc962j @'mX3*bь]brgydS~o{q/>I.#i;]嘿IS=41Ydwǣ<#bהq:XIU]yZgS= TOg;Fv>7Ô9 DZM)qN(2FUT(`e=:ߏXeMey-gs~d LVY0IjU@/X?)w\hS ߮ܭ,YQ,`V9!P?ߡ- *XG߸N%_|OwN¾cի =K65 D. 9"byC+POx"y~z}B%C?K@ōR@0pf1tb N|LCuJ<3^pB?0qlFፖdnQQ8wI;NdsN;MٺOpst &K<̻Nm\'Q:HջMFH6oeLʥ'uuyIeXqoҿΒһOR<[;OuҿeꐮYC%Pg;^>إ{cܽ5^cK~}ۇݯc [u_l/ (m;ށўlG ) 6mNc,NU`C')n/. 1Ù^͖@UwvC1+h\2}GStS[#.=M!M=+گl_>?}9k#/ 8Xcz(]'[w]ʙfR}r1? b= ZtTaSp:%(G0Iq9P^<ʟm lF^@(=ZRT^Вv^PD@xiDԙ]@}Ll +6y+&i)IM9m7-CbƖ] 捀=/d= voPE憭;`b=c=`;o߀ڱ U$dPCMQ$$Q$JI/ATN/O > u[s53R,(6XJKqM )?a3Jc=ojRDwm1W0:M#iB*G7obه+5'#4,OOgȰq#,iRKV . Zʢ,j.4i9?qttt J`Ǜ}Hx9YCҌ`fq!=xqvkݤ=P+WR(M]'FO`fax]:[B73C"SWO`XYѸU0TTUZ Ōpfu[5dpOԤczŴO,c6Yc,pfJOZOwJjݾv惹C \)5NܴK>l4=f:RfKd;W*\3S՝ZggX&r8S,NsNMV*^[ί_;! FV mRQTիݯC^jF)/^ ҡ'RÐkJp1b ! OQ,l@%M\)ڜ=A1r*4WzQ"6UbJ v,zT+/,ҩۭٱD9ogBͺCuc}Ej\eO`|1ܤzSOiv<,]`}[VxƚՓ[yuzҸq[CBae7ѽ˜RLA&פ*Q9jR0Aeg]fpri? 3{*3KF;&q@{-VT7|GhLiR0NhpGO Ǧ693FesJ'>X/@^G4tFNpv-i}`GX_1S:ԝN0IWcħN Mlf"!}q+'bNM;g cE="Fvtϓ<4Pp:S%y"|b2&;Ay9Os*S-=$0g3l=ԍ)0#_hݍvJ[|5V/XL&)![xjN^\un6'džr=h̀4kstc4Xղ0p]grF_1qTn״^8i.'WbmZ\\iUzj$0>V4)yiPJi4.)Tc~"![ҳ޲v#zPT_Rsz Kƿ1OWgE<ǁރb|BOΑNcFUL9US5D]02#[7N SPVfiQ<M%: d"}_;=f_Z5}sj~ #J Rs|'̆s.o)ݑp ˛`}+Ea,ѱCqNWB7)E`?sN5K==1QK]Q:/`^"14P0I9v(=1R+&0!y1t eFVHlXȎ匡nˎ AzdxW oWWIS` e>>wbpsӎ{`$8Z9 z)(DŞn@yv;zLMךғ4Ymfм 5î/eiJr.5-\)֋ǒŰa1`pVbg}`B;`1&LÌn҈-@e(?4;vٱ 1}cqʏA}n\ږnUһ|͊QQlmjcӶcr_7֝ivq*%FXgCy&Gmv 3.zflUtFQE5 F  H"4@`  DHPiXv&\j(.UQBF*2*UMP 3ia{:7 Q!! Z>lٍHjH yUV]E5ƌ; WOصnlq9Xl#%dAdeȲz'x]+RU.FږuS;5ĮumtEv 1qow;2 `P-(]n_LH4p5Q%Ck xCE\~  %AkLqY璠m$LPvd։^q's$_sKPR+%g@]nIOd̑Aqk.29:'(^庘1(߈v 04RnWScgߧFQ5 Ll06|*+[ p8=ͫM$l:o"8JPp/5%32\8J"-?x!n+4vM=k _µn 8d[D5{lؐ7+ez=uCU% ~BPU5p9*d\NK.4N"<6"u/NYgY('FaZ)APiaK/(m+&0q]?Aj.ډ4Gȴ,p*߸)}7Ҁ% B'_GKەq KcU|h_ F*:fqO o2:[Y*3Q$TMp< rYѦY"j.zjܶC)+ֵM6(*qAR5(@{!*fSBaȆ; D\[p1qw*"[g|L7A_9;ee" Q@ c0p<_% ǣծ6@URN *0iWvNU g]*n֢m;|z4 f1b~Zxd''g:8r ۘDž/^5#^S^U3ʇ@e] R}I5 ZڶxK9K3mRgONy쯪U[{.7]4p .^Z,kϓ9k”BI V2@"0)89 )JnC2:!M~y;q8Q~j2TQ4+`=rtgαSY*?%[:f^~a=E[iAm:#8 U4y* R[7CIھX%u;ƿqT2(,2mV~F<G'8{$D]$H_M;k-h*d73NJz  =%M]G]l & BSyc=Iu@Y MGv|Ȩ,C ԔTD*O[ڲux$$xGG`o!N֠I1} &L^pb~wMk^n]&_rޠ-yYB^*iB7x4kP!¬o#dݫKV aM Hjچs&`=k%8e4 &囶'gs:;bu<@y.nWJ̠tA2:1 !rHl!Qx"2Ҟc/,k7!߂U@W:ʷ69 9@ ô>rEڸ.i=Y{OB;:w\cx;};{t(?DNJQ6. q4?+Ldj3k(jLUՕ@3`O@tczJqӃ=o'gp]ޒ4tdB }ұ9#5m Kn,P3%.ٻC%8D-@k`@P>Egɩ04f ݙNf'B hZ1#r{d +f  Rv2`8hjjhj,|~Gg1I;18T0dU]g$UWh]ٹ}933eia6Ê').̸59+7y{1y3կK\!l 9Z$ ܼy0r654 UT8Jzz%m!mDk$&=격P9%SXsLQ:^'c}顂8Vz D76@ 1{廫E/eʟ4s ϦdCobdW8(hGtȧ gS~.0gRЪ+[gچԻ˳5 UH84ΟiY~u hȻ!Y‹-p++lQM]Zx OTv@k?,y Y,Q6,\z}EhX`a#DH4|? *E}_=h%`{^jFm< J|QHSRΑ`giB[ŵGh=ɞ^>k9|WcWqdB(,Qo99aCӱŚl߂\{MНͶӱ=@Usط,':j" *Z 9oj==sŀds+zXq,`[֗E7ö)RBWE˩ }IʄRAo!}gp/E|@!GE; C5vIfT[P9h(1CS8b Ke7f6jؕMSw4޻roQ⦸<<ӶY73 |Qw/U[M<+sd8Gi I9M~m<YE'͗Qd'8{HӴ]9CeE9˒gHSs~}C35q68󕚚XF֡ޏf/ :cJE~We=4XH_8E6 R:^Ի9+tl&)(!v2SF5awewVTݠZR?ic1gJ1남ӡT,=̿id:F%yl+umJz(LD9Ϳ}GI*yhiYQ>2j'SNRgD.mdV⍛uFPԱ]کu[EV0||ֵiE!|Ɂ"8^<_M" GyV%6J]1Jԁ+tZ2̊%Ĩf.z͕Gx'=ށR9 Y`=?}رfu!+7{ Q%V)',IB/ PeޙsMrSRٜ#Lv.5/m Mtj2/i6~" Z"EDŽīn0gCT}VИC`F]k]uYd#B._.+U0뚋9*Q2+`{"<%5/(p Oҏl8]xc#*ZFXAE[Ũi?C%0lYۨ@jkkLr(, "3܀ MQ.%R(33%!z3,,#\e"J QBu-3Lk"PN-5%"$5FCAugqT4^>o>c4_dpC{ VwEaf^&UkR~9k1䪘ͱxm&M+l*)(C|:T7kqvet>"@CNAޑ0+!Ѫދa"H#P8D SHJ` 2 n^)Q=p:d+LmN| 5-4 mBq-?>@S[m\%z+!N}3CRS0[K[ЗU}tm "}7Jv-] = NF8pE V@P{UsG 3y=YDvlxpP+`%sm`}5|-k~CS:eu(Sc }~Kl kϰ"n2*s`T,)[5[H` JGw:]e(04) w؇<#lEfW1e$K.QɚvZy+BC*/3d|q1xd&4ArW׬bCl!(p~Wq! 'l"Wp#_O>p d"TtCJ2;P6µU6frZN>#3M՟½1wڡ9wBv^,?7r^_92la3sZU Ly9,Fbi{jۅILh )%ݕrV d!jH/m\T8KWvޗuv}Ww4׏IK0}Z80[,5D70 97Ǔ)ɤC8Џ{xjwc{ \H|c$;f\l.봓 $+tZr_>#[, q֩d LG"D)ߐ}O:BD?=t'PFt?cr/7>TtI꘏VH%?d_ {aWzp0%S}#wKH'a;'_QBiXD|:8'_|yfK̙o橮l܎;{ཚg*YbHVrVa20_q\bo>K^sMRzx>T QL֐@/6_HE[eA[|=}m-7"ہn -8"ۅ]wmOĆ]p+WXcn48^<j ]MSEum*m0]ru@]QYQYJ]S\U +C-WNd 21#G4Hf6l)"BӖLU/XA,+&q[^\4aȃXt"*U9@ B~ڄ02 _d2tin#  }>g+ I n 빝ANbd"s1z8|5dۆCj+\r~}^%+u]!u.r...EW.]uкW]xqr'xțI' 'V#l#7T~|a_p؋}fPKcJ"Ʌw|1 '%5[jY>roaxnɜ"aqoE ㄿA V+PD2$M3l-o@^0!mn)@cD[XšN@hD P)hธdRN@G2@qƳP,lqP,tqN"uj.YYvT`etmj"smNj+Q'0h' YhJ(a@~!-GСAB&sZg#v{=AxۆYd-?2,}7ہp9Rj1p"ה_l?؂U0ل^ajo ~Eˏݸ羯N~Jt?"LG.=+8d=4\|zI~VLtpeY|yK8Қj+f9+5Pj|ȕ. "ىdWbb MّMf_6\lzo΁6r@8o+]6DW{zsϗq`O4dl1p70|@78yOs6́7dE}H7 >eyϦsw`ڀ>7}7{puOy:;~OpчN|燔|oD%28_Z>`oMApl>爘^^,Z#k#݁ oĿ=J̡-Irr˺3h4hecO;7ZA'XPy,ɋ=;  0|QC kbXEh?"ee? ~ dUbp},GGSYtٻTӖF'vGmNTAU 5Eo$I|W;\#YchZ^ӺjcWXM`5oB~i^U%榋n3}(AD9Vr ҦQH&9R8GZaKeYb\qXAܙAhuveC6e97"BCjgJ=@+ܢ1ߛD"M<$\şFHh*.. kiHVfHwɋPX_s[/ihḬRH }"&7I}#`ePEk7##a=ǧQ(bpńDDhP04?| 1bEhE]G[6(ʄB޷p 桂7QD};}A-PM1()F&!rI  ЌA֡zQ֡v9Cq uMn7u #U{7b΍hUp [`8bӑA֐B 3iI)Z8Z#I]ӯEg=0Gk:5{x=vhP"GeLzlGRG>rk8TGɄCHHBp[Z1#kS'kR kSH6W̛Y'IwD,5HX.2+>H9wzuVI:5ˊ>NOTZ6f跼wFa0|Ւ]Ϣ4([j gm=o:A8P?\~RtԀ|{(-Wa?N1+_sja顧_?q8J>\%7tb 'S7W;g6_$O!O@iXEk9?#)뉮ē\kZ\BxJ(? qax4'n E mw4#*-oC MEJ!bɄΰ9eC Iu˚"-gOaVh"b_ܢuuQO8Mw4?ڽG}EH%M>2|iM蛖Qq9uT¦[ъɦ[3 kqKUNa&_KNRoɮإ_M;bhkSKrgi?h|^%WM5$g-g>ȯA6O|"&$ۜSr5kYIh%eȩ|e̩e)qeYۢSdfyװS bALݢe11-WSYDoU'i_[]n<+?,RvQ %+9ݢaU+/~˦_[_7|. WR$Rj[++Rڿvo:qջZYuֆWƪOVr5Yc^Im+Ks<w\NTe<;$%'鏒|jkS:pJrd p|4f0iK]pcl@i{JOV\CU0d/2s5ܳMd p$OʯN#g7 nˉD}=&e%2g1::R:OB#ìׄ}MdvLMZUY63NachlKD`8ƌ{/,Cu]QBpB-2kÌV5-(U56-{ranhC2/9Ul:*v`l搞CG,KS_4x[rT!Y:;Sˎ{&TȎ/2_TC/m>K_#іhTV6{;%KdA[~gVJU:)@. mإgNPz()dbߩ",f f%WoPkT1/h uEcONKM$ɮrX$Tύ`F9uo%Lg NXJSU= ]D a{I+;>3; ~۷``8+3ӫ!߳gb G};$gM1w!\b #)̤ϾϧUZR(]pap褛`?*' Wv,8aqFq\q吢UrxIBz57s/LU(dڛXY:9d.F6f`_tRF]품=hT JZ }a 3ui[>B07FFAZ<٫LJeynI4Mn2>]e#c\A2Za~ \X&$l&t$UKX `昞 Ŝua UP?I4`8 C|Bp?r yPP ~qZx =X\wl 9Zz&y,=0Ic'Jl=MX/tgY;w}!?G-?gEU.y/H#dcX1vH(W(ZUCL{Fa*Te*\X[> "[#d~;0K"xf[woW<@[[ҽvi[ez6Z /eub4-Ԛ:C =8^ TCx m-P5fZ&fkT #>U[@RL*zZM%G8a=*| P@1b .zG b3~6} P(' ŚԴ;IJGvbMSd2zd`fۯVٗqm [frR^cYwbJH:1]w@YF* 3 v"b>qx*-ff7 s;Fg5޽B/(F ϐ ½Sw&֝aArsH\9qx1n0ϵeY)B7sFR!Xڙʹ+!MRmP˙j`eL,S6 #&q ; ҷ>*} #GHSrBO^w~ߡ%3BV0SX?Z-}:7aa(% Qf3n,\)0A}8`sLp{$c$p=y3TP5wP$!&\C`<,p)l.Zd>W26+;+lrAn@Xz=7k;`>}/%w݌]Eyk\wI$$ħelJ9/C'Z,i=kuq} K,0G{"c!D3 8qBġtͲVf ^AaUJ~6=ʲ\!} kd-Yy>&!7;nvϋ%/h|>*97Y6߁i?w 6t1 CSApQmu sӞ Z-UI˃f)Dgìl|DA8SE6 Пί?wpC2;u,jZҕ+Ub6[Z16ҾT;*y*m;M~Z05NfuB?۶EEm۶m۶m۶m۶m㮽r̓>Y>?KkVkug9cP b#RFjSEU Ԩ1H[PEPntRHܒz3:s06W|^NQM7+a܈DlѠOe`twGޟKj36JV)ɢWF@<B#͐4cV'$kYqpƶ!DQeUIks1mu0ȩH.pIܓ{wts#bͅO^Nq)QÈP8]֠h6_%Av000|.IaoB hC !GrFhxH(rY#Hs>p0)+[|H02!Y.GӒABVUG"/<|zxrpl?qdiE ~k~-z? huL?be3!-6F%8ܽ؆(/"e?ϛ%>?lM'pr}d2o!g~HW){(RCvuz_mH̐&Hu>#v`%A5}q/eiL6|dxQQ)>c:S(U: F4 Z:&H!J Ԫ2fs,T%|amdF[d]\ɛZheVˢW ZpdpN"c|㏠QWed Dp[+,K\2!>.c t[x b﨏'x mwЬ*p=܌l>J!lo)X_?()I7:g5(2Ja޺89O)"4kP3̥۫G~E)bփf)!z{D_0u}z:gɐ3L}dE̡)6T"hߑo渓ov`M H喱;GD$LjFmAуZU~2.4-<F̝,{"ETlrTWŰA\zZv1/X5뤴 6pW=?vCABķDFސrs!Xz',1_ۄ`9Z\ b~ ^`0O5'R|GfD?5U2Ƃ Mbz 6fiͦHԮa\"?,B$B\!8C8f%4B }XSXy,SϞSw[Zt6DMy:}̱" ڌg"&⥞ eo"P<{$fSX`Z<h BA 3X֦VzyYszhPyHQ(v,}e/beB0=ˈ԰ WB€̡[O,,͠@0h7^GT%:9 *cr ;4dG=Õ-nZt/PmJJ+:*RFCśkDr٨+8*F1-u bbF;uЋkfw啉ڒz q陇-DW7yVfb@Fts3_?%8υ, ю(J/i.h%v9fVC$--0 7e2Ln5[O] '[C0^U;@Rj/?!DD4S(]sY2'ՔhEvkKÒɯ*x, ڨgrdap%)L CqfkH@|1?PZ1%+qR&vFbwuO0Jx Ej|pwVitMBitWL3귋j % 8^ dvR;, N2vx]񁩇eԻ&;t]T`@Q$|twV"ҍ@ɟ":B߸ 0gWUq]]m 0.uKf3Y\ hUN.n)u`8U6y\X|yJR6lj.n*yh xxzx8 4ak٪78\*Ͳ'*5a1ʂ5(]K@p%݄ӂ2MU}muSyՂkN?)`qg`F s:Ģ99`N݉"k3#[o]4ǟ;bKCJUӷWh=.ֶ5]HR86\aj,HZHDCW{0Ưac{p߆fH߻6G4-ǵ;*{'5,Y̵)Z'`ާw/"b`$fhldnOCdNA>,(h0 {8h Ą+w\^`~;F~9ѩޮh'&H̖*J (שMbё㥵qC l|D`ԕH؋n8"K^G}|\a7 sB}hv}"P@۩ȵSpb&iP\ ~8>Ԣ]-%F k"]FNbA Naֈx-'L#UY%: 3EPԬOZZ8VyWXF(cx 29ex)?msTZ~ isת6miWz?^eacTɈBCA @UA7tAu)Qݺ߰lP~nF?|_R]- #I,M:)OI`j=4$tu0!EQ6BJt<ɬ\ IZm!"~mCH]ĀlmCqep5DK ل=!QSX,-͜Mb\\D Ǝ>mjz"r(Cdg)D6IhoEU1nࠢҊ}>_A;KR-݆.1ai@"ˉiUR5([IK3fUk/9` ]h}Bxh]w+тĴ$UӁ;Q!hzc{\ %")Hj0q|NqDK H:^S;TPWHTbԍUAڐSzc٪nüTJИ%@{%T H2JY ~CIvVڒԐ9w @XhcŪ)eRxL*y*)Sk&:p3" ]Q^]THA2zM!;ġgԑ V=o#Kk+H(B0'2;->vZԻ܀ѻ% ~2Z.qL*/z#[ كE*8D;S_M%LT^(3GڎZu;mӐ+1^4ٳևCbo0 mN^U6x.2@uZ$!NL)T F$aYEщc:e &Z6Y7$8z\+tB 33[3TJhu\MD% T# {Ps&Q3J[+B<\&¤ 7vh*_ %9uwS=f-ik`'%@`K(`0I_-{ˏ%&.D%-ez_MF.mU%Jo7Deen\LfۈLJ/ okQT\gB1fipw ;XK2^UfoEQU޹<+`t[ qE=vg@ ㋂m]-(vOUM%MnůM;.!*W jґݒ]B- fJC(O(i;46lv %NLR V ˴4<$i׉#4IGҧX/Eﰭs~oY5ko#< _~dE] QLfVYm{"uTHvRigC{wwm̞+d%mʞ ")cDy׋9Cl4$Ԥ坭&(p㤲:^]ynIc,eUS|4I?; X=UL܍1+tA@UgE߇kBgTV~&6v7idHgj "3{nL>_C[pŌl_;z _z2-o!n*V>:1]eP;f Q0XdݾǎGh%WS#B"kF}kMWspݩ b`e`f${rȲ'aeDbhTUeΖJ&= *L}z0p){_+\Kd3=!Q`+YsC/k-B?rY6,^j=vˬVʑԛ=R6CAA#b`8SDS^JYT<^- % bd6bj< a'HT2*"Fؙ\Ĵ-}d5O\ J.kalZ*_3|0%/NlZl ۀ!z&Hq +gKGf#R[QgMhDgF$Q&BHܵb y"ې-x$4XRbV}98YxYƥ&R탗%gFQkHh4@7]=Hc|؃"-YFq hi thk)<Y'2CW2GB1cg""Z1&jG,vE@oZdCh\i\0qqlGR5A_. pvy^fZsEqmc"߾T%@‡}C6&ޟ0OvwHodQ b4Ơ :kaS6*wgFn>[B3 ?v0o[5'+'[kʚ1=[/-.>m'm-w[P/AOƱ'L%S{GD3wmLw 7c?ahC@OQ|ߠpovBΠ.)E!Jo w鵖f'r2] Ǫ@$^}+4^ L'ر!\L.TnW`s~(DRDr-DlAà;|DBgaF6U/ υW3T Q˭%:q |jD.HPWuwGݸ6ULa[Fj)B{Rl.]SuvxR$$%R~RHz~,cF HilRn(oиwקfJa<%YpI^/6=fV1[ƴ7 qGL1TIR͸b] zRuQ$jiZ39TMS-@rN&zNuWI( Y?x 9TJ>Ҩ(W WGR54ZFV9M_Xi>jה׸BsZ('x6k On"w]m_ EL?4=OrH0C0hL,O9{Q'O {v7Y@Ϡ撑=#Pv鵒{3yj枎*BcFJj?F+5nhՏqԧ1quEc{&A,A) c͏zݭ֊'X?ާ[a2|l1kltz٩5Y #@Q 'At&ӝ'ߞN**:qOPܧ4~^,0D[:?N!1m W7)WXT7WGּRΣvjmpTh\^ِްi}'#=Jq޽v:4( s/T)%I1!LpZ\jKk2+W_7Dq[j$W#HI$mPʍ &a嶏dFm=-c!~BDaGQһ-kEH" v+lahcUPnG͞n(Eqh(9And[&I83CyVĔddpaNn>-l͟gƁqX>NlV-FU1xh֞DV:` |?7RMk~&Ci`Àǭs~63e! IϾ,ӭa3 !Ùm(WM*l¡'f/1&Gf1M1]t3@3Moh[ (TVZPZ)Elj>_zC& ;;[ SI(# 2$a{(6QH&l؝3Vp%7Z4%h[%"W aAѝHc*%"!!ZduYXN:D!YSN@+Ya^vM).R `Y]@%'Oy0uWϐ81}cA:Ǐ Zt75͙K{e^(pP8ߣ}ຼcݰd0U(OR! ie:. #Y^,G$]`b(>4,} 'WFxW&ƫ%r6\~ZaYšjhJ0R+԰;r ѧa!gm&(1ć/=k=SZ}ULXyHbbYG )v*|" y*:jدSZ 3b YR_a#*@J&fTSo{°] ]{#j%Bq5[0$/8/n i^E0Y ?+pƼ=PM .bV@~ʉ5>RZ^jrB=]lJIDtoQۚ1|?w 0$FOQ4w {;ލ`N ~yb|IJZLFZx"M]s£t|sƯ?GƥL[}V1o!\vp$mI TB?ȾR]ϟO*tyB$̓ p[p4#"(~USVdFM %v?ْ)Q7*r$cB3זzv&D}{A%伾 )F=~?aw +1M>,*%9.KۥC #YrĽ)e#>68[d%Us[jɬ!oIOjtM# VG,ݴOs]T'5t/)5gN*V( M'H" .MĦG W,S_!){SjF' ΰD#G4V0+%kŝ< v7+Dh741 a(کU͔$ [>VԸ&ӍzTۨ<1GWbqtNںwvB+l9-P,Lٲ[~َpzE}Gf@]u\ը>F/sÇ|ԣ"" M`4S-<{sU~ތfgĬf(K>{ӲuR>hRݫQf~K&BedǽM`/⠀`1Wcy:D묺PZ\20+/ƷQ P[|8PX]"W"#DA6ق.ђoE76=~]_gG9nг^>=oȴXo_:;L5Pt_"{Ax8V$6ɐQi&zU }Ćޙ, HFTlkleOHÁE1@63$ 1y6G3FFd4n s/MJf>giS=5tPFlbYh)PhXR #H<&t㘅@OݑEc |4`+B( Cc4ĻSvQPݠ0ܺC̮/ H\@a6hSHqzTJ8՗+J)Fi=Lu}Bwp,Lڱd3j#j2xd4)ܕ\4(?z`]dخ%F5rI&NЀ:FEs%q_6wo>JoT0j%@ jv{Puu :Ԯ~2NNjeڮ n.2PCb%@S:C{*hΎ 5fXF 5}e:Aq2x|!)o<ϛH Z,/H|g(T+(1BZ$GvD?g4]s .=<,k4X)4DP+܋8uZ;la=$k`ER/t3o=\#&*riw}voNet@ãd ,hK&˒Grr}0_]8n $uzhx~ rRT|ND}n/6돩hU{c_/vǨީݟ2UNrev x J:zf}v;Ɨ{hU$}|-6x63AaҔ4ߪF*cC>Ad.H8iG s*m![ QquAMs=_hn#6]FrC6Te[YY׹>Y'͢]u 2ÜibF^#>lw eDVMzL[%)CRV#]b=YgQnHkJMKk͜|NaIqق^11gh T7jnя_L kmHZ0I"w pb< m_k}7eW|7.h$^DmE;^`sxeg [삣"%Cل8p-?Ac,grEw.42k y'p"ڝF{:Dc1V'kF҇0`o@Vʨ[̞#c<Iό?Za* > FRJ¸(9d](SxT, I;]:N`e1ŵe I`RmVGJgӝ)tpѭu?]ޯSu޺#35ZD;y t(E GL(諅4 u{q/RzE00є*siYF[<Z&ٓ*B73aH)Cpd*o\܊?8qv/ QCjj7&o/ #| m_ ubULKV2(6j/X$C*Vn1&&c* ,!3["ԩlvߙU n1"kU=&4~P BPX SMRR x#tK $It0!9+BT9T(y QD<.~85 FۋL `ө@V䡙\CÞ7 oe%R4>dmmfZf.˯<픱 }3i&{|f<{2%LVX/&1R?|z"k/ןta@ϼR>R׼{6æVZ$3`ԔAY٩R) [e6j h^VŖRɂ(53Txfg_GMvF_甤 s叟חզPlh@ K 6:`q}{;82"<|".w^/0֕b>-~7'V") DW[|rGF$AXDK,{A!UuJ:Bѳ4Ez'Z+HlWˉz ,E b(&tfK.@3KLɧUCҴTFkjl` -ng=)$̃ l@c|yٷ?t iX ؂<^)f|:Ru-]&'ز&bEyh:,)Vp & s]O~V@WZa) @J:vWm]:B !GL>[y7* " =WVub*ZdC,3#,'v90Q lsK¯7D0xv NRq+,cLSI]E/m0 B5'I:7B5*ጿ?[,w@3a+ 9ep)T|U?K0VӞ靏_ ?Cy|[U#@%"L΄U<j8 uddP匾"Id3LKza@ç̀5˼;>s* f:rQLw;#K:l,us gHg 7wi kA@`X~`{S- ^OZ\l_'E!;*&{7nq+ώ''|"'M*Ǩ}kHDpaW;n]rt^__ WOd,wfsdyuI%3nabI:ԬoX9z)yN0l=͆n!={?TyTuf s-b$S-7?ȟz)!Z>\HjiB^dpy1]QL[dffgLh0'q x'-8ByR~<tgXq/u$+vrAKJx MCh Wh Ez! ;/+;tog9(uvs ʈN*^ҕգE PU:#̆l;Gÿ"2_vQmUԓ#l[D]sGLaz#QrC]5+7=VB 7[kcrpۆGy3t#`CWYg 3Wlݰ M1R8?WX3=uj<'YC{0<'K"7:WuoGv,IB`?PWУ GǶXG2?$a)ıֺʡdJ@uL0d)l4+5idϧQF9 oڝ7p0V2Fkm8S[g^oՁY>cyZ[}3vA QɠkGAd@q Z Ch6G)Tsxkbzʱj?N٨7չSH\RNv,֮ѕu]OӖwlXּD<#oz:U6_Pl^|zpll4|@$fTC9LpbhkRKP_#W٥gv{1OndD+k_CգL#r@&< 3(ӬWpP쯜^2kFPqB*R@1qfJLEf|$\ }e)~:_!(a"dr|͔H[Y}cI+F%9}35e|0=0n1f)8-4h":.x%bkӀy}C>JH.EMԙG=?i=a$ 8ܵ,!Bzo1J#.fѣ+× {NSEjȩM'~% O*ȋvcF!5r~ditԂ.nt<#v\_gXH@@'ZYJZIHhZ3xzG}sgi[zAB$5 uKwMsf,,|8QAgqL'2YA+S|.24FLLLWhS&*82;ɼMa 9l9&\V=\3XkI(tZBG&CI?+M#ݴWJq[eM9( +g;g.c{=_ W#TmNC/#_H'=8ҵ"LqGGƲaDg^`1wr7Gk?^E|Ox|@]<ČG)4kPo tb">G vΑĘs% !Ҋ7~1{^#@5T<7s?w15O{U7^1Spj?W&T XNqPT{h f[EZ =7#XWGZ v;@ߤZkq5{#qُdJ5FC[@"+Jn!K4ߢ86n6JtqO]q]E>JFo"E0=TA0Ppg5zN.xsԚ-ב-_mOVyD~$Ŕa63 @7m8ԩ)F)!D_<ve\i$F/3Y'Yd:rj;OɹHb9h;YPPlY N,Pʜr$;n$ݎMiL{+Y#j*J%W!+FX!6;sl.P ];p`.Ռ?Ğ/ESO(4\cBiYs %>4/G(p$oH8' %R`쪋?JEP)ݙEJ rU[G6׿\aϟ=X~<WM;@q$ Bcܹ&bE8wjZwanODlԶud'}N |',jEw9Qn޿??¦"wb]Btxq5$@\1~Q1z/d99/ W錦33x\+qx[_bi}W9z3=ͼ  @LZg.O^$X]l v`׿G 'AtBJƸ9Hi-R[2vٱّSb:6]eij]^@R4O'BTSwKXM^l|9c4=8uۂ$Bq9)'3dDgq 0D8w9 O42b alڋ:%F+j3e9l|ZFPmk2cH̍%[܌~!bG8D ;fF_U6T^""RdPBd:VвKv@y%HȌ.QxEw/Gc6aſiJFR;D,"T_Տp&G$a$]#PwŅMgt ?~~GdJ@6fp"k2&h&߁BEd^d J0掺+̈́?ᐠ|~lgS6B*駬on~)XǑYăR>TI%ׯ2CnKfu`dž$[rB۬;O &`2^(rix\$L?ŻۄHo[TaͲk3 [pU2\I8Gya=H|eluukq H:d:Wvx |EƳDֻRT m2e?Z &[Nv9B9@2=w`=5.l/TǕ|MwےvD2d J%,\~\''kQg0,ײjk;~^z034rih/u˪UQ+@3oNjRȔ7uUZ9!ݑQ/-tL7Q2vfR,DG10?`6$hO?+4{q%Aev"$+gn{ ?BUCuyz{Ƅhl:O ʅ2&YPewە8v;&uSc^%aWςCic>o`[aMV$ѥ. N$PM 缯^KМNN-og-u_?T\s2G &ūAgf]t J^*z~}-R^bڔ}JFA+>=OU='LA5ɼB [aqMm~R'0qcaU'3' 5txi]ᢍ0sEv w=0#bEtÎpyGYQŒŭeu}.~d$o)D"ʢ?C[ Mivrk CM%QN&A@ѹIJRpFrS408~MmsfukFO#Cz8ѭ׬\÷I[Qcmtgi9& I!|'+2d ;0.nM-Fdm"<%VĴE T` pl utUkč`nxݎTC ҅ߢUA} YvV&lRbU Gg5P,+fRi38%S4:X&%8"LFbjs+{KPR J4siYtLI=wwwSmO](AJ;x3TUuQD"Ke VP&ʨ`P6&N`)tk9fx^E5USX31mATƩ9{wMbqW4V^kTO*ͻbSykYPA2 7:>բ઄P1ۀ|) K":Z/b%k~6訏".X#hn- 0VWN2/mb|IYEL&x2v:+ ol6Ż0, Ѡ(%gdNZ PZ4u{e7N֦FqM/fH,Ɖ*%1O ;bURD7_tV`1K9gjj%!5Qm}mDnN` (Z7s/1qĦWāB>VWE*Rȃegԛ˟^|N2 al.-~1ı!'B,3l#^z<%RE +2d^PshoD< ՕS O2d *g܋ 4|ç^1MAc$G2%S*+hآ8g0)Q8X} 7gd $4+WS㡑v`9F~ncf ]}Tח7jI"uI֧˜CI`%c7o-Yr2a_ 4lSmK |*7wO #VLMDrdf*f6#7;8{K4wˢ¹C}&i`.qubpeSuKR9(d2n-(EVXjgu]Oo=rb0<8)59$zjzĬOuX-N/8ܚMs *YGPZx ftˉe#/ $n_BLڐv^yȳ^ hH{H#=۽]OYDA )NAӌ}slŅs e"'KLכ&_4n01z5T8RwNGC A+!bO)qOj2ʸt_-iLglQ n'Ꭷ"q‡T&ƙk{kx֮|y,_C>&tt|͏Nl?Մi&omE)6m#8$H:5 `+=GL0$e <.kH&sۍtGx:v'y ՞P(qz1aS^򠸳o@;G*3s`z\n<^3́_7;V-$ +.Ү '0Zis~˙i%KXi 2b4O9]`X,u7;${ow^!oD18h-,l BTyN UWDbI%+P=CCiب;%$5/4{[QWUpK25zaia ~'(c<=nbxW0YJ:MSF=SGφ̽磈X_, ^ R9W6el?w soIe4G"`!Xv26hKfNOtim|auyi⵺cb+J_֊"eT;!T*1% }Ydns@ ݎ~g'n SďIPkB:P f)(b_ DF皈NJ>sXD6,(5PN%1q]H<njrskS >a-M*pB5AEb# tX{Z [;yZT)@{a#oV*$1djg]VMq8icSlvW&TMgYP1?,tʾ0>F:i@P~!i:h0n T9_g$2рG7y'h]pBHfZ2 BKRUƂQxwYb7RAuo9ES}Z6b-gۈmAQ+bƉ΀逴Ul`vYŊ74.0HS6Aʇz@t.hx]<g=hV(-O X}B-;>ص<}#reڗ>_Z9(>ќBۭ!Nnb9*, XRjq +tڛNUɞQÕNSu2TLlߊQ]%*f^| :þV-mO+2_'??|jeLގڷbdFF7,:_-^7tt]L {9I5,tCC7{'we d tC=`{|\igmҟ4vKV>`V dU1 dGmDd0ێv]C2vK}~1U5 qAܾ"+'4(Ng#nW[\0ȊbT^em^E- @;}:OK[{_ړ],eh^r)opl7Wv q7(aTX$k2'lLْ5v<"I qZ q ^y-I kYمfaH=ZRtMe'&Y4fkуGЙtj)e7$w5Ϝb3\p D*M2L=_,ao-ub-K-Ĥ_mI(vM/r1 QQKH𬙲+I_^g4d:H٩|]GAag~l)kj+gpU6ƈfhɗnǀt99I`Øõ_)=kbf 4|Zs; u@L+pٟfy$B!X3g',[^{8bxhПMIP\_MPƤr ~G*t@j%Qe7s)>SMLefy=yǞ$@)"g7)- [mQ?? i>BZ aWKB3sVƄ?W3Ne#w3Sc!,JcS_9&/! w8 ŧ" u:=)O 2?N@)fe"͒bk !$(ra*lgrʩZԏ`Ͱt<'zX_: uEJ?re(FmpEWU\#{@ਵ'K-Yn`#a⛷Ho`ÙE5!*k y;k_G*STVxX-({zUʍPvUR8qw 8:X3X کH˞-*k1*]󥛅٢]d_N)./ @VIp t2_5(]1(<@ƀ:^1i YS,X -cd2H/W2:jsGtJ~2_ *ʪ ;M^{^8rv%?'UH%ː(J;\T %H G$ Pd ..30^և YMD=,QD!F$'PⲨQAIQk{nBgNs{ɝ~[86LQ,a_vs/ç=_vrAYIiy"`XpUZw%hKoEFA_mL &v$-d"G"UK3G"0Cee "ݕZ"'׼Om|^-Ԗ%=%aNx)`Ri30B-O"Eho.~#'̶CP *@hB&l̆@AG 9կN?TM'@pLH/ZMNot/#wZԈ4E4OV="MZ* pDFPNLP [!'wJ%ZF#z re;uъ9ORz2pM!_G/EG^zBgԤ1WޒR0ٗVA3ˢ# Xi~r!2mOX(V<%+-W$:w}L@\UDN\a}H|+l>9Eltk^@b"3WD0Wk™W(Gҕ&?%BpnhZaVzf! ,a3o^XELX́ҵpأ2lhZCz5<#,c2B >3"p94 ?ͥzEl!jo[ίzF9w=ډ:$8آAiخľ nl՟ɪ\Xdʣ{d=D_ I@{<ȝĿ\|V Da0:QXLoQ -sk nIdžʸ>o8!KoEr_V抲 E.yNG>ԕl &v]Lў>Iݯ ,qn%Gٰ%Ykd0T v(r#!?޶JU8'Ni@)n :8Luޒ]2QR tjW]!:5vGw9 NK[$lϋ/|(7L?jhikU ~<;UBsB'_> rhuYB\{ w'Þ)s T|noB¢@-UӉޒILҙNsw 8C$Ts(}dRvQR(i3FA$.܃|5H"Oղ9?6K{|ʨ26ǷuW ?U3a/ޖj5QյrzDFʅz;f)GvJ4fʅ'Ԑ{v:~jhb̢߈AN>.-~@JR N>ӎ'I5L'@@F)΄ֆ`f.q+m&Xb4<$ ЌD#Eb^|bʋ(א\qwR΂g<^GaeI.:8Z\? .c #:[CJ~Ɔ-=jU؋,F1-uXb:h`_ݚ,ƕ#kT)|TT_Uqa4BQ6 [=-Q㍪XӞ$]J !FS5~p d^T&1։W*g]ˮ%K=]h,̬d7ۺ[ ׹IL8b(,Di:q J %PW?Ӄz ;̲~;0⫾)'Fl~gL6>vtɢXvYwY;YP,`FlRp9,rޯqfO8+pESDYWeWCʛT '[8]Ӣ0.Ԥ#=FprA=dWLJ ֲt70ȠKY2a P[ ox퍞Ȱr=U/Q*O~A袵/~3:z Q%fOM_1 * Vj)|D˽<'"iLX!WNnN=0鐺ԁ~-Se">Q-ogعocg]8I$)؆pDQ-3cJNY, I嫩ם*dzqU` y# U{Gb\ߡ8b',,%OXC4bj%ӯlެO[M-fh(,f6a\u Cl(/}`@^7uj&%Oy3MIR 5Q.`Xk0PܛJ(,lLŜ+V  iA%[;{?r]q8{ ccqڎ3yG-cv)p \̢\Ss]dp8߮mEGmjah7&+k}g9u#/:)r>~"m#CV"eNڴN+"de|>$|pMt׋b7pCt&<ޙ@l~(d@2[ ch'K@.`Q&0)4 [pRz ,`!ĝXq<D-,cv|Ƥ&W ϐe[}^ pN,Ŗ6DLj׳oOCv ~eNŃfD- 9dAVDh]i3f:X6)wNvIl%4#"A+iO+(p 6C!N ҮcdW[g`rU'Ĩn qeU,GyNkW2Kx:rCʂ\)<'Q6*݂rC@E#ue8K), $%{רxS[M(!F2mW.*p|]Oc5E!״q ?~Wiep19tLu/oLX؏NL,ԟ@&!~|ǿiC|z3Us>JzA{ pry{ٹu[uUzaф aL^y||!]p ]жIL^ag+VT(vKf؈P )d[&Á{C˳49jK#f=6VWFS lB:MSsKWd;C" tjwy&d}Bĭl4ֿȴ)*(JMZHۊS4e,e '4zȳ"g=de o2O]KC WRKkNÅTI* 8 I`K)-IKDAb-F(G$-9ٖ,5DUW9aX+.]e7 ۲`P/ 'qەh;Q-Ȉ\`a,s)QaPWQ), )'KR0jH‹7XW3KaEE\xT m;& v^ԣ_ +~i.ӓ"w|RY07Su.V9a.ɨ7 a?r /d:m wHmw`Unߪ!)qǴ(Jс߱EuM8|R,GR6'ӒdfPeJ\?/Z޲tvbYtDc_ؖ%UAm+9  ޟePnI^~R7:0L;2} |KV_V$y/gA;Pd"L6u3C)nTP2OO ksE/Z.02Qr> *Vחe37j20,KQ:L24.69|W&af**S:ڐ*O2"|R#ޱ8c>}@Ha:z'cJFY?W3ٴvEmpmyHX>2>d(]GrJ[TrX_=ֹJ|dt{=eHF"DLJBz:"v[lh47GZۢg*Wm~|ȀE7ѽ"J$C/Sj*ܨ"S8 s︾#0a3`Uv$O{i)7&)nz8@UXQzJV=B<kspUzoҁPsԎ2L#. -">״:AÑ$.6TuDLQc]`04e˂J#;$6&7G֩HX̎h:#CȤ"H; %7v% - ( p,_8"=;uu[L]q_ZfWj'옜[vvtؚkoL?^ ̊dǝ}WYyG9h6ünP%J[꣪xl( ]ը&y6KQ^IEuU8FlSd$,ݜ5d]Рf HY_>|ζniVd6} s[Ry݌Q`]17MtFoh/<& C`/0,1mRRƸV!I_r8.9fD2b9Ff[Ծ!'UNqYkoZVяa{+yt]$ÊPHg߿@铽 =D2oviD~O~]JIpݏIgaZAw,`.m u#4"瑞ޱlQRvt1~ϭ9DijxQ?@]=RFUIRcI?mS^O"z_=&pl7e xrMd')%[yѦv0Y\-+8m$_j*aX,j3?11z)L83רSBEMT˛`yvo¡k +.vjUF\NXz>KGeuapI.|6/LMm~Hr^ <CMa#)趶Dk۶m۶m۞m۶m۶m|_kUGծ}վ1U̖-ٚ i !!v*R>X1M$/6M$t2yKj ņ>&O+JnIPyRO_BYF_I^s%~Ыp݈ TL/EJOD9VTBPX~ysO32eq%j@`@2/L=+C1=-J楴BSIa6CxnC]}e*/.Ě1`O euw;5wo0.yBs18"Ddge@9bPN?[snrwSxǗC%BL0}Lƨ5QݑWQr|p/\6NG L˒l<N PW2YR #=.02PbSY#6(?_9t#4)<[5TSIj]gX4x<.<*"=T1jb2 Vs ^jOI`Sϥ{Y U9lqAm;"gIz5(_7l-2p*Ny/Դ[luh@FZ.ҩKuLꭾbtz>{5O7y(l_;&_Lb,^m<#ܟԨV!3ҠĀp4ݶ=vktry 5"{暿6xNf߷zGr͜3]Jo)zvϚCUI-y>'T-%(/{~"C3X :!񊺴zeA};Ƶ3x^;C5u-sZO!fzw/5N;@x?虇;DC8 z_JW3쫹-+vufwӓU > ]{_)5hX"fMN ";34iv70#Jewe¯Bߩl"D2vkW8 o"YG:hEk%, A?TځinQ8QFHWO\W2F79 J~P5rqy %E+yaݧ}Rl[=m5 o?~N#]1w鼯n"t֤foCґ4߁쾏rJqM-F*IWc2RtWM=DP`w[ny*ttaMd4D!}K( oXX7W`BLwW wE >_*B$' 1:=ؕudA"Ըt(7$wt O,A.0)h;0T JO|MnD! j]!šZe1yʬlTh&%BKy웹o4jApqx'oXNwUg`a:nWGx_VjVn+Ok1 "YDqP:km%bXd}O=kGԗhOSU3B[ "y(,R F*8g2ܽ !+lۇĤTaVsPx=yosi> 7v640S/[b5-{,5dKRLh*2IdT򬢱he|⪣QGJx& ji; : V ) tZh>($xCL8__.1tǗ1ixc҄$\a6tT "-D-i3$!:l\儋=QtFІN"2|ً:LC=,A{l蜢!@hExvR*U( )tբŵit&ʚEեSt̔}!zJ- u|;$ :HSf̚AI״>F@g@Q^hYU$qH6~ ÖjT£A6 LʊbAM`&s&DEh'iӔ.%*A r#:!+H"2eU5.aauL^KʀX}h%w:*<4*L歘X% %%ш\ؑSV3$YU9O`OLۨLg ;2E!7E "!Vx[rkDM#u-q[LB) Mgט!"Q&f۠z/crn*@y\۰rZ јQ1W"_c:x ;@=UqiCAR3ʐV]x08iha( _RҩB^aQ  \nR2B,/Pĺ Zk5T["^y%0lCCyqdhuZ&7s1 [[L#A,J^&1qxm)W"wCCM%[p a(0iA׏-Ȣ)FK3;wk=gg $GQ6XG~HmIPmxunÅeWI&4c.Muta\8z:u5ݿ{PKӘB옘e Du:Q#aJ]Xp c3VlsT8 XeO6Ic8wjTs•hj A:"ԷmX^mOjgW}a'7SZXX,ŐYV>J]w8"qF/C+؍3b TaAS]SQٳAC:w9U__ۢNưZGL=A7 ݏ Cԏ(-nlnj:b22¬Ou~6mCə$c=j Y|%c8kX!Q7K`eS.R=5ĸmw 1iQ쐹{^3t=Cϝ$!" ec4_Kg MD0kc >}]6Xe@:8NJ{ݷȣ=gWj80Գ,\DMQ_,.v0G=bKruÎ\,w{P7.;nӓܾ w4>aOħoٺ"jW ?:@,Cה8$]:ENq/Z=M?Vٻ/!77WبCݨ֗Rٽ!7W_=ξC=/`!WN(W|/~ח_b!y,"gTmBf)D0;mĤ@1#l09C 8{6L=fUV>9T\DX\̡Gן.B`KhvhB}1[ȡ/7g%wWswt<-B>/·ļ otk}j"sg*DFm5[}2$P|Dy7k;?F ++k)-"  #C56hgB!A&vSק3W7഑Ϯ 1m׻}5S`P%eIBt`LVlqq"_a@4M#Cc.*듳qlo`a`]q@W:a 22ǘM{r3 ֊4o2tڔ`l 耡FTGY qӖ 88y 3MN+:ѿ*EakcYhJ:ݤB]c*m"&f<1>~:h}f|ϕbaG=]Ƽ;^q%@FNNKAn^Y2um&[-ffYӦӶ=i٩Ff{- Qs"Fas~g%>9!ٮNg $W$-a(uB(VFYiy>, I<1!7DY nJn)J;OY\ow#{,>hCe(W6 GV!R\Ď8r^ 967 ؘGGŁw$ɈUcDS΢V<(((I&lfRRcWڀO K?Kc`m{_i,`N#. ßDlrTFyEGC`FLߧXv$I ,L5%8,&2JHF5;QMyrnΫ !Jnb [w8'@T<[\0I-Y;&\ E&v  u8KR%9S2^,/4`a8s9 \H)Lk+nLo  KZl 蘰:6ԭsEAsa\bvlJ#4 9M)!;sKr{ ~x2u.m*kZ<8|'\ mkE OI'5uA5=GctzR￶ԡnK )tcW5U7ٻv m9C/d3 r&n0;JIy|Ds&-뚇FLBF e>UYp3.ǯsFЅLn.OcƢëwdt Ѫiŀ\!x4W#OZg$Vmـ )$혓ihXЮ]W9L ǃ,pq5 Oٛ^{v_>(p&ËG2m R86eKɟ#Z͛jF9 f L˓}{pؘSk!Nk ԝocbJr`{tV8"-q/[QW7/r!`#؉?*Cy Ww5麽 YgIHNzHFa$ sƔK,Hx!+=K5Y1bXN+>xM}K(`\[HWY!aiT[et3PqHd Pe-Rsrq .!7]BBv';'d> >bFq |rY~Ʉ[X>}G@M) -sKF).O{^Dվ/LE (:H-ڤ^գG<Я+o`L3d4z,&&0hIiJvjQֽ3 mbVԆB`Zk3j;4'?d`4P$`ϸ"EF( dJ6g)7iS5g'VS2zFhX߸̱p 񣿲=G{uΞ=]~!P6/.Y,j\Uq$1FsV57y!N^7_3Mɨӹ}NǪ3s֢RJ8 !]Ro+lQm9E Nf2O69Ӥxh+tDv= c񆫢j 3GUNQ +Pӎo򹄤phYө,$S}LNһ &~=)[ ܃Y`ϘUp %\ FY)ೲv }jD  R~ݎd;OlC+?ɚdaF1لrEfȚd(6Օ>4:9ʻe` M^T}* HukNXxƒlƛU;{+Aein514`KJ ͯ~V׵:ɠEX!f`&Y`A}HjB%y?#Gb k*V;9=;3tMN`~1I,?1ZrE2Q+J|:yfǨ\lv 88/nS 9M@x*A&yWV4h#QNß0cš.~}] 7j߼ؑf;°ly#8 i>yK7݃>Eܙ ]u ;XT;]ܳ4Ϯ zuQ6bX Db 9{$-E[Һ{̭[[ǕS%ژ yS;x냅5A03 eQ-UE@8GkK ty'֒9iK5j㐚.%!pf{v~vnͩ!=Yg>  =14]_Øoch+Nӥwc`KgGĬ3&&gu[5+#aY⵭5\cÖxS8 #w]$A_$)i6Cgmڂ ?ׇD L藈3h7 ^!)j@\~gȌhN?e\PƝ?&KP". gŴgc #`TƝMOwv'!GgܥPT޻K\L Cʕ ˗ǫrI!s~$xMuydNXzRbþ)ؔ[w7+D "˨|v< Sz։82ALX3'U\1D؃5!cMLp"<gozEĿX$r #S0ݰ8&i;<'E*UA5W#6zeD=*542F_8͎JTU4:Gyb< Y$I1"9M?kg'[XdQv sXW $-`0]l f$1$Dg: زhR,Y苝Ed4ܽUo#|3.2N,g80-4W(U0k*]XB37 >18sL׌Zn1yTjR>- E ,beCe6~ FFsWX/@ b픪3U[^a[uEk0 h֧! 6KqCNi*,cX*s%UО)X?$u0#Ì{bG/DDjF!VW%Ơߜ ;<589"0m憁(ܑZc2kuM-+AZ/ѡ*0X[3R8n{4)k푈Mo6o1ѐP莗8~Kvæ*foWwdL̲)"\X"Be(;>փ0ђ.[`i^>_YN6xLi0#8:j{ ARACY]_/Sg"rhJ?9 wE6rh5΀hnbkjelObI_F!h֋ VqX w 1j3ttX:.N14tr Qʝ&'8*ӐlCѣ~w5!Q1w#XEaK11z&YGITNzQE)Qd+W* C R:gjt QҶ#Ђ3 6(t Mť}>(>*^WKz J))K0 Z2. !eɝ5}vTæxu6Sʥ[BV6G9slC}g0G   9[K*e(b쬚AP&Ptxgz [bPf-b`px+3gѸ샢pmN b,e+Z"ax*9.RKN~1 2cz9hʅ3r/=Nbֻ 1ݻ s ~!Lr,zyu 촮C+&fӨ~rdȭuLW@T0@8t?**"ɘ4a@*X򅇄6`ҢP.E`<sH)܁AÖ**ʕ >YkL@6ϼ dBxqv?zYe-_ t !G.&Rd cE'M#{ϵ>bsm鐻aS RdV:Փؐ}#M?ͨH(Ux͏4 kRM=Hm7F%\ a$4~w=p8*`_/srOw"Hzwg_mI?Hc&>)Yrg {/o\uDZYFZ@D4Jk)Y5H5F}„+(p7b$aQZ\Ƣj*ݻUq]*\GqK_Q@_ (c&T8Ah1F'"#;S/{&†:01H֫ N<۞y%s^`9i1KYiH{"i`J<=z1<&Y]K$Q'Q0npIp0l7+/fhDntY#E'#^0W1KI<)8Ӊ@wTԎdYr%U#jtTۓr@m'^~d\nv0S;!, $ #O%:&>62tt@v4*.Vs% ~̝K}0Css7{O#>t+z0I(z_Er~B$VWuG"~^i!ODqՑl(fy;Uƍzjb^V1XR9͹ۥ/zN`؋,UD~ڱ8"!"#W%d69k%&ffX~u&"^bnAjַN^Qv{X5~2'=Л]U%WG k7'-y{S|1+ldߛ8.$ $}ؑ H{P|SSo1!/t^2^49=I5Sf9=y"Z]4\ƹloM&5L?Y$!Q^ u⅚m`%]ڼ5ac6hPq+ cD(yD nUcu9k}l/43?-ޓ$N?JD:V@Y띉*v;o&b2XIUt>6v `Gm' 6V0/r{)m@].׉لnTXԜ Ƙj9?zj.,qz W#E}w3Rzc5~ SB*ؙ~с"֖9׷FPA\(D\d눳XFB@f)] \}H11'$'`YvX&8JǦ4JxeT~C~f#upiIvz-/$6+qKlM`G"ڝSsɘV7s H0EJZӂ •Eze';VجyCbܐ]=#vD,\]=Jf8>2| Z!v0pRx8(v]]IU2BTr0B0k8ىA';hl8&7}֡7%X!##dfqtRưl#֟g[,9<3,IrN0wڮ m.ۨ>A+H(|êR֮CXVC xjig(X(X©}"C'*\,1rVk#uSה($j,ۢ7-<;0΅"v.@<yH~nDoo,UțI]5yM#s!߽ eYotO"ӿC@ݝJ,Ò$i+؛cs"Rny>bhR`Ģoh O<V*#җ>J8x@_ dA*|zXDQNr,VP=(*ۭ 0zO_sUxU{iw6S[eyL,|m'm:V_W‰¶cҢw|[:bs g<&1 yͭƁ!I{BE)XKq۹͋EVj{TWsCel$E]6иp|:q:I>K/;lC8>w$3J5F1;ag- P#%y:;viX w ˢFK^-N z8s Sa3sC#S"jU˕uB+,$nhR @x]iY2:csƂ'0ff+0~)k]ku<@%g{Lk +0Cނ5;no/N%9G3۾_+X(%+!$..7B\Cj7xN9y ́MB;+w"q~)g@#x}vk||Uv0 I8n g X9*^ $WUqu 2 l))K[5"0*)ѯ\bs@Pokݑ 4ܨ94BF9h &XB7_r15d |=#|EO=<32%KeUe_YMZz鱝\ 8Z6BmEN?:>>#E: 6><81qz8OmD@kM&Iبg~ǹgk3nkmwOζwm3c7nrdZZs(w "Lsfd䩔ka4j k]L=Flѱ2R HA}g vH yTf¯)F<{نjd0P/W03 PH`vz3M[It ՖK2bi51~zșΔ /[~?dmE++p.7@k5[qҬELk ˪W%Ӹ5 |oAR=>k~:RH7d͇fn\jfc{Qc:]<1H#2]5)Oa% @ C1ӮRդOz(DHuZ :鮏A[8lՖ"pDU{Gbї#]9kfӘ>"p$.ÒG\׾LKVyk5r.` @?bPBz > {]\ z H>qX?} 7RLDR=y?n#2_ͦG6~V> ԸuقsA!K<,{IZ }vm} U;ۃv=;h@Fˢec(~T~b~…VTv71/rKҧq k\h^f~g0M sZf̆ 'zX:F[;:;ȯu\} ijɸ}ִ˪{w+t2;خNp(p;^c|/o0&9wA:XQ@e.Te1R|bw*v2}~y}W ULؽf!1;hʽ2G툉dίH,{7؞=^}@>D=0+aίfʅFE#܂ARn%ڪeQǥR[ `0E= h#4>HL_c Nx0TEulNt`RID6>3bU?V qؓ6?ġH;S sA+VJ1%RIE q\ iYhX·KwQ^BE900[O,͑i+J X0X oL2YuAӬ󒣊;V=/g{X^ԋFqL_7(=˴5uV>vZKqU7t?%S bIY!/0܂,u?C· Q!bFިk4#()4#8>)iWuu;}r7[,vu"i訑s";):^c}9nxaIMjp.8m#]+BTJҦV؟>,{ºjWv+un4x)xL!wKzxxpaXUsqH7;w{uLܙF9DԾ|p4f;L %~ aJASR֯#aR]~tuf:&&Ub$AiK:/AGw[y(UƳ0]\Cy 6vH`]^N#yj+xR&FX@;cg'?>|]4kJ 5Q:sԈtV{COs"&O6;1n E塎of@ 3EDk7̑M8jnC%6=&X3ԻYz#;V{]r(p2putۼ S¢p5A ◸v7i\E;H,{eƧl'#y)`ܞAyi~Hw5(c.[NX.߲AB(r@]9,A%Df$m[reϴSo1{vE(Y";X] ^t%&9XD3`0gq.I'7.Kﲃ#2ހXQnx$ZH<6o74x}/Rzw+'gL>?64՜I'wO0'fP൛$eߧ(9-/|)|!$6x4[fPSgp tvw#EIzI܈P(D$JbWBc c ȶ6L6g-6q)d>r! _YrK"5bxLQ[1۝jT!rW Y$0J*(۔7(+d}1G!BD3{`ʗZT #JLU<2sF!@N5H*8Zҝ\3h1w Y`ƠP!dF$Ϻ61)I$Z9tiZXL1` Օf;T0hE+#.gP\,]@~aX$yѭЃDQ }5"|9"D%+K+y=N(U]Ru3 G~(89o#^d@fBz4Jr9v87{.3:z\B!hie{ Nz`\=w[ SԀA&ϭXte(R`:_a YY G_6SF }=#n ɎrS3E6G¬^t^Nh}-tń ײa_ٔD'"Z1Hق^e k_T9Byd6t9D۟yvGH[_Zf>=ڜ\,y[_sRðfP8y.7 :syrx[J uyv-Ce'V@m'!icu`-dN\^vڎ6i ׺C޾+\q)ti(*y#J g"@s9oTQ@`d`.{dmֹ#m6~Y]>VU'S8Wܸ ̠_7~O\q9fiT!B(6fՂhJf{V_&a_]U 3`nϬ1^NK 6' edFxΠ5yfRY%*Ij, HĮ)jy3AfѮ6S73ZFnLS_rW#ܙuR3ͷ|k{ ;l&B7Fv M@W6{0Le}Op(5*իHPW+FK#G['Jlt1UtlZ҆̇f9H|w6WAGk@OK2/YLj*5 h"4TOoiP%{]v#$Ӥ^el y>>g(1W2rInZöC]e*B2--*'PMJwIȋ'E%xҹ%;cp6DZˆ&^94G{hyXZN-c+riOaeȡHg۰{Xẞ##0+W2JG;RuD.mK̉ɴe<21INa_?>vRJ`o;YFC.+.$wcպ@yy|7VSIִ֎S,tafS"y YZ>؍i^qSZR*}|U-!ߡtkJ9ܹt`)]/5H v)2`"׈=P7F?IʁnR:`ʡݓ=^ }PMK7fk>}K/̑à :\K5ۚ*q - JVrӞWoa3 .n4Αxeн>Q1cQz/uR Fv<ģ( ?:,Tc;yV&.@X1:SuS*;d k tU΃>Yx,;k'ԅW4'քY y,1d-ަl[yJ0GU41g'?&^3MJ1´P+rlWt`nūhoڑmrh!>28U9 ΃@q>%k9 8ːk16c/YzQ܍ĔՕ6?单"2$&XVܡCLA,*p-<˄+dG{es 0Rѩ*˖hJfIvxjb=pxiajɶ ˖y=Y+1C0i=BMgkg BBy 4mG bvX{ѣ孥Gn ex}-c +ָ3csyj֟2uO[4gjgHZč#q})7e{ ]kl[.R<>ހPos6k>VΈ;(Ӟ6쾸;Y_;}W?`V;X|ڗن3&zw.`; s_i "wd 7oc/ rw_o7\\9FB '@Y G\Q!/3l {9>jL;O8\EZa f%!j!z}'(T2^2z2fVvV>mߺ%PJEfvӒjV%n%ڌ 3tlOԲZw6(Sλ{b=v G ڑz({!ZML&YL3wML};}W ?NE C{!=T)vء̽{}cҤeגFl*=6{I3ZFZזC{qGy֝+n߽c7S.$;7~mڵsoh6.w [WNOmخC<+zރ!1X5TI\WA3*+ZӊS+#pΕ};UPm]vW}گ9>+OpNA9mҚ{UK/EC6MJ]{?_ X|oy2 R:Z¶6,M]aah7:#BWI1k\a1m򁚼+y C-^s̻^8Li'a&_ yBיr03芄E^0}XpjZ3s%Hr';r><[gl?jڞj(ZC ?NyqoNJe[TX66XQ82~)|AaOXI'"sѴꦽ'׫BWX{3n+jڳm,"p:1~O4#vsVAdpAOa}q F Vʽ1>Z|XvGVvYCؙŶ'QzIҾ\ʇeth4&+vZL:,xd%b0'Ecr޸9f@qxԇ{*@K" x6lxn.>:_ }jظam%dkb?uT>LxZGzydná-1*-%-Ɔ#YҾ\ 3>lbQ{6-Q*Yҟٷ Hm t$"_shy21JZL/4ݕ42i E9wv!4 ]BkuKJeAyΙ t"ۅ ;n]5s^ o%bSbҖb[$BxL)bfL,6!Ӵ{;r{,Uh -X^ə8L+WNduFؖLkߞLM}ЁSBGn.U(&2Gͱ6t.=v`t=S*u3Zա_k㹜=}f|gޥ+Zt=l/v)3:}Ȼ#li]$ux6>dRcTSw‰#x+qj\ZeYVV{z]B&c]g>&HwK:eeu!{]='us3$kދ[C~UƍhPS`H7+I^0*Psrf =YgY{Cp;jZ m;U2}ROUDXa+andHw~Yf_~nԾ5 `mCs9V<4zv<3мܐsW5n',=dOșDWjmY=]np:oto.oځ'L]3g1< g" Ҥ{ wy(HO@YnI6GDV"qDDY#PCVX_ %;]Hn\.&0,t 9m-FaL;2>vEOa)`qC10FTٿvOui/̺3JK4`(/ B OmIK J?Ñ@.Q}8eHG ؋F,كQt(p 2`2 Iai! 9Ff}eVtpgJ˜fɹeM\.=}lo6:x4MXΕl7R߃Ոӟ% vۛn9<gKƕl1@$/!N2>Xl+,B_-c=̚l{ 2Rɥ7mRr%y]r.w6Vpɳ1X6Ѝ,q/E.=`3g`ĝ hb Ml9/%YzĆFO;󎃛pŝȷ1nn\fs=6Gj>q0}YY_!հSB֤8r4ٞcBQT(_ B>U -?09Ԅ%ϔ-o[Z%7;Aɝ\ϟWXG1h`D'lb`,dgl"bmacaklag JY@;%)Ce*" :%VZT]ÿ [|e :P-xO>Or{{ڪ Mn3#n33e!wU (êkPHX ^H>]i_47?bEOۧ7  cKG\pG\]5MܱVJygS>;ŬXǍ9[ /xi @~^1e D qU#l=b ". E=CT>࠵pA]SM`rRȴm]qE%p( sȹTu BFӲz3܂U'0I%PYt&^<7tVkFTV2=QA+`WA\8k&b蹔#rDxC1JS)uu^o|6Q\uM'_gyRUJwU:WoŤEAsh0cOgT=칫.Uz\4Utg+{#뙱qUmkD93ˋ)A c_4?HGlOh݂LyZzZB63'''ǦPhH/W^Ph}x`iS4682: Hl')B@&%+lb1$N NT׉ў+vE?6=+ FMK^ '޿e3X}𝿘I "C!e1ohv>+JB,EI`+3:$vJ/c4ya.JR5)b—n"[IyCYx,N 6I 4 \@Z3mlNUg>C׬DW_aAv()g W.|Źm_*Ke8 hz ̪U( gL wr;-$ljQ S{|F#Ȓr+%AqLʏRzM=3Hvrr\+5_#4X+SxHP.G1>m??IMrq/vSbXLY)1ĆWuFFq8<{pd08<>^(JIxT'iO 窙B?9"} i-fpJrctU"ѝ*i ZfN4rt#SZטˡ >]!` 6QS),l"]^}]4T830c5|\g4*[dsb:O*J1,u}ATQ40 lJ^!',vu9-qAc~*6lz1Z^m̮U _6sxh!ܞeQ佰P GEaEwTN?I6d1tG#8Aþ_щiaԪI`=cf `|ڶ?hX(}5e5(mL$$i#0Ԇ?wPqyg\V (5bE>wS`tSiX%C> *]1D H~f^zKO9YKbW5`E8mkbQIb0@`q%m 9 XΓ~1Z9aU3vq 2z1^7ĊI|ĞV r^c*TnSoV4JR14$LT4Y\# S=n l1+W(W^fC+q1i/-KE+|mNeYw _v317)TUXqOh̜|zw@%)RR!u.n'O֕5/2x@m=p>kd,&G#Ćfp/+h&X tIT43t<"Hcy:85 1fp=Ps]Г*_agr7J0!N'b?Ba{Z{AoE6[sOoop<{aZu~C{΃Yzc-ebd}a|b6Qutƻ=Tq2 y*r3o_?zls% c %jd?eʂl5.$NG2I76o71.)Ũ)-cjWʆЬ q IYڳBaPzWVاw6꺮QU0 ٿOX`Q9OFMO ނ#:EepE$Q;~8OocL"tHςDH<`#yk1D>#Rft!o>]UTdX*3"9\Rвd?3@X@xOaH冾&EJoLvMemr4< YY c=y~pm)Xwxnz}0$)m(u;+P%W~ ݓahORMdJ':gA> Io*|~HRYehD~R1K;;̰?%)t avT;V_B] E&a1g12:3Qr㢴P 5i3i5^{7{R{TX"{Uis".:5Cˌ+eLNdUa%:JEY]hfL!o>+$w"٢XAN_eG;&f,zB!'vGƳbG6kl;Jzy'&VmhqI;XCmcb$/P ע&"@M{hwtjjzjLjlr_Sw_ /v~&7/o&g} Ɲӝ)"7݈l3%\ q%*M3$sn/c4VɃ\L{9̪i&yIgzAH [H-4 XHXD vE8_#2`blbog;dd_N >͉MbuɇkJN4OWS&z>?2Q`wHaeqqeY\:sh ݧ9YY|_AsV2D ȾG'Ee2,:}r1 VX3wz"`BS $ɨ> IJ\s9w=Ԭ(3ad5QtA;9whl*f4ElC#s"5= 5 9@.%! MQqð#Ycd5PYMsJoipuTNJ^ =3(\_'VWCJ+ )N>#l>!Jj0d%ӍĘ0BjmӘA䎳g7*#Z?C&P\+,Qc2^ӜW2 aN NUt[SY!/Ai+:Q!% uL^+?udJ=trQStR\}'o7k]Xk@u.w^ֿ+笌NBpqlWwE Fk#_FlvgqxAFQ9&ImCUWhRV'*e0Uh6/$n9BlM4~, /e uD*@j%ɾѪ" y?(/(ʌdaa8$'Dk3u!]:/K|X؟bvS-u>P66Y[jq |ڃ)G̾_6:nf ea=V4"`{{XwTBpfU>c?dF973Fs)OꆡIpW;/1h10Xea8zyZ@9%H4`KՀDM3d2pEĈhC0?xY~Re> gF} vdf722ducը( yn̠ŬZ*c'-$ĭ=e\O.'L+uLf(ʽ'Pf9R`S+CoA1xtWm|Gz&̢`N ӣуR4($lx 55<1twGu;"()Re}u'zK7r|ffp|",SUbJ!ʕuB=ܶɘe' ?NJ8G=i1{('}VTVItXQ 뼗IYVPUt>%;> %*T.Cj܃Lb>OIds8>CDs:: 8w#'Uq^GO=ŃRlDm+>xxTAo1'Ճm<%$NȯR$Ծ6Rv\tIZ9vQ =Tsλڧ|tr:d}aJg-ijIr?UVYWa\M=p 3Ww|^O]ωP?*h(.{Ԛ90FK)9Ya\dHBeͳGQ Nm,zFؙ+{ yx a%(3:Eu8#*`F,댂h$5Ab@g(kLR%6c%᷐7/E W`/X:L[8Az~H'dKqi zқDN*T`Zۣ3TJI}jegPzhFt:6[N%`Ls-L1FLq ;e/c7dVd-ݲKzh:#5;-9Ih h=`Ԡ!ʕHTF᧑eJoт]bJښ3Qy4S yZJP2j ڨZsQ&RrSs՗ Z).ya( Tu .,;{U^lM@ت6囹ۉ*􀛩Jd|&ffk 4i$nЩԑU{ڴr;߀,5>з|bK,9*os ({jEVhdǫsK0Va ֈeTsH^pV0kt(PT%'k YG)D$- :Ѭ,0v>22 G'v=5{he-3nh_(K7} Wku[5̀]>V\R ׊s <$=Fpuڲb5U+ɬ`6dy @U] #G^ JT! '- $>tEӐp(Gk /syF}M)*dYec,d0xs%`RFҷy:njh:3.hIPZKɧjȪru3q%1+cmD!Bjo6oV*T}Vm'ne?FRtm/PMP|x|n>T 慜7E9ib=EtEw3 Uy"DHb;ټ/rk~0/OJ_.=9/78c ߷C;rI/Se^OW!6G-ާT⪜ߠ UF,Rda7KY/lJD5 Mwy;#%M9x53EUop)Q셨⥄]1/QlkA>k%Tyu)3<bk|Gɳԛxwb؛ly['Q9w^RÑPwbb웢^Ғ^&KOnR*Ua~L'Wyx`⬽ e"SRc aD61Ȯc'󯬬ptڀ'C60b,ʛӽ? 4i0RY`O6?3DڄXlGtS&BD"A \bK!Z439odѭ7b܂]X suvA C4Z}{\?;Vwb K?ωH$'ilrli7t6f'/寅نW;l8UBm@ cLQ nNԂ4p 9aRcJS?SpѲ4.۶m۶m۶oٶm۶mk}O7s1^*GYz>-%*i}^`E9{ YI8`Y4]>! 4a7Y5rrg.6 FM5PϽ-:a}ߤday3w< UU-&chDs~O3S`,&I&>'vjiE{IIupxYqRe+vm!N5>4r_h$櫌/ò""Bu Fr B zZRdC:-tgk#1H%1F?e eꮒ}h8i6]=cى(LR| +#2:)O㢂! S:9V)Xdb//Q3WBu7 1MojĜS+6 6Ɯ6{UM> I)+1ԙKQx<%8Y#VgT$l,аL^ wTPվЭ#ƅNz0ݴ#gY wq:`QvB\qA(Uq!4ρKF@K*@ʕO&X d EʢQK_jZQCC<4_j1 ?Ko7L3A}ОZ+oNqh[~IF'\G T jÆ'â8[#>:piN¡m7N`QxL Q)dJqf R'Vk}CH :%s-dC/6Q*#c :ñ6Rd}'jŤ&iRXAa 9 Nn&+j[=F 7=m) K~}S7 ?flt*~r X/G6Tً_[W *|rbg9M_+R=YCXj>XTޝP lY9]D c'`A;^RTÞ~QO},FhS^sZ"[ƯTZ.ξk%L%#H)-rܞ)FBz t^?͝[*UgHtk.{"$\幭#Ҥ%:d1Ta'y~ݮV5^T'.{hǁ޾)0loAp@k*$ .HV.7OAQkBr/ja\/T骭ByYQ#D66\6Y0S!4/"0&gf`^ <UU~N|NFPhj 5_i셪C*b$y1Q` ?rM4ͰyyMrWCtb4oG8JK-R,y dw'U/Q|y⊰@ayGWl?Q`Wc"2$G*><@TM娦7A?m+.epPr7d*dh7'ivŚNX#A 5&RERIE{r3T86gkN2m; soG|EZ:T?sؼ}܄]7>Mdf\,Aچy>\|ғV&a5$uH0sC$1@0q=Ypkf 7#a3c3b7fhg\{]PĈ=M|AM&6 deI?&?-)lYlZPmZR-YZ֞/؋ێѺe~wqEaDpEkzHL͢@7ӌ& Fz鄜z JAE}݃? !v`BwS^ &gMmӟ)kϝ87NGM9]ˍium܎3'9dz#M$v4Y alH~39:Gu{kX8, HPsdkm{\Go*KS^=t~>D: HfPOE g8E|k/ߪDd敶TVb/=bhVBC/eAw{3kf\tGzC-ӣ7b6~& crd%FB&2fq jH;aA8͜0*DUY)oNyCxWY3~wbȷ-}eo'tZBac-Y@g/dnӪ,p&@̃iI3u&.qۑӻ*6G4g^//ay<_%^&pDF!6+̗蒑)UF>#+ EVz+}tY&n6+wQүZd14}SQn.%-|*kNlblg3e |Y`VL=YN}n>Z[Ns6/w-ٷ%5RdSs?o@ߔKliɼ7Н~H'QS+mvGD@en8՝EȫHBo|zQúb%Xun5(tQxD,ޏ j~!?*aiX(Cq%\]am((ujPN)Gxy*( ֩^^Y:D TCkH{D3G}jkQα[[Kj. <6.룶]Џ.y/"*s4FusxF+|^,RA.*x3\oC}dQjw)-hXSAoz̫]_ާV[P7]N bM>U/Wi}.2~ﳉI_um3nz?\)M{. t<3n@"G8|2d3e#͘SZ?UlɏQ McXau:c'b9f-ӜfK,Ӟ 뤪Xq,&o!%5NqG3NYlzzgY0Q?uƝc8lq~YVNfF/^F"e8^F*621x2aqz{_;VL3mLrHbXF%oJ!U -MLEL]-LXGo-~nj7r͎r ;ijuz}٥*Ǭm4R8T@{sQH;dxC7 D%I@2D(?~}nz6&cpzl.SتY)y$V.;]z5Uʹр }JuGJLjy41t@* ZBx eRS1R}%n& I)٘rfNtgO7Vu y @EVp-1{lŋ+ -sf N]tlE㷋U]`Z%tf%q1?±X;4gCBSE'q`b~A7SXb0:6j.ouӧ&ԥ:g )wڄI&~SQd3YVtLRƳ)c8T}]nq.q\ .=%<zQ X)6 a+lov{Bh)bcA-ՂǍЍj'$am) LfJl3 o+s-!|U\KxcЬo7.;wV7!cjxғD髞-71zVihV^Yp*+*s~SWLbQ$*J9ƭi\Rg_?(|wSiyЎLU j(AZHUx+|b]֌ uD3}tSC.Q7ϵ1Atoa6zͅqpt^̊U+ZmCh)fC2DOsZMy^'Ŀ-";}QG`Z-|WV.GU+.,/(dT\Wyƽy؏o}Bս} }I__YoYbؾ{ſo,("a6qs]1d%|cXAz/sM2ʙ`u]9G2ks.ʝ߹ҸrpѷڄLxtDp#_mݪclB"ͼ&=<`kc[x#$oy.] ޙ3{c%@qCB׿ ݊=?wcg+OHr8k%s%+9  56D$w>RG z(/xI޹ /ZJ>S|{K_KsA,z C] F_5s?~玺ôk"a 4OE^UGDƸBt5B'؃_K;_ ?xEqTg,g$JA_ @=g1ʵ&AewkuD #J8n':!^p |.Q?*yfI+_u.7_ vHȺvҴ C>]vt%pVDR39/[OJ& 0Ƒ3\+ #C< N' /_w74~T[WԶ5+pOq6vQ+I|EI|Oy.~懨@Iw%'gpla?4EZ J3 m\MmLo1Օ͜((DP D_@A"((@C(hJ @z[hZP/w6U# <5zNA] f1E3F+nbk!H At .{-K[׭,i|X`dtwCoe慎bz$C|R,~Fű(n]}7t >X:j=ŜDc1"#1`~2H"ne«&"YP3zY5ڕf%&"9QintN"xxյ k#S NNDwd:swQuCIr fȃn!qn2_9lJ6UV  [ꩅTdx."da99̚bf]CG:x& IH%X?4S~M &Cj?Ԓut)Uc)Il Qc BI Mf>n*+0@$f(bJ+ 4ȐyPΒBHf)/ms(T3mi륧폗9Zw;3J0S\Ȏu^ 钸'ig4JD!Unӌ*tP3"{OAI`/1 ϘZpXeh BL SZR hFT+Ҫf:FCN.: TY &DL_b@VGG͎RBzw)xTd/(6ԥoAd[i]ئEXڂZ-[UPXlPe8!W,Z qצΎA96HohOMVt Eš*CIJ˷J|Ofxvq$^ %p.[M4^ Å69qP}b3W%Rl`28驠p@C #A(0}IrT O9u\;zV{XoZDKڧKt!D7 eq4cL^H drNuIFBN(Yd7O=%drU-r#h ǣ˚4SEdz6ӄ?NX4>xG-rIMLIsLI(!1rsCXgyPȿT?տKs6++K$(8/5 ԼsoGEׇ?2 cBQ]&vڗMkEA\}"C,׫^2 V$bt$BQE|ad:+0ԉXqؼ%+o]]+TOiUbrx,T̠*775]Nii}?@OLP^ cP.;Fy@,fj(.dY.{:mb` 7M 'X\X]ÈXYû, {pi 7xݗ$ ޙ7Bo.6^q?!A*Rr+4JuȵZ! ɏc`IL kk@cρpDk ;/]š@ݹX!BkJ=&*ֈFhdm@u9.iA-KmdZ,,cc$bqTTZ?F%sQTt6OvzGD8H~r[pt] 2e؏Q>~$KsCTdm.7#^ n8T5^]Ǫ ,Ϝ^ #U{݊&ԔpN5er V[ee૰QUЯ+FUPIDG4Gk@ lz|'=BmW,ݪ 'cgf%TڋʦxgkH!ɞDOȩW6=mK[^5.4qR g02($4e> ^|3$Rr5"{U sɰ7d8էT+}l꒮LT:&W)PjE)w喖K·^HN5䨊R͞b[B7RΞX]?#=L&Me[0}dw?+?> ܀GM6/4N܀G4/).Ѻ@|xG- m?Ox. 4K_6A Xio_{+&ې=L*=_ |~FjϬLIۯ._wwW7)[ ,MNp%xUO~/`b>&Q΀餠¥|Z)*PK!FBBC"ԬXKCjmM#MB5Q"4KբN\ا wuϹuKP6NBT`Y JuH'z*gz;u#߰ rd MFNKfrjePk؆] uAÈu=!Es\=t{uv0/5e: :?F4!\Hf\xPdk.PNـ`6b#fUɚ<xFga|$mGXC984\ 61X5CqDJo6?G= bcI:*P@B9!± O ްb ] l\6F~nL]P%WъSI'5CjϨ_Ql>3:7'wZ 5+&gWPvOD/vTZ?Z7Ji=)Oh>h7>pޑ=}76/{p FU=cY;d֑Mvn$PnQpIͣ[ hjs@\M`=L.c^fd=|OaP&nOa9{+R,FM Fm1,^12ylwamt/P^:J R }aa40t5!It4ev䴵}ӸIs҆YNH*f_AބQ<#/|2u~adƆ? -S?R%EtP ]fcdل_R0TrO-[ѽa4§ڃW]z.x|SJ}98v3{eՇPU%?@A M,.7WǝAA8nmvO`-mkX01)7:vXM-N6xة~[y8^֛n~:ɩR@תh;3J̦-[͙88[@]to:jj_O4 χo!.7f`.uóWa{h z۲ەőfj`!gk{g?"ve!ဏ{C4|+[-{ o_pg(*ɍ Ł"qKCڊ\fX9kxʥ(7$R3;!r|&p8Ռ#s̺j*NN< N7/@7D܎/춿%]c ;w 7x$B?F fE=kXiCc?:f$oi^?͟5 `;SÖ @o:u7sA蟈p?(ep/Ưj`Sa*lwTDnUt5L{ՐCP{ִ>k㑽Cg=U3]9nSg4(8:Ѫf6f%c>wme-0km-BgԪ]k}ժng?Ikם콮3p(즁g<7t`DbۯǔYvl!*]*f fmNgv)݄0+ם~.bt>+ۆ2 ٵ[&`SxԝJo8XGxX+O]yKy̾P 3g17ZE[REZl_ pbr]WBރZ\6g5%zP~2R.ܐJ$3BѲV: eW@w;@ѷ$n.L#>4_"lcGP1{x[x&:{MM֜JبRzAjhbdu6b JH[s&BS 2r/|u+Af>8*DŽ*!KUE2\f?7rJWmI4`p{@-:ñ{ѝ]KrA~5rD=3\+V8H#Yv A\ rjh-|*";6ڢdboxb5_ڵY+Q0Xc75xoȵƤ_Ԇj37ֺ=k#+z\?xDZGnέ~(T=Έ#}@J7\n;}c;0q7gax7*Qy!_\u?w#[7nκDXs9AφNsB_Ɛ֘xCه+ށƕy޸~ƞUV!MF7܉p{ZH"P{9Kܑ跒t)$So,7aoHdCۻ_>ݷ)Q>чB>b pA~YZO{gJ{=ۣO{4I.BHOՃ_OWۤ]RO#@$!g]bӻ]۸P|رPx˷dG?ݾ;󣡟܄#oOVMqڷox oBze=&fh`z*a0 ͊` ?$66ĺG  ځ;DB}#ۮ| Ej0è`SCo;I{;{zkTIbnvlgx6,IwCB%L۲B[0.5WGCBҾWxg;Z"b ׬OS_:"΀L_2b#)Wk]zB} R-E]#J]# }yH7ڣx?_#L`^pL  W li $ht*"GDHhh4> g.ZAI"ijuᦅt(U"TE9c` wHx H;}q  yѿUт4J0 "1/CRp1A4ƛ fyF!FxDJ m܎G;TG[apx(IqňgD#,@\&D$zb^X&T$Ai:Ї_\-B]e:t(c1&r)Fr*A((()a?) GUybH11z |͂I<ՂȂs ȑUȑ7R9s1 >0Fbv1!g+' QJLODM ~ 1 ^vȔ뾐0^vӮ[r^e?bi>y 61Pn@.-mA^xqt>$03NM`i~Tr>cH+:n͡D7J8!};\D<ʞBw omD(ľSǏ񺆓-ʁ,,/+'#lZٻ(2^2@gnkՌ YZpXZUNףl(VJϱ>4*wr9uAD[$Ts D \56X"Ł (H &<28"xCc*Wh:7G&wz`F&kHFtqq /kh^sRp0tp@9\ɯcfa<شqF h Gl)IҲA['mڦCN\$JNhԳ!m&pTg {>1iw<ɏu94#q͐ d4G#C)m@N'R  XvځcWn@)EOf>h'`툼 Z0莓<4u,2u,)^d]:| 9ҷVgfYJ֙8ٶ4͹mYFoWE4&K CreZOe2eD'AXb2!Yeci7pi%%/I:U%Gh>P:$ߓR0%|,4F[({UWҤ +]֗cIoTuZ?$<R:a^E!_pޤ:B  |B(>@CN RzNd&t7p,p(A_ĨCHA}7@~?h 8I ??OHoC7Jf`l= n11l34C >^vE Ȏ}0`Ug2+F3ā϶y&bOCb1A)aWgmbj)ƾ:v>eiӼ$ՠ)ƕel*揻ioQz M=u^/wy J>hc"Y&I-GL6&Gw ׳YM-(pafC^B9Y|*.%}*Us Vx[֙b-;#z(գx.i?*-20,CNJGq^'nЉDK'CXS03sh*$]4^_'깝Ѝc:ז9,>P+ʍZq蚨'~"BV.]L]ы 3H [CZ?~a}\{!o2V.7!PFJl (/b^IY2BpӗQ5x2Uȓ>ze\AwYl#nH\`NZ- {6{Soe&$}9]G3 ܀ iPI ///6:6>4vD_md812:b dZxeUh6(;JSb6dF ފvnү7.OZ_>H/F08S#P$v@q4ͤvq$mR=X1±cꈋn鈬~ԩ'6⁚RǺz f̻k >Hgm3k=v?㱽`OTc3mL.͊gL?e)4Ðk9Ԍ?+\TZ^(uٺ9wZ=k=gbP4:v| Wt%?Zv͑w0z3{lk̳Z7*38 m-l8SglFg)l?sR D7oGv7-4ǖiGaa؊`;Z̰{AtMP.9hMaE=#wԾ{MF5s{,>w(aeA?wTa\b yj1C9dRɩ.>{*ُC+n0n bgڐ =,%ocFSbS7kAu9Df>B7?EGyz).P^=USOYEE < . \("&H&5?=Z#G9h`SBmhniJJh`$2X7lnq;bkGwP+BEIIEh(8pa|MhK)տohQ%Z[s{u--KDM2RYfnj(W8YsEν)7)SPGgh]bяi >Lg#Ypj!k`u,7q:U. A2'x4Oa)'㌏g`68Q:M`iQPʩR\[VZ?35;}h~'g}m AzC]4+ nNN< ,`p)Yݨ[Od܏=D5o5AOkܣ1x+wÃrR( hWAVzk ]چHw>$}א5ٕ2D|>ş5NgXP\zrMWOet/Wuiԧt0N}'a#G4T\l^]ʳVg)]׸03x33~ vE*}5mA=d+'Lj_cˬ2q6 6o?Zlbjzxe}_;~cBVSJPdh[VZ% [&-p(Chaբ2J#b2,V__`--ܻ;>P+UhG&܃3[h .KL4/^m6Ϙ3l Xvg}ilCL CՍ+Vp5 ÷ $ MixuGvKbF@KCYUm7˼ŷtxӈ[fQ>Ti9cD\͢WWAiK3p:IKQ4as%V[Kٖ0wzm,i3 5[UsJ-cHt ؠ1aNVhp%!hHۢ7,zV@gG#/Z8\s'. f^z2ͼלƥV΁fk'`+quhve:J$Eq٠Irl+WT@_DZ)G4q]3s/r;@o.JDx0O2^݇X فʬ(SlotT_ͦhF JylbFV^e} uꔭ췛zLNIij㣜l Gᑴ5ccڬҀ1b)'*/L߼hCeАEY57J?UKJ%YxYT:EF+Ű(L/j =fM+gq1]o0!/Y>4sv-6ra(7@mJ]Xh`Q?lMa!OԒ3_Y"Ϻvy5wRVtNq'ّG(i-_QBIR0wP|mgl0ZZh\l~Th`VI$@Z]92<.P3P"}HœoTh\ucEy+WwE㲻uy B>}<9톦ToHZFhVVwϸcFXw_z~"UJJUxd8!<ږy؏[8ꆛ"p ct)J#ei}%lL3g^^s3J-kG8Uumrp-A9SsUw\!q<>]+a׎'ka_ր1C7|.7E7ѝʚ/F3¦]㸔sd$|4L>>B } F/ws.-ZU5W8[ns`dhWZ$L`MQZ5FU-:V*%h\!z(-kzZfKnK i' 48K~dϖ9ZͿki:C#Tř:(*Bwh{tBmͺDg$\+=Ve< ya"ޮtu#78Z=/Or*PE~;Î0}ulΠPτkmLdrF @i΍\6頪SR׺h%EeEx`)~n)_&R_ V8M-?9hH61gѾJѓ͜lJ]li#f(d)Sm 9:C@Y. +~6'Dn{xY$|(;"lQˎ4m*ZKq*Hkۿ_+"pskKG-/ĺW8kr" bQ՘hbވifũŦ[L0oh< :W K}Ʀ*`@fO&I0 ttvvѝz,1k&}/jmM>HeTy#?R|P ifTnnE[xKgJHȲn<4S@O,f_,jr98s}{sZ_M;[GEtU|xげ##5*' '2#ZshF)D) 7H]F8PV\5WU~?|mYDՐZ?Ty Ǹۉw8p5ǻ6S; \_IX=O`pҵ+r"7n~N&-NK;څ[f% ;A5~%>vWx'J$3Cy7gaikV.Nɏ .(f/_i3j ޥϣL wwsL:5{`2)fNK;k\: ̬YM8 XXH%4URFa=7!7'3vQKKt4hVMhsZMkKK Zߵuo{=$\X 4VpE3@tZDLX L &3L/WsjVpkwMI=5Ө1Jcn }Qj+iP5=vXz:b#EyŪFP,hX%^rR /)νUG T^_-l`X(v {qȓ7!](ʦ&-5!}1㐆nHT3 K)!فRX$>6 CZ*\h_HKi>0hy,+&#|9Zd*JM|I+ߎ|U,1⥧3 rjd`ʆ*fs-ztCYMW+IYbH|Ye7%CWZ^Eo SAʽ&X Be@XgJF(uGeҪB8\ ܽhew7֚a}MymgU<ŷlZ(}mI:W&.iɹle诫קn7JEy1?^"t*3>byW.JEvNgCoI[B2ؚd H In!ΌH@ | i5^៣ד^FQR(~DbR+wS0' 19*; B~ Lԅ D+;71:hr(ؤ^V4'ߑ=xɏ<3r#_яD1dْ3x~傈3}دM1ʟaiQZAphTÁvG@ Nq2c%yB!A3Ǽii j7RBZq/X*B,KbF.CWi`&@=[F#JFjԦ7%4Y-X$Pkgb;?9M,.5ELʺ7O`5]ys<#rS4*;z@3:>Pߌ a +KE4}fa%1hJd ͅGoX-eEv9|$ lT2הGgO]94Eծǣj,D4ҕϘXϞ OfΑ}JONQMدbU3 F B{apf3;meהPE|\VGl &Q]BWJV;Dc'$"%?#rnUS3wR tmyW2MxƴV47'f(U0 *ਸbwG4? w&ziߗh{BGis%1ƽq4 Liն^{6[RDZ}ek6vhꐎ+,n._FD|DsB哝wzR{4'[5mɅ\?3Yf g/.*l\X8p.TG{:Ail-r{zK7rAMٰʽKA C%ڕw\؂$1ߗӉI}M" rYt|=/Hk\%T̜s? ?Is!3-\b5}z>5;M3[;Du#3ݺ \ۘH䶁5}uk4o"zpn*睋¥#fLu6"QI6jȌu6?A؉+rcW -ro Ga!G1ĝlqyv5 ɫT6l6<4D4z8`D?(b1/wtȠI"}citӾNεI|~*ۂI[rju5 C)r\oHXLX'(,W)`Px[GAl2ÿ=g' d{\adܰ4Bz3WG%"DfY;s`IELƂ:PgA$Ir_l/w>;@CJ-Ӣ.xgk Za8i%c ìo&^,q 37R5iR~q1цS,aq>"; lim9Md'ġqqG/VdͭX;^M \΅گ]UɨQHgvp:qp7#ȷw.7&o7mukH/9Bp|j ĊW/]jL G*ǝՍB[ZiES2΋7%̈粉^#u.$͵F)AAתH̜hRD U;}xt4W1X3{2/Lq/4ko۱pj\,6#>h֗i<_渆97o(mLR65Yrc\LP ((-+:;-LQxM!An:\Zj$^4elQJPJ:>.FJA BQk[ۖ-/zAbqgGI2Õ Āǎw䧾ja:TsOM*  @b :/Vv.6^& h5i A`x0pRBAbA$@I$H#U |O ^5%뒨x!~={{|w-ozw-[cn\!&455fk&ɡāb\ I :Xrp:Qa@+d.Bb - Z!m&Q ,J9D dfs2JBۇd(h`V4: a9ezz.*+"  AۚPB28 ݖpr-^kfry [ͥBBR#KPt!Ϙ#VrJ* <% mߑPDPQ)fQA'+ -\˭ $ciE> .3@xŗ V#p7CQwhW f:?b{dbHo RfK _UGwjLTC7m]0f4Qk*<=f\luBe6 _gyUsgǓlEG[/cQ1Ӌ"<`iY#RlHeϳ+ЖQ' `T—;I˨>#DC H 8D*!P,:)dFad)nWEŠR=܋٤GXpLdYE7J< M4[g@P|?R͌kCļso| . TCDQ ibČMy "rmibQ)OggDd9äWF99-e5"xHzgyƆ bB`"#i׭&&ZKt(Z'7Cp̎/P`UA6XPSy:+hEeG;^Vb;@ŷn ٩My+e  EXq!۩zf9[N[]P\j9J`W9tr' NA[Y|a)')FrFcfAVDhӥ&wWZ8t٢6['CԉP5=룠T:"ƭH=O6#)AⶮGKQOq&݆+*eWIcJcXo(cT6(fn,Q(㲹QiUQaS6]>;s;h/aXrvq?~*`8{V|6O9.\ZȺq(6]zv[}q .L姰BovT(`F"R>90kyS-4$Bs&:p0iH e_|8Upր"^ m#5)1>&X!Gˍ]) GI ~@yʨ2*(9J 6,8e4?eC34\J#jSZȤ8/G|C|bQW| ō9[Η,<]L 0PN Ӓ*}p2tAj)pL:cY:;y8I6Gdѣ@u,*-qy\QEI*Q,岨OGr;Bin弤 ?%U2wDo1rHFdEX3N4R dpfL`] 3%Q80t/%1)D%+"`n2Z"lBgpN˪Dyh<< hJ8XtjR7[U 1ީ\th)pg yXVHp H`Hq !NMsDyDydɡ PqHʼnK*Zqs`JF.JE TWךIAdI$~B.U{ٛjX,$$OHw/nHw)qy'}Ɣih91[CǦ۳4S w}[rή(i){M#g8'Iн.a<(S$1H IIIЗP1!~ML"tHtvҥ`Ҵas%8 :A3dzqxMf^ؠn!mKzQVi)V3 iF*v0plQ5&oHNިS94;Y_+9nسz^ze-FEY"&|/g:#/]>e}TpTu Ż͈~]EЂXgNY̓23i3g$'ڑnU/Z wfTXr[.k! On{H>̤ )NG>;Q2C bxNyxSB!`P-jRUq iR*F|G0}ZK{A0^q0`jJLm]Gd״3?m)V w$)G.-+2^̷yu~_K Z|u7H { ظOguQCHmdoGA^9'#q{QAv*w mtAoS‹{w}{¾0o8x_GIC_mH[E E4d봤RщZ/FM!"[b"8feQ MҟN:eR>%*_fsMv'RN9a&t=%}g,.}}Xe%58?zeҟ*҉O¿0UB _l5w޴2_̚>!ϭ> |Bgzs!T1x(!@FHs]fA힆 _bJZw,I ٽ9"*8Kδ[gXT9̘Q5H. w睷қ !\ "52Gu)d]'zf8Q \EwhƤq#3ŕ:y`y3i{VXn{Sw^6*D1k& jG/ ;zeje=w*;[[ oڳI}ʇR>l",ll`0ag)wXE4#oô"θI8LsEg͞ڣ*?{fr_Y tK3wK'M?olOtg8&{ڄVPWr\{#ֵ%68.rYdqrTE.6o'lid`<\u~7&۷X"rOXQԌDi8u6&s9͞U`_#u.Vs`[^K/e$/԰[uiC?5&r'9i4uN<޳oOȭ?7gx:,Hz/?_4C] !mmmFEQ&SɖG <͔얊>kI3y{}I[ ]]7=}ߔ]raK_ f۫65jI5a7o 'oKNHΜ~@Qsכ~ Z?M ё>Ebve0.(dsn䑜:B͊(Oup3g;Վ*Kg=Ruӳ>ڊE;bzwػeȗDw5Z[ѽ:>Y߯3QuumF^Ko nS{5ʭd\[vqJ>=3=s!lo+wko&Eӑ tz-Lς6C.wwŸD73[Y@H׬Q2qkMgtA o3(^]g;9p*k3uyE៲ y6+\9g,d?+} b)16t$&M2*@Vx^Wӓ.Q$pگž]tX%>&69^{5.hyzLIhFm zLJd6Ba@~j>÷${L\vz09 mKR0r+</j Ԣ8gI69JiM.s$IR$BkB\Z& U^:Nmj޳E4]h˶H!/3VGw1Etg?jcgܧ% aj*N.NO& *^H=$$6[`=Q: +'!qRtBkjHu*nRT]UUyjZ V[t-_"7,ٶ 0M_ U*ݕfb*=[KXQ`="aEIQSQ#FJv=_s!:V=+݅Ν܁5*}4 W8E\c+C㌬. Ity apZӑ<0IpӥڮDL%ӂCaQKAJMPa/ Dgz9*nN;u#sL,H%} *E~촕Qy{(#?LPAV@ Nʝ Sn6գt&\YSʮ MT X6 A1a6MmUzߤ::XڃwҧMv4x0kխZ\Z&DP c+V)LLDtɶ}ZMRXun:nM8GR0Wtpk%) MϹd$ULHt\q-^5oi粈<$njP$c MsN._ &x;6O abRbm38XcX tF$JYa@ gqr;EeUd)Yx˵Zhll:Hl]tZRYvE2!B7΄2hz .DỆ[ZyM]{i/:6: 7];J3'eZJyGhC͗ht~]Q{u8v5_dJRoP0LԈg`1\=I|S}nX׿1&#ds?{ KG6JYX?yWZ`ElrG!(&9e3_>^jSR90z=G夓&-iW{ E Ɯe\U y2HK2ӊ^䦝f;"7alå&LhZd TH_9zh[vg$>gU]o)۔*|Oui֜FA/1utD^J8FA*>BBBa GGYXt2~7{hʠ:dOe+ q RۃNfO|[]snz`7.dѭ#WXt1 KI:?[J}F㥝&]jXE\# B,1nY|m۶m۶m۶m۶m۶>܈;U揪OA?I0J^Ę#f0:Ƿީ[kf-1Gҧ{_y;AƘ'""1gLh-j| R5Q"|c5Ow+܄6}ĿEUC`͑DϜo QS,5EV쨻b~ Hr,~\Ic ;xō,E=..Pv@7,Oo,Id&D+H3l)xYK)`rJҦcr.`auA=ڔaIDx̅&h)3e,]gKB1 <6A)M * ΌWᏌ 9ZF:BkDzJ.L;5Z*+UhZAk6 F n8!4/W(:Tp"*Ed(RV^cuR9TVxQTӆYnV9 c-F ziiZ_6w&^ ne 6$/ o'ؤr]Y!J%[sȏ}P+/T+vc@+T\QP*Pj(*M~뉮ӫC=%z:K>L בQC }`#'ޝ+42_K` (O.z `w`|޳HYبy/Lڒ;/kE6Qʁ/gF9t\ʱLI }}EEE$ 57Cѱ4Fj/8xky}(ۇ%ֱ E8U}IB|3==Zፋ֞ξFp<"~`Y 7£? ro !w9j-zq^5= x|JPkRhŁB.ahwlpVeWltcPNYbTOP`=ڈNdEP=j+31tї묫%$Au{D9$I#2!VEmg2ghtNwtB)f*T :eJ f{j_ʱRsYz˫ag9{$ 1/;W tz]3G˜nc_F 8 D oPc ;f7gζ7|.;w|=4it3EL'fJiHڹ7 KW~gI$* `7w%HRS/:C1}!4q]os?8VkF"U" ќe(QJFڒDvCU-xT,J^RvfjuՊbN2 \CqpzA$Z!vjLq {1ONVU{RCk҂߄trv 4j=rm*$&JT: @\E5UXl'=^up2%W|ô7k8 UնSHݢd8= 7EZQ p53*II8;Y`*ҟ/ ^'.{#$~9qux#NѤM͌IVdenun]Ir"CW Btgċ(tIȖVE9: 11QvaUCrXW!"eVڴF'x& Ll }1 _̷PX]sSC,v6&i{H)')|LWeG>X)kamV9"z]2B\?P+UzEHnBȞI hmUq,ٮ:oՌ]5C`"jlNۦRIYuY9Lr"/ʄEqxhXA0ko1gGf,l 2jبKlw/30%10̳@HֳͶe m79dsV0j:,I`PI e–ȡ.) 8pHɘSX_ 0s#S6yx ְ% qY sOzM7T)$?l1&]ц)0*rۣ顋'EIrd"xiaڏxyʋ/Dx Θf/:;bf#DA#oHH@cҾb86v^ 8T؊2 ! ߪw/( ^e)6hWZ 9R+Z4e):92,ΔܢZ+\0K^ɂovP 4O͍Kj[T#Yݶ=1 *rnri:L/c0$OXS7rE8y5H&dܛٮY{BfWӖ,mѽD_kESA #>E?FĠTA"_+CG)au{*QFSR(Zet ed4f^fA% 0UF gEO@ kphwٚ񉵏81럁ߋ7S/m(,u3n7rK2 chAشEYfk1Ҡ أrd(\Y m݌ Wr0z#̙7}JZgdkN,(w'A'Oa~'(h (q?32ؼ,۩GIiA{f;{޷TnĘ4IUnƨ+LŚB'hF9k 5ʝ.Sc4kZ'რ~yƤ7:;wxv9OWtyd5lE;onGtƤ{B-:~@-#q[XyQ"Lv,}Ek:$3@ TX]m!{ѼR>9_"o7~٠QoKy@ȄȺe"TW.Q}eeLORus,=͌%_)OL'ćj!M7Iscl*YEͯ`6fgeo'ķuYQ~T?e "@kOWnb0S(757;^X$NT56ZgY"%5--353/ث2[yGs h8-KD|[XƏ{$."G, lRX'L8(= Fl-7斆xjtq*9C4*Y[R QQd>S,iQxk933u'Bs !7*%bSMNd>5G>T sYZȜꏡ5G1|9X̼$oHR[M} ^քM/3єmwǰ DSOKIS_G$M ΰVV ;#gwUJ[p=ġ(mŬ+:AJYA z¿zLj6vdiqw@-Jm+F[_z,?[=HmD[!l=G̤Α]ؗJg}a?==!Ş)v.:V.Ǝ ݎS "|5HC {1&!1h :]hDbߊ1&$Z `9&mhN'`qg&dީ??bob1=w?ӿc=:G~z>-8sū;3v3A}'_>ܼ;x\y|'Cc`Dm+܍[I6=kg+p U}zZyr9ŭ=K)s B*at0O¨ |,]̈y60yw9?b{ w\g=xGe5:=&k75l5a+qZ;+5P]pwUʗQoqi$ )*a _ S,4ûgxKCEzKO],]zܥYKffϾ !^ъĹvc61d'KmTjgVQžm%uH?}v0ňդӬ@3R`p .>b18N`XuUrBk{/[ǑQR).<7 ˝ mL7=#a1ҲIز ygJ:31Ybd7bf{_{_P!oL-7k˫%] ܪ\o-ϋܶ:FvuEѻ4@ nB Kb4'hi̓3'E-Po#4xiˎ0yIAd0[d9`%`4 !G0@aY(yEAzKI^nXҦPJJL<<1MøDk+ 1Nצ~-(9Wj)ݙprU&  K) fqxű&3:,Tu"\Jb7զ}fZ9'_FaՁӇY=5xD-ΙAR6".9#ؐ+ X  *&E%!6=rW#uG(G b~VU<5˲ɟa!nEEcw'x gSe:Pԩ WmtFX&JTûêچOa9) \2pᛓRjXPeS/6.HMK+Lk$nUɋ qs̃Ǧ*OqLמtܸ! DkrLNb h i-໩| t K&E%cc9UcRb@$QMwI'RqukI/hF.dh3V;4^w#E´f o)SqhMբ;:j. muTyB, #FnQ spG7ݭAWvp⹏/}k']~};_A7ix z৘ n 97Y'2JWDӳ{ڊ>aAQC}!uޮNN}?cfUccD%YNԞGq+aAZӜ/YiO˧WAx@[Ξ[W" PԎ48ˬ8^6ffƸxkh.vҬ e.*Rl6V Bg;H3/  gY9g>}!/k`;yM~-ݞR*˦|4%ΛM[iIMspn+pwC|i{R ZQSx97by݀\Ua7FqZ:;J"xdz/;-Yfi&~ivi+:U6g- /ILݷ Ȱz2;17? sWuW[wdiӫ^? ZyDhӫO 2pM%KYX'&;bmi&:-=eßѫ n@ Ӌc1`-@-\QW1_*Ր`߸- gִ[ i0%%iNn%ǖSA6S23tgk jЕIopr5^7Q[FqY_NuΩ3z5W߆Xk@{Цl{5W{`ˢiL~ǂ[2"-kR`V \2˒&;e˞+-s %j1{p*~vho%|~Z<|ÚʇkWl7;n+ hEe5ltZy&vmkBbגGsF;MK30~8_B xc=_N'{ ܝ#6^rpt G7Dw#Mw(3ePr>鼦ȊQ#mc'&Fzwx]Gt'8Fǎ73ߌ3LQ/i; >7Jr_ܼ|~ޠQ'Gk_֮#7wPb I:%I &)m;/t-N%dN3Uy1u+%o-{Ts TsJgV!|)=ߕn0 , uFRҠԴ/}xE@y~*{V,#+yӡ"WpPvBR634 "̊ E P (z,gCnPtKԯh#ĮψfOwߖ-F p \x" PcD2t˧q"]N=Ot'q;N}#iNzVs aB`HOj|OFOjBȧJOeB@POK L)^v^0ˌXan=Uf/'&PWgYd 9fzrt@W,OڀV4x5Z z@WSj51ZhC]k# i5Z56a-0kT+.5).9Zzl Wl5V˳N\mk4v喵-ktZo۰Vе?@], 5@_,5k8yA,5 vY%Ϋ=xIxoTK,z׏׏cj'k]7rd'>ˋ4|Bޠƒ̚T(>a*o ;5U<>/H/Kj YZ /~O_Ja}OWT,MXk%*7j4eդO&c6CJ+*sOt&p Q$3Ҝ%t Aur} ;Av%| ݑ'3Ӝ&@ ҅%سӜ+M& Ӆ1A>_vʃ1aLCL2Q.tPqc' s'snOg w̴ft' hzذӛp liOhB}O@vCN} OiB}8LԄ%{6~>)}u`Մ5A={Q{ۄ6>'k;wLw]'7=?ppNO@sN6M8}RzKNx87=De97/$7ѐ.O)3ې.ԝH6 ƌ6[֛y"lBOp#@/'3">'P<dؘ05gB& T̪Md&n%c6wLHi:O|}gTFF~r8TY8w ? # @J뵜& ҅`)M"PL&ȣOc2ʇL&3քφ@?L8̣Ne Pڠцʌ mĄ6`B> MpB|MN =MH|r҇PL[h~JM A~b$>&ԇOTS$[(`օD h?Jn&A^& a=Oh< $> 'CX&P&Bc띛-ٌ?ǞcN?IsSogK,{k zd׶ zS^k_ݲB_1kAXjm_ԃqj? j}e7B샬y[ji@'d}_j*Ph fhkZW3] 58 X6M) MP!ixJYLc\ X!iaP7dҿd(# 軤%sG+ Ce(Z ~bS#lKlW>T 9 {MQ/nl |_ܠ/Z/sϟy_H89 ~2>)}tIĞ?N7ON R?Uep1ͳ T+*ZJPז-ѪJ.qah2P20W1@[MJ < Cd':wn [ gܩx =0t $s yɠq8nq:[oG|@ zl_7_sgY.G|U ݌2qJ/i6M;q/CbO:4Z[N3?O@nQfn& ЃĢbVص;UC€U&{ei9F\1jETDdkR#itMoڜí (2u.54wr P5uPug D^#j>N3#{_x1jb(صjXlLj5BjO5>Q:nZ_mo[, t`Qm'5,X xWZ4 22&q9>HO/x6䍝gs{;/ chV i4 ]pW\GNؽ6^*cQC^Y)BuYհR:_+p>R-}0P[? œ'd-=qG`f ^<`+7%`M/h}G_ 0.%Q2[XŒRb( 1 ?Bt֩ʳ1a´1b"=QYFО"_b4/icxFtc(IV=ʚM~ݝbw-*YlQ_2\ X(BHecVHv53w-)( :$:!@6¸PL`=uYWo=so;pQPt- !beRN%T(ӊʓThO;3$z)3+M֨K~%nX$siZ qzu[Ef`=ԪԔ*Mujhb҂:M0s6FPg&iޕ~9 #N6SE52IvYІVyJJ֐W;8;L.W&NAHRka+@1a"*rH.Ai)1!WS#pOC #LqQ"Th:q=霘J +wmUf0:rɭc%̹Ml՛_cI(c& Y;VI r$A1艥KQUNjrY:Ps 0r+-g7ww9s痲0o#MGS.|.vjyg)Clz&6+qV&ӪEZׂҀq^H,-ڞ\"XESU..le&-_pq U?U_{ ^}2H i~+_h#Wk+vw+O" |:pk}\ vgb8#5Pd)★R:g;dKSOCT'ҵ4w A-, huo\m~y`Bh{:@y1kͶ{rhX9 h bg >ũlO\[WotGPKkE(yGlL9MlDB$^Ɵݠ0S!}%Fjїj(6N pd : ^<҂6&d9'W^1U2,ra?>*$ZCyAa`o,q#Ez0:`xkX.du\_Vlu% k~l&6[6Z6rOА#C[%I2>T.b-A0GvjR h;$wIq7 JѸXK97ْc[U#HF% }`3/m/blۏp΁'ۍo?\aܐyDSR!ȂU9a36r3$4d)ӎpnm4߲6ʎWv2;`RF{>;0Ql'Q2,*O[mvRrXZӥI#1tRMZ5UiE-3-Zg9 {NSw^{䉉pߛ6O$Ʋ:yi#TѣWK4ZuM'PaB$-z{M:#4\e4Qrz#(bXhq]O[0W -|wqۖuyxW>sd/̓tzgemY/PUCr-ImRdn  WbBCqsl\.c3d&[dnp:ucqFL )]3F#=,zH+o׶˃*O<򚡒ft3NW-{1.CTߠU^;e|x4%WW=q' Vi- i g q-ŧY mrs_J3"hAmr,DN  .LH5O92 w] N}?ӬG:5=a Nb2-D8}a2D^8vavEkNrofFkDQ]FkjϯyNcm_}k ;;d37Jaq{ 15n4ԶQM__}=˒'p c|Jѯwr:DGԖ=qhcU$kӜS:j{vڨq?FM .?죊?̳}IW 4hCNn'˙ WNqc BhIU>t\7ꢼN^,?~ _)N?*q~]XɞݳsA!)[Ycm{ܰ e5uxvr>-'Hy7;=l9|~v9daa鴷y:nL(6ZiHE%c7Vە*Y$gB)54VX}nbmSTr|sz杢x]Rkr5Nc&jEf +x50Fx=QnSk+puSzj m7).1u+:ֽWj+q7і1)[XVT)ֵb:+g++mBԶFRGz9'AAP?VLt JgV*WmSHi%Jr4`%:٣TdӦ(jfqkkooITqR4OŵE2?ɶIkgn'k&(M}5^7,3%?lkF qx 29`ᧀK+XdzwLz!qR1n ޠ .սm(W$}3c(R,1OڥU 2KoboϝX<^wq"pN=%T\lL;frg>w&ZPIH-F&"@V攔nu *(+abw;b#.ϑ{ط>g$ahs{YoooQ͘3XȿPm&Н{A]ʘӒԹ.Az7mΓ/{6Sl)xdmqs/[AjۑnL,IS%_ɟ %f܂q,ݒxW3帲AjWЭ.L+ @eBT:!uBաW"Nkh5%=/.,xb iF!ΏY#OWe^nZ ʄV!i9&UX3-v NMf3kRsdDPkBQl)aBѽ Vg#Gښ4w#]kۀJ@zJJܷahΗ@k@6KUuzL#lU$Xբ4 pevns7 ɢz3!ں6"wtYjuewBJ Sn}26h) s.#T+HѕT(06c$aP )Dh'rMA0K?\nը3t%l r~7q޾gNX֗[ruopY90ͺ͹#NJI'@yfSܚ%~}Udך@[$vI ^ R$Rxl'Yty`PIsٞg)#[!4`/UKdƧDН ᯫ.+b抑`ǎ6:DlYE[ -WF׈j #aވJ|5*$uH)ĹnEjDcNniuA`㊇uҔ]s_@[jE` o+R] }wtaHAK6JO*'yPa%fcS)F=ûg=S)Q O4IL4!ʿ7, ?;Ջ w=!}@4|FqwT<NQWTIr"*;5q!ͮLK/jL~;bS~vk$S"~@2 .T%cTxq2R} \R0BSi B,+S \ϻ5y|X>Kҫ*/kyQ(pXzmp<-O9OW4ɦQ`c;قN|b7V/jaRz+Y7UnA+9Tp o>v5HC甌? ?5Mۧ UTK?OdP'?F7wҟKc;y"L|nR; IbLI/Kj}j!F2ID?e)iN?Y3çQ52Y8`%C·~Jm4V f g />Ao^@\@Q=&0C]'PZsp8#O3G@֦|\ OXˈWJg-,/{h߸:pmT02VgZYW٪=EA@u/`U o X&{V?-82?lD?q'iٝ|}yۿG8^URkJ-}*+lJG{wY}=R754-Zn聓tWm,y D2l2= SxXLڲJO-⬧%\M(#2O\"n0 3YM 7Ѣ$'P^ėb,It;0\k\&mEZWUz'@FcE:u#0.Wu)hT6SmQ ZAc,&lVU]t&KT!8#ҝ@\/>U:4K?-uƬD ]dq4'WE| Nx6~#ܥBWY],4daC8?'FWSt0o>%OPD6&LIӄr1vMzZ?rdJaf;cpx/QܐGQ],KB4}{dAY~W=.D * }5~ %tV1#ghO*CQB)#`c-2`ypJk"/#LHLH{#Iy?8@o쪬,$J"bj_S'TіXO,ٵUOZ¡9CR$B%]+/,~-?|3s>ޤ!7iy!ңP"ͪu9"G|V0#)EB:˟I7]"VT#4.ekcz vFh&v6â!1$xTX=ؓ$[ou1!XBX^ѓg~7]5 t>goXCM>wȓgkXB"pW*iq(J"6ע]}W.E+Zz^lK8uWWT(Хw0!&'_*- pyU( zQ:1."srS'8i;ՂŚLrzSEWsThtHq 1uYA ~MqB w׆JC4-"(n+%ĀHR<4gc@KN7u9Y̵;Tr7U?bd{F2F9نTGEiD&a~P@X&%1=5d.bwQ6bsz7mP%/#WZ˥>֥*J3۰jhi̜?!Dk;%Zdwg#+gZwSju ;jjs+=t͹c`z.32 EZ鼥C)_bCJ,[k1إɎ+IU-!A$lE'}km3ʲ}S霏9֕f&0`P-R8 W~W33w媐od-a Ո-J#rʤ,pm?\|A ikvX`o SA_ᥩC> ~Q_eK_gwUЈI3lgeRI:1}hD.%aHV)CbީӊX.Gz/ؿ搾a?z?2=D=MA濻*lK .y+.G`j|A׍T^SRΉ! d2s>>EѬ1 kȱ۸MClD ט95.FK/"){&Dӛ4fؗ =r!4t:K1mL_34luhs[t jl@J F^B߽NM#8;DR絚1$vˇ66:`htFjR?pZi7"EdwS~uZ7XC%Zb(DgRp 0W œǁ?13K6;/D.oML'%T '%tp'4@;Yςtmœ&#B\H c`U fS]lhK&\ٷЯ+b'}sT78Qf_ B/~̒mQRn(jKA#FkSV#XTHM{7)î!CsoaSVWoD Q4` іK5p,+!N/1H\Æv߂}"xŖcR,!ȋi4 lKQrHQr2qt**V!I@AϖZЀY.fم>J&*ӥLRR&'ݩyfmna6v`\"\N,G-~dY}iLqmK.iKdS &1<2&`:܌-C#3hq!G%dא.+ L7b5C#4 ޤ)Z2AZ*jB:)WXSZzyLES0*> saV2b+):iwH[>l #qXHn@ Yg_@{x]!ZUQ^>`?lT\ OiֹmY]ҕLo ᙮+#D\u9LpHU,dpp 2Zrso Ew ~!1F"7ppp$2.6Ҥ`6?A8mV2&(/SC\7DGM$|y6=ZZǴ‘"'c=Lc>ҿA?;= pYY d܇X:h% O[<"b2FM守Np"ъ檇#Lo>ͭ/ zyY1~V#[F}8~!yDζYsA<-Cg?S&T$~C{j4Hu3"rHQAP©[-hkfWMxڽ2M1jdaI")F&4`E;nlCAeelv#1OMg똼Uu)8/f{FKK Ɍ_ۈS:MIIQX爊PG %$:A~D]KڲmD#  $仙ZїY؍832,-zsHRCҲVq40ii?'|}3GKDzPʸa~$s4HK֜ɷ8d*|s4p5[sD?]'40 .ZL/z;² '-툤QĆ+H]WĮqkGP[dŽ ͚XC2%dÞ]:Cj;p%舭Gw|C9LTKT 3ԣ<|l_'4<Ƙbp't~&'!(i[O<ݝju1*L6m%4֪ FbVy^QmP"ntȒdr 'Gn0푱dݺ%jxXNDx蔦B>2֌S/`tJJVs}ͦ:(!nٚ}|cGq( hqCbo(P)<"ؤ~:$Fy{#IᑍO+7(_}_Ϋ9˾_;OϤ-RRcPe:6ZhLuM=- $̡*>e}43fgUq{YqRBS'C)F-g$[k!͍a%RS\+5A#J^殀5Of!l:܎fB|w"&vVQQ"maTR5Oط"; 9.!,ӘM3i[9<2CG.NSFat/HD "d`JOijFNElEd,RyQJOh]WoԇtAV n o TduU8q-Kip`N>'`ֹ/ dO;2I4}M9f# .fS]|@XN|UaTHHtG+O&DHG\9<(%;)iԻ!W"/!%Mv!#@ 94)I6rPttl-gK֗"O.2J LN5)ڙKx?re:ku= o`<РC3-0qic1lȀ\$sU|qcZpuufV%2.{ X+HU%I3?Ix_E%*ت*ڛxϑ?ه^h՞ 7!x(ca$'Cx{B9 b8yH!Ox1nэ3 " B" ]J[6@{.5c$\M&ϿH#->8f?Z Nj4|A 'xCGQ(>}) ol~OL8s0yzdrɑ >y{HHd84]GRv샺R wޱL!Dqt8QogTv.}{$Y5!ϛᥰO0pՠC&5yG8FzA~ه^j4Zieцn3{ڏx7- ]s\D&6Z"j#|FB8jgm\ vlVt pj6mި)ڞ"jĩ뀼mCݝ2 8˾sqWBPÞJ)Q)Bu]$bxVzzO zLJ |K(b;bՊV@O8\e s\kBja-Ze)S s)RIu6)l$Im!h$iVe0. )"\2KT(Le|{Ё6˜/RHaLhE9CTiYS$!ٿzE¯l6YS(`+ ق| e2U%RhK%ȵi"9.CC2p8UT4],zEFp2NS:Rv[=wŪ7!|`o'/^aL;;"a+|7.2ouU+&5դ9snQ> wb@Md1fGP!)) h2CAcKGr߮oiW«F8#&EU5jH;Ym&hkr8Ήtm+ZW]^CN@a g@||OÅX^u4) iA>a7${#}kl2{PK4}EOvVxg̛9+zd1[|DL7":~Р E2 %OֱA/Br&n46[XE;"uANEB VMI-ʊŪ@zAN<:ڠ=jڠ[C%eC6lDCW@>>؇@XIJ!ubC'n>WuyN JxڨCX>1-CVڲFuhYi9]h@X|p σ$uA ~ۊw\>;I p J75 FK PNKFK5I%8+XS T@S"Q)rqS28u3㰤eG4& J)!+Q%!8睸l|dס>+iKdl π*o c?'2sׄ!!QfR ;]z7*DݜmLI>m@ؕi7BM7BQyu(/PE WBT{oWboR?x|! V_?5 :څ˂̫vY:.>1uc@v@Udb8vѣB!<=%ӣ ޲ivEWB;j>o)o# vQB%F;fY=bbۚQUZ$ӭbѺ٦SKWj=zgQKl4o=2e{D?ڽX!M@(Xl۶m۶m۶m۶]l۶5}x_GD\v.1J[!/~e HWq:b%\Rs7 &! }@U_alj|2@ V+i47q0k,H(->.5Ծ-i_Z=uaĖg dH%[lNC' G[_+тuKIϳd/CŔ,˕P댊=wX2?1A\u wa[E? eա_vv}2@XaJĂp/1iOD(T>`+M2vÌwY%CB+'JXN`ITVę;i?;WArV9g2*m[d,a*GUnUB 7x]y'pUHXR'N0咾ä '*O>E"Oaݚ Ǘt3L7ZV6!p,3yin?V8w+\%*rg*y,_N(a.v^{/W Jc2m.^.ыOګn[/ ^;8io(E,3MljǏ;j//%_ B^}0,Y )>RYuX~gs O&iŐ`m&K%gE+.XC0@@_xNQuU,ʜ~7=b4w[&KLNX$'v% \\z[ǧz[0i<g=E 2HWNVkHd5Upr4<YH4 $݋tBQ/ѷmV$舰a Z$<1SY  d1tp wߨѯ_iiV^'j z<ȡ'i v˼@kأ3zO\ 9:H?Q=R{xlgTqgyp[cϑrO Qbܱ-džk6ۮ)T4Tls[㒭4TXTTZi)݇&&ڗ Q#$ȫ y<‚ 2 0#3d<#1Ya>PoUjIa7ߝ wb Ìb OxF6J (ydsj}1VnDRv#n/:tLbMڃ JcYCDM;$뉭yܔ*CژH# $["B(je.S" 58<W&B_dO0`dİO@?3vs/Җr^eaL౿Z/Qp*7ض#!)&oC˕q-C' oR ?vf!Z}t%#}CA#_kŗH=GpK9rFQ ]<{7Qv-Է' uUǠ !vw^0˯mM޾%8Zje>m>a,=uԪ!ElWl;|G_LQRb",qѬgaS+ydcVoP/wsM2F=_{hJ24Ù$v@F"_Jl' nAGyJ"{ Ir'Ic^$X.0 LJ֕YNڲ'Qj=H3L&1섩ZU|*RwCZ'}B\sy6@S2(XZʊ۞1"'V3^38?MFLD 4[ѡBA1w ywAXʥ@F01ږS#DhT1ܳcϢVСh)oP qbx,C0F5bGb% D+΄ FLzO ++F^A3ʎ_Qy]wKvEdU^@6z 6ՀQ]{݆J9kSz~N4>&? -vIFAh;tgpnqdKPBE*4<2=3ԃ&w-#wq. ^IʴeJԯS$^_0b0YJ [T+GC3SDU&ef knONdd]j`4*b:dvʰA diex9w'%XG L#%=ql*0`L1F^uI4hO,K^Ϝhhn @3K}?X=7{\!T3M; eϛ}?UC#֓a˵E<PYۚ(+tOc U7h*&lzccErDx rb629uT391tCג:YP@+x㊢/Q?<%PN:O)ArFZ$2mӛC ݣ[kCV#/+ӛB@w ?o]f><ܓݷ[y."G_Ne"M2a1bJS!x"Sc ZlEG$!PZ).VoxF@ zvt)Ě $%g!F7Iu}MIǽD(sK^yl?6X jSg{x16z!Y^Gv"&@$2? f;§4L<7,v#"+Vu0NzZĄE,? {gI-"ӝ!+@8.> TIg'GǿZ n,e!R8!<~^z {m7ϥ2>pL\3fRR w}IS - 3Sם77o>w]:]l>׿|UUv? IyysyQ9jPJy6rpZ( rR4멀)%]6v:=үN7 'Yv8z"`Nx8ld7~I2DGٷ޻^~~_^ ]%YmelKV\;~sDD/+4&m fɏSҺ>bv=(`^ҼP 7]1wwm!2*T F=&"90EQmiCKY.0yys_߽ݳYFY0vvçΟJ D-+DPoN #y+Frs(ҲlfW$9\bٹǘlbhs eP"{3`l<-f!4lɜ -PbIC m.nrl:c]Mg%Lѱ73+ U E̟';.צ7eW'az]>g,-C鴔2v&AI2!#$IbPY \NagS٫껭Cۅ/X,;+2cP`^DSt1F:5PRHmU ɦDq*W(6GFɑLQ(Eecڹ +WCb" ;4U(up 6Ĩheg9#CzH:􄎉c%UUb8@ogԫK!xCigݡr.>)s@)QO bҹk"{!i!*hu7tOHϯ U72/5`z"gz Kd:o22u h JL2XY OwW*Ssǒ)J88#g 9#ՂTyⲲ'QJ`l_HHWѣ*oYyUeFT˒fdu2UfAGc:oQ)=zj AuEۨa)s Yo,C,\L SOJ:QE{b#-!\2sNDa=*$+u2^a [ 5)I4DvI%ϹJ%ecueD(KoH&pxv(@8ej=(jYi>ڳ^oY̮_.%`@2I)Kr \ /Dɏpc6`լ Hv9˘=l}|Us84 eŞdf-ٽzjhwBAyqrxIý<EToo!ML[u{i=vv=9&Bj0K|* =g]PRRՉ~(:]/| X:>1rl&قR>ak6خ#cZGe.8d@jJ͈Fq M Gכ~fj.y:- xLR연־a7Cٕb$EJ\ Kq̖r'w:ِ'JG"`.Gad+=SQZl2GSX5Zx7鉛J /ZiyiJ}6p{܊:O,;QY=HD֖Y)>m!%ό6D')FTs tbUMoX"S3ykӞM |* n%l]if t_SR6+bhQPf}Ggp[Y+ Qba6<۪hZ 8? D,~[ȣ#JނOE b253f1<3lj.9{q>Xc#~٪Nm+p[>u2:bn0{|n;#n~nQF@Dt՞ Opr?oY< s)Y7ivZZ1]lK %)"m sGȦlVsg Bzu읱J|Uw˲;AD Ou/-{P#:V?$f`@f8"(N_- NŴZb",1BAy,XD^\= tm+-D"}=RFZC3:)\@:3tǁ|S}͞\/0!S~9OOHOOfb̉?߮7K(WTm 1kߴ 5žU2+x,c2aa?{@_4N5~XE"waV\o  /"C\?JYH%'9/7])pa.7euBGl XdsTҙͱU5jB"mZ7@U#5^[],lZrD·wFK@sWHWr~E,"ot?%fحo'ptrs46q2712q?BII ݗVVA221~N E^@paDwP‘8]ڵny4vr-b'޵o3E얣#"q؄ԍ't{v? x-N9bm.ϕe ُ1uN/c~ɳ{vӎXD1 Hs2R5ndKÔ"ڊJY9]x6ߣ) hYc6˴-pfDes0BWWժ|Ғ>,3@p Rh&ԔQ:/%("k5)Խ Ug+&;\r:# _jeٞ2S6_9~a4ĜU?)]x88+yuX[Ա|j Xź5B)NOU@Ҁ42jj!3{z $+GU{' WaKbnheQ\,WHY-:\C^跡BQS6(3T7DzVp~{9a~~2 ς5]u^;;\ Z"8 J}=qxF.>:7+zmi"!fidEUf6Xb H."=SɶݚBH1ܞYfj~ 1i89E:Krx2TI2x,48?)5qr`-eHtzŒX9A,5ꁖ_-_zj=fJl7i A&Լm(6y0w9D ?J |bQr2s3| P{CCmvkVc'_Ͼ=-rK% [ٺ`([$ ?i!o,vؐ߳Q%$oq*Pu⫈=ў5{ShWBI4cx3Ptn}C+Mc'ͫۤ6(x\.Rحmٴ_~ yQM(2ߎ%)c4eمZ]g_2e*j2z!;,ln8>j T})du72ͥ ns:-{Ò]~iqaC )mߤf1l=T;"VÍRRR<x~3h+a7u-s s{V}!~#2[m-̤.S)B I:d"$2 -ݐ&U#hJ f ,50#JP'GՊ"Bk&j[ : 8 z@W<&-Ց(D˧LW.$x9I%p,Hzg렏ޜ3ҋC` 1MhL/hr&hٞvi J]_?ez}Lzا`%|!Ư H1u0$g9EE,u\B E #DIfv3[>}MJhDeP\'>fчa.7aZF<3>+q|ذ\q%43#q`y^J^_bI9q&c5߁4H8?iB$YЦqth(j Iۤ Hv\N+0%K>рH0lZpȘ>+I3no|QBt`B[ȉ t'Q %x'/fC&w\o}fdhm/lqii!nq2L"ݮ/طH.@! f-[ [*6Ώ1ȳ4gO&=2])O l(篲9HG&pd@&D$ E;pO\8@wƭn0dAd{RS:<*?j7"_e&pd7Ξ@}7!|Kny=԰ƶFSTaF@d{>0 aSRCH?Exn3ξ捂<Y5>FK2"?"$ӅA [Sx͇*;{>1<52)Hyt4ɰcuX`=ReɖB= [IRUJ·"K~.T4%w_ ̾( %Si>̭\6eK1 JR-z١ K^S1>S1_UY?3ԗSN<#AcBQԄv+:UB?|D?x$bPG>scM4Ic,A3@qMk$Wۿtqo[Hbߜi"(8?J0-9_&OlOH"eҔr܊4?&X߾8~)EEm'gwƛO ]PmuW +>IN)Mf%izuodбqN x u׏So<`.tP` ;ϱ95 rI>Eƒ[ATD)h.QPUـ}!K!4ñ~7ͼ נ 9Sjy{Ţz2$3tAgRm}!$Vhv {*#['QB)q\aj6퐴K2Nseg,xyzP:o62P2[wSxKV.7p:"kջ%(!<@-y‚ Kl3aHjU WȇE O5"7")CiT;Q p=ZN*_wdÚdQT8eù_$?O8 ~"&a>9mi'Ht@@aC"X-ZJ?+PX4i  ⚈\,#9Yi5L`[sib.%RxkCʍx0u9[(Iݱ@*z탖&o ^ C[p+R4 . %&E#"{ AXoƳQjKXU1p*]ؓR.8LŔ1vQDekVAg]MHHPYa%d 8i ޱJ jm c w P3s匢W.K:@mC oM14j kͽGC9Nl*c cl FQYEG[X!H)TZ#N;8VcqE Dpy Չ~ΉDZ' !3!xbmꍠ݇ۑ. ⣁? ąV/9A>GډwpD"^mF6 _#& I 2(/dtyYK%$5_@kDW*ťHt)E% Mb} .ޥەݼNp'-ٳ-*E#]>׺ pDQ8S'Uұ" .J$ ͈Z&տͣ.ӮLyJd嵘ECwXD2qUB!%I1Q 3L)3馷cD R3nK&5L[rFG%` 3"b!*ҧ>z?֬#dhD#X\̢0/WsFL61( aq2Ik{/.Ly^}KV JP{1mVJxa:=Ծ5ZB9<\[$zLFdm6l7fmDw ͸&6>erNswOkUCG[[I&_@Kk47A VUU 6d٧X,5V ^JR?"7^^ޞXD+픉LnW`JI"? /nwrn/wjåqe=~>C_31׀8Dps')NcC˃S BCPo/vCS)m~ n啞h.e%yD)Cz ,1|r]/TR0$#*T 6gɸ Ёrf_YXjKnMbP?},Ji?ZpX@YㆧI ]/-H[v$*e&.d%g IO[fcBRXKc-[[4~u;ܓc@XDg$5U  =K>9h C)=r^E݉2%$mBx[!' ~PZ ݩ-_ZhR=g>lKR"Lǥvg[i; 1dizFu cN'Ďn;;Ꮦۛ1ZS](-~Fmt#YX'[kWc+ ~{|?}AۧՄw&㱃ᨀ _R;N(,\ fFG}F!noTShUIFoCc%cYE.9Lk8ܒc:EsN͈*ryz"ALM4`g#Jn(*N_S-_(zPzMMWD3ojPr=_|t~սr}Uimkf됄O'ip?nJNW*![Dէ*O)IEa{ٸ&;!06kx$Yuuc!k{?! $Z 4%Ӕ vn C#H+D%N@`ќKX^<>خpCp\BNliB^ս\w9AH Qk ZöwB,d[\Xqrt_/Jqt1UaRSZP@{5(yIJ& "B'U ! OALR12QIm4`NBU8L4 aP2]1:Q62q]Z+fiϨQEQ"H2=6`[2S.?~tU"dI1ӮF@;U嘠ZsEMeqP @<)B` a}vikypo!`NKØ|VRmqR:.újJfT&n<:zl8*;`ැvR _YkN$ wI /^fӕZnt£311( ef"h2[úk_$ߐ0ޗP{SkVJ]fެ*0jn/_-4=eYY~dtF` ?]סFSa+,5&K:F0/M6,Us-.)oh q3cbtZ{򳄲(l3Sq45WA?Ux d#ҡ|F~KXfS;[YUm.Xh'ΤCYP.=o6=J!?ghӑ۵Kd Na݀=6Py/Gg`r.RC1LuI4c4[g0pAKv]PcKGC[l0cnh):!1Є4.|ݝvf;$@zn:uYȲhI&r iBur?it9d4<~98 Vy{ G|gҎXe9Wm[Rѵ~~?Bqd"M\,HN, 9*22/Mx zm[pп KK ^)t3z =@{jToD xpLoZ/<|]Mn.Fw'6S2~0icNEID~.M'sxXzq󉮊{V%Tho֡kWTP;r VJ!'(| p!(s9Ws,hE_ZiB!W*}JF/9/ D(+BG7}*Tti$Eh_ize-$APk㨷6 K+}/c;nd)֩UX|A1 `hH<(hkODs^$>k?s EwR\'műg^I\4*Ax̎b(Ą=M!'qåAػe޸wϠڑ[8$(X{Jh43 0_tDILƀbāD(ne"LL'H~ʑ;#z*m!nTN-F[h9d>r7ŤIԪr>~Wzޣ2EiSv+O x_n#@avDfY5qnj=?fy3uX!) e8g>!X53 #FO<4/ʚ N _;Bl_ )ӾY8"vAܩejhl&5tN$MI![[OTjJ6> 0bhxiR vzQ>Zv6#+7Q?(l>/`7̍ŃUw`C صh$wU"Jp >țHil.7?8ص߬VCmrA [q4ǶOܣ^| |VC{Ts4AN?W D:SLI]tAƠeЮFq3uXcʆz 6y Fi63iP P~h YeS{uXG%ԝ׿(} ~ |C /rnlqw@&!~׸'߫GlҲ@Lu*8KSM4 ܕQ~Im $֓$'ˋ P @7=YRmj?ԬZjY)YlQviR$S޸߯lYܯτiP~!P771{|`LE+pgPv6W-_9.I!,-'E慳9@.zuxFn̸Wao_&:삔NULhh؀h,m^M'%Noyy5sXwz32AЉ| Y7rtQ. 3Fh6I?qy҄:UuCWWı|ݛyfQyƱ8rF60R\h"5e~)6&>C҂8"&Z!Y ! % RkA 9./#; sZ7226G&DN {C={3Q nB|>hɳED7WŰB/W.ObWO52!+! e*#u;ރ̨<:.ŊBA&&PHR 8pR b]B@#է!B{SKaH 8aƑ"$we <0Wƚ=usd r0߹ЍfX%ӛ! w0V0rG1Y(T2vo# L ybzʗ Qr17n5yJ-aK m0;T5NHIY ǐģ9`zA3*E0Q[%9א#Dg8ۼ^ FƔ :XD/p<:Rz76rR>DʀNSP}Wq,m8h[v!&K*x"kzKPW8~s- ,x9zEҰ&ҝ"=448`=9^.r^˳7,}#xXؔ W u\^{8"u9 ǴG,n\Dw8" P LIc6`A^g-qL|.,\MpOvu`FWkLNύuMۯ*Zj#w d۵wۨIۜb-.e T!#K!8&&<4mH!71Q,cv!״,W| 3!ݗW3yTѲk $B!p!'? g,yMꌒG>#k w:U85=Po\-)dVE 3^W^mY^BI==U6*PN.|adqL–TY0۽kv6ˣڸo(;hdSjQqy-3ENi 0K"db_upHH*od^}|jcR[c1 BRjBgʕq&@CѼ|ӵ<ғR"\)82r ujS(ZXEa> +)sҐAc|2m[q ~N>.y63^Zd̍pi':3 /KŰJ *,I؆Q@+je#߅|Q˵%Lr 7ŧ_{pL0*\;e7-Q^{_>f ({3 B{x"MqFn-Z]jY=#kл%ŝoE]M{zYySg գ|)TӞZoz̖SGmҊxo@{X"tf1J9r淣(aL Թ@oro@4~v,̈́vQ&frx)bk88J![3iҗuxU#]?`K6pVD~3`QP+AEzfPK'{ˬu{>Q{C-} wQG[dU vF: 9 j7mO[pI$eS`xK +CB;=lCAR~e"XXdw;N3):=|j ("j?Y}'4ago a).)ds;( h1a?cE"+< $E!CMe\q^S<"Zr5dRэOj"[6(!Ӫ1%2;joqQAb>NuЎB(!& I4!d H$XG%GN hg*| %U F/Ey>x-ex@E$xKBhYBZUkG ;`Q6$֨Br s[a`5A GBDJkKHSe>m&DdlHFT!2lB: #!9*-Q9"ďĐm +*E 9QsC ScexPf- =' Ytj'Mh1 >Qa/Ս:XTag¢!̫Nbb磋ZE#Wh*&U衻 MO 2@[n%eh=*~B9"ej=gq6S*ѭ12^j}>OGs- U},sZ[3 } _T7=iiِ9 :8Ά!/8̯Kr-:BRqXQAqi?{urCCj\U}TȢ#slQ\D'["]Bb%`@mP/1UBkkdo[۶^ٴقn11A?hLP*Z<aJFQ.ӋIp2D#la{BaT3ԇD 84TMPC,_磏&D#@(+2-Y 9i 3EP~0w]1Mra؊V:20 pѪ\C_% \sG.818>2dեl^Cz0<ߘ?Na.Fie!棷1Ι}V;݃2+=; tJ$Y?}M\MrBi-B?%Ɋ%`lE9 ΖX/q"}CCGPupCڒ˂vcc}D*lS3&YɭC"93&1D0},5 #L< Ue?LL}U`A*) Ycl,첬)TrdʷGϗNY _wX)X W[G/\-=6{1*BV`JF7n]KlZ+0 K\FsyN<<] 7iC-zqKٵvաun{5.J܆Wm4 f&`/=E@ 2PE'ٜ% 10m"sڣ-͑ I8'QO?Vv.,՜?ci3qJ5Cx luomHgplcJm-" s&">i 7B`۸x^$E 嵵RH<:0/SLYW_HĽCK !#1g:P;N){L+]uK !1/<$Vm ?Wg [ɏ~H?jT7+\ƒ=!PEA{1&/uL؎a>S@o ȠjZ@; 5WWDr:9d\\-dڤ:j%+P F }˘<{Oxf_s_WoƌM[v2NON?uM9}7^7kwx~鎶r:?TQ ^q:p : 8ps"bczAA(c2ߒ'( WeSI7-׬v]=Vߧ22ǛDJL{]g鸒O\,8t 'ͺ8Ie>:Za!UtO7<+ rֶCw+ Jc8 s N5'ՙP=F3NPt$TZ@J 8b @\Mmn.ަC*^% Tz"PہvsIHl&B+G)UF3, !Oɠ _&E %F6+a٣)IгaO-O2] gSmK &8B?% WC<3-#/Gw¿<x6lą[iΧARSE2Ŋc mca E#t)ezIfgbgL._PWpԃ[Vx_$3ƀ2S$H;úf!RE#I놛~ se7޹ G }MgK0tnrs݊H$5\4 :z`ޱgi0Cwq JHHߍ@|v~[@kģla7J(M*#v|L0Zm];Y>Mh{#t&V8G!m< Z BprQ<hfz;8mF>]#qlfabFyp־Coɢ=2:ְr |ܛbtD:籫sx2yTqJcLYD:}NZm SbȊ_ٌ,cL43*JX*84Ȃ4%h+Ős=7iY?PQr;I y{oLELgѳn∌IRnᄏnvxH9L3b.tǢ!wB3DQOMf\,sqRRӎrۜ>> ȹ*U)1<)q9 6I=(r;>`+u{G/?DV'-CF4L6@zM@=t Ex2ыwz3UMi(-ᑛĔL*d+#9C;5-S>*'00Mmi/c VBd4  &毙! RA.*B1(peTsܡžs ʤLZDŽGf@_=?%ǔ~0@@h%7F(syB{#/VWEO  l&jFRTBksK6t>uuLfhߟ$YJ 4#[*4hH*zKMQ +UH0(Z cQRHy,>^ʹANb J+طd#B= o[eU>K/Y=nν~Lo6/#SGr$ʠ w*r{> Ń(9A_{K1 Ed#qsU{E/A3Go^ʟYEVK[hו r|?0dHsWHGeM> 5`6KaQ3abA}wTsSݟ L>-a2(F{Gm7*! :C4Դ4#oBoW (t&ɶqhJD GE'K2΋C):H18^>fsi |E8iP/,L;9O.=>_4{J4F{4X<QxFnfp~4K@Yf3^i`FqO65ۛ4_Μ?O5?hKi|?eƶ騘(|ɀE2(ʐDuaDw^(Bc"mTݘ-'P– ^7?5Oui;2˘L2Vo~" -CfĶp& i%4`5ZaV<5̬(YAwģ4JK=.ng-Tn|pA|xRQxޔܧTD@C`ċ A (&O96?=7>ߤ/p ghy>^bټ^YgaAa U^Ra_:dSO7v MV_uT]!wc,{>7' dWx M N%VX ^-6rJѼ$ta&ǁ!lhMdF@ٟkآN^YF+DoW59T؅$/r3NWY48~c>h3?U;r.[p>gs p2S~+*u;} PNhD.,u$3d~$Cy<&ğ׽ubqgDCR'ba^pWH:w:k((tӤE ykm Ԧnv|(݁%E܊a~D3(Zg٬05zrq|⟠NApi!6H3Ʒ9ujD(5 A~ARA"d5+0cOss%Ycdʲi.H8o5>W oKU`ΐN9$ r%ޑUWWj!`f"$/Pjo$RJJA .=XBR$ReIFb) &< ~sa[;8ZA%(Vk+G,$r)Hб3EBg^P :9H 9nSF(긣ًXJ}mZR/'c?'ht`Q:h*:j p옶Tv S)حPL+$"!k?b9dX`ބ5Չw.MT _Cld hpb>`);9kTզ#y#qkX.>**J f7+r^/,~X ~&;ɹ l􅾜c^5H^ޥO̝o0YIQ ^H$97|sCf~4h@RŰ\)#0BϝVrJ`eh1?at3 k.]Qq> aew[;3,]YE>: I5il3| @86җ'JKD.}gO' 1T=،*yBl.(PF?6"y ?!!T=D]u#t|>Rl#r}G.Z>Gog#ǰE꥜ /Oa}VV8H3`q'dFV  O2gSDiF8sW  Wt)u&VRc; ^]O3aMP';c4kv}׸jUb:S-@ P`KBSj-`Yur@OqR Tl-q(IdMΞ)ye9:> iPRr-bʋ,c8%zG,HGHNIHrҥhi',I1WNn4F`f(C4FĄ _ԝHh1}k/s39f{ɩPI )3G۾ j`UTBHXzcHԾl)Ő.8sIKQF/QYAɭ^lH(B&3rDUb$ꋔyg)]>G Eucfy=л`g)ZWQY6CVK ,=x@ھHF Q9Tѡ-J}S]撲2@:cJo#\fA/6E]ӞzV?\KS* -\-*@SwkjБ)uMZlz-QQ*bxZ @O$S0PA nߣ<G{11Չ1щ]ҭ$5}Е9+Sf(YN ОROI7:k@;&.Ya9'yQ;FOA3(]A)\8{CI!ȓ+b0d(G{,igX'|v]0\]ϳ288lArh'2;مS /s.1$!#V>a5 HMWI_oi94Iccȡ3,6v) ݡ|Xr0n\kM=::A2~|}Oԝ%ĹZCץ ĩ FjhI#=`aAn&Qyo%R`+h^b:evZ'9 j}_, m=^k,f苜mTb X z1B Hm/\8d/nl["sM$͛{x[}͛%[A"drxeZ]cZEɬ8MS| FTw## n}z5m9taܲ56Oo)0݂1V(F1/M~E;r\XW顿FW-+.v~l2]_ d4oF,^=Bb֔-fӫTNЍض*Gʖz>.E `.Rap5:=QhC7ϧ:/'(7h(tue],GL ? {Sx&"iаx`:x+;?CfdSW =)3˨;\Ξg?*vu A:]zOzIB@ݖ`ٶm۶m۶oٶm۶muUs~~==ˈ̌Z{>kxk~]TwCq9oڬA˼G3chT&`Ƈ%Q="B$1ُ bLohUڢ'pHTk$fffHI>UT,f2%n*]Ao@"GP|]mq]4l mBZ7trw#phYTo|wT# gV!*$p}IM)5kݱ/63HPY=g0/C,}Hyj5Arjaze)XHiBzutxS`8YUODD[뚇ᥔݘ;uESA!9eG#[ z=qTե@2T#yk谍>UB^j*C}b 0OM+8|plV,eȶKxJ-Ycu؝]K~8,s0,y?\wV2GME3E3 UGbLuUu0`2WU5\\@^f|N}+ޤd+;=M͆3cg؁^_!õHYv?$Gxw0 QStr"HJPބF]"G) Ud-2 Aka\fj-wT>49 6 \ܘujO;I1%n/K&k/viO~F\fy(nnN2])UcYIִ1xeTs @E~G% 8r+[z}~H&Uo&\ &J]l@&6b^r;=wJē͇q')V$9n>]s;@AZrFHT%>UܕfiՌܾXI6f'|-T5 +=5ˬhJ&p ǎN9y1}POZ-F 3F`NaQL8 :L2a1;AG{[wmZaB- Z,9L3#v3`31*~&ϕ\zaf`j` #s(&} u018CXI2Gf~̔80;VP\%r*gci.$hpP4x6;Ms9&1`"< =&+TӬK#LsFG/4 uRē=UAU"2ʤiK u%q!kvFwr_Eւ mnV>^vm%[$|6 6$7YZ2XDsV!&=. ! P+Ik2$I׽c;#5:U}Շ:!o9!ytd+}wc-hĆ^؁*klMަv~CD#0TgFzb JbI^CG!#u%g8cd[nUs":[6ܾb!P`U A*IBhnX7?B"d8ɱpfaZ"h^[QNіMQ8tGΆ^}nᚶ8<ڳ}{k%6J|w0߭sl6a3"\$ax0 lijm2YsCp= auN*"d|#ֺ8jZ ))QA_fV*)RBJeU H Ee㿼mĭ5~AV,QKmJ ꘧EYSf: 배Y2v3ք &JOQ ˁsʃ̛":"OptsU&&91$ҟ2?굴=/ږ'DRZО9&&m*FܔwTc_@GlR*.3çqcy @ ц?L OnxA44kxvz3z im& Fw&.Pyu∕Imn-z&.}q+VB:-j.OFݰm ݏ/uohGK68̈R)K0tLsP |%j,RQ:-!/颇l,CWO6eЛ} ˆ%HfqG=J_yK[+ 5ZNgGXNπߴzTKNva,'}Ԟ#ͩ]aѺ$=^~xYaNܨX`͕/3Kz :oIGv=y+8N3nb/y6nZ%,T\yd*.a]\"7TN{/遉낵CQl=J[QQg`Zfڰ=Vld@`)ReOr? ?s{x7:QK3#6EzC_켧$iom9 qc@P٪nj9")۠Z;(P뾺*Cȥw..VYZ~0`07$זEX cI-PǿPYVc *?)F?9>Q2l Y E5<%^ `)D[*`[M%MKml#&$]^T $8L0˅j-c*Nbei>4jOuzU/>JU }֘4'{b҅i`9'kµ8)pIȹy-4?7DT8 D$G)\T&m8FD$"Hu항r2ץ-]itθF0r-O)̵NVDtrark {:jȔw[S7 vD'9 HVoOx߯ȓ1*CL"V;c˿&%+l鶔۬K]CW[V+{!l̬)V2'η;)y.i⠓. ?-qkbvMU,C+ *تT[ #  -yJR*,=xRx uJ޴>wP6@ C8PMzm!$;U8,39>./'4Pf]\q|~8$}e"Ojo!zj3,Ux ^MjZ}&h zmGW_*XXbPeGY -i@0GJfl2nEV-V@%kj_vׇ߰ͧS0fnS[/[o9'_?l8k?$9'"\TK&$TK5_V fB!U[V&^5B$Z'ꐤ36J A&&6,!%:ت,I.qՌ ΋aX)¬7hd3Q1S6I<׻~%Ė=|@aU%9( (IhEzbm'Ѯp*Z`j V5<$9&QRBƫpVu>`s 政R\ZԿ3ԍڈee.(aqtPw\6"m.a]FNPuGі~_:ҕʕiИN*S ASƃX:n&ubZI{܍xBkD3SE~! ~,ikQJ[=o^F]`kte"/\19x*5:XGfB$GF&7?'d9cB hlS*76n8t$܄%]L 4SX)qF grib)qMŅaLMَV+j 5=~/!hDV5XVKjrNl=Q{%^?x1[ =-$j]Wj럫GPK lV?:#LNpma^ ֧V"B4t:f zR)>e(` >P]o=Qي˂5N aV:`+wq[4w= ,liν-ν2mڿN8G-'D- /'yF^RtŢ:.m8RԥZE/$)YETj$нVbC?^TN^=v;7 eUŃKGȈ/OwJDi J,?Vt&I2r\}gh<d A#@ʬk1]ؔGFAiT bIJ UQTH4$b9Sӣ[$Ast5D1 hGnyB6@r4F'&%"˖%2ְ>\#'r/ ď> ^ZJtHEVEu=}ecUo"9}9k"#SIs m  Zv̿n\<2c.x\/sK&&ܞd>v(]>břTq)˧x o_ETYӃ <@Hr0'mHGb 5b 9b@TЈCwT7dh:ף˯c2kgm5-NjSȠ%+TJFfqԦ",p医=e<}1}̞2{8:}O8ћwdif;3v46 ~fq̂F|^X 3eIr8Vײ|@Eո›zrX9,ga߈6csb1nF2V+=pc4Vd n%!bUbcHZRd%F GksRO4V|4 f䮦-~Gme%@5;7E^*9!$Ʌ'w1cycM5!/dL+?^?_% 啺'@?7wS (~7j+\eaBjĦ΂Ez]CP:peE|$f)ۋIƻOw6sg%'AB<1e:o:9;hcwUӫ3l*s뫿JrugJoNk;|ZsM'<`W3Š kxVE"D^͙؇Ѱ?hQǐG6@t&RZvfv mV&$EW078j۳SѬ 5(.لWLj*x{6Q&&v5^Q^ ѫMeg 1bߘ<e 3bd(_9V(<gaK4Baw)X y88'A*jΎLOm|Υ*:#|*szc3`}6軣L^bLE eg`%htEE+PxM7OK/wxNSmʸ 'i?`2JL W3 ]cUP2B <~"488QX٩X_uJiA `#b$(p zXCUZs2e[?/ГY _R @(D[$'*/ ҆$RihG*TU腺I P^:@Z'jYe'eȹg 降oQydAq"Suf]| Vg*z ,륅\=c^_Nsb`9Dڎ±a1r['hRYJ$VGg*F~v:c*2e.6a[2 7ƈszo6g[9`0&{DFU! ~r[lR$]uEcC0 ☝]=sQ'0KPap#%OY5NYKk nVFfY.zRF䌋w*OLA2x^0%a.cN*TRk5S)K?mu ?xU"{$#T\V2w \LXVnQ47e's,ϔcUFy)n)W91@ABNᓼ@quj;#`BѭA%9v* v/ Da ad$|US!0F6H .S풯4۬4,i-ْͲb2 /uѧAFXhptwԘdG|x ČfT\Ɗ7[q&=UF5L-Le9bragv,T)b(BB#'Bd 3454z˅MߏOp%qMkLR\[Ǥٵc Íd]YZkS Y6X4bc\Y _/5-(?& 5"nnK(J\Q]gMCS~mo' '/( [#F"F6頃'ҢPj2`1є E1(\L8B# ΢r_$ X=6,ېhjYѲqBZ*wp7=5N:ܷq*ƔmA5LҺE1HËI_ =DMU6^@~ppq1%iuiyRw=\ !9,p6zN7ds?EN*GD?2Ud~BꘒNerbJG6DyhQMSQ*`Hĵn|ޥV}NF;Ă#|tIAF(̀$=@#7qZFCܭǼ4Ua΢LS%Yf 2RU} bTހGƆ+݈#/x mGV /0<{lp&lsCz`=qQ<θs?JHX!uT;-$9Bʱz)9y{ ,d29&6ۇťZ`jO ̒00aLJh& uX,=-C7$C0N - tC,H:p6qJѾv5RV#5Z4Iu4m}X $9{gt6= NZ%6T{7 o$]vB9P E IXlV l7օGyο7kQBNt99ShmA^~;ꦝR5D#{c4MxNTUE!Mt&.#vD!H(foj\7" 8=d1\~J-nm.,D RZ''~2Y09Җ+m-&F5y?@7*3Y h+\. kg/2Uhaq-]N)e J[7{jAФYQx}Pv"a^R"+(nbtpx.C½՞hڛ76:k΃YgY4zF,1tY |jxۘF`ƽ;onâ0=:,s6ـWH. E^y8Ͷߚ> ~X1*o $c CL[!1Du:l\i9}E4X:G͈ݖv?hw(@JrWsK[_?y ZdJ¯;,c E-L(U6gq,Ř+ R}(Z"ЩĊ&DRvYn]8[F#t֮]EW %qm|wޜ#)ؖS4,?\=rB9iڅXS g9zp$QCP)"9I>@8sb|OJR-tC~]LeJI2WWj +#iFMKo{-ŕaDWfUoO#~RLǞWO`ƕ$-AџQg\wS156:vӘŌK&rZ]𣔇2N:Ӯ#]FFt5rW s@9c*La$YHL4ˊ(H5p$jT%> J 8<г]Uۭeʫń _-hL.uE”ӄl!B#y[7bkT^3NeMCFy\}&LM҃_w6G(DoH|+hnL$'/@=aٔ#E!Wΰ6DrʰVoP)OOd\Wgv=uTmcUM]3nqxgA:'V0aUn&NL X>>V+?j ~!yFZ"O֟)1ȳ8fs>X2ku!ȏ~H4t.E1_/V 8DiRIutyv%V;rJ0-R?aY/5?ވHоj]Ii}|I&~[)a8pznehd3`9&7:٤B/oSބ+1H+}a*b<;&eiE<=)eGJ慎ޛf^c rGfn) ^c{UrUn#RO5kTjR4>1@glp3ɓL}&kxWGtϣ!Ƀc']a=o%r,_BX)LXrH9 *r>Zg^P ;Жܪ vP ۳KhT \eO;b:eٜv?悶b NfaFxyĝ(c=pqOj\yBj,}O}v=gOV|2OŻ~ $OV3+(&rFp$C=`kUsZV*?^hlVdwV{zԪ߫^0Z\6ԩ]|3Nh9~#~;]v~k=G?o|5Ŵ_nS\uN |٭揓'˚9< j}{tIf J(F3&7NUojrϧ?jÕF >0SkuLTeSqfYjK~a^noGcRGb{DM/*TbV0s6T'{Qz6WYY2DO鱘YX#L똋ulr gndmj(+nz {. UgD$3""rZ>sKOH }9A-jSN ` A;_ ic.?B1RG' wќg8cE203$⒨k~NvYDrzusƅ FmL0UnJšE1Ali vJvRsW5zvA/3`耂jJ%s@] ] QVM\uKe]&NsB+TXq2m\AQ3Э cdc%vV$ϊsK\p1NT "˹V\!24Sz'OJbO^s^1v ",${ѥcs ۴0׎i䁲A d)a9r~ Aƅ4QfYYO6D=92OQNݏINY6 Tz䱐v(+=j p,ՖIT+^`U$-. H[5̈B o|LԸ>kfiX(T=P }Xp^.AFM9\GC{p)8 9}|d6 w@L{ٔ1\~Ā˚N*]~(;`/ ,"s9"LQzLvRԺg:grn#7 $l. bzS ]u JЉOqe%Ekfǒ0!۫w珟]3;oAf^Skmв7R.Q5q(z/q-^QNHKV"j }.'aj(&h"8K+Cyio_sc.Y]@ѷm۸;aLti GwޜlJ;k\#t +.TAKPxXKPAGx:|J7.2nŃ.lp,^sr\9:q::zS׷M>#.fA-喉JW/b_BY[^=4eQ?w?-駾;}NV=~VUQC_|ة=ր?}2VSz-rzBXέzxv`ՈUtM*-K⒅W!-*jҖW<=/ )-+ܪHlsx? CijRzj.yÈ(sA:!cҳ̦qUPTƼ8 {-IϋNpBCMM-Rv|SSM{'%`^))VfP`(LtN]vq(hrqW™*ߊ( Y~r?+v@ pMV=`#=Bٌp-Hx睞- `r` 8m_2R>#(Sj/Nh0+ FsQ(-{|1t] ar S^2dS`=- ~BrNAQg }R)[[5*tW!7Ycu32!Xpa؝9S :8Cʹn<-@ZHY>ŒVCƊLDFS`'S=VOKW4ap\ғ`9l~{IQ8 "Ǫ=oRMϷ\Tsvr8mt}MNB/:[8 1e~dO Q&YxazX[9%vx룉[}FN:yB9W d6ߋ/ }AWЕUv)Ңnѧ;5#E C ;fڲQO圵I'"g޺?t])/o}n]Tt馈ƋeMB?YGHzٕG'gKw6" ZXmO`dOqwն;R\Oy8 ͥ6$WyB蝳Yf KYluIY\oվ<+]Vӿx[ҿl]ys՟|3J{QN@&s&uFJY 2GY/&S|=1cWhW 8!O큱ƊjS?^p.e:njlZF|s{n:DipxG'Nwׅ Y>IT Unp>5",_: *DMY^Jq1{p e(0>v 9h:>g ¥r5L+ZIdŞ.EpoU];Jz2y(GY֥XM:^~'5ߗ*bY~l;? rȊrѢVajMB!-:hMF ~WlICw]$KҤak&Y=nf=W;x{cfhKVTmZMBK8,j1j>l/$سw LsKfUe]g lm%}fY10z檭0[ 0%UNHn:.l{GDA<)qVД YR$ 3o@y9, :6XXWX4NM- TJ!To$]4aXƬ<~ @Rah(ѺT[=2ۭQ@6 ]g? (5\HF~`ٮC%.ktA%,ىDې> fgY%4Jaf1bk+GR3VLFR# &$:Se9|;9\<Y!{7|AJz_EtJL&⠱r+ #5-D'U$#gk܁ 3XXI4`"_q tu0}Pr-JakM 8Kڪ Zdse&Sbt! ft& s' qr÷Pb-J~I 0$U nF#;fBsdrrąZnJ(5lSHk".NGtxjvQZmBXdVK2 #hΈ>UB ~2t3Ogu#jS@, 'j4)^ٷtv ^F]J}ZD*Q4VQ 1ϑ=:n$-rKj~~Ms}PW K}1KnReTJoam[SAe1 YV[/M]4`'V41R8f[!w6"8e^C U(&w}7VEFIpF ]2t s3c!CA4 凉~\`C;*@0!g"7Nz$2=zd=%=G1XX{&(\Jh /J oC1KSow^2Jf`L#ño%?LUJ O߅>SG??_N/!Y{1q0.J x#PCɓ5+'JlTnjTїOl*kS2X%8Eord?sHƛ "Ts_n4r t9A!v~=ATM#,ia[B{l#j)GtNN/r[ {1KLHX$' l3K8z 8-ݕc$vz5ػ5v`%tn+PO;?PF p!"@P}7_Ip<;]pZTIWX?ψ|ega~DO_wнwq 9#u!*p8Q(7[:kv^X2u1cЯiO@K=en 2rФC@r#X'"<rLf*F>"e`.o>n4ʠ+ !2nӕ\I3cH(Jf$L.$.HgX.~ ~Zi|}PN `}i³7|?9'p͑KX|iɠz ?ϟuDqsswŲjR`03H\h?y@'6[ؑ+\…z!H-$qO.= qTCv&wHgQxtv-=]z T ]cBp8y"_U _#}[+=CsS: [dI;vGw p4 r0$:D/w 1HN<ߊ(qAE|}zy|S\,gT~W᷷a0uGJ;6~b((=ˌM61K EҐK^/jyaZj{h2 :| %>J&NE>&eh1U ALp':~{w#4nFFt߫JTxxa6M)Dy.Q E<f[1 tg4bZt-o0oiV9t+mUPHP?é5 }B竝pTrqN'YI}YXjȗ].8o ['q4 e_PiT5z>p=vapD%xa6g:4~G2RfimGl"; 6i-vW=!XDld؍ǻM~T1kygA ەK7w~3%X&k`H ja=R1kWVF'C1 Xnf3 r1)q&4!>J?[uQ~\pIyZ{:A>o3(_?۴Cr(N)ʬ[w@zX8 4Kq8$@QCc(*ڹ]w;HVhOwiq+YJlU2}U 7 @3ވʻ>eX\m;P+FWB$9Ŝ% *-%%փ!*~-fR7v$QBU'u%%w5OHk/y=>ѝ>RDp"*W۝U[)b9vO>x1 E`1Ԕ^EV^4@',V L ?ʏuv)Pl4n*6ef }TWW=2K? quZ,$:j3;plͫ.lXgdaՠQi ϚeX;=Z൛n6=tTДA$6"i$$ c(: yfMK5OWdacaA5D3B9~D̕ޞ+SDI7VtƁ&F6F%|c} yL<t5*fC_g^Jta2%SR:tm Q2J:Bx) .l#1~DkP)ExZZc^FIaD-XoYg wU+ ρ?Kw~m&u'`(HNmW Rf }i+(.^^JZߡGO;_ d.ο ɬGo?%( a ATƢ>(/DR1ܲdyB$ 7^(ϟN] n~姹sJ 9pC[ugO=44c'J0IHK*Q/M,aPUulM9bj wo _b$kB36B/KSI_C[.TU@3j=s}&u\pycTx_g/"n^h 1=DN)-*Dd!!jئy$%azV7Oj,U.] QtC$lZiCS#tM𓡄dbA7YWX#6oib(ҬOt,.'T~z߫:P&?-!r޵SR',9F`xDt=]ǂ!xb|u!rhE2eMcF)r5*n>[~:8O1 Z b+?.rXiH%~|XZ|< Vxep)Xdm ;xUNN 4FCt5+h#,C6>PNrO0^[1<G@SR![Y[Yfȱ?bALWѰ&0^"5/8F,"4VrGGa3Y0j"siMma[e0JQ2v{Gʭc"*݅zMH c#Pzh\9.Nh;I :9ṱZ'uOE_J& nne&!Iȗ86q^\ Ɓ J> "n;+2|ST1?Kr eZðlW)ĝlꄻɖ;WƋZ.ӀQ@At/|qҫWTJzV"6Xӑ6<Ռ>"(%|bXaǣЧ  d}&&b8O]pAONUjr& ؑ-^VTu2Gb5A\Ja!NuO{_ꤵ^=g)݆ڢO ޤ(~ca b܏vg.5lf:{t.mÛ+[N^*9H.;-% $wv >c:%yrS姝RLx>;ģ"#xIQ=% p% M#vp}. Q& 4Ygs,lu,"D#Ͱ;zAI{g]NU * 5pSECS!pQUEF&ܼ $ hu(_P7X< !c=銌Mgζo}hK1QE(aXSDG>G`PX#xbD<-'Z oqvE9KMLK"4Jؔi#94 c$U-l5ܐ;e}\RqXvoTc? ]-K LO*o^֯+I(@_ 0gԝ7#In=wگ1"ȅ,˜ݺ"&&ߧ[7}4s --*YNAbԚ-7V5) :NDL0j$0 BoW9 ReWXѧ+H+DC vCL`P Δ{ G¹7Ɖmeya:P^ȗHy:.[|&jjZ,)#06y>bɠ S(ɛT^$i~FH&3ORXK b;2wK"9rɺ:9" w ~WkΎQς)3iyZ]; RQgim]Q%HȾ jgzS9inu Jnpc@:&}|FT#T#vzYD/A>syCf7] W>$0+0Dn>q I`UfXD+:Db~2K/ VpQ\rZ52?5$9>ɴIJ2$H:zx9Ĵ a?hثG̙ww amu} j@NO1  )G\ӷ2m'ާP˟M?~d̊!ds@Ya)I *c^6tLm'oM|'ʖBYX QP J1aà/STTZukOEnCqL}S$LchPi E8,Miфj I*>)!G;&poX1Eu 'T3ʌB8m,gc2{]Vt sԐBnj =AHPv=C% A4 BY%@ТJfΈKBUn:xէ'$Hi &ۢQ\E-O2m}jgK58z>`Ctͽnyy90S~ŸmsIشT:|`f``rn`db` _ I *_GF_EYCH_ K*SOpza*U*`2dpk̵ST~GYM'Ɉ4Ɏ(GA:ǜ{~Dt!h"NO74aa~aq¡>" Bc.:F ƨ%FUUuaUq%IƨC-S}&a.ZWrVLPZ]?tg2Eڡ9W^f 11m]Y̷k& L9`.ZGgu4/d;‘6v9 sѼN,):1zQgg0o%о. a9KRger͑H#P1,A .2&dq^AK\ۤTUBœ^ qq{ȿrEg!hU]ɥ1)ńX|8Zwgl-^p+'ٺ#KQw D9|GF؝MR:C6*@ܪkG; ܳ%J}i Ou-FQeT6UJ~BMF&SL,m+L/L@9]^g59'/2j׸zC |?:Dv>ʼ|/<7PDUajQcX.dVtsӎ "ʜV̡&.b_eP[Ve&qVLtm _CBA N\Ub⬏2۵IJ eK̦:e&Cd-zyBoǁ˔FuhY83k4p[(A@S!JsSl;0Ni!u?&oMdK!v:8:F ! ",}hS e"ok RR: `j@Ȗ!!S=>?`.t 5r vꛫ*v73ˬKQj4$Pe P 7ƖJc_G a+T IiY.}[6T#7Q+7YGjc΁D҂,ω?wopIsx8~|"\Ry("(̿x1mHSԊg6z Q߇M9SQQ69RM` FR9J44-¬NH! 1̄ܽ1s V7KJUk h:ڨ'o4R . U@B=kUr"}]By,ְ͛|Q/p7{g "(X?a׹MoE=yTZg_h-myS'C;w=3ah/c]8gXjYnڜ B;j g7=,c,߻v߀e4 e0DP@\p m|_N8twl(s>v>v~ a 8#V-{[MӭtOj=WEK1bCXk/pM'1y+TuWqD;s.:2cikf泍L5u|#S+VR7Z iT '206O[Y+(Z;,ZN:ScP|e3~K!.Ϩo;C]0BDLXȰFX;K|6\Wd rǾP-nOeLID=j~#6}M5J߲-bȕ  ".2?{^oCZ{Mq.p猪\!ܠ6m插jz%^uܱt#ya"e @1)ו`(ͥ-kAj]O:ׁo>jeҾDKw)m$B#Oӥ٦|b2x9l?'h[exej|ضayCqfsx>me^WJWky3rk 6f>>#'W%3kj||{@+Z燸mVcTPw/O/fv/G\.OGcJq BwX>Ƽ8{Gt#M{HsECGKq>׋)cKQs2WvG.oτAUq@dfv=Fy`ٱƋ:Yί\vE] %[D7u]jfT3D9$tP}mH6[/аXYk=p,Sq9Xq\;Y--JȽ4Aj+m"dX!>gUW^hnVFRѼ;5FsJF'o_w3 OyL<֫(#32{u@:&1\yּӔ͵~sX6mSIbgá(9W[:-{g4(.Tdl+x*3rQp~Op5[[=SM۷t &28[row Oi?O7-ʙ%qAkeW P)HA #5HI\m*&y2ϼ~}<i B <|F_wVgr{Н-aɉBBXuqEhu\7kJiW/  tƒTgFd9 gliX+Ypvu;ۼ`U60%~$t"۵v< 83Ƣuw H7LSt ↗b:Kfs ]L ^ YADwc1&JaeX{Ybι5 p_jRY^T7} >?@^#hHoB&rIiii|lbk?ȏsn !B6Yr2H藓;L͙Qs3tR-o{w.BK뷈q~@G[4oq2Z+݊Ft?fis8GLql~&`v3A׏yکJ?#0_Q1@+W &mDI($ eҸm].{ WB棡h:ߤ$zT 04OgIaU pb;+Ώ"PQl}s&;LŒ/S]F-I;˞TeA@цW6? $,.ڢ Pt$n&/yl{u3&uLv[N!7ԢKe +aVlrݤ|4ZP~D ǥ5A)E eMklם?`ug#V[gҟR͜vš=WVxeFrd/'+O X]rе۱|A&Ϥ[;e/P| t-޾,ʼV_*u sFCڗf4I RN,_<(]#z;^M}= FI Sd`Ee>QrIwlG$' c0)w Q -[?Q[)ff/` d!D[ (} _Xjw=h>E&J@/Fn2ۦke٦<.zq)kP-,8*ϰpLh"VlLy3&փ@O{7tc K32+=pZDC  VZo$JefuRO<KQ&95vyfJ!Yo[0ZiBvUG\ʸğÅ*O"VKTbߣ(U,ufzeq#p.WGq/lwdS A*DAĻ?tv? zר*4 Cv%M. vK0>*#bG+)eu 6sovLŸag Y=(xMzlj\R칻x`iKx΅%dFHé dZUI\(&a9("lr@qlrj-cZH<8B#QLh'UAIdZH#1l'n)l lˁk& Hƈ/i'dBժē$Ku _"{%J\LB2CHwP6w?6͠7/$ FnA_V[&,_KD^φ娟qITQ3;`Mk-_-_w$Mz4"nB|^Q0}o0 !GNlJ`/E߆Y +!˥Xdd_OuQxS ui _u_Ǥ!%Y`e=L:m3j@d?)mH N oӝgx_fr{ m8_yN4 #\ʘ N57Dv>;Mek7& Ce w,ï8HX e2ldg|L%) WXpK9ʼn#"Ii=DBO Ac=@ݷ{D*G9T&FWɲܽA?7Κ=#t奚WcY]mkxCC_< jo—+T}6U vHy>vQvoy9F$G%kߵlǓ뫿3\SF0ИZ׶+4x.kl?ϱxsF3,/08LS3t,=njQgJz|s\ǧ-G8i6no,9{/ "S+aIʞsM!7aj c(9+A1 %\`^  N1N&g]`4I0T]E{1nȀB}t"M&-L9#*9FmfwO&\nRCWų0b0> bZeZ(h<v&*bf˂t@ֆƒp#, nƉnecO7hGDžg)<$S@MaUУ}-H  6ꓬa0H5Y`B`T%!'Γmu=!vcIEuBA27Qը/1 @"iuQm۶ͷm۶m۶m۶ms#:FQ3sdͬQ#Ǔ9ANfռ:Rf~8ĭzԄZ)!wNpذ jk_[dpu$[ـ!nDvtZnEQG^jx*m"K\yfTWf2vVlwmѥToRƿ~<=E?NtyM&\[.ʡ6W\W;ff7^ c&Yǚ{c+,4硢 Y_C8%Stu,R V0GLMbCC`E;*dY7}64M0 p2zrY)i\ ċQ,) %hto5B@F8Rj8 Ɍ?rVCNPxh%>Vчp _DCU+8GB=(X&tm;O6JRӈ%Gw j C/J3

4hUP}GX? \` X]`U8-)x󛱗].U=)B]GhMul~9zLzg8D+`A v|11_Y?pwvg(S̈`qֺSᰠ07h :KO"_B0T;#"[ :Rh r}|l _Hq"L8d(-R `۹ۇXI4 r]E֡D=qX渚쀥|mT؆(5P@+bD6R_2u?i21Ml'T DyG-7 Rcf&/_1CLfuW$7l3`e4Cd{AkPzmH>{/LzY{%Cώ*_0GAfIV*|2'XpK1@[YL_z}XsW^%;}QǪJAB]wܐ[P tAPb B0IlYTUlR` a<+ʴ# &|'ҦIAo> &y! ׋#p]ъ,5 tIXaBf Gi$BNBΌ36l$+NմC" ?U37[HI$ɖ\(Ìvf-/*wjBrwK?%MKkUnƢ ,I FI<ǭ8X mjn+a~%tDgOA` FuYpSV %];z<=9*zRA,">J/,D ЎHJ[QL;g"j@[EZBLrr:[.CV^*9 n$wt$,0f' F݄ oF&JJY VCUI.dZwt'LF}7ߥztl]cԞw@ II>sPÑ/QH8pS [9U%>ߎ?ƢJ'P-.uw\Xעf+*vUFϙvO+q5hJ VYċX^bf÷DA(ު`L0<%Dc$} NİGN*{M1}3k1fPg~rkD<+VRlh*7&bLc+QEp~& : }w@\H0zĂĻ7ٓ)*}GR5;Pf *-C@\f5Lz~!$f[.Ylz8"5RTBU_YPeJfaAc6}J9®ch˨u"TL+N˸gm 3{5 ' l<~oKc7Zssp6yH:rqx=~tȳePDCq5RILnV>LH[U7vvwYF_} ߯Ip*?:ȷq;it;(aEOF& Ͱ S5~vONP'g):a.K s0:SzFPt@&K)HKJ*b1^I`VE,PS#S1j4ȹo K %s>8mj:$V9r0[#h;3kNTdDpG=TWzb)(2̊(S83j[Nb,JH~:`7_ j9"pd 0O<;ulgv<1iԥn)Q;iX䳏wv0f2&1zc2xpe[F0VEu ttFA1K#)ȇhW athe,õ.^(a/lnib&)we<'Y5PE;sBdУZ\)KB䌲ڦ%7PRض| `^߶|p@U]fW&*yOQ9X;((l VD P4, _A<,so8n:7ɗi!Hij^ts Y=2*K'g/FW :DiѝʦF<ˆxYB6'bM?ߠ> I7Sk }ݰXq㘎 b]{Ft[onV.%A9rN$"Jǜ9H(r|-))#L3YP@kPtPtUYN/DBDg"Q aZ{rc]1EwfJ{Q SR⯉$+2ݝή%Kї*]O'~}c<>j/hb(N rB@1']E{6ydk~@WŎ#}f !嫵 xaeAc: *V4-[T@RbW$)*FJvMR+iE7+[$O-U-0 - )Bku@ݫW16oro[Y̎ Oai|bAZºw rr2YgE2[dm1g({˚%:@88*11pIWDҒu)k6I'd> C&v$57Fi|:bI Zu>.i̵>Yӭ1=Y%)ĉ]ls Z:bj>3"xҩVJz;z UBgA:O3@T0BjVV7\4R3mz}72y5Mˍ|Yq&v7 HOn5Z? c!$1L8f8 e_N?̥%v18[u!JRk!mCH9o>@6æx>?PC0$S! AiS,Z{|2^aӈt"DxÍ m 2-i/) h$ O2y/V+bA) /.0+ocqH\:"+dw45% Y/$[e*PϧYwhDQ0s=QE%Oq{s};qm$$wI9<~=y]>U҄^TCN?+27YwcST|IqiUeDY ni-i;ǃt  $s E9x֚cm4gۗ(iߖQ% "($ :G.A{ZOq tIxORϲؒ"#p@6fP'MioYn܂c}@]H(U/'F_lмŒ:ǁg4m=7PH@8~XuѸWDQRZL#bՠ4טEEvX6MEB3;e4~&c})cC@B{Tϖ^7{USaJ+)Ҕz2 ,gX #HBas4GvMEuI\t5*Ȥ #H9^)m ЕS#5 Qa:>|R9TSSr &ia= Xጹ 2IhTП NbC9a{$ƞhII C-;b͆1,',J~{K*=&xiiwEtcS{pHmOնI P N؂.BP,#Zm:H" ؼ8.(nָܦNӁX9| bh+T  М܃h<7t7HF,dڟ;a 03o>߯+&ΉW\qq}t}9 _C C6,OFIC-r01tUTykͩY[ifC/bkMtF(Ps1*W("|*YUY1y1)0KdVfv2}?xv~M\g}$Hx[}3S1u`)tĐ/ַ"OKOLXMoԶTNE1|LPr Ԇ.s43gh!x[< F֥]@Xw!9=)*} WW;I+b@f]@B >_K`5tG8Ϟc c[SlMgnR-v0l=#kFCЊ:D*W!C!Q!jjJh 9s&.k|"b/-9 _)rtObGP/PY_Z#j-2HhJ^e(Q(G%ԘR{<azCsM2qH4[KOĔ2Ъeg)*C'TNH'u͵G֤>X< | ;*{{Gm݊QIGJUAT` kE$D8گ4ěaX['i8Zg}."2mr[gaZkIl[g 8x8=4QAj;~wnG ǪG4d{ Em lff\lEffڥlZO!Bbr Ư|f+'ziIJM0( sta-)U>`s]lR;sL%):GVo/`KV(P &y`]j+m]mOkk}|@!r3 h< %mi|Rstcі{Tii~df_]tOY,ۯoئ .0c[{e%fNSI/ cöZ¡9Ĝi/~3v9IsꌋvQ嬂c?eF*9beuQ`,LMF0/)[94!-QŖU&}q,8!& 0z!1ڞD 9-l:7P[͊h9 5e@4Gq 2,&99;!ݴe\39ݖQxJ S"Bץ)p3 C2k=\wF$+ WHfoKS !xj/:4``8W-$1qC3A>1gx]I2E~ꋀPZqs]bC"xj +6_<6O ?|XػήGt.9I!yS?%I"SQ}z  zφGPיl4"{T&wT>cƎs)>|!m Wp[͓) ]!, aP6|#B1ɨ~#It}>*EFS#ޙg5[̋3A/>QO'DV??ߏl&$FEB 6)j((Fڕ9B67/{1(e\k/)^)0}|z4,Q,wٝ SrpG+UeunRV#0hg hTMgLC^j"6-TXՈ}NkǞRH ܕL hky#(jJIqo~N,! 7 E,@|JVk_ D V#JM$V| #`C-eP_k}@=[]ph~!\5{!@vCnèAjm=EOHɕ)XpGT{[y?c7o!B v&蚽iUqKc!YC|C'JV?q ^} oiO1f[ok[C;=8IjZǜ0CfK@IM4 ]c5b tH/Gԗ"+=['gx:6ڳK+Yf5!g rcki9:y8'ew.ڔ:_ ?T~6:,='|tB;;6e)!Ofb^ Lh/"&皔wwM*09at<9%0o,f"c|g7I ks2/.zKzbaH2Z1Jl1K=~2 _+]r%%ofWulif!9 @#0L8xf=!틽u7De zܜ; ~&NG`6=k}Ic՚_e3S*)[ b^3}HEy>je f G&za9f&'Keë:3Fxlq c=hxlbTZH c}MIp rB3kVVd2 $oEɨ̓PS[[h#T'F)j۶ƊT;C-ϽToPĐOk?!}|*4v`vȚ""7:K5T>'cPDC-2Z. @EiH5vzC F w*t %rDܤҡj?)}W`."ju?$k3R'a K +wie5"fkHu*KIL'͂'NML4o$c4s5?_wCYzqIoXDJ R\ pSGDѪ "bNuS ٠w6}}}s+q*+]qt*}͍RbI H:(a!᫂Pտ/mV#yAPUTNMKY#I(!TB$=TJ #]D&:U~]]t&33P~3T6<0EF1cqch\=9t:=gzEP[HQ`D]X^;K7D6A[UxreCN=ɮCYM[yLM`c`^R q]ȯolN:[%}9!@xV:QHAn,-%m  a3ҮQ)QLQ {ysI:_sL{9 [f{R5_cAH=&;\A'I/JBY6#H4AGgMU݆,&I0Tx~r[՘US'=.VuIR%2u$51e1G8))Ԕu|vW7ig9s)R$ұzMw bEAp -ҽui}YѼdYΕGͽ`'1zz$4& gId`Pel9hї1s7 etXQX(s3U) W?L~ V.(qKAT҆M "C̏G:T *bw51UJwФ _jHüʯz~+蟃sW4ސ%6a] )EY'lp-RړΝJM rg zXtKajX9Pm(^!jk0 T+# #TKA~k0؁pu z:T!%t&q:x= C{5ӱsٕcYT5 8P!/[x{GŶ,LYR[wWWnTA2@N-/i+Dފaq0"Yneasne "maA[MTa%WǹnrOu.. Wx~Ġ"ˌX]-"qχF4?G%+;Ew֒ɢ9'=j1R_6Cm8oNK>/}VZdx-)"_-% a_H&~P\nV4SO)VT4$A NFԣJ>M0IXXB6y̗vq@tV s,H T,=ĉ(sfޱ\ ,Uvȹ\<\ N2Q.nP~ƽ&a`~ HK{ec.' xZ)H5?!ԫMEU2/㞬%b[vu!7*: I#՟>ŜqK4d b5pJ  721scZ$Da%9B~gElAdy qހo= 1yS|E]m,eT8B;RGy{ _Ƴ OgwURnF44JĞOD6Vne ~Dy(__vm02~4oQeZmےsei#ʬElcḈt4-1uPz$SLGd٤zSdͧF+6^\aqY̿Y**IYeY *\ǡj)st^鱲*؇&*^Iēp8W--(]!%CXǓ<^^9u x5?%jK  Xh4`﬉ʖckÛW_:52JGSA&R4#-A^@Z %Ħ>=] 2h/%k3'wFʟV-+_"MVpˋ}USy~$fXq!)\rFh8GEQ;$-g/ nٝy<T%7-wڋ»_3mDi2d`%Kp#{jX|kG7mPMu0~_af ^3$k?}L %PQexM)O dSC\Ld[0InQIǣLj~7T?J22WaI=<4>T'K~.?$60dqUыP>o&.ʹ1pc:hRGrU_GvmٓۼJ {R"'~VCn-~Y)㱒).n[V%l56c\Cg+ST)aLe'<ݤͯwU#x~ya췊)"d~)fz&=f[<σ0ȯdV{QsJW78%`fb=J<Њ 1umo[9*tќ;RiNf M;fI$3`nn7L56dt:L;fjd)ls1za3tپ6  5f8&ل*%~Lye\6&Ufq?dU;v9ѸΆV(nߤk<3jJvJYt/1pc! 誡gLP&m#YSxy?O>O$7B%E~y'5<0ꜚttyl;CןS \8;QH\W=JNҥ.fQ 5_~+}o*M}SRX =9-uOxj\z+g}kDCB&H-ੰ#O0CL#B[C=Ht^uU¨VK2|YRԍ=k<`S"^ZaPzF%,.z zj/aCE\3O8g3sq/yVM #j<@"6P[e&g*ȵ3 S;n"0>?8:ɺZz=@ǎ@":4_ ^mr6ZougXP9k+S%zːV9£=͗-p1հ{9D<_KP%Fb,R A#K8hh>7z9xyQvT\g#jc:hrz)+"?E T) T8G״%9\Coԛ(U=۴>36i{n5lַ._fǐh3ćbST7K0͋F8Np/Yu54Z\Sv&`qUQ2 $HU("4S'e_x)aiZgHnz~liAFƚR H% 8lHaN-3YQNn_?yHII F ޿:ה5#KQEAzPǸ&T%7=Q䑁H$\M [֏ǎt(\y/:'*ZnͅA1OhSG)D.S;u@`tuޜ!ZN+P _*,oIRwA8iى X ֒ /BGR<*/1*T0iBʄ9ϑfQ&eFV-_I%ZX䈾 ~c Y&@ko= 6Ji9mHJa-O6a{qXqh~YFxgs}s,VgXZXH!}ոF_/jA!'H[]pאD|FIC-g>x $܄)!Y`:#qNBUhB7C?CX4߉nN H[@`JY.Үd9 |_ň0-NfC[ې}+Gx#f[j.4ZԜuUG3Ơ)mz;F})k16\܌ݯ1 ]МGl!=mkg_l[8+Utn#[`& 2QЊ`o#DٔNt9#Go4 {cG81=Վ(5h./\X;[kh6UK\jam("*Xk@L!R&.n!sga^ɣsb6A9oo^F=WElfrzpsXCgngdzn*5jn õKnŵ̤--ݱ?(1rj$]j~jH,`Yu2=Ї\UQ$*YSbhl>z\ P;R ;70740/x/ƵXГ+ttN)S}\܆tE}APH>N=$VU 'xSdP\x=!8v%Lr"/w aփy~9<{>j30[iG7lYnXUR85#`!8d[W* U!|qD0ҼW%.koI_p5SgJ゘t /wH jg\R<8gI~HQK5ʹ%P c*F6u) qϸtI *MgAp 6+K*Wo#!Opb?wBL,%'w,HYPoTb+0Aŗo^@ۃv[:?3g";'NqJ k-gޣ W-~8 k[lK7`D]ȵ3۽mǯVb} 1]~Iq^t(xmMqwf#Jb}mۘfk{y zXt<ꌅyADTꪍ" ZV(6} iS314&BQISUud9`  ڼ&Ck&?F`h3SCOLqDs'c*#ˁ&@PPsrXf"<$MdgyV=iUcKү1YשT OisGa4Hr\߫-=w!O<"Z3_?1>h̭<+lZ`st.4@g<"<;i}!j$7G$J*gDe-vJ_]êiʪa.zT!03pƶxe=^34x3ʓY ؕʅ[$G yl0Wq)n-lE(}%BK&xڀcVtŞ~dҀlӀ蛈l(1Ӏ[gr$FqTqHPy@a>+j >A^5R\~ r}^9mitY&!ھ9T+/d@9ı`Xmd>J|~e178$a63Ec4 ў}so.usJ9ԁ!^tEFZ{#[Wշu[7*! U,ڞo[?i [ 0|乛gըc߃mmGbj?0`X#5ӥU R)b̦P؞tl߫murMة< pFұ{×s}&6.K?]KiN{VQnRȂj@WRrq Ŵȹ2W9zR`y+wBʏ9QMYS l qq fp7Q; Ay {gϲ^,ad?9%|Hs@4nCNx1gDT:MG¸6qR̶=+A L⠳ ٍY4V5)Y/Gr]ěT9{k$@cUЇR]о8~grIfGtWBDٌ^@ @waf=@{_ Nd |a@pqC5#FYYE*L4U\}$vE;+sypypε_CZO";f-P?,(ȧHL&b%[ g!xDh1kU[JZ#ʱT MQN{X W_,s ©u]1X 3Q?0glq[0EA _tW)l/ 5x ٯq%_X{n!*o[V[#Ym ؟C^.!&?B'ёp$ΑBwJ-hߞ 8_&4^M_AM΢uMJzJij$\8g x: O8o;#$]b^d=;SUEj_,GU$5܉"5 Zڱ3wæQ=7Ԧ&U&yQI\&h ?f?%!\ꪁZ3>GZvSdiy𵒶]4\H^QӲB|pBpB/([@r%+]H-M7ԓʫK17֛7ͳ]𲋵 Ff/%m.BS"v͆75Zy{J FRJr#w a~4U2=eD{xd|̤g&%SNZ^z^'_ 5vY]YD-ձJJGTH_rI ~ ͇.c58Ev⛐.ssW0DB"ix&l> 9,/"%eټe9B4XVQ(jP޼V,tOO=IpgO=Y>~O+Xp~sj8OVU:S'g KO .1>HRzgV=!g.F-|<%#9+ ύk/>p:}>+E]>5(8g^81On1>y=驗_Rнr5ǫ쏙Ϛo^:^#3yvu*=w]K;Yɩc?z<\uu$fdo$AtNއBMLG!WW.\pldE E &ܡuc9)"9xuٰΠ죇fqk[(9yu՞-/۲K"q OI5|£gzwNM{_T f?(ի!<"藳sߜھx//@ OI?PU2s>U+v_꾡h\`|S ϲk~u봾[~3h눾Uj|'Wv뙝/57|}Ri47sLdez4fw{<篓 E_sρРv,ptj]/M@a>+.JIJd^4]d7hz/5L3⊰dIH 6lW0T8> -h!$z$]yeW۽] ';M7ÉAJf88CĆ6k*ްn*5o*DzyŠ='&a阋q2-lfERW-dd3*Ƕy2-&a3@.+WS116\#֏2ڌ9h0dB5㹚6JV_-R?c*?6-vk$u&.3$@[d^]׸z\Oy偽n}T'N~ٴmZƶ'֢!LC}r-@kw[%^m3*{SJIGsqBK}+`-L}uirfd+S"Y\gdMA#+X?2dR;=œE3xXY*͉ٚ1$pФ[ۣ{0DV鈺(),`Vw&qbmppV PҊWS:RXp02< zHљ5Dbx!4k<݌)9M)s o*&FJaʜOaZ.Hf.FeMR(eTpal:)rrAc+)y#!.HGpUVD (GEL=!K=Y'gU=G*m>z}mo$JQ=Vt ,Kͱ(ڐv;ȡt[,caT[O}t- 9fbءO`-;}gT7 ~,Cڌ.}Vh5CtKA}B2lC50C-7*dS(0VLh!8haCz(̑Cy7/1 C3b\KhUk]Q]&W@B{kCkCSkV^W^fF^KzL_ی"oklEk%inޝ]bx L^43sM%VFą#JDlojf@ܫJLR޺9}ܫ}AڛڷivJAWBY"Py7pe'xa rsTB1%ߐ&VC sϲRC {{ʶe'#+f{gj_l|'wa{1K|7fi++Ʃ+d>+4s$6sQhFE yb.;ڙW4WFʙ+zSjsO{ztT>Aj젝֜(-Y) |<.ūr]tszCLXebNh; s! OnB=`]3ɩ׫O۰.unη-|/wHO<oiq}4̧ ؎xάYLy'L,Y*iM4E&~3SNW/*{䊫L*>p>|%']pxiu$Mk]sP; ]5 Q<0÷ӖM_EvhMTf dLXI-WʄN1|{}֒XHƛ ieRr#RReybR#̀8eoy5ߵ@Rp@ uBсHj֨hy&ioyuf36"HYuB{m(V>U`/&s] Wm`W]D#b(ϗpP:g[2\'+bwD¿݊yV#κ4*Sfp2:ڃ8n)3{'#cv`8!ԄZleMwwԝoCu~aȇ)T tU i8#m閟~'XQ:{'mstW9Ǭ77ગWŗjS@o͗Cp-2e%VZlv!4pnsַ[\=W|q[dKChlWս},Ee4TLut*nxОt645pe<!Ax ;Bd?!z<h .X*.H.ҸowD;tN'C(C-b/[h[!-ݽ=El&m{퉝|!=.C[ȽU F;{=c;{6PR@H|)`}bNdGftS@:)CM@鳄y?GD;0~I ^(slS̻c]=jna7-O5@Or*9n?m y +ާ:OK>k ekO..:q̀4j2rNW|^X:xb% OམVpע"9={ "= 4L_9N2 :m Qy^Ϊ7ӇC=8Ss].K>%8mO s+ϙ\t؇Reܶgy^Y;ϱ<Xn od[ga㝍nm }r>86c=M|v" ?27gɈ_X0UY`2}V-dϰ^LY0Ӷnd ,;d̊ÉHنK̯.=QX]%-Ѿz$ECXFxrke‚L#p'A9zΰ6B< s x 5Ox2'A* 2Db>}ðsqۻoDs Bۏ jV{[0ݻgFl(mU07ۻHs$#~wl w9roLy/%O?)\T4\XQ%xI)&#ю^1|)X0ŸK2^U"@JXsƘV֣f@pNqlpa逎PC?.7FJ c?DY 7 rn{@D5ӶE}2]:x: UpXSRn:wfwqKgeX"<nWW2-;'Vei 9,Ǘɣ%0;GG(QY޹G3'7?gO]:@<~9³})xN??;<9b@<5 _ygg`O^p-a9I)9d_yysgO_D`OYbEvG{2Ӓȁ> &;XϢt CӸ+asbFZi/ODx٩TB>eU#GuN%;t,[{ wwCEucM=s X> nrWB/P>:F׹_7L^w3[8Ļ~L=p:Ya+D׳.x(bC ˳EY\nb s| ]bFf1;M1tdNԲ?VKohMgh᫠! Zdgᇸ7Et&`/|\KG^&R4,+%#&Ux| jX̘^Q')bXrU"S.#\jxOE>_q*Aϵ>كA?mWO׮Ws8PO Q-*UƋGPϚQYGfejve$k|.1V4 .BB@\ڠYLFqk>R K-lChXL#=lxK?= ^:c0en3$sUpE S؟IOsl&w5`hS1Ee!;oA{d<'ioSd\+dM$WZ>ۀo?LBmUxunܘZ[+0[݀ԟ)!I{6S}~u\ܹnOf ~q>v=n85V4緦 ~V;!epaYI_k9,¬b4[xqv?µ}~%4&e=VZnbR˄/,AKj\8u79qz8כ{bbP4_k`TL~.jעG'0Z, ч_ &d?6CW!z/ל4x֬cx;c uB&SCvzbwisDPT[<gOB:'Ђl!9_x,X޴xj$}+K&mvtd6Y o,N'+hyl>v8 OormݴtWҒNL;`,ŞWy\t"`+xn³=+pCρ%{ϛjXZόR0'RYjgrj+Q7w_\)"ooݨ-Mq: VC8D!*0@ +B9%#pR`T,ZWrX+5>|V2/LЍynoCaP8`BBo\s_A~[Z3qoA_?0?@1aa<p̕bku +.LG]@~#.Q pc_@.v:aKBNOfY[)C߉]MMj^ 3/G8$y7ſHw25Y3ϛ51S%ùT} ˺Hϛ<%5%L x/d zTDC84e0KB͂ ) ~Ƕ$-Ѩ$_ce29XEᥴng0SIȺwDÕV3qe6xaˆ[1Bgq36VfhfYCyۣ￉`L,D~' O-,=/X=fz\H)AѢ]2je !5.qHF$<=onAX0Fjy3lz~azݬѤآ,sf)&.rrSnGYCmNJƋ|ؼG8uH:'uA^ߕ.䴖@-ˎR[i:Z|]I1)*|d)vؠA 0Ph:W 2e * $BD4B}iTLR 9lVif;A)ڕ׉,#i"ed}5Acw]e;%P;cf}Vk})+*;x6J75Īay jZ;oSjJx>F[RIp >Q׏gK?!߮]>!d?A'Yb$e:OaLuE!i 2`Clr t*`Ivn3lXEK^`}SڎyiݸPԺ^2qv,RG-^js2?gAfEbfŦ[&CAKD|Ai4dK[le]u-;D0hjIK ,-vpB@EbO+R/$^? 0ܸ7K`Fө,N#ߟgW=&<0ݝVTUُugqk._@,m1z`fRN$ cyW@%FE}ʆ}*;[CCӬ*^۶{ß UI-e}(tttf ŮwU5J?# n_ٜaxb"RádPlW6M ?sRv7kw,0/,a>q1β]7kXm ԹuPզXkf߶-r1{ qNy}}ER_ÿ av-2ok5flh5e]}=ʐąB *S&Z:*;ax lx5R!4=0+ۄ(r V mV.kV EH ,>G*Zӌ,'aTsczc{k+.bj!0]O&gu.\HSRnȪ]_.r~3{*fr<6cjZ!\j&2\+S/[. f#HAj_*ddV;ƮXw[n>Ɔ ךh " m8K "OI]pŝm7DQA؋ %Č4r3u4"%C>59i H\qaǡGò]eݰfwP,DD+<簆WRAuȌ3VHeHv& ڻ[yۅhԽreMR|S*D9IY5ҍt6h&MhS=4')kx,ؑUWj\&ŨgiJ S萏N.b5;z%z:gTQwZd#TeT:ڸzX^䩗_ZmZ0! F?GϬ'yKٕ.~-7u< *A*eP E_gt_A܀ɇ׷gAJkxOc;=z{ZVn$S"xfa/J³@1^8 TXf(ffT \Qp]Q>jMscr1m{N 2%TT~1Xi - E{`)T&e֗*f@Xj?y6,,-Zg#o QbLs~ܺ=}2Pֽfᾱ{:' Y1VN{>Qh3j'agsHP9z-f!lNs2OX!v kJNFL-tJMKJ^`"? tS]]>G|ƴ9HYUҙx\']'g:(sk˙'I|d+ɮKFuV>e]Dj#T 58fZbP!xv(ͬec'jL[]W\+m ћFUT<7.i/N]Gٗ j4ʸְze6J7teI T&T"^_p_1DuF7Ch"ڲ+h|ޚ ezW6Aw"bqO"<²3oh۹ݴ\~קqgMsӏ7R]L;F^ v "cq7OǷ+Dz+P81frd f6JI1wt!)mHvu0ukj:|ٕh_hk9^~]|Afs4F zNo=[g4UZUV "̽soo\CzokglrQ>V>&̝p\fhUbaV {5tPv'd:PyLMTSe]ZVcͧR5Ñȩ{8Lu$[*.KGڠ>-Ζ'ch$i-?h7L۶mm6mm۶mۘ>sy_͕\~RXjU4i4Qꗃv#2Hh,[ڏe^R4202hBz.}Ñ ^h M H)'m]DMo :$_~^ѬRSLw|ѽݽٰٖu,[Ƽ5rK U9 !Zm^sy.tTd-]d*[뱻mb@JYލg->]qLWT)h`L+zy<,a(kfXZ̎C9) *(bA2U!s$T1ܫ"L!<#v=ů2j'ƟUlդ7\eԊ(xeDYFDIMH&=QB&;e37ur13OlA93KOdEtq7R51+%[+ˏ-eve2M,ry&>s :s_p< z,m KQcCTK n<hJ<` bWLI dd*ATs/8s#Cdz5΃΢E2ch;E0_[O}:ZA 8v 6&uEKQ׈pHWlRk`um3NE+gܴ[wXn6\,g렝ۓUOD(N1=$/X&ڑKx!!6S#}=WI1 .G5e~7O" ii7>Nq'y2gAԓƄdi#LYvN. "F'WִJv,@wihE bH,b$2AkjK5?'U\XT-윺Uk=dZ{,0_6=KdF#Sr=}LݹP^^' TޘR"3E%tu1v%i$/YYsGl .g?ܰ\p󽨇nE¿rO5X" T'cTI솄M'aO Eb,HJb/j' 8b9~ *F< fQJAR~*9'cfLQ*'ÕTB/\nL,$BvߤxoLVXWnM̘3ZPޠJI%;T~g:xr1߫V?<5rH,(Q}Պ| Ό.'N8h1ߺ%m5UTuקN48ہ(#;S $@%)ڑ~$T aB?[*z?u_&a7hۨ6vmsxD"s4BO${;YEŒ[h&mKz ʌ}ŗ4jm@:x,{P- <{APH+( {p"=EG {7zCɕZgLyga1a$\0dY'iL܏h.ލY*ngΆ]Sh5"H#-@łgq#Qy-A NVj&Mׄjxޯ7>&c`b>¦*~G MW#G9%(^mt~!QEu:˘@:V5G;Uɏ$NR*ף561U"*EljjZxJ(vgu1EzeR 桗hd䘛=˯S%p]]'W&4\!} X`7Y0e D+m|6XxUյ7.\i\QZ. nnoDJk97^ARJ3:փ2KHD%S"eG 14Y 仺KD`‚8my/'VPl[KWb"~6 ZOl(G8AD}N^[cH 9-Qۛ>nFh/u"Iex6BЍ*C웕ٳ6X)ʫ>x-.ͧ~+kVf~v~\.Vkq8>$!:Ѝu;W7 ,:d"b3!2( 93ہ,xS!z @L s|̂!`7dzK0s4 VpsA=w.I]{~ݰv\:®_Y'(yTעo;BϞqc{u4N!`gⷺT<߆߮|]t]hMτo3!zÞYɧ)-_زӛk1~w~/E%89A`NK> K>w8C}0).hϸsDs4m(m4߳G'?|'?{}!VQ~N?}/ r^րܽAC>jұ `AYĬ竌h$˭ { . |N쵰Kl1L8ջ׏jW/ḧBTo5:a?jbB}וX~i&2x^YGGc5zګ~~ʈeX8ʋ8;x@H3t :vڰR(~$6aLeز(2[8g'pg)fφ2E je5 jM?.":b?f'uPT܍0M: ǥAP58'Ŋ|!/'ϖ&K l7kA{Opo{|ոs%2+o+a,в#~Lߣ~TP]5zzC#gJO&Oun_^uVZѴY(/ ?{pIEQE4Xhŏ~z͠i;CZ1o ɾpi\L+46G5~l 0ş%(YrjW )-kV(5 &srf;W[;b5*bE.ڍD lGmU+]0e(fmԨ+,v0,1) nfW W80Z#>1-'ϣ>rs@A1'|=p"<>_d(S"a"! o]A F}vOZAW&0߭vߌ`;v;ЍNy#z[I7ky0Āzf!\o{;P{$sʂ\d[E_ SłϹ*~?8F05qqrpp0p/NE[g%-La?HYo.%p$dI _&BCœtxPGHJ"nN&_Bd8E/ H 0ݕ|x=wu~ n>Y=ձD=M1.s)ld-i\@6g\qE?NΑv XaocZʿx}"Ldw,z-vUA q$?Њ"M` ?H ;L oS5s?M1#Qx̚ݜDZΕ:e}mfBKF oэiЩ zڸڶe\'Og1Sh 5 -NͦP&4α;{=k~~( PU I>cX#y"UW .P\`CA~.Jb?bƫYI*TMh,6"7Za* *V;D mvEUeُnj8YHS榋4 00y (J-`7Ywۚc W͠h%Sib dPOF/;{#Mg@oX[Bٻrp ɛwcmo5Qܶ|ϐVΡ1+1d.0=! $1sOizz:+}ƳA.J19t+!zODeRǏJ'β:W.gSރθ4CbBhP, 냹a%#G`AùO8j>~xZ{Edm'ٟPȠ^ޣ T>BF4gB u lmd{[%QZY>KNS7ʋ.63,,{o}Ȼ“o b&W 3%:$/WW2e@LB&C,A@Ȟ\aOŻb}r!@[# {/77\* WSև3QLsh**H׍EpG"诨,4m͸S1Vg^)ݚ,sV8n 8 TeQŴo20fcz%;HNu~-RKvfEB~M{n&O8B} ^>e5nT| kRKcÞVF ""A47`Y+1H@X@<'%QJ^տ+tSZATV&dz/d`r<%5PW18)93)~KkԚQ"`dL.,C4B̔lV 1?b~Ύ&}69Rt' \U; 787W ~T?3K>E#.%Iܖ\y)p[ <#mW b-*h]H/Ň¢Q@D2B4&㠩Udt%b:1*,Vs'W^;_Xea# )Q*  ),#ȃUuTHB ^qҹ+wP/S1>zk-p`g;qh< Y(NAxLCKBj 9 7sN6dQL6&jTZ$*crjRsgi)!Nn 33G36rpջ?Q3> H#8U$ՅЁv:ofj~q>!ce=@Rdl1%rlKƱyznvG{qYrTzI"{9$H6΂u4Ĉk!OU &k%b p,A1U6g<UC&l/ 9{Rig7E~9/8z*5c6,4BE{>V kPUbII$(5 F4v ϊlUSPTT؀쟗J8_u8oYB."||ܑr0?c-?į 0iB1xF1v.8м"@LYp|fmst;cP3.v4>8H!{\%}SY ^S^8܃]pJHNzqD">8a_o3Ipm^ oy~X"-TAսѓX뱴a \85bE,* <ׄC\baU떒z \]0h; KQIfJ,@&S!NllYfͦ=t ΥٮESJ%Mu] >,8`>ߝ'݌TtzF5h1e I+ Iul=рLs ΊK$Z>JpUb-l NG031Jû`c&em3E!:#nFn'LGwƚ1A+N_遝Yޔht}TW:z_++aLӽع4iMSn3CvT(̋ʯ3SH{J:m}4H{3}U[#0K}Mw&L'_d[:Hb5[ ,m.\[W 鯘 3-lyBnGeNl?chO贓 اY7fBq8Fm67'~r1$~+#>?s <3d~䛩qޕ}!a 4||c1;a֖3M?|:Z͎>LxZ=5?t𲀴IBoRZ3ZpFzC:Yk!05C2uҖQ\ VytU,Tw.-xЖd0ªz+^*telONp+bݜ [ #P%X:鱕T3rf$er/֫)X5x:yf z6q9{ATyiI#>Kin#ة#o{&*6 LA.Ƭ+e;1]CBy"&FFsf@ >]1{R&}~@Ě]q1VԐ"+Kc 'n5h?]mUZ 8khϰmdmsBRYT@ #&J݅Mt%s j/AAWV 80yL0%(ASEJ$_\8g<~!_[4%S?u'W<~1yUbqX$Vݷ K tK`D̞ ╙Ǐ*U-?! Ĉc˔Kʫ;YAxh,temNk8ԏHv"s 5g1Q~\ݡHkBIv00j$ڙvVѽxJ uC \j9B%>C<j̐dsw7dUNfuωF-A&I4|@u? 79|K!5W;fdinԟ09J-JH,'#> ]K 6ۍy^~_ݑ(g--o U0S\7|AY<kT ̯:lE#<~Gν5K -yB?d3(F[jY#X6wu9(֏G̼e. Nղ±g68e!D. _pG}UذLl#2ȼ1`BìGD aN/0D̈́P{~[], IJ(khsz:. xVzn;xJ&dp8Q*7`P`.qd~ H[ȹ}ƚ #f#HXCT #EAE,-Zà ͫ@!2L /`!xC즹5u*NV%(:q`34%GF O(hZ> R@R<rHP C+Lcn"4F պ k b#kJF?}E  3%,G|gt^gRus-RP2.!٪cI!NyntѶ8Ziݦyguuڋ룓Z%V <*XگYq}!wC/iM0&ĀoId* o5A:qMr׻P !Y XGc7JA<Ƌv4hC>q(]՚8FtWFhjLߺ Nɜ[b8pAPS c:w(B3Eq`3m;S.+y.aRQ2@O%^&Xek0Ԏ8Kb$n_o1ӌYruGoȿ\9&nJzzz=Yj%/ q,:D&?[J3dF[%WO~-5R^ܢZ}KQmDZ@Aޙ~'͟i%j>6N6NmB _p]}mE]?#$l6 t;;zA(0!s[5,*{ev|MЁIpųHJW)[r UjaזS^rJ~`6.O64b4fE/LO~cT\Sg}[%%ޠFW}AFrVٍUB_v\ىH+ lϥLZ|Q{Wc&#E\_Gb˯f˲D*ijlT8r)v2CQ]HLB*&o+0e.M!asbXp 2:=egxr9*Qs}L¿* "/ȷ)&:CtE@7DhIlteZ#V&sٕjBUa6޼ohz("fs"^ܷ.f9^/4?K 5Y -%j:_sfH&&%J4pЏoXIޟwG A RulS\:@Na;l&O9_8h sG~ԔAl@J߽g9B+s<Ӕu BIZ+` !aI57o66Jy6mUFV[bOMsqO{dJPx`cϑ5qe(m9(:%jɪ@%~~-DD?c׳W JPoe I1r>)x,)e,,\̖5=/'>E#tnAР>%^@wUq+P ̆'9h3}?AF0x3>m6:Yڂ2Z^&bePjcmYAZ)w"frfM(w]d\"WdxEJ 瑹ݤqsO4`,@*9S8}6*SEѫI(-dg!_2c_%%R? ƇQ-7?a!R{*)DH87H.[u@w2;}hy"@6("ֺ#\9Œӿ43|.}*ϧ7'Ϸ]c e<ޞ_~ `6M |xTr]l24yUZ|)(-l2᠛P]^P|oA9zQ/\~gYtu\.d V30??C$ %,0WJKW,YL q0 sZUs:gA=J!?P-X *rt074q[Q ÅM>՘r9qmQXz*jK[USH(( &=jBKfDWDq:3eu{vs^`"F'*]ܯ-:fFu>DӪ)pBAbc邪X$ ;)wĭҚ O| u(\챿CTJ̐L,?f-Oc&//gyArdJA fM͉e!zqםf8ȃ}uY,2q7h.$xRIa?>taUCG.6Ul;B=[{,Ze:|bԠiWq }ԋ,$R BW/IpuyWoR' °bZd$l5\QA; gOshKCشcA;K]4'ķs~ 6ӥR4`aPB,E J΁ǜ}#5=҂19hk  99 5e^d1F7i4M"30"F^p_kF_ew;Kwe\9tGCش&Y8C) ̆-th`7G0>pO_?՚Jf0  *Zܭg6% ,ժ1/X_[V~Ug9'uZ.^:ϺQgË=Fi3^tp5:!ްDquGbPMJqýv2MVFhȢC pBX6K@@eď$c^%ވ'ʔJ4\}6FoKXckVbyT7pN쓆SY<.G;sA<' Գ b.LVu/0IƼU]_q5D5Vj0F:y=_R\0qJ܅){eZ#? %w)U_TΕ.UpdO9 sYC[ 1hz^9uF2ZͻKg 'qG 4Yew*"\P@hzf餞 |=O itpXP(8+wBߚMۓNrSo&d!1FsDŽy;)+H4UW2|Hu-Nz2`Gk4j ϋȒpE➏c pxfE)~ӿx c:34ZyذΕ.D EV!vSH3Zp}rs{,E#x<#ii0iv ܪQ懭>~~1@mnhn™9 Lh^cU$9? ru+*!;p~fj,>GFJUv/ d-*J\CkA Xސԉcz2RE$k,pt8#w10@]W8'x6ô0>b0yɼ"D>";^]1^1?$PX$jlԯfe)C* ~v&E]) _ÙҔ_tUrYhx PusgNR!ixH2=AIȳzf""Gjjvf Q '^[ϊKRΣλ7bF4pUkyz7R#jnor [*Ni3"Arb$S#jzeYra9#hZMkDO8r$\^Ѽ)߶+82I7_ZO2 ௬ś4hzl/@`r";0>|hvSBSdHP<qy"{:K"R_OhBq;6q֜dfUR")J7B02o! ذ.Boq(Z?M+!!B)uBdrdIO =ժy"z/ ^Wjqx{c/F^}`uAHu{1MOYpܺa)Hmx>$%e}=9BP,mlf]yG^cS5!B x|Ea8CǶ~p1 9?H^ G0<*;~K6RPfQ SAg8ީZ,8Xraކ$Y5¼4(zf[[_vXzjLEPɓb(ZC LGkD/p9 3W"$Ḓ+D k&^:zE<|,1I76쀭ЙD8%u. v3.IN3h14W[ڪD\gcxph_oq4h,^ Dޱ0[r ( vB@K+=#]ft+iO!@D3ʡ[>Y;dG#Ur<|5"}nTYW@5&dt\G 9},65IXe׏y3b`wlXTPɗr1_+UWZ{~S"?tf*D`EH*AVAmzrf}q;&$Mq,'e$z;|M|<~ 1>ߚgo-q ;wx/<_Z ;IaKdOuۖnqn'M'-4DbK(`'+íH*X},F 2,\!Tbԡc4u&֫/5L} 1NcTD}0ނ$,-3ʩ%QP8gI%R3%֗S)S\;|@|1 .Y .oSTԜެf*E$_pԓ/j.ksggzGwZbjEnzbM} dc~`P*.D[L|lmJFaț[8WKYEYG6Ԣn MT<U'VcQ>I2{Y@knk$qhDsۥyT-gLjzD&1ϱα{W$Ûom_epfR#=S=#-5!܆9WI._mꈫ z QKMiGU\4PuJAc7Yd .U:YFPw3Ǵb/$+v6i0 Ϫ *uJ e'&JEѴm#Xps;,NN~GJ]lbb-+G?c!apq͈If9>o )c;ғBm`q_$*uD=&9@4_X<`fUo4ЅXf2<6YT>6mFD%{e9{ȋĮ^{7(͜^1þp,' r{s8 XB ̒E $ohz*-rB'J5to>SD 9D'0>z<ϨPD{7XNSS sN|~ (绦 v1vv U_Sd>֧jD( b(SG `##`:sq9\NFm@ h8[%Os]@3իL/H+D=C{͇TAp.|׊$b 4xC\u.o.Y||aj րV [;.MeY&s y%^N-3L& @#Gv& 6TfM ٟNR]QPAzn.+kC៰_7?Hϊ v2ӕZLaSlU7F&Fw{q˕hz!{ʢ~s RN*W6~?(Wۏaa"{>.q:<&Ji(RRRX<8ĭʀg~)1SeAŭmۂ K~wmi6$# l lRZS7&I/B~7لi@nƝO2- ֙&xX=;-q],,;ޥK b'1 .})ɾǞ^%;^A"//ضUJic 6 '|^׶ n*^gi%l@pT֓B.xiYrƕ'5MlUy\Jp=! =uZb;o4ɴ0̀uaEqm)bDd :S22Q|"kggZ-rOkB%'rvNKR_rix HA A ƨ,?I@IfVV U5-jIk"dhlU\˝4+T/|w:M륉|ޯx߿x]g?E& %TP̡NIbfL1~З1kGaºV 돂ѫ46PF*G/~b{R4n!CXڝ;DY,mq$/זXIIʴ8p"0ϳI'h\Jhb?J6T -v,-i?6t^F X!btNubhr zV@=_qW4f//K:e4&R»;UC3vR^j ΄A_()Z1 jZls^reS3- _Ak8ئ2Vց((Gp6kܰ>k 2  hwb ra Wu)0HZw2ޭ8$rMO~:,UԇEe@W2m3Ghrɧ`!B;l{F r״diMcO,ϕA4ô̜MuބC0iB;tq 1Mdj 6~fJS :%;#fBVy+#J3X5 txhHAi sێXyq e⫙ދjn4:u[MgQJ>رg=%M a=aCLqk qKsL MZîPzkkTs ԛ:G

z#k{BHgypG]Й,4q{&f=Gp2'~W@W/n _qQJHrIxupVi UZj^Jq .IBL &woaS}76,@fxLWjF҄ Ie:SDو+: >HO]6u+ 6Z}[9wL&Nb4nl0#NzoV+I ]ϸ4~8T8j]=_UJ&Jh, 9͚r4f5g}r3iՀtAiXœȟ=+L-I丸K0md5&^Kn*>R"߸;x 1$tH`PIkj֮Ѕ'nR"cKaʒB"c;ݜgsI; &fSC_hq qkGƼ.@q GB#5gT^I$R/ɘ"[׶dz3CͲ-wd5(/ 6& W7t=CL#ZBt4a~W⒎=Nc}\8n^*2514Twug4IɈ[A0R+?ٰlg=>>_DaM̚9igTtFcxJ0.jPMҲWHhC,~j>N-[M6%i6sn,=]%#TFњADzG %reDg=|\X[HOӳlրbZt#dW␹"f,qJqixO".{Q޹H>^h)l!G؈1g'&!=lCJ |;EL. UoAk ǟ_3#{*0,884^dCL7Ep>7AinDFS#5 ǒ{M&7X$ 4s[\X JP Ehgh<<$ S!cʲ}ݪB8,z,kZ-EkUz,:TN[uAfXڐEa3RN4-)̡ɾuHfym^7):蠬n%)$ \gF?aF iN&U=R^䠘7GB_SxE3Z#-$ȳkS,QEC:2B{mt4~uNkb:ӌL?ȢaZǰo!)tA Oɘj鷉V i,oqQ-MVK&͌7YM:+CY'fv>JUTӾѶԚrTŖS@\x Ʌ4gӶ(c8gRD| _D^?-Yԛ%Yxcxbid#Uug>!B=^'S\Ic6\ M=VzS3(*02}UxTrZ*ܮP+رe/2e-5pjְҢ[ёc+ͤ@*"Iy9.SmR)/.li.b+ա#Ơd_1Dt7N#F;CfUH!ubZ98;?=ZiM0{bpD>CK] \^ G]BfK|{~¾̕w(j9-i\_q p|saORnݡD>% Ч yKfP!jk ""!Oą^+1{g5S߸_0ʫdlԤU-DG(^UK$th] nWjPeDD*U$Ng0J~zb?fwlȷ9sʼnT*:TǸ^ g˽ǫzSM5@=A=P^ކ]/u֪ӹzΝGR{,bzuArL0]˹y݁Ƀ?Lr>Dzp_r/'攆+ !@ʁƹU><;^G~>(,sL7R3Ul  $ $p ժuM:rV20F>q0/2T2^ o};," 3kfOM^/_o؄/ Lm\1Q k6 N+q<5\ Ɨ[N+.0ש3\P $ dbU [K:V˛NUH𶚬] Y?bijU8Jhu BoA A@ ީF̯DwBQxbm[ZF}WDp! LOĩT UJUŽX^]K8l&Zf4 \MՏT#"ʞ3Dh-x'H0Kث_`V=S ̭vy~#u ֪Ͽc(Vw]2'ӭ bĆi8pty ='zƃ)/Wg/\30C?D}Pvn!m%rE-/K?9\O'܀Y%m=ʈlAc]Ee+nnMvTV6IXqDAɂ^%qўYVeJs?$D5CyA`9t|mJ\1OGom֚'H`_\(mkd`)PxuTKCo*tPJʆU!֗6hԾAm_ j(LKQiڎ7g־>99aqa+-TJ5&LVhw6@;?, IZ"'6tPM0Vӣ61>Ž']8C0ș;f td7ݔͻn  (Y8_$sll7R$^J19\Ĉj"A,QSNhجL5;hJ<1h,a( :![`2?PRr-9>v*)4PZ ]EM=Ivsq3У{0"{ԫx@OphaYMO)t82%Z>Мٜ 5sCd ?j~a )qvO>}_Q4탑HҦ`TB&p˳+MhH(ݝtQvL #y1#a2(Y䨠>OynR@2*0|a EL(B$j"+6v]6v&*UrrLi},Ƚ5 8UF,@ qñw'~QbWBv|B H箝1\ mio tm˦OK w&,^t*M~3GdZY?z:ky*}-OZ-1Ԡ("8D6Yv`äR,oy纅k_(ݯ7ȁzMSڡF^Ϗێ<; qC uKX6M}*4b,37j|+ېa:6Wa'E-#Q1#B2Pd{voq 1:UTv ^ƌiH'uJRkZaYAb8/ D5;j],HM5NmJ5fÖ2>wz:Ax?m毕0ߜ?&6fN#!pCڃ~ VdDa' OApY_f?(x9fҺuߟgZo> BiJt*HT@uXQv5`"6L}^n&[ U@C fv39gb#Ynyg,m(ICm<:`s #[oy ("A@&6j,lF-vEifUZrYwXM8L]y{<$Ԣ9ZNQ;S C"P@4T|9X/;HH(0a 2!OV?V_ !1#htN1ȰUʓ Wi~ڌ7$h \H=HHmXoB,kAx6!aMvMĊ*̚JF&0/nO;6l&+*aMB@j OZgjo2\GkpFD#OHE!Y^,&|lKAp`پ5hTcQOPjzPᤙe; A%BEx=FqO/z7W. {ңK)ex9R?r. KXU`ȲՋ.eO>k+Z%޼:?[-!P4ʹ#U?Ѣ?WzZ5.yp]6's)6a`Dz-%w֪a~ALp_o[F=#OPg w87? I S⿽0KYG Y NBBjNp\\g14^FerFZ!S~9tǶ4JNשrL6=qwaW0K$C؆AeLXyRfkjRw:s9[[!TPU"l7vHIcΞP75b #s5RttRRv& .- |t'ZЋq oJF~Cd㢻Cn^M&X'@#ɶ,=R=,^OWJ<=kO(((rRH(Mb0v1grn[ oy#hɩz*Ua@V[C5=JmYCLgݷIjYtkFPcڇ%lSM 4,һ킋lXfLDZC(u;VP";lVT ?oKI.5V$j0ܣ[mQzal(\d|-Ź+όyNl(P 0sw+UgcWQlu)'_ZT_&EB&~M$r\lAf3-ݻCK1*"q ܙI޻C| {d\}'CYX]·ow~3RgHXGK4%_Ms.3?1Y?Ĭ4!:0-WbSN.M%zm}6nI*r- ӽ:Aw5"{Sr !1̺|8j @-hJ;PQ_1*=[S*fv+wOeae6tŦkdK'!{[ﲻ&`'r;Nس>;4GD>[ƕ({ vY[o{'mՈw!Ome+yWR@vo r|}bx=Zn} VsCt9,8Lp\ZӮ3FhGݸ?``@*(pQsCV'ZZ&PZsR?aɃzH|"'lp bVq6yr/4E4yΫ?"d1'hE[Dcr_WI&X8}3L[Tmpmny_/~SkWT eoF4%6sxszW9#1$n'f6jS<{n ],k=T  h>ImJNNFdlP;!!! obHc7 e.G**d֜$Ub5QVo!q]6=ͦg=r\};WC ܽ/u#Xga\q)UuX#w tUR*Smt[guhҪ/OyNu \UL躨4da!aP&7+pf⁄@;;FM ŞL浖?eFVO/{'O;4 <ۋI[KI8y f.Kxs!uSp9'Kaʗ @ #)ÜuY!a?oLCTG gj[" h {6)R1 9xBɒD6QHăM$R9!B l2 䪍ӋKiD)D~Ryk3'l A6'_:xsh._ۥeCYN 4wL("Fk]S 7?KBVm&814bfnN43S~}iùXޑAþKQ/?=P ciq(o]ɥ4\7툜-o-izd415hcMc %]o?Vb?4ycWH3Vz2HozjGאw[=Mw49:ђB+7ΒtKiϙњi?= `e8 p@G3?;V^;ЏGnkz{LɅhTw6} m~<uD4FAF[\4Ms3Wz,nj%wY|'f@oBnn06v0qtTru0 ы5ժZ~.[h{ f%h=/Λ#;uusP㜅EEq)vy>8y@y$2WXh*:^̉ZȉWIvnǦjW\άe[~]:E|CT t:Vg.FSi40lfm qǗKΛQ+lL \/jh|yP6}]h]+yJ?x$jSҺY>dKM!!ўIZrV-}׫ª1%KZuk*#eј9{:IϰɡxjkE<ʬ*5f*@&~bMO(k7XKlLTYe)B=\8!d. N%RbI k]25 bkvy-kGgShvqH.Ҵy.ab-f>Rd1Dc$b1ôb H,dLA%}JZ92QNx7WTo| J[W-ˀE Enλb/U˥m@kN3"ŎCc@jfp.< ,eSdʖ+X6% Z@%V"Hd31avUU*Y+Obye}Gy Mn$M?hz6/ڜFN'pK(0?0\!@z>yw_4ݮ\Bn'<>S<Դeq)q Eyf6Gn&s$'vehVGRj Z i[ in3\eJb.1ޟvHԵg):̉LNPxP+UXqcs ziSzXYMə'3W )X[W2EzMcT]Aϛm;#>h)WHڭlJum[|'"4)SIjhMR >moB\ԩ\2j]4A_>~֫4s83{k~8@_YǿJƄML ))K)ᨠ|]qbAHMp QK5=1£XRI^3ޣVL-WliX`9,s9ﺯ]HEtmRrxaV5G f1IGj_XD@fэd@q:M&i3iRZ 4@MiY-]@{^qZ`g~`Zdd!b"Q|g8fkQG|9YA׉gAվFMWDt+C+d^ 3P=ηCnLyM{]Lͬ5q{`w@:Mi$`-QaF 3~"%y?x rAm^5\'} =&Bj^+<"zi[rRvͫW:{nհ@{ޙԎD½')dyB C -2B_XMYo.$ǩKH5HRpVC?mkhٶmUl۶m۶m۶mZeos:t߸;΍xdfsx9~kwEmKe!~/vǥDKvv74;cC7 '4Kj0*$3>fllOCea7TH/tmS5&Ҁ8Q{:*FsT7LIK CеjPsTP(.@H; [YpYr۷Tې9@QS,& D+ݍu[ C#A C8۸tTe#Q.3T.2"AtX E-c0j[R c*r83H Τ9@hD"S< {Dҟ+eL,o%(?)ְ'AC҉T4F [FݍS7Y~^T7C&0Tpö0**}U։u1T,JBUn&cO@.B_t!$,.Vؼݴ\Yo7;ο@9 H\O`didď2h\X%Of~O$: pC:ԓ/ NK+>OpPc|<n<~ރxP05WyfI<Ǽ9 \/Lr#Q yo6 )k&9IՉ2ڜLpTڌFПr`vHAv6p Vѷ({aNs+)}Q`ߢ?*{(5-VAAZ;WͤU=ZI NzKZ^X+8,-Q{$9NQ5o{b]\S<>!tR눉A16~/U$ e*:JGQ3~ht]gBNfE ;@ #kPSPkS#k~)#FeAᚴaaI-[ukL+;f9GQ#|"6d@BÇm ahlO*5q[+т'{;wq3)ފZtHM|w=X܄*Ś=큕 QL wmU;"R\;]Cv)*pd:ͣb'[ aO/wr(&9*A=\ Ӣ,SyV$Ԋ=rL!(}ǖҟAn{X+#.XbB׽BVdNԎ"_ HU`9)BbyeB0IA)7I$M!.^8Zq")׋Űf{}||{a!ŽrTC"*/3͎? E@OKqb UXJk2Q mO'ZβИr/8&seYZ]x8O7԰v5`#lȼM.(5oJL$$N٭L~ KCbsjޜݲo? .ZJn@ؔ /oԱxE^s"N(G'- 6sqh8"]_Q&66_|g WfN?؁iyп T6J>?!|kjV,̊k0k$zYgUqYV0|J3QDSVr7URD` ݙ%c0=AƮJIIxLiCPP3C*d5HVƉpVQϦV\Иg$' ղt4Ƹd=p l*+ߚ4I ͆4SLX5LBXT:mgW1 #(iV#8jvD"3ꪉ. .)'Vܪ+ÙY:AV!mSCBX_C~jat}| * W5vKRa0f s-b#* w Օp'P { g:x³ aMצZK^Xxs~ k!op*p'_ r`GCP슁FFɪ&V5vbXsp@lt ;ٛ6YR5>%TGF weCo7["ڕ1/L}j*!?Gڳ፨Axeeߗ':% <ЫCr7,c֗Ox5ҥ|  l2>|އVR/*s4Ub-seC6h-WQKv3L/hjf8¸g܀]:tKd!ou(U * CtB B hmwXD/DA&}_myp2qi OPDIrrјKZviar=YX?ǰ1&L /131LM&Ha&cp`dEmVVj ڐzͪ1kA0>!b:;(jT/PkӭanlwlO;d%\h~]-rirM7=0j"eb m"5PQƿl 8e6`!LHr *mW"_8Zjse˲tap>&މ $(mP_;)HZ7u*+Z_\e4B$qa/7DsJe^#D156Dž"ۜC[֌A.GtRV }Ry'9DCԤjaWsSڹ%Vs^$* xT>.RvA\0Ò$ $˯'VXz91z?FN72:=5XS&Kjat]tti$tGHrT;00U-C[L65:KMrU0Jto]sDt.5[Xs$Q /-1t /^#6c(rg11  e_/d7dȑTJɝOJ$pX#boʢj)SU.𜩛]C#Y\9%_1y; }DU Qs7|^kǩYpUc3-Pd]3N,-ׂ(|- \4;,9RW$o\Ӹ+''$':n^(ۙa<+6^aCQiC[̎l9 ?# 3J Y~4"<>E!@ , Q4 5C7@e?~rªˮ2kA)e5䬎;DEdv4 OE{&!Y*j3-wȡLyX(l<ŪLqJh d&^|[u'R7!f4'YBn M;Qzش&q4?%EW?4T 0)ҳY ׋JAg5V$Dk~Wē1o+M V55ޢ;,9CV) Gov寄M#9륷-"J:\oBơ;!]qB^QU]䓦9y0vd8ĥ  J.[O$h2:},^8Z 7{D$%J'AKG"-Sk/nB]"c⒂TD)hQ >8g0jCvbY28y9E$tRʒPIcWX:azU6Z@`{0~j mFQI#0iuhP Hҡ"")oW3m-܆QjH \B)40!q鸆HιØjB>>xV q78koVt+s&@'9G]$IjyrI>BtO""l~mR?^?c;Z:_@{LvfH r1 @JD')2 Fk0\EXD[SVY%MJ5Jsmuun7xZ5n5/Y>W<穧,ahLz7 p.lT`̀:e Ki~TE$J6::T@:fr ܨ@*#F赴NyUL)vK*vNf 6sw0*G6I-@=g]o :*SJ|"? E^DN}HBUdj'qe7"dObyuH]DTcFSMՂb|c`m ǟJD,G{2d ֤E۫Qfӌ~!ܥm6Zk%J"QX۴| H! 'cFZ ]`آ $ʒd}뚞u$Hg ձB@JUat֑H}#kGLIL>FsQ18m=,~SO=ޠ%Soo!|\"w4*rEU Sy ⋖RQ%|5-..$R:iF$xL], ɟ$j<sT=˛!mRNA|˴Nv2cQ30tO2LP~fqng0bz({MQe\19J q v)Ò{8(B59">JK&19eNU4|Xg2%P0u ŝ( 3"$`XXЊ|\JYsN1U[ˢB t:srgJVVU |FqຠzI4lɆrLՁ{. TpՑK#ʦI*ۢا?:r(Ydg˜s@&mnNeg<) ܕI*ے7OLY ]\xʚnZJW?銑]wJr(5:ncmUb_Ӈ)<:> xR@H ˺[Иٻ',jqwU l1 h->*j \Ze86<5 }R~WLa :؋j'dQ})T8 XֽFfo&|% Sij$ԶJַ!=T)aHQPJtF]ֆE1QwsJe}͌&TR*Tefا0 $7@Ud6Ks'X6 ÁW^m<9ςc+hp/y]REpW#YҭMviOh2Mo{~,8?K ޕWE]hIހj)SVӛJlbP)zR]M%". N>2Yע'0 ]+RphtdQ-3&5s0F];]-I,X&+.IF&S\EaY֔ j +h| 2F41.0 JuDJ:!VOm}L ])X.-`a3֞Q8B0 kUF f \ZtOo/Kgoȍ8#o[GG,y"RޘHEGɊk䵻i@.%|JjcΠ"-,#Ty 27]7U3Z7Wʋ$%9g\io4@Sorok:4N3:ŢSW dKTudL)0`zlAW|Q_ꧨ];1OhS#P=ʹ"@5*(r/QJ#u"keQvkӧ麀an!'5,@fBniJ95g@}Ft*tFa@4Р˱41ׯ驃7\%ȳg}h݆=]&JWBIF$.MՃ:6Q C /A;]OQہ;SjO ܔ@ #RL|B*Դ1©'c3֏X-;ŧh#LxS;ր29a$2^5lTg/ +Fm0Pۊi!Yxo#}!^ 2Þb{?Kѩ_RpՎr$aVh'x]i0 E:49<ކ:-mfl&YEm/z>٦ 7R ɛ-@.6'B&g p臟-ߔt)7=YE>$N`_-O, S;h#ZGuꯢVDvo+ulj5}v_޵?4>xaJT{4Byum9t9YmeTnoG/-9-.D>sYHJITEq ER=]i[1 zZ]L9F<=_1^d%Hol#dRܠ:5iL}S.E7ߵ;-̀2wEKӅ%m3?[unmL2]oklj3.\j.9oEMYS|8םa#{W!0 x<vDL|Rx)_*qzhWǸrȖ"L2->P2bK \QLo]P1 6%f=EOĎe6}'kܺՃ!I-q]LxH<Sj1`1_igAg2/"bP8 ]y4򊴭aT3U6kY'eNp.bj~ dq]<;#8#{;3z;w7WpF7Iye_KFt/\ ]IԾX`0qp|ME dW-((8/yA!-+>8h;!1{wZg2k0.URE(M;v1e'W@2X[;EaE -3ZDyh#] `Z5׏k#\3[<|M+].#:nsWS(v >cs3[%6:{wboqr5ha<5q;ak{UN5y'EߋZN;w% F /,%&]Rƫ89Pn(@O`Kh"ȶ y_q&C7*] +YٮOl]>8PZd($KSJ Wk\i+R ^j<Ē*5`a^٩o;[| |ظԸqa1!Xܔz|1% }!3 p/Gb't #6L|^Zgox)jʃ՜P"Tx; ~§VM'FXby9QICέa\34V!o+6G=|>x;Bi>3+FiI"IЇ}(1 Z61D;Ѵ)d& |YDeAW݆μA)YA#/6Z4L VYzVГ8~5[D~gܬ; 4W{X(AVaimL/w/j.Ńƅ'PzU˂xx*0Gx kK@"~ gvr[E ZЦ>h_exh|jpK?US[|Ց1`Ffh'?;OmA04ˊR\RwZ$GAZi6S_˩t) d qIgbd+g6/w$},lN7J-Q!SmZԞ<\Oײܝ Ze.GECT !Js޹s}Ǿ)򑗇ZAݝb2a=RE9=A+&+v[}|MBٙ[s}O{<@?w{z/ [  {8a&I ;,6l搐nɗP-v,BNDQlBDH.?gzj)OV.`teaΰęhYk:Y&Y:[rW h@0%c"53lj8xNʣ=LFkSLu/2.%6a!{E0tp:g4{{?ʛ?қ?K3׭Oh {q 7kp)#z,SrjբC3(Y[0XH!>Ke,;^L r$OcA4JАy?^Ƹ^pu"NLBӚ62RE=̵ބS!FClH2d!B6@)/s}br񷦻}28 :4"³*(,0/5-մbvolOWvWN'qI[Uj8ʚG h=%bWtGPAU!^EVu3@J.Cl?f0ҾND y"AEETER\6#_ZQR9ֆy E, 8[E3>q|l^SMz |eC =.MҎ-kןN}.s2 tz)_Jz2Ӓ |CyLkYVt|E}r:3h;JJŽ+,,եTH v'@Q#aTƫ } I:tY[e ':D)) 2,e: (UfV,Ng4#axy"6fY+ukiakn-IzyqŃ$aŒԃw?Vʪ :# waEJ@Ό=t A4+Ӡ07[@zz9 {rj)BR[[<,[Vfesa{f#K?+U>}7M6iET^Y]>_ PrNQtC?EGkWN it0:2^orˁҖ}[߮9ik6 515)ހ}rCc5I__:|~#Z{^8IzzB,xJ*b N8 zgYA-)@nd@/ WH_s_` \)iůgyp:t) Zd d2F= +~]g`[ ] H "!V,Gj#OdcOemW ܇.ɻWIgvÔ5_8ywOg; w9eCZaz2\?_ Z hwg㉸5~qFD?zMbDÊ$&p9վ|A@ig$1&7vI}'S$^h|&.XTUYL̅>Gr=:\jF'ϐn+<^"wV/JN5gQj׮ue6PW~w֨!VvJ\{$z ?"1'271ǴlPBVkʗ+W4P LZw5e щ"zR#u0 Ke`H21z RaFaLf~WY3rh"nbvŀ0W@6GpDX{,+>EOwlW6V:!@!Tz<4a-;lt ?qT^V;A|K?,1p*ls鉗>,ҙ0GjRkx =R%j fW}elr XK="yywctzBnZk%fNXixo]zߗӏ:cC8RyL?8G_ucU;Acz+#Vh蝣I9S R6}Kiض KըkMm^&Vw62"_&#3"?0;fTF3_pV#߀x_¹E[ys yFɨMqD+G}?Mo??EgGF:lckּٖ .[bg!ȠHdU<~C2t1A>Hm65Uds{\"`48ѩԨbVS$/qTNy\,ٝsFFTQ:*~⸚ ^"5*ccI bNxƙJLA;{`;G ܉JIXܚ+w\`vF 5'^_Cu-m$E@UI|%^#Z۬;R\n *9`pY:zwiԞvٟ֮ MY S4mV#N_ k#)m}8| $0O\(0shbERzʮxIQ:ܩ~aO1qۍ]iMKLJb0(_mH۫[=-lG[N̷#væsuZ~f05ewk}%}L1RHkd\Pԕ`gnkDbFJ$3T7湜EO=rs/ljg¨^WdoِfֈV9j6 `RP_Jtp?Tx'" U:̞ԛzQed='[9{Ea彔hZ%҃OU[whʕSe3fiGۭcH{ÌQ5$6W0MJ-#p縮]jMWq]ȚS'c[}NٺcDy6d̓4)JMWh _2ן_z%4nexىD]]bÏNNOBq{+kiG5*#M5+{l5nW. ɢLrr嘫#}V#M XE<~y$ag?P` P~7׵F"܇.+Q9^)4lj@Dch۱lf Gb$5{d[|NC([/XJs{e8 טb;'-ͰqpjDb@CX*UqCkUZ"T|hCqz!pQP.\VNkT֌eg*{ٌUw7z ['D([*c:.I鰚h\zVjVf.{8Hs3 7?,<eƹrf垉1!fՑsk>㥰 GxhOν`brDCzW\BwCVnLukoY$vaHR.}*ڎ 2ƽgn0 BgpIq n4躕ȯ$[}Sg=NfLrE#ݜoBYi0nVt~G.큌.Hym"{vf;Qƒ$@5L09 1=~5O+jIuE[4(>Jzknzגgs/FG,8!,Ʋ~z3>"p]ͦ_ 2Kd*X䉋.偪 Zܺ v*^H3V,&j$JV0+!Nt fQ c_biDxBw F!E_@e(b`WNK+MH#oS }DCh9BKAc 0OKA8_T+n3 4z8Iu#w(@cXĹe[E t) SMb47FÄ:_-Oϱ"/I$I$^2d}U86*&h F. 2^'B_ʷ+t9C !i)pHqVtF23[ۼ3OP^`TSצhg[ẑfD'mA]Bz=Z)x:7Or Bi? 5TN`")ʒsn+DUcTtJg&wkХW%Jn4k:Sv: ğ0,_,LuhJ= (]  SQ|@[*Tz;:[ND6:uhbKʜ88q"fw4SwxGe41PW֣칾S}^t?N߀1t~AEԾ2P{aT4b(]&U7on7'Ąk~YY\};1[>&.Yeo=EaΟ71Qޚooи[:M>]ӝ<U 507 /{sh`E0`8.yV@se_ R@-ٶ^]5z\1B{d4|u!M~Ua0ճ[F3k⳿兞uA#hV8s^v.<Ʒu̺ty|ǒBt2۶yquymfn$ed4QGC* tORp%&5t5̴G RCE#$TG5"$ tLȖu[|^ڄGMO/R9X\6]`b8x:pF RjgvE|b1*r(.GaX~FԤL-Nψ_7Q#A* Ϧ1./Օ҆Cn+F4 N'6Jn}y KF.^#nA @sG=hkKb(ШDL6Ĩ FEUhz\5eJ0D[xqm$S+" ;{AvL6dnܻlևEL3 }X$0#H V%a$k9!è7V!Mo #T=DTQHSog/ J=~^v*DSҊv/}(rxg/v2Jxz]qGas*=o`r*76 =׈5fW[qIYy%k"sչs^vv<Z^S@:vK?&aDCBgdafkh(5+AC73C?x3zIL!/}_aqǓ8 pfh o1yHZ"C aX+pϳl lO~JU$ (T=l̊z-I9YEHتac0Bek]_C;@q,~*ΔPV3֏/tQo5M ϗ{֪[]% H9wV\~n)3~]#|TaNMsazK"ηJ53+CN#sQ%G!& *(9 f@33Lɠ~e8f2XGp~ٳZ5|V?9=fcGu+t)ײ |\3rNt*26)XNQ4X e0}q+d!@}S 7u.%ʹe Q7$Gh0!x L̝mel`>Qyj Ɓ]wQt`8T+4~Nh^qҴ2$Ma A*W*çg(xTUkoBRo1yUQOn4_G:/W_+'mgo''‡Y;̠'8%E(;P@F퐾\N2Ӈ]Rn)ko؏z-Zp1kۙ>C+b4bK]-UlI)E-lWE[w-wy8d3&h8TfCvZ&,S*va"p  {_~Wk%#km{/(/7?+,jR!ڝ+k p`|LL?F(ʌՉ/ V 3IP{WG`j-)T^E^6]^4Lo,A6Dey\>Eg;{V;SBLqj=_5F[e ($ QN*tENTi;Q|B3qN@8[95ڨ95҃0 *Q\ "!U@+W]GT]>33޺#Re,ZWP?UהA_T#U@M+N年NՐl)S Du"y~yzE*; 1= L:G9)3UِtT^:%;݅F˽홼%GPJ%D譹^m(ïҟD>l͜0_UHՖ*biY"K%u-,8*z}.-3/᠗ZXdZ^2w,xh]T?M".[\kB=j1Ύ^bhwq2_?Gt]~z d$C31 ?}, B .rByLNAQ43~r{)2bRdtḵ,#|@A@`}8lf>IĵψbY靹c~7㦳'-v1&N#*m9-t=S%?77L.yIbogS:T2Nϗ&OV pǼS5v49ד7$<LԅF*2j)҆t\y$SmxELK<33E;5Uo3)^TiԬ-\R%8QIr63_8MU {W-w$&?! $3CtKPCU@c2ȍ oRPǔTQY{z%RVNhqԏ 6Ͻi*'!Z5+Oh4ŦzzOCGxP+ ͤ0\\ l8]>/Q8+WC~LO;+IMjh_Z\r k,j C34@ZbA"Jr| h3vץw6"x[ sQܞj.3em ) f4dW NBE yN9W=}pLك"98p_om,:2 Sv)V/1bfExM >"W1Gkv+|YX5 oEkuBX,XM,JlG8Mո+qzn7AṽjmJZ8Ӂpr 1< ][m#*O3t[EeCA!SdG%ک7͆J[:z-5y쨧)U檔eĚAIsd#\ E}R)} 9$XX}i PY 6(u7ʖZZ #AMW@Dks]yߪE#P8ltZ*J&vyFX<,SY;|ec~PͤNj0 F*"aV |o_sZn0.gul{-1m*vg6CߙvlD[вo ON׵*NR7wO1 }!+] _b(i"-:#e!d ijzK2PGeꪢzdFRD⥜ )XzQ({'ۂf[}nu` B_<ֻ 7`û פ0<J\( &M(3≓w34Wmc'le̙FN;˗@o,&o,Ƿ3GT\8xvo:i|\ɣ޺ӃT=h\e?l~u.q: 'یSA`ښnP 䭱Fl˱]CJ>P\Uyp!FXW:8CpBE}Axނ}sq;lߺpGpvXq3,A_ΖoЧDx}z >NH)φ޸ VdXR ޼] kciƴK و(K"ůI3e{e4?D iF7Ctcbk)r'[ F[Qg'=*E~ssBKT%PW'-eG8w1`GTpQ=Cvu h#e}n cp:s S}+}9{8ێ4kQ(ZJ.jTqS)kds؞Zhț۴6^dP? OVni?~.3x6J^_,O{z qD%9ydob8a!%a퓝ܿ)d:QifS.C0JWywAuƘ]!t*< M/[7\#S$[\`Mȝŋ i^\#>ě:b8Xϥ؂OcF,K'2Md*pF\Pיå녱Lcɱaf-"m !*ٛiBF[S,^eZ]-*4\3gO՜?Χa~a תabj1UBE>&"2bΦ%oMZKۚN5}O`~>m O&!:R{U8 5MbQ=4O@lPM cȏěZ+;s/_mtF.$Ecaػ?_i< 07Wnڟ11M _w:3Xh s-sR7/#YXQN`YmBiNӴ% /@/$TfAC@ɲ,f"|3 ~ˏyK6KDP^/^bf>7Ƚ\CݻRͻzYp4T^hxu]tW{!0-lSc Lemĩ+gH3T>xѬiŃtIF]]dD$$% VW6=,lo'4L\beLn"i|(\h%-P(|JQh S܈Khk9Lԏ{M{6I+F!#SD]n}("-Ơ 22]ݼwf-8F˯} fT#^ث6B4n9`r}HR_`o[dPBHܤtgjԭarW4PwC"#&`X 7PV/-JiƉx|TAl.eޜFGy ݑ'sԝiZ߀ZN.sy`g2D,b?2 ]3<_-;QxoD.9s5"oJbG5 ?X%x޿uwL.:JM?jIxi=(,3B3;K[(=1#ry.lXNCtSQ!=d(%)EHKX8W嶲}֜67!2!(ǥ;FSuO`/+Jr&/BA@(P=rҍ,:e+E9:qyׁŚ+ Y7HJLM4x5T}f@( YdFJC bs\1*:Zf#1x]W uhSYw/BsM aV[l J,yr'zD!wn5K۱7`('Qikbs0iSaTEƬSLq+6'b0_2mmw@Pg,%`]Kp!`][D\W]M4?*ZfȆHS(ur̺b$mȓ K.5_q >NC..zaSwQ+EɎi)q$-:DxI u:6<J]b(Wz_QLM(쀜p }VNcu M (zGT/(if8,ef$A6OJ ]`4(L7M%cEe/+ےzULRl7mDc`S}Q`U' 0"҈ &+-Nw u5=J8@ 7\qwoQAx}{,C_]o1lc2H}g“` #eˆvsU}'Һh /~ktYж6ҎXCZuN]1;'KO"4'z$QMd 4urgWZ#?}_:hTVQmj@z}W;C?Odɝ# 9֔Մ5 ?BrܾFAbx=XjnsH_ʘo睚T[I..^VE:nB-cU6-k-׌(Sr8]@}CuK{Gb|`L'_VknZNC%QeVd/i2<&+ غZ늸u'&\Ȭ Gܸ !,2#eE/NV@Kx%M]Jk>.'ZZw̭nj:ޛ?̅;JE@f NyjOL&O:N!)O ?(.VW3^ cNl0UǓ"mkAY97zPSv_\MilQ+D}zEay#.|KE!gh$eLe_cCet 0"b@B=nԎ9a7x<[1=<'NYYS@-fX"b-E3×Gb}qE%hkJ=6q޴%lS۔\ E7 J?/ܾ'!eIǢеuY&Sf۳do1̕G"<Z.^h W`\1wjwo|@LJ@:DXc8hcؑ<a :(DQ8E ~rU [WRXD[pu~YpӖ9hWVrN[~齏@Gݍ@k}_^wtaV"bf?\pHTY>Aj$g];Y=VZJmERoF;u]?RTx%O(o1sʛ,o(5EOj)##XگE=oVǼ̀sJ k<9YHfll&/ˍQl6Aߖ ~v2TCEY"_X][ɺ]w:23ȅ5Pd:P ȼ07ruNs<^kt4<͕ywQk* wT~n^ڊ@ho5+M\22\@t}|Mc  gL_7=i?íjgC'OOA(IL_`[TƮj#[T&16xԞ:{lރyL$߄+T[kqF~'_+/tMOW}>=B00 gz{hv\ɫkZW/;Ȥ㲢]yџ?J+ Fo%.h0iJC߇z:.wڑqۿ~2j,'Ɉy6\﵉s_%/*L׾VDmn\4("Ũ룢6/Oȃ)YEYpC/LzPusWp*:oyeKϗƨ_˼=<|[eO.xV t0]5!d[QGťW)vd!֢f}=uaxu暯Ÿ:V 6_og7|?y.ctl,=iV{JI1e笑f~OhS{;GU;"ƛWVCvD^;~ yn58+]+-Q4Қ5&'w$*<^C~7lstOh•GFcwfdYpJ^;LD}jyBh7ծTW8#iԲwOPWs#R.$c$^,T iWJmW6 Iޕ,FK٠K\|Z=̫e^- 4CʥmEqCWVOϽF$.0`NT!qb`e>^X6j-~E͟4?7+^QedVI)Vԁc5Q]o"׮g2\'?_hX+moeRቼͧ-|jN=C3l?[^vϾ(axȱɚzH~m-jj.FPض#gJ%V?[msP)K{Hx[gƴPT"'^q܏ew .t)>9^휈ׂ ˞LؠhEt4gTQ!;monHȿVcPL 7ICD?d*—}+qЄ׏Ԇ"OX4t+ϣROcs@#"5K!mU|mƨ4QCwA | YEAŦ>^Z&7>x=&u:ϧU%KGR h":Y5|,l&kbWT'8f(xr )d_QLj.b8MpM8ƼTk9?|&N}A&%+ex[F<|G4{07_~=bJIm fƳDqU^@Ms[j~L%wz UȞ(SӁf^ }Ҽtޱ[e -\C#U# =,6O}X>WW ґjdF-Be,W0tI+{>_>P#QgVvOz-B|Z ]tO -!&UQ SWUq 1Xf-=A{f%MZ^9è)J_\BN\4!;q/9(]&S'V5,|=ZX^ &>TґL#6u-(=ڀ!Ύ. W~:ZV rVYNB:=LX$K54YE x[^O56}L݀v-1Czi |pkpqfL%mU_{t.1Y"o} ~DzM8iQ)" \w#gLɕĄϊ_] }TIK$"^>d+T6ƀ#97'7D sh[#]Jv?0"BUaiGi<,S5=zCPGPfTLTLtri} ɵw!E H.iIR$2ѳ-K7fO{2U?qf qJr;ruH'+7 b O~Q|sګtFw( t;$;:5k#ʸpM^mRA.4Q>\lh-NqQ f79WO Υ5ig`wE~t)7/!lp1'i/kmZN\{QMc9P3?M1xd($o۬t.3m%yt)U즰;;AiAѠܱy##+6*'F@CHdܣ6/&8Q=\p(.5q $"Ts 9(줐-~0Ej4vfi#\IٸhA$e˜FZ^E-/yjSF\akXXLxd<4(<KeQVM8Se c6Tue͛tō,__ & "N#ki;'!oD$|>jC9#Y.Ͱ6JfSAd:)2 :wݬjҜm_.,>}j0gϬ <ϙk#N}2Wv5Qݐ{kߟ#WN:WΩ֯Ѽ#VZyZEH JΥ ,\S?P[<%Z6du!Yuku{)LY9I m.Sk*](X'݃$xKfi!(6L{Y3ԬFoRn܎6ztIgy"ϧ=c1#$ xE_F.نe6#CL_׶\S'C=UX|]=m黽*&*⭈7 /5V݅ /qloWT'TʊU*f&sǚ"mhhhcVTW *!16ZYM1E{˜Qڦ^~˽Pm"ȗ"06ʏfD5hlX3e$kK ޱ~Ւ3_W4"M_:Q~pNKSG/CtI%zw+sqs4BxM,b(Ztv>`Q/[wEɺ]W 2ANFtmrLN8xTOf&` SƾN`%'Vm[4kŻL8+쎃7+ _E ojvpOU4pbNT5ɷQ '}wZ;h nG ڊYZ!. T"7hgjw5D]fmizBaAo2r0T_qovjlÞ]A0ي+Nʎpz+3,u}ʖ7H}9MlNdoLh'Ⱦ |T+O XSU'$dD a׉tݤS:]H0w ŋB[>YӘݣ+2"we*ͅj@(ig;\5[vv{k*ECIհYJsA$LvG\ѪzLr Ť=qVBO/V*P uy&JOfk64͛/ eh4,~h4g(nI&6g?IH'HЖh/7!M4FdH ?N`=IU̢O3,Pf$gVٝMږwߺ-pz7-WUdsd[)&.TW6g %f̵h?/-tnτ#[jySXbgiUY2XV?\;O*_߽5V7Y+qP'Y1v2wz]#}6NC|`V&SF,OG>;vu)HJqqo=1ӛGp BU,tkaKB;wvEhhdhiIk[þp#{6iy۩>'[/ŭ_J 悸 iYL! a&T601PA$O]!֋Hߋ ؊%ObҜfɽ,2)\"3~?nQO-)Q/t(;)nfQo[ +}qq(bp0Oi+RPwE䢻0ơZ~!kxHJ﬜59i8pm^ ~ߠ܇nbW=Mƭi+w$:EX6A]-&TW Qz5 >&Aaހ_n^c} 8Ro񆔌j ic~?\xIOjm:bfBE.&0)dI\;GNBƸ?/UTS)&2(Rԩ}n^D4J3׻B Bg~=?/GXΩ;|,1s)~|F¥t {*>\wJ_*^4 V|d4.]4^(0^*wYx_}Ջ\6.L"_0x1@P=R҅-C=8۟=IYS;|q'AԥG_.ǕſGE=uVGn@2/siof|ëd5PpV&!T$ʗ %29>םdV{S y6G5Ư}@3k;X^5ihVc\nzN9aesk\jm@G|sO Dx2~L}eQ:On#b{]v.<k=эZ4搦+F!ybsergӼ̭\Uv/ߢZB W.c2-{^hO~v˕ɘW: E.Yl ʹ(Zn'Bi8)٣#(|-m+69R s cycr)PP=uI/*+N|zc |^ip{wp毫Y: rA+s p+|bx ~/ԺoHizq~ä%ݗ%td sP ^< =0`"xQ~FwKM@?U䩔͌VP6y]Xx39DbRӜ;Uz2NLT7 Jdžx +,Ȏj)LvR=H{Ge'oA\d!UwuO4Ee5n,Ē3,ʸ3S5F9( Ѻ׈8*oؼgOB&Or3fVַYKuګu =a5uY8hY>Xmn Ef4QΥ"OY3V>8hlգՒ#}ِy~?KhU{1*diAlDZẗ́T!!4Hh0+te [dF7*W:ccbq{jB_Tl_J]E $D(0lח}e5YA!sJozs%ar={W;kX6A-˃~촺,~ƫTkND\BO50ĶD/f[hZ-l=ȑ[Ve鎋S4.I!1BEvç ベ7~|f5b!VA|捉&˒$TftToʳ_k@YJew@ATF^IŰY_QU^{/2(SMxazZwyMG*߰ O|BC :Rt"DIT^N&c{u6,jSXĠ3Hk~z!:Ir^EMLsr~=*yP<߆09JQ@u4_ZNZq_]Q@]4'6s Qٯ=V&l4A8ld7dvf~"`*g⭹vaw_cKc*cF6d$gT*R?hsY g3 ?ݧ&Y$j|}+c{8bwDo֛\Qp!|RJo!3]V UzÔ)CHBiCrqfqM[~` am@D$E!0}ud?ruBZn}lZTWP0G;pC≪ruͷ?_ԍK dzwʘlo䣌VBIBH9&$i)L{lEnMmͺJNz5~of' -}-#O0Wi(m#,6ePcGyR6=!xrYOC8g10\鰞*(Ac+Ip#]}d{)Dwq4Ϧգd=85vWc #m6DeJy&;xTte}T`{+I;X@u1YJ)/WÌZrdu#bnK^h蜗7/ihTg{BS C^?H fn7=^#[o=VV;VߣX 0s[e*˶S {73C[y:/FU&(Qs +\- V Eh?nP=dAr !iǕ3y$YZ$%̀Џ˸nw4;Tmb`^R[(ib ;׻LM;'eHW,BwPk։_csfgUr?ק гİM]3qUsm7H[Ovm{jyzՊ 2WQlv+ !Ct =GՏ  %餳/0ڤrr8n8ҋsL\LḁoDQt7g{qJc 2l%9OL$mb`=x"%lRϰe;竡@NS%ѤJCfQ_9n XQk PZHPiڤٱPZkl%ocoQ]!vH*s"۞t݋b+9 xe ?;5XWIGxvnܕw-X&0E9RӀ]hYڱ5XeΈ17v^D)Iѿjf,Ǩ NLgw/H>8c&d;d\SDt$K;-]Ik_# EޠR`i-P5,YDJ|*I<ǚ}vh޶I3IUQ)$)}p=Ȁ |2CߞY]mԾxɮpv6"$ě@O nHdNTlIU@l]YtռP=0Mu5%_RCqCQ=vFa+#ǍDd:)/@I/lO&hA+H?_-t],丄_-)r)蒼nh/2a>͍԰!y=_)]!~\EvѣHC~U^Ŕ! UW=z{]ϯ5E1{ϧ432=P4Q&6[s8;z:5~y˼>W(h"I\o qE+v ftRL[~GlW`,eN8˼Ջq+>t SyOm(Z6mн*k66K]nS_Wm >D7L`FPo(A{u6vߗ9ٔ C=Y[D&%86sdbexu6(6ZLAb>llK^# NATȘ4Y7~Ul_.FZˀ!^]ߴyq䩇ǙL-DȬGKyOs`IHbx?#C5*;3ϝqo^[8Tw "P]$ ,_bam\hLnAݐ1*'7}feRJi^=eg,_䴕#U2P=b_;c5Z6 1H E_ZqsHk;1$fO|'Xџ*hi-OE?`ʣ-*pбس#3ֈVjώky㩔ɺFBNE̖-ķ# =q?5ĚeFx]"=LX2g=Wm-hf7akS>ֺE6@}y8w#Zܐ+B>ߵQ9?-Nm(]<%AJjTs۴w(-q&鵛 WoKqMs g,>`gR T6ry;93_[H$}[v!::ymlr+oUiz8VÅuoW}}'țUyUz|U0q%1Q{(iKkѬ@}5EwZ_A߰Xb.aKEޟolp G~*R}`V>l!jtZNp}w`L\N(XvD4 MñZH{vG!Y." וmz(hצ08C@՘ ?ys?j-B|CUmOқ#ԿAKȤrATp.aX75 ԛ8:TNЛ2Aѱzf-"` IQ,^w8;D[2C%*b2iAQ;RM"_-%[ęC-sErHbS|P[8~ GC틖:j;zK4iDr|HB{z+][®;wE6^LUn{+'|lCrri5όt7GN'fD}C+>N H1ҝMdLn5s{KV5qn/L$BCّr2?uRZ(_w^,sa4k#yyl_bY!F6͞Uq#d!XU+m"nLۏ|@mvnaj5+z+ZiYҭqzט+{#'4_񗍓)*(C^ڔdCl^(X[yi\kv'{ rf% |o\yBb뵼+@-vjj`2=mRXfHB;Yߖr ZszEwRT9n2. ]Or9S,GcI|4%$#{64 HA ޛG٭Z׾̖Ҏ;6=1CbP07`|)趼enCWX˚yG49f 0_O=_ E̸_ 7WU)_:dj $Ӵd&o!Hk(&Y2*c|Ra+[_I)_uX_T;tweOݕ6}b9fHRZX_8b;ALuԅswJ)_3}f DeHՖ|ؚ*񡪖8J<ʼn=R"#!.;[h&H#hӃG-FjЅxL cQ;iT`~\^ v w^*{L>p}#VmȣW}Db9۪:0ޥt-˻縧ʹzXBjobjeHnPӢ $nJ- GVsL*=mKJjƭoHbF:y|,D_(z8YC̥&>ϯyjsG\:U맓J~0Ѡ͖{d.K^]_8 m>Ō^2YU]9ѻMQ3kjEcvѬ('!2]@s_%lϚ.=W΋:u1(E7{z待Cx# +M[>kIbNZh6Yy"sWQÒ#f?l{٣Pyݧ;ZwyBo2dEeVtwؑ7Mex%Wߌa_#ZffiYYYYl[_؞-+4(+Z}:^I?kd /|ٛuDfU>] e/)fffk$ ΐߤTΉJMCxG )ocZ%LcxFǻ+u\IJ|m!l@L%ءqeGמ=~v/q'4qojyw6H0w'NW[ -{bџȫSBI:cq4vݎ2;\`~K:jK,WzcLn15w%d=#&u]LXAGQMuD&ep^ WBR7xTCWe3y*4P2NBeQ"@G*hᇒoS\Lsėxoo'ɩ4: ?6S:b=T.ڒ|>8"|o7mi:R[`zucT_p[h56~UZN|8PuuGƚArg]oD޻Z*&_Kcv~u^-eef~xCAFqxֵOz -z%/ /E#[$ȌNXZ'+ŤrXvnTYJom]/e| &MoTҗzt՜=YQ$Nb ]H/Rg;~|'AHS=#k1ysL 26͑ss?\Eu΢$Cu051 ozP8zP6Z[9XG<UXtsدyjBeg75k \7u֠*#8ܘܝfYlݰ>'&ma"6%LJOΗ_šzB23K>/0V7SU7]hANS喺6GCShl׮P(8Lܖ$W /9UP>ĕTN淝=U7w-f|6d{|F:E.HgO=CGJ:R2ӕkL3 [h#otuys^sխqЮBW%y?0CEIjθxG,U? OaھcX&$$;Dp߿]@4w\cSl*6UPniW/3^lHG"u]'12WZvv|Z|ٙ}Cr[(e^mVM\90 E`ic".x!{@ßDS7#.-l\ Nvn`]umj~7oNȅ8VxǽQeqz ^fwq;6 Ajr/9UhVO膬xg9ׇBK_׼ }VgNPmG_0dP QW?,0Mu8n[ܰL >~R~KHu 3!HVboDm-L_;&WWhp(UF"WUkCI^\Sz5c8S24DBJ܊tլ[jvEQ7v3 hԚ1 &؜3ziYJ!Sn$uSg8Q\elEPS ) %~([ Ңh)^m2id;e[?x=T"a AFBCACXrqu v%c U" ΐ#d!s)(=8du[1<9[wx=aI@r%o_wi;_wn0ԑU~yf=*shD"4U`X~r[r| +\a]wM'o2eJpb~H`fЎou g۾`W,n=dR+e!Zt'5(_R$4?ܪZJZJz?_-ܷSQ+/JQ~ҁ_k{ _{ e)@EBDs(o$Q:Kb8'8o8Ju ~}: dmrūq^{#㶦1 1YXyg'w>;{72`HVz 8Q ^`9aMj9;;M=$Nq);G;~]RYXH:LNh=+[l j:V7@OkiENwS(Ր᠅ mEqP(=l/ɞŴa|_/ /1Y>ߓخ"ku$H ^{s&5Vt3[;`W3%DBJ3cs`OI~8/ƼǠ`PgG9p ܒ*`Oͳή`8Q6P4=wlO`9gk84v/z}@=+Wgw1CnE>:mçlΛfR z ֶ@!Jw"' 4X=tn8OQ*U>#8DrBXW>th5'vy\:8!Y<Vt+^C-]>VtaX?ڬSi|frB7CQ @-yc(,I[p`l ]WP…>щ|XƘb& `5Xj?wf>z>~j:U0 €r~bPEcW}IoJB8DN@oV; B/J _#7x8k zP_ oOopTذz!M>9f7x8i -F(C`E?.dXwtXpvf?Ńœ<UHtn6o<Ԯ0BX"$$c'x] >:"Ӭ|$5qοmBU~# ti4*mm;p܀& .lo x l7ϪNp)i參ȱl^7 DD5Ts"Mks /xg8K! lx>6BvwVsʬ>}x=lG='N@]|Sb9>S_ j_\uƻ3*$`ǜ>}G@_9qF':xT'w;<d'CvzyMMk"q:`W7hxrr?wMqE6&P3`I@Ys|<քҿn؟A##|uguYs4 Ws1_m? qth{1PPsy 2` ;3Ѓz:iy@P =-< _V3Wwzb⑜LIOWic3FYҜDӻ?.R!!ζ9B63ZBM4ba wk8J#$ q`Őw p7@jU9BEY;L!XНZK Xk3x! @g'Mzn3qsǿ AIB5`! N$/ATX>l7 1!dkXHZPs=1r:@ϺBtHH2 '5ҲNhUc)+dQ~< 78tqFpp.נԒ1aSMm|Ul g;*N@2v$O$Ո3bgamv %:>zJBټk*~DwRm3;}HmpalaYƧntڭ:86wr ]/8&4>V#{)xN1i 6RCB;Cz֧pLE,X* JkkUȈpS77D`,;l @ uwwXy*P='D9%B?Z:zB(f1Gi](Dp<\:: !\P4 -o5[04!rbaNP&=qZB~@3-Y`^E@P;;:B|2- :XRP#6 8Pb~%]SH`h2:Id3. w  )6 A@G&$KtS " 6rnxXeAprڪT{E$&nѝHy\`K"Qt9qS`w@ܿsF&9gCj$$1p ?:PBm.,4%B&o~n}@ qa"8A9pOzV K ;FٽTsPᜌKd>!ka9pNxvJ9ΡC;Y~[$a#fәɗ*nGo!)hr%9sAsH&qeTyy*X~~As鵝m薃x%g8;?>~vJRnG9q R)|2h w Yr4D9z@ -,Qr-lj-9B"<-z=.AtvD4qC|{+n hMRNLc"!rt2mw7a&gܥC%~厱9Y0f:׼%9Ǝ=Ėԉ)΁xZY*lS 8~szGl&mpB8Є&Empߏή0`0Mr1IlMYBX; j 2®^BԄbfR8]rI'ABf-j~:uS%E a "Ј-]l} #@=b;̝r@ȫw/w`r `LF90Gsxp=D^7q`O3o-ގ-F#KH`7Rt=$0aVi)+:t;t/iҹD?(5q]P +EU W-MN<ok&mO>'@ 0j:?NI[,M#9*yIKȰ2ۿjA>&DPbU n_Cu\\u\]@vj+@~āt8/Ύ?` ac}&¨ ] vӥZEџXzyV6p=]ZZ`צb-3g)8\hN[t z/1""擅7ڏn܉C\ p%(O@X.`{`8&2܉]KBFZsPwMM$ֺĠ#-`~g|zQ .l!5g|+oL&rm8dӂSM?1_+q.?T٪G z/jM"=)s](A~4@>qy3]4zbI9, /}qb"9p&?d 6Mɹtr@&#}48w:rJp N3qhn!j.p.96cI߬ÅKySkd8Qmw Tznφ GX8.?@r8QWXAx`Vq: o,h +HTA=:Tko@q7q..@aiop]NO9NшDÜsqc>62`ax\tdqP'bsj1oy\ώE 487<\81ObNp ŅD<R<1uTP r@ ch6~.i͏@'fE_p"^{  +@3hKp#PI>p v; hա$ ?$1wޚ5~߃D3\EQШ'=^?=6Y?s@ .:ON˨g6|ꥒuj -L@#t{1yPX~H#nP:xg H{~T=@X[YݬZ(|Rm]4DPkP0a#Xc XLw`n z<=vY |(t@C-e D?`>m d"غçWmC7=]lHw`5;js|o+sqo}LqZ:XCBE:"@+ݬN6r+/b3rN6, r 6ܖrlD# jUqp&ŃDPSs 6z0aWF;q&,9z"΂#TRczv lvugzGk8 `lasӾL`7#{?{v@x3.m?ub,$$90熛BB{HjˏPߠhYAo=ݖ^֑ kQ9IӪd t=D_]^Fw# vl0HYA|?[[/fR$l./F4@hu ::w֎ p2LLٳs'~.!` vAjߔ-Af+H恨h ntsdBշwuc/zk A@8` d@MϩGCG*c‚ .#3 Ey7TXfF^mYTOIs\>VDD>S]Ch9Y3@ /OOxWqS 'A\wPZNs?Q{ j(*p?p2b\~{* vF}Lh?7T72𙗍f! l0As<bMT-`&(憠l-xrV]aqSc3_ugL枵Kn=>kƠK. l:J3T|'vhX"J6QL (b I+l"*g}a*7i;@ 'FOI7fk Uw$?t͜ܭR '\>I kމ67HD%GD-IB_;?X ežt:!@_!䭿w>P|}V9agettg* qv|ጔ@}Ю5lJGBkn x?4ĒpG,:a, IlJ|(Bθ붻:;v5]f'֣+P3g̐._PR`}UfN2t:u+vbkcᢷ_~9UψB0ʷ^zq5pE o]k_BvP=>s?ҏ̺к`7`ݜWcx]zA$ieZRJ k,"Ό< gJ5 "a3ܗs9VZ3p64|$NՅ(8 ~:+Vvgmz}FvE-+d8Qk!'V&FT;Cܽ@ŧOsxƥ%Ewtp;OgWCw➨?RanߓDjh@@usPG ?50xjA Eҽ = B vxtO4317 vHH`;yܽa&ڞ)EJ8Hn\1ǞRru8ٹ>]1k=H <|l 88dP(7ՠ?PKBl7m$*٧+3/EnhancementExample/lib/db4o-7.0.17.8420-taj.jarUT  7G7GUxdzeTۖ5 n!{k;'Kpww{KF:~Sk9fs=!8Qm8S '2P80z?[?O̟ }SVaf~ȄrK` (BNI ڥ28[3oozz⍬u4GӖSY|#éGP^Zb66ⴓT6`rW\Mos ]0UTe^aM'1?RT2W5x{{ۆy2G7aHbDiijkjbbiodLC;_ikp "B6ƆF6.b&. 6*+꘯&ao" ʉ88̯m*dO Ca_&8 Vwɦr0[vEPu2,%-j7b ާHnCwH䤊#MƔk Y:{x-mxE(He~`E$q2LC"N6j8d:[gmlv?1_@>5=GA8áO2Y9\YPS]'2BGS7qR$ݙ8"mXUUF4՞fmֆÊ.*amFg5ֆ(L}[\2+{ H 08 4<;G\)=,oŐ=,‰0ٖ;:9".+rb3D]xRq['HwDGk<6$܄) GY)3yΟuD)jEI-Z|su*$ xwޏU1+ %JEK6BGim.~`u>1+ nj][*#ߵ<˪~V՟%/>vV.*B̜ dd'Z~/jGgs0o2PꈮPEq}NM_9kC6dl/!.G%*6ԓG z  37{_U|[g/bIRR8 o%7lh(q%v #`WEr˯u韚ݞV܂L_lvmtDVtJ0's 9nzGpٕ[Awyvm_l2| E'CG{wNbm u^gm>ٴ^*kiDpZYD1f4jiyiɵ*ʂT9i5Sbq[TQ[˪/i+JSnR)uvGh>X+Ja$mLB#jn<8JHXdeXC~|파AF[>x( *~n{9:0T`!Y4VijlFr.:.(ſ p &i#7(gĻU.* R!DVO>K7: ynt;C)î۶gU`-W{d2IKpY̔. /9MZՍ\y}_7*G*0֜Qςۦ,FgAGH:&|NGF~zDvbkݖ2%Y '(C'u|I.`X'VB؞ ݺ'cZnϭst?- ^T)@7%@Ĥ> scY>=ֻ{+|AO%K]kpü+z4@ZftTV7j}Y,~k\X"^#vt{N@k}T=hW)7Y^h_Xq*x߀G<@"љ"9>әUa(`{S˰3zA*):tVF[p` 1;8iRsl$'w´ըU*av?|ן8"2O<>n<ё<$0jĔ|[q'_0Gmu HmFdIG7֩W*jyƪ1ܴ Ԁmj}3Q%Fa}7(o&)?5}s8y`a_җc}ȢKHd9#fS+qjtk\|J-W,fsu *4|HZ-B2q_g _e@ T݅q# thr g&J=‘QӀл$ր̪' $aM#cA "8.N'HN=V):kr}ppӬhC h@DTeYhn@܏uzݤh޸'/lz^ϲca,\ݛE .53GtvP U,<2hR&"FCNX5..YW,f]–qǙj/Nc_P{s\{32c(a~84ӉZ{{ (# mu6t I,E75$m]j#L&JPz{l m@, ZM M:%"/WݨRdu@jSD@r #tWHFM2: '6e}"ebX{Z?xZͻnjjQjIS+eC~\|y̕|v zC#:̩Ӿ#CNF(g A:2[8mjR K^p00u00p2sv0t\SpD'hKw1ke#ʆ\„(0QfJ?,HOaO8<@ApUӄo2Ƞcdhǒ4\8ɱ`JH;ݲ(Tc$TSZ\+/J[tY]^XR c NIc*npfw[[; I/0̞(l/tŚ7[yӦ7U(R?ˏz^p^v\uU$ 8x AHR&gk*+(*"l[|sɌOf%3h[ژ:; 939x(-%RWm;8u$-'JR8`T.u ??+<틽M1Z]iAŲ2cU ><qdQ`A]SQX@SUˋu:҆GwS"\yjupI"RoHP4!IHH2u_e~`8Zn|R7(rRr&QqɄNr7e]-\qԝ2 V0R(kERoP@ǍVR#ek]$v_f˽#5q 2IMВ8{}U'J_<9nzsrg?;*Kf9Zd|0 !4q+d' rV4Gk]pK54N5SWrN{mk-kCԞ ~옑qr:9owyΗ `#Ηuq9r[r7E #%S<zd*l #(K +NE0D֙| saԂn-pns`QÀFT7iϢvSsd^F}Xt15Sea,\hh?HW))Lqqu2#Zl%z1G} فCgw;2!pI#\3/oHZp5 7.ٰ[ nv䊓jtŏlǕ2"m,vQV`"qO5ju'`*._>eHue50T餅5ˡqcR 7B6V҅`[K}5DQPR_MƦSg3'|EIƝ,N%!|qCH& u&\ƒpy 떧=GSuJHP.ɟspswt'j? }A5 1v ΀̀0$l%f)G}`S.~G0^~/<*Ttσ~4eq 1#" Գ?}=[J2Vd#8wBF%`&Q6 QMq+hvS*j&QᒃIJ\;:?M7#8imJ݈G|CvC0}vEN35m`9vDXN%gw %/fWRW&gſ~sNԨaVљ)A&@SLrI^J@5I֏VHH ,QXTNƼQL9ί?iaX&vK@S!~ 8c,+C#-r3٧c_Yq2)>j9I*LkV||Y:G*Ī&z6^x` ZQ̵%OWؼcl(f/.D [*2̪bXtg)-O&8E +yRf.s<̗Ƞ{-,)`N"ZXV_xc\xS0hvL_71s6Y =jڑW̷~><{hھ1ܭi &rꋭof䋪}xfc[ EtSW^hrQXۥV 4J~V?|:yEEr9C19϶u>Xs(O;f-[76sCQLaQHd*U b⌫g1Q~Vf[hn)|KiC% isF.21;hu\]aU1D A㫀9<גo G1v%KV\x Knwd![]c\&WƟ3K暑ϖr'dxx{j]bۆr;23(5r h{yʲfxP\VlڌJ"g]@"Ӹخh,MQkluXB F+ Do+/S=?#=g{WXf rki}ٛ)xj/#& 7i5)Ckt@%)e&C=2OET7Y ![BB لro ^!rW,GÅncF[w&cd.76nO]MN[3($֩#%{.LN#\<|l4uR;WDun %kFǜ D20Fܑd/jBh|*^AvG;Os?wנ&SUG#rDIp}s'|K]Uw|"QrO/I&#| >G{WntiQb3|ZJ~O<:<yYj:=T\j&Vʬt٫ݐ ")9#שWq̆~Mͦ@WsJWxoE䈂OEz:nZrl;5poO8qkna|Ĥk9˗2c 7g6NhY~h&坿^ŻpMc$E Q.qlկK}};,skIxi!$H=T`ZPTfw" 5R&آ}$ UfG<Dzk[Sm<c;J 2G-}5v D72_Df/l˱.+}4bIg$q8ǻט>oNr nr(ѩQRO\'$} TtxGzʴqAvbAbبKB]Đak- nJqF࿷r@{>C5ՋXPI(E(Ƥ'ֹOնٹkBbi$C_5ކpXo}m j`i];W-ͷ:!˭hukԻ**pwDD9G ]߭kkT[PLtPi$"TFָx%հ`p\'zQW耑BSZ,mçr,='ef!~1_'4E>#?lzB.)}ܲsD/໮F{PC7i |r0?Z/ss:( |G/TwsJʹ ϰ&HÎkU3="m\G9TL{jH@G'fQW<$/_q+![b2{-F0>e.afb$'ۼN0h:͍G[BMH(oacvKJNII Dޘk%5U ӕ ?X&"Xc{M ^#x+FתMN!!x[n>gp*SE{Dr1*6uZh#9[^f[Lp+?|&Yp}J%~΂tJ64qŋ+iE8&*g~oENc蔧4QoʅmoG.z+n aN7[@=C1Ho)edOg0wNrJ̺r>EtRRLTglöi1~,H%'?PU':3C dN4bS0<Ρ.I{=!b*'ez_DrF ;6[/ɦLj?]hy#eW,?2,KL"<!08d!0c5Ec TB,‚^qB'73FEYנ*)!ѠUZ''e׹ ܴ"Q$a:OZ׍iFWڽZ +x3W.-{%bGT @{dbڭke~>G l'`RnhrMGT\x;U4h# +hEZz>l="fxGQtfຶta6Q'ZЗD b^7 xߜu|?'zp=AOJ?F}qCc{'Ͽ1$2\ޭHlImi+<H@tHHZ َ4zwO݅ J8:3ŗ #חsqSyV-i6xaGVw3U4G;7,H1Q$=,!:qdw!~>t[(BY`N_/ڦ#U vH݈KC H7lɏeW6;.%١9&]6f0ZD-:ヺ-g{) ]8~4l|]Z߾Z6`aA:+쭃 tTXhajF2V gx"(PaBi}XeN57{ь[ XX0cn Jsqd.rP51a8䤘8tvgs1\\kjP=8 t՜)ϑdqdvY qc&1([m s1琉T+.Er<`uav`dQE QSj'"\ -һ ,~ᥗ'O͡(h\#%A'p9?=٥ ,(tyDƓ쓛< o-43^q1ŐrIo*NZ$dҋ_A'U%y{ ®4͉q#Je>6~%@т"_G@GIa-Fn(( $f' x_Hy[k $ĻczN&1bC;Ak 4\J>,g=rya_m 65xsX.GRS~ ؒmCRu_Fw3DDݡ2=+ߊ^'bEzBŋ8@ VA_v[7;GGg'-?: \_: 4A:L+rTS_7w/z׿n#gwȟHl#~.Ϳ ?ߡ~?oj@sw6 9~}O K?;wߕ8nT#?RPKBl77|A\81EnhancementExample/lib/db4o-7.0.17.8420-nqopt.jarUT  7G7GUxdtmM.۶m۶m۶m۶m<}{wUsdϚTլZR@ @FDYFBVk@ߺ]N5Bs2"Jʴ221 P!_C1%9ؐ{k6o2.^Ϙ'X5IM?k3":urb.j*qkbvB83kR7 l<{.~FiPMf]HN^y6Άo= I7㟐W$NN翢5q76'5?t.fВv&\X:7vA2v eM ]h xAMAu@e]A]]AaEAMDAGEAuO?뇳MA%fV$'椨'heh*%d(ě%$֞&%eh 2GW)!Aě=V? MAk;g?/MU-,M[$xmcmZ$Ę>]WvQ#xmxE RLg1>>~@lPzgO?Ҫ8`D־GWjR_+q^FHB/iu:L8;RAʝHpCvvYY@jMDiʙA\fW#-R6YʷYľܹq>O VNx׀|jV{\^$n~}P&Ć&:.l:m`fWZEFŬeE/ ȠCMyjE~ި4Cb>bb-:`%3}9Us;?Xڃ4RS*Kk3gU+h;AP 0?C@Eٌ^7vo9Qc.;^Zh3~_!> OKxz{q*}?2Qj  ̿5M <9r~BGB߭ft Z R$lB;4?yM{:G,y ޳PcV- Yp CS)HCݦJ@0P5|%x ̽5>79^4໎4iC?˂s>—^+<~1={ī3-sg/<&eyMrKHMQ/eS+X/L6*M+K f>{Cqt?~h[<2e(Mkom*ûĪ^-E^kuƪD|Rqi*#R(nߓgH}I:^`i>UWϽͪgPΤ?cŅbY?BN7H%"/־s4m7/r;{?'zP_ar&\t憁~[J{o2ȤE--Da}%7dC.5/er漞<\~I\mPPB (}w교f#6۰ Zvj\&%T[~/(),vqߏB}4 '@y׳>D 9fo4;$c+ IՆ+QJtUe٧D^(-|7R1aRE(ͷ|!Y?8a`7ŌO"~(%MS$ոnoGlē)=jz۩F͹5$(Qu\[yNyݽI\/OX8(ͪbvcou۪jSjys RhO.h5WٲYw.ub[LNNV7+,Xb{8]ŋl"ZKui^T`7^A(Yo,j RqWrTwV{o7@iw`_ G{VQoA+']-GPm)_ŋwG$OR4<;;okC}o','<0_Hxr@A{c*X,u>Ap50YHC4tJ5~I%^XB cACJ?"tSǦxR5TX!dCX8fao0bH. pDdvtHdž(H|Æ9Hm`ZYM$\jnrDHJBYE 8dHIpԚkxvK 2S'm/CKZ,„KҰ'ѰaIn!W. ToT&ɧ C, YS(36NkYx3lxC(+ha+׷Zs|dy (GpAY"86s ݞ*^{|DL'3ZfV*! tgg4SO0-O-2-XV}Um~R׽`k0a7US,/+0S_ri6cR|]?myjo 0&Δ!2w {0\<,IJfH( XpEV n? L!*06"{LA+*gD1GR"% u` \t8M?[+ WU骷~0tw4 h9$Ц8B5Vδ zonZXNP]cBKR~Ƴ ;+@:7o18`nvգ8`]ou7i% ӓ0 &?&@ f|+.>@cHG`bTYSCw k5ͥ)eFqgqumE{-7/)ʦ6ʚR1 El.HlɵLCDǵ풰,qgKƤsn&Ciռpܧ}~3^ iU4x.9U \z dKY.2(3\(SS6h -_%d "SG"Fu7ȚCqֆjGeJs2TFhO0݌2Z(laZXo8 1hw$>:nEWD5Km!0k8df8V[¡aun [#!G}N6(7aRlVmqc_?VO]Xvhr3J9olȇ.Pd>rCĴ멵rߌAs2"Xh&G޵yw H8AGNɿBH"_‡PdK`6Y; p]3ȈsJC|J* l`%xT+|R5dَf'^6Gu0Ԡf$"Qy>hА^~BRI9rk*J3 <|heQ c<.&KpHF0WBm(c0љ+o˂?TSUu6umiMJ0p7cDSu7ܨgsjy]Zf/d(Q}6GTOXMN #mljk=ƞavM'ZMc;a׻G(HUɨ8OA ?կ}*@U҂ˆ>~ :W8d%ت33}^ |>t9怘mJۭ0UIgE;yج&="N!q+eݥY WZA ;j&j* / Pc_33ItUss}䔹}$QsXɪ~Fh!\>8.+֦%"x l Uq{lJ/,,˞,TQD wRrfy̢by<!!Ў, 3vYoGt~f ǚ4O@/g'Rzp;J5ټW7{[ 92"N z,lB!iYK:ϗhTL!g_Ie|oGKkyEBzKBƀ$,|0wX_FMY ZY $|"γ-`Xyl021YnFv-YAbIK rE7Pb%K1yJΊtWK65e}ی߬cȜ\emm h%4 n}HWqq ~]t,*ȣRRΒ4h]_QCY$UGYqMy"/u6}De}qX0 s81XYgMB:Jo?cZVOU$eIq/8 ca6/.É+VK]yԅt}4pxev0pSRbM?;FF>3QIqGDtT{LV?N9VD{*kYWXYb`WKOXg~SR؉+ٞ*d p2InUR@~@)I2,IkhSZeUIM ը2l ;4v[C2 +wG_d.f\'Y_M&\ m.H_.vDmڳ lX;LCJvwDm*n-$`Mzr*Ƒ:\}:8.B%x,C=I  l%41} ' |)\'l0PG=6 $q5rb+)tH/I/\ ,> 24察 s1$cNCE 8TZY/%iA('?\ڞF~*,`Rt8$oް1ODvO?ӳxo*HHv\sָt9'Ղ>6;hi ?ET?_=Xhf3 @}FdݓA{b"ܹlTB=]9kotIi``nK#i~%F%>k`8gR ,!OB?)L+6 2't~k)3=BI۞:< l$-#4hhxhE>ňŨBP8s7+]C%BDԥ{?Ų)Q$C$ ǝ9䉶V*S&4\8/}8|<+3〖 fj)}Vl0qСG[-QXK}v&tltw vi*vl)ˍ3,ⷊѵ1 Ûf֨i{9C&Tt=o ozcx}AGPDIAzψQ## /\ngAgbǡt\lS0I7RZ`7t4&O4JSɪO4S;b4h"O'&`q@Q0LY_Wl~ 7y4ӃCwb;v8u1/ 5Nk9P̎(e*eXt+>3E ;etLӎ+ $$beɐnax8tfWo ‰?<Іu|;yґ h?Y(悔 81lrmr;YT?ґ=좭->`"mO Y5Q^jkrkOŃCÂJU31tM*hcc}1j7}¦&5=,1gNe8b5j\&uVJOYЈ UBps\m궑L2g&fI|:Q]is$~=NV-VrB%Mr;b@ :AY=ʋ:)j"!ebPۢNTu-L@whF:)EKhr^s l BÎhut^8qmZh-`-%b*-r5XE(/쵴x v aJ_WBEVeY5p} 9|X1MԵ>?VLMdtB7G/ t^!Bp$^L½'Br(RrFYNO213  WI ;*N]By, ^E(o/QV*̮ޟpk+1ehkH,g9ٷ-6Ѯ<51dnƨ- QAGLJ糒bz3|o wd5Ѩ4J8}R5gv>Vȑ CZVMHA8$#`.@Ɣ^}Th, TiPIT=,a\QQbЌk\Ś1q/[f6-sD0+,cj׺[t>ϖe6z m(YC^h$o IIL渇48վ;P0pzf^Y;ߕ/0O׋]R '@n_-ftp`䓣{;h8ob#规`4ع )L{ dmg1DfMFNȻ&O6?_Y/7V<غ(Y}޸P^MLulW2&Lg̊͘bO 8D<@lrϣ KzڲĈ ? ߄0!;Ds9Hw0Re_ZxkkEY4L!$ `_ogv2u0DԸ>\>.61be:8yhS7řXPLT$ Wk>8 K֊@ y(bHЅ&:Y&OT\@ ֔`gC}2YBa 7%Ky $zv*px6$.X +tJ_fzZ|pd4qw /Phr=4w(*y"C_3I"Lyug@)V.R"<(+LLCc1گg}6q!G恥-c֛ f24l\l*U -$5d_:`thCPMV UU(JHp6~s &ލծZZE\^9?QGf7DT,َ瓸>:ma^@ԫ@f n5&WI]ΒtERꐝ([Anoh7qxςEh  $g,S Cw,$B_D ꈠ( {?Q÷O>qi G qGq󐧔sQߙ4 $slm#[m aXuVul9/CG8t_2q⤑mXor Sd0>l*il@*L]1%JT֕g<DU<@殺0Jl/J^:\@MaqftN:4C 'aoJ=j i=bZyr$\{xY!Z1ѤibCnP0U؁[Y[0{{:f{YrUYYE;nT&tdE&"rV;3OřnfIgX6$/r\ޡ7uq׬_[niң?GG2pyHh1~S"u}Nk&v'LUhxHA)^ȩ:،,R=:SR.3{%RK9Á~+dZNYC\)&&e6[ !/Mb>d&_Fw-+R֢m}  ).8&P6Rji5-yov>2 iF䎴Z3kh=]jjc'/1Ro*sA|NUM$' i9GIdPK,f%_Ln̸Ja.k9>y줮'`z*=&*!<$|BUlCJBCb\2qy eVBCЪ{4҇vY]yPv%mʳB!? E~ɨ>:3  i~ @:gc[yںd,7ݼ[HdtZ yhflFݕw ^3c #LٙNozIoN`M&\cLű M&AFi@o.|vfׂI67v^^ᡤ Sشµ=SђA))dɬ r.@?5|qen0$)-yDݰrn9]y*EұJ>-7SPJlTeWH؏ JTl_ܵ "mŸ 7gt{cW T}ɉdqӾm(.?cj۝s@']fOdq v#\bS) tdܠ*.ǿ%[F2-TO0 q9\eJ1?l[o>1GSHo[ F6NSꕑgЇM8%: {Lş12@4w5(nHV?D`J{O CS.-/E7q]m!_GA/QeG?0PҊ7HNarTW7La4"?ho3\bAe+qz2;qw3 MQT֪\YCFe)% |,4F^.s+A;Fbr.nHYvάd,5@ș2YׯsÅe e&Xܢb4֥ܶ`V9&i$I8} T-񛏕 &fgGB1YV1X\beȕFó/>v*yXihP&q ׺AP"YV#SP-[b\*; }}b &R󲕷aJ u^y$S'šRv"; 33ǚ+ьB7PpvAIS^0V:R鞞>/cdy`{?+x`^j3_RtvvQ+pdc<% dc0EuNz`d<?ǃ:roW)y`d>~ZCaa^AΈtŋRƅ0a_JJ{vfO3:nn| BQo:-q״`~61f8l xX:TR+ʹ<$*EӵK^F͘R.V^^2t@%6 ?^|0X' K/b9]bGPwqqL6\@ۗFܓjRn/Nݡ".l>&zÚPIx,ER kRM#Pn%n*Ն;  !J@nE1"PI @a dc"b)Ex*Lk=o@\?3shC`5oBYYE$GeXIab'Lg't<}Ay&^P}uX1Œv5 cSx}!4 ^&>t1{!6NՑE ,!`;iQ֒c|iD@ߺ*RNPGBHJ*sjFE /D>nX2LާY_oOX a{ 5񯌃iXBGSvLͶ!?/nI1plѝ_Dп1N'S`ETQU>IfkQMJ YTQz0R_EM$Z,˂w[d`dܱz:z;6P0nU_1,ڕA2&dj*Ucz 3|<;Ʌiá*sQX,$$ }0˄82oÁx]p ct揔]i(Ga&TUuh9Q&C38{8qqypqPs92G ?AS;;#-U#[#Qϸct<_0T4zQ3{绸z1%Z|*:)O+`<غVtq` 8nd5_~~\BewqZ>h_~y;L+șj<(dFQ^8 (4dZ>G?oCv|]T,kH%)%~X#2(PKHfnH Ev|@`>pY 8X@j^o˼^H #\)d% Vԃ 5Ek}T*NnkKj4]/3_z@_ϻ<რBmAplfP 0 =) ȵ~s``C0e3-W#nl*4++N[Vy'yA}@gbW O'7^9ŻqЩ DfCO)T"eKxQZfjlل&+;g[NwSunZ%&7͸~/US$)MaM'T_4P5c|#qGe6~+L?bl@|6’8'N^t> 4GlGHP_SaS陔DEb3V?Ip䙆Wl?!&*cD'Y&^ʓ4=]pgȅHV@oP4&.'s/s?\F7N_ ~ѦA$b<oO ,D(Auvz67#7#nn͍|=g Tyza0;Y;\bYZOUaEIpf1:C|k|^DN{2[6"|]-Vkb"ŝG6,<" ڊe@yMo(S5VKr )) Uׇ#v0 U74 -!yNvRl{,"8P.h CUGxN_#tB#F5_hjdak_M%~mqpG{@T*@Tv.ȉ2@P;z޿Ax~FZ̛\kdOoxep8ɾ?<) 1j:ƄVBOdVQ'qǯV@ vONs'.Yb4o怐C0rFN0*`5.Πwh{V1Ra{ ,R/N8u,mD9Oq2o$pܓdūǫj'$`WS<gi{tHXj n]t]dpra9df&~hl$A"2y:{5VEMR%b#:ō @X q up)&WA(WEiZ)J|A9:j#5uU{8V-IWr6x.E4Wa 8,==c.SI $Lg~hf:ik's-kΪ@ cP 摜'θv4I-Oz N"S%&I ȩHmKTjdGs=M-pF IOL.僴A-T:BSy{V ZS.sP\$QQpX݂:! ~U>;Gbd.܎l~ ąE29w( J0>Ze_J._\:nRu#Gz}sAnwܲ'ǀWn w"b|iNHu20~Gtm &qk5[`UӒ( %S,b@j2F{v hCRM4 S*uzMt;:K[w+ͻ!y 2UGVE>Y Ahh s@&>sa.Tt+k*۴`AH̪nSLzJ9MmGi>7ݼW5"cl*QY#0鵵Sx:M.56 C%|(0=~v Gک6UpV 23bvrGDT\7׉i%,y՛2SхoϏmMR /10'QcA kLoӍX͎l;++gLC^yy)zY9&(waȿݮe\Nb嶇Xa969Koo]`ڈ&/K,A:М^80{);'u*IYH::sh(?)MT2֪vø7E n ʢ|XX(+srW^̑SshN3[\o/mu\Fa))/N5Eq ^ig-?2[x JvYO2Džuď)(kyxLE7x[FCZCڬ՝Vua7 ݽ^ ,Kb#Ybbt&$ 4wEĴG2ž|ܦy8n(6'n 툉 K!FEȣ}}MQb:O.a~Iݨl.T<Ԧ~l?o>.+<(z4!}}R9+}v 8Z8ۘ8[u RmǾۮ[4AYҧSdLS"kkr^&ot"bEO:Nw>?ɜ)M1㨌;UKj:g, #ex@O[z``52k`C&hD~v]D}2`qI.[J"? e >7C7 oUH\>/4V}gg"J*9B@!kpW{iΌ^d4z=PSwZB䦟S>R/i1nMfTaHX#6ĤDssnvzJvAF승Q>ơAMtK㩉C T-ʑbe&Q%ZlO fW7hwxxe[qy)YE\nlX|W#uԵ*䚥 L/N}}mܟ pvt6o䄅/ۨ/Q͋Yŭ G!g|xIfGW^nnsR]2W{9"ͦ/5:3Eio.X}[ ). FV)%J3P‚8R™K*f^۳|-Y\.@Pa&(„f#|BB(|ko?)r zjVj+'qqD&ziv~=(`ĩM/Qsefј\ZDeC[G=82RCd68M fR)|vܡB-V2!!9W;˖SJ3WWZ']h9|xieZ5v`MubKvi‹v\u7~$>1ZՂ3` #] .*C܏6e8Ns̔J*)jDݝF(CRE|l=)&9!jT8H*v+WD @\cB977YWhi1n)J@j霺t\qHM@-Æ@j&\ dIܑlN.$=N?Cڴzy K9=8T㟢Ec}s\?bnTtJ4"~3ه\ !6B .0#E}٘$(/kzپ]fxǜ28SMRBv !!xeV`)վ)  ͭ~Q[x ( !imJnR,! lyn)_][wCT^[kl,- oSJ5}Vq:9NA <@___iϓB ʯ8&H.x V,ocsHs-\[/@/1HYLq7{u$y.7:fqT,ƨ>*ӡ`OR=C##A!Q=ܖD_LC>Dzqn4%c͂羗Hۣנ{)x.SE  !GS#XwFU\.uqdf`Ƶk%~ E:sm;os!1cqC¯EΑw ¢C*-[VFrRLZSSQ-Wߛj"aYٴ=?Aٖ^R y8+^(!V8o:{j%Ye-0SL:rCLH42 Nhzk^ixN6TA^S*مُ֠'.fcl-*AN\VeIAD |߶ٚH15+ cj_?u}02h=ٓITmBqpLu\d@PN37Y𮞽TؓcWSAI8373s*isL.0W-<$Y3+b~R)8tpKIau?:g% OkRKcE[~쟬|m~~.w#~lN|p:J&qdISIRI.NOJ.LJHp՚CkW9?[#Kb 鑅llSC>bK2?Э:p%݁t@O>I P/A"_ 6ujҳ/iIƵ}mx:2]9dDZ>V˕nMV0qR.R:ߟ;-y%-lddbkl`*E m:$f.!ĵrxUC`R,dr 0"]WQRlht<~|BA!4/aooGͼdA[f`޲wHa8ΈܿW-$΍$Y;/p4kp90fYQ6ֆ=͜ObVsf5aTԈ+OSZ7,KR,xLs s>qD ~  ?-j=3fl㋓\Kw[^Yy!,cj?6BnSF(m_S]x]T>WX wMgjr!Ze[ [ 4 9LF DuH^*cy6ه.ʞ_\54I_QGFB#r"ԑ=!Fsqbͻ ls18?(#d do!r|GQ-xkAddj /ܵĥvՐelHlR%*SɟmNzYC 1T2t~mL&AܔtkJ-:8eqV.% /&Wc5|rZ#:Ifa3?W'⵱RW/nۓ)rKFJo㲸;G~+$>Q1-G^iFl##ff}XŞENJ$?OK:P\bueɅ$E [ dkSőL00&40,҇{w{2l4]:2 (UMCjKYN<.TP[2V#&)>#Lp#WJM Y?IWqvQ{+In$H+hgoS5AZv҃p, prA/WD#a7Em"&Nx5ҙN V pGs;z3^)/aq t99߅%ѢCV6=M:kOK:s0ejۭf/{ go73l_UM]VoF U[I&9pN\䇀"&B՟FC;+sGk&[bC;:+ p)G~A^c$+I+.}Έo‰<2mHL?+}x^A͌bá.­xe7R͒|h}.`P]9"1'|<XD _TV``w7ۥ쑙28S)F }zoFK_(eczhrZ|wzc#.s'\PjR#P%?+QPv1T*v՘d+ciga8c Zp2=fz!{|NB0(&&)L3OQ L38z@h#O? O|5Qi16>RRf AOXwTE1ҤLA[R.d&ҝ!#UnbKU)|"F\)L[I|qmޡ]ut'u]<U^\\zK )&0A2ͼG < H8Y:7]tp,KdI_4 6Xh 77 W[9(ʤ#1l⣿~lc>x]535g#:>GU3|4Q$9UAҦ: ƒ`oR`4.^>V=naqڰkE|-8y.la6m^o+/篂l?#^X!H#cHTQT&Œ ];4u)!JTr?ɾ Z܄D+3roN6sor__71uyЭEFE6aOCшC3Q)e`O Y0G1GQBhj/m$EImsuN}C׷KާZHǭqHڛg 6&ŲRS]36kZ̪P'S95‹ItRBk371Wd1^-7 `=JiM0+Dĸ1 K580-Ey0$Hp FubҘHlvI|Az)푒 1fmol ճGD)@$ XiBkc*pذqPX PV~"Y" h7 aΑa]IiNSLSc47_0.Es~Һ!۬m Fal=jˠ5_`c^*@E(2ǒT57CxA]6(2PxCO1VAe+_wiV egdR%Ze"H,|CxU(k Ppd(,ſ4Δf*¶]P^3[ye?T@$}DݮpEت\/l3{$_/˨\e$z~hBS4C,%火|zLwSf@x]3^DnKÚp4GBI%6:jD<=#hbla7=##7o3hv =M ܫohmk~KGl xлoqٝ̌ _300ܐѪe|WHS]EngB7Bcն<'=(GI/-+o*h09U7UM:i~6tϐ 5R<ץd1 Y*w.wLBgrFH'.!F"`|꧳Nw{ @SJ3bhrTA!#(jz̙t%r.%bL$2ȔW9*wG+Ȅ |.&H-Ų*9kw%KMطXazb+\<ݣ<]B|gdȸ_˿w•fk%Uċ# nmEaLS«0 eDFӍQhn0eZij#eΎ,"149h Eš6Uǟ:X-/-`3+<'>5;Gp@Y!kWH63NOjNj"ۂFb6'oQPotOSP^Sf*7T=Uf3z9L=M@!$O#?9kesG5H3jR^ G`ڐݜ^W;Þ!ݞJ9H)"ϟod z:{'r(ggfQGbB_aGam> px&O6tnR3[,Y+ 4cx"0t|1?xPs) +fwxgR֑Y4 &*gOسjgנLW7٫ֶa+ۋW%$JR ./DN=rw7W _LLܢcz[ V9b)_[=- KH _&[E[/0sQQBT@"L(ѫoJji4bBb*smymY^F#qqz1qy> ,D텘!.MDHJN?Rlf$? 7Z-̓!, A yHr`88*2T(Z+yPv D)95z܁*$ًb;4╽7D**X-T CT1|=!wm ;^!qE/1z'ְT"BZC }΂N5 r}oy(ˤV)[ZKwIx^rJ} :ʽ(WHq/0zuRAlŃHx4*gnPxq4LN9pi4M1z.ᥪȒrP)gQZqA{gdsceGmdlr|)jO }D9ehi?OBpeZROkMdxQk(~,}&V"S^ݲhZ͝tI˟0DØc4YvExiTB15-5ouUB8N4nY2H>og*$_N;5mDd> 8H.,H|{qyd>XHc0kمD/t>9.%}Ŗw3P L^7f8?N5px~(P<6a@/k .r1.UR> Bdՠm~m$'Vb" `,[899zڄOI Wolݥ3vH  l ^]-*C*:D/,_k[.( FBM :ۼobBɓE)قnCƚv~,iyk*JJ1UN0۞Qʗ|Eb.Fg6Yk<9Ht}ZmhF9Ha;LF ,##~hB*^rx-HF3k_ft`gs(+o\:.*M*x+t*5Cgf6"Ff2v5DIGIG`ʛ|8j2j5?9ظP|ٺdU ,Y;Η8uTHJ:R gtb1xilKR[2HvH&A:wգԘNw+}hДNAt Mꝗ|d_q pQ!o7;"O:5'˅ E'oOH *Z웃pFLoX@X[f:h f\4{{*R'LB@w*'q*() a oK3Ɔưjj5S7,zc HZ0LHs2ͻ9ޯX'u}?ma[8z^u|>.ĵh#pچR@Cs #Zt 9`F y{E336G݇ >:煏13 0@;wqg #+ SˁxNs(ditp;m'ʌ5&dV=4jߡ rه E(g,X+1 r :ʲind|t7揇1Ǒ;L82aв TWEV1۝옚K8o0j\;ژ.֮<$6RRJո)H.Iau^rTa^idy {YB]:uAblU/.}kaԖ(9٩A0oZ,-QPdQQeUzE 24iԛd;&ȗ&K f-!xvMQ0tU O"}XOGB2-.o/27 rU\Bn{ĮG=gH#4 E*j*7+I j9!Q]yUUh7"ѓ Qݡ؍2%KsOb1~f=YmT^O52iť`U8)P2sqP"dXOJKUts3IA5Ѻk(HMZVx WTv~dycA2ipÊٲUf^)EE)#3nowR5!ŮYRfp 㨝VqXXr\!*qL d) z 9iHv]ۢ _h/8UlRW-X>Dg2MP;r[-r~6^sd‡I.~4I+k SAum)緛"Zl}@9g]%@vPX]NW^/;{uj̡&/Zt*CR~jҍuC~=8+_+##޵$$ Qe SbMҷziV( iH@jA [Fs @ ?zz4_շ?C#|xǭÓK'ò3[ ѧC "j`njE.Jl6.m6f)*fpƽ}mnݓNME+}w}j1u/~]9mzPlf*I'L'\W0B-QG:fx [YtEzx +'WצR=r ~q[KCoWK~Ac |dM/[3%otw1m#ywpf죈  e7ol΢nr;O%{[on ;/(T>(a2Rq?2fL2"EY1;' ĬClͱl](`n0w˜2r0q#^fʥOB,BZj2o6o_gШLr7ePM ܹf##yO٢KU@ [YlUjDÃO5vwboH@DFiy$+ Ӎx3&sGn2݄L;;m_ŋ{)mmVD n~#w|3=Y*jU♷}S9#~'b(^SNΣ- 5ߥՋċ>)]iro9T Z4`db3ѕIA"X5?8d:N.RŒ+GuL}L0V0VoD(ͤn;O Ԕ"C场XuQ:FE=J_(#_gza#5@王ih;5]ޥ&X޾DC$t} h8eΝGg))B G>M|?L y-)=mLD(/!7Ih=/'WKRL:UǀqR!ܼ?qƫ~}񖝮=zVo4Egԛ.(2m T{‹."C¿t'U`=t#~P ޼o~a4O.? ߁4]p<RAaj\PgٴNX >k:nObu?Wh;7kS@oFb.hu|n`AجJhṲp_ Wpߛl~I(Z L/fRx숢0ĝ&ڷ[Us.bW 43Go57کlveWzc/w"XZYKoTǻECr=iYF<4`͞@cCooϮFտJx |uB+o2Aho`iGς4|Uث|-VgJ~rp9j锐İARTifɶvjNMi%OsU)(0dVᯛUᇭ-۸!A$TKLZIm˶)l%ȣYb1-˺t3KT0$<%BL霤HQSHޓڹ= ;̵֛\:eEqe/^pֺO-5>=VGT7 ~:8%p4=rWŵ=47n5T[o)'3=%:l ]88+!UtڹZ{5k;۟*=} |A5>*22NB:ńYxsj8'Tb>bT8RkҒ+K۶wH`!wwwn!kGz:53bQj:ϖy,p?Ãvuhm?nYj07CHC@\)D3n{ 3bYu ʰV}reG }d{77)J$)"fξ嬑??7gW"uXg˫_MH۪@8oy% O+ "])KW"@b_5"4+4惶,hR\&˺7 3P)rkeBatv"Y&W h.U`3էDHHCVF_]2%mMm[ˊVƃnO*BdZ]dfԙȳ]c+dDۿ,Paa^mw 7,+҈d>SOJV#M>.I ~B@|Zn02}pK8`rH"MPz=vM]e(k"3C!JZb|_-Qlc7)لqĢbjfc[%ZW gW}C[.Ӭkmk}G~klXKQbpAsR@ʼi]pKl}hߞ~x|G%=Ǥ3r3_ M[T;uĚ.N(/$\rYw88u($ӻI$_RD5uD/]],߁Kz?ނeM {\E]0@kdZ\W+yKz=salt99.z Ұ[&,s;/EZh7!ޮ-ywfEz,O^X4Ւqդww/5 Dq lf;Ry^#>ÎhrI )RrFfw1S9A>1 "sZFXFmܢ&Ny;h/Gm=W&]氶8Gt7l-^~ K'P|)-.Kb(ù|`^*e`5W(q%![Jޮ٦Uz %H7pfM2:MQU#fbt2dQ}(kABJrQ^MUwF#4ix"Wj"@/U[VƧ6hٹuԩ 5EW7[^eQDPWnR.]LR R{?S{ ̼ɜ%S(;xcS܋"*F VyiR-[^D˥7'CEcx`]ڥcnj|&ӱ@_`<\&:x9x6e;kEsHF8e> a xP=zbBG[05?':K VeQp7Jm#xazST5Ae)2#ǜ&>R`'96oMb`Z{ '9ߩ1j\tL @~^bFz?ӦT;dΎ 9ewl.u>ځaW!.HaZa):(^Ykݎކed|p=ֹdBjkW[#Qj[y dg"Q7Hi ,<:غѾRlY w&vT_"( |ޒ %}aC\##,sK=KGc`c87Z!H}pNkiz}'/*?|Y*9} Ppn(HD'kPc} D@y[L&uN>&6Ѕ] %7[;Re}ﱯ{ Up:# <&WeKgAW cQD'xo7(*{4+} (Ɗn|gǠ+Er:aD9EW@t@fsELP7Đ%Dhtmbؘ>XZ.FSN}S̩Eod+>z|فF$'jd¬QA{=v#i%+Y{<9o=jC(g*=+of~X.3[TlIIe=I -n?z6VvPYۏa}>߃-&QIm SR]A> kA&bt3 v}fA=-HhU0Tcݜ%_[>WRޥ=&nE^"Oo?Y.ܬvp=Cރ|喜r32XPIadck8Kܻ/MgV0t\j^9%9;ˣ1o^R2)n Fi׻ HW4 ]/AR+R Sa\NҎƈ7g]5]ga驮n߰Y&$ ,l3dJ,^.F ,n3v5,Z'pFL%*ָ2ɔZ%kx+=Їtt3ױkHL=3I|v!'X)Pch>˟'Y>Pޅ+\N1-[c0䦉$d"7`}4;fFByYH 4[Ōk^9>cCؕ;8⛚"11n`B)!ZNI:&<' vw`gǭSy&Iwt\+oJH̱bu"~K5:73[D @..]SaN+܉g}ba&׈8_hqkM:"ŬOVX=s#e#r`W&>x':k?Oo `7ǝNod$% {IVobML 0=%2(l| h1jeRL_RfaƝeͤ'_SGi`J NdA\Neun%]>'>I sw;AԼXXX<Ŵ}Ok8 KKV{9· 0aUP 軌j *- (!EEk }4ط&Br"*3ĀV"Y-:f!oMzZ gPxaU-q#yE |]CXh/Ƥr 4sj%msA~$JȌ0V ҭ\G' Kܽ  q2Ȭ"VTQ>88jP:CoF_pO#NƲukNuRvd@ܭ/Cd+O=o/n+$"!ŤV*[Wg2U.kp[rP">ťGgf PʦKs w=@^Ijp~/wOn5+ʈ*ʑ#c&INMB3In2+VRCk Vh` ?f6C80Zm( H/+y,w{ W"޲F{k5SfK.2ϕ8I"pdHʯuhL{r ]eC-gG%U!_fQz 5f|_^S~;3tx豤8Vl3MYZ(3[+RW:&S*V|{Q¯0z|ych%Dо%$E1/ddn, h@98COcGȗ%Eo̗u z=ߟ8D{BG Ƹ׼W<·5ykwf xSd85|5dd<ܬN!T¥I,,Uٕ~:T&ƞD4f_ZpZya>ob?jѷPIa%gtY] S"(&DxKa3v0` -=ѹ+U&$œH,/ƵQutEשּJlbEE{sʲ|-/oO~{K[8RȉzgZ<#Һ,c39kN{.>'.m`U!$8$/PbSvJ;.ū=PEB3{C{ٽHqvQuk&~ z[:C!>JC*XO*%T`KyS) Hx" 5G05-*_ݹGI8dJؽBQU3(+!f5^GD&j)q&M |Zߪdcb[5<7Q-̮fkv-Mo>T΢J1ۣW撻G&sby/>lB*9+' h!P6P11ym;JfC 9:` X"BbF~k+_GUL2Teul4ng#~ְ^t]IJuQ7ge$צDYXT!Aʧ֨X :3>9RDIpx!s $G:>YCdHujA'_F&;Y->(ym*E78ұ] _+>" is_#)"u i}Ty:KAJ5|Ӈ(` bin5xo~ ơ;N.6BdG-sA2v99|vD70eQ+vN.`u 4kx6 h<DZ. ,> 7ieN!ǁG_WLU_/ʔwX^>L />JACpk%cDK=@:Ճʕ%rd[/_$ڪ؝2eVqp> vm}{Zc<Fv.`rGy{Ke1Aú{լ3ȡ29˽UNkX7\ %%kLt} =k_ąIU^|_Hc1z&",/!plܸ0((-i %ȐuX_EjR[E8aQCV}=\`263Ȱ[;9v;{4k9Êbn D3, lc=\meuʳQ|o'&Э[>}FDe T ;_h)Ȑ}͠$/4fbO!~buPZSH.i7K`b j{SOaeZ'x\s%h!&;α=HG?"%Uf55~ kGF CSh2Sr2S,2})ZgfPDK4Lˮ9]sktAK"NGQ'Rw'nnu`($'.Sզ[`y7RF􉱛`>ê-5{>Bgh( РH}AZM}Q1P Ro":VZ VZIV_"j&T/E v/".k;Z:v$sX H[a(&1Rj{s spLTsXڎBOj6s,v3̳Ua #uΫ^{^/a,x[Dek^]Ըݫ?$l[^v1 ;4'oɜ,dU #*ssZ® #ֆ]¤B]Y1[zsN>:`{P Y,]-ñHA"S;v/U+#w#hef@J/b=S{K/^ 7hl 5wWc?f<- ' اR(, j]$<{j6g%XP-M`}EFp.S':0u֖Ŋ ##tBhFn"ۛ/+ԭ2iu=UX̞sAiAg IR?ٜ1ťg[F}c}So|Ce᠈ O׾,c`μJޓwT—2ԏ:Ff>*"@xqX>:*%cPl-X.=77gU ,͗Ʋm}V dN(\h_VI=N!$FL $I0}. AZOJl\Y,K-1\5۟*~_]靱Iv͈x ^ MOyW@.k˴q"1r$]9Z:2(9\9%^H(dR7 , .Daf %t+rq 4.XY%qg9nd/V(^4&L{VuYm磋^E20R]jrT s%WA@ ̣H'׆!XBۄuaFNLD0}=h,Y+\aS9UvMM-m t?rq4EV}0IXgIQ;"j$DooҕtKػv&5*mmyX0Sn[K] &sf,0Y[uf4˓VJ )ڕʋb1ˊV sƯ r2 dsMf5LRi֒0i 27[0$eAtUXwL~!WhHDˇo+0s_^kb'9` r217@k~Gi.&g N)'>p (f3b$՝*'A=z4U*#NZa+xhX W;4ZEeZـs;C'` a'4{[~6Z[5_MR3{wx󭷲JKKv~4k|lRԺhv~l8+u!MUM3A7{e`d$ٸݸ;Og^^<8\KaYȜu_i3|ˑ;V Q+Š\kK$ȞY\ p;R, Z%5MI^cK W i!]԰xKqr#:ެI-deZa2 /dYPfԡOE2xtȶZ3ȶZ3ɶZ3ȶ[3ɶ%5ɶZ_dQ LlZw$QIU} O.&_%zl+}cgT9_GXDJY+  Z#ynyI&0~ȸLUwⅳKMMsҹM25٠ɶ[Hq:D.zn|9+)ȌW hc@Ât#K]AtB`i.":b4 ېgո~Pg^99iւh9`9x]FuQ翜v"ůJB9Xlu )dt#[qQE9/`*,#/ס"\!\#9{[}qmn7^vÈĝ\:A7} #Ј;H8I7qIdokA.%5֘uu(fM+0[ѣg>tkx@Cog"{-5YAp:,s̜!L\];:I[<^ Eᰊ4"v|̦m$B!Rϖ'kTdwZvS켢) ŧy6&L}V޻8PLҌ@M%p.{ORL^ }H* YH1Td*8 Fe>qHOk)gTu, . ]sH|FHիw]@rZ4L8?lN18]Z~Fr ۴.Edܦ8'T w& Ϭhci$YS nN/_6c!cE4V]wS(})6 =6 =SI)P$L:wӛ́C엃+9r0VWOԟجm Q"=m 2FQ[Mwv(*WΎq|\[eD[d _uy5opJeOn\?DS7G"Dd&(鈠@HVMAS̴$˞j5^Gi`|NGQ=x;W8UE:r{Vwk&JBsL5f$2p~9G6'DI2)fW9 1G Ɠh;dPԴ95ϭ0S3m/]qLIUxGڪ॔O7ܭ@Av\T5ߤYf/] ye4f8^0h0[}>]Gٟ&T5kun6gSq}AD1/ol[#C,%XYgr?~`IDfے@yxuHOnf];>l K!Në&W.%K"mPr@(yK}%);Wc.}ny͉|8x sFqRg/?'0P!fp Po& d1v5"wneZ_Prɻ"NZFdhBVuARYFL -Dt O~*6<ӴI+Vnj@mt$`>n]G1m=k8EƁzX:X\Z.Y]-7<5? 4yskuRB~*qp * %R͆|2C5JR:0^ꄻ gSRlQmú;t+b;)Fd4 ߸,|*pK3Q:-e8ÊKRU7\z՚̰CVnn(%&G px"mJՁ@9ǥnn{f7ԕD`vEo _3m1C ݡ @؞,t48ѧ)mzy% ոj a@d^LQ} F4Adǽ)vPGRo>U Bn+9x[&GֿBҿ|L5-ިߓ:MDyBA:l|7V+%&6q +&2y050{@@|o;5i='*9Xv,+(%0sĜ<6jf'VK" qD F9fȐ'yUxJwƽX10o4MrLChhoS4ݥ #I]nS7IryK0AfSyab#]0*:)ʡs#ǪÞ/?3?+ ɰ=T,(2 VvT!Yur(ㄫq{QQoΏH1czvY;3L6K. GnTƄM=I{*# >`p{J).HїgM-<'%խ_UVץZ6= 7& Al"zDW`Ex@.kԪob (+. )@IPH Rq^'?n |7DLw{-!G8߯ï~C{`n? ?*I a$-͜mmVw62R[:/~!sӿ~~=ϴH~JS'Wmi(g:?`N#ճA+GJIױ7WPoHf,ˏI o1~MI!(E6 yB@*MY+}Wux6?@Y!$*FwS=_E hۘ9 8?~oeo9@Ǣ#U_<2/&a xuw࿃z?iMO'5*L"]&ߝ|Cw@@C#߽]${~8n??@ۨG] PCcYMc|(vP((MԛI[h8hޣԷXnii{ǟK 3 ?<=NF^;Jr?#B-﮿?"5ݟ>k[Z L^O9ڭ F?3)d[GJhKPgr6?U9< %GW޿OH_ud>1le+ f|/I.O$iCSn|(@+'T?b{ctP@'h?gtzai3>_D@˫? GeEhEx:z8V-4 hiZ4ݮdpw{bHf2xW.Ev \#RzA%]5?rq.jm|HA NnmhhfB|s5W31vN/.Kb13 ?/C[k ȿ?add'ac6N6NN6 Ϛ8IS?kjhhbnd'$p'ZzO:;[6lA\$[yUo8 sFN"N4w% 6 XnloB(HlDѶٶ\/?2{ fXJYd9\#Ivbk22o*太_ȝ&j* &%$T^$&k9#Cw5Sa@!Ec'9}'3[['ߋNRҔEG~-jJnn EQ)cs8]]xҪ+}.OTJP0v ԛ/2ƸCk̾NO zŀ.H˫l,K6ٗY^v~9Y.$[!ve k̑! KF[:8*` 1_q`+تT-ΚJ0+s#r[%#F$edp)Dy =iV͛W+#mWgS\aRgdi 0UgꔩM>tԬ*Ԙqf_D!KYv Y\z^ s;rŕfךaD#[q=v Ved|_ ut80}AdԎK w:NEUנ4tDZt|Ib!y+ZҠ<^ /q|7isG@P l'.!X@!Cq&e;ւҫv'+ 86ۇ+|4ƶ3(].!>ҘP/DzF&C4 p۩p&|w<#üN3gѽڂkMs?JD5#0@^WҎ3*?X;+FD7ȋ*;Ԝt" l\s2,)O== jP@ήv`?9I@[Y#OlPc.iGe5t6| 顿[ Y:HO;Lu03ٴ ̉AP` eƣo;ak1SA(>|YRdȊ{ݭI;:g(?å~F\6쮹0reH}-@&TdDFRXZfYW.HiNk]1f: jΘ0F")/JV~w-CQ-tCMo+ fӤB-5NYAQ~c{v -(-QF6'X`ZRHlR<8Z@?黆@gb s"9~j%K.:!Ccř$"S "rN֒P@n\n&۩'Hqu_f݈HA8ZG/ljtTQfrۈ=y;T0Qgh"Wz$Ui485gXS'BpP0}2ș8#6ߥ|_+R/a+ !aO5tu*|;\oo\Q3DR\PBԽԳ1ZGrC_njKs/&QǰdڦJ.ү ^blo1?F;..~ػnE/iҾDŽ;OH%iDU^>>ldA%m{E[gC)v9rmh'Ht|z!^]cseN7 $0N\c+z3v 扙 _8]؋Mpv1? jYwG ꩩgDT^U&#?bBfr٦<Ei#Cu{w|-v)6Ȳ1mO2=CCҙx~]Rs6F-w'ΝȬspW I ;j7cI^l=;n'*/ߋ<)hhFu/ #G(C*{qQ= 06q7oX SI_c$m JzBiE%a2ka%+Zn>)b_``aEhS)"{`>pEJ$b@`+0)10,TZR fy~cH G*a)Y[?%$K~ mm ~J%ߤ)KQ7B\l G 01t^z:F:)Wī^4Ρ5σ 瘪 n$ K ^j&mP0;9<;0.Q/+'Yg`ӟYT[?o1$5b)8aiR$dx9Qܘ.#+gU*A[uJ2N+`/z`GY!b5כ$"?T Rt@`mGsEc(H0MAME=GH&\53\uka=ߤz28C|eV 9㞐j[9I4=cLD䍝{&L,M+tNa FB ΋R<30BAlJLqsGq( ؖiwqR)N>p@gwcWLAB??f|h]Xڮb3ۆ0+_Jr7r,K$gZMUytԒmBAboki@??ܟ@K-NFrþ{ !ʅCK\Cͩ#FױKXUӁ;ԍ=< YC! v:]C_D9ˈoCw!+wA[uZ*"W܂K0"J!+/.]r/Y~\ذGgy <_>B+n}짖"F֛vۧ^ ;t9M 1FW17#F`>QGW͡tk|cI9:\X+e`AzGglF}U&zVpkǪc{ytypYa' B-ވcq"EhESv!i ؽmp!1d@e)$p,>kОqvk@]ݢي<=L[4ucC9~aH|;dl`y{X) 2c±BU;*wh p<2@b>tjs{zĪQĠQogQu<񥃑͟jVj4u fq}Z-WnohhJ@6}2w‡a:&dmK-Λμb01nW|BE-fyZy^Ob,@/y;h@_.(Uzخh=`>mhʧߝˑp%c'BJy%І u!c~ l  _l'yEw𻋻oPL׭BLaTJFtJT6B,!y%|YsJgu3=CW.ak=+"8֤|A45)6`7NDٞ-z.$FK4Mw7ZwC4@Le04v$ЀV"UQrz0(k@1og|Vt[$ aW?j غ=$)P2ISNJQa O;muq'^_}}5yJk_VaKS^͏˯7¡>o!T0LkV=} ʑZ'zтq87y(<;`lkha-S)Sc_Bz4!p}P{vCyOn݄b"" 68P+`yՕ4jO۵!̜c>d3I RXIէ'#xFA:FNjsV cߍA`uH}wh@G/ ԘkZb*ܠ"ĩh4T}U/nCD`c+֜KwKPH,%F\QC qAUbe/nU-x ^_ 4]V/..6R.1BGuc/{X>EH"$_BV wAbO=HlΜxNM;ɱU9]M-EA=}"]lQ'{̗ҚuPj}__G8RvzEROzfZw;B[s 2QG,KtELREEh9\F΄Ў_m0wrq)24 E%;Vq杴T5VYƴ21DjLuU>T-_ X7UJn-5Fr wИޜ^†Z:4P0@o0-Qq]O,Nw10/77o:< ì^`9cʽ0htWHf;-ǥ!?HG fhh-a2䵋לliDrډQ`t16_uehY;+\, C*nLO Zr@CIOL咱.>) gwMC7.񭼏@_z'\ks(@Ի|P5OAm 6msQ}6Auْ*P61ba/N,2~7Y ^G C+qRl W=kgqѫ5zRUK!紦OmwT ukHE;ה- /j E{Hbp2>[SP=7-[o (qb6 FNhlI+C.o7ˮ@휈yJR{w!% 2(`U6ġ5#^bY EӠ0m \^f<Ղ7vtJq_{2x[t<5)P8%fBɓ&?3$-p(M!?j!k c"SyƏ}P܆ֈNJ#hT-񎕺ߒTLT~_Hv..x9=>'ugZ;m-Lv铐;R陙[XChId|vE = y,V e-JgDHҳ[_U+ M%[yf]Dͯi4X~wqvo<1~R* NJLcDT4CRz$\\JFCGFL0ux|sϔ&fq+>'(FeN!V&"Jl O!w*<vO (zΏ( &ӳ",("]OaoGK1gz-zL^YE*b2Wm]R}ݼيsF5T4K[Ѻ4i|A"jƱtsU#$g:.k8#CYW[$S=17mCG.մ)BK݄,q%L1Sd XH E9!8Y oU ~UL{|}e4WO ~2vMα2=tȟb!} iŊ@YY Ue"SB@/:6|:xXԺkc(1L?"4UwW l3imw s榖$Pwr@,,榍B%(aq0 n.PG =μ%h+Xˊ08FJe"+fDeQ1,jn% hAf*! n|U,iRZghVz;a2{Bc*ebF.~ 76U}/6'xD_fζj/ B vJ G5 B|Q݆֨~c!g;ؐw3bϻ~G q=^ ?3tZw6L6%J `B,3w2I'Y:x=܎<DӏЌUu4w21D'InL=sLvP޲K0rB9֯$+-yDf%9tDn(@GE?ms2Gcqgo>,$j<}O.D#3:T 0AoF"10#2Q"K_D!#判^$DTȜ?X1iM& s<}4;ycg?*EIRf6`k*m-naڄ$2hucA3wCV nAg=rH*JlH˃'ɂͼ_luoPۼ)>S(AS (8 IT,7=$ELIւ JT}3ua]1װ(DEIAib|G 0;A\픝n5OڵT0*Fиzl=W3HR [- BX@ V*dv$pRJljjxadCϏp? ˶W{8 [YiNx\FN)oBG!oIFzeтoܦF&j,x|G:c|L]'2U&H;+ߌ22ɟHV@bSr3!YZ&bFiB9O"7ښ\?=YB: | ùMRo QG0Q67bu[{>ij8ݘnr:M:h5%@ F]߹^K-m~ZMFLR^0Oe>wU?;|]R3'p[I8Zj >W@ %`e˳眱P|-rr5R TV.b.Ƹq\/Ek qF|pM:a`0=b")%B DXQDRx5fɪStDRFj\b2+@bʨ, Hj,֋ [kN71# ;(#p)QxEp+ fatyݶt a0(- T3&P*zY#ͫs75r*!Ҭ+DG,4tBrA2#FW NWtݨF>b#CQ$9@f?<=C2e mX>x<獡L:5^z;PXzJW)NI)ϧmggh] @ Cj@# +f#h1-"MzꄼpY:M33~,i>)R_6d: jiJЀy_DbA* ^! 9$nؼE j.e2YkIR6՛Vjʨ !Ҟ 8EB~t^,@LxpOFF#9EQɪ8ad)Sܢ_eEGk;uNb.F|#'+eJ1o *ጢ2ڏ>'(+Zj5iaFqPaK94m MA7~b{>>զmmɯ)_4.H6ӠGiVUp>@8f)şhWm -6_zr{l{&/M3bqM$DIhI:&MHn6oNN+YvOM>G,g]؛z]ބ_tRűV&8aִ*5/m a]`1/Sc[鉶π > *جFg*U<w0a=]xmF!fhG %f}X?4Fbd};Ƭ}Hr`^ ^NqwkG7O7v,P"ߍLEeyù~EsPC==Q˘,cQRSx5|=|0 O)#CUYl̴vϾ#齮 huZ̘L[Xјi!~ {8eZ"9Տ8Wư.r[\vezq;Ƅ#L!'83"GȬ;:lC(5A,(wj@#RZ0h)k8 "`9彵B/mNŵ#SP9슀"HE`F nqװsF+oϯ]ns߱oFRcW eCCZ 7JG6T˅oI]1hS eCF&::$<<q=߱jO)`~ [tcA2_.o2g S04<3 vT}8ϊޟR%BowG `+:mT[t낻]~.YP2>R 5dfL# 0%{q_!w͂ͭ%{Q&Yƅ) _:1yTT,)298*yrˆ.8 Q5Fε\~d*lNI'7@8#XwS#"?k?3W/zg 1@'9Pp`c(VPk}1id aͥt!ŸN_/t?Bd @)ĻSӇ<2YilAU|:AQk5DU_xrNy >#KJ\7tM_X$M?r=k#"jO 4P]^]F2rf g@[s9]lq"od ]Niofq^_Г U"4Y Vٱ02VLsApjN(Zxqm`М&VOaDg_;أ(:kWѵpS`B4mz|2h+)Cˍ0 `˼Xu*\ w0N&OL,;)cD,ACf ݩTc3l=7𞴍G#";$~^+0}Qi r?"(-Mv틍>. _Kg>3ow[E=SR~;%|eVσ?]9$_UDŽ<c7BsT"8@=V\dHDdUyu&V!{E`BMW!a3ُX*0!g(9"H6!^|(-ٛ(O.$Ēv|bвy'!>N l^3qQ(DZM-#ՃFt e3~R͛ӉSym0f?1$?&VNۄbF;r.>ɟ̲h&)"-\%V΋+ ^N5jF>\jq" *_)B̪ &ZqGo_F?@ty_hYHWWcn156K; 'Y(U$P׷M")lOkˆR49phǘr:,iQ&xMHъWNl_ xU]~ 4D:˦zoOo]` F8 oۀ*VArF, )\' ֘uWGکKZ̵lu(PX:X$jؾkqdD, LB#sf?м(06112F65}嫞fAY`F}k2KSKG^,~wRx!S'"$I}V@o^0_kLR0_GY^6֘~&$%Lt' @1sNwiMA;Џ4&r5L%.rbJ29*WQWsݒބ_Ej.:NjTM&]L53GXM{b,7w1eLpuDqa`AM"E{H0qhUYgHh-)]Ѻz/&xŴ}T:ZT>^vHT]"GN$S2L2* wga3ؔVpZm:0OD01HD7n`0%c^x7p-.t<|A/Ȉ0uf2F*inX l@,S|_d]P`sCckjkl-{.K:TrnV.5ok7X Cϖԗ`D?8}b He N':%SB[>} 𮟃8_2}"mc!sN+RVDRE5J0PҸ~" 5KfK ^vdZsx HuTLh70~Ájl  w uW G| 09G|0MFxHT4X(:sƛM#)R?P2:X.aO[swA7)m[\}zkkQFGh&\A (;j%2+UkW(E+H@R0tgj&=졕18)٧8H\haI~6UNhu+sJ,*8-ӎ[RGt ݥHmr"p޼o_MT8(\eU0իf4>k~ٛ1aØ(Br¸ub4Gxtp.Sc4mt5GLށ+W `Y22zYe;q{Hz5 |rFIX^p& I>Pa>fdzD T$F.x5x܆}zHH-FzK,}7jb?l0iYH)XS4/O};Pc! 5`#"o5{*SS~+4TVOdJVwp}9/[Cá Dw([x[B7S{*zգ !@emk+w!~H N>o}k!;b07Uɫw!-?~ '4c,?T7^hGT|kpLAs4Z&Wb$)C#̍d8<=D=jz߳3MeWʑU?ƪ; _I!밥n^=Pq31/Nq0v^gy6^Wuu^z]ⲷĭ/hgz11v?<:+F&%lϭ!zvuիQV.&Y`H .좋a7K{m?4_`5]kF?#r[nP*1!(ɳ m'%aʬnѨ i_'ϩ6r7>z!&&0$Aݹ: @8_m_}hncO{Py2I!Xa) Q8m0W+#^⳨remn4?kC*}.y-ëJ?reb}0K@zS].ɮ4,N DB̵]dNa7m].}]18ޓ!:_s( j?\p\krunzF@?ZDLu*~oc֜E06=3)Q6U})Hha, ^!i4,P`?;M%١mbc#2rRRG1`ơ9nD`%EU*OvƼeS.4‚+Z y圠NOLs1 ̻.X Vji];@cZ.ozɶϣ$]#bf]_EJMډtÅKO"{ (-?B70P +61 JXIJ5a&kjqwdn•*i -Qo"V6osnu&Nq# @J"S"Y:go;CFWR^_'^V_v]CN PZ C*̈́=@BeHPd)9ћ^~d_ =ԽݦIJDaQOVAU#PȋZW-x?\ Jh"(jH4ۤMAC_@4u!V3%IhtVjJ4¾{Z?5Xط142g+$kvKZ8 93G mĸ}8,bH t*.M]Lz$+d!]k |33`Dnhx2nDN-6Q;-BQiq6}8*c$v0H:B>g¤Vƻuj&ݘ G a=r3-OZ%w_c3WM4_ B"K) u砄KkGI/`A#-7?''JH&2"B<+* cjJRtq88 N$[Vș>CϢ@9,s+5 f:d?~d8@LǪNiqȼ)J*V7=gJ=/Y(YhLWγ &OGa{N/Ӆ:B?=4M$#5'c |<,l,K1v:F9&g8(;?r xdkNS*[C -\' txD>TEI}LDmOZTΏc祭}@*kԭߟۉ ?]O~{X :Lb`!X "3jYb?nF{p1z&GI KyRhħEsiO[G[G0؄QD[kʐxe)Et}6M{F`>g1dŨ DNB]H0d>;)-I2M)9"*!,O_`Oq;-s,ԡ/|RkPBy*KocI `8ڱfNc#ȞY“`הV"Brϊ=8s dqxwVV†Q ŴJJ Cd#H/yQtA0 9X'µi3NǬ&AN8,E0Su -쟲w(]047t#Ӿ!3SmM.͆+qDN~?hAy cQn`6P#bXd]e^q#Q=!UMH dxъ7RmJQb3amxE5jD9iyh&Yf5$^ CH"5ìmgR&MYHp[$ݯ#7KdWpFΆ%Su$efh)ñ8ĥ`p_n@`ґKt&UM74P]*,b!&KM;ϰ؆@x #*P @ܗIldbzCbӔ['9*WYb&P/n4`j KT%࠾F] P8'9NA}tX} }(sRbSՙIoBmn<mBewb|KHIaD'l7-cY0DG-*Dyv]UVz<{D32ִ"VFG']-& ÝdwfVa/7_6&89='љ}}SkQUNQ? Z$VVS8ߖH'Z.>.SDH,PЌ*W'ZT&">0n,'t\v^ *&=bsqykx_~ )fYicTDSzךliE$p{6!XYS;y([Sɞgu~}aL)ڊ4%,@^'@ Dk(W$95eQڟ٩q0Dyn 'H~=]a^- ]Vr|DB5P!\[cTc,oXeQTx8[utR ^dNm)r^R_i${j\u-u TZ?IkC@Pv36($;&L.. @ lHoW9>sa ZE 1D}ޢ!z[ZşT߼<ϸID3!p<͉?m+`JM/ZMMv!X[5=![҄#:CX7;0eۦg4Qǩ*ۮ]^ɑ9i~b8]\e0]/N-C(\Ut\c ? PX(o%ܕz՘+R1i H׿Fa_Q~}[3:bu^#TC2nʬ/Aj۽: J8r6dMn>tXU5qetg}Y^|I,B^x 2^3.*t& MJj9$wkPfGIbgזPCr-'59E@VژP5ydIAc\4rd1?A*l79WXC+~B1}6S"(0wjI7+"|rYcj_bDX_J8*˚ GgQ# 05dۜw14x%uE$~ _D"Y13ŻD~T N63g +S8.P~%Z|brPE [Og_)\ C4i聱g?ɯ5Oل}b# ,ʬLhj㸪=2\Tu䢪P7츊doإ!8tqLN&c[9i:N&$سFXFBRhIyZ)՞ȴ ύАR_ge"3oļ;S@JBrt+2b1:M&:'Y;>"mO iUL46T+8inBRʓc)5T*>VD9AV".^!Yb)ȼz鏂ywը0왬W0)B}{c]F^Xk=NTx\G+̪!.U9C(~ϼ!Lf&IۀMi+l9}L\5kY,̐b (A-F$>M}NӛfW{ FiQl5w[ aZi}1Z 0#gBO W[ *  $tgs/AũNǹYS8GBU]?2!m u 2#Gij#0˷IM5(dǩPx vF툐$я9p!VsXV9oV.N7c7DJݐ.|~ yh`_{j%rA8| ݮ*Mr -'N@DW("mj%9!%{CEP\"Z76=1P7>*ڶ?&r#eƷ(b4{D=zzh0P؄{2XctruDR22 Yʽ|im)rܾS+CV!tP}EAP@G5/Օt+C:0bݢ~H8S mpLSkK\t"eX2-S;/;gTpD2ƚ q/L~L/;Td5ѡRuDᅚ9ns|^͡4,`rFy ,(tp+Vi1&=Dࡂ}q we]KZG^O/7=3eV pjoaLRK")XO&D\.nӥC_ukFan%XgҽmK\܁8ɕ#k(6X=CP)b?Kt_m 폪ox @-V4g_ %PhWr 'JUE7̧_HɢG84vdNd]GB5|ah2)`FO#@k@o x9oѓKI|5Ɔt@lQi2`u@o3֡G/ݢR169R2)K*I*[ zVStvђ˸oۜ#]7=˾HPXiNvkv1?/l9I׊ZM oxO7TpTͅ0[B H*9B&vs%UᅰCBC]ՇyLʂ$az0gdԈ[Ŋw!q%)Ug4D(@Tmb -}60ZYΝ6_ʇŦLls+ֵhЕ GW)m1yF'Z(hD`-0WR)zTfK:qPy LYNQJ>f]8AG?T`a!%auTJM*K)!컬f7R8E=6/8c cyd؁75F_r!~,nN#MĨ*o }(DB Ğ%bCfF .$~ -Fܓ(#_%HnґJOj4RPUjϢ(E{rh<ؙ9b!E~@b)}c+Qcv[(6 bP,mx(ξpdJz,@)qS-( .˼^s}-N'Ӡ˚y; +E&ZI ⱴm#qg|6P !þ#7wRБ*JfV)pE n@)IɉH1i U 5kHb D^{Nσy(p$C!%pYkQk w;Jz\5ܢ;s4~ {uDzg\W-H~9Ŏ]`lkC'gcsG`o$xcHϰȑKA}1̵ _k]٤!m φ(0չ"u4# vRj7v#>}XfYt? *VOʥ*뜷$pyTO"!53x+ ٞD~gnpi 7O()bҵWx-z̤0 2=ѱ^k`RFd3Œ{λ@`&S{g.+)~Lq%L hϹJach;n$øFȡ]poWfQOD1D=^(.ߺ<3x\sᅓ2Ygbq?ipAWw0W(:D _qgO1.=[9Ņt6U7.06Q<:XlA<('%`'GEuƨ$ȳXss?k#DEl4K!%óz3 6afwrk9bIv?٪O+w0=/+2|>UWpYxD^=Vd}P$ +1Q@3@9xZ=7)IZ Fo;"[N?ή{3U?pƄK34 MSZ>݄?b&GV8cxJL'}t{۾sCQA:]tDcvLmog0C3&J$+**k箣xo1*LLYJQ 0g@n+@a|s Y}:pv7)DఌYbd 1̙ _AM"a[lAT*:oxC;}1;1m O0y+ sZwd7=&0Es#( $sGn[5+)-[%ȇO˽B;܍8< al5 w`_L͗X0Pe_|b/qTu,HW%:΅2%9!=dxJ m+%yy?VɆv-uiϨ@gK^6G7a{}3ji!AayJ Iad&L/07FIZ Bl֠Xb#J iyrt1Xh9y_I`⟰н%-BV{3Yŷx(a})wa^|nĴG~S2WB^9|`Ėj6e;DD27pw`|;;% ᶊb}ѧzv:_8ގU_BBjr^_A>kQyA j#e%߳)_?g-vsr7ǟtst{[3JXS.35L  ,<`PO% R\69J)UitsF3 %:{hYꌘK &꣣rBl% d5!Y$%(z2Цx1C]vvx hou2[M%2G2mlu>%*hu۱vF*mU*h)c=d#pa턲%'/Bz^ۍeCVBVԂ2OfzKܟßl\0vpؗu{4J^)R{3`O5(1M1|q6Qt ;q3"2{U\!m"oo܀ɟ7{0+{_(v&!&>GQ2]! cK zaX*ƏPcwi8cUM#yRJ@wR!$:6%$PSCqRdMI}ʄĢ3T}zCci9iiיrpwmOw7@߆{'56?d>1ABZ[ 9>@Aأ Kx=_ZO"IpfFT׽(RJxs8oA("zg'Nݴrⵏm=]՗"8W ~m\5݌754^T@udmh?(m YM}1l8(?j󁇨p 'S+ӫ?HBCPD /@J5e̩XS|6ߎxfUݨ{ZX9l0޿LٓG @?m]fO#H@/^0U!ꕀ+ =W**q^iw*i8(0f0ui|$=ҕHrtNFbu ͓WᳫY=Å1q5KYEɓss[,*ƥQ_% mÌӃ knyy^ZVeyg{bkPtZ7]Pyxy ol#Y o7@z@U@*[q V0@+ң\H% 7m_y? ǑL,g9iE>|HeWudvlxs ?7/fO?%_AOQ[j0ЌOT`՟[-H?֦I[ _׮WiײWie׶%]u| ֺ֟{/Bs!Wyoz|/:bBQߗ y/$-{#~!#ge$#/ p{!'iO ' { mmߣ - ?}_H)Av O {yYC3 :<~D}^_hYqQP3De7z>/ q+{X~1yYCOJO(y>/ 7{"~ai#ޓk  o\y "=p_xB>,z R F=_p6~{P Uc`~[.Z޻`_:'ic=׿wGQ_B!23?YploxQ ض9?W66?PKBl70y#K)1EnhancementExample/lib/db4o-7.0.17.8420-tools.jarUT  7G7GUxdZP\Ywwww݂4[w4K܃nf3߮Wݪs{ Ǵ@Rє`9Ta%ty,4L%@@ Mve{L r'̍U>:Mv !;besܻzvȉ7.dJ]zZ#+9VKT$6Ox̐/ChY9|@oWw5QXk f/PɿWUy$l%b)m)!ݻ$:R8sVq;9p?,,x`GkSGs0Of~Xe [ZJfca77@54p^| {nnmT:L*I D!TxxzqfwmiG1}IsWhxw zDEg}'!8"̝ (q^Q1| kM7T |~Jds ]`I_- Ʋni|ޤ[`}DlOdMtC<8ϜTS:)at}ˤiZuj7ޅ4)qA,Rְ JA 2* pDLUzxKߴ{ߠѢ@@v =aIuw)SүrRr;|NNUw I(Sur"ᨫc3`sr%7E>%s^cv!jMݯ_9]ր/E B:nTb[яPjV)A#+c.3+T>+҆H c+ UL(e.bOp 2T:f'ԍ@4,̣.\zp,4jf]0 Ɋ~C׶->:t& gսV=8e"Xa,Ʌ:g;&j͝隍0cu8p`'Nk2Uj3\sƏ`nnak&ELArw;v*tf+G--ȟ&8qT1k 8Dnomi7ӽϾ]# N9z|}k6'3nÁ]0ObiO+"g]gT(:W /UϟՔ7 '1xJ{-bLXӏmZBhiI~oOQŗwQ\7aaEVR)#~{${Ne/@g2*VZXiz%;=+]roIL .ָocMm?3F};5s5axېKƤOq|~F;vjj, aS&s.DyqU93YeM2f!8ʧ馆p67y ?5Ii|s*yۜW@>SQA :0 Dwk%8:51mJq)xdoI!rW-ۧj2 L:%^tLEJi9:\~[2 iTQoul)xh̅Y#[ l:mq,UX36)0˕7ϟ0t.oTFX% `D‰> }&][Ϙ"sbS ] 9ri|Tmʒ9śf {r=ԝ^}XP/?#wP=jVE"V:Knpk*{/ +nZN4åƑ TpDIўRd YkQ=?\SWޫ4Uqmq0 =9UG ҏ=i'eO˓w&04F,ኦ"Z_\fd901 %2͞/bKSahD&uQc2gTB!J)7.lk|WZe ]X;}[JakC?W4޳=A0OPK(3zCA L޻=a@[S[YKA}sy[Q@AQeΈE2{2i._O%&Y#JN˿/qq̯P'vR}Z_F-"HEm HT [Yހ}TcKG_묥W BnKDNlJS?U/NXs"| K0tzxtpf (^w$:8N8ܘ%|;GM;6_P&|.K MDUnogǀ9zc&cy=ɾ| ~+k66CN觱f%& wq< @z]cywޑ6@wjx`ET{8KOܷo>mRp?1Id)Xݤ!m:ʟUQv#dWZz`7gg鵂wXyR * B~lS{Sjb"Z8 p :xp&7\ku|Iv+~؇ñe>0sS|d"|QXKSf$M~P\GazV:/U-HiA{;djiʓ>;:r363)R~(3;!KQ4#\J2 ^b4a~BRNXhIqFS߁h{Ze״2 :c7 Y9#;gQDàΫlCu/3*`^̮jiȏ +><U$Ik}"2häBd>ӎtL1n+)rz,lVSp`EP:i}6k8.XE)a%r O 1MyYU(wmvL %vF=t-tA;v_2E 'T3sgr`N*WT)]'6r/x#40ze XTj u[HH7gIqݡx&lUcT8i|کEgwqjc,dɦJhqZ=?ikl9,`}!CT}eXT@9"AJ,yB0^19^pF@Y>^Aa񺠟ɖr*zLה& ٚJ=l{`gWZZL SZ`1N:z|Tc&mn/hFK 5.Q[?'d>]q#sFVW@IU~M6 <: %qdyx4 r]ro>Uu KhlؽGmu?{`!zBԨnZ0WY8^`[UsǔRo9%MUۘ|CSUޢn?cet~Gu>[q:4Fr:SIq-A۱:Kh~^*!~U]l8AԋF%"~0|i cvDx1x`[x[Ok,V_|5)Yw|E~Μ>xahLWO05+oҤ@ܠ(~FEAq0&*AJ}LWV'7..U xtAˡjfюE˸3sXz؝ J.w!)g}-zXN}rIE#A,'bVe㉄9j?F9|ӗn9Ucw`A22Qϑ̠q@e}q p3V,$ '/ ISs4]9,4ɦְı:!.#A⳯}/rkw/h%DBH8pOеE1eM@*?TI;]*Xc0&O&nQ]̗! @ESUkqC1+ITwc}2/%NauRGI;ٿ(8Q k}ՀWrzWcfTn3;;P\z kb1pVS@~EL~y/8xp#<~{#kv33vQSէˣ,q *BUytɊovɶ*4J#z(o5"G> ˡ6=se;M]Y c{I󗕡=-(BQP0Z/g+.x. _fh2OL o^ZzNMy@gٕ{-<|?>nlNDACk7"*\^7]"z(b(L+#jN$+^ʙR$ {Mzp֖GU asyEAHU})S؆US g͝3N^Nk]asnjW_ݭSߺX 㬔rְ [= 'MfgdP&qTa $@FXITBwJ0IA9׸ׇݼ<٘usOL== WdGP}D;xPj .'ןݣ_$׊5MWW/w͝C燙}R״jmC =-b1$pLt٠NX(>((eQ)ZOrԁrvz-;Jt e+fOgwpOg}cPbɛ 7p-[v\dB?~[=${w"#SmmMFg^Ԯ6_ ;Ԍ)P=Eʤc!E j} EA>3jh, `wZԞd+~VC1d~ץd i^g勅jZ@Wa]Jmg6Q]<4:){a0t i@;+Ǫ< (%hjNHp zeK }do'e&c]jR8¨:i./ DIȊ߸A/uc7d!BV*6L8/]&rhsq5ܪ8R+<^6}/8"2dyZY|e/ }\_ :LPv5Yaxq->slu[(I;~Hطeٵ{2aEnّq.*KL0gZnw]f1tViQ#;¢ɩV]ܶ}zF弋h>fɔhNJfb<"{j'!k$$p('p@sv]m -e/bsJ&N]\lJ4ObԀ%P|k Y]6Gfs {ސqg^`Ør'{;Y@ yك6)0YB,(8[Kf1i(Z e{3or&I礵,9}H#~d;{EdP‚la k_x*ċ""mvC. ="=@yپ1d_ӷ")Jmш;t`VJtDة`T*z*vsH А7bC)m>>JIt7Gg-1{^T >̱ކx"-n[aef T-3>Y_CAVMo CBz*]Z=_=x `^yq*TPl"=y3TE\CqVTլU[.o$ppEVgFCE\'E˹mȵ<*3=lƣEIPNws1#flH M-Hs~Ҭ GvC_Gɯ5 (st*KTudژ ~EW^NJ[_VD}?t=Gf7Z;~Fw3U3ߛ6q cưYQDg %SWJӰs5J}w d>$_4,Dp秇 1HRvZpwg$AH"eL`;;x`gENRWtR%]H>Po;X$oY:Zu!_'_EH-&'p$ǸRP?# Ts_m/U -tA_y k1]n p#gt7>=4/\ _N m|!p0FOۊ` "ҏ/'{wQoWEI:ѿkw mm~6C&pݢ.qvx` ߷}12=KշX~hxM}x^DB|t,k;GI 3ueRh6󬏑^Nh ㋾L%IwZBR ɊVrh\vL[lKQ1WΥ w#L,+ۖtD:,ÏY4)wfǫ(vc:s>B.h LKIL^IzJS P'  :~ٝ[B\\"W1,0$(]]ϥ/(dz9ܿ~{9 ?=sOB_e!XZBn+)O7N+诪 pM+֯XӀFȟhx~O _$$B IJlC~M5KFB?_A ?Ah[UUłEoPK qg7EnhancementExample/bin/UT F52Gɦ7GUxdPK l7#EnhancementExample/bin/enhancement/UT 7Gɦ7GUxdPK l7)EnhancementExample/bin/enhancement/model/UT 7Gɦ7GUxdPKl7P2EnhancementExample/bin/enhancement/model/Car.classUT 7G7GUxd}R]OQ=,"QUv7&}ħfzr&G5ΰ@Aw9sfp7ZA/9l -iT8gcƁ@G7l@ wr_^wfJwT?}ݒ]7x |x_]xW;HӅ !\ _-QX" iśpوmoڨtv^H?*HKZb dst%ܢw"p8u3a l ?f.Ldh9%ۿ*#r6#tK}ؚ/nwPKl7C  ?EnhancementExample/bin/enhancement/model/MaintenanceQueue.classUT 7G7GUxdUmSU~na /*AeSmK- -Rt!tdM})|C:cCGf?9M0{Ϟ<W(#F>" vɳ,6wج{*Grk<}e?WMT2-Kq#ڲϮTVڏM{G,VLv{Y 5+on,.IS"AdZOgf`W/&i˶EQ3nfC@YLDRmW)0gfz$;OWus@{C[HeK^Cq|l:wRu^+^)Eoű~ly2774w Ƞˑj^ZTQd-\ni-[v=祈z/2u7uI3Nb/yW|OuVŦ#J5_](7,Ǣe%tM2Ϋ8nZ޾V+.1\p4wΟL]ŷ;pS¸HikMuoUI~N`15̃ʹ'Sz[6QŎtp⇯KD ]iSꝍ{~ m:.wh~|*d 7דќN3Fcƨqa$_"EGڏJ98v2!Q=Dp3 BdBɽBK*EK6ot\F4F? k~B ~SbA!$.||DՖfMX2TB>Oj+[kДn/s"UFM(գ0/rQth6G㙃Rr+:C= '_4Rp(1rmN;֚CD=+rW!a0\)!v135}DX>5Ǚ z{PI֑7p%[$74QLs!/PKl70EREnhancementExample/bin/enhancement/model/MaintenanceQueue$LinkedListIterator.classUT 7G7GUxdSQk@6k4WkU۪l|!BjVA_d[ڴMH6G/>(}%ޝU<+Xn^-rPŒ wQB*F(gM;" vx,}VRl2LŇ2 wǐnI:ъe 8 13iuċUW =ţ"91 0=8JmsM{>iiᨨ= RI@4?4\8b.7x ؗ;+jn,#[k~f-4VaL=Ҍz?V ׵*asg_щ/<ķ>rq[L U,PKl74Fg8EnhancementExample/bin/enhancement/EnhancerStarter.classUT 7G7GUxdTR@ x-UD Lcג.l7,(PAXpd_EF'nQN㎍RQܵ2{6ҸOal4!c~1 f1PR<%HMWSL;+&K̚8+s *f/Q~ #1]F0VZ /#VT`WQᗕ"Ἁ9[\z(c.7͖b#%_SԨ=iWdVB.2WbJPX9Ȟj(^#/bj2mbqǵBeKװ}x":Dغ/^`⥃,& kJN╃)Lf0KsvA0.sҺɏuQ0mɸnKM[9'U!eݚ"狚t됮F6Mttk=L\~<*sZ?/pLRJ3v>.2Cy@̊[jJ4MTAƀF\ 3w`iؖ!R*hh"]`6bSŕ\=@saqh-hMڏҮoPKl79a7EnhancementExample/bin/enhancement/EnhancerMain$1.classUT 7G7GUxd}RmOP~6TyVQ9d dSYoFI{~(&(kdVsss7xn)2M%T˸mhmUk`. /=ůFV`Jv.n_{PЦy|{+DM4ӑ}_ET l,xۓ3яcp<2:C̹plߑ( "dnz5۰M<ƎvM5ǠGs4iӆ觝is$ifؼ1c!soHko}Gg x=A9T#t["%TzF/PKl7{Yk 5EnhancementExample/bin/enhancement/EnhancerMain.classUT 7G7GUxdW_U^v.Ø b&%DB>vXfpweeٻYNV]VOO?h Ͻss׮_K،VvIHn1I؈v wa^%dŃ1~18!#a` UB$t' :z9$% L Kq#$a9Z$aqD$ D8cYq >u?B8a|D Op<&\HxOpxRS8%O 32շog` sjM#lG F4FbpCpz_:*AVڬntW3dl 5Mn0,O9mkRΠY< /^?H itݑj&I[]JT=6R-lc3uSiЃLf_ T0 K2^iMhxEƫxaAR'KJbX4Ո h}gސ&"xV=hZ ܞ1O4ȝeeB÷w9HY/Ns| C'g3'ʪwCMU 4 DƧauܙai!C *-"Zĭj԰&s|1_ fmq85 ˈbcDF e[>̖fꮈ!mCWe #~3q,UiFx@ m~K-20`~*ҺdSvv;K¼x:8~;&OE6-??~3(86Hgz1ֺy"T|D fiv}kjLn s@32iOu87]fPH6T%JxgXC"& Q@_z=T:;]6K U)@S5gY!amjT 1MT-9]f()G/!~SQ"; S0dEj6E" 5qP)4]5A]A6;"0J2*=awZᢊlp1e2'P al iOK.6ͪt ~ 3"r7Z)W-XM'wX?9uj?b^d٤3~P<Y|Cc}*c{pvpnÞ֤lC;Z;P8%%d|5+̝0ntAT7jl Ycdn0,KPiě ᱂^Օ|TZ{uELqh!<#x"_&jQlSȢ!؎Qu丆"}2r\#>Z-Łut"cRNVrasisD89gAPKl7_Wq57EnhancementExample/bin/enhancement/EnhancerMain$2.classUT 7G7GUxduQKO1 ""G<j7@xT5-#+=h2΂hvf:߼|{PfcN` fwPp00~ C4%C^Z l2r3o>1kUUFuTtٚ|)>c\,bɅe+Xub Rwd 嵡* `pZQ$#[q//tJ2TkFơ&*1+K|Q,_7~]ڐ& 8eDQ#sC2B N7|4Wn a)Z!K5AZ$W'ć!owq@$\zS4exJ_PKcf7fQEnhancementExample/.classpathUT Z0GC6GUxdJ1 ÒI+ ""+Bg&c7d&&Yoﺲ(T{-|LB4+iۊ=oϯTVejLA('DRrPӉ[٣jq]=6ˇUۦ5A*1Bثa$K*j/r2yM7\I2٘c"wlUi& ' [ {1Kw2sR|&wK}PK _7 tacustom/UT ƴ(Gɦ7GUxdPK g7 tacustom/src/UT "2Gɦ7GUxdPK C_7tacustom/src/tacustom/UT (Gɦ7GUxdPKC_720tacustom/src/tacustom/AnnotationClassFilter.javaUT (G|5GUxd]OO!˧X'՞LӤ&%eh~waY o'*Er1{+p礶BvV*PfOWbֺ*XF3`i|~XO"YuFunѲf3RI2zm3i~gD\fQ،olmUI45(&͊dL8&ʺ 2dFx0D)' ǜʨ-(:ҳ])ٴ;e Hy fh^?KXi>hKϗ # " /\~PKU7]+p|)tacustom/src/tacustom/Db4oPersistent.javaUT ƅG{5GUxd+HLNLOU(IL.-.ϵ-/*QJ,KIKK/I,;恸pV@~Nfr^P_&WAiP@!3$(-19U%$? 8E PKU7׼otacustom/.projectUT ƅGK3GUxduM0r ^;/N'?B%b7K Xh.TTu_Ёr[b[ 8%%1h)Qa&o!q) ѶFa5hG}HTXr/i>X\^z]͗PK_7vtacustom/.classpathUT ƴ(GK3GUxd 0 w;6Ed z EnhancementExample/src/enhancement/model/MaintenanceQueue.javaUT.0GUxPK* h781 EnhancementExample/src/enhancement/model/Car.javaUTOY2GUxPK g7 ACEnhancementExample/enhanced-bin/UT=2GUxPK l7, AEnhancementExample/enhanced-bin/enhancement/UT7GUxPK l72 AEnhancementExample/enhanced-bin/enhancement/model/UT7GUxPKl7%j; ZEnhancementExample/enhanced-bin/enhancement/model/Car.classUT7GUxPKl7ke H 2EnhancementExample/enhanced-bin/enhancement/model/MaintenanceQueue.classUT7GUxPKl74i?[ iEnhancementExample/enhanced-bin/enhancement/model/MaintenanceQueue$LinkedListIterator.classUT7GUxPKl7\A EnhancementExample/enhanced-bin/enhancement/EnhancerStarter.classUT7GUxPKl7ݖ@ "EnhancementExample/enhanced-bin/enhancement/EnhancerMain$1.classUT7GUxPKl7ZU> (%EnhancementExample/enhanced-bin/enhancement/EnhancerMain.classUT7GUxPKl7 0@ ~,EnhancementExample/enhanced-bin/enhancement/EnhancerMain$3.classUT7GUxPKl7V,@ /EnhancementExample/enhanced-bin/enhancement/EnhancerMain$2.classUT7GUxPKl7c  # 2EnhancementExample/build-simple.xmlUT7GUxPK l7 A5EnhancementExample/enhanced-lib/UT7GUxPKl71%) H6EnhancementExample/enhanced-lib/pilot.jarUT7GUxPK(e7RI <EnhancementExample/.projectUTlx/GUxPKוh7  =EnhancementExample/build.xmlUTK3GUxPK Ml7 AAEnhancementExample/lib/UT!7GUxPK;f7&C"# AEnhancementExample/lib/tacustom.jarUT0GUxPKBl7D)L 1 FEnhancementExample/lib/db4o-7.0.17.8420-java5.jarUT 7GUxPKf7lEwG FV EnhancementExample/lib/pilot.jarUT0GUxPKZg7iW  $ [ EnhancementExample/lib/bloat-1.0.jarUT+C2GUxPKBl7m$*٧+3/ ^EnhancementExample/lib/db4o-7.0.17.8420-taj.jarUT 7GUxPKBl77|A\81 NJEnhancementExample/lib/db4o-7.0.17.8420-nqopt.jarUT 7GUxPKBl7tf5 0>EnhancementExample/lib/db4o-7.0.17.8420-classedit.jarUT 7GUxPKBl70y#K)1 KEnhancementExample/lib/db4o-7.0.17.8420-tools.jarUT 7GUxPK qg7 A(EnhancementExample/bin/UTF52GUxPK l7# ArEnhancementExample/bin/enhancement/UT7GUxPK l7) AEnhancementExample/bin/enhancement/model/UT7GUxPKl7P2 $EnhancementExample/bin/enhancement/model/Car.classUT7GUxPKl7C  ? 3EnhancementExample/bin/enhancement/model/MaintenanceQueue.classUT7GUxPKl70ER EnhancementExample/bin/enhancement/model/MaintenanceQueue$LinkedListIterator.classUT7GUxPKl74Fg8 #EnhancementExample/bin/enhancement/EnhancerStarter.classUT7GUxPKl79a7 EnhancementExample/bin/enhancement/EnhancerMain$1.classUT7GUxPKl7{Yk 5 @EnhancementExample/bin/enhancement/EnhancerMain.classUT7GUxPKl7:ȹ=7 EnhancementExample/bin/enhancement/EnhancerMain$3.classUT7GUxPKl7_Wq57 EnhancementExample/bin/enhancement/EnhancerMain$2.classUT7GUxPKcf7fQ EnhancementExample/.classpathUTZ0GUxPK _7 Atacustom/UTƴ(GUxPK g7 ALtacustom/src/UT"2GUxPK C_7 Atacustom/src/tacustom/UT(GUxPKC_720 tacustom/src/tacustom/AnnotationClassFilter.javaUT(GUxPKU7]+p|) jtacustom/src/tacustom/Db4oPersistent.javaUTƅGUxPKU7׼o 6tacustom/.projectUTƅGUxPK_7v 6tacustom/.classpathUTƴ(GUxPK<</././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/build_time_enhancement.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools/build_time_enhanceme0000644000175000017500000001420611520622616033666 0ustar directhexdirecthex Build Time Enhancement Example

You are here: Advanced Features > Enhancement Tools > Example Built Time Enhancement

Build Time Enhancement Example

It possible to integrate the db4o enhancements into the build process, using a special MSBuild-Task.

Preparation

The enhance-functionality resides in the Db4oTool.exe, Db4oTool.MSBuild.dll and its dependencies. All these files are in the db4o-distribution. Ensure that all dll-files are in the same directory. Then ensure that the build-script has configured the right location for the Db4oTool.exe etc. For this example in the Db4oTool and dependencies are in the 'lib'-folder of the project

Create the Enhancement Task

First we define the enhancement-task. This task will process the assembly and enhance it.

You can add this to the existing project-files. The .csproj or .vbproj are actually MSBuild-files. Open them with a XML-Editor and add the needed parts.

<UsingTask AssemblyFile=".\lib\Db4oTool.MSBuild.dll" TaskName="Db4oTool.MSBuild.Db4oEnhancerMSBuildTask" />
<ItemGroup>
  <Db4oEnhance Include="$(TargetPath)" />
</ItemGroup>
simple-enhance-example.csproj: Define a task for the enhancement

And the execute the task after the compilation.

<Target Name="AfterBuild">
  <Db4oEnhancerMSBuildTask Assemblies="@(Db4oEnhance)" />
</Target>
simple-enhance-example.csproj: Define a target which runs the task

Now Visual Studio will automatically run the tasks for each build. You don't need to change anything else.

Often it's practical to have all persistent classes in a separate project or compile unit. Then the enhancement script runs only for this project. This makes it easy to enhance only the classes for the persistent objects.

There are lot of possibilities to tweak and configure the build-time enhancement so that it fits your requirements. See "Build Time Enhancement"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/enhancement_tools.htm0000644000175000017500000001576111520622606030343 0ustar directhexdirecthex Enhancement Tools
You are here: Advanced Features > Enhancement Tools

Enhancement Tools

Enhancement tools provide a convenient framework for application (jar, dll, exe) or classes modification to support db4o-specific functionality. Enhancement tools can work on a ready application or library and apply the improvements at load or build time.

The tools functionality is provided through bytecode instrumentation. This process inserts special, usually short, sequences of bytecode at designated points in your code. It is typically used for profiling or monitoring, however the range of use of bytecode instrumentation is not limited by this tasks: it can be applied anywhere where a specific functionality should be plugged into the ready built classes.

db4o Enhancement Tools currently have these cases for bytecodeinstrumentation:

In transparent activation/persistence case, classes are required to implement IActivatable interface to support transparent activation. In many cases you don't want to pollute your classes with some additional interface, or even won't be able to do so if you use a third party classes library. That's where bytecode instrumentation comes handy: IActivatableinterface will be implemented on your existing classes by applying bytecode instrumentation. Another advantage of this approach - you can still work on your "clean" classes, just do not forget to run the instrumentation afterwards.

In the native query optimization case bytecode instrumentation is used as a more performant alternative to a run-time optimization. When an native query is optimized the user and compiler-friendly syntax of NQ predicate is replaced with a query-processor-friendly code. Obviously, optimization process can take some time, therefore it can be a good choice to use pre-instrumented classes, then to let the optimization be executed each time it is required by application.

The instrumentation can be run at build time, also known as static instrumentation. In this case a special build script calls runs the instrumentation on the classes before packaging them to assembly, or on the assembly itself. This is the fastest solution as no time is spent on bytecode instrumentation at runtime.

There are different possibilities to integrate the enhancement tools into a project.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/0000755000175000017500000000000011520622616026740 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers/0000755000175000017500000000000011520622616031442 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers/pluggable_typehandler_benefits.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers/pluggable_t0000644000175000017500000001342111520622616033653 0ustar directhexdirecthex Pluggable Typehandler Benefits
You are here: Advanced Features > Type Handling > Typehandlers > Pluggable Typehandler Benefits

Pluggable Typehandler Benefits

As the name suggests Pluggable Typehandler allows anybody to write custom typehandlers, and thus control the way the class objects are stored to the database and retrieved in a query. Why would you do this? There can be various reasons:

  • You know a more performant way to convert objects to byte array or to compare them.
  • You need to store only part of the object's information and want to skip unneeded fields to keep the database smaller. You can also do the same using Transientmarker, but this is only possible for classes with available code. Using custom typehandler you can configure partial storage for any third-party class.
  • You need to keep information that will allow you to restore fields that cannot be stored as is, for example: references to environmental variables (like time zone), proxy objects or variables of temporary state (like current memory usage). Previously, this job was done by Translators, but certainly custom Typehandler gives you more control and unifies the approach.
  • You need to perform a complex refactoring on-the-fly (use typehandler versioning)
  • You want to cipher each object before putting it into the database

Other not so common and more difficult in realization behaviours that can be realized with the new Typehandler:

  • Customary indexes
  • Versioning of typehandlers (can be used for refactoring and db4o version upgrades)

Of course, writing typehandlers is not totally simple, but once you understand how to do that - you will also gain a much deeper understanding of db4o itself. You can start with a simple example provided in this documentation and continue by looking into existing db4o typehandler implementations: StringHandler, VariableLengthTypeHandler, IndexableTypeHandler etc.

././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers/custom_typehandler_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers/custom_type0000644000175000017500000003177511520622616033755 0ustar directhexdirecthex Custom Typehandler Example
You are here: Advanced Features > Type Handling > Typehandlers > Custom Typehandler Example

Custom Typehandler Example

For a custom typehandler example we will try to write a very simple typehandler for the StringBuilder class. We want to handle a StringBuilder as a value type, therefore we implement the ValueTypeHandler interface. Not that there's a whole collection of interfaces for typehandlers. Take a look at the TypeHandler4 type hierarchy.

To keep it simple we will skip information required for indexing - please look at IndexableTypeHandler in db4o sources to get more information on how to handle indexes.

The first thing should be the write method, which determines how the object is persisted:

public void Write(IWriteContext writeContext, object o)
{
    StringBuilder builder = (StringBuilder) o;
    string str = builder.ToString();
    byte[] bytes = Encoding.UTF8.GetBytes(str);
    writeContext.WriteInt(bytes.Length);
    writeContext.WriteBytes(bytes);
}
StringBuilderHandler.cs: Write the StringBuilder
Public Sub Write(ByVal writeContext As IWriteContext, ByVal o As Object) _
    Implements IValueTypeHandler.Write
    Dim builder As StringBuilder = DirectCast(o, StringBuilder)
    Dim str As String = builder.ToString()
    Dim bytes As Byte() = Encoding.UTF8.GetBytes(str)
    writeContext.WriteInt(bytes.Length)
    writeContext.WriteBytes(bytes)
End Sub
StringBuilderHandler.vb: Write the StringBuilder

As you can see from the code above, there are 3 steps:

  1. Get the buffer from WriteContext/I WriteContext
  2. Convert the string-content to a byte-array using the UTF8 encoding.
  3. Write the length of the resulted byte-array.
  4. Write the byte array of the string.

Next step is to read the stored object. It is just opposite to the write method:

    public Object Read(IReadContext readContext)
    {
        int length = readContext.ReadInt();
        byte[] data = new byte[length];
        readContext.ReadBytes(data);
        return new StringBuilder(Encoding.UTF8.GetString(data));
    }
}
StringBuilderHandler.cs: Read the StringBuilder
Public Function Read(ByVal readContext As IReadContext) As Object _
    Implements IValueTypeHandler.Read
    Dim length As Integer = readContext.ReadInt()
    Dim data As Byte() = New Byte(length - 1) {}
    readContext.ReadBytes(data)
    Return New StringBuilder(Encoding.UTF8.GetString(data))
End Function
StringBuilderHandler.vb: Read the StringBuilder

Delete is simple - we just reposition the buffer offset to the end of the slot:

public void Delete(IDeleteContext deleteContext)
{
    SkipData(deleteContext);
}

private static void SkipData(IReadBuffer deleteContext)
{
    int numBytes = deleteContext.ReadInt();
    deleteContext.Seek(deleteContext.Offset() + numBytes);
}
StringBuilderHandler.cs: Delete the content
Public Sub Delete(ByVal deleteContext As IDeleteContext) _
    Implements IValueTypeHandler.Delete
    SkipData(deleteContext)
End Sub

Private Shared Sub SkipData(ByVal deleteContext As IReadBuffer)
    Dim numBytes As Integer = deleteContext.ReadInt()
    deleteContext.Seek(deleteContext.Offset() + numBytes)
End Sub
StringBuilderHandler.vb: Delete the content

The last method left: #defragment. This one only moves the offset to the beginning of the object data, i.e. skips Id and size information (to be compatible to older versions):

public void Defragment(IDefragmentContext defragmentContext)
{
    SkipData(defragmentContext);
}
StringBuilderHandler.cs: Defragment the content
Public Sub Defragment(ByVal defragmentContext As IDefragmentContext) _
    Implements IValueTypeHandler.Defragment
    SkipData(defragmentContext)
End Sub
StringBuilderHandler.vb: Defragment the content

Now to use this type handler we need to configure db4o. To register a typehandler you have to provide a predicate which decides if a type is handled by the typehandler and the typehandler itself.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.RegisterTypeHandler(
    new SingleClassTypeHandlerPredicate(typeof(StringBuilder)), new StringBuilderHandler());
TypeHandlerExample.cs: Register type handler
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.RegisterTypeHandler(
    New SingleClassTypeHandlerPredicate(GetType(StringBuilder)), New StringBuilderHandler())
TypeHandlerExample.vb: Register type handler

After that all string builders are handled by you're type handler.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/blobs.htm0000644000175000017500000001211011520622610030540 0ustar directhexdirecthex Blobs
You are here: Advanced Features > Type Handling > Blobs

Blobs

In some cases user has to deal with large binary objects (BLOBs) such as images, video, music, which should be stored in a structured way, and retrieved/queried easily. There are several challenges associated with this task:

  • Storage location.
  • Loading into Memory.
  • Querying interface.
  • Objects' modification.
  • Information backup.
  • Client/Server processing.

db4o provides you with a flexibility of using 2 different solutions for this case:

  1. The db4o blob-type.
  2. Byte[] arrays stored inside the database file

These two solutions' main features in comparison are represented below:

Blob

  1. Every Blob gets it's own file.
  2. Special code is necessary to store and load .
  3. No concerns about activation depth.

byte[] array

  1. Data in the same file
  2. Transparent handling without special concerns.
  3. Control over activation depth may be necessary

Storing data in a byte[] array works just as storing usual objects, but this method is not always applicable/desirable. First of all, the size of the db4o file can grow over the limit (256 GB) due to the BLOB data added. Secondly, object activation and client/server transferring logic can be an additional load for your application.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/translators/0000755000175000017500000000000011520622606031313 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/translators/built-in_translators.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/translators/built-in_tra0000644000175000017500000000764311520622606033641 0ustar directhexdirecthex Built-In Translators
You are here: Advanced Features > Type Handling > Translators > Built-In Translators

Built-In Translators

db4o supplies some build-in translators, which can be used in general cases. You can use them for your classes if they are not storable or nedd special treatment.

  • TTransient: Doesn't store the object at all. Usable when you don't want to store instances of certain type. If makes all instances of that type transient.
  • TSerializable: Uses the built in serialisation mechanism to store this object.

There are other built in translators, which are not intended be used directly. Instead they are used by db4o internally. Nevertheless you can use them as example implementation. Look for all classes which implement the IObjectTranslator-interface

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/typehandlers.htm0000644000175000017500000001445211520622616032162 0ustar directhexdirecthex TypeHandlers
You are here: Advanced Features > Type Handling > TypeHandlers

TypeHandlers

One of the most important and convenient things that db4o provides is the ability to store any object just as it is: no interfaces to be implemented, no custom fields, no attributes/annotations - nothing, just a plain object. However, it is not as simple as it may seem - objects are getting more and more complex and sometimes the generic solution is not good enough for specific objects.

This problem was recognized by db4o team long ago, and various solutions were provided to customize the way an object is stored: Translators, transient fields in Java and .NET etc. However all these means were rather fixing the symptoms but not the disease itself. And the fact is that there is no single generic way to store just any available or future object in the best possible way. But luckily we don't even need it - all we need is a way to write a specific persistence solution for any custom object, and now db4o provides this way though a pluggable ITypeHandler4 interface. You can register any number of type handlers to the configuration. Additionally you need to register a predicate which decides which classes are handled by the type handler.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.RegisterTypeHandler(
    new SingleClassTypeHandlerPredicate(typeof(StringBuilder)), new StringBuilderHandler());
TypeHandlerExample.cs: Register type handler
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.RegisterTypeHandler(
    New SingleClassTypeHandlerPredicate(GetType(StringBuilder)), New StringBuilderHandler())
TypeHandlerExample.vb: Register type handler

Note that type handler are a low level API which doesn't protect you from any mistakes. If you make a mistake in a typehandler you can loose data.

Type handler functionality is best explained on a working example.

Usecases and other benefits of the pluggable typehandler interface are reviewed here.

 

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/delegates_and_events.htm0000644000175000017500000000752611520622610033621 0ustar directhexdirecthex Delegates And Events
You are here: Advanced Features > Type Handling > Delegates And Events

Delegates And Events

Db4o rules for delegate fields are very straightforward: delegates are simply not stored. Events and delegates are generally used for binding user interface elements and domain models together. The Db4o team felt that not storing delegate fields by default was more appropriate than opening what could potentially be a very nasty can of worms (just think of a text box bound to a Customer.Changed event). After careful thought we can easily add delegate persistence to our domain model by either installing translators for the delegate types of interest or reconnecting the necessary objects upon activation using callbacks. For details see the specific chapters on Translators and Callbacks.

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/collections/0000755000175000017500000000000011520622614031254 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/collections/collections_or_arrays.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/collections/collections_0000644000175000017500000001173511520622610033657 0ustar directhexdirecthex Collections Or Arrays
You are here: Advanced Features > Type Handling > Collections > Collections Or Arrays

Collections Or Arrays

If you are planning an application with db4o, you may be asking yourself, what is better to use: collections or arrays? In the current implementation it is not really a difficult choice, as collections internally are stored as arrays, which is explained in Collections chapter. You can base your solution on the overall system design, entrusting db4o to handle the internals efficiently in both cases.

However you need to consider that collections are more flexible and convenient than arrays for most operations. Additionally, collections can be TA/TP aware by using db4o-collections, while arrays are always fully activated. See "TA Aware Collections"

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/collections/big_set.htm0000644000175000017500000001745011520622614033411 0ustar directhexdirecthex Big Set
You are here: Advanced Features > Type Handling > Collections > Big Set

Big Set

When you need to store large sets, you can use db4o's big set. This big-set operates directly on top of B-trees, which are also used for indexes. The big-set doesn't need to activate all items to perform its operations. For example when you check if the set already contains a member, the big-set can do that without activating all its items. Especially lookup-operation like contains perform much faster with a big set.

Not that currently the big set implementation only works in embedded-mode, but not in client-server mode.

You can create a new big-set with the CollectionFactory:

ICollection<Person> citizen = CollectionFactory.ForObjectContainer(container).NewBigSet<Person>();
// now you can use the big-set like a normal set:
citizen.Add(new Person("Citizen Kane"));
BigSetExample.cs: Crate a big-set instance
Dim citizen As ICollection(Of Person) = _
    CollectionFactory.ForObjectContainer(container).NewBigSet(Of Person)()
' now you can use the big-set like a normal set:
citizen.Add(New Person("Citizen Kane"))
BigSetExample.vb: Crate a big-set instance

After that, the big-set behaves just like an ordinary set. Except that the big-set used the object-identity instead of the object-equality to compare the items. So when you add a equal object with a different identity, it will be added to the set. You can add, remove and iterate over the items or check if an item is already in the set. The items will be loaded and activated on demand, for example when you iterate over the set.

Person aCitizen;
using (IEnumerator<Person> aCitizenEnumerator = city.Citizen.GetEnumerator())
{
    aCitizenEnumerator.MoveNext();
    aCitizen = aCitizenEnumerator.Current;
}
Console.WriteLine("The big-set uses the identity, not equality of an object");
Console.WriteLine("Therefore it .contains() on the same person-object is "
                  + city.Citizen.Contains(aCitizen));
Person equalPerson = new Person(aCitizen.Name);
Console.WriteLine("Therefore it .contains() on a equal person-object is "
                  + city.Citizen.Contains(equalPerson));
BigSetExample.cs: Note that the big-set compares by identity, not by equality
Dim aCitizen As Person
Using aCitizenEnumerator As IEnumerator(Of Person) = city.Citizen.GetEnumerator()
    aCitizenEnumerator.MoveNext()
    aCitizen = aCitizenEnumerator.Current
End Using
Console.WriteLine("The big-set uses the identity, not equality of an object")
Console.WriteLine("Therefore it .contains() on the same person-object is " & city.Citizen.Contains(aCitizen))
Dim equalPerson As New Person(aCitizen.Name)
BigSetExample.vb: Note that the big-set compares by identity, not by equality
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/translators.htm0000644000175000017500000003262111520622610032024 0ustar directhexdirecthex Translators
You are here: Advanced Features > Type Handling > Translators

Translators

Sometimes objects cannot be stored in db4o. For example because the objects have references to other parts of the system other where never intended to be stored. This is especially for objects from third party libraries.

Now the db4o object translators is a simple mechanism which allows you to manually handle the persistence of an object. There are two important interfaces for this. The IObjectTranslator-interface and the IObjectConstructor. The first interface lets you take the control over storing and activation of the object. The second interface also allows you to control the instantiation of the object.

If you register a IObjectTranslator-instance for a certain type, it will also be applied to sub-types. This doesn't apply to IObjectConstructor-instances, because those need to create the right instance and therefore cannot handle subtypes.

Creating a Translator

First you need to create a translator for your types. Let's take a look at this example. There three distinct tasks a translator has to do. The first task is to convert the not storable object into another, storable object. Another task of the translator is to take care of the activation of the object. There it need to copy the values from the stored object into a instance of the original type. The third task it to create instances of the object. There you create a instance of the original type. And for some types you maybe also read the data at this point in time.

internal class ExampleTranslator : IObjectConstructor
{
    // This is called to store the object
    public Object OnStore(IObjectContainer objectContainer, Object objToStore)
    {
        NonStorableType notStorable = (NonStorableType) objToStore;
        return notStorable.Data;
    }

    // This is called when the object is activated
    public void OnActivate(IObjectContainer objectContainer, Object targetObject, Object storedObject)
    {
        NonStorableType notStorable = (NonStorableType) targetObject;
        notStorable.Data = (String) storedObject;
    }

    // Tell db4o which type we use to store the data
    public Type StoredClass()
    {
        return typeof (String);
    }

    // This method is called when a new instance is needed
    public Object OnInstantiate(IObjectContainer objectContainer, Object storedObject)
    {
        return new NonStorableType("");
    }
}
ExampleTranslator.cs: An example translator
Friend Class ExampleTranslator
    Implements IObjectConstructor
    ' This is called to store the object
    Public Function OnStore(ByVal objectContainer As IObjectContainer, _
                            ByVal objToStore As Object) As Object _
                        Implements IObjectConstructor.OnStore

        Dim notStorable As NonStorableType = DirectCast(objToStore, NonStorableType)
        Return notStorable.Data
    End Function

    ' This is called when the object is activated
    Public Sub OnActivate(ByVal objectContainer As IObjectContainer, _
                          ByVal targetObject As Object, ByVal storedObject As Object) _
                      Implements IObjectConstructor.OnActivate

        Dim notStorable As NonStorableType = DirectCast(targetObject, NonStorableType)
        notStorable.Data = DirectCast(storedObject, String)
    End Sub

    ' Tell db4o which type we use to store the data
    Public Function StoredClass() As Type _
        Implements IObjectConstructor.StoredClass
        
        Return GetType(String)
    End Function

    ' This method is called when a new instance is needed
    Public Function OnInstantiate(ByVal objectContainer As IObjectContainer, _
                                  ByVal storedObject As Object) As Object _
        Implements IObjectConstructor.OnInstantiate
        Return New NonStorableType("")
    End Function
End Class
ExampleTranslator.vb: An example translator

Registering a Translator

After that you can register the translator for you're type. If you register a IObjectTranslator-instance it will also be applied to the sub-types. However a IObjectConstructor-instance is only applied for the specific type.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof(NonStorableType)).Translate(new ExampleTranslator());
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
ExampleTranslator.cs: Register type translator for the NonStorableType-class
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(NonStorableType)).Translate(New ExampleTranslator())
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
ExampleTranslator.vb: Register type translator for the NonStorableType-class

Using The Translator

After that you can store and use the not storable objects like any other persistent objects. db4o will call the translator for each instance when required in order to store the object correctly.

container.Store(new NonStorableType("TestData"));
ExampleTranslator.cs: Store the non storable type
container.Store(New NonStorableType("TestData"))
ExampleTranslator.vb: Store the non storable type
NonStorableType data = container.Query<NonStorableType>()[0];
ExampleTranslator.cs: Load the non storable type
Dim data As NonStorableType = container.Query(Of NonStorableType)()(0)
ExampleTranslator.vb: Load the non storable type

Limitations

The object translator mechanism is great for types which couldn't be stored otherwise. However there are serious limitations.

  • Queries into the members of a object which was stored with a object translator are extremely slow. The reason is that the object first need to be loaded and instantiated with the translator in order to run the query on it.
  • You cannot index types which are translated.
db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/collections.htm0000644000175000017500000001046611520622616031777 0ustar directhexdirecthex Collections
You are here: Advanced Features > Type Handling > Collections

Collections

Internally the regular .NET-collections are stored as arrays. When you store a collection, db4o will store all the collection-items into a array. And when you retrieve a collection, db4o will create a new instance of the collection and add back the items. Dictionary-instances are stored as an array of key-values.

Unfortunately this implementation is not very efficient for searches/updates of a certain value in a collection, as the whole collection needs to be instantiated to access any of its elements.

db4o brings some special collections with it. There are collections which support transparent persistence. See "TA Aware Collections"

When you have a need for a huge collection, you might run into some performance bottleneck, since collections are always stored and retrieved as complete unit. You can use db4o special big-set to improve performance. See "Big Set"

You might wonder what is better to use, collection or arrays. Most of times it doesn't matter. See "Collections Or Arrays"

././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums.0000644000175000017500000000657011520622614033615 0ustar directhexdirecthex Static Fields And Enums
You are here: Advanced Features > Type Handling > Static Fields And Enums

Static Fields And Enums

How to deal with static fields and enumerations? Do they belong to your application code or to the database? Let's have a look.

More Reading:

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/0000755000175000017500000000000011520622616031357 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/possible_solutions.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/possible_so0000644000175000017500000001223711520622616033630 0ustar directhexdirecthex Possible Solutions

Possible Solutions

Of course, if you only use JDK5 or 6 there are no worries about the final fields at all. But if you do not want to stick to the definite java version and need to have the flexibility of switching to different java versions you currently have 2 solutions:

  • avoid using the final modifier in the persistent objects;
  • use translator.

An example of the final fields translator can look like this:

FinalFieldTranslator.java
/**//* Copyright (C) 2007 Versant Inc. http://www.db4o.com */
package com.db4odoc.finalfields;

import com.db4o.*;
import com.db4o.config.*;

// Translator allowing to store final fields on any Java version
public class FinalFieldTranslator implements ObjectConstructor  {

  public Object onStore(ObjectContainer container,
      Object applicationObject)  {
    System.out.println("onStore for " + applicationObject);
    TestFinal notStorable = (TestFinal) applicationObject;
    // final fields values are stored to an array of objects
    return new Object[]  { new Integer(notStorable._final_i),
        notStorable._final_s };
  }

  public Object onInstantiate(ObjectContainer container,
      Object storedObject)  {
    System.out.println("onInstantiate for " + storedObject);
    Object[] raw = (Object[]) storedObject;
    // final fields values are restored from the array of objects
    int i = ((Integer) raw[0]).intValue();
    String s = (String) raw[1];
    return new TestFinal(i, s);
  }

  public void onActivate(ObjectContainer container,
      Object applicationObject, Object storedObject)  {
    System.out.println("onActivate for " + applicationObject
        + " / " + storedObject);
  }

  public Class storedClass()  {
    return Object[].class;
  }
}

The following call should be issued before opening the object container to connect the translator to the TestFinal class:

configuration.common().objectClass(TestFinal.class).translate(new FinalFieldTranslator());

Download example code:

././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/finalfieldsjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/finalfields0000644000175000017500000000271211520622614033562 0ustar directhexdirecthexPKU67~FinalFieldTranslator.java0=`eC ,eȉZedILXd$KӛOt}4reHg|L>zW?ETe?E4j,FۇZy% U%Zp0] w)hz{Vj&d6JFXu aگ,Th-Hb6|<% F$IƺvZdM{I8Z\9$V>P9xNEXi \)_ ٭4(^X@=Z$w`x^k &x]{ΉF-ɬ,|S^s^w0(ݑT݌ϮrEՈȵ2zh]k IQfur˥mW 6>]?{ nH\%oﯼ}1.X_ i9aF|qyD7PKw69=lTestFinal.javaTj@}0IEJKԉ&֦]M{ѽ.*뙙3`גo3p>WW ]_ &a)2&CdUQr8'%?|;Eh%"ճɘ* ^؞E\E .HyݛOC1WXɅ-vkHE3Mƣ{Fr V姇 (ti} B֧\+>keUm2{&v{nM+۬#2 +Bθ ʭ:74iLYm9$X#U<@kx؀Pa"v7MH#VQ>j8V䶍8e!-J7B [V[Z\UpU%Ү,M&9ڱj/\,>AǸ!uF!BC2 J9d^eL?O N^ uiLPK(U67~$ FinalFieldTranslator.java UV7n|0v{`?lN>PK(w69=l$ -TestFinal.java {]n|0v{שN>PK././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/final_fields_specifics.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/final_fields/final_field0000644000175000017500000001522211520622616033540 0ustar directhexdirecthex Final Fields Specifics

Final Fields Specifics

Db4o uses reflection to store and retrieve objects from the database file. In the case of final fields db4o needs a successful call to java.lang.Field#setAccessible to allow write access to those fields. Unfortunately different Java versions produce different results in this case. To be more specific:

  • In (Sun) JDK 1.-1.2 java.lang.Field#setAccessible call will be successful for the fields with the final modifier.
  • This behavior was changed for JDK1.3-1.4 as the API documentation for java.lang.Field#set() made a quite clear distinction between 'Java language access control' (visibility modifiers, affected by setAccessible()) and final fields (not affected by setAccessible()). For more information refer to java bug 4250960.
  • The behavior of java.lang.Field#setAccessible method was changed again for JDK5 and JDK6. The access to final fields was made manageable by setAccessible() call to accommodate for the extended semantics of the final modifier for the revised Java memory model. The API documentation of java.lang.Field#set() was changed accordingly. See java bug 5044412.

You can use the following example code to check final fields behavior with different java versions:

TestFinal.java
/**//* Copyright (C) 2007 Versant Inc. http://www.db4o.com */
package com.db4odoc.finalfields;
import java.io.File;

import com.db4o.Db4o;
import com.db4o.ObjectContainer;
import com.db4o.ObjectSet;

public class TestFinal
 {
  private static final String DB4O_FILE_NAME = "reference.db4o";
  // non-final fields
  public int    _i;
  public String _s;
   // final fields storing the same values as above
  public final  int    _final_i;
  public final String _final_s;
  
   public static void main(String[] args)
    {
      new File(DB4O_FILE_NAME).delete();
      ObjectContainer container = Db4o.openFile(DB4O_FILE_NAME);
      try  {
        TestFinal test = new TestFinal(1,"test");
        container.store(test);
        System.out.println("Added: " + test);
      } finally  {
        // Close does implicit commit and refreshes the reference cache
        container.close();
      }
      container = Db4o.openFile(DB4O_FILE_NAME);
      try  {
        ObjectSet result = container.queryByExample(null);
        listResult(result);
      } finally  { 
        container.close();
      }
   }
   // end main
   
   public TestFinal(int i, String s)
    {
     // initialize final and non-final fields with the same values
      _i       = i;
      _s       = s;
      _final_i = i;
      _final_s = s;
   }
   // end TestFinal

   public String toString()
    {
      return "Int - " + _i + "; String - " + _s + "; FINAL Int - " 
+ _final_i + "; FINAL String - " + _final_s;
   }
   // end toString
   
   private static void listResult(ObjectSet result)
    {
      while(result.hasNext())  {
         System.out.println(result.next());
     }
   }
   // end listResult
}

If you are using Eclipse it is easy to switch between java versions - you can switch to the versions lower than the one installed on your computer without having to install them all. For example if you are using JDK6 you can easily test your project on JDK1.1 - 1.4 and JDK5. Just go to the project properties, select "Java Build Path" on the left panel and "Libraries" tab on the right panel. Remove the system library currently used. Select "Add library->JRE System Library"; on the next screen check the "Execution Environment" radio button and select the desired environment from the list.

Don't forget to use the appropriate db4o version for the selected java environment version. See db4o on Java Platformsfor more information.

Download example code:

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/blobs/0000755000175000017500000000000011520622616030041 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/blobs/blobsjava.zip0000644000175000017500000000335611520622610032531 0ustar directhexdirecthexPKf:13uBlobExample.javaTMo@=;R('MzH4MHUBf=qػfwwˮΌ{f&#jx~g ^[JSa`&;ch^lq* %~lħ2Ȣ =vY^VR+J$Wn6 6\Ǵ\`a6~/rꙊ5-잞g 5\X -WTAXrA І[zc9\^of>\O P0LDJ J- (߾UzDpBNcwVhp =xPevI:X\!ɰ@r@`szOd"u!IK "ڳ+ +Uo,i Bm*!j+)4߉F̓.x'C=+n{oRۇÝ lQr=02 f%`F Y|aXn"IrK"kC:a ]֞ͼ;&UΤ+>Hۤ6mDǼygd]"Opn#ii󢅏K&bktk΀=y{6PKj:Car.javamAk0aɬ4.e/'B1m4VJ͖17ovtZuEMq?ܞM: tsUM`=<xJBG56gA6F {5wgjtWtzPV~&^R|LEʠۀӞϧt\y3"_E$2*ynscɪ$4xuC-gck]^%4P@c5& wB PKk:J΁  CarImage.javaRMk@BXjϢAj7nu]˘`jsn ڃ>eh0LCae )\L82UY:Yw\[֪X5 Ex@՝{jmuhHjR8†떸RQ2;t.v:@|2Gs C$l࿿PK(f:13u$ BlobExample.java LKppPK(j:$ Car.java  ``PK(k:J΁  $ CarImage.java !=$$PKdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/blobs/blobscs.zip0000644000175000017500000000331311520622616032214 0ustar directhexdirecthexPK k:])_~BlobExample.csTn0ep$]ZK04h4Cс TI:QKREi@5ݻwwO@ڭ yY{Pia.kz&uN8pؐR r%Jڠi)CpYb\ ?,͜=M wu';rC g 6ggڴݑא?Rd w~ra # (Gs6Zx ה˼# ^GJٝUKM^Lp.Sc@ّ+JM &W _0RIjrYSa]cMnZ>=?@?%-rv^BN۠j'+sBQv*q !]T.!+Z}X2oޱl='/Bw4P}x޺69(o0$Bő[uԁQ m~U`'J%knKqCW,2=f>-[FԲp@Toݶ~KE _qcAY (}D&d.+! /MF zg\ xެ+QG@5v°~~(s/PKj:j Car.csUk  xdb6zYF]6v-ֈuD jF>5vYO{~^A#j*xlKOu= nO[\lO(W/NlES'(ЎX 1^ rfQuA̓$QHP(Y f`AeSl+UKE3J2>wy2g.53]ZbdBofh$tH Fq3~u 7kP~PK&k:v6< CarImage.csRMk@=0$96=$=ԭP"+i*vUP߻R`'}{C9lWuY7 [./*cbu)䢁b:A-iٖ OLdz:;=y7FJ1ýDmQU9FyyZ5[mrF UG)} eDRw h xͷ,et Db4o Blob Implementation
You are here: Advanced Features > Type Handling > Blobs > Db4o Blob Implementation

Db4o Blob Implementation

Built-in db4o blob type helps you to get rid of the problems of byte[] array, though it has its own drawbacks.

  1. Every Blob gets it's own file:
  2. + Main database file stays a lot smaller.

    + Backups are possible over individual files.

    +The BLOBs are accessible without db4o.

    - Multiple files need to be managed .

  1. Special code is necessary to store and load.
  2. - It is more difficult to move objects between db4o database files.

  3. No concerns about activation depth
  4. + Big objects won't be loaded into memory as part of the activation process.

Configuration

First, the blob storage location should be defined. If that value is not defined, db4o will use the default folder "blobs" in user directory.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.BlobPath = "myBlobDirectory";
FileConfiguration.cs: Configure the blob-path
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.BlobPath = "myBlobDirectory"
FileConfiguration.vb: Configure the blob-path

Using The db4o-Blob

There are two important operations on the blob type. The first one write a file into the db4o blob:

blob.ReadFrom(fileToStore);
BlobStorage.cs: Store the file as a db4o-blob
blob.ReadFrom(fileToStore)
BlobStorage.vb: Store the file as a db4o-blob

And then there's the operation which .loads the db4o blob into a new file.

blob.WriteTo(file);
BlobStorage.cs: Load a blob from a db4o-blob
blob.WriteTo(file)
BlobStorage.vb: Load a blob from a db4o-blob

The db4o blob-type has a status attached to it. This status tells you if the blob-file all ready has been transferred:

while (blob.GetStatus() > Status.Completed)
{
    Thread.Sleep(50);
}
BlobStorage.cs: wait until the operation is done
While blob.GetStatus() > Status.Completed
    Thread.Sleep(50)
End While
BlobStorage.vb: wait until the operation is done

Take a look a the complete example code (C#, VB.NET).

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/blobs/blobsvb.zip0000644000175000017500000000345211520622606032221 0ustar directhexdirecthexPKn:ŔBlobExample.vbVo0#?X\.aؐv+U9;k8m sI| ~~}O\0˷Z$KKO3hÔ%3)YZY4>fgi3KL[C[c!j@/Pl5П+n۹g)q8t$ȠcII(1- Ks #xe\*Xd*$[hP Р8Lz;i|;&T0>3INLЯ|wx620džGppx=M.+d+MAkEOQzO8KYҊ(y 9Y:b*m(3PUeJ#Q)+Y&0"MJBs@~fj!|I` G7@ZX.w`oUfڤ7K_:ZGS5.`9uh0+iҜu,ʞts+lÿat BS(K!o6e_je-h 獸K%:I;z&^ 5ݥ/ٖXt;PKm:7Car.vbmRMk@ KMZzi!4%$%ײ` uP2'yͼ7>@Z|o!#xL^aPia)S{k*%/Jފ 4M ̸JAS2,Sc E]͙2nj&Dm)hw廹_e+YӢUg6meYMݨ[8lo$d8}m7[U!3N-l-y  Զ1/zkڢ-<νဳߝL?Ԛeh`Q2%[kC ̍{K҂08L8Ѣ~_:J|}^{PKm:, CarImage.vbT0^jSІZBl\P"XŖ4n꿯ʮ8*c{"S5Vr b: 6:UǣȒF6ee,9GX}nQfJH.mZlUO~`JNV}S]%S2eavP)Dt"i7sZ; *׵NIݎ+3VU.)PqEhMly[?Yx62.L۔bT>"2eU a6(".[ ٤8|:€+O-~O?XEOw{[=>9ƑxrgPK(n:Ŕ$ BlobExample.vb  m 8:O:OPK(m:7$ Car.vb zaVʄQʄQPK(m:, $ CarImage.vb *cRCTCTPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000755000175000017500000000000011520622616033606 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/staticfieldsvb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000644000175000017500000000540011520622614033605 0ustar directhexdirecthexPK)78?Car.vbSWp/,L(QpT0200QQ )I&IY% yz %%Vz )\^.܂"\=̼t^.^.TIz fJ~^pIbIf[fjNJ1/&d&+8$+8'ADds D5/ Ą PK)7JOWPilot.vbQK0 ^lafSN|p*izl.)IRƾMZ6<w^@$R@p=Ҿn G2@f4< F`mLv;EAl0=ߛ 2m"Yj8pL{PyARaSi^R.*OӰ4ՉV=WR66Q[&5[1L7B׼N;]/Hึ:6pƵMz9A@DZV*S6Ax> v-JfXNgޱ_'_ j.Jq髽 Tjn 8NNJ6?}PK)7k;RPilotCategories.vbOk@aȥPJPSԦѦDz[bv5o_7?Z,ҽ8~ɸ7^4S`C'p$ ې)}ʲ+iF6Dn&0; l]&ۡB9%y"M,bps$%,iΕI8L ]~R\a8GBe)L!* MM3$H~x+h))]kP >`, fW ~VΓwQ#g~,UKEXZj=(\؝Nmrn>1n{<"Rb)/;"My+ :{HsD-ԁ~PK퉚7Jjv!StaticFieldExample.vbZo6~n_*c C8j}ΖZH׏'ɶ~tˊL/vD_ߝ<&H2^GxrqpL,ӊL9IuvĆM7f|4lӭˣ@:NWڽ{rq)6ٌn@Ah(?T*$Tg\e3$TiɎnMFt.*NxRIX w!5E#*!$$J^Xd&t[!`3iP jw*"*B ْ`O+mB!ykyiB\޸" /H$c oMhʉY'D' }KVF4.41;D$5(4B4k]&W܇wrk2~Zԛ- P[]tG\*[ 2-޿Ncxi[`qƅͫǬ- ?3ZpGF9Yɂ$a-3Y5ͮ5jZ`~{ zOk4RJWƜ4=]Gg8#~uAw7q93$.? ?=-m" (P=! bn5g.%pE^Q)Ha p MAUbt{l^ ϓncъazaՎ+(H,B}ەdBYR}AlzQpKU3b:^|  0$fN?.)T'uce n`wP dO5{h{=4cxT15/2k>tݠ/_'X0y$@EZlFcI+] <(t >>gsDw*מnQtegKn{XŎgP"oOYM-F&rgnz#(g̼/vL>}kY5N~=[PK()78?$ Car.vb pMt1=WCt1=WCPK()7JOW$ Pilot.vb 4M=WC=WCPK()7k;R$ BPilotCategories.vb cMDWCPK}m ././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/.net_enumerations.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000644000175000017500000000741511520622610033611 0ustar directhexdirecthex .NET Enumerations
You are here: Advanced Features > Type Handling > Static Fields And Enums > .NET Enumerations

.NET Enumerations

.NET enumerations are value types, just like integers, numbers, booleans etc.

.NET enumerations are based on an underlying type, which can be Byte, SByte, Int32, UInt32, Int16, UInt16, Int64, and UInt64 (i.e. values of these types will be enumerated). When underlying type is not specified in the enum declaration, Int32(c#) or Integer (VB.NET) is used by default.

db4o stores .net enums just like regular value types like ints, floats etc. It is stored together with the containing object. It can only be loaded and stored with the containing object.

 

././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/static_fields_api.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000644000175000017500000003520211520622610033604 0ustar directhexdirecthex Storing Static Fields
You are here: Advanced Features > Type Handling > Static Fields And Enums > Storing Static Fields

Storing Static Fields

By default db4o does not persist static fields. This is not necessary because static values are set for a class, not for an object. However you can set up db4o to store static fields if you want to implement constants or enumeration: See "Persist Static Fields"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).PersistStaticFieldValues();
ObjectConfigurationExamples.cs: Persist also the static fields
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).PersistStaticFieldValues()
ObjectConfigurationExamples.vb: Persist also the static fields

When this setting is enabled, all non-primitive-typed static fields are stored the first time an instance of the class is stored. The values are restored every time a database file is opened afterwards, after the class meta information is loaded for this class (when the class objects are retrieved with a query, for example).

Use this option with caution. This option means that static fields are stored in the database. When you change the value of this field, you need to store it explicitly again. Furthermore, db4o will replace the static value at runtime, which can lead to very subtle bugs in your application.

This option does not have any effect on primitive types like ints, longs, floats etc.

Enum Class Use case

One of the use-cases is when you have an enumeration-class which you want to store. For example we have a color-class, which also has some static colors.

public sealed class Color
{
    public static readonly Color Black = new Color(0, 0, 0);
    public static readonly Color White = new Color(255, 255, 255);
    public static readonly Color Red = new Color(255, 0, 0);
    public static readonly Color Green = new Color(0, 255, 0);
    public static readonly Color Blue = new Color(0, 0, 255);

    private readonly int red;
    private readonly int green;
    private readonly int blue;

    private Color(int red, int green, int blue)
    {
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    public int RedValue
    {
        get { return red; }
    }

    public int GreenValue
    {
        get { return green; }
    }

    public int BlueValue
    {
        get { return blue; }
    }

    public bool Equals(Color other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return other.red == red && other.green == green && other.blue == blue;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != typeof (Color)) return false;
        return Equals((Color) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = red;
            result = (result*397) ^ green;
            result = (result*397) ^ blue;
            return result;
        }
    }

    public override string ToString()
    {
        return string.Format("Red: {0}, Green: {1}, Blue: {2}", red, green, blue);
    }
}
Color.cs: Class as enumeration
Public NotInheritable Class Color
    Public Shared ReadOnly Black As New Color(0, 0, 0)
    Public Shared ReadOnly White As New Color(255, 255, 255)
    Public Shared ReadOnly Red As New Color(255, 0, 0)
    Public Shared ReadOnly Green As New Color(0, 255, 0)
    Public Shared ReadOnly Blue As New Color(0, 0, 255)

    Private ReadOnly m_red As Integer
    Private ReadOnly m_green As Integer
    Private ReadOnly m_blue As Integer

    Private Sub New(ByVal red As Integer, ByVal green As Integer, ByVal blue As Integer)
        Me.m_red = red
        Me.m_green = green
        Me.m_blue = blue
    End Sub

    Public ReadOnly Property RedValue() As Integer
        Get
            Return m_red
        End Get
    End Property

    Public ReadOnly Property GreenValue() As Integer
        Get
            Return m_green
        End Get
    End Property

    Public ReadOnly Property BlueValue() As Integer
        Get
            Return m_blue
        End Get
    End Property

    Public Overloads Function Equals(ByVal other As Color) As Boolean
        If ReferenceEquals(Nothing, other) Then Return False
        If ReferenceEquals(Me, other) Then Return True
        Return other.m_red = m_red AndAlso other.m_green = m_green AndAlso other.m_blue = m_blue

    End Function

    Public Overloads Overrides Function Equals(ByVal obj As Object) As Boolean
        If ReferenceEquals(Nothing, obj) Then Return False
        If ReferenceEquals(Me, obj) Then Return True
        If Not Equals(obj.GetType(), GetType(Color)) Then Return False
        Return Equals(DirectCast(obj, Color))

    End Function

    Public Overrides Function GetHashCode() As Integer
        Dim hashCode As Integer = m_red
        hashCode = (hashCode * 397) Xor m_green
        hashCode = (hashCode * 397) Xor m_blue
        Return hashCode
    End Function

    Public Overrides Function ToString() As String
        Return String.Format("Red: {0}, Green: {1}, Blue: {2}", m_red, m_green, m_blue)
    End Function
End Class
Color.vb: Class as enumeration

We want to ensure reference equality on colors so that you easily can check for a certain color. But when we load the colors from the database you get new instances and not the same instance as in the static field. This means that comparing the references will fail.

// When you enable persist static field values, you can compare by reference
// because db4o stores the static field
if (car.Color == Color.Black)
{
    Console.WriteLine("Black cars are boring");
}
else if (car.Color == Color.Red)
{
    Console.WriteLine("Fire engine?");
}
StoringStaticFields.cs: Compare by reference
' When you enable persist static field values, you can compare by reference
' because db4o stores the static field
If car.Color Is Color.Black Then
    Console.WriteLine("Black cars are boring")
ElseIf car.Color Is Color.Red Then
    Console.WriteLine("Fire engine?")
StoringStaticFields.vb: Compare by reference

When you enable the persist static fields option, the static fields are stored. This means that the object referenced in the static fields are loaded from the database and therefore the same instance. And the comparing the references works again.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Color)).PersistStaticFieldValues();
StoringStaticFields.cs: Enable storing static fields for our color class
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Color)).PersistStaticFieldValues()
StoringStaticFields.vb: Enable storing static fields for our color class
././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/staticfieldscs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000644000175000017500000000514411520622616033614 0ustar directhexdirecthexPKܮ7}ϰCar.csRp/,L(QpT0200QQ )I&IY% yz %%Vz )\-}^̼t\kTKQb9 KM-.HLNUpb'$d&erUrq&d&+$$+8'@0q"d4 PKܮ7{KPilot.csQk0#.}E7 >9 {1 5VD3Z> ~hDU!HkxWHku |zQ XEWBq2U[)^{:rɁJ3C,3[|I20nz hg F%5N\f$|3K!{G\@2>-˛Qck9I2pQ;'珤BJ EwQ-!"^^=PKܮ7tPilotCategories.cs?o0g";2[R!E +\UMmC߽kH*aq6Ͽ{<[w4Fmߐ[texYf/ Eaī \0c fTUxī45"IQ3A[p 0@u?Mz!LX py jV,|}<93.Jǧp,)/B l<#\>w97 ŎRR jM)ZGU抹gF[kٻkGPKQ7;J!StaticFieldExample.csY[o6~vO6(0Y6'-IWCQ4ulkeH{xM]kRÖBflK |L.#_/ J&66\,Ttn4E(@,ӏz9&P_rVyM?Ќ B(X0T\dX"I%+%:C}S$[8_%i@Vጁ@_ ZB'qv5 ʹmUny7I3b&/FAIN!(2 %Cj().BLKV)b\M I Hf)*T&ٸgƠf+99աF)( 0`w͌ fLObL߱?P[oKŰԙ]h {ohU"nhI!'9 ˫w??{h>J$2H'{oC._aӌd.B:11ԣC ="ɏeeUCpD.c&yx8LFX5GS%Ƒvn ~8%%Z(Q3=^D>~SvRs)ޯ ѝf(ۋeʣ-Dx7شȚֵo2S~񔋁zg 9:tǧgKƲOЎ\l-v6uz{jg')7C=h PK(ܮ7}ϰ$ Car.cs cqiQ~wW0Ždd؃7'}ӛq Vpi swrLTJ^ BqSSASBY(ܑ3s=_|}|i4%f(St;ŧcWvwMaaK<_3ճ;AP_\hNףtzv9j|sIr1B̗Ŕ?}@1_u6ь8." cK=#Imh6IE jy.R";;*I9&t^.__../G= t] WHi 1&|4\/m4s#֏qup?ZUk|N%nԥèM'J"N osrS(wQ*^` 3X=Op::5F7F*d NnhUGcmҽ{? a7 &r%EJK?IyOnLH>nNYP[TPyw*/Ov\igUnY\6-TߩPAh"⻛dSm!?~ _ִ_ˊ v&lk)ޔ$Z2;gAb4i&T_3)5>]QY kC&WOA ^Ȣ.AFvhGF*W=4m`0ҽxPmk'qGWǽ2S{4G✟N3/6Ð8q܍aLjq!Z>M\%s>R4ބyK9 o0(,֟BpRltC&k@ͱE}PK(cm6Nv$ EnumExample.java 9|߿|N~4PK(6Hj[/ $ Pilot.java X^^i|߿|N~4PK(|6uY3$ !Qualification.java v='l|߿|~4PK"V././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/staticfieldsjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/type_handling/static_fields_and_enums/0000644000175000017500000000516711520622614033617 0ustar directhexdirecthexPKbt7"Car.javaRp/,L(QpT0200QQ )I&IY% yz %%Vz )\-}^.^TX*%?Y$$39-35'(3 D!+,Q/DO ,ZPX\XP霟_4 HrPKbt7`r Pilot.javauAK0-?<]Yxɋ4i۔dRnR]d ۡ0` i~n|ܔRs+2Dc}g(K$Jw¨2"sIw-=ѩlhsxՍ!|'qYI⍬nZ~A7WX-TjJ tq{շ ؈jQ:7X?*\73J:zļwxk蒃T\՟_PKbt7=q*<PilotCategories.javaMK@s COmHAP<4JmM2I4RV ^γ !4#8py@սd!R܅(?,M^?T@uRb]K'(dlPȁKf-\06(,t;Nnp]  &1A^1Z9Br)A$lEY8ߴ]Wҟe8˾p_{&s;74~y7qAvw t(C鿢z-Ck1dLGh4ۏ~#AQ?V7PKbt7jԳ{StaticFieldExample.javaX]o6}V;?M'E: I&]!k Ci"/ɒ,9IЗ!= tLA8Ëy e2TI84R`p{{&7lzMzn " CC#n$SIDnU4LxYaX9\~kC&B&0딸@ղG1aSy9-bP1QdL$OzhA1;i>DJٿ1ُ&iD!L \l_|{ttulGp 6TlxFpE˟G r7ujZʿs9yybѶCɦoS .RMiBqNBsҺ ڹ%ԶDb.DKBI1C:8]l㉒Y :CzR~o0>bq6]5P&n$Zflw.Q*e kkYնg:!B(`G΁UVf$Efjl1Pb0D#j8@oY.~}7[cSZ,B_5o+O37@X(7~e)XRLp"|K,|lӯ~`Ҟ}Egn4Eee˩E4EuR)}oUT?P器`Jwvx{?~A+'n¤;5e4xoydn(ݫC(0F0$&b6gqN;9P: l.‘;hȺF)fIU9~'.d'6/_/G48-h1ZMbs嶋]3wy˂ 9Vs̖{fB&,~#UXL {bИ e4˰ohͥ֙5y=s?KDvǗPzzϟrգYA6p֯Lm7]6Z-(o'"8o"IhRbKBJ#R gDLQ;QSL6]|>qobԚ"2ŗ mPBg`~@Bi_rcBoCk~_{\ {Q")pBد}XW@ZiCDa YpJ~pPB?wXIwOޣ\WpFB<0njt߉{l U+~X>[/AQβtܠ3 }o7BVGȵ)-}=t~J(jAOnxmF%PK(bt7"$ Car.java ?@o?@o?@PK(bt7`r $ Pilot.java PW?@?@?@PK(bt7=q*<$ PilotCategories.java ?@ ?@ ?@PK(bt7jԳ{$ ,StaticFieldExample.java ?@KZ ?@KZ ?@PKdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/callbacks.htm0000644000175000017500000000675711520622610026555 0ustar directhexdirecthex Callbacks
You are here: Advanced Features > Callbacks

Callbacks

Callbacks, also known as events, allow you to be notified on certain database operations. This is useful to trigger additional operations during a database operation. There are two kind of callbacks. First you can certain methods to your objects. When the method matches certain signature it will be called by db4o. See "Object Callbacks"

Additionally you can register event listener to a object-container which will be called on certain operations. See "Event Registry API"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api/0000755000175000017500000000000011520622616030006 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api/genericreflector.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api/genericreflector.h0000644000175000017500000001067411520622616033511 0ustar directhexdirecthex GenericReflector
You are here: Advanced Features > db4o Reflection API > GenericReflector

GenericReflector

db4o uses reflection internally for persisting and instantiating user objects. Reflection helps db4o to manage classes in a general way while saving. It also makes instantiation of objects using class name possible. However db4o reflection API can also work on generic objects when a class information is not available.

db4o uses a generic reflector as a decorator around specific reflector. The generic reflector is set when an object container is opened. All subsequent reflector calls are routed through this decorator.

The generic reflector keeps list of known classes in memory. When the generic reflector is called, it first checks its list of known classes. If the class cannot be found, the task is transferred to the delegate reflector. If the delegate fails as well, generic objects are created, which hold simulated "field values" in an array of objects.

Generic reflector makes possible the following use cases:

  • Running a db4o server without deploying application classes.
  • Easier access to stored objects where classes or fields are not available.
  • Building interfaces to db4o from any programming language.

One of the live use cases is the ObjectManager, which uses the generic reflector to read C# objects from Java.

The generic reflector is automatically used when the class of a stored object is not found.

././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api/creating_your_own_reflector.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/advanced_topics/db4o_reflection_api/creating_your_own_0000644000175000017500000001763411520622606033637 0ustar directhexdirecthex Creating your own reflector
You are here: Advanced Features > db4o Reflection API > Creating your own reflector

Creating your own reflector

By default db4o uses the NetReflector. As alternative you can create your own reflector and use it with db4o. In order to do so you need to implement the IReflector interface. And then pass an instance of your implementation to db4o.

Here's an example of a logging reflector. Its only difference from standard reflector is that information about loaded classes is outputted to console:

internal class LoggerReflector : IReflector
{
    private readonly IReflector readReflector;

    public LoggerReflector()
    {
        this.readReflector = new NetReflector();
    }

    public LoggerReflector(IReflector readReflector)
    {
        this.readReflector = readReflector;
    }

    public void Configuration(IReflectorConfiguration reflectorConfiguration)
    {
        readReflector.Configuration(reflectorConfiguration);
    }

    public IReflectArray Array()
    {
        return readReflector.Array();
    }

    public IReflectClass ForClass(Type type)
    {
        Console.WriteLine("Reflector.forClass({0})", type);
        return readReflector.ForClass(type);
    }

    public IReflectClass ForName(string className)
    {
        Console.WriteLine("Reflector.forName({0})", className);
        return readReflector.ForName(className);
    }

    public IReflectClass ForObject(object o)
    {
        Console.WriteLine("Reflector.forObject(" + o + ")");
        return readReflector.ForObject(o);
    }

    public bool IsCollection(IReflectClass reflectClass)
    {
        return readReflector.IsCollection(reflectClass);
    }

    public void SetParent(IReflector reflector)
    {
        readReflector.SetParent(reflector);
    }

    public object DeepClone(object o)
    {
        return new LoggerReflector((IReflector) readReflector.DeepClone(o));
    }
}
ReflectorExamples.cs: Logging reflector
Friend Class LoggerReflector
    Implements IReflector
    Private ReadOnly readReflector As IReflector

    Public Sub New()
        Me.readReflector = New NetReflector()
    End Sub

    Public Sub New(ByVal readReflector As IReflector) 
        Me.readReflector = readReflector
    End Sub

    Public Sub Configuration(ByVal reflectorConfiguration As IReflectorConfiguration) _
        Implements IReflector.Configuration
        readReflector.Configuration(reflectorConfiguration)
    End Sub

    Public Function Array() As IReflectArray _
        Implements IReflector.Array
        Return readReflector.Array()
    End Function

    Public Function ForClass(ByVal type As Type) As IReflectClass _
        Implements IReflector.ForClass
        Console.WriteLine("Reflector.forClass({0})", type)
        Return readReflector.ForClass(type)
    End Function

    Public Function ForName(ByVal className As String) As IReflectClass _
        Implements IReflector.ForName
        Console.WriteLine("Reflector.forName({0})", className)
        Return readReflector.ForName(className)
    End Function

    Public Function ForObject(ByVal o As Object) As IReflectClass _
        Implements IReflector.ForObject
        Console.WriteLine("Reflector.forObject(" & Convert.ToString(o) & ")")
        Return readReflector.ForObject(o)
    End Function

    Public Function IsCollection(ByVal reflectClass As IReflectClass) As Boolean _
        Implements IReflector.IsCollection
        Return readReflector.IsCollection(reflectClass)
    End Function

    Public Sub SetParent(ByVal reflector As IReflector) _
        Implements IReflector.SetParent
        readReflector.SetParent(reflector)
    End Sub

    Public Function DeepClone(ByVal o As Object) As Object _
        Implements IReflector.DeepClone
        Return New LoggerReflector(DirectCast(readReflector.DeepClone(o), IReflector))
    End Function
End Class
ReflectorExamples.vb: Logging reflector
db4o-8.0.184.15484+dfsg/doc/reference/Content/Glossary.htm0000644000175000017500000002614011520622616023305 0ustar directhexdirecthex Glossary

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/product_philosophy.htm0000644000175000017500000001313211520622616025435 0ustar directhexdirecthex Product Philosophy
You are here: Product Philosophy

Product Philosophy

The db4o database is sponsored and supported by Versant Corporation, a publicly-held company (NASD:VSNT) based in Redwood City, California. Versant is a leading developer of object database technology supporting both open source and commercial database initiatives.

Versant's commercial object database technology, targeting extreme scale systems, is powering some of the world's most demanding applications for fortune 1000 companies in industries including:

  • Telecommunications: Alcatel-Lucent, Deutsche Telecom, France Telecom, Ericsson, NEC, Nortel, Orange, Samsung, and more.
  • Finance: Financial Times, New York Stock Exchange, Dow Jones, Reuters, London Clearing House, Bank of America, and more,
  • Transportation: Sabre, GE Railways, BNS Railways, Galileo, and more.
  • Defense: Raytheon, Northrop Grumman, Lockheed, and more.
  • BioInformatics: Mayo Clinic, St. Jude medical, Eidogen, Science Factory, and more.

db4o has users and customers coming from 170 different countries, from Albania to Zimbabwe, and ranging from world class leaders like Boeing, Bosch, Intel, Ricohand Seagate to a wide range of highly innovative start-up companies.

It is Versant's and the db4o team's mission to give developers a choice differentiated from relational approaches when it comes to object persistence and thus make their life a lot easier. There is no mapping! No mapping annotations or XML mapping meta data. The db4o database is designed to be a universal, affordable product platform that is easy to learn and use. Versant's open source dual-license business model combines the power of an open source development community with servicing commercial customers' needs for a predictable product roadmap, indemnification, single point of contact and full tech support with fast response times. For those requiring the super scale database capabilities, you can find the same easy to learn and implement solution in Versant's commercial products which have been in development for over a decade. This technology is also far more affordable that traditional relational database systems such as Oracle, Sybase, SQL Server, etc and to boot users also enjoy overall reductions in system footprints by as much as 50% due to less indexing data, simpler design, zero mapping.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration.htm0000644000175000017500000002342611520622616024355 0ustar directhexdirecthex Configuration
You are here: Configuration

Configuration

db4o is configured by its configuration API. The configuration allows you to adjust db4o to your scenarios.

Configure db4o

In order to configure db4o, you need to create a new configuration-instance and set the desired settings on it. After that, you pass the configuration-instance to the object-container factory.

Note that you cannot share a configuration-instance. For each object-container you create, you need to pass in a new configuration-instance. It's recommended to create a method which will return a new configuration instance on request:

Embedded-Configuration

For an embedded container you can configure the common-, file- and id-system-configuration.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
// change the configuration...
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
ConfigurationBasics.cs: Configure embedded object container
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
' change the configuration...
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
ConfigurationBasics.vb: Configure embedded object container

Server-Configuration

For an server you can configure the common-, file-, networking-, server- and id-system-configuration.

IServerConfiguration configuration = Db4oClientServer.NewServerConfiguration();
// change the configuration...
IObjectServer server = Db4oClientServer.OpenServer(configuration, "database.db4o", 1337);
ConfigurationBasics.cs: Configure the db4o-server
Dim configuration As IServerConfiguration = Db4oClientServer.NewServerConfiguration()
' change the configuration...
Dim server As IObjectServer = Db4oClientServer.OpenServer(configuration, "database.db4o", 1337)
ConfigurationBasics.vb: Configure the db4o-server

Client-Configuration

For an client you can configure the common-, networking-, client- and id-system-configuration.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
// change the configuration...
IObjectContainer container = Db4oClientServer.OpenClient(configuration, "localhost", 1337, "user", "pwd");
ConfigurationBasics.cs: Configure a client object container
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
' change the configuration...
Dim container As IObjectContainer = Db4oClientServer.OpenClient(configuration, "localhost", 1337, "user", "pwd")
ConfigurationBasics.vb: Configure a client object container

Configuration Is Not Persistent

The db4o configuration is not persistent with a few exception. This means that you need to configure db4o each time you create a object-container instance.

Configuration in Client/Server-Mode

For using db4o in client/server mode it is recommended to use the same configuration on the server and on the client. To set this up nicely it makes sense to create one application class with one method that returns the required configuration and to deploy this class both to the server and to all clients.

Configuration-Settings Overview

The configuration-settings which are common across -client, embedded and db4o-server are summed up here: See "Common Configuration"

 

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/0000755000175000017500000000000011520622614022735 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/Images/0000755000175000017500000000000011520622614024142 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/Images/ShowTags.jpg0000644000175000017500000000140011520622610026372 0ustar directhexdirecthexJFIF``LEAD Technologies Inc. V1.01 4"@.0&4LCPOKCIHT_yfTYr[HIijr}Qey>"">WIW  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?& R<=uǻu=(ڥ]70\4{8v (IFSz;j`P2ʍAN2}OĂ"T 0Ӝd qFUF ,#db4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/Images/icon.jpg0000644000175000017500000000331411520622614025575 0ustar directhexdirecthexJFIF``LEAD Technologies Inc. V1.01  }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzw!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?3Psv>Wگ˫^[JKM93adžr\A .jz  ]ON[r|%~eհt3*5`N&XHCGV8l\pPTsO(>xω|-$ZH g^x7>%K_H>.>xl! 0Es%,3TV=9nW'~^gk=^P{>ngB'7,yyyc{_^yO'-0jf?el/E/mL./|uǑir)&Z|Io+Yh_֯W>~cľR!~$jiB@g!\_apiep~XJ߈R!ΧW&tc_5??xF4 Ɖh <#"mX~&s>G>ɝrQn3,]/k V2UJqeNjTcE2ugUQb8c_PG+ejN9ԧYεhQĬoAuO Sk?$9[MϋV0χ|W]C1y>SNkJ뮜e?Ed~Am=G}čN2Gk%xmƜZj[HMKOԭ=RPꑱLrL~/"cJu*8rҨ씠a0XSʜg# Z.&ivi嗆ll} tZF.jK,iMtUXZUP z(Ҝq+T:Xjjp'z$*SmDjJiJU%ʔ9ڌеzCjvh6C{kZZuIahWz ̶W'-̯u R,sT!NRFPUӥi*U#ȟkQRq!Rׄ:vks'd|ReūEg,%\$kQ:QTF.g)[\ъ(ة/o[ r"7fMb|ZiyB?J>yķR.ҙ5MCIFkvydd6sp1|QKQRJJI84(JF(F\_ Zm4tMhl[⚵%j'ZZԦcOwpܰ.G)"F91n00kak¥7J 2ѧVqRRd0uXYPwԛN-i(ԢZivpwm4p6ơ"H`}DTpaa9Ս pVrVjQRRWJל嬤ܞjU?i9OT!f, #{F+DKcdb4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/Code/0000755000175000017500000000000011520622616023611 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/Resources/Code/prettify.js0000644000175000017500000002731211520622616026022 0ustar directhexdirecthexfunction H(){var x=navigator&&navigator.userAgent&&/\bMSIE 6\./.test(navigator.userAgent);H=function(){return x};return x}(function(){function x(b){b=b.split(/ /g);var a={};for(var c=b.length;--c>=0;){var d=b[c];if(d)a[d]=null}return a}var y="break continue do else for if return while ",U=y+"auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",D=U+"catch class delete false import new operator private protected public this throw true try ", I=D+"alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ",J=D+"boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",V=J+"as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ", K=D+"debugger eval export function get null set undefined var with Infinity NaN ",L="caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",M=y+"and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",N=y+"alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ", O=y+"case done elif esac eval fi function in local set then until ",W=I+V+K+L+M+N+O;function X(b){return b>="a"&&b<="z"||b>="A"&&b<="Z"}function u(b,a,c,d){b.unshift(c,d||0);try{a.splice.apply(a,b)}finally{b.splice(0,2)}}var Y=(function(){var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=","~","break","case","continue", "delete","do","else","finally","instanceof","return","throw","try","typeof"],a="(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)";for(var c=0;c:&])/g,"\\$1")}a+="|^)\\s*$";return new RegExp(a)})(),P=/&/g,Q=//g,Z=/\"/g;function $(b){return b.replace(P,"&").replace(Q,"<").replace(R,">").replace(Z,""")}function E(b){return b.replace(P,"&").replace(Q,"<").replace(R,">")}var aa= /</g,ba=/>/g,ca=/'/g,da=/"/g,ea=/&/g,fa=/ /g;function ga(b){var a=b.indexOf("&");if(a<0)return b;for(--a;(a=b.indexOf("&#",a+1))>=0;){var c=b.indexOf(";",a);if(c>=0){var d=b.substring(a+3,c),g=10;if(d&&d.charAt(0)==="x"){d=d.substring(1);g=16}var e=parseInt(d,g);if(!isNaN(e))b=b.substring(0,a)+String.fromCharCode(e)+b.substring(c+1)}}return b.replace(aa,"<").replace(ba,">").replace(ca,"'").replace(da,'"').replace(ea,"&").replace(fa," ")}function S(b){return"XMP"===b.tagName} function z(b,a){switch(b.nodeType){case 1:var c=b.tagName.toLowerCase();a.push("<",c);for(var d=0;d");for(var e=b.firstChild;e;e=e.nextSibling)z(e,a);if(b.firstChild||!/^(?:br|link|img)$/.test(c))a.push("");break;case 2:a.push(b.name.toLowerCase(),'="',$(b.value),'"');break;case 3:case 4:a.push(E(b.nodeValue));break}}var F=null;function ha(b){if(null===F){var a=document.createElement("PRE"); a.appendChild(document.createTextNode('\n'));F=!/=0;i-=" ".length)d.push(" ".substring(0,i));g=e+1;break; case "\n":a=0;break;default:++a}}if(!d)return c;d.push(c.substring(g));return d.join("")}}var ja=/(?:[^<]+| ././@LongLink0000000000000000000000000000022700000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tp_enhanced_example/tp_enhancement_on_java/sensorpanel.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tp_enhan0000644000175000017500000001116011520622606033710 0ustar directhexdirecthex SensorPanel

SensorPanel

SensorPanel.Java
/**//* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */

package com.db4odoc.tpbuildtime;

public class SensorPanel  {

  private Object _sensor;

  private SensorPanel _next;

  public SensorPanel()  {
    // default constructor for instantiation
  }
  // end SensorPanel

  public SensorPanel(int value)  {
    _sensor = new Integer(value);
  }
  // end SensorPanel

  public SensorPanel getNext()  {
    return _next;
  }
  // end getNext
  
  public Object getSensor()  {
    return _sensor;
  }
  // end getSensor
  
  public void setSensor(Object sensor)  {
    _sensor = sensor;
  }
  // end setSensor
  
  public SensorPanel createList(int length)  {
    return createList(length, 1);
  }
  // end createList

  public SensorPanel createList(int length, int first)  {
    int val = first;
    SensorPanel root = newElement(first);
    SensorPanel list = root;
    while (--length > 0)  {
      list._next = newElement(++val);
      list = list._next;
    }
    return root;
  }
  // end createList

  protected SensorPanel newElement(int value)  {
    return new SensorPanel(value);
  }
  // end newElement

  public String toString()  {
    return "Sensor #" + getSensor();
  }
  // end toString
}
././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tp_enhanced_example/tpexamplesjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tp_enhan0000644000175000017500000000345211520622616033716 0ustar directhexdirecthexPKq48K"SensorPanel.javaOk@2; Ec)BM{ =J[Xv+vGVKwRBۙtۈvGP>\4{,<*^{_0T^M=g?Y*Aj4B6$~#.S(WΈ#!lpGZՓ_HS-%)K l#_H0Z9{U^ Ep` @ESF"}q0HQsXr™&ȜbN{:hр=9^t~k/rfAFYX SZڍY| wӱ=Mb-0RfZP")'{TTƯ_KrFڰ\.c2|U, ;&/$\$٘Iфpyt/uZ _&x Nǯ3W PKӃ48<wTPExample.javaV[o6~v]9)r}hK<RhPEZ$ԙC9f'ɬы8eM(H q.9 hbQZY G\_$  ꇐad&9.LCOAp}h+n Pq2 -:Azt:,֊$`$ qQ:B44$I+O֣` RM9IeqТ;abAneIUShaZ kH6?碓0^oՎfz)L%&n5ߎ'Y@qy{$AN`\o.}$mpWK׊K#$9YUgy(5QH+v%̍+# N1 90* $ ɶ+n%Z}+̄N~nģ 8k´s@Vl qC3̼))\ |Mo9@WF1˶A"%q-O̭hͩ,ݺ" /̛/Ûp3s!K3MmT>bRŧ|X喓_9JO-7[fFaU=sdO~=: XF~ߍ[&lO >QOk[ :L;p-/uǽ{msa԰9WnK'Ԛ9׈-Н;D DF)ucks֩CRw"Gc@?JTN\; 'll9V7PK(q48K"$ SensorPanel.java Q^[bO[bO[PK(Ӄ48<w$ TPExample.java Ҧ!q[@`O[@`O[PKR././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/transparent_persistence.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/transpar0000644000175000017500000001023611520622614033750 0ustar directhexdirecthex Transparent Persistence Pitfalls
You are here: Basics Operations & Concepts > Update Concept > Transparent Persistence > Transparent Persistence Pitfalls

Transparent Persistence Pitfalls

Transparent Persistence is closely coupled with Transparent Activation, therefore the same pitfalls apply here. However there are some additional catches:

././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/transparent_persistence_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/transpar0000644000175000017500000003761211520622610033753 0ustar directhexdirecthex Transparent Persistence Example
You are here: Basics Operations & Concepts > Update Concept > Transparent Persistence > Transparent Persistence Example

Transparent Persistence Example

In order to support TP, the persistent objects need to implement the IActivatable-interface.

An object which implements the IActivatable-interface is responsible for activating itself. For this purpose the class needs a field to keep its activator. This field is only used by the transparent activation framework. Therefore it's marked as transient, to avoid that it's stored in the database. 

public class Person : IActivatable
{
    [NonSerialized] private IActivator activator;
Person.cs: Implement the required activatable interface and add activator
Public Class Person
    Implements IActivatable
    <Transient()> _
    Private m_activator As IActivator
Person.vb: Implement the required activatable interface and add activator

Then implement the two methods of the IActivatable-interface. The bind-method binds an activator to the object. It's called by the transparent activation framework. The activate-method needs to be called before any read or write operation on the object. Since these two methods are always the same, you can move the implementation to a common super class or to a static utility class.

public void Bind(IActivator activator)
{
    if (this.activator == activator)
    {
        return;
    }
    if (activator != null && null != this.activator)
    {
        throw new InvalidOperationException("Object can only be bound to one activator");
    }
    this.activator = activator;
}

public void Activate(ActivationPurpose activationPurpose)
{
    if (null != activator)
    {
        activator.Activate(activationPurpose);
    }
}
Person.cs: Implement the activatable interface methods
Public Sub Bind(ByVal activator As IActivator) _
        Implements IActivatable.Bind
    If m_activator Is activator Then
        Exit Sub
    End If
    If activator IsNot Nothing AndAlso m_activator IsNot Nothing Then
        Throw New InvalidOperationException("Object can only be bound to one activator")
    End If
    m_activator = activator
End Sub

Public Sub Activate(ByVal activationPurpose As ActivationPurpose) _
        Implements IActivatable.Activate
    If m_activator IsNot Nothing Then
        m_activator.Activate(activationPurpose)
    End If
End Sub
Person.vb: Implement the activatable interface methods

Now the important part. Every time a field of the class is accessed you need to call the activate-method with the purpose. For example in every property or other method. Probably the best way is to use only property even within the class to access fields. And the property ensures that the activate-method is called.

public string Name
{
    get
    {
        Activate(ActivationPurpose.Read);
        return name;
    }
    set
    {
        Activate(ActivationPurpose.Write);
        name = value;
    }
}


public override string ToString()
{
    // use the getter/setter withing the class,
    // to ensure the activate-method is called
    return Name;
}
Person.cs: Call the activate method on every field access
Public Property Name() As String
    Get
        Activate(ActivationPurpose.Read)
        Return m_name
    End Get
    Set(ByVal value As String)
        Activate(ActivationPurpose.Write)
        m_name = value
    End Set
End Property


Public Overloads Overrides Function ToString() As String
    ' use the getter/setter withing the class,
    ' to ensure the activate-method is called
    Return Name
End Function
Person.vb: Call the activate method on every field access

Implementing the IActivatable-interface manually for every class is repetitive and error prone. That's why this process can be automated. See "TP Enhancement"

The last step is to enable transparent persistence via configuration.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.Add(new TransparentPersistenceSupport());
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, DatabaseFileName);
TransparentActivationExamples.cs: Activate transparent persistence
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.Add(New TransparentPersistenceSupport())
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, DatabaseFileName)
TransparentActivationExamples.vb: Activate transparent persistence

Now transparent persistence is enabled. You have to store the object only once initially. After that, changes are automatically stored on the commit call.

using (IObjectContainer container = OpenDatabaseTP())
{
    Person person = Person.PersonWithHistory();
    container.Store(person);
}
using (IObjectContainer container = OpenDatabaseTP())
{
    Person person = QueryByName(container, "Joanna the 10");
    Person beginOfDynasty = person.Mother;

    // With transparent persistence enabled, you can navigate deeply
    // nested object graphs. db4o will ensure that the objects
    // are loaded from the database.
    while (null != beginOfDynasty.Mother)
    {
        beginOfDynasty = beginOfDynasty.Mother;
    }
    Console.WriteLine(beginOfDynasty.Name);

    // Updating a object doesn't requires no store call.
    // Just change the objects and the call commit.
    beginOfDynasty.Name = "New Name";
    container.Commit();
}
using (IObjectContainer container = OpenDatabaseTP())
{
    Person person = QueryByName(container, "New Name");
    // The changes are stored, due to transparent persistence
    Console.WriteLine(person.Name);
}
TransparentActivationExamples.cs: Transparent persistence in action
Using container As IObjectContainer = OpenDatabaseTP()
    Dim joanna As Person = Person.PersonWithHistory()
    container.Store(joanna)
End Using
Using container As IObjectContainer = OpenDatabaseTP()
    Dim joanna As Person = QueryByName(container, "Joanna the 10")
    Dim beginOfDynasty As Person = joanna.Mother

    ' With transparent persistence enabled, you can navigate deeply
    ' nested object graphs. db4o will ensure that the objects
    ' are loaded from the database.
    While beginOfDynasty.Mother IsNot Nothing
        beginOfDynasty = beginOfDynasty.Mother
    End While
    Console.WriteLine(beginOfDynasty.Name)

    ' Updating a object doesn't requires no store call.
    ' Just change the objects and the call commit.
    beginOfDynasty.Name = "New Name"
    container.Commit()
End Using
Using container As IObjectContainer = OpenDatabaseTP()
    Dim joanna As Person = QueryByName(container, "New Name")
    ' The changes are stored, due to transparent persistence
    Console.WriteLine(joanna.Name)
End Using
TransparentActivationExamples.vb: Transparent persistence in action
././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tpexamplecollectionjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence/tpexampl0000644000175000017500000000456711520622620033757 0ustar directhexdirecthexPKq:8F8Q Pilot.javaS]k0}v8ae yG]@NgPOyu]e\7ί ?YwQyF_Xc$nzh42I Xv? XL[HK< DOߠhc gBUpPL9*m倉jA'=êgO[99|1$ LN ҢפI$۷@EjĿE\{nE5>T[݁Rb31 G_]sea ] )deex/2L4gM#0:W^!}e Q*paFB,U8.{;Ȟv_jt86B.r9,VZ8[Szh oqraHu8f RՂEV`ҁ3)-OFePKtt:86G Team.javaSk0~vyP( eu}Ql_u$K2O?,))Q>Ŋ͖'h+]?bCa%2~ς57 xKtadwF, Dg%xOHH6s 'NBxnw~}^OiWK@#sBށd:TE*k' cpVHM_amaa- _VT=Y6V4@+'|<oB@[쉓 oS C'-Z}LyH;dBoB<@y)PavV(aj'%\\g+?z[J.<7h!F3+1I85K͘ey([oDɨ,/wF;mqBʠƘ$#nG6NI'/8nm1_wMSJ !)-t\>c@&pߠîF/bw7WP. m.*0ϗ]Vb[~3}OIUG1#j$HˋxN.!?N32t͑W@L"BgReM S|_zvֺI)>$,ng s\:h,{'' ;鞸x.5Vӝ>ǂ9`DMRǀ e5nV 3uˁoՎkko6fa%{ 6ǔ_(_lC> ոN@kiBZR).@wFY-\ (z>ځ1(7vX!w6/LV]Z*\[s{@m3Şi=5" ɭ.Rb+j|1yn;)zQRHR{?+ihbAyB;nhӽ,}GEPkJzJX`}}ij.LS3%OV} QܟnzkHsPK(q:8F8Q $ Pilot.java `L#`L#`PK(tt:86G $ Team.java pv`#`#`PK(p:8N1 $ rTPCollectionExample.java  {(` _ _PK!@db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/update_depth_in_action.htm0000644000175000017500000002407611520622606032441 0ustar directhexdirecthex Update Depth In Action
You are here: Basics Operations & Concepts > Update Concept > Update Depth In Action

Update Depth In Action

Let's see db4o's update depth in action. We store a few cars with their pilots in the database. Then we update a car and its driver and store the car. The we reopen the database and check if everything was updated. To our surprise the car-name was updated, but the driver isn't. This is the direct result of db4o's update depth policy. It only updates object to a certain update-depth.

using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Car car = QueryForCar(container);
    car.CarName = "New Mercedes";
    car.Driver.Name = "New Driver Name";

    // With the default-update depth of one, only the changes
    // on the car-object are stored, but not the changes on
    // the person
    container.Store(car);
}
using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Car car = QueryForCar(container);
    Console.WriteLine("Car-Name:" + car.CarName);
    Console.WriteLine("Driver-Name:" + car.Driver.Name);
}
UpdateDepthPitfall.cs: Update depth limits what is store when updating objects
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim car As Car = QueryForCar(container)
    car.CarName = "New Mercedes"
    car.Driver.Name = "New Driver Name"

    ' With the default-update depth of one, only the changes
    ' on the car-object are stored, but not the changes on
    ' the person
    container.Store(car)
End Using
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim car As Car = QueryForCar(container)
    Console.WriteLine("Car-Name:" & car.CarName)
    Console.WriteLine("Driver-Name:" & car.Driver.Name)
End Using
UpdateDepthPitfall.vb: Update depth limits what is store when updating objects

Explicitly Store The Driver

One solution to this issue is to store updated object explicitly, except value objects. So in our case we would store the car and the pilot. This works fine for simple models. However as the model gets more complex this is probably not a feasible solution.

Car car = QueryForCar(container);
car.CarName = "New Mercedes";
car.Driver.Name = "New Driver Name";

// Explicitly store the driver to ensure that those changes are also in the database
container.Store(car);
container.Store(car.Driver);
UpdateDepthPitfall.cs: Explicitly store changes on the driver
Dim car As Car = QueryForCar(container)
car.CarName = "New Mercedes"
car.Driver.Name = "New Driver Name"

' Explicitly store the driver to ensure that those changes are also in the database
container.Store(car)
UpdateDepthPitfall.vb: Explicitly store changes on the driver

There also a variation of this. You can use the store method of the extended container and explicitly state the update depth for the store operation.

Car car = QueryForCar(container);
car.CarName = "New Mercedes";
car.Driver.Name = "New Driver Name";

// Explicitly state the update depth
container.Ext().Store(car, 2);
UpdateDepthPitfall.cs: Explicitly use the update depth
Dim car As Car = QueryForCar(container)
car.CarName = "New Mercedes"
car.Driver.Name = "New Driver Name"

' Explicitly state the update depth
UpdateDepthPitfall.vb: Explicitly use the update depth

Configure Update Depth

As alternative you can configure the update depth. You can increase it globally or for certain classes. It's also possible to enable cascading updates for certain classes or fields.

Transparent Persistence

You can get rid of all the update depth troubles by using transparent persistence. In this mode db4o tracks all changes and stores them. See "Transparent Persistence"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/updating_collections.htm0000644000175000017500000001701211520622614032150 0ustar directhexdirecthex Updating Collections
You are here: Basics Operations & Concepts > Update Concept > Updating Collections

Updating Collections

From the db4o perspective collections behave like ordinary objects. This means that the update-depth also applies to collections. When you change a collection and store the object which contains it, the changes are not stored by default.

using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Person jodie = QueryForJodie(container);
    jodie.Add(new Person("Jamie"));
    // Remember that a collection is also a regular object
    // so with the default-update depth of one, only the changes
    // on the person-object are stored, but not the changes on
    // the friend-list.
    container.Store(jodie);
}
using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Person jodie = QueryForJodie(container);
    foreach (Person person in jodie.Friends)
    {
        // the added friend is gone, because the update-depth is to low
        Console.WriteLine("Friend=" + person.Name);
    }
}
UpdateDepthPitfall.cs: Update doesn't work on collection
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim jodie As Person = QueryForJodie(container)
    jodie.Add(New Person("Jamie"))
    ' Remember that a collection is also a regular object
    ' so with the default-update depth of one, only the changes
    ' on the person-object are stored, but not the changes on
    ' the friend-list.
    container.Store(jodie)
End Using
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim jodie As Person = QueryForJodie(container)
    For Each person As Person In jodie.Friends
        ' the added friend is gone, because the update-depth is to low
        Console.WriteLine("Friend=" & person.Name)
    Next
End Using
UpdateDepthPitfall.vb: Update doesn't work on collection

For collections the same rules and settings work as for regular objects. For example when you increase the update depth to two, you can store the parent object and the changes of the collection are persisted as well.

IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
config.Common.UpdateDepth = 2;
using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
UpdateDepthPitfall.cs: A higher update depth fixes the issue
Dim config As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
config.Common.UpdateDepth = 2
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
UpdateDepthPitfall.vb: A higher update depth fixes the issue
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/update_concept/transparent_persistence.htm0000644000175000017500000001160511520622610032702 0ustar directhexdirecthex Transparent Persistence
You are here: Basics Operations & Concepts > Update Concept > Transparent Persistence

Transparent Persistence

One of db4o's goals is to make the database transparent to the application logic. Wouldn't it be nice to initially register an object with a single store()-call and then let the database manage all future object modifications? Transparent Persistence does exactly that.It keeps track of changes and stores all modified objects automatically when committing.

This has several benefits:

  • Clean an refactorable code. The code doesn't depend on the right activation-depth.
  • Performance-benefits. Only the objects which are needed are loaded into memory. And only modified objects are stored.
  • No changes can be lost due to miss configured update-depth.

Transparent persistence takes care of activating the objects and storing changes. Take a look a simple example. See "Transparent Persistence Example"

In order to support transparent persistence the persisted object need to implement certain interfaces. To manually implementing this interface is time consuming. Therefore it can be automated with enhancement tools. See "TP Enhancement"

When using Transparent Persistence collections might need special attention. See "Transparent Persistence Collections"

For a deeper understanding of the mechanism: See "Transparent Persistence Implementation"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing.htm0000644000175000017500000001700111520622610024541 0ustar directhexdirecthex Indexing
You are here: Basics Operations & Concepts > Indexing

Indexing

db4o supports indexes like most databases do. Indexes are data structures which allow efficient lookup of data. When you enable an index, db4o will add an entry to index for each object. This makes the insert and update operation a little slower. However it makes queries a lot faster. A query which uses an index is a order of magnitude faster that a query which cannot use a index.

You can create a index by enabling it on a field. See "Adding a Field Index"

Note that you need to set the index on a field, not a property. This is also true for auto-properties.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("name").Indexed(true);
ObjectFieldConfigurations.cs: Index a certain field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("name").Indexed(True)
ObjectFieldConfigurations.vb: Index a certain field

As an alternative you also can use the appropriate Attribute on the field which you want to index.

[Indexed]
private string zipCode;
ObjectFieldConfigurations.cs: Index a field
<Indexed()> _
Private m_zipCode As String
ObjectFieldConfigurations.vb: Index a field

When And Where Do I Need An Index

When do you need an index? As a rule of thumb: Add an index all fields which are used in queries. See "When And Where"

There are different factors which need to be fulfilled to profit from an index.

  • Read operations dominate the database operations: When you application only writes objects but rarely query for objects, there's no benefit of faster queries. However in most system reading is the dominate operation and should be fast.
  • You're using the field / class in a query: If no query touches the field or class you're have a index on, you have not benefit from the index. The index improves only the query performance, but slows down store and update-operations.
  • You actually need a substantial amount of data. The performance gains of an index are negligible for small data sets. When you test indexes use 10'000 and more objects.

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/identity_concept.htm0000644000175000017500000002037511520622616026316 0ustar directhexdirecthex Identity Concept
You are here: Basics Operations & Concepts > Identity Concept

Identity Concept

You've maybe noticed that you don't need to add an identifier to your objects in order to store them with db4o. So how does db4o manage objects? db4o uses the object-identity to identify objects. db4o ensures that each stored object in the database has only one in memory representation per object container. If you load an object in different ways db4o will always return the same object. Or as rule of thumb: The objects in the database behave like objects in memory. When you run multiple queries or retrieve objects in another way, the same object in the database will always represented by the same object in memory.

Car theCar = container.Query<Car>()[0];
Pilot thePilot = container.Query<Pilot>()[0];
Pilot pilotViaCar = theCar.Pilot;
AssertTrue(thePilot == pilotViaCar);
IdentityConcepts.cs: db4o ensures reference equality
Dim theCar As Car = container.Query(Of Car)()(0)
Dim thePilot As Pilot = container.Query(Of Pilot)()(0)
Dim pilotViaCar As Pilot = theCar.Pilot
IdentityConcepts.vb: db4o ensures reference equality

In order to implement this behavior each object container keeps a mapping between the objects in memory and the stored object representation. When you load the same object with multiple object-containers (for example with session-containers or in client-server-mode), it will have different in memory-identity. db4o ensures the same identity only for a single object-container.

Car loadedWithContainer1 = container1.Query<Car>()[0];
Car loadedWithContainer2 = container2.Query<Car>()[0];
AssertFalse(loadedWithContainer1 == loadedWithContainer2);
IdentityConcepts.cs: Loading with different object container results in different objects
Dim loadedWithContainer1 As Car = container1.Query(Of Car)()(0)
Dim loadedWithContainer2 As Car = container2.Query(Of Car)()(0)
IdentityConcepts.vb: Loading with different object container results in different objects

This also means that an object should always be processed with the same object-container. When you load a object in one container and store it with another container db4o cannot recognize the object and will store it as a completely new object. Therefore you need to use the same container to store and load objects.

The identity concept works really well for desktop and embedded applications where you can have a single object container and keep that container open while the application is running. In such a case the behavior is just like you would work with regular objects. However this behavior doesn't work where you need to serialize objects, for example in web-applications. In such scenarios you need to do some extra work. See "Disconnected Objects"

Further Information

Maybe your wondering why db4o manages object by identity. Why not by equality? There are good reasons why this is the case. See "Identity Vs Equality"

In order to manage objects by identity db4o has a reference cache which contains all loaded objects. See "The Reference Cache"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing/0000755000175000017500000000000011520622616024036 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing/when_and_where.htm0000644000175000017500000001641611520622606027534 0ustar directhexdirecthex When And Where
You are here: Basics Operations & Concepts > Indexing > When And Where

When And Where

When do you need an index? And on which fields do I need an index? An index has a costs and benefits. See "Costs And Benefits". Therefore you should only add one when you actually benefit from it.

When To Add Queries

Indexes speed up queries but slow down store and delete operations. You only need to add indexes when queries are too slow. There's no real benefit to add a index when your queries are already fast enough.

Also add index only on fields which are used in queries. Indexes on fields which are never used in a query have no benefit.

Where To Add Queries

How do I find the queries which can benefit from indexes? How do I find queries which couldn't utilize indexes? You can use the diagnostic-API find out. Filter for the LoadedFromClassIndex-message. Every time this message arrives the query didn't use a field index. You can add a break-point to the message-output and find out which query is the source and then add the index.

internal class IndexDiagnostics : IDiagnosticListener
{
    public void OnDiagnostic(IDiagnostic diagnostic)
    {
        if (diagnostic is LoadedFromClassIndex)
        {
            Console.WriteLine("This query couldn't use field indexes " +
                              ((LoadedFromClassIndex) diagnostic).Reason());
            Console.WriteLine(diagnostic);
        }
    }
}
WhereToIndexExample.cs: Index diagnostics
Friend Class IndexDiagnostics
    Implements IDiagnosticListener
    Public Sub OnDiagnostic(ByVal diagnostic As IDiagnostic) _
        Implements IDiagnosticListener.OnDiagnostic
        If TypeOf diagnostic Is LoadedFromClassIndex Then
            Console.WriteLine("This query couldn't use field indexes " & DirectCast(diagnostic, LoadedFromClassIndex).Reason())
            Console.WriteLine(diagnostic)
        End If
    End Sub
End Class
WhereToIndexExample.vb: Index diagnostics
configuration.Common.Diagnostic.AddListener(new IndexDiagnostics());
WhereToIndexExample.cs: Find queries which cannot use index
configuration.Common.Diagnostic.AddListener(New IndexDiagnostics())
WhereToIndexExample.vb: Find queries which cannot use index
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing/check_for_index.htm0000644000175000017500000001204311520622614027660 0ustar directhexdirecthex Check For Existing Indexes
You are here: Basics Operations & Concepts > Indexing > Check For Existing Indexes

Check For Existing Indexes

Sometime you may want to know if a index exists on a certain field. You can use the db4o-meta information to find out if a field is indexed.

IStoredClass metaInfo = container.Ext().StoredClass(typeof(IndexedClass));
// list a fields and check if they have a index
foreach (IStoredField field in metaInfo.GetStoredFields())
{
    if (field.HasIndex())
    {
        Console.WriteLine("The field '" + field.GetName() + "' is indexed");
    }
    else
    {
        Console.WriteLine("The field '" + field.GetName() + "' isn't indexed");
    }
}
CheckForAndIndex.cs: Check for a index
Dim metaInfo As IStoredClass = container.Ext().StoredClass(GetType(IndexedClass))
' list a fields and check if they have a index
For Each field As IStoredField In metaInfo.GetStoredFields()
    If field.HasIndex() Then
        Console.WriteLine("The field '" & field.GetName() & "' is indexed")
    Else
        Console.WriteLine("The field '" & field.GetName() & "' isn't indexed")
    End If
CheckForAndIndex.vb: Check for a index
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing/costs_and_benefits.htm0000644000175000017500000000754311520622616030415 0ustar directhexdirecthex Costs And Benefits
You are here: Basics Operations & Concepts > Indexing > Costs And Benefits

Costs And Benefits

Maintaining an index is additional work and therefore it has its costs. Each time you store a objects which has an index on it, db4o needs to look up the a appropriate place in the index and store a entry there. This costs is paid for each store, update or delete operation. Therefore there's a tradeoff when adding indexes.

The costs are mostly the time consumed to maintain the index. Additionally there's some additional space consumed to store the index. The benefits is that queries which run a order of magnitude faster when using an index.

In practice you should measure and benchmark your solution and check if a index is a benefit to your application. Ensure that you have enough test data. The influence of indexes shows better with a lot of objects. (10'000 and more objects). However since most applications do a lot more read operations than store and update operations adding a index brings a huge benefit.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indexing/types_and_limitations.htm0000644000175000017500000001061011520622616031150 0ustar directhexdirecthex Types And Limitations
You are here: Basics Operations & Concepts > Indexing > Types And Limitations

Types And Limitations

There are limitations to the db4o indexing. Not all types can be indexed.

Types Which Can Be Indexed

Basically all primitive types like int, long, double, decimals, enums etc can be indexed. Indexes on primitive types work extremely well.

Additionally you can index strings, which are handled by db4o like primitives. Strings can be arbitrary long, so a index on string is usually slower than a index on a primitive value. But it's still fast for straight lookups. Note also that a string index can only be used for equality comparison. Comparisons like contains, start with etc don't use the index.

The DateTime, DateTimeOffset and Guid can also be indexed without any issues.

You also can index any object reference except arrays and strings, which are handled like primitives. This means you can index a field which holds a reference to a object and then look up for objects which have a certain reference.

Types Which Cannot Be Indexed

Arrays and collections cannot be indexed. The current db4o index implementation cannot deal with those types. This also means that you cannot do fast look-ups on arrays or collections.

Limitations

Currently the index on strings cannot be used for advanced comparisons like contains, starts with etc.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/object_container.htm0000644000175000017500000002720111520622606026254 0ustar directhexdirecthex The Basic Operations
You are here: Basics Operations & Concepts > Access The Database

The Basic Operations

The object container is the door to the database access. It's the starting point for all database operations.

Accessing a Database

The object container is the interface for accessing the database. To open the database you pass the file-name to the object container factory. Normally you should open an object container when the application starts and close it when it is shuts down.

using (IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    // use the object container
}
Db4oBasics.cs: Open the object container to use the database
' use the object container
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
End Using
Db4oBasics.vb: Open the object container to use the database

Storing Objects

Storing a object with db4o is extremely easy. Open the object container and pass your object to the store method and db4o will do the rest. There's no mapping required. db4o will read the class meta data, the read the object values with reflection and store the data.

using (IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    Pilot pilot = new Pilot("Joe");
    container.Store(pilot);
}
Db4oBasics.cs: Store a object
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
    Dim pilot As New Pilot("Joe")
    container.Store(pilot)
End Using
Db4oBasics.vb: Store a object

Queries

Querying for objects is also easy. There are different query interfaces available with different benefits. See "Querying"

The most natural query method is using LINQ.

using (IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    var pilots = from Pilot p in container
                 where p.Name == "Joe"
                 select p;
    foreach (var pilot in pilots)
    {
        Console.Out.WriteLine(pilot.Name);
    }
}
Db4oBasics.cs: Query for objects
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
    Dim pilots = From p As Pilot In container Where p.Name = "Joe"
    For Each pilot As Pilot In pilots
        Console.Out.WriteLine(pilot.Name)
    Next
End Using
Db4oBasics.vb: Query for objects

Update Objects

Updating objects is also easy. First you query for the object which you want to update. Then you change the object and store it again in the database.

using (IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    var pilot = (from Pilot p in container
                 where p.Name == "Joe"
                 select p).First();
    pilot.Name = "New Name";
    // update the pilot
    container.Store(pilot);
}
Db4oBasics.cs: Update a pilot
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
    Dim pilot = (From p As Pilot In container Where p.Name = "Joe").First()
    pilot.Name = "New Name"
    ' update the pilot
    container.Store(pilot)
End Using
Db4oBasics.vb: Update a pilot

Delete Objects

Use the delete-operation to delete objects.

using (IObjectContainer container = Db4oEmbedded.OpenFile("databaseFile.db4o"))
{
    var pilot = (from Pilot p in container
                 where p.Name == "Joe"
                 select p).First();
    container.Delete(pilot);
}
Db4oBasics.cs: Delete a object
Using container As IObjectContainer = Db4oEmbedded.OpenFile("databaseFile.db4o")
    Dim pilot = (From p As Pilot In container Where p.Name = "Joe").First()
    container.Delete(pilot)
End Using
Db4oBasics.vb: Delete a object
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indentity_concept/0000755000175000017500000000000011520622616025753 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indentity_concept/identity_vs_equals.htm0000644000175000017500000001346011520622614032402 0ustar directhexdirecthex Identity Vs Equality
You are here: Basics Operations & Concepts > Identity Concept > Identity Vs Equality

Identity Vs Equality

One of the most common questions is why db4o doesn't allow to use equals and hash code to identify objects in the database. From the first glance it seems like a very attractive idea to let the developer decide what should be the base for comparing objects and making them unique in the database. For example if the database identity is based on the object's field values it will prevent duplicate objects from being stored to the database, as they will automatically be considered one object.

Yes, it looks attractive, but there is a huge pitfall: When we deal with objects, we deal with their references to each other comprising a unique object graph, which can be very complex. Preserving these references becomes a task of storing many-to-many relationships. This task can only be solved by providing unique identification to each object in memory and not only in the database, which means that it can't depend on the information stored in the object (like an aggregate of field values).

To see it clearly, let's look at an example. Suppose we have a Pilot and a Car class and their equals-method is based on comparing field values:

  1. Store a pilot with the name 'Joe' and a car with that pilot in the database
  2. Retrieve the pilot.
  3. Change the pilot-name from 'Joe' to 'John'. Note that though it is the same object from the runtime point of view, these are two different objects for the database based on equals comparison.
  4. Now what happens when we load the pilot. Should it return a pilot with the original name 'Joe'. Or the update pilot with the 'John'? What happens if there are hundreds of pilots witch had a pilot with the name 'Joe'. Do all those cars return the new Pilot name? Or the old one? How do you update only the name of a Pilot for only one car?

This questions shows that the update-issue is not solvable when the database manages objects by equality. Objects without identity also make Transparent Persistence and Activation impossible, as there will be no way to decide which instance is the right one for update or activation.

So unique identification of database objects in memory is unavoidable and identity based on an object reference is the most straightforward way to get this identification.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indentity_concept/reference_cache.htm0000644000175000017500000001526011520622610031544 0ustar directhexdirecthex The Reference Cache
You are here: Basics Operations & Concepts > Identity Concept > The Reference Cache

The Reference Cache

We know that db4o manages objects by identity. But how does db4o recognize objects? How does it know if it needs to update a object? To archive this, db4o has a reference-cache. This is a table which maps objects in memory to their internal id. The internal id is used to find the object on disk.

Since this table has a reference to the object in memory it also acts as cache. Therefore it's called reference cache. When you load objects, db4o will fist lookup in the reference cache to get objects from there. This avoids loading the data from the disk and also returns the local state of the object. If object isn't in the reference cache, db4o will load it from disk.

Weak Reference

By default db4o uses weak references in the reference cache. While your application has at least one references to an object, the reference cache has reference to it. But as soon as your application has no reference to the object anymore, it can be collected by the garbage collector. db4o will never prevent any object from being garbage collected. In the end persisted objects are garbage collected like any other objects.

To keep the cache clean, db4o does periodically remove all empty weak references. You can configure that clean-up interval. See "Weak Reference Collection Interval"

You even can disable the weak reference. See "Disable Weak References". Then db4o holds regular references to your objects.This prevents the objects from being garbage collected. This means that you need to remove object from the reference cache manually. Or only use short living object containers. See "Session Containers"

Manually Remove A Object From The Reference Cache

You can manually remove a object from the reference cache. This only required when you have disabled the weak-references.

Car theCar = container.Query<Car>()[0];
container.Ext().Purge(theCar);
IdentityConcepts.cs: With purge you can remove objects from the reference cache
Dim theCar As Car = container.Query(Of Car)()(0)
IdentityConcepts.vb: With purge you can remove objects from the reference cache
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indentity_concept/reference_cache.png0000644000175000017500000015673011520622606031555 0ustar directhexdirecthexPNG  IHDRsY| >gAMA a pHYsodtEXtSoftwarePaint.NET v3.5.5IUIDATx^gtv 3OZ3\ۏ}0ϼؾsG:r9KGQ((@"L9gEHbI@`ڋ٨*4W{׮]cel -l x~sbĶl -VKl -'[%'[l -S-`Y%H 5^>8+ KV-{g`[[-`. uv4J[t_>v:Q~7SpLb466*]uju_s`[m-@rvd^۩Sw>??wb{i;z=)mhh()o[RE0&@eqM.i|Eb_ [$XQXn͖hHgǩ555٨8m W4ÇRp},Y֐m|HO飯^߿{nb%[Ph]]]Aŋ+4lP k(K2iYOd[m-t}=P9˗/}hll즰2a[BOt赗.]톀%d[mi;Lo{=>$hd45i??FhFUu%ا-?eE+Ja+Ҫ*q-)'O(mhhbY󯝭l x(B\)ЕCsbk-<@Y,Mt˒ի;l --@=rZZS a #_c [Z6y/>>bYϞl xs/4T"{/B=ElSYB1Bź"duث`[` QRc EbQZX`(k1]SaYnށ*l 0mihu2/J p- *hdWLhl~*-@TTt{kpfJ`!#i*§]g̾fδgŭQ\r~D@wACeQg_Ɋ>+<y x!yHX26-ٽNɜTTxEa_ĶZ &&ku8ΚoJާi!VH ^i]^3ĶkCو:77"Da[i+%qdQ؛넗 ^0tpkƒ!SkCD3Vggg_#0KVk,\޵k^jOV %+ E^'Tx(׌%+JZ urN!X=qPa[q mΝ`pLuww"Y_¶GZ^*? c [ urkf#Fत$ed¶3-p…;wu vO/Xa[#- /^-5cʐ)lv[ ൡNk"ә da~ែ4gzU6 ظܡ^ge7KVlL`T̰`[߿OBIP8j`AYsLLLgVV*mVJ`u:+R xY=DceZ/lVVge)`uV/1fkd:&YqgǨWe3oP irSVV@ 8 +&mF-qg^ݻ[lWtVwzKe̶Z%+#r7Ȋ+yp'0 3[[ MWW81de^o,,=^"+:G'Oʨ`| HVtoXe+b-7ˀWUнJFGGoekbfKQ SYnNb꠾,Y7/֡䛅YMpAɴHE*+/,S7X6#6YIgk׮KWISxo,O] L='-`ɺy%)3LҥKbR0fKUӨPU e d$ц -r'@>o?kU7L{U*?A/~_ ^BBBXEg ގ &_LTgʒucZ`S5((z1X&=UZ +P 'ҽ{B?c4ǏY]v) 48osy,Œucpn篗l YO> P?CI*$$$/ q'/l"!.͛.B?#+6G.Fú'NUg w)hq콎,b76N d:\<:^F.k9]?D@  -0#<.G.^f.kk^Ȕ}VV@ l8Y3kB_gzqI,Y>HqI5Qf@ -P`v&Jbu@*;`Mwh4Xݡao({XzhÅ+ K)rNߥZ~ܜ\dGZ ѱJ];6݄ vTv*{$ho&Rp|`"R ŨBB5'%` AU[[I!dI@7yQRW~v綶'ݱCyr%#E8f8_hocjPv| C<[$n>EVJE/OT;Rq|7^6;)78^dΕXn9Sړ%z҂ $QL:HtB}vD\&{(Tyzzzֳ) #+4|Y]@oWG ߿L1QC^ |]O` l8Y ))C%F)ʶ$Yf?J JvL%&YLbX{:W}n +SǦZSB4k_ 2' !Wbon#dENҹSZmjd]-x3ZMguraa.Sd]ș2;Y6-dv߫-d%`px_wt''}u"Vy]zCV%a 5 @ ϳ:οZO8C.>q4B.QV$fg*K@ӝ)jZų7ߐXWo;{LegL&kwGd™4ʫ{VkduӅo0zvU(xLduE:1_H E)ב؇kO!OgZfq(D謌>W\p ^q=tC7u 0%+f4]s-E W/76Z<(#xЄ|uHVmKPKP: ̔@A~eV.?5-J]zVeXQ/}:ң@OKVNփ]ګM֎vI.o.dS$°d\a uT?4_[kmkk\,Mx0ƒX|<,YY8m.YΑs&e2kk:|M (,\]`\’էHk)` [)Y@ޚ;_}hˌxҲn2ouqte|+\ͼ>-`Saʰ'gV x@>*kSzJűC6}}P>Q d)ZaX(0lfdv;)o-]o:F7W|c2ќ燧Q b֭5׳E,odafg[:6ӫi64T=^{56n\7`rX@u,YY:mYm tSUzXֺ (S]Vmuu뜍%+KVlW +ցuGNjXl5ԬvB75P[Y:sDZdeʒW ˙ffZSqTW**_+LFi)t/k^u뜁%+KV^ W '|dCUƛWGRUi4͛:^T@1U( &|d5HΔͳn-%f! `'+V`x!nohX*MЀZDj܀ vII6<,Y7lZXdeʰfo YUCϭ-c|ЯQ1U!Wy/Eiy\]/MTԈ5{|6KV,Y7 (؂2lϓa^oО:4kKE0oW`PTǛR)V7#vmkQcbGZ%+KV k6ifd횂6X2W9+\Aou^OU(|(%YKOo9fAU̫UOثy~lζȚ`3xM6R0Hο ^|c_)Zhϓ|dCSՠwM:Z|U* Eբ)*}}{Ut I vB%ʒ>}:::ڝ;~OV$묪OOܙ򳧉5c;*ʑ Yz^'SB[C^Ϸ =*m3|UsA,:F=%u jlMASUTjT;NSKOUzHB;˚ 3x?O]:]SSںYtVBG]8uG~IwlP^\FHqNvEWB^bgoZ߭T?0aj\F= { RREvxG*|څ+m 1qP-!GhG_݃-яu$tUR[7wLWˏ鎉kʴ؟K˶ո Yr﵀ UuH\UvA,j՜B>!$%Bˢd"BDR}TL$!yb"'G~QiXʗ*2YZטUZ{dejHt~_GqoWssJWӽ;c{gwZ+d5W-w?UrA,JB^,~vfgWBB8l:d<2R SCC!/۸N\ XR$\S,4'"(OD)+%1jq]jq` O53QZ̒N3;ڐkVЗ T֞wd(; /,mY?]O54kea:~gU*]B1/Ƹ$MD? AW^2Y]ffKZZkz:664$'%&&&Ξ='Wfuyb]H' 9U6NBx2y&TC84@B'14?X$HbeM'^$ŕzj-)1y=duXLγ6ZYBUjs"|zwGdƵ9ݿ{`̨ucGYץtȪl$66* |C=OW[ @bH^Q(5y"mPg/Y:qT8 ‘tjqrpI~y \ϩFm5wz_Al[[)`'vJb_uttLLL,,,XV}]gg'H7)yȴ>HVժy̨z\ׁ?dEju%8$w#TX$胀? 嶧TDkBC!%ųBY"FN !'|sxalXm؜MPHf#m2 !1cTqH9c_ċjVZ,,oj,\Ue ` /1!r 0&ťR2[l#1-)8T" 9.ij-g\Dm]Re:v*/,yӥܱĄ̉yypFCEzi8 mv2CFg[^G@0@ d:O}S=V9jxYQ-n5hA^U}KQ)G9+$ƏjikK55*ŕ%rc j"Z,Pgyʬ2ŊL<#K+ ( | ) * p?ǎ=_dƘ-nlFjCBBz}yyyuu53"ֶTZc)ёhtHLr)mN :{`mkU`9 WyxcjOyP (+}WR*/>r#93\ǧS&3{wFM`ErfLZ0H#/hc:)`>RN$FE1d!0jZPAbu W,L:7/ׯ+\CIXW\-* Te^չW"me&=-&PE<4lQ-"M-yoF rt0Iķn*..XL eal?H>)x3`d2=W4N]lS(ZfI*mZϯQ_~v@)/΂NgAxJRy:WHm1XĀبA0]NJ.q.&h 0Mx;j 6jϲ)x_("D"Jn•+Ќ7P-f u`g>BV[8ZklS]1egu\~sIPʍ3vZ]>q,9P__6·¸:Z/"H59>S]mBG];: smm&Tc#d++ va~(mCAm *{u0P˪;K0n-,sAbee₫PRRAT*@,㍄g/>BhsSvv6>H4y/ZL 1E˗/b"u ZhK,nL+ d%KW1_0cml\g57776 ȊN",yљrc֞9nrAo_=*1䣯, G c'>k{әr;1wB{%-Ow/QzqF@MlԔبQ@ F H<'0/hZ__&&LB= B1X ,--p8PpAPBS0]n߾MkcdƅƸ!1ћ7V-A[_ӹ֚l L+ d].+38jz"3h֕ic-Rj+W1]ǻ{MkIR\d:#& *yǝA^Z*ghL7޾B9^>U3.|VWW744kyb2F પ*g***0'jXLz!4]bׅJ 1'?}11ƀ+1bD'^NbU))=Cp>XSl. ^%+nc bKKу0k]݆Hz%KOؙyL ? gnT-1&=q`8b),X(uSoyw/(L}ʁ ̰6Ηy|#pc .{GF?QeAk hPU>̌c"o$HXlHdRq`a%$c+$LH,T){P-": %h}B|;}kkRSM$H=؞$!b0[,1v/.:zbGT$͑(N`Lfc sS- +Л :d:FVB~kMXf+M5juJ'JsU%N. gux06 `PZF>41veDSNs| 17Yvd7ʄ/jТٗ:s}sюz&O~˧O~9laZl4)j1&}Ah(й5,Y}5АUtT//ݨTt &#>wp;J a*y Joi3VuHBabAu7e2&聂33 NZ 3:+Ca]-?}|deJ5ISnvS-3PX)5+43t0sF;_(M7Mӭ<1<18 }13A_GwgeZ%+8|ݰ:ΞMKbX(R\MI1)NAo(GN.OrUb5o²ꊼ6o~_X#Wה*ҳ97d;j>zkf2zby/eDHS$ZD)%Jk4-U 'k*nۨr#'F`v1}Ll1Q/|4S8y[Rja7zXnb?d%qdɼ,۷d5c#L/74릔!^YCV&sJ:bDF6\e)7X+ݑYTKxSUi 3㦦UyO-%eG{̉ƃZ(MɱU;aY՗֭CږX$K\18\^h:a堶 1BBapY=a3UUa]u՝ʫ;%rSRX6v\ Q[8Yqtyfo} , l~z/h5֪׹, +HO91y"h9+̉{BW\yxiClaDRN(ab-v"1;$ @sd"]ɦ6Qqh7tt?ٷkrY MlcH adJ[xA,~!(fڢXW2/)>TXn 7rPtœkl<(E;P1/9T(|(@20WUL%<5ppmX]b8j99Kgɋ+2d5V?aE IBrҧ~ӱְ1@ ĵ("T p5^;O䉉+,!^'){+Е#vzzcZPIDRZ*FLIjU<)Y0ksƗ kUuچ>yeP]S̕&w~E*M{V[LtOTM׌| *'nl՝b sI3ЄiB~H֍K +BRݻ?WXBB.*J ` ΎS'''GDDDF6bтRaQ)+sԇKV!X̕_UE O; cT+W(WsgZ:a]ݸ^߂LmAmVb/j9݅c "XnAVXMT ?+?Ch%Ll"(/ pŝ1p+c,_GϜKJ61RPOOSEtUJqqSASmdd}rR~8TbVȭ K2!=pHL`]$._&|1U\I]QG3Y&/u'V˹ XESܸ i+ZN}p70 `.=NV ;D`f/~ W.:2`V#aO\;Sb;IqX_m:=Åv2ߞ #xܰ0ޓ'Ӈ ޖ}d2\nU(\kW`X,fA4TVɎ%p5$!3? eZؾ lsr7,òYnXnT*V}$RT2Vm_b%;ttZod L@BgX.:2ﱤյ!3ISSS-;S[ܯv8a~Zo'9%3BU\CJE'eA*rs^sJmN,2ˤ*,p_*-( *?T6qT.QzHV@F1*d>PE$+3ǜ+f][ugʽjʥ=**eiihcRRgakhV6cmu|zdd(g9bH( 'KK_Vefr?{fhHH|UXOg"@R2,?q,̅aKڢ_G]aaeD)iÙSKr) t,;%@3pSB-e)Ap^9YUnX$rfdeMnYN:5&=-ȪRd%;ttZ/ɳ2WwFonR<{Vw-H"T)w(7)!{ە:;) f9\>hq]Cc%l 뜁ZK gy;6!2|ÝJŵ+UIm-/*mf}-\uɍӄ-ST?+!+Nbw[K%X!7RNEEƢ5We_!P).I_| k|,Y=),JIpNxa{.wWO-0D}lqbW%KoIVUq;#E.k2<E޳|eFז1sl}rS@N1?SF@5cNܔϕ$җ$ԾZhdzgFp93 [:}h,5م%nS =y8IJ 1h1[-w*\lN|/=/]n1`7-L n>nC.:2]<Kl'uX|"he38I 0b\)wWlߺYr&!m &L:= tlz6jc*ξ$ܡ29e"v_]'U Y ۿ jp1Ԧ+iکKBn^!j⢆EXXYtWD'K|c*52ckkQ<2(!WÒ$3;ڐkVJ XH ⣇G##Xxe e9.q3ԧ9-ȇZS~o &Vx8tl]onn;rf}㰏3h:}c BVcP:߃S+!k}\pVNnV*yaCC"#TQP<4@( )r\bYp:wUjZQʶ9вduXLγ6Z*Y)oR }_s#"GKeD,\J<;{:CW0LdݰZkcz~V\0Po<~hw>MVPJp;2Iq50љ6\I;tdWN ܍\5sXl%t\,kJLԆCBW9_,HMmNJ߹ٯSG DED$/+JeJcu`T׶Muт/bsy,=dʈL澐i}'0#%Ez`Xx.ޑXR]3~V~^W+sr\nLdɘqtO&3dw}MZOx1]j~L.y}u~[8o%oa؜SXKAs@YrF>N}|# Y*!8Nj\l@+yZFGv~mO0ŋYgiins' ֶ6o|mmcu ks>MV lF4%BVݭױvjˌy;YtXQ7)nKLDR%wo g(C<O D+cS#lJյ(p[JSJIEvIse"_".+07EH;k]GTAV89.bs@/8|uk~ݻ.QDg:+js}ԉ Ȋ5"3zЁƪ* WvE1? ԸCV`{EE}GaܯpovSErszR[:2qގ[K]QT4{&+aNWJ2jWw<y$9|Mk,@Ex6XHXzOfW77o^k9u$\2YH܌wIII/?:ܚ̦$79Uzh\ttjRajdlv,jxbmiYO{nxpsL|̶PךB*@1-=;>"p PJOss=aLIW9c99 f3mɝm7_)6~k0Ƈr0v|0$ࣶ|Yk¾?8z aAwy2L w߾ȴ^%qg@G):8BM񪧤޻+u˥ I,d>-_ߺ Zgeeٶ?B+H5P~߹d]UvrkSzϭh`gԞ n(FeoʡκIMRqm} 7+t} n˙+)P\yqu8Q0i~@i(Ae_Sc[i?1bm̅RuFe)//בi}$<+\:vyy楋@c!֬L'e2*("9iii5~/;fei~W ІX䱵q/6F=ψcdżz˘\]DEmXˠz?zG,:4Uu:M VY\i޷5"Iyv铫7.{pS1/ 9n>q&0v'!h%"h:0iB^Y9Gn`U;HLMMMMNkj+1wR1'Sl:2+>1wbaBy}yfI}tfbc4"pr,09Jvl%qɹuXcDt+He~󵹺а!߿R,& +8t 3>ܢ6\I;Oͥ\EұX-'?D2aʎT/Fddܗ3RC<==߉j)5Y;vUvְ>dW~2zJѫôIV 1 h Ƅ^;}׿?H?D.<{̸X*a0 "9RD'2*8zȟDa>m! 7Hi3R[7YA_cjhO.腾WLpVcGzo`2>N{{^q̘ ]'5񗫳/yWx#a)ZA@@ XYWg1GNPxSc)x6]eVgJJ蚡;h/6x^tli4̩X̧b%mq9n[ᆰO/tbJ\fX4OZkk3xD-V.8?ʌc W Ne<SS"zc,,3qV2 l#ZP=^^-sJ"j9KA 4,! 6J'fQb0_vVhx#MAZAIBsYQE'YLG,SdE/FdMӟ3'0#|@,fL1ea(ܤۿPRS;Ps~~ ץ8&.*sUHI2*/NeԿc*EMk~㛃mDn9[Kcgk=9߇+؆L|>3$Btrw[-g]sKhgsچax$H_X0vO`,04ccxmvu%X:+1xȨzaƻ $)-L%[YX(FpD@6X_SCR$rO*WF7 B2޸_u lL>yV &ʅJӇrKP*Gy\i§v3iz$+s\m[CUP,M/yrt΃ó^cڪN̔ˑK&0jT:y+RʶQ ppn=yrIc_N+?3n`}WOb0Q4KЭ'rF?3, ReɺJ "A( W>ܫ~zbL?1FO( 4T*'ԪrW+o vWHJyKi dI L1H.,FG{Wxdz|gWqyVyNMَZwy\jJˢ/?n[*W7sI;^7TIL.u//;,b?YtRG &/ Ǚ5M?+C6P^8 k0M3:+Xm.XTi*- ]wbcoδ;&x[Z X d)m6ȡ\ 0Ir{zT$l'&HKJfBѢT\hbݓHc?(a_fY I*@5?ڛg ›Zw֡M4mÂ9" K.SBIv[Sa$j t{-كd kԨ/~xľ5XQ̿b &b`Y:vż/vvS |" Y)- kɣK{@n+1SA.W 9~t_y1FmjTUțj>__Ræ}b;ZR)guZ^g1Ŭ(> C:kr6YA TPL:W)4סh!/S bd<8/8O|_S6G)9S_i!+Sg)5EWg` kL&rMr3\3B{sD7O2s# %[*Jfᱵ m Q|(9Tk׸~xSκwY54;`gISO>M3 88Xbih9 8HUb" IJ+ȟF Ze\]l=~NVFuPK鳀=Kdm}Z EO{ߕw@pц]ot-#J]SV( G/#4-y*'ڒ}fg8۩E9 Dcv٘)=Mw&EߏH^^_RVQ :H&{$ ._qQ7=4))уnGG$G%xH>t!(#"/"c$Ny+%p7$`DvN&EǠ;NFFꢢ 11ωg f24.",*>+;{XPXJJ嚌Ð$Y:VXɺ|޽à ;0`T/(,7^^. 76ug]RpV!qyԕ<){bnb8SA@Pf dh B!ƶW*c{XU&AJUԄkn!en<}<t5;bH&yYbʳ:B.gc̄ѝɒ$#S,=v|.e!B<\(ނcIt C$_&PҒs|A220n‡!QĠTw^zo~OH#Gߚ{zzBP6Tš7$Rl = K%PM|d/<*Q{JBE/\:م'{ssrs 8 8O=GE5 `U$, duUz]!L~KVx|?oPmm"F@k'hƮq]mHXS˹K~amJ⊤҃E3&5L_#+:]"DŁ.tށvZ҃Ύf((L9lEY .3+zy&*" 0ʋ:[X :[¿CpF>Dqhݻa_|3$Kꥋ! <0Jh+0@% `nR*UG»y(9Q4lKn|xWx<$?%^ɡ >U@UzY\Kf%`U.nHՉcܨHTɊ|]XVC ?Uᩮ6)\jDj㵦 *;Q}T=RGT /'!iv&͒!^HdʙJ0HcbMOX]؎mFIP_oߤ.4 ))i Sf$8XlnMIy7bTjJ2;2ʿC()H=-+3ZkۨJT, Ye՜= zG~E&0M4$S}Sy1vUPm&YGJ6]lq%*E>;h>EO?|tBƒ@GpJ˵+~@t,!TPa0WvDs?Ԕ<"xtSc2Wx\O?8a(9T@Q3Dh=Q ӉqKWEQ> @BG -u29vS PŶQ+J%X$Y`;#:6FVјߛ`.EF㡰PzR`S$r؀TuEuE "p)#k} 6TL$C5u0(zj y8nL: `L<@?dTR/*]*rHvI>BʻyG4 (G<*QNBTW ̕H?OG{ Ƞꁔ===0-,&E<^`C7o*0w[>)6|.WwGP\B/?ˤxޚ[-Jь"2RS[!BMn,e 񆈏,ޕ.{[T˝E(tx2#]N4,1ؙ2%+]}EFд*Ta!pOQ(IegԔU"yuu*ӊ|~\*ZxFP  jw@ֵ0Mܿ(F$CG*(2xx(EVı:;vS<Թ{ RMsPvN e#C끗X:EKӋ3҇ńu}(pgOkrEظ1@*4'TĵpEQo̥\OR`WTO؛WP2dzkcc(*s X%(?BP̉mВD̓')(SFcy%\'+g dIfI徝+qEmpۿ[ Bilt(?XL>8<upbDpggzR!\c*@b 2eZ.?xJ 7#0]왾Ǐ2J,etшёChqIb{R/BËDm:V$x W4cTy+:4y5,jѨ,Y~c\[ XK-;O=X1?BM8YMOV ba]-׬e.tp%"t,Ӧ1^dM3XC,qYr- +Y̷m֢"K[l NVÕUsӧzݱBsX Hk3[0#먥䥹zh{B[R# U_`ix OoS:K%6o{ ? 9׿xvODQ{3XoSRNJ9 ;S֙):7}V/Jʡ-a+RrgiFq00ͨwMWcOi+̘s-Xyݖyÿy.4'+~kDf#.k|1kx\j7Qе6W%;xf w!2:w=-HK2}g&LBoB}xΕ˕GgfX<"ܹJ mصvRxh f#uX:U<8P6\1(nBp܈^XSXqg)xyֆ\˴JVC-lXQ>t8&Jq͕Z&DBSp_롇P^KNpE۾Z # g4 YI}mPZE7MMM W4Rf6EMn#xߐΒb1;ڐkVЏJʓgK6ۍ V W~C 9Twkvk.*xw./ _b`D^ mS iكo[5+v>ZV^j1͓fQϒb1;ڐkVпɊ]<~`OK[J2ɅK|Ys^]Xz6Cƃ{~7` OIyq7\lX x6?&@L$ Atp!陊W MU۹(K#^u_bn)x|_δ~LVbl%_8W}Ε/Ü+T(N _|O߾9l"4ĚNɈp]ͱO[zp_q,*ZX~6x傧ďLɅ3D!S5J#+ԡVuZmSLEϲn<\I88EzρYS iJVSjMm8ja^*`IHMdW_]q<5oM{Pka 8f^׈w }Sk׿m8߼:ik^\r5 fn1 6PG8$~&Q V4W5) THpnlQʁ(RI~NR83{'Rď5ݽ׺b:r9Y:#3>:-2M18P7(!lMaћ7L+d%S$.B X7=]ъ`yf_+\Qq ,Cy4؍#)) e~@S'oSp@✈p >ͳ"VLQ[%:b$yacJpJ:F]Dog{\o[nk4!8g&vK9׃peǝgmȵL+d%P|~уK{d囚+)GtkmSd&(R!R!<JYr#JՄw(=2V)(Y.BޗiE/f:V34ՙz=5WI}}^(i4wuʹOL67]4ܡ6 ){d)f?N ]Io~5'9VmAkJq͕Wdx9# vl>d_/׶M\$;%>MY{gK%܆+ V"+1wanFP [;Kah溤 +mz:lYQ,Pa:;ۻ#Ol.0{d7n` C# X]m}V15 .Iy;]8ԿݸFyIm}͕4;`9e2eZH!'A_iH1#S9i}LKduuկ nb7ɫ%'B̗'=을'LUz~okP+|pRk*Lke1g5 1q=25$:}NN# JĂн "?j_}^ӺeP5W.JL%!I8:X"o؍ Ǐ">6SL OKsWr]s z)&wQ>R~dx4ްĕ294=0ʌKPӆ ]skKw.jp)xyֆ\˴[YJЯ\d,]@<8#bs/)_Љpnv*Tuh=)iӁ1GȊbxM[^;5)KVw<~בiYc{槦P~LR1%\%'N~!kɣp-Vx/=xcjt,_"+$s]/cZgXZ-Ɔ+3.*KVw<~GeT([pv+w4ԺzLqJ*8oj4^,W*f N޹?2\YL: 5:T7o}VЫd%ޡȾX""Kc>kZu.3[4>V"=&%׹jBS$\6㨦;Cڍs&1Ѥ)39H⩅0#߶,FQYv\ ;=/>-~;"lNd,+t 叠 Y1N8y,#XCwaYoqYr- nMcda+b5`7!: ~LduӦ+ sU)PMy,TPۍ)Y$ Xi| KXL#jUeѵUt*REi NU|rrKHX(NXS:mPi(CRR*j0k[N~/KKz^c&{wb '@jjc 'HAo.i Y7B Vz~^.0adҝJwn56K'.Ty%~NVD,S)u..0kpF5{>Zb)7 Y񟴬LVZ4B^,L yBጘRYFJ'V&r )c]0T_LHH|;wXkQqĂq>S8:SsAQDwC— `e˴[$ZRcr< Hp[?[z =b F?Ym*=T@C[!?϶1MyHJFo/Mc*KbsE!)Łyïqn~둂9b[ ŬM\TĆ`Fx S8sO2qS` %y */A/פ3%Aܚd%h|ŃaSpE#uz}Es}P ёCm_qkGU1~dYLbJZ*LG €+(aǸnPY-6j e1ˆ np֯eQJii\Wdרd^>O'm8K[{u2ϚS$ ._G O1 bs]-|SS 95f+m!:'U\1 oEL_6YQZ{RU_&{ZuUpR,rY.H\nnnSJJyt,8X IMUHBsyUR<YdMz,fyGQM?u,/Y$*N&Fw=FPZQd%NL(z ]6, Ő3> R@8 BOzaŔ- (uRO<zq-A7lW@/^>P &TZyͮ֫HKdݿ,yNܫpBqtaiNjg9ͭ5I-sзT'qY(5P%FFXB+#}&R{j; ldu3c*;S۩777s,&8c$A/2c<^ yhhhpp+b{{{>܅1 XL0Ba^8"`^8[UFAٜqs W/N<,).KwZʫLn&\5O0^gYFLTo|Ui=A}I (luVk߫Ɛ 0/7T5ovBVa>NVP&BYTg>i.)/L^V ,(ƒ%`:tv!"ez)ڡ*/t\ 'g2KV'gN0lR5D/H R6g[wl^bpU? _"Xŷ]_llWFsrς񫩭[Eg%]kmR?פ>'=]$"_tUPT~I br-wo;SK,bbL%ȺfdCg epd-H\t/L^*_T` I3n6gӽ.xM>@$],"жpvNsuy;ANڢVfd2oRn^<"PX7$w*LXv|5ł;0V T E!3,EVޑg ʆl<e@#;\,YYnYD/2XC|wMO+ǁ5lD%Y;9c(d\Ҕ䲤$Ԍ/esI03M{)?gry0%׮J\d3=9#ZsMDeK^H̅鏎R޾ʔ  y]פEҐ(?Z*5uL$wOwj};hT&#oQĨټ\saZTqܙ WVq:&h.s@VK7L+սnq)oU:BVH5KkfD/ hE .FGG'o*5k勘2ə> -xZ_d}^[?g$*֕ 4YF8-'~(~9˷})7Kk\2WXȏb)i KWסI4)]̿`wK?xRo_kNm(% @ 7JHt0_TowmJG?M(xyGg/1U= V- #4) ɴh)xyֆ\˴knI3?肰7o~~KΎm\9woKG/jdAٜEZRh}vk5 1]ad$ȼbJy!Ұ4/dT+.@JVWYab@q_X}atdo\P$3Ov JM5aUgIN\q8pTHQ?hc dQقے;BuIfϞ~-3j0F`h*NR 8O 'du $ fJ\oZM3%Ft7+Xz^zܭR*UUh k4i^]W*:sEXa9U>Sqڢd }S%ڌbeLZSK^gwksa4q˕%~Itg|[rV45ɟW_ڵn1n§6Jl4-QŖDL!C4t+-y5,=ddž|?btFiO/ow|zV̝>Ⱦs$: NΞsZWBRQn_HcaT+yV67X kfTm㒚!( ʿ<9oky-Q!'竌sQ.mMma[V9{H5 >ZT/^){+˓#1 ( ItmKNygAu?a2&j+혐u6⤪1L SJ2/+Gƣo~6bEaLFN+oN.3^T}D3v)ݱэnƩge+j+b,ꦤ*Jֺڜ뫮>BQM=F)AD~y"nʆxk~%=AS莠)]/#C1. !JAe4M*zCI-GATZ_0j{#U~KVw<66FV!CT"2RMPqh 8Y 7*RXP`W<'`\,U)-:p]K@VLfo].1&nGF܅΅MMUU#XM (.zQR%vf'jʒ}V1O\;0 K3?0sXW[Dh}᫨Zdaゃ;C$EH8! yceegx;/W,CǏ!c[22^&s dըDNln>8I^,&;{9=on؉:(.<9cno78֔?C +Uv` Nũ0"S>C fck M=%-,|/"ࢋkIi>0Cm+iqKSjx45iƞڡҦWq1h }샚#PݯfKVw<"y+zy>_'XnSݺlnj{C̭MM㕕+2=K>;\>ժ9嵰sR;蛅z QT77JȒb1;ڐkV%( * ,xsOJV|j+N(p%LbMǏRcH"TYXQp^H~R12yB'a.cetLùYUsK̑k[28QU/ܝx ӨN@BᣔěN OGsH8B;)PuO)xyֆ\˴,Y>~Bݥvc+-rF< \qU,ZS"ἀW;SV:-8i ׼v N>|_~EV `kmmXZgjߚRi7_BSb!H+ g |G{SWFͅ@/%;b w!2 KVd%4-lHlkj- _U-ek` *8AXz'V^ٺdjt75SbepA?꜔93nml\g44-+S܇ԮiʺׂW1>{g +tV_lu._u@?C 1Rqyփ9VЫduxߠnO T~KӮ_ra 5E8!ԡnk)w}Gm2\][ %5Tɢ9% }P`7k;b H*)~H!=J迨rL+S8<<(R̭ô,YW| bW.8JrjJF AAmE;wNpJ\Ƶ˗Š+6?RX 1CY$Z,PR9(Je'o{9)'$$8VW k0XvgCI Ǚ{R]P_ZdI^e- d]w #$)Gf2łW D]Ȼ]Er+ؽ sqZR% :&xj +J'dRILecRSm2(#v/7(q zUO)3)~۹9ٌmmmx#ށ}AZ  #DAc7D5)x$+QXIW8aTFFr 2 KVd2%1̩ն A@\h֒ ųc0dkW>HHO̅X =.qowmh۷-TY~X ? T'7>'li? yH,&Ȃ8lkvE}zu\7\\=\j20IU,"P6* Bj;lRHVRrg] a?: ƧfV"/ؘ)::$Щ8AF­p[iɶ KKKC3^s }kuh6V|(7(M֫(|9/\6k#Ʋ45,y/햳e v@.{ }3~)188?() 7("H)Sjj*~~D% Rvv6 DQ *~Xsz%q;9 hmێcyy hPeT ;# 1*8ZdɺWL,hyl/4A|dij5_!2hDݓF^.2¶LhWUw7¹ED,I=C9ndLt9gNGFFw '/jzqC1#Yk?~//MKn3\'HI(*|-ȶPQNŁΒY먼.*v Ծ8J%QI6 |E."&@ 9hI A'reoP&]`2&!$P0eEO'TRԔJ2mqڒP~)xѣAmE]0B 08@ς17yIeZAnk)70l—\xpd[)yDN4$&Ӛ/M"wUQ*EE͍koW= 9{:w aĠBY}0rEbHm$ݻ'vgcY.lRbӹӒo=u]n;~}gfSbձ(wG, A?,HZX4B^">F&R}Be(?F |EbyMd ExH$,Qp0&g6YDoЊ9@*+Y‡;WؐKb={/b*ߠ | 9XG F$# YщCCR7lը]Z5+ z!e1pU&%!0eD*2:2Remt؜9`E)hV&(= @A@) BK{f~$d6x@`zt-vtt#҅NjMpO_GH3#JAYCAB@K]% =,m۶Akq}"f?fffEA«ESY|bݥ ##'u:k;562ڊㅞǧi?%hO/ru "^J ͺu3=8{'P0Ut|M1- 4zķ/7 j4yRvo@h}`&x@-m$+ dS5ZѡZXTy|J,ᔴfW@7 <~ĉDt*SVVCjJszZKF:۳2;!5AY>/PS9JY Cq`A0wMuܬ} Z:G AJ\050Eg@]8x_p=/`GGg&k3j/^@l/`ydcZRjtr8VP&^Bw|W R7dFn^{vQe?Hڻٌ{wc"mdrD9r&bFSr(0JFxxENvwzZWZ`vےb7c-qM/r#.[3^|#ZIͷtn/:RS'pDG)4k &q4:q"1z(RJ%q(ofߺaĪ ⦦JEސ'O^9r,ugV)aJVaԟ7>>""@Y^43Q\4^XCY)N#AE_j"+zs zd>VS${ծ(0CGx#am4ڊOf1G"IѕZ)hs}U3v 8՜yilzC,-sMUjU#ׯa&5<<$4 Ki't oTd_w׽,Q4d+?NJ=*>+/++y )uN\% wNIVNXduHJ"E_8#$Iy.500ӳRkg@2 ErƀLZj͆]L; zV$>8-I04/45վ5;3ɞHX(ULcO|ܜlž& Y{f-oy>ZrjhdXxeDn> l/D(` x;dePD"Eg>SSSD)XR /VxE k\SnJ-QĕoX*ٺXWXT[Y _"l5H6!:o{"(XH_PoZVnb< 喸&Eaǔa,YYz@]%*:-3J-I-Y烄3PS  +Х+?~Č56MMKc#0___y0*,p)mhI#ݙ)Y/zf%-o e1Οr9#wop"oJ{>Ql()C8Da8ZJ-$"h0opg@Dd.d<ڤBxZ8 [rrvbihdn!>ݾ=$ 8f9$+ };Ab]K7/z/{YlN-Tq{ 2Ltzoݹj5ibz1tߑ4Ź3h.1;WYr_YqӛRCOYD|bw{opSپh]gfkn׌w^M;ecǝgmȵL+AңRH $-+^OEwV"jjbDD(z҄l̗۾+Zck+")Y yi{aX#<: '9<Jۍ“SKk#Tiuӂ9%;b w!2Wju.*R@BkX4JӤN;(*?W)gf_AbOH3=UR*od[oPiOO63jq_&c/{,XU֌O\؈qb"`3ei `$xaT0Kj1VXW7d+-JN~בi7;Y*bEUovV_qQWA~kNvcfFmZ))ЂQV6JٌU|~R(Q*ZUsY@V,꥜|cJV=7-`}MIp~yo5ER_VU +PɃrψgpj+[ C`jqd3'=7cSNnL;e7!}VЫdx@w?h);y5)LEoQ^WTؙ[UXZiU%'QM#itA: 2/?A1[L͵fF>dJg^N' G *4U[5Eђ8ǧcȏpmټ;%gǝgmȵL+dCz&,>4%iAW*r{PV(3!?3(8CӧʄΜWe3 JiQ 2]R,߱%+;Bd%P!| Ɏwo9MHM['ːWL YC,qYr- n5B5XCQV4fx$)bLE&V9㲀'`Mdde|\szZo^(MsrM\tp10TjW{8]Z fa,\1kܻzUjĿX]ڰaLWR * XV)eC* [y V裱eeSzzʀ{0CՖpUbtaܐD5FB'Rʆ:8dUW 11ڭ]z._֡ys{;w s/#fUYMUYUYA@5FB'Rʆ:8d]rs¨y¸*|b4duʘ1gfWU4Rf\h>.@85S6mZd%/xC*s(:ڡy=& ڽK|4V4{Ϛ5kɒ%LAsgm*kx OL[ up++VC.]N8q^q7ܻxQglE2qxZ.ryhVeU1*<1mR6!2'qV{5Wo8w\o{w X~?o۵WuQӃf#֭ʮʪ`PETYc+Txb*lUVDa+jP%¼pʔ)ƍ#ƭW= x._MBgy%#Ə;i$Ԛ1#ܵ$2S*kb OL[ uPUwWF\s]9s&cMq<241w53_=gq;MpcMG3ʪ XV)eCTe5}+r0g9|}ez-ȕ>~o7l|q7xw<#ؗx7BP-hU(dTJڒ tSNc6cE\[i["҈rO/?aǏo1V/Q_uܩ4o<^J UV={1*!-Txb*l0+WsQJ$73Kx8 _6r~G:T = TY  =hUc*<1mR6AU0!F_>PJGTQYrb,֒X/jY4wLT:TYUYA@5@MdJ)`GU)\1M%PT릌eM/Id )"e{Y+m VD5FB'Rʆ:#!FbLZRvT0yBu( PHZ)sFd%/xCTem"vj-*k"gm 9e}頃j88l0UY=lA@U:Șى$*?V +m VsڅFUnQ*kĩU Pe].@8RGS TYkc*k"gm :tz.x ”5( jΖtTYSx"ʪ R-4?=fJ!þZW/% mPe]ޠ.@8ՓM0***k"gm Zƨ= _UTY֕NGUVIG@]icװ"JQZWe5gUU CY{ma6,uwGг6Pe{Q)UY+5&VYwr?/V0$ lY_Y,_0鶻*($^iDn۳|qE-cwB\=*?GuT#UB8#C+]Y]<"ovij(wB\}Uz 6(ʯ``|HkGcM6=cJ֧%pbYܿlaŖo|_M EbMM YQVqƵk*ʯ``|pk-Qw͚5J֧%ZN)JYjK;55K t7Psl2XCL"ѻ;fU)+북o}3SM EbM JcV[Y}ŋ+ʯ``|USV%jp,V {(fXᦾ"@p 1&v=u>r v &XQ5eUDznZHV^U AMTY e!PYSC6`u+ +k?>kj(Qֆn!P|Ob<#r"]{Zq;v .7KClꛦd7-ݧ4ᶣj(Vp^ wzџfUem:>.AYGSC6`u+ +k?>TGY @5]JPP X CUVjܿ ,"OYhmB_Juֆn!P}e Gs*ef:6S55K 4ᶣ X Cz[n…V .!&Єhj(Qֆn!eeݱcǰaæM毬ah ௬˗/?o_{IaXa #gZp0JQVӋC05wC:W_}{s9#GTem(WѣGx≜+C/[ƾ)"OYhmB_Ȋc68SY @הupp믿";8} z 'u]6'gcleNS#6^u*n*~˫^{s=wĈYC=uASYoƓN:_IoS4leeث IKbRxUGY= .$ N_|*XIY|k Eה~ڳgg}u 6}ѳgW{҅nfhnS|uѢEP塇zw\ MP.xȮBĒo+/BO۪dfcƌR u]f EY_xȃ=]vF%1E[K1Ǜ ^}U>~QG?Soo?`1#? qK&<&McDoSs)ehIYfqse]\d8Ee7umm%(u饗E'Nƶ* +\dnƄav.EYnBVY km9qkdgrv|G3gδ _0i.նmz7 #m3`غ{n[E\㏿yc %@gWSbą\4>yyͭF:c,YsQ'+ t}m%n V&X+_6UY@իW%Yլmm`8PfZD QI7n׮]gtԩSmqt 3tWG>fqyG%䅝9{;cO;4dgΝ;HyKY .5˖ů7f_s5R+w뭷 shꗍTHq~f*cM뒁"fk K3z)D0Ю94LK 4ᶣ:f <3?Pŋ{vaAfMpJL6MUL CCt-(TD̜c{cVBWzI!?<}ѤI&fmhgMM 1ل &ju><&94k$MjKsڽ=)W?sp}뭷9Zb멧z7?v.-;GL6edRLgG1Il!HiKHC3fqhA = Ih1 v s̑jHeE2_{ߴ]86iݴc]O< ' QPcVN%=k׮+l7ԜN@*0BcCfG6e{6У#izgcL(wpD9e5 M$'Ϲ>St`_~9W;0OI00spdvwhW_}5eѡ~-S˥ǂa}Z{fJfڒ%C= /DS=7sdzڷɝ%o^˲vӰz]F=N`Zڙa3!c:86IYSVbfv: J>iONM{ *EYE\[ ]apUN9믿>#%j(]gܒVo$CzY;zgl焘 i&][rRW\qh*ӿLCPb@-K;m,-?oTlL?M e +ǑeᎾLr=rwӎ wmW]u8 +4bA-BL }!+묙c 23eG la |h4AH;gm`q00M_Xe+$|QY*it \xXSv4͙:8Rw+rM1':OOl3Q2֊Aݒ-Gm h*w*3 ̖Cϳ]o%! V3O/waΌPlo.'lRjS~hmc4nLܡlE5bK<|Ďmg^5E,l+qh ?jl}!^^\eu``}eJ'ox J3T|:Vv{-f5:dԶ "͛7vNlMuUWV$y"["ekveUVqmӕ0Nl|݂ovym3+e@nBVY3RA&T *|/wU!kF,hBLk .2˻ _>e})Ib{oS0L 4ᶣՁW.}1iXRYe M kJ*L![kݡy`e})I3ަ`+?//E] 1iHQ}eRᨠ7prs=YPF"Pr'$9yS+z9KdfzЌYC=uA c1}w}=\>e!Єۄlp6^u*+kG.tDYy,]:7Ǔ%pя_N|PSr4N"5^u*LntQz@#|/9Y+t$^` )g!@p 1& tTPKn7M3XQtjCc,++B䥈qPd~֐G55FG CסDN jA0:Lϳ6^u*4!3#m5#_ VVyx>c[xSprhO}y\BL w7V{fB :A*yZhry(ML:1EletPW╕/sb7PbΝ;?C83{Lh-qOP"[7!C" )I̤҄SLQVl(XY $?xvO fHMDbM%IX]qik$bJ2NmdEleNV|A^(1hWjj$hmG̎L9H"唃mb|A[YTRVܐē)۲;F«N"P.!ȬD csWo!3@ﮩē(em$T(GYC=uA { 45x2W E\B(kG.s/XYجF"OSKHe Hx+k;5]'SQZΎ"P.!}k%"Ͻeu|P;4*|R9Vwht+@Wx*kw[ߩ5T|R9V2T*ҡJ*C6=/enkum@KX{UU d*Q.EqKYNVqKXIM@U CY3>%bQRּSkUr L ![\tjF$EqWY3Zȗ; LQeZR:EQ"9iqE@PEN})e IENDB`db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/indentity_concept/reference_cache.pptx0000644000175000017500000014741711520622616031767 0ustar directhexdirecthexPK!6pF [Content_Types].xml (WN0#qjʁ&`ikpl˞LJBF$ry2oh#G𡱠N׸T -][fF#hl`:"dpx/RíE]#3@_^΂&c1a@z>ve )eOTD{4_iݜGұShmS]UXiS*%QgpӌJVt9ivJ)QvT<@<܋G;Π|ժHo@˿9'홼!s4HN.PK!c\#7 ppt/slides/_rels/slide1.xml.relsj0D{$;Re_B Sq>`ֶ- 꿯6zN.xQbZV ț`5 gIJ ]{h~h\B<ȢPN ppt/presentation.xmln0ǿO;D:ѐ4"T:J {kr@TljlA~gciR b{JU5"gݔy(>g?IQ'%A<6U*|( S; d8@q( SjqQ*P2DqF?.CJ{@?!qC8m*7PK! cppt/slides/slide1.xml]ko83[VdI}.I~Ȓ!i{%)JdNNC$幗̋_oVqղO'/HHtϯ<"OO'jb}ReyuNu>9>E_uYQ㤌UvlD/͖qzQ_Vi^B4jԼZ,ו*m}eZݩZ_f ֟4M\,Kc&F-cLƿHsURtr3+Wg/͸97ciГ6^I}^4/Vno|Jc Dh{x3McڮpaQF=3O䤏?&l#vm/ bl2M={Rg:㓀,ZQ'xo`z ]A8Q+7p<=˶D|x6 !ɀ%\"pFϳ4}>*ң˺(yJk\nenrۗg\@|qƲz䩡++,EѣQiK5V՟{Γ M2ɣOK\cQ Ϙgb1 s=)0w?Œxeb0bnmR` 5@М:4G=C7kqSPHPu-xYWshEi ,""#E`f!#(˓+%֕n$ki)TK!e?lat){X0hSi2+,:6J'$+MW/"ZGU5伈zƝqH-n2>YlQ C~%KUd*E&)n{ ΊIpuS{.F{tw{ЏxTsz+0K >gS;RQT)M4O޷ŝRQ%?Ku(LRWrv8ݰJ3! m(@vաL+jATQ&q8D/掍Z]R;QambnA*b`:p6q1W$a("8 dsᔙ6[ l "NH-0:#ٶ?Tw4^2f$3IDz-rrkoEz0:Ӟg@V=~ !/pmYs9'OG_1^H:$@;缌֋eDhzdS}~3b'Z-?+#/2E9anoT 5] h s5\D!m]]%I6|$\%l# ^L5뫌Ƴ%^sa^c,&7AmԠe8 /)cP_e*g] H"9EqA. QQGl)谙AըlFB:KThn!e)uhMr#כ:5mU-6j.]6#Y&U+MwXK9DPQ#P݊nlX!j2Ժ,KD8#ډ*#hF8׆ .j!E _ijz*M&F)BpJ*kldhboOB0  F [?l`?Y97~LO;5~d$cuyut&0 <| aaJhè(aԉN >m#u$pgK4kg:Uwr ;9V+B^Il3 ȷ,OԄ&f;o3tv!)JU"CV>i!In=ޥ@71KZk}i#|sp Cc">M ?ԷHL^#&ⵞ$2wSp<,ev:@:`dF| wǷx\M-yny ǠmKdȜO9&VO p[>q<+gsm&0yCk!5 G̍ͮE`NPԴ9 p}6F̍89>6!siHϹ.P!LJ1l0׈5;aE2 .v?AG̥x,|}M+X4-=Ƒ]MCw;63o%Gg~Nhzc^?' w3ڻ!uM?YE҃xZAxDUǟ5qz1nLI YYTѦn x:{؄Th<%s2hsXvpIL}xV }~m.'{+mPqM7(GhLXfeB'*&mםĠEܹK <і &I'0`tΈpqhu u\SaFlvߒ}qV\jFhA\: ?KPK!ђ7,ppt/slideLayouts/_rels/slideLayout7.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout8.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7-ppt/slideLayouts/_rels/slideLayout10.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7-ppt/slideLayouts/_rels/slideLayout11.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout9.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout1.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout2.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout3.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout4.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout5.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!i_!,ppt/slideMasters/_rels/slideMaster1.xml.relsj Ab5®FO>Xv,o?) (B+xzvJ2ȒJN6 >/o/; q)x$2©|~:~`ϝdN[HˠuN(U(Jj^}i5Pj``wWU]N jN;4$tNޗbV!6le46Co,XClɀ3+bʊ`fqC &=Yc!>l'o PK!R "ppt/slideLayouts/slideLayout11.xmlVr0}gИg7c6M:qCi;$JA~ >/a%[- ) /cힳ٦hM,8: Rf_$nARaa:["@oJ!`rNT5hd^kK.J௸ie쒶J\0Hɔ0UBe^TҢUUH1CR bԢPY8؋5(H4C )#` -F3Y-!ځ_j^] }4Zⴚe`/7 6KQNA"n@i1{l|Ǻe7vUtR]zs~qHXP^-N^SDi=E5^zKCGPC)膝v>Wuͺf,E~Df@mbm5 :kX*\m)1zkx))֍F~V %N&H?" b@hK<qFIXv~CΈ;yӄ;C6^f:먫fJ`$&PW60XL^_B!;), r2vKjkNRc5 q8znJJç˽0Obm)V^gBYBLNSf)'y;.M?!a\?}~} 8H&Sww}7ʼngqg6$p:4T^j9rƉ׏ړ^獓޴[3gݡW;6ۇ\B{"[$\h3s%] )1#u/W)E"aYϪ"YȢ$[Y`w,$$"LYFz֚C7-%LxgR0&)g,'|3b ‰8)uvRdVgy )d q s"F{o$9d BڎRz8p DR S4#+D>(i>pD BCef`/+Aj~{ Z,(Z= { y5ow؆xc66B2өtJRjJS W,|(cJL/) Y1*K ]Qapɒ+Ek=EQ!rM&Xu8)tx*`<$|@!%]c! G:;SA,`n#b踱;C&Bx-)|Ȇ!rЄČFJ]aC'EB'0e[З420dPVAvBjr]Uv0[h) 5%{??zdto2;|':I'i&a%MȱIpT`:7%@fDŽ__#{l0nفv0nƿJ"HU&) Œۥ:L^V)-D˭gu>+ĠO[)KƗʤ[%/+}9`azCNH02ID2K .I֟ZcdanݩuqtA]lV3nv}z zUe ^L_Т R裡^ ]LMPK!gϠ=!ppt/slideLayouts/slideLayout3.xmlXn6}/ gźْ8}&AFcaK%ڵ[j?ggHɗ4EY#[3gΐ#]dEUE> b"$͟LJYVl3-bbx9}.EDp6TI]TƔcMY^ N ߄߮[g3/PUcgj>ZZs1z pz})azQ= z1ˁڌdK>y,RE3@jyZ@ĸ|BICC KbG.el3>N$zqzX X' &TVbBT/0w.E<9}+6zMeM)<%Ų(KTKW)طP6t+W ;8cAtǍ†Sd|Inty.)[lɁL%u!dJIz7cY5P߆ 3͕ [+Id3Q+=AtC'u7KnE p c7u%K,$j ȋ(^z^zG r{K=oK`OK n}4;A|B=yw^Б[q|О9o=ҒE{ޛcaM]5sME۩}>U۳Xh^ة##o6ףеhf]{6lLZM Tfb>*qRl8Ԓ9ޅӿ 4WMˬ(;ls4` UVh?$缌ZFh]exM /p"5ExNݎfNǾx#׎ȷ0Y4t[S9Н*/ϠU1`\қ~^ޭvZZ ބ|PK!xQ !ppt/slideLayouts/slideLayout2.xmlVێ0}琄۲"@ڇ~71$cIUsK:v^qfgΜ(*)gk",qV~= IY)gd`mos_oZ!`+Q*GF ɰl0x" nʉ uu222ȄG0UBeFAc_9t>Yn=k}Gs#3XX1g Lʊ"3an@iq|˩TaAq^j$o"dmO6 Eb%w{bd'ک7 v¸󲣿itxP <,Чnl/-j0ݳT24U\QKԐ65اRՖC} O6a1%_cFĩB7X*")^; SAϰw1L؇B[Ro"[5Ќ$PDSjҎ5A5g`hAwԝȰ!X`x6+/#:'w G/Ts<=ko .UZ aB_إ_ ^o.-0Y-vRr,so_f8أ³ ѴcAНN=*Uf$LWkAelm6FgB :cc 9V):dъHfdNӘuiN\ NO?gm5ָeg^.ڣ; {˝nAu继_gЪJ'ZG 󑁓%hlr8KQMPK!AQ!ppt/slideLayouts/slideLayout1.xmlXێ6}/ gu,a7h[u Evs%D˛"1 x)j8:3g<۷M^#þ ʴr=2?%fdF2*8x;~m7DAeCin_Ov1FQ{KKQ }4*~t>24pHAŝꜼ̠Ր5] )3p˓s[qAvFǝK΄uC4VO@? ;|NC >x"=F`pD-0=`ljse8<zG=`D{M(;jQZ=׉N%#lS 4{? r>Ħ|:ۃ*O53WU+(Ifss2 m[Ls:Yf2E,wӍ*%z+V[/Z uNY΍5q,e`b%*x f F1qK|ALP=9H3P~[<%[ \Mzq&зݹi3mFv7&5IX K@r|s{c!kխw~ة].PG ^a;&C+`PK!}#/!ppt/slideMasters/slideMaster1.xmlZnFwˊU ])m0ldJ}Eۻ>>I93c ])"bόg_8|u=/$Ksа-FYbX m,R޵oxi:üS-+%/,ֵRz|ʃ,)̍b$z\_ALFY$6gq,x* &a4K#-FZ^+[:E"V_ >:d:'ºbk&]?:#X_e~QpWOE~x:+@&@(&2MaHbq1z,!xkiEj0ZFkFu8ZR<:8:,LRP=ZO貴 ΌPGx~|U>MZ(VSZ_~ͦ+A HGq[~ Wn%^?lfE.x$괔jYB諍ycs8x~lKIˮv|-vj[heF~'Xɂe6N+墔Fp:V s0 !h ɣHKKfii'=HԒ$]Hg`*1_km›.TDL'ryM.|(PA6m"r wOR9$X MOb^D1@bW dD[a^I\>QƖW\l!8vӤ^:҇ټӭ7+6n 0ad&>ar5@Bjұ/ <,cm#Y0-vϫ 7x/TMTq%4e&&c1Gu:pD!ӽE$Uv$TĨ,Bi3QXDKp#Z-|YXĔ5=w?ZN {`T)ii2a2\ES!j]kp w{*c,z9ԑ%?.Ɛ$Yoж"}ž績IG^q|n94<ֻltL&A:r帛A}/sRQܽa8IZ^kax+]"R`zm;T.MK [[PCPC%\&.A,*+EeŒxfJ5ȘH`F Z[$8Հ z7&71TF(C鷡`xl<Z]m\ oZOVkAsZ6Vkw4z6vC +_ZZ\hUrF"x8UYR^^SODPAOhi: ; <C*H [6gi؎K-,Boz~g4nQ[d"(ґ 1=;#K Z% س6'!(z9sRz8UqsMH2;vk35&'6寫Z txƊӮn@U53`?R/na0 ,ZHpO%U~ M8 8HbmjV*0:\.7V v]4srC*N^Xw }4C! TX:Gf; ` F"- VƪU^$V Lga!BXCw[;􂈐+\dygkYV69dY+qU 㙂TאW `Q%{ʵG)̖*Y嬟e%k~Zg}h:]{l(ؼ1:ύ@$'tC PPg @W=6dQb Yo3h45Ls9sE~k~~PK!q!ppt/slideLayouts/slideLayout4.xmlXr8ߙ{`݋6,[ne+ әV8}!Y`en#&hMX1+BY" SV%z;|u [8 ⁵ [-/I+IRs,'h%?wN[t[9 O4ɔū"b ˬu95va cXlp kVuN1:`&]bv%e\5K=#$fE(Yzβ3ˌή \yȓei#;"k5>*TgFS]kaᵰm)lS,ɳnM_ժ&8УmA/s`ȿ~o2{Ƒ=:v4wgn4Vݙ'`re+NnWv+9t˞7]㖈1տѝ_k+ǤW{9`#]9ι"=Ȝf A7@%tn|4GN㶧Ӟmvm{E[,/`w/_bUWŃ=.o׺]*vP'0-PK!M$w!ppt/slideLayouts/slideLayout5.xmlYrV}LA>ct 8cnc{t0jttNg[KD~LyXZu(+f~TJSGO=tpT%,XGnx뤛KGuYO]t]eWq#n!1}jz){0hn̏||ːG"'Iy؟-$lI$ջ&Mފx>?U N NOX'q∾ɒi9bi2IS~*Ņj`pܻI2z7׬ P=pP[uGbtݔ7 7|'Gҝ/[r(KbSD1+I>#}P#U˿xH|1`u?6 I 21Rǫ@VNU88ɺ` d GP ΠOPAໟ+e(dh5 HeA# (=A^.\aa7aǜ?8)Be|SrZ ;^IZ-Ro-]7Ѥ:-tkmv6\-=L1z!#"3]Ġ"J; ?>[ރ!y-(jXhLY :4PzUU;dE*4K֎nuXu VdM[o#-!wC\mBp.-r00"WAkWhmˤ:-~@TlȦI}q$v1&U[c{|Ϲb3Re0<iC|{;}&<%Lp:%UbݠK/I)W!E*М((9)n*WΙxީ:_%_VYB" DRF4ԯ6Y-h `l˒tY[iF眕PI}d)$lYQōԌ,BڄB,5u"v:~r*} ph@BZV_H"!kTlM6#nTp԰I'hT:VU(K+4+z3 |AτEG@S+G"- ;$dJ/uɨ&!ψ5| |_G%H DL+4ȺN@@ ͩ!)OD:OnPtS! + .drJ4E F,  k'MS lҚ+8{g('SgNoN48qf7uSz+|VUktNSSn[zM[b!7FcVZV%vh@4,YRt^kCx`4@(O񺓮 "3}o*ÜCuoZI'wWU/hb xn )`47PK!9_!ppt/slideLayouts/slideLayout7.xmlUn0;DwuQ۩i1K&c--i'i6CDͽsw sTZ >q(EQ|q^NȞ*r>}jƊ W1LHu{+ڀr|W ـG _a^'^5'zzQuN"4DRWUݪ} Z+B[gKz"86Mn1)2Wp84Hl ZRjV|Nv)mv)0^#4\xO=ĻR61(tjo~bNh^]=W3^va1NYΒAN+ *`Wr![prfr: MVU$E_Pn%Mn!fJQ2D)߆$ w0M27o,IN$K;BnhV7^m4 1SPwnQuGOp B?Ǩm;^,A'(F"Yٓegȿmz[2!411);vN9 {EV.sinCYiVmgohg$l b쇼`Y>ݾ&lxQY:4eY/Cbf)%KC&/ww?pJ>]8rF$e>t +o*+&p'c[V85Ej|넧")`/8/5[ކ-/x 4Ir Vl5`.BnTˈYv(L/ n~.y\!RFSEfbHn"BCO8|+IP wDtG?,?rW}펭YRpB^UPGcI D+Ǎ&C>H~T5RCKSm>׃R{ı,ߡA02vqqŜv;BXD겊(\ FP00$ _Vv|D GFaȱ kXG"3X *nж`K E CnQ!fx2W Usi< (!a#+PH'z&)U=s(V.#vU::SU,V_EyKXc5nmoֻv/a5KX  _VʞBMU-U8Aq¶hrK摦™XDJV|'zz5_TҊDtNvCk5o( <;϶}0{4[\5Lk>$kϴ_u16 ܌WyZ&L%RZ% W:Dmm4 }H+q?pt{=OQt43GSϜF;_Fઌ>_ZK0ZTV`˾7EPtv@tuZfYkp61+YT} xB=$5mDz:"sM$űnc{b 8/%!Ej3s%ItDV"Q`/g~8ٰN|hWAXI?4O(/r64v6u}-sgo!r/Y/B߃s & 6iHlGEÔ.*GxUSFObǡp6xD(V%ln ;lБmH1 K9Nd :1c(͘'" ’T"2qз dyH+N5 3ag],Ӏx.nGNc*xN8 ͢ | h&eDm'Mtwx6Eeigݘ H ^b){O.B؃p (99D@{؞$Yxh N#C7Aw;Al= (`{ (@j^!(0d.Q`xD!(., ֤n1~<z »|4DJtewhΊЂDMbzO E 5ni( 5nѵ t,!-ׁ:Џ^{]=Pُ.VO8(r[TobZ&Ty](Q"!9_"zӳgK.9).Y'ș'(Mo:iߜFtϦdFBif3<<]~(G38-\9m>n_eV8r#b)2i;A[mF'&ܯŋ]dj~p%5{ގf֠orǮ9# 5o Y8y[c9xw.]~_뀫iyK| ^F^s@>`PK!ђ7,ppt/slideLayouts/_rels/slideLayout6.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK! 9\ppt/theme/theme1.xmlYOo6w toc'vuرMniXS@I}úa0l+t&[HJH۰ŇD"|#uƣC"$I۫_y$>h{ I37#һ{HLO&n{Rʊa˫<% ̍Wݘj+1ٻ1 jVN5QRL 4i0`R9]&!fmhH)1,Ly+[Wf%kK旭USih])S^ z}4i6NNfKdnu:f+5 Xo۫ހ,otuo@_k7\E&vhQ/ cv+ߨe9 .b,b>4aEf)c MK3vȗ Cj{2bN߼|޼|v㟎<9~,IX^co^?/_䗟?B%z^<{է- ҘHtn0d$ηbaZ^'XsS3 W:ĵ} xsx\hv+Eni^%3IX\L˸xwq7Mt*݈8b3(( {=Ա|:VdHGN42f>pV9tU?$1Mܣ#<@Th_BvpLˊ|押-heJ잨p'o&}qe|֊;/Pucd.K1elfܖaa}I4Ǭ;P` >*D8fi"H\! Wxhؕ="6 3ZlZF~fu-ԙՍh9 `aMD/`u8kpHvbp.H#Iy[ )V+qki,N*k,a{]GK:oO#KtZզ|1o1NR7pI+ad6Y>f+WM:\YX/(ԁTHedCLe!ʿ^6B L Z2_]ѶY)SE ЈMP}*Twjf-Yҕo ΎcF8+:ELpDž $V)Q Ua?SE'pehp+0P*F hLh{Ye_C朥aN~ꀆHP؏T$هdbl$YFDTI\ZG䐰zoPnIV dYBͩ!ks|l2Rn6 MnBĊ]ծ7󽷬Y<+Yi+hei"skAf.xqQc,.~>_):P[|t l iG8AL5m:iw֒4vќ\Hcgvlmǖ<{2Eahdc(>zށ)S|_ZρH~, PK !3TTdocProps/thumbnail.jpegJFIF``CC" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(((((((((((((((((((((((((((((((((((((((((((((((((#~bLQ2=G(h#~bLQ2:c4RdzQ?1@ E&GRdzQ?1@ E/#hu7¿+ig rŵ?|&oM,Cj^%DşirVկw$60(+O^#c mD#)~~9pu  H ? uI#6zl3Iw9?itᕕH|oni:.ok.&ѼkVrQɥo?h(F`π88l??Z_'ЁƟMOO#֐^NVp*O, Mon&ҿ߳짭_[V| /]̖֖oƯh]Ԯ.[H|W/:Km%vս7vWGsiwisoukq <7K ;,nF̬ EPEPEPEPEP|~Hݣ>|Bdtb<%C+`As\(߂F)|jOQ-^BK|Z%>h >|E:&s>5^ׅ1>MgYf^%үmצ4F-u=/^ËplWRq2y^4*:IEԌʛ`QG~GX+pNP'?j\?<ԍ$*e.J4))ӍLEZQV.zC¯7=~U?x+>xC>j"𾕭e7]ׄKꚇ$"t5kĶ?zWPIY/ 5 xPZ]fv\@q++;>%\ FQRS ,(IjEZJJIŜ'B8|†kWVɩ]y}s'+nq`确iet>< o͗Џngm"a!DkW&o?aH~ÿ_wgE׌߆.`+\s}~};^ u]*K=_zntߵ~z51jOڛ£wzdl^IR>5{J8j4 +;&aX6Q^S N.?-n "h>c n/0H+8x?%btzm᤽:xz4<OK~w=??Dޫ%fnZmͯXYX_Y^iIwomiyks4 .MҼ%ۿ%ִW m/hOko_|5{ gM7r@LirݭX SQO߷6ZJuWU'f, >`ye5e/u-VV^&NOo/oo.QZZ[$730C+#0ĿcۛK-?kf{x 'V= k>$߉|Ocyڬd_X6!SOrӍ,[0j^ íB_x*,-/,UM H!xg-v߲_ƽK/#Ľ? <)z+x/ڎi^(|me}cYj>  ;k+M:!_4/^"?ࠞ,/F4xGZ:FoskiڝNJ~Z$Ww wíަ/.d /߃??j ? 7_rŸ?ndoo1yi3x+R >M.XK}ZAZU~(Fv/U%W*WAM:et/Sjz1oY^*9툔f?%- yu<7W7qqsq+=~_di,I$fwrY$l~r|$|Qg/h >?|H~?O ߍ#I⯌zmğ| #N F<?Xx{kuV5?cg_^|?槧Fz^[i|Msy{u,VD"FaPII6vI-[mZ4'RqN2(\9ɨ1SrJ1II]Y;|9vpxIxw_ Ğ!i~q:( BW<*kO&?{PQ@Q@Q@Q@Q@CAdZ|G?-WA[t?~/<75R_^R>.Q/4R75Y[^g\^jzu햭7G$Wj_gG>ӳyNcs4_M,f132tjtS**kQFgJ jNZU!({IE oNƧ%__?@{xt xS>>γmykkֳZƿ >;xPJw~s)дQo ftζ~/|$N/t}<)}q?^˼~lǧN>І[Jt@^rƾIg&*QroQWvʌ[rm'&eŕ*1eq3 TK.0Y*I]xRqХ^LQG4pFf}y>c 3solŸ ~"75m|gƻCEҭ>k>ZKQXm,>"Vn0Ns 6vWI5.ÙGwԆQZ ”aX^JԪ]ǒa**UaҨywt|r3Z6iuoVx{_Z>ռ3|jC7τ/m.Y\s ~߱7<3JҼWIxgDZMPkڕ?Q|F|Qhͫ:kזZD!СGgl^?ƣ;|z@w}bzen/<1 }5,ޅ A= ėmRj O~5 GDӼAHxgH5C"mc÷~-5-Xy>x}oim%/xzv~0֍ǿ1S*œ*1VUJ5\2ϞJ=TA,g7C_[ iC][ɚkk륽C2ͿU_Yq9|W|3|3=o4?Z_]ik Dg9=:Ɓڂ[;'{Inesiw Io{m,^͂W TGC|;CssťhtCcWKDt#LXK8!0ҩ{9/:I," *ȂEº8`";]x<\4<$5_G۫"sig&t+Zyxc,O8Z;slS_)lBbq"GS1])BO3^u?> ~$ߊ)uO'iWhA?/·||7b47䴶y/-Հ?G38`]+Je35o<%{ 5{ Okf^Ңn<=6KKtt/?fO~_L K> >u+in#Y]~\j35ψfbGr4*>q~Fu?ğφ5-[5V@m"'ZI>-&Gl$4˛Ko/"u~? U)7b}6-|x῍tEwk]^/-ӵ fў# V>NyrJ*'Nj(Tp|9y$ҒQrHxk29xJ:01B' [ ,NKXNRUQ^<7]IǗu2jz~k{z .+Agdq|F":4FJ:u!W݅fqs_T9s'R'VQp\ni[/#<6+`!J0 ;j4kh N Gkw? xP^mC{r,\]j:F:6c֫RIK[xh1Hv[?~,Tۗ{ or1 s-wOQf%F[3G'ú5}YӡjU=ү\;X:NXYVEW|QEQEQEQE?o_I!%9¬~_A5'X_xURpvpm7sͤV73ſi_?A;_ $c~#|3hRi-!>ԭUh6q`wI i<|4Q}࿈'ƾѼIeȒOh7ri^V=CMItFKkkyQ%z)ck"i(a$/$JHID 㾭ᯉD<+VIPoWkx3·7Z@nV-Ac\4%7NrR-һvI髻_rlÉ8W=X*>aBJհeٖJ:18TeRQ06oR0o=SC}w/?5V};i xXth1%/a|kx~6Z :WmQx4~Ӭ>:&qagxĚwhY@ӥLjGY-6jߋ<1xZfzo Gck8z-o YkwzE.mwU4;̿,|>]ߏ"}O¿[xKLS~wkX|</]""5$cSKe/nX^s9780g.X/QM{\ \ TIa<5+3Qag*元8eL*UFCz7O<9cڇ ,k^i0h~/5"}Xn{xW?xᖃrNקӼAG |>"=bΡOl<;mb5G^8 ѿ7'<7m>>.u&xO5q )e-eOjՀ!7M9tGƼ6ԝlk1AYlQZJErR>ɡ|9JyzY2+ 4#JCRpL.x>Zw[=\F '[ʾ6i(O7߃ xcOw6iM3Jo ?]i7&ֳAx.m 1]!Q:ؗL^/k^}x+^kapӯn'XM;{F+Y'eAe?gIt{74)~|"EuSfiK?i:eY`-4 P[4}2)R O#x{Ŵßٴ {53l?gT{kۋ+"p@dwfEW5/&w6kL:/ 3~_'Lo~BhQ-4||gUo?7!m[//bw.<,|=`%(ߵ.&gau<(eC-;~a־UÞӮ+;ú,7GJ,PNd0?`;fگ;j^\6#'[߄ |1o!hth.y=ĸ#vͿ>6Yc|BbI~+H5.X6_R+w܀1P? T,Ik$ږi-ex{Za>?j74gLsc}l r, ./Xе U53Pҵ/IVQI; ֏g&x7poK+\>jV naX\ +%ń\]iHdž|u0GJ]f|+^<7}M:]^[I7Via濇~1/wƍ{X;zxC!/ş 5ޱY> xs7u再iVog@UF71xoz}q}'EF ݇6$g⥕xHZ:s5{kvZ{RxmmukװLcyVV!\?o(Gkeg,JX^5%U[F&Є27Н P,NtAB(ES\p~O=yIJ~(P0xycC+,9U*j3.iT*zN,F/(?& ( ( ( (< ??DzºO H7Ư$k=˵6S.3gC[^:-ךMC|gEZ^j}3ĚjeO3m jmϜ4BHhg⹳ >h/,/lO l%M/5^^b{5sZtXQ.3A{ulӤ;p`j5i(UVn5ӂ7Zn7|I7/ pNU܇Fe %a1 +^ڤcC1C T%VR\W_|(+x]oN]vzi7WFy [mtSYR~#Rm>cp(^5_k{Fwoca$p i mi^ci5i0-YZ[8-m!U#8{~F AJZ#ǞrMb8Ż5Vi~5L;sa⠱5=jT*oH*Tp<<#F TPF"+iy iv> $/s~g79G/ ^S°J¾-4I~TyEa+Y-~$ZNn_"֡Ҽ!xwp~Gߓm?a?Xx w`_+\X3:gy<-(Jm%UT(J.Qr6Y]B [[oyMw.pGVHmm)\AlTC w| w+C*n9+#,6~| |xJ[/}'F|ui_ŏ^iZ.[ 6>mcz-kSSysH'weC>'t~%3Xk_7bͷºߟgUԾng+ogɝ%*#;|9>.??` 7GGMc?PyK ٟ୭)nTs][Os[B,2I#`_#]gs]d-k[~(ugV> :>o5 OS/<5w4WSKsus,$1-oEs}^YzK֩5tM-pwmnjz'-dI5].}ox7RM:!'oyч~_?"g?(k+w֚wKz7_9m5|;V6=D 4FvFʤ{idq?& mo\ƛاZՇG~ i񵶏;eš&7Ik ψt/K]cGAs[!o _5d:Oz:Ogqqk;Yj<ֳo#F^ >V5zͻ<'<1}~—W~Ѧ?ŝ@˨o^ ~-r͙enN@?B5MNtCYկ Ҵ+KR#K<$PAP/|sѺW~'x?ľ+||WSe-5$dVZMo@~=zZýwWV_5zD.Qz&msH{hz/|K{KabB5k:|կ Fr8YX6~7bL&mWG4b9mJ9~YVN\5*lbe棆᫹X*i{I?ҿkO◉றiM;>Z.CQխ͵4:@,{y⸹{/eik|moƚ>+~ԯ'h-լ xRִɟJ[tJc{[;$jk?<}ik%~ LL ,' no2mnh/j^ τ>+gX_Bɩm)<1jhKmnnZVkRMGK-#E ivQh47 벲;RUffkURU*IFz(Hv+O ?)?C ai`tgUAV쩦Z)Ԝ# J;l+>@(((( H7Ư$j 55^)4'o|q\_g߀<{^.%7 k7^.akhfx ??Dz~7xCmYH?qßIkHԼ7^_i^q0U-no4mT8[+)G5㰴p|?F9jQ'RkVUl.)8^Q1oRQLq9|3e*2u/9B2׺.i4EsNMF*Rj/xD]L~OnUoVm['T^gR>)|x* Ogo/׵?xc6H|׼Ighz7{_>? O:OG-SSҼcxS>1寈u* /iϙq }ڲe5l+YEÙVVPAJ12SyzI;Q'E8*sQTlEi ĤÈx*ĺ'(4ʥi5F:2O$.rQT]{Swܹ&*mS'xGS_GWa?:xM[i-hO sÞ#>K ?T=kN+7>߉xwhm2緼D??X=w:ֺuޡsX= y8>R/~ퟱ |xɌ^ cܭzW^Si%=NY`+aU.S5(as᩹JԬӗioW|[G$N U5<|7G k^ |Oqmi_㺃VѬeEbY $c/lSZIҿcis/îtM/aKjmp.> >"4o wMRk[i:E5#4K{]\O7L#~x ᾑxT>஻?Ğ-_$B|..y i$#5Y,߃"ٍr@o~|OdOڢžӼMysi/?O>9$27/tv6jv2SwQm5K)4.*F/ϞMA:^ ;/lSZIҷ~_:_ů<7 ~7O|YR|R-?<48xCe~ҵ?(mSU줂QI7S6$n|ϧ|.}s 5Is bŅ}//5m<ʞ>꺵/)_?fVk'3`0ރKT.馹R(B9$N|(էR2#M4E4b+ӝ9KG =(kـ~ǿ+<vx?V@~|on7k8-7 Y+9Cxgoÿ]qxoA՛@3C@4zzαmwLiG^x+.גjfMkGŚ]]B qssq+e?o.do{&OO2WĿǽ6X5_Z|?xɬ5G|ip,"oMU[F֓7Wo7l]oo6:w2+7!ǮeXxT4/gRUc uF HQ UUQ]T y#?g+O 'л^}(gQEi>,x֬+k>ׂZEGmzލ5S ukkRuzE*௄Ə~OWF|SzU?WPvNa-ě^~ho6{ЦTT*r5(B4,4%9IBULfJ?Wa8G5F9N3T!iuqtTc"7hJ7BjxŞ6_?ox#H־ I|+o xAs?VWz泦isx%"o wO'Jm&a'!k<#uj߶oW_5/:ÿwĭ[ h6oi mj!Fqv+|l|7/'惬'l[!L6^$ k+4eS6y]vVV*t(ӓ̕Jqdp[,isӫNJSSrJq2p^sE%xk4QEdhQEQEQEQEfkz6=VimXL]bu+il%1H#XrUgw0@FwS'ᏊuWſu|r,|ox5eOwAaJL@7L~t0QOkk,}7'7~^mmqY^Wݯs^adXG (y#a+$Ɗw+,?_A%?dw,#@)Rg>~w#kSxƞ!ֵgHi-ºnde:mпW+ 2?˿d ~-MS^W|s?xBt_XsZޛi7:Vu{gz?WX2?;J?^adXG +1?WX2?;J?^adXG +1?-Og|b/_ I?fO_|;R~ȟBjH~2i k7Qxš?1|ӡ|ֵcuafW-~QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE摪N4BTy#a+$=Og|c/_ |If?|;R~ȿq]7čsHQ|!â"oGxVtZi?tH"Ớ颶{yM{5=.'%J&#Mr t)Φ&*f…5({ ,9TXB0Rs5ԫҠxhغS:+mً SY|^mo'u~'a߃>5_WewEw35ޏs\hƱP_i_"w?j_S?4o1C+'ǟ'w6ۿ CYuw]nD'/A_Q>?˿d ~-MS^W|s?xBt_XsZޛi7:Vu{gϒ~>Q|7x㖏 MFo>/_2xnt7IuQ>xEV|6mN>{Lx^PI'ItC __WG U隇>QּEj-Uq_ I|GoZnyoxSïaKSy#a+$Nńxj'S2vbjO1[~_,*HeG*:IQqpQZVSS^ޭ,eySXKJ% x^Z/8?NOQо.+T, ڼ:W+{ Euİ5xZM]SEi',5ZznjW 7^!?~кi6N[PQAq t ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?QEQEQEQEQEQEQEQEQEQEQEQEQE     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?0PK!Xªppt/presProps.xml;0 @w$e) U,n)q";nOGe纻{'@l6r]R[y>V;)8i |ˮ].XEL:eH"+)X)f0@^<Ҩzҷ|;)˭ڢ4` 샹W O6~KRPK!~{(yppt/tableStyles.xmlYn@W? Ā/Gj4힗ma`'<;`LXs\^=H$!*(؍ RBBl(¾!>x5Ҟ}#ȿN@db←K܍E1*CПzQOA/, 2_BUuMICHZ_S>7㥩,F3|szW;|g(@*Hu}LB6o0c?V&7JC `@po#CtމegB[ʻS2R@"q^D7v9C>)72@A$DH%+b=֛3)ܓh{b2NDH/ $O U ^8w,@*G0<쐀 qt L}  f~z]A z|89gg$CR;4\UdZ_UU`l )8aXT-P֎.NKDhU࿨\*Mc3X<|֐H^#SzgfVV[k1g?.h]*$1p)PҖBYBR`L^4LPe y2qclTQUN?.I5[,_S%+3cYhI4j@HuBOW!LB{R`,&ldQsJU/?JXF)G~kn,5cSJפ:$}*c}7esX;* vy_A˼Skug*KiH;m" ~I҃WB2+#9zH''HŸ́"25<:?1PK!͑\Hppt/viewProps.xmlR9o0+?X!mH"KՉ8Rb[ _@8w~dzPôRd81AeE$X"rRI2|do 6~4aR᝵*WeQpʾ$LDXov\M43mHZ9dWEìkVXdNp(7mZGu-T ^PK!{ZdocProps/core.xml (]O M -5n6-KlFwh/mE/=srv*ځu6"I"0l*S9ό`6P#84W%o ^[xuKpQ WB[cǷKq][|X ndYb nq3 )lcPxIB׃ 2rjMt;f ދ`>b/]X8 Z ^xХ"RajOLvy^b/+%f ;پx t@DDW>+ojh4N4["yцߖ|R|D<h#oPK!]docProps/app.xml (TMo1W@QqTJAb,kk[KB~}g,MC73omv\k5ldLa2Yv30Rhk`!d7ց &̲*F74"1l0RZ_R[[[D: (fϿyd2as ."BK'TƒīOz$WlAvׁ<ׂG~]|PK-!6pF [Content_Types].xmlPK-!ht _rels/.relsPK-!c\#7 Lppt/slides/_rels/slide1.xml.relsPK-!.5Kppt/_rels/presentation.xml.relsPK-!^>N  ppt/presentation.xmlPK-! c# ppt/slides/slide1.xmlPK-!ђ7,ppt/slideLayouts/_rels/slideLayout7.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout8.xml.relsPK-!ђ7-ppt/slideLayouts/_rels/slideLayout10.xml.relsPK-!ђ7-ppt/slideLayouts/_rels/slideLayout11.xml.relsPK-!ђ7, ppt/slideLayouts/_rels/slideLayout9.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout1.xml.relsPK-!ђ7,ppt/slideLayouts/_rels/slideLayout2.xml.relsPK-!ђ7,% ppt/slideLayouts/_rels/slideLayout3.xml.relsPK-!ђ7,-!ppt/slideLayouts/_rels/slideLayout4.xml.relsPK-!ђ7,5"ppt/slideLayouts/_rels/slideLayout5.xml.relsPK-!i_!,=#ppt/slideMasters/_rels/slideMaster1.xml.relsPK-!R "$ppt/slideLayouts/slideLayout11.xmlPK-!Yk "(ppt/slideLayouts/slideLayout10.xmlPK-!gϠ=!D,ppt/slideLayouts/slideLayout3.xmlPK-!xQ !1ppt/slideLayouts/slideLayout2.xmlPK-!AQ!4ppt/slideLayouts/slideLayout1.xmlPK-!}#/!!9ppt/slideMasters/slideMaster1.xmlPK-!q! Appt/slideLayouts/slideLayout4.xmlPK-!M$w!bEppt/slideLayouts/slideLayout5.xmlPK-!)X!Kppt/slideLayouts/slideLayout6.xmlPK-!9_!;Nppt/slideLayouts/slideLayout7.xmlPK-!-8!!Qppt/slideLayouts/slideLayout8.xmlPK-!q }!ZVppt/slideLayouts/slideLayout9.xmlPK-!ђ7,E[ppt/slideLayouts/_rels/slideLayout6.xml.relsPK-! 9\M\ppt/theme/theme1.xmlPK- !3TTcdocProps/thumbnail.jpegPK-!Xª7ppt/presProps.xmlPK-!~{(yppt/tableStyles.xmlPK-!͑\H/ppt/viewProps.xmlPK-!{ZdocProps/core.xmlPK-!]udocProps/app.xmlPK%%M db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation.htm0000644000175000017500000001135211520622616025106 0ustar directhexdirecthex Activation Concept
You are here: Basics Operations & Concepts > Activation Concept

Activation Concept

Activation is a db4o mechanism which controls object instantiation. Why is it necessary? Let's look at an example of a stored tree structure. There's one root object, which has a bunch nodes. Each node has again a few subnodes and so on and so forth. What happens when you run a query and retrieve the root object? All the sub-objects will have to be created in the memory! If the tree is very large, this will fill up your memory.

Luckily db4o does not behave like this.When a query retrieves objects, their fields are loaded into memory (activated in db4o terms) only to a certain activation depth. In this case depth means "number of member references away from the original object". All the fields at lower levels, below activation depth are set to null or to default values. So db4o doesn't load the whole object graph from the database. Instead, db4o loads only parts of the object graph you're interested in.

Activation occurs in the following cases:

  1. When you iterate over query results.
  2. Object is activated explicitly with the object containers activate method.
  3. Collections members are activated automatically, when the collection is activated, using at least depth 1 for lists and depth 2 for maps.

For a concrete example of the activation process: See "Activation In Action"

If you want to automate the activation process: See "Transparent Activation"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions/0000755000175000017500000000000011520622616026543 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions/dangerous_practises.htm0000644000175000017500000001644311520622614033327 0ustar directhexdirecthex Dangerous Practices
You are here: Basics Operations & Concepts > ACID Properties And Transactions > Dangerous Practices

Dangerous Practices

db4o lets you configure a lot of low level details. It even lets you configure things which endanger the safety of the database integrity and transaction integrity. You should avoid these settings and only use them in very special cases.

One dangerous setting is disabling file-flushes. When you add the non-flushing decorator you get better performance. However due to the missing file-flushes, the ACID-properties cannot be guaranteed.

IStorage fileStorage = new FileStorage();
configuration.File.Storage = new NonFlushingStorage(fileStorage);
DangerousPractises.cs: Using the non-flushing storage weakens the ACID-properties
Dim fileStorage As IStorage = New FileStorage()
configuration.File.Storage = New NonFlushingStorage(fileStorage)
DangerousPractises.vb: Using the non-flushing storage weakens the ACID-properties

Another setting which endangers the ACID properties is disabling the commit-recovery. This setting should only be used in emergency situations after consulting db4o support. The ACID flow of the commit can be re-enabled after restoring the original configuration.

configuration.File.DisableCommitRecovery();
DangerousPractises.cs: Disabling commit-recovery weakens the ACID-properties
configuration.File.DisableCommitRecovery()
DangerousPractises.vb: Disabling commit-recovery weakens the ACID-properties
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions/isolation.htm0000644000175000017500000001412711520622610031255 0ustar directhexdirecthex Isolation

Isolation

Isolation imposes rules which ensure that transactions do not interfere with each other even if they are executed at the same time. If two or more transactions are executed at the same time, they must be executed in a way so that transaction A won't be impacted by the intermediate data of transaction B. Note that isolation does not dictate the order of the transactions. Another important thing to understand about isolation is serializability of transactions. If the effect on the database is the same when transactions are executed concurrently or when their execution is interleaved, these transactions are called serializable.

There are several degrees of isolation to be distinguished:

  • Degree 0: A transaction does not overwrite data updated by another user or process ("dirty data") of other transactions.
  • Degree 1: Degree 0 plus a transaction does not commit any writes until it completes all its writes (until the end of transaction).
  • Degree 2: Degree 1 plus a transaction does not read dirty data from other transactions.
  • Degree 3: Degree 2 plus other transactions do not dirty data read by a transaction before the transaction commits.

The more common classification is by isolation levels:

  1. Serializable: In this case, transactions are executed serially so that there is no concurrent data access. Transactions can also be executed concurrently but only when the illusion of serial transactions is maintained (i.e. no concurrent access to data occurs). If the system uses locks, a lock should be obtained over the whole range of selected data. If the system does not use locks, no lock is acquired; however, if the system detects a concurrent transaction in progress, which would violate the serializability illusion, it must force that transaction to rollback, and the application will have to restart the transaction.
  2. Repeatable Read: In this case, a lock is acquired over all the data retrieved from a database. Phantom reads can occur (i.e. new data from the other committed transactions included in the result)
  3. Read Committed: In this case, read locks are acquired on the result set, but released immediately. Write locks are acquired and released only at the end of the transaction. Non-repeatable reads can occur, i.e. deletions or modifications from the other committed transactions will be visible by the current transaction. Phantom reads are also possible. This is the model db4o uses.
  4. Read Uncommitted: With this isolation level dirty reads are allowed. Uncommitted modifications from the other transactions are visible. Both phantom and nonrepeatable reads can occur.

Read more about isolation levels on Wikipedia.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions/db4o_tx_basics.htm0000644000175000017500000002607311520622616032154 0ustar directhexdirecthex db4o Transactions

db4o Transactions

All db4o operations are transactional and there's always a transaction running. Each object container has its own transaction running. The transaction is started implicitly.

You can commit the transaction at any time. When the commit-call returns, all changes are made persistent.

Commit A Transactions

In order to commit a transaction, you need to call the commit-method. This will make all changes of the current transaction persistent. When the commit call is finished, everything is safely stored. If something goes wrong during the commit-operation or the commit-operation is interrupted (power-off, crash etc) the database has the state of either before or after the commit-call.

container.Store(new Pilot("John"));
container.Store(new Pilot("Joanna"));

container.Commit();
Transactions.cs: Commit changes
container.Store(New Pilot("John"))
container.Store(New Pilot("Joanna"))

container.Commit()
Transactions.vb: Commit changes

Rollback A Transaction

Of course you also can rollback a transaction. Just call rollback on the object container.

container.Store(new Pilot("John"));
container.Store(new Pilot("Joanna"));

container.Rollback();
Transactions.cs: Rollback changes
container.Store(New Pilot("John"))
container.Store(New Pilot("Joanna"))

container.Rollback()
Transactions.vb: Rollback changes

Note that when you rollback the changes, db4o won't rollback the objects in memory. All objects in memory will keep the state. If you want to make sure that objects in memory have the same state as in the database, you need to refresh the objects.

Pilot pilot = container.Query<Pilot>()[0];
pilot.Name = "New Name";
container.Store(pilot);
container.Rollback();

// use refresh to return the in memory objects back
// to the state in the database.
container.Ext().Refresh(pilot, int.MaxValue);
Transactions.cs: Refresh objects after rollback
Dim pilot As Pilot = container.Query(Of Pilot)()(0)
pilot.Name = "New Name"
container.Store(pilot)
container.Rollback()

' use refresh to return the in memory objects back
' to the state in the database.
container.Ext().Refresh(pilot, Integer.MaxValue)
Transactions.vb: Refresh objects after rollback

Implicit Commits

db4o commits implicitly when you close the object-container. The assumption is that normally you want to make the changes persistent when you close the object container. That's why it commits automatically. When you want to prevent this you should rollback the transaction before closing the container,

Multiple Concurrent Transactions

db4o transactions are always bound to their object container. When you want multiple concurrent transactions, you need to open multiple object containers. You can easily do this with the open session method. See "Session Containers"

Note that in this mode, db4o uses the read committed isolation. See "Isolation"

using (IObjectContainer rootContainer = Db4oEmbedded.OpenFile(DatabaseFileName))
{
    // open the db4o-session. For example at the beginning for a web-request
    using (IObjectContainer session = rootContainer.Ext().OpenSession())
    {
        // do the operations on the session-container
        session.Store(new Person("Joe"));
    }
}
Db4oSessions.cs: Session object container
Using rootContainer As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFileName)
    ' open the db4o-session. For example at the beginning for a web-request
    Using session As IObjectContainer = rootContainer.Ext().OpenSession()
        ' do the operations on the session-container
        session.Store(New Person("Joe"))
    End Using
End Using
Db4oSessions.vb: Session object container
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions/commit_process_db4o.htm0000644000175000017500000001350711520622606033220 0ustar directhexdirecthex db4o's Commit Process
You are here: Basics Operations & Concepts > ACID Properties And Transactions > db4o's Commit Process

db4o's Commit Process

How does db4o make transactions safe, so that it can recover failures? Here's the short overview of the transaction-phases db4o uses.

Phase In Case Of A Crash
1. During the transactions. New and updated objects are written to a new Slot in the database-file. The id-mapping and freespace changes are kept in the transaction. The changes are lost, because the id-mapping and freespace changes weren't persisted. Therefore the changes are invisible to the database. The transaction is rolled back.
2. Committing starts: The id-changes and free-space changes are written to a new slot, without damaging the old information. The changes are lost, because the id-mapping and freespace changes haven't been completely stored. The transaction is rolled back.
3. Write the location of latest id-records, and free-space changes to the first location with and additional checksum. If the record write was completed, the transaction is resumed and completed. If not, the old information is used.
4. Write the of latest id-recods, and free-space changes to the backup location with and additional checksum. If the record wasn't completely written, the transaction is resumed.

Of course you don't need to worry about this. db4o ensures that a transaction either completes or is rolled back. Whenever you call commit and the call succeeds, all changes are persisted. If your application or db4o crashes before a successfully commit-call, all changes are undone.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/0000755000175000017500000000000011520622616026105 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/without_activation.png0000644000175000017500000015635211520622606032552 0ustar directhexdirecthexPNG  IHDR@*Cb]gAMA a pHYsodtEXtSoftwarePaint.NET v3.5.5IgIDATx^gpKv&?RNFEiB1hfGs{O#ah4{$A@Ё@H޺6]ՅN44443iY<3=MiIV%{Z4e{ MNN45anl޾}[^^^6JgRnn/Ҿ}s$ƍzMIKK#!͛oZj% z{`ikaRUU"xy 8?pA~_N>]tukb̙3DF'ޕ+W*89ӞÛ ď?>{ xҬ::t&8 X(p 9Ĺs0pghhQ([nqzXp!||5n۶8s78S{մ'COX@7@g@`I:@E|%YQ .+%!?R6 9u*˗ q8GVկ~E"9<@F7ɸjΦt] 45n΀.Ijεg>8DH L,((t,KMMMBFF1 ?cHXkj~O؛7o,z 3K0:;; V(2aCƲH1r8`ۥK`GqHH.] gZ<؋0]1Ņi={ ]2 xu)^eBpҪEzk&$x`(LNN&8($?XZ & Wl }uu5=J "2:\ 'jıp&Jqtt4pH):=p U׀10'O>9s7?XA^j'#)gDcvX`+W͛7c=9FrR??œ 8 'Hc9s7q4חޡa 4Yئg!٨\&[ X@n za+Oٌ}7k43>>8ΝWD uP(Fzg. ,?$`UP'6N5 =E5-3l'qS^~$Pb d0˗?h7ap"dd-夐+$E =gKrrr!8qݻEr?kR9L$'D~%?B$6ǧ{HBZqDTa=ꔔ[&5=0ʲ`cY0~JwcPȘӣG_a7aY`M{keY@0lӅ,~70 Lw^LN}dd۷n0l,0z ZTa3e-1~sv:VaY`ɇRBѡ\Z65-K8.K\3{wljq0kRbeV9x%j >>}Ef|`u,z 0l 6_f YfJcMNT_o=טX`&-a *%6IX~`9<`ha˗/LJ{K9 K\ `XXl~3Dcxɓ'Jqk u! l60*K\탺Goz_O,!D[`|EΏc5Ǹ~zU "֥ `ffћSw YЀx#^scx/ cҌݻw_W6>]ܝo450#;Gd/^do)d$хc-X9rkq;NS45̍ywb au2~1l= :້2(qKbik5իWc OĘ??tV0 _@zBL3~E,KY?X;{, h~Dk%4V0b AvgiɓD/^}v^Їn0l! ‹oa[IIIIƣ'&&˞hu]Nݚ'o  v=x,9!x $>\9$9=QB۷o?)xbalQ L7q^9rq bccw_Ǽ$=ĔO E`Bp;5\R2cbL+c+,`aTO9OXn0= B $b֮G\'a.x*6X Ut i6<zi4 lUr0sװ^ q8a#PMՊ] @;BoiMK}9Jc5{„(uUWxFAVWae|PkʼWG`&Ї^KO>p<0J^)}u瓷=/&wo5/Gb5,tay אa"o00|308aC)EB*z^XC*(*=0~P `&&a@]Q\`,{^|B~55Zgl\zHxP$($t#Z@@Et_4zfqb CH!a 9RxōA]#hI&''1 900ph4\!7˶50SpēЍ$j9<2VqPAII ^>[U w w;ӝAq^fbޑ8p")I $R@ GZb] F$ kf~i@UF8Gj7갚C;`ΆDF&8oq.j1' YFw$d l?*'yl/5p}|x@ N:w699955@\\W%Emj00p00]gN` dW.t`wXfP9">u$0 )1 W9(0놾^ua vۅ <Ʀ>Z@T7uϚ^dl‚}{o\3X DV~`ͻ<{4PmCX|GS XiviiJZ$Dx&;uP 1( m睛 bby5il kn2(7'^0C{tYcs_CΕo 2BNð_ؖٲol\j Kh'XcAȯh =:N~ ډ삊YA/nCuS+cG";jk5+ =d\XջaoƄ'XCA<8xn4$?܉욺j1Rp0pvOzFyHCAvW?MJٿ~Ԁc-dV{sgMBW $80}?9?7~>a?8BqF!Nq߰ lR#9erN~ʹ( 2suUDbZb 91PغEv?kj߳k(8Ssceem Y&  /& V[lħg'{eA3=.yRX@Nde'9F>vm/:ۑ%l9/ՈS֘X+7i&3YI1m\ p .O1VnLx4@sj">O~]|Uck֘J=Z n=}n~ӱMW^d50hE`}`*7$>e4 r#}Wy`NOJjBC~۶ԅ~@u&ؔb[LO#Z*1ZWOrCU֬Ʊ"@FwlBz΁%Ӛ< X` `ZA9Io4 uRh`3||z} +T֭\!\H~–"[s 9,2ܤ| iA]Fp2S5yTݱի8z]a]uX`zګOUjC 0___L tk`_L>km(7΁(%ׅs᧡ cVyϝ5?nϑPlF9/ &j1"k&'O  %@"[r)kL dCY@\$; ĐdXS@\ueE)7QYoJ'i έ%YEث瓽Z JO23C#]_sœ%dE!NmތSFN(#F8zDW#(Orn }v{w/,*+}R9\X|0%1P,0òr__e+päG(hݨ WtttJJJzzzbxxقyS%%Rs!!#Cb|7`aEXf`Z7bbb***rrr6> 4:ccU+444`"00{5|Xs@qQĽĮe`zeggWVV655oT*U͛m;gUkk+yLyk4΁5o@MްWo@Pl lM1ц|kyU4 8d6_nnn=؟,'ہg7-ê̛i&8wlȱW,F>~GbT][5'"6vJ~j 9/^.m~pXPyBn騙e"6EDD`=a'rs-^!A/IS]]]y\TTu#R)#?nF H0~ 0] ( z_N+<<1nEmW59٠ ؘ{5I()6Y^U 8ff%_Q?Ћ "koojۚ6u!)Q mRq}Txxff&f0Y%20=zmuӚGއU, $vĐQK6ыa0 ;0`w#ϟغ||,uƚ8^Qg`2>>ZzA 6x(t>,0ngn}ѧׯ_IoPS - W_ ,+>uba{ɣ.!aq c02I(`';DY8OaVCzYl^+Ԁ4Lpo޼G\??q_v-My2!T+ءj.0yL`~̈́LY2DŽ+ zqusXHv`KQk9Q>`):yÜ2Dv1ai34.'ư ɺAŅd^2M%Ub&&( ^L4L 0kaq bx\LBeRbLgǀ\y0 E U*CZΌ5 0c4`&s?bKyk`zhW R$ ,3 (S $qycy%C\ XfE{@zR3l_R[Wfܒ"ӝ,3 (U_ cxw W ֢]KD` O*i9W+;s17enݸ1{7^NX&) M4T x"}{\dh$`pK.]u"kWv|NEטXXNӡjr` *k[`Y'-ς.scs/0e:;ӀԵr*̻I^;ZZ'Vi2c40-]d/kx:AQP_2ӀR5KL`5,3 (S ")+eF(i)1 WILZ}Rrci34ҩ[3 "{5@`X-aʭT#>_3v4/~J*PTX GLip%Ab9#P怣Uhfu#r(tH*;* F,3 (S.N,t*KA HqRZGi m!DFLՀ 3ϖ'JWeN&!+BƁB Ek]6UXճ4L Xt?ŸVՋg)ːq R*DRb˦ +O֙ԲJ[یcRh3XHFHI $Tk}ci34#TW}nۖWw@MTdKC #9*DR;[Fc$d:Nﻁ 'O0'!ѶyR^yHa;a z'<ڪ*ͦ%%Np"&))+q:(v*YfP`ҏ?~PVFΝ::L$+. H?q!zy%X뾴,vNQh1Sc=k5@`dIMKwñ"c"#PTHy"H +8H K?$Ch&KLJB*NJC9CmGvT6@i@paDYYYJJJcwrii{$''c8)C 619G'U= G'%%+:NrKb `zgYBhrrr"## 6dίKV,FģVB<ᓛs{ߡ6E$߰ 9Vum yfRXLPipa9BD<Wv9gHM1ā#K/ OLLjuԁ0IX`"!rJKK M߶nwEBDLt-kW!(~nTS:g(\f#ӗ4T 8. xZ->ESx]2$ccp|eKm Svee%y_<)K | SY[H'N-YԿoǃ![O/_*t+l~͛7ccc1TVH%HK(CK~+u!+wz\T%Tهi34< YK L0\zD=q7~ȍ CJV-aXMLnY]>DW"}6n8K%:DPQ­#RlݺK7%Q8Hҋl{z\*222cQQQpҰЕ8`\CJV屠ZRdcJ:bA1"l3Ie­K$ %:HTٺ>Yҥ8IHN)s1TfLۛ1u B1'x$3^6^Ѐ@dUff&ҳ"|T ?  ?]fdݼ5$hEln"hV|$ wL$Il'Г1c 88L30XNm#nX!^l ܐcWAK+'~P8'H*ʤuDK"[w VKpD⺁xY0E؈ejaWp+ \ 22\ V$9̊\HX9,"I(~VuGŒ)Ւ(aO3"mg1c nNbIk`fYJ*ŋD|$D/ԢP$JEF) JF,3 (S8⏉GZ2Jn"q&sPQ +O SB'(# `O={%z no,"N مj 9Xeej0`&P2=Cehlh$a%!J%7LV!J|$T쮾ej^p7+lT#$P*D#:?{`GB+l;X]=LԀ3 Φw͹(0|%\$&2Jn"ѶcLgǀ\ypD8A4lbhJQ4uGJ$RM44R1c4TںjP+!À44 p745H(Mu44RDY%bl0+gi@0n&IZ Wqm)rMe:Έ!iZr_^S2xT4JJQ4uB1Sc@< H`Kvi5A%44 ;pKՉ'X okHC#T4H%e]dஞeej@?Ey{Cu&Ȍ7lYqXtv*M44JES T"Ei_D"`w,3 (UR<vf!DCH `-\ ->%M44JES T"5laӀgh@BK/Xdq 7!  >A"0FBhJ$(5)H4+,eej@ 磍ۈ2(Z!U_ *٬ZF F*hꂆiȤFbLgǀ\y*k0@x."~}hb HC#T4H%e]dn;` VUUDF6k6ϯʪ7;۰NFySsZ7-AhBv*uT`PDS݃8%T뒏lR@`3geBFFнXղ%kN +Og mرm00`'{{4ny[t\ȇ+TWf0EYNDD&k&ۏQ_CfaD$uJJ՚UFnɦ2TZA (4T 8`/:M46ztodw+~ yǤPiE^ QDS|׫REB.+nX':hh\/2R9vВ$"1c40 IpƑÊ=tg}SS*|li:n`E> Q) '҈DY&7STHP+++UN [kMu44*2ͥrN a=LԀFrittFC{ŬomŐhJJMh>57?̬߸{K! zhDFrR>Xωd\ۢєlX':hh\,2-J$I(0e:;ӀFbÇZtsTSj]뱣4j;Νk@a{wC CH6ܚThiɡaD$d'YoMu44nɦ2I -I"z80`L Eqqj &tCښki^UjXdN ?V,]TTTD"JlVG#5R/RIII`hqH6iM*g؎hI`zzÍOK~(.2՚g}MqaFVP"sPorrrhDFrkRMV+ͅHJZ'%𡩎"(S|ZJ$pE`\  d& *jޕ̨E +S"sN0##-(EY֤WU_p"eee h |hqH6)`>mG$H 1 xSS J4иE$ʴ&3lG$Ha=LԀa C+8Ֆi&23@:yv4sVKjׯ =u*&&!U6EFr"nqHllq*DNKU+YlMu44F$H +R3]hhhЉicqwBn^Tn#i$ďoܹm>-ՄgFxߺu +:8"٬FrsF}._ RRR"=0(EӾsyhqH6J-Eھձ9!}LJ=&C#ڵk7NDGRON4<3Zyv;'zтF|v ]:{?/qE fuMO͜sRMvޙfի3$"qZB@c{正Fnɦ29\`;%{ZɁ}q_[ՒEu'́1cP0ϵk-_މBC qn:<˖zyy^l|sÇRݩ7o|h w|C<طoOE:T hA/ s`ZHufڲ_HREhAW\ C_9䋄5&ݸqcEKoMu4tH6JAK1O]K^*o|0;"] /0TXXq۷o;;~]ٷUKύ]̡CǿKgi&n횳[V,x°ޗϟGE@/T?.-]uEtqN(s )* LDπjۨK.nb:hjJە_wߥM/;) ҇,3 (S7jFPPŋϝ;wY=1> y&8{(AypppHH>~4ՙC @HՁ m!Raf 4-22%$d~*0W^[GS2])2]o;3 軓lP2ӀR5@`pDF0c` ^ 2`.Ĝ8 pX `9011qS'hH4ա-2 HNh 6D"Da,)) g:hzhJۡA u-HtK0yLD<7|V+ƀC!%BDZ =!Ѕ 4"T$fuL@r/1&XkMu4tH6JۡAx@6sN A=LԀ;hJK5~sxp\Ha`. ]C1"٬@SP<JR2""!9&0g9Ic²'jvSx#N>ķD~r_8   I1ǐ`9%+[}V$G$~4lM [):~Ia_#<07?B,yǏ kʡ_I`"KIEyŕ*9B17mڗl݉& d&=raG`=k~96 !n/.ݬk jQ S&S'?raGX6u{ג9ztu{vyB0$sdrxv&%O,;šۻ%?.{(xFLʸ ήuty:C %ݟ{>ŷ(뿎N% B_*$|U%܀9+**D4&K8K3vքM޵lF`$#8 cݵx\C4ݻw#FR`gBF@> &˖-aEy-5yKROF| M*;vǧ.ӟ)>1lX]]ىqW^I^n0*d9p9og}s674 HxOaD+<3 CH]ؼUАq|vҥʄ3 ҉MٜMiaGX6u{By`xPmkkt1ŀ#O~i`b삗HFWvCzpgY얲%מP ǀ9ϬŠ^} %ۆ/uuuXcC>jބ| ]Op p"R9'p(B ɀŽ&lN^~N mlޫ򵷷f`:ɓ $CLqư0|c:Ŝ+*-tKRl֭ݻ}#7xt/.--z /ػ)]s_dp68A/%<&(AB *E@mllaxB'qٳ|n`BPwP1 rrUŀlʼ}5eO$Ģ% 7u'Q p99aN6V# ;o0B+I('\õ~codh|bs l*V1齤tNӓZDX$[ao1NMd0z <" Oƀ!F^RMzZtOM81qw0d[nC@eB_n4x-b)'BsBגr %sD >|n&l!*IDNUTg.oIԋ4$iJ?p@ wwׯ 5Lb#0 n0A; 1믰4Ž  z4EI0D 1!@9n9r̿kL9& hp]˯ZA*sid&bXl GɃ'z0'/&0⷗ iWQUUZlE3v5aS7v*jmpm w &#d@zh!B aDf0,_˰ּh grS:`zTg0w'LnIFCDQ<pB!NaxS\xnq w Wc1`hҘ{"0nJ@4nr&<,`C<`Ć&P~UDD9Ǚ_>x|0i~- =OF jı52kbXCp xe"9iMj .l4T;š;" ; eXQ`Ca$#3v6NEp) ,A zr%m[wHxp!X'$w?@˗/?'X3P&!f0kZiz 7J&`U095r<*R)@hat0̈%$xX"xh27Ua%<>JK #- a']vK!ayhHDPaq VXx ,@O@Su! ЋЗiY`f⼄ }kWb8 ۜ ``i3,1 JWϊ- `@0m/N! %(@Ta>G@raf0 /QF+cXd [iFY03stJ [ɝ-c!3gi32/kA/[FQl/@V`5 C=}f Q$qU04*D;WX2G,YL.ρaK`6W3rg\hd ϵR%Q  Tx /{bX^R $V[ }XE_pp%K3B^’js-TѓfR0MQ_T!,@)Qa Tj 2w ثY0<`yŕ*9YY*2GE L1SEP,ϡ9Pyh\E߁Y0D,ys-TѓV""Q?ţ@fft%0s-Tѓ=em:(Y0*fs5ޅ#0ϵR%g=fOffa`۞#۫֓md`_^~?+ z8oW`lÌQu7~U`5aMؔ6d;Ӝ}ɔ$ϊRTQW FTFϪvLl Žl^^LynXOsU'Sv``F޽pYՎiV`AQw)O'#nXsU'SY Wx~wYՎilL}ad;ٜzɔw%0SE LӀx3`zӀGjG 444404iiiiLLLL`i6&40?`ʷ1k!Ӏ , 4>a!qp+W͟ޗ9LXIQQQHDm.IODEΝٳg|U7S*Z`ʳ)kӀ089NNG8?m6ߺu8X6n%|d>ݻC|W"P\cc#gR&OmZ4@@sUUU0}p%ꯈݰaA&`g' 99$ pooQvLx\lA1MM0[0 x8(_ZZƍ~oHVXqӧO̤q䪁3]t Vóy ?3㷰u\\N'̓6edv yϊ0|ꟙ\4-lMVIDϘXXʈ `)`"-55qؾdph4laxYllp#4#XHdx".ZtUh^j[ XfPRt{)a]Ux% C4׮]7,1 x>}zMQD`,"dLӧW^6xlĄ&\`XVƧ#N+ f>|cl "Y?|A&1` %.FcW`˜0\#_,7spL /|b\4\M<{ݴ߼8 [ʄ[6*f Fp|Q˚, G/`n:2ד@jأwqw) 1[ɓ'nl9lvk;`,+Lo￞yÈ^:=㖧08,.q06N{%O>8ȆR\W7 zF2ܽ Wxfmno`عw`̓}iaVpp0 3nBULZÝ;$:af2h`ݞWŋxu5s4~t҄>n#0`ʉWi<1 1?c90y///<",۲eK||w^\k)%嫩$zgXKpo1mo0~B q%|c3u&>|),^fDElٲ3)666w&i4|, Bz@|1K =5Q0 *2_T__O(22&h`lk w eqjJ/^M Msѫm3k4 F5ޛ?N`s^PrիH\A&2G{dO.]JI:%`zn<_wt@?}WWd&}^.\|'OCSM/ }'.Bkj)II$-uLK2cfY^7/߹d7?NNh:}x^%%N\֛ڵ |}v>$8ob`y'~d̂-/> yo9gȁ@bCGL cޓ]v (0²( McY]6rاS>|rr=inX=m'5oX}ϛ0rghnbi WըD8I""Kmk@i6ffY^yP]pPS-2Mt=xoW^}Mgk/g{!<&+Mvʈ+;];jg23= "G)1B/\]vJ+&s>\yu۽'3+fL g$r^r k"#lV!0`BkTF`v$yx~ E(1cf `;;h4׽5h*9e U}w {4: >y =7aJ{9KqIMmpv@f(F6۹ĬL(01˭Z|(8POYF"#tw$ďPLrSMc=Gw4SQ.ihzwMSvיZe Wg^"0rr:pT#|F1uO0۱ĬL(0R֨Ȗ{'wАͬ:{2.dq_H=~=RJle"rWOmX$)iZgqY6:~u(M<{="A 塇Hf$+*q ̙ f9&P;p D+l 49E֮7ټ]$0B<-j=MprBZ"#Μp;7ϟ׮a:̍/4uaݠ)b MEe}~zἸ勺U*Apr$+[~Y3gWqb&,o_PkAI8#9e A'Df&0sFKCg>vA!}IrC2=MjWt:]oo/ܳ<쬖}{\n sF mVh4 gl6k'/W'& uQJd]Kh=1YQvAF{YOo(/'qf4PbY~,4ՆUBnrsb+V- -ϊQSyA/W/)#C.02(uqQktԱ59\]&m۬ݼ M|nOrXi8=k.굩kb[mfbV{=! OjDрl4ˢ4rGm9y+~6 ΓIK3ꄴƝ'a_nt7n%8eaX&&`5xN/JB E(8\Dhp`?3z_b4kLhsCV69X|2.4j!WY0.y|zzP`۱,^dhou+kHdA"2 &znS Ɍ^U!-&#:tmÚvlW+5dý~_ntFIM ġFD/>p %8'< C'vTaČIMƄ97TAhM{څKp!V4B4P2hlj=8B|0_b;mϥװ > ޼yvx"BC⪔u+퟈4`J'?RfYZ̕"MR}wIhӆU5Ĵ>F ÷+++~5~-2Āӟ~?e&&ξ.( orB$Ta6k BM&&s>7N'XlӃIz6̎37(FL!3R t=F̫Ԫ^]]]d5@M E`4 dߣ껋1qjz;^Ǡb|ۥ^(Ke7j5֏edE%`Ra,9i%+}O4դeG%%_ZWwݾf?J7L='1jzaD.zM8}6` @vrI|R+Z0` f:)eD 0\4{5=Tx {>uBے[IL/LMN ҍ~1iA Y # ƬǵO'z¼֞ ÌJ2Ӏ[4@ ``թΟQuMM 6g  i`w_6~Nt Y^E<l^Aebiu9]w^4>zׁzl&4r x^r똴yb||P308MK}ɞ߶}suH_ Z2XqWPwExۓ]U&x1 &ZzTt?a6XY)L.LvwwY<*PSS*VU HN 0+;F=~j%޵Pьe =182Ӏ 5@`_8{;.9]Pʦ11P ٧ر*pe 8ha^. %aC)) xQ\ߴ>/4HmhF FXv^fW.€dښ|uq,qdv;ij4 V!b{qqqMO XhU\VXX؈! D30zgs@f)6}Xfysi&uttTVVfԮ[cm 6H>/Wce9S=O&5w?VwRmĎVX7fUxDGG'%%|Pr-̒BBBl,D @b-!Hjkksss >{ƀoOѶ-YYY+8``.P5;eS 91a&ӄ7%J/U= 7ZZZZeB qt"KHNN,++ɘJ aG "T*\[iã~{[ʱ[kV%ǣfڬצfޗ,H=~2yof&M}iۦIpc V״dtu̞|*b&' %(Y, h#xX@0!!MD0LxW%׏ d|W.};//7X%2s2`СU KI6`JR6NfwS<z^7{򕴯R>}˄,ni̯$llH8 q<Ѐ3a6dmMֿq͐(ǃ۶m)ܴ>m j4x_`0`k@a[7bj[o{cpϟ?ė %(YrK$D]H(ыZc!̟a6U+ׯw|5~>8uiecOa`Exe3afTf6N&&0%e5n|녾gE >666999eB q42K4'0-,a0mglRp>{kuLXXX||<6Z }U3JkPfETד{c*;rg.6m8o2O4P g |3~ fI  À*))bЛ7oXw> ¸"r$I|ђpUR3n7.6&zRR#W}]s,VMX:2aB0 cXE#?^/_lّpX-B^b4oZ`0thyXsFH+U C l_b&QC`& #2a`d$ÿ p @M)@i0ܜvX 11d  *;ubxL>1VB@5#?QS j2؋nYethY#0kݳ#c ]Ժ\uq> eH7.(٧ҶCvsRF#W!al,zq0LGk%110\NP : 1aQ q0Oz $q(^YX#0`k5ش0 BL&M6XxL b0s}ӄ2v428cXugn6./zŲwidC%62s]I `)u kk[<8qgðt̊anx_=?SO@֪`s`.V^Wuvg~ӱBY6" \Sս≬]{6xޛڶe#ϫoF//#%aZdr;X%aE02Ò5s}F`ңqv{ÅjoEO$ !0̖:X1fb1q~pEIW#lCXWϒ%nld;`VsVSF b2Df20G{cfD3^0za Lx1:`7"`D`/褺eLs a0YdZк0C% $Ck~/l%ј$L?[0{5&^i|S&Ath`uqWLJ eLj|W_Ҙ$|(!ϔYިԌ}_R[WfM_VϿ$KnLܺ7sϔviY]*տ]h݅:E6pgzAXiwgvSmw߶~ތcR^>{Zͩ"v`rsXTH :[O&5-Gm߷d>goy sm޷]lLnD`.6$0G_նGi?~arҫR.gc DY0Z'1s:`jL$ K3=~]nͲݻ3NDF'?\bQR&09y&xy &T nBDK2a& N>hj=g04d3{{Οj 8 qaĚn0 }3X1sVx* M,?շ=hH:wҀ˞|VP\(3}]u Fy"E7.>k\N٭[{h l)iUj7`O-ݚ }~mauu<=WkYL\TU6|.mɇX٭M?Sk`a9M<k{6TS2e6COok+0tؔUٴl7w\v-srpˠ2֛$2ߟLuh 0sN4 >\8Odhou~lQPz a {X*u00u}~aG(ڬV`v/LMAZ[D!ߋuIZGoPs-XaU38AI кR#`&$a<dS}ˣOMïu5w>445̯Su;6 >@Tm2g˚Gppd8QII٭;Y!+p|0.~cC߳J5czCiIE=UL5eMC&]N :,[5gi֪Yَ}srEYo{[vcך.%#g׋7jع{ٱ]kvluS  3 niӜRwDm~o?lJno >{< i)R/?QRl։pw GkܩMuZŶ k먪9_tQ ;h=BUZVZJ`9Nni~9mG]-0?;N\0κ:˜tSɦw 떏yPh^Pޝ7:0w6eMS<7V[4;(UZR뵱nBzPTp07b(8ή kt0.H4_}CZdOMQ]0;y+_(@bA@AuTuoFw`X)ka `dMx$ tUVVr#Qv:ɛD]l;` ^ )m(;t4kբy057~Z8&jZ,ݷOrC/kݶ!g7 `T -fPU2ޤI4l%b)ʸ(?7<e$_ӑRP^v3.zTT' SKu궤;Gp9L`*孃=S(76U+o&eee20ꕰiGc& 툗zhLq8GۙRW]{%~Y\k|T2p v0Myyk BäjՊR,. )uPM& IXh~t޻W=ObqGm_&"Ag뽂ǥ y\ ],p.v0:$3[b)-ô#TP 9TR0ZGLn0?׉ oܨ];%;W]]M%reC,֥qM+**Jc8l" %?7]f;`N<`R(usÚ ,DLNNݱs4[JD/ 8dUUs{EPp4""fBSaݣ >zl̉J.^٭cfxgy---˞\J;xhHe׮` /I!"JPpH=̈Тk"d|`; aA 06&)xzIIIt:!;dLL߁}e+߸DGxJVpaLJPJuK4;nۜa-l mAMn:QzvCM:pΕPڤpeo떄0CXG۷#]FW_]/1s"옗vu侽׮]`<q•*u\Ӱf =u*kSή3kc؉ 7n쑾N|U7G-8PkEINBv20bH *qqq(8;Wؓ~a7n@IXX!8M<څ niB( b5iNNbh͛7_?QGYYYv ,-P>F5pcQTZp`0Fp*vcD]7jX>J6:4%b "*<by}||<('. \II fLwَzjM|d&ΫE ˓_"I(TZR|2_Wi, 9=R'Pr<3vE`o1 ŀLx$ arV)Ն@8v2.qר ӜPsg&8SIS*>n]R1`QxBbQ3SspppXbu nj>g t:`ocQXv# IF"V`f{Qqm/T"ܦHu4*PKa#x DTH-OФpS4sC!^5ϑVZ+Xe`8R"-\R(#p&QF`)j7Ե T4{4hYl[GLcx#,ME`*T,>T|3N׭(W$K%T|: ǷG 6nZz* k#bL Spy~: .J*(uRon`w52וTzu@I%, PQ0+@H`R!?.k $4W030sVy2zƪ`2nTG,HŇ0`@*d8,.J*(uR^#2Ly'R$: tr`lt.\K1)3URݯ)EƁsTIs;e#p%ŻFΨEc#몼{How%(Z.m#|y7I#hȉW]C)Rݾ\@R[gp}o;b8XۙwwXTnZb\qxV*f1(MްK!I٭ L8AIX+ +Db4FMGYHmMMky}<Ғ;QcaOog2i\SuZCي։zIJ ЧF bRuC[sq 0vG\BVz& sbZGvlgR }Tս M߽& }YQ뽮'WZ zYRe;mM> @u~9+Iptͮ2 N=QepLmL*V /s@0(J$:JKh;`Fw`R;VUwjף8CWM+(m[;4^a}n:~'ȟ Apd(['%d%CH(?/ɏTp4KBVXGL*"(4RN6a[>P烺.~FC{;}VvzgB(m. ERvRoA nk6\Ub/B(=ДQJZbEIh;JBW S{4ojhhiϠ;?V:2QyR>e5_gB(> b a%C: G_;ͮ W,6T(²꼯a0D!$%kҤR$6QPeXf`ͫPEAJK+W,ⳒHnx;I `c%S b܁ܰr=21""Q@*q: S>̩\Cq>OVm mrCjT}CoJ")u(}I>F`ބp'qbPA*A HiEDb4#5FXHzb>+sj@mR#N:+։W80Il'[շ?[Ti  Yx 2(]E2 EkM`K>U)NU[6jTgڡ;*N|PdiI5)+։W8T |-9K9FPXF*V@ːq R*DRbCn*T凼'*&J`%C:&v2ԲJ[یcRH_3XHFHI D* -Z'˧u71ClQvs.Ci }?q~\ w?#gZvngB({,q`!a%C: H՝0Np-36.Qݶ-۷ЁȖ`Cª!?41VTva,dl $lygSa2\(ߟT-mQZd<6PX@'*~[X} ׂȄ [dOUoݤaBh%U^_uq$}pHnx/I՝GߒCC [z I~qvúڌ F4tǎxmhܹ]kGZzV2lxl;IZgW:{0Uy}yǓ܊ijWrshr7ڣýOw?;cs|.LOz5'ۢeë`2I٭D@L X:uWlڀm-nKnyPZWsssuB|գ ֶڕ˪Al- ['HpRȔ`|DEϫš[6 NJϫ>odF_8 ?|ŢQ*Eս q9 ERv+u)OxXxVUi6/)1tv䉚ͪ5j57Hi7{ɦaBhU4@\N%%g%։SxV2T8M7qo·5CɅ ae"d]ZQ{-c$2$ .z y2\9#},J["T7"/&\awlłޑiP jg% |ʵ" S}V֭\)pw0h Q___u☡>_8b !:gB({Μ~ b8 ['HD環vj( zW LB\)20vg fhs(IW4t>ȧ 3qO˂{骎+`rYejۢP9yk""qbHZDgg@EEi;a sFF*{v=447gЫwtHT5JOxot+NHUN|f']O=k{ò/I D'~Zw%U&QroRuCiG -so G o@u+"A"[DֺϊuP$ 'JpDB֝.Hu8'/X JtM Eg>o_<̬O("?]8PmV_aTɬuD$IZ-Ips6)-"} l7#U60Ff*/[5veV$JV>d:N$Nyn6}T]bJ.\2uAxq4œ ;ߕ)B&]/p`SM MD"EHRZDP_N$ wL$Xv3Rk;ȳ9e"cPeKee8w&6(!yr|?:Ȋ/+oEJ|렢(\H|EkIs96aPӰRM85\'V2l_$ӹ[$[k {qpRCD"H&Hv=(Xl _\&D*^G3sg3 O9r $XhIBV2l8m'u 03T2%пJ$)..N NJtCQ!MjV.O ***}UbOdꥋ¸HYɰuD"&_ۉn0 eQLD`~ H3PQ&E2P*'_$8޾{!/&8wpJJMMxk3jt:I8r899Id:"$i0G@H~TRP$ B$h/P*J#( k4Ȃ F}.Up`Ɋfc ᓛs{ߡ6oXDZ" %g%։lm'u4Xi8U"|Dar H*ռxnJ$``$ N^ٹ{d|!5<,Y$?11cXv$m[֯yj 'b[m)X:$(cXɰu"E"&[ۉo{zQ;,H/T2;$FvV{*/>|յ:!^GW.[mk```LL -ۉUUUB:qlɢ}{_<An?|i>բ:T!p+Ndk;ZgÔ 9䦲ryY"d hy} | P`M,`}EI( nx#?/n.ZT5wq;[q)@ 's T %$$ܸr%j5J,"^.6o[n^BXAе(Y (_I:׋$l};J:l'e[vGh;1`h 4Q:N+ KT+ҵBp>] C^* `',,, ʕ+hs8`||ݝ"0l|Yrdg3`٬FKES FBIh;J`d6fddƢá~iXJOO2YZԀR؀dE$Vy`1++ Sh,MVFŊ I (I")HRYTLHs3;j+L\ #"$x0*BCS# RTGC#O2s@*00`$nB4LV&,Xq{<!?m @|؋^VܤuQ$I%5-8g܂N9f;saܚ<4; `"0`9RWz639ԥ1 :JM|lg"0cnxb<ůWF F"Ih8B(Ǥr6q~V!s6ˆ[(A9 { p(.(Ud]qRoDnyѹ9`; ?xKs*") F<8aBhA#RNCC:Rv3XR# e/5CR(FBETGC#({0n%3q.DW=gaE$ʤu FJ+DG*!UJaɤ)q3M ו!޷J_/,dA,M44JES Ep(r-=hY$^^`%TNV"EzpׯLi g"h ¯/hhpmH .WjF F"Ih8F 44J/tUP*qhqP7o ψElW{L(ihp  Vgc@FBhHQ R1N gp9z0x)BG43hrhhp!,҈@/r M44JES Ep.(?X'1 IXIDRM$nQBgESoLB,[c%֖`qsY])YFS.C-Tq%TT NnhMt^̎H#0pɸ5(\^X;ы!C,vR1cf10/6w>Rxxr4rZ#+>&.KeQ$ap&W# W2)g892t>qZ'?6J5W%I2Jn"i*DTj=0 $̦TJB&}L}*n>^oSM561pWSN`x`xH^໷;;[ˮ Y 4`eRş35~_EVՙM#R[G#HT&_2ɦ}ik(v44E0eqp9v7JU$TrRdO'0 5R hR,"뇃_r^dDӞm7{XA}/҅[(ŦT"٬giҾ4IwrMM44JES T"ECC.(k$W*q7-כvohj4 [O==~{Μww ^9{ wPെ+>1z5>s錘&{{'&4mh ƘYM"*,MuMm2v NVIX0:qx. [qXU N`45H(Mu44RDS y@v5Ґ9 { 5L4z{,Oz;1Φ@(ܶT':_i5 /kܽIF)d(Oc_ɭ;Q]yeVA+%n/h4-9,M44JES T"ECC4/(k$W*E͢CzfU^*'i1OwtLcWm %%Ә_8QS]q0,AF!U4ݶ5b#bojj-:sUVBAI:ؗvDKN3&Ld%+44gˊ}9ήZ壂ò7HC#T4H%M]44yE*QHCfT o?_8vf-[Z>648&UǞ}54P/A욌s]bO46t>(:zϝI>1T"٬N"4$$ngVq2_&CCH `aFBhJ$hhmD4%]R) Kם8:d1O75N6ԏWivFFCc?xV* AT>2  T'F$*=jfh2O"bŷ%Yu' ,3b!-7T =44@,[4}vV8^F F*hꢡpdvI( ̟,Iqxn`t}DyYnJkd44+̯\Ib<O*7X:BL@lk"|RQ;H54K)pu2 -Q&툖֝$0nQ42'!LC.]g1ih$:DJ$DIF/r? g^݃XͲo'JK 5^W^]07jkd44\ojS<2F@$"Uͽ񌁉\fTg;-QV'HK]TVYYP'Dg\QįO`jih$:DXA*QHIF)F7wԫ4h5R^zfbkd44OV,Fw'M'xƚH(W*~U551G"[Ja_h:DBw3&Z[#)hhRM]44жT"QR*X__j8bbRMN֭_kaakCrޤ KES 5P>Rvf(U߇,Qv4ZN*ЗT]]^zBcR 9cΊ8>|LDWG#9XqRK*hh_5{RKJiACYQw䐵څ"J\3HP$4ƾ4^KrNщDDhnݬ⍿*CC5r& 7U?a9}JOc"ig"W"9:"6'E>H `JMuʤDSH[/Hv'kn;s܋έU^!%PThﲳj-Hw2\ꥹjFӱF/WvžzUlYj2;rKt L!d(Oc_}%9u'9xmh=|dG5V&&VUUi(heek6m0havmڢ"c6qB|u* 5RTU^.:MaMej($,NS}iD"Ѱ( cIQ7q\q[`Jƭ 5ܜOvڹ1P2xH9–`9}3d`uDqAel:Ruܕqm{A?j`"R$d(Oc_-ɭ;QWLNj˗7{cf/썩Xkvb+NeWsј"Ty+E˗TU"kVYcEYX|veb+-^gO40EEшDvYvvi_`Gt' ʟ2I39CfIH:>nf⅊U+F/]MsٔƜR+/B['|ARi}w@u÷n\Tq}2+S5>DXM/@u" tHh>}iliIVan.p֕[q˗w^"9c+NTT5찺'Οvm9]sF1H;(wv{AwR,mzãՅ#7zjHMtJTrGaMχϟwmHlqܯLhTf_`XľCSd#{ϮUx*&o"=׵o9a#K~ۿ7un?|iоm.:JQ5D*JlV77xVלS{,>(Kc;hIns}Eiiuڊrj ы伭8-V+7YhrOԬ\3#F$,ΟRI%(3ޓ@\vnGO߼txMlɼMK~{ו~vlO8dB73}5 .N߈+48N=vnDF_E_Hwi>Y<j ?txAĽ+\}%j՘=7v[e &]|RjR$Օ.&g.n>ws˹-DZ罄pWDi_ɭ;Q>;rܙ=R$miQÇzl4J1[qq*$ ΟRh6ulgWfx%F4 g 8`YYYQAAX Ο"X(" COHNۊӢHn/(lũY,5- DT"qFk;fٕo;B(J#md[1tPۮ)fKs`TT`s"8l伭8-zT ۨRj8Mڹ:kIX$ʝ? }IIy9gi@X|ͼukF}\%Tgы䔭8mK/^grUʝ?ފx`%ӒH;ZngWHFo75]lL"5bxr`Պ;]8ڶo5|ion8[n_UT5XAiDY8f8EB\٫vjՙl6wNߙ(d+-蜉D2bu|E҈Dvf֪3ULwRe YfP0"<<ʕ+a;-׿;M6\QtN7f9.>n]}hl9xp_{\zj1=&hDYg_ XQ۾+$7n8|t"~(#[ڑ\[DVKnQBCCl\dS$nOպ}iDawbLOP\0%AL>c {T ˖ϝcso .\=G9|09xuA~}{}N;)sՊ F \~ksׯ_ %nlUWK֮9Ϙ{h߾ "-ZHDDD|.\oeu+lXQL2W&qcG^LLLČYb%aphK#dUwbic4aNcSp)))΁~~~/^<]p˗m# #W}}}Qрڵk MPPQ~y> q 7@/!iDH@`ԋoO"qx^t:@g̕}60!/D/(K#(ߝ`CzL]1Ju<,Ip2<8Sb6" P C܀7Du3 q 3:#_K$ !䌍EP)F "A`I;`QVkQ0?4xnΉD<"4ؗF$l4ԧ4T 8 `Ӂ+L" |+ >2x K0YURR i@ Gx> 80cL3HAN /"AlC`heu2iʄAc Z rTGc_ӝ1c PXHx'>$ᕙw)@$.A?QH^"%hDN*H [GSV8!THؗ^$IQE`iz恩Ic²'jvtK7 `H+9ఁ9EI9zr5V&d$q Iœ*H E,J%Iuu4q48%s}@Ƀ;^o"Y\ W-& }1g8GkqJp*q9 +pPXy`*o"c<ƒ'kaMŝMrJbhzaPu{vy$A/1k'S'4<ƟaGX6e&z n/.400B؀>Uo2}y͕) a|X>ISBȲ$vcBv5aSw6޽{Accm̙# @;ˁ[ճnI 6,[ûX6/qubB_'|r闿%Kqעc0gz\E_o_H`.-v}E9ҳr;lǏеcǎ_ >^á3<|KÊZUTgX$ed `ڏ%Kwuvv q|Xb^S|눲4iLjnn _D+3 >G]/kؼUАq|vҥʄ3 ҉MٜM0`aMŝM X 6:~򓟠3lu1vyg>H4#."]w_eeQfޒMk!_uep.|m0ų/:&'1o3ru,Kg.z7g~.7%D 1rO"*srr8Qx Zd@iaGX6uqgCCׯqWc+N 6m—]01[98"RI$+=ݻ/߿?Z[[13+y'_<۷oј:!ד[H9 NG/Т! )+|H8_L~p娋4 ={ PSwqr&2KQU*zȗ?Pn74ܼF\NdׅDuh/1.g94X6uY7CFFG?Go6eM0lll b,xPC>O  I `t~uz.f3v^lfTWUZU=qsOۡ7w:Sjed߿ Ǐ̓'O8J}N7bnԵuU;rrR壒Wܯߘ\wzn#k s`5nc8c$S"W?$rèϟ xy{][ھ};̙3.b w5M?cF&FjS?~ҥ]v8`5\1C@zܶï_ʖG쵠 uJD};,6n&PիWΔ|rٳKʵuk\‹o]Ӎ7XʗT=/ẕ)-Uo}INiݻw{c 0;&.fX>}z؏?6m|[R3H/%;wNvX'pÇCy`1Ć6O,@? 9LICёU:ړ!9cІ?b+^KZݤ;y={6mdӧ)sGZR ;C-TOE{۷)<Ν;0_<-!:˺Lkܛ o߾qYKV{ D}RF:纷K&uneJ}i84T1X;;&.fAl iT@x ,R5Y1ҌгG^vMY%vwcYM?ePj}s4HĉX,- B[&#"[v7Qȅ؋u-4g٩4z{{y-069ʵR3fa+QcnjN1fMoU8_MԟCF.6v.}7Xp//݋[[4bG֌ͻK> \wd9_]4Y3yI'7㈏,=>|Xњ{7H9KZ-`k;Nk'qL V2Crx$`(r!!W7o^ŋC K 0['Oh~- ]Rsns ,UTQOa0;ܽ{%UB'ykf)z2Fc|쫺qRrt.WwWȿKvaz1L$[ \◣k_d):J&t!fv|fO>I3r,J$-& R3Ѳnu:TMF؄D9vfyevH2 qzq%.H**eϝ;wB7=BU{p@?"\(.lL÷iD2#|SJ8ߏs-Qi@zwZ%e%Yg3~eTv~u ي6f=cZL;eYq^}m6ZE,seAQڶ#Zܔx1* VIb>`npzBpsWWUv$!Қd qL Q7"esJ_Ӑ#mnnU{qK٫bs_՞3%< f*~!QzƓaP)F8eJ0[8d`<+N `cv-l.DFGEQLiZ|U{k HY +gS|$PyUcjr51&ǒpذ6ij!lp[@W""WT*~~OpGB$#[gPB#`<@ ؚ/fsFoZboEQBbZρM&i<@ ؚV $sLE0H2I6JMsD`%:HO {^d\{$~/6FfA,+R:3H&0[n'(,8k U ,iO')`^PkK1 A6z9/n+EnXҾlO&7_@F/mh"7.'Փɍ.췀K{@ȍdmezLnt)`F/mh"7U-!ۓɍ- Ԓ_-Fg"utR!@"$D lfN'@"%D H@ ͖ND HK$@" A-;$@"HD $)`4[v:HD ,9$@"0HRit"$@ Xr HD` lD H@"$ HٲӉ@"$)`ɁD HA"6HeD HR@"$D lfN'@"%D H@ ͖ND ]iε!IENDB`././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622616033762 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_implementation.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000002076611520622614033775 0ustar directhexdirecthex TA Implementation
You are here: Basics Operations & Concepts > Activation > Transparent Activation > TA Implementation

TA Implementation

The basic idea for Transparent Activation:

  • Classes can be modified to activate objects on demand by implementing the Activatable interface.
  • To add the Activatable code to classes you can choose from one of the following three options:
    • Let db4o tools add the code to your persistent classes at compile time.
    • Use a special ClassLoader to add the code to persistent classes at load time.
    • Write the Activatable code by hand. See "Transparent Activation Example"
  • To instruct db4o to operate in Transparent Activation mode, call: configuration.common().add(new TransparentActivationSupport());
  • In Transparent Activation mode when objects are returned from a query:
    • objects that implement the Activatable interface will not be activated immediately
    • objects that do not implement the Activatable interface will be fully activated. Activatable objects along the graph of members break activation.
  • Whenever a field is accessed on an Activatable object, the first thing that is done before returning the field value is checking it's activation state and activating the parent object if it is not activated. Similar as in querying, members that implement Activatable will not be activated themselves. Members that do not implement Activatable will be fully activated until Activatable objects are found.

With Transparent Activation the user does not have to worry about manual activation at all. Activatable objects will be activated on demand. Objects that do not implement Activatable will always be fully activated.

The basic sequence of actions to get this scheme to work is the following:

  1. Whenever an object is instantiated from db4o, the database registers itself with this object. To enable this on the database level TransparentActivationSupport has to be registered with the db4o configuration. On the object level an object is made available for TA by implementing the Activatable/IActivatable interface and providing the according bind(activator) method. The default implementation of the bind method stores the given activator reference for later use. Note, that only one activator can be associated with an object: trying to bind a different activator (from another object container) will result in an exception. More on this in Migrating Between Databases.
  2. All methods that are supposed to require activated object fields should call activate(ActivationPurpose)/Activate(ActivationPurpose) at the beginning of the message body. This method will check whether the object is already activated and if this is not the case, it will act depending on which activation reason was supplied.
  3. The ActivationPurpose can be READ or WRITE. READ is used when an object field is requested for viewing by an application. In this case Activate method will request the container to activate the object to level 1 and set the activated flag accordingly (more on this case in the following chapters). WRITE activation purpose is used when an object is about to be changed; a simple example is setter methods. In this case the object is activated to depth 1 and registered for update. More on ActivationPurpose.Write in Transparent Persistence.

This implementation requires quite many modifications to the objects. That is why db4o provides an automated TA implementation through bytecode instrumentation. With this approach all the work for TA is done behind the scenes.

Automatic and manual TA approaches are discussed in detail in the following examples.

././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/detailed_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000003657011520622610033771 0ustar directhexdirecthex Transparent Activation Example

Transparent Activation Example

In order to support Transparent Activation, the objects which are stored in the database need to implement the IActivatable-interface.

An object which implements the IActivatable-interface is responsible for activating itself. For this purpose the class needs a field to keep its activator. This field is only used by the transparent activation framework. Therefore it's marked as transient, to avoid that it's stored in the database. 

public class Person : IActivatable
{
    [NonSerialized] private IActivator activator;
Person.cs: Implement the required activatable interface and add activator
Public Class Person
    Implements IActivatable
    <Transient()> _
    Private m_activator As IActivator
Person.vb: Implement the required activatable interface and add activator

Then implement the two methods of the IActivatable-interface. The bind-method binds an activator to the object. It's called by the transparent activation framework. The activate-method needs to be called before any read or write operation on the object. Since these two methods are always the same, you can move the implementation to a common super class or to a static utility class.

public void Bind(IActivator activator)
{
    if (this.activator == activator)
    {
        return;
    }
    if (activator != null && null != this.activator)
    {
        throw new InvalidOperationException("Object can only be bound to one activator");
    }
    this.activator = activator;
}

public void Activate(ActivationPurpose activationPurpose)
{
    if (null != activator)
    {
        activator.Activate(activationPurpose);
    }
}
Person.cs: Implement the activatable interface methods
Public Sub Bind(ByVal activator As IActivator) _
        Implements IActivatable.Bind
    If m_activator Is activator Then
        Exit Sub
    End If
    If activator IsNot Nothing AndAlso m_activator IsNot Nothing Then
        Throw New InvalidOperationException("Object can only be bound to one activator")
    End If
    m_activator = activator
End Sub

Public Sub Activate(ByVal activationPurpose As ActivationPurpose) _
        Implements IActivatable.Activate
    If m_activator IsNot Nothing Then
        m_activator.Activate(activationPurpose)
    End If
End Sub
Person.vb: Implement the activatable interface methods

Now the important part. Every time a field of the class is accessed you need to call the activate-method with the purpose. For example in every property or other method. Probably the best way is to use only property even within the class to access fields. And the property ensures that the activate-method is called.

public string Name
{
    get
    {
        Activate(ActivationPurpose.Read);
        return name;
    }
    set
    {
        Activate(ActivationPurpose.Write);
        name = value;
    }
}


public override string ToString()
{
    // use the getter/setter withing the class,
    // to ensure the activate-method is called
    return Name;
}
Person.cs: Call the activate method on every field access
Public Property Name() As String
    Get
        Activate(ActivationPurpose.Read)
        Return m_name
    End Get
    Set(ByVal value As String)
        Activate(ActivationPurpose.Write)
        m_name = value
    End Set
End Property


Public Overloads Overrides Function ToString() As String
    ' use the getter/setter withing the class,
    ' to ensure the activate-method is called
    Return Name
End Function
Person.vb: Call the activate method on every field access

Implementing the IActivatable-interface manually for every class is repetitive and error prone. That's why this process can be automated. See "TA Enhanced Example"

The last step is to enable transparent persistence via configuration.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.Add(new TransparentActivationSupport());
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, DatabaseFileName);
TransparentActivationExamples.cs: Activate transparent activation
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.Add(New TransparentActivationSupport())
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, DatabaseFileName)
TransparentActivationExamples.vb: Activate transparent activation

Now transparent persistence is enabled. Now you can navigate the object-graph as deep as you want. The transparent activation will load the objects from the database as you need them.

using (IObjectContainer container = OpenDatabaseTA())
{
    Person person = Person.PersonWithHistory();
    container.Store(person);
}
using (IObjectContainer container = OpenDatabaseTA())
{
    Person person = QueryByName(container, "Joanna the 10");
    Person beginOfDynasty = person.Mother;

    // With transparent activation enabled, you can navigate deeply
    // nested object graphs. db4o will ensure that the objects
    // are loaded from the database.
    while (null != beginOfDynasty.Mother)
    {
        beginOfDynasty = beginOfDynasty.Mother;
    }
    Console.WriteLine(beginOfDynasty.Name);

    // Updating a object doesn't requires no store call.
    // Just change the objects and the call commit.
    beginOfDynasty.Name = "New Name";
    container.Commit();
}
TransparentActivationExamples.cs: Transparent activation in action
Using container As IObjectContainer = OpenDatabaseTA()
    Dim joanna As Person = Person.PersonWithHistory()
    container.Store(joanna)
End Using
Using container As IObjectContainer = OpenDatabaseTA()
    Dim joanna As Person = QueryByName(container, "Joanna the 10")
    Dim beginOfDynasty As Person = joanna.Mother

    ' With transparent activation enabled, you can navigate deeply
    ' nested object graphs. db4o will ensure that the objects
    ' are loaded from the database.
    While beginOfDynasty.Mother IsNot Nothing
        beginOfDynasty = beginOfDynasty.Mother
    End While
    Console.WriteLine(beginOfDynasty.Name)

    ' Updating a object doesn't requires no store call.
    ' Just change the objects and the call commit.
    beginOfDynasty.Name = "New Name"
    container.Commit()
End Using
TransparentActivationExamples.vb: Transparent activation in action
././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/object_types_in_ta/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622610033754 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/object_types_in_ta/ta.gifdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001447311520622610033767 0ustar directhexdirecthexGIF89ai  $$$(((,,,000444888<<<@@@DDDLLLPPPYYY]]]aaaiiiqqquuu}}},i[HA*\ȰÇ#6 Ŋ3j„ CI2"Ǔ(3Z˗0c\)f 6s'ϔ> 3(Q,ذGJpjN 2<+SE-2$P'(q[[tm (٨a| LhQ95wVq"N `◘|A T &sܖq$L*CX9@ioi'Y'p}ukSEy9 c㕧c}WkǠDB0{"trLe7.9^ +lLEy^ FE9);QXv\z)@aT] Spp)tix'C` *蠄j衈&袌6*(`Zٓf`XTjJ lZ%0ɗ^ԅꅧ^-,*z2tZu@܁²kyIy*P & $jz%t@PM*:]rm.zq%Bub\ $$&0W  تATdřlQ^҅qu_f0SkP[fhLvm 3}f1k3Yr̢ WSv8]l@&ki2@wzYK h9S I&|^ʧ+c$á.fJ cHBp`)_eš&7M<>* B-o/vaHͥyqP'3C#/:cg&;lm2W1 J79 Rtsd-`$6p%9p7VԳrJ=0epLZ-Jc#Fg#0H\²L-o΄*h>[¦52M@P 8Ir KhvpZH@IuK=|Ff? ́ziAYЅBcцf2jѱ(hHȦI=?̸0LgJӚ8);@ PJԢHMRԦ:PTJժ:ͪVծzUwB`t')YѺu(ʈT::g jSW')yP0p'@&p:,~*FиSJi?|V!% l26pb]g8 my a8 {c)yzK1/R r<\;Q]A M 3ӶS. q|xI &ar꓌S'/_# S,e97{ÅJ (N1._0bC8%y}[UXX-] [$]D^ҍ6DUGAR%1PYv1e`m@.z,"\Z_z, 1<n@l=NdcfLu@h{ge͓i,yAuY }:άӐBժ G6i'q@D@eqzg4zTܐs C/G8΀NbV9[kԸeg\Lee^{Zsu--HEyɭq=/i;f\dj%.q[8#l+a:ܶy=xMHp+-PB.(7Y9.F5FHlV4!0OĐ*nym_h/1Y62c4ٹ6њɝHi 5!%6UYI2"L=%ZfLd4&rW@ȢIh20!Zu+ZuyUo4,%:8'ID6*& Iҹv:=9ãWjCޢwȁ.LI&IxmXL=L-^'Q0L*8 :!l%s2~,]Vȡ6vk Bn iuh!4͖:bòפc,Ѩ'%9H=D6!34>Qf2CBi]#ISC6z ~-!RJ-ʫJ)aZc8Zz (p:Zz蚮ꊮ0ڈW r1 F<($!ءlc+S>TzJ-6ڡ XQhL *CgwK tēJ׎27a|D">i=)b|Iyu-!40#A9?9lOɲȖ{fq$4]?}w#&yQthLZ@TL'tB<[݂j{KC=-shW-k>$ܑr;M[j4ELJ?Pt1 =yԸ&B,$=iz]31ċp+2_++̢9Ć+jFd51OdT$nHT#KILC^xCxQK3/~h!ApbzK8c"D&c2>d2*Rph,5a;z%y=5q11q L&}2 08 ,>@Bx)ksQth#`kKQ㸨׍zP!- ,K-4=;rZ3dgb"%}ǃt9hJV3ۂoptAˮO1<4O챊؜(iǡ9*i56,f QZ΍1nepס:νsl"BE&uب!U8)7֍ii eftC$,c$hh܄0cKSnՎj0l\փvva{@wV{h~-,B6@Hvd2V[h(Nw~hym 4y 祵b.e3Xyt%p)WhGEэ&EtqoI!,Oi1v9tnl`z߸% MAPڥ@S`b2ɘ2[Q8*IڢHwC*1rBz^gF=77ncT]c$>o܊ѵI[:$qt >/%u29LOsM^!>@PTᦰ #qkZST< =NCc:'Bjd5,39̵Y#$'Vz/{\`' @#D>8HE|.ІײpK3!*Lar)G ?*xŤ`=Iw'id:-60e0e zB6-AZYs?MBS$j2lR[lP]y31qH)j̇f9'nqT+$U]_:.ŽQqr`VhyXm#&R(bݴ @hAa~rM/߽9 gW\BseCVnmCxV$E]aåv)ڷ;kRGtUDޠר*wif^ym =Pf2?lM(^[#aB>Y8X,uN'(?PW",a-n628B%yj2PKg&8j>#)instrumented/TAInstrumentationRunner.javaSn0 =G_Ad\ 4ءR @0 is{e&QkKD-$9]fX-rvcӼZZ$\\|(KS<$S-9ʲx45g5B>@i$'/n*t\iGQ#TK$6+oUF=I2J8T7?D"X6)cBi#c`&Z-b qB2aVhג&b}ߌ5mQ) 6oF [D J=&wd^=<+L^$6YrA Ј%p,|z'+KBw[C)4V )$)QߎAttk9G6?q8[Ow{Y ,3Xn-xVKnh^+.Mms[\Wg)'O= \^CGF'!Z Qׂ ؎PKgb,80α  Pilot.javauS]k0|v a|GC)zC!/%4? 卭V>'d&5۝=d2;t}곩~`Z2ۯe9 CZ0ˋ 76c%j# Fz*5D Y]oی̈́JQd}{x0ߑn'3B ||u{Nfv0zsun@JQꑑE G+s٘mkBJ1̳$Ubs4CvN6Lhl L:Lґ7?<)D|y3H+ZL w7ߣjrwm^6>zO;[ST~ڈ.%PKhb,8t=6SensorPanelTA.javaT]oJ}6aJuS $$ >TBPѾW{,wI 忳_vP/Xb=g\QzC^›pAzV߰$ײaCԾ/rK@V<YF+>T2'iUDJ;F\<&-v%x `-J (Pdp'Ҡ$XNknCL?wjŗ ' "5X%57+/LnBΟ42aeK^(t"D(5 4pR~2I[iSd&cb5 $Q1#- !Œ8\1.QϠsLDkx+K >;Oא|)PZ~q+WV]0E%[Cs9={(Il%ΏM9l"%;3fGi: Lhd#=tJZ?>ٟf[eoӯu(n3>PFŵ_DWZlh#8nH_(3珥 6(kl"3x=㿧{_sm?09`V}S"Arm?VB6\ A>EM4g3>;$~y?2W>hEXv5? D=ǤTxI4/W+OPKJH&8 TAExample.javaWKo7>+@Ľpd- TMvTAqGcܒ%/֮Kr oܳpGWk 2 x [\wdgRX[|vR2g_~SvOWn&,enrfM\|)^pkr\1C۳Ɣ\Uz+ٳ-t%WKpcmzE-]P13X*;Tjv,%]z%fo η 0A:RQ’K*X'`f5+xk'bN?TU@n("BA 6ngP2G9Y4 H2)'/07]~ ʨj8Xq(J8T[̧qSi-$ }q3/ċǥ#DĄ2Xx፧rÃTH"fHg_),:C>/w`j˜ h2RB| tR:QH,+x2H*Yo$k|) iXťT2TKxP$F2rf&U[K+dԪe|YUU2gRE3fb;̭vN=b*t8z{ gFvVOFmG7|&2[!oKy8eUǾնF6(П[ԏEy> HS{q"5/$ *C҄/YBKR /LM4)[ uGĽ%I%DݭUGC:z%_ݚ 6ݟ~c);*T@S@xK{Б[A|6u4GqGrRi \Znuh"N'~lOB8 I8 <]k) {^i_IQC-BނjZTnyl+ףҗ!5}ufscOp-2w?j k[Ce'vm\ WV(y;Te߄jv & \Aߍ EOkgwebf@A5헯Sps3Whg1\>'\<LX/"=ɢdFl,Pao:mj Q7ƪ@HF޴oK a' #T= oTsjQDm9["0:ZD{|-{baFowPK( H&8 $instrumented/ 1P1PY<9 JPK(j75|-oU$ +instrumented/SensorPanel.java YZE9 JI3E9 JI3E9 JPK(H&8(|7 *$ instrumented/TAInstrumentationExample.java 1P1P1PPK(g&8j>#)$ Tinstrumented/TAInstrumentationRunner.java 7mP)tB9 J)tB9 JPK(gb,80α  $ Pilot.java UR UOFP1PPK(hb,8t=6$ r SensorPanelTA.java @-U/U_1PPK(JH&8 $ TAExample.java 2Pl2Pl2PPK(fb,8 D" $ Team.java EÒU2ʒUup1PPK@././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/taexamplesvb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001026211520622606033764 0ustar directhexdirecthexPK%d7kwRImage.vbm?k0wmI* !)$t-|UYo_ vE߽nCPua]ly/P_(c +41{Fx6Ì$ <+s#v͛j?BmEcVӗ t䣾wVF,*E1h#V(yP7 PKn,8m-Pilot.vbTM0ZR eMKvCE',Iqbw K7o"-`҈c[>gF,8}+"Ru:iMvt,Kĉ94f Kfc]˱bL%$T#)8$vBj)BBh?$/UWg:ǽaʊp֐iCLOt]^H~#`=?GS4jP_YH.,Kx4kPhFЗ|SD3T. >A5SU 7WD#lU׶O4'Fx-4ՉIo347IhZkwv(c;ul&+5uu$שּׁssz7ZdWZUW?v)~վ<+ gDxտ߇:\[) 62FjVɤ1Z+N"`X@n (`T8W"L!Q;it)W?PKi28CٞV SensorPanelTA.vbVn6? hM (NZ(lcmM-)jHɒ,)"b||8:?qHD)|?/>?ȝ1忾_ELK1"˵)pLхxƝ81'lg77KG,'g-!|ǝY TV5S(3@v3T* l'ŃYԨ2CEj}YXyώEm $2x֡r)0eE/~Y6Ym;XbM' 翘G=<,Ybl\&\+DŽBs J&A]i9Xcko¶8)./j`/C^ΤB`eV ӑ肊u ubR$yOsDWu rILJ_?Hhi%OG~Uhvp+QvBbݡ)u/13R1.>}3_/r/T}br:7C o@w>AOts95 Z9|nΔFE\XbȈmr7u:x4JOlS /_PK,8d9 TAExample.vbXo6/=DR5) l$K@KL"]ǣ%Q}E2x|s=|kSx}y^Vo#ZB>Zo}jDC9{lej8/RON{n\gvo8[ 4<ًljBpf"N0n S JrFf觴x3` )kIϘ:q,B)4Sڿx˵k:62 j: n,U7VYҳP\ :Ibt0~[aϬPi'ihbB Lڧ'LPWlo`k7LS=3XRkUK♜ ^%{ Oah[b0EA'KisCbm^W[>LQt2QmMBCZ#  l61^A{|1ཻE rMꭝC9P4NbEnKMxS(҇ +˝BgTU%;fK2^؅ҫiO3E8AEg$;X<- |AW՟Fuj @VG#RTD, P#n{7Toezh9?@/UVZG~w9hbmddy1%YCh++q 4򔙥}~̰tB3_2}yj2ksoX%lDBڏa gq5֬S\j_YH'lC,} OnVgw:z#OdV}W 8bn 6 kt ͆֗9a x OBv/?,LYҿ`Щ+8^^YIu1^dnku'SuMMXf)dKqftSGW~ttOhJNASj/hkBCzZV0PCغȓbZy*Nw 3F* B3Wy5F?VꏘZ2< "mmhm. 9'gL0^,(#7PKn,8ɘx8JPTeam.vbU]k0}/?ܷs :HlFS"7- Invl'6R"9 :j/,- <]f@, k+du}WJj=Ue2}:h;눖.Q|LUhЇ\+T>zӒg*1 3+E%v>[YR ʍ 6;x"SXj͎Y2a"[;@ԽC0ܡ < Is? ' s@o;Xө`jnrq@?Zg'O4xY促?5JmvW=}g~PK(%d7kwR$ Image.vb i\4JY54JY54JPK(n,8m-$ &Pilot.vb 2U"U 4JPK(i28CٞV $ ySensorPanelTA.vb RXYNXYAz4JPK(,8d9 $ TAExample.vb 2OU2OUd|4JPK(n,8ɘx8JP$ ` Team.vb ,+U*U4JPK././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622616033762 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021700000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/btaexamplesvb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000344111520622616033766 0ustar directhexdirecthexPK77#۪1ASensorPanelTA.vbUk0pdFa0 KaIiq(%&KF$?K_qQн{dNl}}xs60"Hϗ1 Rp9b7L#F\~z:  X.^cfEB7G0X4J1b=`ڪ#6SK'}",V'x~ <'UVv zأU %u>|t,^JqKSj:OΔXWܰ=^Kߢfi؍RLg!ߦYPid?%Szy)E_|`˵9Zx.N+ս9|[)JTTKDJ@X a]`ismN ]nx|;%I5seΝL4k#*Zy#z\._,6nyrV+\[7mBB EIuvF m\B(LuO*^p`PK77h TAExample.vbWm6a/q`˖d gӃ~9yHFR~yݎZ}q=g ,Tzb[Sq6{ ?Dj'rk`%OoD>Wۛ.U:Nb_V[ϧFlKR+N8ya;4)8RIUmL-noO4(k٤ KLТWXKm)v0%lC.{j6D*):0Fwiҧfga,!AST Y\^Css/ a֊XeL~#g!Y H2=/:fyڝA4J{ɩ|Pù7u(ooT ěA R]UЪkê_]%6"`)E(r j&M4ڝ -OhZ6q)ۮQ-#|;huj_q""j>z*0?Tj<^xүҞ jR5ç$aiuK]4k>w>\ޙ1"(&1Nюģa>WU6ͪeE#sbáfCӡRx_7W~n?jm7cڃ|!:Y3% өp d4 TA Enhancement With Db4oTool
You are here: Basics Operations & Concepts > Activation > Transparent Activation > TA Enhancement With db4otool

TA Enhancement With Db4oTool

TA instrumentation can be done by applying

Db4oTool utility to the ready .NET assemblies:

Db4oTool -ta assembly

Let's look at a simple example. We will use SensorPanel class from Activation example:

SensorPanelTA.cs
/**//* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */
using Db4objects.Db4o;
using Db4objects.Db4o.Activation;
using Db4objects.Db4o.TA;

namespace Db4ojects.Db4odoc.TAExamples
 {
    public class SensorPanelTA /**//*must implement Activatable for TA*/
     {
        private object _sensor;

        private SensorPanelTA _next;

        
        public SensorPanelTA()
         {
            // default constructor for instantiation
        }

        public SensorPanelTA(int value)
         {
            _sensor = value;
        }

        
        public SensorPanelTA Next
         {
            get
             {
                return _next;
            }
        }

        public object Sensor
         {
            get
             {
                return _sensor;
            }
        }

        public SensorPanelTA CreateList(int length)
         {
            return CreateList(length, 1);
        }

        public SensorPanelTA CreateList(int length, int first)
         {
            int val = first;
            SensorPanelTA root = NewElement(first);
            SensorPanelTA list = root;
            while (--length > 0)
             {
                list._next = NewElement(++val);
                list = list.Next;
            }
            return root;
        }

        protected SensorPanelTA NewElement(int value)
         {
            return new SensorPanelTA(value);
        }

        public override string ToString()
         {
            return "Sensor #" + Sensor;
        }

    }

}

SensorPanelTA.vb
' Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com
Imports Db4objects.Db4o
Imports Db4objects.Db4o.Activation
Imports Db4objects.Db4o.TA

Namespace Db4ojects.Db4odoc.TAExamples

    Public Class SensorPanelTA 

        Private _sensor As Object
        Private _next As SensorPanelTA

        
        Public Sub New()
        End Sub

        Public Sub New(ByVal value As Integer)
            _sensor = value
        End Sub

        
        Public ReadOnly Property NextSensor() As SensorPanelTA
            Get
                Return _next
            End Get
        End Property

        Public ReadOnly Property Sensor() As Object
            Get
                Return _sensor
            End Get
        End Property

        Public Function CreateList(ByVal length As Integer) As SensorPanelTA
            Return CreateList(length, 1)
        End Function

        Public Function _ 
CreateList(ByVal length As Integer, ByVal first As Integer) _ 
As SensorPanelTA
            Dim val As Integer = first
            Dim root As SensorPanelTA = NewElement(first)
            Dim list As SensorPanelTA = root
            While System.Threading.Interlocked.Decrement(length) > 0
                list._next = NewElement(System.Threading.Interlocked.Increment(val))
                list = list.NextSensor
            End While
            Return root
        End Function

        Protected Function NewElement(ByVal value As Integer) As SensorPanelTA
            Return New SensorPanelTA(value)
        End Function

        Public Overloads Overrides Function ToString() As String
            If Sensor Is Nothing Then
                Return ""
            Else
                Return "Sensor #" + Sensor.ToString()
            End If
        End Function
    End Class
End Namespace

In your code you will need to add Transparent Activation support to the configuration:

TAExample.cs: ConfigureTA
private static IConfiguration ConfigureTA()
         {
            IConfiguration configuration = Db4oFactory.NewConfiguration();
            // set normal activation to 0
            configuration.ActivationDepth(0);
            // add TA support
            configuration.Add(new TransparentActivationSupport());
            return configuration;
        }
TAExample.cs: StoreSensorPanel
private static void StoreSensorPanel()
         {
            File.Delete(Db4oFileName);
            IObjectContainer container = Database(Db4oFactory.NewConfiguration());
            if (container != null)
             {
                try
                 {
                    // create a linked list with length 10
                    SensorPanelTA list = new SensorPanelTA().CreateList(10);
                    container.Store(list);
                }
                finally
                 {
                    CloseDatabase();
                }
            }
        }
TAExample.cs: TestActivation
private static void TestActivation()
         {
            StoreSensorPanel();
            IConfiguration configuration = ConfigureTA();

            IObjectContainer container = Database(configuration);
            if (container != null)
             {
                try
                 {
                    System.Console.WriteLine("Zero activation depth");
                    IObjectSet result = container.QueryByExample(new SensorPanelTA(1));
                    ListResult(result);
                    if (result.Size() > 0)
                     {
                        SensorPanelTA sensor = (SensorPanelTA)result[0];
                        // the object is a linked list, so each call to next()
                        // will need to activate a new object
                        SensorPanelTA next = sensor.Next;
                        while (next != null)
                         {
                            System.Console.WriteLine(next);
                            next = next.Next;
                        }
                    }
                }
                finally
                 {
                    CloseDatabase();
                }
            }
        }

TAExample.vb: ConfigureTA
Private Shared Function  ConfigureTA() As IConfiguration
            Dim configuration As IConfiguration = Db4oFactory.NewConfiguration
            ' set normal activation to 0
            configuration.ActivationDepth(0)
            ' add TA support
            configuration.Add(New TransparentActivationSupport)
            Return configuration
        End Function
TAExample.vb: StoreSensorPanel
Private Shared Sub StoreSensorPanel()
            File.Delete(Db4oFileName)
            Dim container As IObjectContainer = Database(Db4oFactory.NewConfiguration)
            If Not (container Is Nothing) Then
                Try
                    ' create a linked list with length 10
                    Dim list As SensorPanelTA = (New SensorPanelTA).CreateList(10)
                    container.Store(list)
                Finally
                    CloseDatabase()
                End Try
            End If
        End Sub
TAExample.vb: TestActivation
Private Shared Sub TestActivation()
            StoreSensorPanel()
            Dim configuration As IConfiguration = ConfigureTA()
            Dim container As IObjectContainer = Database(configuration)
            If Not (container Is Nothing) Then
                Try
                    System.Console.WriteLine("Zero activation depth")
                    Dim result As IObjectSet = container.QueryByExample(New SensorPanelTA(1))
                    ListResult(result)
                    If result.Size > 0 Then
                        Dim sensor As SensorPanelTA = CType(result(0), SensorPanelTA)
                        ' the object is a linked list, so each call to next()
                        ' will need to activate a new object
                        Dim nextSensor As SensorPanelTA = sensor.NextSensor
                        While Not (nextSensor Is Nothing)
                            System.Console.WriteLine(nextSensor.ToString())
                            nextSensor = nextSensor.NextSensor
                        End While
                    End If
                Finally
                    CloseDatabase()
                End Try
            End If
        End Sub

Compile and run the application. Now, you can add TA support by using the following command-line:

Db4oTool -ta TAExamples.exe

use -vv option for verbose output:

Db4oTool -ta -vv TAExamples.exe

You can also apply type filter to TA enable only selected types:

Db4oTool.exe -vv -ta -by-name:S* TAExamples.exe

Db4oTool uses .NET regex to parse the -by-name parameter, in the example above all types starting with "S" will be TA enabled.

Run TA enabled assembly and compare results to the previous run.

././@LongLink0000000000000000000000000000021700000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/btaexamplescs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000327311520622614033767 0ustar directhexdirecthexPKk773>SensorPanelTA.csT]k0}?\|4vV Bև(M!KF3F&WL{=G: ,uˈ`|~ 3 [,|S<Q9M˲L|):I:V=|=?x,8##U'dp@ m8AN,%pnF \2kS( H'Ya 'd*l#vzTBC1<3XkCrO Oe0_5}?c$ZY2'{/S$^^X  Epdnjpw`'#5_~¨~K+2~sࢹK"tΠ">y5NKZ|ShM!^QlKΔ#yn WDf.|ͬ|$ԭࠁ=dDZnM ]w\JHaٺFƈ-%?k&=J*+Vʯi{PK077ҧ[ TAExample.csWm6adAa KrmG(8VMS$#)-+NlٖPZ%3TzcFd!}xFf Ix'~+aj Ɨ;OvN{r\&uYOfJ>ut{Z*c9nsnda.P9ˋ p#=΀ j gʑiZ`> pF4>F0GjڥX€y\Ntgy)w¤p'zmFs e{$iRǀPyn|i%J*QmP2GI~2>PSj̙J/f˸:#JwPV?;JИFgLXsrד5W1" 2JfwN\OA)dxm]/G.C eF^rk\ zU8Ă U#BA R-@O F;Iu iii [0,SjKSe4(kw|Yo_ vA sФh6$t9r8:(ۥ(.\Z*reK琊 ~EKڌr*{bB"YHF3LAM&H>* }|8S Mǯ(@6Jc0CG9+K!yӲVpL̹(ˡ^3InH|Ub8p[PO4'JV,e~fyΙ+rPK(k773>$ SensorPanelTA.cs  {PK(077ҧ[ $ TAExample.cs {kڂPK././@LongLink0000000000000000000000000000023300000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/ta_enhancement_at_build_time/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622616033762 5ustar directhexdirecthex././@LongLink0000000000000000000000000000024400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/ta_enhancement_at_build_time/build.xmldb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000252311520622616033766 0ustar directhexdirecthex ././@LongLink0000000000000000000000000000021500000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example/sensorpanel.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000750111520622610033761 0ustar directhexdirecthex SensorPanel

SensorPanel

SensorPanel.Java
/**//* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */

package com.db4odoc.tpbuildtime;

public class SensorPanel  {

  private Object _sensor;

  private SensorPanel _next;

  public SensorPanel()  {
    // default constructor for instantiation
  }
  // end SensorPanel

  public SensorPanel(int value)  {
    _sensor = new Integer(value);
  }
  // end SensorPanel

  public SensorPanel getNext()  {
    return _next;
  }
  // end getNext
  
  public Object getSensor()  {
    return _sensor;
  }
  // end getSensor
  
  public void setSensor(Object sensor)  {
    _sensor = sensor;
  }
  // end setSensor
  
  public SensorPanel createList(int length)  {
    return createList(length, 1);
  }
  // end createList

  public SensorPanel createList(int length, int first)  {
    int val = first;
    SensorPanel root = newElement(first);
    SensorPanel list = root;
    while (--length > 0)  {
      list._next = newElement(++val);
      list = list._next;
    }
    return root;
  }
  // end createList

  protected SensorPanel newElement(int value)  {
    return new SensorPanel(value);
  }
  // end newElement

  public String toString()  {
    return "Sensor #" + getSensor();
  }
  // end toString
}
././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/tacollectionsjava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000414511520622616033770 0ustar directhexdirecthexPKT:`* Pilot.java+HLNLOUH7OO+ILIM.+*(MLVHI,.V/Q̲ĒT̼tTk DX&H'gIFf` T _ZT0$[YZRZHPK{:5k&3TACollectionsExample.javaTMo0 =@3 eX?R`ؚMnP(2%WCagND>R$K.6|ɍ`ąQ I,Jc 3iاFa /Gڶ P}o(/J7z[N8y+8n/NO&0>IW׳Sc52K+~nWnhzwp)f]L>Q!a68 彇M>9Z0Lc CYVf89@kL;iŸi JN:BM!ł" )k/qMEUbkAx_Ke( *dpŝ[pfc4?ԀF̃T]20>R 9L+>'$(6kZt"Es/Aus%Jwk@n(=ޛ?:‚Xi&_uTOoTi&R$Ks㾩,irdXUSj;30a"@BYX]-jnFH*bkH{PRvX[At՞7VQNj}}X-:7[5^mͶẖ>wiB$xk VB >T\,>OirKPKp:5:YD Team.java}J0-;T3Y>v8LIe4XkBۡ4(O`lISaֽp}3FK/4{V"1Q*Fjg-j9%ҷ|_lf k*8a0x6MOYOxנQ\r?¤WbPK(T:`* $ Pilot.java &d<]}]}]PK({:5k&3$ TACollectionsExample.java vOV~]V~]PK(p:5:YD $ Team.java FyV]V]PK(Pg:"ä $ build.xml &ep~_~_PK}././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_for_public_fields.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001130511520622616033764 0ustar directhexdirecthex TA For Public Fields
You are here: Basics Operations & Concepts > Activation > Transparent Activation > TA For Public Fields

TA For Public Fields

Accessing public fields through TA seems to be natural - if properties and getters are activated transparently, so should be public fields. However, if we look at TA Implementation, we can see that we need to embed Activate call in the method accessing the field. It is easy in the case of getters and Properties as the method is the part of the persistent class. However, in the case of public fields, the access method can exist anywhere in the code. Effectively, TA enhancer has to browse through all the classes and find all references to public fields and instrument them as necessary. Well, this is still feasible.

However, there is a certain catch: if persistent classes are in a separate library/assembly from the main code, you have to make sure that BOTH persistent classes library/assembly and the accessing library/assembly are both instrumented. This is necessary to make sure that TA code is injected both in the persistent class and in the class accessing persistent class public field.

././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/object_types_in_ta.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001655311520622616033776 0ustar directhexdirecthex Object Types In TA
You are here: Basics Operations & Concepts > Activation > Transparent Activation > Object Types In TA

Object Types In TA

When working in TA enabled environment you must remember that db4o treats Activatable (TA Aware) and non Activatable (other) types differently.

In general we can distinguish the following types:

  • Value types with no identity (char, boolean, integer etc). These types are handled internally by db4o engine and behave the same in TA enabled and disabled modes.
  • Activatable types, as it is clear from the name, implement Activatable interface and are responsible for their own activation.
  • Non Activatable type - all the other types, including user types or third-party classes.

As it was mentioned before in TA enabled mode non-Activatable types are fully activated whereas Activatable types have 0 activation depth and are getting activated as requested.

Let's look at an example model below, which includes Activatable and non-Activatable classes:

Querying and traversing in TA enabled mode:

c#:

Customer c = container.QueryByExample(typeof(Customer)).Next();

VB:

Dim c as Customer = container.QueryByExample(GetType(Customer)).Next();

At this point the following paths should be already activated (Customer is not Activatable):

c.namec.addresses.addresses[N].firstLine

 

c.addresses[N].country - available but not activated (Activatable type).

 

Country.getState would cause the Country object to be activated

c#:

State state = c.Address[0].Country.GetState(someZipCode);

VB:

Dim state As State =
c.Address(0).Country.GetState(someZipCode);

At this point the following paths become activated

c.addresses[0].country.states.addresses[0]
.country.states[N].name

c.addresses[0].country.states[N].city.addresses[0]
.country.states[N].cities[N]

- available but not activated (Activatable type)

 

The following general rules apply:
  1. Arrays of Arrays of non Activatable types: non Activatable behavior
  2. Arrays of Arrays of Activatable types: non Activatable behavior except for leaves
  3. JDK collections: non Activatable behavior
  4. Value types with references to non Activatable reference types and to Activatable reference types: the non Activatable path should be activated fully; Activatable path stops activation.
././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_enhanced_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001202111520622614033756 0ustar directhexdirecthex TA Enhanced Example
You are here: Basics Operations & Concepts > Activation > Transparent Activation > TA Enhanced Example

TA Enhanced Example

You can inject TA awareness in your persistent classes without modifying their original code. In the current scenario this means:
  • generate the Activatable interface declaration;
  • add bind(objectContainer) method implementation;
  • generate a field to keep a reference to the corresponding Activator instance;
  • generate activate() call at the beginning of every method.
These tasks can be fulfilled in the classes bytecode by using Enhancement Tools.

TA Enhancement In .NET

TA enhancement for .NET can be done at build or post-build time. In both cases it requires Db4oTool project distribution.

When build-time option is used Db4oEnhanceMSBuildTask is added to the build file (*.csproj or *.vbproj in Visual Studio), this requires Db4oTool.MSBuild.dll library.

In post-build enhancement case, Db4oTool.exe command line utility is used to enhanced built assemblies.

././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/collections/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622610033754 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021500000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/collections/enhance_collections.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000002445111520622610033764 0ustar directhexdirecthex Enhance Collections

You are here: Basics Operations & Concepts > Activation > Transparent Activation > Enhance Collections

Enhance Collections

You can use the normal .NET-collections in your code and then replace the implementations with the enhancement-tools. See "TA Enhanced Example"

The enhancement tools will search for instantiations of collections and replace it with an appropriate transparent activation aware collection.

However this has some implications. The original collection-classes are all sealed and not designed for extension. This means that a complete different implementation is used and has consequences.

Can Be Enhanced: When Using Interfaces In Declaration

The best case is when collection-interface is used, like IList instead of the concrete class. For example a field-declaration like this:

public class CanBeEnhanced
{
    private IList<string> _names = new List<string>();

    public bool ContainsName(string item)
    {
        return _names.Contains(item);
    }

    public void AddName(string item)
    {
        _names.Add(item);
    }
}
EnhancementLimitations.cs: Can be enhanced by the db4o-tools
Public Class CanBeEnhanced
    Private _names As IList(Of String) = New List(Of String)()

    Public Function ContainsName(ByVal item As String) As Boolean
        Return _names.Contains(item)
    End Function

    Public Sub AddName(ByVal item As String)
        _names.Add(item)
    End Sub
End Class
EnhancementLimitations.vb: Can be enhanced by the db4o-tools

Are correctly translated by the enhancement tools to:

public class CanBeEnhanced
{
    private IList<string> _names = new ActivatableList<string>();

    public bool ContainsName(string item)
    {
        return _names.Contains(item);
    }

    public void AddName(string item)
    {
        _names.Add(item);
    }
}
EnhancementLimitations.cs: Is enhanced to
Public Class CanBeEnhanced
    Private _names As IList(Of String) = New ActivatableList(Of String)()

    Public Function ContainsName(ByVal item As String) As Boolean
        Return _names.Contains(item)
    End Function

    Public Sub AddName(ByVal item As String)
        _names.Add(item)
    End Sub
End Class
EnhancementLimitations.vb: Is enhanced to

Cannot Be Enhanced: When Using Concrete Class In Declaration

When you use the concrete types in field declarations, the enhancer-tools will produce a warning and doesn't change the implementation. The example below cannot be enhanced, because it uses the concrete type.

public class CannotBeEnhanced
{
    // cannot be enhanced, because it uses the concrete type
    private List<string> _names = new List<string>();

    public bool ContainsName(string item)
    {
        return _names.Contains(item);
    }

    public void AddName(string item)
    {
        _names.Add(item);
    }
}
EnhancementLimitations.cs: Cannot be enhanced by the db4o-tools
Public Class CannotBeEnhanced
    ' cannot be enhanced, because it uses the concrete type
    Private _names As New List(Of String)()

    Public Function ContainsName(ByVal item As String) As Boolean
        Return _names.Contains(item)
    End Function

    Public Sub AddName(ByVal item As String)
        _names.Add(item)
    End Sub
End Class
EnhancementLimitations.vb: Cannot be enhanced by the db4o-tools

Casts are dangerous

The enhancement tools replace the implementation of collections. When you code has an assumptions about the concrete types and tries to cast, it may fail. In general try to avoid casting to concrete types and use interfaces instead.

././@LongLink0000000000000000000000000000021400000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/collections/use_ta_collections.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001445111520622606033770 0ustar directhexdirecthex Using TA Collections Directly
You are here: Basics Operations & Concepts > Activation > Transparent Activation > Using TA Collections Directly

Using TA Collections Directly

You can use the transparent activation aware collections directly in your code. They behavior is the same as the .NET-collections. Here are a few tips:

  • Prefer the collection-interfaces over the concrete classes in your field, parameter and return-type declarations. For example declare a field as a IList<T> instead of a List<T>
  • Maybe it useful to create a collection factory in your code. Then you have only one play in your code which decides which classes are used. So it easy to replace the implementations.

An example:

public class Team : ActivatableBase
{
    private readonly IList<Pilot> pilots = new ActivatableList<Pilot>();

    public void Add(Pilot pilot)
    {
        Activate(ActivationPurpose.Write);
        pilots.Add(pilot);
    }

    public ICollection<Pilot> Pilots
    {
        get
        {
            Activate(ActivationPurpose.Read);
            return pilots;
        }
    }
}
Team.cs: Using the activation aware collections
Public Class Team
    Inherits ActivatableBase
    Private ReadOnly m_pilots As IList(Of Pilot) = New ActivatableList(Of Pilot)()

    Public Sub Add(ByVal pilot As Pilot)
        Activate(ActivationPurpose.Write)
        m_pilots.Add(pilot)
    End Sub

    Public ReadOnly Property Pilots() As ICollection(Of Pilot)
        Get
            Activate(ActivationPurpose.Read)
            Return m_pilots
        End Get
    End Property
End Class
Team.vb: Using the activation aware collections

Currently these collections are available:

  • ActivatableList<T>: An activatable version of the List<T>-class
  • ActivatableDictionary<T>: An activatable version of the Dictionary<T>
././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/taexamplescs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000777011520622616033777 0ustar directhexdirecthexPKAq7C;Image.csMj0@Pڴ\z=HQҺ)}JvR{if1!B:~]9;/?QQS .DY6] 4+-; Ӿ )#3#W-l0ꧮ W )[*:/,3f?!/Ab frNYcƯgl]jiyk.8!)5&swhP]$&ን UҐ.S1I^$[&J `x3>eZmRl'NKԗjt8BהgG6 0t:.Tjy_x7@d){} @hU z[&x@uJpqZݜz1։6KPEqفUr̗Ya&4z!v8^fP)z9PS{^Rw Fl{,u Z3M8A$l3nH D89aO4qtq6_-Jhk`7d~ϵ7t%%Zς"hyE}9 +Pi3܄5p+x\‡׵AKp+ tI0K"k8>Q~IXRU.@#ԅ}7\\,[{&(Ƕ/V`[!ȟ:P_mQk!\Ñ5ۀ@ڟ_PKAq7,B TAExample.csXmo6 }Vvvd[6)f#]l&2)t,)ʖ(Rl]L"xsw/aA o÷ڼ~-HI8cQ wzP%$es>Hˑ .t϶d'04#OxQޱ g7t>dθT4N3YLIٔbF#=tCiA)a7n<ȟT{"ΤVizS=7(Ea5 hC"S_[e(Kl$jg>ɁU ~14 Gh@9 'VH{&> i9U\3a~% &0(#[ն]5s\[DnWU&zΩk% r" ewTj ~ז2"݁N> jNQFZ̧z e$I;0 &䂯 ɜ`8JR[f&2<\,5V;\-4 T&o $6.JS.*(D]_"YqxN5@8Х{.*sjf!ZjUlChѽ *7{@|1ƘEWrk@\%5TA}L 4DN'6g߷]] 3i}9f&Azms6}J7gOwxsW[@qf' kd un?s)PÑ~c>:z~0&3^Czsl1%U]#*Z@p029npHt7$1{! |o?R?bi܆]?Kֆ-Qd8r2zF 5{RS<痸:_w#5/O|uH_A[)m' #0i $.UլcN1i]}9})GU#~~F(863tݎZ*ϧ5j[~XJMQ۷].9Zv!=CPKl,880Team.csT1p˱t(Bk"VJ5%&Kߛݻĝ7yXfѸnom.rSa"6dwIcS䪛k&0;hx,9)L Cv G- ZC/٢HL5dqWݧ.ؕKRH9HpJYr,QOf;Ӕqi>"s!H)rp~z'msp!KGP ?]3TpO R!A +FPVR) aV;((:R<b+$Rhr^9D9\_lM >;*^3w(z3- a[j ֭X1TCs#`hLjb#Rb{`|̜bnNu:WR!J݄NVmǿPȢ-wT 3Q{$*OQ̅9H@A NUZ̬ps/ϯPK(Aq7C;$ Image.cs J ]J ]JPK(l,8RElY$ Pilot.cs c#qU#qU JPK(l,8H%. $ ?SensorPanelTA.cs ~UN~UJPK(Aq7,B $ TAExample.cs rJiJiJPK(l,880$ Team.cs (xU2 tUY JPK././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/ta_diagnostics.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001202011520622614033755 0ustar directhexdirecthex TA Diagnostics

TA Diagnostics

You can use Diagnostics to get runtime information about classes with and without TA support. Add a call to the following method in the configureTA() method and run the example from the previous topic:

TAExample.cs: ActivateDiagnostics
private static void ActivateDiagnostics(IConfiguration configuration)
         {
            // Add diagnostic listener that will show all the classes that are not
            // TA aware.
            configuration.Diagnostic().AddListener(new TADiagnostics());
        }

TAExample.vb: ActivateDiagnostics
Private Shared Sub ActivateDiagnostics(ByVal configuration As IConfiguration)
            ' Add diagnostic listener that will show all the classes that are not
            ' TA aware.
            configuration.Diagnostic.AddListener(New TADiagnostics)
        End Sub

The example should show you diagnostic messages about the classes without TA support. In this case it should be Image class (Pilot._image) and BlobImpl(used in Image class). ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/Collections.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001153511520622610033763 0ustar directhexdirecthex TA Aware Collections
You are here: Basics Operations & Concepts > Activation > Transparent Activation > TA Aware Collections

TA Aware Collections

In order to support properly, a class need to implement the IActivatable-interface. For your domain-classes this is quite easy to archive. But what about the .NET-collections? Wouldn't it be nice when the collections also work together the transparent activation framework?

db4o brings special, transparent activation aware collections with it. This collections load the content only when the collections is actually used.

These collections are currently implemented:

  • ActivatableList<T>: An activatable version of the List<T>-class
  • ActivatableDictionary<T>: An activatable version of the Dictionary<T>

It's recommended to use the collection-interfaces wherever possible instead of the concrete classes. This avoids unnecessary direct dependencies on the implementations and makes it easy to exchange the implementations.

You can use the db4o-collection directly in your code. For example in the case you implement the transparent activation support manually. Take a looks these tips: See "Using TA Collections Directly"

The enhancement tools can automatically replace the .NET-collections with the db4o-equivalent. However there are few rules and limitations. See "Enhance Collections"

././@LongLink0000000000000000000000000000021500000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation_pitfalls.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001405111520622614033763 0ustar directhexdirecthex Transparent Activation Pitfalls
You are here: Basics Operations & Concepts > Activation > Transparent Activation > Transparent Activation Pitfalls

Transparent Activation Pitfalls

Transparent Activation is a powerful feature that can make development much faster, easier and error-proof. But as any power it can lead to trouble if used in a wrong way. The aim of this chapter is to point you out to typical pitfalls, which can lead to unexpected and undesired results.

Not Activate Call Before Field Access

Before accessing any field you need to call the activate-method. This is true for all property and also for other methods like the to string method or the hash code method. The best strategy is to call the activate-method in the property and then access the field through those even in the class itself.

Or use the enhancement-tools to avoid this issue complete.

Migrating Between Databases

Problem

Transparent Activation is implemented through Activatable/IActivatable interface, which binds an object to the current object container. In a case when an object is stored to more than one object container, this logic won't work, as only one binding (activator) is allowed per object.

Solution

To allow correct behavior of the object between databases, the object should be unbinded before being stored to the next database. This can be done with the following code:

.NET:

myObject.Bind(null);

For more information see an example.

Debugging Instrumented Classes

Debugging instrumented classes may not work 100% correct. Make sure you use the debug-flag for the db4otool

You should be able to debug normally anywhere around instrumented bytecode. If you still think that the problem occurs in the instrumented area, please submit a bug report to db4o Jira.

././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000755000175000017500000000000011520622616033762 5ustar directhexdirecthex././@LongLink0000000000000000000000000000022000000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation/tamigratecs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000413711520622610033763 0ustar directhexdirecthexPK,8Z; SensorPanelTA.csVKo6@"m- \7ƨ}+ +HCϵur+r|\Q :Խ~lyaJeÆ$UUN*YrxP.WeJ|ˈ+9rwiEh WJg֌ا( f ܢ4J0Y^s5+r|gڻN½<]a{4Kf,5!Ԙy & shux-jٿnܷBqȢNK#L +A!]ιCI꩗^(aX$2Q80?<ɭ6Xw )1|1ky Nn:8Q`\b%jW$5ebZ%K3UxC64@_"]Lm%ȾY?SI8:1_l*o)? d~ ҄A99xmPK(,8Z; $ SensorPanelTA.cs @@?LU ?LUKUPK(",8X $ iTAExample.cs  LOUOUKUPK././@LongLink0000000000000000000000000000022200000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation/tamigratejava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000375211520622614033771 0ustar directhexdirecthexPK,8ӎNUSensorPanelTA.javaTMoF=Ӏ4\IP Ĉs7VvKL{_ ŝ޼YNj_5~y;Tjd^94DEu]Byvgg-+e5=J95#\ k!!g%gF\<[~&-~#x `#J(v{C`KP&eC_vjww O/g9 E{Lkn5VndgOBI' mPlѥNhTe{tW&{+m)+e5 =V3{dX%a: b( Pqdi[ %.m0>+^¦}C -ZJJ4^e|=Ljҟl{!b2thGܽغ1 5X2Ź3e#%X.(|FՐ};mP0"Y GVS/4cu<Ϭƕ|V6<~ti65.{#Ho,vW4J%|GÒ l3=qPPHVڑ{WB#$% Ɯ77i[ $,*XSH+Eao݅²TW]Bz}OKLWWVMN"ܘzxa> n̗u=fAH?]AgPKܪ,8Fk TAExample.javaV]o6}V;?MG9C 2 @; e2o$[f0`/uṔW0)ʝJ |k!])0 nDBau6-&kx|Eɒ,C0;Δ l34^X. 0 z~Ht1)f\|cǖb3:qKe0BiF U2B7uV-EHrWl]X[TJ場N`%\ww+%: ⃋/Ϯ& MI`sx!xS֌ +0EmNVSق)TdhDqc揘z+ǀo\\B *L`NBm[* -b45cw V)(Qdq| %*=$-j915`Z_A"3ȹu1{/2! r>` uM{y䅪?-ZAIxBwOig˫ 4J@XjЧ+Ap랏ȮWھSE9QےK| =fRhb/jujsŁDUV}"B{ 9y Md?(0ӕrO iC}&ʱh>n=e0&P`)5 gp `&3 Y;dGJS5Q,=>K`>=1Ľz̩>m=FǿҸEi)M\=jqc ҬEqZUQt8A]͢G{T h&s9qNc?TXF!]NyDr`@E-`5Jz;Wu.u8ߚaKͼ6"}|]OޑG_貧qeŔof$5sfßPK(,8ӎNU$ SensorPanelTA.java @sPUI*UI*UPK(ܪ,8Fk $ 3TAExample.java `+PUZ*UZ*UPK././@LongLink0000000000000000000000000000024000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation/migrating_between_databases.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000003606711520622616034000 0ustar directhexdirecthex Migrating Between Databases
You are here: Basics Operations & Concepts > Activation > Transparent Activation > Migrating Between Databases

Migrating Between Databases

Transparent activation and persistence functionality depends on an association between an object and an object container, which is created when an activator is bound to the object. Each object allows only one activator. Typically this limitation won't show up, however there is a valid use case for it:

1) suppose you need to copy one or more objects from one object container to another;

2) you will retrieve the object(s) from the first object container using any suitable query syntax;

3) optionally you can close the first object container;

4) you will now save the object to the second object container.

If both object containers were using transparent activation or persistence - the 4-th step will throw an exception. Let's look at the case in more detail. Typical activatable class contains an activator field. When transparent activation functionality is used for the first time an object container activator will be bound to the object:

SensorPanelTA.cs: Bind
/**//*Bind the class to the specified object container, create the activator*/
        public void Bind(IActivator activator)
         {
            if (_activator == activator)
             {
                return;
            }
            if (activator != null && null != _activator)
             {
                throw new System.InvalidOperationException();
            }
            _activator = activator;
        }

SensorPanelTA.vb: Bind
' Bind the class to the specified object container, create the activator 
        Public Sub Bind(ByVal activator As IActivator) Implements IActivatable.Bind
            If _activator Is activator Then
                Return
            End If
            If Not (activator Is Nothing Or _activator Is Nothing) Then
                Throw New System.InvalidOperationException()
            End If
            _activator = activator
        End Sub

If bind method will be re-called with the same object container, activator parameter will always be the same. However, if another object container tries to bind the object (in our case with the store call) activator parameter will be different, which will cause an exception. (Exception will be thrown even if the first object container is already closed, as activator object still exists in the memory.) This behaviour is illustrated with the following example (SensorPanelTA class from Transparent Activation chapter is used):

TAExample.cs: TestSwitchDatabases
private static void TestSwitchDatabases()
         {
            StoreSensorPanel();

            IObjectContainer firstDb = Db4oFactory.OpenFile(ConfigureTA(), FirstDbName);
            IObjectContainer secondDb = Db4oFactory.OpenFile(ConfigureTA(), SecondDbName);
            try
             {
                IObjectSet result = firstDb.QueryByExample(new SensorPanelTA(1));
                if (result.Count > 0)
                 {
                    SensorPanelTA sensor = (SensorPanelTA)result[0];
                    firstDb.Close();
                    // Migrating an object from the first database
                    // into a second database
                    secondDb.Store(sensor);
                }
            }
            finally
             {
                firstDb.Close();
                secondDb.Close();
            }
        }

TAExample.vb: TestSwitchDatabases
Private Shared Sub TestSwitchDatabases()
            StoreSensorPanel()

            Dim firstDb As IObjectContainer = _ 
Db4oFactory.OpenFile(ConfigureTA(), FirstDbName)
            Dim secondDb As IObjectContainer = _ 
Db4oFactory.OpenFile(ConfigureTA(), SecondDbName)
            Try
                Dim result As IObjectSet = _ 
firstDb.QueryByExample(New SensorPanelTA(1))
                If result.Count > 0 Then
                    Dim sensor As SensorPanelTA = _ 
DirectCast(result(0), SensorPanelTA)
                    firstDb.Close()
                    ' Migrating an object from the first database
                    ' into a second database
                    secondDb.Store(sensor)
                End If
            Finally
                firstDb.Close()
                secondDb.Close()
            End Try
        End Sub

The solution to this problem is simple: activator should be unbound from the object:

c#:

sensor.Bind(null);

VB:

sensor.Bind(Nothing)

Note, that the object will quit being activatable for the first object container. The following example shows the described behaviour:

TAExample.cs: TestSwitchDatabasesFixed
private static void TestSwitchDatabasesFixed()
         {
            StoreSensorPanel();

            IObjectContainer firstDb = Db4oFactory.OpenFile(ConfigureTA(), FirstDbName);
            IObjectContainer secondDb = Db4oFactory.OpenFile(ConfigureTA(), SecondDbName);
            try
             {
                IObjectSet result = firstDb.QueryByExample(new SensorPanelTA(1));
                if (result.Count > 0)
                 {
                    SensorPanelTA sensor = (SensorPanelTA)result[0];
                    // Unbind the object from the first database
                    sensor.Bind(null);
                    // Migrating the object into the second database
                    secondDb.Store(sensor);


                    System.Console.WriteLine("Retrieving previous query results from "
                            + FirstDbName + ":");
                    SensorPanelTA next = sensor.Next;
                    while (next != null)
                     {
                        System.Console.WriteLine(next);
                        next = next.Next;
                    }

                    System.Console.WriteLine("Retrieving previous query results from "
                            + FirstDbName + " with manual activation:");
                    firstDb.Activate(sensor, Int32.MaxValue);
                    next = sensor.Next;
                    while (next != null)
                     {
                        System.Console.WriteLine(next);
                        next = next.Next;
                    }

                    System.Console.WriteLine("Retrieving sensorPanel from " + SecondDbName + ":");
                    result = secondDb.QueryByExample(new SensorPanelTA(1));
                    next = sensor.Next;
                    while (next != null)
                     {
                        System.Console.WriteLine(next);
                        next = next.Next;
                    }
                }
            }
            finally
             {
                firstDb.Close();
                secondDb.Close();
            }
        }

TAExample.vb: TestSwitchDatabasesFixed
Private Shared Sub TestSwitchDatabasesFixed()
            StoreSensorPanel()

            Dim firstDb As IObjectContainer = _ 
Db4oFactory.OpenFile(ConfigureTA(), FirstDbName)
            Dim secondDb As IObjectContainer = _ 
Db4oFactory.OpenFile(ConfigureTA(), SecondDbName)
            Try
                Dim result As IObjectSet = _ 
firstDb.QueryByExample(New SensorPanelTA(1))
                If result.Count > 0 Then
                    Dim sensor As SensorPanelTA = _ 
DirectCast(result(0), SensorPanelTA)
                    ' Unbind the object from the first database
                    sensor.Bind(Nothing)
                    ' Migrating the object into the second database
                    secondDb.Store(sensor)


                    System.Console.WriteLine( _ 
"Retrieving previous query results from " + FirstDbName + ":")
                    Dim [next] As SensorPanelTA = sensor.NextSensor
                    While [next] IsNot Nothing
                        System.Console.WriteLine([next])
                        [next] = [next].NextSensor
                    End While

                    System.Console.WriteLine( _ 
"Retrieving previous query results from " + FirstDbName + _ 
" with manual activation:")
                    firstDb.Activate(sensor, Int32.MaxValue)
                    [next] = sensor.NextSensor
                    While [next] IsNot Nothing
                        System.Console.WriteLine([next])
                        [next] = [next].NextSensor
                    End While

                    System.Console.WriteLine( _ 
"Retrieving sensorPanel from " + SecondDbName + ":")
                    result = secondDb.QueryByExample(New SensorPanelTA(1))
                    [next] = sensor.NextSensor
                    While [next] IsNot Nothing
                        System.Console.WriteLine([next])
                        [next] = [next].NextSensor
                    End While
                End If
            Finally
                firstDb.Close()
                secondDb.Close()
            End Try
        End Sub

Download example code:

VB.NET c#

././@LongLink0000000000000000000000000000022000000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework/transparent_activation/tamigratevb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000000426711520622614033773 0ustar directhexdirecthexPKX28C{ SensorPanelTA.vbVo6~=X25+  Vhō"~")7i0>~ eyRlHSxw{{?ٟ_ ?H)Ɣ}[UUjR*EQJU#/N3jؑ&efv}u}$Pta:F|d{E Z œ jM &PV  dvRuͷhQuu\)kEiX9#:b &Rgڠ29@m@FY/#, U'X%0(2kamQ_Xp$Χ0GگMֽ~ |`3F?Dv 3T C@uT͈Fa0.oz0RbBGElOhgiYKi ז=Tk31t+Y4I,҅8βUg$>yuN8w;@mdo;]ob+,آv4U+$ FΤu^L(Ԕ6%UT);r]$/VWY7idA6>!V`dʜ`7d:cQF2ovw=G2zju:wa:z jػ_8̓nL\A&'Ӧ9-EB4b#"Oq?juW~;Xaoh{!NI9|P%V$neoWRRKE3mdbZqK/fR4L=+L+ r ԧޓLJ_.j šAj/s}D]xݕGZ*Fjyu9&v#2AF>ľn<*W?iX:--rvx~PK,8$# TAExample.vbXݏFGOI.T)UPzL(=m͚_!MJb ofv!LQM\-D!XW̅BݫW%[vKm;(3MOB]z$wMb7)g+nlj|L9 =Hs=&0Rv! zٰ1PiqtE`Ӓ @% H{"hf+&X#I KVpϸpnYLnT!ɹ*5%*)l*2 |w"U], Y%z(T,}#tFהo6Pi&{|>P3"ĹZ/$@!*s'yl.Xm#4!B1QV+e& -ƟkΕ;Ifv8ףCuMc,:\*dLXa<%!bԓ,%<`D"B&Aˆޚ13 WuTTVt pdBB)ճ:*<x"sUl3k[X+ծ^ jJTIKJ=F]{x{N YuPVc库8~QG)'m]a%)X(ur:+=! 2C2 RK:Ax;9kVvS,g[EWOZ[9NQG~U8?Ċ -)/k{kd8\ҖV'g)o[ qi^ PKdN{(`Q6xQ_ݠCR[R!0SzitKW&{h2vv2;ip!/l%̅~ڽg,JN" *"7E~]NpaȠ'{.mj} ;4=,W(mѸ$#m߂VG -:=> {PK(X28C{ $ SensorPanelTA.vb  vhFYJ0dFY0ԈNUPK(,8$# $ TAExample.vb /ݦOUܦOUNUPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/with_activation.png0000644000175000017500000024056111520622616032017 0ustar directhexdirecthexPNG  IHDRegAMA a pHYsodtEXtSoftwarePaint.NET v3.5.5IIDATx^tu9][ zmY:גeYђfa9 s9I`&"G"s&C!9$i\LO{CV:8~UnUoPUM]Ns_9]*@q@q@q@q@qM.0Q8888Dp@ PPPPPpƀ 8LTE(((((8Qc@q@q@q@qPp&"o߶_o8 =K8s%%_ICSRUoz:jii~G9.VQ B?|0===Jm?kׯ!Cp/c]B nݲhEB,8` 2uIйtBoFhFIzeX].ZHo)}4 qnjӉ=uuEƤI,hַels&f. TVVfdF&{ 58_|'|BWAA۷|@o|:]Yoؘ`;y+CAy_]}t.]LG+81a/.tQ%«N81a'h\… EDB}#>,:]0`.@iivEʍ5̸oxQ0={ 磌rΥhۋWjp`B#pꎺ(\Vpwb!:G^^{ldj R XKKUchLEFF҃ ,kf2)tguI(81 ve##Vd&{ΩSA/WpZ|;Ąo%\Or@]8Uf `**#>D !tE1N/pLEQ.[%`UW䀂4 VqF>:'T}h08c*#BtFX-人(,>ڝ;w!ac`1GP>>#{!XADw4Ԩ;h{7%\s"%ϥvSmze:Fta'&oL %q!a{EJ<)zQy1dfrn6K8!+>>yĮ_#""xOƇ!-HIIѕOK8H@$KZſgϞoaa8DND3;z(>v Jr)xp3ڰaׯ=#K8`{n2}tfҥ'Ç/$rd k+ ٨'/ W{KmH LJJ_X)L{mc X>~իW}F_rl@6C,ċĨ"UnF9b '6/$#^ ؒCq/2DW4_b/oa[}TTT7 3R"-n]W J]Ov_C$)43];O^́}M0sND0kr_ˍ^K"(Ų^ ӷ:ɚZDNƦSŰa$VXSb|bWۜwWj\pŧon>oW0i0l%c}j9WA^t^[ !6"ҹs<8uT='ysn5f/,ˋl=%<6km˚guEyɓʹ‚a~N骽_806L]?f'j 'l&aEf=ڵk_."^'%Eyт*rC*EvB銋3I2(nwǎRu:mow=_I77 S€&q~)ÈDN>mBz%Tww$U˺MyHy?2e;vŒ-9y{x|T_*J9wd/(V%)_2^ׂuN=mzmjN:% k/8V(}_ yApw;bB=RҘM\C ,7[%I*\;yd)^J~#ټ%Q5?AaFJ֬YCQzݶW:80sbV<8?Q‗sgV-ePpb<% K/$wlsd>mviBV-h{O/Ɂv8ɻ7מ18vWʻ%={c]h-D\8RW䀂1vuX|LٞN{P}"6?Jsnnn(?\8tuI(81'*{}` N>+TzLajwy+VENG981 3Ι3ZBh Us}" QMPCۊG9'w6|곶}59;1%bHߞY$|Heb~Qm9C&%?OE@HWNs]l >'F턝\u%A MfH38K˃ nҰ,#}Psrtccc]5d:bȾR{?WRډ(٢(-gb.D8MYbyQ-nF=B2@~Ge$pz4s 9CK+y6BOg+l!"F$*Vpso&.}%#J"VƎ}L/ RSSh&K<إ\-]0hUb{h3mNo}[tz knǪglz\;HOOg|6iA*y/B J.+֫Oۮpb-^ w>gFaE LJ:@TY~~ɼ9ӵ ) 4N}1#{w+ݚDN<E1y4rN㈡u'~S֘r)J;ʓ*.E iF3H=.&lX; pyyӰIC'mS.\VTpp%  ?R{9pQj}եZE;Qfv8!SEF3H=.]M.KLjrq$]CC N^%=^DALM;՘unn!,Lc9}}͕>%`dn Č&D%&5 Iϲe{]O8Q誒Q[܋E@N"LЛ !vz1'XLqp";*A.]t8i0YFblI8_,ĠT˗,;+kD"p CsV)GPپc4ƛw:o‰qI=Hi N_K YVfќY2xx`RPpҭ4]hzz^4{Bn9x eaa[S3i:ʸ/56*Dq!(8}pyv ? ύO Or!cE2;@ tU&.oKW(t!n_+su*J; wG̜ᷞ6gV{epajjPt$X]Nr䳷W^'5b*)iӪ CV,?{׮sII~r?1¸x¿%?7>\2se|b\2(SRiW<(w?Yk]Nui-x(KD\6oHǖ. ZzdĴ]f߱'X1Kkgs̗M6jXblLE($oSp~A:=F"u-H5`jbIW Sy"+[WDdOpY-o5'h>ο`wv4W5\I^n7£G۷['O-Y"OȠߧo皘ۿ_-~jXM[X FpU]fx:dw՜N-]o,v|h9:24+NdKzZY]{:7mAVް88*^'>{ҧ-n=Nr"}Й6`@I!~Lœ~cW}'95Qos?_^9u+L[Ř9hE7zƷS#\cN鱠%wՖo[JHY+2yE:BRW'Dkհϒ^geͱ|mRPOr ^'^{a˅O*N%MП/i'U'OʓU)<|HI{H6nȿ~c~ 8~ggE[: e6xJ_UtwۖŠ5kv͘ u+'4Mgsa7܉?[6ߏ~&3m6^%$ť %(kp٦{80c  {{*b58ٳ**Z&]v~?IZfdK>I N\%upr۾4|RYq)MNUrG,¹֯*rw׃P*6 {FKKBB~۶9r5ayڐ^'%dž]v% 7nc]>Q3Pp58z7>j(;[0~x7rߏA\;CsK|Xrv׮s΅7f) X!kgz$qs($KO]8$%M%Łs%uCԋlOh KW,(8}8||RBZTvÇ/^x'? 0l?8e@% ,ɫh5#+}o L!CBBǏqpa>}ULLLFFeQ ,i)D:8i|ϦO[T384ɓ_xs~C`@'!qc0ׯ}qoDgu~<944pr|% PAVTT*=qĦÑ`#d?T"B2JmJ*j≺。> N}wiG#>}͛_<99h'A-g<bZs߉ rPt @`UʒBK+"'V4 Бٳh4|,ƅǫ!ePpk":T)iB).mWH -׶RWW28mJ^p:Nh8 `ՈÇ1^'uUIq 8[p"S*myUUiqDވd=&-aLj<q \tufgXڅaG$em[g.28yN%@ILΞ6yN0It +ykFõp6V6AycS'zͰԮ< N@0)F0 v^0HuK[]Ap:ZA)jԏեLkREfh|ՒF8r֋,)= 'r-צM<;VRpajRظ2E3`S 2z?PPP9pafDPdݙB#$^vCp =kZ5Ȭ5.SymwxTV%/@ Nxq! ma]:dWXugOv^ɩqN cJ̫VvA,N.툥fY=gObny BPo@O `5L1yLT[^)kſtDFEϩN/;w>obDKmC^]ee{.Jt]ۀa3ܳf)*݃2m_VxB y椂'n@ RćNKڗXO/k7Zw @N3pmoڱ2I[TpQ⍳iEk9`N:Gggg/[-:Y-3ӱt%$Ȩd H*kGPqu:9=t,Bz)z=6upR[= ']}jGmc.R㒅p~ZNNpyܮ,y ZtmSqH0xn䡽EXEj<ʢ2mg[*89p"ϧ<8ۖdoz$QON0 QaNI-'vw 2EJ[. I,QҌxw(NJE( Jkݧvqvf' N f-))IJJ\8)5%*->ήT=}*Fϝ 8!F-Bڎ==\4_3 /Y$w'M( T[`ض-MvۧΠoM+]p"j'/>Ӵe #!OMictermcNHIIa#[)-C ے-kȑ;ǯH|䴷^#%urzyyyHg}BOKkWST6v@:u={>icU3̜;kDdeRF(,p"@k_(J^:޽`XLL f0Bwt栰>` %B2۴h^6fUKX5Pq1!j[6HID\qjiSS?U:[]ު8y8aE.a=qx.b>m+G3֭yϊ%6& Z-v>/pezހ9l~1!3mdϚ?Ҝ<(ČblGrrnۘ_FNb-Vt8hsnjJ\zAn: <8`Nd6 \Q$''GDD`f9~C8}G=|LTvNe( o ޏ7E>>> JIXXv9,AKmk!fdQM<(,!&3iƫ-mL*^|4WEKrq#*})'2;[ֳBcB <~No@B;ul#1,/**?Ӻhdnd֔ivۼsLX18c ڮH:޽/zyv|E@/‰x ^ dwjj* r+.::uX͏=bc|vzY\\n6"3(Y渒Xw';`#lE*h$ *N:-]6jŤ0[ᛵƞ Kn#iꌪs𷗕eMkow 09 T$oM6F6oUR.䕩4\a Fzjt31Q;\(=PE bG\tPJv2&]BFW[jU'sMQZLGgy]F'wKaY k˗(b^!%:(Lӷ23eD*y+ϮmL+::-Yફ+u;rHoj{L; 9T'^$$&S\#j]"[s! x .O,]'ky-2w iIhd8yPX֭BP,JG`;X2:Lf/{*)x<NKd_tt̗ ma%&SA]Y{t17l>5uc NjъXiVAaрSh`&eNZ֭5 Os|½uCr cM+8Dž (' N 3uKΌ5%"d;Yv<䕒׾WJx\R((¾'n5P^=Qnp]< b=م&6#Qڮ=)8q(ٴٵ8I̭rdj ۓ0& [XtcG 6oJ`ʨ9ׯ-:[HNŜlDqPLBM5ԉS9xjHIGv>uLx|0$TgB#Vp5]qZ\20VB×IV'cgfaDf+3q34D&"ٹ*,}t(Ϟ4$0U"&/pa ;ΛˡRA[M6ȁ]gqPؑ#GfK0%g /;ck 6 Spfqyӧ/_ZWpCDX^US':u1q< 9qٷ38E߬yDyA qq*rZsV6搰GJ1: |p񭺼.&TA`SaBG"J:i'^!Gp$Mי8́#Z70@81Q!YLPִ:HM۶jkn48y<*#t+(|b"4;c9#! g+A D'9\ pL{+%Aipm#c(='BT"2PʷQ]CPPgCɘQO|}BJ/Oж\$/['8??sD}:#.AJzfM^TRS z ⛜.+,))q+@t4<4OX1% !3 .N _nJ^Aj /هqͩ|]| y5~\xOlbWLԩ+1KWΜ..SU\+:Ͽץ"V<.QJl_a&dUǙT4 fbԧ#M;9Oq0-a7D[It1"kϜ!&*x=&*/;:1Qw"s1΋tЧēTS,MbZIUݐy󚑓Zhe#NC iL5;xWw9IKAf[On@ 6 }U).5DaeKLnj=&jl^"bFÇ3}/Xj1wr떶:{Ӄ`J \He>B&!;hs^Q8τ|Y=m{[(aF3u2H\עr5 N80 'FLLY,e"=vU؅@$xAw„E]x5wܳg޽{}||`cbEekv L{P8|e٠x aGT\y.aBx q}y`r1-i[t=1vȲJw\^'wZUR0dz.3tݶ `c!> 5 Pq*0b:Ml-1D6Xg+ /}$i%mkRBⅲC\/cfaCV@zDc E9eKƶb c)Sp? hOGډ3Aat+N|E:}E&W,D~/yh2xNǖl?Ki{wgOE_]XXh$  9̅}iF{O97iFPxPjHy%gޮcgrrWw9zw KCRݡGX4~! }OQ[y79LHpI8ѿs*:z$Ɯ%\`EZb!"Ctk!t 6J)BPʅ!G҉B#a*|t%Nf%-ҡ[bgXx)Ǥ4&nb0Y EjVt~FMEҁ"{GI)8q(ٴٵpNDʗ%$.Z` Ϛ8( @d/jƘ]H>.m{U.tes@jY.9;blF8cm(=xZiJ%`i`hTɹf9F;TgN 80 '";K4ҼukLn[3w6gՐ<<̢--vteU߅69*ihs\'&i&ЌyQP)&/Ᏸ,I&X9e?.lUVjbwg9@Ҳ.Xt[/L AI{<;ہ;&lKAP 1D/ˌclӦ'dg;^%$PBArx_:aщoF9$?^3 7؋LTky%9r;z9` 'nွpҁ%EEm[wT3߼Q !yej4ߌx%iEz J88ٺ`&;}n 6 @uL2v&+L,x[i"}tMs 6O{vdJlJ~tyiUIq 8`/ <ض;.h.Y}2!=c"8r>LȡmH%R㒅z.Y-qȥ?ԉ$xtOHBN*X$nXV&؆7'9X/Ջ=0vkJ^Dy\cԕHB}=| .{&,*"#8|ےM|ǑHg"ljA(ؽ3wbd˝7'׎sth~AY_Xt>og[G 6f <5EݭL0'bO:}gFNI8Jl[–z ё[^B{bPIWs ǯ2e{6 ]\gKĉ@Ƅ𰬱c faCSiEV/B׌Niyqq9 ێ+vٽLSeM^Џ\c =3FNn8 NѮڶ;:LH[>{LeDIӢT׶_R=mJ*,HT@U,HҼ7wɶ%aăb,!nٝI_'25s ((lnħ֮q K[!ֹci;ADَ5jmlmV ?-SVhXXxvat[$D?LZ/,{zwH[Ybя=6Nro80 'D&8S&wxےE֢~6?]GA˄W.pYoUXSotE8SWR&4fbc6uO<ɼ:۷iAbcFp0pSTlf7Gw$^ryYXh^Օ͜i3cFffi3L DBfZAOkLz~>'B"'clyK͆h~ܽ 8f;ljbKCO_DAZ($<%Oh IV-gӘ7yO[aɔ׾bDA@qv%;5'Ԗm"cԝsޮnUIq 8`NmׄvjfےYY_$'s܈x:F`gK֖z8sɮr ^ LX9zk׮];wݻ9ח_9ct(/fEFhq\>leb\rl]^:mV ]JOChLcF0n׶XNyq@ӞǿdP,Gw/@ )셓Un[6#MzG4Tt܎myDӴZ1lZXk)1q*09h!;ay^\DQyET-㿨]NL{ ;7s/D7M6!ܒ ѧ *V[ffWdS'ZsTR qB <6-y&%k>d{v^;vi1A(R% 3VBl8)h%@AqӠ#=(>>p"KqMFA[zے7!״|e29lQqw=q 8ɼ٪pFNT B>=cƍ`fC6\BOnွp(p S% ,ٺuU D>v{%$ I2<+}wzຶ~$ 1%i>U;uWtn9coY|bŊm۶`bpo*)xL‰,/\ HXjL8ӧ kcݵ-qdaّ#GtGRCKp/# cp"kt1b1#sES97mzN6eMohcJvѺקԸ5a%53m:KA֬IМYz.R3sɚ|pU;pP5#Rv^պUjRf1`iɍ É(|ƲglCſ}B#˼W *@"Os ;vKH)f[}) _N) Ҭ8EQ8mkKI)>4` 71ÇYѣ1V`Uqtzu6pdOtLjgdj?5ӧ9Ibkvțͮł@__ \/pe+{xNA/KЮX5`݌(}7KMUӣG #i P5k(^y+epFi5un_8aj }ݻc봓*)x\ 'b'xˡ[eoD'Aܒu4~9 x_ 1M#9tkޚ9S>LT_pW-g)|8Jn C  R%S[4\L 4`U,:M evEyPpI!7rp 8o*5HZ4ԪUX0Ȓ4ÉHOV\A=?u*LEˁh`Px~k5/q4XNO bH\(`- Ti.iHB)ך۶ɓDM1#}x$[Y%9nwX(R{@u3b2.b!il6j OW\9nI.D'!`VCq:<)_} :?jp- DQl:)fSs֬ݿ0>vy:8Iުpp[6Az(Mftpb0w1Κ?Zi҆%3M[7iY5ua]&#5!Dtq,.2;r"R@wUk.u`B!\-꣡FeN{ꔽzb݁I N@0)F2s/ \ج,Bv_= 21,яm7SEcTnnꕺ@]NpTI"׮dȜ5#,PXJ KE-Д98c^qHBLİD3`l4,<{>&%e(AŁVЩUpDq-pe(c1& 9,/2[A)KU @Kf-(.8#S"{b&XR9m`^& w6 q7lT+HIV17IpBwfDGG0 FȞ׌H5.;[xvO:&mFR5ZbkBEfgP]H` 7y*e]=<0,QpI!7rp# 2QO A\صWtoc]ȒE 򲰰Lj+9Gʲ(",O-]oqTDE.P,HGI%=n 3ûZkJ^p,9v ز.nx"@brLB~Oͧʂ1#5DٹCv픆BKX2ُ FEh늞aIV˴#H83pbEIc;Qtf.mVWgozEC>j?l+x]oʲlKZX!X zQ6S(uGq-y8Wʘ/֛QM^UW;J&iN{l((y%  NzQn{$^kUIq 87DTeK*+KdD iP2um?{sGdVeݓ{^ cF$r:yX(乕Q.iNepr5A%@߀ڑ/ NyGFvDpDN-7 ?6I=PgdhvjB(1 z˥D[87)ďG!D:h䲾e1J;fQR;䥧"@8E^Nj*kF](~&'mv^o޼y˗>ƫ80 'bT )q'";v,JH!h?%**}xvjI14;,̸U;XHR@X1*yGlpe\^(8Q%8Z0O[tfu[fct,]> L0ցZX}E$'#Cލd /ԩsicة|-NCJzf D 8ނ+hvd\ȡmlPj\0ߜ[(=HZ݄(^®:L^ʈag7nH{71 B-إ$]mUIq 87Wp"K+<󒽊Yƈ AUOʪ/U'wjIڽKw4INNJX&Nwz8(miNQ=UrN;ڪp2Ʌ̗oۖ_ 95,-2teRMDC;{wjIݝ.{DDFbׯs y']>˗>}cH0W%/X}NAʑ\((G/c+3ꉯoEzyʯvfA7wϞ=Q)wjB}1u+͠70uN̘1rD 7m5kvލRrGN\S 7}N@&xB.!?+b!~*M(8Qp H<1To߾e˖͛7oڴ a}Ic?,,,-wjAa Ej#ȃ?p 赋Qp b $U%/@A^3*PAݲ%šZ˖Q_Vfs=VOnဂ]= ʑeKݩEÒC5nK\ry8y.ic-+ϊHr@NY*HZe$zV5HXz \RIV&DFA!,Pe*7l0۝Z΍kzvb- AjZy8ymJSpI!7r@ؒa`ڵk׎kO>bDrrꔝVر`.C 乣./$JJ^' $Qb=5$&,@e֭Ѳq 6{ܹ}yYc} ƭX"z8y../rkJ^'J+Y+Ջ#P8XByTgb/E‹2kq(œsS]UOnI85ԥ>Ty6-@ .f-ڶqq2ZzKN^0ZN/8PpbC$Ȗ-dHlYDn`'D_9&{-'.Lބ]lRP_tf'}Nt/օPw]"y(\X]Eyy=97^'|. mz?3X./K}nQ}N;^Գ}T8;.AS$XR,>~.]FǹQNjxІXQ N.yTjj Xr>WWq.>:$Fy!@_5{khy@/|JM-!5swU8NtǠpKP]5{khy/{x8@'g3/wU8N8r߲c"+Bx eC~χoیOyWUP}/_fw >;~ч^.]F}t;mٳgW^3gΰa<Ne޽5<<NN:zfƶGP'7UE8imm}9bG2♈ī-pY*t?ޫIk'Q]^āޅ/˿K6:kIDdf :ʆ۷_~ɵkJJJ~^1‰]%sYYي+`Q@~>>C/ɯ\l. mz]}w-p+'G8׊p<~3eVv{wՇ͛%+6,.md $ s~5_T/]8a$Ç.]*,,Ħx??0a瀊N˗˸9sq5ˀOS;d1|w Qe 'ٳ'Of7OojjB~o_/>z`ۗ Ja_B.<aTa&^Ŏ9,J!VtKRdh}tAeC;aWǷ0z?3ܧv,'e []s{˷c=xh=Pߔ;qa'a{iF3z X<---%|_NGH'QP}7-~t`[d޽{!%v!2#G@< tP< ݲV)?tqtAp4# : _B\N>wwϏͣzb,&bDF%oiƦ//$ 9l2Wqƌ'$/ꅔw=vU;EQ[h#'4X<3y f/^K.$ ||PE b9xt' `e...cbjjΉ z {n,<>|<xøoiiN2FQ<'_1OFDzF2%Hr܂lXiu.4_a#)O۳]W74﹇Nlo_9 F璁ōHS0$'Es_Tg0Rj`3].c["ŧj'{NP>V^_ϋ-bd24֭[KÞ`6]j'X ܻw@6 hٍ6/2Zd k a-/0H%Cds^]֝hfA4b!RIثE<`Ri^7.[PB h;`:]x1D W-Cv Bϧ~ TTT:6k< ?_233x [~ZgwdccR)XAz_/ĘWc)%ik4S6.RLecoرc=f3,51Y[Lz7nX3n_zQXbK;`XVfo/]]Q"8q <_. :ѵ#!@ee2E>K7@1be:۷#oF>r@'_b<ŷ`B::,ƞ>08$؂\}Lz+.@ c,YډLKHm\CemETRGg=7z]cwJOxBw+2:͏UvXP.ۨ O@WBD'(Ufm ]_sДo vv1kr|!@˿7eK,du9)%zT'SfXih6nS$%oq#c['Կc-bsOL/VJ'klԮ? 7Lȃ}>5(ZjՐ!CBn…(LNP$>$-Ƨh$w w '#_s=.Z! PZ,'|6.tE,ǏOύEWk7:ep*@O`H+]lFvQNCQb/Vqt$ԱM&z2ԱGI|+ C@ lGA)g30]w>|Ѕ={AF81RctdM$}*?G=7~ >sd 2(YF?QpdMj/q 'O( :;]_id̰ԵprA_2BPpq3fƍL:# N2fAa6`e:˜)D$ 𨋨8 |:n{dXsC6b_aMG򄱻m6L9@~R2UR sam|bxO˘W╮6Y.@u>_"-fG($332J) aSG>2w4&&r5ta|f` pD #eW@ w.[ZH 9򥖮+-k}OBs 6Q']n.g]JHG??T쥐jha%G3f#Mt#x:bN,=%]ljj)?)syC=zT5(QOCL4 J,2V'[7ʘ1Z)lרsr<\4oNj:x%`ā*ꁛvT;3]ބ5򐡮F3‰nMRim weug їdmQԙ+w]z_*͙ ޽5(u{V86c{sU9x}uwGmpijwÉQPPPp Ndz]q@q@q@q@。5\'.`*Bq@q@q@q@.0Q8888DŁw6decclj;Ow< NX4 MxQA_FoQd1cVtvob]l)U&Mn7Mc3^-Z'66VDL#-=7Pp7Q8`}>~D#2'D"E>~~]%oTTH޵þX~Οљs40u>ut1vU'quց+8Z1bEYQ'8 @yرc|f&IDѢ8 ؝ `* NzBx:<` b|LR"U6%%9jtsoog^^ E‑LFGG3=Q]~ <%%춤ēWs [yt'5\.?0G8Zqظ^x1|Ç{Q+Q V/[p"SG8_LǏDo)q78 GzM^]‰`"8І" ˗/޽G@pߐ&8гwAAaaK8/e\ NB*" W-C 'gܸqW ~qh>$}ܵkػ<Nl*)x Z5)|~Or66XrE3&x.mUR 0\` O8͐ g}wP"{i6!e%ŋF2Qp}l{+Ĩ"R8peviޗWSS%5*""≺<(eN:F N8t ' )_Iߌ3xD}Eϟx6b2箦P=J/S/[8p N#6lLݻ' SmUyCJAN@n"FD+aۏ0+.oWm:'DDWN:5n8f|@ [dW/s-d֭@,\z#F8r䈵.b *J;qK)W a~w~~}:Ge3ρdK2ꅀ 9뾜G' ̙3'? m'fĉ| ]twTS1EHϽ N߅?o "qC]ք0:%V“SAg1 N7d9oґS{ ٟ[&Ō_xVo>eAf˖-;wRHjq;``\eD9<eY7ؔ_tkp_32bN- m&9_ (puEFyc&U;IK^8sssYp{+3}* VohG9 ȁ `Fi '9*8 |!oYv̾~Ը!KlxQ3 iﶽk!)V !o[cw=L۵TVɻ5` "PNYjF˵NcG$}S%+8pRp|>K[ٛkV=j 5y :&ɨ.88K.-^6B]DvѠ2wL.*uρ'oxBL^UW;J&Mc^^3?>3sTp&+f\bbRPpҽhd/ \y}鉝|r˖UV8K yZ׮`\Fe@0__Y>V^XzǏud &xB(8q(ؘnr~lgUWW'wNn8ʯ~Ϟ :'_45?(Ϟ>;VRp" x] ]nO'XS3Nvh`eewN0rt)銀Z/pNQhmω maڦ, 7?dm5ak{ N\", -^/u)TI['$6Ӆq@I4>+ i@}"c!lҫJH99D|xE;.pY^2:kKv! N\Y N1D$e N,׬nt,9I^'MC:EK$E!:$Zᒱ2uW[v4cxu*O ƚ>ؕzO`6r(5.gsYz^AW )c9%\VVtKv¦EEEh<+.g8)׀\ Wƥ Wo[rY?g&(J&{ U NL] +>%%%uc AAE *S#p~´( Op҆Q#Z"JӵZV-('{$P.@Kpffuk۱ K]h'P9;倗gJ__Y5䏇kLʪפ~M>U%+䀂w\u',c$+:::igvNN)A;U L9{.-* 59|ڙZB"#MWV,+=9bz처ƛw~\R7'n+JrH-9&U N/'݋fã!?yu+YCcM,"1*]j# 6ߚҮ>,{E#Qm4[KXW\9ϡPDAihh "k8Fcc{ІZgRpgDSP^yoM*i!SX8mʝM_l `sOD^>5U{V2fy e(((dl0}ߞXu$^.5<pLhP;倂 'H.>/۾䄬Р *ƎLޏU5Y+dJ gsPaclS KHZr$KJ8v+:8v)) Iqӝ!I ekņز rN _;?nhpe5#KK?"|\叾u+|U5.Oῑ|Bsny!On]թsДr鑑gϞ=xc؎=2h{>}:<),** . .$i&mlQ]NSo=%]{T̅xUgT Fգ֦-^~VN~+h񄔊Ki5W3/v>ne{OT!M ! JL M]f8C Sk;_D3TyKkq 0%ĀaB)!%z!ӂV3<Pp8?~zRFAsRېpj5= ʧo.*\rC * xl޽{/js*bwӄ[S^AIVPWuspնSp' wyoCrbA +j?m-G¿yݸ%B~"KJi D8Y! yH$W;X8l$7 8 I !C)?@=ol7H}jT>_ҳB6קkxj۰4,TXۤ񻳥jTw*g|?XrEM3aTw.C1_E؆hѽu` + y&~'p"uq9]Ľ_|XxQ²2j'K` +E<{ܫSx0%wcM 녀NT;~ aڶE}iWOy௺֋10@fwM:== NxCJF5+a„1SIvX[h'(r)-K(]dܚ3/RDcU6Sob-U_W~LhAfU9:V9#r(0cW }N %*׍: P ci )mozjKJAHqCWƘ [^xX&8%NSEES;ϙ%d˦,<.w˚Dܺ3ĠP {g t媎m-(+5Im,ImK7mx8-Uҥݻ >ifʃ5H H{*+ӿڕދ_:gGxŜ۟gBV/YT'kSbN&yrcN'2:06Bs9)o;PsƄkI{UsuП)0vy_VTt[z'W?y.DE87o49ce,ä68\x&$aEz61uK3p"dz(#ys6i}up eV|$_վ|t/kxɸ?`'-u7ϛ,zӶ-y#E!nĕ5Ay'2>%>| 'U_]4L%7Et5] ΜJj:eM>x.}J!?mz{>/2V{Y7 'bp%rOkeQ)La_͓\Av,nl/=') HF*@{wy'e_|r%T"**"ʆ,YiI"gv[)>Ȁ5u_2N^4 '?4q5ݐ\@bBY33mrƆ [" ) H{/?mꖫ \d$ yIL,ki6.?Dqޅ󏴏 $8r<(n, xL:W9n\YwRo}Q8s'yd>=[{1+Qp7Lᆲ.ݦÞ7|BE[Io?.ݤfNI1.7ۮKژ{r? قe˖<@nĒu;W,#d "KNMuY;LzNVH x+k옆{z93m8!\'zzcx]o/>Upb#Xܔ\^?lkl4JL ,&"pm((ԋQby{dRrTV"y2p?%R< +, ҶE/7$oŚo㫒Vmʙ{_hFN+UiQrM Q]0p";!V$%9ɄC`Q\Um\ 'ުL[2ӷ NZjo}^@;q궺:ҭǵu]K:IN5H{Yy*5}i*G IEْ\g^4ɑЄcf5KOほD5i-X5y^X0ol1 'kAe/$0TTP[\9e$ak3z63%tmM,zfHW/prX>A`֯7Li M.D??֋NBc_[䗪+"|-6 ')v8H#6MI[c[[r6 ھp2p>trAN<|y8A(KOw+8~}y_5MF8qw&^T*%NEMeM\㭬$&vwq[P||6}^tm^^߸R}&{E=b5IJ<_b/z-qRy˪6%dCgON'ư|a_ /> # ʟwDT];eKjkkueĴx{"B)n.ym$Qp"(F 6B@l]ޚۻ'XEi~TnqwT[yYf7'̋)6E!??wg U铨}ZNDkf).? -KhQ[S𶷌]Lc/^P ;3u&Y^^.3 $2jzM0c6Y xD`H[#Gc*dIK+`|upɛ;/+fLFǴ;x=cЀ;ٙv̚FerA`#I_zVnuE%ː槵"S˦(fY6S~ "7v *yy52']X8ӧh laBⲫ&5IzqpqSv6B  BHh5kb_ӅFOspry98} ĄRް&.򫅧;O~Od9iRuzj9>Zh)v(zmAppDVVV(l(ۮrEpp0 v3g.@JYq2&NƍKhvan>Ķv6ti<ܽSo 76/_Zо_CmXDDH"ɻ*91̺y*#  >I-}jq@ke%[\FXV\}#b8p"|/OFPPЩۓ?4=wf&bihh@]F"YA I{:1y#v{v͚"jjjn"JImYgӉ(vAVeIޞ\aѾ:Vl/,n, j&imZ\ҡ=-a0vhᵑQߵ`u5'Ϛׯ%4L/Y߱0ei(FYvE-"Si-lh=Eϟx.pGT0D'a"^p/\>S-NRUtd[ vuӥ_ 3|4Vmui'2+BRFt&Xw,P6v(믱z+1tAo[|^Z]W'5hBK1E~F8G4\NHH@ >-_&[ :u{߲9crg]q}#u9hӥ0\0Lf$\ۙsyD1۴cƤ;|K:\P :Z- JK)4G_̜9mJ⅑Vټ)xԴ~Gص5Nx P\V}]qIA-${6=)l㼓!;-RԲ{DK߽(oQ;8 ױ˥^,>LH¡BΎ4gܢWQEa+gw06TNux+n%In$ + Skuum 5^t[ 4|y/!U-`r(MY7esU'GLOQq{; &dVe(ت{ebM@~AϝW5;sgv Myuc /p yd^t|jI " "ӎSFO?wrˊ k'vՏR_}rrQNew,@Dٟ4R/nr34I?aW$W ݅;+81yYy,jɞKmyF: %Csr_70vmW3{i4s{cFK,\C?JtHe Ouh*O5iw|txjmniD\i ,?hФ#pb๑PKEM+p"@Hj,$QQQΝT9{r:tءC15URc;gGkls+PeGPq  vW_>qt)\/va F3?AyNy[L3l趍u9&#vLJ>u`; 'dyq'UדK."I h\NM+]?܀TX+%AYA8eL-/3.<1inS9_B`hןVKn,[[ucMA9.!m SPAW|1|hKBu4ʟfܐ}G3hN?a{|i\"zU9(Oֿl;n5])Wܤ)dDmCy6goHvQg>>g/:yޚdBe2E2(ҧsuWެh||zS_[1͐Ɉ]}!L?f& ^F@-i2QM MsM׶U;8N bd3A.Vɟ&fӺ5Ts3ܚ?B_ `+'n5JoNj0m̗ &Dl.d%Y<"_@ N]S'hBp t7_㢘9ƒb]9,6e76 =%%%ǠPLS5.3Ft#-9|gXQ"m',vuHa|` Mv&9U63va/rqzJtVŽ;tϋK/7YFF[SRUU4}bQNp̓RIV _߰@2/?r?˿Pr5J 6}Sm'' iN AJKK-9ti 3oăUs:%N >wimEռJB3o|^R'GV4[/|ť/:L(lܑC莒9Sf(ZA-_xk ֻp"\&_LlJ+qKK4wk]]G1: % usϗ;OH*JН&nK]s~lʢPMc3CIW[5֪md?MQuQs1+EʎuGgggӭ35pyth㦚H:$cW-X\ՕƱuŪ3A#]}'bH;=S獢¿ f^rYDP" eB|[A)#mKAן1܉v!0S#yzi;Mh*!$ EM$Mp6^uG#4KN팡*KK;SUjޞ)$jqluR̉OHmH%c3 8qCi2("ĺd1QK.-񢂓N^_[]@bI6%GGZON_=a׸D V]OJǟ9kҚA C_T)@=ه_lwN_Ϳp7PC(M# ()@wrLSR\2sҽF:VUjG4_lKZYY)ǻdl{Hh3FXu=.iB NtwR~YAM eK*+Kkk6o~wu gӦ0IE^THLWla(y-QpK Vh{\^۾-+˱0JէUuw~'WrK'^N #r-zCXu=s=N:d.x_d? :3".Vo(J`]:$ՌΏ#]' fi!o*('gcǶ2ҳv{hMdNc"L!+V <"U7Rj1eǷ9gR-o 'Bmb .BFn2y8Gk` 7Mp'}l̆.A=V:tXSt!d Q%&VmNvk'"4@&tJO3Tz;涽/*8{S~eqٚ*JN1?/)B YꯍB;۩iyg8kKkȹd{SkB|Pm [J.t ʺREg4( 5JGvH24ߢ4;( Ӆ[:Xm-ON0ӳIĞ<%c;anB h)c87*8XtrlGw"8Fv(%'P=<ՓLzW% +n21SWjKۺfra~HLsss]VY6>81'έ ߨ5spۙmSFeTw] ?h6.Z˿ ^4]pi1Dݴ 5UfuЙu 6qJiW<N4oN^Z9'60]bqbbn.7|%:„5KdnΌ턱cXlNA^:IRNZ֭q1mtGi.E{[mupœݍnK V_ttgmy7(;뫾Em\Zc2!qE]Z~U9%fOm߷Ҳ"罽aޙ0Ŕl%?͏Qp z u0IͨzSpGȋl^aB>ͣj= NLH1QSmU^ظt%6"wLG1mX ź(j2cdwXV;Zk")^)$],,-;89XJQpbܐޅ+zVm-mC+hS vԮ-]ơݥkֈ<D^8)o/~KVONn,jS:W 1sK)9'Ǟ5;>pL!~AG6dl2ll.W5E6a;@@vtl/Yɕ,ї&j\٥ FD?'dw ORcDJqvu[IA{$l |~-3ә1_ b]$ZS^ǟ?27 * QPOGn] _]c㴮'Vψ: d ;Ena_[muNS,T2(jvIw;m8F5Mj'~ʐ[R:eAmnfcJH<"$,UUlJ-lT;Iޱ2o>$,] :ķ|wnN+*uaC*Jd?'t̴3mYΤ+OrRtN)&ۚ,PAR rA8E>:K2 <"hVUHͭk&>KЉgi-Ȗ^(C`k&P/QQ~3})fѪ[z8w ND]w0#`6r(5.ќ1eˢwsh .K>PCbGj+v͌m:vӧ9g7''Gw!y_ioTzq;к˅1mV9va 3{ ܕeh*o7&iw|`qnZI@M'do- >`uiK}&:i U]'':m= ۅSΝ%WJcnvZqGCS'N 7KyYTy=g9_vSe'tpk /=^wW'L^tEKuryAvNvGBEW3g9=J;@#<y8Si;<8ۖdoz!Sؕsu lN`ʨ9 6+fcV&R[r:/(0R>gЎ״1gN?ھ/LЄFt$Eh΄yG+k&хݑ- RB N-wS*a̺RxEaМ"ʛ7-+dԛ/ oﵖqsUquN}'JXv닢;-4;)euY$vr^}xB$߳[BΊ4"h~_i?~X'9]Zy#lHm[$p ؀{9 y` dUd_2a\KVRQ}_()6gylP /1DaXm5]4jD ^8TSmfHCd"]3$'絇Zu:y=iBiP@q !N LûvϟǡRc[;(lc۶;v_@ bXC䴫\p r;49V^×)daUoj.Dpո3Y~]KOlmwx?2Iĝ/]q\<4NE gydd>xl "D[ JIraS@K[f8Sx J8+ 8PRLxm깳USI<ɥhC,YՃp+'(wILq9piSJ$qvDg#2#r}(b .)-u}Ik$Aa\ &u{qn@R¡/ͲpHyDoaKJu!!jiedJ'mכ7o>}zeo+z]FoJn(]Nˡvтnӕmb]mbC˟ezQ|u5o:Zނ{?hc : oQ_Qf¦H@7Z;gЦĹ+.>/\^Cx>"xЫQvZN]eCq 4Z\b5kݑ2c,MDh\}C"wlr4ivְжȈnӕYjsGFF2G(W{W$%QD'$T*;kO<7oI>! (笸D/ ?&%$`\)˲&ӈ2i'Xܟ-8m-?Ɖu]_*'$Ɠ3?X E /7, HXNB GW PQq#u ٵCh'wIrA:4|Q@~cյ-hXf /(6??/1{a§YמA[Zٹ#gow\Ux;X ?]5L‰xt0}vLkk呰g7Oo?id̨'6^򫝡ٸH˗\0kvȼ>e\!2ɶҮ#UٹC6izoSi A\9+ԣR@O`5g(G?a% 0I;ǮwNVfIuU7t:2wtdVY M.W8TWgLNgv;{!{b2ʭ BXW%7sMmqhzy "_,_4\v8,w[hCmʁtbʵ%Tέz82H`~^݀(2wufl.۹w&OjlD|5sՇ>)h9>hڸޢ#Z++9zwDXROLP FڦRLly8Yr,O,S@@Ew\P֭D:uiSj${gV>s i4,q .NzGD#uPicve\qڿץf!mNw8/d) pu+P5gPMG*MӋ/FlZ4IŤʹ^5,(YGl1z-3+1]|Q_h8n U7œGJ;f4ךSZق:.KWwd!{9L,fI3-/!!j+Ho !vN}z8\r Nz;n$LC2`,1Qa'|lY;3ny ƒaO85F 207~?#LFsgp}ttݕXq,Z3y~3ÁЎ$_ZJY1{g|TI͏xTNX:۷g {.7f~>D\_j~c t2}s =8;#&ըhMO,kL6'dp7=G/KJ:L"+ C\åǙte0tADaH?Z#3$A/;x슁2_F = '4g\v,%_> #?0fw❈zTV> lvڷo<` ŕB$og}W?IDzA1TZ;ɱJ$W1t'ˢ;HYk4':i7+5cB)Y3>c2~49ii)곜 U^o Ϩ 9FwwG)RT+1̝6?;ʀf|Ys 'tDn]9|aP^}h7(+m4aظtoWzNDp``N*qvu(e ِ5l/AAA8ZPJpec%<ض%c;c"YKhB3q8ÙXie| Uw5%R`}HXԻ"i{;bC,imoQO/X\AL #.IܰTZp 7^tH;Ihܒө`Lӧ̗r"o秜vKqb{Fudwx޲'x D{&u= T *+#'l`4Li&%2"3w#Es/6 dz+Sx^{-xpkl`[|PRi2DȞд<3Qp"{?iѧ2/҇27_{; *PF+ɂ(tW(eE"!D1&S0:9\aB NfRL(eIEZB|V'IJbeI]R40z_iTҊJi]&E ¦+Ϫ\.5[6&~חoFhⁱJrt3)V}r㼧Hk{ ,%Ut鶋BT?\ef?%:(˚l}?C/O g5i^MUJWWhRX̼VB=uU,ߎH?p5N8Q(PZZu$dr6Naӻb%"CWU/dYJ[ۓ `(CTw(:أ0eA#}(|cփ\fBSJacɤ J g,(!7pDՁ! .ݛv?ZzRB@E $`L ٘t4[إUc70HueCE-mIK#?+oQ*#&*Xv.= 9:\z5̟5;hƓ9Űhɦ eF\nIRXS1k)̦,\/j>h/2?EF˚j*x+NPf@x'(g\oNs~םFgm+qu*;,'c}FN  UK3NbFCz0쉜3al>iXs `I[ O (Y;Lt`UbrL}u10oniGʫ6 /%dzAͣUQt]ΔTI!G^|I$ZTvj'_ekF:4}ZۯShCKaRPUPHx ᳷K!dKIP#c (y˻M^SҖ@w^p~RT$v;>_?̡>^}{9݄h(Gl:.h^sT!.&_6ծfx8: )L5ȡDj)b 1 DL]v l$M.n~mft,u$h +|8yor&7 ׎N)]U!/^ˢ +4HwLQXt|L{=zU(*B+V'Ѱ9z} E& N9+T+XuO׮1"UbaYgWl@l/4Bf׋T"fH@L+FS(mMK~DL O+{ӊ6Esuz\S*KK( m ~Z |I h* ?/n7EER$p?$@;w͛7s3'7۴OqY|(YK{N2fbe(T'ornH>hR&=ln?}2OWiO$ܳ+%B ɸϷ G>{RaImִ\~L`1bNY-E!/I Ի!8p{÷!/>%>vT]WU}YY[Su m"qZ! (:EP*@ -:ʡիˬ~C%{/^ooիWe0 u—~\;ڲDZMM򊞔¬-_l>pš N]q[{$-]Ztyu eiL[]db:u铙;lZdw64Aʩ;#]]-G(RnՖ7D/ťwٿ2:{}yyrW>ʭ߹l.mu(vҴ*{Sl[Y/۞8cK82k<`}]]1KL";L[SX3*_8m͡p" W6qE^6_E{5j(0Q'3A19lCt]Ѻ?xzN&-{E{R MV7x3 2b1GW7xOtTwpվ;_\757h)M?6=~P52W=F:ڃ'2b~Ё4#(|=A{6Q25ŞX(dΨ# wo\μzj'GLq,j3i%`BEM`˥3y_Um[VޛKf[/6VX6\G49^dֶiT3Q!uE9nyPA~-V< 6-e۷R6!Na#`&D Y,o^~˴,8@pWxMXwS 2eܩ&R)>ୢ* t1 7&Պ!tQ4\zQDtWĮwY+vO$ߛف#"&jV^]FBx5(_@ܶ `3#+}eP[*߻ u֥>Xw,c !lY(Ϳ}(bVj+"3D 8dYAuyWٚ) .J;f3izmb0e) _ 5,G/?̟uiɝ 7gGEe 3-7! Q#FjgeϞ=k׮>k9KC c>Q.2^bz.w: D8~!x's J?&!bY{WͩuE^c>+G#݃Xc0A[̒Ɏ#QQY__CT4∼mb>u^.t#MM!;X֟'%!mg~қsNABiG|~AIa ʰwA,ٛ۳jB lSf5*ޡFs[B'sdE[4#7R~xVE$6vtVR@W&8hZ'jO\"j3`}]v,,hC"bqμ-ߞ0),lS' DIHH' N"$Kw>RWD|3QiFtYq{,:~$gs\)(f3J C"8kόWBB} ðVGcA2X_ޝXѓ?-gsPd}ם h'HC}hcM[-iF/3z ɚq!yu+{)/'_!b)=n9^!L"W(hKJ::ɾpzء kVOT`AtсRRgMv1&Op\MKxS;o =VR~xyQX7}|g,gI~H h8ٖt /*zSW`PZMe(wj9boDYQe݉ jKHᣊM&{fT죠}J^)Kl0\,mţ9+azHmMh^ \c^9N|7\R,,h dB" {)  M%Ż1"G3-kȖr<07$cTSlCYYo!tw7d[_a˯\?@ [pr?&DOKn:s06Vŷ«Öp KW{̦Ŝ1``gMln1ڦ^x៷ZĂLx ;*lubv0DNh=Cc=FӪ@Lt\G\c.! ,Y%]e3֟5T|s"͜K++067Wϛ5^উE nTdzUtNG3ARC4m*Get# GZ~xzEݟ9/W%+$k A 9_ݼ)\!goM 'h cqәl <Oà7;#͆v!⑃w`@mE{%]E7MmdK[1eK)[m`jM< zR]x[v0Ge2t`'IȒ)P5,!m)R+GSagMX蘑 &aW495+1z!EIa45 R_ћo}Du])>NkG6M Ntbc<JNNNTTԁ+ =W1u|-% t +D{{{ɢFE ڠN8 F -8s8 6$T!74TqLo1T-Vs:[/dןJ>RS9s3T}OLJO(䖳o&jhR[|[4IpY[¶oz]_Ȯ4.I\K%ũEG XvxmrzKv9Ah?o/8~>r߰k~vi ͪ4{ӡ$CǮ]0:չ+ngps,ھ|o_hbk8X{ק 7[ZNdNo)_}4):wᾱPR/>}oHEljVߺn/紜Ϥu(ikmS!É,BG؏fW AYu6|),CFE2qb{ױwc0?pcT)軹, 뢀)5%0_P+H_ + 'Z\\\h#KLIb K a$dǎl.ٞ$f8'S<{cuѦ>r3jTes*ּsAUIDAT۴A,Dχom<|9 ж2q2pĆ8&NPIeᐮq_m*X8a"*eAK`kk+ J0[yڳg K0M&xZ/΁R(2aC0mNgܜl_ce3s@U.h bbx_sKK }W^3YW:hSO.ѶoN9<9^8^9*թur.H-l]s+φ;%aꋗOHy5T=2f- lkڡc~|vGʁKY4L,Ȝ<V0'l#33E_Q>7:JKaXz1StA:Iiw m' KTkhv/\ȯ+v{ŜN)F=c:t}i+`F:Ah n /8:O)B@D3[AEAm^?OTei>(0DT&(8- .@ڌ̓d1+Ɨbbb l޼9,,,gfO3>MK,2eԴc1j2HmdKZWv*&usgg,^ eg SHV pro2}r NPXm[pA׵iJ]m;xnVaPn˅Sxbv^͑WG0Vc*#_ѠAIE j4{xv3~% &K7f`| / ]e|mMم\]Nk43IJ*H/G6pVe* JPrW cO&5azZRjO$ti ߪcFB$QP!/Q/6i D@aE.whχm\ ۽[&{ИAj_RcNT]N@f~71s# @brQ R=ɮ}0|Z=IϥF!ZLj{Oq}ֆ86`c(8PL6%%'Gq;\PʳJ$@y *z^Τ$Zϥfzwz~Ɉz)ZØT8Q*@SpE3(B8o1eƃ%@r|mee#im={Sa`a`vm^8ȝۘq1cr X0t,iIBe4y6 6(7Ҧ}7$G{nu_G=}Jv&5yVǭ'?Ug4pP()+ {XpƓcs:AŌAP{A2&TY2Y.Ai9&IM6Ub mtK.&0ǯ.Lw T(0oot^˪;8d{.6l}%`~v YqmcfVx (G|!WD ֟I*|Ӥxc*A'&Pဓm.봽S--wj3~v |qYsmll$pGD Q-\˵ˋ"Χ`7MDio^J/ި x@!16㕱u8=7!jR" qpbz%20vpiLw*iD|*q<$RK 8[]׳&9O.?gc@L;fq-dy6\'˰ +XXa^ rۯfT˾\R;y&Y%fpN4z5'y[5v/7,ļ/>0{7=~g՝I(:D1.$4%({˾u3bJq誇_?m0*/e'bdo_Aھ.Uv uiɔIs#aOrq_6[kY !k$*8K1 KԒ-^N+m؋8"cr7k[yN]x= r[3G1i/g+Kқ|I:*Ѷּr)~>>tHWA88`~CDnUYlvfԷ8P{*w#/&D "ܼ]b7}FY<IfqLZ'&W NRm:Y|wlhp"FIsEE̷4/d{.+B HK 48a}sg6O*.달=~!UͬW{.AO ėF: ԞkNף2&uP|BX.^ǵ +b/b*Rd{QteHvx po"?pa- vŅikK_~a<U[l")3gSH{{lBBXOq#_$)NPhF\d@EӞ7Y0D龙]&}# ̀8 ɎPbjѼQ ԰RXs I'{SZ})ץcOCD ɮB V^F{8xndgQΆ5;9ك)x‰/)^`HKKh3:X@KI꺑ル{;|=˖*[=?Q[.x 5^w^0x"V"IpUpNٝJkx@~MuÌsߞ[Ym%+Yy>kU} >|ywɘkty,߳ɾ"-ڐo@R"h^M-gk=W3vĭ 5ERR*]ּ?2QE Y&>px[߿wRW1$߉<|{6>iu\ Xl9~鍂En/ zAYO~2w\}gYjac'bnڴ NnڵTJK =9$> C'}S gYg^Y-6#4O躑aFifFҾCyڀ} M&O5ÙM]˵܃KgP(|9 K3>+6/㟖鵴+A9}Qf6kF26yL *AvX'w~UrlL=亵ܿ{W8.ׇ2F<ŞJexj"rGUI8!ᄨ~=I*&8d/pW7p,N?NVpF˕QֈM牙 ,~&O=꼞VO_;'˱1rk^}xA.|mq^ge!A)rϭk fO1hH׍AiFġQu&oy%H{Ӈ Nu(999t~Q4JXXWZ蕚ܑFDf9%&+ {4l ܢIe?zUTFfOIhXѿhmJOG=CA/(+qQJ l m WB"pH eyfr7#CC:fk)Іlpv*8Mp+}(B|h<1.'6^/8̰].&NBubˎ&;(tв3OWL Vx#W)EP!ˉ ڀmރM㛯$NFùFvDa˕DoK@}:{na8gI_KZ'CmT'JP ^I{"(#FN*A+h%.<K3pE9}I*,U2J/0FTa8z*!xbvHC=],IWٍND`xeX\ 28Wز)8ŇUhB_Jvȇh#{%pΝA9Օ)qL3y~zRQVJrE@cxx8Kp"_ ¼pdA!⋸@MIIyy5{lVH` %wc`R![ q[x12AbP`ф>IQD+^s'P#_4Iub^MKLCh}-jSk9ˆڇs1q*&xXQ¡Ǐ5_ N&N#Bʓ~K,YG|4oՙC2oK4a ,"L'hIユVW;ȫlĞۨt'7Rw-6\'Uh2$/2j[Vn QVjN,{Od\DCa.q|3Ё.[lb}4wMJǨ(nl7++oWV46e Q?`ёdhOZM[ӓPn{דkJ|s+u;S 签dvʯ_GΈ3mCI):a\{o~Ja5e[i)JWKV<#a `3:6 T2(:gg'03S"_q38z;̠dddDGG2j')wFZ[%_n޷k$''0M5}JG?dƍH󞑲 4j*x8y0d}yVhڬ(-ʺ:e9.4vk'~c͔ Eree}sV`[[絤zWeG͹d5]{'/_% PNb(:^@)xl}q/U`` uć=uǗaiix٠vdl39 '.Y*0;i])WѼ;s8j:x tqmL4~ۯ''ʲvv㋌$!!!BۭԖ U"2k6Wk%'긭µwo; 'fy h`j`bLb(QIBV)YTZE̙3K*lJ_t-3AO!0H)M1YL!/ Crx=  O'†v1zNdw۶mۺuQ={0,x +n7sc@+q+В;.ۆkF;"0ҫt~QӋi \޽VeVmgٱ&fuP UÎu[M%M c@KiJ m"!HPd刢D ҧ|~k]XU2 $Wߟ|F8Y;`E )ρ,OB%9BVW5 2nV>p ̣`j$jS11 EFF"<61EL;(է#={v5ݼo6F̠Aսq% =Rz+P$J $?'etH?/"0cp`@1BSJWHSp TЖ>ޚ$k'/* !IN'%.Vmav!9Da+KH 48A=vjpr뵄e5pvґΛ]Rچ/T:'fUNJI'WBHh.1V €72BRbRY/O3c T߀m‰ ů/,Q&fзTXhE^SO>(l>I/5J|Rg pK{A !IJ$vߵ%) GNɆK33dy'D?ڧ[7" y/k.ϴY~y1ɕO O<#Zϧ/9!*VI#3cЉx,GNd $(̔! _x|1P<P5b!y%HÃ'ѳىj%Wf k 3I|]OOvHK3}GV"C^ rC[E {xK2C $0%$`N丑) 㕩x.b'KGAXH]sg1N$BpBW<$O$h4E**> CZ# i<+B9$n(O J/C}"2Ԕ3#uu7,8='XÇ'rQ#pEW@B A{†%hq^!ǗC!GѼ2!^1WB} r0D_p}ٽJ[HKBSEe-:xůAcM8(;ܫW.(+GEdݺu<8xF@Qs_3\_Opxr޾!>gEWd^k&{%;BhRD8HSUF?9$}wb;nk?}D) e'&Dص|lW`A=@qz-LzĄȀ0+tI*4(84+G_pO;p+/Yv}ѐ/9(Y^\hJ}R p8%>?/J=g9u/ܵ0-)?ci*8,X~+رCjKҪ…2y@$\81d-o iY=?ބBЫ<}eHfTTa ojLXۧg%3DaX?g)"**NzzzjͲf:t~vv6g L Af>PaiifPݡ%LK//fp( PyFCc%( XPAڿ N:G~HȊ3{`妈4wfGN^׷zSHs=N |/g;"K̸8F5cT!qMMMDFF|%E K@SNrh],7E$@eQeT܃'w:~8K_y|J#8-l/ת̦NA1Kܟ-NNuHaub*&`cڵcZg̘!] ]'t0o]倽{ EQqT߽l<~͛ $1STEE2κa@Ŗl?h;}]h/g:׮P9 E)%5a I 88ayo+|ч<9',7E$u?e㡹hw_߾}. nFoFDD/_G()0#8)::Qap1:,b"_mgId~Bgdd0kp$Dq!h⨾{ld͕FKӥ{]ʕ+ymmmÇV\adWp"ߗd2OݛfC\i4]W8!D! (2 2Ί#+7;;oWbNd - +SG<荒G\KZ7) Dq|u \x}rgϞW,G/y8rpWHٲeʾB3111`Z0Mс/L*eq{&2*7 &JChiD0FQnܸ,4v+W2ַ<)__#5kN'8& obOw2ep r. DzoI`LfD>9>KƠJcpu_'aMe^MMaYbgFqE {&2*7FZ)5 (D!&r/<,9W/" RRR!rʗ^z ~.\Zp*@K- D}u}t| _tuuzo7w\% 6m>#&2θJH6qXB)y:* c( xЇ,l<$QqaJ=s$ϋ": {<\Ժ UFQ}xL`ȇA0F96X-8p`ŊOS]Oy`h$1L@p9oK _\lxKJÏcqPZHd}B "q8Lp i%|Μ9*}Z"(6 l*%S/\DɑrIyq \r7p$S­hHSOF8UŽ@KSS]_b.iii̊a 0 oK?ٽ{J/QяYYϖ6ԥ` !\y`U G۪pgJZ,tz2f`C畬I|1Or˫O"k1 EBpIኌ2Fzz3@ S,,crQR ЅgCR +)[hUc!:(c} E NҴ2% ',^|E62{l g.r~yg9 rW4_lxW 6p. ȰDSpŋTTO\ha~F]ka #~g#ʕ3a.F CaS~Blp$4NdO, c Lm8a۰a /`x ݻW)zf<'gzYq,I~ʾS=$'G}E kD3"T4GҔ"+S r%f\a>y#FX$B cԵNF7`0diآk481/uc%begI@$0/@?Ԍ_@~g:z_|"|Ϟ=^r!2B,[D•#}ggq_ŭ!/ME(>bO": l9;)0]Ăa_ {*"a}6v e3,f KeiئΊ272IqCXl#='r_pG1 WQi}d yyW/r_VTP>2H4opbZg'=KN"+z sT/H8(+2_ !uk.b( aEcd Na eXr i@Zix9Qㆅrt/d, c Lm83pDXr3d>b2lh{ՈQe34 鑆A3V* 7r8S,0k{D, 6Ȓ t ) 'J_,#'1F%A4e65 odF1CS]SN5{pup$ >3驐F PaƂ.SNâ,dbpbLPi(H`jÉuT' 'E< *( 'ԩ" N%L`}K^%0ZP1U$`' ~%0䡯K8 /+% Tv.[nJHʢXV}Ʉ%`%0%5lfe =&**,8$l8YSw2i5IjH5#6i5B^J ,&1XvzƼ%Bq =&**nCYde^Ԁv8gr ʢL^J}ZݬG(08.+YC1L*Gau~͘^Ԁ, LXp L2[ݬG(08 , xJUX=7H N,eI%K (66Y [IENDB`././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_framework.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/transparent_activation_frame0000644000175000017500000001453111520622616033770 0ustar directhexdirecthex Transparent Activation
You are here: Basics Operations & Concepts > Activation > Transparent Activation

Transparent Activation

Activation is a db4o-specific mechanism, which controls object instantiation in a query result. Activation works in several modes and is configurable on a database, object or field level. For more information see Activation.

Using activation in a project with deep object hierarchies and many cross-references on different levels can make activation strategy complex and difficult to maintain. Transparent Activation (TA) project was started to eliminate this problem and make activation automatic in the same time preserving the best performance and the lowest memory consumption.

With TA enabled, objects are fetched on demand and only those that are used are being loaded.

First take a look at a simple example: See "Transparent Activation Example"

For more information how transparent activation works: See "TA Implementation"

You probably want to automate the process of implementing the required interfaces manually: See "TA Enhanced Example"

Its also possible to mix transparent activation aware object and other objects. See "Object Types In TA"

Collections can be also integrated into the transparent activation framework. See "TA Aware Collections"

Public fields can also integrated with transparent activation to a certain limit: See "TA For Public Fields"

For diagnosis, take a look here: See "TA Diagnostics"

Also take a look at the pitfalls: See "Transparent Activation Pitfalls"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/activation.pptx0000644000175000017500000022551111520622610031163 0ustar directhexdirecthexPK!\ E [Content_Types].xml (Wn0|_"ۛ}Ejul>=IDd™3=N3UFGY:6Èy{j]ЉPFCĦ]GmjT}Fs >44= r+bݾ[a^7p2/pk{E?>/BBg}1VX ̓Ot¡eCbqJCwTF4ߝ9BbiS]Spa\Šd84R~~CN4sUS3g(Q0/ASձvL3/d XaIqU$_ Õilʍ55_HYZTGIJ9+u ;R'kT|1)ɱŁl%,#80zxWStmWe˦aQJFj"ᣑkW7GReb`w0^oxPK!ht _rels/.rels (J1!}7*"loDc2HҾaa-?_zwxm U ^s1xRp bD#rʃY NʬrɗJC.aeD=U]Sik@X6G[:b4(uH%-+0A?t>vT<@<܋G;Π|ժHo@˿9'홼!s4HN.PK!K=7 ppt/slides/_rels/slide2.xml.rels 0DnR=HS/"D?`ImMB6{s xN}xxQb@7:iN-rQ_i\BܻȢPV_sPK!c\#7 ppt/slides/_rels/slide1.xml.relsj0D{$;Re_B Sq>`ֶ- 꿯6zN.xQbZV ț`5 gIJ ]{h~h\B<ȢPUppt/_rels/presentation.xml.rels (J0nV]E6݋{Dȶ6&!}{C+K>f7$Nh KR J] 0x=\qKA6%kq$(ǠQ;mPZێ mC /x4O (2ɶb`%]oBu]uޡ'JP'E!=A͓@ 4ML_|/C+'YFExΣ@6"*&<۔A\dpdd-*&@L= /PK!nWV ppt/presentation.xmln0ǿO;D:ѐ4"T:J{kr@TljlA~gciR b{JU5"gݔy(>gITOUHDBFra&a(qGx}\@F{t_?`ZwЅw1<|/PK!#rppt/slides/slide2.xml]rF}߈=  v2cۻ D/jAXV*ԅ`RKn As2?V}lכr_xeܬ~lmۢ^զ./}}wVήm.޽.ob]Y㽫Ms[ksn᪷;ɻb]/C\]執e݊4eUۛV^5g|opgOՊ)KzU}x~WY7_kz_+W7_7r3'C-?..o~r;C },xU,WwGݚΖ<3M8(,vt],#Է/.mSw[OTsۊC!w~X^ rQ,X~4v*u">;?+|KuZ3'oj}4O__RWxq.ڇ6t@i.FQ/o6Xw˶ڶD= :(kuPY>MT@bU~e}ɏKai(a]zaJX$BS{K*paݭK8qWB)V \V0ǂ BO4caA9O|,G2ǼrqQo~j/[ˊ݊L_ǮHR=pyJ56,Īp+m9!{_wf-.-YeAO<I9#ˢv,~b+ {M\]ݘZ >iؐN|ګZ7P; 4b[ L:0 R~GgaFyzOY!7-7ƛmWe׺ o~ [o]{?3~]u3B0_ɏ:ag,ދjmӯ lYU '.2_tqjD(G |Gݓ_m=x m$^4.&-[`R` }Aqg?ގ`?Nw\$*q}}z6//?0OfaXigfI!rY%ь} l }7tߕ&|d,w_E gxe7뭷虼C )1!SoL;"H~ gc?w%yKCFůP".A_J5? 4f!()gyKad=,ĕCe_ݸT\ǮK-k?߁*pt!"ey_2jȻ|CS-!@"R&F 4%692EȌ7l%JB`HLjքvOT/.b5Ήa,UJp20;?RJdJv0d9c>ÌYh#\vah|7qIc N<ð(`CtPG+pH (W  ,{o=۔qe2r gYCQ]6r0t00_I5$XٔYG OCg Ԭ5܍ s`h f[lH;s#;䘻+!v6y22yX !@9j{BvT>i{0|6;d wAOPsŻqDc 4 tQF{"+/RE,@E.PXa<Kċ>SB ,aYڙh?{qHNtHghAU2iAg:҂`ArtdQKHuT% i={p*jf t|ڂ c!l##2#s;8g8ǦP4:P(LC": StDI9R} $67u펞A J{?=( 3RyM=PO0qxHbsOH?מn l=f7D_،e,d| f&( $҇tsg!M 9NH~2!d$u]pO@wt^\4Q=,wB12fJX}z@W^̅l.Ө蓖K!yiG\fVV@B8k,=7jQ:y3"q ,SAډ -2s6җ`{xj*W>TݾCbhׯbF`7,r"۶/í&ZH RD&&̩mۇ;}b7I}'fFp&+NHTXga*giBf:K ĝm1݌*>  Hq;!c t C4 e@!#:4Eߡ?! c$C5N 3m CZ eYK!~/)d!3{,baۉAہR4euSD>}"f6Z栝(A'KnrT^8N4&U fB6tv]Zn3fH%6p-8*6 UW6Zg'2`h A`.; U[C嬨3gwtӶOώ5 EsF8PtбnT= 3~fӒɧ?{@OI?%仩&19!6B%!#wfnC'1 nIxEu(˲n}}lV|Pk;ʃ0ПpnՏ"/zm+^xw\<%Ɉ[ȰW v[Ôqhެ&.`qڳݏ ā a&yßYu5.\QSc\5~Ϊ;_ٶ%Wx՝T8Th窤۪Ǹ0h:]%~ G]cK2Dܟ:խnN9S-,yDVխ9cnaڑ;O4OPPFzOljG8qauȷǝGGgҮq7)<|*a׷.F;j\_\'2>$㥪 8'!wJ<- *Lqz嵟JM$̌$U&Off8}PETV-*2kaat]˜!zSNIk30d.狏ryб>!h?,A.r$fW#X@#I!ݒ/>a0(jZZm* T5eOZb&GnVI-mK~d3_h$%DZn1rJ+fpؠN¦ P^:A>Hst^_|xljkn6{ص3W{ 橋[$PFlɆMXnb Hq}2nCD?UܻXq4 wDUW:f*Vj\r+%~}M4 b,*ڍz]VPIBkh0Oj)Z+ޭ[cγ$KM-$%?JaA򥅷kPO֣wےאGˣ :wܾU٭sMK\ J's,គ[jsLhk]dۭsM\`8_a nu.: umT$CAhUĪ?hT'ֹfs^ &(u ֹ+6H~=Q|@.H'-g"ϒ̐'EгGo My R7"4BMv\C[B;j^}&r, h!7M2\ݪ̈2\,4vO_Fu9i;=FwG)2t CNv<|(Ev^?߶Mio\Fk Qnd}Ӝ+tRbՌ =:){`85F'YxC"1z XtZ|̟)Qʀ[v)9H%)hXV, aw@d(h8V"5m5 >_ͱ}^-f R"~=b_V΁<{*&wjvwRhcx_hА+JPo ¦QCܨWz("rTHک3UrU¹L݄#*&+J^N)*C%E1S;^?;`p  O)Ċ X)钸8 j4S -퍛#5Iá'F듟>DE3(V릅)&mWe bH> yrxf[RSb /:)xx&S> h$ HP |R|=-|?v]sdc~.o7秇4M?u/jgu1ƴ 뢺5QVa`b7ͪlohYZW]?]V3¼I]1XO;ANUna1 h`wj,I6E͏Ԧ¾Xw1izE=e^]zS{ߗw͙usAs@Q,͟w^(ʳl|i6JtQ]'1r!1QB,qL8Bzgaq0[>hХU7QE~7Png懇[br&M.& M^۲,ÃR_N>kIJPsw 5B7Pv_?@[_ܨ=8aqjRq\"ƈi,ȉu5J">߆zxzq<)vSW?pfyc6Drnbeg[oMY"I=SUsq=_oŶn]_p>#PK!Q0HH`)ppt/slides/slide1.xmlrF7b{OP8),Oxd}{hiϪBQPnK̹%Ǐy2׻mU^+'/f[]*Y9&+7YQ)߭׏Wbrw]ݻ>vꇬ?w:P]7zm˕~vW:/|w}ܵ{{F^+[(6uOKl7xVN=mY7,q3np]{Oᛯ+6 o?.ʮύV\w]yPzUo_|ȝ3.8xa>yIQ1&Ox"nr5na@0=zwy׫OmEoP]nDu6O>(fzJIi~SΧ^e5PhVޚ.?~no,xԼB>rUv?l˪{ˏԭzU?^5Vm>n /e·n(vP>㊬Q07/Y_ q_/\QgNd#?|inI;$ ޒM7:+;蝹/}m>0b? { ٔ/COD$ f[7d0Ӱ%gSAl6ﹱ+6Cr&>M,iK^y>cG>:eE O$o7A0N5l/:/\Jq8/f.:%je. @2EuLa˦.P'6 0uhs9ԭ?t{C?acsS%F ah2P5#U/7퟼w+!ɲt5ޯٳSWHsCdpAX Hw? |w  ?"5/;atKsBTt3PMwdr4O(du]nJuLL}[尪6-e(Y*nM (u1:0vImfuFQ.D$.SJ:g4M5%C#EN,>e5"ǘ$"Uh d}'$ض',YPmFU RS)Ǚ5!q:TK|)fx-a2iaebg^xHlW:@Tzto3Z)͒Eq1gad=xAZ!9bE!38j[;.1P s@mg/B{=,pA  1ъK{.0KhX䈃Q:W gЦV~ڋPΡ'2q}8-om 6L i!c$9fѓskQ)m6mi9dtDR\gQ<t77" 4#F<3ڧack$YK1 = _C]<8?crn/ hduɥLT&<iq" [o;:yG0uL- 62{8c 1&ɲS٨3\ÂE7clԙ-M]ײ5U=clԙ򲦮)ϡN`lTM 2[aEoJ3:u6[gگ*Ƴl]z!:uGlumU:umbDlpa-v0>!Eq](lm`"}p"}膡l4@ :u6[7&@[1u6ڄXM~zSԍS'BS9yoo'<RҰㄇ X\+:ƨ''d~50ʸ]<^ҼkfV7j39Ax>Yyw_rv¶wl_9mOȳOcþs[N]US}-_7;;/Yc^~U'SO`O/ȁMbx:oH`a8M9p~Jou<}ؓ!o/y{k| {<Vb;yhWA쑱"ccp#UJ0߃7YVL%eg>!DF}r Mc+3~e#7o sa_mlͥnJ#Sw фglQ qg P'䱇}#B/&ܛS XaJ2aZ @^l*e;a (\B]yAull+*U%Rr$0+'Ra)&%!{q]̩׉$N^ldcR2Dށ ,[k9ࣥ1&%xcd&GI$%'vf( |V6 bo2I3KėbVtHs://ؖjG=W瓒c$KJ90rc / .&&"^eP#wBNĈ,vz߶?g$H9 Gض\1{1f̆$ 0JkےĶ{4b됱TƝej@vE978;:8#~!:󙎅E` . щ n'5n|ᑁERABPfJ1kTCf;i_}AkCbwϷm-e4J /W.;<IO7d+q( xb䠿 .ݫ*l {lbTeoFsB$C#S39X/W1*t{ؖU=ֹp>Y YTbQ8CA5lkIJh]䘃 4}㆑C1(HNQ1qsz[_V8pIm#: 26'c_R@U"5b>#Q!:P zi/CD(xmgS/Bϋ(vz!l1F6bΪԲSB(43 ;9P@z*RDƑ@1t9Mr(4gh!t.EN;hUvK\KPu11E&PdZ:hԢօA g*]Dd{{2܀ʠS_B,zKm9z[*&"2*z?|`iM͋0>8z#)$z=E,c]ҎP^u:5 <5u 3˂G2u#|/:YD"[@zf[c0h*d4rXfٺ0I];BW4u2aGw΅S4u2v/SY3zIP'0ۡLSgΨ#,cǙ:n:Ϩ!NE :& :Pr"Blc꘺# P{a-vMx˴ 96?P7&efEQNc, o6Ĉc, o6糭lH6aۻߝЛ!Q$}u]CtOy:_0d^ ڗ|rS]hy "A 4ȩMP/ l:,؇=Q_CӢƾ_sȝsgs*{>-G(|ը/g@c m4p P֥B {c.ݺ !tq;?J'%K^#[wQ*RFkS5Shdƴ]6K[#o8Mtq$w}%}(:8eiJ2+ʣx[`cgS[NgBj>ŬH=4aAr9L5̡픚ӉpNdX9“V s1̢/+t{+1fϞ>q(<8g$2Ő8 bO p>ߩC۩..8PI8CwД3jRKK{O(1tR_<4Civw^vv:H*$sYպsŮ@JB'+"?4Uoڈ*})+Acy(`A|s=X.mW<|q] iG6Zy^q ߶8߮V)?I^:ŏF..g?/!5yc7㶼{M} PK!ђ7,ppt/slideLayouts/_rels/slideLayout8.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!i_!,ppt/slideMasters/_rels/slideMaster1.xml.relsj Ab5®FO>Xv,o?) (B+xzvJ2ȒJN6 >/o/; q)x$2©|~:~`ϝdN[HˠuN(U(Jj^}i5Pj``wWU]N jN;4$tNޗbV!6le46Co,XClɀ3+bʊ`fqC &=Yc!>l'o PK!ђ7-ppt/slideLayouts/_rels/slideLayout10.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7-ppt/slideLayouts/_rels/slideLayout11.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout9.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout1.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout3.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout4.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout5.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout6.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!ђ7,ppt/slideLayouts/_rels/slideLayout2.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK!E.r "ppt/slideLayouts/slideLayout11.xmlVێ0}Gm&i[Դ <,+Zx7p`![9| c'ފh93cܔgC?DXʳ w9H*2L9#CgKry54[R0ࡓ+U Z-Wڒ++nZ:i!|,R2$L P ~h!h `Զl(%c-62b +3 9%|xE)2C QLV Av`WWx_*2֠8f13KEƒRs<vf耈['< PZLo4n ݦUg8^ェ%bcw.E%"ey\ ;f[]U]aI5.nKmpA= PWRP } QPK!5!ppt/slideLayouts/slideLayout3.xmlXnF}/XϴH)R`ݚ6""\Rs%9K⸨b_lj9;s̙ݑmR֢<Xc1Eyd-V)\X[QYr^+_mR >RjUR: "/So%SJyYbDbGTd8) eRToE)*ѻ!ml+<6,Xr!r2fO0gd(J*nK!.[^ԛ7%KbrRoZL`փ',tx`mbXdj~6ZNn5`.LF?5&J 2[/sŲyR&j8}dzEj;RW莉n[N< %"#jvsxB(Dr<9ThJVx^Kh# ~,T}Xw\:l>yHN(2p,3S9q^)Q2M!ɻ1K7x=~_#Bdd wi[ލX^S5oo~#$>"Oq&.wgP~{~•8{>Vm0,-\4ht\3g4=]4J3[;xb?ŴcFtڝMoCcT̒U)W"aG2ԡuΜޙξBn^v 49Os P+^"BSttFZwxsya~=c|IfN'mvms1 '~+</Y=A/xoZ>cK~dtoB>PK!JU !ppt/slideLayouts/slideLayout2.xmlV[r0LqۼB<@~؍,Ngv9YId4 ѽw)Z!3wZ'[Ydw-$f !Һ+|I+KITw$99V*N"7ΩpݎY||>g1xJA(VLBh>h `)M/2Ab5)M9 2E vPș$ DGQL0nVDT-PWa༚|>} zW}V(.8Nd]]-QSm*C1LDCfU5|yʏ:^,xх bJ5UJ !6.@?Z؄wSvBJ0"O BHqDLk,$ {T%,-rB2$]g%&YY M(IiI44*&@ZDQ3F薺#ֲ5 Ϧ^Ҕq@S$G)YaYћG|)TwCNtpjUk{y!lC Dvb7؆6cG< Q8gAdqێ3wqk4iU&@*I-.:,Pinh<̽8k[EÜ==v#c4W%BݤZiԌLit_>ΑK) wRc| "5G vxv6a5è;Wdwl}xz}͚fyG}2?A*qq2?8iB3TU>h:PK!潝Ea!ppt/slideLayouts/slideLayout1.xmlXn6}/ gźKb/|SMu.hޢV9%;Cik~q(j8:3g<}Ɏ&ʑaXaeZey32H#iQ^ldXcm7tT_l[4'vC;s(=%cХ(UXA{|[?:gCP8NuN^fjH؂ʃ.{[ 8TIιz-͸ ;a lgB:BU!+'~ >C!f\^u{CSmv}xd#8r"QvDйWYˆ=J{Qv0ҦC }5(V{D?GNSxýɟI9AbSsIUeKH'J@ݫk˿zl$9-9,|3N"H| By|a+ gVP~֍5q,`A7d'*y hJF1 &o4)z.@gDݥx*/Jg3p}65JkwXCv\sّkNЛD$c6x,?-ϟ~?.PJN7X=WxK뇝bbjCAio>_PK!f3/!ppt/slideMasters/slideMaster1.xmlZ]nF~/;c![%X,j8;X+dɕj(;E۷%'.%Rb2` ]wW:xu5֜Ug]k1?ٔgR )`_MҢ2ҊH+J^zzeKp\$8VJ+R؇C}QZs&p,WpU\U6,΋owdHhB/ )+$ֹSǂ VhOe_pASHE_Z2xJK=D$D,9c%PKNxZk p"f:y5lrQCل iKȸ{ HVXn=c2OUH{ ,sb$BbɈü<=|B?tнX4B {4H^HTQ+X:g`$l[&FԵ[.H(ko{8굜4zG'Ac''?>*% 0MS>Hdzн~*D~ ғF,X o6"}Ÿ績II^v9Nsl:L~e&T z9rax_'K$xzԬ=xolwhz}=98ZQ<DڃWȼ ؁>~-xmVT1E-+,h@ДPC %\ .AE,*+uŒxfJ 5ȠH`F jЌND]B"lkj\aBSv*#k]omK;س($5OiVjׂj:ܸSpZ\V{kAfVڮ׶pRaEr[Kkߐ ͹ZCWg,K+TH*-Nd:9ĸgg`sH xKՖ4<s%5@lѭ"a AYG:$0gwЇ|lɫA^{wQA^di.cյA ݘLMՍ‰MVW݇[*k{ƃ=PU T rH1Vj:*S&lHe<i*-VV6 #4ܵ|So GlYcY89X+)Z+7 KrDz-bi-2%܈mrAn,DH//5NQB4X,j 7,n{ ދj]z̓7,DHZr(ZN9 "`4}%|A^Z"j/E!5 w, "z>.:𲮖rYz^rQ JV9gYɚlznY_=NN? 6ys#"ɉ܈r6T&-!kC5UtǠ 8dtԇ)hC&~i.'x./}͏PK!=)I!ppt/slideLayouts/slideLayout4.xmlXr8ߙ{?x {&>bV\I؝k>NddBr0O:AE+Eʾ^9"eʲ|[gZHH\f _H#ްDQUjtA ,XEJx7g~V#p9NU༴l>S2f I8X"aNa8@g?ߒT`|d_,q|#5)P =24bJT3NVw\ϸYqgi L, G9/8%кo6&ሬ%Ji4]t,;. j^sf[j(YUڼfeȔ͊ZFvEZKcmqD %Z6>@~UT<. Q߈'#_ddD#ԑ-sFoz8afXK&tGqJf OBΔUـ܂0>xE[%^.58Yk.p-.h{^o&֦+QFJ^/wXb Kl1s k`cXl(tR30l'KEN.,`z5YR =%)+3DɊuA?[tvg'luF$dSu-5X]G4a8T:AVDx+l[a6Bo턆m K[ӥW ${}vx`ߑ?(]&qbIN3tI0e5yʼ Iv!t(sA} PK!@~!ppt/slideLayouts/slideLayout5.xmlYےF}OUA<Ԃka!yXn4,u4`p*Us%niقW/G=w0PV<8*S4CUമwxJB81Ä~GOLS~MIT=$(.T~F/u4߲.DCYTH?"kI<.`)olo Nr1;S_\ѷ^P>LbsW }FdGI bJAm|I 21Rǫ@硭oppud GP ΠNP0ݏBy2SEP24RFo #/Y .J0鰛۰cΟEx`Be|/S kI&D"0Z{KjP.uM*WYmM6WVX.bPYNY^l%dՅyPxw-AȐ|-(jXhLYYthvȊThi" !+RVɪFp-ZB V1RZ*h%a8`+E֮ږIRkuJZ䬟#ESmW Hm5A7U. C(*fIƑZ2R˅ {y!cc„jm2fحoȘiPc$CD.qhl |ξk` iͽsw5#[*U% zC(D^x#( <&88{W&R,h\E0qJTVTO4B4>ʵK5PqP/_R/Bdr݂H@cա5/Ak$UcoId{À:Ħ-g̳ 0A\KJ͊of,ͽ.%rS{qËC}䘆 IChWz:% N/ADwdm0{f3Y5I26]D ,PcsŰ0N K$C2fڡ0E9Gt9S>lrHUQ MϚ<޲>Dl$nV\~Xi  BγңXڝE$'tU e>?$IOtth2鳐HU/U<4P1Ն#]-kYLllj#CiǪY_nGiÈ./$%~B.8BN@Y_lI?6-{<x ¬q*6"OZЈ ΀I"?D|d9Qqː]3%O'34dxk 1_3<~!]$T`+:WV@@"i|Pl컔R@w=צP XeH:NULX}%^;j`s:5X XV۹v/a5%w [zv`7{ 5UTqSpC 6s?M"_Qޜ]5tkjy }e1jh5[`LRV3 0 B&V@T"PCQsU(enQvi燑2ޜN7 Y~QmѴ.*GFOt g"bQ**=FV|=੤߉6hG.4%j>Pxwey`k4[u5L+>$kϴ_u6.x3J4a(η*Q _-o kVއ !GO;Yu7Җ3ZۚF3:_FuU|=sJaW Cjޘˤa-(>;(::=4pq5A+}r8u$oD:"s``؉@I͞3Sof;Գ}wBF}U\-`#~8|wjjGVnKT*M&a^PK!ђ7,ppt/slideLayouts/_rels/slideLayout7.xml.rels 0Dnz^DEd$dߛc0ovkœ5ԲA|v= 88OİoB#EYÐs)f YH8]H"S";UQi΀)NVC:Kv:gc"T(3rTzy.jY6knPK! 9\ppt/theme/theme1.xmlYOo6w toc'vuرMniXS@I}úa0l+t&[HJH۰ŇD"|#uƣC"$I۫_y$>h{ I37#һ{HLO&n{Rʊa˫<% ̍Wݘj+1ٻ1 jVN5QRL 4i0`R9]&!fmhH)1,Ly+[Wf%kK旭USih])S^ z}4i6NNfKdnu:f+5 Xo۫ހ,otuo@_k7\E&vhQ/ cv+ߨe9 .b,b>4aEf)c MK3vȗ Cj{2bN߼|޼|v㟎<9~,IX^co^?/_䗟?B%z^<{է- ҘHtn0d$ηbaZ^'XsS3 W:ĵ} xsx\hv+Eni^%3IX\L˸xwq7Mt*݈8b3(( {=Ա|:VdHGN42f>pV9tU?$1Mܣ#<@Th_BvpLˊ|押-heJ잨p'o&}qe|֊;/Pucd.K1elfܖaa}I4Ǭ;P` >*D8fi"H\! Wxhؕ="6 3ZlZF~fu-ԙՍh9 `aMD/`u8kpHvbp.H#Iy[ )V+qki,N*k,a{]GK:oO#KtZզ|1o1NR7pI+ad6Y>f+WM:\YX/(ԁTHedCLe!ʿ^6B L Z2_]ѶY)SE ЈMP}*Twjf-Yҕo ΎcF8+:ELpDž $V)Q Ua?SE'pehp+0P*F hLh{Ye_C朥aN~ꀆHP؏T$هdbl$YFDTI\ZG䐰zoPnIV dYBͩ!ks|l2Rn6 MnBĊ]ծ7󽷬Y<+Yi+hei"skAf.xqQc,.~>_):P[|t l iG8AL5m:iw֒4vќ\Hcgvlmǖ<{2Eahdc(>zށ)S|_ZρH~, PK !$^docProps/thumbnail.jpegJFIF``CC" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?((((((((((((((((((((((((((((((((+i #2iof~6ſfF뿴/ڧZÏڻr<g(; F޶K @W_D }.GmRNwuxR5ma*xp޾m4o?Q{w_/ <1ls.VͅXDdsa}? Z8^OQO*UYӝYIƔiFP9SJc_*(?b9u}"r!MRufبSSW??U[5?)W#-~! }JYH5SR5hmoj+kY5{ETu+e{e(go |,G j9_ O~>9h^OºM^:lo[Z32:8Ls,d(bttc)Sգ(a1=*{:0HsTRu:M jRPUUQ䪦YԒ$]6c%?׼Q2=G+/W߳}T¾E B tMR4aό uo/wvAAA .xw5~ ѯH~ 5x TK=CHOٮ sM"M|=7X&5=2WmzOd?wQ>|_7I|1 }]oO_lַR>RW x;:S|,fxk^1]Dgjz< g=r8u#ZkY&s, _GWTb.b#RɧL`YIJIuХ'ogV]"tSjۏO=/i/?l &6̈ol`XEqھǻ)?/')O-|Y?~)u# 4ce<c/I|JO01HMqe`SfkLE/~ؾ8?d]dMgxnQ$OkQXk%s{^ ;lG ?;'gf$;~JO; E DZםQd D%K $ib{=6ۍD{u5,ɯCk\[J:d ayodop;?N:8ԃr4$hIJq4+6; _ PURzPF$eVHU+ZpeLTm/I`??z]4_}Duό_SǥYO #߱[VokV<xSGSA'}8K}k*7)w9١k[ZM_'w'Ŗ߳O!yCs\_[Z*\_Km|E;9./t59^ 'xPl#6J+V ]x?i6x6ӬMh;sψ.x/xŸ/ x "Y-I4k68asop 'G<2Ɵs|fCͷgπ?ʞ.oX-1 w:h n#"B/ h#^2n4>!k7+q&ƺ_~QEQEQEQEQEQEQEo>="?=мv~}>9?|o_ϕC{;gիj՗j|!(/ss5Ÿ [ſ_}[^/jnucxG4;ZsLjV7'P&k'e>d_o~z YVץӕ)eq#Ge]UU[t9GoE |w|Q?NR#~$蚖j+>us;Eox ^8mf :G|T}׭J3Hjph^΅`oJמVڼR1~ڿ>RtjHxzCd=- FG.ZΤgNS <_Kx'ĝ3 QMC1İ˩~7 :Uz5Ɲ}P-5 f䴒Wş?i-S? xGM?_ďL? ql$$s tءchRB˴7ףoC$R/ZJf,Cg9>|9Q7`i:GZxzdvwuyivZoo|lt j7}i?Z Ϊ"E_\ IfG#eBK<;U7Sie|Jc}eźt:5sT׮I1Kj#KON.7ZzfP*v]/V  \j{,;&*Xen*p33'xRQ`e N>rƩ`J#|S*ԗT⣌T4w{+B>%xWxĿ?l8xS͟|,R?N2WGC g*#;osg:GԊ( ( ( ( ( ( (>]Х1B?4c?D]OMy~"|w.vy_>y,y} wu7mOKWZb+o/?_3K'&Q|G?JYtNkU}4}GhIɬ0x~yf];sw_{|/Q|>}Gk7?a(YtNk]?3 !)rA K~xK+ p2zrp +)9J)L&yǻi|}Eƾ65kZqY| Havݬu4]> >WגSii%jن)2 N.4'xzSe]X5+&juy}eٮq`rLi_R`,*KBxXDCѣRu+הiQeR#&o/Cx '/ xTѢƩwxz[Vke}[K:nw^!tvm=֦USt{¿ MP麸6gz~5ZewHf^*Z-kE.> |,w' K[XךMZܚ/?xQq.kT|Swoygiz:^=A;Ie~7W/>>6ڍڔ"k\~8Tyfx&>Jx}R")Vѧ*yGB8jb9t0\UМI~axD6ptKޭt:FBɂ+VZ G׏ƣs-=#7 x7o՗@ӵ/xmIޣ[ɧ|<Þ+tGQfvoJ=iUI|Y߅u;φ?W^>^xRAޛsl%[I>xLԣizm^9^~_TO7մ;Opľo[v~mi::ƽq[K"qx8*|pӣ!R%Rs$|vf{E}++M:.V~?$Һ?O?_ÜI.&z|~"[cO':v/9?9?¿:|??_,~c>'4x[nF|U/xsZR\_ޗoo?㿳O* _ГGC ORs[??}cH=C|x)QдGp#Y5-V+]eՖ?4%i?u9t#O~ĽwARuYo>H0h**|W{{}gt;sڳϫ9ú~ĿlFOXկx?zGýOnx>'?OKmKkZ},u|7kuYKJ5u} Ocm5ִ4AxK ޛwa_,I > 2&V1iO5[*žS)}F!JcN%*ЩWJ'< wUV¼0*ӭXZ0aZbR)T3!a| ~,;ScK?eLixķV95/\ަ:b'i~"GOSQ?(mmg}MV Tx+X&w-Kȑ.@h FQ#X<]u?KϊiMi't 7knxBFəyt]SC`R@[aRo2I; \]M;4X`[hO}ѭʹ71o2?0xJē]w|u/ItLb|z|]ɦi}Y 99?c_yZ<^?/Ew6]WD~|\5MR{KmkA>_i2X_\—v[ 7/wUE|F/ UUõ1jJjTTR:*Iu68O.))I'(rroW&mޭ3Yি ~_ >4Y~ ~!~߳Wß ~O^6Ś}W\,äxl>u_ Iuuzޭ7 ;?x??|quW%Օhg *IWtL +7 ZխW:[pa8RuJ*ѓᡃ{IJNu~:8ok)o,[8;}#%[o?_K|Ek7c5+MFr^-CL˻&&ҋzx[-mſk^#|>Ɓx2I 8`qoz_ȗj$YTo hg 7#Z 3n5c^/eIGҬu*({ZSR5S咅Hڥ:s)ӫJZӭ¬RNX*sR9_n{\ o) u~Ŀ~%T5$g3贠IL??w@mKNΝJRcFҕ;I{N'|Uj=ں3i7_U[M8κUj 8o|X?j_O|K>7|#] ۶Z | I9;~| Oa40\{k:Oz,ֿk:WW2<;(ׄ|"߳Q&[PwᏉ&.χ^wO/-}>6{'WNt_Oմ=OK7RӮa >ymI!Xuc%(((((((|/ >-߉-|'NW_\Ixu_[l绕Y/2C/hb1papjb15*TN 1ZM'o:ƍ*j*՜iӄSKSV7ݿ?y_~=5$t+GlY/AxKšDzemsIdKP{k0I?˨!|ssmsw>4L$3C49b6WDfGFVV*A'oO|SK_ k\ߍW6)jj7>{kmiDKaY[]Dy|O~EgwK#0RRVwMZn[[-2燩Yu\KS*fTp<+^TuZN獹;oXֹZtwZu=w Q>xBo|}hO|'wӬt_Lj~#|HG5M@hu=N ? xHKO?d|Z~? |t_xՏhl!ūgH|s}qm2U‹ -_J|?-cR>;|MO~i֚\&|Cnj|jo|-h5z7&񕶡|ahm_Q\ Ŏ'p8n]ȳib(Bt2^ zW:R-J9e>?sVgeY*M<CR_GF*g< OKWM<3ҫ ThusSGk}7|W#M}lj<1mDŽ&~gE ~KO>|hk[kD<}x\ִ;'ŞPϡEwP>_tEj)amĝ{צnK?77 s[/F̗w> Vqy?_>05ߏz/C_wj?هx~ x;?]x|jxcl^&oV5i$n,էMoG'kx7.]G~qC$ràxkMkDXb=+Rk(` GV],YM*ҌpҖ!c: ѷ暋e嗳k0|U+7i]L;Tڞ!Qx߬J:uaT+ީz)SO G(e,WF0]wYuO]B<:tS7KP%Z[=}L"y=⇄o@S-=ċ+Yf Ėդ[Kij?K[{[WmR46vos ecHWB?_i/|1:H|9/i:uVz~h^kuYYmkm PAqF=l/mOʽ'ygo9}sUcg*XzxZ-[I+ɸI<¾1<@յ }|I[xg 5[N]cD.FrnK^& M֕kw.[xizżP\iڷ4OhӥݕwzfbIೖ|qKͯPw #A]6/NS煢4[x.,精%V `5j*ާ:օqOTOhz݄֣xr0xZҮo>pxOWxwM 9=_WB?Kج[}bqg=<4`kVRTG/`fy]ĸo mL.]pԿks֮!aݞt-NkuhQ/L.W gN߲o϶M}G۽*]|&%mxo F߀e7XL.tOz?^^31b0qlX5KI?cI$O$'ֿ۽X5?cgtEPEPEPEPEPEPEP q%cψ>5i|q3״ xC>ĶMdž wUftYP.K< W:wk]J"Oxƿ |RM7zޱEsx?[Ѭ>4AVM+U6:e{ ղiнw: > I񯇿cڏ_j6.~[Y-y4C}ɭxNHdDc2F+f%c,9~i21GNVJZ{=,Dippy?pFctf} 87*rզX&L-ZkPVO9~ϟu 9JN4:BMgC湚B| ^)mdk]/X:}y~?MEž?le--RK4*OH$zVrCu7,x_im*(Y,_|Q>|I{Rf?kZgr&KmwMGX5wBIZ$6T+)4uoq+ᨵmG[Fzo4/xZ.=ΟiW1l-tKlmռK$ٺ21˦t,g5 X RYjp6X\\gGK;\',mf_V^K\pe0)IbAyݨi{~  n|Ch1MO<gdxzcG=\?M8dܹWZX C G!ܿ+dq_G2//'ǂdOi$j&q{uZ{_x\5vτfk\Ecg 5xcGN|#7b—ZEټc6VZakR[mOźugZ⬃<:|MLf}ɥB\Fc 爯RTprٕZQ*Bq?eY? _x 6&)C+p\Z"% 6S0(phqtpNz_o[ w3m?w7_擮(–^5񟋧^_EO]jEy5źO^6+O]~ց4<ω?S@Izo+A HЗh$@W|c+5o_j_,LcI|GkHhv:$gF.(~Qn-/<)ꉯh6v'xCWՆ7.נDƒQN7P Ĭ(>+tpY~.ӛ 8UcѡF.0*X*8⌓6LUgfX 8l>iPJ_OK::5gJ.|ZVl=xKʿoUJFl'۽\*ޟJuCfhGf]g[O2<ne_:7Ǖ橏v+x\O eNjx(S7|b-iNJ!NԔaI)4_F|^G~0[v;٫MWi Sþp_z|wkMy%%"YLd ҥnl5WA;C_<_4?&ռbr@7v gC%DݶSYuńEo=~|L}3ԣbf{iwxq_ܠE41n&}1!، CJ8 apq,M)b1VæԌOQVN#~..W>q#_S7+ZpZ}jU+Jќ5%~_A7/XjZ|8|}]jz&]2اqyjkhqOq"߂ 2|x6r|OB/|GLb;VKdh<-sj:uӣu /Snt_>ÝK 9j~3,_~nj~ukuiYxmZDg,r W"ǿ tDӼ!xM?7]Y5KK{[j:$ 閖Z< ae!2<,GNx_Ycc~xQY?qJ'MPPZ\w !KWͿYUԤN7î`ۄZW?S_|E|;_t]sGRoZm7|7w5/뗺iZZAM*G5VXX-ֈN]Tp\&slDhf ٿv~wxc~z>/~o[|Dݥψ7>#Z[i~5[ ig!۴GSXx7 x   ⰰRu}bʝZj NOBP(ܣ,E<\WG a%C ^R6JmahU(a(.TpX8B/{+c 5(jف?t?S_7B|cy(ӴG~2MiW]"7bHԅϊ bͿ~G}R]gu-kS~K>1i-t{9kVSiwl4 5֐fIO/]k?|S|E_VşOGe^0u;C'`o<0Gg^6 6%ԼQfo"O/OxC?>u[ox"G ^ҴOKoCgcg≼7hm.FK2 *qf#2R &Sx:N')uʸ{8K༒;*UpL):aZuS Qh~ҝbgNxWZ?a+Y2///.xkO>xRS>!.^Юn|kxfgQԴ_8<1ω_x{w y5-e>=𥤬\[?u٣fm*;oكM}K-5ε}xk(5xM!-/vSy~xc^-l'p6WNw|SyEh|K ={,) *lp˲֩x<x{h0 ֣BXl<])gUp0,yMcFtWˣE¦%u౰oX cBw_׆M>jIqOW/|68NO5Ow!¾ ռGJOxCiЬ|]sm6>;K; 񋷅mnDwXjaXY:zYԕRJmup:j*^Ζ7 5|7ϮiTM?XO) iDz>dnmdiz};;; c_hWg?^,xl>v^.i7xzj>1xfhNGu"}>N:a{/K{Sд];¾ѿ࡟LMM]'?x'k`Mu+KռIum/o:+MX vRH߈{}oOzvk ?O ٺ卭&дaell[i%9 A61Bէv~_.~í@jѵrx$xY>6%ͲCi7W_>8"t/x]joΊ|S u;+xjG>"i7~K/_[͠Ŭqs pv/022QaWͱR_:o_ V- k8ЅJy a`>&5c YaԕCWKGRiBT V(S<7|⟃^"oSƕ|!u>">!ѣ1]7 Vj=Ūia-j3~1$6XZl%4OxB]ĺ'e[]Jm4zϨxᏌ;x %X-%/g} Qt7W %Դ빴'o| uH\_7u x{@~P[YI^rOމio\Cߊeig++L?­_W(Y`5VyT3S U^XJ1 ML10ylt`O]aYU -Ḩʄѩ b1d>|E#Yi5&Ꮙ? |?+/Vw3|G7I1ꨞ ֬|Yuq;?@u 6ũH`v'KAѼq=?[xCGҬZ{ףZ=Ե.n =n9.nei0ƆGf 5/Q;[P?`W\G_ +TWR1PNxIEni=/S :&PJsy'4gk~1|:?h?gߌ~N/xO>(~-A!xC߆i3h6u2_iԼCm#¾ EexQƥS oSFD?Q+GwqMewf, q%Si5{K&#'E_d?_Pய/{þxK^0h<5o!|}CS𭞹Oh71iڞi6'NdAM_?zu~<+GYw@8o;{x3V_ۋimuyjچUS~pWoZ!H>usIשl-HVTRXTIT*Q[l2t*Sוj5XK K&5(nq[UUrK'뾯7L4:MR_(G 1ki~`Ώeڴes=KnCmuEeYMӭCJXQ?Km#@k#↱jfnWέ8a*$:Gb#m,uAt"KѤ:L1-Rɦ(u籬Maiʃex5Jz/gsNZJ8K2NXWעSxL/ W+' I)Q*SWXUr/;PM"+4 Cza?,rY{ciC);xyֱǬuŰ]6N[czt_4A¿o I߇I(Nb .+[X˨cQE`Đ[Y)W;qu]_jW?߰?W_01h<(~]Jῄ^Ѽsˢm[jI.Dc,'?/> pb5SSͱqF?uWF7R Iߒ 뿴/M9v>q+W?k$,1[i V[ku+{1m a?e9&7gBxqT)u*ի.U (j<8ϊx',&CC ReJ*ӎg{ ^4g]*.;K ?oO׾7O:_ g߃Eoo/F+O]{\x^ >_k:&i͛2Z\S ?G<?;Ěg|.u?֭/tj#G4isk:tE 74]ZoWֿgڷ/x? m(ßϡt+?_>L/G]ſ$wZmW$еۏZ/#ХPp%R_ ẘyդBNMYap(jjt(TFThQ&xz%Ÿ(›o~3|#B>4)ŸE&MJX>xo^?ῌ7_|Ú*xO7}>+[0S\xoGK}6$#E|(y!7/c;ōS.GOinKk]/Ǘ>$Ӵh!宓:%O &/Pzml?gžңӬ;Evt}+GѯŴ5mCZ|K5W,?F9\pӃiׂ<4% PZiΕJQWK C)2XzLMW3:#V,:8Z%< W5:Vt+o?=Լ/+I?jiVFgO^{Ld hEե}kJo}k=WM=?NxO+ GtOHx*B#V: dk|^ ͤjI{mzڄWj3E~^*3~_%g/<{⫟4hN㯆z=uM^/^asYˬj1Z-5C7~ժl3omYW:?¯>qgdG,'}/Q%}Af;-I^'JoW9ԣQxѣUMө)A1(s|C֯ЧU(6M9ŒVM/ U WܩS r|IsAeK|Kӣ~5}gj~+mES·ԥatYcQӡ|%5oiͅ A-ݷ&)XFEWRW|C?MRFk?|w6qk{gUZ\Av}E,{ R(8a"$H$T8Bq*ׂpYrK8UrsqֽJ$M-')I۹K|GOƖ_eТNyfNO V3iХN2 >(Š(((((((((((((((((((((PK! gppt/presProps.xmln0 E{#7C3 CLߗMٞ'lcP@`0qaR?x5Ҟ}#ȿN@db←K܍E1*CПzQOA/, 2_BUuMICHZ_S>7㥩,F3|szW;|g(@*Hu}LB6o0c?V&7JC `@po#CtމegB[ʻS2R@"q^D7v9C>)72@A$DH%+b=֛3)ܓh{b2NDH/ $O U ^8w,@*G0<쐀 qt L}  f~z]A z|89gg$CR;4\UdZ_UU`l )8aXT-P֎.NKDhU࿨\*Mc3X<|֐H^#SzgfVV[k1g?.h]*$1p)PҖBYBR`L^4LPe y2qclTQUN?.I5[,_S%+3cYhI4j@HuBOW!LB{R`,&ldQsJU/?JXF)G~kn,5cSJפ:$}*c}7esX;* vy_A˼Skug*KiH;m" ~I҃WB2+#9zH''HŸ́"25<:?1PK!r~;ppt/viewProps.xmlR=o0+?X!!P r^Ķl_4e`׽W* Jt2)U&dүhAuLfTRzK7חNNΟ K9+ k2s" ;#pUQAńy̼s]cҵ J搼=m;4 6`Fq.>^ d[WjG! MiM)cKAwe6嬄%&a%a˃4DQIꔎ%ΗMS:DW@eheSMZ=]K\,:=HKv=Q#iuk'Qsw6?P49 G17ZNPK! f_docProps/core.xml (O & hs5h mv[|= u:U#"0lfXw(r y~}‹j^8&z_3؂n&jnp'N+oc@yB(4&IAnjLX|.}"%M Ȼė?)PK!r( {docProps/app.xml (TMo1W@hqT&=Y֪׶lήY>T̛6y5قʚY62R,{z30Rhk` d7;ց &̲*F74"1l0RZ_P[[[D: )2zV‹ |xZI|bmDH[()~kօ0Gux)tL}DP>p-z ~"@, mCKNkk9̍)Vc@.%\$WQC W/quGZR#u?3o8HHEzKcg}lnk'̎Edho ."Bs+AG-p^7I0m=-Q_{Q:9ݫPK-!\ E [Content_Types].xmlPK-!ht %_rels/.relsPK-!K=7 [ppt/slides/_rels/slide2.xml.relsPK-!c\#7 Xppt/slides/_rels/slide1.xml.relsPK-!*3>UW ppt/_rels/presentation.xml.relsPK-!nWV  ppt/presentation.xmlPK-!#r@ppt/slides/slide2.xmlPK-!Q0HH`)+ppt/slides/slide1.xmlPK-!ђ7,Hppt/slideLayouts/_rels/slideLayout8.xml.relsPK-!i_!,"Ippt/slideMasters/_rels/slideMaster1.xml.relsPK-!ђ7-Jppt/slideLayouts/_rels/slideLayout10.xml.relsPK-!ђ7-Kppt/slideLayouts/_rels/slideLayout11.xml.relsPK-!ђ7,Lppt/slideLayouts/_rels/slideLayout9.xml.relsPK-!ђ7,Mppt/slideLayouts/_rels/slideLayout1.xml.relsPK-!ђ7,Nppt/slideLayouts/_rels/slideLayout3.xml.relsPK-!ђ7,Oppt/slideLayouts/_rels/slideLayout4.xml.relsPK-!ђ7,Pppt/slideLayouts/_rels/slideLayout5.xml.relsPK-!ђ7,Qppt/slideLayouts/_rels/slideLayout6.xml.relsPK-!ђ7,Rppt/slideLayouts/_rels/slideLayout2.xml.relsPK-!E.r "Sppt/slideLayouts/slideLayout11.xmlPK-!qGPo) "Wppt/slideLayouts/slideLayout10.xmlPK-!5!|[ppt/slideLayouts/slideLayout3.xmlPK-!JU !R`ppt/slideLayouts/slideLayout2.xmlPK-!潝Ea!cppt/slideLayouts/slideLayout1.xmlPK-!f3/!jhppt/slideMasters/slideMaster1.xmlPK-!=)I![pppt/slideLayouts/slideLayout4.xmlPK-!@~!tppt/slideLayouts/slideLayout5.xmlPK-!Ӹ!qzppt/slideLayouts/slideLayout6.xmlPK-!!w!}ppt/slideLayouts/slideLayout7.xmlPK-! !ppt/slideLayouts/slideLayout8.xmlPK-!+ !ppt/slideLayouts/slideLayout9.xmlPK-!ђ7,ppt/slideLayouts/_rels/slideLayout7.xml.relsPK-! 9\ppt/theme/theme1.xmlPK- !$^ldocProps/thumbnail.jpegPK-! gppt/presProps.xmlPK-!~{(yppt/tableStyles.xmlPK-!r~;ppt/viewProps.xmlPK-! f_}docProps/core.xmlPK-!r( {docProps/app.xmlPK'' U././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/hitting_activation_depth_wall.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/activation_concept/hitting_activation_depth_wal0000644000175000017500000002424311520622606033752 0ustar directhexdirecthex Activation In Action
You are here: Basics Operations & Concepts > Activation > Activation In Action

Activation In Action

Let's see db4o's activation in action. To see activation you need a deep object-graph. To keep this example simple we create a person-class with a mother-field. This allows us to simply create a very deep object graph.

First the Person class:

internal class Person
{
    private Person mother;
    private string name;

    public Person(string name)
    {
        this.name = name;
    }

    public Person(Person mother, string name)
    {
        this.mother = mother;
        this.name = name;
    }

    public Person Mother
    {
        get { return mother; }
    }

    public string Name
    {
        get { return name; }
    }
}
Person.cs: Person with a reference to the mother
Friend Class Person
    Private m_mother As Person
    Private m_name As String

    Public Sub New(ByVal name As String)
        m_mother = m_mother
        Me.m_name = name
    End Sub

    Public Sub New(ByVal mother As Person, ByVal name As String)
        Me.m_mother = mother
        Me.m_name = name
    End Sub

    Public ReadOnly Property Mother() As Person
        Get
            Return m_mother
        End Get
    End Property

    Public ReadOnly Property Name() As String
        Get
            Return m_name
        End Get
    End Property
End Class
Person.vb: Person with a reference to the mother

After that we store a deep hierarchy of persons. Let's say we store a hierarchy of seven people. Then we query for it and traverse this object graph. When we hit the sixth person, that object won't be activated, because it's outside the activation depth. That object will have all fields set to null.

Person jodie = QueryForJodie(container);

Person julia = jodie.Mother.Mother.Mother.Mother.Mother;

// This will print null
// Because julia is not activated
// and therefore all fields are not set
Console.WriteLine(julia.Name);
// This will throw a NullPointerException.
// Because julia is not activated
// and therefore all fields are not set
string joannaName = julia.Mother.Name;
ActivationDepthPitfall.cs: Run into not activated objects
Dim jodie As Person = QueryForJodie(container)

Dim julia As Person = jodie.Mother.Mother.Mother.Mother.Mother

' This will print null
' Because julia is not activated
' and therefore all fields are not set
Console.WriteLine(julia.Name)
' This will throw a NullPointerException.
' Because julia is not activated
' and therefore all fields are not set
Dim joannaName As String = julia.Mother.Name
ActivationDepthPitfall.vb: Run into not activated objects

Use Explicit Activation

When we traverse deep object graphs, we know that we might run into not activated objects. Therefore you can activate objects explicitly.

Person julia = jodie.Mother.Mother.Mother.Mother.Mother;
container.Activate(julia,5);

Console.WriteLine(julia.Name);
string joannaName = julia.Mother.Name;
Console.WriteLine(joannaName);
ActivationDepthPitfall.cs: Fix with explicit activation
Dim julia As Person = jodie.Mother.Mother.Mother.Mother.Mother
container.Activate(julia, 5)

Console.WriteLine(julia.Name)
Dim joannaName As String = julia.Mother.Name
ActivationDepthPitfall.vb: Fix with explicit activation

Configure Activation

You can configure db4o to increase the activation depth. You can increase it globally or for certain classes. Or you can cascade activate certain objects.

However remember that activation is there to improve the performance and save memory. If you set the activation depth to high it will hurt the performance.

Transparent Activation

If you have a very complex model or don't want to deal with all the activation hassle then transparent activation is the best option. Transparent activation will manage the activation for you. See "Transparent Activation"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/0000755000175000017500000000000011520622616024074 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/0000755000175000017500000000000011520622614025020 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/soda_processing.htm0000644000175000017500000001051111520622614030712 0ustar directhexdirecthex SODA Processing
You are here: Basics Operations & Concepts > Querying > SODA Query > SODA Processing

SODA Processing

The SODA processing runs in two stages.

First Stage: Index-Lookups

First SODA tries to find the best fitting index for the query. It looks up all available field- and class-indexes. Then it goes through all possible indexes and chooses the index with the smallest candidate result set.

In practice this means that SODA first uses the field-indexes. If no suitable field index is found it falls back to the class-index, which contains all objects of a certain type.

With this index a first set of candidates is created. This means SODA looks up in the index the objects and returns the IDs of the candidate-objects.

Second Stage: Constrain Evaluation

The second stage uses the ids from the first stage and runs all those objects against the given constrains. If the constrains are regular SODA-constrains, it directly uses the values in the database to compare it. If additional evaluations are present, SODA will instantiate the candidate-objects and pass it to the evaluation-function.

Finally SODA will apply the sorting and then return all IDs of objects which match the query criteria.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/soda_example_catelog.htm0000644000175000017500000004712711520622614031704 0ustar directhexdirecthex SODA Query Examples
You are here: Basics Operations & Concepts > Querying > SODA Query > Type Constraint

SODA Query Examples

Here's a collection of SODA-query examples. These queries assume that there's a Pilot class with a name and age, a Car class with a pilot and name and a BlogPost class with list of tags, authors and a Dictionary of meta-data.

There are also a few examples for special cases.

Type Constraint

This is the most basic and most used constraint for SODA-queries. SODA acts like a filter on all stored objects. But usually you're only interested for instances of a certain type. Therefore you need to constrain the type of the result.

IQuery query = container.Query();
query.Constrain(typeof(Pilot));

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Type constrain for the objects
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Type constrain for the objects

Field Constraint

You can add constrains on fields. This is done by descending into a field and constrain the value of that field. By default the constrain is an equality comparison.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("name").Constrain("John");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: A simple constrain on a field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("name").Constrain("John")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: A simple constrain on a field

Comparisons

You can do comparison on the field-values. For example to check if something is greater or smaller than something else.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("age").Constrain(42).Greater();

IObjectSet result = query.Execute();
SodaQueryExamples.cs: A greater than constrain
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("age").Constrain(42).Greater()

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: A greater than constrain
IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("age").Constrain(42).Greater().Equal();

IObjectSet result = query.Execute();
SodaQueryExamples.cs: A greater than or equals constrain
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("age").Constrain(42).Greater().Equal()

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: A greater than or equals constrain

Combination of Constraints (AND, OR)

You can combine different constraints with an 'AND' or 'OR' condition. By default all constrains are combined with the 'AND' condition.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("age").Constrain(42).Greater()
    .Or(query.Descend("age").Constrain(30).Smaller());

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Logical combination of constrains
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("age").Constrain(42).Greater().[Or](query.Descend("age").Constrain(30).Smaller())

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Logical combination of constrains

Not-Constrain

You can invert a constrain by calling the not-method.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("age").Constrain(42).Not();

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Not constrain
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("age").Constrain(42).Not()

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Not constrain

String Comparison

There are special compare operations for strings. By default strings are compared by equality and the comparison is case sensitive.

There's the contains-comparison which checks if a field contains a substring. The like-comparison is the case-insensitive version of the contains-comparison.

Also a start-with- and a ends-with-caparison is available for strings. For this you can specify if the comparison is case sensitive or not.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
// First strings, you can use the contains operator
query.Descend("name").Constrain("oh").Contains()
    // Or like, which is like .contains(), but case insensitive
    .Or(query.Descend("name").Constrain("AnN").Like())
    // The .endsWith and .startWith constrains are also there,
    // the true for case-sensitive, false for case-insensitive
    .Or(query.Descend("name").Constrain("NY").EndsWith(false));

IObjectSet result = query.Execute();
SodaQueryExamples.cs: String comparison
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
' First strings, you can use the contains operator
' Or like, which is like .contains(), but case insensitive
' The .endsWith and .startWith constrains are also there,
' the true for case-sensitive, false for case-insensitive
query.Descend("name").Constrain("oh").Contains().[Or](query.Descend("name").Constrain("AnN").[Like]()).[Or](query.Descend("name").Constrain("NY").EndsWith(False))

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: String comparison

Compare Field With Existing Object

When you have a reference type field, you can compare this field with a certain object. It will compare the field and the object by object identity.

Note that this comparison only works with stored objects. When you use a not yet stored object as constrain, it will use query by example. To force a comparison by object identity, you can add a .Identiy() call.

Pilot pilot = container.Query<Pilot>()[0];

IQuery query = container.Query();
query.Constrain(typeof(Car));
// if the given object is stored, its compared by identity
query.Descend("pilot").Constrain(pilot);

IObjectSet carsOfPilot = query.Execute();
SodaQueryExamples.cs: Compare with existing object
Dim pilot As Pilot = container.Query(Of Pilot)()(0)

Dim query As IQuery = container.Query()
query.Constrain(GetType(Car))
' if the given object is stored, its compared by identity
query.Descend("pilot").Constrain(pilot)

Dim carsOfPilot As IObjectSet = query.Execute()
SodaQueryExamples.vb: Compare with existing object

Descend Deeper Into Objects

You can descend deeper into the objects by following fields. This allows you to setup complex constraints on nested objects. Note that the deeper you descend into the objects, the more expensive the query is to execute.

IQuery query = container.Query();
query.Constrain(typeof (Car));
query.Descend("pilot").Descend("name").Constrain("John");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Descend over multiple fields
Dim query As IQuery = container.Query()
query.Constrain(GetType(Car))
query.Descend("pilot").Descend("name").Constrain("John")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Descend over multiple fields

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/soda_sorting.htm0000644000175000017500000002412211520622614030226 0ustar directhexdirecthex SODA Sorting
You are here: Basics Operations & Concepts > Querying > SODA Query > Sorting by Field

SODA Sorting

You can specify to sort by certain fields in SODA. For this you need to descend to the field and use the appropriate order ascending or order descending method.

In cases where this is not enough, you can use a special comparator.

Sorting by Field

To sort by a field navigate to the field and call a order ascending or descending method. Note that this only works for fields which have natural sortable values, such as strings and numbers.

IQuery query = container.Query();
query.Constrain(typeof(Pilot));
query.Descend("name").OrderAscending();

IObjectSet result = query.Execute();
SodaSorting.cs: Order by a field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("name").OrderAscending()

Dim result As IObjectSet = query.Execute()
SodaSorting.vb: Order by a field

Sort by Multiple Fields

You can sort by multiple fields. Add a order constrain for each field. The first order statement has the highest priority and last added the lowest.

IQuery query = container.Query();
query.Constrain(typeof(Pilot));
query.Descend("age").OrderAscending();
query.Descend("name").OrderAscending();

IObjectSet result = query.Execute();
SodaSorting.cs: Order by multiple fields
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("age").OrderAscending()
query.Descend("name").OrderAscending()

Dim result As IObjectSet = query.Execute()
SodaSorting.vb: Order by multiple fields

Sort With Your Own Comperator

In cases where you have more complex sorting requirements, you can specify your own comparator. It is used like a regular .NET-comparator.

IQuery query = container.Query();
query.Constrain(typeof(Pilot));
query.SortBy(new NameLengthComperator());

IObjectSet result = query.Execute();
SodaSorting.cs: Order by your comparator
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.SortBy(New NameLengthComperator())

Dim result As IObjectSet = query.Execute()
SodaSorting.vb: Order by your comparator
class NameLengthComperator :IQueryComparator
{
    public int Compare(object first, object second)
    {
        Pilot p1 = (Pilot) first;
        Pilot p2 = (Pilot)second;
        // sort by string-length
        return Math.Sign(p1.Name.Length - p2.Name.Length);
    }
}
SodaSorting.cs: The string length comperator
Private Class NameLengthComperator
    Implements IQueryComparator
    Public Function Compare(ByVal first As Object, ByVal second As Object) As Integer _
        Implements IQueryComparator.Compare

        Dim p1 As Pilot = DirectCast(first, Pilot)
        Dim p2 As Pilot = DirectCast(second, Pilot)
        ' sort by string-length
        Return Math.Sign(p1.Name.Length - p2.Name.Length)
    End Function
End Class
SodaSorting.vb: The string length comperator
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/soda_special_case_examples.htm0000644000175000017500000004134011520622610033047 0ustar directhexdirecthex SODA Special Cases Examples
You are here: Basics Operations & Concepts > Querying > SODA Query > Contains on Collections and Arrays

SODA Special Cases Examples

This topic contains a examples which demonstrate special behavior for some types in SODA. Take also a look at the other SODA examples.

Contains on Collections and Arrays

Collections and arrays have a special behavior in SODA to make them easier to query. For example you can simple use a constrain directly on a collection-field to check if it contains that value.

Note that currently collections cannot be indexed and therefore such a constrain can be slow on a large data set.

IQuery query = container.Query();
query.Constrain(typeof (BlogPost));
query.Descend("tags").Constrain("db4o");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Collection contains constrain
Dim query As IQuery = container.Query()
query.Constrain(GetType(BlogPost))
query.Descend("tags").Constrain("db4o")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Collection contains constrain

Constrains on Collection Members

When you have a collection or array field, you can simply descend further to the collection-member fields. This allows you query for a object, which has a collection and certain objects in that collection.

Note that currently collections cannot be indexed and therefore such a constrain can be slow on a large data set.

IQuery query = container.Query();
query.Constrain(typeof(BlogPost));
query.Descend("authors").Descend("name").Constrain("Jenny");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Descend into collection members
Dim query As IQuery = container.Query()
query.Constrain(GetType(BlogPost))
query.Descend("authors").Descend("name").Constrain("Jenny")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Descend into collection members

Contains Key on Dictionarys

You can check a dictionary if it contains a certain key. Similar to collections, you just can directly use a constrain on the collection field. This will compare the value with the keys of the Dictionary.

Note that currently collections cannot be indexed and therefore such a constrain can be slow on a large data set.

IQuery query = container.Query();
query.Constrain(typeof (BlogPost));
query.Descend("metaData").Constrain("source");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Dictionary contains a key constrain
Dim query As IQuery = container.Query()
query.Constrain(GetType(BlogPost))
query.Descend("metaData").Constrain("source")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Dictionary contains a key constrain

Return the Objects of a Field

With SODA you can navigate to a field and return the objects of that field. Note that this only works for reference objects and not for value objects like strings and numbers.

IQuery query = container.Query();
query.Constrain(typeof(Car));
query.Descend("name").Constrain("Mercedes");

// returns the pilot of these cars
IObjectSet result = query.Descend("pilot").Execute();
SodaQueryExamples.cs: Return the object of a field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Car))
query.Descend("name").Constrain("Mercedes")

' returns the pilot of these cars
Dim result As IObjectSet = query.Descend("pilot").Execute()
SodaQueryExamples.vb: Return the object of a field

Mixing With Query By Example

When you have a reference type field, you can also use a query by example constrain for that field. Pass a new object as an example for this.

Note that when you pass a persisted object, it will compare it by object identity and not use it as example. You can force this behavior by adding an explicit by example constrain.

IQuery query = container.Query();
query.Constrain(typeof(Car));
// if the given object is not stored,
// it will behave like query by example for the given object
Pilot examplePilot = new Pilot(null, 42);
query.Descend("pilot").Constrain(examplePilot);

IObjectSet carsOfPilot = query.Execute();
SodaQueryExamples.cs: Mix with query by example
Dim query As IQuery = container.Query()
query.Constrain(GetType(Car))
' if the given object is not stored,
' it will behave like query by example for the given object
Dim examplePilot As New Pilot(Nothing, 42)
query.Descend("pilot").Constrain(examplePilot)

Dim carsOfPilot As IObjectSet = query.Execute()
SodaQueryExamples.vb: Mix with query by example

Dynamically Typed

SODA is a dynamically query language. By default SODA acts like a filter on all stored objects. You just add constrains which filters the objects to the desired output.

An example for this behavior: You just add an field-constraint without any type-constrain on the object. This will return all objects which have such a field and match the constrain.

IQuery query = container.Query();
// You can simple filter objects which have a certain field
query.Descend("name").Constrain(null).Not();

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Pure field constrains
Dim query As IQuery = container.Query()
' You can simple filter objects which have a certain field
query.Descend("name").Constrain(Nothing).[Not]()

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Pure field constrains

This also means that you can query for not existing fields. SODA will not complain if a field doesn't exist. Instead it won't return any object, because no object could satisfy the constrain.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
// using not existing fields doesn't throw an exception
// but rather exclude all object which don't use this field
query.Descend("notExisting").Constrain(null).Not();

IObjectSet result = query.Execute();
SodaQueryExamples.cs: Using not existing fields excludes objects
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
' using not existing fields doesn't throw an exception
' but rather exclude all object which don't use this field
query.Descend("notExisting").Constrain(Nothing).[Not]()

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: Using not existing fields excludes objects
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda/soda_evaluations.htm0000644000175000017500000003152011520622614031073 0ustar directhexdirecthex SODA Evaluations
You are here: Basics Operations & Concepts > Querying > SODA Query > Simple Evaluation

SODA Evaluations

Sometimes the capabilities of regular SODA-queries is not enough. In such cases you can add evaluations to the SODA-query. A evaluation is a piece of code which runs against objects.

To use a evaluation, you need to pass an instance of the IEvaluation-interface as a constrain. db4o will call the match-method of that interface. Implement the match-method of the IEvaluation-interface. In the match-method you can get the candidate-object and the object-container. Compare the object and when it matches, pass true to the include-method. Otherwise pass false.

While SODA evaluations are extremely powerful they are also slow. In order to run the evaluation the objects need to be instantiated from the database and then processed by the evaluator. This means that you should use evaluations only when there's no other possibility.

Simple Evaluation

Here's an example for a simple evaluation. This evaluation filters pilots by the age and picks only pilots with an odd-number as age.

First we need to create the evaluation-class:

class OnlyOddAge : IEvaluation
{
    public void Evaluate(ICandidate candidate)
    {
        Pilot pilot = (Pilot)candidate.GetObject();
        candidate.Include(pilot.Age % 2 != 0);
    }
}
SodaEvaluationExamples.cs: Simple evaluation which includes only odd aged pilots
Class OnlyOddAge
    Implements IEvaluation
    Public Sub Evaluate(ByVal candidate As ICandidate) _
        Implements IEvaluation.Evaluate

        Dim pilot As Pilot = DirectCast(candidate.GetObject(), Pilot)
        candidate.Include(pilot.Age Mod 2 <> 0)
    End Sub
End Class
SodaEvaluationExamples.vb: Simple evaluation which includes only odd aged pilots

After that, you can use the evaluation in the SODA-query. An evaluation is added as a regular constrain.

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Constrain(new OnlyOddAge());

IObjectSet result = query.Execute();
SodaEvaluationExamples.cs: Simple evaluation
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Constrain(New OnlyOddAge())

Dim result As IObjectSet = query.Execute()
SodaEvaluationExamples.vb: Simple evaluation

Evaluation on Field

It's also possible to use the evaluation on a certain field. For this you descend into the field on which the evaluation should be applied. After that, specify the evaluation as a constrain on that field.

IQuery query = container.Query();
query.Constrain(typeof (Car));
query.Descend("pilot").Constrain(new OnlyOddAge());

IObjectSet result = query.Execute();
SodaEvaluationExamples.cs: Evaluation on field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Car))
query.Descend("pilot").Constrain(New OnlyOddAge())

Dim result As IObjectSet = query.Execute()
SodaEvaluationExamples.vb: Evaluation on field

Regex on Fields

Evaluation also allow you to add very specific additional query capabilities. On of the most useful ones is regular expressions. First create a regular expression evaluation:

class RegexConstrain : IEvaluation
{
    private readonly Regex pattern;

    public RegexConstrain(String pattern)
    {
        this.pattern = new Regex(pattern);
    }

    public void Evaluate(ICandidate candidate)
    {
        string stringValue = (string)candidate.GetObject();
        candidate.Include(pattern.IsMatch(stringValue));
    }
}
SodaEvaluationExamples.cs: Regex Evaluator
Class RegexConstrain
    Implements IEvaluation
    Private ReadOnly pattern As Regex

    Public Sub New(ByVal pattern As [String])
        Me.pattern = New Regex(pattern)
    End Sub

    Public Sub Evaluate(ByVal candidate As ICandidate) _
        Implements IEvaluation.Evaluate
        Dim stringValue As String = DirectCast(candidate.GetObject(), String)
        candidate.Include(pattern.IsMatch(stringValue))
    End Sub
End Class
SodaEvaluationExamples.vb: Regex Evaluator

After that you can use it on any string field:

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("name").Constrain(new RegexConstrain("J.*nn.*"));

IObjectSet result = query.Execute();
SodaEvaluationExamples.cs: Regex-evaluation on a field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("name").Constrain(New RegexConstrain("J.*nn.*"))

Dim result As IObjectSet = query.Execute()
SodaEvaluationExamples.vb: Regex-evaluation on a field

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries.htm0000644000175000017500000001535111520622616027636 0ustar directhexdirecthex Native Queries
You are here: Basics Operations & Concepts > Querying > Native Queries

Native Queries

Wouldn't it be nice to write queries in the programming language that you are using? Wouldn't it be nice if all your query code was 100% typesafe, 100% compile-time checked and 100% refactorable? Wouldn't it be nice if the full power of object-orientation could be used by calling methods from within queries?

Since .NET 3.5 LINQ is the way to go and provides a extremely powerful query language. For older .NET versions native queries allow you do to this.

Native Queries are available for all platforms supported by db4o.

Principle

Native Queries provide the ability to run one or more lines of code against all instances of a class. Native query expressions should return true to mark specific instances as part of the result set. db4o will attempt to optimize native query expressions where possible and use internal query processor to run them against indexes and without instantiating actual objects.

Simple Example

Let's look at how a simple native query will look like. See also a collection of example queries.

IList<Pilot> result = container.Query(
    delegate(Pilot pilot) { return pilot.Name == "John"; });
NativeQueryExamples.cs: Check for equality of the name
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryJohns)
NativeQueryExamples.vb: Check for equality of the name

Native Query Performance

There's one drawback of native queries: Under the hood db4o tries to analyze native queries to convert them to SODA. This is not possible for all queries. For some queries it is very difficult to analyze the flowgraph. In this case db4o will have to instantiate some of the persistent objects to actually run the native query code. db4o will try to analyze parts of native query expressions to keep object instantiation to the minimum.

The current state of the query optimization process is detailed in the chapter on Native Query Optimization

Concept

The concept of native queries is taken from the following two papers:

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/soda_query.htm0000644000175000017500000001227511520622610026762 0ustar directhexdirecthex SODA Query
You are here: Basics Operations & Concepts > Querying > SODA Query

SODA Query

The SODA query API is db4o's low level querying API, allowing direct access to nodes of query graphs. Since SODA uses strings to identify fields, it is neither perfectly typesafe nor compile-time checked and it also is quite verbose to write.

For most applications LINQ will be the better querying interface. However there can be applications where dynamic generation of queries is required.

SODA is also an underlying db4o querying mechanism, all other query syntaxes are translated to SODA under the hood:

Understanding SODA will provide you with a better understanding of db4o and will help to write more performant queries and applications.

Take a look at the SODA-examples to get a feel for SODA-API. See "SODA Query Examples"

Also SODA has special capabilities for certain types like collections etc. See "SODA Special Cases Examples"

Additionally SODA evaluations can help you implementing queries which go beyond the capabilities of pure SODA queries. See "SODA Evaluations"

At last, you need a way to sort the results of a query. See "SODA Sorting"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/linq.htm0000644000175000017500000002131611520622606025553 0ustar directhexdirecthex LINQ
You are here: Basics Operations & Concepts > Querying > LINQ

LINQ

Of course, db4o supports .NET LINQ to query the database.

First, you need to add the Db4objects.Db4o.Linq.dll-assembly to your project. This assembly contains db4o LINQ-Implementation. Make also sure that Mono.Reflection.dll is aside it. See "Dependency Overview"

Note that LINQ requires .NET 3.5 or newer!

LINQ Queries

Writing a query is simple. You write the LINQ query against the object-container. First you need to import the LINQ-namespaces.

using System.Linq;
using Db4objects.Db4o.Linq;
LinqExamples.cs: Use the LINQ namespace
Imports System.Linq
Imports Db4objects.Db4o.Linq
LinqExamples.vb: Use the LINQ namespace

After that, you can start to write a LINQ-Query against the object container.

var allPersons = from Person p in container
                 select p;
LinqExamples.cs: Simple query
Dim allPersons = From p In container _
 Select p
LinqExamples.vb: Simple query

In order to learn LINQ, take a look a the LINQ-resources and tutorial out on the Internet. For example the LINQ-Overview at MSDNor at this example-collection.

There are also a few simple LINQ query examples for db4o here.

IQueryable

db4o also support the .NET IQueryable interface. This is useful when you want to build an abstraction layer for db4o or integrate db4o with other frameworks.

IQueryable<Person> personQuerable = container.AsQueryable<Person>();
var adults = from p in personQuerable
             where p.Age > 18
             orderby p.Name
             select p;
LinqExamples.cs: Get a IQueryable-instance
Dim personQuerable As IQueryable(Of Person) = container.AsQueryable(Of Person)()
Dim adults = From p In personQuerable _
 Where p.Age > 18 _
 Order By p.Name _
 Select p
LinqExamples.vb: Get a IQueryable-instance

More on db4o's LINQ Provider

db4o LINQ provider translates the LINQ queries into db4o's low level query API. Read what this query optimization need and what its limits are. See "LINQ Optimization"

Also read how LINQ is supported on the .NET Compact Framework. See "LINQ For Compact Framework"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/query_by_example/0000755000175000017500000000000011520622614027444 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/query_by_example/qbe_limitations.htm0000644000175000017500000000730111520622614033342 0ustar directhexdirecthex Query By Example Limitations
You are here: Basics Operations & Concepts > Querying > Query By Example > QBE Limitations

Query By Example Limitations

Query By Example has by design a lot of limitations:

  • You cannot perform advanced query expressions. ( OR, NOT, etc.)
  • You cannot constrain for default-values like 0 on numbers, empty strings or nulls on references because they would be interpreted as unconstrained.
  • You need a constructor to create objects without initialized fields.
  • Complex queries by example are not easy to read and interpret what they query for.
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/query_by_example/qby_examples.htm0000644000175000017500000004156011520622614032655 0ustar directhexdirecthex Query By Example Examples
You are here: Basics Operations & Concepts > Querying > Query By Example > Query By Example Basics

Query By Example Examples

Query By Example Basics

For a query you pass in an example object to db4o. db4o will exanimate the object with reflection. Each field which doesn't have the default value will be use as a constrain. This means a number-field which isn't zero, a reference which isn't null or a string which isn't null. In this example we set the name to John. Then db4o will return all pilots with the name John.

Pilot theExample = new Pilot();
theExample.Name = "John";
IList result = container.QueryByExample(theExample);
QueryByExamples.cs: Query for John by example
Dim theExample As New Pilot()
theExample.Name = "John"
Dim result As IList = container.QueryByExample(theExample)
QueryByExamples.vb: Query for John by example

Or we set the age to 33 and db4o will return all 33 years old pilots.

Pilot theExample = new Pilot();
theExample.Age = 33;
IList result = container.QueryByExample(theExample);
QueryByExamples.cs: Query for 33 year old pilots
Dim theExample As New Pilot()
theExample.Age = 33
Dim result As IList = container.QueryByExample(theExample)
QueryByExamples.vb: Query for 33 year old pilots

Combine Values

When you set multiple values all will be used as constrain. For example when we set the name to Jo and the age to 29 db4o will return all pilots which are 29 years with the name Jo.

Pilot theExample = new Pilot();
theExample.Name = "Jo";
theExample.Age = 29;
IList result = container.QueryByExample(theExample);
QueryByExamples.cs: Query a 29 years old Jo
Dim theExample As New Pilot()
theExample.Name = "Jo"
theExample.Age = 29
Dim result As IList = container.QueryByExample(theExample)
QueryByExamples.vb: Query a 29 years old Jo

All Objects Of A Type

If you pass a empty example db4o will return all objects of that type.

Pilot example = new Pilot();
IList result = container.QueryByExample(example);
QueryByExamples.cs: All objects of a type by passing a empty example
Dim example As New Pilot()
Dim result As IList = container.QueryByExample(example)
QueryByExamples.vb: All objects of a type by passing a empty example

Alternatively you also can directly pass in the type.

IList result = container.QueryByExample(typeof (Pilot));
QueryByExamples.cs: All objects of a type by passing the type
Dim result As IList = container.QueryByExample(GetType(Pilot))
QueryByExamples.vb: All objects of a type by passing the type

All Objects

When you pass null all objects stored in the database will be returned.

IList result = container.QueryByExample(null);
QueryByExamples.cs: All objects
Dim result As IList = container.QueryByExample(Nothing)
QueryByExamples.vb: All objects

Nested Objects

You can also use nested objects as an example. For example with a car and a pilot. We can query for a car which has a pilot with certain constrains. In this example we get the cars which pilot is called Jenny.

Pilot pilotExample = new Pilot();
pilotExample.Name = "Jenny";

Car carExample = new Car();
carExample.Pilot = pilotExample;
IList result = container.QueryByExample(carExample);
QueryByExamples.cs: Nested objects example
Dim pilotExample As New Pilot()
pilotExample.Name = "Jenny"

Dim carExample As New Car()
carExample.Pilot = pilotExample
Dim result As IList = container.QueryByExample(carExample)
QueryByExamples.vb: Nested objects example

Contains Example

Collections and arrays act a little different. Query by example returns all object which have at least the items in the array or collection from the example. For example it returns the blog post which has the "db4o"-tag in its tag-collection.

BlogPost pilotExample = new BlogPost();
pilotExample.AddTags("db4o");
IList result = container.QueryByExample(pilotExample);
QueryByExamples.cs: Contains in collections
Dim pilotExample As New BlogPost()
pilotExample.AddTags("db4o")
Dim result As IList = container.QueryByExample(pilotExample)
QueryByExamples.vb: Contains in collections

Structured Contains

You can even check that a item in a collection fulfills certain criteria's. For example we can check that the blog post has an author with the name John in its author-collection.

BlogPost pilotExample = new BlogPost();
pilotExample.AddAuthors(new Author("John"));
IList result = container.QueryByExample(pilotExample);
QueryByExamples.cs: Structured contains
Dim pilotExample As New BlogPost()
pilotExample.AddAuthors(New Author("John"))
Dim result As IList = container.QueryByExample(pilotExample)
QueryByExamples.vb: Structured contains
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/custom_query_comparator/0000755000175000017500000000000011520622614031060 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/custom_query_comparator/comparingcs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/custom_query_comparator/comparingcs.zi0000644000175000017500000000303111520622606033727 0ustar directhexdirecthexPKp6E CompareExample.csVo0~'w܂M{nl-!׽fκcIӤiMH`UJ|}{}ZH/{0Rȭ'rj݃Vb(5tpsZHWԿn t׾S1sZ-Čc]i[L;-pGrx`8%W+Y`"k ΠЕΒX&Hpg{+1+&$ .}gSkd!r'9o=. T̳ͫNIXs5ߚ β\2J5.+ʤ^SŘdfƨ*e(v:y[H\B!~gc4DۉԪpeͭ4l1˼XA ߪ((R ~[V 3i_ >gϓsG+!9^/otȝВI104iBc27?G0dVIu|XTHEPGqyӕy|d\L_w~1ɴalpNGhrSd;4&^< ίOaJucZUүZXA#_EP|`Sۋƾp`T݄Pl08)(m(rS0(-f S 629KQN jdwk O|ΠPKs6hYF MyString.csm :"NҡS9YƦncD{lA!AiӺio-G0bAIrxv<&llSeoׅ=.cO<+cXk:Zjv[s_nʋS4(tu{[kHЦFdI y^t+Ǝ?RqUjwlX\P[ZHʘ!5GA}K4'-8 5ʸ+V=wڅPKץ6F1M' MyString.javaRp/,L(QpT0200WHI2OJM.)VKS())///I%*hr$&g'*`d\AbQf^5//WrNbqoep HH$YPYX/.,(MLЀ( ՠ`Y$jT_QjIiQ} ]PKڥ6 B% Record.javaRp/,L(QpT0200WHI2OJM.)VKS())///I%*hr$&g'*`d\AbQf^5/PEiRNfBrNbqBPjr~QB5/gAQfYbIoep HB|X:!z4 4FpB(*䥖MҀTbԌ|BM)E%Ey0PPK(j6azV$ CompareExample.java |߿|jPK(ץ6F1M' $ MyString.java Oi|߿| ~SjPK(ڥ6 B% $ Record.java vi|߿|`Z2jPK!././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/custom_query_comparator/comparingvb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/custom_query_comparator/comparingvb.zi0000644000175000017500000000317511520622612033737 0ustar directhexdirecthexPKu64 CompareExample.vbVo0~Gxi*MUC eCkF8s(!?R5m~!}w%4L`H`Gohx.~UM8(R*8;l6a&$R-­Tɴxlo9aWlt;$ 2,Ɉ`Z"1my&I̬"  Y ]dA5"ff^0_;xpNbDZV,A_ U*`4Kr-a z˄r8qΩb)G5Ndf,# Z?nХɘPæqx5Ԗ+j :hR۾Rg+grMvz/t|/HEh  O0v#/@Rꇫb_(_ꕑyjtOheR,*p7n87H]K֟n`$Lc)A n{xV_"6=X52{Ai:{B\ $. S֦ Ў_=sf[!3W~R%xCߛC;w=Fɪ_PUkhkкLjX?PKs6C MyString.vbmOK0~^" xp \6)IMk|/3]nt2,o!Jg#DۦɁwL(/8RZAm;洩$Mp02ü9}bAO<dǞ㠆l7~+p%>Rhd '\crZ*ވK|m߻ 3K%ft4rPKs6KG Record.vbmPj0 {}QB) =4N =4-I$ Hr] tN (="dEwuO:xuZ)qlVTqZj$i4EAU-uG8_ ɛI"#·;kc/kTi5;lu%K-! cSL^iΤν_З$M'o xi|_`>7-x77YsPK(u64 $ CompareExample.vb ,7|߿| ^jPK(s6C $ >MyString.vb <%_j߿|^jPK(s6KG $ @Record.vb 9Z9_j߿|堘^jPKLdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/linq/0000755000175000017500000000000011520622616025037 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/linq/optimization.htm0000644000175000017500000002641011520622614030300 0ustar directhexdirecthex Optimization
You are here: Basics Operations & Concepts > Querying > LINQ > LINQ Optimization

LINQ Optimization

LINQ queries are converted to SODA Query under the hood. The downside of this is that some of the queries cannot be converted to SODA. In this case db4o falls back to the plain LINQ to objects implementation. This means that all objects are instantiated and the query is ran against the objects. This of course is slower by an order of magnitude.

Note that db4o needs the Mono.Reflection.dll-assembly for this optimization. On the .NET compact framework you Mono.Cecil.dll- and Cecil.FlowAnalysis.dll-assembly. See "LINQ For Compact Framework"

For example a simple query like this can be optimized:

var adults = from Person p in container
             where p.Age > 18 && p.Age < 70
             orderby p.Name
             select p;
LinqExamples.cs: A query which is optimizable
Dim adults = From p As Person In container _
 Where p.Age > 18 AndAlso p.Age < 70 _
 Order By p.Name _
 Select p
LinqExamples.vb: A query which is optimizable

However, queries which invoke operations on the objects cannot be optimized:

var adults = from Person p in container
             where p.Name.ToLowerInvariant().Equals("joe")
             select p;
LinqExamples.cs: Unoptimizable query, because of the 'operations' withing the query
Dim adults = From p As Person In container _
 Where p.Name.ToLowerInvariant().Equals("joe") _
 Select p
LinqExamples.vb: Unoptimizable query, because of the 'operations' withing the query

Detect Unoptimized Queries

In Visual Studio, you can see a message in the debugger-output for each unoptimized query. First open the debug output window (Debug->Windows->Output). Then run your application. A query which cannot be optimized will produce this message:

'A first chance exception of type 'Db4objects.Db4o.Linq.QueryOptimizationException' occurred in Db4objects.Db4o.Linq.dll'

To find it out for a particular query, break before the query. Then step over the query and see if the message has been printed out.

For a broader picture, you can also use db4o's monitoring support. This will report the amount of unoptimized queries per second.

Improve Unoptimizable Queries

In cases where you have queries which cannot optimized it's often possible to split the query in two parts. The first part runs optimized. After that you run a regular LINQ to Object query to do the rest of the job. Let's look a this example:

var adults = from Person p in container
             where p.Age > 18 && p.Age < 70
                    && p.Name.Substring(2).Contains("n")
             select p;
LinqExamples.cs: Unoptimizable query
Dim adults = From p As Person In container _
 Where p.Age > 18 AndAlso p.Age < 70 AndAlso p.Name.Substring(2).Contains("n") _
 Select p
LinqExamples.vb: Unoptimizable query

In this example the part which calls the substring-operation cannot be optimized. Therefore the query runs very slow on large data sets. But the rest of the query could be optimized. So lets split this query into two parts:

var optimizedPart = from Person p in container
                    where p.Age > 18 && p.Age < 70
                    select p;
var endResult = from p in optimizedPart.AsEnumerable()
              where p.Name.Substring(2).Contains("n")
              select p;
LinqExamples.cs: Splitting into two parts
Dim optimizedPart = From p As Person In container _
 Where p.Age > 18 AndAlso p.Age < 70 _
 Select p
Dim endResult = From p In optimizedPart.AsEnumerable() _
 Where p.Name.Substring(2).Contains("n") _
 Select p
LinqExamples.vb: Splitting into two parts

The first query contains only the parts which can be optimized. After that, use the AsEnumerable()-operator to force to run the rest of the query with LINQ to objects. This splitting will improve the performance significantly, since parts of the operation run as optimized query.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/linq/linq_examples.htm0000644000175000017500000002476011520622610030415 0ustar directhexdirecthex LINQ Examples
You are here: Basics Operations & Concepts > Querying > LINQ > Simple LINQ Queries

LINQ Examples

In order to learn like, take a look a the LINQ-resources and tutorials out on the Internet. For example the LINQ-Overview at MSDN or at this example-collection. Here are a few db4o LINQ examples.

Simplest Possible Query

This query just returns all persons.

var allPersons = from Person p in container
                 select p;
LinqExamples.cs: Simple query
Dim allPersons = From p In container _
 Select p
LinqExamples.vb: Simple query

Query For a Name

This query searches for a person by name.

var allPersons = from Person p in container
                 where p.Name.Equals("Joe")
                 select p;
LinqExamples.cs: Query for name
Dim allPersons = From p As Person In container _
 Where p.Name.Equals("Joe") _
 Select p
LinqExamples.vb: Query for name

Query For a Certain Age

This queries for a certain age.

var allPersons = from Person p in container
                 where p.Age > 21
                 select p;
LinqExamples.cs: Query with a constraint
Dim allPersons = From p As Person In container _
 Where p.Age > 21 _
 Select p
LinqExamples.vb: Query with a constraint

Sorting The Result Of A Query

Sort the results of a query.

var allPersons = from Person p in container
                 where p.Age > 21
                 orderby p.Name
                 select p;
LinqExamples.cs: Use sorting on the query
Dim allPersons = From p As Person In container _
 Where p.Age > 21 _
 Order By p.Name _
 Select p
LinqExamples.vb: Use sorting on the query

Get The IQueryable Interface

You can get the .NET IQueryable interface for db4o

IQueryable<Person> personQuerable = container.AsQueryable<Person>();
var adults = from p in personQuerable
             where p.Age > 18
             orderby p.Name
             select p;
LinqExamples.cs: Get a IQueryable-instance
Dim personQuerable As IQueryable(Of Person) = container.AsQueryable(Of Person)()
Dim adults = From p In personQuerable _
 Where p.Age > 18 _
 Order By p.Name _
 Select p
LinqExamples.vb: Get a IQueryable-instance

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/linq/linq_for_compact_framework.htm0000644000175000017500000000763211520622616033155 0ustar directhexdirecthex LINQ For Compact Framework
You are here: Basics Operations & Concepts > Querying > LINQ > LINQ For Compact Framework

LINQ For Compact Framework

Compact Framework version 3.5 contains LINQ implementation for querying objects, however it does not contain the namespace System.Linq.Expressions, which is used by all optimized LINQ providers. Luckily there is a solution to this problem. Mono implementation of System.Core can be used to support optimized LINQ providers and expression interpreter contributed by Mainsoft to Mono's System.Core can be used to support full LINQ expression trees.

These assemblies were used by db4o team to compile a new assembly, System.Linq.Expressions.dll, which provides LINQ support to .NET Compact Framework 3.5. In order to use the full LINQ functionality including optimization, add a reference to System.Linq.Expressions.dll in your project and enjoy.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/query_by_example.htm0000644000175000017500000001236611520622616030170 0ustar directhexdirecthex Query By Example
You are here: Basics Operations & Concepts > Querying > Query By Example

Query By Example

Query By Example is a very special query method. Basically you pass in a example object to db4o. Then db4o searches the database for all objects which look alike.

The basic principal is like this. It goes through all fields of the example object. If a field doesn't have the default value it is used as constraint. It takes that value and checks for all objects which have an equal value for this field. If more than one field has a value, each value is used as constraint and combined. Here's a simple example.

Pilot theExample = new Pilot();
theExample.Name = "John";
IList result = container.QueryByExample(theExample);
QueryByExamples.cs: Query for John by example
Dim theExample As New Pilot()
theExample.Name = "John"
Dim result As IList = container.QueryByExample(theExample)
QueryByExamples.vb: Query for John by example

Take a look a the various examples of query by example examples. See "Query By Example Examples"

Query by Example has fundamental limitations, which limits its use cases. See "Query By Example Limitations"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/0000755000175000017500000000000011520622616027117 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_examples.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_examples.h0000644000175000017500000004406711520622614033712 0ustar directhexdirecthex Native Query Examples

Native Query Examples

Here's a collection of native query examples. These queries assume that there's a Pilot class with a name and age and a Car class with a pilot and name.

Note that for .NET 3.5 or newer we recommend to use LINQ instead of native queries.

Equality

This query shows you how compare a property for equality. In this example we compare the name of a person.

IList<Pilot> result = container.Query(
    delegate(Pilot pilot) { return pilot.Name == "John"; });
NativeQueryExamples.cs: Check for equality of the name
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryJohns)
NativeQueryExamples.vb: Check for equality of the name
Private Shared Function QueryJohns(ByVal pilot As Pilot)
    Return pilot.Name = "John"
End Function
NativeQueryExamples.vb: Query for John

Comparison

You can compare values with the usual comparison operators.

IList<Pilot> result = container.Query(
    delegate(Pilot pilot) { return pilot.Age < 18; });
NativeQueryExamples.cs: Compare values to each other
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryAdults)
NativeQueryExamples.vb: Compare values to each other
Private Shared Function QueryAdults(ByVal pilot As Pilot)
    Return pilot.Age < 18
End Function
NativeQueryExamples.vb: Query for adults

Query For Value Range

Of course you can combine different comparisons. For example you can combine the greater and smaller than operators to check for a range of values.

IList<Pilot> result = container.Query(
    delegate(Pilot pilot) { return pilot.Age > 18 && pilot.Age < 30; });
NativeQueryExamples.cs: Query for a particular rage of values
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryRange)
NativeQueryExamples.vb: Query for a particular rage of values
Private Shared Function QueryRange(ByVal pilot As Pilot)
    Return pilot.Age > 18 AndAlso pilot.Age < 30
End Function
NativeQueryExamples.vb: Query for range

Combine Check With Logical Operators

Of course you can combine a arbitrary set of conditions with logical operators.

IList<Pilot> result = container.Query(
    delegate(Pilot pilot)
        {
            return (pilot.Age > 18 && pilot.Age < 30)
                   || pilot.Name == "John";
        });
NativeQueryExamples.cs: Combine different comparisons with the logical operators
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf CombineCriterias)
NativeQueryExamples.vb: Combine different comparisons with the logical operators
Private Shared Function CombineCriterias(ByVal pilot As Pilot)
    Return (pilot.Age > 18 AndAlso pilot.Age < 30) OrElse pilot.Name = "John"
End Function
NativeQueryExamples.vb: Combine criterias

Query In Separate Method

You can implement your query in a separate method and then just us it where you need it. This is especially useful when you reuse the same query multiple times. Or you want to give your query a clear name for documentation purposes.

First write your method:

private static bool AllJohns(Pilot pilot)
{
    return pilot.Name == "John";
}
NativeQueryExamples.cs: Query as method
Private Shared Function AllJohns(ByVal pilot As Pilot) As Boolean
    Return pilot.Name = "John"
End Function
NativeQueryExamples.vb: Query as method

And then use it:

IList<Pilot> result = container.Query(new Predicate<Pilot>(AllJohns));
NativeQueryExamples.cs: Use the predefined query
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf AllJohns)
NativeQueryExamples.vb: Use the predefined query

Arbitrary Code

In principal your query can contain any code and can do the most complex comparisons. However in practice the are limitations. The simple queries are optimized and translated to SODA-queries. This is not possible for complex queries. If the query cannot be optimized, db4o will instantiate all objects and pass it to your query-object. This is a order of magnitude slower than a optimized native query and only feasible for smaller data sets.

IList<int> allowedAges = Array.AsReadOnly(new int[] {18, 20, 35});
IList<Pilot> result = container.Query(
    delegate(Pilot pilot)
        {
            return allowedAges.Contains(pilot.Age) ||
                   pilot.Name.ToLowerInvariant() == "John";
        });
NativeQueryExamples.cs: Arbitrary code
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryWithAnyCode)
NativeQueryExamples.vb: Arbitrary code
Private Shared Function QueryWithAnyCode(ByVal pilot As Pilot)
    Dim allowedAges As IList(Of Integer) = Array.AsReadOnly(New Integer() {18, 20, 35})
    Return allowedAges.Contains(Pilot.Age) _
                OrElse Pilot.Name.ToLowerInvariant() = "John"
End Function
NativeQueryExamples.vb: Query with arbitrary code

 

././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimization/db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimizati0000755000175000017500000000000011520622610034016 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020600000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimization/nq_build_time_optimisation.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimizati0000644000175000017500000001402211520622606034024 0ustar directhexdirecthex Native Query Optimization At Build Time
You are here: Basics Operations & Concepts > Querying > Native Queries > Native Query Optimization At Build Time

Native Query Optimization At Build Time

If the platform you're running doesn't support optimization at runtime you can use the compile-time optimization. See "Enhancement Tools"

Create the Enhancement Task

First we define the enhancement-task. This task will process the assembly and enhance it.

You can add this to the existing project-files. The .csproj or .vbproj are actually MSBuild-files. Open them with a XML-Editor and add the needed parts.

<Target Name="AfterBuild">
  <Db4oEnhancerMSBuildTask Assemblies="@(Db4oEnhance)" />
</Target>
simple-enhance-example.csproj: Define a target which runs the task

And the execute the task after the compilation.

<Target Name="AfterBuild">
  <Db4oEnhancerMSBuildTask Assemblies="@(Db4oEnhance)" CommandLine="-nq" />
</Target>
simple-enhance-example.csproj: Only enhance native queries

Now Visual Studio will automatically run the tasks for each build. You don't need to change anything else.

Often it's practical to have all persistent classes in a separate project or compile unit. Then the enhancement script runs only for this project. This makes it easy to enhance only the classes for the persistent objects.

There are lot of possibilities to tweak and configure the build-time enhancement so that it fits your requirements. See "Build Time Enhancement"

././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimization/monitoring_optimization.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimizati0000644000175000017500000001744311520622610034031 0ustar directhexdirecthex Monitoring Optimization
You are here: Basics Operations & Concepts > Querying > Native Queries > Monitoring Optimization

Monitoring Optimization

In order to optimize native queries the bytecode is analyzed and converted into SODA queries. This task isn't easy. If there's any doubt in the correctness of the conversion db4o won't do it. In such cases db4o falls back and instantiates all objects and runs it against the query. This is a order of magnitude slower than optimized queries. Therefore you probably want to monitor the query optimization and be warned when a query isn't optimized. This is possible with the diagnostic listeners.

configuration.Common.Diagnostic.AddListener(new NativeQueryListener());
NativeQueryDiagnostics.cs: Use diagnostics to find unoptimized queries
configuration.Common.Diagnostic.AddListener(New NativeQueryListener())
NativeQueryDiagnostics.vb: Use diagnostics to find unoptimized queries
class NativeQueryListener :IDiagnosticListener
{
    public void OnDiagnostic(IDiagnostic diagnostic)
    {
        if(diagnostic is NativeQueryNotOptimized){
            Console.WriteLine("Query not optimized"+diagnostic);
        } else if(diagnostic is NativeQueryOptimizerNotLoaded){
            Console.WriteLine("Missing native query optimisation assemblies" + diagnostic);
        }
    }
}
NativeQueryDiagnostics.cs: The native query listener
Class NativeQueryListener
    Implements IDiagnosticListener
    Public Sub OnDiagnostic(ByVal diagnostic As IDiagnostic) Implements IDiagnosticListener.OnDiagnostic

        If TypeOf diagnostic Is NativeQueryNotOptimized Then
            Console.WriteLine("Query not optimized" & Convert.ToString(diagnostic))
        ElseIf TypeOf diagnostic Is NativeQueryOptimizerNotLoaded Then
            Console.WriteLine("Missing native query optimisation assemblies" & Convert.ToString(diagnostic))
        End If
    End Sub
End Class
NativeQueryDiagnostics.vb: The native query listener

You can register a diagnostic listener and check for certain messages. There are two messages related to the native query optimization. The first is the NativeQueryNotOptimized-message. This tells you that a query couldn't be optimized. Consider simplifying the query. The second is the NativeQueryOptimizerNotLoaded-message. This message tells you that db4o couldn't find the libraries needed for the native query optimization. Check that you've included the assemblies-files you need.

 

././@LongLink0000000000000000000000000000020400000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimization/nq_optimization_on_cf2.0.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimizati0000644000175000017500000001025311520622606034026 0ustar directhexdirecthex NQ Optimization On CF2.0
You are here: Basics Operations & Concepts > Querying > Native Queries > NQ Optimization On CF2.0

NQ Optimization On CF2.0

Due to some platform limitations, CompactFramework 2.0 users using the more convenient delegate based Native Query syntax that want their queries to be optimized are required to run the Db4oTool.exe command line utility on their assemblies prior to deploying them. See "Enhancement Tools"

The utility, which can be found in the /bin folder of .NET distribution, is required because the CompactFramework API does not expose any of the delegate metadata needed by the Native Query optimizer. The tool works by augmenting the bytecode with the necessary delegate metadata and replacing ObjectContainer#Query invocations with invocations to a lower level method that makes use of the additional information.

././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimization.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_optimizati0000644000175000017500000002352611520622610034030 0ustar directhexdirecthex Native Query Optimization
You are here: Basics Operations & Concepts > Querying > Native Queries > Native Query Optimization

Native Query Optimization

Native queries will run out of the box in any environment. This optimization is turned on by default. Native queries will be converted to SODA where this is possible. This allows db4o to use indexes and optimized internal comparison algorithms. Otherwise native query may be executed by instantiating all objects, using SODA evaluations. Naturally performance will not be as good in this case.

Optimization Theory

For Native Query the bytecode is analyzed to create an AST-like expression tree. Then the flow graph of the expression tree is analyzed and converted to a SODA query graph.

For example:

IList<Pilot> result = container.Query(
    delegate(Pilot pilot) { return pilot.Name == "John"; });
NativeQueryExamples.cs: Check for equality of the name
Dim result As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryJohns)
NativeQueryExamples.vb: Check for equality of the name
Private Shared Function QueryJohns(ByVal pilot As Pilot)
    Return pilot.Name = "John"
End Function
NativeQueryExamples.vb: Query for John

First the signature of the given delegate is analyzed to find out the types. This is used to constrain the type in the SODA-query. Then the bytecode of query is analyzed to find out was it does. When the operations a simple and easy to convert, it will be transformed to complete SODA query:

IQuery query = container.Query();
query.Constrain(typeof (Pilot));
query.Descend("name").Constrain("John");

IObjectSet result = query.Execute();
SodaQueryExamples.cs: A simple constrain on a field
Dim query As IQuery = container.Query()
query.Constrain(GetType(Pilot))
query.Descend("name").Constrain("John")

Dim result As IObjectSet = query.Execute()
SodaQueryExamples.vb: A simple constrain on a field

Native Query Optimization

Native Query optimizer for .NET requires the following libraries to work: See "Dependency Overview"

  • Db4objects.Db4o.Instrumentation.dll
  • Db4objects.Db4o.NativeQueries.dll
  • Mono.Cecil.dll
  • Cecil.FlowAnalysis.dll

These assemblies must be available in your project for successful native query optimization.

Current optimization supports the following constructs well:

  • Compile-time constants.
  • Simple member access.
  • Primitive comparisons.
  • Equality operator.
  • Contains, StartsWith- and EndsWith-methods for strings.
  • Boolean expressions.
  • Arbitrary method calls,including property accessors, on predicate fields (without any arguments).
  • Candidate methods composed of the above.
  • Chained combinations of the above.

Note that the current implementation doesn't support polymorphism yet.

The specifics of Compact Framework platform are explained in NQ Optimization On CF2.0.

An alternative optimization practice can be found in Build-time Optimization For .NET article.

For more information on native queries optimization see Monitoring Optimization.

././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_sorting.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying/native_queries/native_query_sorting.ht0000644000175000017500000001266011520622616033741 0ustar directhexdirecthex Native Query Sorting
You are here: Basics Operations & Concepts > Querying > Native Queries > Native Query Sorting

Native Query Sorting

Native Query syntax allows you to specify a comparator, which will be used to sort the results:

IList<Pilot> pilots = container.Query(
    delegate(Pilot p) { return p.Age > 18; },
    delegate(Pilot p1, Pilot p2) { return p1.Name.CompareTo(p2.Name); });
NativeQueriesSorting.cs: Native query with sorting
Dim pilots As IList(Of Pilot) = container.Query(Of Pilot)(AddressOf QueryForAdults, AddressOf SortByName)
NativeQueriesSorting.vb: Native query with sorting
Private Shared Function QueryForAdults(ByVal pilot As Pilot) As Boolean
    Return pilot.Age > 18
End Function

Private Shared Function SortByName(ByVal pilot1 As Pilot, ByVal pilot2 As Pilot) As Integer
    Return pilot1.Name.CompareTo(pilot2.Name)
End Function
NativeQueriesSorting.vb: Query and sort function
db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/delete_behavior.htm0000644000175000017500000002010711520622610026056 0ustar directhexdirecthex Delete Behavior
You are here: Basics Operations & Concepts > Delete Behavior

Delete Behavior

Deleting an object is as simple as storing an object. You simply call the delete-method on the container to delete it. By default only the object you pass to the delete method is deleted. All referenced objects are not deleted.

Car car = FindCar(container);
container.Delete(car);
// We've deleted the only care there is
AssertEquals(0, AllCars(container).Count);
// The pilots are still there
AssertEquals(1, AllPilots(container).Count);
DeletionExamples.cs: Deleting object is as simple as storing
Dim car As Car = FindCar(container)
container.Delete(car)
' We've deleted the only care there is
AssertEquals(0, AllCars(container).Count)
' The pilots are still there
AssertEquals(1, AllPilots(container).Count)
DeletionExamples.vb: Deleting object is as simple as storing

Reference To Deleted Objects

What happens when you delete a object which is still referenced by other objects? Well in such cases that reference is set to null.

Pilot pilot = FindPilot(container);
container.Delete(pilot);
DeletionExamples.cs: Delete the pilot
Dim pilot As Pilot = FindPilot(container)
container.Delete(pilot)
DeletionExamples.vb: Delete the pilot
// Now the car's reference to the car is set to null
Car car = FindCar(container);
AssertEquals(null, car.Pilot);
DeletionExamples.cs: Reference is null after deleting
' Now the car's reference to the car is set to null
Dim car As Car = FindCar(container)
AssertEquals(Nothing, car.Pilot)
DeletionExamples.vb: Reference is null after deleting

Often you want to ensure that a object isn't referenced anymore, before you can delete it. However such referential integrity isn't supported at the moment. You need to implement your integrity checks manually, for example with callbacks.

Cascading Deletion And Collections.

Additionally you can configure cascading behavior for deletion. See "Cascading Deletion"

Also collections are treated like regular objects and need to be deleted explicitly. See "Collections And Arrays"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/acid_and_transactions.htm0000644000175000017500000001165611520622610027260 0ustar directhexdirecthex ACID Properties And Transactions
You are here: Basics Operations & Concepts > ACID Properties And Transactions

ACID Properties And Transactions

The ACID properties are one of the oldest and most important concepts of database theory. It sets out the requirements for the database reliability:

  • Atomicity: This means that must follow an "all or nothing" rule. Each transaction is either successfully completed or in case of failure the state of the database isn't changed at all.
    For example in a bank transfer transaction there are two steps: debit and credit. If the debit operation was successful, but the credit failed, the whole transaction should fail and the system should remain in the initial state.
  • Consistency: Consistency ensures that the database stays always in a consistent state. Each transaction takes the database from one consistent state to the next consistent state.
  • Isolation: Isolation means that different operations cannot access modified data from another transaction that has not yet completed. There are different isolation-models. See "Isolation"
  • Durability: This just refers to the real goal of any data store. It just means that the data should be persistently stored.

db4o fulfills the ACID properties. Each object container has its own transaction. Each transaction is a unit of work and ensures the ACID properties. This means, that a db4o transaction is an atomic operation. Either all changes of the db4o transactions are committed and made persistent. Or in case of a failure or rollback no state is changed. The database is kept consistent even on application or database crashes. And the db4o transactions are isolated from each other. See "db4o Transactions"

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/querying.htm0000644000175000017500000000756611520622614024622 0ustar directhexdirecthex Querying
You are here: Basics Operations & Concepts > Querying

Querying

db4o supports different query mechanisms.

The most convenient query mechanism is LINQ. You can use .NET's query API to query the objects in your database.

On .NET 2.0, Native Queries provide a sensible alternative for writing queries.

Queries-By-Example are appropriate as a quick start for users who are still acclimating to storing and retrieving objects with db4o, but they are quite restrictive in functionality.

The SODA Query is the underlying internal API. It is provided for backward compatibility and it can be useful for dynamic generation of queries, where Native Queries are too strongly typed. There may be queries that will execute faster in SODA style, so it can be used to tune applications. You can also run snippets of custom query code as part of the SODA query,

Of course, you can mix these strategies as needed.

db4o-8.0.184.15484+dfsg/doc/reference/Content/basics/getting_started.htm0000644000175000017500000001444611520622606026142 0ustar directhexdirecthex Getting Started
You are here: Basics Operations & Concepts > Getting Started

Getting Started

You can start using db4o within a few minutes following these few steps.

1. Download db4o

First download db4o on the official download site. There are different releases available on the web site. The latest production version, beta versions, continues build versions and older stable releases. Use the production version at the top to get started.

For each release there's a download for a particular .NET version. Choose the .NET version which you're using. For example .NET 4.0. You also can choose between a ZIP-file or a MSI-installer.

Download the file to your computer. If you've chosen the ZIP-file distribution unpack it. In case you've chosen the MSI-installer run it.

2. Content Of The db4o Distribution

The db4o distribution has following content.

db4o-folder/bin: Contains the db4o database engine and the supporting libraries. This folder contains sub-folders for different .NET platforms like the regular .NET framework, the compact framework etc.

db4o-folder/doc: Contains all the db4o documentation. There's the complete API-documentation (db4o-folder/doc/api/db4o.chm), the tutorial (db4o-folder/doc/tutorial/Db4oTutorial.exe) and the reference documentation (db4o-folder/doc/api/index.html)

db4o-folder/omn: Contains the installer for the Object Manager. See "Object Manager Enterprise"

db4o-folder/src: Contains the full source code of db4o.

Additional online resources are available here: http://developer.db4o.com/Resources

3. Adding db4o To Your Project

After you've downloaded and unpacked the db4o distribution, you can start using it. The core of db4o is the single Db4objects.Db4o.dll-assembly and has no additional dependencies. The other assemblies provide additional functionality See "Dependency Overview".

To use db4o in your project you only need to add the required assemblies to your project and then you're ready to go.

Here is how to do this with Visual Studio:

  • Open your project or create a new one.
  • Right-click on "References" in the Solution Explorer.
  • Choose "Add Reference".
  • Select "Browse".
  • Navigate to db4o distribution folder, there to the binaries folder and choose the assembly-files to add.
  • Confirm your choices.

4. Ready To Go

That's it, now you're ready to go and can use db4o in your project.

db4o-8.0.184.15484+dfsg/doc/reference/Content/client-server.htm0000644000175000017500000001514611520622610024262 0ustar directhexdirecthex Client-Server
You are here: Client-Server

Client-Server

db4o's is an embedded database which usually runs in process. Nevertheless db4o also supports a client server setup. There's no ready to use db4o server, instead you embedded the db4o server in a regular application. This gives you full how you want to run the db4o server.

In order to use the db4o client server mode you need to include the Db4objects.Db4o.CS.dll-assembly in your project. See "Dependency Overview"

Start The Server

You start the server by creating a object server instance with the client server factory. Pass the database file path and the port to the factory. After that you need to specify a user-name and password which clients can use to login to this server. You can add multiple users by calling the grant access method multiple times.

using (IObjectServer server = Db4oClientServer.OpenServer("database.db4o", 8080))
{
    server.GrantAccess("user", "password");

    // Let the server run.
    LetServerRun();
}
ServerExample.cs: Start a db4o server
Using server As IObjectServer = Db4oClientServer.OpenServer("database.db4o", 8080)
    server.GrantAccess("user", "password")

    ' Let the server run.
    LetServerRun()
End Using
ServerExample.vb: Start a db4o server

Connect To The Server

After the server is up an running you can connect to it. Pass the URL, port, user name and password to the client server factory. This will return a client object container. After that the container is ready to use.

using (IObjectContainer container
    = Db4oClientServer.OpenClient("localhost", 8080, "user", "password"))
{
    // Your operations
}
Db4oClientExample.cs: Connect to the server
' Your operations
Using container As IObjectContainer = Db4oClientServer.OpenClient("localhost", 8080, "user", "password")
End Using
Db4oClientExample.vb: Connect to the server

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/tuning.htm0000644000175000017500000000673011520622616023011 0ustar directhexdirecthex Tuning
You are here: Tuning

Tuning

This topic set explains different configuration, debugging and diagnostics issues. This information will help you to fine-tune your db4o usage and chase away bugs and performance pitfalls.

More Reading:

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/0000755000175000017500000000000011520622616023634 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/id_system.htm0000644000175000017500000002715711520622616026362 0ustar directhexdirecthex Id System
You are here: Configuration > Id System

Id System

The id-system configuration applies to the embedded- and the server-mode of db4o. There are tree different id-systems-available. All the id system configuration is accessible via the id-system-property on the configuration-object.

Note that you cannot change the id-system for an existing database. You need to defragment the database in order to change the id-system.

The id-system is responsible to mapping a object id to the physical location of an object. This mapping can have significant impact on the performance.

Stacked BTree Id-System

This setting uses a stack of two BTree's on top of an InMemoryIdSystem. This system is scalable for a large number of ids.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.IdSystem.UseStackedBTreeSystem();
IdSystemConfigurationExamples.cs: Use stacked B-trees for storing the ids
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.IdSystem.UseStackedBTreeSystem()
IdSystemConfigurationExamples.vb: Use stacked B-trees for storing the ids

Single BTree Id-System

This setting uses a single BTree on top of a in memory id system. This system works great for small databases. However it cannot scale for a large number of ids.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.IdSystem.UseSingleBTreeSystem();
IdSystemConfigurationExamples.cs: Use a single B-tree for storing the ids.
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.IdSystem.UseSingleBTreeSystem()
IdSystemConfigurationExamples.vb: Use a single B-tree for storing the ids.

In Memory Id-System

This id-system keeps all ids in memory. While accessing the ids if fast, all ids have to be written to disk on every commit. Therefore it can be used only for tiny databases.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.IdSystem.UseInMemorySystem();
IdSystemConfigurationExamples.cs: Use a in-memory id system
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.IdSystem.UseInMemorySystem()
IdSystemConfigurationExamples.vb: Use a in-memory id system

Pointer Based Id-System

This id system uses pointers to handle ids. Each id represents a pointer into the database-file. This makes the id-mapping simple. However since it's a pointer, you cannot change the location. Therefore this system leads to more fragmentation and performance degradation as the database grows.

This id system is here to ensure backward-compatibility. It's not recommended to use for new databases.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.IdSystem.UseInMemorySystem();
IdSystemConfigurationExamples.cs: Use a in-memory id system
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.IdSystem.UseInMemorySystem()
IdSystemConfigurationExamples.vb: Use a in-memory id system

Custom Id-System

It's possible to implement your own id system. You can pass an factory which creates your id-system implementation.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.IdSystem.UseCustomSystem(new CustomIdSystemFactory());
IdSystemConfigurationExamples.cs: use a custom id system
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.IdSystem.UseCustomSystem(New CustomIdSystemFactory())
IdSystemConfigurationExamples.vb: use a custom id system
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass_configuration.htm0000644000175000017500000002013611520622614031571 0ustar directhexdirecthex Class Specific Configuration
You are here: Configuration > Class Specific Configuration

Class Specific Configuration

Some settings are object-specific and are configured for the class. It's part of the common-configuration, which is available on the client, server and embedded-mode of db4o.

Its recommended that you use the same configuration for the client and the server.

Access the Class Configuration

The configuration for a specific class follows always the same pattern. First you specify for which type the configuration applies. You pass the type, the name as string or event an instance of the specific class to the configuration.

From the class-configuration, you also can go a level deeper to the field configuration.

Overview

Here's a overview over all common configuration-settings which you can change:

CallConstructor: Configure db4o to call constructors when instantiating objects.
CascadeOnDelete: When a object is deleted, delete also referenced objects.
CascadeOnUpdate: When a object is updated, update also referenced objects.
CascadeOnActivation: When a object is activated, activate also referenced objects.
Index: Don't index the objects of this type.
EnableReplication: Deprecated. Generate uuids and commit timestamps to enable replication.
GenerateUUIDs: Generate UUIDs, mainly used for replication.
GenerateVersionNumbers: Deprecated. Generate commit timestamps instead.
MaximumActivationDepth: Set a maximum activation-depth.
MinimumActivationDeph: Set a minimum activation-depth.
PersistStaticFields: Persist also the static fields of this type.
Rename: Rename this type. Used for refactorings.
Translate: Set a translator for this type.
StoreTransientFields: Store also transient fields.
UpdateDepth: Set the update-depth for this type.

 

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/0000755000175000017500000000000011520622616025124 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/no_callbacks.htm0000644000175000017500000001152011520622614030246 0ustar directhexdirecthex No callbacks
You are here: Configuration > Common Configuration > Disable Callbacks

Disable Callbacks

db4o supports callback-methods on each class. In order to support this, db4o scans all persistent classes and looks for the callback-method signature. When a lot of different classes are stored, this may take some time, especially on embedded devices. Therefore you can disable the object callbacks, when you don't need them.

Note that this doesn't disable the global events. These can still be used, even when callbacks are disabled.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.Callbacks = false;
CommonConfigurationExamples.cs: Disable callbacks
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.Callbacks = False
CommonConfigurationExamples.vb: Disable callbacks
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/disable_optimize_nq.htm0000644000175000017500000001161311520622616031661 0ustar directhexdirecthex Disable Optimize Native Queries
You are here: Configuration > Common Configuration > Disable Optimize Native Queries

Disable Optimize Native Queries

Normally db4o tries to optimize native queries at runtime. See "Native Query Optimization"

However on some limited embedded platforms like Android this doesn't work. In such cases you can disable the native query optimizer and use instead the compile time optimizer.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.OptimizeNativeQueries = false;
CommonConfigurationExamples.cs: Disable the runtime native query optimizer
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.OptimizeNativeQueries = False
CommonConfigurationExamples.vb: Disable the runtime native query optimizer
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/exceptionsonnotstorable.htm0000644000175000017500000001124711520622610032630 0ustar directhexdirecthex Exceptions On Not Storable Objects
You are here: Configuration > Common Configuration > Exceptions On Not Storable Objects

Exceptions On Not Storable Objects

When db4o cannot store a object, it will throw an exception. This is the default behavior. When you disable this object, db4o will silently ignore objects which cannot be stored instead of throwing an exception.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ExceptionsOnNotStorable = false;
CommonConfigurationExamples.cs: Disable exceptions on not storable objects
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ExceptionsOnNotStorable = False
CommonConfigurationExamples.vb: Disable exceptions on not storable objects

 

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/activation_depth.htm0000644000175000017500000001517411520622616031173 0ustar directhexdirecthex Activation Depth
You are here: Configuration > Common Configuration > Activation Depth

Activation Depth

db4o uses the concept of activation to avoid loading to much data into memory. You can change the global activation depth with this setting.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ActivationDepth = 2;
CommonConfigurationExamples.cs: Change activation depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ActivationDepth = 2
CommonConfigurationExamples.vb: Change activation depth

A higher activation depth is usually more convenient to work with, because you don't face inactivated objects. However, a higher activation depth costs performance, because more data has to read from the database. Therefore a good balance need to be found. Take also a look a transparent activation, since it solves the activation issue completely.

Class Specific Configuration

You can also configure a class specific activation depth. See "Class Specific Configuration"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).MinimumActivationDepth(2);
ObjectConfigurationExamples.cs: Set minimum activation depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).MinimumActivationDepth(2)
ObjectConfigurationExamples.vb: Set minimum activation depth
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/0000755000175000017500000000000011520622616027460 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/immediate_queries.htm0000644000175000017500000001147111520622616033671 0ustar directhexdirecthex Immediate Queries
You are here: Configuration > Common Configuration > Query Modes > Immediate Queries

Immediate Queries

This is the default query mode: the whole query result is evaluated upon query execution and an object IDs list is produced as a result.

Obviously evaluation takes some time and in a case of big result sets you will have to wait for a long time before the first result will be returned. This is especially unpleasant in a client-server setup, when query processing can block the server for seconds.

This mode makes the whole objects result set available at once. An result list is built based on the committed state in the database. As soon as a result is delivered it won't be changed neither by changes in current transaction neither by committed changes from another transactions.

Note that the result set contains only references to objects you were querying for, which means that if an object field has changed by the time of the actual object retrieval from the object set - you will get the new field value:

Advantages

  • If the query is intended to iterate through the entire resulting ObjectSet, this mode will be slightly faster than the others.
  • The query will process without intermediate side effects from changed objects (by the caller or by other transactions).

Disadvantages

  • Query processing can block the server for a long time.
  • In comparison to the other modes it will take longest until the first results are returned.
  • The ObjectSet will require a considerate amount of memory to hold the IDs of all found objects.
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/querymodecs.zip0000644000175000017500000000350411520622616032546 0ustar directhexdirecthexPKGq7Ή8yCPilot.csRQk0~/>Y֩cѱFϘYӕB}ww0 /{fQ[}<IVp-˸2 Q V#EA*vz¬P+y5GUU1l|ˤt-Ƣ:x"7!j?`wZk4&)U CPUidy%jUu :՜x",菍uY+|sJGɾEj#<_l43TF'.wM]E?o.lrei]G}PKa!8ܡH=g#QueryModesExample.csYmo6 O2ʱah|d5nv1lE1)@Ilo:8yxw(ՂHfޏ5x&tNOk=7b'ZA>N޵ZԷC~ b8>(a0S߿[|~ Ѯ7GĨ`(A%!s|(G' ƶDexkքshHP"mDY8 Lσ!ʽէ@j.sk"rHcص,<=KPDʄn·(kʵj4>CO 6ϊ Q~cH W)WgtMpЛ|*DJz f 1[V ^M|l(cޏ]1zul=dEo?@  Kkh9+v ?5+rTWG]K,/-)mteD9al3pwPX u!kSX,j`hX:Yg7=F8ӴkDD8{(7=7q}z1nR_+J0TB:?HPFBƄCԴ\)Ŋ`uQ7s2,AX8-W0_/N+螓b߿/O('Z;Y$m kۜ (--+'P oOFYfό iݒ[1]#]-V. !BEv̼PmM;7mܝ7s&2F 4 V _uƷх[K]Z@\XUvYvqt77!;AmVMN9kTm)gl'hJ79u9HˎgVe޹ ? c+>ۛj&U7_uٙ[g=V:sFr{Lf>~NRgZ!tw`F8?n4`ԩ.  V;s@" R$E z- W$5X ۮҿ8?^{!KUޤ9t]-1ee=QfB j02].os't<0x7<<*{x-.Cʗ; 0RUר:-|He=_T{㥉yJ8{b}gKO}Ӂ:XkUؚ֡PK(Gq7Ή8yC$ Pilot.cs ^iJiJiJPK(a!8ܡH=g#$ iQueryModesExample.cs U[^L.[^LiJPKndb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/snapshot_queries.htm0000644000175000017500000001173111520622610033563 0ustar directhexdirecthex Snapshot Queries
You are here: Configuration > Common Configuration > Query Modes > Snapshot Queries

Snapshot Queries

Snapshot mode allows you to get the advantages of the Lazy queries avoiding their side effects. When query is executed, the query processor chooses the best indexes, does all index processing and creates a snapshot of the index at this point in time. Non-indexed constraints are evaluated lazily when the application iterates through the ObjectSet result set of the query.

Snapshot queries ensure better performance than Immediate queries, but the performance will depend on the size of the result set.

As the snapshot of the results is kept in memory the result set is not affected by the changes from the caller or from another transaction.

Advantages

  • Index processing will happen without possible side effects from changes made by the caller or by other transaction.
  • Since index processing is fast, a server will not be blocked for a long time.

Disadvantages

  • The entire candidate index will be loaded into memory. It will stay there until the query ObjectSet is garbage collected. In a C/S setup, the memory will be used on the server side

Client/Server applications with the risk of concurrent modifications should prefer Snapshot over Lazy mode to avoid side effects from other transactions.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/lazy_queries.htm0000644000175000017500000001400011520622616032701 0ustar directhexdirecthex Lazy Queries
You are here: Configuration > Common Configuration > Query Modes > Lazy Queries

Lazy Queries

With the Lazy Querying no criteria evaluated at all. Instead an iterator is created against the best index found. Further query processing, including all index processing, will happen when the application iterates through the result. This allows you to get the first query results almost immediately.

In addition to the very fast execution this method also ensures very small memory consumption. Because lazy queries do not need an intermediate representation as a set of IDs in memory. With this approach it does not have to cache a single object or ID. The memory consumption for a query is practically zero, no matter how large the result set is going to be.

There are some interesting effects appearing due to the fact that the objects are getting evaluated only on a request. It means that all the committed modifications from the other transactions and uncommitted modifications from the same transaction will be taken into account when delivering the result objects.

Advantages

  • The call to Query.execute() will return very fast. First results can be made available to the application before the query is fully processed.
  • A query will consume hardly any memory at all because no intermediate ID representation is ever created.

Disadvantages

  • Lazy queries check candidates when iterating through the 'result'. In doing so the query processor takes changes into account that may have happened since the Query.execute() call: committed changes from other transactions, and uncommitted changes from the calling transaction. There is a wide range of possible side effects:
    • The underlying index may have changed.
    • Objects themselves may have changed in the meanwhile.
    • There even is a chance of creating an endless loop. If the caller iterates through the ObjectSet and changes each object in a way that it is placed at the end of the index, the same objects can be revisited over and over.
    In lazy mode it can make sense to work in same ways as with collections to avoid concurrent modification exceptions. For instance one could iterate through the ObjectSet first and store all the objects to a temporary collection representation before changing objects and storing them back to db4o.
  • Some method calls against a lazy ObjectSet will require the query processor to create a snapshot or to evaluate the query fully. An example of such a call is ObjectSet.size().

Lazy mode can be an excellent choice for single transaction read use, to keep memory consumption as low as possible.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/querymodevb.zip0000644000175000017500000000360611520622606032552 0ustar directhexdirecthexPK$d7^?[Pilot.vbQO0ߗ;\xqDhHLLx@ _M^fkcYݺCL{is b1Mp3 ኎[PeƘ'U 3c1 >] u+- !L"2_iZlAxeB2ZD Y2 |%VY3̽EN{HCfIF#~:sGɩ %2>QQԦ=*l&ҒU*zBY8 Dǃ-my r˿bE) P^]﫩{?U:fggkкmNEC]uPKa!817r#QueryModesExample.vbZo6~/Ke4abyHm5;^Z:(R#:_?%ے,,٬񾏔פ%ANDwj;֐ )X|xv6Q좡ɫN(Lsc!.ۓW|swS#r`B&RaВ)17w]i߳8vu7f \NB\LVs9&ad>I4D?.28 جz}5/?! ,Ʃz w\([g}D~K##()8@1LPasoK;\Tkvv cUΦ-}W &LyaQuͭ5KL m>ia m A6ʫc =LtJZhrYX$bl HxO{nu ֭"_PA4<%evB\DStF 5ĸ ^,qGC@J eXLGZkyJ\4V>ha%,jXkPi6~T@%~ 8OO)3Q\+ tmpI:R 3d90BKO=1h8mcbpOPln\ NCb,{[w3Pi4&YQV' ̂.'x{̀ǀnl{v+ơ~peHgO 9,;.kGer!Pȸlj$6D WE=`fHB3h #qyOo>~o!X̸ 2 l#}I#!d8]c&fk0S2>KMg``s*FuXaoG͠iSBRH䡣e0]N}*`0hCzni=;}z)i 9?IPFZN|c5HѲRuÍdV'W6i~~KΤoRCW!XOp6++=opԎMtF]ϩ]xV=UYAgV'<Ϯdz캮Ӈ|ҷCyCC#,f^?GEREGQä<Kâw6hTyWWʪ".oPK($d7^?[$ Pilot.vb iO3JI3JI3JPK(a!817r#$ QueryModesExample.vb ^Lv^L3JPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes/querymodejava.zip0000644000175000017500000000332111520622616033057 0ustar directhexdirecthexPKR6h: Pilot.java}Pj0 ='=fQl./plKlVؿIܒmiȶ{ vƞ*+|f ؚ 9zx՜@h(ᦁR+%g+ݩ1B>gi`E8y{U,MSG)]fHJ#XQgP'UwrNRcrE9RQIlVr4J"7}W@-4<_}#1c kXEzPKu69eiQueryModesExample.javaXmOFl$(:`QUw\Sx6C[UŞ${w}7۱qN\$ٙyfGc^ a⽽||zp’JrS^ AfzŚRD(nsyDGohX/7F#1LP%M,ڏ rG||Muxtl G8E,Ag>{i 9,tQ~ɾ~{hoiUdі744;Wpʔ#R4TbCc @T'y)b)ʰa=%v&rUXnr,.[uZg 4\kӿ;%wVpJb:5CaNfLsdCyG( z -CRw&x+_ܺd 8޸w?_x\A@cX%ڃ;ǵ ^EIe yTi=*ښ5 sC*х3u1z(nn!@%jhb-n:4[4Bt2)9a g|zRU0s%TZC i|4alxՁkVl56,쐷l<:9S6r$Z%H/$VKLèQ)rɳ6J%٪G2A{^G3DhLU[g3pkKjh5jN*wPfxߓӹ]=*):$xMqz/ 7tnJÒ!,)M,[}Xy qG2'YVzZr)Z%siii 5_n钏츩}]~; h7EqBp3km>L}~r<ŏDEb iˋ; Sexm LNA$ LPW'5E9 tweί `Aq)f2ɓ&o'?\\> _ТZcf/h~|-o! 5;q7sk_9-NlvPK(R6h: $ Pilot.java .op|߿|`4PK(u69ei$ #QueryModesExample.java |߿|4PK././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/weak_reference_collection_interval.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/weak_reference_collection_interva0000644000175000017500000001131411520622616033757 0ustar directhexdirecthex Weak Reference Collection Interval
You are here: Configuration > Common Configuration > Weak Reference Collection Interval

Weak Reference Collection Interval

By default db4o uses weak references to keep track of loaded objects. These weak references need to be clean up from time to time. You can change this collection-interval.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.WeakReferenceCollectionInterval = (10*1000);
CommonConfigurationExamples.cs: change weak reference collection interval
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.WeakReferenceCollectionInterval = (10 * 1000)
CommonConfigurationExamples.vb: change weak reference collection interval

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/alias.htm0000644000175000017500000001520711520622614026732 0ustar directhexdirecthex Aliases
You are here: Configuration > Common Configuration > Aliases

Aliases

Aliases allow you to use different names for your persistent classes in the database and in your application. Before a class is saved, db4o checks if an alias exists. If this is the case, the alias-name is used instead of the original name.

Adding Aliases

You can add aliases by adding instance of the Alias-interface to the configuration. You can add as many aliases to the configuration as you want. Following options are available.

  • TypeAlias: Allows you to give an alias for a certain type.
  • WildCardAlias: Allows you to give an alias for a namespace / multiple types. It allows you to use a wildcard for the name. (The *-character)
  • Your own implementation, by implementing the Alias-interface.

Each alias has two arguments. The first argument it the name which the type has in the database. The second argument is the type which is currently used. Ensure that you alias only types which can be resolved.

Note that in .NET the types-names contain the full namespace, classname and the assembly-name. For example the when you have an assembly called 'MyProject', a namespace 'Company.Project' and a class named Person, then the name of the type is: 'Company.Project.Person, MyProject'

Furthermore the order in which you add the aliases matters. Add first the most specific alias and the go to the more general alias. For example add first all TypeAlias and then the WildCardAlias.

// add an alias for a specific type
configuration.Common.AddAlias(
    new TypeAlias("Db4oDoc.Code.Configuration.Alias.OldTypeInDatabase, Db4oDoc",
                  "Db4oDoc.Code.Configuration.Alias.NewType, Db4oDoc"));
// or add an alias for a whole namespace
configuration.Common.AddAlias(
    new WildcardAlias("Db4oDoc.Code.Configuration.Alias.Old.Namespace.*, Db4oDoc",
                      "Db4oDoc.Code.Configuration.Alias.Current.Namespace.*, Db4oDoc"));
AliasExamples.cs: Adding aliases
' add an alias for a specific type
configuration.Common.AddAlias(New TypeAlias("Db4oDoc.Code.Configuration.Alias.OldTypeInDatabase, Db4oDoc", _
                                            "Db4oDoc.Code.Configuration.Alias.NewType, Db4oDoc"))
' or add an alias for a whole namespace
configuration.Common.AddAlias(New WildcardAlias("Db4oDoc.Code.Configuration.Alias.Old.Namespace.*, Db4oDoc", _
                                                "Db4oDoc.Code.Configuration.Alias.Current.Namespace.*, Db4oDoc"))
AliasExamples.vb: Adding aliases
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/calling_constructors.htm0000644000175000017500000001471611520622616032110 0ustar directhexdirecthex Calling Constructors
You are here: Configuration > Common Configuration > Calling Constructors

Calling Constructors

By default db4o by passes the constructor to instantiate the objects. Therefore it uses the reflection capabilities of the current platform. On some embedded platform this is not possible because of security and platform constrains. On other platforms bypassing the constructor is significantly slower than calling it. Therefore you change the behavior so that db4o calls the constructor. Note that when you enable this setting, you classes need a constructor which can be called with default-arguments without throwing an exception.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.CallConstructors = true;
CommonConfigurationExamples.cs: Call constructors
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.CallConstructors = True
CommonConfigurationExamples.vb: Call constructors

Class Specific Configuration

You can enable this setting only for certain classes. For example when the constructor needs to initialize transient fields.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).CallConstructor(true);
ObjectConfigurationExamples.cs: Call constructor
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).CallConstructor(True)
ObjectConfigurationExamples.vb: Call constructor
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/query_modes.htm0000644000175000017500000001254211520622614030174 0ustar directhexdirecthex Query Modes
You are here: Configuration > Common Configuration > Query Modes

Query Modes

What is the best way to process queries? How to get the optimum performance for your application needs?

Situations, when query result is bigger than the memory available or when query time is longer than the whole functional operation.

Luckily db4o takes most of the trouble for itself. There are three query modes allowing to fine tune the balance between speed, memory consumption and availability of the results:

  • Immediate: The default mode. The result is determined immediately and only the objects are lazy loaded.
  • Lazy: The query is evaluated while iterating to the result.
  • Snapshot: Runs the index-processing and creates a snapshot of the result. Further processing is done while iterating over the result.
IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.Queries.EvaluationMode(QueryEvaluationMode.Immediate);
CommonConfigurationExamples.cs: Change the query mode
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.Queries.EvaluationMode(QueryEvaluationMode.Immediate)
CommonConfigurationExamples.vb: Change the query mode

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/btree_node_size.htm0000644000175000017500000001261311520622610030773 0ustar directhexdirecthex B-Tree Node Size
You are here: Configuration > Common Configuration > B-Tree Node Size

B-Tree Node Size

db4o uses B-tree indexes for increased query performance and reduced memory consumption. B-trees are used for field-index, class-index and for the id-system. B-trees are optimized for scenarios where a part of the data is on secondary storage such as a hard disk, since disk accesses is extremely expensive. B-trees minimize the number of disk accesses required. You find more information about B-trees on the internet.

You can tune the B-trees by configuring the size of a node. Larger node sizes require less disk access, since a node is read on one read-operation. However it consumes more memory to keep the larger nodes available. Also larger nodes take longer to write back to disk. You need to tune the B-tree node size according to your application requirements. When benchmarking the settings, use large data sets. The influence of B-trees is more significant for larger dabases with 100'000 and more objects.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.BTreeNodeSize = 256;
CommonConfigurationExamples.cs: Change B-tree node size
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.BTreeNodeSize = 256
CommonConfigurationExamples.vb: Change B-tree node size
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/automatic_shutdown.htm0000644000175000017500000001145511520622616031565 0ustar directhexdirecthex Automatic Shutdown
You are here: Configuration > Common Configuration > Automatic Shutdown

Automatic Shutdown

With this setting you can disable the shutdown monitoring for db4o. By default, db4o will close the database when the CLR exits. However on some embedded devices this can lead to issues. So disable it when you experience problems when terminating the application.

Note that its recommended to dispose the object-container / -server when you close the application anyway, even when this setting is enabled.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.AutomaticShutDown = false;
CommonConfigurationExamples.cs: Disable automatic shutdown
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.AutomaticShutDown = False
CommonConfigurationExamples.vb: Disable automatic shutdown
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/register_type_handler.htm0000644000175000017500000000650011520622616032221 0ustar directhexdirecthex Register Type Handler
You are here: Configuration > Common Configuration > Register Type Handler

Register Type Handler

You can add special type-handlers for your datatypes. This allows you to plug in your own serialization-handling for that type. See "TypeHandlers"

Note that you need the type-handler on the client and server installed.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/update_depth.htm0000644000175000017500000001540011520622606030303 0ustar directhexdirecthex Update Depth
You are here: Configuration > Common Configuration > Update Depth

Update Depth

By default db4o only stores changes on the updated object but not the changes on referenced objects. With a higher update-depth db4o will traverse along the object graph to a certain depth and update all objects. See "Update Concept"

With the update-depth you configure how deep db4o updates the object-graph.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.UpdateDepth = 2;
CommonConfigurationExamples.cs: Increasing the update-depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.UpdateDepth = 2
CommonConfigurationExamples.vb: Increasing the update-depth

A higher update depth is usually more convenient, because you don't need to explicitly store each changed object. However the higher the update depth is the more time it takes to update the objects. Therefore it is a tradeoff. Note that you can also use transparent persistence, which takes of updating the right objects.

Class Specific Configuration

You can also configure a class specific update depth. See "Class Specific Configuration"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).UpdateDepth(2);
ObjectConfigurationExamples.cs: Set the update depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).UpdateDepth(2)
ObjectConfigurationExamples.vb: Set the update depth
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/intern_strings.htm0000644000175000017500000001142211520622610030700 0ustar directhexdirecthex Intern Strings
You are here: Configuration > Common Configuration > Intern Strings

Intern Strings

You can configure db4o to call the intern method on all strings. See more on the intern method for your platform.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.InternStrings = true;
CommonConfigurationExamples.cs: intern strings
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.InternStrings = True
CommonConfigurationExamples.vb: intern strings

Benefits

When a lot of strings contain a the exact same content, calling intern on them can safe some memory.

Disadvantage

Calling intern on a string adds that string to a global pool. Therefore this string cannot be garbage collected. So when you load a lot of strings which you use only once, you can run into memory-problems.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/diagnostics.htm0000644000175000017500000001111611520622614030143 0ustar directhexdirecthex Diagnostics
You are here: Configuration > Common Configuration > Diagnostics

Diagnostics

Enables you to add diagnostic listeners to db4o. Read more in the tuning chapters. See "Diagnostics"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.Diagnostic.AddListener(new DiagnosticToConsole());
CommonConfigurationExamples.cs: Add a diagnostic listener
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.Diagnostic.AddListener(New DiagnosticToConsole())
CommonConfigurationExamples.vb: Add a diagnostic listener

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/string_encoding.htm0000644000175000017500000001247311520622610031013 0ustar directhexdirecthex String Encoding
You are here: Configuration > Common Configuration > String Encoding

String Encoding

When db4o stores and loads strings it has to convert them to and from byte arrays. By default db4o provides three types of string encoding, which do this job: Unicode, UTF-8 and ISO 8859-1, Unicode being the default one. In general Unicode can represent any character set. However, it also imposes a certain overhead, as character values are stored in 4 bytes (less generic encoding usually use 2 or even 1 byte per character). In order to save on the database file size, it is recommended to use UTF-8, which only required one byte per character.

Note that the string encoding need to be the same on the server and clients. Also you cannot change the string encoding for an existing database. If you want to change the encoding, you need to defragment the database.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.StringEncoding = StringEncodings.Utf8();
CommonConfigurationExamples.cs: Use the utf8 encoding
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.StringEncoding = StringEncodings.Utf8()
CommonConfigurationExamples.vb: Use the utf8 encoding

Of course you can also implement your own string encoding. You just need to implement the string encoding interface and pass it to this configuration.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/mark_transient.htm0000644000175000017500000001123311520622614030655 0ustar directhexdirecthex Mark Transient
You are here: Configuration > Common Configuration > Mark Transient

Mark Transient

This allows you to configure additional Attributes to mark fields as transient. You can add multiple such Attributes by calling the method for each Attribute once.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.MarkTransient(typeof (TransientMarkerAttribute).FullName);
CommonConfigurationExamples.cs: add an transient marker annotatin
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.MarkTransient(GetType(TransientMarkerAttribute).FullName)
CommonConfigurationExamples.vb: add an transient marker annotatin
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/configuration_items.htm0000644000175000017500000001244211520622616031711 0ustar directhexdirecthex Common Configuration Items
You are here: Configuration > Common Configuration > Common Configuration Items

Common Configuration Items

Configuration items add special capability to the system. Here's a list of all configuration items available.

TransparentActivationSupport

Support for transparent activation. See "Transparent Activation"

TransparentPersistenceSupport

Support for transparent persistence. See "Transparent Persistence"

UniqueFieldValueConstraint

Set up unique Field constraints. See "Unique Constraints"

FreespaceMonitoringSupport

Enables you to monitor the free-space-manager. See "Runtime Monitoring"

IOMonitoringSupport

Enables you to monitor the IO-activity of db4o. See "Runtime Monitoring"

NativeQueryMonitoringSupport

Enables you to monitor the native queries. See "Runtime Monitoring"

NetworkingMonitoringSupport

Enables you to monitor the network activity of db4o. See "Runtime Monitoring"

ObjectLifecycleMonitoringSupport

Enables you to monitor the object lifecycles. See "Runtime Monitoring"

QueryMonitoringSupport

Enables you to monitor db4o queries. See "Runtime Monitoring"

ReferenceSystemMonitoringSupport

Enables you to monitor db4o's reference system. See "Runtime Monitoring"

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/reflector.htm0000644000175000017500000001236711520622606027633 0ustar directhexdirecthex Changing The Reflector
You are here: Configuration > Common Configuration > Changing The Reflector

Changing The Reflector

This setting allows you to change the reflector for db4o. The reflector is responsible to inspect the metadata of objects and report them to db4o. See "db4o Reflection API"

There are currently two reflectors available:

  • NetReflector: The default reflector which uses standard .NET reflection for inspecting and accessing objects.
  • FastNetReflector: A reflector which generates special access-code for each class. Therefore it is a lot faster than the default NetReflector. However it has a higher memory-consumption due to the generated code.
IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ReflectWith(new FastNetReflector());
CommonConfigurationExamples.cs: Change the reflector
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ReflectWith(New FastNetReflector())
CommonConfigurationExamples.vb: Change the reflector

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/message_level.htm0000644000175000017500000001264111520622606030454 0ustar directhexdirecthex Message Level
You are here: Configuration > Common Configuration > Message Level

Message Level

This allows you to enable debug-messages of db4o. Currently four message levels are supported:

  • Level = 0: No messages, default configuration. 
  • Level> 0: Normal messages.
  • Level> 1: State messages (new object, object update, delete);
  • Level> 2: Activation messages (object activated, deactivated).
IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.MessageLevel = 4;
CommonConfigurationExamples.cs: Change the message-level
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.MessageLevel = 4
CommonConfigurationExamples.vb: Change the message-level

By default the output is send to the console. But you can redirect the output to any output stream. See "Changing the Output Stream"

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/no_schema_changes.htm0000644000175000017500000001167311520622616031272 0ustar directhexdirecthex Disable Schema Change Detection
You are here: Configuration > Common Configuration > Disable Schema Change Detection

Disable Schema Change Detection

db4o scans the class structure to find out the schema of the objects. This takes a little time. When a lot of classes are persistent this may take some time, especially on embedded devices.

Therefore you can disable this check. You can disable it only, when db4o already knows all stored classes. This means a object of each class has already been stored once. Furthermore there shouldn't be any further changes.

This setting is only useful for very special scenarios with no schema evolution at all. Otherwise this setting may cause strange and subtle errors!

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.DetectSchemaChanges = false;
CommonConfigurationExamples.cs: Disable schema evolution
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.DetectSchemaChanges = False
CommonConfigurationExamples.vb: Disable schema evolution
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/disable_weak_references.htm0000644000175000017500000001120011520622610032435 0ustar directhexdirecthex Disable Weak References
You are here: Configuration > Common Configuration > Disable Weak References

Disable Weak References

By default db4o uses weak references cache to all loaded objects. This ensures that the objects can be garbage collected. However it does impose a small overhead. You can disable weak reference if you like. Then db4o uses regular references. When disabled you need to remove objects explicit from the cache.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.WeakReferences = false;
CommonConfigurationExamples.cs: Disable weak references
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.WeakReferences = False
CommonConfigurationExamples.vb: Disable weak references
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/name_provider.htm0000644000175000017500000001070611520622606030473 0ustar directhexdirecthex Name Provider
You are here: Configuration > Common Configuration > Name Provider

Name Provider

You can overwrite how the object-containers is named. This can be helpful for debugging multiple-container scenarios.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.NameProvider(new SimpleNameProvider("Database"));
CommonConfigurationExamples.cs: set a name-provider
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.NameProvider(New SimpleNameProvider("Database"))
CommonConfigurationExamples.vb: set a name-provider
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/out_stream.htm0000644000175000017500000001074111520622616030023 0ustar directhexdirecthex Changing the Output Stream
You are here: Configuration > Common Configuration > Changing the Output Stream

Changing the Output Stream

Normally the debug messages of db4o are printed to the default console. However you can configure db4o to send the information to any output stream:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.OutStream = Console.Out;
CommonConfigurationExamples.cs: Change the output stream
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.OutStream = Console.Out
CommonConfigurationExamples.vb: Change the output stream
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/updating_db4o_file_format.htm0000644000175000017500000001327711520622616032742 0ustar directhexdirecthex Updating Db4o File Format
You are here: Configuration > Common Configuration > Allow Version Updates

Allow Version Updates

The db4o database file format is a subject to change to allow progress for performance and additional features. db4o does not support downgrades back to previous versions of database files. In order to prevent accidental upgrades when using different db4o versions, db4o does not upgrade databases by default. Database upgrading can be turned on with the following configuration switch:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.AllowVersionUpdates = true;

// reopen and close the database to do the update
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, DatabaseFile);
container.Close();
CommonConfigurationExamples.cs: Update the database-format
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.AllowVersionUpdates = True

' reopen and close the database to do the update
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, DatabaseFile)
container.Close()
CommonConfigurationExamples.vb: Update the database-format

Please note that, once the database file version is updated, there is no way to get back to the older version. When a database file is opened successfully with the new db4o version, the upgrade of the file will take place automatically. You can simply upgrade database files by opening and closing a db4o database once.

Recommendations for upgrading:
  • Backup your database file to be able to switch back.
  • Defragmenting a database file with the new db4o version after upgrading can make the database more efficient.
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common/no_test_instances.htm0000644000175000017500000001133511520622610031355 0ustar directhexdirecthex No test instances
You are here: Configuration > Common Configuration > Disable Constructor Testing

Test For Constructors

This setting is only relevant for some embedded platforms which need a constructor (for example Android).

On startup, db4o checks that the classes have a callable constructor. This may take some time, especially on embedded platforms. When you run in production, you can disable this check, when you are sure that all classes can be instantiated.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.TestConstructors = false;
CommonConfigurationExamples.cs: Disable testing for callable constructors
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.TestConstructors = False
CommonConfigurationExamples.vb: Disable testing for callable constructors
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/server_configuration.htm0000644000175000017500000001135111520622614030602 0ustar directhexdirecthex Server Configuration
You are here: Configuration > Server Configuration

Server Configuration

The server-configuration applies to the db4o-server. All the server specific configuration is directly on the client configuration interface.

You can also configure the common-, file-, id-system- and the network-settings for a server.

Server Socket Timeout

Configure how long it takes, before an inactive connection is timed out.

IServerConfiguration configuration = Db4oClientServer.NewServerConfiguration();
configuration.TimeoutServerSocket = (10 * 60 * 1000);
ServerConfigurationExamples.cs: configure the socket-timeout
Dim configuration As IServerConfiguration = Db4oClientServer.NewServerConfiguration()
configuration.TimeoutServerSocket = (10 * 60 * 1000)
ServerConfigurationExamples.vb: configure the socket-timeout
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/overview.htm0000644000175000017500000000463111520622616026220 0ustar directhexdirecthex Overview

Overview

Delete this text and replace it with your own content.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/0000755000175000017500000000000011520622616025112 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/timeout_client_socket.htm0000644000175000017500000001065111520622606032222 0ustar directhexdirecthex Timeout Client Socket
You are here: Configuration > Client Configuration > Timeout Client Socket

Timeout Client Socket

Configure how long it takes, before an inactive connection is timed out.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.TimeoutClientSocket = (1 * 60 * 1000);
ClientConfigurationExamples.cs: Configure the timeout
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.TimeoutClientSocket = (1 * 60 * 1000)
ClientConfigurationExamples.vb: Configure the timeout
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/prefetch-visualisation.png0000644000175000017500000006245211520622616032321 0ustar directhexdirecthexPNG  IHDR]?KgAMA a cHRMz&u0`:pQ<PLTE     % 5'8% 3&8$5'+ )%475 5-,4$($&&)4,1;7))7*865+874Hc*N3k#J-3L(9pEu5DT-HqKP "R.R6/k1h*"f7&d92u:'z76F7MDjzBݺW]-G.&FW5k 4ֽ2C){]p-u*ʤG]^ia"CtaVD3[FZZ ]3-cV誾#vf;)3-vp[D]3g*gş/3z5OuΕP'_QEzOo=tР7x4ե8\U|~'bH++t "?:36]t?s^N~n-zpYw__m+`w~gR*Ό?|ǿ__}cI]9s['͛﹨c/_AdI^-5js=QX ^JtOC+~~~zMWll޻7?>Ջ7|_W&?tw7?\v<|ϥ߬*5C>客@;[tE7I|r[ew}2,yw8Fu/!z? d&qx{K]/}ru wakI*_ETPכK<2]gN~zOnJt}~Е-w}##儮OG/_C+ˍfɱyg}5;O~۸ @[_ W&ƩVG_e>>\ׯ8:䟯쯼m_*?}ģW}&+_cWg铟~i+>uU`il؞nm۞YkOW''2ys^ |kWk=׮]eb⡋l~뱍+֮Ɖ^R׮]{ eP8ի1hyK?vm\5G'&ի( ;gV/;oZN>1(ka0-oPX|rG+'mA|LFg*c?,W-oN8 fI}?L>wtr{-ǡtι7yL gS/3Inm.Y]@ż^.BGp2>' =| :3IDZ,=QA$?*!ċNcGD6 H+`F_sً8Ǩu M`цM:"UI':XqT "PI JK8 [ZmCVw ȆL 811w1q P"c  `PG~Iaj"829r9bD,e|{bkQ^jc i[W505AV⟄/>{23⬢3DJUY1~RN,.pe׫v;zੇOm_'YE*Tj|`8.h ] d̰?qIs- t^[Mmu]?qbl1]s:1n+yd-7Ǝ~cYiSX"ƏfcM;}d#zij\I:g7=gL'vu,i~/&?&ϓQ9l qwZw Ƣo Kv f{O߷ =ۧd\6[WVm_k:__Zt?(2w lf䁁\.Mwa-5r95,r`!m[DzU_=:;;n}9AK54{e\[/\vi~n`c] ܚ3+S<0880qWĚWȈs3WKgÝ{ܗzceAwS[֘xdĀ:}=..DTygN>700Ά* "{ZOtfku]֋R]m efs_-^@ֻj[/h)KD]܅K3l"&bGXoߞUKFsmnZv{mKTUڲKEp=ܷ7׻vφ}WV_msWK|Bw. NZUXvcTѱKow3i#{_ZW]tt|@enuӾ#f^oշ]Z,|U.80)68`rwQ\פW Ra65W^PƲa!5]gdSEwvtFF'LnEE  g4Rٹ0>]91hN\|gaHYZQX%|d,Zn} O$V>oQlyAR KryƘF^EKAp E)S{4kN|h#.:,'u,~b.w1͊3-De,Uyp L8n+|w^:^]5oXR.Qu]Fdr. ˡ>y0*|@~Q`K.Ȭ![*sܵSw-dkA!wكI-ֻܫضw-LWxN(U7_~u ^qW(wyGzEc^ܵ{ wu~!qk qׂcZܵGF-Z~m!w##3,.Zܵ~x :i] Zܵu B2|a󁏻`B.wqդҾ[`։N9w/w}3-Uk9;ᄏն:NTܛVދ:::VPm]n?w5Y~غdu ]ulm6{|ES˴VuX?=iDY[$slw 8-w qWnq~rj5 {(t+|5֔AY7W*;lڇ}7oA-[]V")3貯\>e6qb|[A}cˎf ]sϵ0Vvݟ; oo fGkT"R]F:7:5@/|֕[/[Cڷ6(o2/nBìak-6ۛ.9W~YB(*]׌6?*łӻ|sH5۪]Mz_!kд@ sc?D]9z5fS1wٳҮ36ktKW]tskElQW hӦ]Mj)_ ^bnZMar<@l pWj,&_vz^z5qr&ev @WEz]3gBwh6!.߂` C[Vm/؛~4ۛ}جE[oΕXоuC%5HqȄ1& gŖ):vܹ@שew֮ z|K_jN*2#=udSEЈ~ԳCjʔwaHDTE@;w^Q܅n;t3ֻ3 ^Qw4J]/ۿK+V|[w)jͲ+w9.#|tϮ/X@WzkW:3gOj뫑əͼ]oxpJ}[=u,ݲllqW3XZ+2qѫbX4#[WGVTS]T-EˎCV_-Y]RE?`howGC3#dDZ(+g$ysJ/loܝu&ˮfYT2M$dm6z >v .uD́+J c<& :c3j*+7^`^"ռݳi.T%) L]tX"8qeתexr<!ɗDTE<sW3~tQpr֧ͳvfew}AߐN+n+4]&=箈f૘"1ICwLjwֻg}Ѹ̎))KamjRXw律 s),'6w}Q_ree]U?zđRKGڼ_>m650e ه#h?mO Mk.xQRVJ=up޶f1g^THӞfH15wq|ET6?3ș3QqW-ϧUYI'"&M[72 yN޼zDe%Ū9mD]y^җ}-ݽcC+?xՊU[YQJ}uCCI0GSкXФ ؚmrC&me9c3Օ|SOe)jTiKrl[VVSltX4Jfw5bChG<:K e׻nP(lnvH@W<|0w滟~s"W+qWj' w}]*ڍo5 Tuo9Sܕ:̐Euo.D9ʍom4yQWΝ\/6w+cKY'o澎K \<^?Wo88Wq׹*r={pLD |3?\aȬQ{MV)}6- ;]Pܕ*댌%*m;M{U/ᦠ=7ukH{*UHcg*<6 oQ ƠXX`zavksiV$ *MX]KXsS%aJֲ`3DA!*%ߨ+_cMognE Jbuc:?(Q1҅P ^%>sǎaOb{A>62OQ16L"5[ZIЪo3+:ȯ~SXo>鼈Ks$u,b:B {$(yi*yDWDUlȁ_Lʅd 9 4x]Uaλ9CzEGhʥ-"K~pXٿ9[Cr cҕ <0xty\gܷGů9#5l$thǡTm۽W]fFGFde+\K!l,zֻmqLnqVSΔ=Lsʮ Im.(!NI! "Ct5UOD* xj鯐{UV%l&qSժHwD`}ݽDX/B{ohj\}>| )/6}YyB+ɶ?!ev@c.A)2VBZi\3EnlvZKP,20 ,K,eﲁ&-}j.ٓri3q\:>TFÙ`% <٤%L04,sGbTvL%DUrIR|*~-%w^J ]#jq<ɳFJ*坬tV[/$E2V&G]sN>keE&o(I9wz ^E`Pw{{\4_]F8 [墅5,4Q{ ڪ9 #w7:FX-L$0Ns;TvTŃ *'K9Cڠ \ HY'x R>Xw1aoy*IZt*s`|Y&B1w^h'GN~-q%""v+ ~mO>O7Jez{auʒTHn>Z?`0FtD]]{!xTQdջTp(1O87f@'[sį]4O;݃qW5'|.Z֫{JLiYѕSr]~J&eV-K Ց%߳ij:G+Sy[jjiUơ1Wp[ASz*SNЋN ~%\h]Uụ4y,&LAZ X-΀f%.< 7?D * ƫ9hL8 ]Xdcջhkϫwi늻z ]PLy_?C#w p.`_G**&஠t4E4~^ݻ@0Iaz;Newi*s6Q@ 2@w0?ݱ~Mk2z`=XcZ=SAgZ?Og5JR닻t'w CcEKvi@wrjD_[~-~-'+r4w ʍ?^#|fEEhѨ+jBg8aŪ8^>؅%}{.-P򧺶rltp˨1Dw*jkD JY6( D_ۺ=yUf7PY.\:q.Xx~-;?j++vFQ{,^9ҍ~~ĹP5*3.!M_wZyƘ+cMyڹt'cVwBlbADP*?c58Od3% ^]dLiϪOc1+'Ypkm}`3tH/]6t0 .y~?Ers_*pMj$G.oR9?DCEKL"[~֞M%~%ũ. M;^yP4w1d_9p/h^DUsގKM.eK:SS1gېOu Xx/j~Gv~s%8}ʥsUnwuI-uF;\u Z4:;:lFz|{;;.:;";%E6]Qg:f[*<96A3rSkGsfZN. C[%K)8?[N^t V.X1S(*!ad~N\I~ukK/!?ڹd%ۥ:TUc*C-,v1e 6.Yq}_tn-gKQQԌ7\s;ـU=4@mz:|Ë/ݜB[]{>4꼴v rFzaԩ/+&߃r J%.&U0_/ɽ$~i';WR] zO~zӍ6o461q}e2|5U]\8Z}ZVlt5dBۛ@WϮn{:ow %1glQr﷜6oRKALqmaW6_-{ZECP7M UpqzsF߉ǘgukH{##vFRϊm^+֩Ԡ]"Pi'F,Yo~7#"D|]9OUzq~MӜ$5ipӦ^y+f[F`\Q@k`gdp.x ]u,T!.LB/^:h9s[GcRhn(Аqwj;7Xé_n1=˯1-q%B3=!]ս+GLշ[+ۭbטܥ$3Z0uWJ;ςhv?uo;} ]_Q}_/_/_9D8HW C>"4O'ߝL~b Wu+;#k7lD'%v]SG?"_jg-nӨ˽. c)?¦:wB\ NVO(FLҩ/Eqn9O_ P~^?|bEpk^Տ?,]92EWvEDGވL,ؠHt" W.bABׇ "j c aib򱮣 HX#EwyVsoz/q{I.<=-s7>]#cwFsn>>W AD#m-4v`^vwm{cco)ڽl{1[r@\]Ti]MgCsV˺ui9Oc D(#C7K8pJv\:]?\!?e.q%(X$dk/uT` wȯh.I}uMs}?_Ŧ` 0 _Gɜz!B( ŷ"h3w _(2Cd;bdZձ: 2FJ(Ԁu\5"IH;qg%qZwZwn]92t݊12q<^:n02-b"{ElԁZɝ3*!jNGb%_tN٪sϯR.9P9>I V>G^+W_Yޓ@+ibFF8FuP;8CPѡjO/*@]%,Mzdܥ*yAo\k:wS+5'Fa_WX FpHpTGF`irߝ'pM)DTŞF[8=qͫ΋ᰫS.*(wq5AX% T`r_ iR9g8T. 4ܗWz3=T( 'h\4V?݊ċ|[Lm]>dn*ᦘEsƮ' O˹vvSKC"=E."O"!qW\>TJ*EB<pf\)S”6+%\[]NgaT.H__澍k6..q .nK^ӣGKS) sX%TܥWBVRҡQy5ޠ挮y~ڐNԝW^W/]VPe$^и땞k@8)D,=26}qhP#cHCtː^lg9:w`v@ORqWR{mfK׻yNh3w*']dT-'z m'|6hO&FXKJ{L?;i_ܥiloIjQ]cM9]!N0cb*r6ȠgoTQ=+bW>$ZO+A!xKt{>i?<.R7wLN4rf4JB_z\Q\ح $U℠Qǭ!uZT90jD]9#WT<R\5/=C].CJG;ݎ(wiep*x)XD^gRn?w)C7(pNEpKeG Rޛpo4&&37dc/⮤" %_ܕZ2LMqğnrqW*yqW<ɨk3[ we[HdPb07<{Dઌ"_0]Ģ= ̈+.8W5L-.&\˘?dx0pMmӓ/]bdLXR3f q&xsE٥qP -+"qWUl'{(@.vv]L?a)S[`dLwaX^ /<w]ٺa.Tʶ2wᶊ Թr~-DL*Ӭ#bzDdqMugR5L'xzw5+xOT PqeW*>#'_x9cy+؝_'̖riH%'hjfRPv}=>[' ،F!<8%wKwpDQvxIw71 &TgN|Vd7 i6T4dlemYGM9!24#Ciu.*΅;ƒ bR>C>]*Ԇ؍/Ũ',GlLG1x%7˰1yLSv"B64VA+vUT_V>*OQg^Kdckd4~?TqVqM{V5v Z2wqEbXtQ>C׻p} y[ß91&n$TPȕRt%Tu]n|+2TEʌFk9+"TaݪzoQY;59!֏qѕe-oj"ݳz*@UU](h "UG '`u^?l8- #ʻsv1+j] x]U /T2"NyOe}kC8IxSȹ\_*>  6 yg!##|r(dOU}Ւu*/pv>q-v##H)(\'PU}U뎝"lrR)W;B5%>Q2F?M[PcYqRJb+<#4 K/E&Ťi´A^EŦS;ЃbU6bƨyPt%.9lTNjvKw_͚=P}jd.QM ,]9Cx[,chAxR'h@)I(vN ,QB3H.T|~GUr3O( ddzv <ը olQiZͫ7ϯ[K%< o8nEˆ>2,)?.صKpnh-C^^& JRȕ`|RTڗ ƢŴ>b' xƦ*Otp"ҬjhhJYrbI]QI\pBE~MkbNJ4X%X.Jtz8JUUK.Y2bFzj܅]']աT5i^ >^8KHN)+).<)K:FhEW]42&Z@45*&t]U%;a$¸ ]i&a/_qW={I72Vmg\91w?FH$Е,'&t.`._|~#4ܕ4N&y5TM]#c9c%wBm.NHXat0(i#zd/D 𥈜'HtImZ  $X:bU w54¯k0Mxrwtm +N VoTZ zzWX5 tAź ZE[$u q '.y) #E?$RqS٩;b/ӏH{fEKI:I]%Y^KPx~D`eJ$~Y/*jh& WV~'@e q-@.9kb[^Zt댄'f/16$KLMy6ʮZV%*kX{3PQ+$֒~DYU (ɅUu$aGYdYIb T˿[.+r]OFV8k)%v^Pw)x-N PT Aۛ3P\򈌧 _(˚&͔etlPhs I'/k0ϫU*$H4E==)ٻ T0@-fǤ }K%+^̌]"K"ReĜ`ńy5As>B "WK"5+Ј&|ˮDR<8fzWhwE54@u&TzB#>@!I.x<ԹKQqbEI \]bU%JtH݅׻<䍐A6q!|cMDbyǨÍR 9D[$ 3^#Z t",7v'#cu^6$ZE׍A$Ҩ,$Yg0t@iTV3`OdJbdߐ[ H.71<. 뫆4=dewUs['FBG~8֘hbzcA<֑=kXr7C=ՏP*) #ڊ:#qfj&'S EqW<{pG6 ͽQ<( Eqb9W8,i|nx 9@rF3e([G0g[L]lCt}&J41NjwuDwhxFa=G] .c }Fȵzsg82T!D" F LM"!T-w&hkIŀK]BL_vܱ1]K9sYb7f I/!E]DEʠ(vdzxLKa[I՗Um]?Oslen2X9YΘ]ehޜ$wa(1>.fw%TIQZ#ceO.$<3L'T5*e"G13&B\2TqQ2%wIF2r]{%j+2{%$I:Iw%Q)>ŊycȈY*K i{I*+ I ͉J]Q}~*/B3\з0KÚ]l &LHC)9X0%5g4Yr$Gtj'l"'0wa˜zYҰ"aυW#5sN.GlTbVpW \J]4 MqWBw$.3&L.+Ldsz].4D_0A@]FY8l ˬ@wɨ6^ڝ3ƕN(c[+F^׻(4;kfIj#I*0,>{ӠkqW x, I: .%Y".u%]Jmd4TL_R Hr2O (.Ci#S ok?!Ƒ":(!kP+. P=S{$):;gtKWáPk^YN7[Ɣ]p.SSUe^M)Gev Q \cuСYV$Geq'eTbj3 .12*]d9]&p3^ ],*)20j%>#~E!ƼKwXK ][}]2(} 7e.:.eDga-#С]|WL.Z.$D`9wah.ߴ:x`O42zh*x=Tc.'.{JwJAVEh>j,_СHXlз5%]1ZwhhP*ӝ⡋K%8Hm]3łVNt_=W~+j)½ڪ Ly1gsyc5>r$#KrowSj+VDexEsWpkHtH|P^ 1Qqcd~"Ot`s)>/'-2*ľQVJzAj*vqgC͢ wSg#+I vW]!Td]|RDvY`T D4^F]n(1YgAhƾ! IT:)7bblB!Aܥ432hÜ1hB~Dx5kc Y+"i-wһ]1 < w@v.Q `^P9jHDW#sIþ6Ww@.K ^F&(\oiWXU%uIIR^WOq2V;EsbPr;,i"ʉD%4'g6} iXuFqlK]7 gcQ»dһC^ސElBkE#!ɸ$22Kʪ.H!8.cVTx+ϿΥ2%'CRduKą kEeB.9iP.Y|]&Kq^<, PpWzI M]beƘep%:QNIѕHҋֻ0gL`xN攖v+AR+FVp) P:sխ$.%qޕ3b+$sWf+QIpXeĖ=(4+nh^`.^X70fd.[_MM[ I`kZJw%C[]15EcQSF>c"ɹ _HJwa3#Ys_gL.R)R"ZN.KI"4odo#@kxti4qW6gL22Vor-v <] I(Aj.H'R&?: bP$wUgpc!`p, zUTʎOF-J@,7Mٚ+(uFs' *E YyzKy+Qp[|'ofSzJ.؉c.V]n[Bď${6vu%h}WP^I&S:A8q) %*0,x{T rBe("IY"!ܵ"V)uWs`{c,UG '=eBZTgVGj[V~I^w]jܥkۇsA|zߴϪgI0ssN-լRbölY(]/GvxIas6Yq`D:kV>rSWRYT{_KVp=҂0]O6*AR | *Tzͬ]/Oɚ Qw\ݪ`-_\ ZH"##G9r葑:J#G>:2"ÇYds7lb9}(t_. #%!MҰXl)B@u qN(^Sؗ&38|dZ%[( [G!{@ 1WN`I5 ZCdu) ] $&4QUr$}%&.K -43A{0K qۘnčիg$U_qǻgB;q4K.tbGb\uZ4'9 $q4TA|fwBl*I$s=\NUOB9LjU'n]z5֟%=^d%h*K:@ j!F3]!J]}8,C}v1y 1wċ)k19]@Bp-k{Ҡ 1Q_[v\ Message Sender
You are here: Configuration > Client Configuration > Message Sender

Message Sender

This gives you access to the message sender, which allows you to send messages to the server. See "Messaging"

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/prefetch_depth.htm0000644000175000017500000001227311520622610030607 0ustar directhexdirecthex Prefetch Depth
You are here: Configuration > Client Configuration > Prefetch Depth

Prefetch Depth

In a client server scenario, network latency is one of the biggest performance concerns. Instead of making lots of little requests, it's more to do bulk operations. A good way is to prefetch objects which are maybe required later.

The prefect depth influences to which depth the object-graph is loaded from the server when query for objects. Prefetched objects avoid additional roundtrip's to the server for getting the data. However more data needs to be sent to the clients.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.PrefetchDepth = 5;
ClientConfigurationExamples.cs: Configure the prefetch depth
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.PrefetchDepth = 5
ClientConfigurationExamples.vb: Configure the prefetch depth

The prefetch depth and the prefetch object count are closely related to each other. The prefetch object count configures how many objects are prefetched from a query-result. The prefetch-depth configures how deep the object-graph is fetched.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/prefecht_id_count.htm0000644000175000017500000000763411520622616031322 0ustar directhexdirecthex Prefetching IDs For New Objects
You are here: Configuration > Client Configuration > Prefetching IDs For New Objects

Prefetching IDs For New Objects

Sets the number of IDs to be pre-allocated new objects created on the client. This avoids requests to allocate new ids when new objects are stored on a client.

 

When a new object is created on a client, the client should contact the server to get the next available object ID. PrefetchIDCount allows to specify how many IDs should be pre-allocated on the server and prefetched by the client. This method helps to reduce client-server communication.

PrefetchIDCount can be tuned to approximately match the usual amount of objects created in one operation to improve the performance.

When the PrefetchIDCount is one, the client will have to connect to the server for each new objects created. On the other hand,, when the PrefetchIDCount is bigger than the amount of new objects the database will keep unnecessary preallocated ids.

The default PrefetchIDCount is 10.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/prefetch_slot_cache_size.htm0000644000175000017500000001075711520622606032653 0ustar directhexdirecthex Prefetch Slot Cache Size
You are here: Configuration > Client Configuration > Prefetch Slot Cache Size

Prefetch Slot Cache Size

Configures how big the cache for prefetched data is. A larger cache can improve performance, but consumes more memory.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.PrefetchSlotCacheSize = 1024;
ClientConfigurationExamples.cs: Configure the slot cache
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.PrefetchSlotCacheSize = 1024
ClientConfigurationExamples.vb: Configure the slot cache
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client/prefetch_object_count.htm0000644000175000017500000001203211520622610032152 0ustar directhexdirecthex Prefetch Object Count
You are here: Configuration > Client Configuration > Prefetch Object Count

Prefetch Object Count

In a client server scenario, network latency is one of the biggest performance concerns. Instead of making lots of little requests, it's more to do bulk operations. A good way is to prefetch objects which are maybe required later.

The prefect count configures how many objects of a query-result are loaded from the server. Prefetched objects avoid additional roundtrip's to the server for getting the data. However more data needs to be sent to the clients.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.PrefetchObjectCount = 500;
ClientConfigurationExamples.cs: Configure the prefetch object count
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.PrefetchObjectCount = 500
ClientConfigurationExamples.vb: Configure the prefetch object count

The prefetch depth and the prefetch object count are closely related to each other. The prefetch object count configures how many objects are prefetched from a query-result. The prefetch-depth configures how deep the object-graph is fetched.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/0000755000175000017500000000000011520622610026015 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/single_threaded_client.htm0000644000175000017500000001201111520622606033206 0ustar directhexdirecthex Single Threaded Client
You are here: Configuration > Networking Configuration > Single Threaded Client

Single Threaded Client

You can configure the client to be single-threaded. When you enable this option, the client doesn't use background threads to handle the client-server communication.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.SingleThreadedClient = true;
NetworkConfigurationExample.cs: single threaded client
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.SingleThreadedClient = True
NetworkConfigurationExample.vb: single threaded client

Advantage

On some smaller embedded systems reducing the running threads improves the performance significantly.

Disadvantage

Since all operations run in a single thread, the operations may take longer. Additionally you cannot receive messages and cannot use commit-callbacks on a single-threaded client.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/client_server_factory.htm0000644000175000017500000001120111520622610033115 0ustar directhexdirecthex Client Server Factory
You are here: Configuration > Networking Configuration > Client Server Factory

Client Server Factory

Allows you to change the behavior how a client or a server is created.

This setting should be set to the same value on the server and the clients.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.ClientServerFactory = new StandardClientServerFactory();
NetworkConfigurationExample.cs: exchange the way a client or server is created
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.ClientServerFactory = New StandardClientServerFactory()
NetworkConfigurationExample.vb: exchange the way a client or server is created
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/batch_mode.htm0000644000175000017500000001257711520622610030630 0ustar directhexdirecthex Batch Mode
You are here: Configuration > Networking Configuration > Batch Mode

Batch Mode

Batch mode allows to increase the performance by reducing client/server communication. It's activated by default.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.BatchMessages = true;
NetworkConfigurationExample.cs: enable or disable batch mode
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.BatchMessages = True
NetworkConfigurationExample.vb: enable or disable batch mode

db4o communicates with the server by means of messaging. Without batch mode db4o sends a message for each operation and waits for the response. This might be quite inefficient when there are many small messages to be sent (like bulk inserts, updates, deletes). The network communication becomes a bottleneck. Batch messaging mode solves this problem by caching the messages and sending them only when required.

Advantages

  • Reduced network load.
  • Increased performance for bulk operations.

Disadvantages

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/max_batch_queue_size.htm0000644000175000017500000001145011520622610032714 0ustar directhexdirecthex Max Batch Queue Size
You are here: Configuration > Networking Configuration > Max Batch Queue Size

Max Batch Queue Size

To avoid unnecessary network traffic, the client and server can queue up operations, which don't need to be executed immediately. As soon as a message need to be send, all queued messages are send as well. You can configure the maximum of this message queue.

A larger size allows to queue up more messages and avoid unnecessary network roundtrip's. However queued up messages consume additional memory.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.MaxBatchQueueSize = 1024;
NetworkConfigurationExample.cs: change the maximum batch queue size
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.MaxBatchQueueSize = 1024
NetworkConfigurationExample.vb: change the maximum batch queue size
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/message_recipient.htm0000644000175000017500000000622311520622606032225 0ustar directhexdirecthex Message Recipient
You are here: Configuration > Networking Configuration > Message Recipient

Message Recipient

Register a message recipient for the this object container / server. See "Messaging"

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/networking/pluggable_sockets.htm0000644000175000017500000001151211520622606032231 0ustar directhexdirecthex Pluggable Sockets
You are here: Configuration > Networking Configuration > Pluggable Sockets

Pluggable Sockets

db4o allows to customize client-server communication by using pluggable socket implementations.

IClientConfiguration configuration = Db4oClientServer.NewClientConfiguration();
configuration.Networking.SocketFactory = new StandardSocket4Factory();
NetworkConfigurationExample.cs: Exchange the socket-factory
Dim configuration As IClientConfiguration = Db4oClientServer.NewClientConfiguration()
configuration.Networking.SocketFactory = New StandardSocket4Factory()
NetworkConfigurationExample.vb: Exchange the socket-factory

One use case for changing the socket-implementation is encryption. In fact, db4o's SSL-support uses this mechanism: See "Using SSL For Client-Server Communication"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/common_configuration.htm0000644000175000017500000003677711520622614030607 0ustar directhexdirecthex Common Configuration
You are here: Configuration > Common Configuration

Common Configuration

The common-configuration applies to the embedded-, client- and the server-mode of db4o. All the common configuration is accessible via the common-property on the configuration-object.

Overview

Here's a overview over all common configuration-settings which you can change:

  Same in C/S1 Can not change 2
ActivationDepth: Change globally the activation-depth.    
Aliases: Configure aliases for class and package-names.    
AllowVersionUpdates: Allow/Disallow to update the database-format. Yes  
AutomaticShutDown: Close the database when the application exits.    
BTreeNodeSize: Tune the size of the B-tree-node which are used for the indexes.    
Callbacks: Turn object-callbacks on an off.    
CallConstructors: Use or bypass the constructor for creating objects.    
DetectSchemaChanges: Disable/Enable schema changes detection.    
Diagnostic: Add diagnostic-listeners.    
ExceptionsOnNotStorable: Enable/Disable exceptions on not storable objects.    
InternStrings: Will call the intern-method on the retrieved strings.    
MarkTransient: Configure a Attribute for marking fields as transient.    
MessageLevel: Configure the logging-message level.    
NameProvider: Configure the toString() value of the object-container.    
ObjectClass: Configure class-specific settings.    
OptimizeNativeQueries: Enable runtime query optimization.    
OutStream: Configure the log message output stream    
Queries: Configure query behaviors    
ReflectWith: Configure a reflector.    
RegisterTypeHandler: Register a new TypeHandler. Required  
StringEncoding: Configure the string-encoding. Required Yes
TestConstructors: Configure if db4o checks for valid constructors.    
UpdateDepth: Change the update-depth.    
WeakReferenceCollectionInterval: Change the weak-reference cleanup interval. Default setting is 1000 milliseconds.    
WeakReferences: Enable/disable weak references.    

Additional Configuration Items

There are additional configuration items which add for additional features. You can add then on the common-configuration. For example to enable transparent persistence you add the TransparentPersistenceSupport configuration item. Take a look a the available configuration items. See "Common Configuration Items"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/0000755000175000017500000000000011520622616024553 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/recover_mode.htm0000644000175000017500000001135711520622610027737 0ustar directhexdirecthex Recovery Mode
You are here: Configuration > File Configuration > Recovery Mode

Recovery Mode

This option only makes sense when you try to recover a corrupted database.

Turns recovery mode on and off. Recovery mode can be used to try to retrieve as much as possible out of an corrupted database. In recovery mode internal checks are more relaxed. Null or invalid objects may be returned instead of throwing exceptions. Use this method with care as a last resort to get data out of a corrupted database.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.RecoveryMode = true;
FileConfiguration.cs: Enable recovery mode to open a corrupted database
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.RecoveryMode = True
FileConfiguration.vb: Enable recovery mode to open a corrupted database
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/generate_uuids.htm0000644000175000017500000001455311520622610030272 0ustar directhexdirecthex Generate UUIDs
You are here: Configuration > File Configuration > Generate UUIDs

Generate UUIDs

db4o can generate UUIDs for each stored object. These UUIDs are mainly used for replication together with commit timestamps. Of course it can be used also for other purposes.

Enable UUIDs for all objects.

You can enable UUIDs for all objects. Set the global scope on the UUID setting.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.GenerateUUIDs = ConfigScope.Globally;
FileConfiguration.cs: Enable db4o uuids globally
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.GenerateUUIDs = ConfigScope.Globally
FileConfiguration.vb: Enable db4o uuids globally

Enable UUIDs for certain classes

You can also enable uuids only for certain classes:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.GenerateUUIDs = ConfigScope.Individually;
configuration.Common.ObjectClass(typeof (SpecialClass)).GenerateUUIDs(true);
FileConfiguration.cs: Enable db4o uuids for certain classes
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.GenerateUUIDs = ConfigScope.Individually
configuration.Common.ObjectClass(GetType(SpecialClass)).GenerateUUIDs(True)
FileConfiguration.vb: Enable db4o uuids for certain classes
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/block_size.htm0000644000175000017500000001241611520622610027407 0ustar directhexdirecthex Block Size
You are here: Configuration > File Configuration > Block Size

Block Size

The block-size determines how how large a database can be. This value can be between 1 and 127. The default is 1. The resulting maximum database file size will be a multiple of 2GB. For example a a block-size of 8 allows a database-size up to 16 G. With the largest possible setting, 127, the database can grow up to 254 GB. A recommended setting for large database files is 8, since internal pointers have this length.

This configuration-setting has to be set the first time the database is created. You cannot change it for an existing database. If you want to change it, you need to deframent the database.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.BlockSize = 8;
FileConfiguration.cs: Increase block size for larger databases
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.BlockSize = 8
FileConfiguration.vb: Increase block size for larger databases

Advantages and Disadvantages

A larger value allows a larger database. However, since objects are aligned to the block size, a larger value will result in less efficient storage space usage. Furthermore a larger value may decrease the performance, because it causes more cache misses.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/disable_commit_recovery.htm0000644000175000017500000001226211520622614032157 0ustar directhexdirecthex Disable Commit Recovery
You are here: Configuration > File Configuration > Disable Commit Recovery

Disable Commit Recovery

This option only makes sense when you try to recover a corrupted database.

Turns commit recovery off. db4o uses a two-phase commit algorithm to ensure ACID properties. In a first step all intended changes are written to a free place in the database file, the "transaction commit record". In a second step the actual changes are performed. If the system breaks down during commit, the commit process is restarted when the database file is opened the next time.

On very rare occasions (possibilities: hardware failure or editing the database file with an external tool) the transaction commit record may be broken. In this case, this method can be used to try to open the database file without commit recovery. The method should only be used in emergency situations after consulting db4o support.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.DisableCommitRecovery();
FileConfiguration.cs: Disable commit recovery
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.DisableCommitRecovery()
FileConfiguration.vb: Disable commit recovery
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/0000755000175000017500000000000011520622616026217 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/memory_storage.htm0000644000175000017500000002566511520622606032002 0ustar directhexdirecthex Memory Storage
You are here: Configuration > File Configuration > Storage > Memory Storage

Memory Storage

The MemoryStorage allows you to create and use a db4o database fully in RAM. This strategy eliminates long disk access times and makes db4o much faster.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
MemoryStorage memory = new MemoryStorage();
configuration.File.Storage = memory;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using memory-storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim memory As New MemoryStorage()
configuration.File.Storage = memory
IOConfigurationExamples.vb: Using memory-storage

MemoryStorage can be created without any additional parameters passed to the constructor. In this case default configuration values will be used.

PagingMemoryStorage

The regular MemoryStorage implementation keeps all the content in a single byte-array. However this brings some issues. When the database outgrows the array-size, a new, larger array is created and the content is copied over. This can be quite slow. Also can cause this a out of memory exception, because during the copying these two large arrays are present. Also, on some runtimes large objects are treated different by the garbage-collector and are less often collected.

To avoid all this issues, the PagingMemoryStorage uses multiple, small arrays to keep the database in memory. When the database outgrows the storage, only such a smaller arrays needs to be allocated. The old content stays in the existing arrays. No coping is required.

However managing these arrays cost some small overhead. But for lots of cases, the PagingMemoryStorage is the better choice.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
PagingMemoryStorage memory = new PagingMemoryStorage();
configuration.File.Storage = memory;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using paging memory-storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim memory As New PagingMemoryStorage()
configuration.File.Storage = memory
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOConfigurationExamples.vb: Using paging memory-storage

Growth Strategy for MemoryStorage

Growth strategy defines how the database storage (reserved disk or memory space) will grow when the current space is not enough anymore.

DoublingGrowthStrategy - default setting. When the size of the database is not enough, the reserved size will be doubled.

ConstantGrowthStrategy - a configured amount of bytes will be added to the existing size when necessary.

IGrowthStrategy growStrategy = new ConstantGrowthStrategy(100);
MemoryStorage memory = new MemoryStorage(growStrategy);
configuration.File.Storage = memory;
IOConfigurationExamples.cs: Using memory-storage with constant grow strategy
Dim growStrategy As IGrowthStrategy = New ConstantGrowthStrategy(100)
Dim memory As New MemoryStorage(growStrategy)
configuration.File.Storage = memory
IOConfigurationExamples.vb: Using memory-storage with constant grow strategy

MemoryBin

Each memory storage can contain a collection of memory bins, which are actually just names memory storages. You can reuse the MemoryBin created earlier for this MemoryStorage. MemoryBins are identified by their URI, i.e. when an object container is opened with:

.NET:

Db4oEmbedded.OpenFile(embeddedConfiguration, "myEmbeddedDb.db4o");

A MemoryBin with URI = "myEmbeddedDb.db4o" will be used. If this memory bin does not exist in the storage when the container is opened, a new MemoryBin will be created and associated with this URI. When you pass the same memory storage to multiple object containers these containers can access to the same in memory file when they are using the same name.

More Reading:

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/filestorage.htm0000644000175000017500000001643611520622610031241 0ustar directhexdirecthex FileStorage
You are here: Configuration > File Configuration > Storage > FileStorage

FileStorage

FileStorage is the base storage mechanism, providing the functionality of file access. The benefit of using FileStorage directly is in decreased memory consumption.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
IStorage fileStorage = new FileStorage();
configuration.File.Storage = fileStorage;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using the pure file storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim fileStorage As IStorage = New FileStorage()
configuration.File.Storage = fileStorage
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOConfigurationExamples.vb: Using the pure file storage

Without cache, the file storage is significantly slower than with cache. Therefore this storage is normally used as underlying storage for other purposes. Typically it is used together with a CachingStorage on top of it:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
IStorage fileStorage = new FileStorage();
IStorage cachingStorage = new CachingStorage(fileStorage, 128, 1024);
configuration.File.Storage = cachingStorage;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using a caching storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim fileStorage As IStorage = New FileStorage()
Dim cachingStorage As IStorage = New CachingStorage(fileStorage, 128, 1024)
configuration.File.Storage = cachingStorage
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOConfigurationExamples.vb: Using a caching storage

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/memory_storage/0000755000175000017500000000000011520622606031252 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/memory_storage/storing_memorybin_data.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/memory_storage/storing_memo0000644000175000017500000001114311520622606033677 0ustar directhexdirecthex Storing MemoryBin Data
You are here: Configuration > File Configuration > Storage > Storing MemoryBin Data

Storing MemoryBin Data

You can use db4o backup functionality to backup your in memory container. See "Backup"

container.Ext().Backup(new FileStorage(), "advanced-backup.db4o");
BackupExample.cs: Store a backup with storage
container.Ext().Backup(New FileStorage(), "advanced-backup.db4o")
BackupExample.vb: Store a backup with storage
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/0000755000175000017500000000000011520622616031705 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/logging_storage.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/logging_s0000644000175000017500000002512311520622616033603 0ustar directhexdirecthex Logging Storage
You are here: Configuration > File Configuration > Storage > Logging Storage

Logging Storage

In this example we will implement a simple file base storage, which will log messages about each IO operation. In the implementation you can see that most of the functionality is derived from StorageDecorator and BinDecorator classes with additional logging added:

LoggingStorage.cs
/**//* Copyright (C) 2004 - 2009  Versant Corporation http://www.versant.com */
using System;
using Db4objects.Db4o.IO;

namespace Db4odoc.Storage
 {
    class LoggingStorage : StorageDecorator
     {
        // delegate to a normal file storage
        public LoggingStorage()
            : base(new FileStorage())
         {

        }

        // use submitted storage as a delegate
        public LoggingStorage(IStorage storage)
            : base(storage)
         {

        }

        /**//**
         * opens a Bin for the given URI.
         */
        public override IBin Open(BinConfiguration config)
         {
            IBin storage = base.Open(config);
            if (config.ReadOnly())
             {
                return new ReadOnlyBin(new LoggingBin(storage));
            }
            return new LoggingBin(storage);
        }

        /**//// <summary>
        /// LoggingBin implementation. Allows to log information
      /// for each IO operation
        /// </summary>
        class LoggingBin : BinDecorator
         {

            public LoggingBin(IBin bin)
                : base(bin)
             {

            }

            // delegate to the base class and log a message
            public override void Close()
             {
                base.Close();
                System.Console.WriteLine(string.Format
("{0} LoggingStorage: File closed", DateTime.Now.ToString()));
            }

            // log a message, then delegate
            public override int Read(long pos, byte[] buffer, int length)
             {
                System.Console.WriteLine(
string.Format("{0} LoggingStorage: Reading {1} bytes and {2} position", 
DateTime.Now.ToString(), length, pos));
                return base.Read(pos, buffer, length);

            }

            // log a message, then delegate
            public override void Write(long pos, byte[] buffer, int length)
             {
                System.Console.WriteLine(
string.Format("{0} LoggingStorage: Writing {1} bytes and {2} position", 
DateTime.Now.ToString(), length, pos));
                base.Write(pos, buffer, length);
            }

            // log a message, then delegate
            public override void Sync()
             {
                System.Console.WriteLine(
string.Format("{0} LoggingStorage: Syncing", DateTime.Now.ToString()));
                base.Sync();
            }

        }
    }
}

LoggingStorage.vb
' Copyright (C) 2004 - 2009  Versant Corporation http://www.versant.com 

Imports System
Imports Db4objects.Db4o.IO

Namespace Db4odoc.Storage
    Class LoggingStorage
        Inherits StorageDecorator
        Public Sub New()
            ' delegate to a normal file storage
            MyBase.New(New FileStorage())

        End Sub

        Public Sub New(ByVal storage As IStorage)
            ' use submitted storage as a delegate
            MyBase.New(storage)

        End Sub

        '
        ' opens a logging bin for the given URI.
        '         
        Public Overloads Overrides Function Open(ByVal config _ 
As BinConfiguration) As IBin
            Dim storage As IBin = MyBase.Open(config)
            If config.[ReadOnly]() Then
                Return New ReadOnlyBin(New LoggingBin(storage))
            End If
            Return New LoggingBin(storage)
        End Function

        ' LoggingBin implementation. Allows to log information
        ' for each IO operation
        Private Class LoggingBin
            Inherits BinDecorator

            Public Sub New(ByVal bin As IBin)
                MyBase.New(bin)

            End Sub

            ' delegate to the base class and log a message
            Public Overloads Overrides Sub Close()
                MyBase.Close()
                System.Console.WriteLine( _ 
String.Format("{0} LoggingStorage: File closed", DateTime.Now.ToString()))
            End Sub

            ' log a message, then delegate
            Public Overloads Overrides Function Read(ByVal _ 
pos As Long, ByVal buffer As Byte(), _  
ByVal length As Integer) As Integer
                System.Console.WriteLine( _ 
String.Format("{0} LoggingStorage: Reading {1} bytes and {2} position", _ 
DateTime.Now.ToString(), length, pos))

                Return MyBase.Read(pos, buffer, length)
            End Function

            ' log a message, then delegate
            Public Overloads Overrides Sub Write(ByVal pos As Long, _ 
ByVal buffer As Byte(), ByVal length As Integer)
                System.Console.WriteLine(_ 
String.Format("{0} LoggingStorage: Writing {1} bytes and {2} position", _ 
DateTime.Now.ToString(), length, pos))
                MyBase.Write(pos, buffer, length)
            End Sub

            ' log a message, then delegate
            Public Overloads Overrides Sub Sync()
                System.Console.WriteLine( _ 
String.Format("{0} LoggingStorage: Syncing", DateTime.Now.ToString()))
                MyBase.Sync()
            End Sub

        End Class
    End Class
End Namespace

Use the LoggingStorage implementation with the following code (you can find a working example if you download LoggingStorage class).

C#:

config.File.Storage(new LoggingStorage());

VB.NET:

config.File.Storage(New LoggingStorage())

Download example code:

VB.NET c#

././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/storagejava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/storageja0000644000175000017500000000445711520622610033613 0ustar directhexdirecthexPK*:8'OFullLRUCachingStorage.javaQK0?w11S ; CMF$$&M>~/ƐH<-fi g>\<6TX7r) V]FQ]dӶ %@QN3tT2|8xXl&\XԂQsgH6e^ ΀XTEqEU@i‹rDVz DLG5LPkx,w^=Yw?1vܠ;dHr0ߧڎv/đ|wߧS)Uռ]YH:::3jäu)WY$f!Wiqxгk>cU*\ ٚ"ml{"J+3C6X'! &IQ@[fR h@0!슛T\DZK~,cT#`ˡ층Xa`Ƶ06DfQ#:ҹg1'LA( 텒KhtBh%|\>pw5jkCP-J6W~ZZm jx]a^J%ƨ-s_3@YbfёD2]Qoy 9xO=fzJ^j \64  HYŒӷ SbGԭsor{B\ބ!{Fd#7CcGKS701Փ'Ԧ{ע měf`9Q䋋dBw(ד}I;=HܹQhRd 23(~rh3!PvG>UU+_.LN:Yksq1',69Be|N J($dl45|}A==п2r4NdGPӼ{oPKc: <V Pilot.javaUj0 D)#v;N&Յ1gn lKVSHP+xn[xw^b$i40},"ޣ,P7EnʡEwnC%N?9IzzB"N92ZӇ+~*2A_\F%2]O7g(.fIjuݽ6iBr}PKm:IStorageExample.javaSo0?RǐXIHCq^6P!wۅ.+b+׍lËX³ay + sb=cT d)Jk'UTbd`'ɘQ9.| Sr4RpLPk!V CHa%`|ᲆwk- sȒwWR. PS| P.ˇQq瓠dz|@VJ:OҋmUQ5nT]{=),z>h$6嬡(`ÚA3HJe eo~N7C7ܺ7-aK֡_u"?#|/_'BIY-jR%7(KupBKo(Sr#u l~L )Z2ƭ(h-2텛E2˭>(Z" 2)v  Z?fHj'zLPq {.#Ё3Y{|M/?s`ECq_NJĵDHdN7P8*|9!:\H"RmkT#QԒҟIF2t{4ri]v:4ei  >?A,͂=8o ˸hQIYoˬqp?BIER!*6R> ZJ*6h$k]])Y:4tMJyWPE sGTvΜKl;Z$_:k9a?H`E Сs$SZ~UVUjfcֆ[ +'s?e `Xӥ.| #ښZ}+V06|:=! Ey]$|6F}yq30 -l^L5jc4*y3IȄQcJT0R\FBsO"c*;?NOPKI:W >,mFullLRUCachingStorage.vbR]k0}?ܷؐ:Zz+vKH[;[C$'xmI M_=s)n+Jayg`Ja,DRäҘr>vv_ oQY)Kdѱ 0qJhDy P\xe ؓr55/(Q1=WŶ <6zY-P5|HdQX5<.m7kzA?)|ioQt!E$ S?zY'5~r}K`[T\\Hk Zq/a]8wfUk 5eFxGuxt5\i8b^|{:b|5Ϻ_`n PKE:u], LoggingStorage.vbVn8? rJ6zH q(i$s!I0|Ir(ɖd9KEg޼73~TgKԇ|xA0DbKKcV&XWA, ƣVFb YYFblt@ +PX>q06H5͙p/sC+KTbU73 T{2y 2x9$c @HUR#~4Zloƀ\Y:OcH(hvbCQFCX{:Xj n &L[ ([[+LJA!<,БQ듶ƣ?PK:h9-*Pilot.vbmn0HyKZCKP1,%vd_: Eo&+m InD ӢJq)`KT>u]GƎYެ0]!k*sV.YT&QL5Eyi Kjt)c 4bR\dnG)0sMLfN?#jsfC / 0rGǎs_Ej}*,ծR_`g4T̼z~*Jh>Ir / Z'4+H %QdZ}8h<}9H;GXog&\̏G{U0R!1F)yGϼET[ U!C{_RJ_L,ޣE-1}քAڬRRX!m3JGgݝ@1VM:>, oUe(DαB-txTUC˛ZIQg7 j6#te«_Mg;Vha+EL,Vʲ,Nf*IyQW_;qis'4)'}lvgRF[J1dx]/$VeYpdQeύ?g*?[Ex;4ytz.Z-9`yr3~7Kᨗډ/M7{C*w>!Vw}ش1߅5~~PK(i:xdp$ CachingStorageExample.vb ,`(u'.PK(I:W >,m$ FullLRUCachingStorage.vb \|\PK(E:u], $ `LoggingStorage.vb o==\UPK(:h9-*$ Pilot.vb &6&|%PK(щ:8$ StorageExample.vb ClUC,PK ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/storagecs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage/storagecs0000644000175000017500000000710311520622610033615 0ustar directhexdirecthexPK}:f9^CachingStorageExample.csVn6VÁƕ"9iaM:8.\ұM~] !)Y9MH,?_̖O4DzgnR1 D 4/&?yMg9:EL'Re{㵱JDb|;.4X<_i\܊l*m#ȐEQr>yjQs lvRV%$E98ܕ4_ \P-QYKSޑJsY: )oF/ nlŸ+3M%1vȀ[^ f =&"1([Ќ d?p3CA"Jږ@˥s0hRx_,BBDݎD89qAŖeD@1ؚ྇X9g("!x{H< *ç0zH*rL~`y^&mmL`'ж}!LG-. [x`z+^ 'pƄs8mখwȾ &ُ\wT̼\ף,``GiɩT} _5}*EE!¸>6۲j1\W8p_a;-7VС/1J6u!u ݮ+Kj?eͦyVlJ;.\s}`u}B;PEIF;W+Z-PJayv-yN*%tuv,yǘݚruRնW$jQYn|՞AĹf6~P iQ97PK:ܺ`X*FullLRUCachingStorage.csQJ@}1-)%6)bK7ld%ɆMC-2$Ŷ9=gC Q z0 <-3JE3m(2j.2G[%Y5τmVx}VdiMH@YlY_Uh* kR02>B` U ELgjˁt?4VXE.jn&{ #wp;^&vq&vɽTs9t~:{:TPl΂v3rFq bR%¤=xFy7ׅ7!i Lg I$Z) c0kb*Bgh )O/dPK:ȅ LoggingStorage.csUj@}01n Ca%-Ү]/C?Н*-6.k=3gȿ 0Vti`0=''|A0ER1å18 7M>X0 "V',:1]ZS'X`1:D){~35\4i0&DR} 03LA0rg,Rz(qց"q p6ˍWmGM}b񬴭rn &%`ڂ+>hV2ࣻ+9 # !kjT]XFx0Ki`R,x‰ݭ *Džܼs.%B\l[HG: J Qag%͢#xr BxWy},"q!F3 R5e8 Y%Sy{pخ\4=&46%Vy7ň$*m;MҤ\9#AZֻKkfRC/N޹!:]0B 6QqnJɾc*lo<r]lqSk~DK\L Gm ~j@5r,&)l ؽ;^ '!M#oʦi~}߹vsv4:gfy#) R {ͽa>?PKi:#Pilot.csuJ@SZj *Md!,d|$_]7mv`#YTY1D%ܤ\xdDBI*f}$}/6J 3-!?MaЊF-  sRt] (ja <\Lhel05ى5}bqŕ2}g3$$R{ gyF*?IΎbHGxǷz:h:g_PK:5>#QStorageExample.csTn00ړS-ـz҂*g9e;]V'# NB +ڍ337ǿ~Av@^e1>T:b2q%vNlv]ЙS8,岂:lNYq/ȜMi=yA)T*np\_LPkz6Z`g҆?P;x9VѠd޲Bp<(^u{T6yVH?pINƦ3flA M5Wl@YJCMeezQ{t|9$Y4fA{@nGVWlY6hVkxeಈDg,PH#GE:a=cfvߟL(lXC5ۤC&݄J`p4ai:&] w7Ȍȇ7nk܍.,  Oth/ PK(}:f9^$ CachingStorageExample.cs Ȉ,D7PK(:ܺ`X*$ oFullLRUCachingStorage.cs 4:F̿9F,VyqPK(:ȅ $ LoggingStorage.cs /vu|PK(i:#$ Pilot.cs 쨀 :PK(:5>#Q$ StorageExample.cs <N\w4PK9 db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/nonflushingstorage.htm0000644000175000017500000001532111520622610032644 0ustar directhexdirecthex NonFlushingStorage
You are here: Configuration > File Configuration > Storage > NonFlushingStorage

NonFlushingStorage

NonFlushingStorage is a special IO Storage, which can be used to improve commit performance. Committing is a complex operation and requires flushing to the hard drive after each stage of commit. This is necessary as most operating system try to avoid the overhead of disk access by caching disk write data and only flushing the resulting changes to the disk. In the case of db4o commit it would mean that the physical write of some commit stages will be partially skipped and the data will be irreversibly lost.

However, physical access to the hard drive is a time-consuming operation and may considerably affect the performance. That is where NonFlushingStorage comes in: it allows the operating system to keep commit data in cache and do the physical writes in a most performant order. This may sound very nice, but in fact a system shutdown while the commit data is still in cache will lead to the database corruption.

The following example shows how to use the NonFlushingStorage. You can run it and see the performance improvement on commit stage.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
IStorage fileStorage = new FileStorage();
// the non-flushing storage improves performance, but risks database corruption.
IStorage cachingStorage = new NonFlushingStorage(fileStorage);
configuration.File.Storage = cachingStorage;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using the non-flushing storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim fileStorage As IStorage = New FileStorage()
' the non-flushing storage improves performance, but risks database corruption.
Dim cachingStorage As IStorage = New NonFlushingStorage(FileStorage)
configuration.File.Storage = cachingStorage
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(Configuration, "database.db4o")
IOConfigurationExamples.vb: Using the non-flushing storage

Please, remember, that NonFlushingStorage is potentially dangerous and any unexpected system shutdown may corrupt your database. Use with caution and avoid using in production environments.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/isolated_storage.htm0000644000175000017500000001250411520622616032263 0ustar directhexdirecthex Isolated Storage
You are here: Configuration > File Configuration > Storage > Isolated Storage For Silverlight

Isolated Storage For Silverlight

In order to support Silverlight, db4o brings a IsolatedStorage-storage. This storage uses the Silverlight Isolated Storage to store the database on the client.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.Storage = new IsolatedStorageStorage();

IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOExamples.cs: use the isolated storage on silverlight
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.Storage = New IsolatedStorageStorage()

Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOExamples.vb: use the isolated storage on silverlight

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/pluggable_storage.htm0000644000175000017500000001072211520622606032420 0ustar directhexdirecthex Pluggable Storage
You are here: Configuration > File Configuration > Storage > Pluggable Storage

Pluggable Storage

Pluggable nature of db4o Storage adapters allows you to implement any persistent storage behind the database engine. It can be memory, native IO, encrypted storage, mirrored storage etc.

The implementation is guided by 2 interfaces:

.NET:

IStorage and IBin

Storage/IStorage interface defines the presence of this particular storage implementation and Bin/IBin implements actual physical access to the information stored. To simplify the implementation db4o provides StorageDecorator and BinDecorator classes with the base functionality, that can be extended/overridden.

To sort out the details of the implementation let's look at an example.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/0000755000175000017500000000000011520622616031200 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cache_configuration_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cache_config0000644000175000017500000003405511520622616033522 0ustar directhexdirecthex Cache Configuration Example
You are here: Configuration > File Configuration > Storage > Cache Configuration Example

Cache Configuration Example

The following example helps to see the effect of cache by modifying the cache size. Note, that this example is not a good illustration of the LRU cache algorithm, and only shows the effect of simple caching of the most recent data.

For the test we will use the following 2 classes: Item and ItemStore, holding a collection of items:

CachingStorageExample.cs: Item
private class Item {
    int id;
    String name;
    
    public Item(int id, String name) {
      this.id = id;
      this.name = name;
    }
    

    public override string ToString() {
      return String.Format("{0} [{1}]", name, id);
    }
  }
CachingStorageExample.cs: ItemStore
private class ItemStore {
    List<Item> items;
    
    public ItemStore() {
      this.items = new List<Item>();
    }
    
    public void AddItem(Item item) {
      this.items.Add(item);
    }
  }

CachingStorageExample.vb: Item
Private Class Item
            Private id As Integer
            Private name As [String]

            Public Sub  New(ByVal id As Integer, ByVal name As [String])
                Me.id = id
                Me.name = name
            End Sub


            Public Overloads Overrides Function ToString() As String
                Return [String].Format("{0} [{1}]", name, id)
            End Function
        End Class
CachingStorageExample.vb: ItemStore
Private Class ItemStore
            Private items As List(Of Item)

            Public Sub New()
                Me.items = New List(Of Item)()
            End Sub

            Public Sub AddItem(ByVal item As Item)
                Me.items.Add(item)
            End Sub
        End Class

The following methods will be used to fill in and query the database:

CachingStorageExample.cs: CreateDatabase
private static void CreateDatabase(IEmbeddedConfiguration config)  {
    File.Delete(Db4oFileName);

      long startTime = DateTime.Now.Ticks;
    IObjectContainer container = Db4oEmbedded.OpenFile(config, Db4oFileName);
    try  {
      ItemStore itemStore = new ItemStore();
      for (int i = 0; i < ObjectCount; i++)  {
        itemStore.AddItem(new Item(i, "title" + i));
      }
      container.Store(itemStore);
      Item item  = (Item) container.QueryByExample(
          new Item(1, "title1"))[0];
      System.Console.WriteLine(item);
    } finally  {
      container.Close();
    }
    System.Console.WriteLine(String.Format("Time to create a database: {0} ms",
            (DateTime.Now.Ticks - startTime)/TimeSpan.TicksPerMillisecond));
  }
CachingStorageExample.cs: QueryDatabase
private static void QueryDatabase(IEmbeddedConfiguration config)  {

    IObjectContainer container = Db4oEmbedded
        .OpenFile(config, Db4oFileName);
    try  {
      List<Item> temp = new List<Item>();
        long startTime = DateTime.Now.Ticks;
      IQuery q = container.Query();
      q.Constrain(typeof(Item));
      q.Descend("id").Constrain(1).Greater();
      IObjectSet result = q.Execute();
      foreach (Item i in result) {
        temp.Add(i);
      }
      System.Console.WriteLine(String.Format("Time to get an objects first time: {0} ms",
          (DateTime.Now.Ticks - startTime)/TimeSpan.TicksPerMillisecond));
      //
      temp = new List<Item>();
        startTime = DateTime.Now.Ticks;
      foreach (Item i in result) {
        temp.Add(i);
      }
      System.Console.WriteLine(String.Format("Time to get an objects second time: {0} ms",
          (DateTime.Now.Ticks - startTime)/TimeSpan.TicksPerMillisecond));
    } finally  {
      container.Close();
    }
  }

CachingStorageExample.vb: CreateDatabase
Private Shared Sub CreateDatabase(ByVal config As IEmbeddedConfiguration)
            File.Delete(Db4oFileName)

            Dim startTime As Long = DateTime.Now.Ticks
            Dim container As IObjectContainer = _ 
Db4oEmbedded.OpenFile(config, Db4oFileName)
            Try
                Dim itemStore As New ItemStore()
                For i As Integer = 0 To ObjectCount - 1
                    itemStore.AddItem(New Item(i, "title" & i))
                Next
                container.Store(itemStore)
                Dim item As Item = _ 
DirectCast(container.QueryByExample(New Item(1, "title1"))(0), Item)
                System.Console.WriteLine(item)
            Finally
                container.Close()
            End Try
            System.Console.WriteLine([String].Format("Time to create a database: {0} ms", _ 
(DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond))
        End Sub
CachingStorageExample.vb: QueryDatabase
Private Shared Sub QueryDatabase(ByVal config As IEmbeddedConfiguration)

            Dim container As IObjectContainer = _ 
Db4oEmbedded.OpenFile(config, Db4oFileName)
            Try
                Dim temp As New List(Of Item)()
                Dim startTime As Long = DateTime.Now.Ticks
                Dim q As IQuery = container.Query()
                q.Constrain(GetType(Item))
                q.Descend("id").Constrain(1).Greater()
                Dim result As IObjectSet = q.Execute()
                For Each i As Item In result
                    temp.Add(i)
                Next
                System.Console.WriteLine([String].Format( _ 
"Time to get an objects first time: {0} ms", _
(DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond))
                '
                temp = New List(Of Item)()
                startTime = DateTime.Now.Ticks
                For Each i As Item In result
                    temp.Add(i)
                Next
                System.Console.WriteLine([String].Format(_ 
"Time to get an objects second time: {0} ms", _ 
(DateTime.Now.Ticks - startTime) / TimeSpan.TicksPerMillisecond))
            Finally
                container.Close()
            End Try
        End Sub

In general you should see the benefits of using cache with the majority of db4o operations. However, the effect is most obvious when a large amount of database information should be accessed fast (query) and this information is not loaded in the applications hash memory. We are trying to reproduce this situation in the second method querying database. If the amount of items in the ItemStore collection is 10000, the database size will be around 900 KB. With the default cache size, i.e. page count multiplied by page size (64 * 1024), this will mean that the whole collection won't fit into the cache (It can still fit into your hash memory, so you may want to decrease the available hash memory or increase the size of the collection to see the effect.).

We will use the following configuration methods to compare the default cache allocation and the custom one:

CachingStorageExample.cs: GetConfig
private static IEmbeddedConfiguration GetConfig()  {
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    config.File.Storage = new CachingStorage(new FileStorage(), PageCount, PageSize);
    return config;
  }
CachingStorageExample.cs: GetDefaultConfig
private static IEmbeddedConfiguration GetDefaultConfig()  {
    IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
    return config;
  }

CachingStorageExample.vb: GetConfig
Private Shared Function GetConfig() As IEmbeddedConfiguration
            Dim config As IEmbeddedConfiguration = _ 
Db4oEmbedded.NewConfiguration()
            config.File.Storage = New _ 
CachingStorage(New FileStorage(), PageCount, PageSize)
            Return config
        End Function
CachingStorageExample.vb: GetDefaultConfig
Private Shared Function  GetDefaultConfig() As IEmbeddedConfiguration
            Dim config As IEmbeddedConfiguration = _ 
Db4oEmbedded.NewConfiguration()
            Return config
        End Function

Using custom page count = 1024 will make the cache size enough to fit the whole collection, and you should see some performance improvement browsing the retrieved collection second time (Unless it all fits into your hash memory in any case). Please, also try decreasing page size and count to see the opposite effect.

Download example code:

VB.NET c#

././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstoragevb.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstora0000644000175000017500000000244611520622616033576 0ustar directhexdirecthexPKi:xdpCachingStorageExample.vbXOo6wxaG` I Els(E?H #)ɒ(Ux߿C2 $=waRmۄI)w &V^HIEh%¿F=74]^$?NRVt?5EߓŖhIϥy'$"B9tINDPN it]vx”\+CR03NI-$+Z݆-R??6 /]F4p a.Pٿ%erCH$k, /i髻)H۽K @E ee2IPڤ2^bbӬiMi awKؔnqWVș>_'BIY-jR%7(KupBKo(Sr#u l~L )Z2ƭ(h-2텛E2˭>(Z" 2)v  Z?fHj'zLPq {.#Ё3Y{|M/?s`ECq_NJĵDHdN7P8*|9!:\H"RmkT#QԒҟIF2t{4ri]v:4ei  >?A,͂=8o ˸hQIYoˬqp?BIER!*6R> ZJ*6h$k]])Y:4tMJyWPE sGTvΜKl;Z$_:k9a?H`E Сs$SZ~UVUjfcֆ[ +'s?e `Xӥ.| #ښZ}+V06|:=! Ey]$|6F}yq30 -l^L5jc4*y3IȄQcJT0R\FBsO"c*;?NOPK(i:xdp$ CachingStorageExample.vb ,`(u'.PKj././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstoragejava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstora0000644000175000017500000000246611520622610033572 0ustar directhexdirecthexPK:$(|ACachingStorageExample.javaWkOFl$UlڰB, d+eiV7ǎ;/;@V)3sי;hƬXp:pppGߑ KDRÝq=>>v:Y{NAAKX^bZsLqIFHHY7jfz,f{hY(iJcS"I|GuD"Ex8HI B]Kp~vtuN`qh%\<܎~z^X@rӤ0zt}}8tkuF}ȟsQ)Tyw'`ˎ X3ȱ z.eQwGSVŶvavD-4{^s^eo L0E=KY>צBb%瘛KT0KBsڨ{$[NSl/ޅ2@Q3o8+R8OF]< Ih."Thet~MP _ '8ī VAQe2,1͍e;bϚ^2QcpxF?0I $N].L zK᬴ٶbW6Mhў"5i,nw%Kal Rի~nÀ_QȺ5W@r`&;(^蓧A/Ғ.PiWV6S .ޏ> ׵:SUڶz^!;*,$׷ Cd"<4 aM5Jppe*0.e[;XڭN>mJ3ʅ&;}iyk8^6y< i473aX&*'3@;*BIEeG4BW"|:"Ew%/*KkO{˸6ݝE_RӌVC_g7ZM}pZ%./gvw?PK(:$(|A$ CachingStorageExample.java [ S SPKl././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstoragecs.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage/cachingstora0000644000175000017500000000235711520622610033571 0ustar directhexdirecthexPK}:f9^CachingStorageExample.csVn6VÁƕ"9iaM:8.\ұM~] !)Y9MH,?_̖O4DzgnR1 D 4/&?yMg9:EL'Re{㵱JDb|;.4X<_i\܊l*m#ȐEQr>yjQs lvRV%$E98ܕ4_ \P-QYKSޑJsY: )oF/ nlŸ+3M%1vȀ[^ f =&"1([Ќ d?p3CA"Jږ@˥s0hRx_,BBDݎD89qAŖeD@1ؚ྇X9g("!x{H< *ç0zH*rL~`y^&mmL`'ж}!LG-. [x`z+^ 'pƄs8mখwȾ &ُ\wT̼\ף,``GiɩT} _5}*EE!¸>6۲j1\W8p_a;-7VС/1J6u!u ݮ+Kj?eͦyVlJ;.\s}`u}B;PEIF;W+Z-PJayv-yN*%tuv,yǘݚruRնW$jQYn|՞AĹf6~P iQ97PK(}:f9^$ CachingStorageExample.cs Ȉ,D7PKjodb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage/cachingstorage.htm0000644000175000017500000002220611520622610031706 0ustar directhexdirecthex CachingStorage
You are here: Configuration > File Configuration > Storage > CachingStorage

CachingStorage

The CachingStorage is db4o's default storage. The default implementation uses the LRU/Q2 caching mechanism to reduce disk access times and to improve performance. The cache is characterized by the amount of pages that can be utilized and the page size. The multiplication of these two parameters gives the maximum cache size that can be used.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
IStorage fileStorage = new FileStorage();
IStorage cachingStorage = new CachingStorage(fileStorage, 128, 1024);
configuration.File.Storage = cachingStorage;
IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOConfigurationExamples.cs: Using a caching storage
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
Dim fileStorage As IStorage = New FileStorage()
Dim cachingStorage As IStorage = New CachingStorage(fileStorage, 128, 1024)
configuration.File.Storage = cachingStorage
Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOConfigurationExamples.vb: Using a caching storage

Page Count and Page Size

The CachingStorage takes two parameters, the page count and the page size. Bigger page size means faster handling of information as there is no need to switch between pages for longer. On the other hand a bigger page size will mean higher memory consumption, as memory will be reserved for the whole page size, when the page is needed. Modify these values and run performance tests to find the best performance/memory consumption combination for your system. The default values are the following:

Page count = 64 Page size = 1024KB

This gives a total of 64 KB of cache memory.

Caching Type

By default db4o uses a LRU/Q2 caching strategy. You can more about the LRU/Q2 cache on the Internet or you can look for the concrete implementation in db4o source code: LRU2QCache, LRU2QXCache and LRUCache. The LRU2QCache is a simplified implementation of the 2 Queue algorithm described here:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1..34.2641

It's possible to exchange the cache-type. Inherit from the CachingStorage-class and overwrite the new cache method. There you return you're caching implementation. For example use a simple LRU-Cache.

public class LRUCachingStorage : CachingStorage {
    private readonly int pageCount;

    public LRUCachingStorage(IStorage storage):base(storage) {
        this.pageCount = 128;
    }

    public LRUCachingStorage(IStorage storage, int pageCount, int pageSize)
        : base(storage, pageCount, pageSize)
    {
        this.pageCount = pageCount;
    }

    protected override ICache4 NewCache()
    {
        return CacheFactory.NewLRUCache(pageCount);
    }
}
LRUCachingStorage.cs: Exchange the cache-implementation
Public Class LRUCachingStorage
    Inherits CachingStorage
    Private ReadOnly pageCount As Integer

    Public Sub New(ByVal storage As IStorage)
        MyBase.New(storage)
        Me.pageCount = 128
    End Sub

    Public Sub New(ByVal storage As IStorage, ByVal pageCount As Integer, ByVal pageSize As Integer)
        MyBase.New(storage, pageCount, pageSize)
        Me.pageCount = pageCount
    End Sub

    Protected Overrides Function NewCache() As ICache4
        Return CacheFactory.NewLRUCache(pageCount)
    End Function
End Class
LRUCachingStorage.vb: Exchange the cache-implementation

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/generate_timestamps.htm0000644000175000017500000001103111520622610031313 0ustar directhexdirecthex Generate Commit Timestamps
You are here: Configuration > File Configuration > Generate Commit Timestamps

Generate Commit Timestamps

db4o can store transaction timestamps. Those timestamps to compare and check if an objects has been changed. These commit timestamps are mainly used for replication together with UUIDs.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.GenerateCommitTimestamps = true;
FileConfiguration.cs: Enable db4o commit timestamps
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.GenerateCommitTimestamps = True
FileConfiguration.vb: Enable db4o commit timestamps
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/freespace_configuration.htm0000644000175000017500000002555611520622616032166 0ustar directhexdirecthex Freespace Configuration
You are here: Configuration > File Configuration > Discarding Threshold

Freespace Configuration

When objects are updated or deleted, the space previously occupied in the database file is marked as "free". The freespace management system takes care of this space by maintaining which places in the file are free.

Discarding Threshold

By default the free space system keeps and maintains every bit of free space even the smallest ones. Very small blocks of storage are hard to reuse, because larger objects don't fit in. Therefore overtime more and more small blocks of free space are maintained. Maintaining these small free spaces can cost performance. Therefore you can configure the free-space system to discard small blocks. Then small blocks are not maintained as free space. On the downside these space is lost until the next defragmentation.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
// discard smaller than 256 bytes
configuration.File.Freespace.DiscardSmallerThan(256);
FreeSpaceConfiguration.cs: Discard settings
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
' discard smaller than 256 bytes
configuration.File.Freespace.DiscardSmallerThan(256)
FreeSpaceConfiguration.vb: Discard settings

Memory Freespace System

When you use the memory free-space system the information of the free space locations is hold in memory. This is the fastest way to manage free space. However when the database is shut down abnormally, for example by a crash or power off, the free space information is lost. The space only can be reclaimed by defragmentation. This is the default-setting used by db4o.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.Freespace.UseRamSystem();
FreeSpaceConfiguration.cs: Use the in memory system
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.Freespace.UseRamSystem()
FreeSpaceConfiguration.vb: Use the in memory system

BTree Freespace System

The B-tree free space system hold the information a B-tree which is stored on commits. Since the free space information is stored on disk, it is usually a slower then the memory free space system. However it doesn't loose the information on abnormal termination. Additionally the B-tree free space system uses less memory resources than the memory free space system.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.Freespace.UseBTreeSystem();
FreeSpaceConfiguration.cs: Use BTree system
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.Freespace.UseBTreeSystem()
FreeSpaceConfiguration.vb: Use BTree system

Freespace Filler

When you delete a object in db4o the storage it consumed isn't deleted. Instead only the storage space is marked as free and can be reused. Therefore it's possible to read also the content of deleted objects. If you want to avoid that, you can specify a free-space filler. This filler is responsible to overwrite the free-space.

Note that this costs performance, since additional IO operations are performed.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.Freespace.FreespaceFiller(new MyFreeSpaceFiller());
FreeSpaceConfiguration.cs: Using a freespace filler
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.Freespace.FreespaceFiller(New MyFreeSpaceFiller())
FreeSpaceConfiguration.vb: Using a freespace filler
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/storage.htm0000644000175000017500000001041211520622612026723 0ustar directhexdirecthex Storage
You are here: Configuration > File Configuration > Storage

Storage

db4o allows a user to configure the IO storage mechanism to be used. Currently db4o provides the following mechanisms:

It is also possible to create your own custom mechanism by implementing Storage interface. Possible use cases for a custom IO mechanism:

  • Improved performance with a native library.
  • Mirrored write to 2 files.
  • Encryption of the database file.
  • Read-on-write fail-safety control.
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/reserve_storage_space.htm0000644000175000017500000001177011520622606031644 0ustar directhexdirecthex Reserve Storage Space
You are here: Configuration > File Configuration > Reserve Storage Space

Reserve Storage Space

Reserves a number of bytes in database files. Without this setting storage space will be allocated continuously as necessary.

The allocation of a fixed number of bytes at one time makes it more likely that the database will be stored in one chunk on the mass storage. This will result in less read/write head movement on disk based storage. Note: Allocated space will be lost on abnormal termination of the database engine (hardware crash, VM crash). A Defragment run will recover the lost space. For the best possible performance, this method should be called before the Defragment run to configure the allocation of storage space to be slightly greater than the anticipated database file size.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.ReserveStorageSpace = 1024 * 1024;
FileConfiguration.cs: Reserve storage space
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.ReserveStorageSpace = 1024 * 1024
FileConfiguration.vb: Reserve storage space
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/lock_database.htm0000644000175000017500000001126311520622606030043 0ustar directhexdirecthex Lock Database File
You are here: Configuration > File Configuration > Lock Database File

Lock Database File

You can disable the database lock. This is useful for two some scenarious. For example accessing a pure-readonly database at the same time. Or for increasing the performance on some small embedded devices.

However this risks the database integrity. Never access the database file at the same time with multiple object containers!

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.LockDatabaseFile = false;
FileConfiguration.cs: Disable the database file lock
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.LockDatabaseFile = False
FileConfiguration.vb: Disable the database file lock
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/async_sync.htm0000644000175000017500000001364111520622614027441 0ustar directhexdirecthex Asynchronous File-Sync
You are here: Configuration > File Configuration > Asynchronous File-Sync

Asynchronous File-Sync

One of the most costly operations during commit is flushing the buffers of the database file. In regular mode the commit call has to wait until this operation has completed.

When asynchronous sync is turned on, the sync operation will run in a dedicated thread, blocking all other file access until it has completed. This way the commit can returns immediately. This allows db4o and other processes to continue running side-by-side while the flush call is executed.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.AsynchronousSync = true;
FileConfiguration.cs: Allow asynchronous synchronisation of the file-flushes
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.AsynchronousSync = True
FileConfiguration.vb: Allow asynchronous synchronisation of the file-flushes

Advantage

The commit call will return much faster. Because it doesn't have to wait until everything is written to disk.

Disadvantage

After the commit-call, you have no guaranties that everything is persistent. Maybe the commit is still in progress. On a failure, this means that you can loose a commit.

A setup with this option still guarantees ACID transaction processing: A database file is always either in the state before commit or in the state after commit. Corruption can not occur. You can just not rely on the transaction already having been applied when the commit() call returns.

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/blob_path.htm0000644000175000017500000001107711520622606027224 0ustar directhexdirecthex Blob Path
You are here: Configuration > File Configuration > Blob Path

Blob Path

With this setting you can specify in which directory the Blob-files are stored. The db4o-Blobs are stored outside the database file as regular files. With this settings you can set where this directory is. The default is the 'blob'-directory.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.BlobPath = "myBlobDirectory";
FileConfiguration.cs: Configure the blob-path
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.BlobPath = "myBlobDirectory"
FileConfiguration.vb: Configure the blob-path

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/database_growth_size.htm0000644000175000017500000001155311520622616031462 0ustar directhexdirecthex Database Growth Size
You are here: Configuration > File Configuration > Database Growth Size

Database Growth Size

Configures how much the database-file grows, when there not enough space. Whenever no free space in the database is large enough to store a object the database file is enlarged. This setting configures by how much it should be extended, in bytes. This configuration setting is intended to reduce fragmentation. Higher values will produce bigger database files and less fragmentation. To extend the database file, a single byte array is created and written to the end of the file in one write operation. Be aware that a high setting will require allocating memory for this byte array.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.DatabaseGrowthSize = 4096;
FileConfiguration.cs: Configure the growth size
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.DatabaseGrowthSize = 4096
FileConfiguration.vb: Configure the growth size
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file/read_only.htm0000644000175000017500000001062211520622614027240 0ustar directhexdirecthex Read Only
You are here: Configuration > File Configuration > Read Only

Read Only

You can set db4o to a read only mode. In this mode db4o won't do any changes to the database file. This mode is optimal for reading the database without doing some accidental changes to it.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.ReadOnly = true;
FileConfiguration.cs: Set read only mode
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.ReadOnly = True
FileConfiguration.vb: Set read only mode
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectfield_configuration.htm0000644000175000017500000003340011520622610031541 0ustar directhexdirecthex Field Specific Configuration
You are here: Configuration > Adding a Field Index

Field Specific Configuration

Some settings are field-specific. It's part of the object-configuration, which is available on the client, server and embedded-mode of db4o.

Its recommended that you use the same configuration for the client and the server.

Access the Field Configuration

The configuration for a field follows the same pattern. First you specify for which type this configuration applies. You pass the type or the name as string. Then you navigate to the specific field by passing the field name as string.

Note that you need to specify the field-name and not the property-name, also for auto-properties.

Adding a Field Index

Index dramatically speed up queries. You should index all fields which you run queries on. See "Indexing"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("name").Indexed(true);
ObjectFieldConfigurations.cs: Index a certain field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("name").Indexed(True)
ObjectFieldConfigurations.vb: Index a certain field

As an alternative you also can use the appropriate Attribute on the field which you want to index.

[Indexed]
private string zipCode;
ObjectFieldConfigurations.cs: Index a field
<Indexed()> _
Private m_zipCode As String
ObjectFieldConfigurations.vb: Index a field

Cascade On Activate

db4o uses the concept of activation to avoid loading to much data into memory. When this setting is turned on, the object referenced by this field is activated, when the object is activated.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("father").CascadeOnActivate(true);
ObjectFieldConfigurations.cs: When activated, activate also the object referenced by this field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("father").CascadeOnActivate(True)
ObjectFieldConfigurations.vb: When activated, activate also the object referenced by this field

Cascade On Update

When the object is updated, the object referenced by this field is also updated.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("father").CascadeOnUpdate(true);
ObjectFieldConfigurations.cs: When updated, update also the object referenced by this field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("father").CascadeOnUpdate(True)
ObjectFieldConfigurations.vb: When updated, update also the object referenced by this field

Cascade On Delete

When the object is deleted, the object referenced by this field is also deleted

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("father").CascadeOnDelete(true);
ObjectFieldConfigurations.cs: When deleted, delete also the object referenced by this field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("father").CascadeOnDelete(True)
ObjectFieldConfigurations.vb: When deleted, delete also the object referenced by this field

Rename Field

Allows you to rename this field. . See "Refactoring and Schema Evolution"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).ObjectField("name").Rename("sirname");
ObjectFieldConfigurations.cs: Rename this field
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("name").Rename("sirname")
ObjectFieldConfigurations.vb: Rename this field
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/0000755000175000017500000000000011520622616026130 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/call_constructor.htm0000644000175000017500000001146711520622614032231 0ustar directhexdirecthex Call Constructor
You are here: Configuration > Class Specific Configuration > Call Constructor

Call Constructor

By default db4o bypassed the constructor when it loads the objects from the database. When you're class relies on the constructor to be called, for example to initialize transient state, you can enable it. You can do this also on the global configuration for all types. See "Calling Constructors"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).CallConstructor(true);
ObjectConfigurationExamples.cs: Call constructor
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).CallConstructor(True)
ObjectConfigurationExamples.vb: Call constructor
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/minimum_activation_depth.htm0000644000175000017500000001112611520622610033715 0ustar directhexdirecthex Minimum Activation Depth
You are here: Configuration > Class Specific Configuration > Minimum Activation Depth

Minimum Activation Depth

Sets the minimum activation depth for this type. Useful to load always load referenced objects.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).MinimumActivationDepth(2);
ObjectConfigurationExamples.cs: Set minimum activation depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).MinimumActivationDepth(2)
ObjectConfigurationExamples.vb: Set minimum activation depth
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/persist_static_fields.htm0000644000175000017500000001210211520622610033216 0ustar directhexdirecthex Persist Static Fields
You are here: Configuration > Class Specific Configuration > Persist Static Fields

Persist Static Fields

By default db4o doesn't store static fields. With this setting you force db4o to also store the value of the static fields. Note that only reference types are stored. Value-types like ints, longs etc are not persisted.

In general you shouldn't store static fields, because this can lead to unexpected behaviors. It's mostly useful for enumeration-classes. See "Storing Static Fields"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).PersistStaticFieldValues();
ObjectConfigurationExamples.cs: Persist also the static fields
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).PersistStaticFieldValues()
ObjectConfigurationExamples.vb: Persist also the static fields
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/rename_class.htm0000644000175000017500000001123311520622616031276 0ustar directhexdirecthex Rename Class
You are here: Configuration > Class Specific Configuration > Rename Class

Rename Class

You can rename a class. Useful when you reactor you're code. See "Refactoring and Schema Evolution"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof(Person)).Rename("Db4oDoc.NewNamespace.NewName");
ObjectConfigurationExamples.cs: Rename this type
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).Rename("Db4oDoc.NewNamespace.NewName")
ObjectConfigurationExamples.vb: Rename this type
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/update_depth.htm0000644000175000017500000001145711520622610031312 0ustar directhexdirecthex Update Depth
You are here: Configuration > Class Specific Configuration > Update Depth

Update Depth

By default db4o only stores changes on the updated object, but not the changes on referenced objects. With a higher update-depth db4o will traverse along the object graph to a certain depth and update all objects. See "Update Concept". You can also specify this globally.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).UpdateDepth(2);
ObjectConfigurationExamples.cs: Set the update depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).UpdateDepth(2)
ObjectConfigurationExamples.vb: Set the update depth
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/cascade_on_update.htm0000644000175000017500000001077511520622616032275 0ustar directhexdirecthex Cascade on Update
You are here: Configuration > Class Specific Configuration > Cascade on Update

Cascade on Update

When turned on, the update cascades to all referred objects.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).CascadeOnUpdate(true);
ObjectConfigurationExamples.cs: When updated, update also all references
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).CascadeOnUpdate(True)
ObjectConfigurationExamples.vb: When updated, update also all references
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/generate_uuid.htm0000644000175000017500000001101211520622616031455 0ustar directhexdirecthex Generate UUIDs
You are here: Configuration > Class Specific Configuration > Generate UUIDs

Generate UUIDs

Generate UUIDs for instances of this type. UUIDs are mainly used for replication.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).GenerateUUIDs(true);
ObjectConfigurationExamples.cs: Generate uuids for this type
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).GenerateUUIDs(True)
ObjectConfigurationExamples.vb: Generate uuids for this type
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/cascade_on_delete.htm0000644000175000017500000001077711520622610032251 0ustar directhexdirecthex Cascade on Delete
You are here: Configuration > Class Specific Configuration > Cascade on Delete

Cascade on Delete

When turned on the deletion cascades to all referred objects.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).CascadeOnDelete(true);
ObjectConfigurationExamples.cs: When deleted, delete also all references
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).CascadeOnDelete(True)
ObjectConfigurationExamples.vb: When deleted, delete also all references
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/cascade_on-activate.htm0000644000175000017500000001134411520622616032522 0ustar directhexdirecthex Cascade on Activate
You are here: Configuration > Class Specific Configuration > Cascade on Activate

Cascade on Activate

db4o uses the concept of activation to avoid loading to much data into memory. When turned on the activation cascades for this types. This means that when an instance is activated, all referenced objects are also activated. 

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).CascadeOnActivate(true);
ObjectConfigurationExamples.cs: When activated, activate also all references
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).CascadeOnActivate(True)
ObjectConfigurationExamples.vb: When activated, activate also all references
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/set_a_translator.htm0000644000175000017500000001134011520622610032177 0ustar directhexdirecthex Set a Translator
You are here: Configuration > Class Specific Configuration > Set a Translator

Set a Translator

You can specify a special translator for this type. A translator is a special way to add you're custom serialization for a type. See "Translators"

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).Translate(new TSerializable());
ObjectConfigurationExamples.cs: Use a translator for this type
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).Translate(New TSerializable())
ObjectConfigurationExamples.vb: Use a translator for this type
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/maximum_activation_depth.htm0000644000175000017500000001113611520622616033726 0ustar directhexdirecthex Maximum Activation Depth
You are here: Configuration > Class Specific Configuration > Maximum Activation Depth

Maximum Activation Depth

Sets the maximum activation depth for this type. Useful to avoid accidentally activating large objects.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).MaximumActivationDepth(5);
ObjectConfigurationExamples.cs: Set maximum activation depth
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).MaximumActivationDepth(5)
ObjectConfigurationExamples.vb: Set maximum activation depth
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/store_transient_fields.htm0000644000175000017500000001107211520622610033406 0ustar directhexdirecthex Store Transient Fields
You are here: Configuration > Class Specific Configuration > Store Transient Fields

Store Transient Fields

By default db4o doesn't store transient fields. With this setting you can force db4o to event store transient fields.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).StoreTransientFields(true);
ObjectConfigurationExamples.cs: Store also transient fields
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).StoreTransientFields(True)
ObjectConfigurationExamples.vb: Store also transient fields
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/objectclass/diable_class_index.htm0000644000175000017500000001107511520622610032434 0ustar directhexdirecthex Disable Class Index
You are here: Configuration > Class Specific Configuration > Disable Class Index

Disable Class Index

By default there's a index which indexes all instances of a certain type. When you never query this type and only access it by navigation, you can safely disable this index.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof (Person)).Indexed(false);
ObjectConfigurationExamples.cs: Disable class index
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).Indexed(False)
ObjectConfigurationExamples.vb: Disable class index
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/network_configuration.htm0000644000175000017500000001165511520622614030774 0ustar directhexdirecthex Networking Configuration
You are here: Configuration > Networking Configuration

Networking Configuration

The networking-configuration apply to the client- and the server-mode of db4o. All the networking configuration is accessible via the networking-property on the configuration-object.

Note that the networking configuration should be the same on the server and all clients.

Overview

Here's a overview over all networking configuration-settings which you can change:

BatchMessages: Enable/Disable batch messages.
MessageRecipient: Set the message receiver.
ClientServerFactory: Replace the client-server factory.
MaxBatchQueueSize: Set the maximum size of the batch queue.
SingleThreadedClient: Set the client to single threaded.
SocketFactory: Set the socket-factory.
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/client_configuration.htm0000644000175000017500000001210411520622610030543 0ustar directhexdirecthex Client Configuration
You are here: Configuration > Client Configuration

Client Configuration

The client-configuration applies only to the db4o client. All the client specific configuration is directly on the client configuration interface.

You can also configure the common-and the network-settings for a client.

Overview

Here's a overview over all client-settings which you can change:

MessageSender: Gives access to the message-sender for sending messages to the server.
PrefetchDepth: Configures how depth the object-graph is prefetched from the server.
PrefetchIDCount:Configures how many object ids are prefetched for new objects from the server.
PrefetchObjectCount: Configures how many objects are prefetched from the server.
PrefetchSlotCacheSize: Configures the slot-cache size.
TimeoutClientSocket: Configures the connection timeout.
db4o-8.0.184.15484+dfsg/doc/reference/Content/configuration/file_configuration.htm0000644000175000017500000002330411520622614030214 0ustar directhexdirecthex File Configuration
You are here: Configuration > File Configuration

File Configuration

The file-configuration contains all the configuration-settings which are related to file access. It can be set in the db4o-embedded-container or on the db4o-server. All the file configuration is accessible via the file-property on the configuration-object.

Overview

Here's a overview over all file configuration-settings which you can change:

  Can not change 1 Only useful for recovery 2
AsynchronousSync: Enables asynchronous commits.    
BlobPath: Specify where blobs are stored.    
BlockSize: Set the block-size of the database. Larger Blocks allow larger databases. Yes  
DatabaseGrowthSize: Set the grow step size when the database-file is to small.    
DisableCommitRecovery: Disable the commit-recovery.   Yes
Freespace: Configure the free-space system.    
GenerateUUIDs: Configure to generate UUIDs for objects.    
GenerateVersionNumbers: Deprecated. Generate commit timestamps instead.    
LockDatabaseFile: Enable/disable the database file lock.    
ReadOnly: Set the database to read only mode.    
RecoveryMode: Set the database to a recovery mode.   Yes
ReserveStorageSpace: Reserve storage-space up front.    
Storage: Configure the storage system.    
db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/0000755000175000017500000000000011520622616023767 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/activation_depth.htm0000644000175000017500000001712211520622612030025 0ustar directhexdirecthex The Activation Pitfall
You are here: Usage Pitfalls > Activation Depth Pitfall

The Activation Pitfall

In order to work effectively with db4o you must understand the concept of Activation. Activation controls the amount of referenced objects loaded into the memory. There are two main pitfalls that you must be aware about.

Accessing Not Activated Objects

One common pitfall is to access not activate objects. This usually results in null pointer exceptions or invalid values. This happens when you navigate beyond the activated object-graph area. For example, we have a complex relationships and follow them:

Person jodie = QueryForJodie(container);

Person julia = jodie.Mother.Mother.Mother.Mother.Mother;

// This will print null
// Because julia is not activated
// and therefore all fields are not set
Console.WriteLine(julia.Name);
// This will throw a NullPointerException.
// Because julia is not activated
// and therefore all fields are not set
string joannaName = julia.Mother.Name;
ActivationDepthPitfall.cs: Run into not activated objects
Dim jodie As Person = QueryForJodie(container)

Dim julia As Person = jodie.Mother.Mother.Mother.Mother.Mother

' This will print null
' Because julia is not activated
' and therefore all fields are not set
Console.WriteLine(julia.Name)
' This will throw a NullPointerException.
' Because julia is not activated
' and therefore all fields are not set
Dim joannaName As String = julia.Mother.Name
ActivationDepthPitfall.vb: Run into not activated objects

This will result in a exception. Because by default db4o only activates object up the a depth of 5. This means that when you load a object, that object and all object which are reachable via 4 references are activated.

There are multiple solutions to this issue.

 

To High Activation Depth Or Two Many Cascade Activation

Having a high activation-depth makes working with db4o much easier. However activation can take a long time with deeper object graphs and become a serious performance bottleneck. The same applies when using cascade activation on almost all types. To reduce the time spend on activating objects, you need to be more selective about what to activate and what not.

  • Activate the object explicitly as you dive deeper into the object graph.
  • The most elegant solution is transparent activation. With transparent activation db4o takes care of activating object as you access them.
db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/_modeinconsistentjava.zip0000644000175000017500000000356511520622616031112 0ustar directhexdirecthexPK@t71Car.javauAn EDF^%F]e(RN@co޽qKVB|78?TvYݒ v@BT<͊n`ԈLJ2 px4XdYe~ڳKx!BmE1[Q^⫆ϖ:d?sBU3_CTl,Vl.d-P[ҤJRxD_4d9s8sHNE3#Pȋ3YH3ALfWlQIe3Yq])VI;U=}Fj.0 TG-'́9\D4Z%}bgU?qFr5FKE^EIؒmi|fLSgwnn_x!U8C#NC0a:;; ~^?_wW./>,%+`AȼQs=S*&$I,٠ `o  :qp~= ;mW`Ѡg*2 ?1tEFm|;sEl9] mN@9Ca5q|#..Ή k;QsotahGKIlMVIDh`e0v7R]J[]kp8,*ƥ3e`pI׆yT(a<0t& INiY/-Q$ pF{T.KpL7"+ń"K/CVn盟 (KtYdq 5Ԍ}j2QmPΨA.pU^8,7c|2hAq؍u6 ,lP@(3 (ϾdVd*F?r^p_37 Xvh/|c23 b;N J ^t}L3`[9,v]5ަTR%S0ݝ,JB/@%dOpM ϏP<]r1\/A)Rwsϓlre.;5#T-G$ߥ#lG8[Av1qN΢ԒҢ Working With Large Amounts Of Data
You are here: Usage Pitfalls > Working With Large Amounts Of Data

Working With Large Amounts Of Data

The following paragraphs highlight some information important for using db4o with large data.

Size of Database Files

In the default setting, the maximum database file size is 2GB. You can increase this value by configuring the internal db4o block size. The maximum possible size is 254GB.

You cannot change this setting for an existing database. In order to change it for an existing database, you need to defragment the database.

db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/update_depth.htm0000644000175000017500000002047311520622616027155 0ustar directhexdirecthex Update Depth Pitfall
You are here: Usage Pitfalls > Update Depth Pitfall

Update Depth Pitfall

db4o update behavior is regulated by Update Depth. Understanding update depth will help you to improve performance and avoid unnecessary memory usage. A common pitfall is that the update-depth is to small and that the objects are not updated. In such cases you either need to explicitly store the related objects individually or increase the update-depth.

For example in this code we add a new friend and store the object. Since a collection is also handled like a regular object, it is affected by the update-depth. In this example we only store the person-object, but not the friend-collection-object. Therefore with the default-update depth of one the update isn't store. In order to update this properly, you either need to set the update depth to two or store the friend-list explicitly.

using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Person jodie = QueryForJodie(container);
    jodie.Add(new Person("Jamie"));
    // Remember that a collection is also a regular object
    // so with the default-update depth of one, only the changes
    // on the person-object are stored, but not the changes on
    // the friend-list.
    container.Store(jodie);
}
using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
    Person jodie = QueryForJodie(container);
    foreach (Person person in jodie.Friends)
    {
        // the added friend is gone, because the update-depth is to low
        Console.WriteLine("Friend=" + person.Name);
    }
}
UpdateDepthPitfall.cs: Update doesn't work on collection
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim jodie As Person = QueryForJodie(container)
    jodie.Add(New Person("Jamie"))
    ' Remember that a collection is also a regular object
    ' so with the default-update depth of one, only the changes
    ' on the person-object are stored, but not the changes on
    ' the friend-list.
    container.Store(jodie)
End Using
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
    Dim jodie As Person = QueryForJodie(container)
    For Each person As Person In jodie.Friends
        ' the added friend is gone, because the update-depth is to low
        Console.WriteLine("Friend=" & person.Name)
    Next
End Using
UpdateDepthPitfall.vb: Update doesn't work on collection

So for this example setting the update-depth to two will fix the issue. For lots of operation a update-depth of two is pretty reasonable. This allows you to update collections without storing them explicitly.

IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();
config.Common.UpdateDepth = 2;
using (IObjectContainer container = Db4oEmbedded.OpenFile(DatabaseFile))
{
UpdateDepthPitfall.cs: A higher update depth fixes the issue
Dim config As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
config.Common.UpdateDepth = 2
Using container As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFile)
UpdateDepthPitfall.vb: A higher update depth fixes the issue

When the update depth is set to a big value on objects with a deep reference hierarchy it will cause each update on the top-level object to trigger updates on the lower-level objects, which can impose a huge performance penalty.

Try transparent persistence, which removes the issue of the update-depth completly.

db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/storing_marshalbyref_objects.htm0000644000175000017500000001121411520622614032433 0ustar directhexdirecthex Storing MarshalByRef Objects
You are here: Usage Pitfalls > Storing Marshalbyref Objects

Storing MarshalByRef Objects

Problem

MarshalByRef objects from .NET Remoting can not be stored by db4o.

Reason

MarshalByRef objects are not really objects. They are proxy objects to instances, which live on another machine. There are 2 cases to distinguish:

  1. If the object instance is local, then the object is storable without an exception unless a remote client has a lifetime lease on the object instance.
  2. If the object instance is remote, then you're actually dealing with a DCOM proxy, which cannot be safely stored in db4o, since the remote object lifetime would expire as soon as the object was garbage collected.

Solution

1. Use marshal by value technology for the persistent object. In this case the object implements ISerializable interface and can be stored by db4o without any problems. The object is created on the client and is passed to the server using MarshalByRef proxy.

2. If using MarshalByRef object is mandatory for you, use the following configuration:

configuration.Common()
    .ObjectClass("System.Runtime.Remoting.ServerIdentity, mscorlib")
    .Translate(new TTransient());
configuration.Common()
     .ObjectClass("System.Threading.TimerCallback,mscorlib")
     .Translate(new TTransient());

The TTransient translator will prevent instances of ServerIdentity and TimerCallback from being stored within a db4o database. These classes are protected internal classes within the .NET Framework. When retrieving your MarshalByRef objects from db4o, you will need to re-marshal them.

Note: in many cases using db4o client-server version can be a better option for a remote persistence. ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/accessing_persistent_classes_from_different_.net_applications.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/accessing_persistent_classes_from_diffe0000644000175000017500000001467111520622610034031 0ustar directhexdirecthex Accessing Persistent Classes From Different .NET Applications
You are here: Usage Pitfalls > Accessing Persistent Classes From Different .NET Applications

Accessing Persistent Classes From Different .NET Applications

Problem

Accessing db4o database created and filled in with a .NET application or library from another .NET application or library shows an empty database.

Reason

db4o class name format in db4o consists of the full class name and assembly name:

Namespace.ClassName, AssemblyName

Two different .NET applications (libraries) usually have different assembly names. If you do not use aliasing, the class name will be appended with the current application assembly name.

Solution

In order to access db4o persistent classes from different applications (libraries) you will need to use an Alias. For example:

Application1.exe ("Application1" assembly):

objectContainer.Store(new MyClasses.Pilot("David Barrichello",99))

// internally the class is saved as "MyClasses.Pilot, Application1".

Application2.exe ("Application2" assembly):

c#:

// create an Alias for the MyClasses.Pilot, Application1:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();

configuration.Common.AddAlias(new TypeAlias("MyClasses.Pilot, Application1", " MyClasses.Pilot, Application2"));

IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "reference.db4o");

// now you query as usual

IObjectSet result = container.QueryByExample(new Test());

VB:

// create an Alias for the MyClasses.Pilot, Application1:

Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()

configuration.Common.AddAlias(new TypeAlias("MyClasses.Pilot, Application1", " MyClasses.Pilot, Application2"))

Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "reference.db4o")

// now you query as usual

Dim result As IObjectSet = container.QueryByExample(New Test())

For more information see Class Name Format In .NET and Aliases.

db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/persistent_hashtables.htm0000644000175000017500000001224211520622614031076 0ustar directhexdirecthex Persistent Hashtables
You are here: Usage Pitfalls > Persistent Hashtables

Persistent Hashtables

Hashtable or Hashmap is a data structure that associates keys to values. Hashtable uses a hash function to quickly navigate to a specific value. Hash function returns an integer value based on a specific algorithm whichis based on the contents of the object. Different hash algorithms can be used to produce hash codes for different objects. The general requirements for hash code are the following:

  • Hash function must return the same result for the same object during the lifetime of the application.
  • Hash function must produce the same results for the objects that are equal according to the equals(object) function
  • If 2 objects are unequal according to the equals(object) function it is not required that the hash function produce distinct results

As you can see from the last point there can be more than one distinct key object in a hashtable that have the same hash code. Special methods called collision resolution are used to find the correct value for the specific key. Usually a separate storage - a bucket - is used for all keys with the same hash code. In this case a bucket is located by the hash code and then the right key is searched within the bucket, which allows to get a good enough performance. This works good enough for an in-memory hashtable as the hash values are not changed during application lifetime. However, it gets more difficult with a persistent hashtable.

When a hashtable is stored to a database - the hash values are not stored. As we know from the definition, the hash value of an object is only required to stay the same during the application lifetime, which means that if the hashtable will be loaded into memory from the database in another application or in another session, the hash values of the keys can differ from their initial value. We will still be able to retrieve values by their key objects if equals and hashCode functions are based on the object contents. However the consistency of the hashtable can potentially be broken. This can happen if the key objects from different buckets will obtain the same hash value as the result of re-instantiation from the database.

The simplest way to avoid the inconsistency of the persisted hash table use object content-based hash code functions for your key objects.

db4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/_modeinconsistentcs.zip0000644000175000017500000000411211520622616030563 0ustar directhexdirecthexPK{/7^d8<Car.csAk |GOiLV 2;l {FZGAM(Scٵ;l"y/ |HkH9,|W6@];%Z#'Z7,Y Q"#kL(3 )bJSG`RP`9Nmd`co5ljQ*a646mň=;g#RRR_ msdp0&@tF&a8CiE Eup<Sw- ӵ :*%+?śxuru$խ>=Yc ,p8\t9,˙J=.z6F> PK/7A8Y~InconsistentGraphExample.csXKo6>7@TZ@ o l8iIA{IJi% ["͋T?t4O=sK$h/Lcj*2KqW}yhǧ^'ƃtxW̩9(W|jHv1E@ 9GR-*.W[.FmyZ'Z쨴$$4Eb:0Nׄr3e`Zw9tq3%cZB=52 :h} Oj :GJvfSs1BNMh]LO<~PK({/7^d8<$ Car.cs ӤfCӤfCPK(/7A8Y~$ \InconsistentGraphExample.cs :÷^fC^fCPK(u/7/|$ Pilot.cs ZlޑHfCHfCPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/usage_pitfalls/_modeinconsistentvb.zip0000644000175000017500000000427411520622610030570 0ustar directhexdirecthexPK8/7Z{Car.vbSj0C.uPкa)h%#1ײ$rS衺h4AX?n:[=@܋Z.fIUU)EȽ7ZUARӅȄH*\{#hV̈Rifm$=*xTՒ!E`\UPA1)FSؖ Wm;y<8se-[A-f9\3#7I59Ӣ@kcxe-/p[U8vtVƵkv&:LL*X.㵶zgOd*%6EbxFQ Id&˔5xhH=eh7IDaijbU'\ѽP!JȸGQ^`1LWx$n$ \ʂyYqG[n&'\. %Ҙṱ_Io"ajDv@S( '_b7EH ȋAՙ'(p}Eo=E1\_9kBy ,%GG-L&Ih0-o;Ym*+B5̅ %[hsʩJ{!Ca ju#|)Rf^Ql8I^3ͣݣDRoAlM4J%^so4|WnP1cׄ jL9^XfTS'n0N4H4f+n[9QK[DQ{r?mR-'\S}~G?@y8<ҳdt\5k3쳮=Z1ort q (W?کG#3`G᧣87F9G{öӒH}8\,C'4)cb(NV;Ad{*v7$1nn(e8%Y"Ego7P{ )֧AgK_8P]K0$:Jז: ׇSpO}][PX=G;cva2IL2PsHT;de.Ym_c }qH$somJaP+6hR^Pg,2Rɖvb*fPv<C)CLpP* SY1>"Eԙh줣btF[QJNƛ&(#f 0ᥫ69mVa׾Q0η1Q>>EPKj/7MU*Pilot.vbuQMk0 t[r[Fa0a>إ-u8h=\;JCf 5tbnMnOPT% t*ᔀ=Q0u]'%?@R06R!L J J TVkcXs3x`܎/mm Jr$@=p~Q^H) iiT98۶%vs%-ӗ#?\^1X/u Dangerous Practices
You are here: Usage Pitfalls > Dangerous Practices

Dangerous Practices

Db4o databases are well protected against corruption. However some specific configurations can make your database file vulnerable.

  • Disabling the file-lock. When two db4o instance write to the same database file at the same time, the database will be corrupted. Therefore you should avoid disabling this setting. You can safely disable the file-lock, when you're using the database in a read-only mode.
  • Using the non-flushing storage. This storage will disable the flush-operation to the disk. While this improves the performance, it endangers consistent commits in a crash.
  • db4o cannot deal with some class-hierarchy-changes. You cannot add a class between two existing classes in the class-hierarchy. Or remove a class from the top of the class-hierarchy. See "Refactoring Class Hierarchy"
  • You cannot change a field from a array to a simple field of the same type and back.This only applies when you change it from a type to the same array-type. So for example from a string to an array of strings. A change from string to an array of integer is fine. See "Field Refactoring Limitation"
db4o-8.0.184.15484+dfsg/doc/reference/Content/drs_stub.htm0000644000175000017500000000536711520622610023331 0ustar directhexdirecthex db4o Replication System

db4o Replication System

The db4o Replication System is a separate project. You can download it and its documentation on the official db4o website.

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/0000755000175000017500000000000011520622620026044 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/symbian_os/0000755000175000017500000000000011520622606030213 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/symbian_os/symbianjava.zip0000644000175000017500000000135611520622606033250 0ustar directhexdirecthexPKtO5CH SymbianTest.javaUMk@=ː0$tC&`hRV+vq]l+MC|f? ].fE>{ir{daQy/ ]LGN/!8KJ`SfE",JmgRk`:zX;iҽ VĥB1A ;$DέI-F'Js*o/OWG7W0TbSeוLpPO&= sQd` 5ڞfWU ٸB2YZ‚9A\jD~k̭uUh'xt2 ָ1K1GelnI R&q/ #v4iC:* HU:}UDތT#wQA%dvƫNs;2gӻew8HTיc_8ޭF56;$#ᥫ6W;i'Y! C=) hr 5-&7zydo?>Zu,"(bsaPK(tO5CH $ SymbianTest.java V\pXB PKbvdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/serializingjava.zip0000644000175000017500000000331111520622620031750 0ustar directhexdirecthexPK7 L)Car.javauAK0-?U DIgXL7&kŲ# R\Z| wG\d=2PK76Vm SerializeExample.javaUk89?z㚶0Hڣ9X-Cu^mm䓔ݑ$Kv$VƠy>exƲxQ, 999Eht*>Ab4z/2c?jE$2GGÃÃ&i J*\&Db/L#gB*>%%L+aWz tjb5:$F⛪2цݲL&ifVR}֤Fݬz~M9bːsx,A ZYh\4/853#m6()8?x~r%:CgP *_N_MdsS&DT:2h0#'ҵy ͺR2od*p@xNm|Q 96nGb2BЭɣy;C,D TF`1y G/ߌKΩR,ɀsgЄ%ljy uaG$[oy,R׭Yo`1t6PNbmݬ3*sFjɶr47`ӱ^Qc޻;T3a'#x:Vt|ɴƵ:㍾g.Spa˜[m}NAB5Go9%(ͤ8{~#'ѻ?Dֶ[H;|!pmS6Ie@al8e]Eȉ\R2 J4A;m[5gI\'ۆ^Gp7c}vL'nx>JHM%+X;\mXsw Ǩ@u P L{ZgU5h߽?e:KԻj{2ؓ@*$Ԛ ~ιPWͥoPK(7 L)$ Car.java TpGkpGkpGPK(7Sڡy $ Pilot.java qGlpGlpGPK(76Vm $ SerializeExample.java D]pG4+opG4+opGPK././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net_platform/db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net0000755000175000017500000000000011520622606034063 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net_platform/db4o.xmldb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net0000644000175000017500000000224311520622606034066 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/websitecs.zip0000644000175000017500000000714711520622616030576 0ustar directhexdirecthexPK Xt5 App_Code/PKX554v App_Code/Db4oHttpModule.csVo0ᖧde4EkTUSU!Sp2aEU8 6> 0^ {1yʉ1+o>,YAA?=?Pz$ϮRG,P$$RVO$9>zպFN#@!GLn0a]Wу2T.1Vj͵_'gz0 N*;_QdJ8]9p9,v +˘0dTn(:@so{̊yQ"\]ܶ0 gB‰`",Փ 2cwOe] iO:rA*)ŠcηNV[戾Gs=>6pj:Nk"䐅27|*M jn5X7 Mtfhg}JtZxsWOMVP;hLeQPCS]⋄ vlK9W^L>*N%.c5?k "y^UE=JvZdFV!r>x) `Q:/Yd6}y >4}Y;XDwD>[ʒyC:W&I>'-s6î>fõ,k:2':yf F+"{qb51벜eRJhͼe^-%f`Llnr;;t=]J{[|.jf^}p5>X`2V\?:T9R>FTJҁʞA*6{oj{ PKPu5x\ʼbApp_Code/Message.csPj0 SJL ݲvr cø8ѝLBGJ%V[N=w,m[g^jt5SᏧNTNMd[t# d?@ 6x%4aA8H7R|53f. WpdY1_:VˇailWZ 0ƦE$N71 \]8^3N>]I;W;PKlu5| Default.aspxn0+F\ܪSݘv*\MNs֚vd+8cq?>>|X"\ t^$,{ԑoP\tU8d.\5{Jv2T+4otdZz1vWly2Kܞ]]f92G|z?~ԃJZlETpn fgVoɨ5ܭK/gS86 ڍHcTbzRC=ĩ{s]<6{m {g`) EObRUBеSXawʯ^z/45Z+{u^|,ti=0zk~y_~mD@K۹QMmVŃ:"]푦IED:(+Q0Z7 8Td/z⍍y8 PK5oMDefault.aspx.csT]o0}G?\h}:&u0H6-xD&Po7lU>;!IB$6ssBiB` (\SZO[v-NO\'09ڂ8= \Z nHp j^Jw O}ɾ-KEa4N 򺳅y*}mACnAw܆wto][ӱ1̟RwWY2>ϥE3;_aw 4;3QБo7Az}i.c$i}? FeKP.ɤ_lsѫ07}Im@Oj:S;>ᆙk2~pYy]ewmp#i&;yA>PKhg/|X5гq: LDoEG T:jxjm:@Rt uhKHg.>y9<=5ZR&gs;lXqZ6`#M (?:$a`.P'cm IKS"m1TYLƑ\Uv.:ݝ ͟vz,|̊-EnGJ#vLUNoGa.Eq!h3(z\YLn8E9^ U<~r*|1 ]KI?_ 9*'rVyg`I퀸<-/S]CNl6CVi̢OhxM: F[*hsXT5}|#NCl_JY*M#r#NY1jޓR$2b8;+ԗЊ`IT ZA5~7;W ;ڒ6J(K?ȰƹOBtG "kU$.N$& ˏL N+O(Ӱtjɓ1\dzƱH)&3*6 A $"\B>Bt?o?B6l\Ŀ2TdTڣy&H\ *9c {7e,C)o7x!(I/̛,&g+PK( Xt5 $App_Code/ L!i   Ni PK(X554v $ 'App_Code/Db4oHttpModule.cs \6F s*i PK(Pu5x\ʼb$ App_Code/Message.cs ~C   H PK(lu5| $ Default.aspx m[a   F PK(5oM$ Default.aspx.cs zG  PK( Configuration

Configuration

Db4o can be configured to use a user-defined classloader.

Java: configuration.common().reflectWith(new JdkReflector(classloader))

This line will configure db4o to use the provided classloader. Note that, as with most db4o configuration options, this configuration will have to occur before the respective database has been opened.

The usual ways of getting a classloader reference are:

  • Using the classloader the class containing the currently executed code was loaded from. (this.getClass().getClassLoader())
  • Using the classloader db4o was loaded from. (Db4o.class.getClassLoader())
  • Using the classloader your domain classes were loaded from. (SomeDomainClass.class.getClassLoader())
  • Using the context classloader that may have been arbitrarily set by the execution environment. (Thread.currentThread().getContextClassLoader()).

To choose the right classloader to use, you have to be aware of the classloader hierarchy of your specific execution environment. As a rule of thumb, one should configure db4o to use a classloader as deep/specialized in the tree as possible. In the above example this would be the classloader of the plugin db4o is supposed to work with.

././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/special_cases.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/special_ca0000644000175000017500000001104011520622616033742 0ustar directhexdirecthex Special Cases

Special Cases

In your average standalone program you'll probably never have to face these problems, but there are standard framework classics that'll force you to think about these issues.

Servlet container

In a typical servlet container, there will be one or more classloader responsible for internal container classes and shared libraries, and one dedicated classloader per deployed web application. If you deploy db4o within your web application, there should be no problem at all. When used as a shared library db4o has to be configured to use the dedicated web application classloader. This can be done by assigning the classloader of a class that's present in the web application only, or by using the context classloader, since all servlet container implementations we are aware of will set it accordingly.

You will find more detailed information on classloader handling in Tomcat, the reference servlet container implementation, here:

http://jakarta.apache.org/tomcat/tomcat-4.1-doc/class-loader-howto.htm

Eclipse

Eclipse uses the system classloader to retrieve its core classes. There is one dedicated classloader per plugin, and the classloader delegation tree will resemble the plugin dependency tree. The context classloader will usually be the system classloader that knows nothing about db4o and your business classes. So the best candidate is the classloader for one of your domain classes within the plugin.

Running Without Classes

db4o can also cope with missing class definitions. This is a by-product of the work on our object manager application. Another implementation is a server without persistent classes deployed.

././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/classloader.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/classloade0000644000175000017500000004074711520622616034011 0ustar directhexdirecthexJFIFPPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( $6I Vf!F,J\15_RR;i<#\EHT'#Åzdg|5raimk .dXU *^{Y11c'oe<>#4v1pz[bG7p62ڪ `/K ëK!]R\yfBc#uz,Ŷ.{[O!wux5AC|ŵM2$ST˾6* wlMZI v#a<9bRy̬xU,W뵻h?\Q 4k?!LZ4.X cŢxcG×Q_lrIm,o,Ls, N3q f&_QF ӡIxUYQUw@'=zWQEY+\iYQY(((([u~?xz|R799P,HPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQPK{iݽPssȅ2A98Q{%!hӂ2ȥ>@ mbNH^Q..!e[ [R.r1b ;E*FVق&26X1$ `*s[o( ( ( ( ( ( (zqj03Y.X ,@84r; z a51; z a51(z7m?0UuO .`M2AfԨ'v!Xi; z a51; z a51; z aCLt}oloydIvg8q4((((((((((((((((((J_%33#yQ3l>$ec;YH Fr1j-n.^"IYd;C/6 9; ݵ]HƪUN%*WG+\[{nv`%T\(((((*淤KKdҽzvKd7< ][b?)`3+!MK.bRN5?;fѰgw|$xƚ/"WGӒVm1n-fbbv,TAɀ Ex=ޱ3ƟCg=[|xvW-UwF+ VJ$zT- 6U*˝'M9+Šj-XKCwsvk%-:Ljv:GnOEO}-󾆌(РO@2@؍ uF2ɪ 5nқ~QSr6^Fz4څtϪr>?(ęgOt=ZW[fDou+sHʹp7oUcJl bNggw]:5xM_63*J+T-NNF/Kk~Y}21%gGf]NcXaTPr0I4j:>q&iltciA" 8_n'nU.z:G=־/ӥ妭ma,-w?*<]o^K{ ŚXԾB@ˑa9N[}jK[x ٤|X'wL?Au[?fuY[pۥpxS$FKԪ_Tg:8NF-Ru]4OKxI.cXeCX(g G$:`եjeKB('״]VYdW&6gӷ=EXFCk^&I#7_6>Awv_ֿ ,/$\~Kt& $s٤O9.Ll 3v-nc@knZiUg7!EDZw~9JJIt_ճdu7:"#DYڈ~\d1m8zԑ Ԃ)"i_)\IPIETLp6pVuO?)T?zLvVuZXkmvCarrpOSIMYQEHs~+xrSgNȦ+cs;(-/}u^=R$n-}$i躈GqG䌜'9ɮĖvXZ>Gv*yHH1vܞ+?hsXkX<,)FydP4j_7Y{ lNЯ%@#YqTpI#sU=kTԯ/Iԣ @2zNI<1/::Fo,竹b88~ յխ4kUPW&3Jy۳އoAxoY5v'Gԝ&2hPs31Pas-3Qut!m@R x8 ry&hi:N[ˋbǖ']rZ|#ntk2u:eq,$mGMHq``? ۉutn=?S)sxڸx+5]*\4N;;,OчG F/Ÿ I4Ia6L"%eG܃ŚMP% Fɢ߻9f>{ze_m}iPMmK UIu*%;y4GNacv@@+r ( ( ( ( ( ( ( ( (<=mglnⲲԎ/>i!vm%y 2xsjIצ M|}K[\MȊw珼57Vrc@JGW \gg88rshc&QiMƬ rŹn6ીu?_^jG5^⟂lnl ®O8SxCװxOC𾕧CB+GvnceHKH02O>"q&-?u oll&hX6waxF8$:PAᯋ۩ేJd`A :RmƇsC7%K(Mʧb6syޱ_|cik36:`*6Hpix'Ŷ7HgԵ/Բ gܬY0B.A}lſ izGZh<7fҠI 낅NC="GP_G.-ܠ,j c3AcYUG$OR=:!/u e$ /rz(~Ylc%[xĖvXZ>Gv*yHH1vܞ*Vˎ3߸܀`*W84V<FIˆp2I?XK]sWf6,l,8- ;!1.I' 8$ƬW? >iAEc'u=DX@/heK>r)PQAu+b ( ( +/U\[Gx务PĈ uO-/}u^ܞn巸9 I]H#V zʄsvLv3*ADMi >Ia+=fM&G' ;"|Xj2P ܮnVXk3A*9b/>At:J //ïZE K qi^iַ2+3# CHʪx|ɻ^z5,[I̳*;@ ne׶"] Wmc'E nq?\Uq-EQE+Dٔ >ΊVt6xY,#߿b{YT$$穭j*RQ,Q:f[kvWK̤`y¨$0U %Z2YE7);l%p 7H,fz;HZ|VX ]q2omAF9U\Hgt$)q s0hZTSaX![6|$$0cf,2@]0pp ki%KQ^H !(gU @2t- ߇>ӴtgZ-[7Q{|1Tg *uN29s.+0n".4H&gbpI2-웶aʐG  q_PAy%FU(z7mtQEQECѿm+SRմn5MBp%8'Ʋ? ѶikZM<#HR; '=3@ştB[n`M2Ct ːp NO'+yc P=ܦ{YtHH%|3d (?uh>i^+ *XrHl8$t 8~5΍^>h->̚nk0HKF]*cǴQ@|ڤQ?Efձۖě#a`?kWֶ[Y$q%(qyZ{.! :_zg5nFѷm~\)kmRWqjE,;>rrrsMWMn%O$Km5؜I$k7}ko`GrX1Qwevvm-c`krI8QqIk9{WԵ?Xϡ_iֶ},r۝$@JM((ZJ-4F[Y!VFId@F"~;#nL!vrZ5'c4%m9y<)?ZZH b4 e,FI^Eqq^Z*AE-%6[v,$AV$y=23>}uo-ǁ IX7 1[1n˛$=Ei u,=I_uS{/_OewmlYa 0`ZEqoHg$vj09>AyE2O$Y=Ԙ4i;`2|ZkWֶ[Y$q%(qQ@"N{{OaAf6}|e4m޺ ((((((((((((׭%e+k:!hN ՛:5rTz88Q`]=O4Q@Q@Q@Q@Q@Q@Q@Q@o亼&FP-3b(8(((((((_*kh!P 4~! :Nf[[Eʹ?7ۈX;nq$*)PM#&Q$op*P(((((((((((((鋬i-4$ݓby.O` )-cӮig#PT5?!%F73gM,: ko=ݎYnmǔ̑q #/B$ݖHU{YT83}5t#I+;NŠ(R((( w񬑶ܬ2= M^cfŔs]ǧM%/2ܨ<-N37ۄS9ϖ>{t}zu_ KndhZ[Jy?g^DkLCPy ppkoijQfkZZ6"ȄȘ$!z4:}_Ni7R[ZIm+,VZKnRv#x#W U2Hn$Iܒ7ѴԢ%Fwe74a5OBj⽥}oں:Y;;if"y;q湎>K,pBM"jY@OA^w 54T? .+{m{2æ^Ϭ`q[hIh2lM`c+;jh|jE}[Y w񬑶ܬ2= M^xR+,&3 S+uO_QӬL.m㱙oy1q8F 5]+^o%gӮ[U r4@îּL2IRzktZ;it+ү ]6{mʸYi%hsrC32k%.O}ƳHi&!v3ƹ,6;N RnS3T]յzf SniG'n@OXuM2A#*L i 4Y5-TwC54{-;{n^!̶vӢ{n}6y0޻_W9 > {i[o66%&+_o׶r[YU|d^'H;NF:/pe۬n`ѰrdaQn xUMiJT+vVn5MX٨nnd#H~g`8f5#Xksaq"ȣlaWb3Rv' q(յ]V;{jkCOe1FAUQTU{䱖ᡌb̕<nIsM5GxRhdY"C#ʰ<)SJH2!83)W80>֋ci)4 (!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPY>dy2EK7%)Cnm^t*B uGVXz(,#袊(((((( ȡׄ-Z*W}eD+>->oN-ms$S8QYUw`q=((((((JFIFPPC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (?././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/classloader_basics.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classloader_issues/classloade0000644000175000017500000000676411520622620034005 0ustar directhexdirecthex Classloader basics

Classloader basics

Classloaders are organized in a tree structure, where classloaders deeper down the tree (usually) delegate requests to their parent classloaders and thereby 'share' their parent's knowledge.

An in-depth explanation of the classloaders functionality is beyond the scope of this documentation. Starting points might be found here:

http://www.javaworld.com/javaworld/javaqa/2003-06/01-qa-0606-load.htm

http://java.sun.com/developer/technicalArticles/Networking/classloaders/

http://java.sun.com/products/jndi/tutorial/beyond/misc/classloader.htm

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/serializingvb.zip0000644000175000017500000000354511520622606031453 0ustar directhexdirecthexPK 7G!K Car.vbQK0 G_lavSNM|4 [$MBZwwt-N%.+H l-I,Q[LᰪK1U9,ZuaY{7'9+4 bL3E532B"HQ@BS[\eLšvBYlXbuœUaSh&O z7qseg?<7"<'wI/ D}<+F5,yQkQm0V̖F62:wpgɌ+`ZJjvS])*>`lF]SQ92JPK 7;;'Pilot.vbRQK0~?}͊ N|ÊaIIҕ)wwͺԉr}w_Z;.dg:YxRڹz:m E.!,hmEC?Ќd*ŧP`Xֹ RIyǽ"ZȜiFYÂ7Q|d0 P!r};Oc|({>r70^+,dlO[h;Y_/7HM VF¼V UN;ߛkSR_wxt%_(`yPK7oK SerializeExample.vbW]oJ}G?xQ^ET)+C1J^wr^w? ` M~=gfv؜A$ _Wpn~>A\_LU 3T|q^C"~ߛ児)ޖ s8?0}YDQk44߻#9ItD}=FS)5c źIQॲSPOI 0J)ڬ / dmA'w h̏%7'€E ka\1{W2٘΅=",N gdi\U8L=12T4 q9s@Jkw@$UBnx l.mÎ!%PDĠ>>P&T0x\%K!RtCa, uށ,m)JI$mjt tʉfRNwDLx db4o On Mono
You are here: Platform Specific Issues > db4o On Mono

db4o On Mono

Currently db4o is only build for .NET and tested on .NET. However it's possible to use db4o on Mono. Some features are not supported on Mono: The data services and the monitoring-support.

In the regular build, db4o also uses some API's which are not available on Mono. To avoid that, you need to build db4o from source and define the build constant 'Mono'. The source is in the 'src'-folder of the db4o distribution.

Build For Mono With Regular .NET

The easiest way to build db4o for Mono is actually to use the regular MSBuild and just define the 'Mono' built-time constant. Open the Windows console and navigate to the db4o source folder. Then you can run the MSBuild command:

MSBuild /property:Configuration=Release /property:DefineConstants="Mono" /target:Rebuild Db4o-2008.sln

The MSBuild-tool is in the C:\Windows\Microsoft.NET\Framework\{version}\-folder, where the {version} represents the .NET version. For example 'v3.5' for .NET 3.5.

The different solution-files (*.sln) represent different versions of db4o. For example:

Solution-File db4o Version
Db4o-2005.sln db4o for .NET 2.0 / Mono equivalent
Db4o-2008.sln db4o for .NET 3.5 / Mono equivalent
Db4o-2010.sln db4o for .NET 4.0 / Mono equivalent
Db4o-CF-2005.sln db4o for .NET 2.0 Compact Framework
Db4o-CF-2008.sln db4o for .NET 3.5 Compact Framework
Db4o-Silverlight-2008.sln db4o for Silverlight 3.0 / Moonlight 3.0
Db4o-Silverlight-2010.sln db4o for Silverlight 3.0 / Moonlight 3.0

Note that you should use the MSBuild-tool for the right version. Use the MSBuild 3.5 version to build the Db4o-2008.sln Solution.

The result of the builds are in the bin/Release-folders of the different subprojects.

Build With Mono

In Mono you can use the xbuild-command instead of the MSBuild. The xbuild is part of the mono distribution. If you're using a Mono version which was packaged with your Linux-distribution, you maybe need to install is separately.

In principal the command is exactly the same as with MSBuild and the same rules apply. The different solution-files represent the different db4o versions. See on the table above.

xbuild /property:Configuration=Release /property:DefineConstants="Mono" /target:Rebuild Db4o-2008.sln

When you build with Mono and xbuild, you probably get some errors.This errors should be only in following projects.

  • Db4o-Data-Services: This is not available in Mono
  • Db4o-Test-Projects: The db4o Test-Suite is not ported to Mono. For example it doesn't exclude TestCases which only apply on Windows.

The rest of db4o can be built on Mono. The result of the builds are in the bin/Release-folders of the different subproject's.

 

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/websitevb.zip0000644000175000017500000000740011520622610030562 0ustar directhexdirecthexPK 5 App_Code/PKpv5`App_Code/Message.vbuRMO@&=pd҃Z54z4 L 쒝Y/+_΅ɼ7#RVJ3Ac{Q"U"E%7*Ɣ)mh'XA@[y  W$'Cu^ Fbek=X@0Zc҈]b͇(`r m[ն8cG:hUz3t`h-kQr11b,$|QJd:gHddʹpTɻ-Yn{FvWضPK53WT App_Code/Db4oHttpModule.vbWKo6 tUE|Fhb6 RI*}9$8Չ|3c %ɺ 7^* l'إwoM'/*u77 zi ̡ʟ-\uꪄħSyI +r2Z j,vCv0{uկU%?BϛOyyhۉ[mRC%ØC$ox_إ $G{~5٠^+L.$.Y~OaKE:vjp>YN F(+Ij%rΧ ؖ<缪l3]:S-d0El ڍ"Cc|RS{Ӑ7Mu2)@fb8%(b 4;4멓k{C0ᓐI }Z꿘,]c] ^g#Z=:^:7XݢX0XIH/oqdkBa VcmalBlJ4 D +r,.t[Ð?yΎ]Uf3d]zU;Lp+eN!,z6m|,s7izֳ 1˨Xl~gƢ^y9QhbN{Eװ:Q,6 -strV:˧`ӡ rut8yRS&k[#:q/H:;?a/XROhlDM7mby)h~I98o^\@ Class Name Format In .NET
You are here: Platform Specific Issues > Class Name Format In .NET

Class Name Format In .NET

Db4o uses full class name to distinguish classes within the database file. In .NET full class name has the following format:

Namespace.ClassName, AssemblyName

Effectively that means that the same class definition within different assemblies (applications or libraries) will be recognized as two different classes by db4o. You should keep this in mind in the following cases:

  • 2 or more applications working with the same database file;
  • client/server application with the classes deployed on both the client and the server;
  • ASP.NET2 application with dynamic compilation

Let's use an example to see what happens in these cases. We will create 2 applications Test1.exe and Test2.exe. Both will have a simplest class definition:

Test.cs
/**//* Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com */
namespace Db4objects.Db4odoc.ClassNameFormat
 {
    class Test
     {
        public override string ToString()
         {
            return "Test";
        }
    }
}

Test.vb
' Copyright (C) 2004 - 2007 Versant Inc. http://www.db4o.com
Namespace Db4objects.Db4odoc.ClassNameFormat

    Class TestClass Test

        Public Overloads Overrides Function ToString() As String
            Return "Test"
        End Function
    End Class
End Namespace

Test1 application will store one object of Test class to the database:

ClassNameExample1.cs: StoreObjects
private static void StoreObjects()
         {
            File.Delete(Db4oFileName);
            IObjectContainer container = Db4oFactory.OpenFile(Db4oFileName);
            try
             {
                // Store a simple class to the database
                Test test = new Test();
                container.Store(test);
            }
            finally
             {
                container.Commit();
            }
        }

ClassNameExample1.vb: StoreObjects
Private Shared Sub StoreObjects()
            File.Delete(Db4oFileName)
            Dim container As IObjectContainer = _ 
Db4oFactory.OpenFile(Db4oFileName)
            Try
                ' Store a simple class to the database
                Dim test As Test = New Test
                container.Store(test)
            Finally
                container.Commit()
            End Try
        End Sub

Another application (Test2) will try to read this object from the same database file. To check how the Test object was actually stored in the database we will use StoredClass API:

ClassNameExample2.cs: CheckDatabase
public static void CheckDatabase()
         {
            IObjectContainer container = Db4oFactory.OpenFile(Db4oFileName);
            try
             {
                // Read db4o contents from another application
                IObjectSet result = container.QueryByExample(typeof(Test));
                ListResult(result);
                // Check what classes are actualy stored in the database
                IStoredClass[] storedClasses = container.Ext().StoredClasses();
                foreach (IStoredClass storedClass in storedClasses)
                 {
                    System.Console.WriteLine("Stored class: " + storedClass.GetName());
                }
            }
            finally
             {
                container.Commit();
            }
        }

ClassNameExample2.vb: CheckDatabase
Private Shared Sub CheckDatabase()
            Dim container As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName)
            Try
                ' Read db4o contents from another application
                Dim result As IObjectSet = container.QueryByExample(GetType(Test))
                ListResult(result)
                ' Check what classes are actualy stored in the database
                Dim storedClasses As IStoredClass() = container.Ext.StoredClasses
                Dim storedClass As IStoredClass
                For Each storedClass In storedClasses
                    System.Console.WriteLine("Stored class: " + storedClass.GetName)
                Next
            Finally
                container.Commit()
            End Try
        End Sub

From the example we can see that though the class has been stored to the database, it cannot be retrieved from the Test2 application, as the assembly name is different from the original.

In order to make your classes readable from another assembly you should use one of the existing workarounds:

  • keep your persistent classes in a separate class library, which should be available for your application assemblies (for the example above compile the Test class into Persistent.dll);
  • use db4o Aliases.

Download example code:

VB.NET c#

././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net_platform.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_.net0000644000175000017500000002603111520622616034070 0ustar directhexdirecthex Security Requirements On .NET Platform
You are here: Platform Specific Issues > Security Requirements On .NET Platform

Security Requirements On .NET Platform

db4o requires certain security permissions to be granted for successful execution. It is important to know these permission requirements in a not fully trusted environment. .NET security model is out of scope of this article, to find out more about it use Internet search on ".NET security permissions".

Security permissions of an assembly can be calculated with the help of PermCalc tool, which can be found in Visual Studio installation:

[Visual Studio Home]\SDK\v2.0\Bin

The following command line will calculate the minimum security permissions for Db4objects.Db4o.dll and will safe them in xml format Sandbox.Permcalc.xml document:

PermCalc.exe -sandbox Db4objects.Db4o.dll

The output should look like this:

Db4o.Xml
<?xml version="1.0"?>
<Sandbox>
  <PermissionSet version="1" class="System.Security.PermissionSet">
    <IPermission version="1" 
class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" 
Read="*AllFiles*" PathDiscovery="*AllFiles*" />
    <IPermission version="1" 
class="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" Flags="MemberAccess" />
    <IPermission version="1" class="System.Security.Permissions.SecurityPermission, 
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
Flags="UnmanagedCode, Execution, ControlEvidence, SerializationFormatter, 
ControlAppDomain" />
    <IPermission Window="SafeSubWindows" Clipboard="OwnClipboard" version="1" 
class="System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <IPermission version="1" 
class="System.Security.Permissions.KeyContainerPermission, mscorlib, 
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
Unrestricted="true" />
  </PermissionSet>
</Sandbox>

(UIPermission is not required).

The table below contains short explanation of each permission requirement. For the complete list of method calls requiring special security permissions, please run permcalc tool with -Stacks parameter. (More information on PermCalc can be found on MSDN site).

Permission name

Functionality

FileIOPermission

File read, write and create permissions are required for the corresponding operations on the database file. db4o does not restrict the location of a database file, therefore these permissions and browsing permission is required for all files in the system.

ReflectionPermission

db4o ability to create runtime objects from the database data is based on reflection. Reflection should be allowed.

SecurityPermission:

UnmanagedCode

Unmanaged code is used internally for file access and socket operations.

Execution

Permission for the code to run. Without this permission, managed code will not be executed.

ControlEvidence

Is required internally to make use of some .NET functionality

SerializationFormatter

Used to utilize serialization services (formatters)

ControlAppDomain

Utilized with AppDomain functions.

KeyContainerPermission

Is used in .NET Socket operations.

When you deploy an assembly, you must take into consideration all the assemblies that can be referenced from the original assembly. db4o can be deployed with the following additional assemblies:

  • Db4objects.Db4o.NativeQueries.dll : for runtime NQ optimization;
  • Db4objects.Db4o.Instrumentation.dll : bytecode instrumentation library (required for NQ optimization).

The following table lists the permission requirements of these auxiliary assemblies:

Assembly

Permission requirements

Db4objects.Db4o.NativeQueries

  • No specific permissions

Db4objects.Db4o.Instrumentation

  • SecurityPermission(UnmanagedCode)
  • UIPermission

Download example permission:

permcalc.xml

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/0000755000175000017500000000000011520622620026621 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_request_example.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_request_example.h0000644000175000017500000002461611520622610033635 0ustar directhexdirecthex ASP.NET Request Example
You are here: Platform Specific Issues > Web Environment > ASP.NET Request Example

ASP.NET Request Example

This example demonstrates how you can provide an object container for each request, to ensure that the requests are isolated from each other. For this we use session object containers. See "Isolation in Web-Applications"

First, create a new class which implements the IHttpModule-interface. Then register this interface in the Web.config configuration:

<httpModules>
  <add name="Db4oDatabase" type="Db4oDoc.WebApp.Infrastructure.Db4oProvider" />
  <!-- Other, existing modules-->
  <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
  <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpModules>
Web.config: Add the db4o-http-handler

Additionally add a key where you specify the path to the database-file. Make sure that you have the data folder inside you web-site directory. The ASP.NET user should have enough rights to create and modify files inside this folder. You should also make sure that the data folder is not accessible to anonymous user; otherwise web-server visitors will be able to download your database:

<appSettings>
  <add key="DatabaseFileName" value="~/App_Data/database.db4o"/>
</appSettings>
Web.config: Database path in the configuration

After that, implement the initializing sequence. When the server starts, it starts up db4o and adds the database to the application-context:

public void Init(HttpApplication context)
{
    if (null == HttpContext.Current.Application[DataBaseInstance])
    {
        HttpContext.Current.Application[DataBaseInstance] = OpenDatabase();
    }
    RegisterSessionCreation(context);
}

private IEmbeddedObjectContainer OpenDatabase()
{
    string relativePath = ConfigurationSettings.AppSettings["DatabaseFileName"];
    string filePath = HttpContext.Current.Server.MapPath(relativePath);
    return Db4oEmbedded.OpenFile(filePath);
}
Db4oProvider.cs: open database when the application starts

On the dispose-method add the shutdown code:

public void Dispose()
{
    IDisposable toDispose = HttpContext.Current.Application[DataBaseInstance] as IDisposable;
    if (null != toDispose)
    {
        toDispose.Dispose();
    }
}
Db4oProvider.cs: close the database when the application shuts down

Now it's time to ensure that each requests has its own object container. To archive that, use the open-session-method. Register for the request-begin and request-end events. In begin session event, open a new db4o session. In the end request event, close that session.

private void RegisterSessionCreation(HttpApplication httpApplication)
{
    httpApplication.BeginRequest += OpenSession;
    httpApplication.EndRequest += CloseSession;
}

private void OpenSession(object sender, EventArgs e)
{
    IObjectContainer container =
        (IObjectContainer)HttpContext.Current.Application[DataBaseInstance];
    IObjectContainer session = container.Ext().OpenSession();
    HttpContext.Current.Items[SessionKey] = session;
}

private void CloseSession(object sender, EventArgs e)
{
    IObjectContainer session = (IObjectContainer)HttpContext.Current.Items[SessionKey];
    session.Dispose();
}
Db4oProvider.cs: A object container per request

Finally add a static property which gives access to the request-instance:

public static IObjectContainer Database
{
    get { return (IObjectContainer)HttpContext.Current.Items[SessionKey]; }
}
Db4oProvider.cs: provide access to the database

That's it. Of course there are other ways to archive the same result. For example you can use dependency injection frameworks like Microsoft's Unity to enforce the request scope.

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/web_isolation.htm0000644000175000017500000001635011520622620032176 0ustar directhexdirecthex Isolation in Web-Applications
You are here: Platform Specific Issues > Web Environment > Isolation in Web-Applications

Isolation in Web-Applications

In most web-application multiple concurrent request are processes. You want to isolate the request from each other. db4o supports transactions, which are perfect for this kind of isolation. Each unit of work gets its own transaction, for example each request. You can create a new session object container for this purpose. Such a session-container brings its own transaction and reference-system. This ensures that the session container is isolated from other operations on the database.

using (IObjectContainer rootContainer = Db4oEmbedded.OpenFile(DatabaseFileName))
{
    // open the db4o-session. For example at the beginning for a web-request
    using (IObjectContainer session = rootContainer.Ext().OpenSession())
    {
        // do the operations on the session-container
        session.Store(new Person("Joe"));
    }
}
Db4oSessions.cs: Session object container
Using rootContainer As IObjectContainer = Db4oEmbedded.OpenFile(DatabaseFileName)
    ' open the db4o-session. For example at the beginning for a web-request
    Using session As IObjectContainer = rootContainer.Ext().OpenSession()
        ' do the operations on the session-container
        session.Store(New Person("Joe"))
    End Using
End Using
Db4oSessions.vb: Session object container

Or you can use embedded clients when your embedded clients.

using (IObjectServer server = Db4oClientServer.OpenServer(DatabaseFileName, 0))
{
    // open the db4o-embedded client. For example at the beginning for a web-request
    using (IObjectContainer container = server.OpenClient())
    {
        // do the operations on the session-container
        container.Store(new Person("Joe"));
    }
}
Db4oSessions.cs: Embedded client
Using server As IObjectServer = Db4oClientServer.OpenServer(DatabaseFileName, 0)
    ' open the db4o-embedded client. For example at the beginning for a web-request
    Using container As IObjectContainer = server.OpenClient()
        ' do the operations on the session-container
        container.Store(New Person("Joe"))
    End Using
End Using
Db4oSessions.vb: Embedded client
db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_security.htm0000644000175000017500000001364711520622616032652 0ustar directhexdirecthex ASP.NET Security
You are here: Platform Specific Issues > Web Environment > ASP.NET Security

ASP.NET Security

It is characteristic to web-applications that there are some security permissions involved, which can in fact forbid db4o functionality in your ASP.NET application. So, before developing/deploying you should make sure that the required permissions would be granted to your application at the hosting server:

  1. ASP.NET user should have read/write permissions to the directory containing database file. Obviously this is necessary to work with the database.
  2. Trust Level of your site should be set to "Full".

  3. All the necessary permissions should be granted to db4o assembly. The easiest way to ensure this is to add full trust to db4o by installing it in GAC.

  4. If full trust is not a suitable solution for, you can check the minimum security permissions that db4o-assembly needs to operate using permcalc.exe tool from your Visual Studio installation.

    PermCalc.exe -Sandbox Db4objects.Db4o.dll

    sandbox.PermCalc.xml
    <?xml version="1.0"?>
    <Sandbox>
      <PermissionSet version="1" 
    class="System.Security.PermissionSet">
        <IPermission version="1" 
    class="System.Security.Permissions.FileIOPermission, mscorlib, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    Read="*AllFiles*" PathDiscovery="*AllFiles*" />
        <IPermission version="1" 
    class="System.Security.Permissions.ReflectionPermission, mscorlib, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    Flags="MemberAccess" />
        <IPermission version="1" 
    class="System.Security.Permissions.SecurityPermission, mscorlib, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    Flags="UnmanagedCode, Execution, ControlEvidence" />
        <IPermission Window="SafeSubWindows" Clipboard="OwnClipboard" 
    version="1" class="System.Security.Permissions.UIPermission, mscorlib, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <IPermission version="1" 
    class="System.Security.Permissions.KeyContainerPermission, mscorlib, 
    Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
    Unrestricted="true" />
      </PermissionSet>
    </Sandbox>

    Consult with your web-server administrator to grant these permissions. permcalc.xml

././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_assembly_naming.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_assembly_naming.h0000644000175000017500000001230511520622606033577 0ustar directhexdirecthex ASP.NET Assembly Naming
You are here: Platform Specific Issues > Web Environment > ASP.NET Assembly Naming

ASP.NET Assembly Naming

If you are creating your application in ASP.NET 2.0 you should take into consideration that the assembly names are generated automatically on each build by default. Db4o distinguish persisted classes by name, namespace and assembly. So after the assembly name has changed, you won't be able to access classes saved with the previous version of the assembly.

There are several workarounds:

  • You can create a separate class library keeping db4o logic and persistent classes. This can also help if you need to access fully trusted db4o library from partially trusted ASP application
  • You can build your ASP.NET2 application manually using aspnet_compiler utility from .NET2 SDK.
  • aspnet_compiler.exe -v /WebSite -f -fixednames c:\WebSite -c -errorstack

    Microsoft has published a how-to for using the aspnet_compiler to generate fixed names for ASP.NET assemblies.

  • You can use db4o aliasing API to redirect saved classes to the new assembly name. The following method should be called before opening database file to make all the classes within the namespace available after assembly name change:
  • You can use TypeAlias for aliasing only specific class.

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web/asp.net_mvc_example.htm0000644000175000017500000001745411520622606033302 0ustar directhexdirecthex ASP.NET MVC Example
You are here: Platform Specific Issues > Web Environment > ASP.NET MVC Example

ASP.NET MVC Example

This example is a tiny CRUD application which shows how to use db4o in ASP.NET MVC 2.0. Download the code here. This example requires Visual Studio 2008 or new and ASP.NET MVC 2.0 installed. Unzip the project. Add the db4o-assemblies to the Lib-folder. Then open the project and run it. 

Managing Object Containers

This example uses the code from the request-example to create a object container for each request. On each new request a object container is opened. Then all operations are done on this container. When the request ends, the container is disposed.

Object Identification

This example uses a GUID for each object to identify it across requests. Persisted objects inherit from the IDHolder class which contains the id-field. Take a look at alternatives for ids. See "Comparison Of Different IDs"

Using db4o

You can use db4o as expected. Just use the request-container:

public ActionResult Index()
{
    IList<Pilot> allPilots = Db4oProvider.Database.Query<Pilot>();
    return View(allPilots);
}
HomeController.cs: Listing all pilots on the index

Using IDs

Now the ids can be used in the views and actions to identify objects. For example in a list-view you use the ids for the action-links:

<% foreach (var pilot in Model) { %>

    <tr>
        <td>
            <%= Html.ActionLink("Edit", "Edit", new { id=pilot.ID }) %> |
            <%= Html.ActionLink("Delete", "Delete", new { id = pilot.ID })%>
        </td>
        <td>
            <%= Html.Encode(pilot.Name) %>
        </td>
        <td>
            <%= Html.Encode(pilot.Points) %>
        </td>
    </tr>

<% } %>
Index.aspx: In the view use the ids to identify the objects

Another location where the ids are used is in the actions. For example when you need to store changes. First we get a object which contains all changes. Then we copy all changes to the existing object in the database and finally store it. See "Merging Changes"

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Guid id, Pilot editedPilot)
{
    Pilot databasePilot = GetPilotById(id);
    databasePilot.Name = editedPilot.Name;
    databasePilot.Points = editedPilot.Points;
    Db4oProvider.Database.Store(databasePilot);

    return RedirectToAction("Index");
}
HomeController.cs: update the object

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/silverlight.htm0000644000175000017500000002631311520622610031116 0ustar directhexdirecthex Silverlight
You are here: Platform Specific Issues > Silverlight

Silverlight

db4o runs with some limitations on Microsoft's Silverlight. You can find the Silverlight assemblies in the db4o distribution, in the folder 'bin/silverlight'.

Feature Set

Currently only the core functionality is supported on Silverlight. The db4o core and the db4o LINQ provider run on Silverlight. Other features like the client-server mode are not supported.

Add Silverlight Support

To run db4o on Silverlight you need to use the Silverlight assemblies which are in the db4o distribution. Additionally you need to configure the Silverlight support in the db4o configuration. This also configured the isolated storage.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.AddConfigurationItem(new SilverlightSupport());

IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOExamples.cs: Add Silverlight support
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.AddConfigurationItem(New SilverlightSupport())

Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOExamples.vb: Add Silverlight support

Persistent Object Limitations

Due to the restrictions of the Silverlight sandbox, it's impossible to inspect the private fields of an object. This means that the field of persistent objects need to be public!

Also auto-properties cannot be stored. Auto properties use a regular, compiler generated private field to hold the data. Since db4o cannot access private fields, it also cannot access the data of auto-properties.

public class Person
{
    public string FirstName;
    public string SirName;
}
Person.cs: fields need to be public to be persisted
Public Class Person
    Public FirstName As String
    Public SirName As String
End Class
Person.vb: fields need to be public to be persisted

Queries

You can use LINQ to query your objects in Silverlight. Note that the Silverlight version uses the Mono.Cecil.dll and the Cecil.FlowAnalysis.dll assembly for the LINQ-implementation.

var persons = from Person p in container
              where p.FirstName.Contains("Roman")
              select p;

foreach (Person person in persons)
{
    // do something with the person
}
QueriesInSilverlight.cs: Queries in Silverlight
Dim persons = From p As Person In container _
              Where p.FirstName.Contains("Roman") _
              Select p
For Each p As Person In persons
    ' do something with the person
Next
QueriesInSilverlight.vb: Queries in Silverlight

Isolated Storage

By default you cannot access the file system in Silverlight, but only a special isolated storage. Therefore you need to use the isolated storage when you're configuring the IO system. By default this storage is limited to 1 MByte of data. You can increase it with the users consent.

When the Silverlight application runs outside the browser with enough privileges you can use the regular storage. However by default the isolated storage should be used.

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.File.Storage = new IsolatedStorageStorage();

IObjectContainer container = Db4oEmbedded.OpenFile(configuration, "database.db4o");
IOExamples.cs: use the isolated storage on silverlight
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.File.Storage = New IsolatedStorageStorage()

Dim container As IObjectContainer = Db4oEmbedded.OpenFile(configuration, "database.db4o")
IOExamples.vb: use the isolated storage on silverlight
db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/db4o_on_.net_platforms.htm0000644000175000017500000000777511520622620033135 0ustar directhexdirecthex db4o on .NET Platforms
You are here: Platform Specific Issues > db4o On .NET Platforms

db4o on .NET Platforms

All .NET

  • .NET version of db4o uses Pascal case for method names
  • Root namespace is Db4objects.Db4o
  • All namespaces start with upper case letter
  • Interface names have an I prefix
  • .NET Reflection mechanism adds assembly name to class definition. If you use db4o database with two applications (client and server) you'll have to move all persistent class definitions into a shared .dll. Identical classes compiled into different executables/libraries will be treated as different.
  • Enumerations are treated as integer types

Please, refer to Security Requirements On .NET Platform for further information.

.NET Compact Framwork

Due to some platform limitations nativ queries cannot be optimized at runtime. Use LINQ as a better alternative. Or you can use the Db4oTool.exe command line utility on their assemblies prior to deploying them.

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/0000755000175000017500000000000011520622616032224 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/comparison_of_ids.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/comparis0000644000175000017500000002505211520622616033770 0ustar directhexdirecthex Comparison Of Different IDs
You are here: Platform Specific Issues > Disconnected Objects > Comparison Of Different IDs

Comparison Of Different IDs

There are a lot of possibilities for additional ids to identify objects across the object container boundary.

Internal db4o ids

db4o has internal ids to identify each object in the database. You can access these ids and use them yourself. See "Internal IDs". Take a look at the example. See "Example Internal Id"

Advantages Disadvantages
  • Internal ids are fast.
  • No additional field on the class required.
  • No additional configuration required.
  • The id may change when defragmentating the database.

db4o UUIDs

db4o supports special UUIDs. You can enable them by configuration. See "Unique Universal IDs". Take a look at the example. See "Example db4o UUID"

Advantages Disadvantages
  • A UUID is a worldwide unique id.
  • No additional field on the class required.
  • db4o UUIDs are large.
  • db4o UUID is db4o-specific type.

Guid-Fields on Classes

You can add Guid-fields to your classes. In the constructor of the object you assign a new Guid to the object. Then you can find the object by a regular query. . Don't forget to index the id-field. Take a look at the example. See "Example Guid"

Advantages Disadvantages
  • A Guid is a worldwide unique id .
  • Guid are easy to generate and portable.
  • You need an id-field on your objects.
  • Guids are quite large.
  • Additional index required.

ID-Field On Classes With a ID-Generator

You can add a id-field to your classes and then use an ID-Generator to assign new ids to stored objects. Don't forget to index the id-field. Take a look at the example. See "Example ID-Generator"

Advantages Disadvantages
  • A simple id on objects.
  • Familiar model from the RDBMS-world.
  • You need an id-field on your objects.
  • You need to implement an ID-Generator. Which isn't trivial.
  • Additional index required.
././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_merge_changes.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_0000644000175000017500000001477511520622616033757 0ustar directhexdirecthex Example Merge Changes
You are here: Platform Specific Issues > Disconnected Objects > Merging Changes > Example Merge Changes

Example Merge Changes

This example shows how changes are merged from the disconnected object to the object to update. To do this, traverse the object-graph and copy all value types over. All reference-types are first checked if they're an existing object. If it is,the primitives are copied over, otherwise it's a stored as a new object.

using (IObjectContainer container = OpenDatabase())
{
    // first get the object from the database
    Car carInDb = GetCarById(container, disconnectedCar.ObjectId);

    // copy the value-objects (int, long, double, string etc)
    carInDb.Name = disconnectedCar.Name;

    // traverse into the references
    Pilot pilotInDB = carInDb.Pilot;
    Pilot disconnectedPilot = disconnectedCar.Pilot;

    // check if the object is still the same
    if (pilotInDB.ObjectId.Equals(disconnectedPilot.ObjectId))
    {
        // if it is, copy the value-objects
        pilotInDB.Name = disconnectedPilot.Name;
        pilotInDB.Points = disconnectedPilot.Points;
    }
    else
    {
        // otherwise replace the object
        carInDb.Pilot = disconnectedPilot;
    }

    // finally store the changes
    container.Store(pilotInDB);
    container.Store(carInDb);
MergeExample.cs: merging
Using container As IObjectContainer = OpenDatabase()
    ' first get the object from the database
    Dim carInDb As Car = GetCarById(container, disconnectedCar.ObjectId)

    ' copy the value-objects (int, long, double, string etc)
    carInDb.Name = disconnectedCar.Name

    ' traverse into the references
    Dim pilotInDB As Pilot = carInDb.Pilot
    Dim disconnectedPilot As Pilot = disconnectedCar.Pilot

    ' check if the object is still the same
    If pilotInDB.ObjectId.Equals(disconnectedPilot.ObjectId) Then
        ' if it is, copy the value-objects
        pilotInDB.Name = disconnectedPilot.Name
        pilotInDB.Points = disconnectedPilot.Points
    Else
        ' otherwise replace the object
        carInDb.Pilot = disconnectedPilot
    End If

    ' finally store the changes
    container.Store(pilotInDB)
MergeExample.vb: merging

You can use reflection to automated this process. You can also use existing libraries like Automapper which help you to do this.

././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_plattform_uuid.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_0000644000175000017500000002234511520622616033747 0ustar directhexdirecthex Example Guid

Example Guid

This example demonstrates how you can use Guids to identify objects across objects containers. Take a look advantages and disadvantages of Guids: See "Comparison Of Different IDs"

This example assumes that all object have a common super-class, IDHolder, which holds the Guid in a field.

private readonly Guid guid = Guid.NewGuid();

public Guid ObjectId
{
    get { return guid; }
}
IDHolder.cs: generate the id
Private ReadOnly guid As Guid = Guid.NewGuid()

Public ReadOnly Property ObjectId() As Guid
    Get
        Return guid
    End Get
End Property
IDHolder.vb: generate the id

It's important to index the id-field, otherwise looking up for object by id will be slow.

configuration.Common.ObjectClass(typeof (IDHolder)).ObjectField("guid").Indexed(true);
UuidOnObject.cs: index the uuid-field
configuration.Common.ObjectClass(GetType(IDHolder)).ObjectField("guid").Indexed(True)
UuidOnObject.vb: index the uuid-field

The id is hold by the object itself, so you can get it directly.

IDHolder uuidHolder = (IDHolder) obj;
Guid uuid = uuidHolder.ObjectId;
UuidOnObject.cs: get the uuid
Dim uuidHolder As IDHolder = DirectCast(obj, IDHolder)
Dim uuid As Guid = uuidHolder.ObjectId
UuidOnObject.vb: get the uuid

You can get the object you can by a regular query.

IDHolder instance = container.Query(delegate(IDHolder o) { return o.ObjectId.Equals(idForObject); })[0];
UuidOnObject.cs: get an object its UUID
Dim instance As IDHolder = container.Query(Function(o As IDHolder) o.ObjectId.Equals(idForObject))(0)
UuidOnObject.vb: get an object its UUID

 

././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/merging_changes.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/merging_0000644000175000017500000001002411520622610033725 0ustar directhexdirecthex Merging Changes
You are here: Platform Specific Issues > Disconnected Objects > Merging Changes

Merging Changes

Merging the changes is the most challenging part when using disconnected objects. Imagine that we have a disconnected object, which contains the changes. We have to store the changes somehow. You cannot simply store the disconnected object, because db4o wouldn't recognize it and store a new object instead of updating the old one. See "Wrong Approach"

Instead you need to load the existing object and then copy the state from the disconnected object to the loaded object. Basically you traverse the object-graph and copy all changes over. See "Example Merge Changes"

db4o has no built-in merge support. However there are external libraries which can help you to merge changes, like Automapper .

././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/wrong_approach.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/wrong_ap0000644000175000017500000002051511520622614033764 0ustar directhexdirecthex Wrong Approach

Wrong Approach

The wrong approach is to try to store disconnected objects. db4o manages object by their object-identity and doesn't recognize objects which have been serialized or loaded by another object container instance. This example shows, that instead of updating the object, db4o will store a new instance of the object.

Pilot joe;
using (IObjectContainer container = OpenDatabase())
{
    joe = QueryByName(container, "Joe");
}
// The update on another object 
joe.Name = "Joe New";
using (IObjectContainer otherContainer = OpenDatabase())
{
    otherContainer.Store(joe);
}
using (IObjectContainer container = OpenDatabase())
{
    // instead of updating the existing pilot,
    // a new instance was stored.
    IList<Pilot> pilots = container.Query<Pilot>();
    Console.WriteLine("Amount of pilots: " + pilots.Count);
    foreach (Pilot pilot in pilots)
    {
        Console.WriteLine(pilot);
    }
}
ObjectIdentityExamples.cs: Update doesn't works when using the different object containers
Dim joe As Pilot
Using container As IObjectContainer = OpenDatabase()
    joe = QueryByName(container, "Joe")
End Using
' The update on another object 
joe.Name = "Joe New"
Using otherContainer As IObjectContainer = OpenDatabase()
    otherContainer.Store(joe)
End Using
Using container As IObjectContainer = OpenDatabase()
    ' instead of updating the existing pilot,
    ' a new instance was stored.
    Dim pilots As IList(Of Pilot) = container.Query(Of Pilot)()
    Console.WriteLine("Amount of pilots: " & pilots.Count)
    For Each pilot As Pilot In pilots
        Console.WriteLine(pilot)
    Next
End Using
ObjectIdentityExamples.vb: Update doesn't works when using the different object containers

So in order to update an object, you need to load and store it in the same object-container. If you cannot do this, you need to merge to object-changes. See "Example Merge Changes"

using (IObjectContainer container = OpenDatabase())
{
    Pilot joe = QueryByName(container, "Joe");
    joe.Name = "Joe New";
    container.Store(joe);
}
using (IObjectContainer container = OpenDatabase())
{
    IList<Pilot> pilots = container.Query<Pilot>();
    Console.WriteLine("Amount of pilots: " + pilots.Count);
    foreach (Pilot pilot in pilots)
    {
        Console.WriteLine(pilot);
    }
}
ObjectIdentityExamples.cs: Update works when using the same object container
Using container As IObjectContainer = OpenDatabase()
    Dim joe As Pilot = QueryByName(container, "Joe")
    joe.Name = "Joe New"
    container.Store(joe)
End Using
Using container As IObjectContainer = OpenDatabase()
    Dim pilots As IList(Of Pilot) = container.Query(Of Pilot)()
    Console.WriteLine("Amount of pilots: " & pilots.Count)
    For Each pilot As Pilot In pilots
        Console.WriteLine(pilot)
    Next
End Using
ObjectIdentityExamples.vb: Update works when using the same object container
././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_internal_id.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_0000644000175000017500000001536011520622606033745 0ustar directhexdirecthex Example Internal Id

Example Internal Id

This example demonstrates how you can use internal object ids to identify objects across objects containers. Take a look advantages and disadvantages of internal ids: See "Comparison Of Different IDs"

For using the internal ids no additional configuration is required. You can get this id for any object.

You can get the internal id from the extended object container.

long interalId = container.Ext().GetID(obj);
Db4oInternalIdExample.cs: get the db4o internal ids
Dim interalId As Long = container.Ext().GetID(obj)
Db4oInternalIdExample.vb: get the db4o internal ids

Getting a object by its id is also easy. First you get the object from the container. Unlike queries this won't return a activated object. So you have to do it explicitly.

long internalId = idForObject;
object objectForID = container.Ext().GetByID(internalId);
// getting by id doesn't activate the object
// so you need to do it manually
container.Ext().Activate(objectForID);
Db4oInternalIdExample.cs: get an object by db4o internal id
Dim internalId As Long = idForObject
Dim objForID As Object = container.Ext().GetByID(internalId)
' getting by id doesn't activate the object
' so you need to do it manually
container.Ext().Activate(objForID)
Db4oInternalIdExample.vb: get an object by db4o internal id
././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_db4o_uuid.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_0000644000175000017500000001765211520622616033754 0ustar directhexdirecthex Example db4o UUID

Example db4o UUID

This example demonstrates how you can use db4o-UUIDs to identify objects across objects containers. Take a look advantages and disadvantages of db4o-UUIDs: See "Comparison Of Different IDs"

First you need to enable db4o-UUIDs in order to use it.

configuration.File.GenerateUUIDs = ConfigScope.Globally;
Db4oUuidExample.cs: db4o-uuids need to be activated
configuration.File.GenerateUUIDs = ConfigScope.Globally
Db4oUuidExample.vb: db4o-uuids need to be activated

With UUIDs turned on, db4o will create an UUID for each stored object. So you can get the UUID of the object from the object-container.

Db4oUUID uuid = container.Ext().GetObjectInfo(obj).GetUUID();
Db4oUuidExample.cs: get the db4o-uuid
Dim uuid As Db4oUUID = container.Ext().GetObjectInfo(obj).GetUUID()
Db4oUuidExample.vb: get the db4o-uuid

Getting a object by its UUID is also easy. First you get the object from the container. Unlike queries this won't activate your object. So you have to do it explicitly.

object objectForId = container.Ext().GetByUUID(idForObject);
// getting by uuid doesn't activate the object
// so you need to do it manually
container.Ext().Activate(objectForId);
Db4oUuidExample.cs: get an object by a db4o-uuid
Dim objForId As Object = container.Ext().GetByUUID(idForObject)
' getting by uuid doesn't activate the object
' so you need to do it manually
container.Ext().Activate(objForId)
Db4oUuidExample.vb: get an object by a db4o-uuid
././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_id_generator.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects/example_0000644000175000017500000002674411520622616033756 0ustar directhexdirecthex Example ID-Generator

Example ID-Generator

This example demonstrates how you can use an ID-generator to identify objects across objects containers. Take a look advantages and disadvantages of ID-generators: See "Comparison Of Different IDs"

This example assumes that all object have a common super-class, IDHolder, which holds the id.

private int id;

public int Id
{
    get { return id; }
    set { id = value; }
}
IDHolder.cs: id holder
Private m_id As Integer

Public Property Id() As Integer
    Get
        Return m_id
    End Get
    Set(ByVal value As Integer)
        m_id = value
    End Set
End Property
IDHolder.vb: id holder

Don't forget to index the id-field. Otherwise finding objects by id will be slow.

configuration.Common.ObjectClass(typeof (IDHolder)).ObjectField("id").Indexed(true);
AutoIncrementExample.cs: index the id-field
configuration.Common.ObjectClass(GetType(IDHolder)).ObjectField("id").Indexed(True)
AutoIncrementExample.vb: index the id-field

The hard part is to write an efficient ID-Generator. For this example a very simple auto increment generator is used. Use the creating-callback-event in order to add the ids to the object. When committing, store the state of the id-generator.

AutoIncrement increment = new AutoIncrement(container);
IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container);

eventRegistry.Creating+=
    delegate(object sender, CancellableObjectEventArgs args)
    {
        if (args.Object is IDHolder)
        {
            IDHolder idHolder = (IDHolder)args.Object;
            idHolder.Id = increment.GetNextID(idHolder.GetType());
        }    
    };
eventRegistry.Committing +=
    delegate(object sender, CommitEventArgs args)
        {
            increment.StoreState();    
        };
AutoIncrementExample.cs: use events to assign the ids
Dim increment As New AutoIncrement(container)
Dim eventRegistry As IEventRegistry = EventRegistryFactory.ForObjectContainer(container)

AddHandler eventRegistry.Creating, AddressOf increment.HandleCreating
AddHandler eventRegistry.Committing, AddressOf increment.HandleCommiting
AutoIncrementExample.vb: use events to assign the ids

The id is hold by the object itself, so you can get it directly.

IDHolder idHolder = (IDHolder) obj;
int id = idHolder.Id;
AutoIncrementExample.cs: get the id
Dim idHolder As IDHolder = DirectCast(obj, IDHolder)
Dim id As Integer = idHolder.Id
AutoIncrementExample.vb: get the id

You can get the object you can by a regular query.

object instance = container.Query(delegate(IDHolder o) { return o.Id == id; })[0];
AutoIncrementExample.cs: get an object by its id
Dim instance As Object = container.Query(Function(o As IDHolder) o.Id = id)(0)
AutoIncrementExample.vb: get an object by its id
db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classnameformatcs.zip0000644000175000017500000000302511520622620032275 0ustar directhexdirecthexPKخ7HxttClassNameExample1.csRMo0#F9J5iUiV9Fʡ!`$q6'_@{o;HtYD'''~ %l88 vV jKXw]< /Ж\0i[*; q8g_xQ&5J#V9}'LadpfQ Ks)\''wKP7;GmEಝ*tC1jq=>%~>6 } -T9z4Kip5[d؇Mv&ʪ6Մz v_&wpn`b1CZb3ΤaX- %IAjT _Ҭz~a.zHr?opȢm}c@hw11<(0iB`}M4Cw7u3#q6! 1a)cWLCE= 7SZilJLY*:_wfB<=U:.ݬ&ffVկֹ*:s/=b[(ݶZ)_PKخ7MTest.csRp/,L(QpT0200QQ )I&IY% yz %%Vz )\-}^T=3%?Y9'-(7KA !%>T Jr2R2SRK2B MR$] PZRZ2V!W a) PK(خ7Hxtt$ ClassNameExample1.cs 3}Q"bC"bCPK(Wn7K?-$ ClassNameExample2.cs s݋GL݋G$"bCPK(خ7M$ Test.cs 㹯Q "bC "bCPK%db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/disconnected_objects.htm0000644000175000017500000001057411520622610032737 0ustar directhexdirecthex Disconnected Objects
You are here: Platform Specific Issues > Disconnected Objects

Disconnected Objects

db4o manages objects by object-identity. db4o ensures that each stored object in the database is always represented by the same object in memory. When you load an object, change it and then store it, db4o recognizes the object by its identity and will update it.

This model works wonderful as long as the object-identity is preserved. However there are a lot of scenarios, where the object-identity is lost. As soon as serialize objects, the object-identity is lost. This is typical for web-scenarios or web-services, where a object needs to be identified across requests. For such scenarios objects need additional ids to identify object across requests- and object-container-boundaries.

There are several possibilities for such additional ids. You can use db4o internal ids, db4o uuids, or additional ids-fields on objects. Each has its advantages and disadvantages, so take a looks at this comparison: See "Comparison Of Different IDs"

Only identifying the object across object container boundaries is often not enough. You actually need to update a disconnected object. This is done by coping the new values to the existing object. See "Merging Changes"

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/wcf_data_services.htm0000644000175000017500000002516511520622616032247 0ustar directhexdirecthex WCF Data Services (aka ADO.NET Data Services)
You are here: Platform Specific Issues > WCF Data Services (aka ADO.NET Data Services)

WCF Data Services (aka ADO.NET Data Services)

The WCF Data Services allows you to easily expose your data as a web service. db4o supports this framework. Look up the MSDN documentation on WCF Data Service for more details about it and its features.

The are two things which the data service need. An IQueryable implementation and a IUpdatable implementation. db4o provides both. For this you need to reference the Db4objects.Db4o.Linq.dll and Db4objects.Db4o.Data.Services.dll. The first one contains the LINQ-provider, the second contains the IUpdatable.

Preparing The Persistent Classes

The first thing you need to do is to add a key to your objects. And you need specify at least one key for each object.

[DataServiceKey("Email")]
public class Person
{
    private string name;
    private string email;

    // Note that a default constructor is required for WCF
    public Person()
    {
    }

    public Person(string email, string name)
    {
        this.email = email;
        this.name = name;
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public string Email
    {
        get { return email; }
        set { email = value; }
    }

}
Person.cs: Add at least one key
[DataServiceKey("TeamName")]
public class Team
{
    private string teamName;
    private string motivation;
    private IList<Person> members = new List<Person>();

    public Team()
    {
    }

    public Team(string teamName)
    {
        this.teamName = teamName;
    }

    public string TeamName
    {
        get { return teamName; }
        set { teamName = value; }
    }

    public string Motivation
    {
        get { return motivation; }
        set { motivation = value; }
    }

    public IList<Person> Members
    {
        get { return members; }
        set { members = value; }
    }
}
Team.cs: The Team has also a key

Create A Context

After that, you can build a data context. For this, inherit from the Db4oDataContext. You need to overwrite the OpenSession() to provide the right object container. A good practice is to use a object container per request. For example you can use the OpenSession-operation for creating a container per request. Take also a look how you can provide a object container for each request.

After that, you can add operations and properties you want to expose. Remember to use the IQueryable interface to expose query options to the client.

public class TeamDataContext : Db4oDataContext
{
    // Provide access to your data via properties
    public IQueryable<Person> Persons
    {
        get { return Container.AsQueryable<Person>(); }
    }
    public IQueryable<Team> Teams
    {
        get { return Container.AsQueryable<Team>(); }
    }



    /// You need to implement the open-session and return a object container
    /// The best practise is to use a separate object-container per request.
    /// For example use the 
    /// <see cref="IObjectContainer"/>.<see cref="IObjectContainer.Ext"/>.<see cref="IExtObjectContainer.OpenSession"/>
    /// to open session-containers for each request.
    protected override IObjectContainer OpenSession()
    {
        return Db4oEmbedded.NewSession();
    }

}
TeamDataContext.cs: An concrete context

Create the Service

The last step is to actually create a service. Visual Studio can assist to do this. Right click on the Project, choose 'Add'-> 'New Item'. Then Choose the 'WCF Data Service'. In older releases it's called 'ADO.NET Data Service'.

After that, you can rename the created classes and parameterize it with the previously created context. Then you need to specify which operation are allowed. Read more about how the configure the allowed operation in the data service documentation.

public class TeamDataService : DataService<TeamDataContext>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("*", EntitySetRights.All);
        config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
    }
}
TeamDataService.svc.cs: Build the concrete service

Consuming The Service

Now you can startup this service and you're ready to consume it. For example you can create a simple console application. There you import the service. Right click on the project choose 'Add Service Reference'. Then point the assistant to the URL of the running web service. After that you can use the service.

var serviceURL = new Uri("http://localhost:8080/TeamDataService.svc");    
var serviceContext = new TeamDataContext(serviceURL);

var teams = serviceContext.Teams;
foreach (var team in teams)
{
    Console.Out.WriteLine(team.TeamName);
}
SimpleConsoleClient.cs: Now the service can be used

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/automatic_properties.htm0000644000175000017500000002063311520622610033023 0ustar directhexdirecthex Automatic Properties
You are here: Platform Specific Issues > Automatic Properties

Automatic Properties

Automatic properties simply allow a user to skip the step of introducing private field variables when the property simply sets and gets the field value:

class Person
{
    public string Name { get; set; }
}
AutoProperties.cs: Auto property
Public Class Person
    Public Property Name() As String
End Class
AutoProperties.vb: Auto property

Behind the scenes the compiler creates a field and the regular property code. The field-name depends on the compiler. For C# the field-name of auto-property is <PropertyName>k__BackingField. For example the property FirstName will be stored in the field <FirstName>k__BackingField. For VB.Net the field-name of auto-property is _PropertyName. For example the property FirstName will be stored in the field _FirstName.

public class Person
{
    // the name is actually <Name>k__BackingField 
    // but you cannot express that in C# code
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
AutoProperties.cs: Auto property behind the scenes
Public Class Person
    Private _Name As String

    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property
End Class
AutoProperties.vb: Auto property behind the scenes

Issues With Auto Properties

Note that db4o always uses the field name for its configuration. This also applies to auto-properties. You need to use the field-name to specify index etc.

For C# the name of the backing field is not specified and a compiler implementation detail. Therefore it's possible that it actually changes in the future.

For example to index the auto property Name:

IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
configuration.Common.ObjectClass(typeof(Person)).ObjectField("<Name>k__BackingField").Indexed(true);
AutoProperties.cs: Configure auto properties
Dim configuration As IEmbeddedConfiguration = Db4oEmbedded.NewConfiguration()
configuration.Common.ObjectClass(GetType(Person)).ObjectField("_Name").Indexed(True)
AutoProperties.vb: Configure auto properties

 

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web.config0000644000175000017500000000340311520622616030015 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/sandbox.permcalc.xml0000644000175000017500000000216611520622616032023 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/serializingcs.zip0000644000175000017500000000326111520622610031437 0ustar directhexdirecthexPKخ7oJ %"Car.csmQk0ǟOZ\t0XٓcA6F1،HM31V.n ͯbQCe[3#VߔApԺyJӾI!"kؤ״m0r -%A{쏉*m!j|[peInxg\j84f1*5Q^x0͂5MM~WZWn1\o 6pX]®*J 3{YU(s :q57PKخ7PtPilot.csej0 DOmaNAKOe1qDVw兒eIvu_^7Wyxxi+;0 % eI|'U^KuOgV ޴/YȜ׽$@>YH?*AYV-ylǶ%w1'G5AJXf%ƀ4%NKM})5|򻽤d<w\PK.7:cX SerializeExample.csV]O;}a tTBj.Jg3!+iVj!dǙ9c5[srr {NNL060,عTep480 }_ܼ-?w: <8+F )%ƉZȲJG?iV{1$#9PK(خ7oJ %"$ Car.cs Q8;bC8;bCPK(خ7Pt$ 3Pilot.cs SSQD;bCD;bCPK(.7:cX $ CSerializeExample.cs 3GGd0GG:bCPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/xml_import-export_in_.net.htm0000644000175000017500000002562211520622606033714 0ustar directhexdirecthex Xml Import-Export In .NET
You are here: Platform Specific Issues > XML Import-Export In .NET

Xml Import-Export In .NET

One of the most widely used platform independent formats of data exchange today is xml.

Db4o does not provide any specific API to be used for XML import/export, but with the variety of XML serialization tools available for Java and .NET (freeware and licensed) this is not really necessary.

All that you need to export your database/query results is:

  1. Retrieve objects from the database.
  2. Serialize them in XML format (using language, or external tools, or your own serializing software).
  3. Save XML stream (to a disc location, into memory, into another database).

Import process is just the reverse:

  1. Read XML stream
  2. Create an objects from XML
  3. Save objects to db4o

Let's go through a simple example. We will use .NET XmlSerializer. (You can use any other XML serialization tool, which is able to serialize/deserialize classes).

First, let's prepare a database:

SerializeExample.cs: SetObjects
private static void SetObjects()
     {
      File.Delete(Db4oFileName);
      IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName);
      try 
       {
        Car car = new Car("BMW", new Pilot("Rubens Barrichello"));
        db.Store(car);
        car = new Car("Ferrari", new Pilot("Michael Schumacher"));
        db.Store(car);
      } 
      finally 
       {
        db.Close();
      }
    }

SerializeExample.vb: SetObjects
Private Shared Sub SetObjects()
            File.Delete(Db4oFileName)
            Dim db As IObjectContainer = Db4oFactory.OpenFile(Db4oFileName)
            Try
                Dim car As Car = New Car("BMW", New Pilot("Rubens Barrichello"))
                db.Store(car)
                car = New Car("Ferrari", New Pilot("Michael Schumacher"))
                db.Store(car)
            Finally
                db.Close()
            End Try
        End Sub

We will save the database to XML file "formula1.xml":

SerializeExample.cs: ExportToXml
private static void ExportToXml()
     {
      XmlSerializer carSerializer = new XmlSerializer(typeof(Car[]));
      StreamWriter xmlWriter = new StreamWriter(XmlFileName);
      IObjectContainer db = Db4oFactory.OpenFile(Db4oFileName);
      try 
       {
        IObjectSet result = db.QueryByExample(typeof(Car));
        Car[] cars = new Car[result.Size()];
        for (int i = 0; i < result.Size(); i++)
         {
          Car car = (Car)result[i];
          cars.SetValue(car,i);
        }
        carSerializer.Serialize(xmlWriter, cars);
        xmlWriter.Close();
      }
      finally
       {
        db.Close();
      }
    }

SerializeExample.vb: ExportToXml
Private Shared Sub ExportToXml()
            Dim carSerializer As XmlSerializer = _ 
New XmlSerializer(GetType(Car()))
            Dim xmlWriter As StreamWriter = New StreamWriter(XmlFileName)
            Dim db As IObjectContainer = Db4oFactory. _ 
OpenFile(Db4oFileName)
            Try
                Dim result As IObjectSet = db.QueryByExample(GetType(Car))
                Dim cars() As Car = New Car(result.Size()) {}
                Dim i As Integer
                For i = 0 To result.Size() - 1 Step i + 1
                    Dim car As Car = CType(result(i), Car)
                    cars.SetValue(car, i)
                Next
                carSerializer.Serialize(xmlWriter, cars)
                xmlWriter.Close()
            Finally
                db.Close()
            End Try
        End Sub

After the method executes all car objects from the database will be stored in the export file as an array. Note that child objects (Pilot) are stored as well without any additional settings. You can check the created XML file to see how it looks like.

Now we can clean the database and try to recreate it from the XML file:

SerializeExample.cs: ImportFromXml
private static void ImportFromXml()
     {
      File.Delete(Db4oFileName);
      XmlSerializer carSerializer = new XmlSerializer(typeof(Car[]));
      FileStream xmlFileStream = new FileStream(XmlFileName, FileMode.Open);
      Car[] cars = (Car[])carSerializer.Deserialize(xmlFileStream);
      IObjectContainer db;
      foreach (Car car in cars)
       {
        db = Db4oFactory.OpenFile(Db4oFileName);
        try 
         {
          Car newCar = (Car)car;
          db.Store(newCar);
        } 
        finally 
         {
          db.Close();
        }
      }
      db = Db4oFactory.OpenFile(Db4oFileName);
      try 
       {
        IObjectSet result = db.QueryByExample(typeof(Pilot));
        ListResult(result);
        result = db.QueryByExample(typeof(Car));
        ListResult(result);
      } 
      finally 
       {
        db.Close();
      }
    }

SerializeExample.vb: ImportFromXml
Private Shared Sub ImportFromXml()
            File.Delete(Db4oFileName)
            Dim carSerializer As XmlSerializer = New _ 
XmlSerializer(GetType(Car()))
            Dim xmlFileStream As FileStream = New _ 
FileStream(XmlFileName, FileMode.Open)
            Dim cars() As Car = CType(carSerializer. _ 
Deserialize(xmlFileStream), Car())
            Dim db As IObjectContainer
            Dim car As Car
            For Each car In cars
                db = Db4oFactory.OpenFile(Db4oFileName)
                Try
                    Dim newCar As Car = CType(car, Car)
                    db.Store(newCar)
                Finally
                    db.Close()
                End Try
            Next
            db = Db4oFactory.OpenFile(Db4oFileName)
            Try
                Dim result As IObjectSet = db.QueryByExample(GetType(Pilot))
                ListResult(result)
                result = db.QueryByExample(GetType(Car))
                ListResult(result)
            Finally
                db.Close()
            End Try
        End Sub

Easy, isn't it? Obviously there is much more about XML serialization: renaming fields, storing collections, selective persistence etc. You should be able to find detailed description together with the serialization library, which you will use.

Download example code:

VB.NET c#

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/asp.net.htm0000644000175000017500000000616611520622616030144 0ustar directhexdirecthex ASP.NET
You are here: Platform Specific Issues > ASP.NET

ASP.NET

You can use db4o as a persistent layer of your ASP.NET application. The actual integration of db4o into your web application is quite simple: you just need to add reference to Db4objects.Db4o.dll and use it. See "Web Environment"

 

././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_java_platform/db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_java0000755000175000017500000000000011520622614034137 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017600000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_java_platform/catalina.policydb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/security_requirements_on_java0000644000175000017500000002252211520622614034144 0ustar directhexdirecthex// Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ============================================================================ // catalina.corepolicy - Security Policy Permissions for Tomcat 6 // // This file contains a default set of security policies to be enforced (by the // JVM) when Catalina is executed with the "-security" option. In addition // to the permissions granted here, the following additional permissions are // granted to the codebase specific to each web application: // // * Read access to the document root directory // // $Id: catalina.policy 609294 2008-01-06 11:43:46Z markt $ // ============================================================================ // ========== SYSTEM CODE PERMISSIONS ========================================= // These permissions apply to javac grant codeBase "file:${java.home}/lib/-" { permission java.security.AllPermission; }; // These permissions apply to all shared system extensions grant codeBase "file:${java.home}/jre/lib/ext/-" { permission java.security.AllPermission; }; // These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre grant codeBase "file:${java.home}/../lib/-" { permission java.security.AllPermission; }; // These permissions apply to all shared system extensions when // ${java.home} points at $JAVA_HOME/jre grant codeBase "file:${java.home}/lib/ext/-" { permission java.security.AllPermission; }; // ========== CATALINA CODE PERMISSIONS ======================================= // These permissions apply to the daemon code grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" { permission java.security.AllPermission; }; // These permissions apply to the logging API grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" { permission java.security.AllPermission; permission java.util.PropertyPermission "java.util.logging.config.class", "read"; permission java.util.PropertyPermission "java.util.logging.config.file", "read"; permission java.lang.RuntimePermission "shutdownHooks"; permission java.io.FilePermission "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read"; permission java.util.PropertyPermission "catalina.base", "read"; permission java.util.logging.LoggingPermission "control"; permission java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write"; permission java.io.FilePermission "${catalina.base}${file.separator}logs${file.separator}*", "read, write"; permission java.lang.RuntimePermission "getClassLoader"; // To enable per context logging configuration, permit read access to the appropriate file. // Be sure that the logging configuration is secure before enabling such access // eg for the examples web application: // permission java.io.FilePermission "${catalina.base}${file.separator}webapps${file.separator}examples${file.separator}WEB-INF${file.separator}classes${file.separator}logging.properties", "read"; }; // These permissions apply to the server startup code grant codeBase "file:${catalina.home}/bin/bootstrap.jar" { permission java.security.AllPermission; }; // These permissions apply to the servlet API classes // and those that are shared across all class loaders // located in the "lib" directory grant codeBase "file:${catalina.home}/lib/-" { permission java.security.AllPermission; }; // ========== WEB APPLICATION PERMISSIONS ===================================== // These permissions are granted by default to all web applications // In addition, a web application will be given a read FilePermission // and JndiPermission for all files and directories in its document root. grant { // Required for JNDI lookup of named JDBC DataSource's and // javamail named MimePart DataSource used to send mail permission java.util.PropertyPermission "java.home", "read"; permission java.util.PropertyPermission "java.naming.*", "read"; permission java.util.PropertyPermission "javax.sql.*", "read"; // OS Specific properties to allow read access permission java.util.PropertyPermission "os.name", "read"; permission java.util.PropertyPermission "os.version", "read"; permission java.util.PropertyPermission "os.arch", "read"; permission java.util.PropertyPermission "file.separator", "read"; permission java.util.PropertyPermission "path.separator", "read"; permission java.util.PropertyPermission "line.separator", "read"; // JVM properties to allow read access permission java.util.PropertyPermission "java.version", "read"; permission java.util.PropertyPermission "java.vendor", "read"; permission java.util.PropertyPermission "java.vendor.url", "read"; permission java.util.PropertyPermission "java.class.version", "read"; permission java.util.PropertyPermission "java.specification.version", "read"; permission java.util.PropertyPermission "java.specification.vendor", "read"; permission java.util.PropertyPermission "java.specification.name", "read"; permission java.util.PropertyPermission "java.vm.specification.version", "read"; permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; permission java.util.PropertyPermission "java.vm.specification.name", "read"; permission java.util.PropertyPermission "java.vm.version", "read"; permission java.util.PropertyPermission "java.vm.vendor", "read"; permission java.util.PropertyPermission "java.vm.name", "read"; // Required for OpenJMX permission java.lang.RuntimePermission "getAttribute"; // Allow read of JAXP compliant XML parser debug permission java.util.PropertyPermission "jaxp.debug", "read"; // Precompiled JSPs need access to this package. permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime.*"; // Precompiled JSPs need access to this system property. permission java.util.PropertyPermission "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read"; }; // The permissions granted to the context WEB-INF/classes directory grant codeBase "file:${catalina.home}/webapps/Db4oSite/WEB-INF/classes/-" { permission java.util.PropertyPermission "user.home", "read"; permission java.util.PropertyPermission "java.fullversion", "read"; permission java.io.FilePermission "${user.home}${file.separator}db4o${file.separator}data", "read"; permission java.io.FilePermission "${user.home}${file.separator}db4o${file.separator}data${file.separator}test.db4o.yap", "read, write"; }; grant codeBase "file:${catalina.home}/webapps/Db4oSite/WEB-INF/lib/-" { permission java.io.FilePermission "${user.home}${file.separator}db4o${file.separator}data${file.separator}test.db4o.yap", "read, write"; }; // You can assign additional permissions to particular web applications by // adding additional "grant" entries here, based on the code base for that // application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files. // // Different permissions can be granted to JSP pages, classes loaded from // the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/ // directory, or even to individual jar files in the /WEB-INF/lib/ directory. // // For instance, assume that the standard "examples" application // included a JDBC driver that needed to establish a network connection to the // corresponding database and used the scrape taglib to get the weather from // the NOAA web server. You might create a "grant" entries like this: // // The permissions granted to the context root directory apply to JSP pages. // grant codeBase "file:${catalina.home}/webapps/examples/-" { // permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; // permission java.net.SocketPermission "*.noaa.gov:80", "connect"; // }; // // The permissions granted to the context WEB-INF/classes directory // grant codeBase "file:${catalina.home}/webapps/examples/WEB-INF/classes/-" { // }; // // The permission granted to your JDBC driver // grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/driver.jar!/-" { // permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; // }; // The permission granted to the scrape taglib // grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/scrape.jar!/-" { // permission java.net.SocketPermission "*.noaa.gov:80", "connect"; // }; db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/classnameformatvb.zip0000644000175000017500000000305111520622610032275 0ustar directhexdirecthexPK73fuTClassNameExample1.vb}RMo0#F\R%mCJ)GdOͿߌM7ox G,n Ηo()G~>?NKBy;mmC(HhvקV]x4=K /{Dnd`%1HiVo"ǯHƉ7 cFA,a:I?QF+(2vc[{l68 wlP['MFW?#[+4H ^VڂaX˻ܲ})aU;ΗP'ZSI-H*<a/I2u $^\39RmW1;so%bkÕ|l[G|?PK{q7RL/ClassNameExample2.vbT]k@|?,~L%@!vZC4ںVw:꯯V-؛w F./Y% h77wQ~>b~Hs z(9Re,wDw`%'//./1}i5J1A<:a24')և?L7II9@<Ӓn3ѰwVqryNzUSuX&)S .% S)4koat? g3\ޟ\YޤؐYpzlt6饹nmK5_R3wxKLJ[7 oS(UG,ϚuL̈́PK7kTest.vbSWp/,L(QpT0200QQ )I&IY% yz %%Vz )\^.Tr=3%?Y9'-(7K !p(MLV/K-OL)2SRJK2BK254 l ZRZ2] !嚗7" ; ĄPK(73fuT$ ClassNameExample1.vb MtLCtLCPK({q7RL/$ ClassNameExample2.vb GzGdLCPK(7k$ Test.vb c蝟MDzLCDzLCPK%db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/0000755000175000017500000000000011520622616031504 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/osgijava.zipdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/osgijava.zi0000644000175000017500000001661411520622610033655 0ustar directhexdirecthexPK 7f6icons/PK7f6icons/sample.gif[ORFYfZm.$:) *%QO TD$ieNۨ\fa3[SlOKIBY^ bMW{Ad^;.0~\%<56 h 6x)!-79t ]L *qMI_O9* 0np":> NeeHPTNx]) B |>ODEą̟"iNlYvFr-,JjϦi**kcoM+C{dY7 P΢2ӔwI9#0;I1r^8ނ=ebqFJ8~gp+;zge+v/t'E|R 7nH’|&_+\IJCeap07n7߿xGOQuk'E"=01v,k|E!H x̽I1^h4|y|> ^*Aw؃>s)(Դ(O(ϩ̒:#'}{]KJ9(D(w Nn͠]@ O,׿ Q"9ɫcX3 Uq8湭ZK9& {>))Yxb0\`sSݺu+ŪPK 6f6src/PK 6f6src/memoplugin/PK6{src/memoplugin/Activator.javaUoL='RQ8u.ܢJ-P%j;C]kv>};^B8Df߼yf.B.*#MgS*J4g1ʜJTH= B#JydNEq /Ʋvn d, ||T;,>"o$SdTk]El萵rO -NOgS8o;2ƸLeY;-RCiYmsMeGDJ\d3Nd˺^Xd/%%rL*ϛ뫻 :,df' D^ n=4&J:T\ºhLdwdh~\G4(57/sh ?.F:[7*2_PK 7f6src/memoplugin/actions/PK z6src/memoplugin/ui/PK6L#0 src/memoplugin/Db4oProvider.javamN0ύwX^UR%¹īݱhͷ3c 5fʳxJԖQh 00Ǝʌ0A`*Pg%B}#Xsd=g = lڡJ{J(Fz`MPՆ"UMX):$*n7`],}P,«Yv6vOq_Ja4[OW伸B4!tERkݸzzޡP\пyN~ ~A&ۥf<~Ѳ?wsSdUXPK.7DP:8Ezx}>^MF< )׳;#{.x+$ _z9n'=BT3jS]BdtQ#^tv?# c ZA"9.yhkUe!p̤$K3[m}/2YȈ~&Y-à?hH(?d`ddA4e6_Mޔ9L$P.c5t^\yÔSʛ6+_{w%Fe0Jwvr4;/PK6f6Ҥ3 .classpath= 0@gCnCkCRgF%C[n;.N'E.`Ԙ1QȵX't[.N9SޛDPg9%k\cgj[3J |vP)i= #y薬jk !`@'$vi%U#ɑ<%68^*@/B%^np\ 'kryo@n~_ȝ<|+MqhQLk'r닐irFDticu30Fi9 z=\_v 7­DuDtL_ e;dN}`o?PK( 7f6$icons/ A}-|bv,PK(7f6$ $icons/sample.gif A}-|b@,PK( 7f6 $META-INF/ A}-|b ,PK(v6ɇ8$ META-INF/MANIFEST.MF K|b ,PK( 6f6$src/ L,|b=8,PK( 6f6$src/memoplugin/ L,|bE,PK(6{$ @src/memoplugin/Activator.java e|bE,PK( 7f6$/src/memoplugin/actions/ A}-|b@,PK( z6$dsrc/memoplugin/ui/ |b`PK(6L#0 $ src/memoplugin/Db4oProvider.java |b]PK(y6jC($ src/memoplugin/actions/SampleAction.java g|b,PK(F6aP!$  src/memoplugin/ui/DataDialog.java jK|b`CPK(6f6Ҥ3 $ n.classpath L,|beA,PK(6f6]n$ :.project L,|b3,PK(6f6txpQ$ Fbuild.properties L,|bI,PK(7f6xHt $ plugin.xml A}-|b,PKA5././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000644000175000017500000001007711520622606033737 0ustar directhexdirecthex Eclipse Plug-In With Db4o Service

Eclipse Plug-In With Db4o Service

The following example was created to show a practical usage of db4o_osgi service. Though targeting a wide auditory, it can be especially helpful to people new to OSGI and plug-in development.

In this example we will create a simple Eclipse UI plug-in, which will store notes between Eclipse sessions using db4o as storage.

To be able to follow the explanation you will need:

More Reading: ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/memoplugin.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/memoplugin.0000644000175000017500000005423511520622606033671 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ս?|YUf`GVtՐC#m|,[xیۻ8g%s!7\ 1q7bجO{I@2GZgK}y,my%0y0|efW=>ݮ},`GhF#;q/ L+?NK\$sNz*jG0& rO!G䃚<4^o# l19;"Aq &E( d'ڵ;qs-ץ^ƭ#XFs!8?i-ޗ&~Qv+#0*+Ӆlb̓ѻ4@4.ۿʘv֩QƢ_/Ə ?UÕ._/ƫQG3TY}}}}Saʋ?oGۮ_jZ9rۮ_~fV*,}~fmUhbE٣_7j*,}~flPQG3TO˯4}~fs0Dl] AKO*&] kiE9Q7ohU CKG3TK_B9r_QG3TI_\TrO\Qʉ>q?3G.?j:9Q'q?SKtfq?SGq?SL]*\\)hT;θgRvw?O l?4QEr|hF?ٟh3H.AP#f(dg=ex5.A vhS+;D0~=֑oCK+HW~|;.5r 0b{4vKS(٠cz7ze{4xx裑;$=GE9'=|j*(A|4yj*(Aɼ4yj) dr_9} AE9?=} AE9c_CGG"vX=QG"vYBz5Z9sy&AA#=MJI4;`qSӑF Y@&`raTz{9i(e 2K@<qwېJgGCt2Ymǜz=j(a+K## HQJ\(:suOE5#9v ?:0*px#I@y _ٳ=R502qF0}{j((F*U<1 aNg!PA`czu`)*!@:I@6D.A+qN!0v;.~qi" K|d.S@"F1R;@3;UhI$ |+)F T0?N %@ -r$O֖Kuy<̯13񩨠 bM|0IZ{Z><y֦ kr~DZu [`̬_xa6TohLNnjlq(OrNIQ@H@؜g\RPEPEPEPE+)Gd`UG" ( ( )J X,uI@Q@Q@Q@Q@fl+c-KL\Oַkm+do'jbۍrVJZ .Plpgl}BfǍs_W-ZTڌZS\0Gc4|H#!68BKv#ec8m`N&+ *%!᜴- g}UOϨY e@ fa*`Y>*hWbz-᳏P{L+269?Y/Ӵ8YvRd7APg.ѭܨ#ỵ_\A["1u uر7v?Lo[m ?ks]죳K9R8qlb&p\i] %%D} *?ֱxs3IE N[Y<ϝjN)fu[o/ϳ/5 F]O4x&]UHEN? ;N4{[=n)bˮ&s=1JW]rۚ~8>Ͽ~6ov9G % ]5tkƝon_*LrܒY +'{Y4MN[hj@"@?@ԗa8;i~+i~-E冚n-wfSh~읭 l6 z8hR{ᜂ1 W-d̅̋}gS`i;c3 Cy<okM.kѾΧV́avVFBZ5 ViFw<@ ".a]+_Ku<e QE]ۗ_/Rm;oYbEs</ NY34n睷_ )q<Vv³8Qd̿qNԟ¨ p\̼59o~)¨uAOtN\ϹsBoA~S)~7 )LS9ܷOvUE(Qu{ 0/n,4_GUm.֠D WOEUݬ ύzC%V`b\~//-Vq3I,kfw{jlA1,In!p1Tg ٢s*Tߏ?ZS #Kg)& բ͛g)~g+N.ϗOhEÕaQe'5~.)?(:ETS$VEʊVf.7[TQvoQKQREr"?,R>(D7i|^9{4;p)Qēx7Lf%=} /Ѫs0Q- j_'UJ(bQu%/[qX{dNzc9?0k?n(-F͋KMԦ[˩aUg(pqڣOy y7Ϳfzټ53[IPs KCbv(C| `MEC;_}}MEC;_P%$Icȱל[$6EܭVUΕpyBk+Aޥ;2ڳ0)/,ltLdJIRDv8?|憎/sOԭsglalgl[oHh4Tau҉o4[4*LӓEXem+0=2NM_}~aAr[ktZЛr4 )Pm@v'GNjv_4o,aD*0k?0bY4Y2NGEͥZt{Ȃ U 8%Tn*v3^juŪ[!TF$ 1}1FCL~3rwU^ʽ|M adr=o!,rE4$a1$:9lvTػFY$bXE}ҹ o| U\^L eE ȎHBbRNHp/-gE0AI $pWww; U󈝑Y!=XPk7FH?#ޤMcp;sssTul &cs;Wӛ1i_Mu>xǛ׾~ ,5aYYY!ؑ1zcgwp:ӛ_f Dme !6>S\^L eE ȎHBbRNHp/-gE0AI $pWvKf ʑz0A86"N̄B2N {A64#3 _[nPq^(KEt9fww,A(45㳈I*[n!9 'uz ?MoH #mkddSFd?$ݼߺΈ>a05FÓigW`仴"1("%}~\ZXsBdh]Ch”be!#=!׭yReup[,Jg4?G՞9--} 61Gcd*ʻe8aqOW2,Or#J TcS* #qoA^X[B˷!Op0,70ȗXRCvFrwjh4,:ju$fhRRݞ gzvFoU=:8m<Ւ"X0\hA=.U- (Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ǍsoT;"Ɠ^pǍsoY_ iJ,|Q6(~k?0bZ?ئ"j*Z?أ햿(j*Z?آ+FMkHckoMdnI9qdV. 0O'{:SI,$OGOBFDJdawegq5ā|ɛs8 NIzWС}yc5"Ws Tlw_(^-KTvWn\x8⵷c;(tbxb|0I .xQYԛиAKse "DMlw_(Nc&FXvb%)Eˉ[;Te#kmyBQ?^ew{a\{} GQhFDB”iK ?qiIiGYƦEK H1!U_'A&^л/Oק*jKao'+.4r k%~XH8`wYjzGk=}9hcwY` Vm H~yBQ?G/?] 'kkƯ+un5} K(љftLypB+(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O|Ej(d e "DMlw_(vm H^л/O՛s4 !7me@L}܌&/mSmSe%l.L:d",n{X'g߆GI\ Q.ťP۝p؍FJH2<俱O߆ ?O߆ ={cit'ZHVr R+1) Ny>7׺TQ5Xcd-1x8#`Hj:H[[β#:ya(,nG $B&W oʄ^H㻆,0i2r丐|9gF?/{H/mX&R,6s]ic[kIm$sHgC\ou-RTM/s]iQn8Lw`0 F(C0$ #kB&NL֣ob[Z<1G.WdQ9yu8ڴ#,پY-¿!hOď?8>+v%Nn<&!\LWVu%YV=VH7%)A 50EGDcp8ZwM Z+I!pjɂH<1kJ$&$ G?oIcQjlKF{?2Vh>d!Se,H ۇq5z}Eo[WQaz/eOUtQy\*Mt_FR'\dU'#wiEdhyͯm.5Yu{CT8rmn?ȫ$]pwl!hk{L=q MBl޵Й&1]F߾1Ax-<(}^Y|3YisK+#`}V298XFo?b}+g;gy/_b;Gk'SԭN w@+B 3YEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW/_+u@p-WODgǍsoT;"Ɠ^pǍsoT;"Ɠ^p :(((jnm$@$#<T\f`xU7e̟hG {"$8O9~٦nGY}g_gg7yˮǹFm[In1ƬYTV`  k>WZ$j3\0Ą?*k7̓N''njm^&Ґ6w% J}w_tێsX_[zueI4/8<:&tVFkZC-Zè4DQ"VhRMoBdkmnoZvouҭa#q/LX+l}`cxYۘuD>UN{y#%CNLmRx Wh/`(AHy%;U?<%#=@jt (4 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( w 8_H,{mXUmXWWSESQEQEUuoż9#`FApAPxSG,U!YnvxcEXr|n%_M{&/_N#o%/$X_00ތxN*84y|v-vw y{;J3;hڢ*j68e #AuʌG{=F n(mbY\XӤm!L,v@W,XOkla #}@Dds"c-呆e&Okڞ%p\ޘEFӣi2mR:/|T) x@Hbט7x]-k:qi_M1VjϝcDѯϿTd7x]-tQ®槄g ^^S۸,5k n'Ry n? nZM6_Kt?O n? ϖ]9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6_Kt?O n? 9e9sjCM]w6Z[B&|Yiڞ6w>d8r60kUB-IhLw8{mXUmXWOSESQEQETW^({q1=uܶR[s{mWA;4pI~br=B)/ DC eL޿)F.8; RܬnQuoF'B< ~Pwql[zg<ʧk08ȧe*m<%qQ>.E shD˾dlMv!4/ 1GK]=ݔV~)'gt.\.v*G`+o?Z裱]((((((((((((((((((((((((=2ZϷOoYwcD`IFg/5;ESYIyەFV0b,u}c l'a6޻i%W7 q󀤌qEX:BB#W` u \[@k;m,+Ƃ[XpE,N71Ghryi}[<#*o,dec~ ߼hF-:8˧JڈQ).1:ct-[aҬcUEm@7 z7onKM?÷wIneA$;BFxC *2M#xĺ["7n]&f*gXUJnI$;rl A ,QݠG(ʲ@ך7x]-uoqy?KG#aC*A3a8PIU \nj_E*AEVAEPEPEPEPEPEPEPEPEPEPEPEPEPmƯyakv\iq N gަ6o1F"`_r&;_bN?玓?q_7UmUsMZhIwdD_-M&Wj>R0sQ{M~F_7UrgŖbS4N|m4h8႞zd K=|Q7TiQ ?p w+:Ͷo?6iicoxC;6%@ν5'k=CB:tBG2[9vvdP1>|b`iǍsoT;"Ɠ^pǍsoT;"Ɠ^pӢ)((kib̂E{t<%AՃ!ءN2290Wa^'+ܵGw} ~dr ":o@|2+6̈́Mڎ-ƽiڮvҦ"첫p˸6Mp|!r֒#Jq*,iePJ}7 غ|UgTy D#6.ݸoƺ?/4-d$"Ka(ږ9#nP~L'=ņ$ʚk[Q PLbi㉙A2p@#vM=%JBn%򇘥ddvv u9&ڊ[yL(vƑyc+r}GJߋ{\h>oE .-cy0~i ~P;Zj؝V{巗L̺ W2[76PwR} b&uopѕ$\g V81C@^/k|Mcoz9PrdA;[>K]`GF1$OS[} jh(((((((((((((Ƚ:D\O+]zB(P@}( z&]+Xf:ʧyZב,Ƭ2h8f+_ ??޷Ci MyY &ՂEVRIEcsMEahB%hf%sF qӓYZo[ M/gYErZo[ M;²ukGH?+_ ?м7mIu$7w\@9z*5mq&:*}\_70j_nӴXm%ϳ6FN8pFNaVt`q>C$B!wtDј",bTuuQ"N9B-nU[t,[!n n?`տ︿70j_n[L[{,w7NmX7cHp1zn?`տ︿70j_nFcI#ёqC}[-ZjMBQDh(@V*OQEzfX"t.̂ n\xVm!{fVYuT)C㟘jPꗒD-?u;]6X&2Y7~п)Fϖ~a; xoI{+?uKؒ=#nr\n[CRSUhgc) y2bJ^X0Cܿ p[v_KD7ii՚}Bl1a#\)Ą/͡jS^j{߳@@uhN 8!e yImQ@ЅysW%$4}gjsʽ;W\W wo4m:YQٰ02HZv2~alSVG\+#Dy>cmںlɤ/Z?أ햿*#OwQ.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4.~alT *ӿ?CB-Q_KwQ@m;S(4'k9n"$*ȱל?wVq1$Q"hU`(:( ((՛J5GT'5"F0s3}܏מ3/5Ʃq"ƚ}s&S4>V͒oSdb~|0ۡ'ttuIu54dWmt'nxW [{J]>V_p}swv3ڸN?YMgN{ 5x,0!1 ~u][CΉ @Ɉ IphZw;IZgX;pI` =?\:.=آUi#ʡ!8_dn!F9آMo\Fi{onM7d{dY%ԏ p7X}[}}\>[PK+opN@cW\W/[jZŻCMav-nV"8RD rcZCc9`\k뤟˟vԷtC5e5QTHQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE6&x[ |?L>Σ׆?&_Z,6qrw\@[32`49 .GQ\'at@Bĸ +9($(ϼ:O?O'dc;T2=xgb<;M^GϾu)giXKA~cC:aNߚOi:ƻGg](yc. (Z |Qs$RG֦ u*]R"'o' ]F ?^s'o띆e%Ϙ爘b{ I.dzȮc-~f/}?~_*j*!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/}?~_*j(Gٿjߗ QvoGڣ¦!TݛQ7𩨠~f/TP././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/db4o-osgi_usage.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/db4o-osgi_u0000644000175000017500000001054711520622616033551 0ustar directhexdirecthex Db4o-Osgi Usage

Db4o-Osgi Usage

db4o-osgi service can be accessed like any other OSGI service:

ServiceReference serviceRef = _context.getServiceReference(Db4oService.class.getName());

Db4oService db4oService = (Db4oService)_context.getService(serviceRef);

db4o-osgi uses Bundle-ActivationPolicy:lazy header to define the lazy bundle loading policy (only utilized in some environments, like Eclipse).

Db4oService instance can be used as Db4o class in usual environment:

Configuration config = db4oService.newConfiguration();

ObjectContainer db = db4oService.openFile(config, filename);

Also available are methods for opening db4o server and client. For more information see the API documentation.

Once the service instance is obtained, you can continue to work with db4o API as usual.

Installation in Eclipse

  1. Put the db4o osgi jar file on eclipse/plugins folder
  2. Start/restart Eclipse
  3. While on Eclipse switch from the "Package Explorer" tab to the "Plug-ins" tab
  4. Find the db4o bundle (should be listed there), right click on it and select "Import As" -> "Source Project"
././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service/db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000755000175000017500000000000011520622614033727 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021500000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service/code_overview.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000644000175000017500000002724311520622610033735 0ustar directhexdirecthex Code Overview

Code Overview

Now the plug-in environment is configured and we can look at the code itself.

At this point in time the project contains the following classes:

  • memoplugin.Activator
  • memoplugin.actions.SampleAction

Activator class is called to start and stop the plug-in. It is responsible for managing its lifecycle. We will use it to initialize and clean up db4o resources.

SampleAction is a class that performs the action specified in the action set in the manifest file. It can be used to specify the behavior on the action. We will use it to call a custom dialog for memo viewing and editing.

From the said above we can see that we will need 2 more classes:

  • Db4oProvider: will be used to keep db4o connection, provide it to the users on request, and close it on dispose.
  • DataDialog: will provide a simple UI for viewing and editing the data, it will use Db4oProvider to access and store the data.

These 2 classes are very basic and are not specific to OSGI environment. Please, review their code below:

Db4oProvider.java
package memoplugin;

import com.db4o.ObjectContainer;
import com.db4o.osgi.Db4oService;
/**//*
 * This class is used to store db4o_osgi service instance and 
 * provide db4o services on request.
 */
public class Db4oProvider  {

  private static ObjectContainer _db;
  private static String FILENAME = "sample.db4o";
  
  public static void Initialize(Db4oService db4oService) {
    _db = db4oService.openFile(FILENAME);
  }
  
  public static ObjectContainer database() {
    return _db;
  }
  
  public static void UnInitialize() {
    _db.close();
  }
  
}
DataDialog.java
package memoplugin.ui;

import java.util.ArrayList;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import memoplugin.Db4oProvider;

import com.db4o.ObjectSet;

public class DataDialog extends Dialog  {
  private static int ID_ADD = 100;
  private static int ID_DELETE = 101;
  private Shell _shell;
    /** 
     * The title of the dialog.
     */
    private String title;

    /** 
     * The message to display, or <code>null</code> if none.
     */
    private String message;

    /** 
     * The input value; the empty string by default.
     */
    private String value = "";//$NON-NLS-1$

    
    /** 
     * Add button widget.
     */
    private Button addButton;

    /** 
     * Delete button widget.
     */
    private Button deleteButton;

    /**
     * Input text widget.
     */
    private Text text;

    /** 
     * List widget.
     */
    private List list;
    

    public DataDialog(Shell parentShell, String dialogTitle,
            String dialogMessage, String initialValue)  {
        super(parentShell);
        this.title = dialogTitle;
        message = dialogMessage;
        if (initialValue == null)  {
      value = "";//$NON-NLS-1$
    } else  {
      value = initialValue;
    }
    }
    
    /**
     * 
     * 
     * @see org.eclipse.jface.window.
     * Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    protected void configureShell(Shell shell)  {
        super.configureShell(shell);
        _shell = shell;
        if (title != null)  {
      shell.setText(title);
    }
    }

    /**
     * Clears the database before adding new data
     */
    private void clearDb() {
      ObjectSet result = Db4oProvider.database().queryByExample(ArrayList.class);
    while (result.hasNext()) {
      Db4oProvider.database().delete(result.next());
    }
    }
    
    /**
     * 
     * Makes sure that all the data is saved to the 
     * database before closing the dialog
     */
    protected void handleShellCloseEvent()  {
      clearDb();
      ArrayList data = new ArrayList();
      for (int i=0; i < list.getItemCount(); i++) {
        data.add(list.getItem(i));
      }
      Db4oProvider.database().store(data);
      Db4oProvider.database().commit();
      Db4oProvider.database().ext().purge(ArrayList.class);
      super.handleShellCloseEvent();
    }
    
    /**
     * Button events handler
     */
    protected void buttonPressed(int buttonId)  {
        if (buttonId == ID_ADD)  {
            value = text.getText();
            list.add(value);
        } else if (buttonId == ID_DELETE) {
          int selectedId = list.getSelectionIndex();
          if (selectedId == -1) {
            new MessageDialog(_shell, "Error",
                      null, "No item selected", MessageDialog.ERROR,
                      new String[] {"Ok"}, 0).open(); 
          } else  {
            list.remove(selectedId);
          }
            value = null;
        } else  {
          super.buttonPressed(buttonId);
        }
    }

    /**
     * 
     * 
     * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
     */
    protected void createButtonsForButtonBar(Composite parent)  {
        // create Add and Delete buttons by default
        addButton = createButton(parent, ID_ADD,
                "Add", true);
        createButton(parent, ID_DELETE,
                "Delete", false);
        //do this here because setting the text will set enablement on the ok
        // button
        text.setFocus();
        if (value != null)  {
            text.setText(value);
            text.selectAll();
        }
    }

    /**
     * Creates the visual dialog representation
     */
    protected Control createDialogArea(Composite parent)  {
        // create composite
        Composite composite = (Composite) super.createDialogArea(parent);
        // create message
        if (message != null)  {
            Label label = new Label(composite, SWT.WRAP);
            label.setText(message);
            GridData gridData = new GridData(GridData.GRAB_HORIZONTAL
                    | GridData.GRAB_VERTICAL | GridData.HORIZONTAL_ALIGN_FILL
                    | GridData.VERTICAL_ALIGN_CENTER);
            gridData.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
            label.setLayoutData(gridData);
            label.setFont(parent.getFont());
        }
        text = new Text(composite, SWT.SINGLE | SWT.BORDER);
        text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL
                | GridData.HORIZONTAL_ALIGN_FILL));
        
        list = new List(composite, SWT.SINGLE|SWT.H_SCROLL|SWT.V_SCROLL);
        GridData gridData = new GridData(SWT.FILL,SWT.FILL, true, true);
        gridData.heightHint = 50;
        list.setLayoutData(gridData);
        ObjectSet result = Db4oProvider.database().query(ArrayList.class);
        if (result.size() != 0) {
          ArrayList data = (ArrayList)result.next();
          String[] items = new String[data.size()];
          for (int i=0; i < data.size(); i++) {
            items[i] = (String)data.queryByExample(i);
          }
          list.setItems(items);
        }

      
        applyDialogFont(composite);
        return composite;
    }


    /** 
     * Returns the string typed into this input dialog.
     * 
     * @return the input string
     */
    public String getValue()  {
        return value;
    }

}

In order to call the above-mentioned DataDialog we will need to modify the generated run method in SampleAction class:

SampleAction.java: run
/** 
   * The action has been activated. The argument of the
   * method represents the 'real' action sitting
   * in the workbench UI.
   * @see IWorkbenchWindowActionDelegate#run
   */
  public void run(IAction action)  {
    /**
     * Call DataDialog to view and edit memo notes 
     */
    DataDialog d = new DataDialog(window.getShell(), "db4o-osgi", 
"Enter an item to add to the list:",null);
    d.open();
  }

Download example code:

././@LongLink0000000000000000000000000000022200000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service/connecting_to_db4o.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000644000175000017500000000723211520622606033736 0ustar directhexdirecthex Connecting To Db4o

Connecting To Db4o

The only thing left - is a connection to the db4o_osgi plug-in. It can be established upon the plug-in start and terminated upon the plug-in stop:

Activator.java: start
/**
   * (non-Javadoc)
   * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(BundleContext)
   * Obtains a db4o_osgi service reference and registers it with Db4oProvider
   */
  public void start(BundleContext context) throws Exception  {
    super.start(context);
    ServiceReference serviceRef = context.
getServiceReference(Db4oService.class.getName());
    Db4oService db4oService = (Db4oService)context.getService(serviceRef);
    Db4oProvider.Initialize(db4oService);
  }
Activator.java: stop
/**
   * (non-Javadoc)
   * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(BundleContext)
   * Unregisters the db4o_osgi service from Db4oProvider
   */
  public void stop(BundleContext context) throws Exception  {
    Db4oProvider.UnInitialize();
    plugin = null;
    super.stop(context);
  }

Download example code:

././@LongLink0000000000000000000000000000022200000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service/testing_memoplugin.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000644000175000017500000000661011520622614033734 0ustar directhexdirecthex Testing MemoPlugin

Testing MemoPlugin

Eclipse environment makes it very easy to test plug-in projects: you do not need to exit your workspace or manually activate plug-ins.

In order to test the new MemoPlugin, open plugin.xml by double-clicking the file in Package Explorer, select Overview tab and click "Launch an Eclipse application" link.

If everything worked out right, you should see "Sample Menu" with a "Sample Action" submenu. Click "Sample Action", you should see a window like this:

Try to add and delete several items. You can close the window and open it again to check that the changes are saved. You can also test the same after restarting Eclipse to see that the changes are not lost between sessions.

Note, that the database file is created in the ECLIPSE_HOME, so you must have write and create writes there. ././@LongLink0000000000000000000000000000022100000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plug-in_with_db4o_service/creating_a_plugin.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/database_for_osgi/eclipse_plu0000644000175000017500000001123411520622606033733 0ustar directhexdirecthex Creating A Plugin

Creating A Plugin

First of all you will need to install db4o_osgi into the Eclipse environment. You can do that by copying db4o_osgi.jar into ECLIPSE_HOME\plugins folder, restart Eclipse, then switch to Plug-Ins view, select db4o-osgi plug-in, right-click and select "Import As->Source Project".

If you do not want to do that, you can open Eclipse and create a usual java project from the db4o_osgi sources.

Now you are ready to create a new plug-in project.

  • Open Eclipse workspace if not yet opened.
  • Select File/New from the menu and select "Plug-in Project" as the project type.
  • Select MemoPlugin as the project name, leave the default values for the other settings and press "Next"
  • Leave all the default values and press "Next"
  • In the "Templates" screen select "Hello, World" template. This template creates a menu in the Eclipse environment, which we will use for our example. Click "Finish"

You might be asked to switch to "Plug-in development" perspective, which you can surely do.

You should see a MemoPlugin window opened in the environment. This window represents important plug-in properties and it can be opened by double-clicking plugin.xml file in Package Explorer.

You can use the tab-scroll at the bottom to navigate to different pages. Please, open the "Overview" page of the plugin.xml window and review the information presented there. Note, that this page can be used to start testing and debugging (see Testing paragraph).

Our plug-in will depend on db4o_osgi bundle; therefore we must define this dependency somewhere. Select "Dependencies" hyperlink in the "Plug-in Content" paragraph. (You can gain the same effect by selecting "Dependencies" tab page.) In the "Required Plug-ins" list click "Add" and select "db4o-osgi".

Please, note that you should not specify Java Build path as in a normal Java project, otherwise the environment will find duplicates in your project dependencies.

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/web_environment.htm0000644000175000017500000001224311520622606031765 0ustar directhexdirecthex Web Environment
You are here: Platform Specific Issues > Web Environment

Web Environment

db4o runs perfectly well in a web environment. It can be used to build your web-application.

In most web-application multiple concurrent requests are processes. Normally you want to isolate each request from another. You can use db4o transactions to archive this isolation. See "Isolation in Web-Applications"

In most web-applications a object is only alive during a request. So you have to identify objects across requests. Therefore you need to add an additional id to your object. There are different possibilities for this. See "Disconnected Objects"

When you run in a web-environment, you often have stricter security limitations. Take a look at the security requirements. See "ASP.NET Security"

Take a look how you create a object-container for each request. See "ASP.NET Request Example"

You might run into trouble because of ASP.NET assembly naming policy. See "ASP.NET Assembly Naming"

Take a look a small example ASP.NET MVC application, which includes all these concerns. See "ASP.NET MVC Example"

More Information

Additional information about using db4o in ASP.NET environment can be found in db4o Project Spaces. The following community projects featuring db4o ASP.NET membership providers exist:

db4o-8.0.184.15484+dfsg/doc/reference/Content/platform_specific_issues/servletsjava.zip0000644000175000017500000000165211520622616031312 0ustar directhexdirecthexPK`d5pFgDb4oServletContextListener.javaRn0}SmRMhC}h!Hh@ڴ$pؑ} m8adR5 s9ƪx|%}xy9 w|l5TGLLlq#WR u{݂?TLA] $3rJӡMgjLʏdO^4JR屒Ot D VB`z8vj5C Xr_tv<̯&pvYA5л4[hφy80զT<[IN Y69+T(aV Rмhk51Ȅ l>U8Zsv tC3r$۔!H(}4a.=6HdG\ÿ?m3ڄB4 P8;X௧⟠!̩1W%4Wej/cK< `]7{m~~PKZd5web.xmlSI+I(-H,J̵RP3usSRL2sR}$ $e9Iz0 dÁtsb z CSSrRK\3L^A&!쀾PK(`d5pFg$ Db4oServletContextListener.java b$1$@)|KPK(Zd5$ web.xml $1$@)|KPKdb4o-8.0.184.15484+dfsg/doc/reference/Content/welcome.htm0000644000175000017500000001541211520622616023135 0ustar directhexdirecthex Introduction
You are here: Introduction

Introduction

db4o is an object database management system developed and distributed by Versant Corporation. db4o is an open-source product and is available under dual license.

Overview

Join The db4o Community

Join the db4o community for additional help, tips and tricks. Ask for help in the db4o forums at any time. Take a look at additional resources on the community website. If you want to stay informed, subscribe to our blogs.

db4o-8.0.184.15484+dfsg/doc/reference/Content/depedency_overview-net.png0000644000175000017500000005572311520622614026157 0ustar directhexdirecthexPNG  IHDR^!sRGBgAMA a cHRMz&u0`:pQ<[QIDATx^_^] 5V;QRБ^M!op31Q"عK[qROƦ:LQ( ^XDPp|3oV~y{goٿy߷w~NJ>oWݲ+ 4Sʕ'vߺuf( WwjvUhUأ65 Yq0{ أ65 Yq0{ أ65 Yq0{ أ65 Yq0{ أ65 Yq0{ أ65 Yq0{ أ65 Yq0{ أ65 YqX{{~zh2ԔҥKϟ_)ʯhl~ewQ_qS6o޼I 9L!*Ѹ+Cި 2M֣Q8ԷJx'<%%oNdZ-hЕ=yd6WOȲ*0N9sFu %Si䑆F4/{]N\RE`0ӉDLO\xQ?U.&~@./1O'T& ĸ՝+oYpKZ 厠7TR5S4Rf0|Ps+`4?a;47Gv(DUBhKʕoEMuzIxƃh=XKe\h Hmuq3ߣDqI lF,V$_1T&-%%+U}#*@2JeXtXYG fjYc3Ѹph9"0 4QIP,D 9ac3 p+(R o^ҽܔdWْMHLJͼg4=A0۝~hTF%TĶ$uOI Ԅ Um)hdGT&mA^ҟ hnm\GTG*'2(ԉPm0yx=!TQ  oL`I h \'U-jKQ ?^e7@R ^axNwF_6~<. ?!#Kl9}%vShXC@#Z.әc=߿k=G`= +BHRcBq yґ#GV0%ThqV&ᢎÇB*`4N4pwhq ܺuǴk9bq'Gumj S}~',D? 5޽{… rϭ}@e~~Nb_'XV=Fφk?ys F'9PLPxOg F# F0=Fρ\ozNXozxCs;$a m8 vҺCU:Շj|__;}*:k=vZ"1[QHxW{_F:7GEHvhFz> #F 5łѸznkWh_ Z4 8 2u^/ h#V7ޤ!qޭFρ N q\ݻ0=X]H'w840߽[gFcu!C WY'@ܹsO>ɓ'S; .!/^\i̙3e2uMYSׯo\26۩VVFc)e'eĆ ℔rt%6'{tɕUGtm:5"mNuKI].vv  C,F2EqiHJs۷o0cIЋ}ֹ htDSlfmēq Vr4{H&,QJd҉.@LKwJtҬq>oZ$Q6U?9!&x%P3R2}qI^@AƂNt94 6.]}uuk L'La.‡$tCzEwPάV`Fg(FPA"ԭf5=2S#}T!ШmX,Dm ~B*i1Y)+0yɇC#K)bGT۪M4NYhvh83C#i"`HIg$M?",錇1m ؟T K$| I~fӴW2HGi_* N;͚DB9xkGLjMq]F,uP%Շ%7}F2OF?ҡ8 Rhwޭ9Bqia4{FX0 ZP]`ǝFw+sYcush.$vh 8k\pX0k})`4z6xCu9`4;`Qh0GF!VhpƝFw++sb>?>ύ>(`4Vq"k_o_y5ͫ> nַ | _BXHi+޽__=+|߾Q]{{o ?yb4vZfƫW Z}FM}joF=1vt_Ѩٳo +Zk~12뜻F+WƢshd7{mh4'1sqhd7{mh4'1sqhd7{mh4'1sq~hLwSrFc˩RE5h,=t7{-h4*UT3q~hLwSrFc˩RE5h,=gnTLhyݻ]hG:}vʪx^R5U\iР >9#T3j1$u]6mFqIc1ЇEǏkҜ9s2\Gl_WN<ŋ jr9JT{&7\]_h\LΜ>}Fr1r\FB(Ckc6;4iyh]8Ɂ4.h4;Iv`4(o'\B7J 8F8+uIQ.h,=7|Sh?o9FTh4Fci'ah4'1Q:i4XZI7ILTFcj4VxFqh4F@Bݍh4=CKW“o454QƁh{:k|Tfow0?x0} ˃nCɸLieij4SP](Ū$O 0L_Cٳ_; b4?RE[O6w ~#U@}nW[!k׮mnly䝣GܩSzi4(MR`h?}v/2獸KG+5rbY?Sh,$lfu⬱214%p[to_+(cVW+`4;3zc3xiM\б.}-1}]qw KY0K)[ƮXF*e{+cT֫Qc;zm4gS LǤT2 9!֗Mk;k;yʴtTMeSrCݭ/^c6ǎ#1=UvS9:3T[_Fc7Ʈm4GInT]Fw5O<ӧBQy;}HTu_ғK*gхǏ]h1^d_79)Mp&fh0WS-?ehXݵFHCkŋC*lvB}'C{4䢺gΜ=DUai <-۷ow9(ҥߦѸFCHwSzOuq`;tXƒwhqHt͛*rP*i[+ءIǫH (m( 4KYFDcyj. cҥK(Ti>h0?kNtO5MShRn}m4jU%L^%DQ  4|+޽{S6O\`R)!7{xAy`,$s8.cW TYcYZgo}[|p+puzΫW˗/k_җ?1Latަ 0LR66T$Y 69_ B%4=O- Lf42mu z`iZwAW_}{F8(&XoȶBcd{6C6F<2CWvbEH;U_T"R4Y]֣ЈXFF ј6Z;_%+uXgF0]Ш5`3}֘&I>yRHsn'Ę&${+{$"0莡t3+AxfAXgFXhFLpZ1fZBxW'/7iԤ- eԌ^"k '3#ia\u}CK;}Q9Yvp#|wiJFzϧ7gƲ5 $oCslm]hG^ʹ cFcYXV]<.M75{?CFcZ.˒Xo+@cTXaP 2 zd4UKh|饗u>9}m_Wcd4yƶJQh#xW6%+w.h765ְ 7M(XolihE825vmo;k,bh76gא0T[_Fc7ƮqtYcgh7?{$P{³ͣ6[̊V1 O}Q[?͍z/UӊאCV@o?uN;g#A]-Dr*/:tS~NoFhl!LUzJS~m4w.ƶJn{-Cg4jT?[FcZR] h74zOe`ƖBYhSliiKu)n*oQsUzc4q[ti4U@즂g}vzccqp6$oեJ&W <Cq_଱Mh4mT@ _ӷب81GEFc \eb dSm?P}V3T?[FcZR- M7'9>,.*O?]a4q[ti4U>(4?R>}ٟ-?-m:N!1;Oeb4U)Fc'l4cVƾ0;h$W?+Aϟ(/RoM[WSGJ Rh,\TG ;vlsܹU+y7ntu`~cQ) Fc'\ !rG(p1SbF{4оj I|\Tm\gq.qbj4vFc?:ahCuV}jˍmusgphw{ՖQ,Wӟ+R~.\zLh7 K.4GHNϒg84)K/Tnoi_ŋ[V.T~f!-;G.dXCC( .-߇7W[ Fk-r(`4Vk?k0(+]R2Kj0;5TUq(whU5Bl[ƶJ XhP읺2wo}c6VR3{Ɲ3 g+`4a%-dh,%l!Mz߆3h0XFcAYX(RP-$ͶU`h7{:٩wڊiwZh<|xl]h[Q3{btR??go?^'鍥݄Qz챹n~lOW83Q`h7o67Mo>ӹۧN]0X fogZg}x6|8~sɓ'%yl&lH7T@T9pdj5JMGAMPK^jԤ$=u48\3(MWq[H"CVXVvǡptZ&d90FyJTM,H[+EHdB0@B DT7:4  EuhTJ4i V&ꤜtx#5gdU:l2t@2{ Xh0 DWVs5^Қ,Ǩ>&@8x t6`F Hױ)ʾ"oÉ*J>\pl/HiVsj6u3kSyH>DGi漢fhD!0p/߆v ƙMQ:RZ7 n*IѐW+5r0JҶ*H>y^޺5/\ ZmjX2AxJ0K} Nt >øh*-muj9s#]^9p0crdW]X(2}LBQ삐suU9~jK͒us@[+lg.jeu>|JXsxtB%ۡq!X7vi+abeU!Bc<=Y+ueC[C3a7[ܪJ3l̕S`ihT27[v3lcFN[-Fh]&l}oZpX='lo8f7\%YvHݖo;4N:G]iB@ kdMy*tZwg,[$32桎hWeWDc󬗥g@H)0x6sV1 FVCbrβI[CEV.zO{udD:ZU߰h'Xvg2^ 4 JnApDI=~SЊɣS+]p&L?qjlq\KF#a="3-BTTe6ic]#9@jF2H&3vDuXP=JF#cj0 0kHՖf2.Yc$ől`;W4^T 闇q,fL4oPP 47+ > AL@c%!`B& S}uCf;3$^9hd5Pnq1tY|ȖFjI!vPlŶuXL#5FMvA/_Ԍw$b#>~sHZL̦;@KSk6Ycm!`*3!4U+B&$9SDxT@HSMCuMX.Zd rhy>PN-kWh+$ }Y8-VQ46'*[n//>OY z̆gº6-O:'(meQqGkk4֦ܿ駟wF hB0{._C؃ 8{3K\Sڎ\SFc+ƪd4|~BVhVz ݳK0!Fc]`7{XuȌƪ9fSmn*T'EUsFcw&"vSAT'EUsFcw&"MC?{ޱcBC?y?(8=)pgv81e80J4MAg4ٟ=~.Go'o+&4CR+Ǐ_'ZV޽ڍ_vZ_7GY(dvS:u=%}%!{t_)sϽ ۵ݢٳg;|Th.ow#GǎO'pO)4jBdѣqםXWݏǔ\/\Ɲ;w{qڵF{{&n.7G.FzOYSʌvS0{j4#SG#Si֔2T"5̞*Ot,aOh,5k-,S-?!vST=U٧#xS7_~ָ0j٣1vSY:ty{JwS5NDJ߸qګΎS`hLwSSZh~j21fj4>^\jjhvSYZ$?RfLyFc~.nT*.aOh4ktlhTrG༿C_Iw+i>U"rUB}EwBdh4;MW7#~0H~ʘJn(Foz]Ӌ٬=6 h4 My5Ɏh,:h,4ihg\';*PFԚYqq쨌B3BSkfyu2 h4 My5Ɏh,:h,4ihg\';*PFԚYqq쨌B3BSkfyu2 h4 My5Ɏh,:h,4ihg\';*PFԚYqq쨌B3BSkfyu2 h4 My5Ɏh,:h,4ihg\';*PFԚYqq쨌B3BSkfyu2 h4 My5Ɏh,:h,4ihg\';*PFԚYqq쨌B3BSkfyu2 h4 My5Ɏh,:h,4iv9h059rXN9YqEˈYcYcy:=Tht|*gYc9mdymN2z,#N$gmFgmɻu^~y%y ՗,ƒ?w:F7\Yσر`ְS.\X"wek a~h>EKZn֜SO?=/cmo3}ȑ;qb?O=ةÇc{O}z;6MOҌ{M6u2F]i\$Z۰N2)Rd4KP+裾 +u+V}Y VuTnW7rDBnSךH3gΐ ?:'A /rMbe`*QTf-/iX8ƥKLd :Q_Y}Yret򓋅ȡ3(Ĕ:EGs2SMmK#V 7%ddc7+{Y!V^]T/7,)V01t$ֺcUa,_-`WԜ:Y[B[HU:>t Ha!ܭ$XbgOn}Lq:}b%^MKhd2Cn:&W&J2}{24-Ku8 s dy1`&x(c`ٍK/DS &㛲GwKÓ70>+zo\S4tV[BNbQJt97٥M=rU@gtfrF iIyt])+jėKfTΐUQhE$@&"w\?x%s.Q K= 9Ks2K sE(cW#3ON'F_ L6VX%ceQXbŅoeLTVXfZL¦&2άJƸc@|5JDAhdj]\N:4f=O'p^ԙzl@cTC溕0u,V`,z1tj>? UM>nP;5Y2@" +7HتeV/eݶr"Ia\o|C9"_I'Mܳ$â;FevHN I7YTYY5uVC8@H¡B 3V%MMP'9rYBIM0̎.|mh~'ёN 6\1tXEt'?c;&M#Ir>|c!Zzu<2UB#t܋DEĪ¥MJøʲ$ (]0iΔ,f5flC`Š5!w4 0,[ h̦ l@c1ޛ93@#: #W Ȭ;B>@Z1'"w/\QS.v['~raDad̃Mf*p-,at^U2j}5"c?ԇ?Wyh|oz V .h_{qX|dԩIV{X+ph2+ \O?ar={V$qo ]Vg X+ O չeQh+w=x#GrX+`XW j]7V ,Ihk74zO+`XQMS(0v X)`4VMjEQ+V ,OnT+]V`y {ѹ`4Z8}Шߵ8d?#)`4$|}Y+0F8WثXaP(`4"{5F>Y+0FW٧XeX#(`4 z]u^Y+0FWڣXi`+`4.yF~Y+0FЊW۟Xmh+`4,xƞY+0FzWܛXqp*`4*w͝5GǾY+0FjWݗXux*`4(v]uY+0FpZWޓXy)`4&uGY+0FPJWߏX})`4$tZ+0F0:OqAV 8ShBC(`4$0'&;i <.i^Z+P^hH0K<ƩD~Z+PZ“o4N&Tv X yq:V Uh, ]VFcQydhR%0K;)Feg(XPi6/{k@9rN̲8]+`)`4vjƩEZ+PJk4N.dv XB Yqz1V Qh, ]VFcY7}| ~܁BүwV` :tPy>x胿?NꝫF˝Y+TA#/4#v9~?d4%]q[m4n-Z+Ub;7hZ:7VFcWvo4n-Ѹtnh@WƮThZ>qk X ]۩Ѹ|Fҹ]0*S}qkƭsC+`*`4vUlF[KV tUhNƭ3 誀Us=qɛ7oʛׯ֕+WTW/vZa;ɴػ6h:AF/hƄǏCuhT}'JݻwOgΜu-A;V`$Ax|mŋQI~ Q#TrN$CV:t9UEkgV tRh$׮{D#9&); D dRfIDϟ?&BYge 2%Cb̒eVhZ:7VFcWv;tCUi$J VHq7l12ؑFv[(`4n!MzD((a3V دXZYgxށ:Tv ,Zq[]䈇l4 A'ѸFҹ]0*S}qkƭsC+`*`4vUlF[KV tUhNƭ3 誀U[˷X4u|xtzI:aDB=]q4K^o ^WV|`ZkQh>Nj'irR>3 rMF5䟣4N /2襠#hEZdȉ&|di M匥/S ȍhT:]j*"qk#eO^MeF㠱W*pCW\?Z|Ng~o~W trYUY!VlxlHWi-^3Q_%Up/L,.FqQB+Dgx65&•h>Id,H^h9hWM琂`{{_Psh41y#O䦀FVvd Zk4RQВt!Cc֪(d1 m,4g#Ďu6Xڐhd'9Cc3 3TG ֌HK4fZ4dM6XnphV9Fu1=S߶4M,Z cMtL$XF5oV|6T՜L+1xJ-N#nCٙHt IxH_ш5~S`bȌ%2*G+*:;W TS̛ L246f1:ʣDdp 4npo^C<>nܸ˓7'G#ul=3=w,쐷j%emrZ:L] CD[L>!Y9  ,f'z cT>[蓩+ZE/YQ&Q3T%:MbTgϞO:,EGQlD:(`4';ѣBCj48o&Ҝ7vs4ѤcvS9j4V5C8S5Ǟ{ TXaPFpTe#L7wijWh=B.nOh` +05ƩEnTA3ό#{ &RqK,M]ܞXϜb&8;wNsHϷ~{gS0'wއ>{IJV`) KpШt+`03;V Zq28Zk0Nc[,_O}K~NSӕ K^kEX|wZSh\\ xh|WGoh4wm2FO cMq,ݯXa4~Y/+`RFhU`# F Xs`~8ּƱwV=QhklF{{̴p}]j# 3v9,dOQ[h4NbD-$^^ZpjA xCu@̪8V87ܹsn'=?~)WGIuaMpUN:3g҆:?y-I&N gh 8?[8X'Q{2ouFwmn[G$5]{̫ [Ly61NJhUŋ$x}N;֟5R#JUHuvh$J,mBRE8iNI(JV, KdV]r%FmRŒr^+2= 4btATti41FsZưL,di_16ISpK^Gi`R[FMŕʧZ'XM]'dgc//Rhj\c\Z>X7[\0%H2;YJR;TgqтI (R[nu EGF 9Tz!w,aM?ޛ|O""i1T }~itS 0^^. }¾Z-2Nh46VIL0r$NVGth }sR'"& uʦbSTUF+C#{2$2BK:d46YcfyZ(H,!S;NӻThL&.L61'94soCqҜD-IUICɕh&ib4Se皾G{T?k5VXtzfխ7EQ/e% R*sa>::+0aFb쇬Q媣<ñhKmӬ1ٻJ3LPWǥX(c,*.?aE%ƕ.x&Y ]Gਜ'pk\i澩D[ʪYpE:'`&n 6Hduh$lG3g(271L͑wr-D#F²Ѹ4 lfω'Ȅ\:##S b=`eKpNVx$`i*c;2ȕh4Xto1q /cX:&p 2Da@ *k)V&JjVƙ8QP_g^hf w|观q8>kbσ)9,qpMA'ͩ]3H*A>;kLύƱG]c g~d)Xno%pcgF(qSqH([|8N'+0'7״~خOײV`=?޽KƑ8 Uh0\'+`4WT~zǦ|ޡ/}x׾5wwM[+EZqb*?~?<o~;duuaCxe86b k~$>쯬z f/w|3˗/2V`wv>ځ-gzD㎞Sh,SFc9mm X0ˉ#۵ώ'PN.[VFc'U6եvh|s?RVƂQ0ˉ#O)Ezm/le+UbXw4[]shMM}(`4Fc9qrڲFc9`4h,-[+`4?[u𿼛OSqJN؉\]bW}dpd-,12BFckV` :4?J_Wr:?Ԋ4iG߂uj#d\fJ6 ;Tn8E]ߔ7e4hWV`kƭۿ4j}4,$c $fd%E;omB 8 N})I2@MIOf؍lVddžL=m+1ͼ7`5vRTB4?b? Cە&_fkjύlsIغG7FchAcdQpH,xI ,ѥNʃOffJ4Xhu߱lPj/YhӔD_`O*rF)q5JHwqBu(ܸ lrv 45o3ЫaN# QƬ,G`1Gf4htI3YYKpY,mmHlFd꺹܅&Os$KI(W_9{mJFB&4sĔkddSwS6uhڧOc#\#E&=N[enkz)HhK DǺDac+`4@4B^[y[z5J1lx <3]Y#:4--^Gn, Pi˃a6K7tfq"Dil@c5Z15L:A;Y/oJͦYt*}oa$:YI<\0 Browsing A Database
You are here: Object Manager Enterprise > Browsing a Database

Browsing A Database

Let's look into a simple database containing Pilot and Car objects. If you don't have such a db4o database - please, create one using any of the code in the examples. To open the database select Tools->Object Manager Enterprise->Connect (or use a shortcut button from the toolbar menu) and browse to your database file.

Once you've connected you will see a screen similar to this:

In this view you can see:

  • Db4o Browser: window displaying the contents of the open db4o database
  • Database Properties: window displaying the properties of the open database or the properties of the selected database class
  • Build Query: windows allowing to build a query using drag&drop functionality
  • Query Results: window to browse the results of the query execution

The db4o Browser window shows that there is 1 class in the database (Pilot), which contains 2 fields: name and points. In the Property Viewer you can see more information about the class fields. You can also change "Indexed" field and add the index to the database by pressing "Save Index" button.

The filter panel on the top of the view allows easier navigation through the database with lots of different classes. You can use wildcard searches and benefit from the search history to make the selection faster. To further improve the navigation experience, you can create favourite folders and drag&drop frequently used classes into these folders.

././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewing_enum_values_in_ome/db4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewin0000755000175000017500000000000011520622610034001 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021300000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewing_enum_values_in_ome/ome-door-null.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewin0000644000175000017500000005254011520622610034011 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222 " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ejIH豙6brޠc=)BB1w ϧSޝw@wԴM)dK#+Rc|:t]-XLgy13 6%-`*X//2:sh(ldbA]61zObb:8gMk 86+ eHe" M34,,]N툛>Lu LsǩOltZdbeu1 qN:6|= csuQ΅s[g֓8 S>y>߳@`I٣?4^ >y>߳@`I٣?4^ >y>߳@`I٣?4^ >y>߳@`I٣?4^ >y>߳@`I٣?4^ >y>߳@`I٣?4^ >y>߳@G6أgnQK,A6'=7V2\+DmNPV[{vLg(}m˽T<qH{ ,cm|cn߰^Ϥ6+|̳)%JƓEbe =S5[{I5`pT+,vgj]Z3?tK 'Mɿ+o kC"[QMB}sCBzF*ha:6y);!y>)_K[_Oiӽ.2o*x6PKY+-wBύKb|(,|?yY-ޥ;ܖ1ɵc a }GJK$MT%v~63I[: ҍKR֌U2;>?JKSPi,%\yZ,+8@?3Gw*v 95V"xĉ@*pXpj"I hS6=grZ5$~Q oΝu‹o/wmK @;"s[O]Z יjͧX5ݛ˒{xVќg ?ZI%fkh BpAR rH7̻b^(Զ'ߧK ĺmݵ͝ⓨHc!gB_yEPEW[-"Bgi|>8 z@nfrX`֊GnVgG SOF(-%X uD%FsOZ"c]AN;=Le5m''#U͉$7(l}jEP(FxV HV(1{EtYb\nQO R92˕M AǦdsDmmtlQEQEQEQEQEQEQEQEQEQEQEQEBP+* }?:/h.-qȖ2vwͶ=fPdR@ ZJ]5ԏ;۸,2XMy='BX5-Re?n6żWp?,?qUE:|Ms屻{~OV`_,#2*B6s}aO5&~K.3JUѧ'൷XטzY07NY0 $ > zu7fѬok]hG`Jx ۏGc 5_Z:j. lݸ}?߇ UuQC_ ۏGc 5_Z:j. lݸ}?߇ UuQC_ ۏGc 5_Z:j. lݸ+7.cmST/t]k`_(ǙOW UGQKs.ܢ:P[88xEGoiu-nɀR0=˵_˵_v<{K2V=Jh"XS<8۟TZ #S?%Mn?qOs*I5[g1Ȱn;ֵSAXn?FgaK]Lr?JOM뛻?`gPU_j_;C6;gN?#@]\VW/r++I"-|Ay{wH!7yq rsz kT93 S2?wƪ"[;3FO5V, 1f~EXN6422?3Ƥ4o YBq8}OjOGXCo} F}7G#,!!V#,!ܱtEh?r7@V#,!ܱtz_oڄi3I4q3F'zӷ5YZ79kq>NM}~i ygzͶqށuq#_[:_4Wl䏏 S&9Y9u=ZSL1IweuyGb܆$!zx4mUń oz- +[iZ,-("C\|4|A&qss,qUn\;zWH<X%6$Bs )9?c#>X?c?nV#,!ܱtEh?r7@VZ댗GԭdmKw.ffUg@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@F!KJ(=TIEtc!3cܹRI$YEL'Xդ2!Vc)®İy#I8p!'  E F:\AƖ+$xT]U#h rJs'GѡR,&/9l'!˲]͝*aFmj3WnMm @Jʠ#6b|v$~\+q4^K],esʅt cR~O*Z$o2rqϘ'N*rOHY-59.?6Xǐ *H Y@r&2W}J3 ݭդ߹11T$?iisw,j޹ Sz]2Rȗ:}:3$1מ.:Yc1ѥ2.ߕQ:Q@Q@Q@Q@Q@YWʀ^ƛ(UF'@j]?ĺV'movni Ω[pY #tHu9 K]~&5Ig rI %)9=:|Us\]o?$ ??/nzk$(C ( ( (3rVg?} ((((((((((5?j_?RQF!KJ(H/緅btUhp3̚V?s:.Zk֖0Y_G&18%;V!)_P?nV!) ĪWe,G s?"Hӏ4ݑQ7nQu?j!.!Xi2JJ#$g#Q`Tx?TjM5u?j[UqZ[qs=6"RI&QGRIR\xN:HFe<LF_P?nV!)$g:zF3h RO ?[Tj_ x;Oʻ-'z8O*oBM^CtYEgp:O۲?7fK~UvBu2,?1]6OM뛻?`gOκ:7nmk&'Y4MXbh@w%K @=-.uo?_ uEgg]fuA7ZPuo?_ uEgg]fuA7ZPuo?_ uE`X\xnT11үg]fe.s ڥ}J/3fL cv f⋛Zm.MܙS("#i(&@` o ?3}|AwyfKyei$yр݇>Is?:7n Т_ tg]fօuA7Guo?hQ@_ tg]fօY..SkrrVQEQEQEQEQEQEQEQEQEQEq/)(S]SE% 6OvH e]ĺ9Xxs@q 6Ovw~3sOz^q18wL^陮N7N#lȏG###F΂qؕMYO9q}# 2l4hnB8U4YWɲkx(G@+p2x&XQ$[c'ɉXAbpU+]ue|DunN8sOxRoϰW|si_^'d<9s.od5ĊV*!X2z״IYlj7o[]WYvqol P#b]دsxweC2(g0ܠF?DKh[O_VK_qSOI8vk}$z#[Im}'ɈR~B6zM +$t {__`HM^8A IpOKkVM&$\wMAq))6qy⽖ie[[[ :ĽzK٭-~E-!e1jKLf#i-t+MU [' =>r5oy /]6}8ti ?xY pX`ZֵO5KVm6hr\f 0~7WCS@?G/Ѵhu^]*D)R/]K3J $ѽ׉ծVK^k&3PdlV]ײQNm,-o xRFx\QjZg2 A%@Dx' ?~{}g9^{jZ"Sk0d=s=E[y;_?cx4kMm6w9Mky#pvg^ޙwqL$Tv )pU ' x4ҤjYP`bp= M;[ɯwWIxPx4{Ku X,>DZ{byojXQ_\]"}VYDq}QF |H9WQSml<ⶴI4 θV¦CzK5>b,̑~Co #J>e=3'X &e. uTK+_w~!ERQEQEQEQEV>&㭊׿tj޹ Sz5ZuoXCsn&nw$O=/^U^zQ#gʤQ =Gs[*(cEgah t ?X:hQYZ??-V?@V@O GUP*(cEgah t ?X:A Χ{/FH$P=y]&gw.Cu,LĪQ*B&W*(c'H&dH>c6j.9'H?>:*(c\ +? GUQ*(Bcah t ТX:Z??€4(-V?G@OYG%hU]*)H4t!Ѓ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@F!KJ(=TIE'o ]Fh@RD6;0=GQ6'<Pu{÷t}2vx~{˦f0A88">!Ԍ`u: +*)J5ppWQ©ͨM[$@8*\М m끔_?v[䪕׮ME.BI+MG]ͣVrڽv]D9K+wS]g݂[\3-[pE)TWەzbJ:_ fwj#G10+V>I+ŭ:2k)ŜWZ[r- `ߎǬQG^\^OǫiP{&j6dB9E#1_Z3\`Iى2$*x`U5Q0Iuk0 MB'HA+63!+ jhv%oI34y3Ӂ^E4ay|,8ʓ"86fV9,vW]CW\\i]$[3hs2uǠK1J$3Xf 騯mQ&~bfc@y~\,.ܭQ7>U9>E"K=Oo5xK$0,̤QQR) {94}:Y? &к]?6Nw.<~O:ڍWMq<3lTcB6Bd#F2t|KK--QId c{YT- r*@#N|QY> (` *W?sZO[)E>[q _0ۻvX-b8 7 m=.46A! 9R|TP?O!_]=;#7Oaz1ҷOUʔR#fOά^'@xZhi чڶeS{!2g}&:[2"+' ߎ9EQEQEQEQE?ɿ8b7s?7|3a['MCV]]PEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEjԿ褢OCڗuOP|6'<WxoWq@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@cro:ج}{AM@OM.F_ VISPU_c#/+sTQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq/)(S]SE% 6Ow6'<PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPX\C+^Pq9z˱?{?iie =z}Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@F!KJ(=TIE'o ]p 6OwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV>&㭊׿tj޲en5ZuoY'O?8΍̲$Bud`~0ހ=F;GBK\O!?%?uwh0O k:d']+?Z A-sWv=>;GBK\O!?%?uwh0O k:d']+?Z A-sWv=>;GBK\O!?%?uwh0O k:d']+?Z A-sWv=>;GBK\O!?%?uwh0O k:d']+?Z A-sWv=>;GBK\O!?%?uwh0O k:d']+?Z A-sWv=>;GBK\O!?%?uwh0O k:d']=TIEeB 71 g,~yg?"w%} ?s'}m (((((((((((((((((((}{AM[?ɿ8?iiSPO OMꝗm@I}ps0Q+f} W oƫ1/2Y8oאk"8o$u'1PϷ-7FFb76bO@{sښr z b$$1GZ:{?4}~Bꡀ @ 0G֙@>y?s\ׇ}KĒM#U '@ ݮ?O :뛻DTQxUrC/?ׯr@Z@֞ݮ/56qIأ< qIiB\YjHCqIy=˦G"4;$e&I W;-twBJVL&%{SwkLRZh]{p SΩp&XMVR<2qμ[mab  +  6`sbcmJlnbC\uKݨY!KP0, r0JN`s(((($'(ҿPo ]p 6OwQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV>&㭊׿tjީo'sPU_ #%ܘO8=hk^O,~6<˺GPnk)_]_p?z??s[Jۚ Wm+CW/^_p?zRo9GB ףW/^35.QХ}vr? נ o+ [q}e%]ߙ)Q% Tڿ}~jӅ:}DQeEڠd&pqpqWs[JhjӅN@ۚ Wm(Ro9Zڿ}~jӅB?5.V8_ߟڿ}~Х}vro+ 㕡NG8_ߟgnk)_]QjVԯtl xIe(eyzijӅN@V8_ߟڿ}~EgjӅN@V8_ߟڿ}~j[;i!&y'j נ +?W/^_p?zТ נ +?W/^_p?zТ נ +?W/^_p?zТ נ +?W/^_p?zТ נ +?W/^_p?z! XdrUN? K |s'$y0^m^ْh]߼E*ʘ םxi]MtlUKh&$?ͻs۞7-Q-?Is'((((((((((((((((((+^Pqcro:5ZuoY!%*3w/ʸYEkj޲ojPK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?Uh|PK>SiQ?EWD?UG9P7ly$-W( sb Myn7pG6i4V?`|э^-Q-?Is'((((((((((((((((((+^Pqcro:5ZuoYq˷}+SPU_ܿR4((((((((((((((((((((((*kV*k@? E_m&sPU_ܿR5ZuoYq˷}(B((((((((((((((((((((((_b_[@Z(_w]GPs'}m (((((((((((((((((((}{AM[?ɿ8?iie./ԭMCV]\_rJТ((((((((((((((((((((((X-Q-././@LongLink0000000000000000000000000000020600000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewing_enum_values_in_ome/ome-door.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewin0000644000175000017500000017315011520622606034017 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?<$h[=On=[@dR$Ǒ۠L U:pGCԲ&ÐWx$eJ-u#qaU9 iNR0zqEKW)UrCDF?"iLwhQc"X؂6?_֎$(P߳RMpPvmW;pOniڄH2Ps,c\ZO i`I٠ڥ;f#(qϧ֙y v(\ 9aaR%o[*ɍDy(PoopWh&#~TkE_kZ;š[$vUh*AI#mES@ ,M$=Of܇0 MF? d=̢YFп>xÛvosk~^=muޕ%߆dOEA%_!s4`d Gxki\Hy%EUrYLpxj?7G5k~N}nS]J9.! Enag|+ $z yy6}fV+r " ל⇠-N횏 _RZCcp>~xERo,kqua h/~f-8a)q4FG[ v|UC J #"̂8$ouk~4W};_9Esj3Ii&ErAԵ Z 7Cd94&s/ ❂Xu;u3N`$R"@X۽DA!Gy=XOLvN{{@MKz߆v=m?uxm^=%o&ӡgs1 |nR=k5.gZ-,,5[y\g9P/i~ -8qv%jEUǹqP11a BɯืQnlu@/i~Կ筧o.6Eږgonu $ ;St wP}s엦.m,JCi+ n/A=CR?u/i~25Z5x.5 m^P|>a@cOVԴA./ݾ*%g!FBIx4v筧o..}5$.^$j9ڱ6Tf(b GAY(m۪7k&OEE+yld9XeHn:="-ZhX,7!A?KS=/Y]>u HcXxjK*9` PoFe/PEhF7G ǟϠծE[O]Z מM4?).E]o[pƛl)ikZGw$$Wb@꫑g fͶ4sw&YNhc 8Ns s m嵮wuJ *vX~]r2Ú}-όD`oS2[z񾃭Y_[q +uODoYrH`x fXzfƗMm)m1%mro![h#I#5 τ|Bl7GI΃l.Iۊ?/k̰f{-QPO!bf$(T$ڼ->:߉[W[}o+c-N2q[/Rwv q%̙U rPy8MB/|.XMڍ^ߍ8fVc$Wud9gjh:6ZBsNOA^YcUI8!L2D` |ۘ#3u 9R'^|yFT]$bANЮ$ :Խ]6ֺ]7PKx̋$mTk?_;gR$1(RC9'2=k? ԧm"K9Q1Τeϐzɒv5 ks3Isi_6i4z aCאNV[_ [~{Gm?6o.M/*oԕRpU185SXD>皇υԅLQ VDŽt.<-$ӮTc1!nˁGTSў}b3>ݵSُ<p5K?o.${{zD43ݳnq:k_U]y}B[C&M:d+bvo5%(^zd1$hc ҝWzY;tlj<vV&wcݥe*A`0 j;IeX{ڳM) fh؅;Juɤlj祗^bu[NXG(BR*X\B9rO]j:͍4AZnݭ2Jm'9v`v:v^ZVO`dPB3kψtgvͻGkK>[%ضCcg(S%ډf򐬀aZ=WgU_]:vμFuMZQ[KI9%nd$(C,Gg9i_B]0ɬ%&BceǙ =={Q7=Jab2Y؂):vm=<:FPK-4qQH 9Œ&7Һ}#Q^sα$+cor0>n kT 7&\gyZSGio,Q\DYcvzzZ$$~Q0> :֨X6h LLғgU_]p7NWm:aE延~h%}˝ǑYڳi eowf䱸6%p`ry J\vWzY;tl:VKZUe $4djpYw9>W&.dBT## GЌE6pʼnn/!bP>9HȢKcމʊO-tIsr3VѮ*T+9Jyk4pQ饇u#t1)7hd BOjv`Xɮ5cZ '-Q6mH=* $$UMB,-Y%$-t=1\NJkkuHy=';M,l#r;s{Xbښ.[|r>{kY, m ۂ. '0^;IɌ{ uծgwV:651*P tcPOW Qaoꅑiָ?/t]km%SYp1)np3Z_MWֿG €&ltawd2 GP) ӜrbvHe5Vv[@$<z "i[ BX'i YF I^Gp`@*jy@ 4?/??=Z+$D gnq̠S**(TP:0*E'ǨȼX Ms ̑+Ma݌{"id^ ?zmlz!YTUc"i "8#@?!H UOQy@ 4EXȼO UOQy@ 4EXȼO UOQy@ 4EXȼSAkpmѧYB<@EԟrW(4o-xG,w;Vk>3?Gk>3?Tұ.)s\ivsC}%@5݉F88`:)0NJUF 09\ϐOn?x뤕Xa#B+bErn?1T=a\ϭHĽ:Xj'_BF]eV?6 7ۼGYCL5&+,1^l~Z(ʊ@%,.b{Wk}ȅw+aEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPi W-i W-xvxuI%H'I*)$wI|]ޓIaDw@9.B?x꠳v۲o%\o Zij.sw pl nX2)'90cɪj6K"lZ;Q(\P.MFPm[qMF(嶘O$2 y78=ssKlJ\|g-K1c8S8 {wbqƴk#~ǡF7ȊV(X;0 N8Qz. qLTP۴S!p\co_CBKuFr~,,l^5kg/!g` eeltfiv#6~^qx9U^FKo%7+"bIG qӟ^ cVT'?}}Eb ( ( ( (/K OAm<)[PbhMR% f %EC p,Sr3nVL3IiQyvӵwyq G@FA|}}C]UŜ&{O"FҢcS)v ɥn!.ޱi'|境I)-{ MJ{ðRZ49,kuyI(Vkgq;FsC[M3fC=nHe+|#3_pt9KDpDQO[Q|8{+5ˋ^K[[yfe 9>DȃEm˶5 +NZ;چk_E{| ' !Sl=4W~n+\ȿƯ'fVX#Yc:AL-c ,} Pw"}hvNqol0݈V1u¥ռw=پW`0ݷ7F?w_j-ť k6V3]Z1ûzIq˅,]c9i.i35̖ƻ` |㢱Z-uK $fgQ=ؖ(7Ld&%1;IW5XBme ٮaMCF RA<)VkVץt*x/]im˵iU:oamvD'{ =Xzy/ıEI7 "c*7~v h7Zu{ˍp2ŎP'5iWzD F $%GRHʺ2vè}2뫨DP&BppF$i__u:وlRA!pK *d_!&]Sgk- d%v;@EcҮ^Դ8e5H {գъG($q>lu.=Ot&Kl\ G:2Z7^;K7ҝhjn<4ٜVCDFȫ#)CR\Gx\4jܐ ^I^kOz<$qr=^Bs+)}O*}4ͦ5s}[NJσ ѣ3{kO=2mwm/@6yx`W cc--U|j['ci'xr2ʸ=0qhWDq5I܋T8xՋ!WMw+z yc)؆B;#rq5m?Z{4[ ,BH$lA98,qNO[_c(φ?R_k ?q(:(((((((((((((((0??Z(??Z(?1Z20 f8oOSNQ=sd[ b -폞\gy~k[ccQ=s?'ccKc'Ŷ/+ˌhn]$3a);$8O\aF0* @X:?PYW^mRUʹ4Vl>"?'gDLx?@0(Q=sW𶻨AxJqO2(:dO*!)z ? 6O\aG!)Gn1l?aQGn1L?'gDLx?@0(Q=sx?G!)z ? Ki%s^p3O ?&?~B_Õg #?OQ #?OWQG֫;rDx'xI ?Dx'xI ({Ty( ?G( ?^EZaʏ3}'(}'+(U9Q_^˧4Wg4wHY[zFM #?OWy75s :ŤJX402F#);<̝͂"׽ʟC+GG=Biuy{ p [zmF '03-?Z!l'k(%g+œprr`Ww!}'(}'*֭KR椺VOme#3l䌈29$ |rlno4/Ii.!.7${@U>\;d }j󿽇*_q #?OQ #?OWuasa,f4iy&4a\VxEկboZ;uX^+yWE #ݑtZ{s +\GGKEޭ6{owenLRA`0z]u;Zx~Ibg$g>\U~waʻ<S[$8I;2ؑ198 18zƹ=֝5c)$rn lq% qYk<ج8Q 7Q 7º;K[Yk|vpKi/;42nB|²GZ|cȒj76 ulv|vvFTgp{ݹn)t+ˆOˆO4?Īcgtlh:`\T } _Ku;ҭ{cB-o|JnYDE4xg_[̦|1?Dx'xI ?Dx'xI x=Mαm-n鷺&S<G\Ȁ`y<sh:n/g[V[$]68 j"6]+GGL֫;Q<73}ei݋{<$TcэzMg?}5YQEb0(((((((((((((((4zu+4zu+G>(Kq[z[iZn:_cURds`}x<,?uguo4YA4w; @V=} " [4>᭢i >o-I?(O\ Ϩh7bx3}pwYo%ʌ&t>VU´y*+9A'Yt{hԝ-Rx aFΡG-`N\{/[J&O3z$y/V&Ubss q~']4gv fc.D(ԩtn1F۾ѷf<&gi:g'vnM&-%"_ W$A{mout` s0N: "XFA +(UTtO:V`xl$eWaQצ+isj5uj# {E$3[iڭᕘ Qgrr*u ]kz kBtFwNm&e`ܐ@T_*&] mgOX4\Ff'|˙(`r 5*(ccGUMHp[jL2+4A3#m|Yhl|ȭq#,[zjXpjN *(c &^;9e)D, b@=EV$Ml<ɾ19pX)<*(c[~4iٰDK@q" 7%O*S ҏ Z'xlMKnU~yt*@O GUQp+ҵK漻x)/&9PBj|HF |qɥEvK%J?:_׽f|3u8-cP^4`!v[^{z\m t }@7H2F-d㑎VS9P[4Oj!LQo.evOA>; OZ\jki|f2,)VE'b['#j3r0kCB{i-n}28xK5ݱ$>H ی@UBHI1)pA_Q\SFiLȡ1PsG8?m7KҠhmufM f(Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@g?YzEr_ZÿoNҋzܽ:Xjߋzw[EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEGCºEGCºEhx#Gץw+vbanx~qa+]uݘmۻ<1|@((y/%t;k^ܘ1`s9R\\S!@1,`)GП@ Z>%.m4#u%V9'is߱ЂmXm(jG~cU%Sv~O5x` 5">T;2ר)wo%$fO?$-.yu-CGu.'K{Ț\ (:eUJ10IGFu]QR<M[6[qb|21TP3e~"km-3v|g3eG5Tfx̥2qP@$w%QHaEPEPEPEPEPEPEPEPEPEPYzEhV~o@V_ӿ޷/?ޝQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEyPrFPr@a+]uݘmۻ<1|\G?yGzX;~rwf&vml'zP( (+.픜>F p;sRs8g~kׯ86(6_iK;dX"#@2H_1\`t ӭnDnݸq}J?.cE1crmG|,}gƶ:Fk4+esq S>#Ԟ:fb+8 A< ]H7 6%a0@֎2):OY5L45># Wq-RL77r#i}uF ET t 禎M(Kq]ӮWnn񍭟JEPEP{=۝?t^yUtnvNv# ӏz`sڬVw-72w ->g5't;-Jm8/=4#] x뮬,v} nz?AU:%F9pz@2˙(.lXȅH=xd¾/Qp"PtVIDbNХn ï,¨{n,L*-MrIv.0JϧMeG\yu44Sil4˓sn#9bH9 n16*3O3n7θ˷n8^ 1[FCHBO]`<)av@}&?ŗ)qPXͲ`FW#vg`u[ׇO2FDLR#hqӚ:\}&?˭ܕ:d<^t34rW#ƪ8<X 5s]. %rj` ׷Ls~*F@MijysEn;XXo+;mO:8'a"X8TL uej2_\@]Za4Ƞ  ýSXZ@r4 !'.ӹpJi-}s-^f%`H@]y[Bd'qU[Qt{-q6n-b4%`! r%px֡\U;oBٯtu.Cd+܊d.s}.ytqȎHTœNuW-/.!K :mq#I,(8c 1-npntmMm!* Gw`rzRKDY\!]Uwa@6{`o&_̘r6.$|ǠvtTr52[w@dx-Ã/,#Ğ\0 6Bs`pputEPEPEPEPKjzޛh:WIo_7L:Տ }xH6&73"C)#xv{ w/{H( 8M lЕ}֟vPg%_u>+*?z}Q{"ՍW0N3w95_PEs]5հ[,SA'5Sm۴kϚ<1 Fۻ-ʻ}Zh{㼚9Z .3{O- d<5((*)Uz>ҫՄ|?oѾxOTn.)#%і 3Ā։]1<\LN4F L?56o5tqY1(ؒ{vctf%UiL|5!Ax{?O :LQX(%AޙxOEQ Tn.)#%і 3Āր/o_5Xt jZ$bIA]q3#*荣yB䪎ws9ZGThl:洋n6:ڊzZ(G>(Kq]ӮWnn񍭟J<#ϊ?Wo~ۻ10۷vx-E-tI*RN&ug}"c7k5#+,zqϠ64%r<pr9_nEgb8I$ܩ闗\ApfD*@  - ″J#v,v@'hnexg^X#KH#`EPJmm_Pu.Gcil4˖WrđsA+cyjtEn!7ǟc&6cka+x#(cP(UU:)̡ԫ 0jm_Q]Dޙ(OIu!4 3iN>< ].k{m©]c;^iiɲ#XL@<*jn^MsL*gY ̠(++QHaEPEPEPEPEPEPEPEPEPYzEhV~o@V@Z{ uժv-jv]$aYVp~Mi&C$F.f'$G$? WG? "c-M4hmqYo+ ? WGtqYm4~Qvf;rX8#^idIUg+0g?pXhfH(ҮUao+ e:dk .V]HخA@ʹ7NJ:䌃dUKM&iUh|!n APzb( }OXp0Lӣ*Y,prOoAE7)qu 4Prsٲ9>(I$ӿ!;s( .;p9us1Yc-O'Ԣ9)l||<%,==vCW@ӒY9r L[{מEe/t巎.#K{ə MaYiAn!3O$(蠻qW #AKhn~e #z<=d]<8g*TJrPV4M;[5xcguY%Iݐ=ih6YOg-]].%1ZTPu·au4S2M ZHN9O5a#]noaXYGz F'rPoȿ?v\E/~(d_ݟ?WEvSγ""$Ōap0EgEi{ &rk y3X r}MKeG״N;r:Wr*i\\Oo2\ 'bcjEQEQE_PtO?zU/dzՊ(:XH5pV$p=t4P<6q$qk:z*`Md^_9TfI#l&j(/T񗆭omr%$O89v"x\t׬zchƾ=ktcqc\g>@+.5k[]fYuDYFX㠮5D[;_-q#<,?vN] wg6=+G>(Kq]ӮWnn񍭟JER;#|.0q0btU[mBI@`Q>Sc9jd(4ӳ<P gf[W"؀d>r[j5hht)..)^0pOk3EV3X IbOrG$WhVx%Q߀)5]X/7gDƛAvn[kˑv/Am߫3 )v1,nI [ֺ$r*0* Yz=hQ 6蝉 sn0PV*U^|~2~ɧhGw+c{nk}OL`G tCYmCLFѭ 1#3*B<2[v5N (Q@Q@Q@S&+hyHK(IHIQV\SO ( ( ( ( ( -B_z/?=]OqJU@'*u5{ uլ?t_2Sg@bi$SGGsҀ9?OGGe@:&ef*ą1#` I?jw~5{oisy3$A0hZZK,?]ٖ .[~u/OMNbd@iVhY0_\)X⵰w+1O%\D&7e2SQ>~i9] Ӛ7O`u5M oFo$ psF1$wml+{2Sg@롲4^O [{? R\IEohZ_1X[ꄬҎ[g@̳Tu 6nʟ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lQ@ٖ .?OG[P?e2Sg@̳TuEcfY*??,?]lV'53Lk V!}ZV"X~g@̳Tu}sV9!ɦK{2K3jR A}_c<,?mֳ\k7 mio )UKMG!BOw .p6%bH }" [4>᭢i >o-I?(O\ Ϩh7bx3}pwYo%ʌ&t>VU´y*+9A'Yt{hԝ-Rx aFΡG-`N\>*kgw2֧MO0:l8;;9knlV):*9Pq 7pYkndTvRz-Su ]Z@ksu`PZ(n?v$ wq#w ݮܑpS1#yt%UrkXdG)=5f׻5}:KZiϨG bCc f7MHHT_/8$ƾ"{}If`sNռow`ա]f+d'h&>QA n5Sny֯ 2kdXngVFG1?+qG kO$Ix5Yof2!9 P+YURռ Cȴ&@/| :{>z 'Xccx ^-Fgf[I GR)Ǜ*qzez 4PU$6'K]=2}&I};7A9-N>Z)ugk{&iM\V7"_) )-# yzYXOY%ԯ!Y&Gm0(w$SZ?5 kk 'Ṕ<xN<><i'NJY6Gfϟfo? C10y <? 1p7kVݪ6_:D64Pҹ?\tm2kFI{S35)~(hf S O d[)5XV7,qnlUW%Sa|-E⋍΍@m329hC,o1R_T$m2Hu[pP9U(((((_zЬ_=Wހ9KuFeJBH]DI?εo?I!𗈥$H+R#L{tKMr;^__w꣍"cFT`^a٭Mk,AW] 8>+_ x wI9<(42[7:&p.--Ͳfd9I(l2z\}7D}o & P4{ߊ 2MpH G@bÛ. Z[jk0ڬS< g'Y7ˋ+LԣSPK r82aZc_?+_ xҲ$z/ڷeKn FH.:q739um{;/R#nVH, !|kµNJ=VW秷aoCš_K}ڋBiy;p}t?so^mkAzF, >V E,n\Xʥ_\G y?€: +ÿ?o'Q/O k7(A|;sw (_{\G y?€: +ÿ?o'Q/O k7(A|;sw (_{\G y?€: +ÿ?o'Q/OhkY g&u _{\@?3<Ҵj8,pN )w (_{\G y?€: +ÿ?o'Q/O k7(A|;sw (_{\G y?€: +ÿ?o'Q/O k7(A|;sw (_{\G y?€: +ÿ?o'Q/OhkY g&u _{\@ k7(ÿ?o'PAEsw ?Q\ y?A|;stW?/O_{\@ k7(ÿ?o'PAU >Ue$oЏGPG ÿ?o'Q/O |3M/vkۥR  puI;u k7(ÿ?o'P.<c^j7:/B;n,t-nhik8O1zÿ?o'Q/O / ]dڊT/y$vw{eff9$({<,?wx#Gץ ()%ϗ eZPY?v1s{,5aE rRRz ]ݝ(9ی3F6׌ 4gv fc'5;=RM.y{^;O ӂOz ]O̼4n P9څDPm,7X) ے Dtr# pGAN*2TdܺO줝Ⱥ;F'NyU9?1¯u Z!:wvoq?iimnG u⸏|2` GqY-ѫʏK@adWTT<yhyYcK#wODcJ4]Uc7S^"kns:|Т|'Ck2E"GM~D܊Pp99EQEQEQEQEQEQEQEQEQEQEQEV~oZǪ[){ uծO?&7Z/?D&k@^%t8JAR+1Mgii ie`~f't;פicq Rp69ck Q3XԤ+Ԭ59 [ܭëc x g5ֵ!7s&Tyjz"ןm n2[ b?pAhrWqY͢?^N?r1譏E?'9G"ן z+ck QC(Zp!-yA8?Ǣ?^N?r1譏E?'9G"ן z+ck QC(Zp!-yA8?Ǣ?^N?r1譏E?'9G"ן z+ck QC(Zp!-yA8?Ǣ?^N?r1YTUJe^w(rp@[.0OILq8 cެ-yA8?omflibP$H2(/'u!լmcosy:[]Ub`C(~l#X-[;I3w7_ZC)[: V"ןk RZp!-yA8?Ǣ?^N?r1譏E?'9G"ן z+ck QC(Zp!-yA8?Ǣ?^N?r8ȍע*(7/z':w|Q^+7]%V9]YXdfL+Jnahn"X$O~AOڟ(aV[gT&ބrr5Z\6 |ÍeJ˝ޝ'es3hA_NA;<44gv fcc(-NH4A_lETde`) (((((((((((+?WU跭 -:Xj'|K\Eu_Zc"o赠CK-5xQO1$*UĜOAQ)-ջg֫ʑ Ą8' O, H܃m GF=i&Q$0*W'jяz/I DJ{ ݜzczNTCVmBam"s$l[1mcԁsgIK+̐~[ʓi$A (aB-}!ʕD m7wCC6pH~ŲaHK9JIe;O A>M[_Iq!fY'jԒI&ż7v[J$E EoRN)9>i+3μEo6Zi];[N_]It ]B]vM_IsXs^=ÄD_l'WK4ttش=1,&`-b'a\`$vvOK;+H-PDPy8Qj\[<=jMXYm82^NҤCA8qSO4i6,nl&A˟0 àL# i {ozUE<Ȑ6c*0H5~k!. ڠ}|z7_6Am-s!ou&УMPyKvUEy8sľ.>us|bJ[ Hk<[>'tȴtM5!bڵf$ny uG!i9ԸPGP RSmXCdGqqq~irgea 1uOYv+#k#ۈzs=8B$ҬmO-rNfÚv63͘ڡy2 ͌ 4dGl.#=&<֪ ѷ3ZqwcsulL` gpXrsFe dۛKӮEU8xU 9/ӎ z]0(DX܂ (HMKWMy8(LJ=f绵eVݤ20L8@J~xƑ6$/GEc-zsc̷[Ho $ga"ֵO{d-t[I1"S_2OM7~s[Bɼ5T}dz+%٬>*-D1/AI{C{}ezd7%$#d| (|@+=+@M;WmJL2\Gv5U (1:ֻsXJm巂XG46q.C)\x<9[}t yvx9|U4KH,]> rvQGSH*_ s4_Q[KkY?ݼ*ܣXmli`3%ʁ Fe$0 TK'|hÎlq`31ąơAf$I$kiV<7>l+#RNHO(<'-@{BYdfe8zq]},z:FAD\m4=/A6ioGHls#>ь/mOQ^]WfDE@f+/_%\Vb0%԰ƪ|h 2NCzE<9tG|o8&1n1gK/Ymf./ e@펔_qt9'Qd& h4(B@g.w!WxRYivV2K #b $?JGDQH((((((((G^zK48xk}0 0$pk;_YNI{{X;|>F,,7m/ { bDlCR0y4 t4=1"rڵf$ny  Ey'^%6hq6XHm$vo88/Z9<dA /˹yls_b4?d#^cnޘSFfSM[˖`Q$͌ ;R,Y=ij7g-0`K@;탩ZcM>퐵nM$DONI8܏[-1,Ǚn#+Hzh+f|d[#6d|LtIcZe\=oI#S1fRXm#{ipll/3O3X|pIS'RKyQHCnR6wE7 rdpI k}>+UC.6Ғ#uOZ [vpb*3dĭ{z yEL&X$1XYۃ zms9[t2ڢ6ۉ>%Ƈ@\vSG-2,ROמ+j1h[%%KTz*y71kM:۩x.F8p{>_95 I[T]HZbbln@1#5zEDLGrϤlmʱ$M?#Dnt e[[wr@d_"FDUp@ G(toSCk[H%LyhAFU7F^{tm,Ū-Ace (À!ېqj_ԧ~֟jWYڄH\rO o泞=CYe2BN#8:I|ceo^e s DnQrZsG'|?(47D1,Bm*3:tҜvOk֟?3"HHu P5wmC܃g,}}wdW'EUA^0+&^dks#T~]x❄3K}{٤1nU q,5k͔r3L!8V ^ի;m/ =Ȍ4jϐ.`.q62SRW̯Y6G,}}# d>V1N Kd1aI 1\dIȴ[ui3Guih&"paUM眫PKC׹<|| m ;*1עUgxKlx{e֡mm6,Sl0ۈ'kjTh7ܻ!6Zg,}}wdW'EkZȾ.fumC%?Y6\}V/3:Y6G,}}N>C܃g,}}wdW'EUAγwdQ ;2_c+E gY ;2_c(o/Gh"s3o/ ?}9 ?gxKrtQZȾ?gxKmC%?¹:(_rfwwocwpy;p' >D/jkui M8>$WKxÚWp,Fkq5AaSP l<01J03p>x7Kʏ^w&eR1v夞躅޺C| Hb́K uru_wdWY%/E:}}6& n L gjO/_ )y.3WiEQ{_r[4MDK/X M.8j_muPO)~VCA薐xsR#qip]B$b%R2pIZ["'#˧1,S45e#$NTT^lJn1gxKmC%?ºx6}zG-iM"r 'hc t%ur<;$={Pʔ]WڒtC׿#x;{m{Ry$q3$՝Gty=OR֬^A6O;-Ium#i'"+` Tem#xBK=.iz<](;x\C( #!dUi A<ޭƍ/5?,}}-#x;{m{Ry$q3$Bٹgc&~~ɍy^soo?{o;[kmDK_*]m@M阈^IAE/vm>rߍ>%i[I $Id(1p gX>#xfqɭi,XOs&mApW rz ֿ4*EgDzi%*h\?,qa[ҥBw_+>EDTQo_OE|x#GץwEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPYzEhV~o@V?ț_-k:Xj'|K\ExjRWG]5Č8 b "^+׎o8.UGÿغ/\DDQq*@tWQ,R= ^q+K=,b{u"E"|2:q_pQObv"fn71Y]ũLYH>s׬]W¾ڳ]0۷mWc?>ءg[A RKc ::D 6e 6٦Kc!p397:vys%՞<1i%'fsI&ȟvmڧw={~({~+!X5.HUu$Η$Yڤj<Pą''H zQ?E{3购fd 千#.Xr phJn&yY噏$G&ȴ P`ky`p#'r>4k%w/s!ᶕPOAߊ?'Gƶv^ ӮS;&9#r8$T-NfcLI?}E/=.@G.@_qQOfʃ٣]W]W¾⢏*fu_^߆ k z(bR8d(9ƒd_nQGGÿغ/غ/}E3Tb b lP{4|;27Q27WTQ?A.@G.@_qQGG7FrvJ[`!o=?S{~+ w9 t ?"&j֜֫2ј(NT9SLsynUb b _3Tb b lP{4|;27Q27WTQ?A.@G.@_qQGGÿغ/غ/}E3Tb b lP{4|;27Q27WTQ?A.@G.@_qQGGÿغ/غ/}E3Tb b lP{4|;27Q27WTQ?AM=]X[>lBTu_^߆ MJ!5ɒIo#E H*2@f<9z~R}:陂ݴ~c] 9o4w.@G.@_f*p р[xp N*;a&a[Qv(XUSP{4|u27Q27W]&x[[VTDn2$#<AzKk?vq\ 2t%0g;T u?g=.@G.@_gGy[^arDUĮrt85>QxyxJ*XHZ@7 <(ٟgȟغ/غ/}|Dc.E 0޺#/7@2:?j*fu_^߆ ?u_^߆ ?g=>{~({~+*(ٟhwUeoUeo𯸨fʃ٣]W]W¾⢏*f 7/z'ȍע*+4:w|Q^((((((((((((((((((+?WU跭 -:Xj'|K\Eu_Zc"o赠Wп^?/V`)iMm*?hQY7_hPu@k9G?^,̲ ]=W=S8< vqI{zdmϳXb_/d8˟VlhPj6E#Eh8ghQu@k9[֯*O*Q{f;$TQ \cx[[HEuFtYo%3[F#O=vIazo_p?n }}+S[^[I`] \J3p'S8j&Ҵ075$PgA0)295hQu@k9N sNKw Fr8"{AYj& x5$ps\ۮ?ޒ5sRhQu@k9K= +?Fr_pТn }}(Ѻ5 +?Fr_pТn }}(Ѻ5 +?Fr_pТn }}(Ѻ5 +?Fr_pKX( >D]O842[}V 873JeiHhnCgڛarMR@x~_0s'xZu@k9@V?7_EghQu@k9@V?7_EghQu@k9@V?7_EghQu@k9@V?7_EghQu@k9@V?7_EghQu@k9@V?7_uk-o =m&Uʶpvqj}aFx/g'O)»; [L&\ Xm Zd;&I<~2wV ``hQu@k9I;[5=8loS<`1-qT|A'tI,4I"ړ<*TFr_pLxsyu-dl$@CCHNFwnn }}(Ѻ5hQY7_hPu@k9G?hQY7_hPu@k9G?yF?xDmQ@?yGzX;G>(Kq]QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEǪ[օg?^5k%MֺuFr~17ĿɿZ_/i+B/@@Q@S%1-ľZ$(f!O};lmQ$c,' "4nO)隬`6^\["YQ68hs߮Nrnk7X!_gFDdOA3pt [;#ll 7sMlnm(P:V:m]{bƭ&j2#Hm}q\5 %ln,Lc:; Fa' qWsm ַ1L92\n/%b'l] g@Xs8ϩ_KneyarK{ ʯ+|?vyH|F.m ݝwm qq4&H%6 m|N]Q]=DD b=L;z Y>k[ ۩/Vyʂ "*:c\_~9t)^ND (Kgckɥkg.bq<)+ʹ!+O*lL D q嫙F6%8uњ[^:9u`!rvwO D;y]8$ɝb`%8N?p_hUVƐF5h]&k}L&w2Α'إ4zekgw/ %O<^fFg׵Y洸q :| VRA FXָS[6+aI>-=q:`CNlnZ-紁 VFwCsNn/!-_eGXPې;U=7CMys7f?)g<䪬h2@$'$kekɾs7dlM.¼gs^؛mRůVObT^A4tjesn4cN@3[xfHDwwsq-aXmPHFXŽzm+ORhT"DŖ8aHc2^ׯբ)QEQEjRiPkB\5062I(` }SuՃPLaMhe <:ʄ6ߎ2tN՗[V1Ite"(Ђ2xu6 F DR1N0-%bYZ'jIӃv:6%y* ZUF 2qN 9cST..,31`a6So"X幹If?/w8j|(Q@Q@Q@Q@Q@Q@Q@Q@Q@ƧyI`%̺|Ł *IoQY^%4rI/4؄i☨+n4WVk툿TfdR7/P:Pq I&C&V2c1  ԒEfF.B[9- "EԥX~[u 7ԨU''㮔~>\;HԂAp)gXs¾iKy4SPm1˓&gsla~[:VR)<t2B',>3HaE,Vj!euBy<O8VIqmq̲r̍@ `9h'iY y#ُ|u8d^3Ӯ>{7 <ĊXx)e^RdrXj6zġe:h*K1xmMSSK5DWlHFjFbQ%=NkmFdM &f W t5 njYKis-U8ݱ ?+rZϗZϯk>-<--*a2g6h0^jmd ϱP `A92TԯnUbI-°uheVSruȏEj ,|k)fbd񇌌9'x<)hot:@"ב/FI~^vHO`Ŭj 4ڄm0(e`c #`必l4ˋ6%9uDP1`Z^:1xPi*e־|˦"[k$r<@>"Z}v V}OLaOo(mi$G)+FCmltV"0c- xkkb_C1 8V%6m.[M>(ha.S`RhA_DZ=R^$ro PJ]yEe<6:̖Wj_Ac"..WJfz><#hʊ< "6^3G>(Kq]pa+((((((((((((((((((_zЬ_=Wހ9KuFr~17ĿɿZY{ uծO?&7Z-TZyPG5ь0g{?ѡȽפ_ u7y:XТ3c N??v+/[;R 45^dV) XI(;;}a`aaqϫu6j W0%yiUL8c rL[JCs[Z!xD7 Ǯ6>W pTVnrJ*W=fK}OO%l߯}|c s Z Bۣ]̑oAREN޶zm;8c~xTUJ.pM^üc N??v_yf`H$qߞ}\ɺk."dT$p(b2{}:XN??v'X;\[ēZ= \hSTL 2R؜.A:O *ê .o kE%Y.9?/$M.c] 'X;GNO\ձkhӤ>V%D| 6r:hV\5I}x.iFF̌K6|Ğݨu7y:Xګ)e6YVY7dV'Bڠcohu7㵡Eg:Xl+#RNHO(<'-@{BYdfe8zqGKݎ?cokľ%]=Fyv ^ՙBqt_E|pB0c|c-[S?MORm񣴀:! LNg'6y:XN??v'X;\[QGEZ9-$*XFBh<בUu+ɼ%].iKǨIp4;ɥmm?cok'צF}&+goe&U"l$~fA8x9ֻ{y\ N]!`EuN??v'X;\b]^uYwV $pSI{-Uܺ H]j۽/Y+m Tuټ1v÷*2 =c N??vk_ 嵔[M )mȮ;۱s4tAo_OEEDTPA|Q^<#ϊ?W@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@g?YzEr_Zc"o赮@]cѫ\M/rogzE ЬXthX㽕UUԥh[xdmRHK(UP2I%6?rt}I3 {d/$O, b<[r_tcڨI3O']Im%и^udHGݹ]rkRˤB]'_.Yn/as$+I7wH=CF$I,gcs\I$tO9>ˤB˗- Lv -F#'Қ[pm,Uaqn} qh.A g/GtO9X)l,4n K8JTn\`YFMKh0ˤBK/ \yw<<ٷF|l'nObˤB]'_.آˤB]'_.6(?rt}I3 Qd25 2"l|9ѴO=G`x1'֠[oeRsJ7}I3SßOJ6c2czԲ{EmO*;!xЬFTPI3O']Y4>[-.bIaDw,A$2r@'WO']e!? b.A g/GtO9آˤB]'_.6(?rt}I3 +O']e!? b.A g/GtO9آˤB]'_.6(?rt}I3 +O']e!? b.A g/GtO9S}f gMF$F1#{c@MMC'/ZFbF琘ˤB𿇢= LK9[b73ޤ%٬>*-D1/AC]'_.?rt Fr,Vs##O'՘46[[\E*q dm\OO']e!? [hv<6 cv͸6@AϨIq74:]`n3l1Ԁzo?rt}I3 #DV-d-XlX `)p)ca=aog>|xm##r56MHc}Sl)pq t]]f~I]6-6MM{[|Vh$nyTsVgkk Y!HUS27 :J4<Wg85߸M1uvscQP@ѓNN]"lbq$vhp\`K_h-3Zh}Ne0"}9ht]]f~ 7O81Fnz?1@ k:Z`ZG@CIֵO']2h[xdmRHK(UP2I%<#hʊ< "6^<,?wx#Gץ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( -B_z/?D&k]eV?ț_-h{,o j.n(T,Qq8QR@8!/u7S9{)f6́'cw{IhNj\ Ar={VS.En%_3ooB.dɠbDH%EGW T?o){93g z{T?#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P}~ןOOo?5#?;#?;z?h} y-G-@>y?s^ k??Q k??P[^fmeO$"nz__|9瞾{y^s¼7|#?9wï_w0ύ<+|Mwo>^s¼7|#?|-Kfy>̖22V1:1zV7~j7Kw{R}#<$`V;Mkw4EMdc;Vg%cUakw){wH@G8#hʊ< "6^<,?wx#Gץ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( -B_z/?Nw|wgSҮ^5j=+?$PPQPQE_ _ #0E,$#]\0#d=_/Z/Z(WKWK/ZCmCk$R(ttE*FAu Moր4>g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*ԍ"@QNw|Q^((((((((((((((((((+?WU跭 -:XjzW^H/?Ag05⨓cLj2X+Nq:+a>:ƨa>:ƨve R6kijȧib bvzV6o5G6o5@bTA"vrG+v`zuN\K9<#"|ώ<ώ(77 \'F'"n`Rc顒&º88#Ve&i24ֱB *YP/EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx#Gץ(((((((((((((((((((_=Wފ(:XjWòE߰YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQ ?(}} b(A~`H?آ>g>߱G,(YϤQE././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewing_collections.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewin0000644000175000017500000001025011520622614034005 0ustar directhexdirecthex Viewing Collections
You are here: Object Manager Enterprise > Viewing Collections

Viewing Collections

When you try to view a object which contains a collection in OME, you cannot descend into the collection-items. Instead you see only the collection-type.

To descend into the collection-members, OME needs the original classes. Therefore you need to specify where the assembly for this class is.

Go to "Tools" -> "Object Manager Enterprise" -> "Options" menu and select "Assembly Search Path...". Add the path to the assembly, containing the type definition. Now disconnect and reconnect the database and browse the objects again:

After that, the collections-members a visible.

././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_tool.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_to0000644000175000017500000000343511520622616034010 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?D[DhI玞Cah G?LSKm7۽koWiyaA$ILvN7)! ]Vq2ĎB1؀I<Ԟ[.Vs`&>GOQoK#F#;#st9cI%F5t!m71$$GީKTPQw +9ӞPvztMi(wgo62j/|fpfPneOn1q.ehĈDw s׸=&YLKh33 +7sd_}mg1ٌcԗ0IYeY.,%,x>EɽΊ$fXv #.Wb`z-wSRq9lݵ:XHn|3"eTCOk[$dV}} 8-0CF"($xy=\I_M5t2m?<ƠQ=Y!iXag5;-ی%~?rR}d^' CA孿L'БjcGǏ/kl@5KE[7I]#'\gڧ_ޞEvSTR1$jтpyby7 U$O S_p"@VF*Th>[ pF`x VeRFMH#9'M/EYo"[dDB-C#9gNi%,]H݊(Xܷ\yW1$0;`/y;.}MU`ՊvW%lL0hcgげ2:޴`maXm;R5 U|Rڮ1I bPAV>o_]FmeS:?zR#8f&Ql'$ Eu#F1V?>)`zSI%d1oc[B)"Ѹ=(izf7(j`z~aW J%=-Dv dd%Mr~2ԧY Ph9[Wa4d3c9۞}GYsh0\LqrYO̿[(vf8lm㶹HwKn]JIf t*o4M# nsN*0?././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewing_enum_values_in_ome.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/viewin0000644000175000017500000001247211520622610034011 0ustar directhexdirecthex Viewing Enum Values In OME
You are here: Object Manager Enterprise > Viewing enum Values In OME

Viewing Enum Values In OME

.NET-enums  do not carry any database identity and are stored in their parent object slot. If you open a database with enum values in OME, you will be able to see the enum class in the db4o Browser view, but if you proceed and select "Show all objects" from the right-click menu you will see that there are no enum objects stored in the database.

But don't worry, an enum is just an integer so all we need are the values of the enum fields in the database.  Please, select a class with the enum field in the db4o Browser view. Right-click it and select "Show all objects".

Something went wrong here - there are no Enum values and nulls are stored instead. Is the information lost?

Here you will need to understand how enum values are stored in the database. In order to save space in the database file, db4o stores only the absolutely necessary information for the enums:

  • Enum class id
  • Enum numeric value

The actual enum representation will be picked up in the runtime using enum class definition. As OME by default runs without class definitions using Generic Reflector, OME can't interpret the Enum field value correctly.  In order to fix you need to add the assemblies which contain the enum-type.

Go to "Tools" -> "Object Manager Enterprise" -> "Options" menu and select "Assembly Search Path...". Add the path to the assembly, containing the type definition. Now disconnect and reconnect the database and browse the objects again:

././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_result.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_re0000644000175000017500000010313311520622614033766 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?ERʈa8zH{<'FYq7bz dO6Kc#[qX1 -8 :7V3h-e6XƲlK)1A%B}u#խ";=gOe%ܺ0"\:6r'AvBW5->}c+2{ kѵ~%ZM8mipI`s9kV_v NggFT)-]kZtyQ mz*^IH0=h_( }:\uoMp8WcyT |޴/AOo9G5#ms\/~^ ntlڄ&#eܿ/1ɫW^4֬4aK4u !8j6Ozayi#Vܠ,x *jF~%.ܛ}Zs["#&HܓV|D*i}B ?)( tS)_?UA Oo9KCr>9l-.R:o}S PQ<;~rsZ>mSX6afT@#s|1tsM鿟 _뻱a?!i(A Oo9^+u試ɫyOǽ(!AroO@>*6si%mWp@cA Oo9GصZ7,5KIXn{E}JC+@o"=GrzZ^ϩ]ooX=@,c*# eb_J\x(|@Rj\}w{`kV֗=욏, d!gm+[[꺶-w1j{a4ape`,20qҼ_;J:u}$/]N#cI0o0t].7~?z5YBnmenfujbUl`;|c%'lY `IYl@PINI,5? ڂ=,( 1;o+t7zigbeײ$gj$ @Vqq$MrjiXϩ4r(}˸ g} >!t?\EߊŮerlNXfBT3 8Ih fy"UE)]7#8杺B]'?\BZ`FnG)ӝ\޹[)d{-JanH# e nz$Q>!tE?^vke͉Źq,rrLGlcA=Cwqm|^NLqɐcیnS8=8y_H}CU\p YDq4QQ;[4X_Z1vn#[r?;m`=b#;8UP`1X$>cY|Iv<Á^ݞ!Ŵ1s}ղGw?G@ $_]yQU2i,q]mSΓ{H^5.K\i-Zi6>d]Jd#íH{?$=UԿ6_9ʻ(,' q4HoBJxcr02$ Г۱6xZ+-:NPݩYQ۳%s9B\Q@A'+Mq.p@>#23NKW[_}^K;n^JҼ?ݴ6u#rv@9B:z|Z>/4?/ToZ}mjmafV(I!qd:/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֏5k/To"SCn:?5h_ֹϲM>/4?_֩Z^in!mz=z+#"SCnMZ>/4?/ToZI5FeI1QV|EBxe  txAX3xrtlRiVH70x9/4?/ToO Y"g#+Fb`p T1V4e*EeWi*H˂qMU/To"SCn-_\V-cP>8Q$ ߝQU''SM/To"SCnxbJ\amBi=*CV{ӡvfv(ypUpcsL/To"SCn&VhM??Q]i^71Z[?5_Щ?7G|EBxjB_&fϜ{?W:j>}Ũ/#*_ʉ"H>/4?/To .tn${M١& pی9#SXiI0Gvn]73wS5W"SCnzk?5Q rȠsF@ n=j.eyuf\+ A9+> [٦C.r6J:ժS_ՄwW5k c s [?&ݗO_F 7e(?{)+ޢ5gv_e?p]V&ݗ_ nQ z?k =to/zפ)ju5̷-žIgAne H%7 G}VD^///eo{tf6ZRX\h1F;Nz}3Ee>dFXib{gYOX_iWb|ͽVc;sl tnJqg~M{V7,+ l3$f ͒H%7I8݌qZgv_e;|,/E`k ?57M|3A/G&ݗO_F 7e(?{)+ދ>GѱQXqÁfK3:0Y׾;E<[yiqӜ?w/7lbZ5tRV-\zS uŝݫǗXѤ1n@A + jWY%ᤞAh a[%X";\tIJOiIc _Ǧry&fFts#A/8 d21Wt~-Zx`T7E 2X0p3dsXׄo^yQE$˔11daFr{Je[]TR.<w(QIv iE`k ?57M|3A/G&ݗO_F 7e(?{)+ޮB{LH^e 7e+t/@2 (((((((((F_VIk/e7mր: xoM}8 -o}y/󒼏[ZWU_%y pЮRe:NgK ao$K+H=:]7x[Y/ai-V9CF%dl9g9_W 6(Q@Q@Q@Q@u[Vo7u@22䝧XW6]KksE<.RH` vv擥m[z|:/٤i1n硭;]_D}[N<-^]BY^eiO,@`P?8՜Un/jzlUඝg06P0:gީ׫7o}.4v "1p)%Ex譥[v2]V3Dg_XyqSD}òyulյk$ݢF!%1ÀQ]/Ӯtmwfefck!T.!9eny4;Ac 6OsM,F2ygcCxU򶣯VZ~F I-qlt'8r'(HQEb ( ( ( B{LH_gzE 𳯱 i4(((((((((F_VIk/e7mր: xoM}8 -o}y/󒸯.^0-nx- ʤ8{[_}^K[J`H?|t*rRΚl v={eytCK'YmQ~v(L`q]Z߂"y"| v=ΚlQorDXz?5ߧ(K߂ 3A:kO_DQG+AgMc?t?;c~,W~ 'Κl v=}EX$O.1֬KFP0t?;c~n !<3mL&L0#U!si<{m-2vvg5uP;P 9&RO8#?5ߧXzs ڠKxeFNG]"H el3yybEA ŗG/K{s~ ':kOG3A뗾:⻱[oKo-C,Ⴡ< IdswjA+` 2Õ# E/,W~ ^LJ:kOG3AG,fV?doق3yGEc<*+1ye 76YB6O xA?5ߧXz/W iF g HX{OK߂ (]V%:a֬plG:kO^76? fKs$$4Wp3fVc[K_gMc?t?;c~oNIOF}j'MlB5,Y-4XS=jB n0gߚ,V߂ G:kOG3AE_/H;:kOG3AEib_>wt?;c~gMc?(79"| v=ΚlQorDXz E3"hV~"^^I- (QEQEQEQEQEQEQEQEW_o =z}y&O7㢏 %rS|-%OP$>JvN݁֯pshr[Aܧ:-D5VnX?ad 'daҡTI$I= gg]fuA7GyVuo?_ tEgg]fuA7@Vuo?_ tEgg]fuA7@Vuo?_ t,'LmAVkF>-)ì3cgo\b0QP;2"q'6#F3[Pi[[o|DvpRg]fд <3}{mGSR[C%D0ZF'gL_j3]]2JKYQcەCh(5g]fuA7CE@Ү'Ƌ [%?ٚH2DFA5_^k-wht71 XDɃ~~Bp3_ tg]fw`d-%m6IvyoW0 0*.< {YQC\,A<Cgkκ:7nė^e-`DL1ڳm֩-ݣ,93%.eGM9s(qg]fuA7H vZ _k6R!4{wH;mw榊SOy$<؛~۹>aSNκ:7n&'k trc[&H202:֩&k:ȭHWO @a'#jk6ɭJZĘJHUp!zl"M>XR-ԅ Pg]fuA7EEgg]fuA7@Vuo?_ tEgg]fuA7@Vuo?_ tYgzE ?3}|AեYkbƱnʀ&(((((((((0{Z |Ma[o'oiES}__N:( [_}^K]}:_%^ZevQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE2¶Ok^^a}#/+moM}8oiEak{9kїUG[_}^K]}ފ((((((((((((((((((((((((((((F_VIk/e7mր: xoM}8 -o}y/xCG-w?2{9kїTEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW_o =z}y&O7㢏 %rU>F]Uo}y/󒛡>-c[U//w Isn#8(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^(ס*NC^+/e7mֺNC^ Y5[}A [G@ӎ<7tPVb"Xy ɪ_%^^Oރ9OP?c#qp 'ڇf63n2::@/4}_Aj"T.CJ4!*% €-_Ahރz(vtR%P2ILK ,̊lcp` zg#G Ȼ6>/4}_AjcrzG?Ʊu]nᵋNX@1T$uT״I/p7fvx#ր6~/4}_Ak _h7w6֒M<2˜g8ZĚ995 hM9ّBz2q9P?Ə?Sx`I%E #Vu%Xރk/"imYc<[dbR28=_)_wQ%tV}ޱmeL @ 9%u]YanyxbyFW(B(F+*ĚMv/ LY8R3$`ށsVƇ^S[L%pa8 8'/X&;.azRfW R8n1@7]{lsr jpymsHK}Vlݶ%A7< T~ȏ#IxE9rgE zTv<_ ڴgw[9fU@4VbkhӒ+FEHd$ 8Ȥi1jr_H 9Ve9t4z(((QK1@$-Wurh}o?/1|3{ jz|LZ8ffy 'wH  h}o?டOЩ&A<B>g?pG+*h.OЩ&9ئufDT 3}5^icJi<̒Ill|kO V?+?vchchO V?+?v6/s\O|5^lW卣ؕ`T?ֵImx{+xY#%K"`qn^rSC ;?1Xg.^?Me1E&>|gCXzK0%sGuzo]b.]FO8O V?+?vchZ/.$8]%J{P#`ȓ0 ZԼ=Ly  .^S!d_P#[O V?+?vchKG"0,, 3"ܼēf9wgx+;GwbYW?SJ?SC 6 p$4Kp8u=(5 E$, !3!}6}q\[WKKvfFd}6I95B^-r//~ 1vͣgnGISeMݡvۈm>>}-5;TKY1ui/HGJ$FC@88yf}NaӚ9j,ٔ84P 7niчI&$1aH$|n\HѴ5 Hiϩ0`+` یwr.-Đf>$2DPc! [fnm4[3-1~E,75j  }5LTwg~W$*y;tf8a[?.^7H[*w2px㩢j>U.]D?n(9wG ;38̀H~5!0H x/QGKB`0ۼȋj7$GbpV0v`ElY麒\4}-'HO#k` sRЭom-dK`IܴV=YDjQH(((:?5bJHцI q?@ծ|'{) cqt (<9<; 6[0D#7U l?F?F^iC^i?F ڕV2:cA Y#\b+cی=+jc(ȣ$ۙ5V9=n⼹6+_ܱE#20RTd' u?$Zi e!J$ @widct0NB1Rf69ȷn]A޽ ?^BX5 xoM}8 -o}y/%rT-32G&"LoPq8~ӏ?V>g>߱R)p4`"}N9> _8~ӏ?[7$tkh^i"rdۻ=B:ܚ&cMsN=ӏ?GN? XĒjZUnց3ԞO??q8yKM>ٮou* 4ZPI2c@ς76런tq8gK]B..L@80yz\$ZL,^@ y?'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8 ?>g>߱@qN?8~}} bYϤPӏ?GN?`H?أ_'q,(A~W8UFtu B(!7c$(zXWjQi}]M8% n?qN?XA~P[!6ׄ(t=ԑҀ'8Xdy{}4*H֭'ehJrҤ1Ip0|7tQ7㢀0JjBzvY7Zկ4M&JKWʚl188~Dh4ֺaTT` *hҿO5G%~.SJI |9%:n>ݥV@OŚ.i^44Eluml-Ih eqs@'Щ@jJ]B?V~qkvZt1k{x=37 ;DDvBsZ3j:o~W!-Oxʟ+6m V O::{yoyuOulsQ3cWM+ TI~tGWoqo=gqErhw u@m) (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?x GQ_j?€: +h5FC (w u@m(:6Qn?̍_II"FL 0Q©=H+c ǟ*?ß? ǟj\]XM 2;Er`AӸ<+(Ցb[Xʠz  ǟOhq0|]ǥ V]NYHʟs4ax}|9ᩧE7>{cwWnjOyXs5\Y]QEs.Y7E($Aٞ@@ӎ<7tPX%GIUZג9+Ե=+&ypɥݫH($Ƅο^Xj6v,k4RH5ʔm<7,ر}'9}v%q3M `SWb:Oh?+>}W’^=忊EeX*)\:)g#VTWyz>q6ߙdk+%ʌeSmhZ}imwl* ixrLpU`jxЎe X[ŮژcRHQ~))}s5gv_e?p]V&ݗ_ nQ z?k =toQX?gv_M|3A/G.+_ nQ 7e(SWѽE`k ?55t#{Pp1ÂAo)p=4P1XG "Fw7 wR9 E͢ Qς)A3n\s$Ό ˀ pvpM/Z(N|NGpsMޏa*;:[xi"Bɻ ( cӑxhp:t'8#k6&162 E m|xF0I~QIRa} 3x(e%LqFD[[-$ujߎt+wBFfp#a9%ƣ$^!.aI㍔lcoƬ \fe̐0PC1LaF6Kkiiu vY#oU#"z/n8_@..[M|3A/Mҝ$+_ nQ 7e(SWѽE`k ?57M|3A/G&ݗO_F 7e(?{)+ޢ5gv_e?p]VZl xzR7ľ+Tң{fvLH 0kľ<'/T-Ѝd+פ <kkZw1O,X\\@0}8Mr?C&IOiXG2j$H=AļD82iX~Ke׵bDd;20Y."j9V+WU8V摣Z=֧7Vq;1usl>k4cNѮOOyZ`edW\ѾA}:WSO_l|;]:M9㼞YU"tOʳ3+d7OszftkbZEw#.1vzO[Fcy\<ńY 38Q'oF dk 2ݿ8 T2-uР ף[ck-e[ZT8}҇ظ$  7?jQ,Q~Vdd摓1#/MKanE%`7]6ܲxyH(xI'"hז->TNb?|\č,F@o_4+M2B`4h1 OFoqیsҵ,- ϩ$ºlljûӭӞ;ER'Hyq32;FON=jKik^]C>[] Eӥ]O[Fcy\<ńY 38Q'N|/GVne.oL.lV2+Hde:QKFVUt. GF dk 2ݿ8 T2RŴt[eI| 3w,^R 3IѼB5z ? RXD9f+#$\4q¸Я4u (fPѣ&e=ݿin1JOFm pDq$l 5s:7qqy;"0{d?^qڈJ2oy[ZχS}_RI#;wty@ g_@=8Zd-v-DR}7C1EQW4K9 9\m9];K϶YGq.pe7Rw4ucm-eI {hs".YrOv`$".Fb38ϐ:rH:$k]ti/CBŃoa@*9TԯL./uzvʣc 82 =6#^vg^b]37["gXE r p# !%IxEwb\cPҧ Fzb۩kkn#RK} NF88ݝIuzV\#>X?7gK=Cr=ǚN!vރne̵kjiht7. !6ٸD32+[Jfyz1"MI'<85jCF>p$ݷ~pqiPF[ 'ږ[i-1 *1a9'$϶3[_-K1ebcH|@xĺuk({KIfA)IR7,EOj\ZJmC~#J}Jm:S-ZrG k!_]1)i.?Vǀu13Ik.bePIp7gk_jq$;°c"bYcCORK"М6rg{dDŽX 9RvHNQ%Q*#;n2LdlF1R"zѬun=*iXa{{dR>btn$iF77v{y."yF˴Hy$uY5#Q Z౸a!`I* |5J^iRɧ=Gw !>ANC$>zmŬCtžBe%x3`eDbkjXM f՝|H95=lF4F3)\mp1KuqicM wE$D'oP9$:Tb.]uT<s_i9Goy Frq\dZP=$wcg0s~'H!M6knCmD#³9$\zݬ]եwf-'{ěG*}N溷m- ZnlKdO&`:sM%5Yn^{@n.&ٽA F,ޯe^\O{cqv%Vh 1$8ϯJ^o*= IZ3rKN m21#9"Etv[^H5}"Qӯ餌4y2G"craє{+ {L kgmNeiPQj䗼|CO6K?+㿆?R_kJ3O՚( ( ( 3^c 3^c7tQ7㢀0J[ɼ[ xOlUvkג9+6K`2pw@qΚl v=}Evib_O$O5ߧi^db}cݏG\Utcvv7g"}z$79"| v=Κlxɦ}|{7d0L0Grpp?q,n2e/2(SWhgMc?t?;c~Hawo3638/4QW>wt?;c~gMc?uR]M[m~+ >88XJmRK8gr+O*ݝA%q_xy٣?5ߧXzyz?BX'q5KuQڻI9&iKk)ebm*+X=rZE# L]/,ms˿5ߧXz"_X'Κl v=}EX$O.1֬KFP0t?;c~U֤5-2/oLP5+yn߻ib_<Xz?5ߧQ4`}}ygk'$v`q uA7Guo?TKFZ\' ykw0{I6ؑv)Rp,r*ʑʪI q<09c:7n 7kY27syjd oڙ \|݁#i_ tg]fc] =ߕpY1y0 ?fvsE][}v7O+K-˒ȨBSD@!#%NFk{ML,!fhHP!@~*E$I&v+mX@ N?@h[Ywu2(g7(9#дViYR[3C If%bFH@ b283}|ABκ:7n g*E HU7#n.70+(~K"MR[w]L ̢!/`a.Hd[X{ :m\J0R09FdGEC#H#ҡMY`vƭ#9Qe8qE k65rgMrNqJ7Vhy(=w.uiOjFv|E T)'yPi~ [вB T&Ld,}3B{LHZGG_ՁQEQEQEQEQEQEQE`j6mye3k-89xSF4JAF0io5憫^D ycHfcsC# zAV/l9m.mt$=;{w7|C[:Dwϒb)FkF뗍S Z6ޤCuZl&Mf Hw Yk.[V` 6T@c\dfBN\g\5;N=ٓ")\ e\z l`c]"׮t8($R&˒]1|įexu^[uhwh/;Tc?zķzzⶂ9Ta._3Ȏ,FO'H"!]ayż2S[$,bxX(TAE6ܒj~ntFubsk*++P[Fsi}J%K>%9]$<N㱤eXdS-vUhyݸe3i\ hF 9ǥE_Znqţ4CU/"1$T`319h<#X[| Nܡr+RQ?6QBH 3㷷z;꿭[D?Kz.Rv2ެ- qnnTc"5n\ӯmwcwo0ۖq׃NEOFg?} ?Z(((+4z_Vk4z_VhqGӎג9*imy>;xA\0YP0΃Xג9);o\(cah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+Bcah t Т3X:Z??´( -V?G@O (? GUQ*+BE"f2:qW ( ( ( 3^c 3^c7tQ7㢀0Jn%N?> vMпG@EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP^A`ҳ^^A`ҳ@ӎ<7tPMпGNג9);o\(袊(((((((((((((((((((((((((((+4z_Vk4z_VhqGӎג9);o\)_%7Bm`Kz=Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yYJzyYJvS}__N:(q@Z_%g.xYt/l%x0^H l%rU"vP0>ր+olr1V6Yyg=# 1G&)F'U?6Yy&)F'Q Qce*? QolrXg=#e*+olr1Uu-FLK+Ne @:<`ڠУc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc(?((Уc+L8'$1'$x3JުooM}8oiEakyu%Qג9*>'JEPr3 oF@`F:$iA,qW.$)mǞ2<̤JcPOHp:IA/J`.цnzh]*C沰Qs!@<98I hˮ0*8Qӂ"ȻA&ܮWo 'jifiUCOs)</_s/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|ϔU~a?>/O\?h} vh|yTAi*2`\?h} zӎ4+ю;'I'?././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_attr.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_at0000644000175000017500000005003511520622616033770 0ustar directhexdirecthexJFIFxxC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("a   !1TUV"AQR#Sas2367q$4BCduDbr%&5EFctã.R!1A"Qabq#B ?jq&!MJDbB#0^";~1ȲԢ+'AUj$N:ʐFr͗d88H%I)+pd6IGxGQI$Y/e^JTY&IDv~KCٜ >Lvpoy"Q]ZZBNޜ⭖fdC12,qg$7ܔ?q~V81Hm:Pu$dZ.8^1jBRH&uh!hQ§YTXS-{1 >LڗgqVҒIJJ鲏Ne\IW}(5$ ǰF1+%-ܪ/+:$W MF3D6^q"&kqOU=}EOj_x؏G*G<%]5ߍԾƊY\i%]C0# Zm$ԥ"/)h9KgĔ05nqLI-q'ʴز4責w Je7>LeqFLΘ-לJ6JJ%!FW=0A+=&| MZ}#j$xI5*qIʿ?s{+:u^f'*8.dԧuܐh TJ[56j##$NFڄʞ ȩL.BjFqMfI Ȋs1^X5(Z3j<  JN"b\QCqJwCdDd^QǚQTQ?O/iadu2ڜudWQ^S<5R%V|r\lSΆI\4D#%+Dd%kE[dk&#%VI&zKMqQR* K$:C+R r I=VQAIg"C^x/72W%Fw2txs%Jyno>ѓ$q#QDFzKE7NK21# %-K%(`%grofܼDTLjeӒiywnfz-s6#\%JӑOQ.""Y$Q(Y$$E3SǠE4wTndMgsQd*Ix6;Cu)$.RaKJδQdlLX4"5M}qZq>[&ɖfqHJ ȥ"rқҺ$F3S "JsSH%Тr[fPt""۔|>\ %._iQ܎kّAO&#CLRl=v,Q(9$Jc9L/c14O>QҖ[}8%r ,&H]v3q}..Ji3'QMipd9lD=FslSё䭨RfSEP%գTsz#+SN"3Fٓ%(2}7EEPrRd2ٗ YHiM*4iP gSh4(mƜA3'=Υ̦MF$XW0 [$ӢA#2FZEI,JRFeG$DJVےV᩸9e)dJiVb9'䢷U% Γ'e)wI)MOiƑRMMQI%9h4ܙ#4/(V2&:D)+mTӒLFҋd9YnHpмVJiGcdL+#7i.d^7_\P0$=3Ρ,JQ-hd,Hұ* DSpl4IdJ@.f|U8CIՇq&bѽX4h%ɩp19$df'g=)dlA/'OEX";αpͧ}w ĊC'dJ[LMNmfdde{[`A~$q?m6?N^Vz}Tʱf?*Kbb%+MK|fF>Տ}]$D(RT×%$>R=NlZh e INRTV27#}q؟dj&V%$"I V+/(+Sxz8-풴)(#i&YEcQhwͶT)-:- Za nV7)Hj3B!?QvPW/ʖˆLVo\|pwYɬv?rrVN&:E:Xrau٫IDi^)XwèuTg%-2S d]$+!Ĩ߄Ffiѓp'Ti7"哑b@#B 1{CĈUqGj!nI$+!iRfvV[ 5U-¤h /=RHԘ_J&dEr"/c BTd-N-RWN3=1(i+﹤Ez?hc.EQ]N{=9I[92ȐU̔#MԹ{?&L:sj:$%gd)5dn^Z.AVY0EsF =6U8STHu͂SY̔9{n.-D+VMxWF'\Q~mNy7qF'Q~mNy7qF'dYvhrKMJFD\  ^If&_uA-jQ8II >F4t4_Y2TJq&!fJI)@xRjICLT9Iݵ\ >4(i4R"̄?+9s8풳o,ԢIVJtxa|,4D>dfZ \At&MJZIHx6 +źCO8Bx>Y [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOjxBx>]> [t<TfWt.xqn}Sa^-к}źCOj +źCO8Bx>ɸ]iTҫ!" 5ei%oKE#w;[Jml֒At %JTeG{awX+4* |؂܆l%j`{Ec=t UNQ?"lТTTJ}'GD!OvsJlޜՖG,K+䗌7Oni"I)2Y,c8YA6dv3Nι'$EԡTh}8E:\dnCkim|̔Ec"3.B1߉vX\2oDFnBTM+A咔 ^M>E+ o6 m52%4'QrӱQ!;϶u6Ҝ-hdĤ~egK@MͦNNL5d |M5iBzrh8 ĆЖۻ ЂIOy ѦFgq%z,4,Y؎bƲ;_$E8rNHM yȑ1rTḦbƤI+_H㧵RNMjGI!2Z$])e$Ho0ץΒhq2Mv$ŠҵJtV>3`NgdPj>^ZCYrA6z,p)I,FtIi9k5r"+r_)x1flfSYtf%[Yie{ ЩFk!o->SK5+GYbbqGK92q4[2tdG$XYAr ԚM5z\nSJR)m%+iTer`=kGf]Q٫FcFm 5) Y,RI-s,4dfFz NQ\j4(\:kqF0FFj}|#t>Gf]Q٫xZÒ(i0 ԳKXnQֵRRƗMUzJv5R-6* R2MJk]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf]Q٫Hpt[!:6Ml]Q٫8Cvjipt[ #Cvj5E@o5i5Et>Gf!:6Ml@o5?t>Gf'R$qI\,$V3"|%x:F}Cf `i)+n+hQ*nHנ?Q .?/ѯN܇sE5B88EJJ'o%<rkJoͳ3Q8Nh2I?.Z &)XySiqZ3y,/dR42wz!1jJ#-nZB֜fvBNeri;CV [|8ͥKuռe+k^QK}QU,NL pИ7M%$Iu Sh=hģ™ER{pA6B{fD} 6͵ C,K[7%1XP)Bm)TZCPIIKUgw3+wܖ\iR :&`!Zd&fmH$gILȚӰTnDj!zzc-iBPS%(RIiVeX- rqH_g!~ (EØjCYB3C1to0)&v PДDZTqqXRFh"<"2"##- p/̥)DdC:3tJrjϸJQ和FV"ơ˕&>ye62?kKFIJQm6=ٖ~IT27p\ETh:H[Iei<+6yAG4F%D=7?d]޵,Kme_:D2' DY ̳M8&Y&RG´UTx\CiyR"M[dmY̌rK$I2l%jFbBb3 iSe ~Sls333333>Qg[Kqg[KJsTlvsTlv>3,~weo. }iRղ|eTlv>3-|~wZi&ɓM NArXwiRղ}]iRղ}ثUNBUIYԽmXLe (ːRʜ<-)(Zt3k\6K|+2P2`H#ɾk|w9KVaw9KVcUu|bKWL5qɬFJϓ96d$ebiGPa(٩>d68n:FM1%23 ]iRղ]iRղQJD GZ~aG]-[+݅-[+ݏ"P0ȣ.WsTlvsTlv>s =B "P}]iRղ]iRղ7( 3 =Bw9KVaw9KVc0ȣ.7( -[+݅-[+ݏ"P0ȣ.WsTlv_4j^|z:$2?W[ײmrޒO+iRղ]iRղ}ئWRi-$SMC~ɒo!VqI+̎Ex24i!uSJ$F3%]4j>.4j^Q3-|~w3,KMsJM6QǦ<YKISjMAJUc#2ɦw JS$Y״[ՀUKHxpUKHx`オ\Got|0W$EuʯMk;h8vش`Ҵ?! 6?/ѯN܇sE5BO#<#( _+YH_ UYo7O&ҕ=O9$+"5$դt%ndɥc 8$ޒolfnrv~!\ sK olvI]&HSNXØ0mM4F f)?ozkC?ƝNĚNbMVCWz ߬>Sy?өؓUiI d?c{? ߬>ozkC?ƝNĚNbMV[!3Ngv=ѱ%%KTQ7SgB~S&dHp6/efi%yޖ S2ZgNjY]ħ*nC魔8h#ӡJ"+WWu V -KzDztؼ<Ѕ16ˮ?\ZCDDVO"rlʰdN'vN[ӚNQ_#ϡ$Ydmt$ȼJ;XnݫĄ;)YҐY(5%$dQH[Zt*;Ӧk JiY.4RNz}$&gdBuVRaܙit'\A$eJJ^ v3=H:ޟ+MɺK"I$JLA33񙍰8SW ߬>𝍭RxөؓUgIzr3dLDs PQ_l#n-fI#2.[!) -dbſS`J]U-NRYY(ѧO; Qiu<_vfuu+-N2ŷTױ$S`? Lur Z -11U_O NEqDH3O&J3H^p(WYOX8IșIP)] &ـऒVI"REbal' yxE=mǫTq؞mÉ^o#_1S{*b{`^o#_&ymlzOOl=^&yml8E=?g=bl'yxE=mǫTq؞mÉ^o#_1S{*b{`^o# c' g.^{rJDMI%.Q3.NC1큌,ě́BR40a/)fD3;d p-8'Ɂn%\!ZMDNlcp֒#22Qi[2 pnJd$4a*.cJ1sy *CҌJ|K%b&]Ѫ^ zKtW}MDqFzs-ta蘿يRW ?XgC?ƝOĚNbMVm}v7=K!?,cz&tcM4(ХZH!UNbMVȝ[P1 3bƁ5.%SƵ% #2I_Gc%«F~jbSURn lDSebroˑ|Z2}^q.AjQ&C#3>S̢qL-w@)Y`,4t%ede/rk?rksiK*\<[%ȔGe*idz AHݏ1jgR7ckڙ9˹kS!~PyH_g!~ " DZ ''|fK_cnόTOqo9@-qo9@-qo9@2tqoqo9@21'0G9 s9:o8ao [0cžs r8 F{S?0.⑻c_]G4__."k/BFPW#?I G>2Q? fBop|e@̄c_ n3s r nC9xqr3a/H_’eqL{Ј˥j|0euɔ|s,uV=JI-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-VmjGzX-Vm#v2ضj3s_дmZL23T]Kͩ.5փ%Q&\o,{hF(\E;r _' 1|F~4gcħ#/d_1Ÿe$F">K;@to.h]{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~phA{B} ?8g :7~ph@R=L9!I(o$yekA\myr(E? `ǹkS!~P?h?Hg T`aFLNxmG;d3nf'q9풌lȩ̋JL!Q)Qɕ#Q뒙BI$ A.^""!68ʅuo#qD)FJy(BQ߲|߲|%! QF)I%9G|K,Zt?~g+/d|do/0O׳5O׳5"8OՉem|*d_~f;O߳5*:*u&\v#9hCfI)+|U Xz̧'ARnXY^o<llP);!V$sp%&dQ\Ie{O0O׳5O׳5"SBȒ*3=1$:(ObQ̏Krr'@%=fk`sd3[#?-^5L:IѢ{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^o>{^(|滯(|滯O׳5O׳5 98 9ll>kk9d{3[d{3[No>{^S$eNkk]v+JuRrL+H⵼gb\Vz ?±FKImOU 4IM&"SQb4$ӕ4Ndt F9w(F$r\y*X~{KfR]FRKITI#a|ztg\g,ېhF(\E;r _$?#OPG'փ@<"Ô<}|cMZ |κ棶Bȉ&GRhoI\*XD\SQ:uIqP^q&jX8Q`bTI#h))̨Ifg㒐_mIKĨLߤA-߈YY-*6lmԲmY7 yVʱxg wAx)DIkH} |X5ĩ0g~d-/+"A1tR"e >}y-fړ08]K6fd_!7v ߜnPkg> |Zc'MH˄i/˯ctGqkn)+-c#wO!D)fgeΗ)( VɿQeO6q2Y+6ӇdD &WO #Fm}p]iDŽ&3f$҅+Ub22";1{Uߑ:|Z BXfQfEfBn;%nygfL:pu&qEr#.ji'3J#2#N3FgG*c~ ]8_^i\j/4ۨ G{Tں^q)}ġ+xN$e䑫;{u .*u[,q)Î%pܘFQ Zy95"$u|er1 e+QJy i% Rْ='GWOc#5 z+\&j14! Z#m3p"Wr(dl,L0Y43?KIi#Jݳ#-yW|l~ ^,e,Hv&|ӛ7 33J;\db[I2ʉMM?,S7wq{mi\l\&*Ӆ40D͉1Z:,xˈb;-rY(BI)+""/g Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@X@WWmJ}p!۞=[sҟz+z>{qVއ Oa^\Cշ=)¸nzS@XGGqVO2굂E(1:!3'r nC9xqr3a/APɎGEjM:ksj-QQ%a_שaY}uO%yu&ʹ)Ld(d3;?amgTHXmF8iA.Jk<*+BK)V-ajc5jAq9Jt*SvIFYGcK']1UUOI|Ș*vN2̌8Mߑe EJͶ33;LWS5%PAH&BRdI#?WӧF8;@2d۳",wiMD3iY7F^!fU*=R$SN:$2 7Y< yz-b+gѝ57&ȨcKƝKwiI-JYRVN]dWVQ6+h2 Q,_dCͺҲI4)RRTJ!ۚ˥Ѧԟ9-)27o8+m$$ڬvDDVD/|,h؜I8mMi jRv[KN C]%$c#-G`u#'/A'C[ X(Z>q 4>=+u@ ZG0P:B֑Ɣ}_at;n(`kHc0P:B֑Ɠ_at;n(`kHa X(Z>ҏ |8-il8@ ZGQ}WA`u#x@ ZGO}WA`u#8@ ZGQ}WA`u#(`kHcJ>:~_P}-iliG}_aOӾ{V `u#( wc~0P:B֑ÌP}WA}?Nq[ X(Z>q 4>=+u@ ZG0P:B֑Ɣ}_at;n(`kHa X(Z>ҏ |8-il8@ ZGQ}WA`u#(`kHcJ>:~_P}-iliG}_aOӾ{V `u#( wc~0P:B֑ÌP}WA}?Nq[ X(Z>q 44y>|8-gltjP*^qS0f*tlEo=A.y 3F|)9?"23^SlYjnC9xqG4__."/APO#M*V7B*NBr*y+Qѯd%!cZF^RgMǭʼnRl^:S>WL5[X+,ޗNLP:)s3LD{_ՋZbH#S)7ekh?OkD~i>tD&BM%*|ԙ+WR跈Tfgi=mG31W #s> X4<74CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4-b{';܀slD5ൈ:I 'sm64CQ X4dn[R VNP5*Ң4sg{,ʊF?1YbC1NJ "8]unC9xqG4__."/GAFPOM+)?/b)?/`)hd]#v̀ F?/ѯQܝTZ1nr3a cԒlN\V@Jn!ϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfPk V5OAϫՍ{SpAsƽe c^\jz@a.}X׵?>kڟހfQH݇F73s"ϫ ҂zUMġ:Iv=%D ADG'>././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_interface.htmdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_in0000644000175000017500000000715011520622610033753 0ustar directhexdirecthex OME Interface
You are here: Object Manager Enterprise > OME Interface

OME Interface

Once the Object Manager (OM) is installed you can see it in Visual Studio Tools menu:

You should also be able to see OME toolbar icons:

././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_query.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_qu0000644000175000017500000004337011520622614034013 0ustar directhexdirecthexJFIFC   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("a   !1TUV"AQRSa26u#$3q4&7BCdsv5rt%'DEFb)RA!1Qa ?EPv;TI^BHrI/I);2R{bpՒ^e4aͦj-Y(ZH"-PW3% NѤX ,wjo4duw qK JQT5%:wfUo~A)Sbm.Ae\*+AvAҜ~ANO I*MM텙Hf;[*<.S,"LD%N[I2Lқ:h$HIQcۗBrkn%#5U7BY*BZ3OdFfV/wu)gڦmkgT}N^F|转!u:f>H ر&+N:Hxi'~GRvTX{Yg6sRZ|ZT̔- W$MFa\TĈr[JVӗI(̊OF cg" |F.l+ɔ$mݺÙ $eJuZUl#Q]d,2љeCOG88/:ynG(}/jyRbB\ED$fdeaU)$',(ʚ3">RZJZU)rc%gKeKorlfYjJL6+oN.; cu-%c$"1#d#&r Jj+4Ǡ,+l"R+rrCIRrԥ2EktFU603ZlZAo,?wwm ue:jX=e $6$V;،"r"G򒒻jl723#W31ʱKɣQ9I|#-~U"knLmÔe-PIN3[55^ >$(?&d Q8rG2$&Jec\)bVIJm2j۶sb2Vr#Ҩt86[D ISYrJVNҢ6Q+BSXXR16&Lv6TIjDf3L^XEpf4N*wQ&9JQӐM%/&7-hZUB-)m0r"(8I(YW>/!`#1bdMd64Lx5"?d7YS9 R1T\^RrRجg+bO&UJy^"BrT~MIo ҤB>Ѳ!֪ Z뒉#+JzD'c>7#k'Rsy$f=ildRTGFZpJT!pI*. #Aψ\GJ%"y HP~3Ҡ@ `Vz2u6O\9c.־NYr6{:T&#![R|a.m0qnA&fM٠REcZx8sX$?Hđا*fAK.%f vJT*Eұ&Tي]vC>Ct"I>J"hFdJ4ansqW!ke%MILff|Ghw-ZENǫ3ÆdtN>`9";jRɦ!i5\ 66H+Mv40(uQd5UnKjrKit:iJ R d7_-Y-Dgdv"#3?"3]ydֈOƭl@ŸZbg:)JJD"C+$t)=$fC"+f'G[&scNC[l2I8D[!Lx|u/<dqs-Nqk[=n(ƍCpHuɴM>{!gr$RI\WJRt{-?ļG j47ZGA/g1_wt#T;`:OB'ꅁ9}I25C ŭdjp}IR5C ŭdj sq_wt#T;`:OAZOFXc; szPֲz5BW0o'7djѪo )sz Pֲz5B}I25C ŭdj 7}sz P﹃x= FqkY=`ssE}sz P﹃x=FqkY=`}szP﹃x=FqkY=`}sz P﹃x= FqkY=`+7dj}IR5CZ ﹃x=Fwt#T8Pn}IR5C ŭdjs_wt#T;`:OAZOFX +7dj}I25CZ }sz P﹃x=FqkY=``:OB0o'-k'T,0`:OApo-k$ ]^;4m)_sQ*өˊ9-!֝QңQiIF_$R|cIo |EC uD`DFN);iVӀ(:[b9o֜нޝwrA^R-:sBp:t//)QyHtv8Ν gcоw(E!ӝ:ӆ9ӡ}8QyH2C:t/ ?N>Ao0O)LjS6;FeV3lΝ aInԖԗ H^QIOUh926Wb[,x:c8uL48d #IsW,hy_CK:Q)~ّ̔(cBUfFDbmMiU#&mFdla j;6J )֓uC^1NDleAFaMҝr2Gc0~B\K3 $DٔZp1i9&ۄl9f%jԼ^%te)R8FZgl#,9OF%6ŷ^{!fj;ӒDg{;p 9d pK4ۙ+J4ܷ|Q4[/3LFqG.Q2;㌭[eInyAh"41s9k>tN9ʑPìSom6⣩VñF{%qc⟏4kL ev H8QҔi)g\k)H-yJ5Nȝ^xcDM8kAAÔM-(xJ4^ĢGJ~F=AכzQőH$ ,;r8f&3~qZaL+9NU\a eO!?֔QfYMM3UqVf pz 30SQSI)%-k%;cNw_t-w-RyDԗ RIFyfMd,LA\m%b'gEǘv )hk|c+gaKlYUp~*Sԇf4m"FH56(;µhvz:)(X\{8yM6S9i+dsד@yn9rۥ"i-2N:hZTJi$Dht̔i-^G#S -TeR,%(IEξ~T[`Ek^XQ)8n|n)؍86mLH^~d%6y(ee(a)$IЂ"D[ $wko hrs3?PlEOVEMNeIZL-.hUAdesCCHmkm("i(lSdZlzDU'*U6{̄܌sry7okothTA9ClQZ~ž!$k,Lk t?Qj4[2M9ƾ¤6DHױ(R$2^rDTɎF&Ze:24(25x&Eb!/0|Cmu(%TD > 1Nw4)A[RRae%(Zi.I$(: Db+z$X"P9Z6I<#.U {e)m9!S+A{ QMxm2Ѩ%3qo\0kQ65Z#;2ӎ䷖T &!f%dD3^Q_onQnj8j?-QbfqThn6ؑ" ՗SK scfJ<1ccaa!gR#+LZIdeH 8j?-Pݺg G幪#is=HP@Lj6Jm>n(Y!uj2"Ut@ѩ8VJPh-6ZM m SkIW%Er;v5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ۦp~[tsT`͌9Ɍ9u60&0SEv5n33crcu4]@͌9Ɍ9ugݺg G幪L5F ÜÝMP3crcu4]@nQnj8j?-Q60&0SE ÜÝMP}ڦp~[RÙLŐ$IpȐP 91.Ttf0Te6 ;A{NQ̓b3I_AMM:|ssW@}ߪ13OYt/ףbԘԔ]$4ڂTZ^ud{赯m.RYtn/#YŦOZxld;zMġR/Pby#%%̔(#RVe_-:nD<,Kʔ\t3) MHAJ7ϬkQK_센Vy4i$m%:Ly-{-gU#J,QuH!s%Z2SF[&VDd{Ţ)&:7Jf<K3Е"!BjJ/O<┓BгJ҂RD6"2 GrrafDLѡOBe{%"e͖f[Mx\f.r R !q.7U)IFQ&#֧Őb/07!1+%8vւ='/rsf(ꘀ\Fܝ)Œq]yt.[wa3^*"5|ۣ tZM"ʌ2M4,I)lL\ȓliYi= 8{Æ6ydRe:Yn+rI8IgkzluFjkv.ϖGRH9,ӢW14dZm]J^ɕ A +i3IK Nh0D`&"D(pFQdJ2=gOQ)T 6&7̌dI'6V[79Ja9~рf-m~CIq&KY;o[xrlM: ĺҕ*I(#͒d)~r2/F(ZJ=Jid!!^؎Qdd#$,zFޜd!S(Y#$6Zj33UffffffzF)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>|1”)9PڐDs\iҟ8 S#IdG1*T٦ݔͶ̆(q$,$t NߝG;~w} x»%,SHw`ZIK%8AD)3VύcE| ܚ<d^IN`l`vu*1m;r!LGvmF̿e/_9}?ORk#'~qǶgo#^Lfz9dmLA}9JŕA-?̧%RfdqɗFQ Ȍ%:G乑l`l`ᚬ8KI*3,Xemr/`>>)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>>)~r2/`>ߝ`e/_9RF|k,hgk`c JcKvCjIIbb#%wgmVӦV9$ѐ&Y!n%).BZ_>b)Df`f=Mr^^yHe{ΠY 䨉ӼCGĵJy)4ft(%)IAjBM^Ii2go?dgo?dbRc06vOE!x%Dj,?R3M&KbLϺ |3<ڟ~Lr}`09~ψbx }> OokS_b1[ s\J=E1/!Vd2LiIJ0-e!I?)Kx'r_sŮFx^)*Gr2%! iQ)`*?;7CT@JwX3JN ?ҝ ңS|49Gu4 iQ)`*?;7CT@JwX3JN ?ҝ ңS|4)”M I&R+\&gGڰ1DdJ2=&G1㿾7`HXbE*-Xےem iQ)`*?;7CT@JwX3NwǣuhiE̒[Ò>3ߴǴH %gu!G9GuhsJNiQ)aңST@JwXo4f?ҝ*?;GuhsJNiQ)aңSxJddq2=֝NFhjJL̥W jSDiiFIiQ^5BNI7$gs"|| Җ^2Z[o@=ҝ ңS|49Guca"jBWYF;&`| =Rz9^w꿌L'sW V?,+O~1w%Gw꿌L'b/1d_jC/kj?Gr_sŮ)KAp /w׸>!Ubg1<+K~) okR_`:~_QYĐ!Kԕ2KDҕIۦTv#Q;zkwĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT/ ĴncT7ĴncT.~APwU#,NUTGaSn5#h\ƨaPϒPaE5hʹj-Iq۸>!Ubg1<+K>1 okS_`*9T:c=vC(URIȏ3}I(FI( ;eL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶iL׶0 ;iL׶%L״@3k)ٜ>m lhɏkJQ| @,m{}ߪ13qϻ_&|C1[☲ V?Y.~ N.HdgeTKBm+&w= 3?Sq[:dj%VNG( ;.[u7rlZHYt+""Ô2uŢLY'-Ejj$ܓ\JU?( ߩ|SRGEjB٩DiV%FIA,̍5&~%hWRTYIRq@E/i޾ a|*_9Q-[cl9:U{>/t*|*_9v#R jF%$j&3Q'gi1Ɩ֤EP#27{Sr6OK1N1*bqT,_w8MlIQ8yTGe$̞; SR6OK1*̭wb*ʍ@9*I S Ĥh' TTs Щ|4;FjPáJrT2f4x؆jtʹŰxt*|*_9TTsQ5X_Ywr-Wtu}>/t*|*_9 P/ժ3YP7kZŭ{Gz7ۡSR6OKhw[kG ~!Ҡajf*|MiKIfWI_Im a|*_90J*F"3=ܨ3"(f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0>/s7eK*?PL*]yQ=SR6OK1gRʏoS<ʗ^T~oTs SRG3zT2ו#>/oTsަy.@f3̩uGHOK0;2wG3zT2ו̫E+NsM',?4+H{K?PZ[BP: dm pڍȎ;@vXK39fW֥Ge(ԣ3R{{tgѩS5(2ިJf,udWSMȯ  qϻ_&|C9~ψbx+|W,+K>1BBܥB I f*ʯܤi[Lb#2$s5Eb5oicJTi_a*7bYJQ8eܔeOeቤNFN^QI$Y>[X%&re˲W ܖ;)= [JVJ~֌!µwNMqN&XSJ"6MRG3o!D~5o | [hFif!)s98ʼ19 Y/X۾]ɶ]u76SdRYI_$hSKm~ M̮$F;XRYUW!fKr2{+7Y)7DE4GG'GeG9i,䓥;/w`%8KUpbNL'H2ߕfbs ZZo+h NRjæffg3?_WK6 =U}5Z&buKV&!>.Myso6ObBj.ZjA!\#;*ZWd'Qy9J͉x}h ?VY58Rg.EJal 4!d$IOA fW+j4jIq( Gehfi<+6HNlM+C6'rs`zw1˹^-wT'}b!|xoXbi6ģ,E'µt)\>R&_<Jemr'MlhI)[ K5BI)3BF8 97<38s' u("LִAy*QJf{zan#!o,Qly 34" HXsOE+C6fl9?Z(N! CK&̒(JV߲c?9CSuMӯtpDfo&c))\i2q BЬE$I2FGkп^JoJf<2/&gGa|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!8!~pmWS?8{l(ҙq_CLJg|Q3H@G+})gD>!=ᮮA?)#_q_CL|~eYn*-^1J}h^U>Zӿ @Ubg1<>w꿌L'b/1d_jL=5ZGphFL?&i edEՐk"i!܎{YLe0r$m;9hI(c5 "?aiw&Ҽ_ꮻY;b^8cJvZcɨː mIrZVf3O|;Yʋ*e}vtv#[sP)?Jv{F=JO@,XOSqlz'.hm4$ғI_KAQGT*tGZ"Ov!JuRGв4#/D؂L\[[T't'uJt̒d*%̔Dv""ʩq|wY 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX 7*=ܪ{E` r\_# ʩq|wX *= ; )7*rU'|Y }Xm}ߪ13qϻ_&|C1[T☲ V?ܗ],%x~ "|͟e'*n?|_xp9~ψbx }> Oo?iS_b1[Tr_w'ܗ], 6ȩgY ۸>!w&m-*$NJsp1[T☲ WXoO~fܝ*Jq&DuL,=ea$OIGɐŻ"mc;S@.gOz' ü@""pmxeP$\.rofII tb[-;6:M 'gBClDz /0Φ{aS1P%6 PًdBIT%Ϋ,ƓQ${f草f k3|ZaIQ&* 9مre6IO:fZyFYrRJL7VV:dQ;){%(t"44dTAA"!{K4hfJBu$9ȥm4tb:2(r}JY -dJp+L"8iIfJک(T4\c2~>Qg& ܳ2qg2CWo2Ijeb7:2e=5aKL[3BIm#5))A*M&gZRQ䉻2O"wE֔!5eN y \?*L&QMK[h̒ Z1bv.D,T|:[tl^KwԔ)FPT4!0veڋD2u:diSUM$j;QrbߙЌkOc2~Xž͐2*5 8 ~ y0*"6doH܊qȢ7~jbR2$Fs2*TI0aK?(RXnY溂Jngja#& 1E]4LFuԎd!EL.) -Y;y(\GSfX~KL92Cx.tGCŸSkR)2v9a(u& BfUeCH&=Wt^M 9FDY91QQPH'3$?L jz5-L^f>EOYIIΦi7jfHf.# ܓ4 h"3IT51b>Buha&IǔQiR'C šJ ʟ`fCb24i%>"2!&[ILT11&ml HRDH<$] 4uBCLZ'aky֢7J-iQҿD614{vddU#\?,A; !&5 гBV^I5JXr m܍dq r\[JPdJS0q)CrC6Q@L Y>xWudJE¢i3:g?œ\miϖ5|A='J س̗v)6W\4)ZLܢ 1'$7 (qY衫:r*LB0bb:6VFvS"3c&mB"}jqiA]ca+V'2(9|YڒGCA\`Bp j. >PLl,a-)f ~R!w NْzTuCn,5BP'lR_pCP`dmNZX!ނy ZbᢘypHpҋH:49[8FFM.E:BAP܆&42"%~ZPI$̦U/nSph1RH%ԝK> {KvN Ӑ Bֲt4M44YΔ#1񉣑Sң\r\ ٶS*Rĩ&ddf\7'Jg3f_m8(D-n b(zTt<\uKfPJK DDn:f>Gƥ$N8e$s>8.ᡸR6ɠ߽J̠rUm賡!:b2=<;TuƞCK"_RWuְ]\2* 2SC}%t,tf$K-˘M- I)*sbډfɼ1 RI_rCQ,dVjb` 3miZׅYiuFjQ!رPenKdxl˄R>cB$ZT96\%6m)%& Bttgf䖤fk#|\=99\ضU-ŢLJ##QC܂٤$:TO*51s!#*f8`:alESLϔ.f1M`z1ضR^Kew^Mԧ?ej !g.J"oCC*f04!2F餖pR'9*CdMJV%7g,œO@$bnSNJuּB ]k>GӒu QZ)MuּBE#N׈Tte%:^ +G"%:^ qQINJuּBI!N׈T+)$=9)ZRHzrSINJuּAxe@bCӒue$%:^ P]kI!N׈T+)$=9)ZRHzrSjZyE\$ l(w]JL^]#<vOkeʘا# IoPδin%7R7 6 ښy"R\B+ Vf m&m-2#$hu%6MYK,˟m;V` CϚIpʗk\Ggd1S<$d\!\#%s(ӚT:qV)>XKC9 A2M) Z43$gU-DyצT2[=ghIk61d\C&tFfDjV+B z$)y< k6ycV˗"m*UL}fFt@m\Q$3 imnV\VRIFt*fgyLK:ڐ{;gpQ,* yÍ6\%)^Ihe>ձlҩL+IBA? Hs==xhR#6QqiIׂ']1Sg,Ժ^R\4d̮>%)SrKR(ԗRYTMNm2}gv|_HAŽ 4K2PJ)idU2 ƭlaPl4J"aaڍm34[JPT5]".13uMMbr6]n9%O4Iu&W/fGI,֚*rrkCleJI\#**5|;f"<#:mLislY3 :zjմ8QiĥqF Q&Ec!v8ˑ{B䨗% LId|%*I:-jaϟt*jDKG"&Qm)l>)H2rZGR:ezkf66D\|2jTIok6!&dDiM1q;M 0ajj)-g iZ.(T3*,\"qmiVڙjvoUؼB '3( w]-Ci˘)!&ˤqt6sA]jՋ/ cxwV/,]jՋ=0A=0B ލXBv;ѫPC*b@aF{kemm`{kzP{kz g~. g~`{kzP{kz g~. g~`{kzPݎ&^{Ջ/ cxwV/,]j)N!'P߶/9";ۑV}) >oUލ_W|Xl.{zuwWhzwW[ލ_bWh_.z5 ލ_bWh_.z5 ލ_bWh_.z5 ލ_bWh_.z5\cN“Mێ8N=$%0̻z:͢WGI+O$ eCDV~ z>cO1m=D& UEMIK(qDFtYkB> U\tpžgʞ낛<6ߟ3KO 1Bhb'M:LJY)\%DM*BժK>NKDrГuaJ ZT)DGtn XmoGRjCfM_1jP!f3JqQ<#Bzkm)5p!JKvB0!lzfuID$I9 !)#RǚEiR#"I2Dȧ* 9Y/@xgSk]Sk0,̠b<ijZI.#+ј|-4DL*G4 B'Yg$<&fZ%h`0jY!TY{:>A]VG˷ +7i8 9 ݴ8٨ȱ2;:S8E!ShCke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@Cke {6^@CkeY[IRwbΪQ$d6x[Ň` fa7`&%Ӎ6$A(%/X~.jSѻ[K WYB36}%_Dܿ\D;CK%h[xdRHf 5-WR#<|Edd}POA-w3>n 'R<1 CRdhY&16ehZ=E#zxM&F\*A2HT/]L3UX:>la1-8F$?}hRJY,,sSkk|c jvҤ%GmF_MҲBx8^ Z mBb!VN 8wz"*Dz-[<A+8Ɠ2e.RiU3LcUq=Yy0r!J7殽 M A -fqŦRItO(ڈ;`%1qV,hhMIRdGt!`Xm]}nsSJT-d%SnUVzb56G% KTCV)QDɧӊJMê-#v:Yo63GFAڹZ4-TkB֔IwI*IB {XHxn1w2Swggx=kreZhh+Uh"a Hq%ԩ7&Z.ET3FfRYkf혘!LBl?,ԂO7JxX􊰊zJf;[NƲvAG;m%4"go`%e#DEzf- F<:9 2ZLEʆܡm]-s+K| hFaҏCڦ{.u6 ]e#_{+]LK޶:rwr<;)76i<=l!͂|YH,W뵽_[My9C:[v&[_ m9vV -uǓ69;})b-t}9Uhoۮ&%[N'Em]-s +Ja)mfüٰWk^_R.uʻE~_Įv1ozq8ugӜY۱2x8[i˗0Ҵ.ј8füٰ]o) l[G e]{wWn[ؘm7ug,km}ٙ|<,=ۘxwiZSNnm-5Ǔ6͂|7ٰUo)%vߛ߿~v1+iï;>g([[knkm.ûJҘ| h@p Mq͇y`]e [,X=_%R8G* ۿ7uĽiםH3beӗ.aݥiL>9fi<=l|6 ]e#_{+]L[޶NyruvLr<;.)mZk&l;}.fuKpU+~oz%v뵽{^v}"QNݙn]v0\y3a{*7iC}_.YWhmk{:ruLr<;)76ɛfg;@Xz2K]|pU~oz%v뵽{Ӊï;>k(g[Wknkaam.\»JҘ| ssh\y3a{+//) l[G e]{wWn[ؘm8:, jmؙml<-˘xwiZSMsh\y3a{.u6 ]e#_{+]LK޶:rwr<;)76ɛfWKOR*7uʻE~߿{n[ؘpϤY)۱2x8[i˷0Ҵ.\y3ae͂[_%RŃѕZ#r߽{+]LK޶NyYC:ڻ[v&[[ m9rVSF`ɛf]Wy~Ho`%R8K*ۿ7uŽiםNqg(g[Wknkam.\ûJҘ| hF`ɛfuK7ٰ]o)%vߛ޿]obb^םHSfgۗnaݥiL>9Lw6 Z~rfWKpU+~o~uįES8m|<,-ۘxwiZSNnm-5Ǔ6[,,]e [,X=_%R8G* ۽7uĽiםH3beӗ.aݥiL>9fi<=l|6 ]e#_{+]L[޶NyruvLr<;)fi<=l[C}.YWhۮ&%[MyYE;_vf{_ mvVS@p Mq͇yo`%) lG e]w^ۮ&%[My%hE q2xX[i˷0ҴZ&l;̶YYk@Xz2K]|pUzoz%v뵽{Ӊï;>k(g[Wknkaam.\»JҘ| ssh\y3a{+//) l[G e]{wWn[ؘm8:, jmؙml<-˘xwiZSMsh\y3a{.u6 ]e#_{+]LK޶:rw0ۗnaݥiK sshi<=l#kL1UY2IE$3&If;*f/~iuͪZm">>.'c ;غY]V͢89)QN"-ԩHZ y(Q(IPT?kaofعv,SLaI!eh%-)hਲ਼fetһ?g Z5d1$viL>UCPԔ !ez2l#(bMkO6qHr|BM$!wI2s}#JLLZq7RqE GJagfrH?'NVR4f[jYiCp:M֬q,aQQp֖:x|Q/ ꅩ'xxFGty`Tġդm$w_$L]%^REx7N6`pͽ.-eI:JIib3YidQ((YHe/FjY.8n!GCU(y0a%%ڿ fmCZ6E\,y9N$ ,&Q*uhDFFD6-pޖ9h%rp=ё6K$*]*VX)I&3<42j&WT44jdRMd;tZ?O$– RY(TANT:̐%8eS; .Ymr ݿKi ҃b}'-/JŜRn. 7y7NZf #\"y)D^L6*-ºF)K,˩"y+ ]91'z6*qVpknl7˵z+L fǓ_bsrnUVn}N yx_ _r`Swfwo\n:^4_R85Il'>/ٌK9z\Jݭ785|ע&ͱR߹Ki p Osf99~׷bsrn}տZV3^^-z.YNn]uRiJ׌t8y'f1[:zڷ߭+wM yx_ g|l:_tJVT xCo{1ϥ=؜ܿ[oտ[_S^^-\9ݿKԦ*WGc7=͘E1v'7/^[/Z]ٶ=^)z4_R85Il'>/قzNn_ϹJpkE=Iپ-˷vVJ׌t8y'f Vή^vJs^^-z.Y*nv/R+^1.y'f1ܫ~ݭAFư{Z#.FŦ5qJxQo%y)%],A" ?H ]ՂwrZuLD>@PG6OT?kk38pq[CJM8i\;)XofjKeyER$*U1E4p(f! M/RZ^*C&ѽhsd%$>fo\pj%2*孟ʦc ,DD[!!$Yk2W0KDajRlYD)IeI[*48gE"}님YlynYZlʆV+qaZ#1Ռn_YT2U3K""mjJL:ݰ,C#;'[u(12_*S@BXuMtk+CJIJiB1zi}jUIeH ;[JJIJֳ" t͘R*Y4j 6"4COYRZ=DN&EDT."--NbE-mȊB"֓n&ApZLD=B̭DiYNJLLb%F܅n uDN:*fu) &B-pCM"sC.rL[jW2fa ˖AfmS0ƦQPMB;=|^J̌vJ\&%HyS(wqeHI(j4lԪjQxL\nrS⬢' .rlW鑹olt ?tZQO7ajmf˩22Bn*a*Ed ߜ=3BD iak$ IqGM2Nyvef&!*͙i4E23WK:_5~DC6Lm!)8%%q979R)m& q0<n\Y!٩&. R='Z8g 3"0qói(d: &% xT+3I:]JҴ* 3u%Ulnu*g^rGñ[;yfjlgt%'$|D/ثL$pA`,2yN'kDEh̳%NԈm88BiXo/n]#4%*GCc,ƝDfrȥ4VT1'S27 lΦgS{Va\H/˳#judfIBHDt"*ЊzG[l5s9|5v إIKfA5ƈH#Q)Y gS4֢XqJLFo .VUZ+*<3RYcpPTKqn;"ZQn,(ԥ)Ft",n@uXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \T{g/`aϬ2^smPuXdņ>{ϋ@j׶}a l%>,^K.|Xn \Tjݕ۫N|w|n \59OɴZ`uچ*F5sP`kT+3ȍl5 HʤfT8Q/2Sn)/yWi *x|l-\6 9Y[n1luf2K9t(IB,d!7$4C5u"3wHddQJ!CеRlt5ׂiߚAh&-6%9tGD3%uD;t9Afkg(ߘ.R3L)owQo {{ڋ~`=)owQo {{~`=)owQo P7MĨ=)oOG (uG (G (uG (G (G (O ¦T2K8 )RJc3m Zx΅jDTBGK.?bXщX )_/!̯*cJr9D9JR%ۤJ&W 5u3*.S8ʙ4fJm*4_m9dDYS"=_Jf6a,T|ݴlmPo]7hERDJ0KL{_7~Xy^Z;E9>TLR-'q\ø#VyȊ;-%nDˑ+a ulҵSyDH9}=(uG )owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=)owQo {{~`=,PЏ9[S upF)MQU#2Н,~?',lٺK7ވ"g~`H7 pĥԍ$FjE놤#e.U6KoFZ%DN-!yK3_9e-Y3fJ[W ef*eZ!%R3㨿f$M1i\T*Җx&ɳQ$Իɦ8FD0 @%!5LG2œ/>D( N!kR4$fu5i>Qy喌Ygp"J%07"+,zPi:c#H 6"* Ǿ5ZS gxtjTT22l33>8m,вCito11vShZ('"5[lĸDFO oQC`X3-*#v!#g7#Rq.ВE"*Ptf)}K>xMy-(|3QFK;6̌ fULyDc ۇ3\qlĽqo]M!{bD[%^a6E3Or)} {7j`8%ky29mcV!$US)C)pHK4N[2ԨCgJ$̯^2⎇T".S=/4(2)}%fE+B!DO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL<,rPO"yyAL}ך}%.B !BgS9 ⚾S2]A(EM"evPxVba_I7yi -sLrL*qJIM+BFfu$1%fe]+M;H mQv4vJgTMImn*ԂI-.MTot)^Kar)N;%FT ΁nXŤ\UM;; :uG|#MN%LLG7 “T%DәFs̆wz։_$ ܉yi&.3^+ʆpʼ3gu֊&+]=47禜J6?raa.aMSd;M*d\t"^vj&ҨwFӚmv?3p%-|: pڟ3Lh5DL+cbE[OQ +:I&2i./}IJAT|ڙLu'3HF׆6]Rt*$IsԟT NeE(cCvoM9;csTw8a~Q?A,uKlziQoM9;,,uI.csTwsNjG p Rf˺w禜ӚT95G|!=4p&lziQoM9;,,uI.csTwsNjG p Rf˺w禜ӚT95G|!=4p&lziQoM9;,,uI.csTwsNjG p Rf˶g5XIc(r:a #ڮA%[fd=r_ۧNw8~8ywB,vxhy-4c4kuU*S|yT(y}jpb]mG;H͔cJ# L8 []sqIǐlY֣fjHRZSqm)ٔ.Isb L#b5SYqD1&UNMuAg5[k֊&lꙜ&~*P叴eW&\h"ardK i`_]$ִԭ>A6[? lJI{tDVV[BU]}ՙN,WNӊ6G4[e,n jfXH4:_Be1eZ8[,e!Jj5,o3&V[UYoWxlq/\q u,D;2nD*9ha#Q箁odPIĢ>mTݼq`Ȝ6qwH׈v~V[UYoWxc q]z ` 84Pm Yo2[7 )>%TJ2UK0&sDG٭ɦ h*% %S3g3>3߼TUwV[U7amEe7{V[UYoWx4Ovrz?;YoWxo;UeU]~;UeU]UUw(=̞x{V[UYoWx{~;UeU]UUw(=̞x{V[UYoWx{~;UeU]UUw(=̞x{V[UYoWx{Ј~;UeU]VV[UD2$CY +2f. |ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W{" |%DAtK5 5Ȉ.=I}]>zć |{ |{G" R_xdDO!_1^_1^숂ԗ/HpW0W:gfaR8Ffs8B]l ^*M2t_Z!Ej,54p#<2hiǣGGO@nZR n-vޥ1|opVT?>"vĝ˄mL3SD hO~&`7K8$QU*d!gbm2o79 $ML(K^}x֐F6/:S!҉S z&iv&ex.**Ї읗Qe?ZJ5$IN:A[^ԋjDp0.t.3tʞ]:$#eyՌ+̞g!֩ JmDs(iT8JQЯ`g#,C*2"&&Ȣ$ BZBУu^ɜ#dO{V3$l2{ڱ16!T<)av!ǔ]3n-3UPQz]k!#`}hz*:ɧIddg隤.D|,H^dc>(P썕=Hϊ;9iJr\*Q0-!嶲u?CϡT2eNQ06iG/"pDBDŭN#HMEB-©yT䅖#{R͞iC`_i 37$l2{ڱ#eyՌ ӜCfiV:aaK,N?ܝF!~+pN0 j|PdO{V3u3v Mc}d6]$$yF|-B埵Oc!8q qHI0I;̌fPJ+6W=Xϊ j|PZ[&4CDөSO%JjM^dfiRPYMc3g?ɋq'HX-$Y33J1:i(x6j(pʧU4!+̞g 63.c@ʴ/ZheVfq2&-fRRGE6W=Xϊ+̞g dлwba@ dִۺogFE[b4Krj%WMm4Sު1f#/>~c$l2{ڱ#eyՌ勈NeAö\d:qƄ\MĕӪ9x6X!W uFmMyȒt32+̞gH^dc>(a3HH6dD+Qy>n=%#7|fi8Z+KlVZQL/䍕O{V3rk:Vlin}jNv$QZQWFY4ZPQY9>+r?gv3d0'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3` r?gv'#ymG60'#ymGr?gv3`fSXhxs2|q$*Qg#f$Z:ҕZOysP(rS &T͠ >,ȟ47J)w %)e4:mWNeCE###G\䔎[^aOj?f: uMǦOJD" H7HK Iѿׁi ySKRR{U'E(u\]n:֗ҥi8I75zG-<Ÿo FT՞O0-+A(_c 5!T"& k!hZS2%Df4Dg$eCρ?ϠsX>셞y} ![Jxv-xלI,5~JE;6jc '.Ur'XeDffdyNG?݃)t c=&P6z[(f6_%º5D)̐.q,'iLJJP4RN\Q)FwS33zD7s)]H_Ń ΁5.,:`aZa+Pq)-[INha5@,s@5{L@L*(QM(/'OfH/r̥/LJ*@4/0u }f|DK*E⬛QQqFt"qȈFڋi4*Lq7|Q!}?`NJDJCD!pKIp_+I#GܮM+D&!3uף]}Kdj|&G?݃ ρvRD8YYJ\NdоArQ,6#Mo-u( @v7>>x y7|DN ,۟@v ]Ϡ+N;.}&5I+f4cQա³2FqL9Qh4I*J%g/_݃ ρZ<¦tХ i%d(DJRktdfUgdpB[<[tJke?`s)L%Pq DmF+fWңJ: dԑגl4;I}Vk GV9Bftπ@vLp\SIDC.mL߉FDFDN"Y%2%LK-E:!RhIfb?`sٗ\i(ƙNDԫUF7>>xJrPJ,`q7k%H&x5n P<p͓iTd%_%>쑠ײ,K$YHI M?a4m ;X]/4Gcgm90[ h!pl$GBJIJ*ONZel v2g/ C4 Nu*&H֓5"cDfC.r$$36sΤKXMYxZt¯X7FsW6b/}#EzAgVN)}o@zAOi' h޿OhH/#{HWL[!Y=~XzAOi*əKz?> k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯Z k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯Z k'H?#Å^y3)o_4WdaY=~Xp֏&e-F?,= k'z̥~H^_5G凤da¯ZMӨ4 'LFq}v֋J('뭔Or?9-~s%{7 H_fmƃBJTP@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0P T@P@0dRU֘TdVU֋<%HlMVh? D/%7+dVU֍5.?Ƭ1_x|D_$K6&+lo4"q?Ŀ͉ K*WFdVUր-F8ZP J uT-?16H,OҨ΂fm)B:V*naUŹ+:ː&U7u9s/7V%]B{i*8O ύ^Džx}eīS/7V%]B ύ^4'>7]{֛ӊ MՙOjE|n4'>7]{%}x2ufSڑ_iz)H[ v K ~_Z^{R+/7Ve=Cq!?ƒr?__ZnJ{R+//Ve=BA9.|~YW_n{R+S!XMՙOjE|ȩ"z7  yufSڑ_}i)Hp`0|YW_Zn{R+p 0|~//Ve=A2Ԋ!+?Ώ:?_ɗ2Ԋ MՉWjE|>?_?Ϗeī"2ubUڑ_=y?ϏO`<}i)H YWfObg`+GxufSڑ_}i)HG'`90 YW_Z^{N+保1\B#֗2ӊ KՙOi|d保0:?"<`1}i)H YW NK B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ MՙOjE|dܿ0ɹ:?"<`1}i)H YW M B#֛2Ԋ!Omc.K0X ֪5kaR D&ЈMKg!- OG@././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_fav.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_fa0000644000175000017500000003256511520622610033754 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222 " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?+;q I1!.jJl,PPwrj* P8D)&8oM0O}q޹&cVozOLM[SmEAy#ž#"3j#L5(1^:Omk3mVuBFUEnZ][X^G_@H'>"oAD/ilvo I=JA?E PrNי$ˌyo9i#e`%kz?WRV yZ8@|C)<+ENd6͹t]c1$AU"Ybq 3-2m;Τ9 B80~c%ѸњVi-۪ϥj2ֳ˦iuokpy7 rՍ{JMhlg] +6$4#nއv0pxt t- M$_:HEԌ:+m[\Gr?cn;UPsj&v_3Rᱜ8ui6 jsVs'$Ɏp;=^V#:u\bFrNǧUY,hN2v㸪4*@5 J-,{#8ӄ1Cyɪnἆ9Ibu AuURRKIK@QE--(RR8/ܙ#Y<ӥsz^ieeug}ko7eiȬ<9T*AV޼{JOi܀nu*zs[%ZXumN1'vc g`<ǽz.$G:{)%eQLc8Cy;X~QoO5hV ͥ܍Qp2{kWW$j8 0\6sP[DzC쯧" ztR_k4|~$6#I+N&PDnԖդ*3#yɥkQ]U$b  JƼP_Dk[{W6yPL-_Nzy,CɪMYy}aQڤHLn9$JL&x #+X>,G,n_Y=u~?I\>1Vi+/7cp5,n_?7q/VrȪIK 'h+ZէEѼ@Cl,K" d9#O W!«aAO&ǯ~??hty%YgTآ[GX'!_3›"*w,n_u{D}-K_4g?% _X^,G=~ Zh ~Kg?% ?_G▾g ~Kg% ?_G"?9s/Q ş(ǯ~?MQ_2o.% ?a?Q_=>Wizu-P)oD6Dm7 ?\,?r UdRZzs\rWZ'ěM7 |V2f3~#|kX3m$]x*%TQ4}<Tm;S&p[FVerpTpkq^]M[6iwi gɝy*9^<*7}+FxY8?OE{3hJߑ_#LF=̊=r^L ޸`F@&Gtnw%Fe5Y #HN n ǀ9_C3@U!߇&9WA8#G + Ǒ^5C\n &X#s9icoiAzuG0HCvF$,avonOa[?oK8…PJ܏A6y4=Ӆwֱu [)`7oX/;&O1eO HHgI`ңHN-e0D @$W-QK-nW<~! ń5R,MŽi$,I ː;vooK8o2}@=~u3jP\ N 2Q_M-QUblooK8E=@/ ?a=>d[?oK8+fϙ(t([?fٳJ+E=@/ ?t(هlooK8E=@/ ?a=>d[?oK8+fϙ(t([?fٳ|/䒉=#VEo_$\@g9jKo!Kx_`}%G"qBͩ)sr;# mi 6ُw[q(yCR$k>F`X1QM{CV`qͩEr=!eD1m%ܘS.}zi/9 `k{CV`гg=:-FKh+GC޲cIqrOR;O"VhbX 9<{GsR1\ p? n, ~dȓFUH`jLRIӜ$hj};UE$kKR@ًc88QK{%u51ШuIӰ'3U'22HE6A9%QZiG,ԁJK MG *UZV窢v$ z:ȡLyHyquPBB$ znfL!PJ>՛sElU&Hs~~|~Gd?k)-`pHh<g10x?N5[QKF 4_0Ǭ**6 ( ( ( ( ( ( ( (0e:pKhet$c:ܬKmX%ܬ7̃܎/*Ȗgl~d.ƶN]Lm#reYzޡpKy"! Wyx*[ҵ_B0)?W?r:X̒O1u)tpϙW﷥xJѱh|L(Zr}/+w6g|C!qUWzz(k8? .zO+8? .zO+8? .zO+8? .zO+8? .zO+8? .zO+˯P3iHYNp<~?V,׷r@j@O'h$mPI<~?XZFM${\m@@8B{fjkn!U Z5"1#9*kijC$^O(L58Tu9Oިs kAE$]@xz~]?l?ߛ/Geq #im^A-mgHMY-̓',pes&8^ԼU>T Kw2G!G+lvcr8#J~mawwpE]H{[DeW܆?+qcS6v8l('ؓW%u@٪M*bcBK% 8dla+nó[|?t;-BnRQ [%Ry$K˖]jxZ7* ٸ皻C~lKX=5 il$8gÄr7Y6emoYj][I-)13bzJM=?说6{ۯkooI# {6p-?V!ϳxI?jҠsʹ];g4h֭.#/E"m"1p@xIR(Ej)%uqGq!Nϸ"nt&9Y;HrcJ4>S7_T rz[ʜ{W3XtS}`},Kk#y^l< }IAmo,n%pG0W ZΫĖ:֏m_TMqRȅ8ZGDM#ᗋ"dN ȧd[ vs]$3 m#Hg6?/獏k@: +c2?!xLf: |Y w ѤH#*@zNc2}~u/͎vg.qL}4 ]&#1'(8IЫHf[n( ]H@#x{_*ceTQG?<筏P .:M,68%w:4Lq΂4,p?~5S[/ʟzq &-/sϖ Mz^ c dIO=lj*ceUzVm}pO7ʟz:4eMe&M4OK9?з*$UAٶ&;KmImucn~ɰF_.Bӑ]N;ZӝwͻdnRAYa1t1n+Ui[*M]yG?[WhG ~* MtW~3#7H(2‘H66d`Z7mf$AHC,K,W͉>AesNO#- 4dxP&{KuoTC 1c䫆8-Su9)m5ɒh;]V S9CA)UA?+*?z}g%_u>+*?z}_ WihϊJO;^Ey|WBUZ3:ק@aЕ}֟vPg%_u>+*?z}_ WihϊJO;^Ey|WBUZ3:ק@aЕ}֟vm#d7 ++[}\ֵ]s_VjjR~,x#Gץ󸮶O2{{e)qQV=#ϊ?Wo~ۻ10۷vxk˯rS,m?r3km)oy%{v;S,Tcq$mã+ 8$t5j'z:1)`2w6~8 `FFh`Z]^^\4FCޛQ KS-W۬ i$a0Es,r.HX0o>XsM CunІU{kvː̎ N2q1T3ح7bZMeDx~XNBDu-KÚZzE={+ޘͳ2"*CDco< 0[G2&73cϩ$K㖳csyzKIq  qi$\cO gMV_+k}>gFrj 8H +5CRR -HE󒐫 @8ެj~#kk[[qmiq\[y/t4}yzڼ)#m=-$m,q6jtպCe w>Y!Cɷg* , ;j+~/$&5kh(bqMPMֽiowK7d /)1/s9B\_ &}BT'(mI>~-KYC p^$@0 #8%WEp3:xPTl@cfg`<(ABf:JvgQ?i yy,Q-ac?1i@2X_-D] ׈hbַpPɼ͜??A]hVzŇ9eHd|1TvZ7=Z&}:5W1O?Ruj0o 9?(8<})KQO$ٓM$]QaX ]=k?:O`yUF Yq4Ds,d,^J0tndQxLa(KqZ>1ΏeM% EJLHs"0 gU=R8eq<+#8Jҵ?2y5 hSCe-,,Dci_[3u9%#I'>Y:Uޝܾ}w 1!8fe c]ԟ'Nk}yWcg=0&ا)_/=sQT_c'RdPP2T?.` 59DQmoSL6rXr$_iRSI`EI,9(@rOkdzٵ;skid\z8`rKޕἼsI_?=m@6-^LI9bR'rF;Y)-7)uzmٹhu722+GxޫDkpIy߅q6:#w^\U *B&TJXh6i -[5՝!ĉfDsڴ exT em*Π}c, +s;)I뽏@{4H5=o !{^Ny^wh[|ZqicoEU@NxƓ1|.\n{YBn F=¢׭,fQ}O-}FI.yݧͺ]ky#ج_+8 PҒY#"*)$QA7T0I˖3wo sS}CH>+67&ki2o[) '~=@59bT lXPiT@W8;A uBshiܶk^Kg-=;_.n1#fI?틘*}8r dXIrI=kRo 'u<-(BptHMN{tx,(%y%fef2ppAѓ@~GuX&+d6&7?e~jW]jW\|Q^;'gD`kG>(Kq]S6\=ʈ0mQW(9g:GoovM#N(b>l6{l^5i)@ypEqi9+ԒsE%{8|۪O ^ѕ$15-;' _dtּ!6Zzz ҈## 9=+:+fSV#$>_3o|_:YhW`}58ApeϏi'sN|gBe7#"Ggÿ{bYCbџ,3哴@C1N&[ ,o塚\vF_r5a5o%_:ӈݎz4O`ZirGsG˓w)rJq;ҔSӛV9Rx7vpZ-kfdF`Qܙajƃ}mxK#5 i,rrH'2_SHCJ+M:o20,뵳;G|f>ϿrƟc EXwnϠhSnGǂ>.m|/rn|E̥vʰ1"x;z,::ha quOs_JQONi[6<3/.nI-]?R(FEV%Q*zTf,6oӨ+Iqj0\1$9'd>lmLDmndŪC' 99SH hv/&qm"Epvc~iO#D|q/7^'_ͦՖE\yP^>Y YUh{&FI[tN_GQC̦Nr+|'^˧$#9HTbP5|OeMɦծb~dg}"G+߃t\kKy.[o~cco5mlk&r7 8=3^oJ)}Jg%ԓ~)i6'v'we~lvJFyp|?gId$z J(B/’/=  8?1{':'?pT{?^} 9?1w':'?)}Jg%ןs?NO?NOR*=^ާs?NO :?O&JQGԨ{1}b6i5kԨ{1}b4iG3DD?df2i1MqG{1}f&{~C/MqBQ:=_ZGk w蟐i-MqtG{2~W >?!W''?E(t{?[ >?!S''?}NgwQ''?_I3DDG\R/V#?OO4g MrTdv~ O Ё#? hk >G_u_xgM/$>DGW*)bO$DRAtOr>G73B|Z'?¹Nt{?ong-KOsTd߂#߆C?59ZL&v# 5 u/dj_#'?—c?"hs(./ O~ _?"h/D? :b7?|3B.~Tמ4#EX=kC3Ҍ[I )%/:_':=:&D9,@ I<ߥWuekcM'tG_ :cjsqX Υڞ+*Oh󈶞3i$~t_-Y/s J7DQ\8ROZ)E֊u&o7eMsJկ4/b/?HpQO T1xS#owguq%1 3)$bۂc]"W;5:j7ugQ^!|Gj59ʊ-w8=$N7[jt|cڽrpj/_3rčRTIOLbxKDZ2M~˷Qy9;>>دaqN!+*q9o5K1My>KO mI5)MG-q #Z(Zq?uEg25D0s=k8|=GShqV!mN?W'rT?]/+9?**^+#'ESuj$<|W#~ {TV'#?yXW?U8x'_U?5aQ?ai_#OSd@?jtZ1?X*oGxS _OoP?Njb_؏cϦx_ $[Qo.O^/@@SYq?KGAK'Ok@X()$$]<(x# O '^郎#vyQb?2wc>#d/!^"$k|~T?w uZ!-[[hy>-׊-Ďe#˪^~n+˨HiGJP Y>$YAUL~58 n|ԺY=N/- P' 8?CUfenc=3wt~K"me keME6,MɳBIO\gr3_;?I *kqm>O="Ytvj:5{t;G)X1*}=+%[e)"'8MyZ9WUf=>uIvJڳ؞ U$qF"EY׳sQ^3QVH?JTf"W׃s] |A-!%H[J62wsa_#fo!>Й D{ qQ[AkX\I v~iAic@UX{r3TYol"\Ya`8AqZzh9*Lm0>RKi؅p2rA.;˟70m26d{[B?!(72z҆OvnZ4ɽ q &-7g٘>7e'hVMEu$7*2;hW]xki4R(+FHsܤ!C` ?k{ h&v#tyǦv6H_G F;e5iTl.2z|R58mƧqVX|6 p֏uj@fsҔm'Zvn6Jp֠G#ڏ|O!!Vʚ3>,M#580@y5:IhgpdK! ?s֮|J7o#Rh..-b% Z߰mtwai6e be rGr}k\7τ/ cN3&.5Jμ s5ЗKa)M'xj)Z'QYIukj r"rY#L.m2Bq KO;ְ[J<0Gcvȹ)} kBWzTk>b6Ɍ |y+KU\v9f־Krx4)dEtՕ Cqb/fK`IEezr^@>h;pr;zME$6$0G*Ԧ26$ }T7-C(p~nztN YEhE?.pEQ?JTf"W׉Q\aEb-d^][' k|2;u\7 XlfӴ_( -Ҥ2fL .QE]usH]ѺTdE:uYEV1HbY #-n •#w^F/j7m}kQI2^,St~VQm*\@9>n;Sxw}#ƛʻuu\8# 給I<3m4z+<תc9_1rف8̆Q{,׋ 1k q$ps7[ FmEsK;SAAr::`[M[SHcR[bZS)'FI]ήkS.nIL<cue8X!!A,GsW75ߙ$Irm@ i)I\{Q:RnjQ\5 -{ç[k<:_ qj%5:m]_"Jm7;r@F>bUcb# W|(mnKD F*UQ!JžׯZ'[Ųwc<ăbnhso݀N@S7s\{mkclr/U;~R E m~ 4W/ I6Kpۜ9NsޘPIjZ6kM%*Ī`uaxYa1ޤWЫޢ!~cq?+㺍" jok.쮂S)'Jxhi-V23~/vB$<~\Ao#Q-)(XtnOx/cRdm̠v׈m!W'e5Yalqfh(Y'OԷV8YyFcm>{Z({Orb;;S%^*Ο%>\mU澉dsoiãuf֪@GEQQ,t\|BbTb ?{z $WFex'?0TyKMKk z"5 Et-@ <:.4qq֮|&ꟇJFVRM{/__7Npo"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.ϒD]:=; {/__7Ng,|&=/MӨò !g%>e>Kt(po"o.YϒD]:=; k/_5/MӨò !g1tMg,?&g|_ə(ò !v[ϱ6Ϲ%{8v ! o R/?QO=a߹ Szާ(`m Q}QKǰXO&9 |Mc3tQGd+o??Gm>3?E{8vAd]]'i>3?KEY ZϧLZϧLGdByV3tyV3tQU]U]-{8vAd'i>3?Gi>3?KEY ZϧLZϧLGdByV3tyV3tQ` bp d|oCEX΋%xkp#WJFV~9z-(gחEf1C qfiմ(?4U$(279Jt+tI%q,SDd<ܻj:bj+oO29!+v#  #De`m5X.ash N%~ouG9.PhÌYW?[ VsZe_ۈ!uppQtƧӮA'J3iW}ά,5pQSvV_Aa{%O-,lP_q;ܐ9*# /-TE=sԌ1>Txn9B;i_[t1Mٸv #8,?oern. &d/$P2(`tXxS̪ǽ7-dwیټH .,xٰUc'%zzcVSB/D BC2#v Vm&f63M ԵEԬ-n$*H(g ZMRۑDs ۲O8RkZM 4X4xcJoS[A9Qcڡ KaO,I$s pѱv. Ķ> Bpm.lRpnӥS|Q5Աi7i<drl,OqpdWw/y\zlE㚭ee~Iqq >hHd*R1#`0IC@eE B;bA":)`ٌN&Q𦧩RKhz96:G(Y[|U%YNQEG*J1jiM>sW"ijP/ ͹񕍄R}tdQ / #uaqԀ`tWW/5Ou ĶЈ˙ Jnݷvߗ7bbf}F﷫-1h`1~ }<88+z6݃u+6Tc@/ "C𛔠ʒ̬=P۽aiH(T`>bTz',m_ɎT%;n1⭝&ݴFҝh 1o'#`[ı}!O|ĆY\G\ 9$*O\YՍ-nC!RHdxᨅM.{249dҠ]@A^vw}]}ui!A,T@`2ylm8W,GӃ [o೜ť#$ӫZ0Vrv(Ȑ3oLNo&EYX`@h4$Y2-wn<./Nьs}׏t1DI"F(r 34(F.n3FWd @sKP%_Y-&rAe901V:#pؤ]\[N ;@$w+n85-2eO0X N/tmBR5́ >Myw1ƙsƄRj}ۀą;݃x,"2Bmn짟Ok$Y60@8r0H]I,Q,֣,H$gX7B8C S–mjѻo\ʲ 0F:v{Ce~"lHU~bmPZ< ]$1\ldܕo_ܡRc讠aQGI.bLdoj3RP9%)o$4Y]EHd|i.QXx(%!f@|e~FG j晢\$yFy$TS#$"To\mlX%-s H_ǷnwsfYpMA<V46ex2UF}/khc/.7mp%grT NT~\y~B۪,hmAPrrqh`Sƞ?&y,Pd"\H 3׃ڞl[\c-F*>ŀ<0^Im<8|Q$ylmPmH%TOZde]OQ{XxPr6I&P~R((((1?AQb(%xkp#WJFV~9z-(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEq'"5 OEx{D .jQ^\?ү/V%QEŠu>.ehݞ7^GC]+eT3T/~hZZx\̊I$ VL 1H: VV8 te]ܲHc߀(R VUx±//ik2ͣXy*S>yd N)^>;ۉ5lKi6p1nj|eOguqJYew9E2񥨈jЉdWz^GSi';A^whČHU5'+M +=UGWFMƥ3rQWSext}Exs+񾝢_x;k7{Acg%ꣵ{+e-|0Z)r*[2w2vz1QGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@yv3tyv3tQGk>3?Gk>3?@D qlfvǘϙc h(?[QF!?:/ȕ^>+_ ZUĶ (DmkWSswA`uBpY^f۠cwdݞx>=/:0Oۏ w'&. pۣNOw+'WFslEݣď!`JdT:K`QVzg_RŨu$v$(剙\[<huR4r]S( dcx*[Į20XsbsfԜmkE?qkNccsdt|n̫1uP8 ($^zW%Qd>Pչ 3zu`u)4:$R(dt mVRʀ 'sRHQf-[Շ,~ꖶ:]{MdrOwr-q4e\a7RF@#w&ӭ!䱾v(!-懜É18 FAA'P5lV>^W?|%Aos?}FK&i5 Ë8Mh[)+  èP8Wח/ c{vBWv}ʹvRp"g G[?|%Ao~vQi$q _h4K3L$ #y2۪Ƨ :d}#^yៃ~muRKmyc(w!C{w}gZ=ɍ\H#EyM8liU-7W5}/QcIk:ʪpJ"4ʆdPaA q(9♤XGhdXp}8%T {h+5 D9 |q>^=ǭAgiZvZչ"xa] Pr9EQ]oJ}UQA™c9)=*(IKͩGialnq>p#{ӬڕnĚmms{i].yfDY 8a:ze,DDe`Q}K^b_sƥ Z:୙3w68=*=3^XѤ8fIFڄ 1iZDwff4C<'D&,'!y+MkiwK;%ĎrU`9?_ˬh-{٭!Ϙ[t?*'8wCP2ǝy{wc,ta#q [gWG]e /#nݛ=sݻbb8`~O3u\ {+,NIsf<5GFiʉ 6(|&zt'M}nݿ;gϽ.Ĵ]-ZL4Ba($Pt棟7Zlhd˘ب@0ÀIa{Zu-.%`IFmwd$yGt)E1y{Ug&cWv` fע)QEQEQEERףب/FEQEq'"5 OEx{D .jQ^\?ү/V%QE?#k_ʽFg2@7|:=0F8_.z?Wm1ݻ Ga vqI{zdm cz#to%aRc9;9M3cӚ ӤҼ}IuBD\^2b|*zu>N4ٵ[TwFw-lykl林croD6 j:0[ Ҕ17n1'wkE6c&6Z= [=0钤{bA9aSfG}~w6я.*Wb cyqјxy#ʅsmŹGQxMR+YfQ `+`xCFѐU#bgCM*Fv'sܒM|#OBXae2]%:'aXIHϭ7WĒjX^ nkxeE?#eBh-ϦkdFco9vDN5rZզK{elĖI{r9K\JVUK^óI - ,t `vq1$5FEҵ {2܃[DFGĠA\J#y8nbXt4j&wVk{aMp+X~hn1z[ A4a8P*vןymuq OKo íMy&-̄6 ?0ǭ /e)9"lTQ}K^b<۫ǪI25A/ل@bv-Ӷ*Մ l8go>9wP=ܖz|zqfӸ7rWxqQMcg<ܡDIrNWwEnGM.CV\7@q6F$MV{4wȐ;P8Ҋ;[hxJB+yZXejDZ7$?" 9ji[lhh'/1z%EgϧO4{ʌHyJnG6}kzL(EPEPEPEPEP}K^b_QE(1?APE5`G%xkp#WJXEVc9ȍף*Q +",Fٱu~^? c#oxDmkWvKûl$c=26౽˺Si7W 1Tp:r3ԬsCZX-oTExɜ}11|?@MêaTUh|WhzE,ZRGbAXXXX-v -*?\I7moO$Mwafg«FNF06Sx4= և)5-F"Iexـ~6"|jobtuI^ͪ\$2R3h3c]g /4z dU|ֹfqI=kӪ퍦hְ][Itlzss1툱hI<eB96kM&ͬڊ^ B@t銡T*vo[_Kc%? `Yw42G'4$Ca`Ny%#>^OI_b5x$uD[Y 3>E ivQ Xʣp8usvi5Ca [ena,<#ƽVyoy{Y\[`kuw([Cn+^.ڞ۱:}#J$6#sO{_Eom.+yh(3+VCk>'U=Œ[\%)t2-p7?7'c]kHzuXcQ@p!rv|ƽZ:[p_sXj3^Zmf% Qv#sràdTԬty4s[ Rk]Dd;q׵z=A V0ƑDETtӳ5kkb}z[xnmmkߏ&1nd!d wn=luB)>8kVh^o0 .ÕElIϡBv=UKQ.P[uߗw;$-=oJ ,7XZE|UUmKM{y[)%@?t Y+=O>Cy}A4 1>`7O "&@Ų[/:nk%XJHn fd)3עB ?Gy?`5-Exa2ҽ̮:Ldyp;w;,s?J:XOWs/FEԿ6*((((((((((("lTQ}K^b (8oCE'"="W5z{D .jiW㗫(g?^^A^@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@`xԭ/@Կ6*(>GѱPuψ4[;!\ (22>Rs#QKi ̢ ݾ]۱sPV Ŕ\)bgUik-j*HIO  UK]Jx-Ghk7< X^Pk7򍉛>?1bqp3Y,r>SN FS#9|R+JNFAW+Ye'Famt3|7͕*Xc94[ cv.ˉ҆\ÎNH&@;+χ/.LblV0K}Aݜ օwMa'k<20L#s 'JvnQRu F`S w1rT$ ȪڤMYuY&U $!'H ;ז8Ui8 }pqq.pySwyS`wlo?[`ԡCQX*uv|\ g.8r(`;z`y*q\us'ljnħPZYF8ڂ7m##jEm|!U]upT`,)0x:59eAJ6Jg988Q:]qyY۔ 0uM@9׿׶}fᮭwǷseIȒn˒vr'7&H ^IFVlk#(ÜkzqI pXT`P= *: 2AI";Inbom'=RΡ-[_lv^$ *w 9=R[]=MRVhGI_ɗ`B  oOfY&fp"f߻nР8V8 *t1YN[MpAg׌y{ިO#iHnb!# &rF}.-ܴoH  y7MO$+xu{{KA lŁ I\|dvkJ+_ ZUĶ (DmkWאxDmkWEPEPEPEPEPEPEPEPEPEPEPEPEPX /e+~92sAK? o%esPA /(@$l_W?EtH?\AK? o%esPA /(@$l_W?EtH?\AK? o%esPA /(@$lZٙ!+ iȉf_)_-z{}M*WIҀ;XM^)E JB :>V >u4qj)i O9sӶ>Vׯ/C_M,6JAERو3*:PԿ6*(>GѱPEPEPEPEPEPEPEPEPEPEPEP}K^b_QE(1?APE5`G%xkp#WJXEVc*jdΙsK$V(cS?皨dgoVwkI.W)` H`z]sy͜(ޡ"_YIowfAžb`.38$$seſ[P?"C&EMlQ@/#-?_ݬGp # *xKxϑol$D9s OF{mׄI-Q_H#?n(qΤeȒUacv,9?nvN(ZP1].i1̻0Hc`㳓8ciVyVɩt qBS&8pOR@!*}lqe50P( H'jms% [].͉jr$0|ޘ普wkqzCc RC8+1jhVVe f!FN?7_j`xJ7Rۛr CP/4nUPX1T[!=*߅^&k֒Zy8ʲJh2N9G{XjA~J8TNB zu ӭ&+'ČZʨBWk9$})-`2TQ8<ź?'CH79+.אYWp (&D]۳+nsy(K/^MݤELbR|^Y*K/ g@!KXe<ܶw`FpMjX}Kw}o7qU^~ρ#Wxq71=yȴ;avqMh;pqY!>ǥA9KX5э1`Qar{m|9- \Zjij`2a6bk e%z^AխmR[[-n\m>ӗ%N҇"};ŶWRE#̉lCƎC8e5:$e,d;+*Exx|,Itibxf5@ߌf5'^i 罎%-Z&Dѕ1m 1S;0ekWfp-%2 @a9_Cߛ?Ÿ]ء>q'+g+F+ƾU[ټϴ;Y1F ym/ۤ6k6$IBE,![#8 $q6$VeR+i]goINr>lrV0ӥ2NPTIF*_2zpNil:Xӭ( 30(A͞[9*ׅn_-5teH6$md"nH=ΠhzY/Ry7 "(Ud U1ҳ4$}a(m/<2pv "yoSo.5;)?Ycr. IЌ>Q|%x#갵f;mIm_rh@ixMJ,rγ3HJ>=2>oNլUڼFFA3@Q@Q@Q@Q@Q@Q@]v! " HUbz(vG%?¹S "3k rd$e}FEaxu% a$xW,pNNz;_l߄ >/` 疞 xe~cWH>"_0ao9fֵuI}F<;cUYY eRF@$@wl߄ >/` RxTux-1mJx`Ky%ct[!gnڽb]ɝ-·>ݫӜ^zsNk}_~(d݃'U.๖(_s0F֧6yqyxH_ԌqD1p xIkf ?*&(1?AQb(%xkp#WJFV~9z-(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEx+XkjLPFAp{dV]k@sS4]k@sS5Q@%ֿ ?U?G%ֿ ?U?]]k@sS4]k@sS5Q@%ֿ ?U?G%ֿ ?U?]L+kwMms\j&X º*(?[QF!?:/ȕ^x`W|c:\8gVg?pZUĶ,QUg?pG+1(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?)5Wզe A6(A Rtsy?sY>+_ ZUĶ,}~z+1>y?sG?jc?4}~ՈR,#muP }o?4oѾxO@?h} 4o>y?sF??M4}~ѾxOF??Mo?5jiv>pI WLE>y?sU o?5^>y?sU o?5^>y?sU o?5^>y?sD)Uz>ҍ?>y?sG?hg<'}&7 hg<'?4}~?7 h} o}&i qϪjqY4YcW8UIv>'?h} cX A?%P?h} cX A?%P?h} cX A?%P?h} cX A?%P?h} q^0յ nUMJdUob-2z]mX} onE4S3V$JPzm}~ѾxOF??Mo?4oѾxO@?h} 4o>y?sF??M4}~6y#Fē۰S@bKy'h[Q@JFUȕ^*rb[QY(*>ozRæLȑ1`p_}~9jvC"DGl ;ȡdrh$(notTYSmK:tΌ\>KiBCHt?:v\%ӬI`!l)`A-(y#ҦC7cXpXsV5NVlJ;bpp8lAUQ? @c3x_y+oWM*XZ(((((((>ozRæLȑ1`pKbSVU$ga'}OݏjUU{ҮYy`mI{#=@5-VV^s ۘPiw0}pz?c[a% 6dl)b1s,4;us8i :HI0V=i^Qgسǻf6#-d19.NZK8  h٣w- E dV3XI}"xjm䔪d)g%~ꑌcV^Y"* HQ`OIɧZ?0# o WQ? mg뇻`]yd2`Ic r})Q\'>soX@MkQje#x6F;m⋛NK[m&W4G3,ʥ#o+b*FCq ^#EݽΫZo@P^0zcj3OM6*!,0N`94k(]v۸mϛi >p ۻGARdݧ/R;q띧8r9c,THXY1a#k `9Ux2- R,ۃc~9RoJ! 3JRGl/W? υ=cE[?P?ů'/Wq^c/[ Vs$l#@X8U\ӵ hIq0,8|@ jk--(4č ʩwT FF@ݜgX}Es6ym%ֲ*twRw=߇i5 5)$eHbP[",s9QSKs;h>eF7:#8=jF7Rn $mNc"\fjHt{h~Tn ܹcWn} \kq|r=J`eM?k IuS[󭧴żq"a{ՙtggɒ1z2p@U99-)VXȊʯ=1RF]?4/?@{UQ? x­a 爙H*uRA+_ ZUĶ (QEU;'M< >ϴBm3~UrO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WG'+b͵cr6>o:gl"2`" ( ( ( ( ( ():nhi~^v}nqdgo+ آ1 WG'+bO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WG'+bO/_Q_ҿ ?(? пG"~J(¶( D7BQo+ آ1 WGEVT.&i=2IdbifbrI$rMj@o+ ? WGEc'(O/_V_ҿ ?? п[P?"~J(D7BQlQ@-2 LAƥp^Vh8oCE'"ɱF^%*j(*rb[QY((((((((((((((((((((((((((((((././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn1.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn1.j0000644000175000017500000014775111520622606033630 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("b  !1"AQ#2Taq345BRUtu$67Sr%CVbDEds&c񄤅8 !12AQRq"Sa3#$BCb ?vSt4Lֹw#5/@sJIYX#*54einAM,?,fmRm7$8g]#ͭ{,B4@<1@[>ad6+Cis'#r@qtEuLlOdF1nifǿ3Ҫ4_3_M!٭-WhE,E4+.yQ8KXY5y)smBTT`dSlvqti%ǸP,t\;W^Gє 6\Tԋ@B á['QM[Y7R,p{i dI~匴Me[_7'ܸؒ&=Dϳr]jC*n0␢|v9פn{Sf6>d\l!g+N= =@k;tvn2|c][݁JqVI s٬ٺAcL(l.[TY9P<2lѻ=J2᭛Bqrt\>Zл."E $8fa| y|Tzi739':V]N,)\HA\ xPB !O&DcnH^S{U :qN[W>Tg@vյ0c.\Sfuc'i7tJ$z |qE;Uُ MɃpnImnTuZz#i`I$'R+#‘52*Tz#aYYAkm:st!a +{^>`;Xˊ-nYjt>ڀE]cNm^|KƟ 3&;i(;R_%7zˠ9tqLޠq'ۅڷ\9][!$rrzr`JfHqmJ8Vysvyڣw"n%t\I-wrO/nH3="c-+fpmۼG?zf7d8 nP* VkvRe>ڕ+ʐ~*֝d^8G4krݸ)k%)W0KS;Yz%w'_q-8R`8ϧNTOܚ#¦_Vv}j-ȷ%. Oogk$9Mgva=kyo[,Iqx q¥cDXS[(? MvXآG W-U3WzFacVGb|5$}Z8zWGkoaj+#]lp>t7ďs<.r:ku|5?M# 裱mm5JQN9: `Gl}%ᨬ5oT<.wY~rP~_[{ QNNsU9}m(? E}|a|5oT|.uY~r0a|1oS׈9}oa|1ƶ?"?M#\꾇Z9}o Eg/?"O|HG;t_ƶ?"9m!1oV=\)]1}!ሬ5Cb)>F<]1ሬ5"|1oT|2炕c|O"9o'N:5 hc:>{k|1oT|2甮co}Xkvډ~-k%oqKEi )iO_B͵zԟÑR-M]̲8!Et$1NHӶjdZq /MCrS uI[kx--2O#n a@j:^āD_(A(VFn뜮*C1-!,G|YysJY.\XO&*Z[!DJAB€$gܕ."BҞAZVs$znEA!NP-(JOq_E- W;Va/W?i^s`@{fKuCSrKCZn6J‹nAW܈}ۃ{ɽ<7£-m\$r ]+*R"HbOvK؊橞 {W FN+njϪLJ*msu92V܈A 9cWpZn ;FC<[[@ o.hW4`S ֫" +cEC˶I ͧq!y'™tC-mcJq-EqjZP+(cO>[}qJf/;CH;)I9(׽֫E@y7R4+R.IZqvmյ|T)(H3XID6IH!fC%6AB҅PB>6@OPv};6.uvG cPPRRC*s=ʞ 85jv'jb̧xnb"z2(a)jTqJ_wmCh.sr0Slݠsys:2pk[Qh5+K,Gq,%ĸym0H=Mi7j2܋Q-K}R]CkbI{t(Em;. Ƽ!v`fpyxkZTX;VEdu(%В*>Q =/h2n]aȊA,t$6Z *RtnP$GI b3zk[;SG$ԞIv_|?sOY 98.F5ө:<5 dt/E)Y>> Vh5VZ>%p==emy!6VHO ןbӥy21ܧ_uCn]z hҸ=̌|+Ns_Ů{W~ͪ5Q/i%"*K!R,`u 꽣ۢjq+Lj䶗ϥj%)_#2=_#r-z[ecvOl$\Nc$&DonځPB sH&$. 4eH9l~1RxH~HZ7+ y =8o?zxJٽJ±k=?R~1jM׫^av <ɽBOyҳ(zSl ȭ mLk!ۢ=sw$řJ0XozZN x)轖7&jVz+ɬoyϚɩDCyPEpEas.4lSN 4˫mIC1-Ė;(qjQ9%IIqvzь֊"3gz_yQ?F>Mdz9ͫJɫz5Cd]ħvC+AJ䅖)9Kj='"SnDDhrE ;mId"J*'$4uSTgzNqfjҸɡfF JR5tMْ/J<Y[p?2;et1h{WhҸɮ{Xx#cW{|_j4ɬCJ|甫'??۫Їjӥzc#&=kڍ+1kҞx#6t/F4^~iO\9c=q]սiҀ#~|-}g][ls9 >unu;J9 qZ ED&S8ܭgrofcLy)RAq!JJ0RӜOQ5c,8oe f3 NpcRaO5FDGsn5=iw2ęm)6pV(8 xl}o?c3G'|뗴%"o\֭.|\2xBRJ Y^f%*JYZ AEc=ch'|;1i9o|U{LKÐC~+^JsiVjf|ɵ,čqBZ\[K.- rp!)9ߙ&F>M<;jzB;iIo| S$>ɧg}F>MNR/>ɧo| S5􏁱k>g6>MM҂>ɧ.o| St'.?o| YɩPCyi曗ɩPCww J>e.ۥ8 y֜ؒynÖYAQFsGӟ稪4F#Đ.‚R*H?gK]oK%aAl(*V-צOLwbRzm~j ,-)mM)Ak_z%;&]\uLխj=Jc5nŖ* ťrOuIP9)G*IuV|LSC,ͫ^OqS>9_rfY'-a7v-qowivWj5 29Rx-\heI7K9kgYg=?X{:?O^r_f,gdu,e:8JI$ίcߋ3NZořO_]Vp+ad܃lC NyIXJDVUZ/YEq|ȉ)66 yԟs=zG~T'-a79kgYg=~jUO.; />lSڀJ{*$O1Z6dj٤n7K0zD.3e= =ޒ"T0C-ևu*'%O/F|k;T?ls547*,Sh]≑\ER#Tgٯ %'IYx)RAZd IHB[ 2GfE!*+KR0|G׫yo%Hu ?TK._ZA'ګ`GF{#QcMc6[J܎GX9x)[YIOZT քb)Їem [^S?Yz-KtVW>ٯWД7! !)R cPFj9M)<P/ZzB{IC!YNާኟmŀ}ՠz-wG|iFh:B7t=yU$22܉Nn#!iO?hrZ'fۙlr;{%iKn:r.tɅ!CeK|!!$ ^a:)J)J)J)J)J)J)J KT()@&eA^=8Ҷ#Gl%CpOtv$YIRa:RCxWx<U~3kiԸPUx RH ,ZmsulcVq8y]/ rX\d9Hp=ޏ͐nGJRLm_r')o\ܖ@0^P{⑷|]pZWሐ)hRR @)OWZ5#v#fB<Zz׭"}ޙ8(JY3<qƶS]\㿱wq[Kj)̆ӞNoS3ja"\qYXo@9;N0qS $v™m%grA'x״`I\VV[cpHua'$9d|9@髅r%fKg;Ck+w*W9qy7[z(2B2}jjڧպ+*uNJPQKl֛r܌JS9ޑ 7rKPG֡)+@E@諴M3hls]νoM;11ގR%* pmχTj7#\XHܒԜjsU7Tx0~cQ\[b.$d6jՒ'% ~Ŕ{kR"FB.;ik 'IVJBHP֭8}֞K i+¼'.D Ud锶"J(kamIPۀHHJBG,$WrE>K}[wu~+SGjoOrn< S NUgiI8+IҥnPAV:Sw=e)|n|xFld?7m3t &[hWӌL.b)Co/ln+ a'aV[!)/Pm.a#jH'WuGmXm]i9ua;Y8 Y==˖;Eq Q[))qan q!J$rjoVWڃL<%ƔͰa/dRmZIRU{1S|ӕnBDaqGSK˭ IQBH 'GҺz,Ȳi3R$";i+e#$mZ™SJuPOI|<2* pЙiS]r (8DHɫw">-M(AǽU~j$*H+Lߔߔur"֓mbT |[joVg΂0uCc?C*JTT2miVr"J|x{\r˗,cZc"$J.~RN5rVcJy`NBNN1ֵ6ӛMJHD&UH )j(%E|t I.dYsjH#$+'5+|y@c8I=jqQԗkܞ|%*>8?;.PQ!䌟w?k *@RG5-6+HwKk&2[P'Xr{tδh޴9lMpOHnKT^yHjJCkI;U;T}Pt5 $Nc^- ɪ7Z>x}ttų/˧7Z>x}dtų/'ޥh϶P,zg(_OO<[>B~: V-l~Y?x}duݭPJnԢpy$AJϽ҃[OLTJ C,yIEZ.so0l-sf*,ԮEulUuL 2<+N!*Jm|0G>Ze΢l4;9%dg+Sj;Fӓr&[0Ducv[yiZPԔ%ɜ4/{ 6w68!)۵ ީ=`5z'O0sHlƻyO/[7o-I||@+OpԶ1|^{JL4V?;L'#·0" )8 U(]o>$ :ѩfg>o\f8^%^Q#C-+V[)J3$` -d 5J.RVSd$ \$-VTܝĹRmJ{jQ*nѳNԻ銫b̺V9:tUzdPxXR(F9V܎|K)6u%Avmi"&lis 9r71\ͩuk$ln%*0P|5 =M@kb~s |Gb<]yס6N@^·FG,䎫GZܮacշyZ57VKKuV_i h]\##& uLMUdq<9 PgRF="냏\&Ρ*C2d<2a+*.&''"*+Zݡw8 f5t$%Hl嵬IHH8pCʀs\~no*\ "am)$`-|A  &6랠hmMs+^K0YoEH rX#yV32/LJLP }:cq0ljPx)Lp*IO%e@q`WVjiL{-ɊKɛĖJڲr)Hϡ0:+l(T->6]}M҄9 TrO,飴=Pα z:Zr8*Pu$/\•/L7|qa]n8EGRm|sRG"k -JvBH'##:AJTRRRTS_{\u9PsM}sxIj:GJtcnj9_ܫu t'e*\a )YrCm)P+ _znoGP%sP4J[۱Dms9ݠj cfnM4%M8(zB6LXa'|R}5u1gekqP'6ʛuEG^c ׵{ o*ܙisiLD K)x7%KQaVXDž`1,W'k{U+d7j y O)J#+ hW7SȲΉ2:h*X``SAHkP͕qؘ ۅq!ԩ˄Ii8܂IϤ^wբT9˜f;JGtgw@9Oj^.v:LeZ>eqвB%J;*F5 XkICΊĥ +[yp䅨98ou TZ+E;3Dlu-@4I5ANzzMyMx`M(C9 ҩ\}* S0T2wCPpr8)`1[2A3r%Q-*KhSjKa s 2XV$닍mzqv5LHyju)<5)Hj̑qi}MH )oE\/ڣ) `1y^vn6۞P u%jҰN:i)J)J7&+v4ܟؚ_G|1Y'V(RNh iΡ$:{YHlg1ϝr,&;8\tn˘<}vf9[2`#sNqTz>d.d)w%D1sr_M)UVq:F33#t`Vml2;Jϧhkec '9E}ufNwz:OƢ&b1۽ +q|mX;n.9NIucĀoEVXsO*?fu q ]s[ N%YrҬof[̓-e []临@R8>+^噈whM7~Ksu )) ia@BС~]4us$|okBPPRw(Fd9-]ymz;LJBԗI$Ig>bb1!EX-):%G X|Zq\YwٳTMVa392}Z%|byp[qj__`XeW$HYmcGrCΐ ;[m*R$+w_c7Oyѯ'EyE[䡂Hio1)fG)I9^-gnpC[{̄$ u(>"skg| YUdHC}2w4grrMjB6yCns&o2Cm:ԥ$(BSmyѯD+tk;oՁEDZ|\ %,MNI9zF"Zda\qm@}mJRRB 2=i%<"6Ilȭk[\ʹEKvTBJRIӗiھ^ϽU"q\QhOKQ1TZ*RwԭXIJ=T;SIN3|8RIc==n!#ȏ T蜃r1Qjp6Km$ӡ0R"JTYX!H  OB:Uneİc+ݷ3Π6̸&"$WZyr:QpnMJ7JKd'}@m hmi m ۭO5[/-xR pT1xLTtVL!SiZ %pGU@ Tvd+(Rs1YK-$2rvI'5J Xq,V4Ԝepb(fAo<2%$sI,٥Ch33ie'b0IӭlҔ R R;XsOMP0GjN}}aޕFGa2Yx++>Iu3R7 (?1*}ppuصeMz8* CߩeLn<]I> #_-{)sSu{;,U]OUw?B2<;w>.($yL M{p("E7*=P@`ݭ"Š[1 Yݫ}O}j+~Zp8 殍#i [HZJ9TXRC#b-%Z=vbq5}<5v#1L{O[l$xkKOn))0[<´K!I–{#F -۪[E4ئ7xwc &;CH.'rگ]0ǔ|c?)K s å/u'ۧFjR\*[}3x\h8 d=N5dkv I3VHR[Ԗq:U9^v~"*y'UV/u+Ne&++H[BǺ+{܉Ֆ'MBkkr֗ S>a!Xy$b~v~"*B>W/Nkա L%RqJ Gd-Ĩ)TjZޙ7mťN 굚m2-pS6Dĭ7Rk.^NOt\4%pKzƤS4`ԒpˡoVB8"W S=)@)@)@)@)A@T?b=8W/ wU*G'H}@c<7 qj?lg|!{z;Mx;Wf\ }k ,p/_]=&\3+ޢyx+ޮqtrc? j:3zǁwWЮWSTÂ<}]uWӤI@-8]c" GR#u3.S!爄 5fs%)yȸbpa.^T>CЊ\P][ rad6Q q);w$@Q8ρX/ZOLi<28 X$ H?UG}uqD)zZ.ʂT[Ip sVb7}љej۠Wh Wp}ĩ0 (HCMNBRTmAROd5nŏܗ *4To4¢JRv(T9g#c |cȊm6J} x"dͼ5)D<wwL<9Vu81a9P ݇3*WpF\.nm`G 8!:_Ritt6BWdSDnLI͢RS a8VHi*GFL)}%[_E[|^FT zO\NRY:dUH^!U-!Giy$c´vm{ɗ){DŽXvCN %2Gt Ziv!$<QHX_AId >:;6{[?+[Km.Ԅ9'ܻ23\!w{eʄnM.NdB;b}:Vr X΅Mh(qp%![7N3`sXّq ͐.%Q6ޔYN#[4buPu5r >ܪ0nv"b2uL) ÎcwGɨ%XEљJL,H<ւg4%vj }3˖m:@BKmKʷ x׽onl\wkiAHQB,%AIP r s˿fϗp/K%IJԠr +-شx WHY8͹>XՖVOBhi~W*hM޴E^mODR4̔@J"@2}5$Z/hЄfPhi%!p})_yQ*V PG0 I \ Ͱ+)qRPA+/gv2ķ!v[0xD$9rJ).]K\pw˙F; 9" 0tAOr2qqnڝ_+ !Vnە3ət-~;)V6(Q#qm I> `O&[*]|K+].2PJZ$Sh U;LBBd͋2+'r$P}V:%DT!GD[7OnFr\uÎ-Erچ[ޞ8 F-VaN7%uq 8$$ޒSR ֖LwB縤Fg@Y7R#5!𰒠y*'#'Eƽm /O6gSͲ0650 a!1K2!E-hңPim ʳGĘ\TT!q`M2Vn϶—qbƁC+[eǔ8M!-+3y#Z%T.SuyN-ņkqQ睍#UEEjTC;Z[@%$ ({ފ vn_SVD",^}Rԥ'W e*Q{IN6m|pGm '@ LBYpfbmIK[+ XψQ.">64ǤBy^RJRGWi )xL[u*mNrY[Q ,- ÖrA{= %LEVcq% S%`<\l(Z.#ڎ9V +q_/+9*.y֣=YF_78K\\]L7!rᦹh-6P[kIPA }P _)@)@)Amk#$@DMJByӨJ-a?^<}^(q^sg۰!NuCR_`r%xЯSQURMGf; SuیN݌-֙RR-q[mhH!jH zTxcj| lq G 9;b:n"*7gWAtVK|(l'.&p[DjmvIj2P] RdՑշd[uSdm8r,>K  B9@me5Z74]MswNF j51r:%#ƣ=n-/m߹D(*IOw?窾tVqEfSg6&kju[dҤPޜ Ǟ0BSm=c69!q2*ު`*|&Z HlrKzd A )nCJĎTCjS|Ma[>=5tpwZ:BӳMӉiTpRpps[wEsCJfހ[kvonyG* Nۆ1ąm9>7]ڂ;7o+fU# i>W չyܳQ{t|8p䶲cNQ#jŠ9!^1`Pt2#.: ,46^n,TY')ȩB^U)70y :jvEzchJ̡))^UNP½,<76/6\>9>.nD%٘{n^8@MXjw򩯽~ٺ = GHR2z҃L _o3.[< 7(jgW?]Ց'c!&m|.u PږBw#s"eǸDj\ڕ䅶 !RȊڿ]I5/:^wߧ,w ҘZ"9,E iaLEhQ9'kJ4\Ñwmj;&D=k_iz)BZ N9HYrCVX%.6*=Cexf*lfd9Wjзt3b4D%ΈRۢC[B+)j֛-ڸo-Gml5ݿzOyIA<2bH@QGNXr+n?w}7syuLS&,!I%/d `,*'RGCjLY;RHjsKߊ#wՏң+?zXwg>ߊ\GTc/|5O H?Qibq;OyOhBYN[^)s[[]|7 ?|up#RCHHByҿjv̀Y L) P --}Y;8E6tVEe(cj.U˪kM\UeoQRr-cI$U|2$B)S&C-C N-Eg^\g^F\`hNVyW-Jㅗw6Z*[;jQln)*ہr5 KJ1JI$H7%6LX;@3>hm##c:.jܴ@oڲĩêJֵ9kfۦmK)a7!ॄŠg9sמYQכ-'pk>k6}Lȅ:`Æ8-#wqڠ JH܇Q\ e>S*˘ ik[ySQ!*qd|}\ay/>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>6+OZ>k6}O5>د>@j79fCp=ϼj%FCaVo7A= GHR2z҃L}^?rտ\voSʘŎ mbjx6*@Q'rUBd8<3ֹ|{wއir2.>ףmkj~D<~#L2G ";R IO"T68?󳋊,Le .P)a kZڕ}[):Q^y%*ÅKI( xT}ʱMr8zRiJ-7-,hJ0a( Y/<+NĆaŬ\|V[^AZ|R z;Cn4ۗ)m*  O/jgV/7xvI:#/f-v!8ϧV^&j4OGF?Io)cK[we~+[;]P!XS%NJ}BWM( jgK[we~*ێ1snNĐb흒 YU@~R\Nl;vVU?fz|HZp/@ k쁹$uA5=}uEF5grs\y ԈFic!)@)%!=O:opDzkϜ[R%$^|i˪$rMvR9c³Ar˺(wՖ}%8;$uSt.* $ / 70\F9oYmC,mRx"(8wK9 Q_|Q{%6M!j@n]K=r o>v26BI[Tke(H%JOcG0x֙@BSgrr jdF.ye( 33)Hh*c<)@)@)@)@)@)@)@9ʦfr*훠t#'(=tgخ~Ѻ nPWnm@%+$u^Wܫue"$ 2bTrgNǺS"f,U)H 21|>Wty7i-7* U|ԔQZJSIBRIJM`Bv6   QbKM( $$$+hvma%m=NdsA35/ 6n9{b3|COYc,sfg)DZYǶ~* Td1Dtc,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI3Qʣ!'y,c$TXcI" tS,¸p_q0ӯ j.d(S]\L[P8)q|mZw!5';&\EM]p(*'$> rZ<ҕmR+'uB<\*PVȩm nzD{3tF!:I}7+ĨgEƾB)ۣke UA)u\RCjRqK#ZqLW +VYJ!GϡJɰb"\Zr9m.*p0TⷬzKQPt~蹮/凯)k )ʀ;ߜUٯmUFZQqP;ݡ]('mF &sM|FJnKC(+ڒJ@OLdsuann]1G-J*Q+ڜw4b 3<-*CK2ZI}(C])ڤ>zbZz=.-6XRT2Pt1+EgҞꢡ%Cԛ{=_/ёW$oS4%5^`L-,:qVq+N;, )R䔤 82xmވ02a е%KU`'ɯ5չ2 bO%*=:fiY 2^Su- ,yVJsWT"'QmZ Rݱ4B;AYnx6{Kd 3 .)8QWq W!Gw3)m*Uh:x)HBŽyU)#VG[nm"-ihßGLg(,J{I!QKr,R @Mn%y&1cihyҝ!*F)A@Ԓ(-4uM)tgþqj}L%8[Zygblyɠ1oՐTA]ZU4kz;ࣸTtn˨RydrV=ݨZ>U"vRB-sY!#O1ҫOjaݶ6X m*!e=Wm7E-eoq2ϑi46OxjRRs] $R-I)DTysUH_S0K Bv׌J3zN9׊C#(!HigVBJ[A+W 8Ass65TmS_M='rZ 駾D.Uտ#TJ]4c?諸@yI>9ⱻ׫hŠ)]YyaVa$twP[&AaɐPYoF#k:]B,'p Kd@{\.K %PSEJ`.c ʞoN4{}oAc\BҢT#'Yerc"2-;Abbl-JB^y! VVrHy 2{{UFjg&%*t#0RhZ+A+6kM/FlQpy sm-'%JAT&ߡtqYy--$(xRRRRUsZG);wtzn q:u`FAG#qV:jUl!_S󮴒PZH(*ΜӷD9)AۅHp%kq$p{}TeۤX'Cbm; Ч! Gs%{ӿ0c-\85z x!PڞR`TMUlܑܯ {+tq68xmxDŽ$QLشݿM&.r }p>s IEnCp1ˍNŏ"Ly! [\U\*QA5GQϧ ;i\Dbc)o8-R[XPh)es+gG\5.dņ#&D Bm=jT ʡhKkl%E\WhT3+Y%R7()$擰_V9'rdFBQ TilԂ-Tsp0? 8jNiW*TcqqNmBw!%C !ݯn)cBC됕HH,"BÎ{j‰8Ҫ:wDK{dD_@K-yP1C.L;Kِ%2 77lJ9aae\-OA\4>fmNVBTnK{Aqd+_OΔ붇#]\;I)}|cw.*#n2Cz;yKkrJgt (p+=] f ~CzVq7jT(7'iPBFh/-533pi\ZxeᎅQϻe*I5#4tfðShj#H[, UrNyti.ݩ*Ee- oLo>Yj{Q"-s`CÏH,28G8i{H`;c%j7B@AZa#hݻ/j&v]q kXHnbTqY/ˠ+Čۺd}رsI mJ":_ j)Erpq Ύ_eLD,8Q NVCErm>&:bMnL1:78JO$]e0y 60És#J2#$( qϭi󎑗uL <8K-e)I$:}=H }NiVm[ód-:iŸը]j{>ns6x CQ\r̲ iԞI[7TַKD8ᕶ} wz wxpމ Hƶ<8^WӁlUYQʔrsRtD=hJB DQ:d:Hq`洑uPO!eL`.4ۈRB#(S6bWMJ;Pee+$=Jy(Ni 2:U33_˥^r{f;ֽ{~*aj{tO]["??MlU\T?M1] \L}WCnZ:+ mv[dġJTT y18zVݺ 3Zamb1+E)@Sh)X9 ֝bڄ%Np[cwzo!mc'%5D1Ͻ 2s,^epaJQ:ҡvg$+fuT &X||6O $+@'>E^c\ҹs tqrAQPۮWxifgsiJ%FvXoV]ŕP]R][8%!Ehr': K{[]5/edJrYYC 6Ϫ1|k;MD[z+kly FG@FhQRr8\}#VkvhӼlnqҝC7rV 6G,+*:7iVX6v@,,IN #`{z)ބnM;u k s5KjX1xtmz0YB޴A@l )T̝U?FܱCyRVk zG`}~s?4}~ڪ]L`^c[)654؎ A€@ϵ[E.-"J嗐P)IZρgs!\^_`dxkHcrO=?u<>s4.OXP}?N1Aź%9C_aAkS[~ykn?s[(48_`k s5bCu qn?s[(48_`k s5bCu qn?s[(48_`kS mm/OǒV8. BPwmjsި+w9ƚWsn]Z3-m~Sppq-w29]P!X:$\^]nB[w,c׌cvH5ݚNM!<έ p pz9 Aٴ*J!?%o\'aeE, Y!Hcj'VNҖ*rL%RIąCZHx!);I1^H$% (qԤ)ORcѓWp6Xm8,W)@n໲Zޔn%GE<7V͸f["*!"$%֨6{|+*CQ~Lحňp)ߓ()!ܤ!$S5|lۤ(gpC굠D1*s7df=~ tϿAڮ6۟Kh?% dM)J)Hm-9P=.Z/ Epmrܝq(mQ˒RlP$`vzz}vQonrOSFvd5mLGqN@(FjI,lq$)о"S.qs_#@w:b:l0ZIJy/U^iyU8"YL Z aŨT}K9ד- Sv;7`Nq 0-[ ɀ@^{v!mȇAl7ZP GD=55fr8NkP='9 ;8e]GshڐkV0t'dL[NncD^jAq @lk#A#)#cݬOPsm[ntuCWIAr\ub>Hʣ:<)5X\ YnOCIRc5?;/-cNR BA撀@kǟl֩w+,׮1'%,!8طRݻ(I= GLs?~:U1N l ZV-mRӊS =ANrLjA˝-𝳺;JR %/^U9wV'K.-1 "E\yI RSH=˝HiHvUԘ`%e*W w{!C+}9#syPO|tݱ>Jb?&YGs/WVT{~*ak}<*viD\W=q}UEcsWՅ=FI^t$0(7G'm71Rݘ$32Rڒ+lj3@V$GBI HۇWX PT p>gTEm&bK X#5L"brۭ:ʓ[ *SH>}-}/-Lc;wdgA!m6磏!J&9Ki 3v6}9VG:Fk~ͩsKiAMר5fFBV B)RNAEs EbB99!Fa-%\T@888:"o|uGHm!+m+RpP<[W}+m ֝X@}1-H9Hq)X??_by{Tڨ,ėKr2Z3K#z!:˔ ʘ%q6yrzՆ3JmNFuJ[j HQJ QIRBR W 9@4-~mخ!.*>O@v%^(1JJP} Rχ%5S:ġ6\>KJ}G|ݮv43.>%(!%o%z gک#nvvnܢȶ i^g\-a2Yfg. )iaD4iԁ뫨N\;09KNλPn-̲!+yWuHHI,׉zԷ#v֮c™EkCkZ$+n29 ``8>ֳӚGuN&sZ.Fv}.*fHqq[Ԡn2AW/Q7"jCpIzD\ )ilB_n0wub#<^koa]_ HdN7$r@ ۜ k̜s~ {U;0NoTwZoTw,#iARRRRRRRRRRRRz 駾D.Uտ#+A}4蟥ʺDX~O]4c?節Zm x2nIb3 +ڝ%K!)zOU{i4UZu%ˢ?{5lHBIڤneGV1A)ƣvp.p^eJaeޤ!)*IE[O{d8.Ѻ3廙\Ѹr{>nx |vYOcyNJFxOޖݧnqeCTT&#Fxt]u)Nu<y# >]KVFDZkKd&ؘ!)Yu@NtOP)JP*8gT՚3/}oƂۣ]>\Է"CMoOdr3:~5}rl$"DηqՔ>jpt#*J_RpHF usq87H6+٫?_Fr%wTBUJr+AW޷ͳ9q_CmLDHIm*6VOAN:WƚPU:4奴ˎiļaa$+ymsztBxl~Kq+DSϖ)*NF"smagʹFɱY[AiK6+RHQS+*|So*eaB *ZNeR X<)njYZZ[MΕjDrw̤) TRzs;g=L;l mQRxr1$sя4yߏ,?gWp=($DSrMyvȖIq&aBBO)Nĕe6('$6ЮQci]*0]| Iu Z JRI #5va.Qn EU)I%qJNRP2ch}n񓹈x%%C$xn7{gRLiI̶F()TY%#Rj֭sp6 fĻtT#n2 S(8Pv(+Jfl)H䕭 `)C$T/n kku?R@@t! #x@Y\OE-#"{n5ն)hO"q"Ĺs;փ)6iBrO%e^wn<;cf-kl Q%KJJpI$̒k Ӗ52dAcKe\<<ͤ0qALم]VlˉM[N \%*#=2wvmEc!$NR6H>Vh 4X [=EFlhTI#I5tV]lvZ-ȓ \@F '4#+\e\LDvbG[* fqQu^B ܠ6U`vqA6ԇ(-e'j8 TTH wHNMpvuo3 -K!I** $-c>+kŝ#RΝ0()e[6;w+)wI% .Zᴫv#K9PgYJs0N9;)Ă)@-=]-=] Pm(((((((((((((9ނi?Kuo5J_M='r}譴kI>Gi]MCLٍ1 BI$avQR']FAd{U.G>kGVNZ6;c;$YR*VK,KI6kM=%\RޖNZKrBR Íȫ髂PSseG l$s@QT -*==e 9>\|-V<*bS-Tֽ?$9)\EymIoV_g0\$C)l(T1Q_ۿs+_H+RϵKz}"jC\ լhTܑ;T8Dg% ;[.3Qf:. G)[x)#cS[fhuK)nkdYwsUz \ΛH[޷:e*e ic`sJ[O-u˳9I߹]nԢS<"4daDf.N!#_>E6֔6瞘^0uUr-RcH^mlHI:N=лuz%0˹/0DHyOFy-@nӯ }<~'bF߭ SδF7*U-iA Y^![=Ud*@zC>򓊬in̯EzkT> Dw&Y ?5gsd//5vbСZĽ!rK(Dv\KB0!)PBfu>8{2l{2ꦵ.s't Uښm[vPomu`a ۶!A:c'M끰ˆL&p."QJ opHgfeِSeِT&jۭbmD:DBq /F@=p ;)3}LH*`8. Chu*JP.^̅E.^̅E\?6&BE,oNSSuZqAXBʐv'xA)PS]݄٬I)>\q'2.nCn)nCq;Qx{E$eWLgȪnt/e27E;?Dž>ǘy3;RrQV^V4c>u1Tn\h^S?".&Apׄ) ʉu(($w|#89oUj#CR,"=MB\r"V8[U$``5kקbv|89ó+?r~", !R@7Szfjnb@maW}eGK<%d '=y՛)oЋwjjѯ`ΜNȢ{E3GgTg yO.t;Ll#Iʞ6=|%ٮ=.}O!R6TӊMj[ҚnULO9{DtȫWfw8f#(A;Aud*:lij-*-|6ԧaX3W.%;YI1n+B+B/PA= $~Ю]]VçKEt#ƣxcW_ۿs+S[-g.S%Z'NG,TtTs4q+-,uyUHHN0* {ޑ^-kuPC))0#-!=6?i .ģwut62ԯc8Sb@89&Mx[unBV@^27]Hm.kq mIe8H>jHҺzEۄ %qv䨌G["hSMܦ$n%#krRsc8sP_Bey66(/ Ɲ]/R+\թ"*%e AW1ԥO{뽎:sI nDq oğ[Y6,u*SJ(<"+]nmj]b@o; NS}m)w`VVb#sl)჌QST]Ĝ1U2"wITrh2OB4"`Co;ۻ|y(!#lVv~Ji5 OY 00̸)PBё)JPB|jRwff+f[1iqBT(BJJZiTWyYW>e=+p9 '@B%)JA ޥX4ZL4V66j+RW͌YUV<҂ϮF}XKcȞkrѽTPIPEeKa.*{֟eebw_G-o-qm<#̷m?WfҜ,)wH3eIs\r0TS1cC>֟efZw]깣>?*UN娼Uˑ{Nw}g?Zdwd:>nW׵C.ʌí3cj\P9F:#WK[!ڶ$Pp }_ۓ-E1o!@lay^ߵZ^f֎ݪno95lin̯Eoj;UEv?(y;p{PSmy#4tշ~W뢭spnl+n2(SoB*NGt+pPW3ֻ\߷2ӳClEm-?( ^ԩžNeJ 9Q#'gF|F?PsF7vLιzJ$;XgkG E$\'d\QC62[lAD(` UȠhro^6R1Ri l8 =1ʭͷw.ȀXRҖVcpH;,Ќ#JJRJRJRJRJRJRJRJRQ7Z{-Q7Z{P)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPs{~*aj{tO]["??Mm]\T?M1W+TӜa?`&ꮀkmjzyb׫h9t[ xI)DEB?O\xCz*z>ijV,qrZPܖKJm%+ JTI”2k%Re %I Ӗ1*Czuo!ڧkRJ>ұIJ8\sHS&QznT.2^G,,a. np'#iMF.ND)/BRvY^BRtu+K * q~qt "5[¸.H;H2:ѩ=-S/k% ˲%!AS聨Jq-r8Nn|{yuקvBa.8B  zˏ5F-){\/w10f%v۝$]Œ"=L, wRܗ9s:d>999~,7c [W)r[S,rPUDL|Ph{`ޭ7g[;GU2]e2&צʤtƸ wm0iaEiJm[DAOwr*Ţa۽;e?ƍ\f9@qm 9O;{[Uis* 7h3;#Ga+O Iۻ_.ȭ:G;U?־U*O|5O?־U*O|5O}?־U*%ZŒoZcO5A/J^f?_?5| T?F}hk_*5| T?F}hk_*5| T?F}hk_*5| T?F}hk_*5| R|߯?־UhNg4./yw (qX \ҰZ9U~ҕ Wn?GQcWt+>koJd ׋?VaJVqѸ}0.O鿢OkM)S+ONPm2J+nNJVcawFSR?'gb}S;_W3+th談Izo?O5(+e}_x.^?vn}BOR[֝-&f5oJR"Ƽ ^)AI{i?*iJW8+}Wҕ޼Ն)JVe)J)J)J{mw)J R R R R R R R R R R R R R././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_pilot.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/omn_pi0000644000175000017500000006563111520622614034002 0ustar directhexdirecthexJFIF,,C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((" g   !1"AQTUa25RSVqt#67r$%34BsubCDFcdfEv&e,1R!Q"AaBq2 ?xBZj38O's=pZ7tv[,To1i_߂KƬtXJ m|QgsV`nG ٹY^"...5dv堜\bhYĹl073/{PTBʶP>F:PML$2seZ"K)m%xʣHjK;55S:ns'  9==+ɈzS e=KCy +OF'ۂݻ;C[A[UUKQN+GO[%;LQ ok8'iM~ s杙Zޖweblu*q3LFjj+:3\7O[2zh jj)tک&G1 K- '1[t4T7j %i8Ÿ2JYr7+SVԽ-lcIw(}nd_lxH9QgϷyvX$}*3/Ysŷk#Frްyzˏnm` {zɏn`,j AвXL{wmdj'd _8lum!9d? (%WTO8- :jf` -QMUDtZ $2( d|@":}w/;\{O7ڷ҃,[<?ҷҳ1[AY+Mk}(&J^^m|ov%6FF nھ jw7vP}A޾ :Bа:gh_Hg{>Y@DDD@EAXVP)h}Vcbj^{SѲ6@99H͠${`͖I3Dیl㾮j1[i&8seɟd]maRGyLĮ&#* Ƙl6{M^nwxmƞ)%tmqfә'-idt{.\E=44XތQY spӿ?:Ѭ홭 w K9"(S|52ox|68]7|59>(Ps-iy>(S|51O&N NO ?0hy>pM.>GC~a9鼟C~a>Gm7>p<8];|59>(PsdwN NO ?0iA{7WԊțK;tۨ\Pт[ŠYDژq3ԁu\L8P*` dڑ07eČ^TҲ})sѹ'9ߕj(iE $G32nO?%WRWJrԦhAyw 1?8V4dKbL 5A7ߌ{s '':I^[ᆲвs< G$g;>UT8kd|d$g#8 j4v׆ TQi<$kH$-]MWyP~'HLu/nynNq+{Ug=%Y,X*NY#F^ Vh⠲K i#0v>(Ik{g 1KtAD <4ݦ`lN:\3åV斲[Z+SRӚ#"h l2B?Îަ @I{A nHy.[)A SKmkpݝHO=m-C ڪm lF1[a$ ALKJauhd *$`uN263u5%T:Td>S۶q2qymL!o  j!۳F0v}m%U9ʸmb2Ӽ4R5}M3*YFɪj0mtg/}nK ǽMթ~dt*_8/7V ަԿ~ *u ަ~^^Tq>7Wަ~BsSuz_Nq޽^K/黾|/,&|;ϸRs&|}TciioU$U?=x,8aݸ!E&|uMR?4zkL@9kc㣘JV\"1#CNˀ#$c$}v>Uj->niL>&JRl2p#G 5b[/M t|'wx#2N5hCdiqnY)#!AEˍ4AN|q%bXYve qsH$Ej2@BvA{x]y=cqRqzN,d6kln$s i-$cYAO2cG{vóӇn>E᧗ۧ;Mѣڸi"f ^Zp{{R6Xb`Q49/OH-zw++-3v?&ËyvˇH8;8W?_qhlCs{!p)۽vVҷüCnNi=߸3yr;ZWrۦ?rd9|wɶS+{wx}q_Ni=S+{wx}q_Ni=Vry|wt-CS&@b^F9S+NLhpf1\k^wdjY%~)Mj8{_ߠeyp,uڿNnW=r^\ =vӁg\Wq7]Y&~)Mj8{_ߠGpz: )+]AJ[4)e9IF8ʰp1o֕MuĶn}֩ubNsrډ7 ;Q}ڝ]auDe勇PI#3U3ojZ﫭zx+hvgV GU?ddjcqWtpI;sBDΨݽn!ZgzWP("){w4y<tp G۩n7*lKKdsLesj-+m4T۔t6ZTp xq$O1}uVŕݫbm;^bI#q8ikYڸp8l|GQ36a$LXDq8vxqҳ-Orc38> ϳ9u9(wj*iZSŏom,$CH/b.n\g'Pd'lbGd @T9T w88I,AnVbqkݡ:FMGE_N(w Aćߟ'5⏏K;nDpqFݙ״zF6z}GRm\dufTҴmlXFI9O}+#q{~q^iA=dO[:SvKYAQb:YX塭Mf>k'~pCUy潤cL?2yj̾OD(Wkڽn/׵{f_YDO^j̾s^3u}d]TWkڽn/׵{f_Y35^7YNkڽn/35^7YNkڽn/c?s^3u}d潫f2(?^3u}d潫f2(?s^3u}d潫f2(?s^3u}d潫f2(?s^3u}d潫f2(r;{We9iԾ 7H>DgQtHZ!Y9.];nxIf?e>Gd: Ov}A1E>4_-SVlO[Rh{dU: T7;4‹!Xn{/ןA4HGʒ+ݳXkjWNO5ܸ;{0Cwv#Z,պP Ue˿\oZތg?c~11F٠LڊQQ+-p?ڥ&HtluLCG| 3L:Ouui/>{x>t"=hM1Nz,Vr/瞌滼4y5Wh"GN; 7 mβ K63yʮV+JʚJ1!w"nHhܒ@ MJcE| ~1DȈ0׳gb@17oWWZmEunG77m흿ZH B2ISӉ]pCN˲D$ jA|SՕSkE->4F]vpN2Slǵ)3'NK6xNeZtZ^O l-c CL6qt;~u%HpO <klbd \'.cZKƍpR:]8٦L,xyf3vti'A lɜ9 9ߛP`V#ohZmiʭca<$%35 FێgUJ *Pm'orFYNFYAyRi<})ʔ>I\>(Vz>(Vzu^TOI\>(Vz>(Vzu^TOI\>(Vz>(Vzu^TOI\>(Vz>)VzXu%%IiC,dp:rAo@ e.d[EkXy #ڻpYZ: *ZWt0MG -}\3N\G )hkCRpNZGQTݪjZ頨ksU0J Ld=㿵+W0uzp$õk/v羢)]MS$ glpx8;9y[WCSMEuI= r\cUreۀ sgr( (TE(icHp{ ߜw:;t -Kͅc7|K6j./f셬!TQݩk"t0ҊSL=NLa-atqH{c!{;(k wo69]RM cͶ15Bcs_I{yGJj]AWvѺ##;m/nu V椿V{x$4s[ff*0Q-s@e|P=̭<:bb3wp4ܪjZ7Q-\Jq칭sIU4utKPlo%8s%~N2g8 nɮ,$PTHLjnf Z 6wweEs++RECiԆzۻ yJI ß\0 b&Mеe=U%&kƌTE!F0län޻NZ YA5MOq ] |TlyXLaأ 8ҶƮԳ2+uz]H's[ 5\te2woWiD sI(,R}uSTIMn0 9﮳~qW.;&C߱%AeU<|qq'xa:g9ogxG/c:**^XWWI{vC\7tʼgj-s2'=D9{Y.jѓwB&h#j4|awL|3mgs]#KAǻ^OTGLZ՚]fG$<*ƴWn^ulOt{,J!./;U.V"ođ:JiZO H#8p@76MI_WS1Muφ6=9{Gn=o Ղumtd`5 YȿxŽ7dkTnpK!-Y0^#n_mm,T.lZ"Δ.247OA'֠žv<+#|{ő989]Xp;@c'kKriʇo)f$G}?jYAoP}⑭|^kSײQY2qkӲqѕ9[xYR"YR"'֠AoP}gKrgK ? ZOA/)/(*-jNi?+(VxTH(VxTHsI >9[xYR"YR"'֠AoP}gKrgK ? ZOA/)/(*-jNi?+(VxTH(VxTHsI >9gp}gKn?MAdP(YhCmT m 8jaecc{$@v-q>U5 mbNOYGvݩVnt_ilfTэ2vI~:NJ6{ ~Oi_qtz vJOv6DWPZT]#i\YNet0vjiYPamynt'rԺv[PԽ1KUΧdkr6K$`&t暥A%DXvvrc>\d^k苞YCRQE sbl^N^֋4zP^&7dQFӖ2&I{Jk2ii粲i*ZcssmY̍t=[%3NJ^2G85űpvk[ڥ7fN9i0lm8UJ~Ņ8穻QI`0:T3jwL;3kqg#ųSUMr:i`}gC; cI.ufvw"GͳqXExc[yq85]Qsl\[W1?or }_Q;7A;\UvQkZܯ@4`~XvM-Kϱus?ؼrNVt=n!$qtT=OctgF.ml71 "" _~:'a/??n^B!A[~?8"~ObڟSysvARPܩv ߽m p tlp-#B]kYrfke9$Ľh$컣=/賄AK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrWǍrԮ~qW.Gy:0wyeiA$AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ3AXϑ|8n3E >|wYE;|>| >|nBmyB= hwΛ@PB]dUr#kowuT5SEt[Q+*_28k)ߴ@= mʑIt-5Ӊ.344ݰ1\EYIy*jg gd9Ygpgp(/gNjK{OۧWD@DDD@DDD@DDD@DDD@DDD@DDD@CЈzV6?D[=DTSRiIURsv6^v@#~7ޣ\tU\glwZ|meDR_S9ᡓ'#uU] _SmyZ济~OM.v{۽sq7|*1I-Fu$(ؓe;u>v.VhA$7U2FFG&O8Y9Zdq dFoPQ ~6j.l G&O8Y9Zdw ĿV$yZd&O8YC2U)6jj Jcg'9ߴ*ԝB+WxLqrw(%U }d4X8V$yZd&O8YGq-sR}2ɠ#sNiPHrw'+WxLq;uVwVkC:RF)kEl%6\仆d j ?NVE-Hw-iϽi\d9 lmn wmm1ZLgQ X n4s YE%b ;76W`t68+%oN7;Nm͌q<;ϓ9M|pw|]@T>rN )'Nm˜qNg"y~?w TU6s Pp){ /TL҅3P{_AFwGM.C~ I(xD9z~Է;UMQSUq{p A.`%nYwc"-8w3^\_m) !8vA Ko-[=nO ѰE-uU.1M dk[8nˉ[f۩fN*eA x 26qNoկmUe\Օfi!~YEm!wSDDAK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrZ}=gfWMGͳr+5`MW&i<G@8 4Mk卲#$2@T6[mҜW+$ A Zۜ?tAqT] i$߽-8'h=z]Y0nt|Q`ª:m2H A^&TW,4hKa)i&T$3[3FC6Zop-?S;hJ VF`SIqu=cTFHC$ 2 KsܡGNrwsV%cD {-=ޟJ bVܖMp6j{Rc?cdoy'<R ] *s55TEnQeKmvA [ֽhg|B%t";YҴZC7$W תh懪ZħZ6+gn7WQJٛi7l0ɡit"U O5G2e8<UNy.i}?ܡtϱ_:ec]P􃾖 ZSS6Skz6*.Q;@Xc-cKݳ3{vW;o 6{hX 8nչlY eӹsx\uKGx7R!ETf5Q69[#8v Fw)pS gK}3vZї3t zptzkKH{⇿%Js6*cltcfd9-vwGt-;9 /T>y:q[F>n2[**)Tf)|NقӇ;et tZNRPR8C΄7' BӾI ~Zw)>дR}iC-_O(~?t-;ᔟZP j*|2JO Ne'֔?|ڊi ҇BӾI G?P?R҇u-DV#TJGYO0r alQ; ~Oi_qtzB ֣\Nk(GFSZóB^\6XQ/OGPS^U(*]I j!P[y>I &9appsm_0#Yjmp*6 k9-.B"ihm61 vz[a0UݞOj{5t6CP$TUQUDCFĕGaN1ӳ쫸To冏R2=sI-n,woӲWvQ'6WgbmtА9*fzy B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~*)2λүiUWg9 B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~*)2λүiUWg9 B ?ʯ:Jq !Z|UANBЂ2λҜ~**VPuvz>* ʯ:JrT]+O:=(~**k I&l'2<Ҏ Biϊ(X&!5̝w6{ ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DD=oQslTM=Qӟ%{~?8O~Ttoj_DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD{$>K|.C'_ޗA46{ ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DD=oQslTM=Qӟ%ygfG*gd:罍?P H?Aq(?Aq(7Aqo(7Aqo(7A=.yӵS ZkqtGj=ͳ_y&>Ⱥ[cu8$׈/88Mgŝٟ38uohw:X{Dq(t֏KKujF 6G $%ҳǶ{] {;<'Sg[CYd elrK^XL#jVm lI= Dt.9=ށ닍'E`\"iLS [Nta󿡦bt?K]'&Ҝ>>>´45444ߣ\8iB7dۓxj;c ;U]d4C-M=;%/kq @NA/33.ݓ@uNoh}|Wv U%|Ts[#⦷R55-$DEݙ@r6y[5e5HB P*Z2#l ;%=m߫LLI5?UswDҳJm2agu#+t_>nh}|Wl~d7SndsD%=ssE{~77_y}@uڜ>z_w0q2y~; nh~=6OhWl~d7O/ͽމjma'~މ̜>z_peDw'MuߵcZ{_h_4v*emWlhnc}=Ap !m -z)jk'슣+Z9hϳ8#vWȻvGuX\)SJv.՘Ҍh`|C XK=0A;bJv0Y4b*i=Hyvǎ쓰=Ź>TZmP{1veh#e},v m%th$/y}U9kq8ĎAF.y&!4cXuzMG:8>"w;WקqZrK~mͫ:y1'2]372rpq!p-54hJIY ݝ76ݢw'q'^jnWǪj᭖y65.=OuXs&As3ouah&&|@#kchɍΌgg]Sh*"<3`?;eykzNB6jfR& )!kF8G翔$u]K;ςx k8mK]yf}b]ⅲTܴm;]7hesqsgTVjI#wakͦ-R=^*sJKL%iqys̭iglFFt;If5RQ1tOݫG{vss}i6cqY1g|= 9s@ޢ-_Em[m*)`twJjXIfH-N;N쮥j;Yc9b71v7U;7J{V>'mKf|mygmFs !JlfCޣ._ͧRIfQ[lrVOn:f(iy~FXYV􎌚w^뙻ѹ>˃-`,9I7VyPTpvNjDIh#o7{Lhŏ3l]tcQ "!{};M9}}E;fsѯ}Ln.{ wxwUi?yVSݮ mttE0o$Hhت]P*Hdg{/|tΌ.兽#zsRX;\.5tvi)eGc<;Z  2p$dtGbS[`8 %m7pNi 5W#HvR8:,@8?lѺ.i. uvSHO% {㉥-Io\1˧cm)k ItrPl36ZgqQ˘GqDx g҇z繈BsH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇z繈AH|yڜgOPpxg҇ztaM!Zjֹ]"-unsaH>˾>?xSɕ٢M/v&1 >|`s%=}ӫڢvDDD@DDD@DDD@DDD@DDD@DDD@DD(kQ_r畼_kw'tsK]R pcvH]QskTfS1⪮=Lq3&GĂO{MQE ︲IS%]`l-sA{0{{lp.-cg!vdǼ9\ڈp;vOH?W"Q>|( Hq~ ݳdw馹u=n#F`iypl3{\p˽wQi7kS;??PQ.P_j晑S Wg&96dsȧ([đ\iih7'i akz@-9ˎQ[{Ia࠭뎡xBحx' !CsiV֪C X*j&:Zݨ' 8{kSn8ڻZpɿt ٻځg XZmM:niGִ}t;o]~]L Zm񭫯)[|mjzꍤZm=t;o]~]-^RӔ5u}tHyNkO_NRm"+o]~]9JkW_AW6u=t+v[V Zm=[Q롹GM_i)[|mi]9JkW_AW6u=t+o]~]ֹW_Yݹc6akf4W?w@kA8AK{OۧWD%=}ӫ" """ """ """ """ """ """ "" ΣW.qm  al\@?#ڭiծ2&{8]-ZQE^XY[iݴͺp{鋛֙m˼g~z\h`Ӵ9@آk$ly'~ۛL 6Hݞ9/fh)hP54koGH!b>-h#j؛hG8y.Mlw^ {Y܇QE@@ŦϏ}U#A?z;PӦdO.XH+_үq].h)CpLQo+}WSiYp`{fk=;x X6 ;d 0ˉVbSɤ*[*#Ό7#AչfjmKQp@ YÝNޞMtU8mW&~58-tΰ@GZ}**g)Px|iZlh40e>w7 WV?/l&g7p1 9)<}.GAM%nIؚkd51gFesHA.+ʇTY3+ttTK-[id7vǣTv̜ݱmd 8wgvNte65*v3 *OnCj-5=:V2Yitl`x7-w# F(Zzqe4Nch!]$myep~¡줃Dٶfl,cr0`{-kWMnQ>8{)$s6CNv1; >#\J6Sx|Rv~F5n״A~5WV?/vSO܇w4TGAО/ -6GӰ;p(tկ^^mn$0>34i*1UU+kcb)"FHaK!ԶstsiHdm531B*IJ1[ 1Ko9˳_*:e4gq[@ ͦ0 a"xiCoGq<'7)~ev@&9m=hC!{87ǧzbw),Wxm6 ~Oi_qt'/u{@DDD@DDD@DDD@DDD@DDD@DDD@DDD=+:ۋ_r(h:zjj&ʱԗpl>l+V6?OЀUG$Bbٹ#$c0KRUՔ 68iM{ikKAHUvC%u{ELXe2`!-;]uwSEqt1X׈쟇d3T)+16#ҐbqkqwN:*VtagY]zRNdh!쌜t]{3u5msSH^ $c;71pNB[u[)y0vߝO8&{>Y}AamͿIZ4!5oUIC:́ ;8_N ϢkQ\%TS寒*&48rs4i-mc|UYY s㬜S0LAqvZѿg~d}6 ]gF4I6iW<YL;W'kE=TA;#`RBj6As[@qjO.AS[m pкfpLgJL`{g2ޗ㻞$q^![o{&PRSE 8G v+Y"K1j4xMm-=HtD0{Z;lw-ko[o5msBd|B+6Z]s3^4zQ )aF"<2vA! ZaN"4zG4?)P]5uT@+=VW S# s@x8' k+Ү)gZx@  kvF@/Tow#TrLpLxat8^ nqi4.Q]Q&)GE`dv6N}[s]4|F_Ͼ:|sr(X[3 u eHE<z+l4RI.{"k n8qvX:Nm_uҶ;ezJz)b8?fF[;[>\/qWTUU8Tѥ>yctҹ0z7g>:Yl!}pQ>^yt43a vۻʷ4\ /O;;C8n/q?{g :02֖qF?|W=jmݷM{{Gl!8(D-x}m?6ȩ/v%cLR9h)uwc9]TZS: Lmn'8V!ɰÃILgƊwORoMKas $9W`mp5a?ꦪ>Ō{C^ߝ}pmg 3B"4C;Om79Yp$JΏ蜿WpQ>TlfkZ$ӆ2pt'jc+Mg-D_)ѵK{OۧWD%=}ӫ" """ """ """ """ """ """ !D=+zۛgrcZ][Buщi %~~?8S@?\A}J -' f٫ﵵp7 )6CCCZ" hhߌz=Oâ f,Z0T,kKir3ɢcI-hv/U#a#GWӔGWԺ)U#"I5֦ApO5$'Dj" x9݂{ܘE j+jxҲ1d2`a众wQSE^%16"-a8E {N{>}uJ~7W`Uqʝ$DBryxϹ (vC cc6Nl9PhTUVQi)a|3D$ð+ +Tw+4ck#X`dJq#v\88KOŅ-+5UKҾ)Z](/ ӎ$d ^:,u~~]gGWԺ }}s:Y*!hAn\⣥:xaZpr *}t*}u.nW nUx}u-W%C}ߔ+` *}t*}u. QYYQ X= F0wtum-=="5#i.~UDrrWӔGWԺ&G)WRXoU4l61(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\Ҝ>(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\Ҝ>(&QCsOx#:=r?J P>)έ=O\҂e7:=r?JsOx#E έ=O\ҲQ`y![I&CS`=_N?XN.Ӟ7(~tyksOU_O_mUM?J֗M~CtHDp1 0zG" _~:'a/??n^B!AZ~?8,#S[i.uUqjzƉ_JǶ杜*~qW.sYn?sѵ#v5TnKe++'[fcDl *)`h>#>53@K֧t7b\ͶL>_Nqh<'h>/ YԿ5g'A9Š.Z0va=Y>vj|wh>qh<(~lA[xVr}DZ0Š.uo'NlA[Lqh<'h>=տ\Q9uo'A1Š.Z0xVr}D=տ\Qh>qh<(~lA[xVr}DZ0Š.uo'NlA[Lqh<'h>=տ\Q9uo'A1Š.Z0xVr}D=տ\Qh>qh<(~lA[xVr}DZ0VRӚk#smMicfAnFCG{lA[b4k1U e7m0#8p4$mHyVBsڐ(5{$ Z2:v*s`twJ  yvs<졷?h:GG{+jq·j}Ab*֚'WJ1_#b{ZIsZ1T&=Ws.E^"q!q8V/7+/ݐ-՜X;y9p 9;Sii▵i]>17dw AnD}'/u{TN_~:""" """ """ """ """ """ ""CЂ~qW*3)':fB^ ר~qW*dUV羮7 L 8NOd ֶjXTmF&VG;hon? HL<#!V=-YT*o̚S#%w6zIf7xZf7c`, sZޜHX_ᯨVQ ✊$vNl, SWUOOMzx鶅di=pnz =mMU!SO3 ʍceqf٥ѥޖSWSHA$m``cZ p9q܂Ox5SOCv>,V"w*/F h3g?,Kl6+-M H6&7(vlros1lhĽ/5cA.~Won[ ^UfvK\_BAgUs;\+"" """ """ """ """ """ """ "" ֢pNTgRRFUKKS4<-R@؈-ԢS-(u(TDLw-lEE ȵI *`kZֱ5hhn" "" """ """ """ """ """ /U8ۂF罖" =*" ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_collections_with_assembly.PNGdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_co0000644000175000017500000004163611520622616033763 0ustar directhexdirecthexPNG  IHDR3sRGBgAMA a pHYsodC3IDATx^O%]Va-XXWXD遌ĻHޡ H&dg6Hi,ydEJ|%8#dM!NW}ϑs[߷~U}Α*^xp8VϿtW=~>lq '88:8`Iqpyy889 qA888 885tGGG p,R^ۊ p̛"z8AVkb_8r98l8PDBi{L`"qDp`@ %]WW^WB Χ㑦2aā8bvNf:@8SlHND\+A1{>89fӚ `18(ҽg'llG]f_q8lݗ[mvU JT m{U%/?ge ׂ+"5 808(@;+:Z5 GŁK:m#tP)|f~[BhC8؊-ÛJpluU\,΀r!.`7"jؚUȴ=\ 9ӈ> w+W}pq߻b̂gfp,eޤM*wRLv/`}'X0&.uJa{EF٦fD|}%zYok3=F K+)s@qP4^ mH8(Q_!zr}+b1Xb rNrO} ^uK 0@X3գs3\2@,ΕΕOp'Mk@cicΎv#83Ҁp8jDH`p`듯*5CVᷯ81d`i:a˥6q81ߵ?VW 8Vomh/ug6wrmu6X4BETNd m2- G;ccb.bzEfimȮt},E.5nytmž-8(|ey9ӚSc`..'q.r5EQāܹoNN#`0rT9|Gہk.ޔ8[Q ψltJUVd|6\6ׅfr>hwvkjBȚ푏_/uh"n^>\v>~{%;nD )"b-:#!-NەSLuxmnfHsϱ]>4v)1[1)gK|fWRlpuˠrR67$.LkδVD 1]J#&YM k,S&Ĺ/6:jپ*\#o><֘ugw7xm NE!N$Gq w5> fs.om^ evP7Z1@ߖ{xLu>nR16We Q#0Lg' M|ֆDFhtub3$2S7f\S'% c.R5촱8H0b8άȋG4$ )'oob'9c80VۀH`8ˏRTY067 &6ā[gMپrD]Ri4{DA 2J>z0%JYqUr0m}Ny&fO&ژAA`ЪۆcJP+&rXFDQ,iGqP} Ti+ "O[{"bӲGlEsy`a_+`qm]9⠍8pRe}fr儀Pq^uM ph0lϭhlcS4j}| .+m2A 956$ 6"}B_#Iw6A 9+%s-{|E_.|L}Dx {a.mPཽ23mأWL=xTSҾHթÝP0w7l[ڎwg>vM]:sjC ܌Np7$m|1/PI_ {l~[ƉX Hq1Nāej?{ç8(Xmfs~sA,-c>^jk܍1gqT 6i1۵{uvjxd6#&1|}>=F>[`6 $@'02]A ko;+FfF7$ߞ(mƒzq8hA= 6*܃3#5pq8@\&ρ58c28)9Mq@`X3)q`q rprVp[!3 =c Z :Ѵ,=eZ |E|1-{#8@L刃ɛ, `FLD4@`a 4`&  Cq85$mE}Łݏ!T_Ko6qb}צ ?)׹ؾ޵ VERwhé!fztTاK=C_36)>V-cG/q(y7t>lf22o;baqx.dm;M)6rs]8MzJ-8Q6/>kB}g>95m*Ax@׮-mST]?;k:^&g!~>O5 _E9Cӱ7 S^7QeނqqV]Dim1- A|w_$㏏A>0y!Uܫ-M/+#u B@8\6K9f\ׂwR:ʼn_cX9/p6x\V*9oWNI0 3C>:uG[)ْasvmXx(, g/f+ZX|:suNAXDw9Oʮp $_Iv;S`ָD5oKp62Y/r,ehܫ+Q:gr#q.'+2WtPU  =:2ͩouIGpƐ%mB@A-93gqmZWߘ7,w2[dDq0%.)| r{}ٞwTeLT&/!ѬVhlvf8?7l 6@ 1603+FrьS6D'ÌP͝`䊃R<5{3v:b:QFFКhT݇SXm  ƿgx (s!ߤ¡1>$Hm/qf,cԕ%t곏rf$U2^ S# bO-ic^AR8 9}S6j7>λms͞&#~4>L8=w2 )_U3<Nt^9}Oc}Z5;wdL\Z^h%4}6? -+v3{j [B<>@ Qfx5j7hfph,ɄMkfYǧ@jG[X?Q7z*>,{gu>۲I^ R۳:s*ۖIds7hyy"ϛ&?3`[^;B}[8%-6' =žNFEȨ>i:FԤQw8=k6%Ł!rVI&S 9o«gҜ -w(r; gFs̱!8{ ^-[qj"XWu6ٵ^is,xfL+ajKEL&'"qslm;_!:q*&\lʾVyl>DPcylʮZV(ynľks=qnښ]rP}w>sшOcOlOg{L1eZ^5H o([`Q;d ]jLWaسߐ8 {Hf`)Os `(nVoWq[@Vq0y#&o" 0Sq0y@!8@L҈ɛ, AāTp8y:鮺}K?~>sRNJE@@@`6   +^2?ې@ z@@@` oCz  "8N*#8 W8 @@`6   +^2?ې@ z@@@` oCz  "8N*#8 W8 @@`6   +^2?ې@ z@@@` oCz  "8N*#8 W8 @@`6   +^2?ې@ z@@@` oCz  "8N*#8 W8 @@`6   +^2?ې@ z@@@` oCz  "Ы8889pyyKw7C^Oq$r¾w X888Ғ K_pTp8Е!85  N8kH88@Ȍ85>8r˟~@\r tM{{w~w8J %C@;|;/:]!}>v<{_TwcSCp|RDO[ngqH\ n#o_{Lc\>@=~@\]#ɓs pؾE,8KYJ )'d)A" Hp|Rr~?~qN;`,Gq w}@pA/pq0 s+``wC]vCcjO^T?Bvrh&Pvܻ^0${8.z˸8xUvy꛳Yh9я~>]WW_ie&W,:7'~'ƭ;utOζ;fPk}7g6nQ s}Y֤2M]}rvOݸk̐kY A5gaὯsuD[\ĸlwZ ppvT\e lћ9xpSAk]wa({0eK kw򼔿Z!BW՛;h+z-8FTy/21ek祮Zr}8(Y̱۠jf:kB?ʀ8ZV'` ҍ ༻>%;(;¥jGݖ=JWǽ)Z::v7!^qb\#@qR7CTD=(^Em}M(޿HHfqD=x`+yWju~Ջrُpd>kB.X>`!_V(7Wfg]klޞUmnʙۂYdFB3reחq ݺu]e;lىQ20)ZB>|˸n; M @-ze EY#F¢8w>_2IywmԱ8(OnOc%.+se DB$Pн.$A\OkVh̸z[1/5`XΝ;jd ka#ڈTwP?PW׊دmmݫ&p^2GT)G:Ι=V"\"h 6k%,+uTOkx} UߝtQ{5bM+T ݯK/9k]#:⡗ RV|A#rʹ͈S% {xXj/B_!`!hlL, ! mmŏ:KϨ~Ѫ=G3W;_lӿ|r{aqPo{7r}y2CzϦG'uo=bkE,x3 n` -GYݣܐX}7FNe ֳe}Q-6#3rة |i=Ϙ(cmEu&l pr&`' [8:_@pi9ú6uG[}Y_s`Aef@%U@D<"q8A !Sַ8 Ue98@ &fG۟l~8J lƁ1ap3_{[VS{vc!>)|T/8J EIayhvZ,}ސ8bfNMH?/* "ql1<\R\~]ϐ%α@\r1\f쭷C=->U`;ppq@J u p)8@L%mC;H!89@Ȍ8)482Ef p8LEf p80E.~ p,8@Sp~98` p!ٯOp,3lFYf}-(e)E=AkK/880Iq;隷yݻꭷb`20p`8>Ϩo}[j-O^)H#3ݱ;&[}Nȵ~򓟨/| p`/_?G럄85[p#H}E) Xt܊mX_E0o.Y|_:k8kڈ│>#>rYF씇p`[H_%$ ׾~~N/t3_W]>^,&hd7m,L `m)?s $s ;?ϫ|;(?%&Kޖ vz FHؙSQmݺ>b#kQoK~q#5`9Gh)?U!UÇi7|0}ߒYf( βYQ5~{ΩZ(DqO X8L`x" }?(}K_R_IEZGāos"`Aٹ8Ta~>ZȿRϟɟ+g o|E [V> e<{ F # nܸ(`-.鮺}K?~>sRNJRn88k@:tHýQp8〉f(.8* lZ68RO&]e5N)q8XUvG##prjGܻ]<9AUA?wpɞړ;(lQ38jQurq/n\n 8_{h+wIQk7 _s0Hq08³4G |Ϝ%W/#P.B]w{ w}9{7jVvvR-フS.;''b S{b35;bDefv[ S c8 G(J6&JVF7!pqv %d x '2p\Q^f2IAO܊++,L>eF1Y6pbޥz0ćO:b /[U|E cǙ$eO~8&9W}2n9pq[?0+YްX㣏Ǚ휚=É$'Y(6\oNjYBBr 6pxvdp7î)xm?sE;q uqW馞A\tMu,29]^t|S=Hz~޷YO7}em(uܼߴ*عؕ/QJ`s(3]b\mDH疠pY"|7{;eoH97o(mˇ4oV[ۖ`}mmce"vV"0ǀͶfL |oWL'?b - #tP.#2* A$qֶӶ[;P@r#}MNJܣK3_}hcaۘXg׾m$@[۾Whh˶f5#6ZOF4DdoWL?'?K?[vf%l`1q`^W.rB댁ʀQkAchA Qwhϴ8M]@q7ygNu][!P06}aMvC`q0t`lVekv٧vpQzbux3?#Щ[.ym!ǖmqDѣn 5Һn-z+ YaN /{[;FŁmv ͚~nOAht[>r6!t-i#%B+ewO)cL̉"|f5@@fXڗ4!1ZwK,؛e-U-!Zxcw~\o~.rFFoHin.ߤ;1uҩx0^V=RP7gfNΆsc cҏÇ*tf\ӹ@h+VVo̞جGk)jO6"9ݒqH{vp eXƨ2rUpODwѫ8}{BC?Z+MpyƗ]23Fk&[f@'q77Ƭ?R _80@t}i\xx/si]^co>pg@no:qrVEQ`9A{ba1\ 8@dypk}R'GCBt(cynU,% 1c08C P:a!8q 05ў ZC#';!Hq .Z8UyV2j8X #SCNN"JyZKyyyYϿtW>%TI9a_h !#EhSDBCG<T88.AŁTp8ǁ,+,Œ\9әA3A,bLŘrQY8`-t +<. EP #^)8S.#} :豼ő!C<7A grh:bg^=?սӓ"d'>o4um{gl$.JM@~IF923TT~-JO@߼TK_堹Yij<3*#tڔnf[zIV,qPw_d̎6ŁŹݔ]gv:ak~DЭlXoEikj@=m3x)|MyEy#"޾:2 cR{E}2!30r߯<?s)˗_>(V(-_Gi{+)s3p3GH5 E`bMfm<[XcKiesgȂeH`1 ~%gU(y8|ίڤ8~{,jE`^rROYT3w ۏbV)5޹m e /^.,J9(YA0K F "l@ꚽνb?qUoE/X6G:v#l*>nCe 6jaP(E,t~een9(g ](uÂ.<)NmjY^](t8)LCq~S^咤|lB}l8뉵-g i;\4k|47_8肬8KZdP'`ShMe6:Ω7!MS٠S0@̈́՞]D j7/_KFGm/s}^l,SqO;Y8M&s0طA\;,=*V mh^%kf}Y8h5RH5E_G 'woטw͕c6{U,J`WH!<EEYX^}pdy6{-/J,DOp}I]} '@:F`QA7=WYM#89w .4qhRW>PX8`MGgӹN݂l@*8:鮺}K?~>sRNja5!~k\7뀓pr4s0ӦuD?'TyIp\y93\~pN8rd,a.N XZ}$ʘ%2" F 3^ CS9]I}/1PnʑK63Q/X9lDɷ{-Jv. uqW馞A\ 8Յ~o^/kbkPj{w˽}lsιWǤbm_q`c>r,eW-'#N Gu֭!c0P:Г@H9W .+xid6t @;\Gl[J*swL mQ}Aԧ8b8v[0֢.53.8)9NFŁ'|<|h@Fvq>"ʲ8bX^W-ۓG ys XzTd2;Ā0kY(_^fk񵧼o :Q icσ}Vdce0v˾6M6ymR_ְs?tjW^ [F4|msI.gp\&A<'w>)q3GW+dpҁYF0K Se(W8*(`@/ *$,{؛emO0Fo;f뗛1gj ,`8k̦mpq26(;0ϖ:̋z䴹-Bc*wgAuN֗1c~qDoEc t7@g=zrh 4t\MȺ{1rm?wDk,ԈYc H S;s쐲wHZ6 ) ڶ!#`%eI?[N"È3R@fDﲂ/h{wǹזb3LplH=}kޔ}HxݲN}5G, k/~ÓjOӆ-bBq m:!`˵Kq'"Fx;5Axrm.'܎6vl+R~1sKfÇ*tf\W0(SW>PdK͆ڲvD֣l&ӱr-fcf}}|bs1Ţ iYk:z ̈́-7cn 7Lm p6qbC"MbCb2758\f Ej{YmX5mg[JA>ܢQ?cO Fϱwz\8i~<-"n>ā7Q>B'ƼNlxTמ=S)u3ϔ-2Un˻%s~֙} d ی҅&O~Cb`e|n"87". зnA/aˎKg`c`Q00mfij촦I8K]J"!nG<4'd[ΌQq!0A> 'Wa8@jx<#N q8@Uq`jAq0nЛaUG#3prj4&xO!/y(~HU'}6o0p80? &<2̼6]=8+..+,.z4wps'g%q⾃TtB]) AN.Đ ` japqZ@N;E"';#8 s`a@L/)5?Aϸ@]\)ug.לT%7쮖ώo*.5w恺y|dGQ/﻾fj,6?:p8y9Yc|p4Txܵ(Lk2iί<J߯I hQcUC;w},֡}<|VRʷMy$ AufP JPl?ߜfĢqdԵz,?U_l26qqY5o̴Dʦf282v'ϋql54%FO<2N}2[߱E'gnҍIx8Xk:{?ADjB!&tP.#iCg D tQY p5(N;Zd B~@qn`)iұfZU>`)k=U7f8"N/b6C"-fÈ_pǾ{` {kk:A~׾m$d)q'|!~@00+Z$ ]͑^s9o_n190#2r73HDn-1k>mAն! `TU\[Aʷb8VNl'E+q5,Eif]UGa7\sz!*Ax/{H@Ł>_,%|!~9pwŁW Querying
You are here: Object Manager Enterprise > Querying

Querying

It is easy to retrieve all of the Pilot instances from the database: just right-click the Pilot class in db4o Browser and select "Show All Objects". The list of the Pilot objects will be shown in the Query Result view:

You can see object details in the detailed view below. Try to change any values and use Save button to persist the changes to the database. You can also use Delete button to delete objects from the database. For the objects containing field objects you will be prompted to use cascade on delete.

More complex queries can be done by using Query Builder view:

Drag "_name" field from the Db4o Browser view into the Query Builder view, set condition "Contains", put a value "a" and run the query. You can return to the Built Query tab and modify the query later on again. For example: add "AND" operator, drag "_name" field, set Condition to "Starts With" and the value to "M". Re-run the query.

If you want only selected fields to be displayed in the query result, drag and drop fields to be displayed from Db4o Browser into "Attribute List" window.

When the new query is created, the previous query is stored and can be selected from the history drop-down:

More sophisticated queries can be build by joining grouped constraints using "Add Group" button.

When you are done working with the database in OME, you can close the connection by using Tools->Object Manager Enterprise-> Disconnect menu command or by using the equivalent button on the toolbar.

././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_collections_without_assembly.PNGdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_visual_studio/ome_co0000644000175000017500000003347611520622606033765 0ustar directhexdirecthexPNG  IHDRwƯesRGBgAMA a pHYsod6IDATx^_%Gߏ< gn(8u%%g{#% ߫bnl\Jm*\e3L{_fvu@~LіeQށ'kozw.yW{O8>QWn(0HFv|CL`{klOWǻnxgO;ӿ|/]@(\~T8`7{ܯ>EhKm[ovֆooſU#GEpaJ ND`#,t@$pS @@`RKTv]8@8Y{*8Ilhр8@J0YZaptt889`1D ~p8@8PV8ЕA888` p6k8H" k\zp880p6 r!h<q>npa0Z!vc "g8qӪMj!P<|107xzt0f;)7G 7yO?Na@lSε޸&czL( Z'{3 /S[켕(;W;<}r\bhu:}mK,Ѵ ڳTkj)aGk"K%<,qp`VdgUb^ kG"r|F耒['DPm jaZ7hC9Wp12+|^WŅ-wgw`900( ,0e 2%;0(*˳O};S5 ;4B.{W"̗Q0|Tu?B"3 OI&+ ̀/ 3 Wqua€ f́#Fgޥ-dZYofB|!輔`Lo3%M,$f$8Ц- ({]ja 7a~IYztiev|,Y(7D ]PEq834 !:=PRU*w Dquf?R@0'p@pa rpt9+S*CsݟGw3F ㏸z~90p2fLٱG\ԅv80@Dt0 p`w90@ 8cpa0@ eP@5,zMnAuھ Q}dDB_ :ٮ_/bVH]#xc4b5~מ=Ǯgbh  (ցw`0x43 {bcpi2Cp:(cR. ![+aTbq>Umj/%#`Di"dmk}W^}v=6h)<)Sד[LI7/۞Ip:5.y3&Td E'cI?@c` M@Ѓh>SK"1Qw:a< |%;b?rzׇv.F2 ||rO'Ԗ |uzA~!|!  0Fޚ@fL vfB6`̌۟ ٯ*F؂v ud]^ʹ5v8]_umwe+ ' 0 C0HV =7+_Uy"YJ(J]Ag#&%adt A~AM;?A[a | [JZsWlX1xzjAR+c0pR]6Q~-_+ \FS[>:-%tNv }d+"{UI9Wm>᪾.c`oɭٳN@٫P<1`nR# DTTr]RSksӧJ7 nlm&#-N_?h1𵉀E@u].. õ]R1;wz$Q( ].80hԤQ+ MdB<*يسs;F V}|@@ gM\\~Ka5R\a*K  wS@pa rpt9X,Qq }K/2'}"$H56~1'o1Hu6 X 0 Dq?A,GD!AԴFD!AԴFD!AԴ0rԕd]j{ )F`\a @<(w?n+ꮛ6ck0rK=}{1v]/F`\apamrq]TozS ˧l5(( I7c9FQA)&E`\aPj̔g" J3ե*OV͠Z3.:ώ>˶Iizak*#VE+4yhya}_To-`΄ήAQɧ08۞\l$t̹Xؑ7ci{8P@h3=7#%AC+p#&}&4uK hr+X.,ˁlUC}o.tyvy:Zم}|rO{/N:[' ffeQ(@&i,#nSݙ\͌0wem`3zс$ۼC3.:xX}lfO*30k}_aֈVV`y֩N{mT]?mAJL A͉V]0WY,UҶ1MiuRL/LU¯ lK Zq@`.+ i U"g{mҀ.RYۥ.%rfp% z&;,vZ]JrzM0uR]6,alҞuO5ŋSǥR#" 00pj@do6 6ZȊv˳q9[ϸ7 _o nZى8&ֵ% @`dF#>JSףTOQdx4 \"0W7yWsy2%b' j.Q7 @@ bYhVca5{D!AԴFD!p8|Qq }K/2'} @@@ }@0 HA>    A0()@@GaiCa J @CZ  @@@@ }@0 HA>    A0()@@GaiCa J @CZ  @@@@ }@0 HA>    A0()@@GaiCa J @CZ  @@@@ }@0 HA>    A0()@@GaiCa J @CZ  @@@@ }@0 HA>    A0()@@G 088@8::R8u%u_eN{&^`sRIsr,map>@ 8`)7p̝d Pp1}jp)81xPMr~w{s{! ARa )@l"Eid@El"EiM09EHڵk € 22_ :q:.5 [2= fd}Op<;^Ϗz%e7|S >Oί_ra]m aSFga $k3t'ԙCrxDWH kkrֿW݆2m.3e:,qm3/ .ɳJ1mVNėSߧzŬg/>7Ka x_fA/Ձ)KgϾSS{ώ6ׄ)Cp鴔^!`' :}ϵZlr2=]tiGka!ti'8Y!m^W\9{r%fwY5~*&1HapQ=I}E:`_o_?/_|.pSꕈH|׆OFO߼f1TJ\ VAgE]T3ӈYsOUǯ` 4BV'X 6,}"H  v@vDKaGݖ?BUW}Suۧ5@-D-7!9eރ&ЗDBp]v;ʕ+ÏGBt_GJeݣd'9?X垪R]nu!`!t_J7Rfg}Ru ,ޞM6oʙbd(TdDf&חyq ݲuYVg$XsiY}u|b4A9P3R}kX(CWWa,\t޾;5e YGޙQE rJi\<H T!j ;U .i)=" &v<]@]Zք/ $K&;^7ŋ KF t/ /e}S}&}RUWqOy)KY|F}S[s]6Xe.33Qw#ayl>,-iT,{cV^TgmݷPIY #v`-dBa_U}倾fͷo xAx쥂wV4KWn-!N/ ޖQba؋YODg`cbjaDU<3jЗ傛ԗu%|&J]>Jj _ns7ܵI=XZڸ1lpt\S!9eH썑yf߫͊}k,7}b³, }\tkBuS{ =qR?-f^8 .@/~` tDбF~՟:~鋐#;^ Ft}\Q|2Gʒ`)"a0@,l>~z9  ra0E厮?_Z~3Cpg8 K w{\]?"4;Twuo~w#@\& 9s@o_?JoaҖ֛'̤ @R9/;Xa x.m qi=39 Cpi!u `ۘK}sV ^u0a;8b€T8@d`@p80%ep &1@%2Sp8@ &u-p 1@%2Sp8@ ep &~ژ p̛8@ 4vp80l8ap64Q p9+cƓyo<8[\oa"L[?֒XOp890x7?3\tIktH:$pD /﫧~Zʕ+{z DRp@d ~w;|P?E0cpAwoַ׾. f .ݦZrUbB2Rm?=Ust'?I]+d|@}Uje٪0e ~ m, .ݶtO{-mG묺7t\G<9ZH>d7=Ї>>򑏨˗/Ǚ17]RiEu'O@q3ؘ <;<9~p`x mML1(FO<[o {XJ [p9`Qp-Eo]~뭷n L-W672O@C0pŕKFcX.aj@O=xzƍ3,a@Gґ8i0SԔ`?4t'?Qw8 p`ũ{//ЇB'/sB7M_p8,c ٦n5pa03'N3u7L?^h'n|酁o M|lM|m7^c 0]JA [Z0 |(A@mPbo_oV6lR. Yo-5z3"h;A*Lq^m"lڃP7cb @$DƁh̐ng/M DG/a`B4mLLoA h40y| I8 "MAq/O癃#wV *aq?h@W "R+q =SUK)u:Q2(0(D:(4E^+m km~.m,ΰ)a v6qcd sS2僩 'M[A74Ew}QTHV[ll*PO a0;]ܒ" ?h€o7վINQ8X"ma0 R@RX&sr`y/X+|L;wJ{3/ bnGS{q>!K`GXJF~jD&?zuwWr.pv*8Λ G|'L>"LEPD\}YQp14"9]>FPAnAyE=qpUoExCW9(0\V`'',ȿrG}$MSY!b%3[b!"(L)/>5Luyy%U6qAV$JvQQvk=15 sSiWj {Kw% a t`)sH@AoQ`kQ:(`iMI%wR zБ{tTb[~F hg>}h;@1+s00ْ{m 60ި/(&ŭ 1ؕM\|:B!a`{OCcz st K}&;i(u6Av s&(ٟuk+oܐ(v%C2z}~ ͭw)E.2ҞqS\'CǠ'VEAz0zmQ$6md]ASI0HIlпRO>]c2a0S3U0j_G؎!6t?q/~90/a ܣ-t t4:AJ``H):9x ya@&偑80@=оy HA3ůAp-cF,@  ;]80098@zg/Ą\e xh`ZAaU#0a <>YpaЍ1\ q 0aXklAAuGx@Bqr[ ?@/f# z޹IgE{^ ͠xE=PwqҷYuRڟ'@A*˖|C`6`d ́8lQ%'w(1j ]2 ~5R_fsLl|@~Hq ɌWΞ,fM 3Xj*3b,jA7AɟKUəySXm,_|AOtʺdYqaզ//uVVd8KXz#jzپկ(w|f# d $3`g Q}UZcW>`ޅ?,E WNϕhᛵk+~doKuNvm*)>_}zCԄb@Xf# e 25 @V {6S5#fa?riFn~Y/@m" tC%oT 3uW-B,Bd TZ-{{ͽ [ތIo b-ȗLf:|YauNb@3M޼BO 5(뙲*Ը`ʴ3Y[ln3P@Qja7{h GZ GM|cU8]ۊL_u3@3}6F 1, #0dy+ Aܹ!7YΩ]eVFt*\(`Ac C.7`y8`HáAI) 0aظ[t sE Y5gf# L4'4ջl;LJa+0`nv6WLDL8j0FR@ A86QLltvIA;pąh@ 8q@XLvttT.|C yod&$&pbD`A&`JQB`6` |pn SPNF0iî!0a0qZC {G H`gW77}56 j7_ȳ~E~NG]-%}Vt30hlf# up,Թe9sp%EIWΞT KO;럶WwksrsM: *6\2^X`QRGv;b 3N$yrapA-KO/Tc+߻ $\.I=UH=^lr , |QmrlA sDz?:Vgol5\flw,A,?ޢ<]nU7~f7dR-=Kwn;`q!Oo|],\QRmNK <m-)%~/} /K`Jhh%`"57\]Z\ȸ? vAFt|,,ϝSDg֗dņ0X:|);꺊t)T":[aVS51дݪRe&Z]N\Q^1a_oX,KRBhUlآov1v%ظ?zJFA{O:8ve |,́T3 Իg]]tAbQc@CTc;[AQY@$> f~bT!0 0HԢXR.#0@2i{ Ga9E1& `0p8KoGGGqK7!/y˜MFe @@@Ea@@#0)@ @p!@HAr 8  "0HwX  @A@@ ]A@@ 8R  ]a9GaR t@;, CJ   .t}   ApH)@@Ea@@#0)@ @p!@HAr 8  "0HwX  @A@@ ]A@@ 8R  ]a9G0fߚvHIENDB`db4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/0000755000175000017500000000000011520622616031317 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_attr.jpg0000644000175000017500000006522111520622616033641 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((D"c  !1"AQTV45RSas#267Uquv$3BWrt%b&CDdcEF)12!QA"aq ?ZS7 |\IlmKr55Ad%JXmJvNIIWV= t 텶!R{`ڲ(+fiҷP1=ڷIJH5yrtPlHCnSIDN4e+scl` ٯ2̫GU'e* I!/g :%[]a9㢪 ,KPv0e Ādt+y#q&:SIYFkCߊ*26Ea|"{DÚL8(CJ!YJAk*}2PBRD`q%P㶄 ` TijDh RӠoF3[ kfk.Ӱ;swޝ=sn9v".<xtնm72+y+֔ݽPXÎzCG[8^mD-oќ&Sru[`R%l" ʐRˤF)}OC䌠}9ɪT%EKh[`KE; # (;ҥmm%MuDXbb'u/4T#}SmXǶ*^53'COvOO-5[DJ_8i*A-C104d-$ 'pA8968bSquehHg9PTј_4_4ue-B"%3YȌF01鯽; ʹKxJRqEep-0~ͅN-Yi4S^u-j3lp Î ҧU {;_"-"@F$g'frdse*Jiҵ% l(8ȯܛ.6Sϻ!kQF +uJQI h&,A8)H}#gm[; p3TxIu\y @JT) BՔv*Cޢ( Q2*ttMLu;*OybДHJBX:+uݫ Y^(4"u&LRQ״rO%jB6;:˭-W[`ʌP6TV:-MA*J8ҭM (Ւ+銆mW|\BvH#wI٨Ci aDo-+rN(3-ۅiM+dHK1Ky qqH)@&ozūTnn^4EAu x-ȍ -Je`rYsb]32,S(CS[6HC*-+*NBUۅh^ G rp6 d@alv! ^'w[7x=ד4[#UwSߣο"=1ĭJS\1 (+í(teIS{8;JS}vŦyO8A.Iuýk$$Nkc͸Mj"B2@oag~+ Qݐ"~/_,Qԑv4m|ZT ENP6If$q% O޺‡{$`Ffo2 $8% @$! JARY3_㴅m^F㺠Rm>!%,)۽EĄ%)c*'e#\K/\K*pFq[KJӋJs zZ{Y48Ĩ(9!X8#cO^޼q\L\G%@2xG YڲH8{(vvT'mwHG$mD') k3od1vSIbk+[ChH8Rˉ=*1ӑK ƹleRB_ܤyՁ:F6B6v$:2vA8RjcPGrais2Krx ulrp?9f` -6 P)FGߧynX&31ε-H*QJJʻ>D ̨;.ijגpS+*ŸP2:kaԱ":ZIguԬ'A\J?=fZnL[yյFOlv 42)" mGC{ HNҶ_$H{Tۗ >q:\WY׬$ *szՐV(R쒐MdV5 <] zT4zSa^4zSa^4zSa^4zSa^4zSa^4zSa^4zSa^WeIbcqp7pf~Lخ Hienޗ TC|*@RFV1uZOMzPBFfO6roo Y9`tkviS 5RY-dCR;Mϛofsm"JNS, nROdR,*Զ/i$[yY#{+wOtگSڳ4UŢRTC R BRTR  #ڬbΣjONjOSRͩ=E.a3CYK)i2rH@={|@^uVwF2~uVwF2~?5cL8me *85P6V6cM?kbޣjӟO\N|4?8RnLV-ͤZrbblAqe[=Z Ewl2 λI:is:Ͻ&I]զ}5u_͕=lŞNr#ͼ{YI tftf_E5y>0u'UwV}QCI"ANxU۳e).IpvG^,֡GTF,d/aͱ-5Lnbo` .i~z> _uN{(Vï zyJ:qՎ|hZX88Rw}L~+!$l-S1Ҧ/a*+]s*B{ 1V/wSFJ2*\HC'Kfܡ:2R;+Jwo݊e]m7"-!I<؁MW^g+4. >M;ȉ }j b D>M;ȉ }j b[\.w6\"'1.)=mpDOcTs0֫и(RJh=fWo h?o:{iK"yS(ي6R3'p}ުjfW?썚-uE<X2S}TSCǠ6Rw:Rܻm+ꥫYNI=7 j+_~H}mg4.Kmdqo)!+iG9R|?;@-+5KzS"cPjD[; MqBۉ(PT0wwdERNDedfw%`#Ms۩a6EF"̘(;Qfl%OY<,들HP@PV#=}/!vEm \Q%zqwjKq!w:P3b"b:CkqJ H߿N_ejiO2o(D䡧-)Y@YGp鏌Vztr~W"^(2w'=<\™%ͦC#9ߕ-QtbJt6. P'kR;ztr~Xaʍ,,% JBHMHop7VLbhu@bC a/!.qd:HԒ NSuC!iA!Ŕ!JI PJF@ $vEA6R$:`rDЌ9cQP*.m6Szûx&ӷnVLm ˜\)-k[8 Vj׷;L|g'æ>3Z@oO|i\"*y ].j$I1!y(ܶPYjncZ1 'cf\z1w80TOg#i[,TT67Xߴ;u\r\UZcP &G!Ju;[[m 1jP:o6=ۥ]Zz\hE䨐TR!DsFtH)mDkLڿX?,y^M_Bĵn$%LK!$ԝŗ>uG'ӟ>uG'{$W[ZR.W{ \l2Z-%/(kkK~ln=5?n}O?n}OE-{zISϷYmʐPiV읡tovvzhɓϋ'R_o`c#kt¶Oj) Ę R@*Cd@lX9sWTx|9r[Tx|A.jm:4loFVvBH'q߸Cn# R՚%JIS;= ^~$;N~$;P2,mxz)JRBPI݁]=qu.S.JT$)P E?n}O?n}Oi=Wخy_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ>uG'4SHUi($9sWTx|9sWTx|GI꿍>9_ƟbC>uG'ӟ!ڣēj?HUi*WOm\9\3?tozFNn4Fw-HV=+v0ˎEmɓim n^SmA5VTɗ7T8m-ՔHp4}Asv2nvl%H'rѼo ^=|JPym6K֧j51zc.6TOZHMKWO=VG9=s&[Z$[2\y,$$ FJ(IQg;#pq mϽ/]>,N}gv ˒%SB#qyE3ln4j 0=V{"}&8\&J[(=9118Py+Ş)Ͻ1\xElX wTۮJerC)L yZZNuki&]i&S.EU:^x VHyޗ{ȫ)Bɑln*.6Z;tPFpEdti|jِS$e)S (-{9PJr &z_|Y"yypZy2o`6,J! lvv΋l2W]‚m (`0 ~ |yޘ{ȫ%.oe /6Z11V{)KqdmN550eƚ$4_ic2JZR6R E VKWO=Szc|Y"k;pߕ>(bh ZR*.lJK(IJʕ?ҸJH@eҊh%)')Rƃ_sKWO=Sz_|Y" prj;H}pҷQ)% ;~`[*miSȔ%2 TÀ8A<nR1N.ޗ{ȧ>tEoTz_|Y"Ļhs|E4Zl)R\h;jf;ұ]G(Xfif ]/\"[hTИ qiNwJGH]6+O5np69">)TcEgO[9&[m[-ea'hm uvpijh*ewƗmZ#h8ED)@}f k&i]D /{]oZ粛v;va9J7;ze/U;oi(MIuI8Iקj6NcaX>jAM犳;]l>V |Zl+a] * 6'Y׍z_3h')P}J⯈vMjΉ ,:CmnpqcJ6X* t.|;I{[%%#($}ۤX)P}J⯈U|@ϝA*ߊ gөWU>vrԫ~*;N_W Uf:o;; I8}ā\Ɠ#X%9 fJM#Y$)6&=;ԫ~*;A9J6FU{WαV@3h')P}J⯈U|BϝT5c^lQÂz qVFG[9'dHU9⬍ϝ²"U7@õU-8mVZNvSU%˚R6RP8P@\iKE[ Q6u(+QR ){MskKvnqdL uZ`,Ҭg5׾>f<&?ڠݙǿJ<~=/?6l$LrJ1\(-ցܕ~=o6/fs!lž(+ -}zԵ((rTN3!R.)qI*BIʕ3٩ 96Q)%*w`(k!=LbV&cfxHJ@H$`:*x:ˊ nXh- $0IFZ޴n:4;qgz۳넫oRB_bg46¹2rI $Af]ږ&6Yw˫.3 ;$(I[8*;#$ ZW|? @rjRYt8Y;>5Eǃ{\mE4lKH8 ѻ90i ځ-FZ9WkK߹D^PFIRF2@سv&Lc.)}7[8)JibDEvMAnj"t\ġ,vU'y$֐+m[GTN>4/ ݱYݲmzSm,9%S",6SM (+!VǢMQDEUgxLF4aDylQ]B%K^Z 85jҶW&|(}x6)d%+ uvV*Wm]:NcYJ&6Ր#6FCo%=vr5 aukrH'9n{dEnbdDq򦼷.TTK#rU R pU&zx58ժ9@6+O5uOѬv5m_VkH{2:EM%6 GOI:7I IiS!StSQC{K;Fxiݝ:ChlP֥G Wd tb3nɎ;lc-*h2+ Q R7vW~[Vμq N{JpEU4l) $\ |VIIVӃ EnE3(nm-J)Bvvѵ Mnq3r7%^qL;I'6XI/ bZ!͗"[̌3XcCp{}ؚFTfqLLKiZ~Ĺj5Z#ZJݯs5i"НVn&=e:AJ6A A ͹52(rሯN WAڭݭzmzcCre[R[V- Qm3ƯEpk]PW)8[e1N2n{jtnqmӉm-[xVԔl@Z#GTc nK]nAQ_e%\[ R%X%#p;u/E{g;ЇBφwˠ5|q{ Jz^t!н3"=_CƯR:|3]=t/{g| Ʃiob>Gc¼L0 2p^~ _i,')D%[UwU\\cQ7>ڛr!eҖmq\' BI;;@Sag5poZ9m`LVC;{j)zEVIDWvfxBs+g CM=2t66ii %6Yj" ^m[r3WOB= s}UQ/OrrB}l"JC\Ii>z6]j--Pi@IqgraJVa}vTq[CЇBφw˧y PE&2Д!6A^TN;d?B A~uF/A~uF/AYliW %I a $dc#=i jazjNtm4WІʐ 8ZVp7tA:N8=nmP CWXi%-@P '9N@h'j .BS 8I(WCDPJs9P[kdT4]?Xu9(!) e딵͍Dkڣ1K]R5b]m_t67*uvgpjI+f0cp)[y-S\c@+&:;Khsiکz½4ڎ5E[]Wra8NHJ.' BӍ8I![h%)Nuٴ+v{ 8ۭGO!BQJR6ʛ(Cyʉ '5y#=cM/Tb! )~˥'Tb! )~˥'Tb! )~˥'T#w}⾊#&eȮ&Lwl-;C FARJT@RNb->1ky3n-ƪ,gXeKZc%9kP[a1Sn`V4"3"l8մB)I* {Y?ԝ(1:WNCV](1:WNCV]("NO欄bÿ+n?xǻ)4 їB- 5R_s_"-'= U]u5(1&}ߐTMwmTVXmN7q B\^)#~UKZOr+mȔJCb;[Q9)`$\mA z?G?m^yǭs&^֮scR_T_T{^6@iT)JP)JP)JP)JP)JP*gwsWWpV_LڿX?,}=Mc!m9_,ݥ~%?@mƔH$8 ԝb'1^Z}#~ 2Li%B\x0t_}\玛܍oN:or7Q+#=)^9Ay#~ӎ܍oTnJyurWG{P^x߆4#~r<3r\:or78߆5F\ W%zxg1*/roZ+~܄򣴯 Y\:or78߆5F\ W%zxg玛܍oN:or7Q+#=)^9Ay#~%kJ6\wGZ媏W%zxgz}hRʁuڠfq=ӎ܍oTs}pI@=<:+#=(/^0Ͷ^rG9k-SuupL) O[AM^hFlRjq\ % y--DciX`;cޥ}~Ph?uz^zxɷW{5攥d)JP)JP)JP)JP)JP)JP)JP)JP*gwsWWpVx?`y1!d̋ l F38d{៦Ot=ABG [F-I5$*rշqF9ؒWRBTXydn9ԥA(WzN_Aiw>jT(4O[M ٯ=pA~۫нssJR((((((((@3;ǹƫP8LjqTrm_VjWW_GHTVͫOޡ.fm\Kgah)V;9;lFVwtfY@vJT+*)#q1m"ۡ1bqm6R8Ȩ'֮y_-K0$2?iղcGmLUў$GTrFxT3Ɲ͗6pvHd&ɩca..TvZHP[qPq|ZcP-660D īTАs%RAN-&xE-rG(S@)R* S|Z~P-6ZdhhBFFPޘKKnsne)B[kV'9-{v?XՎckRrn:??~\\NYݸ̚K },H;H$ sj Ki&eo76"6k[Ʃ($l-|gzw/2FKdq+d1<{hZp펰 bk@:2;q}%֟4Mjy7qrt&Rv-lZ{Jhc֌ Jk ]y6؈6.2]Y?#)AH@l[tg&֟4M%և? i=c\MC%uJs֒:AVvnL=dRq+$+2tլvOFN%ꩱa e6%.ˀͤ7Ƭ[F3Ѧީ!n[-JY[@i[%xPB@$Bt:f;;-#կ\8DLW̸im%arc8ATV{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAYjE9{ڵVjPVy{ڵNai~Uai~SZG_fgZG_jEYAZH_o[u Lj.%)@=__;.JRDA~۫н[M ٭\>4+!JRJRJRJRJRJRJRJRT=C{jPG(Yzfifu}tQeW嚕~iU'q`EvYmWnrݕRI9í9Vf:l={TD~R\ L qVļPֺ¸q9FvB\սUe>5]ohRJq[bCmJUI21P9Gf"}iK\ZR'mNCpʔLp6>p1`&qPa%ɑŷČlT_TICKSHkj>:nƵ' V7Aǵ]FjӿVanQN6S;u\{yS;Vd6[@u+ƹj.# CQJ(.'%HlRcڟS#VX86,KB*ݝk+U#ۓ"d"$6fn҃!/!2Zi'{A6ïɫ^ٚCwnm9m* VۻQJ*@ H93~vrs J݌*_z JH_}6?WZ$t ]2aZBѽ)ajog# N*S\ofΡ=lX qqm*8)RVC p)E)‘R:D:BS+`0|f\+ɇɘ,l@FvYq%E"Zm*N\ʕBB#y /hN v06bX'd߮dj}jmtڴ;xm -5!JqJ-cIi ouUӗ.bKȐy RBROܔ BaG}hV@ NclU(51_}6?WsUcZJ i}WMj}!_֫e҃ZsUcZ1_}6?Wt֜}!_֩}WMj](51_}6?WsUcZJ i}WMj}!_֫e҃ZsUcZ1_}6?Wt֜}!_֩}WMj](51_}6?WsUcZJ hl7;COtpR8KQCxX *ˮghvӚ|OrsVdUzܜ_JPh?uz^zxɷW{5攥d)JP)JP)JP)JP)JP)JP)JP)JP*gwsWWpV_/LڿX?,ԮJeW嚕~iU'qZg8=[W+TE)T1\cusJ bR cڥ(8i@((((((((((+zmVw=Ϝ]Z۪S{8 )J 9nBk\~=o6/fsҔ)J)J)J)J)J)J)J)JP8LjqT=C{jkeW嚕~iU3jbR>:O*;81aSչLcÁsT R R R R R R R R R R R R R R R R R Rgd;.ZmVw=Ϝ]xɷW{5?uzZ}iJVB&zx58 =_5jP5ͫJ?4^~Z~Y]a'Rw0~զx1aSչ)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J)J ޳?~[uU|OrsVgd;.JRDA~۫н[M ٭\>4+!JRJRJRJRJRJRJRJRT=C{jPG(Yzfifu}tUEk/LڿX?,ԮJ; p?T|nj<0~oYY?->'9V?~[uU|OrsA~)Ax z?Gm^h$>N\KYZ,RJ [9#;`g6~G_G3T J*.*.~?ȥk~~G_GN~G_GM:~ J*.*.u"|U]9|U]46E+[?:O*-_VjWX~GIW9vpcÁsVN7VRRRRRRRRRRRRRRRRRR?K#UYާ'>quj~GnON|/ԥ((ܒf{g׍Zџg3QɼXϓjzChF#U԰<ي:'g'9JWCERI~,92b:XwQ +La^8kU5c=WcMyժ.lW#NҲ}]d #i.3/i2j4{Ţ)keoq B0;;[/֏-t3hu7PZzt=ys؆![!Ҕ+ghZPÆ&2-wa]će.:*=ѠՏZh]ϛ <  }C'2~ڲE\)~%r#IQ6q `v3E3?,w0 (rZERJdfHjzbd[]#q#l9X~AݚN3cS"Y-%@)C);+hYj1Ye(4ii"J@B@~}s_U"mrVvFc˒HW(6C*p-+8XRN ,j.[-.kL6T)JzFʳA":#̀^KQʔw"HٺE9U5T^Q wld qS|nʈlߺ:]THH#d/ݜ~ $E|ۮycgѶ{\;֪wh2Z^9ii lcH$-IA$ b"yIH,* 8Y=$[v NWo6Z3폾{eG(AT%O-%Rt+**hhl6nŦ< 0i)XۅN)IY0J :I&o$yK~U|PZ֕!w+r!t^-qމPHfs&Ghć'$2{v\^޸'a"Il@0h(ʸ@`چC$ %AA@~p_^>W^\ X..Mi0TH)-, ``;XӺgeypC-^qN4Ce-G(A=;ӻ$PQax>U:ax>U[.)JqvS,0( #Z7n5vF#?q& (Ji@0S߳Dh~>ϕ\Rw9 ~U*|U]TA=̶}=~sRMZʛu+aHmAE*>ѯ(^’vUHǿT(thű0-K{qc|` q8JY)oq(!amdDŽ%CLL9gwg)@;}6wo ( 1xTu9.tU( NR{ }Gn49Kw('a++ %k͔z ~sAjӯۮsҥ+Gen+ cWLmcaUK\rt88%%. ,l'Nʎd'a>Sa>PK\t=qv"%a!!rp6ٯ]zeuIO)9+,[=+JHe=OO:n&[Ww`W$h<6ccMP0zssҶi`.cͶ%,8 FqVE6E:ZvtJfe4[ieĸ#m$ oKŕm^ol6ۭ%IIN딑Dl'֊ȶ%"L7⃧9j6ܔ~+<{eJy $oبxMXGN\. *RpKU8= mcO嚖~iU}1ibRڿB:O*"PI5 Q\ZGFK[[C]b]V؉'ŏA=fz+$i]'OA=fz+$i]'ŏA=fR ^ӌ2gdm-AT;f9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗAh3U~t#>]9Ўڼ\t5WB;jsӝϗA٬GnON|Vvn|}l '{#I;ʏާ'>qtRR3'7{2C*l-{xC~:Rg$ 3[d4V1n38 ^Su}% %ly<[-'m9EUOr= z>OqOٟF}=0=q`[d,lI# Q#uFɉrܥJqpbj-kq]"! 4Jq5H t!>мaMr. v!s"ZC6يMX2򔼠›qLGY$ -$ܻ-.Le0-Y@lu0ANui$ li!-0Ӎ 9|(GPWR+7ggv!ڐ:棩g#_| Cplo6̖H!e YJP[wOpwB}4;AGi;xPm9G`Xܾw}5.aM$dR|i|/GAJ{#/aMM+^0w}44"jI.G36r6z7t |/GYV]BiֵJzaR0000:ggFw,F?x~nG$+ j{==5خl-arkH$&eJ 9#tɸ˸Cԉ{ih6JQFkLZX?,ԶJcO嚖~iT好dqi-# g jڹCd<4$%a$)W5dv9jaR4e,ȥS ׷PLHH[ cl+Jb%i;4n†3&K啼C;?HJpp WL'~Rkql7TŬezv8k1ѐnܝ ľRo@ݻ~+簾='H)m1 ;a8e-BUA9A 3,urL}BU2$"j,B"G\jc=Ņ 6A;hOd^Q~]Bbm-9p(˛T5v[sU'9󋮚|OrsA~)ABeȒTU+Hib$V+,=-n=&Q2RI(%{ӟtΝgN|OҔlt|9{ӟt:w9<_7Nlt|)@ΝgN|Oӛ:w9<_7JPr1IӿubӶo;`XJQm<#cpO&gN?Μ/6t{:sxnsgN>'͝;Μ/(ӽωsgN>'J6t{:sxnl+,+90VHu CZNRPݑJP}*a9;JuGnA@.%Jqj2vIx'po zէia=ͽڅd~ʵ=l;Sa'qH J8 )Aw:rgC3aR%BPJ\;hV֎iJ=wx;OC;+Ҕh^vZ;~;+Ҕ&؛K̺PL*HPRN 8Pj1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JP6cw^*1JPpD`2!w<ƞ[KimA$I;'Ҕ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_result.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_result.j0000644000175000017500000010124411520622616033652 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?!idc5baI㷮i<=6?LV~{. `)=Q ?ϸ~~<|3\8EHKܖ=g̸$1R lvaL_ߟm]CBv +Jt8 }^! ^ʷBC3`V(EDc+$+yIdt甿/\+ZIpf(X`Mj^^^_k/a%Pۤ,m#3>u`l'=IJzOn<?t/KWe u>3b"dv~ >%dg0YB74`$JryuO;7yKRTf_ N765HYH7xQv9댚$ץGl-ʹv1ܥ11y{ S甿/Gn<|,.fF@mcӮ]6d;7hGTo1c甿/QOXLQ tW/?J䶼ѯo&mf9b!OMEe.GhgjgdY3cg- #Cz`fHIXdp"Kk=o:xMPprSM s$cT4}/jduVwV#+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƏEX+/h_ߟՊ(آƲԬn⸷J=:ԌLG9˃AY$qǬ]`8Idl aqn{7#++`UA `],{xnJmmnTbYe8qZVPiI{2H331f%If'$?_Qۿgye9۝>h-QF ;[pS`2 Ft+Bc2˵ъӸ5B)_zM}>2̆$o:8W-Q-%qͥZZGXl*r2?U4+f8۟@ִr.biUpsz֧+AEl-*sW+qwd,qUU@'t`hD2TS%ԮѪ@Ff%0@?)+yQ?D ?εQVL (5GbCY'1_OsRX:vsXdYtH%UYU[??!t¼Ӵ{n%hD̒ H^sqS5<ًFYpCbv9W:?^BkXټMsoϻ]i^7 F?Tis3X؊I{+SD ?ΏW:-1dA3vp T $#ĢEE]ll d5ѯ3RsMATSөKV 5W9?#uPn;|Y-,\d Z7\w?MATS$O?]kKR$Vfyx~[XTfXH#t”s=*vlIlgD,m|`m>y] U?t 7SOZzafqWvlGmd2-s?L#-.eTh?b W_$O?]MATS酙 DB5]a29 av+hvҳd$[9qW{$O?]U<&eڤYʱl#srsq}0OmH,6=OeQ 7%w.(l$^}E'D9_6Icvb7c5f?1f?1{zafcFZ G"CQ}=n3Odۻݿ;~\/N+w6I6Iצ 34l89ڠ` z ͇~c(͇~c)bYa,`NYsc5m! d />ݏM͇~c)rQփW.YضQgehEgbsG-?AZ=Тl -hQYضQgp4([?~(ų?‹GV-?AbsE +? ?lgضQhBų?[?~({EgbsG-?AZ=Тl -hU{ Ul,7*L _fx~ʲM8ݶ%8lsxkK-v. bK~t2%mp?K!flşdL>T J@[OxV6YǦu*wH6qu v:0w&Ko͢W1Z7#a7 `L## gڴdy߷fsFfA$ .a2mx8B;ɤEzAF/4hI;Nb\`Is; Zω5 SG!v}xd-n_%@ۂNII Q=8IhѢ8 czzJ՗VЧEI :EVWBy=A.v~#񶴶r4UG ihf|yFg";W\5]6 #]Oq-ܶ""(-ŌK~q\i玙 H/>gj'< `k5q"۲@c qJ=?oǨ_x_I*D֖6$&kii'b,Bl'V-mM[{_+x"6k`uƴ+F-Fv%vr&<LG*y=V-Z2L$¥[rԆOoD~T+|Շ).EߌuECi,2[4[,c#v9R<#" kD8g7n9 g3̏;ݟ].}8px+O㲋@I$ua@̇*Ai#ZZsqw;[(RC@S6-wtM*_xn;oJ[P$ $bGQ@k[uH?x5d]ffx' sil{RLDVD`*\ޡT%//t~WVzPlaPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Qz ? 6OCa@laPE?'gD?QF0(Q=Z77n b,@OzO]U__`5Q#I#C+x#S  G%χtJZ,:$r6 TONPedu&au~xrdyYʑsXD&.l ڥŶM ҠR8 AEOB?gѮQ$^lefap?>AR(#xеfI[xU'0Zkc#<OZ}ƙy! 襮d1U 覡mt >kǷ+ ;cebr3Y4M 㼚Y&hɒ6W~(Hcisp?й"(#  (@sC\EhQ@.h+pEg?й"tD%tge7i[6 xIk}wr=X@sC\E.h+ (?p?й"( G4?QB?Т3?\WG#  +B@sC\E.h+5-u[1&KhG][z5j>Kh?g[lLT3ɖE o9:?й"G4?W)?e+F+߹re3n9=3V/{u+>:6v6@rQ:G4?QB?Т3?\WG#  +B@sC\E.h+ (?p?й"( G4?VO4= [O6I,ݗwӠbqu28+ ȧc]o?zB???\WZP#  (@sC\EhW9]!&ӛQݶUwN)=Op?Jz(#aSB{"t5䍅y:C'1?&:³%̈́rܘn줬ly[ #gM@??\WG#  +BaaM:|_?-c~vd5?*QI\?*կ Wς4hOأd` 8e ںVKCAOёץk j5}HExM@ *Ͱ5_ M D5{BOaOOɻJ. xmc㸷x]YT6չJJ͡'tq<)>5°_aE!+ ϥ n<)>5Q@+ ϥ n<)>5Q@+ ϥ n<)>5Q@+ ϥ nC? <,Fu-һjGހ9VK?XxS}/kwk8VK?XxS}/kwk8eK^Fsr277{S~&3%\F1Yq 917/ w[be{WkҢm(5URKr%WmC|^_fxüdj]dA?+ ϥ nciao\NWeL=KI:'Voucyg6R 7H"p[ J|x2K鬖B$w±`>f9ߕO Ÿ}[;Xr&kz$k#4+LpDy0H[+Ӛ5kvM kq|IckuhRp@,+ ϥ n<)>5㵕%^\Z na8滙H~˼ ~Pqgi1%WShi!pe #]uv8$~.{{i5[jL3Y,}$ԔXxS}/kwhaOŠXxS}/kwj>X}ˊBnMv^}u/ Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP/_5, $jxRr#&-W[2O7 r9qZ8N[ P&K,]b(nxNkQ F]"un~~\#VI>lCh9N@B]iiϦI%(KmnEVޭ°_՟?uGQmnm^ݚD a\q tڳ%;+ ϥ n<)>5QHg Ÿ}[;P|3K,"nwVa&jy/ Ÿ}[;G+ ϥ nvP?_Iޠ?Dgw,WLf 'TeZw?OOʵk~' Tr:G]έ}yatEtJsojCAOёk&˭Ga1Wmh xpiT(_[lbhi((jG\Nl԰4?(_(CoQqG~? Ϣ4?(_(CoQqG~? Ϣ4?)X4Rv/Av5F_oQq³ G~? ?+>_oQq¹/kunL^b:K@Bme -Oz J 2( r ޣ?y9f{ud o 8DFH9z/ޣ?z:^kvDRLWI>) n̤.B.=kvZYy^<$1~4p*yW:뚀78 lz$]2 5C}XM.B1]H8x\1ߒy~fYĨ4JYHB@ I`qE%Az\%Dkwn@$7ޣ?y9丿e%Yh8fTEݒz(bPHQi{S-[~6xP\a?'^Һwzm?/V}_oQq³ G~? j> /'zzTh G~? ?+>_oQq³ G~? ?+ >~txa@;N#dV۲Ix=+ח ̋mrE|/;Lbzޣ?zh:zoHK۶䞦5gbV_oQq³3CoQqŸ{us 2\*gYbB4}_O&Q@6PtIIU?uV!ryƓZ@qi%##>duW4 e@vcϦCAOё׬QS`3OG#?E@C=?o@C=?o@C=?o@C=?o@CcٸxQ[>_\=}! #{z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?׭({z?y*[W޺:oh#{z?׭({z?׭({z?׭({z?׭({z?׭({zC7u *``=}렪/?TlߓU($o+Sמi?*ף!R48O]U__n2<$g̎G}&o4tz> E}7?jWy< }&Q@?hy< P}7?j_}&EWy< /a&Gq?ZUB(xAF?MX+ѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?5u]bIFs)_jW_w]GoѾxAV( ?4oՊ(?M?5bxAF?MX+ѾxAV( ?5y+@c)<yxAF?MX)yƟ|lr=yz;B'J'TeZ?UV ,Gl8O#QD?Uy|(h?22:*|@h|ϜUb+_O*K>siU(%94D?UX+_O*K>siU(%94D?UX+_O*ItgN2U~&Q7ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜT}_O*Q@/G%94_ϜU&DQ)ȿUohD?Uh|PK>siQ?EWD?Uh|PK>siQ?EWD?Uh|PK>siTsa\L?{$U~_}_O*K>siU(jnHמi?*ף!R48O]U__n/69-dz"¼o4tz> EEl߇ E@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g][l1 RݱWBoz>g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@g}/~*_vG"¬Q@gqٹ!/_El߇ EWd_ݟ?Qȿ?PEl߇ EWd_ݟ?Qȿ?PEl߇ EWd_ݟ?Twq*3.?{Uyȿ?vV( k2ͨEH1{<O]UGC\i^qVP*0Ohl%$du?o?/E ]?FG^EO_}~QPQ? EW}o?PQ? EW}o?PT {j/oôĀ0c9o~&Q7}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_}~Q@g?pG*_knafAص~@Z>g?pG*_}~Q@g?pG*_}~Q@g?pG*_Bna'͌ Uy? >g?pV( k<3yR&"|`qWi?*ף!R48O]U__CAOё׬WZixCOG8Wo1K}39>ߧϭn#~~>?>ߧϭn +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 G޲>ߧϭn/,ER`>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߢ>ߧϭnc7 +wM~>?ߪ>ߧϭn lC|c_訬c7wM~~>?>ߧϭn7c7wM~~>?>ߧϭn7c7wM~_;}l&to,X,S _~QXoӿo7GB'J'TeZn%[xأ.؃eVP44_S:J02U$g 5"jb\GCj*|@rzG?ƪv DSݻ#"MJH69@/5VHey]HbV@+9I"' 27*a=k\7@4vX\U>9Ou%sx9nOktFcg W+\@,:@?Ə?aO(e;(Rp02x>>"m/>m(Rn)3gsGcw$V2< .1B r ʤT;7wΥ^yQGsFo O%t,~barTW$cw?Ƈ|?O;ā/!Y<:n\yҀ:?c&ga]}o!ie,R3$`ޛxΚKYIfTEX03@?Ə?cWmXR9v@lM׬\[⼀ydڎWv޸8N<[c$ћby4pb N3]z럛J?l5PEP,~barTW$cw?Ƈ|?O^,}_AhރXě$c8=#u?232Jt('+{d3s,O2FRq˯^) 1.@`ddpMrCU\?c$H^GTQ՘ w8.@`pFG!Ky%&O*rFگ?+/OPio?H-OtSև_xcKA$ҹ1)' 1'ݵ`E? >g?p[w閷xOEXaY>`zV  igf1? >g?p]? SCt?MG?+ko-ſhg $v+#A A4e(X9_B5yM&P &te,)0@ҹEfEKJ@Un;{ȃdP23%;E ) 1.@`ddpMc/?ׯr@ZeeeA?OZ9OEww=,L #Vzz >!kcEC@?Ə?W$̪2Q@/4h襚Kpdp,r3*, TWOixfgܬ.Xq O>*Z@MO,UmU_Sx=>Kkhj܊rI%DdN:Tŷ0ܐK+Ͱv ݑRIo~kYo1W+T^Yft_sw?Cٿw?Cٿ@Kڤ.Gˀ* Տq9I7Eo*QK )dGf0сՁڀ:|?OCCrqح\L#4ʫ 2w7C9ڥθ4M:H\6぀p6~y0fTc xxlbD:E'cA'ҝe+4ۛ)!'؞O6Aq0p N1Z~w?Cٿw?CٿxzDh$T.bt 8.1X/隹I7Eo*QK )dGf0сՁڎ]dI\,bQ$hihHwFB8#cTiIv{Fp0cn޹c;lj3,%wo\ټP>ܝFyASNq+Bó]YjIJ]sɝ<+2ᗔ<90fTy0fT_@̓:ikmmx@6<I2$& 2AgMl47[s!PF'q\:y0fTy0fT7;/\kv[ꚤZ|I궳x'r.>WEH(  묟*$VL =js .N%,W.`* sߠ9w?Cٿo̯tDXp GOg@yF )\ @W;x|t? Qx|t? P7;/\k^?k4zEg%!%6܋{n޻Zhg$f[wP$ q3mΏUUۓ3ʕ=9,sg` Iy f;lj;lj+sſIB.qIpt{aK! Wbkд-ax.b-TS'IӚttmKF;xHbA8p3)5u`Nښ7acn6Ь'4@O81ǩjAKʦĕ G$lK xWR 롒3+&? M`(l &GhG,y.d]M*ݘg Z; țr tB,QI ?#Ut+k=!Yb>Lԅ%TB(yo/ܲJ #7@dx[k[ y.89q֫y0fTж5*b5k_*x|t? T]fח!v1FL<8lБ+% 1‹Ky2pI77#BVK6cy:ƩM 5ԩʀ6ßDZ>LѬ&dimR(IR3ۊO]U__P)d?kE9V;(4g+ȼȴ]uttF᮶LDmGHaHn82Odm|_&ϕ֮ [Ub'a`;PJ-׎*始g۔ i2K*pk"{l}r4m|_&/sZٛxo[/7F2$g<yQ.aӹ T\g$fA\R9ϕѶ9촍@j54"F%w #ֱ%uoۛH.cֶPxv&GFe,iPUVv#l}r4UՔԫ)<0<=kڎKHv,RVlو  C0zEH ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (44O MsOʵhS_jWO/u _L|ZE_K$۵ǘKH)|*'11<Hy-3Qh`!#rq։@yݺg'y Cu0yxXK)# ,~s׿T&Nz?QWD7_noDcP b~Jk2,UG𕪷Q̨_H=Vy>6$Xax}|9?y>!(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@(^<_tf/ϯ?:3@*#G?ß?MM 588#M*> r4O&jpTt؊ć\krc6_URA$MѴhmh޽EKv2O9OVO>'^D B$Q46=0w&٭B{@O!SH1$&ox8c@lI^iG8 Ӧ(>;_ tf/ϯ?:3H U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß? U/ϯ?:3G?ß?ß+O]U_iox0[HʤÜVP5'rE ' *E-cOuO/i6k)j"oxeɩ(,YnsEд$vw{hٙI%FI5N=.(8u4DUVtyzmⷆu$ڛzMuʲvEr: m{<Ų30?#v&K>siQ?a%Z*)ӿGӔo~]{PL幷y36v+I"f$## c#s:|A=Ise\Dkgp5NÄ#q/笸ݼ:kRH"SkjVV̖m`$rչg#K]+H. 7(Nn`G8xlkZ񵝞qd/.oI82%R* ~>Y226Y]1łw8я'i\ApI]e` 'zQ/îjt5ʼ]]ecğ8'$p{xĺAɤjkem$( P Nc {k?>Det\NrxIHitב%$H&NK]~=I47Iy An$r?0a|3ĺ^m6D{ۭоSi{E-E'n>b<qSF\ճ}f1;N~Sr;Ӻt {Ƽ]" &0?-yL@IwSc$vPa%`.e (퓱&{={SNVl0}*T/#-J9g ~n@ѕAokRKQ$%'j+_ =TCůmU28`qXNI樷<>һi#>42YIq"3*eu;t茻Ufe r͜qd5F#iJhLe1k9l7' x7%94F,QU/G%94/UMdv~򋌨rR} =-̈́WojVVZDmoI+FrѻmFF:Y-Sl}*W"6Du{[<ܪ%z6G'ķ%\K42vd $21`UF5:%]NE]9[P g7\w=KKkɷ** Qxrs$ _i>K4HFd". 0' %R>M:q@#5<}{;mG'Cqnɞi ڿ'̢Hn>S3ƷuheN扙X+2 S@3dm:qIKI'$4M79:4爇X/>f sX?&vѽN )%9QUMw =؎s4Iw/2T+~g8Cta4XJXN5IT2<c8Vӭ@Ҧ-=rI$$sl~ `ƔJn#"G]4,`>\gEL7Qkf4 ;ӵvd6GttY٧g, btYs4SvҲwpGR4kSG[bh1HB#o0NF&DS -/vU(5,W$>昆æ։6x.wa I=mAYZT{.b;dv~Cx82PJ Z+ywv7B):,u%"T2o?sg9FrqV GOEWd_ݟ?Qȿ?_vG"€,W3qg,g4auo16*vȿ?t{KKGPf(>R~5;_s{:M{dg]T"&q#ӽtl߇ ̸[ao=Yvw?L ӧBŤz }UHxc(K?a<[,i rIi I$ۣ*'e D 9^q6m<=] :K]FY'G_x~ktnGQ1]He ; A$P/3ODԤմ{{泖@YHbUqJAhU 3mai?mh8g<|MOȿ? UEl߇ @X/~(d_ݟ?P*"EX/~(d_ݟ?P*"EX/~(d_ݟ?P6ˢ>;m-~KEy 0ܼP>'{Ŏ;-<Ƶ EP]8f*\Cx m>Ъ$Nk*V,־7žJUՇ#$'UNV_W4[^FJWvH-4rH`J.ぜ t<=ygIMH]DbO0YN8<$A,cDŽ\'wҙB{LҼU5_wՋN|1);$7`RS[̭d]O_XiaA:w' fcgK}lռoq,M 'VѸ8=M-Ƨ>h-`/:ae|OLu ⒥S_wWI^ih>UJ"2nFu?$݈ѼSmݬ gyk@nmdTQu @>eœ09I5oKm6醴l\[#̎Lbytmo5Ξ2ɀZsw X.XG=sJg_MEs?<C6 G,OͥBSWQ\,OͥB 3i{)+騮g'f!hZ=ttW3 3io _-:j+Z?bx7m/e?p]5o _-<C6 G. ^q]O{sk,$6l*~?*ҵP5'rE ' *E-cOuO/kT}kC *dZ*|CGOEW}o?_}~,V +:I/! ʛyߵk~g4u:mq![Ug?pH UQ? EW}o? UQ? EW}o? UQ? EW}o?t|El|%ZI$X!wru;Tq֧GNKyu#1ζ!.鵣6 NIxvCme]FYRK87#$i lgkjr~,olЈICnY2I;c$8 WNH[iZ&d #=Z]xU. R3LI@71$z]U%Pk] +[oT9?EC@S k_x̚+[oT9?EC@S =?}fdZx:-'Qa 3&[??OoT9?k_xY4V"!rx:{X2ɢuO([??OfMG"!r̾2hoEC@S ?uO(eEk-'QG/,̚+[oT9?EC@S =?}f}-CIn]fэU4S_kGխŗ[{%tmʅYr䌃B+;IU?uVOR_fdkOuO/O'UZ?_+cO<5`_Oh( ( ( ( ( ( ( ( ( ( ( (+>/b>/b ( ( ( ( ( ( ( ( ( ( (+@Z'TeZ{ ^qVP5'rE 5>5%jI1-ghOuO/O'UZ*|@YϤQ ?E@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*Bm٭,bRIdT`H?آA_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@g>߱G,*_}} bQ@lHHQD |^u^ok4S_jW$TRYò XII$gUE 0+C@{)PcMM+Qwi[K D 428;(6b5Ii _*Fy . zFGLdv<5]g?p@w#K?4]c~Ptk/Xo??4]w#K?(}lk/Gu? >g?p@w#K?4]c~Ptk/Xo??4]w#K?(}lk/Gu? >g?p@w#K?4]c~P겢T@Y0K?4]c~Ptk/Xo??4]w#K?(}||Ux%)L9@ qd1>_o^sxgDR&.c^?>:<~yIJvOn'K'laz3_ws=}}߼xn1,'ۮx b}>޽9wï_w'K'lazyIJvOn:<~9wb}>޽n1,'ۮxξs=}}߼:<~yIJvOn'K'laz3_ws=}}߼xn1,'ۮx b}>޽9wï_w'K'lazyIJvOn:<~9w.onw,F\S=N&KQj:t~L djwmT$s#>p 9=O= D--.y qrΡoπ9$|3<&7O;_݆F,H0';`?*ֿO/?{FZ@x>TiLLԃ횫?E5?VQE N2G`} > EFХc?J#x>A?PFХc?J#xykaualӬFpU9&=rGH)X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ(o V? ??BG47+hFХc?J#()X$G#RHƊ({=#:}Yxr ,0*:8 H:s.sy׹a@Pss=?A`9s!^5EnCH9g9d<kfi99̇{u 0]9s 2z3XtP4vsC_h:s.sy׹a@Pss=?A`9s!^5EnCH9g9d<kfi99̇{u 0]9s 2z3XtPGu.9oss!< T?J#(BG=/IfH@㴟S_k?/ A5?*կ DXQi\_E5?V.?Z#> E(fmUbGgs28O {dYdt*:8RBH1t} *9_awbYش-^]_OԵkX1Z6Ogjt} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW tUϱCA]7bo 9_`)W>t} (}E\? Q(+@sPWMGءW 4O MsOʵZ_D?L2]Cq.I1b 2KDjW7Ʃͦ]F-ǹ9Tu-QiXφϷޚ1jXx e71FK~:k+uD"6Zitv쓛mz"rB^1x6K:kNwگ`>lʸ8D+ee=Ԉ2NsQKyImN9pxDdpX`W/& %,[O۾nc~;~7ݝ~ .ƝLjl8'x>jUӵx.d@ 3+r6{a%'$ڙ8W7_nﭭVȊ8gg Eۍsӻ4ER .QQEae(=(Q֔Fh . o+Z͹1Ԍ];q c^88:qEO i4-$ #voLf5Zyj:¯ !.A>-}|j]hC7-\ypD1ΡًZ@civH$s,mzyQ[4H4>+>{bݱI=H'?[4g!]B{,a{85gFa-HG9\(.L 82**%y=zdnB txN?_?)7g93 &REVrfUP;(\c>7Z (DgۆAL@28;G'e 4'UO&K?v\&_jZDQn-E\\hHRM$^3]}i.n '٥'lO&`N{YZMkgR[Ɨ,v yw(IBmLqE;ww0w(zЛipsyq*o)$,|\jkm= NKm2mX3p y~ i fgS5b@W4?MfgSPK?)i?EW4?iOKǰXJZgL803:[kb$dR;H k.*O-#H9}cɇ8d]=Vs7ЗWSsyu5qEXBYXmy6jx_IXZ/"V7%  6: |HT?sK-(Z}J; Y$<N3JTuG@%]f^H}ÔDY  Ϧzӿ=ӳVwO=rIZt]cQK:i|JۀCFv~~9<%n.teh@ι75CT6IfBl@8ɬQ%ɩ"]f@%Ny:z<7sy S~NȅĖ嶉U̼H9CK{[;BDzhG{1eݼϣWKlutʑp$Ve!Ưvisco=-hH6$R3AH(((((gIFy ;4mbG2RS1dd sucHmI#Ga4E 39!a2Eg d"4r4laR0MPcr~NМ9o۞5*QR&7A8ѐ}U; IomJ5tFbEͬ[8c. O[ʪO)JH6aAuVd tʏOz󖸼)$Ph Ău #M6~P8L.RE&uɥϪI C)*<|ܞCG,rW(pNvpAk$#d'IwyRo zVƑh-uor$%WxLh7)?&w00F=1L 5մ׿6 Zmdg=9Nh1H}J97 uF+q0]9*wڑO]jK|VM̫_q|v;Wmڽ]]j6{|&#mqr l]ά#m2&yϦ5#nO1bqp %:z( ( ( ( ( ( e AeݩSI4 >Y^VmŎ.e$vKX5$bĕ @u;^NZOlV'/.o4גPĥR[[Qvs#u`QE ( ( ( ( (f Kg؟7|' z_7ӢQ9h}\"`{Q&`Ryv㭍EѲ|l/&ҌJMcq4lғe_M-hp}(x"e_M-hH[oJzs+a@`}8ZAV*:ur_?oX i+2AHUz ~U˩k@g%o'm^2g41$3FE"tnWI`*_O߸`; g:nL\[N+I*[=Dѳ!PʥrYO,ۓ(F;7xLRc*+Z2bA giهM )AO\rxgIY{Wo=\:yኦvrWB@qgkk(9+&>NAqѳQZxko웅EVYT3zX浸]L7pF=X:ƤnՕKaC7дzB{KM-e Gq 3U͹J}zsO<_ iR٬ j dlepvy4keҷKHHYI'dT'Oݘ$2O.ο)9お?a4+"J+`?'$2d^*Oi0 x'i@ J̣MRݴE%dMUQ)ITm#k!_5X"c>܅&0+{EΑw& FN#'#ĚxfT!9VY>P2>M dmcQDI$i_%]H &ު`Ԋ :]ws;O0eH s E;~muɭd2-fC**dL6993-$Wr)2+;4o2G*rH#qMU.]^ l2y `K6zxĂO2A7L d3<ӺxK[謘Iԉ-*.Jx846F ITQS9;#565.o-f 4e$` vU4"$D'5 .r6BTq@l![KHϷk, *˧'N񅞫,1Y,mAJe}1EGge:NmIj.~d\n GRJh.㺞45{b^}$ PU:vְaYe|ąPȌ-[{yquJa~f$U!n ˫+[Ko.RYzg::^{X]Ԥ »|0du11ӯIV(K2M4qgv8 $\3qJl=fܒʄno<]j}͜ʓі^#a?gQ:X .6I?7n=([B`bm( Bz+1:MԼSgok~nF-1ʉ0=@9>ǃmgd m;1**71 ǯz?^[SbǧG5" H2u@Cm4kO.`S v1OiNR47<2 sJdlr=Ef]hڃ+Mk6xC 1BVvb,27u٠*."ӄsG9Qϵ04%]WpG$wq%浚1F 㷨͉u?XŢ' :2ދ޴SMfnZ7GsЯrG'%O^keR0 \"3Up "g#ǭ[Cg67c2HP@e`)'r$ҭ&0<& l %bV$SSx>3f1."G-885&ѧHݸrz,j8JwZth%¡tې4?(`AaZ@lc3\ - '5|]buD͐ݥ6ҍBcsUOA[fIvZo[FՓwʧo@Ϯ*CK(e{oxu1B< q82AtVw[,y #FѰ AVzi62tv]=ԊZW,sO8j QEQEQES?:o׏z\Ϡ"+X$ZxGSk5X?_5U?k\SAyS[/ʟz+0kC#L]d,Q: ?*ceTyS[/O~yS[/ɟzA q#:RUB f7 E&29RG# *ceTyS[/I2"+XT^ǿ^rx=q@?<筏UKNweٶ |ǁp4,Qn5N\ON8^?_5G?(ʟzTƨހ*ceTyS[/Ş4PP̩6E8GZqKpt(U`>fO=lj*ceU7p>ɜʒsR:O=lj*ceTyMA,I oRuGO=lj*ceTvZ(?pAA'\fN:*a _ʬUktOzPwo:YNֱy!ƅ=_ dN cALR,|nnu=:#:{3Cn rʁXo/]g'mfK{Yb 'ylǦxpp#/@㱒vVe UrH03֫kvomZ)X#ҍҎ<)7i>*rJܭDr&8FGxoSmq)hDAy>dDdy`H$`cwJP b +#=7MRTUٺo⫙ėv˶)(*XÓkZwۦ+nݝtf!瑎f_ 7MRTUr˸ahnI++U(.q*yh8n9:4ԵDL i[Y6syְ2n #"lc#Et(?Q~S#2#:_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@4}/j_Q~GآƬQ@5oX][kE|z} JNVSOYemuZEuc=imieXC}i-[̻gyP8bQ#͕Zlg#Y]- ڬX)&0du5Tn4{ֻ󯠝X/ܪX"7Pp]oseqz5X'xTK.* A(8.=EIzv8;O'py;lLzv-{{ջ󯧝#h隸ڬTG`2Qzz cj{?ٟ}gݿqE<}ry!$7 g` 22Oz0] x6$g}Òa5 lP.W_|lZ6ŀDF U >\oP_jn,#͖5V;d 'y)N-]ՇLG"S##&F20㚫%y~i24nAr*ؼU>z7hFUa.ZkAZeb0P\I2rVބ1U3nS߂G>ؼU>z7hFof-o"[?y$#Ĝ8 f6I6!]v8S}_lfx|o { &i&/683XANM66FX@)+9?}ӧFbW/R 24d*s)6\'GSW-m"fh3+HHbIƣFbW/AfX/m&6E7)##{1yg۷w~v~^S>ѿ6_3GؼU>z7hu̱kYZCkn6C kkP0O=MQFbW/afiCw, YprkB-FB>^}¹߱x|o /Aш=Ge5փW:+'? Oh'; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'/ğ.O3EŠI@4eh{Q\_?\f;C?p; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'/ğ.O3EŠI@4eh{Q\_?\f;C?p; +'? Oh'aEq~$vr?I@4Z=(?/ğ.O3G_?\fGeh'? h;C?~$vr-vWOh'E]mq| :U<)+=3:QhVUuZ"IZ?՛W»QsxGIJNOQ\>[^>unk.2X/ -+UxEղilf+$@$╷:Φ6wIHљ:t__[ڍ $J2˾5f9gԞ9ZGTϊJO;F|WBUZ(3:џЕ}֟v> g%_uO<>+*?_ Wik0ϊJO;F|WBUZ(3:џЕ}֟v> g%_uO<>+*?_ Wik0ϊJO;LowUP@ԜJ_n?V?7R9)g"2Xž9xZ[+_ >+*aF 8'<i\ 3"$˪1e y2 d{}tv6ɲ=1 grz>E?5W^ݞ!Ŵ1s}ղGu_h|ϜU.4FDOʨ<坌~XL9<: .[TT^<,G`ْ%l~=(ϜT}/*OX#[U]F*0+I 3nq[:UrVoqm1DS"XTu`CB}SG]S#\ܮ`*@95n'G[,}D''ϜT}/*WS#T+9HbErϽ[އ|Wsd X\$<3yUvF8C9ϜUCk4enYd2x^,Vx#Y|by0Xc@~V;G#7d{4iSM s1@zk Ww/yGp8CVi#A2/ ț>Et 묟(D_Uh|gxU?֦bH!ʋi_YXX!濵n$#ʡ#ӿ[Pyik, HFp z ]:olrPE>p~oQBT`IsMo'$*ZM7z奼\l1yVs7; G8=GEPEPEPEPEPEPEP]~ ?_BA#@gx0©n+GVUuZ"IVt3a Zn?. Udޕ**5mX^W8<<<"hie*DVUydbj0K%""),xԚݧ$te8";_Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:Q? >y?sG?h}o?C?4}~:V~YXiR]:L6xT\I>y?sG?hz jmOgƾ6~޻2Ī .e?4}~ kX׺%s$eK$PIX+O Zm5[è]X#|70;r\g9Ӯp|=ʘ y-̂&0fNsg<_iw+sS4C fV .ĞӮp?\Tts]ϗ0fJP\#`^85zhmM;?fsQ :,}D''#KFReUܹ̓'hR!HbolP6X.z Fhiik\I#4`Y\y=ռQ wn!~̲yFoǰ>3vn8]'soXG'>>#즖kNXW|-+">aϸ[hs\E';ǀ1ހ< z?9.6,2_ii*j |TGHmj!fQ,]ʑ`rgߌ5N|-A+Ӣij}?kr|~N:γqoyy.a bko-_l~j υ=cE[?WMvtڕWӮmuYdNH5x /f5/A~V,䟕p3p8/N|-A(?K-v:BђUqqQFttmVng x9QN|-A(:- aq+:7(ʧ @5./6_DuU'[?Q υ=cEw [`f/ɡfbHnP|̯Œ/Q\N,0ۻKnf{ 3$?n$< z?9KӼCjZ]DvS$RÀsI8 թGA υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@A υ=cE[?W@G7q4píY,$3IN"K1s\,7uCj[Tej'!O?) [Tej'!O?)hi^;]i:fjWt2|aLgN(mTm/M8mm@128ؠg=9>E@k[m>r~$k6Ö7G5zsR%965i.1z2-b-%1 ۹H;jK5ĶMЅյւHb) O7 6m 9._ip\<\0dq+zh?SZI|L9/i6mkYpO{p^Uӝ,*$иgW8H$]umXþ%ZǢ=ȝ^,K"@ NF9-Ë7,mp Ho!YCmS8'z(/O;O-gi K_X9ɣ3ϔc0l9%ԧE-:Y.$$ȓ$aluwtQ0_[[RYI"KxVHV蚚15;/-ԲCATbUPz4V!$lyd;eG't-dKp"i?u#|LL\EmNTM:No=ސ>TϡȮ޾KEwps6֖$6 է<ˍmF2qC+,?3&& 2:7>!M99uHMG/*GUX8~/Erk2Jʬ% B74Yo'_>74Yo'?՟OB%SyZ?՟OB%SyV@=~((((((((((((((((((((((((((((((#EmE#Em@qY)_g7Y)_g7o^袊 ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (+>74Yo'_>74Yo'?՟OB%SyZ?~1jJN<)dqare=2$4ImA/i{9cQ\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΢$4ImA/hsQEr[K?$4{9asI-%[K=0Q\$fI-%}\(_Ko ?3G$fg>.uW/ %Ko ?3Gf:+_ %ϳ EImA/h_م΂A?ɿCY?6vOZKFUR9cW-|K/qvb7 e}\n_Onnce b1[C) T}NdO?v3Q~Y,/]QB>] zU8ݫ]ϖ+uYY..-$.wV)3-S]:TVleɎcbv32:0M mf J|]ϖ+i yfVRy IiWź Yhc3 ݜgi??-'7Z}5go?Ե?OtZxC!yg64p3;mx{+zP/DIi?ݏZ#xmeYTp *9cUg5]#G9x(˙6eN>zPg"WJ|j}.Im`}B+[=~c)dpy X/m*Ī~W8Cףڋi??-'7Z}SWcl'9v n`{yXdP$lYO 8"9DIEŌy7 wA]T::θ mmkkGs4;t##}VC*uMZRb[Xv,rZFRlل¨,X`ePpZ24?(Cl·5 -mc-ԓǪ9GY:0eaGz?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmV?_cmVask2\Oڵq͏lD62yhc}}?aT4uEحVHnvhʶ%PhW.cs_zmٶ7W̎>TQ u@'ClšEc+w7ۿQV32]٢,ޡD̺YJ kUj-+跬hz3ʾK f T159qhG?TFW6 H~bIT+W9#4>x[1,Q=@\ӿ7H㷺d$Y q~rGrSUpJȫ'٫Aj!O[8Nd,[W /FI9T܇#8:զs'5dU'3W!cedӥ-@(V"K?uOǿMkV&60wt; X,6U f/4A"`iuxZC=w0yEw@UpIQGئoʩڜz 3kƫb2:33IܪŹ1V +n6yu60y!x 94<[`,-%\Ij+V];9ޣpp HuK7/feG<ՋfI C R(@I\^DԴbgͯm0Q"iILl`d0x#sy`|^#2@7:vXٕK0(ZhNb%qm&1*Xb= 0p}*m.P̅Tf8IZ߮M}檼GK~%<8 I*)Č ĥ匕&L/CtV< qrܥv aV+[N7 sw7K:g,x)˷s>^ FI G#}`ef `Ô%/vw/:ԵxEo/ټܻ1S"pnwrlc5x O 4kK.+ulNDK'8n1H?oxQLSOX^'L<+o44_捞yYYfm8a}~,QUg?pG)b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@(o?b? >g?p@+1?A}~]bDUuu;pr(_i]OմզBmn?S5hM #*8Gޣ?sϬG-EB& @򃟽'>uDpqw (nrxOC@ޣ?zH$ |WYϨY\%X҄21 c9=p8oQqG~? ք6dۛ2,WmhEU-8lS{"b  GL掶3_oQq¹؞K{mv<^t P3tRԬ.ݚuns@zm?/W-o u[8LП6unkVIባY%Di[laz _oQq¹SV:ZyOQHmGRw0'ٮv?kݟzyZf.dA w PB8Is߁}\c{k[K>V (f >ٮv?±#@$EYH 5xFg֬xOD-jo-hb}u?V? Z;H|?ʀ9KĈ$0wB10<ʲΥm3neiJ ڣn䑀ǃߧ}o?hUt;+9nXD PHRAv>5%[8&y- Y '%T9#}o?i=Jzᾶ4 ԟo?xCi }u?V?G&qkJYIgGb.,IS6o X2 ، r;5s)[+3%_kjo5%DMVrOA)yr_ ^Tm&8VGz/$O(?v•z¹m3K[_x|ڈf+*3>P  9Mc0;7lRC*K08c砡_p3{p?й"(#  (@sC\EhQ@.h+pEg?й"G4?V /`I=ɑNC6{ P$QsK/*"$ #7>#gMFv徝q{A4n xRzfG-t aC#nC|t4?[=W)xsVO*<[-fyʴFTH-cuzKK,Cl(pqHm#Kv*eAʩVMB?PӁB_Nu [m@ l[  =ɠ&ދ]0A0.h+hX>-$Ẻ-5ԥʒy+:.h+pE 3?\WX~2Ѵk_k[Z42dMYN: EuDmkPkJ/.'ۊiHUAEM<7u `Fjnj!N`{F($GV w^]?ԿdM4y.b_+nz y @-=umH,&c92y[2r03jK)$Jۥv ?MU_sj3]\ i.hAADą/MGVug63pʆhOXIҨ{o.tS5%BSHygq2IopGAnO̎4cH’r>ϩ X%Ѿx N[rsZ_@sC\E.h+ (?p?й"( G4?QB?Т9;C%>̐b#CA7} 8=NoG4?U}/F-?\g?й"G4?VB?EtFgր6.?S5hM #*ϸ_i]Oա7u A}Cy$svMF5]J z]+ ϥ n ?B*ͮRԷzHw=̆9B7CYCHvGi,+ ϥ n<)>5kIoZKX.䲑#EFɅvl=z [b";v!&8Y9DL9(p;}?vVKt(,L M<&Cʓittڳ8VK?XxS}/kwk??vVK(??vVK(&ៅXdYUul~4>x:)"I!Gƭ~O?/uCZ|aqsgu\Ymbx<8'(8$v?<)>5°_5hDOou=faѪ\H?˂q)u1#80wO#Jr#g%!K Ÿ}[;UL{>1kf4\ 5Y5*RƖ.,u4>O!#rƻ\Cum4:ݫ]ZX$xrí-B4(ӣƔ|,w7͔/3yy+ ϥ n<)>5jj6:U#-f]2Xi@3<|C)*G5Q@+ ϥ n<)>5Q@+ ϥ n6O6KGY[T WeEq i^!ye.rԱܚt_|ShQ\ah*6\C%ƣ$6SJnk|m$r0wVK?XxS}/kwk7JϹ5U$VqD(s i"1͌BЎ??vVK( Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP Ÿ}[;G+ ϥ nvP~Y/5 ,eU?Z?v?Ob8VK?XxS}/kwk8VK}u?V?g [f[PϕBKꦺ?I/D+_ҩk~mşRYcS"A%-mZSMH?Iy?#R{RWKmkyOOj82H(E\'PMGW1Eko8k]$̖rs{K]??=4}_O&/Zޥ֮59#HhdVmĈ5Wc)*_V'Ճg'5b@W/O'^}5jz|zcO^Ȑ!`ֻ9Y }]/w[/O'G$jw;Pr m DS#xg'P?Iy?EdsN/-/`܃[B#k*$j_4}_O&Q@/O'G$j_4}_O&Q@/O'P<}!?8LWUB)?PY-om5>DIHcڧ*d2Xϗ ds+KF{K 8!H{ʠlEc8`?5Y/iqkGIr 9D*ÐۜdIՏZq_Je*?Ob+ߓQ{~OV( /?U6赯_ El\@jЛAGUqBoiP)æ5ͼ)oQ%y1g3Jދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(z/X?(ދ(mf).[?f'^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}G^oW1Etz}Qf#pF\n~rAsPOoEEsPOoEEsPOoEEsPOoEEsPOoEEsPOoEEsPGE؁sp1ʓz/X?+:`z/X?+:`z/X?+:`z/X?+:`z/X?+:`z/X?+:3n]|ˍH??"(ދ?"(ދ}lZA\o-hb}u?V? Z;H|?ʀ+EQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEW?oZ+El\@jЛAGUqBoiPz( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( m#}k]s6赠 Z Ӵ*)$Ɵv)8?S5l?zZ@y>߳Um]j,r3>[ uO QoA>WIno޿lQy9ࢀ.%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ WihϊJO;Eg%_u>+*?PЕ}֟vQ@|WBUZ3:E_ Wik7w_:7WkR#(~pzՇ_ϙ^Kx?o5/-)7EeNv6?^F04j{j@$qӼm#}kE././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_query.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_query.jp0000644000175000017500000006272711520622614033673 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("h   !1QT"ASUa$35RVqt#2467s%Bbcdrv&CDFWu'EefG)1QS!A"aCq ?mGtd8RTBn8Hfsqa cMvHtQtGY֭ueϘ)7W]U :BPB^X).%@@&xޚjàv\⸴|;OP$%V$k7̜1 (a-԰ P$b;:xKaJXCM)=HM`GT\# kK.Gb*ړm6p ݁UX*7JӴ_u/ePdv.LgLH<QT"V61,THBpVQP A*) RnU!~%n@.+ 6[Jm R*!XɸbeAbc)NrI6րY":6%Pz;n%ھإ)AT@N_JrCɖ_yY@[M:զbAp 2~c / /hKP7]A*DZdXηL/ID}eWUa$iC1CL\F iľ()Z詥\@JJW]Nb1iCڤ!P/FJ h8|όF\I !(4*QU\(MHs.lr=כ=ܑm:5jN[Sc*JӭM&~QZT}!5q<ZWI(%2m sH]#X}}%1TuLt#X}}#X}}s:TuLt#X}}#X}}s:TuLt#X}}#X}}s:TuLt#X}}#X}}"*{kGSAG)G+uQTuLt#X;*/X1ׇKDHSrʒ]҅GMq*{i9Q*{h0a &N- nZIDx:WbuDԬ+pJT 6ě*nLTכ lSA / %=(>⌆PRއ؋qTv1q 6%B v()d_rK_T~0XmvuaTi(vk}H[ Ʋ}R-䤍ٰp';LISmHDαިg7Xn 0ʢh*RѶci5B$BQ5OA C+yk[N$I&s6K!tPz@-q>dU3EưI3XWJWkZ\"$Ffˬ&Iyr6ZfʎKqVHl+=Vz{7<[qY.kVW<\#in<Ў.J.X\w&_[7'Pr|IpjoApmea {CkJuRޟ2ڀY!Βu>J 9)KH1TȫMPmA$hDBIJ &kN%\ڏv'I?`@Q7; sGjkwN:awmom_R1hC^2$KMJI:6 IJtNon:4יqXCM *ְ* hjHɃ\OqBF*DEHVoYVmK ÙǛj RCnKRABHRM)P5:ZbFHTt] ZaomF JZH q*[8<}J!>&^%㸾nVˆBK )AJҾW0u[S׎t-d+$zّzsd!(JZ! :UY0' ̀yKNR(-"J9GD؎w;qҶZەsDR BI HSX*A]{r@n:;;6lDZ,Î -%Q4\SS:cY& "ax=Sau[rJj6$_Q^]^); KaAKS`FTt@H'Ve=+Q{KhJ0. Uȶůkޫxco Y.!u B HJA`%seR T-*I$X +jG#cl9XkLҐQ⾪ȳE{!m^K$&w#)R!I,6Df--b,ruIednM--1r7$MWkZm sH]TuƷ1dv߂ﭡiC'WGe|7Ln7LOBﭡiC'WGe|7Ln7LZz}m sH]:;+uƿ1dv׆TnsGm-=4Mi7\[Gm{2;km=g4MiwTnsGm7TnsGmewb=ĉZlMILjKS gKM&#F͵3[}^n&= Jeڗ&Jc(HV7"l'OL DU#qx0a84f)Ш)vlqZN?TT!):7%;4oF-nOnKeIQVW/s+;ҲmsR5YKLz\WԈ'ZqhZPxh\Z\ segl1اK"cew>/!* ,xza{ ׼ru9ywHiD/o(bC<5q0Kᰫ{M-+hW]wv6fW*CĘ(P lxY$ﺼ5O % $ X V*HG"4LvXol})u-YJ"nk Wjw^aGӫ<41QJrCfCqr:i H75kk ZmLvQ! i('Y'+/~yre֔Oe@%: ez꒜C(̈BW۾Ii? @ֲY {M!eҔmu[^&(!Ef8$ﺼU3Sf65Sh4!)e"aQVN"k>sY)} Y6 vLfKOOeA RcY-9Ist8߽+]Qoo6+jJlhߗpIk7X5Q593.`aKhoZknRTN ekcP[*Gկ oecy'Ifrm85^ƾm$/KP:~z <ع4ut5!e {&pmV]yɟ~y9V ˋ%_{CFNWbC~4h-m%5| Σlg$FKã8Hr3Hqe-0TC6֠5:N`Ns}QWS-WpRxkqB܅!MةJHYcd=?伮O+x|$ϯ\Ҋcf-:g>. #ޯ8}vy{,_lo][c}+?rl1༾_-{] FUn8{q,~AE8}Yp`lu|#OFp/mA/<; 섍"*ɽS*7>Ʈ"9w&8{8XHNC J6p9H~qAW5(ڷw?*6?a\2C0hlW>~g/G/ZaJ^]\ozl~ ⽶y|O)h;]p'D:g47XqH:EB̮C~q_?QͿy}#~OyjyMsܫmzl? o.~mY7q[8u lfMEjIPxvD /UWѸN{Bn= wƾFzl?}BoZl/Y,#H[(_'6 )HqbM|);ζӇxm3.''=$A:N6 7U~!:/{9Mr|:n3xmWE{6v9|G; 4%w \o]"AF!ؓ%}qn?%œξp},%8H8w0k׼q<=ԫa}H༣bF<_%>!G7/ʾxi?vkMZN8HBv 꽸1>;!2b~r29#8f_%8y ߜ5`q>Zw7$w-zmq_Yh;V9g,-@6F& lEg2&y '1֦ۆ%F#W]JNB6iVL .}$РAn/30\' ЯS6Q:Rr{u*U1xtٷNjZV]#э&ȟs݊tu)Z)+'H^%W6Cזs/u) ĉ09ְ BCv#\=#H h 7F}~dBJPtTBBo{a&ڻ8>*?~ngY9vmlQ|:o:0ҝ=7ͯj׀5_YWVhtmxN scYro׻NJGߛ+kpko*~nNJGߛ̛i}m- ġe&ĦH_\^ 1߲rٵ~q^o*~n`xVit0h˙~$dxj-qŐԻ mqVK[ynŪ%)h%T!GcYvo~޼ߛ&*BJBR>T\XkqXrW1MuuaBJtΰRF8ϊWߛ1<t8CexCiȐ@ڦ)D-wmFޥ☲hX!ڊ hGGu7EŭQ;Lo[՚'&$hGDqq K[A*A;uMdo,JJ0 sr;ϊWߛ;70ey\>dMYjZP)KA$!JIf!ĝe!~;N8V=[NJsG'ߛ7fɟ5A8̓:A:Dm1M;^NJ^sXP#G jK"cl^it8{՚/ɿ7AcmsPlCQXcnJrhJt@f/-Ee{^jt|W'f D\&z+-:hKi*Q֫4ߗ~n|U'fұbW:61;7K7fQ4>im{H~Ղ&cpl#)B(q7JUEj3FulS+0 ۪G))VճNZS|ڌ#rˊ0#ƹJT)O񸯪Mﵓ; 3Z sFӲF_TWi[B%6=$/ܚ9VlB\e H\ WF}WHlz.sd~eJVvVhmemIe½iZy΢ϣZ9֞a<{-~; _s0oN.݇x ,4;x_QgѠ[fakY<]`9;+ov/{}EFi 굓}ve4쵓͹]º.a+:>{΢ϣABZC);-d .a+:>7^Yh9٘?OavP9Ak'л+v3{EF,vYV\{?N!z5w^Yiw΢ϣAΊ9;^iY: e?avP/0Uw^Yiw΢ϣAδY$Ff`dZv]{EFW8,4H[f`r~z5fjpqLvaCdn6ķ$qk|0<aGɸYk{1|!)JR`%! % $jjy)4{>Ҥ^ _s9ۊv2^PfNA} 'UWCWA؃a~ GX-)ɟh>Cx@%zÅ ]d c F(e.2 6U̍UkSѮBOO~>8c:pk`رCNK-7JH$\I"R}1 aO) QiPX U%nĝ@%`'MĢă*[ sD̯-RRDx̄̕#-Zzhq/-cA$Ein1򘘦# x6\[Ѓs}]AVE섲eTJR u!r\Vػ;nJ\"\N=Ou'RL"nLK&CR#(Cr9uΈ:]E꽏"1Vѱb \qռ kG1x$8&6 ۡ^|BIA*7Fui+6gNb"O:Ve\pcH*\UDZmu::석q܅`H7]t[{80kaዙ&3:!eI+RMs]*ˍ6 (-Uuo))J)J)J)J)J)JVȤ4.mFĪ#T=ƾ ԪQh_ wf 1; 33b1ǍV\^V z2æ|!N=%b]53UVp>g*,qcy:-Zkɒ.d!d|=Z7y&b^i;pB%!m,7}-e7kI-9>RJgm աUb,-cIiaMڀ a{U|lJ[GPkI[A\@(:^;2͉q,@6Mx'?d&c!eyxq7W4{Dyp&K-EB{Z@7N*M]rrff$VTڠJ OtuP$ I o :9O4ߏ1qujM<ѯ0G꾳v0\tae6Ӆ24.ZگZ&]eHJ0 $,A;+4vZ@|f'*fGu^~3G UTZ3xģ)Q#-a+ aHy- "0#a:J\ۮ4ӏvRv"EE`ͯZ7;ܦh *|*)OsU/J0˒Z :PDV4 "KW`En8lˉC*XnRuWy*I'k<:0f4aIvtfԲ\ ;k("!u邢U@ĭ.8A+.)d/V5FbIR"*0Ym6V[6*}@dW:rԃ."*JkWe`lY+| lYu&*kWe=[b|j젬 r'7^2%2~ԑVVX)kWe>Yʹ'GE$z@?R܉?MVcAWd=WH~~ԛ?}O]o񫲂-Ȟe>~ԛ7}O]o񫲂-~eEwcܨNPtV^}BkWeG\M$ƾ^(+b5?eŹx*kWe=[b|j젫2 M$vWR܉?MUվ'ƮzAY?qRoL#aN5pM5wcVVVX*<׹N8A_0~.dA=Iʳz繉񫲞~5PS'<_p5 uQXKe@-$n=u?dV57@g;]9kQ{3~ƪwCE'gvݮ{Usݑ>s?uж 埀 []J״7t5sq_Tln z5RJRJRJRJRJRJRJRJRJRxRD*RxRD*R9>/_wa2&gCYj{g߭Maof\Jcih&^nmgUn*ڷb0dn5瑺Tpf;3<~`>yM7<Ҧ,s~Sx 瑺T|a*j<~8Xޠ>yM7"#Tsx- 0"ˌi#G FSU3BeʊPTso<~|a*i0n5\c?z,s~PX<ҦFSU9?C<~ hC]nߩ[FSUs: eD)Ez;Z<~|a*i0n5\c?z,s~PX<ҦFSU9?C<~|a*j4." Q=ixXެk[[Q q-b0n5瑺TsxpAc|7Jo>yMW8Xާ =#t،jBe'MSixXެou<ނP@PY#q̍Ҧ FSU9?C<?z6lS>Ӛ:΂vJ_gEdű)wX'y+ k )M+ &ȟs9ۊv[}r[UvDWB؃c~+\)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JPVȞc_OU]OVȾc_t6ٟ-6a˿WL* 6+AͶKV 'uSd$F %NT.օ6Ǭ8NZ;v%;kj`;}Z7Y'^{Sϡ􃶰a?i?o'V}O>ojy>v`?i?o'V}G=ojO~xh~e-Oڞ}Cm C)h~eg} Cm C)h~eg} Cm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~eg~xCm C)h~k>Cm7=A}6:ͯFKK(Hm,@ j{ڋ' lF3˙+(jl9)Xv(]5]t>g渍q,=2&:!x{bTH|w6a8  役[.EZ@Ut*U3Q9NxRsJ'{rn:?֔zn0o:ĵA-^}}m64H͸럿3Xaȏ-85J%J 46eM@X$<-˻1NMQոTV &k_,/P\Ds$%%"'ˍ7EA-hi㺷--($%D\x2n8ք~n1Ձcs8Z3C#([m&@7J79LLbb0{r4^ _JS)9Sq ڋ08W"qPW񰢑$XOk8^)H>Y_Up+Jև#FSlHmgAZ#D媖qpdD1c2ِ^օ)R` -&7?Bm˻qFKGTuM[H+/(L8C00.K!RRlW}e"£CVQ8hgSn7!n XѺIPWr;YSeObχ\i-)SqDdqwOqtuO5 /X(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k#{M8{sbI(( ƽ9ױ?Ӂ׺G:'҂k+MXrTDE`/*iVfB]F5[AA>>h}R 0X})D'rHJKCQٛ%a6M)bHX&$.mL "rAb!6{ bUWȼ/ y )ՇgWk聥b I9k ӽJǰW1LfLqǶ omsW|-Z+)KMbel]mIJX#EN"5ꬁ[vm>N?%k1fr&'A)P4lFTU ˝9sP9ם/ڀJ4Pޫ:gba/-הJl.65GD^m0x/.b8B[KI;SAI\- R)wA:il$ &#~NЕAOvJע.5jqTY )M^=zkLdy}i}h )r9GRK.6ۙ>WZ_m72|$ړm.%2|$ndI]i}#kpWkݩ6O֗M̟ +/Nx5|Tڜj#ndI]i}jNWM6O֗M̟ +/Nx5|Tڜj#ndI]i}jNWM:#!J*׷+fmsp qhFN.HNukB⫎XUU$Dy.h4X̧`Ob/ԝ G*+)U{ĝ \H)&HKbs0̋.%? .!.at mm~q[Pa"ax&% }i R)lX6IB{Qkv+q)f8S 02Ե*CiEDqZl)6#ƿ1Reh"dx8Ҵ5؃ q㏡ฮEyn]Rrqq3:Bq-lrU5}kYPT(2!! %>FˍbPfJMJֽͭ{ԍ12+ܭCqtJF;*uzñm+J2 R"Uw UV(ÊH*PIJH 'Pj?aGبIؐר\ e9f3y- f<ԚiO0ףAp67*߹ZרP*67:ԚiGףA|0_tx^Oe7GuV ԚiGףA|0_tx^Oe7GuV ԚiGףA b8-0!MIHVȁ-0}v:NޠZӌ®?5 eL2m(HPPE+RqidYBF/ rG`a, !D-)@9j^8ҥOSa.!1RVQRMGFΡE/(+jH)lM!12Zqukܒ/krV83؟,%%)l-L%Ed7ӱ>kױ&qXq cI6)/\@sXų#6+snj$񤱶(o܋j6enP)V. ʀ@. %~AHZtゝ"-pNUƻ֎&#χ01%!`,%!2{KqTv=e|C q{V$n<]iPH4ur[U`&ӿqœtGN4{ k9k NJͲ֞r=R.8ƫց;bB:㾨Dz$REJb催ʝ?B])#m֔ XV(6lm6!n 0bhOuXZQL%0@B!Z@Ui[[uӞu:iy$!2RV(Hs kؚ0$YiNHKkPVі"w9k\錕(%$H7$ZuspcR]>`ҋZDkLc$B-]yKl5,%h,28*,Mۏ2;Ɛ@xCkH&M7&_Pưm$`8JYkD<˪`i n.u[V[Wr18d}xq?f=ml}ӿ8kg.+ F@⒣(ZHֽ4FFr&"҂tԗ դy('˙^,Ydbb^YD[!MĞQ }#+mMmO qةiu\\Ba;X' qĕHEqkamZ 븬60"K$b} -.%MSm$Rc E@v+uaZ i ؃jz7Sg>xxܐ2 6J I _E\W gh?$~e7?$~eo7<9'3=M[O3gixyyGlSyGlVzo^/ys?;Ah=h=޼_<~v׋gh?$~e7?$~eo7<9'3-?3QqXNqВj y-VsLx#p_pER[)eC0zj1d Hq4 X%|gyE.%$2%1ji\{(%Flm[D4g@Sul;k cXpLPL51q'Z)č}ZNaD JK(*]HOBDGE!Dhm憰u5qavRVbMy [fjl0\qWzP~[Ҹ@Ĥ61$r NsUV68MIkaqȪ^<J eA sIZW{PxcX8k xi7Jō|I<|GIe4quti1R.(c -ƨ*.F8 BɮσoڙMZK_Aif޴ݸSjg7ch1L&Mך+&ǴGe6ZEd44< ^`ǁkDDcX-yK0VMMAic m,xY,y5,yE=ט)Zd4<ǁkX-yhXj {C^`8!!)9RF>&]&rBC5 d\ĿXb%|g; %ľS}~ȩu&"ԅ)J)J)J)J)J)J)J)J)J)J)J)J)J)J fc- Ra ]n{jX#RB:TZϹ}6~i?'qQF${ D\C^!;0`P"!2:[**TEz5xDɀČ=^{i+Z]]fF;9F__j#-YuXy,KquZIPC8` P:*qXɰs%cټ({"b2!Gh Fwwū(c\|{wNJJnNXT ?Ukk rPjԕ(f똗KLZC5 d\ĿXbU?0.`?dT)@)@)@)@)@)@)@)@)@)@)@)@)@)A~ŹL><cګc- Ra jRhG_h8{Df7ÏQ[8 >n l~كP dSb{e9o- -„$I:7풱1iqJ,%b]@Yc_-ϗTd ij .ZAieE!*cr33M9y%Ĕ QşƲ BSOA)$_Rn5qM򚍹r?#Ϡo)~c:9#Et}@,IADWl_`h+[ 9^Z_*i Z֔\U0*Daƚm KZTŔ 4UD$Hыb5/"sk#f B(I#v@udш%/8\RDx8N{c2^t6Z-mcYK;OP&ě3#o+I:@6⠫cYB3&,N*b:F!ǶЅY+EΑBb/ZL?&!QpO,G*mNjiKRⅇ}6'@Ź?_J$⹒.24t>1t4K Hڴ{]I?kCF$A-=mU$+@ѿ&R%$io)ۗ}7/< 6@j>~O^+V# +cmxYYA%[ZonP #/UyM-5r?#Ϧ~GA&STE a̮._;eMkns+J 3PAK%|-MGNWeb_,K1jwؘ_G슗Q0ba~*]HRRRRRRRRRRRRRRf?b& mU10oj5)J#f7ÏQ[L< Eb-jkbV l\_pǏ5 $d!1qܐ@Y[Hp ^tԸ|6\(rd9$/rluEWo%{q(*kwr{F+=s! NZJ.TI6$3[Q=*RPF7d/ũ ϔ3PvAK%|-U[ R&L/#EK R R R R R R R R R R R R R R[?mf?b& mPF)VyyJ+a-&)/nq:[Z Yr/mCW(_b>;r|7z4r|0 Pgr|0uâGX)AuâGM'`}'xeH"AkcXiAu&]7\ :$z5\ :$z4r|0 Pgr|0uâGX)AuâGM'`}'7\ :$z5\ :$z4r{`m&YDFO=J O=n>R=J ۮOߣP =*RpOzw69173BLC5 d\ĿXb%|g; %ľS}~ȩu&"ԅ)J)J)J)J)J)J)J)J)J)J)J)J)J)J fc- Ra ]n{jX#RB~:7v3UoziGR_f|8{4@?/,OadQ@GR_f|$lm/z%U[f4(6PHi@#'5vW  u@6jTž+K@kl؛S̱ӌ/ ;Pu--i @RNlOJ7?{Wer#e7)n)IZ/{xuQKX>u8K'Ϊ=zX^8K'Χ `xDG/K `xD,:ax,:%U,/%S<"|ޗ㄰<"|pOT{pONz^X>uQKX>u8K'Ϊ=zX^8K'Χ `xDG8aműR@UJV9&}uxd_>hzRvEgkŢJ+&{A(ы^(IM mujiV Kj)So-ԛerZ)X"[Hp_ujqtrN.IJ_8s{| J+ˣL]J`kAr+j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vj'WmUx3}a]83}a]j'Wm6\|vW9wS9wPZ\|vַ45$eLTMԮn+O{ +Yp6m` WH {aGVE$a11Zim 1۲jΛ=]FRV>N:@AUO3~]ߣ^ r~힮ߣAgl 寢׷⪰'힮ߣAlgߣAg! XW $؍WuV8V}8h#ٝx!. L*ixswL)#YSkk%iq4,bH.<+iI,kN yspL5/,ȺM?8|Xttx9 +! H$$EIeIF =2c:E YċCoYFLUr(5_'ٝajqd5+r jT'yC캩"~177+淒^^e)(I Vn`)fC'/QR*RrH\Z9z9^nqʜZKk{k8iӗoRHWq}$YGjCN33smV֌(RJNAP:qݩ7bO2z9KUb)!8TrrH @8kcf4PBq%IPH#kr%$w8!޿R{Ӧ2\ܒ]r]鷵QӽW5+r]5GNMjNdJ7k'We6:w:msTtzt7k'We7k'We6:w:msTtzt{sY=)sY=+ͽjN{\;ޝ0 +M+MjN{\;ޝ1asY=++^msTtzt^9\ODqz%vSok{Ӧ5GNLCqz%vSqz%vSok{Ӧ5GNLGW5+W5+鷵Qӽr]r]鷵QӽW5+r]5GNMjNܒ]%m!.պR}uojԨKm[q1XRJuV 8+b0ڕ<_vŏ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_qhistory.jpgdb4o-8.0.184.15484+dfsg/doc/reference/Content/object_manager_enterprise/ome_for_eclipse/ome_qhistory0000644000175000017500000004750111520622614033771 0ustar directhexdirecthexJFIF``C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((("`  !1QU"ARSTVab25q#46Bstu$%3r&CFd7Dec%1!2AQa"q ?6mv'3E$Ap8 $1(X.H%B1PÒ kW.8dvtR S4`Ԡq J-ĦTMpWM,2v$L-6ꯂ Dv{yͥ($g.Y{l@@@D٠I:Djǁptc@pX9n¥NM53#I.E\, QP-B:k)[Ls mMI %w]$iDzd߉$knGMAD-BkGum/%h` |Ġh7QC-!Z=cLL4:'[H4:'[H)cK˘Mxp[8QV΅0EL. #P1 LPtjzY.ߎȑ.YUkȅ~8ӺAI|uAI|uu3#UQ2( a!z vH Cu@FV.Y|H r a*`-sH|tE5 ɒRcv6趼hܻ)*iq G86X7pp2q"_8Ɇ S;LwE)'ߎL")1R*8H TUM׆^()& +esq~|+q1.vd°\;ᘮ?_, b@w LfL{b㍱POט22$QX l<`?u13zۢ`LbT\9\{paV [K՚-+u~-+u~NME%v3Kʠ+85师{,T.fslXUQU)L\S(" Ò=Wjӕ޺Z ӕ޺Z9yF'lKMR0 M2r;R0rLG8pG Z-޺Z x޺Z$UU#f5,y"(.t*@cnl(p6֫U<55 vSFDn]k\?48m?бe *STMs=\  rG$6b6C:ЗZ7o3E9T!!QCS* L䀇taeWflc1(  趜h hh hh hh hh hh hh hh hh hh hh hh hh hh hh hh h*ebc8^C7UT˪,TId3J%-{|>XKLXABYw.RP"Lb90rƖI")HP"i9|BZԗ1k.bF)& Ĥ2P@Ls&0D7\Eu;6\*-WLlb(VPy 5W2w8 S9D0#M峉+YtY UPSܣ)XÔ?ԦQl27̧m [( ZI7)A>I7 *i-1 Qv0Jko$!"<̙M^hEbfXʢJK&el-nfԚ{==6[Dxg[v&ʥ2LR:"(E2l("& XD#ZrJV'fY[PjuAa%8\x?ѩ0ɛyzF$2(LcXo|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,eHZ>|mI |mI! -"k,<}O#x?_2Ri8?_2RijHZ>4ĕԚ{̆Ԛ{,<}O "k7!&!&,te>X'Ŏ&~h-ъ`)\ V-5Anv ѨDlω- n'c" m$X 1j!IOA3ʌSdH26Zn%Z,EfuQX_Z?iG*w1"Mu\(h9TDqF?Nopuc'!MxVSGs)Ռ7=YNg9Ք5+u`ue: A CucAάV!]2V1u`ue:o{:Xw=YN:Xw7CYNcH#9Ք7*u`ue: A {:X7=YNPBάV xVSGs)Ռo{:Xw=;~,V~~,V!M xVSue: A pYNάV!MxVSue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNPBάV xVSGs)Ճ9Ք5+u`ue: A {:X7=YNC58Hc 68/%!9Ք^SmArjy8&%1 Prmx <ʙjiPY4K۰z.D8 y#LH[4Rƽ=;\*DSә]GJ,TfS͊Sl @v0 {VԔQ.y$Y߸EH&G8*Gm$oD)0hzdtݝnS!V D.GC@$ ^37[N֔",Iah%lLR cDD _>5/5v"ʥkJ] R (%b|LLKjPΊ62Q5W W6(l&M%(t]K&j9 ң/wayEVfJ6TD0Gܲ~yڅqavJ=i&VK%Dq0p5 `ڪ`i*ryA {$1h) cL "a˰ ANjV}TNJ"D8$%D`%+%Crl>fJQ`(Q\eY"9A8,hBlciW;STUM@L8=)u'-*S>`ަ@@~ {CeGܭļ(UݧʘSAc&el_&a'0٨) MᬞI0d'r`pmI(*G0@F`fNgI6#PX(ف^+grCɘN[)b +9IFjs I0%K 7  ;SZ>Dl$rDp( Td(ۜD "6'ܷxoQLTY#@Q"'O1LE B!!N%R*nbN$΀'12`"NA߻ ,f  4EEvvT b8'J,0$%(P$ M*% k`(L" @e*ܥɬ)+;qLa()] ZrG;i)Z\HQIrV(%d `2v XӉEP<0UhIƅTQp ELPh9& !nUN){tdeȾ]4&sB*82@Dqw\2evTYf ul _7Nbֶ9^ldNC"jAR үEuS.Q $ #2?-[-.)#t4lR9I  3>i LG@ғ %\&M@Lg ""`p3d3VY 0ha+*=TD.$!J6cV8Ri|DKs̨O@,A.YbJ8@@boE͓As6]@ :M#9 p=rq&JI4)"WJʟ2"?9BQ MLBI2؍&|aoeF'j[G$.!")3fIjtAGΟA0QR@)rn80Iv3|9._#K;%I}R~m={3|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}c:{΅:亱Tjg'ڣ( _#Kc:{ƎR~m={Tjg73|9._#K;%I}R~m={΅:亰v3|9.h'ڣ(;%I}xgCw({uSNIiʵt].+ J) kPD27HU#`ڞ{^}=B[:`nv)*X@s*" `:̢xW]Z-qQx8^ߘDO?/Žq~-:jG/'PYT+ȜJ@d\QkRXQ)t;Wy$n"B*l8]鬭Dzl%Yb"EP&U!XX@!=BbV$4@"`QRrT0C$̅Se'M YfrDl0.bq>f]P)S b '9lͶp3vEW/f$S$\(% MXpl=pjNQSV폒sJ&*LT[e[a#@VApe l4(LR&JDxc<1`#8‹` P7-̙GhAis>:QE Ԡbİ{ÊQlVI)ع1`͘X0DKaTr0Jjv3Gɶn1T]|_0Y)3PLBC*(v8c#nҳw3Re R-2":E$FEM r')A9 yFXVK;IRHˠB2@ QaP!jRr3ʨ̎7q4F.Q.0e4|F B]ꡐDKhp.sP Vٓk2UADL$-`.Qާ'O$_5p &lD U ܣ!#LTFȴ0d42g$PEqfs`V9Q)@M 0ء7|.!|.#8@#o 4c(>eB87 4bP} 3 |ьF{1A1x/~>h1F.oeB8A>h1F2!P} 3 |ьAq 4c(>eB8A>h1F2!P} 3 |>hP} qA1q2!|c惖؏'Fo |ьAq 4c(>eB8A>h1F2!P} 3 |ьAc|!Jo$i04sGnc#Ho?ќů0$ 2~_Q+Oz*.zuԈ{8>2nZ ;Y((AnL[|U-9x<_axU4ucXu2Z* YNZDh7n cgxe(qMx<_@,*@궀q-\Gt*@\]bDsP6ԡU6xjGԾU5xj"2@~$}@pt}KS_g4}KS_gA/M}/ڠ/M}/ڣGԾU5xjGԾU5xjaX9 +E1~eSN#lcI}Jn*`HΣOX_ ʠ.$-&/i)ruȹ(C(Q( { ]S.j(w@8ןxT -\NMjTՀ5ߨS;RbTn=2/ Gʧ pUVI6[c,!` -S\C-8<[ RU6<[]MjT~FK~DHP5)۹hyF32iÄ>CDP b*C j(OBxTU6'|Jѕ&v`'r" T{e{n,#C8+p]\,u"S8Q b0RT RT;@pt}KS_g4}KS_gA/M}/ڠ/M}/ڣGԾU5xjGԾU5xjRT RT;@pt}KS_g4}KS_gAuH6JC95*Yfg-L23~8Dư9(]KP#z"!|Bp˪`jۗT`% [[8~Av-i1ҮxXi;}  l $&KZQzy`wܨ-Pˠ * @ o ,Sk_xΏon6(GG>~ YE;R&Ұ$!{a8+Syn捛w,3@MQl"\ ._RT y1uqJ0|j9i3`3 Kid`PpaS eBVE96Z)a-Lj_ qKSog4}KS_gA#,-O0q4L;4 * QAA0qX#|F:¤* S}SB0a;Xx_*<_A_*<_Gz|k~|k~ 8:>򩯳T>򩯳TwʦPhʦQނ_*<_GBNtIi9hN ۷679(ѷ\Ho?ќwU$i7S?bטAuE?/ŽquԈ{8>2nZGG(Y9*jHTL\SGt14ИB6縆ſuB~q,]Sٷk>zيS5 @">y0,ke$qGr\*bGszMree-"9*Xk”^HUfԑB\ mup9,瓹uNxJVt;pTfT&.G5Lۊ#G,Ϧ\n)bAADN@6B|k**j=J>0ev 7*ڮ4VtBHS$Fsu:z35 2M|O6ro,  ]7-L "" RJ*2lAWXT?Jh-!]+2SxPKj -Ea nDXmY=EQ%RKU/P@`x"JLDC(LS PP(x*nUFx]ENtJx2 wx]ENtJx8]ENtJxh (dU*1c-2rU2$-4t+.e @r{"j*9&) 0K0]v *o%]tI+u\E!Q$o9xg!,pJ9I{P o{Lbn ÷tS?`HDF⠀l7p*vꃬj* |#2)I+TcpP#GzG^fIC"!BApvh\brG9fNrf`%2DsX`Eb7=V< :%] :%]zGKZͣ-uAcV-B+3p4>Uul**lJxt~>yƬ>PS*sU*sUǫA< :%] :%]zS*sU*sUǫA< :%] :%]zS*sUÒzj[:NdΙIDT U0@xҡ~.]d&g#n~.Q2F|U3-y!GY\Z}=[QQ-H~_Q+Oz*/?mC+41?\_Gfn ^+CUECeIpD; =?.#kԲR̚,(V!2QHg ĕErdrED3g6\9#@5ތ[D fl-fAyz|Ҥt-ԝDm2`r{ǹeIQM*yO.@yi :HIc{veq\o܇ *UMOTrպ Q#2uAD3WLnp4Vh/ݾ_<&mӁL3ڗrD_ZMX+8q JTY(!9]ET8G*B^-3lhV]K}"ɒ2D2P PĸBIJNT?0;Lc+R}+OH$pٹP*w 0'Oe$|i6La1L Άq,9m-pjTK  $ RC@nA/ː^H* X62v]FC#K(xN\t9yDDɜDD@D Cn":&QqpyVw|;vxGr A\5rQC*$,bb"8k4)s ,adBY?e?`ӜyD\>igIpBҔM4Bf2Y(PO2;ҟ7p.#aqwL4!VNP]f.țu(ܜ<"Ҵ1LUgU;5fej M36. q3GM5oSLJW)*GL0 JO7 a N7N(Ihj$E,re\.!8HvcAoԏ>Ϊ["%E,^ZftP.m7%@@Ïj7 Gf1=<\Vdxv)rC]4ULӰ jR7mq1BXqxH3כnjY+2ᔿ\2Ϗ`7CN`/nDLjv[,CkؾL|?^nVb3<9Lw@t)rTžS3:)-J%#L;4ԡIݤtQͨ2@9R!q1p 5z^rczu L|?^ny39ӉR2𝑳e3sn7K(D @0(׵LjuƙYu"P=%C 7 ;LL|?^nɏgԆ12r@DK{_3A~HzEIE7RDt*MrĉxkLv 0!=׀滓;ɗdAL7(n#?yF 9L,إ䠨d l1(CD"#%գP34](5"d1 Q^W(hvo02Č]9:cPHP.9VJB`zL,e)JXJ ڎi2إ \DG fu!/>L|?^nɏgԇ9ɏgԃ91 yT'.49 ɇ3כ)Ր5cP&>7R 3C@#~H3כArcu L|?^n=9ɏgԃ91 y&>7RٓH$ܤΗ*cv! ~.]d&g#n~.Q2F|U3-y!GY\Z}=[QQ-H~_Q+Oz*/?mC (2qbrC=8./`g(tST\LRH&(oE2T#.#ح/)oA*Z6 YF@q>3F@8\G;JYԀ'dDŽ>s#*׵ ٝa,qk_8C*NYbOI:8np*J(-aC {i HI:B*nAr&)obE(ih &0Hd $c7.\c -YFւYF=h8zsgg ~2vK90hڄ'WSFJ8U+(sqLDQ " w+:YfEc̡ P(Û܁0ZR_JKeaLț3vpF*Ò`zC)R2n)_w D |\rƿ-+m%$tBp<09Lc @Dn w@#-ysyt) sGYeW6j~,UZ @I)9dL2ZfDNS)r D9#PrQvrED)r Pa6p6()9"%. 0G9*Dpt S bk !ZAh R)r,W%M%2J 8' P!ie#):3e-OpeaQac\퍏bZ`^&?ѶqYFւYF=h8zLJ?YlDTz3BV `\C;/ c]@q L,gA8~WdH$PPOŃ'"p(`R`P5ggL|Um=h L|Um鏊֍G=1VzѶpg>*Z6ӱr k|5}s;1VzѶq?*Z6 YF@#=h83ggAzclL|Um=9鏊֍=1VzѶp>*Z6(ɤnDċ cN?K9wU$i7S?ctw4⩟g1k  :̢矗_޸ʋjDDZ}=[QQ-HjDŭQ!rXǫ#ŏ*˪b^x-~xo#Ň`K|,a /Do/\*Zf` 1*߉LT C#o:}CyyF0-Hk x![b"0\yF߄-pe".<ǔ`-Hk x![b"0\yF߄-pe".<ǔ`-Hk x![b"0\yF񻦊 I Fأ}C|wqFuX8HkQ0$mYo-q.<oFuX8HkQ0$mYowRH2w`"#<ߺjF"H8Hk([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ` x![`#o:}D\yF ([𑷂e6CEǔ`TMlC!4' .[:JeQ4Ɖ62]W&L [* Hl @zwqdf $V,Vts

yK>T,actd7瞴#-pĉoԷڴv$Qnj~e}mkMyӋO8̭,pB{P~%\]iE$@2fϕI$u5LE; G*/_A\Ykވ#WVKrA8 ]4۠ 7VU,9u$tN}wω!Ʃ`:geP}^wbfoᏈM,:K) H~U{+s/F? }G\๗R{[Kuf2y;Nj#. MRYν(y6rvǜt; @;'\'^5lALG~#Ckomd۠H:dq*~x_!rVk:n1Grzt If1'fp<1Ct_Jj 38IdE"69=8徥-]8#ƫQр+zZÿEXV,̲bWb`w1O/,8SR{9TjK(^@¶d9~ջVjm*ccpm^ ^9].ss0ƦQ+؊22I94"/yG.O&gp +?Wgrz4ߗJ G5[-ݒ\3CmuxiEr@#(r A_>^F.8iCJPpcOkO#-;Ѳ<#` #Ii8_!r32MZg5{̥u65*qH=ERAuA;\CxHP#r)'?0|A\mԬTTEA #<#M*q4h|2ĀuU_]^6]-ިѶƝevqj]f`ԡlI.TVli2H#Y3fOsߍˇk18ϙq 18LE'nIKe{ kwr4IwfF!/#rEM{[mN{1$@m;ǰ k26X U7&̀I"-cYĒF$`n{GcE;fE ˽WPhi.=0pA 5]\M$g"eQ'iFj(ghK"F 2X3 Z]6zvJn zا*vq%29!Yf;in[xderH{M%wԊI+j[QJ8GRŀ1q5|lLP2ٻG<{M2*Óz9&]''M+2=8yo>B~XK:ƹjX?o6㫏7m[ >uE>k޶5,M~QΕOύWR?ӆFk||;}l ?^kk/#'Ffa WR?j_5[?—gQ/!{ݙgB7KFk{gR¿=l >d/c_0Bi5;~Y2٘z/?(][)G8_DGfaiwiS? z׭?N}m? >d/cAwi5< >/ b;3GPNY){_w]#X) m >d/{3F?ui7uk`x'W) m >do+V ? սm >dK#P~Q_ooC5a7U)}g _V+2/7ҋ5nmRjY2ձ_̡{??Ɣ_?njꣽ?Jv<_$~u ]nKlL-rW-upd9@>uR2x|c# Kbқ ooȉmU&6;38T3њﵧӚ3e<)d vrz VRG0 3dƮI=ZQNaj>bV HrYvÒ#9Tu}j'Y"ILs:$i*D$22GRY̓ -O2\J'.>vʱvMlh]Io8TFZ<.6};VO_֊wXE^[.U쑙h=Ğ*AGX%fpBv.`GR9(~oA(?CV}A5d,M+FC`3<?Z^}Z[֧v~lm3ţ\U@#={N@84@D':8C%m_C +ifDY )a-ñO5sGzlmr tFQa^P@V-r g8oW)RO,mR`Xg9"E_S[O*'fA`cی'sZj&Ki<p~V·RvC.\ z]͙@1XBy PQKEPREPQKEp(()h()hZ]"ǐ o˵AKRpmG/ypm@QRpmG)HTdܨ4Rhg?QKY4Xw%ҲRh:*_.~ڀ8??:(n3/"|Zt@ #;6F9]WOez'UW]O  iM]h6ͅ7B@=zߍgj:lܬ-rT!+WP'0Do0NqDA SHk8&rBkH{rBQh =㌤42P:pI1YNi3֬BMH Xh '_MgYu` Պ2AZџ9sh QBMĀ{ ${/,ҕ)L$bFqy $jݠ9Ze|[p1CQOm3I #8!p}*Kh11u?2VbW=!8`jP)MDTvΨ )< rNdw<~`zfx԰Je93CX}%pFV z{t$8ٙA`XNu>k-E IYIJnca #e0FNA!46Ao19K+T./?G}їcSG>ʝL.2T;SGPeau~+iPҸE'M[Jcjsך1V A=W[K+R<=G_U]K ACkˮLaϣd}j,P#v{{c1GeWNnOaV #qOlat@ ҢW1D@Q>TUlXEQn3'Um;T~է\;HF29Uc$ܒI?RI?SZ2YvLȡD,ym g5^xfLn^VBX d␱f,͒NI&TY#Fc=3Ԕ;6nsgџz(RndzZ)7Z2(he}&,knCʹbߏ9ݤس'%VdTy$v*#?{2= Vr䎃=uܛy5f .%Qamhxb3O֝u=.ծn. pѷ˒\dvǸm̒I4sWJuL}߻O! $#2YXt&W8kcY}EG{Url3ޝ*đE$Gs5 ëjrݙKPG[zn'{ZSgh#)m3?jd &DT6JH$p3NKm:WXP$9<`m8p4}̺m~3эƭ|fݷF6UurjD U7;>w7m wr3V6zUAP)"_1G o5k&)$PF/F#ch#XcY &> W$[Nv[G#_(#VotfTDo(nKstXɯZވJO1|HBH\U hvMBjPI.LDc6Ѹp; ~3o\*K3LPq `(rMfcc%͟aWi2@EevCp2x]Ӯ]4͑©zOZb)c8ea.@0""L7_a̲#*UԃӨM}?[2Ew E0܍{{X y2$$?.(?*_*_¦9ğ۳P^<200CNz?Ju W/P'?:[tAj.-ղVV x7o68ǭW78##B:~cmkl& &6tzVfjW\y>O-KL#`9IlP$u}l#e’¬NUAؼ&-غ, 33aH#p:n&.Eia2wgpzFrj[ B.1}E&o_(8e%?Ϊ&W7Q NyzU84}Ab}IYпA' RKpt[:&__𨌊"S~vA+ap9㰬f5dV&-Ny`sVuriGvnT4s],-i try)<5/so;0Y7ceʫ2FVj7n/m.,ܴ%NFUY>'pC%pLAxUrvON4b_4w$mH;uAp n9@q6'`yd$?4BV>g2?.9#jէNZ2o<9I_5Ӭ6eq(zq'p@H,&MRk+#:~0ayk!68ѹ?3o{A+& >9[([gP<[ұo4t$.G#`$` tE:67?R?¹g౻R3+r}Tc^iu[ ^+&[J(VBё* n9#$2ް 7Qy3H{¹hT|8L\+`nAu1(ORURѐgր:Ixjo/"yӥIK?2 c&ܴnG[<V@R yR 5/?G/?SQ@R yR 5/I|/QK?R 5/G/I|/TP+MF]$ؐZX8E$Z!4#5Whh[kg nG.,TE;gd=>OW[++kUsa D'bݵi]t[ff {fbb2GuG ޳i :X{=@Ie|SҞRkd8@\VtQ{տ}e3\yR[ʉcMH0 ?뵷!aIZSV osk RΨ=@''u"I>=s-Կ[\CrUuNOR:}A`>`WBާc՝ĚD1JI! 켐և#>*K7Bާmۚ z㵳ϊDt3?Ŀ]cn_-зo;[?tO/G#>*K7Bާm5ԙOPe Zg_߉OF|U?/=:ZkWrOU}ZջKi Ggk.miy4*I3Y zOU?tV2Il\ 1.UۺPPjڊú-GB֧mn<bNNq\Makеo;G Z6u-w;n+}5''NI/.Ί <,xcnO|ir߈J(  uG&? _]{s2xy#dm7Qӿ4n~"(,x_&? _]\7QuQis@GE u^E@x_&? _]\7QuQis@GE u^E@x_&? _]\7QuQis@GE?e CgufFK X1S>V<`h,ַjIH@ѯ{GimL' `v2q:U-߇VƧ{iSN/m_V5WWѼ >U̱9eRc ?>!ai[Džo\)`JLci2|1V)wHm>ˑ̓<#l#$ tE;c9prHJ()lߤ @w5oG~(dޏ'Pq3\?&?Mw#z?G&'P^>GOQ̄eOG^A#pAȮ_Nm&T𶝦1]y73d46YI䟧a]Dalq"2ۣ6%jFF8!r84ukr\`6y'B& 83/q]{Hcˁa ԝ늫{C&|[[h,r˅p+d^"$E3VOE mhȽT-k[w[:cz$lg~Y 4-Wnf;~B.n^UuU8 14|+0 Oc$QQF!@'^prk3"=S4d^ɪj 'C}G#ab<ڲ4iԷ2 $}P*;Q{cuw0toT* Tu?9ZR<(,Ivk>\R"MSTh [^ڳR6m@ 0ᜏT(di2'ڧwD6&-|ì. ]f7zOYVxX2o8{_#'OP 5)`L"> ;pʀk:Lu?*?€8&`Xo-J%u]β rx}??*Co]S@=w-m5Ak#J0~d$6--5> m<|[Hv秮;OT ??*!iho@}?S(wD6iiho@m?S(wD6ڞ`Mco L97Xi`연ˆfit]1 GP+?*Cic'G*??€@}?S(wD>;uL*AylQt&\n-qGtOi PMMn?4ѓ@wZj=uú'OOQ.rq][E\VtR;v_7A~;v_7A](((((((((((((((\ϊvg?w\ZѐV6gG>/?i* =H3fD/OTn!5'OQE=n!5'OQE=n!5'OQE=VcqE0ƩuiKTt_?@ћH3RyDt_?@ћH3RyDt_?@VkEV|B0X@פ?7^f} <B#פ?7^f} <B#פ?7^f} <B#פ?Mb"ԚE= H>*vn!5'OQE=n!5'OQE=n!C1m"ϘqU:/Ш&35a!Ơ#3_4YOθMKCR??:(ΊC.kֽsF^".kֽsF^"QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEOy#ֺn<k@]to2 ӭTVXu.ۻ>R[IٌybG ?M[Y/{]~g_j~@t]mݶdՉ?Q/1_5 mnϲ~_j?m?/b1_4y1_4m>ݶdՋ?Q/?Q/'֣v}V/E|GE|@[3FBzG?v}V'E|K?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_jlzղBnW?E|I?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_j?m?/b1_4y1_4m>VƩ+m?Q/?Q/'֣v}V/E|GE|@_۶쟗ZoOXLMLMmnϲ~_jcVѷcn޼YLM'E|@۶W;~&h˝a gB?O?Q/[Vd܌jP9??:) _ȻsZ@z{G?ȻsZ@z{GB.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEvg?w\ZW3Gyw?qѿ+8?dUO@QEHQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@C?ɿkT &ѭT^uoEq][HbE۟z׮h?WE۟z׮h?Rv(((((((((((((((s>);Mڹǝr?h˼A#_FA]q:3G @<$r* LZ\ (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" (ȣ" )2=ir(gy7j#֢Bv5P9??:) _ȻsZ@z{G?ȻsZ@z{GB.EQEQEQEQEQEQEQEQEQEQEQEQEQEQEvg?w\ZW3Gqr<^>kv!8PmOn#:lm$LEwR:~{)佷fI@z`rziڍմ?ݳFѹQiͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@EwTLQ>ͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@EwTLQ>ͪϦEtwi_tW?mS}3G(6C>i_tQy=\ٵOHڧ g $PAy=GEsf?g?T"j3*?@zñEG:m ~WJdr1GSp\eմY\Ge+"XO VΧ-a"yJ\b2m|Y}7S [?UO?#G9' >iyek{X;[jjrQs /WQ BX$ ¶ͪe#24#h! wv`q Hw?w_-UWRvtfk"ϱ\`'պαVUm1ڧzVoA0~gk`N01z >h%y.Onz¿п?jb_/M\ T r-X#{ !Nc9WQ Bb,ې: "9dƀ7$rq><X&AT'=>Ri? _h jql~:ҿ紟ei? 몢9_@t'Y=_OzꨠW+{IV_G :W(J#=+/Gҿ紟ei? 몢9_@t'Y=_OzꨠW+{IV_G :W(J#=+/Gҿ紟ei? 몢0hq$+ִAo pĖ,8*['_2I)g^MZuΊ/?\ѿ״#?\ѿ״"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@j|Sw5s>); 3iVr ;I`+XY;\nK}gk{`A\YWsj}u1Gab5,nRŎ:m(ꗝ_t "d"b 8탟J]'AIt5ZVڀG>/@/z<[h$H&(3ZI.AK6Ek$tB&Ձc0g_6fּ:4۰گ2#N%q HIKI2:V[X`yr([dK WB.I7/)bIdSo c`ӿ?&wGo;U?9o c`ӿ?&wG)`ׇ.c&]oa+oϰ?MQѿ$M:7 }lh?+cTto G@};#haA[< wGNHV&>?5GF>4`ӿ?&/yϰ?MQѿ$M:7 }lh?+cTto G@};#haA[< wGNHV&>?5GF>4`ӿ?&/yϰ?MQѿ$M:7 }lh?+cTto G@};#hN L"x,~J?,ɿkS4/XfBF l&ѭT^uoEq][HbE۟z׮h?WE۟z׮h?Rv(((((((((((((((s>);Mڹǝr?hs]AdBHJt7Do2  E3iS5 K` ~@Uo @`{gs 6D-0PQ1ǜñyP:Q*۳b)u*H F|#4k o$FI;G5s з _MHZ|?#c-ym9ob26Im-xh)]f\rxW з _MyΗ-o}sq~o\`#q# >ey [Ŏ0OSMvx_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b=ux_bh;-@`b0x]O!oGFw<9A _M`.?̵R Yד֭$xIr}~e)g^MZuΊ/?\ѿ״#?\ѿ״"Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@j|Sw5s>); 3iS5 K` L)/o(j7Avh?Uڐ ( ( ( ( ( ( ( ( ( ( ( ( ( GJ}BZϟB5A%)g^MZuΊ/?\ѿ״?;I.u]̏ԑ"ƖWU[ )(7v?gK OʊgK Ov쨮7v?gK OʊgK Ov쨮7vs.wG}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4Q\o}I4n>@n>G}I4W3GSݟ}/)?ƪjYoKinfFH냞€97?JR_Pӿv7?JR_POմo*Rѿ״ QEQEQEQEQEQEQEQEQEQEQEQEQEKHqſ?,ɿkVpKYRFR5{տ^uoE!tI^;kvn>qYƺ) 3gy_Z y/N߼7y{vqT!.K K+h/3.]TQegWvhە~˧yiq}5Oaoxl~$v4M ʲnn_<ǽr$6)KqͰ ̬ o- :ZQ+"N!ت#>ēAڤsN>T28aW FK48i# " ݌. ?wZA$)c&dxrȬ$:B MmbO0~@tiic*ЪdeHϡvOts6*>ەG|%്FHcȣ+s)L ##ߘueSi|S׊Qc2&hFǧ\B܃B *@;p:&Hm0mUvE/QP58,_ \8!D1#lK,P#<Ŋ)mzn1.ۿUOBҬV6dnV-% cs`=A@dhأ$c~߲G,rp~}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@}}b[ϴ?T>T-(%C~O*0}@o`Xtml`!v"p'. cX^Bv.;[csm> gJ->ABaF#}#\BoxaeF``aR ?+@GZ}nmn&E+8!d0ZM<$,Y"ހ2w*f!I}COs% T =[F^"-@z{GREPEPEPEPEPEPEPEPEPEPEPEPEPHq@[pKYRFh??,ɿkU.sWq][E\VtR[n5xB@;{ұ3P>j,DneN 2:?F+/gW^ amX#FfTybQe$"h|Kj&H:*C:iFyi:يP ?e]|;!̈́D"oYT6!!.>qa5ԭv+y6OA&m2fN[v 8:Cm#t\ON> WaX7? Ϩ@UyD_f K&Wg9 <\&^\M%VҢo) 'Q@YKpOz8ӺZ.sd{.l F 98D*qj> Nqh o#;0#=ON,jLb%d9F8'fM48mɢ.[=8#g|U-[7W3ռ),Tm]rHPD9Q|sg=1[mwwv :$a'*n?s~IՃY,MM,MWd$iYмqoɸ;ɸ; ?ٰߘ?a/"y7y4y7y4G6Q~b(͇ߘϝϝ}G6Q~b*q>w 'Gq>w '@a/"}GM,MM,MQ͇ߘ?a/"y7y4y7y4G6Q~b(͇ߘϝϝ}G6Q~b*q>w 'Gq>w '@a/"}GM,MM,MQ͇ߘ?a/"y7y4y7y4G6Q~b*XHz7މRzVq>w 'T$a1ArdqTBB3iS5 K` ~@z =?E]Z7Av(((((((((((((})i7Ҁ8_yЖy7j k> Yד֪]@3_Olza#~R5[ٮn.no%0F+<:_;TGĆoy~Vw%69d KF\؂KvmpĐ@3-}V.:[ϥޭi:-[̔y, N;7.2S0:=޳=W ȷ @V&0 0hua_ki>ݫsD ͻY۫a+FD05Go,j@T4Kz#֕n@ }VZ} O _;P˫0Om7~e˴q(9*礼 'ֶk:?ۺ#ڷ.:}U} skַkԅP0V8% `kV~mպ`\u_ɢ:E7gtiX#] 9$ #կ$[x z2x O/u.:ޥa$hzq\7R+8'+Xq[U ly2#h apNY;K@_mտsֿvj/u{O_k!ulB)G(-}10r8=h%5}E]́#A\(ryqϖ{Tnտ__;IdxV j_;K[?kk6YOɉ%F,b3v!Tpîy5_(`m[8N~e }F@:j_;G۵o\u~O#%W˛ʋ q+3lڡWOr %I q#+<mVZ>۫пuֿvmoad M53#iB_9U%/\Ik7Ѵ_gy)#ێ?(sڷ.:VZƹd\[!cos,8,& c}zj1jqjhRH3v" L``rF wڷ.:Ms6iіႫ~4y4WR'hP߮j}@=E5 qTBB3iS5 K` ~@z =?E]Z7Av(((((((((((((})i7Ҁ8_yЖy7j k> Yד֪]@3OH>Ri't})ƴѴ˻Oj7_-uM̶D|V I.IERm2EjW̃ 8 }=χ?KbЗ]\0),;V?i.Ϊqch?m/dS$dc1޴?_xs}?es+cl 6LR( rJz^t/@+ G.I$hҗ?W?r/:O_Γ}eh?|6H&?7<J?_xs}?es+Y5k5 \H?xހ0_xs}?es(}Γ}ehY5_xs}?es+/S4-uA4pW$gzgY5մkmi/-nJ#9FrRjDŽ5-1mB+O:CZ?9>ן2b֚nooy,c 1~5I>k4¾^Q ßy+9]'I>k4xu.­$LLn~m9ǦR¾?W?ri>4یt/@+ϵ 9>ן2yϬt/@{6R㕟o V_fTq\R1K=Γ}ej"ŵ)"ڮۓ ttڭൂP5wCu\xRGmZOnzRmM)2)PXg'@>VA.k4 \ !n=AnOԮΓ}ehY5_xs}?es*hz:aJK%9uv$~Ϭs1v}.Ѳ|<3iS5 K` L)/o(j7Avh?Uڐ ( ( ( ( ( ( ( ( ( ( ( ( ( GJ}BZϟB5A%)g^MZuΊ/ήF O= Ka#~R?{ğ?Mo]phb{qSO`jNziEqwf;3@iS?vWw=Ohӻ4Q\_?NziP\_KNzu+0d~h;3G?Ҋwf;J+ӻ4iS(/Nzw=OhZ+Gz?vWw=Ohӻ4Q\_?NziEqwf;3@iS?vِިiS\Kq3qTBB3iSkwFTI6y8g &{ߐOhWkOmmxDb$8ɫvԁEfm7Gݯ~k4Efm7HuQ?@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTEfnz7U۶}'@tVgIQiTHqiTZ# s-g!K?oՠZ[¤P2|&ѭT^uoEq][HgWa#~Ri'_>-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@& ]E5-& ]E5s;\nh%JugqUwΊ:tPǧ;#UQ5$j.bi3qāzsGe8($@CGr95-;~֠q _/C1k'od 7M|ٶ yg$:qM}A*e5.ԗV }>ԥOw?a(u41Q\}1@ky3mӝ*q'^Am#]ȴ't D_7,e)8ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P h?\P}?>ΟUOOƌC?5zO='P5cgera߳Gnok;*yGU?Əw@h}fϼwU?Ə?-~ey٬?V=[>s>߳YV?4{G?74}}f4eY#hnoh-~geY#hʳG?H ϼ[ʳG?t%Y MqE-~/noj ?jK;$pRaYdr~UlH?ڭ ^Rڇ8'fԏ?74}}f?O;I*?O;G=>Y}f?74x95TRDj$54%#}9SNg[>s>߳Y'FP2Dx'8>W'nojҲj֊UpttQ2nN0?ߩ4}I!18B^AIig#KK\vlƽΊKo{YYEӧi#; s+qgL1rRѯA5}*rdIXRz;N_F.(EY%>`S(Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((Ҁ\J0}((|?l`Rr~b'PKF%>`PQKF%>`PQKF%>`PQKF%>`PQKF%>`PRKħ`S^1"eq@?uwZo-1\NiV#?gaGF,pzҬo_vc*m3smVm9Ҁ&jxs)uq EtS傧qmT^s5Ci) mepBX oƗvhp=HNmjk_& ;UC$NA=gtۛCmw;[FDr7q$(jN=vj?I[ѭ )_+r[w9ZjϤ_Ty>~rUb2RE0RG!Ij}ew==- 2 h?+xeY^A̜"uurA˞G 427))\?7zsKQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE(_EPdb4o-8.0.184.15484+dfsg/doc/reference/Content/contacts.htm0000644000175000017500000000767111520622610023322 0ustar directhexdirecthex Contacts

You are here: Contacts

Contacts

Join The db4o Community

Join the db4o community for help, tips and tricks. Ask for help in the db4o forums at any time. And take a look at additional resources on the community website. If you want to stay informed, subscribe to db4o blogs.

Address and Contact Information

Versant Corporation

255 Shoreline Drive, Suite 450

Redwood City, CA 94065

USA

Phone

+1 (650) 232-2436

Fax

+1 (650) 232-2401

Sales

Fill out our sales contact form on the db4o website

or mail to sales@db4o.com

 

Careers

career@db4o.com

Partnering

partner@db4o.com db4o-8.0.184.15484+dfsg/doc/reference/Content/depedency_overview-java.png0000644000175000017500000004535711520622610026310 0ustar directhexdirecthexPNG  IHDR^oRDsRGBgAMA a cHRMz&u0`:pQ<JmIDATx^_y揱/+3:u8+!AR`KrIt,b c퍐2(6>$!9 FUlfK0F` {c=OwuWuU||][[]6ִHַYry4^u}ko⬰\~P:9vz:e9ԧϥ2eK=0uRш"j0.-}CJ{N .ǘlx饗0&sEjƫWʕ+*.]1-)֕C#NVV R LЈ+VR@ T<4H) Xn\r۪Ш#Sd?~|Q5U <>R @N%7ݺO": Z-}@Ϟ{n2VL- K`dnR rۓ*;=6Ҡl3F))Y$# B8-c!,N҈9ܥ%FN+4F8Ш?o$k.-ig6dtc"^g9jQ"ب)wR #{Bq8`+cAs$I8,^FF( "cE)>-_y[* 4Jz)!BD\hwg&`pѼ.,.nl/Јm4[K [%x+[09UW6F95q }$/fST9J4I ɍekԄjM.B/fS3Sl*ͩ,W`Mhl/R.W@h,lj&s69қVqF=C5%4ljslTKoZ_ Sv я~tssX0l-@#9v'?I\~}8$fq5޽{4FxbKlS) 4&:jA7olC7%nL?~<%JnP=*4 sHb666bj]v NP7E#:tv18MA7[>+4ưajE)y^eРgF1A81 KY2j3TGMFQhlqDh9fzPW(4 Ls׊5fd䖣(4 Uv [dR(HhG6ƑCg~GE@%6S-{nedFX?Oi0)+[܆;T?~⡑5'6G2G>Mɇ:I-4 a-'\SD{3i#??Tz|!vF<&?x'-x! ss}]42F)zEBܕnO+EiwmRѨ1XdcF0T#2Q:H[b{ܡ'Lp| ^dZ₄@/}k "BF#ǡ>nCCb8fe樑]SްrB8x1PZ\#q20lBc FN Dmڨ97pho*bhvΚ`W(9jV5QhV|h\bb6\'Ꜫ?R-C#g4 RrLVLLhLqJFqe#)4Ah\puNUh1k4 5})BcG^>bh7g&mш!fY5ƓyFsq1jg!ZBس eV4FΦƞSͶ1* 4AqzP\Ah\ ՞6ڕubܕӦ(4 ÊiՍ.۽{N<.R(4 {KNFݡلFQhLx+Jh Zh lB(4uL6Bc`X@&4 Bc]Ǵ/Bc?*Ɲ<#_җ*eP5 ȤQc`@2\tի rBcѯȦ 4zHtWhT%UR׊% Ulшx`ll_h5Bc`d $̖-1 4bќj 4FwDBc 虲%T [4b6hԜj 4FwD㵢k#6 R/\xoCLV >'|_i/BcjsL+4:n9<D)>!~ !Gh52rи$}1 [E]b* 4TBc9ieh5}L Eo0PehC4Rx 4~{=zƍ4;t alٱݻ4WG闔^޾()j EՙGΜ9Ffaj~nf6.$ee;? BcaiTh|2P}SbOsE {"y MaMDjG+Ꮫ[Go f`1ųN8Sde;qYXgv:@xPs"RhW޴xN_56 ]*abXn|`cerwCFiqرuOzj&c.dȶilbĭ[9oW; \aR܋kRh eeV;; *bđF4nˠV&u,nd/f^gz!p[7o.pݔΨaeQ#`dPݶʡ9zxV^@6Lg=[1 'iٮҦig4ȖcMa6EMFhعD#⛁E-"؈=5 -nǁ[Z5#/}u4HC-mN٣Cav:dγQ}{[nnF2Wd?^8rW3bi9M8 aNƺ#K<[U:gU91t@޷d*!6wO*xl]fMz ^;N)(91,Bc.sDBٮ\>Afl uV`~eku]Ťs ՓO>G}UK |ͥ1eɓ'{=Y}f<۞eT[u/;Tq#&OW#%8/_ϿYsD#fpA˸ `r.-5 IVL4=vrͥz}vIBcҎcAaq6P͡Cd4W=}mWhCPqPյa3Ț$[3 ۄ[PBcr dMh Mh@M58l[3Ț$8l5ܡ۷o8qߞ_xqe=s YcN:ueDb﹠̌Cf=fdƖL&4&T xQ7Caw%հp;ǟnA`ѣdf}Ko.XMۂF,(?aE,t,:o[mKl(E~'qO.la"24ܛĘ$ GfX l-8^qUҔ[ ! PsGTȲ$4zrf:&Kbsrq<&/Mư5,Sy\؁>Dvi6Q+i.g3gq`{=[(" 4إpnJs8Hck+ <Ў&\tXlg_׹˲Mz. y_~"l挡+-bm,3DeJ#]% YM`v\#Yg <9Fnwc.&n/6 Me 'ҿ79QI1̥̯`U(P+5={h<|en kͫ ^@17DTFt@#[nEf3<󶷽YyU3Bcq!ţq3T0gSÝZrRCⲻS"43y@bFG\4U4q裏".ǎʱ Zc!TͩʫW2(Ӝj}S pjz,ѝM՜bj{{S#G=M@ h\ v)r Vn޼@i]\ќj&4QOy+P+Cf߁׾ omJTͩkyi6X c)ȑ#@E L.Vhb-% Q`hjf 0SU GDbX$8YDŽɆЊ .ۑljuT*U i^ :nɫ]4İHf3s  zU.i8Bc&a&DEtR@h$@1h,97-"-BI9)4N*uW4Ljaf"0F5ZcYm$E2[-4V*VU&JEbX$'FE?Ca̖t:jZuja&DEtR@h$8zp "-C)y)4N)5Uh! a&DEtR@h$8zp "-C)y)4N)5Uh! a&DEtR@h$@ km8 Q$E2@I\J< GhLЌ"1,N R(zjfa&DEtR@h$@1hYj|İHfՄr"ZDB5n5#1,qRMFղ/H dP+v[h8UV4 f$E2@I\J<5Qwl5]])~: 4ɺ-4>gڰWn2AZd6M <^@m$ƑV,иn46,4_h NGQ@hE SQG=bBcmHp" NXrYw/Ig@+ru{<Ռ`(4hQ1X:eEq#|pFC.c8NN޴z{ΘH^&d#K%L/%g]W`6^ ҖRh"c+,* 4V^k ?~>EM@o']YIu`#8,v  fv\f+ǕW"g7 pwC_w覤+QJ%SQG=b+Ȧ9Ivs&m1@4fSQG=bCIw&b a )X F݆㶞8Ab !Ш1X:eMb#4 i1Xg1X:eMbШg i1Xg1X:eMbИp x )( pq-Th1X[1X:eEPEl Fh Vh NGQ4֘uSQCm:'Q +⤪ 4N*ܪGqUjBcr'@kR)a YANHo}닩j$S@h.$rh5QᨑK3k@1OU)( ȮBc(P  M)0BbԸ qeRR@ T@h\)d@ TH)T@hT(KP-Kqy+&8]ШgXujM-RuRʰV\)jR \"!?) 4I血C`A>Xʌse}7X Ry%6*%u|;RKuבݎisn2H4 ['B 7V0 shQ鱸 g.lVfd$gK4R1,ЖpAq];Wf&m*|cXT = PX!1"|sj]FqRp#!&8Ģ(%;b sl$xPd5Z1{A\Bc3T{9m@L'xV#ԑ G7XLZJfN" g,0'bѮKٰl\FսօQ6yL24r’15cAp.QGKFLm?h.\ #3ZѦƒQU~$ DZBF6I͹W[fh9TAQF*6>`dJ4ZM؃sl.^ۼfFtνȁ)ǩ6زQ,Wplr#ۼ 3rx(g2wvo#\5XG]ݝædoRn ӎڧG7jluMlht٧7BD#Ѯe?Fx6a%#9b#EfmO,>HCOB! OdLij!y܋WИ@XQh$8h7COj&iNTouod=7YW47ȐtuɽI>60l_RIhtpHlSXV&Lo8 ƼCWXDBcq֫hDw^<zae/pJoazN!r]k&1ﳙI! Cd!m.]Jy*`%. Cפ6\9Jmj{GGӶdM6jCUlB*PbqPelHܫC.[V@hv^hL.hrsȀq+$SSS@hZG8rwȉE4j-4& RBckp!T ) * 4W=F5 ) W@h?FUy(4VNUF TXi`sИkd?S@hTkHИTn&@BclI)N1* jR@ 䯀И޹4ܼS l.rY H %?:_~ml9rPg~@@4M7~cv~z l'.؍ٕ+)٫%-Cue-^ cMhl<Јi;!4&yE]h+hBcKƖB)Y Ff_BXA[*/4JrU@h52Bc[eT4eX|1r{+۬P:0-% % Z^ݻw_Mh>c})4Qo5$LhlhK"~cqe]-&^ t 1Qs|ɮ6@Ilcs|uiVh2BcK3@#=Eo>C` Z[[#Hl#Rb ~yp;6"1hǟ!qdY0hĉFiMk׮\%e7%8kPI|Lo`;Ovº7*wyJ甗>@O|1l|ͰO2z#卉FE8UmΨyqTcAbN^uM݄i_RhlhD'>]0z[C%m4*,XG{'&A5ڼ.A{G^K@Nc#k\RI}HPlx&5Ie^ڴ.R84$ MRxͰO2z#卉Fkތ:t76cӬ9ڷFP4}l|ۙ {;*(4vUlc`b 4!ݍn/O(r(NC;9˜6Hnye11hpT2=qxDZhܔ,p=d`R7E -. ZИ@䡋Fa78gobow^iG[a l<ؘ̻ µ 8Nk3Ls= `q F-<آМhْ=7xhvte0D\42=߄/MWC< ĮSLI8.vlbNRYs^}D2iudD(냇pKf'GF@##;r:;p ƖAQ. ]$mkT.k7Ɩy{CݖN)h^lR cBhKy+* 4{҄Ad 0"4,R@5q$UH:ĂQFCbChlKesJ@bhZ1 )FJE Hd= Αiؙ" K ;q&ڞY n4|*(['|ӲyooNHR2QZSHKB55" - $llg@ei=hmY]/jeNcdIҹ>S/Em *+4Ȑ@>ht٫r,bJy~4;Imd(Eq`ؕ.mMun|8А|=H›<&,VkeZxBVM;_1k\4Q`gPF\FuhR@ @Vht{[r("1\63odlC=nPEHV(؈4.5 *EȔ`FPm34ҚŹhЄ\4¶ 0AjnR=.-,"LA ƁR dFvt,1Gf\'AD ߼Z^NNB؅-to#:N'R,bAt nJsڌ"`oB-{%R8^ op!t)', ״M ϞϬS85 45RjԨL H-ke%("+eYШ! F޴9o5Oи8R e1^BcqR cƌ#Z) 4Ih^+S1ϸ+)PBcX/˟?3 IQm@ H\g}7_FjR@ H) ޢШ!R@hTR w~tg}w}ǬlOT'xU[ SmϾY}m}) 4N-⪯]bY12/8Vc>R`tC z* 4P٥&JW@h,=_ dh{vb["=+X+o2,9d+uQ9츥SMݨ XAU)㢑Z9`w ^G'/:ȁ6{oö,X\֭0 v``Sdirҵ@\Hg`Pzs@t 6 E8=}dz2uqAW@\B#*`ǟ:Ƚd\%Nrш4XH mfь/A#7B`[?JАˌ, ȟ }XMBc QR(B# @C~ IENDB`db4o-8.0.184.15484+dfsg/doc/reference/Data/0000755000175000017500000000000011520622616020224 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk100.xml0000644000175000017500000006614211520622606023534 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk53.xml0000644000175000017500000006742311520622610023461 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk5.xml0000644000175000017500000006702711520622614023402 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk25.xml0000644000175000017500000010075711520622606023463 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk1.xml0000644000175000017500000011047211520622614023367 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk13.xml0000644000175000017500000006746611520622606023471 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk116.xml0000644000175000017500000006635211520622610023541 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk43.xml0000644000175000017500000007144011520622616023460 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk97.xml0000644000175000017500000006656611520622616023506 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk41.xml0000644000175000017500000006721411520622610023454 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk86.xml0000644000175000017500000007625711520622616023502 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk94.xml0000644000175000017500000006604611520622616023474 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk99.xml0000644000175000017500000006604111520622610023466 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Synonyms.xml0000644000175000017500000000016311520622610022577 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk102.xml0000644000175000017500000006660211520622614023536 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk72.xml0000644000175000017500000006374111520622610023461 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk104.xml0000644000175000017500000006716411520622610023540 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk48.xml0000644000175000017500000006373711520622606023476 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk128.xml0000644000175000017500000006671211520622610023544 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Index.xml0000644000175000017500000000106111520622614022011 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Index_Chunk2.xml0000644000175000017500000001436311520622616023236 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk122.xml0000644000175000017500000006727211520622616023546 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk33.xml0000644000175000017500000010663511520622606023463 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk108.xml0000644000175000017500000006700711520622610023540 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk14.xml0000644000175000017500000006745011520622610023456 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk10.xml0000644000175000017500000006676011520622610023455 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk17.xml0000644000175000017500000006376711520622606023475 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk35.xml0000644000175000017500000006615511520622616023470 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Alias.xml0000644000175000017500000000021411520622606021773 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk120.xml0000644000175000017500000006736411520622610023540 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk85.xml0000644000175000017500000006474611520622614023477 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk93.xml0000644000175000017500000007001211520622614023455 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk18.xml0000644000175000017500000010233111520622610023446 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk87.xml0000644000175000017500000006616611520622610023473 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk26.xml0000644000175000017500000006532111520622610023454 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk112.xml0000644000175000017500000006671711520622610023542 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk44.xml0000644000175000017500000011113611520622606023455 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk59.xml0000644000175000017500000006646511520622606023501 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk21.xml0000644000175000017500000007116311520622606023455 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk107.xml0000644000175000017500000006624411520622606023546 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk125.xml0000644000175000017500000007061411520622614023541 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk73.xml0000644000175000017500000006426211520622610023461 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk38.xml0000644000175000017500000007114311520622614023462 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/Search_Chunk61.xml0000644000175000017500000007747511520622610023470 0ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/SkinHTML Help Window/0000755000175000017500000000000011520622620023711 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Data/SkinHTML Help Window/Toolbar.js0000644000175000017500000003271311520622606025663 0ustar directhexdirecthexfunction H(){ var x = navigator && navigator.userAgent && /\bMSIE 6\./.test(navigator.userAgent);H = function(){ return x };return x }(function(){ function x(b){ b = b.split(/ /g);var a={};for(var c = b.length;--c >= 0;){ var d = b[c];if(d)a[d] = null }return a }var y = "break continue do else for if return while ",U = y + "auto case char const default double enum extern float goto int long register short signed sizeof static struct switch typedef union unsigned void volatile ",D = U + "catch class delete false import new operator private protected public this throw true try ", I = D + "alignof align_union asm axiom bool concept concept_map const_cast constexpr decltype dynamic_cast explicit export friend inline late_check mutable namespace nullptr reinterpret_cast static_assert static_cast template typeid typename typeof using virtual wchar_t where ",J = D + "boolean byte extends final finally implements import instanceof null native package strictfp super synchronized throws transient ",V = J + "as base by checked decimal delegate descending event fixed foreach from group implicit in interface internal into is lock object out override orderby params readonly ref sbyte sealed stackalloc string select uint ulong unchecked unsafe ushort var ", K = D + "debugger eval export function get null set undefined var with Infinity NaN ",L = "caller delete die do dump elsif eval exit foreach for goto if import last local my next no our print package redo require sub undef unless until use wantarray while BEGIN END ",M = y + "and as assert class def del elif except exec finally from global import in is lambda nonlocal not or pass print raise try with yield False True None ",N = y + "alias and begin case class def defined elsif end ensure false in module next nil not or redo rescue retry self super then true undef unless until when yield BEGIN END ", O = y + "case done elif esac eval fi function in local set then until ",W = I + V + K + L + M + N + O;function X(b){ return b >= "a" && b <= "z" || b >= "A" && b <= "Z" }function u(b, a, c, d){ b.unshift(c, d || 0);try{ a.splice.apply(a, b) }finally{ b.splice(0, 2) } }var Y = (function(){ var b = ["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=","~","break","case","continue", "delete","do","else","finally","instanceof","return","throw","try","typeof"],a = "(?:(?:(?:^|[^0-9.])\\.{1,3})|(?:(?:^|[^\\+])\\+)|(?:(?:^|[^\\-])-)";for(var c = 0;c < b.length;++c){ var d = b[c];a += X(d.charAt(0)) ? "|\\b" + d:"|" + d.replace(/([^=<>:&])/g, "\\$1") }a += "|^)\\s*$";return new RegExp(a) })(),P = /&/g,Q = //g,Z=/\"/g;function $(b){ return b.replace(P, "&").replace(Q, "<").replace(R, ">").replace(Z, """) }function E(b){ return b.replace(P, "&").replace(Q, "<").replace(R, ">") }var aa = /</g,ba = />/g,ca = /'/g,da = /"/g,ea = /&/g,fa = / /g;function ga(b){ var a = b.indexOf("&");if(a < 0)return b;for(--a;(a = b.indexOf("&#", a + 1)) >= 0;){ var c = b.indexOf(";", a);if(c >= 0){ var d = b.substring(a + 3, c),g = 10;if(d && d.charAt(0) === "x"){ d = d.substring(1);g = 16 }var e = parseInt(d, g);if(!isNaN(e))b = b.substring(0, a) + String.fromCharCode(e) + b.substring(c + 1) } }return b.replace(aa, "<").replace(ba, ">").replace(ca, "'").replace(da, '"').replace(ea, "&").replace(fa, " ") }function S(b){ return"XMP" === b.tagName } function z(b, a){ switch(b.nodeType){ case 1:var c = b.tagName.toLowerCase();a.push("<", c);for(var d = 0;d < b.attributes.length;++d){ var g = b.attributes[d];if(!g.specified)continue;a.push(" ");z(g, a) }a.push(">");for(var e = b.firstChild;e;e = e.nextSibling)z(e, a);if(b.firstChild || !/^(?:br|link|img)$/.test(c))a.push("");break;case 2:a.push(b.name.toLowerCase(), '="',$ (b.value), '"');break;case 3:case 4:a.push(E(b.nodeValue));break } }var F = null;function ha(b){ if(null === F){ var a = document.createElement("PRE"); a.appendChild(document.createTextNode('\n'));F = !/= 0;i -= " ".length)d.push(" ".substring(0, i));g = e + 1;break; case "\n":a = 0;break;default:++a } }if(!d)return c;d.push(c.substring(g));return d.join("") } }var ja=/(?:[^<]+| db4o-8.0.184.15484+dfsg/doc/reference/index_Left.html0000644000175000017500000000276011520622610022321 0ustar directhexdirecthex WebHelp db4o-8.0.184.15484+dfsg/doc/reference/index_CSH.html0000644000175000017500000000770011520622616022051 0ustar directhexdirecthex WebHelp db4o-8.0.184.15484+dfsg/doc/reference/index.xml0000644000175000017500000000127011520622616021204 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/doc/reference/Skin/0000755000175000017500000000000011520622620020252 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/0000755000175000017500000000000011520622620021457 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/SearchGradient_over.jpg0000644000175000017500000000051611520622610026100 0ustar directhexdirecthexJFIFddDuckydAdobedY  c(d&f( ?@_Xe])]*odb4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/LogoPlus.gif0000644000175000017500000011535111520622620023720 0ustar directhexdirecthexGIF89a?=;::SRSXWXż[[\WWX{||[\\WXX[\[WXW̤CJO}P]qVZ=ճϭ)W_pz'`uhmEٗ{ js9a<<3tffb~WWVȼ䡠@?9QPK]\WrpgUTPWVRba]ûdc_{zvZYV^]Zihemkf_^\omjywtvtrJIIBAA\[[XWW˓zzzwwwuuusssqqqnnnjjjgggdddbbb```___]]]YYYUUUTTTPPPMMM)))!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_zU NE8̯TU˙d -K^=4iӎ'[sA7:_|SNqWWf/Mߜެ'~ ~yҬ|rn{(뿀Cxygo{_񥲛pW~dxφz=ẂsA`Z]}~(dS=# gш P3 g(щ b:p@ kŐ]"8 Wrx Z" C?`f~fUMgԛ+|*c׺u{]cyʱwd1MVGO!Fũ}03f Q͒7="3gY׳-# IjfۤY پ{80 H2Bp q#iT\!;t& ɣF< 3b 9%jU׽N$=2҉ `d :U$Ġaz#@PԠF5.gd g˘( RmrL@ Ag(#0 "\tUQ[bF3f{8n5?Zk6 y?Ո"<@*2ӫccջeV-)*0 m^2b7EFwE|Τ|57jV|97MD@Qf_4&LGy~~ +eh$hu'N6qgCĀ ? ||6w5gw P Ta(^gD!%M_MUt 0 ׇt@c&py7 `As_S`#& 'r` ?pX*7b%bVLGpDՉ xL|Q4QZ[&yJ7p'h(#p~ w1X Vmeq`P 8e^xфr&EQaRD s%QbpZZ}5t'~"h@ : Ghh7'dP!vKF52t GQKEP Y^M4Ws؉RL˔wtQcdŊygL׏p~⧏&!@@ GH "Qi eja I T儴0I&DYŅ$D?&YYʴ?Pybk[ 5t:i:Ѡ pBbK] XEHZhDeVPÖkLYs? EVcu_t~Y930Wh\d==f#?b2D% 첄PDIZqbc&oD`HٚEsHMZ.xGy7=@ ?lD&=2mө1N&#){KG  ODZ)fShD Т, О-j87ʢ+ʢ? nfD9I"ҀMҰC{}((~8`9+f~dh"I&D`5zv .P N4 " IzItf ?j=ڞ:?C =F *8ڢ 1J0ZD_ |H@M L* 4gz&p&؏BZ0&0#~$C"7B%O#i%o 47p*rp  V~J} &j|Y?2 䨌:jB*"fD_ I:АMJ`_+ȗɓ9Zڥ 0:u= z{D#M ԧ@ J@*6?FC ̀ L r& 5L|+Wړ` T[+P %[qF2@  ʤT"JMw^9+z:[@2k4-0-@2뮑Z|F^rcLW Sk ؀ T[.?õ8}iIFJɚsĬ@ . ܤtM|#jZiL+7dꪣ6S@??Yp뽅?9˼Y !`ZVzFc5k~p [L S%!Z!h`? ǻ pMKMlK o;ʣ@@++Tt Ya_^0U,LHڞ50Z)tkKkĻ> PPtId{=hnst IZѰ&;z{ ԫ:[@E1kj^S#ܮL 1 kNX0[P@ Р)`W$<l2@p@kxF,D**#HFny'~>iS0P*  {$,q_ 5|v@QhQ3H% =0P|-߇Ljo>KZ v銻H+;P' (n`#C%S˩Nv5;n2f, x4NG[eUIPZu^ lnw.ߓ=_FF_X@N`뤝{Nm^h\srPRߌ Ψڇ<ߓdo~ *jXG M,8Pj+e P @dӝW16Y#:p\>] Nt ח}yf\ jaS`Ը,e0_ w'N6]L4lٗ]c+_{kUj g]ɽ ^&pNl+bgRX],CRe` Ocy9vL4xED?0=?QP3X`빎Ϯ/dR/;\ Qc &~WQL& ݰ. .0!ep)<@h(}kx}@m؈ I]nSu cPVQ0\V`P0Y9gpbE68"C]LXŋ[HLgϤ&Mi 86j"0kװ̖Mm݄n [ NģW=|'@9WaŎ%[Yi՞J@> :.w={N͓DpDs0b>ܠ0( 39s6e<0sQ:Ve)4ƵH 7dqА-dȔ)SQ-crHpÐ z$Uz-ٵo.ʘOyT"h%gd0!k9wV P liG .  +ֲB 3̰+U`|zgxم ̥%{ i0)$h Q2q/yYl^_r4VF(< șf>;r4%Qk5\ dM-5׬!̤#CzmKe)`+NTcAH34R=,&Do[FF>I% @&@'LF9o@9/I}'Xkyb|xWJ c0VZ1LP#CӅՓ( J ނ@Fmw)"#HfS vk6 _et^@gu&$ a Q>%@?˯ i'n<?5vJu*f*g{WìT`9ha i,`Fٗj=&hdF!ڃZΕ֞Kdmd ˆ +y[o6K_*pmį*L#|&IH0&l '@ J72oXu.H T]UAXUw;Wn}QSqx94bF4JE$kip\nV>ů~ps[Wd~@x'`a]p[S2ԕ "$pW [1D#$9 c@@4B %@(Ke*JrAˇcBeMeš}*Dtwb 鹙@0iKFlqӛz\p6@G7S7 AYxf@@Ȁ=V'@ ^c> \j'f0x8CkQ.=ҘA ָǰA:R:7U/ǩ13U!Mmz۵-!bO1L`C@4FP %&.V#Ymf QOE ZFW7ryWd5 UB{0'x"?o2*CT _P{+tK(!7 .Ih#d  J"E-1O5r1J}-iQyZv,CPcXÆmҖWppXMr`(-fI!akvQ U!B`?ɫv3p5Y ҷ{Vlk$l(BB8<(40 dMّ@--ЍlG3̶6fou;=i`j04٨kN&-gH͐h= QTp-7on`8#92J+3Jv޷"L]Nsuw w|mhў=$ȦԄ ] QiMM \D&lHYb*)NC1p( t8XjU ! ɡ;9\1`Ӆ px=:*hjccx=fXhX &q6 l>ڶ[6:L8BL6`>5H!>swS+(+pzC =8#(0 ?!,) p8!‡کV=^ʱ!D_$qh@A^xq˹=kk.<-N9XJ TC[Xc x(&tjJ #ɹNIP(8f;aDð"d0 8 d>">]$B`,r+B,(;)2e`o* FB =g*  Κ`<ن4qVy\~PDY" wDjkkKD 0yUTrq!62/ 6\;E*4r{LLs!9ЀfHfHH#< @Ja<-T8pGT!s'*v_,6\B7XpLe$V IҴPM!Wscv`]F+QwA-U LlL RU*LaK*#gXh;A`B!4ߐXE*\~_ĕif@y,x*K(k Rkfp iT{hAcWq6ک2{ $jsxgx <2H!GK% j hCe, 4ҾM߈bC\&ĭ\ T,x@8\mE V%)q߿Z.qą Fֆ:HP~Xh 鹁nqM ET.ץ`u]@qoJEg{GLrx W,lN*4fs p 8%eb>s=va7a`3 `M 1]a`;lqM`]`nJہ އ΃Z'@Ӗp(1* OJ|h;gph$ÁV WVnk+slv)6F@gޏÖjH "qZ"tMwq(xlD >S (W (=vux@coLW͆K,۫njP۵M,>=Q}rqdȂ/076Ykv?q>_Se $(*`\ hCKl{]ẉ 0&?WcѶ@ !S2)TyuQ\xlm *QX p:V(6Iy¿h>3] `Laihyh𶅟ki;\:rtlzPZ"u=|md݅>M*@Nx#(RmKi<+PCh/5`j*|,>|~̓14A I_a8>Q:V]L}vͣWO=|(.a>~R"ƌ7rNJ0w>գGPxC͂pr~۶mڲuv P"PfbDӢ% @g͘- rX %ċ4mܸic lԘ2.l0a"E *UPl2eN")aРAE`b5lٲYMg[ܸܹk` |o_~A2o9U$KTɒy0gkG&[ MY,c52 liiQ]zb~5VjaUhac=%2x"(]LgLi`5T6lmo#+@:'N75Ts 5!U4!Dަ[GCN9SOADPI<ri%b$+%APb<;^=y ٤w{&\S~G( ̼д`2imVaTUتh2-Ɋj-6bc0iM=S8 YnIN;:=>B?˙;vх Y_=َ95 'NKD6P` {0U UʕиhA3ShaF"K6P&`)<:/l3cgH\X@&A.pc6ȾvC:SOn;+_c9.уTQ*s(vLjs8:͍ึFY6KQ||GU 8@3[--£Bf\l*hX*psZ@3  3Aӕ!3 .ӡ h0> Xȁ6P 6mg 0l%\ ;W4,C@4 NH .+'٢<g<)y3D!ЩN]\xg=`A <^H +^8 g‡ؖͲn)m!feQ|rPm"@4^h48r 77p@ x0(A˩U4O*X*ֱ5Y*WQU5n0Ϩ0kYьNk*.wq8Df$$)eR^V' k*LbS(QLS} > F2a@2a +Z!Q@* or . ($\s]A }/|+}<3\c/h6X,7h9Usc Q*KR%ȊkJH'vhr[w,ӓ zǞb>S UЀAlQFpX8@2~ d01|Pb$ Ib.N8 E0:#cQ`#, pa E>K\r#9̖ X:01#,#j fg@҈40 Ci49C _-&d|xȒ)+ ]@L]6Si-P E)|5(A#V|ƶя8LW @4d \ 3TJ!ɛ1,.HFǝàm*4 |" A\ 6B$x[:$8B*dU@(@,,&634U4@ 5 qHTI4ԝCC*5X>HD!!uvۨnmlP -58$ LCulLPp@(qC'I!.(d"C"SR&R^0D91%Ɂ(4#!Y5ڎ3B.C5 т΁4H@ Hh 5`C y )(ԙ>xIANϗ dIAKA$DFEP`mgG51V0 ,mu]cl 2tE  CI:@KnfӈCݸP@7{14՝V4Am9oM. q啂tF\0 \.V0^v 1A%x*xBB%\Pn& BY C%{Z3`'_ \-@0xFN5d$\CtCEh(E 5Ʉ<@Y.Q-ҙR;ì&VX5N|d4(5Rh PzfTk%T-QBB&9"2+Ycu7J,\ Di5` X=69$vATװjdlsTfJqQ< 6XzֵQ5̯.38XP @2Ub*C%h+::%2dHgmB+fi -*V^幩y6,%34)L 2A܀ hR6, mt=b:At8dծ~?\IMKϬ&TR5Xŀ@mm]/ B-r* A1: B9 jB&C*$B^0o+ܲ.|B!؁0)c!k9,W%"ûdQ HZ4[I֜$A]WX Mp7Oұpabƒ^ +YI_HP>C;Eˑ4Kx,Mi^Í3aT0m\"3Ǣ$J"})6.m)p$h !ÕA0B'tB1)%):&8*C%!Z$s@''AyԀ&PD) ]ꢃ./c>D׀M,3e=x3; FE*"PP[GME؝Ħ:s73,11%p>*PBtmA+BB)$%*B+A*B."Pro-{^34C((5GЀ7jd!(A Q'}քC $̊*TTñ9d;9PX@8tQhl6JD3Us-A3)^0 C:L'pB!Pa'6Bb't+􂅷Ei#.k"0GC2٩qiK7 *16i@741pcQPQC27ACiwqdu*t<=U}.4=(86h6p| U4H V IWPY\ &,qg0$ ;8"B[B0%x/dec89l偂3fdA+i" 8*@ ܇OC.44-WSH@2j Oh@ *?2 *8 cyp\KtyF5tѿL@7&T]F@o8 LB~?3 Y%90XakzB{8p+\!EB1:i+C^41@8C% ,A߀ ]!n|aơ+w KP]c+_eI} S`@!:CVCDcؓ=]~=ۨÂqцlGXWo9xDg̚X!qxdA4 ː?3VbȆ RX0`1V|WPƧ^K ÔbBuWN׺Q&eBDbL3022dre:pƒe 8SYj{1`԰E !k*l͛pÅGn8r˙3:պvso`$N p `niV|jH)ckit)EG2fc~H-e.iXFfKh&9j3ko4p@ -A-5ttEG67 . ߂8,SG:юx8rSOq:̂o'kѯi4H`p f@":x7HBZh$8Ԁ@)c)_tZŠeklJVxa? ]Ng#d$!c| Yf ]9zc3j& ;;=>qst5vhM|} J3}jMU#A!T{Fg{vR-tuyuOr؛Z]sدk` hdxPVA#$j"@#jp#JP6=\L)]%Eޅ_(& R+QeT8%bK9850"!&kK2F h !i0lkXL inbE#sv49؉xG 1RI @?S> `MTGlLTc؅.&V6P̭M SqX@$TC@  I;|&LLT.a'ChtJF4qgG=4U b'E-`vg!@bP<zҘ 0_M05Qlfc#} kNQ>pUP'R NXJK pQpQ;P9Dp8i#-ިi#(4dT0h3VXDA U@-T(#9)[ǐnB_'I HatbA #_r(`7J$Cb$2Ʋ;}P0<<$АAfG0dp A T S$8|i4;Ӆ:&hPri4RT9+ojxpt~),n46,zA q8JYsyV!``%cĤD%FD>r =8:M# D& ˒xǂ  3PbM$440A0&<*7$ʄ/f#'ICH)%{,FQ%N*VRb`Vt5@JS,WA7L@ $oՈ-biBA`D*B8!}h5E`q X@6 |KD*qôAjVpAhl ۺ`K\jBB# јD<^1de.<шgLwkuxc^8-K]/դ{Cx+Ab 1ȇ>7L D!@4L̘ נ  ӪG@cC^b q)։cK )]cqǎpDDAN2J s> ,EKhF= 5$Ȇ694|:&~ljsT'Kz]Jj< >0TQQw Fi/1]l|C?h@a)@d3 "2p2 %, Ll2ʱ‹bHB)#3!s 1 ̤"l%-kaK6Ќ6>y`@[h(sjh5 pd3Gw*uێPH dyXѷ:򔓃m-ocL/4W(ccJqtxBudg,#@@$!>@Y<@p&pCX%^BD n"sZd)$F NE!^Aw &Za*f!4Fb瑱@fhMAV2.0>f5Ln.oU\hAPCSjV~n#Ѹcfv0} id!n hA`!pŠ )&į\@ PBDN  zⱠ`t!aΡ5Ra Z!p&0L^W+v.<.b/mcD ԄnM$BqLJLOkAY~&2!7j8R(:2jZ?n!JxpЃ" 1X1g¢,"T`*rqL"gr(G\௝Z]'v" *!kg48x6`x8`aR>`c:&# !n@{TeeHOL|nFԡ_<%0p!Ei!v'U#k(lP&)UkVơrE!e>p`,`q'OsnAjD\06/ 'P+I-LB`b*K1N3τz'޺GJ%fV2H5{ c&qS7w{Rch:t@(epUHN)QCzpf&>"A!^ ¤P\AjKPbаbb Ᏹt"X(za)AQ_vTd'40ȠDApb,z:` 4'`D|lgt]El6K7q'`LO MkP`4<ᾒSJIףҀecoA B!Tm)VS%`&@eaN3e&NV5_tnX']x9tTw/`TJh)xg(-i f?io @ !`!j8`d1öC@l|]1vm} _3GP@x`t~#`RaM.  Cø  ND:}HP`6\iv'U8XygCg;r8sY:sCՙ@ɮb"# ]dN"adl꤮zX82oyw0-}-1B;bb0c"r0d 45$ e0o=SIg6v6{üiR٤573Nx1k~;l/oh!ӈX* oyAԉ%'mH̒$zh~P|QEA, 8F!κ_Mdwga颐a,tc#kmj`11&0$4P5Yru7Z&aԲmR4;'o_8:02U)W)ai ye[$ Ln{;lI\-<#Dx`NAL|3ǛC!8KPa 20`xIa Yz"U,6RF؄S!C+2DQ4:5ξ#<~!Mp ,J!BXh"`(BaU%ȶls 2siZxzOۄ۪|ȢITqb$Bd7Rc1!(POԆTs*Zs/o_\P jQ79?[:}TbP[l})4$|0]WF`lY%`@1; +b;Z>$V{ǵOD_)s0m[>PۨF}o2 `r]@,!Fc̄m(1$@aFDGLCU#,a:QxC}@'`&kWe l"hih)*ڊl.Cfx."(,.ni{I$[@ĴH4` _=La[wU1a.:!/Fy*z|8u{J4QMgN`껈 x&E97M;!h5!Ma~A WbD Y Μ5hgY,#-:(S iЀ,C ?~3fX1Ȉ3LL>SN< 1 !$fW7=Q禩`3 Œ;vG @hl!8\Ee/5kCgТE6mx`D 9&xv-۶n޾Y7.\8qƍ#G:sJNݮu`x՛G{.`̛;=r/|أGoج>b8Ms gH%+^X5$MqcA]uWU6(X$mh!q `dd[Yl2WE *cUP f]%Y=T (#AHFāXƎ@f| "46$ ?p6Aj3pG})El|&P]~h*E?Qm@6٬'JUG}n_q#e*`k~SВAiN! Ka#bCEx临Wx3]O$+C$<1O˜FuB(UVs0>(!p@10V13 [,LF"L2edzFqUVc(N?Lg:=A62Xܶ !zP-oi0A jв44@wAǪhr`xo- ,W4׹oC&D$"@.'&j cYQb EX24-ƋƖmp{d굌٤sk AHIۗv&bj \Dx. Wׂ`QmkŢ51LCiQ H8` bD a8 \J_1J !xl00 %dE[dXd8Kj1@QʹjcVa|P ~n0eMwZTF\ b\>1p*M3)S)Syp:0AU6q6y'%AvU+VU0,R @ G8I 0`!.C-fpwC"c6.>|D.qCDLEu}?^q >Oǧ~aOC0c-@ZP&CH`8ԠlL2 P8 ` Y&>å C#fQqoqg ?"8Is`462 Jj+rJ^tAApUn`,LDLb1 Ljc j4 EEXA|>"w?pPa>`a~c~%1 m%h1 G`&P Ä24@= ׀nP Tps(r(QR\d]؊YS!g* dFy'4KqzMא9 K4L8 )'!0.фDov#:C&q S9> ]9q @@Vw>vu~\F3w׆!1F ~-CMn` ޠ'8!3>xdB?2Q7I1*1Tq^TE_Oq`fU1z23 Hi p/!cF@FVؖ|=WaYp ? s)klɠZu%w mC31рm&$3 eH*I^f/kSA*zT+u+ 7<+38  p0 &CpA';aq|ph[)w0dEu%%Rq-א\p9y]eVJ ho_hAi7~ KQ+S+ ,L%A0W@ &rӪMVBMX~+p{ wZ00Udqd h3 [ HZxo̵ yr @] Jg)¬_AʨwzR tBa ϔ79$ f-Vh`".:F.$%DPm(ݼ xfZ#% ]Gq=;>i}Dҽe8(-K>?P?Nm xT4qƤgqz(\ p r.`I`/m $ y9 u uڮ .@WFzԑ1/ a.''6NEt <9x]Jp*HI>D\),K4UW~&,tLGpi ~z f[% p|1 ~,βsQLF[O&Y'zwA$) 蒹I%?(I Ђ6H+hA- }s2' ,8-Z`2\n4d0hFf {&r&O[ex 3A ~'_$)嚝x1-z PLQyыv'Ywb:ut;gr}'.8qy붭k׾Z5j#l^s`kZ4B$,3g05C2qA*nq[7|ݐ,de͚%{6l%eR;kCe˒61˙H=g4&ieA]fImݺyܸp!?#W:sΡӕ.ٵs^<ճw_}0ӷ/@~]vݽ^TaH! @>X{nĊm2# )qToFr0!j Fx̖oh"n"P@hfdYF/\h:XGsQ&VʭZf-Jf!r< Њ8rA/#/ j !1i"2j0`3<&l)oRc5q^-M7֩Q߂ ytGn:~Q:6SP<}G|.罁Ǡxw e".JG#$1'N@ 9avtigiv$ƙ "hmiqTƙ b+1J^y98B.(T&+:ĒP2ό̦ά 4MAxu†M9$մ j8VplD#F;4[: Nw#, ŵ}:Ɓ.Ñ/'9 qy\#@,җh$Ea`Fp-1&`&CD3L>2|$`ޞFdf55.--TX4P:0PuأQ ~}JOFqXd LP;R ur@fG r#Apt,$iqm4D@4 DC/,TLeNJ&3{ uLY d1 qi0zX"n72N266(<,P7񍒀d'3Gl43NĞ5Y;SE5J~?~\|xwV9!LZF7+(4HARqX@C 1lT .#8AGeg4#{A4QhQtvQ*S_C̪!* ,,D&6;h1RbZ3sE,FiZW6/.{C8jaagul#JTg}Za#"%Ɂ% 8a ruF18T8"&Ia@” ,rtJ%)E{Ye؂D)Q ܴ`~ֵDWW+=Dpw '<{.5P1@?~ jeYq"L$+9A(6Vb 3FQiI`@h;j  hxQ#r9}3w4ʱpA],Y f1+ l☶ ~l ['`7U r9&πng(w@f4-Rxl=Y}0TT MgNG:v!I]ulTI mdB)Y?&#IujHH,4#aRh4FOi"&ۮk@3;<a"oM[)Mi:5ȩk_e3B-{x|0#gp<@5Q q8sS+ɨ(2 lR!6:c[Bޛ`#h$3"j 6&'bi 5Stk> x¾vҾ>Byv;A[{pCYK8c0;UZD(dzO;#q؅WQ!`pq t`v 8r8ByBq$8n r 8H#K$BQLu8Ѓr0D߸1[9p>u{h;Q tUFzګsp/9p?}ZJ#J3a4,|?HQYzج0]_хvlmlPvTyGy\~G}yrh] tuhq8 vcHpȣh<ȃHP U Hi};Lvth@;zGhwQ@ٍ>kCy,949Gc80 Dr PFy(5x~sX-lUpTp|Kt9PK}H9H Hs:=(]ghK|Kvh L, ⛺tK u(LƜTxtی8{nHvTyȚyPRJtzvEY!?{`zH#˔+lnR VI1| ‡,]0Km@r@x(Řhr9u(: ؅ $S=؅`oxuPHLXPv`)uqgrŚPo 9rD6YMrz|lxmXH8!3ⳗ!B4Uȇ8~ \8 $,Q[x8?1&|Ivb`rX/Y y3i sx-u- ܅| (E I%!59rxTp@:OZ3r`3' C>50T(TSuCaBR)=*u9X?N.U8P!Fчf46(utyIȇGClUey&(T]@0pu 1UH=0 OT$Uڹ9֣X8G 9dO)rPq V`M8U]/`a%xX]0Bf5#hu!00,;No,H4<@*ǻ(t5$Jq`39>Eu@T[ҤX]K21GvȇESJT]p8 O݆*&*G ]*Ľ釯f3p孻(D}pVxNRB/}$q, 4Qc\LUxql"-DBtxHY]hbZ9]dܑiXXw-cņ(: Eޅ{9Pk`+avs7]_6)1JtzN!.ιKAcޜ;bJ(<ƨDl4N55ÞمwU~WzZ} HmUa5W l9 ]pK`pd(䀥@q\mzdH~;rK.7xkxE_QVI:aFV٠u8c%ݍި@SRN{𞷌Zf}JU|ƻJ4m56]v pP]8UpXq&m9psc= hi`Ν7W}d%Ɛ KlE"a5҆ؔa`7{̇<#]<%[Yd"#De~@`^,< ̟4Uӗ8+v؅v;aՆsn@C[uutp`o8W:(A E[o؆\m5dsv0am'ӏM`Tsȸz*՞6™9@?],}ɮ^/o22]BV!Aq 8 =gaB&\Src])i OD qBď(ـBTT@hEnj@7t_9zЍxH@V3yACQ$7#,\&UpisA̺AD3uxW0rDo`Pn9xIyTzLqxln t}<O}IytY5C@r;& }e]pt}LpMNu]x'wCxZ?6:~eES7R9FڇKbiϒ.b4J y05q[9tVi~Kh]nsEi X|gL ZtxvGMɗ3@ӌEV hЈyKsōXXzpc̍v45§W7ĚvE8lVUN ,Vfr֜kӎp0ǖHgr͐<Ӽ@X{[C{zS T@UMPь''Ш $p@v+^1+f}s|0O~8k(N›Ry^f4Mӭb:+[ zkV[@`u@Zxw9}b닙5twgr = |#p 3N|w'䔟|m|s˧NWlɇͦ[Xk:utB9sʕ#'q8qȅ n#8 ߼m6m*`f@9^4MB6EP>F爟ai' JONz5֮_V aؑ9 |Gs`ń= q;5;IG]B0vvU^xQymI)Q` WxUL&08MHUM6NB5$69\Si XaaS6tVZ#83E!9 !@xb9p2Zf7cVlLꖏ>:\s\[2w;rAXאvEj3Gm}$8ݔ|{M| hTP%T5jS.I:5߬GaJ4zMoedQ9 萪`%AFTk>)Ыc;\䑶)+(T&-=gNAyNDyњH4aRXP]' i6qI_u7|V Luu`izq^7lQL]#Z(hXS#fs>,=޺x9 YoIۃq5;d ]PCI%}ަɞ`6ȯL&TE}t{{N8'i'ZVpK9ɗê0Q<]F+P7չ.<&vȇpd-ǼZ`s,$fJ8.-QHdBנWD) _r$|5 &ns(>e_80Ź~*J&0 ҙf> Y0hOB pǃ4^L⺋D̡JM}t+8˴2cሺtˏU0ň9+`d]9s 5bQ6KjCi﮵vDMxTPq!;+ӦvІ#F٢aJB;{lpUrCé&g~b[S-Z_9 0q iJZz3H)4Q4£00vS >8ԡr gɶ](؈zӁ_ov< R]-чeStB׊釶`.T<_͎Nn7w,BVO UY*G;(2%q8_yX>vX9 Wq5w]X<ԃlSC88<:B9J:Qf =4I͌Q _́C>Pɴ\GΡ\[e Fi؎dWO9r`:Pۓ~qGD[PieiO8ogie`TnMQ)DAW5ML]]OjP~& g|H"%@M^PO~b֦~â:rn 藾y^ ltzealaH&u_NqǰwnldžRZ rB2Tk뗼 Ri_+l-^0S'c6ў;8^#͘Jaj~Ԋ >'=j*|:֧2Dg~=*d}Rb;!H!.e`rfNnǖ*6c &=&ZlI&Tn}ʦP+BiC9}*t՞=Z2F{zdPe|q *6~ly*I1%>ʶa"f^i*n+ڪViZ5n;CrX"=ob'ԍc֎'H=IN"{ڃ|!Ysf"'/! CmLp}²0A@fJ #6F dp f >gxRbnfiRSj,+q.v~ڪ_pO.HA,_1`1)/gqOot}i+ˬHTfy/-'S1p%% .&-F+N SSdoe2+lH.I 8U Tȗ@sD#חUg/+@-%m@>S,@(I}829# _*dZ.1bl/"Cs.A.?44B&=2-^6ZCNj hl,r4ΎHc-Jǃ/C,BfAGGO״[\^2Q;&b3`u#IS4@aF+WuG& -O-pEƫc@,"2t3>5\볳A]P(znR;>ƍpFQbbrhm9׏]`3٢讦Ys CB htj5PoPĆ 5NlJ`nj>f4 gbowp'@3br. eij<{jb=uǴ17QS [k˴RgڈnC|m}xƎCzfh.eO".d6t71γk+xx˗Pj9hB1hQǃO,zwvFo}xc7 @ MreP_]vdsWY8u#9u+xSB+9y76tr)۠Q86paKGgV)CJt79y"FHQ(/.55zbdT,y>:RW "[ɦ+^ﴸXHy_լY7<46wVcxưwfb{tP&{/0ԘcZos_vxfH9|/Sk@7245mc 8Zy7;p#{+;RN{*$8R5W#Gg%yC7Γs=v` qk4猖}[eH_m3N_|ٗc:c(u7찍6{FWSc5w]nүo7fCƭ=_c8Czg{NXߛ8~CdCnT[vǀ8;/M?~wcO÷asfL}/"ײ`r}]:}?d~7]w$63[?@8`A&TaC!F@EU >~9G@P^>|;Ōi G'=|=O:m֬)sGK|(T Dqcƌ`bYgѦU؋^9 oȐs0P2>:\RIDTzLOWX@.G_Îeukׯ˯Fu}"ESSFue˄ Ӽwȗڋx`(˧C|V utӨS}{6? Ebء{>c)|(θ*;n|*t6;-TOI$Q~NH-? ; p@0:یv#P6U#)5H.l+7L/P" a UnP*4*@ mg6A ->YEJBK1C @#>B~@ UYm DSKXLLުT\%SH*I%D4 geM͈Vj#^3< 3 =7ISs6wD6=7QPKrpgUTPWVRba]dc_ĽȺZYV_^[ihewvsrqnmkf࿼^\Yomj괳JIIBAA\[[XWW~~~yyyvvvsssqqqnnnjjjgggdddbbb```___]]]ZZZUUUTTTPPPMMM***!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_z[ fE8C8̯aV[˙d = K^=4iӎ'[sA7:_|WNqWWf/Mޯ'w ~yү|rn{*Ǡ?Cxygo{_񱲛pW~dxφz=WsA`Z]}~*dS=#v(;1+T;ڞ8Tc"s1;p@o1h㋌mm 20L |C:6L"BlB5RO=:ᆓM5»vsL2Al{(AA$w{}tL5ۄC93t*s 1?U|C5h@|osp@0 0$86d-m\26TK5M2V\F $wGtǐؽO~bh(by pW1:-0:&zP?4 Jv/lP2:|(,E4FFl${?vYqp0=$1٠8ȁ?ÜP X_ SI<$"HGB҈49i @٨I#(G:c% 9>JLMQ,)ZpFvc8-P̂4b2 #B#tf59MiRC(nSq oc弇+T(`g;W/]j<Qsc @E .9!1I :\T*ЄdE1Mjx^33dP (A7ƁBQNz(VPo%^̞>݆4`@0@ #}S!.@D""!3:M6 Hj/$N՜oU3.55:._d1aTt*)#3IZV C& Vn쏲*Uu> +HO6#一 +{tkc:53d23\$$P^u@ k k4"=80[K9h˯{:k`TbנC,& e&3.2!Z2 qFj+(q:'1A򱳂`k={qP`L@*-PzڲSMAKQV`=o(@hqvă!Zq~2+Z#l,ssDxecd^9!خ3N#3Ӟ,4}Hf`EqjjW:ֱ^1XP;&*QǠ !c>3Sjipd[GIV `hd lv[لnUd3'J^j Fj8@0 #@8zkD4A*Jΐf:!mrp 16.a }ծ$b侴d DR*dn]miհF kkX4<^L}TlrQ6q/w&4b@X}Oдg⥟,}T5]RMis~@qkH`ex`5;B*91 =A^-g+SIVGKem-r&v;@{{*wi7V5|.LED5gQ^*FAxW}b}P |fN(&=S~0dl"K'B0Ơ `?V{5|+v*vPMUax]D#LXEMs@ sbvoyRW I86A҂ WS0`#`q A Q5a aJXLG Dw0L|PP5ZuZvx?oW78%} )t@~gpNw`~F~Pp 7]ʤrDJEaSKCUrP%bfVZgZ|+&t7w}2` :g&JQrppvWCld(GP- PFDK ]L)rFKeLԄw%Qhb]o&gAdh}玪(#?`RpC 2~3p9fj8h= M%HDRC?X?hP aUjZ@+s0v:Ҁ EQ15K|x\hȰ@dHπY D[HP5 @D#ayL&Ys4 Uub^th}vٛ:3VgQcW=0XG2.?DQue&`?@5>Eǰ D ʡ$I] 9SCC S?/p? ` *y DUY{HLC: 5fpvo›QZ)*% Pk]y7B%M_%o 43fLV  Tp:*pJawCCZ?P?0P{jDUHڡ MJ^:ҷ ()Sz  0~)OѣЏd JzZDM $рzz"KJ?I(c9$5( wPPPȤрfohc+N:*<ua{I` pC*Mˡͤr6}j?0 /G'~vk,kzy:z|=]e\ճ'AǤPz@)3p(Jqb>v  JZ`  g;MqʱY_VL%Z2?SIF0?3 CWK1{fY #Upb6jَtٛR: @ ;~%U[µ#l4 MB:M [Ynk @ ?{ @ @cb_PU ں(-y Yg[_xïfط4Y?֠s۹?Wk0 h@ H:Ұ{mz**r*w{ȋO?Ybjr OY@?;J1[xL 2ڳ гji 혊Ik?l @)S uᥦ{l27(@Uw+4l2|#@w%_YzFEG|t! lnjiO@?. CZztH۳F%y w}4I+*ɶR PG"]0"ZS\EQauQ4г=5 21{!?\Y=@?}?<Ul , h` ? ([f s|560}?\ *.SᰓH00;.cy~W fzJ kkePyNUPP׀O0``N}4p_k˼qdӈG# yٟ]wJqY,;9óRԓ R  ` `bN ʏЬş2:lsV[Ѯ| ,s{`^rh`p؇_lP@d25PW~؃]džhK;|@KK`00 0p1Տ!hkJ<50eH K(4\2 ULUPi^ǐḷ`#  YA>-dPXS|R-]0m q*j;P].P#C%N 7c1dבUlMx*&CZ^IY]zi`.bP0K}-@N X^gp[qO?ޔǦW^=`z$xְv, ؐ ٰ P Jp=V`ќ5Ϲރ 9ǮG|frʹpye% -M~_U˰ ;.n幞[uh?}^ξm{^qkL)*.N@ ~$&1t"|U2$JV) l*_bjDxP?}n>r?^RPcY"OZ uShOX~qO>Qq}bph}N@l+۠ P>f8|cgQ⾁]H) ÅjG 5 rM׊4TG?`R ZPR`V ;<*.o]0r_%_Q00 Ӧ)k%UvM :RP شe1m$L.z7G2ѧtOA%ZT(NVeA{K9oxЁvGڃ%}P XƠiB`gn5 f 3f,^l82:l 2dʔ9SԨ`6 2:FԹp& +m*u̮irּA]eYscRT@l;vYArTO 03dfNg}#*wR(ThZZ.h&Qf Lfa#"d9"̖`|.@4r1< :{XtrgK$qΚ B?.4>F ЁgTX| }i"tRh Jx1q…ޜάtР/ছ&Ǥy Daڇ}XyR;WgSN=*+t.U zࠃhGXּLQL;xyJ!8B ^Y&xYӨ"Lnr!4sҲ¥hff .?/h2hi@=A}')"?ޮ ,A#mSDwMiGlcC/?Qdw}bT°c夙aJDQL3qM2̘Geie.ڊCee5ˤJ+K.K;ւ :K_Cw(pdX7.?lbϡ0>#:P'>LHE%X](`Qa'?V@Xx݀ k(va54Tj.B\|KU<0@3-^Ԫ=M#2=!dV1iZFAoF@bgm]Y4D,aN&X$qyHFvÑ[As:hQf($T P{S`ǨQkK`/ gue/qu \2BX3SشUe4U UBs'BA2:CT _s+(HV5(0v @p\Er\%E_ԹU'`+aXn[ -clΎShEoWDt نp!g?sn[uN5$פM $" NCpd/tNCK1hIrw*BN[ޢ%`yo@GjF R"vh (؆RYM2Y 'zڜ<T(5` sNtJqǐ`H614dg/x_(6,CLq@B|d`'Xv$a j*dG1ھZm xAA!aD{A&4D"c`2~:$Y``@2e9h S%YdUCܸu iq2 DvNPŨNT}MUoY(6AXC{)'Y nD e{! iH2WM̸2Q%t/X@-ӌg.oaAR :䟆; 0n[83˵$>X? b2xQvc%X iXn1 <|9+-XuM#\ .?21sԋ zunǞ g}덞e3†FX*a %;ij0 = v=/$ n-g{$7%ꊗ @ ~ THQD'l+R(H.ŀ|R`S H!d z)2+v7Rͺ(苵hb.TT dTG}TH=AITJuK:fA-1Q] #j"h0is$9>U[pUo({x0~cC7a2M (pIB xpQL;ДV 8S¸ظg 1-pWu$ueTyTwyMNKK*H"+Ѵy䡅fi0qih!DjK HB@KOtό Uه`-YL8d]Vmq^_qh4+ܷJ\,]|Hqv_!ņ`CPэJ\I0ѭWc"+9 "ݙK.]5a}BhYxw hS$K=:|ᎂZ=+=ҕS(ެV;tֹ ؆0VGI3/!ix1gY, ʈ]wdB6dD.Lqqkahˏ+㸋=uK"_qKx+lFY ȀꨏR{@%^._>f c>8 56[%QQ*#3Q@JB2}riD&Hxv7#ͫipU=[=ptXeUO8m衰F1F,]whpfրA:fh@".=';5߬ݕpZil3gX DP5SQ҆O3،hTIY-Tk@Rв=%ꈃ&OXhl(jhMђ}]Jl EɶA=noL}v8ոNf`p ؅©mKXSSj5LՉ^4\'YHC.&e vKBk,I;*8_cFL:. vqh4+ k]#2NXpq8>ALԇH};8Y 0ekvk <\F?k{9#na> 6N"7rR?r~Xso3]k(!Yխ63Gs-k ǠLR_sDG=s(0ȑEX I k|Xlf&βe@I l֐ Ԫ͐iuزgӖܷwF͓O8/^\.`<| E :P`R[6 ~ J-]g.L{U82 >+>Zq<:u7e 7dÍ;%t\C5{_#@c L3w4x PGD,32WBR~_QRU7<3;cI#9aY\u@5xؗ4IϠ  c1x@Y;1ZbkL:9*,*Yn%h,etE: 5qhDvl57%tM5w=*Op?:0II_>=[uUӤCHް[J؄Px@ JSLIց3ri+`<[,I7;kE,LWKkmkP E6TI.M왓;_1@*Vq;Ck7e\)|5)5r-"E83c,hh@YEAwAԬݬ;;{kU}>mn dN6]6HߜݻԶK8 g>J|UTsuUWN.a: %s%؜5! h0^3!f2uv;ȠaY{! ,ʊaҎq)5 dCګ"%l+9qOV DȔ !\#8w;!aTؘQ*8@ LbfHe,d Y3#@& IJ %2KNw\$(C)Qrw&3Y3Hғ|!%cIq! ҷ #GLmqj9HuSOQ2`|a[Gg w 9JPPeM~ZgLE c<L6s@H>w$D9J-)%QN'HȄeÀ!9:%8q/DT59D`YأF%vR\^PXPA;ϠAwl@8# W SBjJ! a0RaVa "Q]W0u } r,g8dk!hȱ{'ylZr#=UNzOCm?28nNgX]+aX.XC_"@`9E\!(BЀ 8F:(aJd&6QsCx"^ CÐ1`9PXr2 bp;MX%2Q K`(A!@pC"g F41 iL(Rp>Tėb@vҴP-907߆gtwpB'xؠ9ftPR/&Q[ : fAb [M t. E8at5,,a5#|a A F1EX8%Vt@[7eq &1Q4n hH LĊ\$#^ qos}]KBy(u@6e,d^AG'_F4Ƚī&+$"qrY/۔=2 %@8 ПW"&r cx5JPlIy4Yr"3\ :3W{{d"mD|S?h)!~Yg`".C%^7@ 5afrȢ0J-`D 04P hIE 0e7E8XL2V9yEXCq%^ @Wc0Δ1D6H\A6l<_\P R3@t!LaZ[)Ԝ0ةߪ' (18]?f1 f?B]`%#C:$B$8DX,pX,b5Ā&INe p`G( *ƖlNdNKDd@P ~h & 0 S҃<9JLCYXF6]XC9@Qi34Td`38#e|We%)PB'$9!@&a1&1 ((_&&yB' (ô-@<" 0b34@>!H@0Ch\K/Emn0Ի8oɃpO|)gH>d HtS9u2lvFVrCEhLa 6 c,@܈2|W~2A#휋A'881((@0CçBhfҚ\h!_%h_&CP$сg:d̂،R H(A.Ld U@EG,HJf2擾M<Ι,YPiSL! r9)xLU<D#`@,9?ͼfe:n#LY*' @>*z*1|ʎ*8`0C)!vh!%< X&'9`!hH-L- Y |HC59@TC @\w|LGN>9TBP~6z`@avʦl0B뮬_*́ͮ1d'#-C318.WEHԒT5pD`v8%ٖ9 mT%PUxMSC9K1V\KE @'<ȀXՂx1F4@ *񅐥!n!C,B#tر<>Z21.,0 ðʒT!1n*!!H&ËEd="B2l9XԈg\I#^33@5$AI֗ p/LmjY7blf-x ͧ3h{e*}pMC1:LB(:+(nQ0BR3, tÂl4s(!A/:­9|"3Yˉ}@9$(kɺ60AFf\2QKؔm@=Me4/d/t+O©WN99pv)T dGg3=I@^.t@ heok@1$ '7" * 31C v0%/T9U[u¬29Tr ΑAeց,#v[$6`P/5^[Ljnb~`a+8@C+͔+ \d v8b8;EwvnlW@_H 0!5mO<}¢δMyMC53vO/%1p9Cw8twӪr$A? C53ܟUی!`3(I=58 50P!zv&f*9bwmTpQ]ަs:f8d@/bH;;?Cyw,NQUUxzɠ`lHҽS3p <A՗2wIج9rQ+S{c7,B!/p{{0B*a$ }}2g6~9SÐ9-M0 P|0a}؞C4:;>'r|׏Q><ޢM⌄Zltu)_5Ώ% L㖕J/P!*}o7}1x=?F;0`=vvB}·6Z'X;۫y o-C,":.LC4iLk`%Q a(Tm ޼}.8qƍ#w\s̝sΝ;xɛG={T7}_RK6u*ӣʗo{:qҔG/ؕMg$#Åc7n۲YFϟ Y[c4iР-X̙g `"ple4x9c lSXjbÆ9` /ݻkND}/X1mS9t>ɋ Ѡv 8 dA8+Sa[t`j%Ly]&jzj(P"h>P*%\:䉧g 0)稨\|ƥҧx:i -..o, ?Fc@p#<8X>3HbT5d!6rM8|J18`![&rQP<.v; IfG,wbu)ȵD.o'a(p_0hJX xA>#)"M`s!^L B 0NR=6Tp#T7E=9( U1gvNy8*NGdJ XUx/$>5ffiQR%@A .mqo$j[txGD E =FՇ|0WG~rgu9`(%ɦ (A J jF8.:80 @PF]s8M5bFf Xpy7ۣ.ti(&KE0#Zmd Tȣ|=ekڠ6' M5pDML nt#I8uka S@9zc'pUR:tItNQ=ᕰ_`Gqnqo/:6QQc#5gtLLcQ뱀ML@ d;11 )6q`_07gѐ6ZXc:G:jY1Xek<* v=-< 9F4f`78@ a5x?p"^pxDZRQvH[2MAͩM<ΦUV'E_t P[xgM0"iDA6Qnq1`!{,̘N:ihf'$c5rЙl>P(8y_$#Ӧ-Oԃ'1 c|w 3ŪPA>v/h ` P``rTA@8$͒,:N~HQљ \G;{VkP'v}_DKDзca^t Xo! \wǦ>zGf6"lf8M1P 9M1xo_~iX@< V QW <70eLx3;x> .$H~ P Xo;KEvѵ4nLzG5X)*-N‹QG>*kٿjg:!Б\!< p@jI+ Hc2Pa j .53-2@ 7Akз\@nc /I(yxwoPXC^V݁%qj{r دX6P,OOd085Ñ%-ײ1Ń6Nx"(-qx=qu@9eY+HS]b- ]F L" hh3I>vR"b6/U3o|q Kx*SyY('֨&44S MpK4V k4#j 5Hx74lntԱVr^{88׻61k \MmQ=JRHM^PmUXBrLS^@N0{01]>a5f~@oXjQq†%/J?5qb<{1Ad53d aNTn pǂ+B(y{amqC/Ѹk+}tGiz"}^M@#4̕SOAP(8 !ġ`< @0g!5Np =@ &`>zIpE?@0@($>RЛ }(d-''p(Et e*~M^H -0Hڡi%e ; $`pl1/V8X2'dfMO0/>ehAr"p6P1 g^1kjb`6aݪ\`@xɜ!pEWF`Qv X B,$oD,^pv Q\!1$E:D1H#A-FKTbBf֍ @*_fNhùQa<$;S6Dpᨐ;bf>T6܋=adeLmR@jo$ \5lFM/v v.InbBOb T1<1  a7\޺"Fg6}>rdہzJwXu_V%YF><!-H1nYyrY! a$ZnHZ`n&0'>L{Q{"=`+xDTNo}u f/ڨ&b@KD0vWʘ!uQ!IaKc77u}Rb!!'tYxFFaPr6I8T&(&!cf%FJ$ Hx{pX3B"gzCx'Pi\vE*&dءN0.aIWbW(\t+#{X#DccU O:އ ,:!"!UY29uUZT<=֭~3>5&lph|h,`E錫)ysn*]bٲ3l[,(҅YF e -͐VћٗRa*b@1;dX{6!]Ɛ!| 8 D)Mq6a ($?  Va.^2hXצ8qE b/zP! X 1qfЧoִǕ*2 Z&ܑO"xl!f H2$cLI3TRL8L*PSg&g IB!XJFAY|LSJé`@U@~TX`H]ykqF@"0B^[ GR[1,+5>Ƿu^'v"2.M%╠gIb?t0#22a6 gN VG+gka 0O5ψ|C<f#7a8QY{Pe"D)Ԏd p븳vUP,ڙ *v|Gꪺa|%HBaRnIu!P'`00(Q>ڏBNZ`q xu#ecU%g>b]!H |@%BOУޣgg`iXcv%@j!=.)};2Vya}.nԜ8'(ƭh^Ԋ^N:kԨbtېS`ʍQ  jtO|`(I`opR`*@{Z%Z,ECrկI"D~V$.^*)(8uV+V!,NB9n)OG,A1 h!ʮ|J43ٕfȧ| S{bC@a`#NL5^&7hrvE:>NHywRvIoT[)w#dԤZ4D[;vܹ/zճw| ?V2ȑ$Kّ>8À{͓'/ PsTRKß8P}3UU|cV 5TC %,i 4sGq4u}m2 VbcQd S)/&ly[1s[ma)3,c(,HB u|!B4I0 Ԁ6@9{M}P巟RgNxA4OCEA+\4Fya֢=cO4<:/ˆRKTRQ 8`V\c8ǑIF5 <“0L9F0up@G p% I(dDlprB ##liR٠zop(tLZr 8, 0Ld7v 4W לjk8z~+ @<7ɓCER !m>pDN*7Q_S6Fc8do p%֔05HJ#AZ-RRS҂Gтa3F2Il5oև$ C #(rm ءгF4>,NWMd빗z mѶsh[x"- 48iBG2|{\=rɭ $JF#q6@WlЀpGJ3$s, V$3PcXe d9z,m|C> ~h4#`)5 \;t!PK^7~#H:A~ #,aMqh ctP*F7P@V X N@KZ@.tyXĞ11ccap-*1 nR=̠b (=T|@ "ԡr*g3T6<*J|ˣ$U<9tC8a|"?xˬ#?2"NwE(; :~xc +n HCBMu, 3(uaxǣƒŔɋ  F4@1o$:dfg<#nj aGKNBPC%SG3 HICPwpj\.u\〗SzexQQkK4x-+ J5^@YhPE/i,2t#Í2C蝇[ fg2M* +|C\`R7ȅc JA B$p 'fr`]yM'AVy Gq_8WzApz. "gg4ri9V#W BN4D20C qAsYb F `t0KG&cN~/~ 0v3nu0rHp  &P5aZ)0$7Px)A+)Ypp27y, 'zU7!L`_SpC99.{2{o%Mr59MG]AV*c$\)P;RD1hYDD74_E|=Q2kkI ~!cǐp@Q۷~d Aet/ 0 >RsѰJ@|` xf:L@+frg%JU,us77_Fq!0!Vf"CV``VyM`9iؐl۴WV F:h հ$vu0?)G- ;'&J2FEQ=*~D>*&)͐4 yH&% >>HP J`K*"SܠCdbJ6lu A7K*7~ģ=Z- zP(i?L#WO1/'w{/@6K 0I2א| soK4 IsOEY_/Fq ~uj=Q3yQp4!ՠAn$2H@ СPP  : f++Z{t d9`:A_K)''z:FFqpCE#*#D]6]y0 j@ X yYjxkqzscz=qC7Bd)aZn:w`[Fߡax6THTF%H@s#7r.1f'{4< "9ز7i.4@Ni܀ #]CPW5Pi7 5%Sr.`btT~() &YY B34FЦB0) tZBkQKb| o]e c( 5T2Lg^ TkA:J_Xe .qw7ym5r`97 (3$"p02OKkE(9Osk`8`kŇ@Ӈqa8Ccf+ By S ١%or??;"J@uiC6YgyvFU^<_J!#H+t֢M9ix / N& IKH@4)r! u1}hB}At(_ApbAPmijmFmH* ZntA Ґ)[05'I԰*u<ԌkT Epp{z*qS%h;j\!ċ+qFЄi D/^a`!@DF0HPGˍLWRx%OFQ-`t`t-ҋm(mW}XµRQSťB 5װq fUmsp*P G %b PC@O|$|LvC2 3)-pбӚj* \Es  VM]$Tפr2qV T7.1G! օ^h"4fVxzFLSaXW;dfp ҄Ad0N@nNP P|2;^}m&]E0e płV2Py #0*P{Pc*_alhyq~/Zg477zˍ)h&7Br/T%'ԩ{˸r@R:ӄ$p$$ |G ،ZI`;W% S>P v[;moڦ aض%nw# fa=ƭ(]0Ը-p( X^W-'y8nA:B0": " D{9܍9:(?AZCS($J  Gp;s v>)dfNtPY:EsP u[8бFΰֱ$^5fQ?4*6եioxn饸ZHuvg aR-{B9Bh9cT*xpޟ$Sj}DdٶN%X"־rNYX撕,H^pn,; x7E]i rۛ3pu-I7/7gK0 O8H":*"1V3JIrMwיx:aQ$:a;;gնHvؒU:o %`I1 )- 3@ ];]]AaMx]/KpcOҒ% )q:zpU^"Bg,t$MMW8{v_A@NEDa-[[ jÇ1H!qiZǎ\ȍ =xXD-i $H,gJ6bFiҨ5@ငJTf(PI mƭo⾁ Nqș+WΜsСKn]Jvܹ{o ٫xngX:uCsÍۅnܶe?(&HpZj%H%Ai#FCݸrؕMr>xf?raq lktIwq' R*'&8:xHfpZj)#rFJj *+tk Bnr .rګ/Qgxs,{T#zladM@g} |xzQ|{0xLtKrcnq pmt@ FGp*r$q[aGj&(v( tܑav"ɰpI8pA؉X#gd(Fh)jPcO'*,!<+ .HRɹrJB Ν,{2{ SW23MV@sc96l'?7xkǾ EGsRQrĉ+:J/mtS&&pkI'ZJfvr{=1 *؁H&oފk`3XuҰwZr '09YA~,0yLvǝ]AtIG{tpfMSCmmG5 GP4$?h/kX w!$6d^hWCml+VF05 0s\SyQ*%fp:LK7CI.尋tCqaWrٖQ,SљlS^W&Pm2yPf$uAi98(UX@|=RU9 ݁i$A~C6`uЇKQZ x; hWpGK7 p#NvXڂ-rrp#Sl49zߡa1CE-]3BhR%1ć 씁2Cg\ G<yԣe :/A#;ި@Xz `ci::B=q[i #]& ̅ސܡx?Ir .i(@ *n2C5B]68a0g(LJ}tK&RWtX6{bʀ>ԙ*S= h 6xnxXPR U: RL أy == 7T<8Ur B :@ SH>93ĝ @B :59L , rYuΤɗ}Z0 Y cbjt:3C'$*uFy "U- Χ4}8$bx@ Z"EQ# /H@h)'Iv3zBuAJI]*YrTm8U"Hr,Vi!GOxtk0.bdUxČz4r8?uaPVG}igM"jHjXt("NwB WN"<a/ H.\w^: #|7M *Fuss#gվP>┱N{cyӖ*qscXej;4TALkX%P3U3p-_VH>rdI+gQP\yX 8wQC:x@ m`t4˥*/!1tw\/׽ޚcqoŔ߂I QRN?t+3@v4:4샎$p㌃`($qH laQg uȆ <{jx?t2k!;& 6%n&~ڽƘ'):wS8q.zx3{§h4s@[loL3?=~(Ьr4T/\qPCxhpPY/*+j?4{>ax_F08IA8l3| KQ8hrЅu8q ~Xqpxh XuulK[b[{ ˂x~h  ,M7z#<I4{uGб0+ "| K$k,Xj  q uNuChXkm`D]PE vKи VTz2Z;IU'!ƸqBǪeѣ40EzUR%#]p(mzr‹l$)(=xد4!kDC搇}`r vG~Hq0zx"ĢDoh&7L%?xX.)w P`X\Tly Bw807-yMJjbBpBH;`,oP SƢ)Un@0eVS ktUZtsxHs`sp.HQ(N: x8&Б `kmMr (uq(P:--Qv:# $y%7A ;y"WG}H\R4|iXa|BG UBj#PU(t 0قpwHaDY=ӥ ($ֱLu0th, vo 5rU %]'֙: 7z}Bկ~[u E{@>Iՙ72 Q0hs8 У!a;C;rKe4,' ܹ n(J*TF s(0=# * |V}4jn@ꔮvHzBVhD{/Tr({"V$rd~"6Tq/nkMhs}@0e0-󕒷=`_C } Yl<V`u0nvFȡFx|pgKQ 0 sP{hVH ? Pt~(Hj|SL&Y.>nx{Ik'?yڽb?JQ)?nO# =щ[>r Çj*s(ˊvȦ &pSapȆ@WH&q]A~㲊vo"|>wYؘ E$V j#(K]lr4lTprua.sk)1da"-I6JG?'k̇+t =tdkEV8>~@e;9V&QQѾ528+JÆ:ĤT{Glл,u +8V's6suPJD1 kgen=7z$BQi/Qhv#'EWև kp1J3'&l쾠,ܴ,^8 ,,,? y;5Ff#󦥀ui!'1#V=j&H1*#[%&uC]y v kJ TO8+6l]^gl}.Ϧuʢ,N!:_ !#13;]{F º+h 7ɼGyQ{y{Ԙׇ΍t3Za#hP!npo'_@uWӇ.3Rwo-۶mro .x\9s΁Dn:uֱK]r7R]U>AbOfESMm-/;/XhN_\7 YA&$Ю,ܩjoHvf $Ql-dc2Ɛ7 Ct:ݬfIB/%->kMs-.QEImCP[w`S=de>(WJޕrX`6*"T'N6KNpiF_F8q@q6M _sYa!-gT'v >QکwOSQ~p][O jM>6mzAHֳ-mSBCh0=or`]p_TFMIɜAs$R%=;@ֹ<=*xAnN{0ZƏ^;yk.mcǣhUj`!8|ۆ@1l*hVD(R`bUD`o9""q.zZ32kT7I9G=B3]{ w+`ޡ`2u9ᬹ: L=m|iA` !"'bg6sxN8( !r ;.uҖ4wɳ^mD#1#hL cwG'D3>CBZ%zAb["u\onڻ<=\7e<7ȡt(Ĕ?tC*pI< jԚ{8궥,cI3bL&O^ARE*5u@NWHzqWOHu#[*jaTA9Qo#ixfpg< t%ǃv_2t<>B1QDar`[9.tk³3Ti+JX6!񼖁``dS![AQ (Irp#Fu>vp*;}-6tCHS\5JPXO c8΢7!=>ԨtCa9׎|C]n(^aIzۤV>||i䠖w {%ҩ"H ĜKQגZYS8؁pÂ߀À5D;^qə{__6ŞdEȀ=`@!!JL\0\p[]O9]D؍ Pۍ`ڝa訕Da$ ZnIF }Zw">XYuE +I Pte˽̄8]fvaaa!a9 [aءvޙD;JGQ!)"2~|D pMCr^ŀXHpa$iOFL[qa!aQE)K9^Q.~XjIm0 12.c+E 4K~EЃ=&X?٣P^\f٣ѣ)b)"~!=M-ɛD \#;_юHQ$B.dP M$ T%e]8T]Ł(cIVX%XVvD\UO`\@%Y^zb{e""#?\ =&E'z"8Y_H$Y%N=bfZ&1PE>\$\\GM _ǟ!_%`2PTD \5 6J6rd!L (_`ffHv%/1AiJO G"Ԡ__&me`E}OYY$TK8}d:Z-RsVhO"H:Kr 0di0x`۔m ~ z^f{{CŸ> YSRa8TEfGb9r2(G`Gw9'\-2ZdEhMnþ|'dhD=i1hzR n֗ H=QaDQi< 2Z aQ^_6nK4M5'TZ ""M]iGNڭ>RB*JZR밮=kzɤ*+Bf:~$aG1}SΥdM%\nFdk A+"fz:\(%xɱK+l+dCn y ~ŋ~)%DC8E~k#Pёުv>Yz:HьGLYM= ,l&~ 9Y~;8TrkxQdk)n'aR(B)\gʄEnm٪Pl{1ڂn2T,LUԵF.Tiֶт,"IĚQ"7ޮIܡTH.ZN h{-~鳎K}AO0͚cmood] ^.%*x꧆(؎_Nd ʹ\bo Ph=}6Mح[gBif^߶/o߅@"TjC2q RVK 1 #0E\SLMcQ$Mnj#Za֕цzfm 7ޖ좊gk $zx;$N+0k6P<<LT}릅0޺)$n"{p+S-׎e@^n?M2PC% R9aJMo:wn pvmuPr l3:"*?  "\ME2~oc!T!C#{:sjq &ɚR@v2ilQ\o4cf۾vL5Y8)NB`ОsO83'bArW@Xm-@8[ hF4G!BJLH.^23> p>Gt)N"bk5h\YPdPt C1YUuSDFG`GF/TD8Si HYuZ#Nt@?"C.\[S~\#^bdvLR+6,1Scd{zN4oAp+qWQMuluV붶k/wv4Ko4oű^.&|uqw4b)|EL vMb6c6x{-xjWYMYy $CLmr 7{ZNu|8ܬiKCtcU[Mx<%wVVi{uHv>$zpQq3SQ,ʦs뱐 3^6jxσs5ZoKdKvz3MYKix7yag/xӵgS4Q;w9ZQdN@6Mδ?/O{gs:}O}>cq  +o9ou7u7N8:`;]dҬ@zܙX|zfp@GͰ;BY4ǔzd>焚'J\ce7[|۔SzdXo{{Kz@8k.Ap{{Q5B5W_n yLk:Ĵ21}WY55ѻ;sfk6[| ,+ݻu6zP=:M?|p7 4׃}/=n5Y󽏵:̽Ï\;~{OeMq7A[n/;hG]77fC~:{~;MsnľggGϗ{~w9@ȏ@Ppaw`A-bժ9dI'QTeK/aƔ9ˏ79Hq'ʼn  zq#Ǜ k&UiSO<1~=b(4ƜS=F;lYgZU՟Y]m[Zhջ/T;paÇOqcǏ!GxqǑ'WysϡG>zuױg׾{w?|yѣ ;db4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/LoadingAnimated.gif0000644000175000017500000000530411520622616025175 0ustar directhexdirecthexGIF89a:\y&zDY˷evGDq잺CzI^tl;Pay$%tfVlD&tYp)1e}mXWj4sƩ՛{k1dv_viY u)^pc ļ+g$m\r>4zcQh&cXn\pq{!qSi} \rXPfez Maiy~x=t~Lb*m %cvNdFSJ`Tj+cue Ujb@UG]bw/dz e{.q s@6{=> {gubxAg~kZp@lt2n~@kz `v p J] K`~2k`te\r|Oe?Ukc{e{p k^rzQfsRiiktg{YnmXpn50 7{0v_uGZ.K`MbSS*gx)i{! NETSCAPE2.0! , 'UR 1b5p!!B$ T<8c48CD-H9B0D`b0C'3 \#h"?P 5l*%-XD:%J]k8*|8 6VUXHEFn( F+V pËNEL+py_ȀA0,1M<"u30ϨA7Ez*8@i! ,l@: lA MCI3ɓDq -҄T:E@GFy"M )_ e pQ /h .u1*٠:$`MiuBbSc/f9>}@$@#u+>L D&(شWd1Wg겢 k74c"Iw a1 ;H w^q a9! , 'U!Z 8(Q GB2SBF F$? pt 5b"yU:ut酈+V7VICE7 ^EcM .H„6ei@@)iѲK }КJZU5 $t(Sp8xO{91h0JZ_Cxd2 :pE!&"D>dP`rH_.ˀϖ9s 3dP:| @/%LMx@`  _`UZr*K87b߀1'n,OV#Ӭ9s\eF0)qDvKĀ4@(P 5 ! , tF"%@@H#HBDh\2p5k1N Z~m"$tL'/B"pmʊ.=XBPXbjDDxV!֨ӨS28d "DAvUv:4*s;db4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/FavoritesSearch.gif0000644000175000017500000000111511520622610025233 0ustar directhexdirecthexGIF89a}aa{vvuu[[_rt؁࠳܁Ҥ҆Ξࣽ妿񌞷̦Ι̮RSSʰΎإ̌߈@مCփDόXusvsyywwwlllbbbWWW!m,mmg ;?07"$).(*3%:-'4=9+1DFJGBj9&GNQ2YS #8CJK/lmXV_c! [V^bhejll֨R XAi % DȀ "FAgx;db4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/SearchGradient_selected.jpg0000644000175000017500000000122311520622610026711 0ustar directhexdirecthexJFIF``C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?O?J*b<W}⨢ ?db4o-8.0.184.15484+dfsg/doc/reference/Skin/Images/Logo.gif0000644000175000017500000011321311520622610023046 0ustar directhexdirecthexGIF89a?=;::ZYZXWXż[[\YYZWWXûWXX[\[YZYWXW̤ORkzPflCٖËճϬ)tMU']nyY\Do fo6`QT6ZZY˃Ǿ>=7}|vQPKՠVUQba]gfbdc_srn猊»̗ZYVihe_]Ymkg_^\pnk\[ZXWV_]\IHHBAAfeeZYY|||wwwuuurrrnnnkkkiiigggdddccc```___]]]\\\[[[ZZZYYYWWWUUUTTTSSSPPPMMM!,?= H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳhӪ]v pʝ]tK_zC ʟ~ǩ ㇸa‚C˙d -K^=4iӏ)%8oo4>~Gxq|YQmz}ikB݅q;9q*__!}7_QW?g6w%?0z^zTPσ WO` k\% ([i`8ό4C3ڈ<1:y8'`G%%ah܂:#O<;[e;Ηc(ce@`r+c!dXqBt!SxN:cS9#)砓:c#J*^1#(ﴳ:::N8|C7H4B4H,pC73ÎC#*us:"b?":㕢v#8p3A54@1 0= /bq.ҋ/#@3T3A7xkpNVxcnS &^2;쬃9S06,SXggC0 p29Χ!d! /M>*hXM{5LA/Yg/2qb-ƾ@>8#6)cG:켣&wܴ Bl:Qz+@J)/:vN7~8%v Ny܀2^ez]'   1:Ё H IF0 =E: p~ծ4D ؓORsܐ@2\P/0=%,a85ֲn,.K^ⱗ@AЂtc1@ a,ΐ]2p4rmq>Dț0ћ>xx: FgsS&6%nx;f41: xE_! g`~=B[?r`:'Ќ}+{w;>[G:U#/ t]jS;fԠ"83y#$8̑GTr'odUNF :e C=(Qpeb ]^Ce2edyMsSEl̰3Ar5񎌒MZUζgp<WHHPS>,t;*e]8ՙx|bX;x3j  3q6GRWpĪ>["nmIOl,#1H4 HbTv;U.i}chLɞۻ/3 $agzU=[iW<"5l P\cs2w s61j_-Y&vMgz @ ëR%"qOg[ARNވF6с Nc=/}8<եKDc f(354sOS \GivK^ "|7o6}ӷ%  ` Ӏ蠂k0c~hĈ9hhvP 0: inԘOP6i~SMaW iwa@ETeZ xf8 $ tvkuh{t z"m@pųx \ gGƑ}tG'rAvnWl\NOldOh We2K6P|GPuYk'dȁ @ΰ- 0tr8#Cg1_Q7uR WP 0 x9a DwyX|wM(=F(GFNM6i0FnSj /Ǘ n(}Ih8ϓ k; R"r" m ЕqaEK riS\>/mDM `Meme_ Y`F4 R`ح= QXPLD['R P   ߀#3Z FR bj`/2|D0wKBNe=hij@ ~pvD1$ TVĞL`ޯD :^Z䫮=~ꑝY9LJ]'Pk,y 5@ `ZVR= ` ޿0 ȝ|fօ#Y=kn/Z`DnN?TCJf0e0b WpİV!P+-U_P=+ʅE$î P-P-p p 0 LZĩ+)9#%~'̰&|'=}ʮulDW~%ԞQ  d;o'cCY`Td߽WkK`vQ5 C3t;drh0 mn9olT*{ G\P?Q€@ W^cTo}_!X``,dx cȐ-HLe˘1kVYg$<4iԨb)KkbŒyMBбO޼y*ON SQNZUYf*Gx>Ejl <,kY ޭLEɒ-X q2c c`H/Å15o.,Cad&@ 7O9 ̶aJ,#䍐5?رȔHvƎ$={V \fk4g Zo; JO@Gu}|.ȡBKarId<ˣ8Rf#0CU<02vf&5ӂ ko-8 ~@ R7>bpa0/K"I302MGq8Ovp9I%HHAxh9BbԀ8$(C>اu+d?X@SAe*Ӈ ER:a blU< d<1@*R\"5uȨ(0 \B)-l}֚d C]v :^`Zwtk# rqXd1YܰO|zчȚJFuG*@X$lǂ! d첗`y8a>p~a021У\,VmGQ /1|c7*t-|iRrY-n.V/8ɐaf4Bz % 9BT:{n(+8>fv+/>\YcS:f$lF 80Ѵ:ҙ€4F 9MXr{ Ђk]lUD _mBU dv1%,A ՍXy hjT+ႺBb|i2hCUh0A4qD 2( mh#sF'E̓t8 ?qJjVUQ4ڳmA͒8;"-9*3ߐTjB KQӌOZ0 B! PBJ`ZFv(ha eۄ(HAZ@۴7 QX=a/y`_JfeԀFȋF8%2\&a cC8G;)v(T7bP=dڕ`1_6b50C>5P4@2  ,c tz7AP WF:k8 xĂ#q`Aڄ %FA%\Ph΄D>;e k@| kB=r=WmA CEEW;́ %jJh8T9@B\hUyҘU5Y_]Ŕ VeYmFYJ/ŗx鰁Z( X2Fsn0Wm4\N60APQ|( (=xGЗ`}εmZ 3e7GDe]?cq ?px0U ҇gxwxdӚXLa#&b3V^q&cAsI" Q|bhh^h_&a(!P*ݪ i kȆ/< o2Lg&1}051xPtoc AKa#Fۣ`#&$<_]>*VYhn|xAHQzi4~lti rԡZ2jN~y=mJF~my\@<܎M<əXc(HxdXc+xcpi7jR[FLkF\[nט, (qy@c`َ6(9Y`;goו]w0zLDbpHU[@uKޓx^A-=!bkH!kE__^&I]%SdHhhg2Hnl<r w`>p25z~$=PM^Gt&^QiTpAq܀GEk]^Etvk,Prer4ofhSdx9iHi`[ڞZlq`x }PA&_ ENg$qij`[@Hx|JgZU&y6kHF/Ƽvozt+`sINca3@+e8jpe(YHZwOWwx/sx`v 8d)נTNBfzzQ@6SW(6s]eA-S8\5~"34hცL~p ^{r7$hᤶJ1!ÑU R"IsoJ$ )1"b[a`%2`F_u'}_w7}b}$(JY1UƎClʖ1cU35 R`MmڶqkI[7 2)xv'o=zpA߾}B)ԨRRj*.wB=zŋv֪3M difk֪UEMѠx,Z3f˒%sxX b63`@0eeK4kVi5eȄmv/w{7mb%8dŊ)0$1P좳ԠE0mj#ML%̘3mLSTV%'(Y]u &U?\Y=C<;8q,ve^`_ F 8b3,3AAt 10L |h)ljњe G\qUZ۔YiLDa9&a~DE0D@yH_ĂM{+L375d}L_=XP'Ï?*8)  W]%!YfY؎Nl\*4\"ꕍ(J؊8SC3P36ޘx)B00|քdPJe`X{-^[ea\V,1Z{.{\|WCy!r͝yR2hM;dPD 'ITK,UV[uuO=3Yg% ;c7rm6rM,d( ΡX2 S1!1>h@ $C0R,Ah4$UCAi56eo\%eC]if6\f5H3 &4Լlvo7N<=m RJ:12(>]]^r)V_A@Ma6ך hCxe3ѝh(dfZ'\ي1=[oujZ~FW"FRӜX ڕ27,'< }0*r\xKe<8fc-"K8T’Le  XL0 1+f 1l!`a8bFA`0 _BވO7غx=la6ܳV&ZB .yE#?~'rdC AL~JV =0,;ࡖС ?4m`eC4 pB>Vs ^Cܨp }bx, M` \x덡%0yR7Tr"HFzӻ g5 zjcG9{ EyA\&D!QCj#ȓ}h#5` iTC03>p*~聰p@*=+v~Xc<<. oJזYUאCkFh*g x9UА i}g`r., { xX45h/o!I]Pp_-g91tbKX.ЏȫU 6XW񘇅a @HYAVqH 1 E3FCe a52 ^f'8 OBΠ=ta ~3-h/ Op›,g/ g؃HyҒ›9؊bNоmVy1L•3Љ<Dax @\ӣH_CXlW;CG|_K 9`U@pYd\P9l$M$7؅\ XCݑ]1c@c, q)tY`[-F^/#,ǁ/0G$A5/*%wfv9)UN#4#(VA($ 2, <1B2D] 4@@ D@H&S%@9<(׬) 8WeZ?p S:&IT^4C@8 $(1NC9!HBvr'wr'v:x"L'z'Y {z \)M~BG101Ā:fF K d4\`LCHQ΄ÅCꡋD݃쀌9Le>!Y:ß܄L`t\6(6HUb0C^=1CCb $e %(yg*%+:B|y@8Ġ$TB0 _0hg 1F x3!C4040Cw|3<@5O`7SUhY; =,LR(TPZÐ:vP6JݩPUc'h*1tFC-)Rk/"h&'7蠸r-- ݒRSA'+5.#܁#\\!lB07~,G=2Hu0C,4Aw=Gl5l$0~$9< bH&?p ïu&?m:lq ʬ~\L HPC& F!lu5}~hҜn-|-A %DX--؂ܾo&N# zi$B8Aqb])CT2 !\RD3D3L 5hMJ7x?Vh䊉-]@ >^V?CYDzC[5/MjFYa4[e 4됈1^r$ /m 8B9&o)Ro-6\ '.z+V e1)*5 ̐B 8cL 73P 8FLC5 ^ ӥZ8䲐$E hCE 5|uuwB.2)AڭRv,B.(r').V&Bu/4^q! Y xae}Z4"úÒ;KLz 6X ՊbDC2ÁK.C)0ós 8c.L\.8t3[:o-|).<ɓ8C:)'HC/|7Za! ?A0,B(C4PTFACC DŽ7ءbôO9X{m6 AWuF3q c/8cH0(ĸ[P/2Pˉ+<ܹ>.dH&Pb=B5$MM8t;^%<7k D8c\*F , PFgL?$Pb @ X F,Ífqt5П*0#K?BQ29 > oCb$ !hiu $eLrAF( Brf D@ Y&С0 X8f)$'ЍH7O`Jht< 5 R]^X |{QQm[VqÃ+DxM?@ 8HBRQË5u! m(#URbd5ylڅSBIIQ؉cvhG<" =Wvadމ#Èdf~䘝'xh!jaCT%;LisUڼ"+F6fzѠA,Wz7)5,/F#@D#Im2O"(d؃88;H:EPn$s.3 -N[Q</xΡxH k@p5$ eFy pt؁ $)J&Ul}2^0ũ1`;{.m =0@xJp+a:&zp1l2 'Fa6Q*J/PraJ.@.M~TVl &@WIO@LYY8A$(0HL$^:sep N.7 d퐬a<` Xb/AM$@1*P|&d38i@0E :iRp.9m:kC*fOUz8h=^.NdX "/*.dȩaN#~$P Gd &XD)an+j0s0%wI6x :h`Kd`Ą̤PGAN`JUB~NnBPCagI+%/`SBIv1|3Vnmd!掐nXhof@A!Y``ZgC8d$RKĐDN&@Ŝ'B u|!+@A&e&o\|tȂ! bdJ d"d`T$å:@g4́jEpn6^ridr&'SPὮCǪ|(9ӊR>I?zԨgH`g".Bh#Q$(F%6\Dxa^xa ;iEHr\2M0hFx,! @bN~>@z!2m{#%@@D}nO5P%#Xea6k S˖tS'EAav1hO((R`ą`H|yDNa"EXa2wB"zĥ EtCgt@jD^QD$>kSz!*ɘdx^܌g cNBGTf#C=3a΃OȁLԓc5Xcj5`e6`h)rGmqHdvL#4<((Vv%?to` ",l;RJaʔF-oAMM`"8+j!]sO%`Ȉ`fx$@/("@̞CAC;}JgDK${BL%e%Fm&q8N%+X=CnhnJ! T!pdZ`ZZ~Љ[ rT2nMC'!^@ar&j/a$?!i"\!F"5V3 \&ʇW@D VX~ `F0 knsT zxhGBItLhB2ɦ(f.AIJ04cXF #d'<1Dol~PvDUEb#]A7zVi3vcjPFijgYC҃(4aDw"2#&Lj0`MWpBxAAnA`om~o`S ,xz q΍yR A{l@eN -[ 3034Q6J1\i%!^Vc8jFAlwYC$; ic! Z(Fez1De3s-mEnB]I}hoŷ/y4m#4 Ìc'pp" !e\F9KuB4 %5O;:/A`aؕ Wi*hwq0w٦V NWj{*k!*Z@4 ,*Ǜ[Ds|k`ġ~9yG: a,$PTyJGDILm!4EW(tiyt%iZS:V&Cp7IrQfՇÁH)!|Ev`/)!Y2.| xPr~`ʖrO\pUrL"a~x&蹞t֎яa΂‰p+$Wr$Q[Ja108N6pOB$S3%]Uc^6f5h'!(yf(Q{4rleIIy&F ;KLɖ<}͹n<A@:! zڞx- ̀u4RDL̄PW`$t~l%AL7d%n. 7k7cêr98=O=ރQ( ZEBL .~[l3O&! `~<C[PLaߛK B@2)le'dNf 4HOK 6a`WЇ#Kvid/*-Hl&9m>z/? Y* bdA=֮{ϓ+jؿy~־~h?|H.c&ad ŌXl{yB">BW/:+ap9u+bD]زeqת9rHÅ$:+%գ>~dxQ@0 Fl  V=plѶN;npxN7$\6Ģ ,LMu=N2$SF!@jzA`-P|7_t_/ D&K(r('B $BNk. /y_"Ab>2/t@QHS2 L% #H М 6P`$8ɖ[VY`ebUO3Y?ibf& (\p=s<l츳N_Xj9 NPreM5L#t=K h2VpL1@%0 jkLK IB,#B+TJf@L䴓OPDr1tq, dWC Pdup9WnL%;&aV f'?fr(pB<м(먣z3]@NqD37X#ԑP315w3,P|5JA} a? _5@!$>7тr$hMCK^-`#rNc]/RW ) h :W,!L,j'. ^fqƌ7z1 Y(H8>zC{)ätm9hFj d'ZK-\%CŤ@Rb] h!*C2?"&rhpr% %2q)c" E:$ƹb4C)D 4*=J4(N#`) 7r0$,Q]F-q;1NpLmPQ+?RClj>D?kqmP@p1)\Rd3 Pe s8c RD "]r(rX 1G(l H8P4h3)ǰ VLEu 4Љu¢ֈ7r!*JhOц0<PT A 7Ց"xcOY:tC>Be8mY7( Y8*Հ <:p)3 ŀp(%  1jeZ|Ie.^ nv8\YGrF eX @3bw *pī@u8A:Q:klcI'8ad)ϙY4㳡Me~\1~/ >A#8A;Ѻ e,JY"hН!<0x=9VA %x^ ېPp$TXL `>? õ@Q b]MI4^x5:n-pi,]zcd)Rab|dV?tGdZV=ʣz3|ƶ$юX\CWJ \JVEwC#Q%TȜqpya]%%dɫ\b!n|c|D%qJW+/yVhӦ(嬉$1XhhC ZH l5 %]w3g<1 e8FN^<,=% Fg1G!n+c ' )J wZ; gdMkq-U2|: l`A惶XHuR/>y2t(C vq^kq/EwEJ:iA1kT;A?e˘8k HB4P*m\Cv<7Ɔ#wK>#{dzӜ,Pz੏{nb>( ` KB$5d ?$?pP C a3y: BTT R+<~7 0p ֒++!V ];a6wBV Fs2 aQ F@NPG $ Xڀۇ &rO~Wgw[" 3l#26ϳv2D`d8QDeA>(p 4t$"?q 10FdM"bcC0sy%+k*g+pq ~: ! 2"bVDŽV/`.mv D%PR:PS`N P H$ %\D(vl|OQ13QzFhׇ'Px:z$Q~$db[XV(H[kPQ\/ 5SlI:]@q@` p B@Tz?g-ЂQ38 }6{"WTGMC"|0 (#J.Pa:V@ D ƎP J SXSE%^bY4~PP;Fi2 v&Qz|dw5n#eHP:6\ĉ̀)p<7p{ДVVhMC st.$Q!F}iYkWS$0`0duRbOzb%11q&cir 0 93ZZn(UV[EC%4K s AvQ 0e@ .0 * Di+4A?0҂>`p  IqL"Ciϸ{3g`"* o9_s@C$/:DV#^]Q$38X ;eZ]& Ҁk S)A2 ` 4p; i$(CicTUL_V1q u06U pRi`C-rsPGJD6hZ.EV ktq $uEjlkYpfYi~z(q"Q'5ncnK1Fe ow؀ xMC'5T6 Ǡ :n a@4*6] 6p9SrLIqB, @JVL0 6M CAj [tE :OQY#ME/3 %f@FʖįF5I~ AQe}dIxW(q)Xh)!3)h95@!Jܹ:q]$-i#? 9庵 TJD66ڝ?Uۭŀu 40/P aK}[ e+0lAO)bnۆlc vvy&9'.c'Wn'~yaASeHs ^&?ԑ?/0k ` g"p8zGyg?ʛM C[V38˴ؕ Ûo`C𭟒r>n K $tE$UbtQE]WQ08V  .1#Q533؆P6񈶵 ` ]f )P@\z  )pS"5y)TGڕ6@rTĺ! 246iZ ;Q =.U+1`5# }WQ^Rp;0ŽYDP,~b'@cFc&&'8 YʖdRH eMR@ \\f3`5 *G*+ ?562]5khCygU "H3!C{#M\JBJ`#7"̇:5@k/a;֐`&E>cD m9Fm͌2+xIwYbw) `V&Qoq`5us +2]R :BĀ6A Y  PG A8 F #Wkyd אeqEN"ll~3CYS7e<ԟD}$ >R<qe] t8\Px4px#47p:e*xyp@xpD5 &2a&87], Vu`CjI AjCtGtB/ڿj}=->Æ۶q3-EjǭPd2`=ZM(9e֝H>5L@IE53%0c doS^S :]@?+-QR Ҵ]BƠ/k4N % ]:tKڠ !rXA~Zw<]QccGܔ!0Ψqp` k+w3P([ (a :N9)ХS > o Ŵ@?P,< 5b@-o. nsYJ Df=#%a (}n%&hd' Ԡ1ꤎv%l<̈́#[4A fg Õ:2 fBW`@oю]ni.K@K$9/@oN>TGIQy:~N\kP(E{WW#~$P(\`)/"kF5` G ~_?FZj֭]F]ڟ>}ç@) 6-䲵@6|x)nKǎ枋q©n/f.mOtLr+agiIG8ц֠ĕ$?_Gc(cWJe" 1iۊGmۼJn#s1R6Wt*^zG<6fӧ5_zD`ǒCN+G:ɯ|K`;ܤʃ#aē8n;%,.v<+_qOct<`V;aedDez/8B XP(1atP$ZEGN, )l:X ϘJUTTG;pcy)/m8 {΍nQdӦ6IG ڮÂhfU)FJAS)%c.gN Rf>M,<ƥ2f :eT:tA8Dhc^r@G]fՄ։ހJiFFHd=)#<2_eJ-@P.ucNx[:@V3 h*K j?:;P 8jbqL'͝4xR- w'eFܻ:CYCuD87A| nt*͸6 5 `<^ӭom;,ܑ({!_l\ܖ)Ű%&<2=ؕJ,|Lf m2a(ï,G,ZJ;1]BY_iȎ*.b8)QRe$Q[^p֩aWS[2 7rڗBIL!>JvREQrM !oz`lG3u~,ŹS<( yg6F+B&\e['M%.mTQg#c:j.=QѪ/=U.2nBIԶp4>Z]c5-l뺭yn'\:k:SV+ӟwJ1x}"%mkBϑ=A;Q>ѥ"B  v@nLqMs؆!̿Yc ̌[4/,p0YM2gX!;pY|3LJ:!30%qC:PNcN~K%V[-POk-qA rHoq8qXŴn@&LsÚjP!֤8ŞF֜i t M=Qq\RF~XRNK7 ;s0):OqP-n蓂),x qÀ`fYLsXIGz>up|p u7yHJ V(܊ѴE(hOE-X0w0knK-QJ"UPSլ=)QPD`*>HUCm)" Q99gr.͌05px$tX q;ZFXX!.)*jEڨu--gWtYY'FqI!JXHxpu sxjІlL5L[ڱi[:"qYsq}N DNP۲%H})>sKK!RR+cBsW  aBA=ehTR\0UfPL9lȰ15Os(|` a/r+pћuxb*aRZrW$!)GO(AK Pcl.s RPۊopTdIDϜP*9M3p౹sTMJ㾸@>an{saF D{栬ӺrUav ZmRՀ!<4l- ;k I NfE~((;FR\4 iFCNK,[F 85!\djC_gk܆}spKV<.MtBQ)XPfLE֤gP*(AB|+nC:λ1:q$[avZ0 5) 7~se;]%i=2h@B5;f؜1gCe/4%^BX'&صŋQ omSayPo~oۣ6K4RR4>anU_-Q=2Up:# srb/8=*$qhqPQ4^~qV섚l(QG࠮tP7p"oSI:yFgϹg'~Dž\H\#pp oE3 ƫc7Q9#>mKl<_l džgބ3IqEXyL翅Q >ujX2\ mxZAxT#}bzvk][=|J&V D?EhHN/pdL}{&Om onKM6 deEkPEmGI r$X"L .KFRf6nJHM[FX1ZMbljpQm*8pą*Nܸq1gΎsСKn[vڹ{>~֏?b!?>E(;l:fl#N9Y݆7ApMB ,HTqeF:B N8=t#MWQGP(T 7F6۴{'U}Vᷕ~jB]w`?Rj!!W>ե"#`j2sYb89zNULtQMZd rQ6d4݁fGNCMR-PdPpQ1NuCAQ58Ym~`Zڕ!eYg)(iu:3jc9+ B%iTqUx=I r-[;^>De+RH&d$+醳V]y4蠅s F*__a!\+:ZvĆ#mI@gԚML\3֌7LQ>'B _G3+K{ [pQ]5z5طa}`$*giV1:=81AfjiE߸[^CY. t[袯_v ;Tu "ԏ. d/u*/wGB3Ҹ#bȣX:,nѳJQ*Ad";JnpA9\uIX5m86a0}Dģo?:P `h -0#?B6h& Sԝj^9E܆ci>b}\"+_m{2!8AG"_=6m9>!NQHgئ]k"ՋEYf.:#/!mJG&080JR1e?Ϻ > D`̱qp6BmxcG8:ʱl`9A!vC"H$~xQQpJ6D v;v#o"*WYViR"=ԦE_{Ҁw!قx̃mlKfsn[^ͬ;ٍxD6ʡoUXtGBB?M0G&JVӇ;Cnl:IL:(B=qJTR3EuGRڨGdxǏM6XTĨvX7QV;ځֽ\G7anCmX;$)mAG:sb8d1@"ŜԵ. Tmo8W p,v>4Gџ, k諲Y˥.g0K [ǎwlo\w`>(puaex'phc-~>F!ІUaWw׼$]y侼C7*-W4d<;Lh!xPMH*8J5sppbsDZoP@}(*H=F#(.W!ioHJtmIȱsc!WRbYWedO /a60{-3/dшc" j(̟iC}${Q,RMvG8! 5D8 "϶֫*' s2yWwx9<#bkY WIuhm|Բuf}qwDXfvӜTWKg׆ڱ8HltF^`$CFbss8M47j )pA@MsP2:a"gñB~[CDi#G"L8ر< ᱜ/֍ jEVLJ>:#}$W4b~QL5EmF7vda`*nTNV ? [%IckU$LjLZi4v e-OP6 ۈ$!**teJb*bbJcegH!:Be=&Ynph\Af` QE.6I`~foUFK;TY+"YvlhgHw.hw6BJ9L#5AMZ԰Ldմ'ngeƣ֠(ڱhgb0eEre꠾1߭(>æjj*[ENC> ߈kFfM:0(DfVn ZPJ$úN,œf,d6hҝXʪʚYfMH%2SȓY0+'*smҦZg]SF k"} Lma  b3=)~s.+ZICzncRF "Jn)`*n֊}be-gPͺ٦nUX.Y'-!秊BNUϦ /0bZ~ ΨnZu0%/, }-=QhI*Qj/+s(; p)(W6,}>.&Z\e'"q],F[o,;16Ǟ&a ݡljrd ;hɱUqqNn#l~W@47 )Os\O-09E.  %Fs1/'?&r*(MV#{q?Dž$4r ?T1^$L,<ZHfvw&!%uk!p=.wY#ȧ,8t'8c;]PC6ht{;1NEf?5Jt|O HcP[!FGr2xud:끷=GUq3p8K608ZCx@9̖yM_g7v9%R5QP; Toolbar
db4o-8.0.184.15484+dfsg/doc/reference/Skin/Favorites.htm0000644000175000017500000000223211520622610022724 0ustar directhexdirecthex Favorites db4o-8.0.184.15484+dfsg/doc/reference/Skin/Index.htm0000644000175000017500000000353511520622610022040 0ustar directhexdirecthex Index
db4o-8.0.184.15484+dfsg/doc/reference/Skin/Navigation.htm0000644000175000017500000003723411520622610023073 0ustar directhexdirecthex Navigation
 
Table of Contents Index Search Glossary Favorites Browse Sequences Topic Comments Recent Comments
db4o-8.0.184.15484+dfsg/doc/reference/Skin/Blank.htm0000644000175000017500000000102311520622620022007 0ustar directhexdirecthex Blank db4o-8.0.184.15484+dfsg/doc/reference/Skin/Toc.htm0000644000175000017500000000267311520622616021526 0ustar directhexdirecthex Table of Contents
db4o-8.0.184.15484+dfsg/doc/reference/Skin/BrowseSequences.htm0000644000175000017500000000272211520622606024110 0ustar directhexdirecthex Browse Sequences db4o-8.0.184.15484+dfsg/doc/reference/Skin/RecentComments.htm0000644000175000017500000000274011520622616023722 0ustar directhexdirecthex Recent Comments
 

db4o-8.0.184.15484+dfsg/doc/reference/Skin/Search.htm0000644000175000017500000000534611520622616022206 0ustar directhexdirecthex Search
db4o-8.0.184.15484+dfsg/doc/reference/Skin/TopicComments.htm0000644000175000017500000000273611520622616023565 0ustar directhexdirecthex Topic Comments
 

db4o-8.0.184.15484+dfsg/doc/reference/index.mcwebhelp0000644000175000017500000000127011520622614022350 0ustar directhexdirecthex db4o-8.0.184.15484+dfsg/readme.html0000644000175000017500000000644111520622620016773 0ustar directhexdirecthex Readme

This distribution contains binaries, sources and documentation for the open source object database db4o in the corresponding folders:

/bin binaries
/doc documentation
/ome Object Manager Enterprise - database browser plugin for your IDE
/src sources

For more information about the content see readme.html file in the corresponding folder.

Getting Started

For the fastest start with db4o please work through the tutorial, available in different formats in the following folder:
./doc/tutorial/
If you are working with db4o for .NET, it is recommended to run the tutorial program:
./doc/tutorial/Db4oTutorial.exe
The PDF tutorial will work best for fulltext search:
./doc/tutorial/db4o-8.0-tutorial.pdf

Join The db4o Community

Join the db4o community for help, tips and tricks.  
Ask for help in the db4o forums at any time.
And take a look at additional resources on the community website.
If you want to stay informed, subscribe to our db4o blogs.

About this software

The software contained in this distribution is the open source object database engine "db4o" supplied by:
Versant Corp.
255 Shoreline Drive
Suite 450
Redwood City, CA 94065
USA
Make sure that you have downloaded the latest version from the db4objects website:
http://www.db4o.com
db4o may be used under the GNU General Public License, GPL. You should have received a copy of the GPL with the download.

Your db4o team. db4o-8.0.184.15484+dfsg/src/0000755000175000017500000000000011621751237015443 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/0000755000175000017500000000000011520622070021767 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-Silverlight-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-Silverlight-2008.cspro0000644000175000017500000001422311520622070032260 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {97B6DEA6-255B-4B49-8973-38943AC2E70C} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o.Optional Db4objects.Db4o.Optional v3.5 false true true true ../db4objects.snk true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-CF-2008.csproj0000644000175000017500000001615311520622040030427 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {667C616E-FEA2-4D5E-93F0-9D18D17275FA} Library Properties Db4objects.Db4o.Optional_CF_2008 Db4objects.Db4o.Optional {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4objects.Db4o.Optional_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) prompt 512 4 true true Off bin\Debug\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF_3_5;CF;$(PlatformFamilyName) prompt 512 4 true true Off bin\Release\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/0000755000175000017500000000000011520622042023254 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/0000755000175000017500000000000011520622064026032 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/0000755000175000017500000000000011520622070030154 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/Db4oPerformanceCounters.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/Db4oPerforman0000644000175000017500000000557511520622624032562 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Monitoring { public class Db4oPerformanceCounters { public static readonly string CategoryName = "Db4o"; public static void Install() { if (CategoryExists()) { return; } CounterCreationData[] creationData = CreationDataFor(PerformanceCounterSpec.All()); CounterCreationDataCollection collection = new CounterCreationDataCollection(creationData); PerformanceCounterCategory.Create(CategoryName, "Db4o Performance Counters", PerformanceCounterCategoryType.MultiInstance, collection); } private static CounterCreationData[] CreationDataFor(PerformanceCounterSpec[] performanceCounterSpecs) { CounterCreationData[] creationData = new CounterCreationData[performanceCounterSpecs.Length]; for(int i = 0; i < performanceCounterSpecs.Length; i++) { creationData[i] = performanceCounterSpecs[i].CounterCreationData(); } return creationData; } public static void ReInstall() { if (CategoryExists()) DeleteCategory(); Install(); } public static PerformanceCounter CounterFor(PerformanceCounterSpec spec, bool readOnly) { return CounterFor(spec, My.Instance, readOnly); } internal static PerformanceCounter CounterFor(PerformanceCounterSpec spec, IObjectContainer container, bool readOnly) { return NewDb4oCounter(spec.Id, container.ToString(), readOnly); } public static PerformanceCounter CounterFor(PerformanceCounterSpec spec, IObjectContainer container) { return NewDb4oCounter(spec.Id, container.ToString(), true); } protected static PerformanceCounter NewDb4oCounter(string counterName, string instanceName, bool readOnly) { Install(); PerformanceCounter counter = new PerformanceCounter(CategoryName, counterName, instanceName, readOnly); if (readOnly) return counter; counter.RawValue = 0; return counter; } private static bool CategoryExists() { return PerformanceCounterCategory.Exists(CategoryName); } private static void DeleteCategory() { PerformanceCounterCategory.Delete(CategoryName); } } } #endif././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/IOMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/IOMonitoringS0000644000175000017500000000221111520622624032600 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Monitoring { public class IOMonitoringSupport : IConfigurationItem { public void Prepare(IConfiguration configuration) { configuration.Storage = new MonitoredStorage(configuration.Storage); } public void Apply(IInternalObjectContainer container) { } } } #endif ././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/ObjectLifecycleMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/ObjectLifecyc0000644000175000017500000000702211520622624032612 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System; using System.Diagnostics; using Db4objects.Db4o.Config; using Db4objects.Db4o.Events; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Monitoring { public class ObjectLifecycleMonitoringSupport : IConfigurationItem { public void Prepare(IConfiguration configuration) { } public void Apply(IInternalObjectContainer container) { PerformanceCounter storedObjectsPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ObjectsStoredPerSec, false); PerformanceCounter activatedObjectsPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ObjectsActivatedPerSec, false); PerformanceCounter deactivatedObjectsPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ObjectsDeactivatedPerSec, false); IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container); EventHandler eventHandler = delegate { storedObjectsPerSec.Increment(); }; eventRegistry.Created += eventHandler; eventRegistry.Updated += eventHandler; eventRegistry.Activated += delegate { activatedObjectsPerSec.Increment(); }; eventRegistry.Deactivated += delegate { deactivatedObjectsPerSec.Increment(); }; eventRegistry.Closing += delegate { storedObjectsPerSec.Dispose(); activatedObjectsPerSec.Dispose(); deactivatedObjectsPerSec.Dispose(); storedObjectsPerSec.RemoveInstance(); }; if (container.IsClient) { return; } PerformanceCounter deletedObjectsPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ObjectsDeletedPerSec, false); eventRegistry.Deleted += delegate { deletedObjectsPerSec.Increment(); }; eventRegistry.Closing += delegate { deletedObjectsPerSec.Dispose(); }; } } } #endif././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/QueryMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/QueryMonitori0000644000175000017500000001227611520622624032742 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System; using System.Diagnostics; using Db4objects.Db4o.Config; using Db4objects.Db4o.Diagnostic; using Db4objects.Db4o.Events; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Config; using Db4objects.Db4o.Internal.Query; #if NET_3_5 using Db4objects.Db4o.Linq; #endif namespace Db4objects.Db4o.Monitoring { public class NativeQueryMonitoringSupport : IConfigurationItem { public void Prepare(IConfiguration configuration) { #if NET_3_5 var common = Db4oLegacyConfigurationBridge.AsCommonConfiguration(configuration); common.Environment.Add(new LinqQueryMonitor()); #endif } public void Apply(IInternalObjectContainer container) { #if NET_3_5 My.Instance.Initialize(); #endif IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container); PerformanceCounter unoptimizedNativeQueriesPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.UnoptimizedNativeQueriesPerSec, false); PerformanceCounter nativeQueriesPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.NativeQueriesPerSec, false); container.GetNativeQueryHandler().QueryExecution += delegate(object sender, QueryExecutionEventArgs args) { if (args.ExecutionKind == QueryExecutionKind.Unoptimized) unoptimizedNativeQueriesPerSec.Increment(); nativeQueriesPerSec.Increment(); }; eventRegistry.Closing += delegate { nativeQueriesPerSec.RemoveInstance(); nativeQueriesPerSec.Dispose(); unoptimizedNativeQueriesPerSec.Dispose(); #if NET_3_5 container.WithEnvironment(delegate { My.Instance.Dispose(); }); #endif }; } #if NET_3_5 class LinqQueryMonitor : ILinqQueryMonitor { private PerformanceCounter _queriesPerSec; private PerformanceCounter _unoptimizedQueriesPerSec; public void OnOptimizedQuery() { QueriesPerSec().Increment(); } public void OnUnoptimizedQuery() { QueriesPerSec().Increment(); UnoptimizedQueriesPerSec().Increment(); } public void Dispose() { Close(_queriesPerSec); Close(_unoptimizedQueriesPerSec); } private static void Close(IDisposable counter) { if (null != counter) { counter.Dispose(); } } private PerformanceCounter QueriesPerSec() { return _queriesPerSec; } private PerformanceCounter UnoptimizedQueriesPerSec() { return _unoptimizedQueriesPerSec; } public void Initialize() { _queriesPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.LinqQueriesPerSec, false); _unoptimizedQueriesPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.UnoptimizedLinqQueriesPerSec, false); } } #endif } public class QueryMonitoringSupport : IConfigurationItem { public void Prepare(IConfiguration configuration) { } public void Apply(IInternalObjectContainer container) { PerformanceCounter queriesPerSec = null; PerformanceCounter classIndexScansPerSec = null; container.WithEnvironment(delegate { queriesPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.QueriesPerSec, false); classIndexScansPerSec = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ClassIndexScansPerSec, false); }); IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container); eventRegistry.QueryFinished += delegate { queriesPerSec.Increment(); }; container.Configure().Diagnostic().AddListener(new DiagnosticListener(classIndexScansPerSec)); eventRegistry.Closing += delegate { queriesPerSec.RemoveInstance(); classIndexScansPerSec.RemoveInstance(); queriesPerSec.Dispose(); classIndexScansPerSec.Dispose(); }; } class DiagnosticListener : IDiagnosticListener { private readonly PerformanceCounter _classIndexScansPerSec; public DiagnosticListener(PerformanceCounter classIndexScansPerSec) { _classIndexScansPerSec = classIndexScansPerSec; } public void OnDiagnostic(IDiagnostic d) { LoadedFromClassIndex classIndexScan = d as LoadedFromClassIndex; if (classIndexScan == null) return; _classIndexScansPerSec.Increment(); } } } } #endif././@LongLink0000000000000000000000000000017300000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/ReferenceSystemMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/ReferenceSyst0000644000175000017500000000651611520622624032675 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.Config; using Db4objects.Db4o.Events; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Monitoring.Internal; namespace Db4objects.Db4o.Monitoring { public class ReferenceSystemMonitoringSupport : IConfigurationItem { private class ReferenceSystemListener : IReferenceSystemListener { private PerformanceCounter _performanceCounter; public ReferenceSystemListener(PerformanceCounter counter) { _performanceCounter = counter; _performanceCounter.Disposed += delegate { _performanceCounter = null; }; } public void NotifyReferenceCountChanged(int changedBy) { if (null != _performanceCounter) { _performanceCounter.IncrementBy(changedBy); } } } private class MonitoringSupportReferenceSystemFactory : IReferenceSystemFactory, IDeepClone { internal MonitoringSupportReferenceSystemFactory() { } public IReferenceSystem NewReferenceSystem(IInternalObjectContainer container) { PerformanceCounter counter = ObjectsInReferenceSystemCounterFor(container); return new MonitoringReferenceSystem(new ReferenceSystemListener(counter)); } public object DeepClone(object context) { return new MonitoringSupportReferenceSystemFactory(this); } private PerformanceCounter ObjectsInReferenceSystemCounterFor(IObjectContainer container) { if (_objectsCounter == null) { _objectsCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.ObjectReferenceCount, container, false); IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container); eventRegistry.Closing += delegate { _objectsCounter.RemoveInstance(); _objectsCounter.Dispose(); }; } return _objectsCounter; } private MonitoringSupportReferenceSystemFactory(MonitoringSupportReferenceSystemFactory factory) { _objectsCounter = factory._objectsCounter; } private PerformanceCounter _objectsCounter; } public void Prepare(IConfiguration configuration) { ((Config4Impl)configuration).ReferenceSystemFactory(new MonitoringSupportReferenceSystemFactory()); } public void Apply(IInternalObjectContainer container) { } } } #endif ././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/FreespaceMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/FreespaceMoni0000644000175000017500000001126711520622624032633 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.Config; using Db4objects.Db4o.Events; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Monitoring { public class FreespaceMonitoringSupport : IConfigurationItem { public void Prepare(IConfiguration configuration) { } public void Apply(IInternalObjectContainer container) { if(! (container is LocalObjectContainer) || container.ConfigImpl.IsReadOnly()) { return; } LocalObjectContainer localObjectContainer = (LocalObjectContainer) container; IFreespaceManager freespaceManager = localObjectContainer.FreespaceManager(); FreespaceListener freespaceListener = new FreespaceListener(localObjectContainer); freespaceManager.Traverse(new FreespaceInitializingVisitor(freespaceListener)); IEventRegistry eventRegistry = EventRegistryFactory.ForObjectContainer(container); eventRegistry.Closing += delegate { freespaceListener.Dispose(); freespaceManager.Listener(NullFreespaceListener.Instance); }; freespaceManager.Listener(freespaceListener); } private class FreespaceInitializingVisitor : IVisitor4 { private readonly IFreespaceListener _freespaceListener; public FreespaceInitializingVisitor(IFreespaceListener listener) { _freespaceListener = listener; } public void Visit(object obj) { Slot slot = (Slot) obj; _freespaceListener.SlotAdded(slot.Length()); } } private class FreespaceListener : IFreespaceListener { public FreespaceListener(IObjectContainer container) { _totalFreespaceCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.TotalFreespace, container, false); _averageSlotSizeCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.FreespaceAverageSlotSize, container, false); _freespaceSlotsCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.FreespaceSlotCount, container, false); _reusedSlotsCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.FreespaceReusedSlotsPerSec, container, false); } public void SlotAdded(int size) { _slotCount++; _totalFreespace += size; AdjustCounters(); } public void SlotRemoved(int size) { _reusedSlotsCounter.Increment(); _slotCount--; _totalFreespace -= size; AdjustCounters(); } private void AdjustCounters() { _totalFreespaceCounter.RawValue = _totalFreespace; _averageSlotSizeCounter.RawValue = AverageSlotSize(_slotCount); _freespaceSlotsCounter.RawValue = _slotCount; } private int AverageSlotSize(int slotCount) { return slotCount == 0 ? 0 : _totalFreespace / slotCount; } public void Dispose() { _totalFreespaceCounter.RemoveInstance(); _totalFreespaceCounter.Dispose(); _averageSlotSizeCounter.Dispose(); _freespaceSlotsCounter.Dispose(); _reusedSlotsCounter.Dispose(); } private readonly PerformanceCounter _totalFreespaceCounter; private readonly PerformanceCounter _averageSlotSizeCounter; private readonly PerformanceCounter _freespaceSlotsCounter; private readonly PerformanceCounter _reusedSlotsCounter; private int _slotCount; private int _totalFreespace; } } } #endif././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/MonitoredStorage.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/MonitoredStor0000644000175000017500000000542311520622624032720 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.IO; namespace Db4objects.Db4o.Monitoring { /// /// Publishes performance counters for bytes read and written. /// public class MonitoredStorage : StorageDecorator { public MonitoredStorage(IStorage storage) : base(storage) { } protected override IBin Decorate(BinConfiguration config, IBin bin) { return new MonitoredBin(bin); } internal class MonitoredBin : BinDecorator { private readonly PerformanceCounter _bytesWrittenCounter; private readonly PerformanceCounter _bytesReadCounter; public MonitoredBin(IBin bin) : base(bin) { _bytesWrittenCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.BytesWrittenPerSec, false); _bytesReadCounter = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.BytesReadPerSec, false); } public override void Write(long position, byte[] bytes, int bytesToWrite) { base.Write(position, bytes, bytesToWrite); _bytesWrittenCounter.IncrementBy(bytesToWrite); } public override int Read(long position, byte[] buffer, int bytesToRead) { int bytesRead = base.Read(position, buffer, bytesToRead); _bytesReadCounter.IncrementBy(bytesRead); return bytesRead; } public override int SyncRead(long position, byte[] bytes, int bytesToRead) { int bytesRead = base.SyncRead(position, bytes, bytesToRead); _bytesReadCounter.IncrementBy(bytesRead); return bytesRead; } public override void Close() { base.Close(); _bytesReadCounter.RemoveInstance(); _bytesReadCounter.Dispose(); _bytesWrittenCounter.Dispose(); } } } } #endif././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/PerformanceCounterSpec.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Monitoring/PerformanceCo0000644000175000017500000002205311520622624032631 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Monitoring { public class PerformanceCounterSpec { private readonly string _id; private readonly string _description; private readonly PerformanceCounterType _counterType; private PerformanceCounterSpec(string id, string description, PerformanceCounterType counterType) { _id = id; _description = description; _counterType = counterType; } public static readonly PerformanceCounterSpec BytesWrittenPerSec = new PerformanceCounterSpec("bytes written/sec", "Bytes written per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec BytesReadPerSec = new PerformanceCounterSpec("bytes read/sec", "Bytes read per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec ObjectsStoredPerSec = new PerformanceCounterSpec("objects stored/sec", "Number of objects stored per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec ObjectsDeletedPerSec = new PerformanceCounterSpec("objects deleted/sec", "Number of objects deleted per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec ObjectsActivatedPerSec = new PerformanceCounterSpec("objects activated/sec", "Number of objects activated per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec ObjectsDeactivatedPerSec = new PerformanceCounterSpec("objects deactivated/sec", "Number of objects deactivated per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec QueriesPerSec = new PerformanceCounterSpec("queries/sec", "Number of queries executed per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec ClassIndexScansPerSec = new PerformanceCounterSpec("class index scans/sec", "Number of queries that could not use field indexes and had to fall back to class index scans per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec NativeQueriesPerSec = new PerformanceCounterSpec("native queries/sec", "Number of native queries executed per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec UnoptimizedNativeQueriesPerSec = new PerformanceCounterSpec("unoptimized native queries/sec", "Number of unoptimized native queries executed per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec NetBytesSentPerSec = new PerformanceCounterSpec("network bytes sent/sec", "Number of bytes sent per second through the socket layer", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec NetBytesReceivedPerSec = new PerformanceCounterSpec("network bytes received/sec", "Number of bytes received per second through the socket layer", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec NetMessagesSentPerSec = new PerformanceCounterSpec("network messages sent/sec", "Number of messages per second through the socket layer", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec NetClientConnections = new PerformanceCounterSpec("number of connected clients", "Number of connected clients", PerformanceCounterType.NumberOfItems32); public static readonly PerformanceCounterSpec FreespaceAverageSlotSize = new PerformanceCounterSpec("average freespace slot size", "Average freespace slot size in bytes", PerformanceCounterType.NumberOfItems32); public static readonly PerformanceCounterSpec FreespaceReusedSlotsPerSec = new PerformanceCounterSpec("reused freespace slots/sec", "Reused freespace slots per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec FreespaceSlotCount = new PerformanceCounterSpec("number of freespace slots", "Number of freespace slots", PerformanceCounterType.NumberOfItems32); public static readonly PerformanceCounterSpec TotalFreespace = new PerformanceCounterSpec("total freespace", "Total freespace in bytes", PerformanceCounterType.NumberOfItems32); public static PerformanceCounterSpec ObjectReferenceCount = new PerformanceCounterSpec("number of object references", "Number of object references", PerformanceCounterType.NumberOfItems32); #if NET_3_5 public static readonly PerformanceCounterSpec LinqQueriesPerSec = new PerformanceCounterSpec("linq queries/sec", "Number of Linq queries executed per second", PerformanceCounterType.RateOfCountsPerSecond32); public static readonly PerformanceCounterSpec UnoptimizedLinqQueriesPerSec = new PerformanceCounterSpec("unoptimized linq queries/sec", "Number of unoptimized Linq queries executed per second", PerformanceCounterType.RateOfCountsPerSecond32); #endif public string Id { get { return _id; } } public static PerformanceCounterSpec[] All() { return new PerformanceCounterSpec[] { BytesWrittenPerSec, BytesReadPerSec, ObjectsStoredPerSec, ObjectsDeletedPerSec, ObjectsActivatedPerSec, ObjectsDeactivatedPerSec, QueriesPerSec, ClassIndexScansPerSec, NativeQueriesPerSec, UnoptimizedNativeQueriesPerSec, NetBytesSentPerSec, NetBytesReceivedPerSec, NetMessagesSentPerSec, NetClientConnections, FreespaceAverageSlotSize, FreespaceReusedSlotsPerSec, FreespaceSlotCount, TotalFreespace, ObjectReferenceCount, #if NET_3_5 LinqQueriesPerSec, UnoptimizedLinqQueriesPerSec, #endif }; } public CounterCreationData CounterCreationData() { return new CounterCreationData(_id, _description, _counterType); } public PerformanceCounter PerformanceCounter(IObjectContainer container) { return Db4oPerformanceCounters.CounterFor(this, container, true); } public PerformanceCounter PerformanceCounter() { return PerformanceCounter(My.Instance); } } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Filestats/0000755000175000017500000000000011520622064027770 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Filestats/FileUsageStatsCollector.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Filestats/FileUsageStats0000644000175000017500000000177111520622624032606 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using Db4objects.Db4o.Internal.Collections; namespace Db4objects.Db4o.Filestats { public partial class FileUsageStatsCollector { private void RegisterBigSetCollector() { MiscCollectors[typeof(BigSet<>).FullName] = new BigSetMiscCollector(); } } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Config/0000755000175000017500000000000011520622054027236 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/native/Db4objects.Db4o/Config/JavaSupport.cs0000644000175000017500000000715511520622624032056 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Config { [Obsolete("Since 8.0")] public class JavaSupport : IConfigurationItem { public void Prepare(IConfiguration config) { AddDb4OBasicAliases(config); AddExceptionAliases(config); AddQueryAliases(config); AddCollectionAliases(config); AddClientServerAliases(config); config.ObjectClass("java.lang.Class").Translate(new TType()); } private static void AddDb4OBasicAliases(IConfiguration config) { config.AddAlias(new WildcardAlias("com.db4o.ext.*", "Db4objects.Db4o.Ext.*, Db4objects.Db4o")); config.AddAlias(new TypeAlias("com.db4o.StaticField", FullyQualifiedName(typeof(StaticField)))); config.AddAlias(new TypeAlias("com.db4o.StaticClass", FullyQualifiedName(typeof(StaticClass)))); } private static void AddCollectionAliases(IConfiguration config) { config.AddAlias(new TypeAlias("com.db4o.foundation.Collection4", FullyQualifiedName(typeof(Collection4)))); config.AddAlias(new TypeAlias("com.db4o.foundation.List4", FullyQualifiedName(typeof(List4)))); } private static void AddClientServerAliases(IConfiguration config) { #if !SILVERLIGHT config.AddAlias(new TypeAlias("com.db4o.User", FullyQualifiedName(typeof(User)))); config.AddAlias(new TypeAlias("com.db4o.cs.internal.messages.MUserMessage$UserMessagePayload", "Db4objects.Db4o.CS.Internal.Messages.MUserMessage+UserMessagePayload, Db4objects.Db4o.CS")); config.AddAlias(new TypeAlias("com.db4o.internal.TransportObjectContainer$KnownObjectIdentity", "Db4objects.Db4o.Internal.TransportObjectContainer+KnownObjectIdentity, Db4objects.Db4o")); config.AddAlias(new WildcardAlias("com.db4o.cs.internal.*", "Db4objects.Db4o.CS.Internal.*, Db4objects.Db4o.CS")); #endif } private static void AddQueryAliases(IConfiguration config) { config.AddAlias(new TypeAlias("com.db4o.query.Evaluation", FullyQualifiedName(typeof(IEvaluation)))); config.AddAlias(new TypeAlias("com.db4o.query.Candidate", FullyQualifiedName(typeof(ICandidate)))); config.AddAlias(new WildcardAlias("com.db4o.internal.query.processor.*", "Db4objects.Db4o.Internal.Query.Processor.*, Db4objects.Db4o")); } private static void AddExceptionAliases(IConfiguration config) { config.AddAlias(new TypeAlias("com.db4o.foundation.ChainedRuntimeException", FullyQualifiedName(typeof(Exception)))); config.AddAlias(new TypeAlias("java.lang.Throwable", FullyQualifiedName(typeof(Exception)))); config.AddAlias(new TypeAlias("java.lang.RuntimeException", FullyQualifiedName(typeof(Exception)))); config.AddAlias(new TypeAlias("java.lang.Exception", FullyQualifiedName(typeof(Exception)))); } private static string FullyQualifiedName(Type type) { return ReflectPlatform.FullyQualifiedName(type); } public void Apply(IInternalObjectContainer container) { } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-Silverlight-2010.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-Silverlight-2010.cspro0000644000175000017500000001534111520622070032253 0ustar directhexdirecthex v3.5 true ../db4objects.snk Debug AnyCPU 9.0.30729 2.0 {97B6DEA6-255B-4B49-8973-38943AC2E70C} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o.Optional Db4objects.Db4o.Optional v4.0 false true true true ../db4objects.snk Silverlight $(TargetFrameworkVersion) 3.5 true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-2008.csproj0000644000175000017500000001553011520622042030141 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Library Properties Db4objects.Db4o.Optional Db4objects.Db4o.Optional 2.0 v3.5 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;POLL_SOCKET;NET_3_5 prompt 4 bin\Debug\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5 prompt 4 bin\Release\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; False ..\Libs\net-2.0\Cecil.FlowAnalysis.dll False ..\Libs\net-2.0\Mono.Cecil.dll 3.5 {23531440-0922-43EB-A483-6592FFC2F093} Db4objects.Db4o.Linq-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o.Optional-2010.csproj0000644000175000017500000002036611520622042030135 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Library Properties Db4objects.Db4o.Optional Db4objects.Db4o.Optional 3.5 v4.0 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;POLL_SOCKET;NET_3_5;NET_4_0 prompt 4 bin\Debug\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;POLL_SOCKET;NET_3_5;NET_4_0 prompt 4 bin\Release\Db4objects.Db4o.Optional.xml 1591;1572;1573;1574;0419; False ..\Libs\net-2.0\Cecil.FlowAnalysis.dll False ..\Libs\net-2.0\Mono.Cecil.dll 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {23531440-0922-43EB-A483-6592FFC2F093} Db4objects.Db4o.Linq-2010 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/0000755000175000017500000000000011520622054024543 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/0000755000175000017500000000000011520622054026670 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/IReferenceSystemListener.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/IReferenceSystemList0000644000175000017500000000152511520622624032671 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Monitoring { /// public interface IReferenceSystemListener { void NotifyReferenceCountChanged(int changedBy); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/Internal/0000755000175000017500000000000011520622044030443 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/Internal/MonitoringReferenceSystem.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Monitoring/Internal/MonitoringR0000644000175000017500000000721611520622624032647 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.References; using Db4objects.Db4o.Monitoring; namespace Db4objects.Db4o.Monitoring.Internal { /// public class MonitoringReferenceSystem : TransactionalReferenceSystemBase, IReferenceSystem { private readonly IReferenceSystemListener _referenceSystemListener; private int _referenceCount; public MonitoringReferenceSystem(IReferenceSystemListener referenceSystem) { _referenceSystemListener = referenceSystem; } public override void Commit() { IntByRef removedReferenceCount = new IntByRef(); TraverseNewReferences(new _IVisitor4_26(this, removedReferenceCount)); CreateNewReferences(); ReferenceCountChanged(-removedReferenceCount.value); } private sealed class _IVisitor4_26 : IVisitor4 { public _IVisitor4_26(MonitoringReferenceSystem _enclosing, IntByRef removedReferenceCount ) { this._enclosing = _enclosing; this.removedReferenceCount = removedReferenceCount; } public void Visit(object obj) { ObjectReference oref = (ObjectReference)obj; if (oref.GetObject() != null) { this._enclosing._committedReferences.AddExistingReference(oref); } else { removedReferenceCount.value++; } } private readonly MonitoringReferenceSystem _enclosing; private readonly IntByRef removedReferenceCount; } public override void AddExistingReference(ObjectReference @ref) { _committedReferences.AddExistingReference(@ref); ReferenceCountChanged(1); } public override void AddNewReference(ObjectReference @ref) { _newReferences.AddNewReference(@ref); ReferenceCountChanged(1); } public override void RemoveReference(ObjectReference @ref) { if (_newReferences.ReferenceForId(@ref.GetID()) != null) { _newReferences.RemoveReference(@ref); ReferenceCountChanged(-1); } if (_committedReferences.ReferenceForId(@ref.GetID()) != null) { _committedReferences.RemoveReference(@ref); ReferenceCountChanged(-1); } } public override void Rollback() { IntByRef newReferencesCount = new IntByRef(); TraverseNewReferences(new _IVisitor4_63(newReferencesCount)); CreateNewReferences(); ReferenceCountChanged(-newReferencesCount.value); } private sealed class _IVisitor4_63 : IVisitor4 { public _IVisitor4_63(IntByRef newReferencesCount) { this.newReferencesCount = newReferencesCount; } public void Visit(object obj) { newReferencesCount.value++; } private readonly IntByRef newReferencesCount; } private void ReferenceCountChanged(int changedBy) { if (changedBy == 0) { return; } _referenceCount += changedBy; _referenceSystemListener.NotifyReferenceCountChanged(changedBy); } public virtual void Discarded() { ReferenceCountChanged(-_referenceCount); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/0000755000175000017500000000000011520622070026477 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/ClassNode.cs0000644000175000017500000000547311520622624030717 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Collections; using Db4objects.Db4o.Internal; using Sharpen.Util; namespace Db4objects.Db4o.Filestats { /// public class ClassNode { public static Sharpen.Util.ISet BuildHierarchy(ClassMetadataRepository repository ) { ClassMetadataIterator classIter = repository.Iterator(); IDictionary nodes = new Hashtable(); Sharpen.Util.ISet roots = new HashSet(); while (classIter.MoveNext()) { Db4objects.Db4o.Internal.ClassMetadata clazz = classIter.CurrentClass(); Db4objects.Db4o.Filestats.ClassNode node = new Db4objects.Db4o.Filestats.ClassNode (clazz); nodes[clazz.GetName()] = node; if (clazz.GetAncestor() == null) { roots.Add(node); } } for (IEnumerator nodeIter = nodes.Values.GetEnumerator(); nodeIter.MoveNext(); ) { Db4objects.Db4o.Filestats.ClassNode node = ((Db4objects.Db4o.Filestats.ClassNode) nodeIter.Current); Db4objects.Db4o.Internal.ClassMetadata ancestor = node.ClassMetadata().GetAncestor (); if (ancestor != null) { ((Db4objects.Db4o.Filestats.ClassNode)nodes[ancestor.GetName()]).AddSubClass(node ); } } return roots; } private readonly Db4objects.Db4o.Internal.ClassMetadata _clazz; private readonly Sharpen.Util.ISet _subClasses = new HashSet(); public ClassNode(Db4objects.Db4o.Internal.ClassMetadata clazz) { _clazz = clazz; } public virtual Db4objects.Db4o.Internal.ClassMetadata ClassMetadata() { return _clazz; } internal virtual void AddSubClass(Db4objects.Db4o.Filestats.ClassNode node) { _subClasses.Add(node); } public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } return _clazz.GetName().Equals(((Db4objects.Db4o.Filestats.ClassNode)obj)._clazz. GetName()); } public override int GetHashCode() { return _clazz.GetName().GetHashCode(); } public virtual IEnumerable SubClasses() { return _subClasses; } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/FileUsageStatsUtil.cs0000644000175000017500000000233311520622624032555 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT namespace Db4objects.Db4o.Filestats { /// public sealed class FileUsageStatsUtil { private static readonly string Padding = " "; private FileUsageStatsUtil() { } public static string FormatLine(string label, long amount) { return PadLeft(label, 20) + ": " + PadLeft(amount.ToString(), 12) + "\n"; } private static string PadLeft(string val, int len) { return Sharpen.Runtime.Substring(Padding, 0, len - val.Length) + val; } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/SlotMapImpl.cs0000644000175000017500000000746011520622624031243 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Collections; using System.Text; using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Filestats { /// public class SlotMapImpl : ISlotMap { private TreeIntObject _slots = null; private readonly long _fileLength; public SlotMapImpl(long fileLength) { _fileLength = fileLength; } public virtual void Add(Slot slot) { _slots = ((TreeIntObject)Tree.Add(_slots, new TreeIntObject(slot.Address(), slot) )); } public virtual IList Merged() { IList mergedSlots = new ArrayList(); ByRef mergedSlot = ByRef.NewInstance(new Slot(0, 0)); Tree.Traverse(_slots, new _IVisitor4_32(mergedSlot, mergedSlots)); mergedSlots.Add(((Slot)mergedSlot.value)); return mergedSlots; } private sealed class _IVisitor4_32 : IVisitor4 { public _IVisitor4_32(ByRef mergedSlot, IList mergedSlots) { this.mergedSlot = mergedSlot; this.mergedSlots = mergedSlots; } public void Visit(object node) { Slot curSlot = ((Slot)((TreeIntObject)node)._object); if (((Slot)mergedSlot.value).Address() + ((Slot)mergedSlot.value).Length() == curSlot .Address()) { mergedSlot.value = new Slot(((Slot)mergedSlot.value).Address(), ((Slot)mergedSlot .value).Length() + curSlot.Length()); } else { mergedSlots.Add(((Slot)mergedSlot.value)); mergedSlot.value = curSlot; } } private readonly ByRef mergedSlot; private readonly IList mergedSlots; } public virtual IList Gaps(long length) { IList merged = Merged(); IList gaps = new ArrayList(); if (merged.Count == 0) { return gaps; } bool isFirst = true; Slot prevSlot = null; for (IEnumerator curSlotIter = merged.GetEnumerator(); curSlotIter.MoveNext(); ) { Slot curSlot = ((Slot)curSlotIter.Current); if (isFirst) { prevSlot = curSlot; if (prevSlot.Address() > 0) { gaps.Add(new Slot(0, prevSlot.Address())); } isFirst = false; } else { int gapStart = prevSlot.Address() + prevSlot.Length(); gaps.Add(new Slot(gapStart, curSlot.Address() - gapStart)); prevSlot = curSlot; } } int afterlast = prevSlot.Address() + prevSlot.Length(); if (afterlast < length) { gaps.Add(new Slot(afterlast, (int)(length - afterlast))); } return gaps; } public override string ToString() { StringBuilder str = new StringBuilder(); str.Append("SLOTS:\n"); LogSlots(Merged(), str); str.Append("GAPS:"); LogSlots(Gaps(_fileLength), str); return str.ToString(); } private void LogSlots(IEnumerable slots, StringBuilder str) { int totalLength = 0; for (IEnumerator gapIter = slots.GetEnumerator(); gapIter.MoveNext(); ) { Slot gap = ((Slot)gapIter.Current); totalLength += gap.Length(); str.Append(gap).Append("\n"); } str.Append("TOTAL: ").Append(totalLength).Append("\n"); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/ISlotMap.cs0000644000175000017500000000171111520622624030523 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Collections; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Filestats { /// public interface ISlotMap { void Add(Slot slot); IList Merged(); IList Gaps(long length); } } #endif // !SILVERLIGHT ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/BigSetMiscCollector.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/BigSetMiscCollector.c0000644000175000017500000000235011520622624032510 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4objects.Db4o.Filestats { /// internal class BigSetMiscCollector : IMiscCollector { public virtual long CollectFor(LocalObjectContainer db, int id, ISlotMap slotMap) { object bigSet = db.GetByID(id); db.Activate(bigSet, 1); BTree btree = (BTree)Reflection4.GetFieldValue(bigSet, "_bTree"); return FileUsageStatsCollector.BTreeUsage(db, btree, slotMap); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/ClassUsageStats.cs0000644000175000017500000000664311520622624032115 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Text; using Db4objects.Db4o.Filestats; namespace Db4objects.Db4o.Filestats { /// Statistics for the byte usage for a single class (instances, indices, etc.) in a db4o database file. /// /// Statistics for the byte usage for a single class (instances, indices, etc.) in a db4o database file. /// /// public class ClassUsageStats { private readonly string _className; private readonly long _slotUsage; private readonly long _classIndexUsage; private readonly long _fieldIndexUsage; private readonly long _miscUsage; internal ClassUsageStats(string className, long slotSpace, long classIndexUsage, long fieldIndexUsage, long miscUsage) { _className = className; _slotUsage = slotSpace; _classIndexUsage = classIndexUsage; _fieldIndexUsage = fieldIndexUsage; _miscUsage = miscUsage; } /// the name of the persistent class public virtual string ClassName() { return _className; } /// number of bytes used slots containing the actual class instances public virtual long SlotUsage() { return _slotUsage; } /// number of bytes used for the index of class instances public virtual long ClassIndexUsage() { return _classIndexUsage; } /// number of bytes used for field indexes, if any public virtual long FieldIndexUsage() { return _fieldIndexUsage; } /// /// number of bytes used for features that are specific to this class (ex.: the BTree encapsulated within a /// Db4objects.Db4o.Internal.Collections.BigSet<E> /// /// instance) /// public virtual long MiscUsage() { return _miscUsage; } /// aggregated byte usage for this persistent class public virtual long TotalUsage() { return _slotUsage + _classIndexUsage + _fieldIndexUsage + _miscUsage; } public override string ToString() { StringBuilder str = new StringBuilder(); ToString(str); return str.ToString(); } internal virtual void ToString(StringBuilder str) { str.Append(ClassName()).Append("\n"); str.Append(FileUsageStatsUtil.FormatLine("Slots", SlotUsage())); str.Append(FileUsageStatsUtil.FormatLine("Class index", ClassIndexUsage())); str.Append(FileUsageStatsUtil.FormatLine("Field indices", FieldIndexUsage())); if (MiscUsage() > 0) { str.Append(FileUsageStatsUtil.FormatLine("Misc", MiscUsage())); } str.Append(FileUsageStatsUtil.FormatLine("Total", TotalUsage())); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/NullSlotMap.cs0000644000175000017500000000227711520622624031255 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Collections; using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Filestats { /// public class NullSlotMap : ISlotMap { public virtual void Add(Slot slot) { } public virtual IList Merged() { return new ArrayList(); } public virtual IList Gaps(long length) { return new ArrayList(); } public override string ToString() { return string.Empty; } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/MiscCollector.cs0000644000175000017500000000171611520622624031602 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.Filestats { /// internal interface IMiscCollector { long CollectFor(LocalObjectContainer db, int id, ISlotMap slotMap); } } #endif // !SILVERLIGHT ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/FileUsageStatsCollector.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/FileUsageStatsCollect0000644000175000017500000003234111520622624032623 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Fileheader; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Filestats { /// /// Collects database file usage statistics and prints them /// to the console. /// /// /// Collects database file usage statistics and prints them /// to the console. /// public partial class FileUsageStatsCollector { private readonly IDictionary MiscCollectors; /// Usage: FileUsageStatsCollector [] public static void Main(string[] args) { string dbPath = args[0]; bool collectSlots = args.Length > 1 && "true".Equals(args[1]); Sharpen.Runtime.Out.WriteLine(dbPath + ": " + new Sharpen.IO.File(dbPath).Length( )); FileUsageStats stats = RunStats(dbPath, collectSlots); Sharpen.Runtime.Out.WriteLine(stats); } public static FileUsageStats RunStats(string dbPath) { return RunStats(dbPath, false); } public static FileUsageStats RunStats(string dbPath, bool collectSlots) { return RunStats(dbPath, collectSlots, Db4oEmbedded.NewConfiguration()); } public static FileUsageStats RunStats(string dbPath, bool collectSlots, IEmbeddedConfiguration config) { IEmbeddedObjectContainer db = Db4oEmbedded.OpenFile(config, dbPath); try { return new Db4objects.Db4o.Filestats.FileUsageStatsCollector(db, collectSlots).CollectStats (); } finally { db.Close(); } } private readonly LocalObjectContainer _db; private FileUsageStats _stats; private IBlockConverter _blockConverter; private readonly ISlotMap _slots; public FileUsageStatsCollector(IObjectContainer db, bool collectSlots) { MiscCollectors = new Hashtable(); RegisterBigSetCollector(); _db = (LocalObjectContainer)db; byte blockSize = _db.BlockSize(); _blockConverter = blockSize > 1 ? (IBlockConverter)new BlockSizeBlockConverter(blockSize ) : (IBlockConverter)new DisabledBlockConverter(); _slots = collectSlots ? (ISlotMap)new SlotMapImpl(_db.FileLength()) : (ISlotMap)new NullSlotMap(); } public virtual FileUsageStats CollectStats() { _stats = new FileUsageStats(_db.FileLength(), FileHeaderUsage(), IdSystemUsage(), Freespace(), ClassMetadataUsage(), FreespaceUsage(), UuidUsage(), _slots, CommitTimestampUsage ()); Sharpen.Util.ISet classRoots = ClassNode.BuildHierarchy(_db.ClassCollection()); for (IEnumerator classRootIter = classRoots.GetEnumerator(); classRootIter.MoveNext (); ) { ClassNode classRoot = ((ClassNode)classRootIter.Current); CollectClassSlots(classRoot.ClassMetadata()); CollectClassStats(_stats, classRoot); } return _stats; } private long CollectClassStats(FileUsageStats stats, ClassNode classNode) { long subClassSlotUsage = 0; for (IEnumerator curSubClassIter = classNode.SubClasses().GetEnumerator(); curSubClassIter .MoveNext(); ) { ClassNode curSubClass = ((ClassNode)curSubClassIter.Current); subClassSlotUsage += CollectClassStats(stats, curSubClass); } ClassMetadata clazz = classNode.ClassMetadata(); long classIndexUsage = 0; if (clazz.HasClassIndex()) { classIndexUsage = BTreeUsage(((BTreeClassIndexStrategy)clazz.Index()).Btree()); } long fieldIndexUsage = FieldIndexUsage(clazz); FileUsageStatsCollector.InstanceUsage instanceUsage = ClassSlotUsage(clazz); long totalSlotUsage = instanceUsage.slotUsage; long ownSlotUsage = totalSlotUsage - subClassSlotUsage; ClassUsageStats classStats = new ClassUsageStats(clazz.GetName(), ownSlotUsage, classIndexUsage , fieldIndexUsage, instanceUsage.miscUsage); stats.AddClassStats(classStats); return totalSlotUsage; } private long FieldIndexUsage(ClassMetadata classMetadata) { LongByRef usage = new LongByRef(); classMetadata.TraverseDeclaredFields(new _IProcedure4_125(this, usage)); return usage.value; } private sealed class _IProcedure4_125 : IProcedure4 { public _IProcedure4_125(FileUsageStatsCollector _enclosing, LongByRef usage) { this._enclosing = _enclosing; this.usage = usage; } public void Apply(object field) { if (((FieldMetadata)field).IsVirtual() || !((FieldMetadata)field).HasIndex()) { return; } usage.value += this._enclosing.BTreeUsage(((FieldMetadata)field).GetIndex(this._enclosing ._db.SystemTransaction())); } private readonly FileUsageStatsCollector _enclosing; private readonly LongByRef usage; } private long BTreeUsage(BTree btree) { return BTreeUsage(_db, btree, _slots); } internal static long BTreeUsage(LocalObjectContainer db, BTree btree, ISlotMap slotMap ) { return BTreeUsage(db.SystemTransaction(), db.IdSystem(), btree, slotMap); } private static long BTreeUsage(Transaction transaction, IIdSystem idSystem, BTree btree, ISlotMap slotMap) { IEnumerator nodeIter = btree.AllNodeIds(transaction); Db4objects.Db4o.Internal.Slots.Slot btreeSlot = idSystem.CommittedSlot(btree.GetID ()); slotMap.Add(btreeSlot); long usage = btreeSlot.Length(); while (nodeIter.MoveNext()) { int curNodeId = ((int)nodeIter.Current); Db4objects.Db4o.Internal.Slots.Slot slot = idSystem.CommittedSlot(curNodeId); slotMap.Add(slot); usage += slot.Length(); } return usage; } private FileUsageStatsCollector.InstanceUsage ClassSlotUsage(ClassMetadata clazz) { if (!clazz.HasClassIndex()) { return new FileUsageStatsCollector.InstanceUsage(0, 0); } IMiscCollector miscCollector = ((IMiscCollector)MiscCollectors[clazz.GetName()]); LongByRef slotUsage = new LongByRef(); LongByRef miscUsage = new LongByRef(); BTreeClassIndexStrategy index = (BTreeClassIndexStrategy)clazz.Index(); index.TraverseAll(_db.SystemTransaction(), new _IVisitor4_166(this, slotUsage, miscCollector , miscUsage)); return new FileUsageStatsCollector.InstanceUsage(slotUsage.value, miscUsage.value ); } private sealed class _IVisitor4_166 : IVisitor4 { public _IVisitor4_166(FileUsageStatsCollector _enclosing, LongByRef slotUsage, IMiscCollector miscCollector, LongByRef miscUsage) { this._enclosing = _enclosing; this.slotUsage = slotUsage; this.miscCollector = miscCollector; this.miscUsage = miscUsage; } public void Visit(object id) { slotUsage.value += this._enclosing.SlotSizeForId((((int)id))); if (miscCollector != null) { miscUsage.value += miscCollector.CollectFor(this._enclosing._db, (((int)id)), this ._enclosing._slots); } } private readonly FileUsageStatsCollector _enclosing; private readonly LongByRef slotUsage; private readonly IMiscCollector miscCollector; private readonly LongByRef miscUsage; } private void CollectClassSlots(ClassMetadata clazz) { if (!clazz.HasClassIndex()) { return; } BTreeClassIndexStrategy index = (BTreeClassIndexStrategy)clazz.Index(); index.TraverseAll(_db.SystemTransaction(), new _IVisitor4_182(this)); } private sealed class _IVisitor4_182 : IVisitor4 { public _IVisitor4_182(FileUsageStatsCollector _enclosing) { this._enclosing = _enclosing; } public void Visit(object id) { this._enclosing._slots.Add(this._enclosing.Slot((((int)id)))); } private readonly FileUsageStatsCollector _enclosing; } private long Freespace() { _db.FreespaceManager().Traverse(new _IVisitor4_190(this)); return _db.FreespaceManager().TotalFreespace(); } private sealed class _IVisitor4_190 : IVisitor4 { public _IVisitor4_190(FileUsageStatsCollector _enclosing) { this._enclosing = _enclosing; } public void Visit(object slot) { this._enclosing._slots.Add(((Db4objects.Db4o.Internal.Slots.Slot)slot)); } private readonly FileUsageStatsCollector _enclosing; } private long FreespaceUsage() { return FreespaceUsage(_db.FreespaceManager()); } private long FreespaceUsage(IFreespaceManager fsm) { if (fsm is InMemoryFreespaceManager) { return 0; } if (fsm is BTreeFreespaceManager) { return BTreeUsage((BTree)FieldValue(fsm, "_slotsByAddress")) + BTreeUsage((BTree) FieldValue(fsm, "_slotsByLength")); } if (fsm is BlockAwareFreespaceManager) { return FreespaceUsage((IFreespaceManager)FieldValue(fsm, "_delegate")); } throw new InvalidOperationException("Unknown freespace manager: " + fsm); } private long IdSystemUsage() { IIdSystem idSystem = _db.IdSystem(); long usage = 0; while (idSystem is BTreeIdSystem) { IIdSystem parentIdSystem = ((IIdSystem)FieldValue(idSystem, "_parentIdSystem")); usage += BTreeUsage(_db.SystemTransaction(), parentIdSystem, (BTree)FieldValue(idSystem , "_bTree"), _slots); PersistentIntegerArray persistentState = (PersistentIntegerArray)FieldValue(idSystem , "_persistentState"); int persistentStateId = persistentState.GetID(); Db4objects.Db4o.Internal.Slots.Slot persistentStateSlot = parentIdSystem.CommittedSlot (persistentStateId); _slots.Add(persistentStateSlot); usage += persistentStateSlot.Length(); idSystem = parentIdSystem; } if (idSystem is InMemoryIdSystem) { Db4objects.Db4o.Internal.Slots.Slot idSystemSlot = ((Db4objects.Db4o.Internal.Slots.Slot )FieldValue(idSystem, "_slot")); usage += idSystemSlot.Length(); _slots.Add(idSystemSlot); } return usage; } private long ClassMetadataUsage() { Db4objects.Db4o.Internal.Slots.Slot classRepositorySlot = Slot(_db.ClassCollection ().GetID()); _slots.Add(classRepositorySlot); long usage = classRepositorySlot.Length(); IEnumerator classIdIter = _db.ClassCollection().Ids(); while (classIdIter.MoveNext()) { int curClassId = (((int)classIdIter.Current)); Db4objects.Db4o.Internal.Slots.Slot classSlot = Slot(curClassId); _slots.Add(classSlot); usage += classSlot.Length(); } return usage; } private long FileHeaderUsage() { int headerLength = _db.GetFileHeader().Length(); int usage = _blockConverter.BlockAlignedBytes(headerLength); FileHeaderVariablePart2 variablePart = (FileHeaderVariablePart2)FieldValue(_db.GetFileHeader (), "_variablePart"); usage += _blockConverter.BlockAlignedBytes(variablePart.MarshalledLength()); _slots.Add(new Db4objects.Db4o.Internal.Slots.Slot(0, headerLength)); _slots.Add(new Db4objects.Db4o.Internal.Slots.Slot(variablePart.Address(), variablePart .MarshalledLength())); return usage; } private long UuidUsage() { if (_db.SystemData().UuidIndexId() <= 0) { return 0; } BTree index = _db.UUIDIndex().GetIndex(_db.SystemTransaction()); return index == null ? 0 : BTreeUsage(index); } private long CommitTimestampUsage() { LocalTransaction st = (LocalTransaction)_db.SystemTransaction(); CommitTimestampSupport commitTimestampSupport = st.CommitTimestampSupport(); if (commitTimestampSupport == null) { return 0; } BTree idToTimestampBtree = commitTimestampSupport.IdToTimestamp(); long idToTimestampBTreeSize = idToTimestampBtree == null ? 0 : BTreeUsage(idToTimestampBtree ); BTree timestampToIdBtree = commitTimestampSupport.TimestampToId(); long timestampToIdBTreeSize = timestampToIdBtree == null ? 0 : BTreeUsage(timestampToIdBtree ); return idToTimestampBTreeSize + timestampToIdBTreeSize; } private int SlotSizeForId(int id) { return Slot(id).Length(); } private static object FieldValue(object parent, string fieldName) { return (object)Reflection4.GetFieldValue(parent, fieldName); } private class InstanceUsage { public readonly long slotUsage; public readonly long miscUsage; public InstanceUsage(long slotUsage, long miscUsage) { this.slotUsage = slotUsage; this.miscUsage = miscUsage; } } private Slot Slot(int id) { return _db.IdSystem().CommittedSlot(id); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Filestats/FileUsageStats.cs0000644000175000017500000001432411520622624031722 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System.Collections; using System.Text; using Db4objects.Db4o.Filestats; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Filestats { /// Byte usage statistics for a db4o database file public class FileUsageStats { private TreeStringObject _classUsageStats = null; private long _fileSize; private readonly long _fileHeader; private readonly long _freespace; private readonly long _idSystem; private readonly long _classMetadata; private readonly long _freespaceUsage; private readonly long _uuidUsage; private readonly long _commitTimestampUsage; private readonly ISlotMap _slots; internal FileUsageStats(long fileSize, long fileHeader, long idSystem, long freespace , long classMetadata, long freespaceUsage, long uuidUsage, ISlotMap slots, long commitTimestampUsage) { _fileSize = fileSize; _fileHeader = fileHeader; _idSystem = idSystem; _freespace = freespace; _classMetadata = classMetadata; _freespaceUsage = freespaceUsage; _uuidUsage = uuidUsage; _slots = slots; _commitTimestampUsage = commitTimestampUsage; } /// bytes used by the db4o file header (static and variable parts) public virtual long FileHeader() { return _fileHeader; } /// total number of bytes registered as freespace, available for reuse public virtual long Freespace() { return _freespace; } /// bytes used by the id system indices public virtual long IdSystem() { return _idSystem; } /// number of bytes used for class metadata (class metadata repository and schema definitions) /// public virtual long ClassMetadata() { return _classMetadata; } /// number of bytes used for the bookkeeping of the freespace system itself public virtual long FreespaceUsage() { return _freespaceUsage; } /// number of bytes used for the uuid index public virtual long UuidUsage() { return _uuidUsage; } /// number of bytes used for the commit timestamp indexes public virtual long CommitTimestampUsage() { return _commitTimestampUsage; } /// total file size in bytes public virtual long FileSize() { return _fileSize; } /// /// number of bytes used aggregated from all categories - should always be equal to /// FileSize() /// public virtual long TotalUsage() { LongByRef total = new LongByRef(_fileHeader + _freespace + _idSystem + _classMetadata + _freespaceUsage + _uuidUsage + _commitTimestampUsage); Tree.Traverse(_classUsageStats, new _IVisitor4_98(total)); return total.value; } private sealed class _IVisitor4_98 : IVisitor4 { public _IVisitor4_98(LongByRef total) { this.total = total; } public void Visit(object node) { total.value += ((Db4objects.Db4o.Filestats.ClassUsageStats)((TreeStringObject)node )._value).TotalUsage(); } private readonly LongByRef total; } /// the statistics for each persisted class public virtual IEnumerator ClassUsageStats() { return new TreeNodeIterator(_classUsageStats); } /// a fully qualified class name /// the statistics for the class with the given name public virtual Db4objects.Db4o.Filestats.ClassUsageStats ClassStats(string name) { TreeStringObject found = (TreeStringObject)Tree.Find(_classUsageStats, new TreeStringObject (name, null)); return found == null ? null : ((Db4objects.Db4o.Filestats.ClassUsageStats)found._value ); } public override string ToString() { StringBuilder str = new StringBuilder(); Tree.Traverse(_classUsageStats, new _IVisitor4_124(str)); str.Append("\n"); str.Append(FileUsageStatsUtil.FormatLine("File header", FileHeader())); str.Append(FileUsageStatsUtil.FormatLine("Freespace", Freespace())); str.Append(FileUsageStatsUtil.FormatLine("ID system", IdSystem())); str.Append(FileUsageStatsUtil.FormatLine("Class metadata", ClassMetadata())); str.Append(FileUsageStatsUtil.FormatLine("Freespace usage", FreespaceUsage())); str.Append(FileUsageStatsUtil.FormatLine("UUID usage", UuidUsage())); str.Append(FileUsageStatsUtil.FormatLine("Version usage", CommitTimestampUsage()) ); str.Append("\n"); long totalUsage = TotalUsage(); str.Append(FileUsageStatsUtil.FormatLine("Total", totalUsage)); str.Append(FileUsageStatsUtil.FormatLine("Unaccounted", FileSize() - totalUsage)); str.Append(FileUsageStatsUtil.FormatLine("File", FileSize())); str.Append(_slots); return str.ToString(); } private sealed class _IVisitor4_124 : IVisitor4 { public _IVisitor4_124(StringBuilder str) { this.str = str; } public void Visit(object node) { ((Db4objects.Db4o.Filestats.ClassUsageStats)((TreeStringObject)node)._value).ToString (str); } private readonly StringBuilder str; } internal virtual void AddClassStats(Db4objects.Db4o.Filestats.ClassUsageStats classStats ) { _classUsageStats = ((TreeStringObject)Tree.Add(_classUsageStats, new TreeStringObject (classStats.ClassName(), classStats))); } internal virtual void AddSlot(Slot slot) { _slots.Add(slot); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Tools/0000755000175000017500000000000011520622042025640 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Tools/Statistics.cs0000644000175000017500000001447411520622624030341 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Tools; namespace Db4objects.Db4o.Tools { /// prints statistics about a database file to System.out. /// /// prints statistics about a database file to System.out. ///

Pass the database file path as an argument. ///

This class is not part of db4o.jar!
/// It is delivered as sourcecode in the /// path ../com/db4o/tools/

///
public class Statistics { /// the main method that runs the statistics. /// the main method that runs the statistics. /// /// a String array of length 1, with the name of the database /// file as element 0. /// public static void Main(string[] args) { if (args == null || args.Length != 1) { Sharpen.Runtime.Out.WriteLine("Usage: java com.db4o.tools.Statistics " ); } else { new Statistics().Run(args[0]); } } public virtual void Run(string filename) { if (new Sharpen.IO.File(filename).Exists()) { IObjectContainer con = null; try { IConfiguration config = Db4oFactory.NewConfiguration(); config.MessageLevel(-1); con = Db4oFactory.OpenFile(config, filename); PrintHeader("STATISTICS"); Sharpen.Runtime.Out.WriteLine("File: " + filename); PrintStats(con, filename); con.Close(); } catch (Exception e) { Sharpen.Runtime.Out.WriteLine("Statistics failed for file: '" + filename + "'"); Sharpen.Runtime.Out.WriteLine(e.Message); Sharpen.Runtime.PrintStackTrace(e); } } else { Sharpen.Runtime.Out.WriteLine("File not found: '" + filename + "'"); } } private static bool CanCallConstructor(string className) { return ReflectPlatform.CreateInstance(className) != null; } private void PrintStats(IObjectContainer con, string filename) { Tree unavailable = new TreeString(Remove); Tree noConstructor = new TreeString(Remove); // one element too many, substract one in the end IStoredClass[] internalClasses = con.Ext().StoredClasses(); for (int i = 0; i < internalClasses.Length; i++) { string internalClassName = internalClasses[i].GetName(); Type clazz = ReflectPlatform.ForName(internalClassName); if (clazz == null) { unavailable = unavailable.Add(new TreeString(internalClassName)); } else { if (!CanCallConstructor(internalClassName)) { noConstructor = noConstructor.Add(new TreeString(internalClassName)); } } } unavailable = unavailable.RemoveLike(new TreeString(Remove)); noConstructor = noConstructor.RemoveLike(new TreeString(Remove)); if (unavailable != null) { PrintHeader("UNAVAILABLE"); unavailable.Traverse(new _IVisitor4_80()); } if (noConstructor != null) { PrintHeader("NO PUBLIC CONSTRUCTOR"); noConstructor.Traverse(new _IVisitor4_88()); } PrintHeader("CLASSES"); Sharpen.Runtime.Out.WriteLine("Number of objects per class:"); ByRef ids = ByRef.NewInstance(new TreeInt(0)); if (internalClasses.Length > 0) { Tree all = new TreeStringObject(internalClasses[0].GetName(), internalClasses[0]); for (int i = 1; i < internalClasses.Length; i++) { all = all.Add(new TreeStringObject(internalClasses[i].GetName(), internalClasses[ i])); } all.Traverse(new _IVisitor4_107(ids)); } PrintHeader("SUMMARY"); Sharpen.Runtime.Out.WriteLine("File: " + filename); Sharpen.Runtime.Out.WriteLine("Stored classes: " + internalClasses.Length); if (unavailable != null) { Sharpen.Runtime.Out.WriteLine("Unavailable classes: " + unavailable.Size()); } if (noConstructor != null) { Sharpen.Runtime.Out.WriteLine("Classes without public constructors: " + noConstructor .Size()); } Sharpen.Runtime.Out.WriteLine("Total number of objects: " + (((Tree)ids.value).Size () - 1)); } private sealed class _IVisitor4_80 : IVisitor4 { public _IVisitor4_80() { } public void Visit(object obj) { Sharpen.Runtime.Out.WriteLine(((TreeString)obj)._key); } } private sealed class _IVisitor4_88 : IVisitor4 { public _IVisitor4_88() { } public void Visit(object obj) { Sharpen.Runtime.Out.WriteLine(((TreeString)obj)._key); } } private sealed class _IVisitor4_107 : IVisitor4 { public _IVisitor4_107(ByRef ids) { this.ids = ids; } public void Visit(object obj) { TreeStringObject node = (TreeStringObject)obj; long[] newIDs = ((IStoredClass)node._value).GetIDs(); for (int j = 0; j < newIDs.Length; j++) { if (((Tree)ids.value).Find(new TreeInt((int)newIDs[j])) == null) { ids.value = ((TreeInt)((Tree)ids.value).Add(new TreeInt((int)newIDs[j]))); } } Sharpen.Runtime.Out.WriteLine(node._key + ": " + newIDs.Length); } private readonly ByRef ids; } private void PrintHeader(string str) { int stars = (39 - str.Length) / 2; Sharpen.Runtime.Out.WriteLine("\n"); for (int i = 0; i < stars; i++) { Sharpen.Runtime.Out.Write("*"); } Sharpen.Runtime.Out.Write(" " + str + " "); for (int i = 0; i < stars; i++) { Sharpen.Runtime.Out.Write("*"); } Sharpen.Runtime.Out.WriteLine(); } private static readonly string Remove = "XXxxREMOVExxXX"; } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Foundation/0000755000175000017500000000000011520622064026652 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Foundation/TreeStringObject.cs0000644000175000017500000000221311520622624032416 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; namespace Db4objects.Db4o.Foundation { public class TreeStringObject : TreeString { public readonly object _value; public TreeStringObject(string key, object value) : base(key) { this._value = value; } public override object ShallowClone() { Db4objects.Db4o.Foundation.TreeStringObject tso = new Db4objects.Db4o.Foundation.TreeStringObject (_key, _value); return ShallowCloneInternal(tso); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Foundation/TreeString.cs0000644000175000017500000000306211520622624031272 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers; namespace Db4objects.Db4o.Foundation { public class TreeString : Tree { public string _key; public TreeString(string key) { this._key = key; } protected override Tree ShallowCloneInternal(Tree tree) { Db4objects.Db4o.Foundation.TreeString ts = (Db4objects.Db4o.Foundation.TreeString )base.ShallowCloneInternal(tree); ts._key = _key; return ts; } public override object ShallowClone() { return ShallowCloneInternal(new Db4objects.Db4o.Foundation.TreeString(_key)); } public override int Compare(Tree to) { return StringHandler.Compare(Const4.stringIO.Write(_key), Const4.stringIO.Write(( (Db4objects.Db4o.Foundation.TreeString)to)._key)); } public override object Key() { return _key; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Consistency/0000755000175000017500000000000011520622040027037 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Consistency/ConsistencyChecker.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Consistency/ConsistencyChecker.0000644000175000017500000002643311520622624032646 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using System.Text; using Db4objects.Db4o; using Db4objects.Db4o.Consistency; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Classindex; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4objects.Db4o.Consistency { public class ConsistencyChecker { private readonly LocalObjectContainer _db; private readonly IList bogusSlots = new ArrayList(); private TreeIntObject mappings; public class SlotSource { public static readonly ConsistencyChecker.SlotSource IdSystem = new ConsistencyChecker.SlotSource ("IdSystem"); public static readonly ConsistencyChecker.SlotSource Freespace = new ConsistencyChecker.SlotSource ("Freespace"); private readonly string _name; private SlotSource(string name) { _name = name; } public override string ToString() { return _name; } } public class SlotWithSource { public readonly Slot slot; public readonly ConsistencyChecker.SlotSource source; public SlotWithSource(Slot slot, ConsistencyChecker.SlotSource source) { this.slot = slot; this.source = source; } public override string ToString() { return slot + "(" + source + ")"; } } public class ConsistencyReport { private const int MaxReportedItems = 50; internal readonly IList bogusSlots; internal readonly IList overlaps; internal readonly IList invalidObjectIds; internal readonly IList invalidFieldIndexEntries; public ConsistencyReport(IList bogusSlots, IList overlaps, IList invalidClassIds, IList invalidFieldIndexEntries) { this.bogusSlots = bogusSlots; this.overlaps = overlaps; this.invalidObjectIds = invalidClassIds; this.invalidFieldIndexEntries = invalidFieldIndexEntries; } public virtual bool Consistent() { return bogusSlots.Count == 0 && overlaps.Count == 0 && invalidObjectIds.Count == 0 && invalidFieldIndexEntries.Count == 0; } public override string ToString() { if (Consistent()) { return "no inconsistencies detected"; } StringBuilder message = new StringBuilder("INCONSISTENCIES DETECTED\n").Append(overlaps .Count + " overlaps\n").Append(bogusSlots.Count + " bogus slots\n").Append(invalidObjectIds .Count + " invalid class ids\n").Append(invalidFieldIndexEntries.Count + " invalid field index entries\n" ); message.Append("(slot lengths are non-blocked)\n"); AppendInconsistencyReport(message, "OVERLAPS", overlaps); AppendInconsistencyReport(message, "BOGUS SLOTS", bogusSlots); AppendInconsistencyReport(message, "INVALID OBJECT IDS", invalidObjectIds); AppendInconsistencyReport(message, "INVALID FIELD INDEX ENTRIES", invalidFieldIndexEntries ); return message.ToString(); } private void AppendInconsistencyReport(StringBuilder str, string title, IList entries ) { if (entries.Count != 0) { str.Append(title + "\n"); int count = 0; for (IEnumerator entryIter = entries.GetEnumerator(); entryIter.MoveNext(); ) { object entry = entryIter.Current; str.Append(entry).Append("\n"); count++; if (count > MaxReportedItems) { str.Append("and more...\n"); break; } } } } } public static void Main(string[] args) { IEmbeddedObjectContainer db = Db4oEmbedded.OpenFile(args[0]); try { Sharpen.Runtime.Out.WriteLine(new ConsistencyChecker(db).CheckSlotConsistency()); } finally { db.Close(); } } public ConsistencyChecker(IObjectContainer db) { _db = (LocalObjectContainer)db; } public virtual ConsistencyChecker.ConsistencyReport CheckSlotConsistency() { MapIdSystem(); MapFreespace(); return new ConsistencyChecker.ConsistencyReport(bogusSlots, CollectOverlaps(), CheckClassIndices (), CheckFieldIndices()); } private IList CheckClassIndices() { IList invalidIds = new ArrayList(); IIdSystem idSystem = _db.IdSystem(); if (!(idSystem is BTreeIdSystem)) { return invalidIds; } ClassMetadataIterator clazzIter = _db.ClassCollection().Iterator(); while (clazzIter.MoveNext()) { ClassMetadata clazz = clazzIter.CurrentClass(); if (!clazz.HasClassIndex()) { continue; } BTreeClassIndexStrategy index = (BTreeClassIndexStrategy)clazz.Index(); index.TraverseAll(_db.SystemTransaction(), new _IVisitor4_143(this, invalidIds, clazz )); } return invalidIds; } private sealed class _IVisitor4_143 : IVisitor4 { public _IVisitor4_143(ConsistencyChecker _enclosing, IList invalidIds, ClassMetadata clazz) { this._enclosing = _enclosing; this.invalidIds = invalidIds; this.clazz = clazz; } public void Visit(object id) { if (!this._enclosing.IdIsValid((((int)id)))) { invalidIds.Add(new Pair(clazz.GetName(), ((int)id))); } } private readonly ConsistencyChecker _enclosing; private readonly IList invalidIds; private readonly ClassMetadata clazz; } private IList CheckFieldIndices() { IList invalidIds = new ArrayList(); ClassMetadataIterator clazzIter = _db.ClassCollection().Iterator(); while (clazzIter.MoveNext()) { ClassMetadata clazz = clazzIter.CurrentClass(); clazz.TraverseDeclaredFields(new _IProcedure4_159(this, invalidIds, clazz)); } return invalidIds; } private sealed class _IProcedure4_159 : IProcedure4 { public _IProcedure4_159(ConsistencyChecker _enclosing, IList invalidIds, ClassMetadata clazz) { this._enclosing = _enclosing; this.invalidIds = invalidIds; this.clazz = clazz; } public void Apply(object field) { if (!((FieldMetadata)field).HasIndex()) { return; } BTree fieldIndex = ((FieldMetadata)field).GetIndex(this._enclosing._db.SystemTransaction ()); fieldIndex.TraverseKeys(this._enclosing._db.SystemTransaction(), new _IVisitor4_165 (this, invalidIds, clazz, field)); } private sealed class _IVisitor4_165 : IVisitor4 { public _IVisitor4_165(_IProcedure4_159 _enclosing, IList invalidIds, ClassMetadata clazz, object field) { this._enclosing = _enclosing; this.invalidIds = invalidIds; this.clazz = clazz; this.field = field; } public void Visit(object fieldIndexKey) { int parentID = ((IFieldIndexKey)fieldIndexKey).ParentID(); if (!this._enclosing._enclosing.IdIsValid(parentID)) { invalidIds.Add(new Pair(clazz.GetName() + "#" + ((FieldMetadata)field).GetName(), parentID)); } } private readonly _IProcedure4_159 _enclosing; private readonly IList invalidIds; private readonly ClassMetadata clazz; private readonly object field; } private readonly ConsistencyChecker _enclosing; private readonly IList invalidIds; private readonly ClassMetadata clazz; } private bool IdIsValid(int id) { try { return !Slot.IsNull(_db.IdSystem().CommittedSlot(id)); } catch (InvalidIDException) { return false; } } private IList CollectOverlaps() { IBlockConverter blockConverter = _db.BlockConverter(); IList overlaps = new ArrayList(); ByRef prevSlot = ByRef.NewInstance(); mappings.Traverse(new _IVisitor4_192(prevSlot, blockConverter, overlaps)); return overlaps; } private sealed class _IVisitor4_192 : IVisitor4 { public _IVisitor4_192(ByRef prevSlot, IBlockConverter blockConverter, IList overlaps ) { this.prevSlot = prevSlot; this.blockConverter = blockConverter; this.overlaps = overlaps; } public void Visit(object obj) { ConsistencyChecker.SlotWithSource curSlot = (ConsistencyChecker.SlotWithSource)(( TreeIntObject)obj)._object; if (((ConsistencyChecker.SlotWithSource)prevSlot.value) != null) { if (((ConsistencyChecker.SlotWithSource)prevSlot.value).slot.Address() + blockConverter .ToBlockedLength(((ConsistencyChecker.SlotWithSource)prevSlot.value).slot).Length () > curSlot.slot.Address()) { overlaps.Add(new Pair(((ConsistencyChecker.SlotWithSource)prevSlot.value), curSlot )); } } prevSlot.value = curSlot; } private readonly ByRef prevSlot; private readonly IBlockConverter blockConverter; private readonly IList overlaps; } private void MapFreespace() { _db.FreespaceManager().Traverse(new _IVisitor4_207(this)); } private sealed class _IVisitor4_207 : IVisitor4 { public _IVisitor4_207(ConsistencyChecker _enclosing) { this._enclosing = _enclosing; } public void Visit(object slot) { if (((Slot)slot).Address() < 0) { this._enclosing.bogusSlots.Add(new ConsistencyChecker.SlotWithSource(((Slot)slot) , ConsistencyChecker.SlotSource.Freespace)); } this._enclosing.AddMapping(((Slot)slot), ConsistencyChecker.SlotSource.Freespace); } private readonly ConsistencyChecker _enclosing; } private void MapIdSystem() { IIdSystem idSystem = _db.IdSystem(); if (idSystem is BTreeIdSystem) { ((BTreeIdSystem)idSystem).TraverseIds(new _IVisitor4_220(this)); } } private sealed class _IVisitor4_220 : IVisitor4 { public _IVisitor4_220(ConsistencyChecker _enclosing) { this._enclosing = _enclosing; } public void Visit(object mapping) { if (((IdSlotMapping)mapping)._address < 0) { this._enclosing.bogusSlots.Add(new ConsistencyChecker.SlotWithSource(((IdSlotMapping )mapping).Slot(), ConsistencyChecker.SlotSource.IdSystem)); } if (((IdSlotMapping)mapping)._address > 0) { this._enclosing.AddMapping(((IdSlotMapping)mapping).Slot(), ConsistencyChecker.SlotSource .IdSystem); } } private readonly ConsistencyChecker _enclosing; } private void AddMapping(Slot slot, ConsistencyChecker.SlotSource source) { mappings = ((TreeIntObject)Tree.Add(mappings, new ConsistencyChecker.MappingTree( slot, source))); } private class MappingTree : TreeIntObject { public MappingTree(Slot slot, ConsistencyChecker.SlotSource source) : base(slot.Address (), new ConsistencyChecker.SlotWithSource(slot, source)) { } public override bool Duplicates() { return true; } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/IO/0000755000175000017500000000000011520622070025050 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/IO/MemoryIoAdapter.cs0000644000175000017500000001736311520622624030457 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.IO; using Sharpen; namespace Db4objects.Db4o.IO { /// IoAdapter for in-memory operation. /// /// IoAdapter for in-memory operation.
///
/// Configure db4o to operate with this in-memory IoAdapter with /// /// MemoryIoAdapter memoryIoAdapter = new MemoryIoAdapter();
/// Db4oFactory.Configure().Io(memoryIoAdapter); ///

///
///
/// Use the normal #openFile() and #openServer() commands to open /// ObjectContainers and ObjectServers. The names specified as file names will be /// used to identify the byte[] content of the in-memory files in /// the _memoryFiles Hashtable in the adapter. After working with an in-memory /// ObjectContainer/ObjectServer the byte[] content is available /// in the MemoryIoAdapter by using /// /// Db4objects.Db4o.IO.MemoryIoAdapter.Get /// /// . To add old existing /// database byte[] content to a MemoryIoAdapter use /// /// Db4objects.Db4o.IO.MemoryIoAdapter.Put /// /// /// . To reduce memory consumption of memory file /// names that will no longer be used call /// /// Db4objects.Db4o.IO.MemoryIoAdapter.Put /// /// /// and pass /// an empty byte array. /// ///
public class MemoryIoAdapter : IoAdapter { private byte[] _bytes; private int _length; private int _seekPos; private Hashtable4 _memoryFiles; private int _growBy; public MemoryIoAdapter() { _memoryFiles = new Hashtable4(); _growBy = 10000; } public MemoryIoAdapter(int initialLength) : this() { _bytes = new byte[initialLength]; } private MemoryIoAdapter(Db4objects.Db4o.IO.MemoryIoAdapter adapter, byte[] bytes) { _bytes = bytes; _length = bytes.Length; _growBy = adapter._growBy; } private MemoryIoAdapter(Db4objects.Db4o.IO.MemoryIoAdapter adapter, int initialLength ) : this(adapter, new byte[initialLength]) { } /// /// creates an in-memory database with the passed content bytes and adds it /// to the adapter for the specified name. /// /// /// creates an in-memory database with the passed content bytes and adds it /// to the adapter for the specified name. /// /// the name to be use for #openFile() or #openServer() calls /// the database content public virtual void Put(string name, byte[] bytes) { if (bytes == null) { bytes = new byte[0]; } _memoryFiles.Put(name, new Db4objects.Db4o.IO.MemoryIoAdapter(this, bytes)); } /// returns the content bytes for a database with the given name. /// returns the content bytes for a database with the given name. /// the name to be use for #openFile() or #openServer() calls /// the content bytes public virtual byte[] Get(string name) { Db4objects.Db4o.IO.MemoryIoAdapter mia = (Db4objects.Db4o.IO.MemoryIoAdapter)_memoryFiles .Get(name); if (mia == null) { return null; } return mia._bytes; } /// /// configures the length a memory file should grow, if no more free slots /// are found within. /// /// /// configures the length a memory file should grow, if no more free slots /// are found within.
///
/// Specify a large value (100,000 or more) for best performance. Specify a /// small value (100) for the smallest memory consumption. The default /// setting is 10,000. ///
/// the length in bytes public virtual void GrowBy(int length) { if (length < 1) { length = 1; } _growBy = length; } /// for internal processing only. /// for internal processing only. /// public override void Close() { } // do nothing public override void Delete(string path) { _memoryFiles.Remove(path); } /// for internal processing only. /// for internal processing only. public override bool Exists(string path) { Db4objects.Db4o.IO.MemoryIoAdapter mia = (Db4objects.Db4o.IO.MemoryIoAdapter)_memoryFiles .Get(path); if (mia == null) { return false; } return mia._length > 0; } /// for internal processing only. /// for internal processing only. /// public override long GetLength() { return _length; } /// for internal processing only. /// for internal processing only. /// public override IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly) { Db4objects.Db4o.IO.MemoryIoAdapter mia = (Db4objects.Db4o.IO.MemoryIoAdapter)_memoryFiles .Get(path); if (mia == null) { mia = new Db4objects.Db4o.IO.MemoryIoAdapter(this, (int)initialLength); _memoryFiles.Put(path, mia); } return mia; } /// for internal processing only. /// for internal processing only. /// public override int Read(byte[] bytes, int length) { System.Array.Copy(_bytes, _seekPos, bytes, 0, length); _seekPos += length; return length; } /// for internal processing only. /// for internal processing only. /// public override void Seek(long pos) { _seekPos = (int)pos; } /// for internal processing only. /// for internal processing only. /// public override void Sync() { } /// for internal processing only. /// for internal processing only. /// public override void Write(byte[] buffer, int length) { if (_seekPos + length > _bytes.Length) { int growBy = _growBy; int missing = _seekPos + length - _bytes.Length; if (missing > growBy) { growBy = missing; } byte[] temp = new byte[_bytes.Length + growBy]; System.Array.Copy(_bytes, 0, temp, 0, _length); _bytes = temp; } System.Array.Copy(buffer, 0, _bytes, _seekPos, length); _seekPos += length; if (_seekPos > _length) { _length = _seekPos; } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/IO/SaveAsStorage.cs0000644000175000017500000001623411520622624030121 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Foundation.IO; using Db4objects.Db4o.IO; using Sharpen.Lang; namespace Db4objects.Db4o.IO { /// /// Storage that allows to save an open database file /// as another file while keeping the reference system /// in place. /// /// /// Storage that allows to save an open database file /// as another file while keeping the reference system /// in place. If anything goes wrong during copying the /// storage tries to reopen the original file, so commit /// operations can still take place against the original /// file. /// public class SaveAsStorage : StorageDecorator { private readonly Hashtable4 _binRecords = new Hashtable4(); public SaveAsStorage(IStorage storage) : base(storage) { } /// /// call this method to save the content of a currently /// open ObjectContainer session to a new file location. /// /// /// call this method to save the content of a currently /// open ObjectContainer session to a new file location. /// Invocation will close the old file without a commit, /// keep the reference system in place and connect it to /// the file in the new location. If anything goes wrong /// during the copying operation or while opening it will /// be attempted to reopen the old file. In this case a /// Db4oException will be thrown. /// /// the path to the old open database file /// the path to the new database file public virtual void SaveAs(string oldUri, string newUri) { if (System.IO.File.Exists(newUri)) { throw new InvalidOperationException(newUri + " already exists"); } SaveAsStorage.BinRecord binRecord = (SaveAsStorage.BinRecord)_binRecords.Get(oldUri ); if (binRecord == null) { throw new InvalidOperationException(oldUri + " was never opened or was closed."); } BinConfiguration oldConfiguration = binRecord._binConfiguration; SaveAsStorage.SaveAsBin saveAsBin = binRecord._bin; IRunnable closure = new _IRunnable_49(this, saveAsBin, oldUri, newUri, oldConfiguration ); saveAsBin.ExchangeUnderlyingBin(closure); } private sealed class _IRunnable_49 : IRunnable { public _IRunnable_49(SaveAsStorage _enclosing, SaveAsStorage.SaveAsBin saveAsBin, string oldUri, string newUri, BinConfiguration oldConfiguration) { this._enclosing = _enclosing; this.saveAsBin = saveAsBin; this.oldUri = oldUri; this.newUri = newUri; this.oldConfiguration = oldConfiguration; } public void Run() { saveAsBin.Sync(); saveAsBin.Close(); try { File4.Copy(oldUri, newUri); } catch (Exception e) { this._enclosing.ReopenOldConfiguration(saveAsBin, oldConfiguration, newUri, e); } BinConfiguration newConfiguration = this._enclosing.PointToNewUri(oldConfiguration , newUri); try { IBin newBin = this._enclosing._storage.Open(newConfiguration); saveAsBin.DelegateTo(newBin); this._enclosing._binRecords.Remove(oldUri); this._enclosing._binRecords.Put(newUri, new SaveAsStorage.BinRecord(newConfiguration , saveAsBin)); } catch (Exception e) { this._enclosing.ReopenOldConfiguration(saveAsBin, oldConfiguration, newUri, e); } } private readonly SaveAsStorage _enclosing; private readonly SaveAsStorage.SaveAsBin saveAsBin; private readonly string oldUri; private readonly string newUri; private readonly BinConfiguration oldConfiguration; } private BinConfiguration PointToNewUri(BinConfiguration oldConfig, string newUri) { return new BinConfiguration(newUri, oldConfig.LockFile(), oldConfig.InitialLength (), oldConfig.ReadOnly()); } private void ReopenOldConfiguration(SaveAsStorage.SaveAsBin saveAsBin, BinConfiguration config, string newUri, Exception e) { IBin safeBin = _storage.Open(config); saveAsBin.DelegateTo(safeBin); throw new Db4oException("Copying to " + newUri + " failed. Reopened " + config.Uri (), e); } /// public override IBin Open(BinConfiguration config) { SaveAsStorage.SaveAsBin openedBin = new SaveAsStorage.SaveAsBin(base.Open(config) ); _binRecords.Put(config.Uri(), new SaveAsStorage.BinRecord(config, openedBin)); return openedBin; } private class BinRecord { internal readonly SaveAsStorage.SaveAsBin _bin; internal readonly BinConfiguration _binConfiguration; internal BinRecord(BinConfiguration binConfiguration, SaveAsStorage.SaveAsBin bin ) { _binConfiguration = binConfiguration; _bin = bin; } } /// /// We could have nicely used BinDecorator here, but /// BinDecorator doesn't allow exchanging the Bin. /// /// /// We could have nicely used BinDecorator here, but /// BinDecorator doesn't allow exchanging the Bin. To /// be compatible with released versions we do /// private class SaveAsBin : IBin { private IBin _bin; internal SaveAsBin(IBin delegate_) { _bin = delegate_; } public virtual void ExchangeUnderlyingBin(IRunnable closure) { lock (this) { closure.Run(); } } public virtual void Close() { lock (this) { _bin.Close(); } } public virtual long Length() { lock (this) { return _bin.Length(); } } public virtual int Read(long position, byte[] bytes, int bytesToRead) { lock (this) { return _bin.Read(position, bytes, bytesToRead); } } public virtual void Sync() { lock (this) { _bin.Sync(); } } public virtual void Sync(IRunnable runnable) { lock (this) { Sync(); runnable.Run(); Sync(); } } public virtual int SyncRead(long position, byte[] bytes, int bytesToRead) { lock (this) { return _bin.SyncRead(position, bytes, bytesToRead); } } public virtual void Write(long position, byte[] bytes, int bytesToWrite) { lock (this) { _bin.Write(position, bytes, bytesToWrite); } } public virtual void DelegateTo(IBin bin) { _bin = bin; } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/IO/DebugIoAdapter.cs0000644000175000017500000000362011520622624030224 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// public class DebugIoAdapter : VanillaIoAdapter { internal static int counter; private static readonly int[] RangeOfInterest = new int[] { 0, 20 }; public DebugIoAdapter(IoAdapter delegateAdapter) : base(delegateAdapter) { } /// protected DebugIoAdapter(IoAdapter delegateAdapter, string path, bool lockFile, long initialLength, bool readOnly) : base(delegateAdapter.Open(path, lockFile, initialLength , readOnly)) { } /// public override IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly) { return new Db4objects.Db4o.IO.DebugIoAdapter(new RandomAccessFileAdapter(), path, lockFile, initialLength, readOnly); } /// public override void Seek(long pos) { if (pos >= RangeOfInterest[0] && pos <= RangeOfInterest[1]) { counter++; Sharpen.Runtime.Out.WriteLine("seek: " + pos + " counter: " + counter); } base.Seek(pos); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/IO/NonFlushingIoAdapter.cs0000644000175000017500000001025111520622624031426 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.IO; namespace Db4objects.Db4o.IO { /// /// Delegating IoAdapter that does not pass on calls to sync /// data to the underlying device. /// /// /// Delegating IoAdapter that does not pass on calls to sync /// data to the underlying device.

/// This IoAdapter can be used to improve performance at the cost of a /// higher risk of database file corruption upon abnormal termination /// of a session against a database.

/// An example of possible usage:
/// /// RandomAccessFileAdapter randomAccessFileAdapter = new RandomAccessFileAdapter();
/// NonFlushingIoAdapter nonFlushingIoAdapter = new NonFlushingIoAdapter(randomAccessFileAdapter);
/// CachedIoAdapter cachedIoAdapter = new CachedIoAdapter(nonFlushingIoAdapter);
/// Configuration configuration = Db4o.newConfiguration();
/// configuration.io(cachedIoAdapter);
///
///

/// db4o uses a resume-commit-on-crash strategy to ensure ACID transactions. /// When a transaction commits,
/// - (1) a list "pointers that are to be modified" is written to the database file,
/// - (2) the database file is switched into "in-commit" mode,
/// - (3) the pointers are actually modified in the database file,
/// - (4) the database file is switched to "not-in-commit" mode.
/// If the system is halted by a hardware or power failure
/// - before (2)
/// all objects will be available as before the commit
/// - between (2) and (4) /// the commit is restarted when the database file is opened the next time, all pointers /// will be read from the "pointers to be modified" list and all of them will be modified /// to the state they are intended to have after commit
/// - after (4) /// no work is necessary, the transaction is committed. ///

/// In order for the above to be 100% failsafe, the order of writes to the /// storage medium has to be obeyed. On operating systems that use in-memory /// file caching, the OS cache may revert the order of writes to optimize /// file performance.

/// db4o enforces the correct write order by calling /// Sync() /// after every single one of the above steps during transaction /// commit. The calls to /// Sync() /// have a high performance cost. /// By using this IoAdapter it is possible to omit these calls, at the cost /// of a risc of corrupted database files upon hardware-, power- or operating /// system failures.

///
public class NonFlushingIoAdapter : VanillaIoAdapter { public NonFlushingIoAdapter(IoAdapter delegateAdapter) : base(delegateAdapter) { } /// private NonFlushingIoAdapter(IoAdapter delegateAdapter, string path, bool lockFile , long initialLength, bool readOnly) : base(delegateAdapter, path, lockFile, initialLength , readOnly) { } /// public override IoAdapter Open(string path, bool lockFile, long initialLength, bool readOnly) { return new Db4objects.Db4o.IO.NonFlushingIoAdapter(_delegate, path, lockFile, initialLength , readOnly); } /// public override void Sync() { } // do nothing } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Cluster/0000755000175000017500000000000011520622044026163 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Cluster/Cluster.cs0000644000175000017500000000541411520622624030143 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal.Cluster; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Cluster { /// allows running Queries against multiple ObjectContainers. /// allows running Queries against multiple ObjectContainers. /// public class Cluster { public readonly IObjectContainer[] _objectContainers; /// /// use this constructor to create a Cluster and call /// add() to add ObjectContainers /// public Cluster(IObjectContainer[] objectContainers) { if (objectContainers == null) { throw new ArgumentNullException(); } if (objectContainers.Length < 1) { throw new ArgumentException(); } for (int i = 0; i < objectContainers.Length; i++) { if (objectContainers[i] == null) { throw new ArgumentException(); } } _objectContainers = objectContainers; } /// /// starts a query against all ObjectContainers in /// this Cluster. /// /// /// starts a query against all ObjectContainers in /// this Cluster. /// /// the Query public virtual IQuery Query() { lock (this) { IQuery[] queries = new IQuery[_objectContainers.Length]; for (int i = 0; i < _objectContainers.Length; i++) { queries[i] = _objectContainers[i].Query(); } return new ClusterQuery(this, queries); } } /// /// returns the ObjectContainer in this cluster where the passed object /// is stored or null, if the object is not stored to any ObjectContainer /// in this cluster /// /// the object /// the ObjectContainer public virtual IObjectContainer ObjectContainerFor(object obj) { lock (this) { for (int i = 0; i < _objectContainers.Length; i++) { if (_objectContainers[i].Ext().IsStored(obj)) { return _objectContainers[i]; } } } return null; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/0000755000175000017500000000000011520622050026313 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/0000755000175000017500000000000011520622066027743 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterConstraint.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterConstra0000644000175000017500000001063211520622624032643 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Cluster { /// public class ClusterConstraint : IConstraint { internal readonly Db4objects.Db4o.Cluster.Cluster _cluster; internal readonly IConstraint[] _constraints; public ClusterConstraint(Db4objects.Db4o.Cluster.Cluster cluster, IConstraint[] constraints ) { _cluster = cluster; _constraints = constraints; } private Db4objects.Db4o.Internal.Cluster.ClusterConstraint Compatible(IConstraint with) { if (!(with is Db4objects.Db4o.Internal.Cluster.ClusterConstraint)) { throw new ArgumentException(); } Db4objects.Db4o.Internal.Cluster.ClusterConstraint other = (Db4objects.Db4o.Internal.Cluster.ClusterConstraint )with; if (other._constraints.Length != _constraints.Length) { throw new ArgumentException(); } return other; } public virtual IConstraint And(IConstraint with) { return Join(with, true); } public virtual IConstraint Or(IConstraint with) { return Join(with, false); } private IConstraint Join(IConstraint with, bool isAnd) { lock (_cluster) { Db4objects.Db4o.Internal.Cluster.ClusterConstraint other = Compatible(with); IConstraint[] newConstraints = new IConstraint[_constraints.Length]; for (int i = 0; i < _constraints.Length; i++) { newConstraints[i] = isAnd ? _constraints[i].And(other._constraints[i]) : _constraints [i].Or(other._constraints[i]); } return new Db4objects.Db4o.Internal.Cluster.ClusterConstraint(_cluster, newConstraints ); } } public virtual IConstraint Equal() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Equal(); } return this; } } public virtual IConstraint Greater() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Greater(); } return this; } } public virtual IConstraint Smaller() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Smaller(); } return this; } } public virtual IConstraint Identity() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Identity(); } return this; } } public virtual IConstraint ByExample() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].ByExample(); } return this; } } public virtual IConstraint Like() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Like(); } return this; } } public virtual IConstraint StartsWith(bool caseSensitive) { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].StartsWith(caseSensitive); } return this; } } public virtual IConstraint EndsWith(bool caseSensitive) { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].EndsWith(caseSensitive); } return this; } } public virtual IConstraint Contains() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Contains(); } return this; } } public virtual IConstraint Not() { lock (_cluster) { for (int i = 0; i < _constraints.Length; i++) { _constraints[i].Not(); } return this; } } public virtual object GetObject() { throw new NotSupportedException(); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterQueryResult.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterQueryRe0000644000175000017500000001067211520622624032632 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Cluster; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Internal.Query.Result; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Cluster { /// public class ClusterQueryResult : IQueryResult { private readonly Db4objects.Db4o.Cluster.Cluster _cluster; private readonly IObjectSet[] _objectSets; private readonly int[] _sizes; private readonly int _size; public ClusterQueryResult(Db4objects.Db4o.Cluster.Cluster cluster, IQuery[] queries ) { _cluster = cluster; _objectSets = new IObjectSet[queries.Length]; _sizes = new int[queries.Length]; int size = 0; for (int i = 0; i < queries.Length; i++) { _objectSets[i] = queries[i].Execute(); _sizes[i] = _objectSets[i].Count; size += _sizes[i]; } _size = size; } private sealed class ClusterQueryResultIntIterator : IIntIterator4 { private readonly CompositeIterator4 _delegate; public ClusterQueryResultIntIterator(IEnumerator[] iterators) { _delegate = new CompositeIterator4(iterators); } public bool MoveNext() { return _delegate.MoveNext(); } public object Current { get { return _delegate.Current; } } public void Reset() { _delegate.Reset(); } public int CurrentInt() { return ((IIntIterator4)_delegate.CurrentIterator()).CurrentInt(); } } public virtual IIntIterator4 IterateIDs() { lock (_cluster) { IEnumerator[] iterators = new IEnumerator[_objectSets.Length]; for (int i = 0; i < _objectSets.Length; i++) { iterators[i] = ((ObjectSetFacade)_objectSets[i])._delegate.IterateIDs(); } return new ClusterQueryResult.ClusterQueryResultIntIterator(iterators); } } public virtual IEnumerator GetEnumerator() { lock (_cluster) { IEnumerator[] iterators = new IEnumerator[_objectSets.Length]; for (int i = 0; i < _objectSets.Length; i++) { iterators[i] = ((ObjectSetFacade)_objectSets[i])._delegate.GetEnumerator(); } return new CompositeIterator4(iterators); } } public virtual int Size() { return _size; } public virtual object Get(int index) { lock (_cluster) { if (index < 0 || index >= Size()) { throw new IndexOutOfRangeException(); } int i = 0; while (index >= _sizes[i]) { index -= _sizes[i]; i++; } return ((ObjectSetFacade)_objectSets[i])[index]; } } public virtual object Lock() { return _cluster; } public virtual IExtObjectContainer ObjectContainer() { throw new NotSupportedException(); } public virtual int IndexOf(int id) { throw new NotSupportedException(); } public virtual void Sort(IQueryComparator cmp) { throw new NotSupportedException(); } public virtual void SortIds(IIntComparator cmp) { throw new NotSupportedException(); } /// public virtual void LoadFromClassIndex(ClassMetadata c) { throw new NotSupportedException(); } /// public virtual void LoadFromQuery(QQuery q) { throw new NotSupportedException(); } /// public virtual void LoadFromClassIndexes(ClassMetadataIterator i) { throw new NotSupportedException(); } /// public virtual void LoadFromIdReader(ByteArrayBuffer r) { throw new NotSupportedException(); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterQuery.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterQuery.c0000644000175000017500000000521411520622624032560 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Internal.Cluster; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Cluster { /// public class ClusterQuery : IQuery { private readonly Db4objects.Db4o.Cluster.Cluster _cluster; private readonly IQuery[] _queries; public ClusterQuery(Db4objects.Db4o.Cluster.Cluster cluster, IQuery[] queries) { _cluster = cluster; _queries = queries; } public virtual IConstraint Constrain(object constraint) { lock (_cluster) { IConstraint[] constraints = new IConstraint[_queries.Length]; for (int i = 0; i < constraints.Length; i++) { constraints[i] = _queries[i].Constrain(constraint); } return new ClusterConstraint(_cluster, constraints); } } public virtual IConstraints Constraints() { lock (_cluster) { IConstraint[] constraints = new IConstraint[_queries.Length]; for (int i = 0; i < constraints.Length; i++) { constraints[i] = _queries[i].Constraints(); } return new ClusterConstraints(_cluster, constraints); } } public virtual IQuery Descend(string fieldName) { lock (_cluster) { IQuery[] queries = new IQuery[_queries.Length]; for (int i = 0; i < queries.Length; i++) { queries[i] = _queries[i].Descend(fieldName); } return new Db4objects.Db4o.Internal.Cluster.ClusterQuery(_cluster, queries); } } public virtual IObjectSet Execute() { lock (_cluster) { return new ObjectSetFacade(new ClusterQueryResult(_cluster, _queries)); } } public virtual IQuery OrderAscending() { throw new NotSupportedException(); } public virtual IQuery OrderDescending() { throw new NotSupportedException(); } public virtual IQuery SortBy(IQueryComparator comparator) { // FIXME throw new NotSupportedException(); } // FIXME } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterConstraints.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Internal/Cluster/ClusterConstra0000644000175000017500000000300011520622624032632 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Cluster; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Internal.Cluster { /// public class ClusterConstraints : ClusterConstraint, IConstraints { public ClusterConstraints(Db4objects.Db4o.Cluster.Cluster cluster, IConstraint[] constraints) : base(cluster, constraints) { } public virtual IConstraint[] ToArray() { lock (_cluster) { Collection4 all = new Collection4(); for (int i = 0; i < _constraints.Length; i++) { ClusterConstraint c = (ClusterConstraint)_constraints[i]; for (int j = 0; j < c._constraints.Length; j++) { all.Add(c._constraints[j]); } } IConstraint[] res = new IConstraint[all.Size()]; all.ToArray(res); return res; } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/0000755000175000017500000000000011520622042026124 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/0000755000175000017500000000000011520622070027016 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfMethod.cs0000644000175000017500000000173011520622624031405 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Reflect; namespace Db4objects.Db4o.Reflect.Self { public class SelfMethod : IReflectMethod { public virtual object Invoke(object onObject, object[] parameters) { return null; } public virtual IReflectClass GetReturnType() { return null; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/FieldInfo.cs0000644000175000017500000000271511520622624031216 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Reflect.Self { public class FieldInfo { private string _name; private System.Type _clazz; private bool _isPublic; private bool _isStatic; private bool _isTransient; public FieldInfo(string name, System.Type clazz, bool isPublic, bool isStatic, bool isTransient) { _name = name; _clazz = clazz; _isPublic = isPublic; _isStatic = isStatic; _isTransient = isTransient; } public virtual string Name() { return _name; } public virtual System.Type Type() { return _clazz; } public virtual bool IsPublic() { return _isPublic; } public virtual bool IsStatic() { return _isStatic; } public virtual bool IsTransient() { return _isTransient; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfField.cs0000644000175000017500000000434311520622624031213 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Self; namespace Db4objects.Db4o.Reflect.Self { public class SelfField : IReflectField { private string _name; private IReflectClass _type; private SelfClass _selfclass; private SelfReflectionRegistry _registry; public SelfField(string name, IReflectClass type, SelfClass selfclass, SelfReflectionRegistry registry) { _name = name; _type = type; _selfclass = selfclass; _registry = registry; } public virtual object Get(object onObject) { if (onObject is ISelfReflectable) { return ((ISelfReflectable)onObject).Self_get(_name); } return null; } public virtual string GetName() { return _name; } public virtual IReflectClass GetFieldType() { return _type; } public virtual bool IsPublic() { return _registry.InfoFor(_selfclass.GetJavaClass()).FieldByName(_name).IsPublic(); } public virtual bool IsStatic() { return _registry.InfoFor(_selfclass.GetJavaClass()).FieldByName(_name).IsStatic(); } public virtual bool IsTransient() { return _registry.InfoFor(_selfclass.GetJavaClass()).FieldByName(_name).IsTransient (); } public virtual void Set(object onObject, object value) { if (onObject is ISelfReflectable) { ((ISelfReflectable)onObject).Self_set(_name, value); } } public virtual object IndexEntry(object orig) { return orig; } public virtual IReflectClass IndexType() { return GetFieldType(); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfClass.cs0000644000175000017500000001163411520622624031236 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Self; namespace Db4objects.Db4o.Reflect.Self { public class SelfClass : IReflectClass { private static readonly SelfField[] EmptyFields = new SelfField[0]; private bool _isAbstract; private SelfField[] _fields; private IReflector _parentReflector; private SelfReflectionRegistry _registry; private Type _class; private Type _superClass; public SelfClass(IReflector parentReflector, SelfReflectionRegistry registry, Type clazz) { // public SelfClass() { // super(); // } _parentReflector = parentReflector; _registry = registry; _class = clazz; } // TODO: Is this needed at all? public virtual Type GetJavaClass() { return _class; } public virtual IReflector Reflector() { return _parentReflector; } public virtual IReflectClass GetComponentType() { if (!IsArray()) { return null; } return _parentReflector.ForClass(_registry.ComponentType(_class)); } public virtual IReflectField[] GetDeclaredFields() { EnsureClassInfoLoaded(); return _fields; } private void EnsureClassInfoLoaded() { if (_fields == null) { ClassInfo classInfo = _registry.InfoFor(_class); if (classInfo == null) { _fields = EmptyFields; return; } _superClass = classInfo.SuperClass(); _isAbstract = classInfo.IsAbstract(); FieldInfo[] fieldInfo = classInfo.FieldInfo(); if (fieldInfo == null) { _fields = EmptyFields; return; } _fields = new SelfField[fieldInfo.Length]; for (int idx = 0; idx < fieldInfo.Length; idx++) { _fields[idx] = SelfFieldFor(fieldInfo[idx]); } } } public virtual IReflectField GetDeclaredField(string name) { EnsureClassInfoLoaded(); for (int idx = 0; idx < _fields.Length; idx++) { if (_fields[idx].GetName().Equals(name)) { return _fields[idx]; } } return null; } private SelfField SelfFieldFor(FieldInfo fieldInfo) { return new SelfField(fieldInfo.Name(), _parentReflector.ForClass(fieldInfo.Type() ), this, _registry); } public virtual IReflectClass GetDelegate() { return this; } public virtual IReflectMethod GetMethod(string methodName, IReflectClass[] paramClasses ) { // TODO !!!! return null; } public virtual string GetName() { return _class.FullName; } public virtual IReflectClass GetSuperclass() { EnsureClassInfoLoaded(); if (_superClass == null) { return null; } return _parentReflector.ForClass(_superClass); } public virtual bool IsAbstract() { EnsureClassInfoLoaded(); return _isAbstract || IsInterface(); } public virtual bool IsArray() { return _class.IsArray; } public virtual bool IsAssignableFrom(IReflectClass type) { if (!(type is Db4objects.Db4o.Reflect.Self.SelfClass)) { return false; } return _class.IsAssignableFrom(((Db4objects.Db4o.Reflect.Self.SelfClass)type).GetJavaClass ()); } public virtual bool IsCollection() { return _parentReflector.IsCollection(this); } public virtual bool IsInstance(object obj) { return _class.IsInstanceOfType(obj); } public virtual bool IsInterface() { return _class.IsInterface; } public virtual bool IsPrimitive() { return _registry.IsPrimitive(_class); } public virtual object NewInstance() { try { return System.Activator.CreateInstance(_class); } catch (Exception e) { Sharpen.Runtime.PrintStackTrace(e); } // Specialized exceptions break conversion to .NET // // // // } catch (InstantiationException e) { // e.printStackTrace(); // } catch (IllegalAccessException e) { // e.printStackTrace(); // } return null; } public virtual object NullValue() { return null; } public virtual bool EnsureCanBeInstantiated() { return true; } public virtual bool IsImmutable() { return IsPrimitive() || Platform4.IsSimple(_class); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/ISelfReflectable.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/ISelfReflectable.c0000644000175000017500000000153311520622624032324 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Reflect.Self { public interface ISelfReflectable { object Self_get(string fieldName); void Self_set(string fieldName, object value); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfArray.cs0000644000175000017500000000645211520622624031251 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Self; using Sharpen; namespace Db4objects.Db4o.Reflect.Self { public class SelfArray : IReflectArray { private readonly SelfReflectionRegistry _registry; /// internal SelfArray(IReflector reflector, SelfReflectionRegistry registry) { _registry = registry; } public virtual void Analyze(object obj, ArrayInfo info) { } // do nothing public virtual int[] Dimensions(object arr) { return new int[] { GetLength(arr) }; } public virtual int Flatten(object a_shaped, int[] a_dimensions, int a_currentDimension , object[] a_flat, int a_flatElement) { if (a_shaped is object[]) { object[] shaped = (object[])a_shaped; System.Array.Copy(shaped, 0, a_flat, 0, shaped.Length); return shaped.Length; } return _registry.FlattenArray(a_shaped, a_flat); } public virtual object Get(object onArray, int index) { if (onArray is object[]) { return ((object[])onArray)[index]; } return _registry.GetArray(onArray, index); } public virtual IReflectClass GetComponentType(IReflectClass a_class) { return ((SelfClass)a_class).GetComponentType(); } public virtual int GetLength(object array) { if (array is object[]) { return ((object[])array).Length; } return _registry.ArrayLength(array); } public virtual bool IsNDimensional(IReflectClass a_class) { return false; } public virtual object NewInstance(IReflectClass componentType, ArrayInfo info) { // TODO: implement multidimensional arrays. int length = info.ElementCount(); return NewInstance(componentType, length); } public virtual object NewInstance(IReflectClass componentType, int length) { return _registry.ArrayFor(((SelfClass)componentType).GetJavaClass(), length); } public virtual object NewInstance(IReflectClass componentType, int[] dimensions) { return NewInstance(componentType, dimensions[0]); } public virtual void Set(object onArray, int index, object element) { if (onArray is object[]) { ((object[])onArray)[index] = element; return; } _registry.SetArray(onArray, index, element); } public virtual int Shape(object[] a_flat, int a_flatElement, object a_shaped, int [] a_dimensions, int a_currentDimension) { if (a_shaped is object[]) { object[] shaped = (object[])a_shaped; System.Array.Copy(a_flat, 0, shaped, 0, a_flat.Length); return a_flat.Length; } return _registry.ShapeArray(a_flat, a_shaped); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfReflector.cs0000644000175000017500000000410511520622624032111 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Self; namespace Db4objects.Db4o.Reflect.Self { public class SelfReflector : IReflector { private SelfArray _arrayHandler; private SelfReflectionRegistry _registry; private IReflector _parent; public SelfReflector(SelfReflectionRegistry registry) { _registry = registry; } public virtual IReflectArray Array() { if (_arrayHandler == null) { _arrayHandler = new SelfArray(this, _registry); } return _arrayHandler; } public virtual IReflectClass ForClass(Type clazz) { return new SelfClass(_parent, _registry, clazz); } public virtual IReflectClass ForName(string className) { Type clazz = ReflectPlatform.ForName(className); return ForClass(clazz); } public virtual IReflectClass ForObject(object a_object) { if (a_object == null) { return null; } return _parent.ForClass(a_object.GetType()); } public virtual bool IsCollection(IReflectClass claxx) { return false; } public virtual void SetParent(IReflector reflector) { _parent = reflector; } public virtual object DeepClone(object context) { return new Db4objects.Db4o.Reflect.Self.SelfReflector(_registry); } public virtual void Configuration(IReflectorConfiguration config) { } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/ClassInfo.cs0000644000175000017500000000321111520622624031230 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Db4o.Reflect.Self { public class ClassInfo { private Type _superClass; private bool _isAbstract; private Db4objects.Db4o.Reflect.Self.FieldInfo[] _fieldInfo; public ClassInfo(bool isAbstract, Type superClass, Db4objects.Db4o.Reflect.Self.FieldInfo [] fieldInfo) { _isAbstract = isAbstract; _superClass = superClass; _fieldInfo = fieldInfo; } public virtual bool IsAbstract() { return _isAbstract; } public virtual Type SuperClass() { return _superClass; } public virtual Db4objects.Db4o.Reflect.Self.FieldInfo[] FieldInfo() { return _fieldInfo; } public virtual Db4objects.Db4o.Reflect.Self.FieldInfo FieldByName(string name) { if (!(_fieldInfo.Length == 0)) { for (int i = 0; i < _fieldInfo.Length; i++) { if (_fieldInfo[i].Name().Equals(name)) { return _fieldInfo[i]; } } } return null; } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfReflectionRegistry.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Db4objects.Db4o/Reflect/Self/SelfReflectionRegi0000644000175000017500000002115711520622624032467 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Reflect.Self; namespace Db4objects.Db4o.Reflect.Self { /// /// Contains the application-specific reflection information (that would /// be generated by a bytecode enhancer), as opposed to the 'generic' /// functionality contained in SelfReflector. /// /// /// Contains the application-specific reflection information (that would /// be generated by a bytecode enhancer), as opposed to the 'generic' /// functionality contained in SelfReflector. /// public abstract class SelfReflectionRegistry { private static readonly Type[] Arraytypes = new Type[] { typeof(int[]), typeof(long []), typeof(short[]), typeof(char[]), typeof(byte[]), typeof(bool[]), typeof(float []), typeof(double[]), typeof(string[]) }; private static readonly Type[] Primitives = new Type[] { typeof(int), typeof(long ), typeof(short), typeof(char), typeof(byte), typeof(bool), typeof(float), typeof( double), typeof(string) }; public virtual bool IsPrimitive(Type clazz) { for (int idx = 0; idx < Primitives.Length; idx++) { if (Primitives[idx].Equals(clazz)) { return true; } } return false; } public abstract ClassInfo InfoFor(Type clazz); public virtual object ArrayFor(Type clazz, int length) { if (typeof(int).IsAssignableFrom(clazz) || typeof(int).IsAssignableFrom(clazz)) { return new int[length]; } if (typeof(long).IsAssignableFrom(clazz) || typeof(long).IsAssignableFrom(clazz)) { return new long[length]; } if (typeof(short).IsAssignableFrom(clazz) || typeof(short).IsAssignableFrom(clazz )) { return new short[length]; } if (typeof(bool).IsAssignableFrom(clazz) || typeof(bool).IsAssignableFrom(clazz)) { return new bool[length]; } if (typeof(byte).IsAssignableFrom(clazz) || typeof(byte).IsAssignableFrom(clazz)) { return new byte[length]; } if (typeof(char).IsAssignableFrom(clazz) || typeof(char).IsAssignableFrom(clazz)) { return new char[length]; } if (typeof(float).IsAssignableFrom(clazz) || typeof(float).IsAssignableFrom(clazz )) { return new float[length]; } if (typeof(double).IsAssignableFrom(clazz) || typeof(double).IsAssignableFrom(clazz )) { return new double[length]; } if (typeof(string).IsAssignableFrom(clazz)) { return new string[length]; } return null; } public virtual Type ComponentType(Type clazz) { for (int i = 0; i < Arraytypes.Length; i++) { if (Arraytypes[i].Equals(clazz)) { return Primitives[i]; } } return null; } public virtual int ArrayLength(object array) { if (array is bool[]) { return ((bool[])array).Length; } if (array is byte[]) { return ((byte[])array).Length; } if (array is short[]) { return ((short[])array).Length; } if (array is char[]) { return ((char[])array).Length; } if (array is int[]) { return ((int[])array).Length; } if (array is long[]) { return ((long[])array).Length; } if (array is float[]) { return ((float[])array).Length; } if (array is double[]) { return ((double[])array).Length; } return 0; } public virtual void SetArray(object array, int index, object element) { if (array is bool[]) { ((bool[])array)[index] = ((bool)element); } if (array is byte[]) { ((byte[])array)[index] = ((byte)element); } if (array is short[]) { ((short[])array)[index] = ((short)element); } if (array is char[]) { ((char[])array)[index] = ((char)element); } if (array is int[]) { ((int[])array)[index] = ((int)element); } if (array is long[]) { ((long[])array)[index] = ((long)element); } if (array is float[]) { ((float[])array)[index] = ((float)element); } if (array is double[]) { ((double[])array)[index] = ((double)element); } } public virtual object GetArray(object array, int index) { if (array is bool[]) { return ((bool[])array)[index]; } if (array is byte[]) { return ((byte[])array)[index]; } if (array is short[]) { return ((short[])array)[index]; } if (array is char[]) { return ((char[])array)[index]; } if (array is int[]) { return ((int[])array)[index]; } if (array is long[]) { return ((long[])array)[index]; } if (array is float[]) { return ((float[])array)[index]; } if (array is double[]) { return ((double[])array)[index]; } return null; } public virtual int FlattenArray(object array, object[] a_flat) { if (array is bool[]) { bool[] shaped = (bool[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is byte[]) { byte[] shaped = (byte[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is short[]) { short[] shaped = (short[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is char[]) { char[] shaped = (char[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is int[]) { int[] shaped = (int[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is long[]) { long[] shaped = (long[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is float[]) { float[] shaped = (float[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } if (array is double[]) { double[] shaped = (double[])array; for (int i = 0; i < shaped.Length; i++) { a_flat[i] = shaped[i]; } return shaped.Length; } return 0; } public virtual int ShapeArray(object[] a_flat, object array) { if (array is bool[]) { bool[] shaped = (bool[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((bool)a_flat[i]); } return a_flat.Length; } if (array is byte[]) { byte[] shaped = (byte[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((byte)a_flat[i]); } return a_flat.Length; } if (array is short[]) { short[] shaped = (short[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((short)a_flat[i]); } return a_flat.Length; } if (array is char[]) { char[] shaped = (char[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((char)a_flat[i]); } return a_flat.Length; } if (array is int[]) { int[] shaped = (int[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((int)a_flat[i]); } return a_flat.Length; } if (array is long[]) { long[] shaped = (long[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((long)a_flat[i]); } return a_flat.Length; } if (array is float[]) { float[] shaped = (float[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((float)a_flat[i]); } return a_flat.Length; } if (array is double[]) { double[] shaped = (double[])array; for (int i = 0; i < shaped.Length; i++) { shaped[i] = ((double)a_flat[i]); } return a_flat.Length; } return 0; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Makefile0000644000175000017500000000016711520622050023431 0ustar directhexdirecthex include ../include.mk TARGET = library ASSEMBLY = $(OPTIONAL) REFERENCES = -r:$(OUTDIR)/$(CORE) -r:$(OUTDIR)/$(CS) db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Properties/0000755000175000017500000000000011520622044024124 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Optional/Properties/AssemblyInfo.cs0000644000175000017500000000262411520622624027056 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using System.Security; [assembly: AssemblyTitle("db4o - optional functionality")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // attributes are automatically set by the build [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyKeyFile("")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyDescription("Db4objects.Db4o.Optional 8.0.184.15484 (.NET)")] #if !CF && !SILVERLIGHT [assembly: AllowPartiallyTrustedCallers] #endif [assembly: CLSCompliant(true)]db4o-8.0.184.15484+dfsg/src/db4objects.snk0000644000175000017500000000112411520622052020167 0ustar directhexdirecthex$RSA2Ho* d(FrOycbq5rg% Z-چ W>c$Q3lȞP )Ț}$DP~ǔi{qy< zB'PV8QNb|fxP_IWy;k=3hveƯ0:_Vwo0ش%VyUBqabBNTYu&բX6] 6:.eƈ'I8XK백3m[yCYp%\')s'F#6Hv Lڂ QRWܚ#RuA%0,J:0G];1Gscwm6}$Md-̜\5\j1ǵCp8rPN.?x;v|z9?HB6dﲻ8bSሹlłN? .J'3uΞ{EY?pr>n.=nOq LR웜e>vdb4o-8.0.184.15484+dfsg/src/Db4o-2008.sln0000644000175000017500000002341611520622050017332 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq.Tests-2008", "Db4objects.Db4o.Linq.Tests\Db4objects.Db4o.Linq.Tests-2008.csproj", "{22AB6F58-39BF-4580-821B-5900E31AC33A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq-2008", "Db4objects.Db4o.Linq\Db4objects.Db4o.Linq-2008.csproj", "{23531440-0922-43EB-A483-6592FFC2F093}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-2008", "Db4oUnit\Db4oUnit-2008.csproj", "{8F82F8B0-95B6-4553-BDA8-BD9A954E682F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-2008", "Db4oUnit.Extensions\Db4oUnit.Extensions-2008.csproj", "{9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.NativeQueries-2008", "Db4objects.Db4o.NativeQueries\Db4objects.Db4o.NativeQueries-2008.csproj", "{AB1BF369-A9C4-4876-9797-178DB8AD437F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Instrumentation-2008", "Db4objects.Db4o.Instrumentation\Db4objects.Db4o.Instrumentation-2008.csproj", "{FFA59708-14D1-4C22-B9A4-1A389EE796D5}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Tests-2008", "Db4objects.Db4o.Tests\Db4objects.Db4o.Tests-2008.csproj", "{7FBF7399-7815-4AC2-8DE8-B21AA8FE9048}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oTool-2008", "Db4oTool\Db4oTool\Db4oTool-2008.csproj", "{6F3BE659-0653-4982-94D6-F1D9D8887E09}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oTool.Tests-2008", "Db4oTool\Db4oTool.Tests\Db4oTool.Tests-2008.csproj", "{69859DB2-4DE3-4DE4-A0BB-13861418378F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq.Instrumentation.Tests", "Db4objects.Db4o.Linq.Instrumentation.Tests\Db4objects.Db4o.Linq.Instrumentation.Tests.csproj", "{34A9FF31-90E6-4C19-AD64-3C4512C521FE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oBench-2008", "Db4oBench\Db4oBench-2008.csproj", "{D8AB00B9-7769-4136-98FA-920F89B12653}" EndProject Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "Db4objects.Db4o.Linq.VB.Tests", "Db4objects.Db4o.Linq.VB.Tests\Db4objects.Db4o.Linq.VB.Tests.vbproj", "{1B1EA933-A4CF-40EA-91F8-0C359242B6B4}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS-2008", "Db4objects.Db4o.CS\Db4objects.Db4o.CS-2008.csproj", "{9FA8178A-3E77-42C5-A252-6690EA9BA257}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Optional-2008", "Db4objects.Db4o.Optional\Db4objects.Db4o.Optional-2008.csproj", "{E9588FE7-C19D-445E-BB53-AE539EA4F0E6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Data.Services-2008", "Db4objects.Db4o.Data.Services\Db4objects.Db4o.Data.Services-2008.csproj", "{8DA7BEBC-170D-4F66-A215-6B3BDF73795F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Data.Services.Tests-2008", "Db4objects.Db4o.Data.Services.Tests\Db4objects.Db4o.Data.Services.Tests-2008.csproj", "{27FDA74C-DDA4-41E0-838A-660B22283B7C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS.Optional-2008", "Db4objects.Db4o.CS.Optional\Db4objects.Db4o.CS.Optional-2008.csproj", "{2DC5A1FA-7BD9-4937-9E36-2EED126B7809}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {22AB6F58-39BF-4580-821B-5900E31AC33A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Debug|Any CPU.Build.0 = Debug|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Release|Any CPU.ActiveCfg = Release|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Release|Any CPU.Build.0 = Release|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.Build.0 = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.ActiveCfg = Release|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.Build.0 = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.Build.0 = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.Build.0 = Release|Any CPU {AB1BF369-A9C4-4876-9797-178DB8AD437F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AB1BF369-A9C4-4876-9797-178DB8AD437F}.Debug|Any CPU.Build.0 = Debug|Any CPU {AB1BF369-A9C4-4876-9797-178DB8AD437F}.Release|Any CPU.ActiveCfg = Release|Any CPU {AB1BF369-A9C4-4876-9797-178DB8AD437F}.Release|Any CPU.Build.0 = Release|Any CPU {FFA59708-14D1-4C22-B9A4-1A389EE796D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FFA59708-14D1-4C22-B9A4-1A389EE796D5}.Debug|Any CPU.Build.0 = Debug|Any CPU {FFA59708-14D1-4C22-B9A4-1A389EE796D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {FFA59708-14D1-4C22-B9A4-1A389EE796D5}.Release|Any CPU.Build.0 = Release|Any CPU {7FBF7399-7815-4AC2-8DE8-B21AA8FE9048}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7FBF7399-7815-4AC2-8DE8-B21AA8FE9048}.Debug|Any CPU.Build.0 = Debug|Any CPU {7FBF7399-7815-4AC2-8DE8-B21AA8FE9048}.Release|Any CPU.ActiveCfg = Release|Any CPU {7FBF7399-7815-4AC2-8DE8-B21AA8FE9048}.Release|Any CPU.Build.0 = Release|Any CPU {6F3BE659-0653-4982-94D6-F1D9D8887E09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F3BE659-0653-4982-94D6-F1D9D8887E09}.Debug|Any CPU.Build.0 = Debug|Any CPU {6F3BE659-0653-4982-94D6-F1D9D8887E09}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F3BE659-0653-4982-94D6-F1D9D8887E09}.Release|Any CPU.Build.0 = Release|Any CPU {69859DB2-4DE3-4DE4-A0BB-13861418378F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69859DB2-4DE3-4DE4-A0BB-13861418378F}.Debug|Any CPU.Build.0 = Debug|Any CPU {69859DB2-4DE3-4DE4-A0BB-13861418378F}.Release|Any CPU.ActiveCfg = Release|Any CPU {69859DB2-4DE3-4DE4-A0BB-13861418378F}.Release|Any CPU.Build.0 = Release|Any CPU {34A9FF31-90E6-4C19-AD64-3C4512C521FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {34A9FF31-90E6-4C19-AD64-3C4512C521FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {34A9FF31-90E6-4C19-AD64-3C4512C521FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {34A9FF31-90E6-4C19-AD64-3C4512C521FE}.Release|Any CPU.Build.0 = Release|Any CPU {D8AB00B9-7769-4136-98FA-920F89B12653}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D8AB00B9-7769-4136-98FA-920F89B12653}.Debug|Any CPU.Build.0 = Debug|Any CPU {D8AB00B9-7769-4136-98FA-920F89B12653}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8AB00B9-7769-4136-98FA-920F89B12653}.Release|Any CPU.Build.0 = Release|Any CPU {1B1EA933-A4CF-40EA-91F8-0C359242B6B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1B1EA933-A4CF-40EA-91F8-0C359242B6B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {1B1EA933-A4CF-40EA-91F8-0C359242B6B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1B1EA933-A4CF-40EA-91F8-0C359242B6B4}.Release|Any CPU.Build.0 = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.Build.0 = Release|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Release|Any CPU.Build.0 = Release|Any CPU {8DA7BEBC-170D-4F66-A215-6B3BDF73795F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8DA7BEBC-170D-4F66-A215-6B3BDF73795F}.Debug|Any CPU.Build.0 = Debug|Any CPU {8DA7BEBC-170D-4F66-A215-6B3BDF73795F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8DA7BEBC-170D-4F66-A215-6B3BDF73795F}.Release|Any CPU.Build.0 = Release|Any CPU {27FDA74C-DDA4-41E0-838A-660B22283B7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {27FDA74C-DDA4-41E0-838A-660B22283B7C}.Debug|Any CPU.Build.0 = Debug|Any CPU {27FDA74C-DDA4-41E0-838A-660B22283B7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {27FDA74C-DDA4-41E0-838A-660B22283B7C}.Release|Any CPU.Build.0 = Release|Any CPU {2DC5A1FA-7BD9-4937-9E36-2EED126B7809}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2DC5A1FA-7BD9-4937-9E36-2EED126B7809}.Debug|Any CPU.Build.0 = Debug|Any CPU {2DC5A1FA-7BD9-4937-9E36-2EED126B7809}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DC5A1FA-7BD9-4937-9E36-2EED126B7809}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/0000755000175000017500000000000011520622056024253 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/0000755000175000017500000000000011520622070025660 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Db4objects.Db4o.CFCompatibilityTests.Desktop-2008.slndb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Db4objects.Db4o.CFCompatibi0000644000175000017500000000376711520622056032515 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CFCompatibilityTests.Desktop-2008", "Db4objects.Db4o.CFCompatibilityTests.Desktop-2008.csproj", "{5981C78B-2275-4750-B283-1937475F5834}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "..\..\Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Subject-2008", "..\Db4objects.Db4o.CFCompatibilityTests.Subject\Tests.Subject-2008.csproj", "{C43A42ED-7AF1-4E57-B207-6DEFE08C2E63}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {5981C78B-2275-4750-B283-1937475F5834}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5981C78B-2275-4750-B283-1937475F5834}.Debug|Any CPU.Build.0 = Debug|Any CPU {5981C78B-2275-4750-B283-1937475F5834}.Release|Any CPU.ActiveCfg = Release|Any CPU {5981C78B-2275-4750-B283-1937475F5834}.Release|Any CPU.Build.0 = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63}.Debug|Any CPU.Build.0 = Debug|Any CPU {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63}.Release|Any CPU.ActiveCfg = Release|Any CPU {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Program.cs0000644000175000017500000000724011520622622027624 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.IO; using Tests.Subject; namespace Db4objects.Db4o.CFCompatibilityTests { class Program { public static int Main(string[] args) { if (args.Length < 2) { Console.Error.WriteLine("Db4objects.Db4o.CFCompatibilityTests.Desktop -generateDatabase|-validateDatabase "); return -1; } string databaseFile = args[1]; switch(args[0]) { case "-generateDatabase": GenerateDatabase(databaseFile); return 0; case "-validateDatabase": return ValidateDatabase(databaseFile); } Console.Error.WriteLine("Invalid parameter: {0}", args[0]); return -2; } private static int ValidateDatabase(string databaseFile) { int errorCount = 0; using (IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), databaseFile)) { IList> results = db.Query>(delegate(CFCompatibilityTestSubject candidate) { return candidate._name == "foo"; }); if (results.Count > 0) { Console.Error.WriteLine("Object with name 'foo' should be deleted but still exists in db."); errorCount++; } const string johnDoeName = "john.doe"; CFCompatibilityTestSubject subject = RetrieveOnlyInstance(db, johnDoeName); if (null == subject) { errorCount++; } CFCompatibilityTestSubject expected = Subjects.NewJohnDoe(); if (!expected.Equals(subject)) { Console.Error.WriteLine("Expected {0} but got {1}", expected, subject != null ? subject.ToString() : "null"); errorCount++; } subject = RetrieveOnlyInstance(db, "foobar"); if (null == subject) { errorCount++; } if (!Subjects.Item("bar").Equals(subject._child)) { Console.Error.WriteLine("Foo._child expected to be {0} but was {1}", Subjects.Item("bar"), subject._child); errorCount++; } } return errorCount; } private static CFCompatibilityTestSubject RetrieveOnlyInstance(IObjectContainer db, string name) { IList> results = db.Query>(delegate(CFCompatibilityTestSubject candidate) { return candidate._name == name; }); if (results.Count != 1) { Console.Error.WriteLine("Expected one instance of '{0}' but found '{1}'", name, results.Count); return null; } return results[0]; } private static void GenerateDatabase(string databaseFile) { if (File.Exists(databaseFile)) { File.Delete(databaseFile); } Console.Error.WriteLine("Generating database: {0}", databaseFile); using (IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), databaseFile)) { foreach (CFCompatibilityTestSubject subject in Subjects.Objects) { db.Store(subject); } } } } }db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Properties/0000755000175000017500000000000011520622060030013 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Properties/AssemblyInfo.cs0000644000175000017500000000431011520622622032737 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Db4objects.Db4o.CFCompatibilityTests.Desktop")] [assembly: AssemblyDescription("Desktop 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("c5bfe876-92d8-49af-b4c7-351534b52b33")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("8.0.184.15484")] ././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Db4objects.Db4o.CFCompatibilityTests.Desktop-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Desktop/Db4objects.Db4o.CFCompatibi0000644000175000017500000000531011520622070032473 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {5981C78B-2275-4750-B283-1937475F5834} Exe Properties Db4objects.Db4o.CFCompatibilityTests CFCompatibilityTests.Desktop v3.5 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 3.5 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63} Tests.Subject-2008 ././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000755000175000017500000000000011520622070032623 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021400000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/CFCompatibilityTestSubject.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000644000175000017500000001332511520622622032634 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; namespace Tests.Subject { public class CFCompatibilityTestSubject : BaseType where T : IComparable { public CFCompatibilityTestSubject(string name) : base(name) { } public IList _ids; public long[] _longs; public DateTime _dateTime; public Nullable[] _nullables; public CFCompatibilityTestSubject _child; public CFCompatibilityTestSubject Longs(params long[] longs) { _longs = longs; return this; } public CFCompatibilityTestSubject DateTime(DateTime dateTime) { _dateTime = dateTime; return this; } public CFCompatibilityTestSubject NullableInts(params int?[] values) { _nullables = values; return this; } public CFCompatibilityTestSubject List(params T[] ids) { _ids = new List(ids); return this; } public CFCompatibilityTestSubject Child(CFCompatibilityTestSubject child) { _child = child; return this; } public override bool Equals(object obj) { CFCompatibilityTestSubject lhs = obj as CFCompatibilityTestSubject; if (null == lhs) return false; if (lhs.GetType() != GetType()) return false; return Equals(lhs._child, _child) && lhs._dateTime == _dateTime && lhs._name == _name && AreEqual(lhs._ids, _ids) && AreEqual(lhs._longs, _longs); } public override string ToString() { return "CFCompatibilityTest<" + GetType().GetGenericArguments()[0].Name + ">\r\n(\r\n" + "\tName: " + _name + "\r\n" + "\tDateTime: " + _dateTime + "\r\n" + "\tIds: " + _ids + "\r\n" + "\tLongs: " + _longs + "\r\n" + "\tNullables: " + _nullables + "\r\n" + "\tChild: " + _child + ")\r\n"; } private static bool AreEqual(IEnumerable lhs, IEnumerable rhs) where E : IComparable { if (rhs == lhs) return true; if (null == lhs) return false; if (null == rhs) return false; IEnumerator e1 = lhs.GetEnumerator(); IEnumerator e2 = rhs.GetEnumerator(); while (e1.MoveNext()) { if (!e2.MoveNext()) { return false; } if (!Equals(e1.Current, e2.Current)) { return false; } } return !e2.MoveNext(); } } public class BaseType { public BaseType(string name) { _name = name; } public string _name; } public class Subjects { private static readonly IDictionary> _subjects; static Subjects() { _subjects = new Dictionary>(); foreach (CFCompatibilityTestSubject subject in SubjectsToTest()) { _subjects[subject._name] = subject; } } public static CFCompatibilityTestSubject Item(string name) { return _subjects[name]; } public static IEnumerable> Objects { get { return _subjects.Values; } } private static IEnumerable> SubjectsToTest() { DateTime vid = new DateTime(1971, 5, 1); yield return new CFCompatibilityTestSubject("foo"). List(string.Empty, "foo.2", "foo.3"). Longs(long.MinValue, 0, long.MaxValue). DateTime(vid). NullableInts(int.MinValue, 0, int.MaxValue, null); yield return new CFCompatibilityTestSubject("bar"). List("bar.1", string.Empty, "bar.3"). Longs(). DateTime(vid). NullableInts(null); DateTime vid2 = new DateTime(1998, 5, 1); CFCompatibilityTestSubject baz = new CFCompatibilityTestSubject("baz"). List("baz.1", "baz.2", string.Empty). Longs(). DateTime(vid2). NullableInts(vid2.Day, vid2.Month, vid2.Year); yield return baz; yield return new CFCompatibilityTestSubject("foobar"). List(string.Empty, "foobar.2", "foobar.3"). Longs(). DateTime(DateTime.MaxValue). NullableInts(null). Child(baz); } public static CFCompatibilityTestSubject NewJohnDoe() { return new CFCompatibilityTestSubject("john.doe"). List("john.doe.1", "john.doe.2", "john.doe.3"). Longs(). DateTime(DateTime.MinValue). NullableInts(null); } } }././@LongLink0000000000000000000000000000021000000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/Tests.Subject-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000644000175000017500000000473211520622070032633 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {C43A42ED-7AF1-4E57-B207-6DEFE08C2E63} Library Properties Tests.Subject Tests.Subject v3.5 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 3.5 3.5 3.5 ././@LongLink0000000000000000000000000000017200000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/Properties/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000755000175000017500000000000011520622052032623 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021100000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/Properties/AssemblyInfo.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000644000175000017500000000422211520622622032630 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Db4objects.Db4o.CFCompatibilityTests.Subject")] [assembly: AssemblyDescription("Db4objects.Db4o.CFCompatibilityTests.Subject 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("f29d79c8-b03a-49dd-835b-b6ba852c1092")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: [assembly: AssemblyVersion("8.0.184.15484")] ././@LongLink0000000000000000000000000000021300000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTests.Subject/Tests.Subject-CF-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Db4objects.Db4o.CFCompatibilityTest0000644000175000017500000000644711520622064032643 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {7F388726-A3A0-4CF7-89F4-52926EA02D55} Library Properties Tests.Subject Tests.Subject {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 4118C335-430C-497f-BE48-11C3316B135E 5.1 Db4objects.Db4o.CFCompatibilityTests.Subject v3.5 Windows Mobile 5.0 Pocket PC SDK true full false bin\Debug\ DEBUG;TRACE;$(PlatformFamilyName) true true prompt 512 4 Off pdbonly true bin\Release\ TRACE;$(PlatformFamilyName) true true prompt 512 4 Off db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/0000755000175000017500000000000011520622066025453 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Console.Designer.cs0000644000175000017500000000375711520622622031155 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.CFCompatibilityTests.Device { partial class Console { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; private System.Windows.Forms.MainMenu mainMenu1; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.mainMenu1 = new System.Windows.Forms.MainMenu(); this.SuspendLayout(); // // Console // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.AutoScroll = true; this.ClientSize = new System.Drawing.Size(240, 268); this.Menu = this.mainMenu1; this.Name = "Console"; this.Text = "Console"; this.ResumeLayout(false); } #endregion } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Console.cs0000644000175000017500000000701211520622622027402 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Windows.Forms; using Tests.Subject; using Db4oUnit; namespace Db4objects.Db4o.CFCompatibilityTests.Device { public partial class Console : Form { public Console(string []args) { InitializeComponent(); DatabasePath = args[0]; _result = new ConsoleTestRunner(CFCompatibilityTests()).Run(); Close(); } private static IEnumerator CFCompatibilityTests() { return new ReflectionTestSuiteBuilder( new Type[] { typeof(CFCompatibilityTestCase), typeof(CFCompatibilityDefragTestCase), }).GetEnumerator(); } public int Result { get { return _result; } } internal static string DatabasePath { get { return _databaseFile; } set { _databaseFile = value; } } private static string _databaseFile; private readonly int _result; } internal class CFCompatibilityDefragTestCase : ITestCase { public void TestDefragment() { string backupFile = Console.DatabasePath + "." + Defragment.DefragmentConfig.BackupSuffix; if (File.Exists(backupFile)) { File.Delete(backupFile); } Defragment.Defragment.Defrag(Console.DatabasePath); } } /** * We don't support (and therefore don't test) from Desktop -> CF * * - Database version updates * - * * */ internal class CFCompatibilityTestCase : ITestLifeCycle { public void TestQuery() { AssertSubject("bar"); } public void TestUpdate() { CFCompatibilityTestSubject foobar = AssertSubject("foobar"); Assert.AreEqual(Subjects.Item("baz"), foobar._child); foobar.Child(RetrieveOnlyInstance("bar")); Db().Store(foobar); } public void TestInsert() { Db().Store(Subjects.NewJohnDoe()); } public void TestDelete() { Db().Delete(RetrieveOnlyInstance("foo")); } private CFCompatibilityTestSubject AssertSubject(string name) { CFCompatibilityTestSubject instance = RetrieveOnlyInstance(name); Assert.AreEqual(Subjects.Item(name), instance); return instance; } private CFCompatibilityTestSubject RetrieveOnlyInstance(string name) { IList> results = Db().Query>(delegate(CFCompatibilityTestSubject candidate) { return candidate._name == name; }); Assert.AreEqual(1, results.Count); return results[0]; } public void SetUp() { _db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), Console.DatabasePath); } public void TearDown() { _db.Close(); } private IObjectContainer Db() { return _db; } private IObjectContainer _db; } }././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Db4objects.Db4o.CFCompatibilityTests.Device-2008.slndb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Db4objects.Db4o.CFCompatibil0000644000175000017500000001034611520622062032443 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CFCompatibilityTests.Device-2008", "Db4objects.Db4o.CFCompatibilityTests.Device-2008.csproj", "{67F731E8-692E-4F4C-AF97-E50A5A117A84}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-CF-2008", "..\..\Db4objects.Db4o\Db4objects.Db4o-CF-2008.csproj", "{95FD1C64-F1A3-4C8A-B170-D518E899B2FE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-CF-2008", "..\..\Db4oUnit\Db4oUnit-CF-2008.csproj", "{7C7F460A-A3A0-40D5-872C-B7BA617F9BA7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-CF-2008", "..\..\Db4oUnit.Extensions\Db4oUnit.Extensions-CF-2008.csproj", "{6C7B5203-2178-4BFC-B8AB-D387D7C28A65}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Subject-CF-2008", "..\Db4objects.Db4o.CFCompatibilityTests.Subject\Tests.Subject-CF-2008.csproj", "{7F388726-A3A0-4CF7-89F4-52926EA02D55}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS-CF-2008", "..\..\Db4objects.Db4o.CS\Db4objects.Db4o.CS-CF-2008.csproj", "{89BB3D10-B9D5-4172-A0D9-3BB856AC5B85}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Optional-CF-2008", "..\..\Db4objects.Db4o.Optional\Db4objects.Db4o.Optional-CF-2008.csproj", "{667C616E-FEA2-4D5E-93F0-9D18D17275FA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Debug|Any CPU.Build.0 = Debug|Any CPU {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Release|Any CPU.ActiveCfg = Release|Any CPU {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Release|Any CPU.Build.0 = Release|Any CPU {67F731E8-692E-4F4C-AF97-E50A5A117A84}.Release|Any CPU.Deploy.0 = Release|Any CPU {95FD1C64-F1A3-4C8A-B170-D518E899B2FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {95FD1C64-F1A3-4C8A-B170-D518E899B2FE}.Debug|Any CPU.Build.0 = Debug|Any CPU {95FD1C64-F1A3-4C8A-B170-D518E899B2FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {95FD1C64-F1A3-4C8A-B170-D518E899B2FE}.Release|Any CPU.Build.0 = Release|Any CPU {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7}.Debug|Any CPU.Build.0 = Debug|Any CPU {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7}.Release|Any CPU.ActiveCfg = Release|Any CPU {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7}.Release|Any CPU.Build.0 = Release|Any CPU {6C7B5203-2178-4BFC-B8AB-D387D7C28A65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C7B5203-2178-4BFC-B8AB-D387D7C28A65}.Debug|Any CPU.Build.0 = Debug|Any CPU {6C7B5203-2178-4BFC-B8AB-D387D7C28A65}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C7B5203-2178-4BFC-B8AB-D387D7C28A65}.Release|Any CPU.Build.0 = Release|Any CPU {7F388726-A3A0-4CF7-89F4-52926EA02D55}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7F388726-A3A0-4CF7-89F4-52926EA02D55}.Debug|Any CPU.Build.0 = Debug|Any CPU {7F388726-A3A0-4CF7-89F4-52926EA02D55}.Release|Any CPU.ActiveCfg = Release|Any CPU {7F388726-A3A0-4CF7-89F4-52926EA02D55}.Release|Any CPU.Build.0 = Release|Any CPU {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85}.Debug|Any CPU.Build.0 = Debug|Any CPU {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85}.Release|Any CPU.ActiveCfg = Release|Any CPU {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85}.Release|Any CPU.Build.0 = Release|Any CPU {667C616E-FEA2-4D5E-93F0-9D18D17275FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {667C616E-FEA2-4D5E-93F0-9D18D17275FA}.Debug|Any CPU.Build.0 = Debug|Any CPU {667C616E-FEA2-4D5E-93F0-9D18D17275FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {667C616E-FEA2-4D5E-93F0-9D18D17275FA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Program.cs0000644000175000017500000000204211520622622027405 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Windows.Forms; namespace Db4objects.Db4o.CFCompatibilityTests.Device { static class Program { /// /// The main entry point for the application. /// [MTAThread] static int Main(string[] args) { Console console = new Console(args); Application.Run(console); return console.Result; } } }db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Console.resx0000644000175000017500000001425211520622054027761 0ustar directhexdirecthex text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 17, 17 POCKET_PC_2003_PORTRAIT True db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Properties/0000755000175000017500000000000011520622070027602 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Properties/Resources.Designer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Properties/Resources.Designe0000644000175000017500000000543311520622622033064 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.CFCompatibilityTests.Device.Properties { using System; /// /// A strongly-typed resource class, for looking up localized strings, etc. /// // This class was auto-generated by the StronglyTypedResourceBuilder // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] internal class Resources { private static global::System.Resources.ResourceManager resourceMan; private static global::System.Globalization.CultureInfo resourceCulture; internal Resources() { } /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Db4objects.Db4o.CFCompatibilityTests.Device.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Properties/Resources.resx0000644000175000017500000001276211520622066032474 0ustar directhexdirecthex text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Properties/AssemblyInfo.cs0000644000175000017500000000442411520622622032533 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Db4objects.Db4o.CFCompatibilityTests.Device_2008")] [assembly: AssemblyDescription("Device 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("b1163e6d-960b-4f83-a633-b693e4e77f84")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // [assembly: AssemblyVersion("8.0.184.15484")] // Below attribute is to suppress FxCop warning "CA2232 : Microsoft.Usage : Add STAThreadAttribute to assembly" // as Device app does not support STA thread. [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2232:MarkWindowsFormsEntryPointsWithStaThread")] ././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Db4objects.Db4o.CFCompatibilityTests.Device-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CFCompatibilityTests/Device/Db4objects.Db4o.CFCompatibil0000644000175000017500000001147411520622064032450 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {67F731E8-692E-4F4C-AF97-E50A5A117A84} WinExe Properties Db4objects.Db4o.CFCompatibilityTests.Device Db4objects.Db4o.CFCompatibilityTests.Device {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4objects.Db4o.CFCompatibilityTests.Device_2008 v3.5 Pocket PC 2003 true full false bin\Debug\ DEBUG;TRACE;$(PlatformFamilyName) true true prompt 512 4 Off pdbonly true bin\Release\ TRACE;$(PlatformFamilyName) true true prompt 512 4 Off Form Console.cs Console.cs ResXFileCodeGenerator Resources.Designer.cs Designer True Resources.resx True {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7} Db4oUnit-CF-2008 {7F388726-A3A0-4CF7-89F4-52926EA02D55} Tests.Subject-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/0000755000175000017500000000000011520622066022773 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/0000755000175000017500000000000011520622066030330 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization0000755000175000017500000000000011520622070032732 5ustar directhexdirecthex././@LongLink0000000000000000000000000000021100000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization/ComparisonQueryGeneratingVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization0000644000175000017500000001261511520622624032746 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.Internal; using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; using Db4objects.Db4o.NativeQueries.Optimization; using Sharpen.Lang.Reflect; namespace Db4objects.Db4o.NativeQueries.Optimization { internal sealed class ComparisonQueryGeneratingVisitor : IComparisonOperandVisitor { private object _predicate; private object _value = null; private readonly INativeClassFactory _classSource; private readonly IReferenceResolver _resolver; public object Value() { return _value; } public void Visit(ConstValue operand) { _value = operand.Value(); } public void Visit(FieldValue operand) { operand.Parent().Accept(this); Type clazz = ((operand.Parent() is StaticFieldRoot) ? (Type)_value : _value.GetType ()); try { FieldInfo field = Reflection4.GetField(clazz, operand.FieldName()); _value = field.GetValue(_value); } catch (Exception exc) { // arg is ignored for static Sharpen.Runtime.PrintStackTrace(exc); } } internal object Add(object a, object b) { if (a is double || b is double) { return ((double)a) + ((double)b); } if (a is float || b is float) { return ((float)a) + ((float)b); } if (a is long || b is long) { return ((long)a) + ((long)b); } return ((int)a) + ((int)b); } internal object Subtract(object a, object b) { if (a is double || b is double) { return ((double)a) - ((double)b); } if (a is float || b is float) { return ((float)a) - ((float)b); } if (a is long || b is long) { return ((long)a) - ((long)b); } return ((int)a) - ((int)b); } internal object Multiply(object a, object b) { if (a is double || b is double) { return ((double)a) * ((double)b); } if (a is float || b is float) { return ((float)a) * ((float)b); } if (a is long || b is long) { return ((long)a) * ((long)b); } return ((int)a) * ((int)b); } internal object Divide(object a, object b) { if (a is double || b is double) { return ((double)a) / ((double)b); } if (a is float || b is float) { return ((float)a) / ((float)b); } if (a is long || b is long) { return ((long)a) / ((long)b); } return ((int)a) / ((int)b); } public void Visit(ArithmeticExpression operand) { operand.Left().Accept(this); object left = _value; operand.Right().Accept(this); object right = _value; switch (operand.Op().Id()) { case ArithmeticOperator.AddId: { _value = Add(left, right); break; } case ArithmeticOperator.SubtractId: { _value = Subtract(left, right); break; } case ArithmeticOperator.MultiplyId: { _value = Multiply(left, right); break; } case ArithmeticOperator.DivideId: { _value = Divide(left, right); break; } } } public void Visit(CandidateFieldRoot root) { } public void Visit(PredicateFieldRoot root) { _value = _predicate; } public void Visit(StaticFieldRoot root) { try { _value = _classSource.ForName(root.Type.Name); } catch (TypeLoadException e) { Sharpen.Runtime.PrintStackTrace(e); } } public void Visit(ArrayAccessValue operand) { operand.Parent().Accept(this); object parent = _value; operand.Index().Accept(this); int index = (int)_value; _value = Sharpen.Runtime.GetArrayValue(parent, index); } public void Visit(MethodCallValue operand) { operand.Parent().Accept(this); object receiver = _value; MethodInfo method = _resolver.Resolve(operand.Method); try { _value = method.Invoke(IsStatic(method) ? null : receiver, Args(operand)); } catch (Exception exc) { Sharpen.Runtime.PrintStackTrace(exc); _value = null; } } private object[] Args(MethodCallValue operand) { IComparisonOperand[] args = operand.Args; object[] @params = new object[args.Length]; for (int paramIdx = 0; paramIdx < args.Length; paramIdx++) { args[paramIdx].Accept(this); @params[paramIdx] = _value; } return @params; } private bool IsStatic(MethodInfo method) { return NativeQueriesPlatform.IsStatic(method); } public ComparisonQueryGeneratingVisitor(object predicate, INativeClassFactory classSource , IReferenceResolver resolver) : base() { _predicate = predicate; _classSource = classSource; _resolver = resolver; } } } ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization/SODAQueryBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Optimization0000644000175000017500000001062511520622624032745 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; using Db4objects.Db4o.NativeQueries.Optimization; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.NativeQueries.Optimization { public class SODAQueryBuilder { private class SODAQueryVisitor : IExpressionVisitor { private object _predicate; private IQuery _query; private IConstraint _constraint; private INativeClassFactory _classSource; private IReferenceResolver _referenceResolver; internal SODAQueryVisitor(IQuery query, object predicate, INativeClassFactory classSource , IReferenceResolver referenceResolver) { _query = query; _predicate = predicate; _classSource = classSource; _referenceResolver = referenceResolver; } public virtual void Visit(AndExpression expression) { expression.Left().Accept(this); IConstraint left = _constraint; expression.Right().Accept(this); left.And(_constraint); _constraint = left; } public virtual void Visit(BoolConstExpression expression) { } public virtual void Visit(OrExpression expression) { expression.Left().Accept(this); IConstraint left = _constraint; expression.Right().Accept(this); left.Or(_constraint); _constraint = left; } public virtual void Visit(ComparisonExpression expression) { IQuery subQuery = Descend(expression.Left()); ComparisonQueryGeneratingVisitor visitor = new ComparisonQueryGeneratingVisitor(_predicate , _classSource, _referenceResolver); expression.Right().Accept(visitor); _constraint = subQuery.Constrain(visitor.Value()); ComparisonOperator op = expression.Op(); if (op.Equals(ComparisonOperator.ValueEquality)) { return; } if (op.Equals(ComparisonOperator.ReferenceEquality)) { _constraint.Identity(); return; } if (op.Equals(ComparisonOperator.Greater)) { _constraint.Greater(); return; } if (op.Equals(ComparisonOperator.Smaller)) { _constraint.Smaller(); return; } if (op.Equals(ComparisonOperator.Contains)) { _constraint.Contains(); return; } if (op.Equals(ComparisonOperator.StartsWith)) { _constraint.StartsWith(true); return; } if (op.Equals(ComparisonOperator.EndsWith)) { _constraint.EndsWith(true); return; } throw new Exception("Can't handle constraint: " + op); } private IQuery Descend(FieldValue left) { IQuery subQuery = _query; IEnumerator fieldNameIterator = FieldNames(left); while (fieldNameIterator.MoveNext()) { subQuery = subQuery.Descend((string)fieldNameIterator.Current); } return subQuery; } public virtual void Visit(NotExpression expression) { expression.Expr().Accept(this); _constraint.Not(); } private IEnumerator FieldNames(FieldValue fieldValue) { Collection4 coll = new Collection4(); IComparisonOperand curOp = fieldValue; while (curOp is FieldValue) { FieldValue curField = (FieldValue)curOp; coll.Prepend(curField.FieldName()); curOp = curField.Parent(); } return coll.GetEnumerator(); } } public virtual void OptimizeQuery(IExpression expr, IQuery query, object predicate , INativeClassFactory classSource, IReferenceResolver referenceResolver) { expr.Accept(new SODAQueryBuilder.SODAQueryVisitor(query, predicate, classSource, referenceResolver)); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentation/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentat0000755000175000017500000000000011520622070032741 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentation/SODAMethodBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentat0000644000175000017500000001661311520622624032757 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; using Db4objects.Db4o.NativeQueries.Instrumentation; using Db4objects.Db4o.NativeQueries.Optimization; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.NativeQueries.Instrumentation { public class SODAMethodBuilder { private const bool LogBytecode = false; private IMethodRef descendRef; private IMethodRef constrainRef; private IMethodRef greaterRef; private IMethodRef smallerRef; private IMethodRef containsRef; private IMethodRef startsWithRef; private IMethodRef endsWithRef; private IMethodRef notRef; private IMethodRef andRef; private IMethodRef orRef; private IMethodRef identityRef; private readonly ITypeEditor _editor; private IMethodBuilder _builder; public static readonly string OptimizeQueryMethodName = "optimizeQuery"; private class SODAExpressionBuilder : IExpressionVisitor { private ITypeRef predicateClass; public SODAExpressionBuilder(SODAMethodBuilder _enclosing, ITypeRef predicateClass ) { this._enclosing = _enclosing; this.predicateClass = predicateClass; } public virtual void Visit(AndExpression expression) { expression.Left().Accept(this); expression.Right().Accept(this); this._enclosing.Invoke(this._enclosing.andRef); } public virtual void Visit(BoolConstExpression expression) { this.LoadQuery(); } //throw new RuntimeException("No boolean constants expected in parsed expression tree"); private void LoadQuery() { this._enclosing.LoadArgument(1); } public virtual void Visit(OrExpression expression) { expression.Left().Accept(this); expression.Right().Accept(this); this._enclosing.Invoke(this._enclosing.orRef); } public virtual void Visit(ComparisonExpression expression) { this.LoadQuery(); this.Descend(this.FieldNames(expression.Left())); expression.Right().Accept(this.ComparisonEmitter()); this.Constrain(expression.Op()); } private void Descend(IEnumerator fieldNames) { while (fieldNames.MoveNext()) { this.Descend(fieldNames.Current); } } private ComparisonBytecodeGeneratingVisitor ComparisonEmitter() { return new ComparisonBytecodeGeneratingVisitor(this._enclosing._builder, this.predicateClass ); } private void Constrain(ComparisonOperator op) { this._enclosing.Invoke(this._enclosing.constrainRef); if (op.Equals(ComparisonOperator.ValueEquality)) { return; } if (op.Equals(ComparisonOperator.ReferenceEquality)) { this._enclosing.Invoke(this._enclosing.identityRef); return; } if (op.Equals(ComparisonOperator.Greater)) { this._enclosing.Invoke(this._enclosing.greaterRef); return; } if (op.Equals(ComparisonOperator.Smaller)) { this._enclosing.Invoke(this._enclosing.smallerRef); return; } if (op.Equals(ComparisonOperator.Contains)) { this._enclosing.Invoke(this._enclosing.containsRef); return; } if (op.Equals(ComparisonOperator.StartsWith)) { this._enclosing.Ldc(1); this._enclosing.Invoke(this._enclosing.startsWithRef); return; } if (op.Equals(ComparisonOperator.EndsWith)) { this._enclosing.Ldc(1); this._enclosing.Invoke(this._enclosing.endsWithRef); return; } throw new Exception("Cannot interpret constraint: " + op); } private void Descend(object fieldName) { this._enclosing.Ldc(fieldName); this._enclosing.Invoke(this._enclosing.descendRef); } public virtual void Visit(NotExpression expression) { expression.Expr().Accept(this); this._enclosing.Invoke(this._enclosing.notRef); } private IEnumerator FieldNames(FieldValue fieldValue) { Collection4 coll = new Collection4(); IComparisonOperand curOp = fieldValue; while (curOp is FieldValue) { FieldValue curField = (FieldValue)curOp; coll.Prepend(curField.FieldName()); curOp = curField.Parent(); } return coll.GetEnumerator(); } private readonly SODAMethodBuilder _enclosing; } public SODAMethodBuilder(ITypeEditor editor) { _editor = editor; BuildMethodReferences(); } public virtual void InjectOptimization(IExpression expr) { _editor.AddInterface(TypeRef(typeof(IDb4oEnhancedFilter))); _builder = _editor.NewPublicMethod(PlatformName(OptimizeQueryMethodName), TypeRef (typeof(void)), new ITypeRef[] { TypeRef(typeof(IQuery)) }); ITypeRef predicateClass = _editor.Type; expr.Accept(new SODAMethodBuilder.SODAExpressionBuilder(this, predicateClass)); _builder.Pop(); _builder.EndMethod(); } private ITypeRef TypeRef(Type type) { return _editor.References.ForType(type); } private string PlatformName(string name) { return NativeQueriesPlatform.ToPlatformName(name); } private void LoadArgument(int index) { _builder.LoadArgument(index); } private void Invoke(IMethodRef method) { _builder.Invoke(method, CallingConvention.Interface); } private void Ldc(object value) { _builder.Ldc(value); } private void BuildMethodReferences() { descendRef = MethodRef(typeof(IQuery), "descend", new Type[] { typeof(string) }); constrainRef = MethodRef(typeof(IQuery), "constrain", new Type[] { typeof(object) }); greaterRef = MethodRef(typeof(IConstraint), "greater", new Type[] { }); smallerRef = MethodRef(typeof(IConstraint), "smaller", new Type[] { }); containsRef = MethodRef(typeof(IConstraint), "contains", new Type[] { }); startsWithRef = MethodRef(typeof(IConstraint), "startsWith", new Type[] { typeof( bool) }); endsWithRef = MethodRef(typeof(IConstraint), "endsWith", new Type[] { typeof(bool ) }); notRef = MethodRef(typeof(IConstraint), "not", new Type[] { }); andRef = MethodRef(typeof(IConstraint), "and", new Type[] { typeof(IConstraint) } ); orRef = MethodRef(typeof(IConstraint), "or", new Type[] { typeof(IConstraint) }); identityRef = MethodRef(typeof(IConstraint), "identity", new Type[] { }); } private IMethodRef MethodRef(Type parent, string name, Type[] args) { try { return _editor.References.ForMethod(parent.GetMethod(PlatformName(name), args)); } catch (Exception e) { throw new InstrumentationException(e); } } } } ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentation/TypeDeducingVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentat0000644000175000017500000000411111520622624032745 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Instrumentation { internal class TypeDeducingVisitor : IComparisonOperandVisitor { private ITypeRef _predicateClass; private ITypeRef _clazz; private IReferenceProvider _referenceProvider; public TypeDeducingVisitor(IReferenceProvider provider, ITypeRef predicateClass) { this._predicateClass = predicateClass; this._referenceProvider = provider; _clazz = null; } public virtual void Visit(PredicateFieldRoot root) { _clazz = _predicateClass; } public virtual void Visit(CandidateFieldRoot root) { } // _clazz=_candidateClass; public virtual void Visit(StaticFieldRoot root) { _clazz = root.Type; } public virtual ITypeRef OperandClass() { return _clazz; } public virtual void Visit(ArithmeticExpression operand) { } public virtual void Visit(ConstValue operand) { _clazz = _referenceProvider.ForType(operand.Value().GetType()); } public virtual void Visit(FieldValue operand) { _clazz = operand.Field.Type; } public virtual void Visit(ArrayAccessValue operand) { operand.Parent().Accept(this); _clazz = _clazz.ElementType; } public virtual void Visit(MethodCallValue operand) { _clazz = operand.Method.ReturnType; } } } ././@LongLink0000000000000000000000000000021700000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentation/ComparisonBytecodeGeneratingVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Instrumentat0000644000175000017500000001464011520622624032755 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; using Db4objects.Db4o.NativeQueries.Instrumentation; namespace Db4objects.Db4o.NativeQueries.Instrumentation { internal class ComparisonBytecodeGeneratingVisitor : IComparisonOperandVisitor { private IMethodBuilder _methodBuilder; private ITypeRef _predicateClass; private bool _inArithmetic = false; private ITypeRef _opClass = null; private ITypeRef _staticRoot = null; public ComparisonBytecodeGeneratingVisitor(IMethodBuilder methodBuilder, ITypeRef predicateClass) { this._methodBuilder = methodBuilder; this._predicateClass = predicateClass; } public virtual void Visit(ConstValue operand) { object value = operand.Value(); if (value != null) { _opClass = TypeRef(value.GetType()); } _methodBuilder.Ldc(value); if (value != null) { Box(_opClass, !_inArithmetic); } } private ITypeRef TypeRef(Type type) { return _methodBuilder.References.ForType(type); } public virtual void Visit(FieldValue fieldValue) { ITypeRef lastFieldClass = fieldValue.Field.Type; bool needConversion = lastFieldClass.IsPrimitive; fieldValue.Parent().Accept(this); if (_staticRoot != null) { _methodBuilder.LoadStaticField(fieldValue.Field); _staticRoot = null; return; } _methodBuilder.LoadField(fieldValue.Field); Box(lastFieldClass, !_inArithmetic && needConversion); } public virtual void Visit(CandidateFieldRoot root) { _methodBuilder.LoadArgument(1); } public virtual void Visit(PredicateFieldRoot root) { _methodBuilder.LoadArgument(0); } public virtual void Visit(StaticFieldRoot root) { _staticRoot = root.Type; } public virtual void Visit(ArrayAccessValue operand) { ITypeRef cmpType = DeduceFieldClass(operand.Parent()).ElementType; operand.Parent().Accept(this); bool outerInArithmetic = _inArithmetic; _inArithmetic = true; operand.Index().Accept(this); _inArithmetic = outerInArithmetic; _methodBuilder.LoadArrayElement(cmpType); Box(cmpType, !_inArithmetic); } public virtual void Visit(MethodCallValue operand) { IMethodRef method = operand.Method; ITypeRef retType = method.ReturnType; // FIXME: this should be handled within conversions bool needConversion = retType.IsPrimitive; operand.Parent().Accept(this); bool oldInArithmetic = _inArithmetic; for (int paramIdx = 0; paramIdx < operand.Args.Length; paramIdx++) { _inArithmetic = operand.Method.ParamTypes[paramIdx].IsPrimitive; operand.Args[paramIdx].Accept(this); } _inArithmetic = oldInArithmetic; _methodBuilder.Invoke(method, operand.CallingConvention); Box(retType, !_inArithmetic && needConversion); } public virtual void Visit(ArithmeticExpression operand) { bool oldInArithmetic = _inArithmetic; _inArithmetic = true; operand.Left().Accept(this); operand.Right().Accept(this); ITypeRef operandType = ArithmeticType(operand); switch (operand.Op().Id()) { case ArithmeticOperator.AddId: { _methodBuilder.Add(operandType); break; } case ArithmeticOperator.SubtractId: { _methodBuilder.Subtract(operandType); break; } case ArithmeticOperator.MultiplyId: { _methodBuilder.Multiply(operandType); break; } case ArithmeticOperator.DivideId: { _methodBuilder.Divide(operandType); break; } default: { throw new Exception("Unknown operand: " + operand.Op()); } } Box(_opClass, !oldInArithmetic); _inArithmetic = oldInArithmetic; } // FIXME: need to map dX,fX,... private void Box(ITypeRef boxedType, bool canApply) { if (!canApply) { return; } _methodBuilder.Box(boxedType); } private ITypeRef DeduceFieldClass(IComparisonOperand fieldValue) { TypeDeducingVisitor visitor = new TypeDeducingVisitor(_methodBuilder.References, _predicateClass); fieldValue.Accept(visitor); return visitor.OperandClass(); } private ITypeRef ArithmeticType(IComparisonOperand operand) { if (operand is ConstValue) { return PrimitiveType(((ConstValue)operand).Value().GetType()); } if (operand is FieldValue) { return ((FieldValue)operand).Field.Type; } if (operand is ArithmeticExpression) { ArithmeticExpression expr = (ArithmeticExpression)operand; ITypeRef left = ArithmeticType(expr.Left()); ITypeRef right = ArithmeticType(expr.Right()); if (left == DoubleType() || right == DoubleType()) { return DoubleType(); } if (left == FloatType() || right == FloatType()) { return FloatType(); } if (left == LongType() || right == LongType()) { return LongType(); } return IntType(); } return null; } private ITypeRef PrimitiveType(Type klass) { if (klass == typeof(int) || klass == typeof(short) || klass == typeof(bool) || klass == typeof(byte)) { return IntType(); } if (klass == typeof(double)) { return DoubleType(); } if (klass == typeof(float)) { return FloatType(); } if (klass == typeof(long)) { return LongType(); } return TypeRef(klass); } private ITypeRef IntType() { return TypeRef(typeof(int)); } private ITypeRef LongType() { return TypeRef(typeof(long)); } private ITypeRef FloatType() { return TypeRef(typeof(float)); } private ITypeRef DoubleType() { return TypeRef(typeof(double)); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/0000755000175000017500000000000011520622070031241 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/ComparisonExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Compari0000644000175000017500000000441611520622624032570 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr { public class ComparisonExpression : IExpression { private FieldValue _left; private IComparisonOperand _right; private ComparisonOperator _op; public ComparisonExpression(FieldValue left, IComparisonOperand right, ComparisonOperator op) { if (left == null || right == null || op == null) { throw new ArgumentNullException(); } this._left = left; this._right = right; this._op = op; } public virtual FieldValue Left() { return _left; } public virtual IComparisonOperand Right() { return _right; } public virtual ComparisonOperator Op() { return _op; } public override string ToString() { return _left + " " + _op + " " + _right; } public override bool Equals(object other) { if (this == other) { return true; } if (other == null || GetType() != other.GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.ComparisonExpression casted = (Db4objects.Db4o.NativeQueries.Expr.ComparisonExpression )other; return _left.Equals(casted._left) && _right.Equals(casted._right) && _op.Equals(casted ._op); } public override int GetHashCode() { return (_left.GetHashCode() * 29 + _right.GetHashCode()) * 29 + _op.GetHashCode(); } public virtual void Accept(IExpressionVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/BinaryExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/BinaryE0000644000175000017500000000340711520622624032526 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public abstract class BinaryExpression : IExpression { protected IExpression _left; protected IExpression _right; public BinaryExpression(IExpression left, IExpression right) { this._left = left; this._right = right; } public virtual IExpression Left() { return _left; } public virtual IExpression Right() { return _right; } public override bool Equals(object other) { if (this == other) { return true; } if (other == null || GetType() != other.GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.BinaryExpression casted = (Db4objects.Db4o.NativeQueries.Expr.BinaryExpression )other; return _left.Equals(casted._left) && (_right.Equals(casted._right)) || _left.Equals (casted._right) && (_right.Equals(casted._left)); } public override int GetHashCode() { return _left.GetHashCode() + _right.GetHashCode(); } public abstract void Accept(IExpressionVisitor arg1); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Build/0000755000175000017500000000000011520622042032277 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Build/ExpressionBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Build/E0000644000175000017500000001303411520622624032415 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Build { public class ExpressionBuilder { /// Optimizations: !(Bool)->(!Bool), !!X->X, !(X==Bool)->(X==!Bool) /// public virtual IExpression Not(IExpression expr) { if (expr.Equals(BoolConstExpression.True)) { return BoolConstExpression.False; } if (expr.Equals(BoolConstExpression.False)) { return BoolConstExpression.True; } if (expr is NotExpression) { return ((NotExpression)expr).Expr(); } if (expr is ComparisonExpression) { ComparisonExpression cmpExpr = (ComparisonExpression)expr; if (cmpExpr.Right() is ConstValue) { ConstValue rightConst = (ConstValue)cmpExpr.Right(); if (rightConst.Value() is bool) { bool boolVal = (bool)rightConst.Value(); // new Boolean() instead of Boolean.valueOf() for .NET conversion return new ComparisonExpression(cmpExpr.Left(), new ConstValue(!boolVal), cmpExpr .Op()); } } } return new NotExpression(expr); } /// Optimizations: f&&X->f, t&&X->X, X&&X->X, X&&!X->f public virtual IExpression And(IExpression left, IExpression right) { if (left.Equals(BoolConstExpression.False) || right.Equals(BoolConstExpression.False )) { return BoolConstExpression.False; } if (left.Equals(BoolConstExpression.True)) { return right; } if (right.Equals(BoolConstExpression.True)) { return left; } if (left.Equals(right)) { return left; } if (Negatives(left, right)) { return BoolConstExpression.False; } return new AndExpression(left, right); } /// Optimizations: X||t->t, f||X->X, X||X->X, X||!X->t public virtual IExpression Or(IExpression left, IExpression right) { if (left.Equals(BoolConstExpression.True) || right.Equals(BoolConstExpression.True )) { return BoolConstExpression.True; } if (left.Equals(BoolConstExpression.False)) { return right; } if (right.Equals(BoolConstExpression.False)) { return left; } if (left.Equals(right)) { return left; } if (Negatives(left, right)) { return BoolConstExpression.True; } return new OrExpression(left, right); } /// Optimizations: static bool roots public virtual BoolConstExpression Constant(bool value) { return BoolConstExpression.Expr(value); } public virtual IExpression IfThenElse(IExpression cond, IExpression truePath, IExpression falsePath) { IExpression expr = CheckBoolean(cond, truePath, falsePath); if (expr != null) { return expr; } return Or(And(cond, truePath), And(Not(cond), falsePath)); } private IExpression CheckBoolean(IExpression cmp, IExpression trueExpr, IExpression falseExpr) { if (cmp is BoolConstExpression) { return null; } if (trueExpr is BoolConstExpression) { bool leftNegative = trueExpr.Equals(BoolConstExpression.False); if (!leftNegative) { return Or(cmp, falseExpr); } else { return And(Not(cmp), falseExpr); } } if (falseExpr is BoolConstExpression) { bool rightNegative = falseExpr.Equals(BoolConstExpression.False); if (!rightNegative) { return And(cmp, trueExpr); } else { return Or(Not(cmp), falseExpr); } } if (cmp is NotExpression) { cmp = ((NotExpression)cmp).Expr(); IExpression swap = trueExpr; trueExpr = falseExpr; falseExpr = swap; } if (trueExpr is OrExpression) { OrExpression orExpr = (OrExpression)trueExpr; IExpression orLeft = orExpr.Left(); IExpression orRight = orExpr.Right(); if (falseExpr.Equals(orRight)) { IExpression swap = orRight; orRight = orLeft; orLeft = swap; } if (falseExpr.Equals(orLeft)) { return Or(orLeft, And(cmp, orRight)); } } if (falseExpr is AndExpression) { AndExpression andExpr = (AndExpression)falseExpr; IExpression andLeft = andExpr.Left(); IExpression andRight = andExpr.Right(); if (trueExpr.Equals(andRight)) { IExpression swap = andRight; andRight = andLeft; andLeft = swap; } if (trueExpr.Equals(andLeft)) { return And(andLeft, Or(cmp, andRight)); } } return null; } private bool Negatives(IExpression left, IExpression right) { return NegativeOf(left, right) || NegativeOf(right, left); } private bool NegativeOf(IExpression right, IExpression left) { return (right is NotExpression) && ((NotExpression)right).Expr().Equals(left); } } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpressionVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpres0000644000175000017500000000202711520622624032551 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public interface IExpressionVisitor { void Visit(AndExpression expression); void Visit(OrExpression expression); void Visit(NotExpression expression); void Visit(ComparisonExpression expression); void Visit(BoolConstExpression expression); } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/NotExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/NotExpr0000644000175000017500000000312211520622624032566 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public class NotExpression : IExpression { private IExpression _expr; public NotExpression(IExpression expr) { this._expr = expr; } public override string ToString() { return "!(" + _expr + ")"; } public virtual IExpression Expr() { return _expr; } public override bool Equals(object other) { if (this == other) { return true; } if (other == null || GetType() != other.GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.NotExpression casted = (Db4objects.Db4o.NativeQueries.Expr.NotExpression )other; return _expr.Equals(casted._expr); } public override int GetHashCode() { return -_expr.GetHashCode(); } public virtual void Accept(IExpressionVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpres0000644000175000017500000000200211520622624032542 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public interface IExpression : IExpressionPart { /// /// must implement the visitor interface required /// by the concrete Expression implementation. /// void Accept(IExpressionVisitor visitor); } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpressionPart.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IExpres0000644000175000017500000000140611520622624032551 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.NativeQueries.Expr { public interface IExpressionPart { } } ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/TraversingExpressionVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Travers0000644000175000017500000000464711520622624032632 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr { public class TraversingExpressionVisitor : IExpressionVisitor, IComparisonOperandVisitor { public virtual void Visit(AndExpression expression) { expression.Left().Accept(this); expression.Right().Accept(this); } public virtual void Visit(BoolConstExpression expression) { } public virtual void Visit(OrExpression expression) { expression.Left().Accept(this); expression.Right().Accept(this); } public virtual void Visit(ComparisonExpression expression) { expression.Left().Accept(this); expression.Right().Accept(this); } public virtual void Visit(NotExpression expression) { expression.Expr().Accept(this); } public virtual void Visit(ArithmeticExpression operand) { operand.Left().Accept(this); operand.Right().Accept(this); } public virtual void Visit(ConstValue operand) { } public virtual void Visit(FieldValue operand) { operand.Parent().Accept(this); } public virtual void Visit(CandidateFieldRoot root) { } public virtual void Visit(PredicateFieldRoot root) { } public virtual void Visit(StaticFieldRoot root) { } public virtual void Visit(ArrayAccessValue operand) { operand.Parent().Accept(this); operand.Index().Accept(this); } public virtual void Visit(MethodCallValue value) { value.Parent().Accept(this); VisitArgs(value); } protected virtual void VisitArgs(MethodCallValue value) { IComparisonOperand[] args = value.Args; for (int i = 0; i < args.Length; ++i) { args[i].Accept(this); } } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/OrExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/OrExpre0000644000175000017500000000213211520622624032553 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public class OrExpression : BinaryExpression { public OrExpression(IExpression left, IExpression right) : base(left, right) { } public override string ToString() { return "(" + _left + ")||(" + _right + ")"; } public override void Accept(IExpressionVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/IgnoredExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Ignored0000644000175000017500000000210111520622624032552 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public sealed class IgnoredExpression : IExpression { public static Db4objects.Db4o.NativeQueries.Expr.IgnoredExpression Instance = new Db4objects.Db4o.NativeQueries.Expr.IgnoredExpression(); private IgnoredExpression() { } public void Accept(IExpressionVisitor visitor) { } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/0000755000175000017500000000000011520622060031757 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/ArithmeticOperator.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ari0000644000175000017500000000356011520622624032427 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.NativeQueries.Expr.Cmp { public sealed class ArithmeticOperator { public const int AddId = 0; public const int SubtractId = 1; public const int MultiplyId = 2; public const int DivideId = 3; public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator Add = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator(AddId, "+"); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator Subtract = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator(SubtractId , "-"); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator Multiply = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator(MultiplyId , "*"); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator Divide = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ArithmeticOperator(DivideId, "/"); private string _op; private int _id; private ArithmeticOperator(int id, string op) { _id = id; _op = op; } public int Id() { return _id; } public override string ToString() { return _op; } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000755000175000017500000000000011520622070032424 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ArithmeticExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000431411520622624032435 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class ArithmeticExpression : IComparisonOperand { private ArithmeticOperator _op; private IComparisonOperand _left; private IComparisonOperand _right; public ArithmeticExpression(IComparisonOperand left, IComparisonOperand right, ArithmeticOperator op) { this._op = op; this._left = left; this._right = right; } public virtual IComparisonOperand Left() { return _left; } public virtual IComparisonOperand Right() { return _right; } public virtual ArithmeticOperator Op() { return _op; } public override string ToString() { return "(" + _left + _op + _right + ")"; } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null || obj.GetType() != GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ArithmeticExpression casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ArithmeticExpression )obj; return _left.Equals(casted._left) && _right.Equals(casted._right) && _op.Equals(casted ._op); } public override int GetHashCode() { int hc = _left.GetHashCode(); hc *= 29 + _right.GetHashCode(); hc *= 29 + _op.GetHashCode(); return hc; } public virtual void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/StaticFieldRoot.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000343111520622624032434 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class StaticFieldRoot : ComparisonOperandRoot { private ITypeRef _type; public StaticFieldRoot(ITypeRef type) { if (null == type) { throw new ArgumentNullException(); } _type = type; } public virtual ITypeRef Type { get { return _type; } } public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.StaticFieldRoot casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.StaticFieldRoot )obj; return _type.Equals(casted._type); } public override int GetHashCode() { return _type.GetHashCode(); } public override string ToString() { return _type.ToString(); } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000020500000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/IComparisonOperandAnchor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000166511520622624032443 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public interface IComparisonOperandAnchor : IComparisonOperand { IComparisonOperandAnchor Parent(); IComparisonOperandAnchor Root(); } } ././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ComparisonOperandRoot.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000211111520622624032426 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public abstract class ComparisonOperandRoot : IComparisonOperandAnchor { public virtual IComparisonOperandAnchor Parent() { return null; } public IComparisonOperandAnchor Root() { return this; } public abstract void Accept(IComparisonOperandVisitor arg1); } } ././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ArrayAccessValue.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000360011520622624032432 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class ArrayAccessValue : ComparisonOperandDescendant { private IComparisonOperand _index; public ArrayAccessValue(ComparisonOperandDescendant parent, IComparisonOperand index ) : base(parent) { _index = index; } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } public virtual IComparisonOperand Index() { return _index; } public override bool Equals(object obj) { if (!base.Equals(obj)) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ArrayAccessValue casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ArrayAccessValue )obj; return _index.Equals(casted._index); } public override int GetHashCode() { return base.GetHashCode() * 29 + _index.GetHashCode(); } public override string ToString() { return base.ToString() + "[" + _index + "]"; } public override ITypeRef Type { get { return ((ComparisonOperandDescendant)Parent()).Type.ElementType; } } } } ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/IComparisonOperand.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000167611520622624032445 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public interface IComparisonOperand : IExpressionPart { void Accept(IComparisonOperandVisitor visitor); } } ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/PredicateFieldRoot.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000237011520622624032435 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class PredicateFieldRoot : ComparisonOperandRoot { public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.PredicateFieldRoot Instance = new Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.PredicateFieldRoot (); private PredicateFieldRoot() { } public override string ToString() { return "PREDICATE"; } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000020600000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/IComparisonOperandVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000223211520622624032432 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public interface IComparisonOperandVisitor { void Visit(ArithmeticExpression operand); void Visit(ConstValue operand); void Visit(FieldValue operand); void Visit(CandidateFieldRoot root); void Visit(PredicateFieldRoot root); void Visit(StaticFieldRoot root); void Visit(ArrayAccessValue operand); void Visit(MethodCallValue value); } } ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/MethodCallValue.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000523011520622624032433 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class MethodCallValue : ComparisonOperandDescendant { private readonly IMethodRef _method; private readonly IComparisonOperand[] _args; private readonly Db4objects.Db4o.Instrumentation.Api.CallingConvention _callingConvention; public MethodCallValue(IMethodRef method, Db4objects.Db4o.Instrumentation.Api.CallingConvention callingConvention, IComparisonOperandAnchor parent, IComparisonOperand[] args) : base(parent) { _method = method; _args = args; _callingConvention = callingConvention; } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } public virtual IComparisonOperand[] Args { get { return _args; } } public override bool Equals(object obj) { if (!base.Equals(obj)) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.MethodCallValue casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.MethodCallValue )obj; return _method.Equals(casted._method) && _callingConvention == casted._callingConvention; } public override int GetHashCode() { int hc = base.GetHashCode(); hc *= 29 + _method.GetHashCode(); hc *= 29 + _args.GetHashCode(); hc *= 29 + _callingConvention.GetHashCode(); return hc; } public override string ToString() { return base.ToString() + "." + _method.Name + Iterators.Join(Iterators.Iterate(_args ), "(", ")", ", "); } public virtual IMethodRef Method { get { return _method; } } public virtual Db4objects.Db4o.Instrumentation.Api.CallingConvention CallingConvention { get { return _callingConvention; } } public override ITypeRef Type { get { return _method.ReturnType; } } } } ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/CandidateFieldRoot.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000237011520622624032435 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class CandidateFieldRoot : ComparisonOperandRoot { public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.CandidateFieldRoot Instance = new Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.CandidateFieldRoot (); private CandidateFieldRoot() { } public override string ToString() { return "CANDIDATE"; } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000021000000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ComparisonOperandDescendant.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000362111520622624032435 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public abstract class ComparisonOperandDescendant : IComparisonOperandAnchor { private IComparisonOperandAnchor _parent; protected ComparisonOperandDescendant(IComparisonOperandAnchor _parent) { this._parent = _parent; } public IComparisonOperandAnchor Parent() { return _parent; } public IComparisonOperandAnchor Root() { return _parent.Root(); } public abstract ITypeRef Type { get; } public override bool Equals(object obj) { if (this == obj) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ComparisonOperandDescendant casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ComparisonOperandDescendant)obj; return _parent.Equals(casted._parent); } public override int GetHashCode() { return _parent.GetHashCode(); } public override string ToString() { return _parent.ToString(); } public abstract void Accept(IComparisonOperandVisitor arg1); } } ././@LongLink0000000000000000000000000000017700000000000011572 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ThreeWayComparison.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000254711520622624032443 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class ThreeWayComparison : IExpressionPart { private FieldValue _left; private IComparisonOperand _right; private bool _swapped; public ThreeWayComparison(FieldValue left, IComparisonOperand right, bool swapped ) { this._left = left; this._right = right; _swapped = swapped; } public virtual FieldValue Left() { return _left; } public virtual IComparisonOperand Right() { return _right; } public virtual bool Swapped() { return _swapped; } } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/FieldValue.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000357111520622624032441 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class FieldValue : ComparisonOperandDescendant { private readonly IFieldRef _field; public FieldValue(IComparisonOperandAnchor root, IFieldRef field) : base(root) { _field = field; } public virtual string FieldName() { return _field.Name; } public override bool Equals(object other) { if (!base.Equals(other)) { return false; } Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.FieldValue casted = (Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.FieldValue )other; return _field.Equals(casted._field); } public override int GetHashCode() { return base.GetHashCode() * 29 + _field.GetHashCode(); } public override string ToString() { return base.ToString() + "." + _field; } public override void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } public virtual IFieldRef Field { get { return _field; } } public override ITypeRef Type { get { return _field.Type; } } } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Operand/ConstValue.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Ope0000644000175000017500000000364711520622624032445 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand; namespace Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand { public class ConstValue : IComparisonOperand { private object _value; public ConstValue(object value) { this._value = value; } public virtual object Value() { return _value; } public virtual void Value(object value) { _value = value; } public override string ToString() { if (_value == null) { return "null"; } if (_value is string) { return "\"" + _value + "\""; } return _value.ToString(); } public override bool Equals(object other) { if (this == other) { return true; } if (other == null || GetType() != other.GetType()) { return false; } object otherValue = ((Db4objects.Db4o.NativeQueries.Expr.Cmp.Operand.ConstValue)other )._value; if (otherValue == _value) { return true; } if (otherValue == null || _value == null) { return false; } return _value.Equals(otherValue); } public override int GetHashCode() { return _value.GetHashCode(); } public virtual void Accept(IComparisonOperandVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/ComparisonOperator.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/Cmp/Com0000644000175000017500000000552011520622624032430 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.NativeQueries.Expr.Cmp { public sealed class ComparisonOperator { public const int EqualsId = 0; public const int SmallerId = 1; public const int GreaterId = 2; public const int ContainsId = 3; public const int StartswithId = 4; public const int EndswithId = 5; public const int IdentityId = 6; public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator ValueEquality = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(EqualsId , "==", true); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator Smaller = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(SmallerId , "<", false); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator Greater = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(GreaterId , ">", false); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator Contains = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(ContainsId , "", false); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator StartsWith = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(StartswithId , "", false); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator EndsWith = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator(EndswithId , "", false); public static readonly Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator ReferenceEquality = new Db4objects.Db4o.NativeQueries.Expr.Cmp.ComparisonOperator (IdentityId, "===", true); private int _id; private string _op; private bool _symmetric; private ComparisonOperator(int id, string op, bool symmetric) { // TODO: switch to individual classes and visitor dispatch? _id = id; _op = op; _symmetric = symmetric; } public int Id() { return _id; } public override string ToString() { return _op; } public bool IsSymmetric() { return _symmetric; } } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/BoolConstExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/BoolCon0000644000175000017500000000327511520622624032533 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public class BoolConstExpression : IExpression { public static readonly Db4objects.Db4o.NativeQueries.Expr.BoolConstExpression True = new Db4objects.Db4o.NativeQueries.Expr.BoolConstExpression(true); public static readonly Db4objects.Db4o.NativeQueries.Expr.BoolConstExpression False = new Db4objects.Db4o.NativeQueries.Expr.BoolConstExpression(false); private bool _value; private BoolConstExpression(bool value) { this._value = value; } public virtual bool Value() { return _value; } public override string ToString() { return _value.ToString(); } public static Db4objects.Db4o.NativeQueries.Expr.BoolConstExpression Expr(bool value ) { return (value ? True : False); } public virtual void Accept(IExpressionVisitor visitor) { visitor.Visit(this); } public virtual IExpression Negate() { return (_value ? False : True); } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/AndExpression.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries/Expr/AndExpr0000644000175000017500000000213411520622624032532 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.NativeQueries.Expr; namespace Db4objects.Db4o.NativeQueries.Expr { public class AndExpression : BinaryExpression { public AndExpression(IExpression left, IExpression right) : base(left, right) { } public override string ToString() { return "(" + _left + ")&&(" + _right + ")"; } public override void Accept(IExpressionVisitor visitor) { visitor.Visit(this); } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries-CF-2008.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries-CF-2008.cspr0000644000175000017500000002023211520622066032075 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {84DA1E13-9FBB-4A5D-B657-04973B40B48C} Library Properties Db4objects.Db4o.NativeQueries_CF_2008 Db4objects.Db4o.NativeQueries {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4objects.Db4o.NativeQueries_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) prompt 512 4 true true Off bin\Debug\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF_3_5;CF;$(PlatformFamilyName) prompt 512 4 true true Off bin\Release\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; False ..\Libs\compact-2.0\Cecil.FlowAnalysis.dll False ..\Libs\compact-2.0\Mono.Cecil.dll {F266671C-596C-486B-B9E2-CE456FBC40D7} Db4objects.Db4o.Instrumentation-CF-2008 {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/0000755000175000017500000000000011520622042024253 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/0000755000175000017500000000000011520622066031616 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Optimization/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Optim0000755000175000017500000000000011520622042032621 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020500000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Optimization/NativeQueriesPlatform.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Optim0000644000175000017500000000176311520622624032640 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; namespace Db4objects.Db4o.NativeQueries.Optimization { class NativeQueriesPlatform { public static bool IsStatic(MethodInfo method) { return method.IsStatic; } public static string ToPlatformName(string name) { return char.ToUpper(name[0]) + name.Substring(1); } } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/ICachingStrategy.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/ICach0000644000175000017500000000145411520622624032514 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Internal.Query { public interface ICachingStrategy { void Add(K key, V item); V Get(K key); } }././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/NQOptimizer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/NQOpt0000644000175000017500000000304211520622624032541 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using Db4objects.Db4o.Instrumentation.Api; using Db4objects.Db4o.Instrumentation.Cecil; using Db4objects.Db4o.Instrumentation.Core; using Db4objects.Db4o.Internal.Query; using Db4objects.Db4o.NativeQueries.Expr; using Db4objects.Db4o.NativeQueries.Optimization; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.NativeQueries { public class NQOptimizer : INQOptimizer { private readonly INativeClassFactory _classFactory = new DefaultNativeClassFactory(); public void Optimize(IQuery q, object predicate, MethodBase filterMethod) { // TODO: cache predicate expressions here QueryExpressionBuilder builder = new QueryExpressionBuilder(); IExpression expression = builder.FromMethod(filterMethod); new SODAQueryBuilder().OptimizeQuery(expression, q, predicate, _classFactory, new CecilReferenceResolver()); } } } ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/QueryExpressionBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Query0000644000175000017500000006667011520622624032665 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections.Generic; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Instrumentation.Cecil; using Db4objects.Db4o.TA; using Mono.Collections.Generic; namespace Db4objects.Db4o.NativeQueries { using System; using System.Collections; using System.Reflection; using Mono.Cecil; using Cecil.FlowAnalysis; using Cecil.FlowAnalysis.ActionFlow; using Cecil.FlowAnalysis.CodeStructure; using Ast = Cecil.FlowAnalysis.CodeStructure; using Expr; using Expr.Cmp; using Expr.Cmp.Operand; using NQExpression = Expr.IExpression; using Internal.Query; /// /// Build a Db4objects.Db4o.Nativequery.Expr tree out of a predicate method definition. /// public class QueryExpressionBuilder { protected static ICachingStrategy _assemblyCachingStrategy = new SingleItemCachingStrategy( delegate(string location) { return AssemblyDefinition.ReadAssembly(location); }); protected static ICachingStrategy _expressionCachingStrategy = new SingleItemCachingStrategy( delegate(MethodBase method) { MethodDefinition methodDef = GetMethodDefinition(method); return AdjustBoxedValueTypes(FromMethodDefinition(methodDef)); } ); public NQExpression FromMethod(MethodBase method) { if (method == null) throw new ArgumentNullException("method"); return GetCachedExpression(method); } private static NQExpression GetCachedExpression(MethodBase method) { return _expressionCachingStrategy.Get(method); } private static MethodDefinition GetMethodDefinition(MethodBase method) { string location = GetAssemblyLocation(method); #if CF MethodDefinition methodDef = MethodDefinitionFor(method); #else AssemblyDefinition assembly = _assemblyCachingStrategy.Get(location); MethodDefinition methodDef = (MethodDefinition)assembly.MainModule.LookupToken(method.MetadataToken); #endif if (null == methodDef) UnsupportedPredicate(string.Format("Unable to load the definition of '{0}' from assembly '{1}'", method, location)); return methodDef; } private static MethodDefinition MethodDefinitionFor(MethodBase method) { string location = GetAssemblyLocation(method); AssemblyDefinition assembly = _assemblyCachingStrategy.Get(location); #if CF TypeDefinition declaringType = FindTypeDefinition(assembly.MainModule, method.DeclaringType); if (declaringType == null) { return null; } foreach (MethodDefinition candidate in declaringType.Methods) { if (candidate.Name != method.Name) continue; if (candidate.Parameters.Count != method.GetParameters().Length) continue; if (!ParametersMatch(candidate.Parameters, GetParameterTypes(method, assembly.MainModule))) continue; { return candidate; } } return null; #else return (MethodDefinition) assembly.MainModule.LookupToken(method.MetadataToken); #endif } private static NQExpression AdjustBoxedValueTypes(NQExpression expression) { expression.Accept(new BoxedValueTypeProcessor()); return expression; } private static IList GetParameterTypes(MethodBase method, ModuleDefinition module) { IList types = new List(); foreach (ParameterInfo parameter in ParametersFor(method)) { types.Add(FindTypeDefinition(module, parameter.ParameterType)); } return types; } private static ParameterInfo[] ParametersFor(MethodBase method) { if (method.IsGenericMethod) { MethodInfo methodInfo = (MethodInfo) method; return methodInfo.GetGenericMethodDefinition().GetParameters(); } return method.DeclaringType.IsGenericType ? method.DeclaringType.GetGenericTypeDefinition().GetMethod(method.Name).GetParameters() : method.GetParameters(); } private static TypeDefinition FindTypeDefinition(ModuleDefinition module, Type type) { return IsNested(type) ? FindNestedTypeDefinition(module, type) : FindTypeDefinition(module, type.IsGenericType ? type.Name : type.FullName); } private static bool IsNested(Type type) { return type.IsNestedPublic || type.IsNestedPrivate || type.IsNestedAssembly; } private static TypeDefinition FindNestedTypeDefinition(ModuleDefinition module, Type type) { foreach (TypeDefinition td in FindTypeDefinition(module, type.DeclaringType).NestedTypes) { if (td.Name == type.Name) return td; } return null; } private static TypeDefinition FindTypeDefinition(ModuleDefinition module, string name) { return module.GetType(name); } private static string GetAssemblyLocation(MethodBase method) { return method.DeclaringType.Module.FullyQualifiedName; } public static NQExpression FromMethodDefinition(MethodDefinition method) { ValidatePredicateMethodDefinition(method); Expression expression = GetQueryExpression(method); if (null == expression) UnsupportedPredicate("No expression found."); Visitor visitor = new Visitor(method, new AssemblyResolver(_assemblyCachingStrategy)); expression.Accept(visitor); return visitor.Expression; } private static void ValidatePredicateMethodDefinition(MethodDefinition method) { if (method == null) throw new ArgumentNullException("method"); if (1 != method.Parameters.Count) UnsupportedPredicate("A predicate must take a single argument."); if (0 != method.Body.ExceptionHandlers.Count) UnsupportedPredicate("A predicate can not contain exception handlers."); if (method.ReturnType.FullName != typeof(bool).FullName) UnsupportedPredicate("A predicate must have a boolean return type."); } private static Expression GetQueryExpression(MethodDefinition method) { ActionFlowGraph afg = FlowGraphFactory.CreateActionFlowGraph(FlowGraphFactory.CreateControlFlowGraph(method)); return GetQueryExpression(afg); } private static void UnsupportedPredicate(string reason) { throw new UnsupportedPredicateException(reason); } private static void UnsupportedExpression(Expression node) { UnsupportedPredicate("Unsupported expression: " + ExpressionPrinter.ToString(node)); } private static Expression GetQueryExpression(ActionFlowGraph afg) { IDictionary variables = new Dictionary(); ActionBlock block = afg.Blocks[0]; while (block != null) { switch (block.ActionType) { case ActionType.Invoke: InvokeActionBlock invokeBlock = (InvokeActionBlock)block; MethodInvocationExpression invocation = invokeBlock.Expression; if (IsActivateInvocation(invocation) || IsNoSideEffectIndirectActivationInvocation(invocation)) { block = invokeBlock.Next; break; } UnsupportedExpression(invocation); break; case ActionType.ConditionalBranch: UnsupportedPredicate("Conditional blocks are not supported."); break; case ActionType.Branch: block = ((BranchActionBlock)block).Target; break; case ActionType.Assign: { AssignActionBlock assignBlock = (AssignActionBlock)block; AssignExpression assign = assignBlock.AssignExpression; VariableReferenceExpression variable = assign.Target as VariableReferenceExpression; if (null == variable) { UnsupportedExpression(assign); } else { if (variables.ContainsKey(variable.Variable.Index)) UnsupportedExpression(assign.Expression); variables.Add(variable.Variable.Index, assign.Expression); block = assignBlock.Next; } break; } case ActionType.Return: { Expression expression = ((ReturnActionBlock)block).Expression; VariableReferenceExpression variable = expression as VariableReferenceExpression; return null == variable ? expression : variables[variable.Variable.Index]; } } } return null; } private static bool IsNoSideEffectIndirectActivationInvocation(MethodInvocationExpression invocation) { MethodDefinition methodDefinition = MethodDefinitionFor(invocation); if (null == methodDefinition) return false; ActionFlowGraph afg = FlowGraphFactory.CreateActionFlowGraph(FlowGraphFactory.CreateControlFlowGraph(methodDefinition)); if (afg.Blocks.Count == 2 && afg.Blocks[0].ActionType == ActionType.Invoke) { InvokeActionBlock invocationBlock = (InvokeActionBlock) afg.Blocks[0]; return IsActivateInvocation(invocationBlock.Expression); } return false; } private static MethodDefinition MethodDefinitionFor(MethodInvocationExpression invocation) { MethodReferenceExpression methodRef = invocation.Target as MethodReferenceExpression; if (null == methodRef) return null; return GetMethodDefinition(methodRef); } private static bool IsActivateInvocation(MethodInvocationExpression invocation) { MethodReferenceExpression methodRef = invocation.Target as MethodReferenceExpression; if (null == methodRef) return false; return IsActivateMethod(methodRef.Method); } private static bool IsActivateMethod(MethodReference method) { if (method.Name != "Activate") return false; return method.DeclaringType.FullName == typeof(IActivatable).FullName || IsOverridenActivateMethod(method); } private static bool IsOverridenActivateMethod(MethodReference method) { TypeDefinition declaringType = FindTypeDefinition(method.DeclaringType.Module, method.DeclaringType.FullName); if (!DeclaringTypeImplementsIActivatable(declaringType)) return false; if (method.Parameters.Count != 1 || method.Parameters[0].ParameterType.FullName != typeof(ActivationPurpose).FullName) return false; return true; } private static bool DeclaringTypeImplementsIActivatable(TypeDefinition type) { foreach (TypeReference itf in type.Interfaces) { if (itf.FullName == typeof (IActivatable).FullName) { return true; } } return false; } private static MethodDefinition GetMethodDefinition(MethodReferenceExpression methodRef) { MethodDefinition definition = methodRef.Method as MethodDefinition; return definition ?? LoadExternalMethodDefinition(methodRef); } private static MethodDefinition LoadExternalMethodDefinition(MethodReferenceExpression methodRef) { MethodReference method = methodRef.Method; AssemblyDefinition assemblyDef = new AssemblyResolver(_assemblyCachingStrategy).ForTypeReference(method.DeclaringType); TypeDefinition type = assemblyDef.MainModule.GetType(method.DeclaringType.FullName); return GetMethod(type, method); } private static MethodDefinition GetMethod(TypeDefinition type, MethodReference template) { foreach (MethodDefinition method in type.Methods) { if (method.Name != template.Name) continue; if (method.Parameters.Count != template.Parameters.Count) continue; if (!ParametersMatch(method.Parameters, template.Parameters)) continue; return method; } return null; } #if CF private static bool ParametersMatch(Collection parameters, IList templates) { return ParametersMatch(parameters, templates, delegate(ParameterDefinition candidate, TypeReference template) { return candidate.ParameterType.FullName == template.FullName; }); } #endif private static bool ParametersMatch(IList parameters, IList templates) { return ParametersMatch(parameters, templates, delegate(ParameterDefinition candidate, ParameterDefinition template) { return candidate.ParameterType.FullName == template.ParameterType.FullName; }); } private static bool ParametersMatch(IList parameters, IList templates, ParameterMatch predicate) { if (parameters.Count != templates.Count) return false; for (int i = 0; i < parameters.Count; i++) { ParameterDefinition parameter = parameters[i]; if (!predicate(parameter, templates[i])) return false; } return true; } private delegate bool ParameterMatch(ParameterDefinition candidate, T template); class Visitor : AbstractCodeStructureVisitor { private object _current; private int _insideCandidate; readonly IList _methodDefinitionStack = new ArrayList(); private readonly CecilReferenceProvider _referenceProvider; public Visitor(MethodDefinition topLevelMethod, AssemblyResolver resolver) { EnterMethodDefinition(topLevelMethod); AssemblyDefinition assembly = resolver.ForType(topLevelMethod.DeclaringType); _referenceProvider = CecilReferenceProvider.ForModule(assembly.MainModule); } private void EnterMethodDefinition(MethodDefinition method) { _methodDefinitionStack.Add(method); } private void LeaveMethodDefinition(MethodDefinition method) { int lastIndex = _methodDefinitionStack.Count - 1; object popped = _methodDefinitionStack[lastIndex]; System.Diagnostics.Debug.Assert(method == popped); _methodDefinitionStack.RemoveAt(lastIndex); } public NQExpression Expression { get { ConstValue value = _current as ConstValue; if (null != value) { return ToNQExpression(value); } return (NQExpression)_current; } } private static NQExpression ToNQExpression(ConstValue value) { if (IsTrue(value.Value())) return BoolConstExpression.True; return BoolConstExpression.False; } private static bool IsTrue(object o) { return ((IConvertible) o).ToBoolean(null); } private bool InsideCandidate { get { return _insideCandidate > 0; } } public override void Visit(CastExpression node) { node.Target.Accept(this); } public override void Visit(AssignExpression node) { UnsupportedExpression(node); } public override void Visit(VariableReferenceExpression node) { UnsupportedExpression(node); } public override void Visit(ArgumentReferenceExpression node) { UnsupportedExpression(node); } public override void Visit(UnaryExpression node) { switch (node.Operator) { case UnaryOperator.Not: Visit(node.Operand); Negate(); break; default: UnsupportedExpression(node); break; } } public override void Visit(Ast.BinaryExpression node) { switch (node.Operator) { case BinaryOperator.ValueEquality: PushComparison(node.Left, node.Right, ComparisonOperator.ValueEquality); break; case BinaryOperator.ValueInequality: PushComparison(node.Left, node.Right, ComparisonOperator.ValueEquality); Negate(); break; case BinaryOperator.LessThan: PushComparison(node.Left, node.Right, ComparisonOperator.Smaller); break; case BinaryOperator.GreaterThan: PushComparison(node.Left, node.Right, ComparisonOperator.Greater); break; case BinaryOperator.GreaterThanOrEqual: PushComparison(node.Left, node.Right, ComparisonOperator.Smaller); Negate(); break; case BinaryOperator.LessThanOrEqual: PushComparison(node.Left, node.Right, ComparisonOperator.Greater); Negate(); break; case BinaryOperator.LogicalOr: Push(new OrExpression(Convert(node.Left), Convert(node.Right))); break; case BinaryOperator.LogicalAnd: Push(new AndExpression(Convert(node.Left), Convert(node.Right))); break; default: UnsupportedExpression(node); break; } } private void Negate() { NQExpression top = (NQExpression)Pop(); NotExpression topNot = top as NotExpression; if (topNot != null) { Push(topNot.Expr()); return; } Push(new NotExpression(top)); } private void PushComparison(Expression lhs, Expression rhs, ComparisonOperator op) { Visit(lhs); object left = Pop(); Visit(rhs); object right = Pop(); bool areOperandsSwapped = IsCandidateFieldValue(right); if (areOperandsSwapped) { object temp = left; left = right; right = temp; } AssertType(left, typeof(FieldValue), lhs); AssertType(right, typeof(IComparisonOperand), rhs); Push(new ComparisonExpression((FieldValue)left, (IComparisonOperand)right, op)); if (areOperandsSwapped && !op.IsSymmetric()) { Negate(); } } private static bool IsCandidateFieldValue(object o) { FieldValue value = o as FieldValue; if (value == null) return false; return value.Root() is CandidateFieldRoot; } public override void Visit(MethodInvocationExpression node) { MethodReferenceExpression methodRef = node.Target as MethodReferenceExpression; if (null == methodRef) UnsupportedExpression(node); MethodReference method = methodRef.Method; if (IsOperator(method)) { ProcessOperatorMethodInvocation(node, method); return; } if (IsSystemString(method.DeclaringType)) { ProcessStringMethod(node, methodRef); return; } ProcessRegularMethodInvocation(node, methodRef); } private static bool IsSystemString(TypeReference type) { return type.FullName == "System.String"; } private void ProcessStringMethod(MethodInvocationExpression node, MethodReferenceExpression methodRef) { MethodReference method = methodRef.Method; if (method.Parameters.Count != 1 || !IsSystemString(method.Parameters[0].ParameterType)) { UnsupportedExpression(methodRef); } switch (method.Name) { case "Contains": PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.Contains); break; case "StartsWith": PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.StartsWith); break; case "EndsWith": PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.EndsWith); break; case "Equals": PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.ValueEquality); break; default: UnsupportedExpression(methodRef); break; } } private void ProcessRegularMethodInvocation(MethodInvocationExpression node, MethodReferenceExpression methodRef) { if (node.Arguments.Count != 0) UnsupportedExpression(node); Expression target = methodRef.Target; switch (target.CodeElementType) { case CodeElementType.ThisReferenceExpression: if (!InsideCandidate) UnsupportedExpression(node); ProcessCandidateMethodInvocation(node, methodRef); break; case CodeElementType.ArgumentReferenceExpression: ProcessCandidateMethodInvocation(node, methodRef); break; default: Push(ToFieldValue(target)); ProcessCandidateMethodInvocation(node, methodRef); break; } } private void ProcessOperatorMethodInvocation(MethodInvocationExpression node, MemberReference methodReference) { switch (methodReference.Name) { case "op_Equality": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.ValueEquality); break; case "op_Inequality": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.ValueEquality); Negate(); break; // XXX: check if the operations below are really supported for the // data types in question case "op_GreaterThanOrEqual": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.Smaller); Negate(); break; case "op_LessThanOrEqual": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.Greater); Negate(); break; case "op_LessThan": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.Smaller); break; case "op_GreaterThan": PushComparison(node.Arguments[0], node.Arguments[1], ComparisonOperator.Greater); break; default: UnsupportedExpression(node); break; } } private void ProcessCandidateMethodInvocation(Expression methodInvocationExpression, MethodReferenceExpression methodRef) { MethodDefinition method = GetMethodDefinition(methodRef); if (null == method) UnsupportedExpression(methodInvocationExpression); AssertMethodCanBeVisited(methodInvocationExpression, method); Expression expression = GetQueryExpression(method); if (null == expression) UnsupportedExpression(methodInvocationExpression); EnterCandidateMethod(method); try { Visit(expression); } finally { LeaveCandidateMethod(method); } } private void AssertMethodCanBeVisited(Expression methodInvocationExpression, MethodDefinition method) { if (_methodDefinitionStack.Contains(method)) UnsupportedExpression(methodInvocationExpression); } private void EnterCandidateMethod(MethodDefinition method) { EnterMethodDefinition(method); ++_insideCandidate; } private void LeaveCandidateMethod(MethodDefinition method) { --_insideCandidate; LeaveMethodDefinition(method); } private static bool IsOperator(MethodReference method) { return !method.HasThis && method.Name.StartsWith("op_") && 2 == method.Parameters.Count; } public override void Visit(FieldReferenceExpression node) { PushFieldValueForTarget(node, node.Target); } private void PushFieldValueForTarget(FieldReferenceExpression node, Expression target) { switch (target.CodeElementType) { case CodeElementType.ArgumentReferenceExpression: PushFieldValue(CandidateFieldRoot.Instance, node.Field); break; case CodeElementType.ThisReferenceExpression: if (InsideCandidate) { if (_current != null) { FieldValue current = PopFieldValue(node); PushFieldValue(current, node.Field); } else { PushFieldValue(CandidateFieldRoot.Instance, node.Field); } } else { PushFieldValue(PredicateFieldRoot.Instance, node.Field); } break; case CodeElementType.MethodInvocationExpression: case CodeElementType.FieldReferenceExpression: FieldValue value = ToFieldValue(target); PushFieldValue(value, node.Field); break; case CodeElementType.CastExpression: PushFieldValueForTarget(node, ((CastExpression)node.Target).Target); break; default: UnsupportedExpression(node); break; } } private void PushFieldValue(IComparisonOperandAnchor value, FieldReference field) { Push(new FieldValue(value, _referenceProvider.ForCecilField(field))); } public override void Visit(LiteralExpression node) { Push(new ConstValue(node.Value)); } NQExpression Convert(Expression node) { return ReconstructNullComparisonIfNecessary(node); } private NQExpression ReconstructNullComparisonIfNecessary(Expression node) { Visit(node); object top = Pop(); FieldValue fieldValue = top as FieldValue; if (fieldValue == null) { AssertType(top, typeof(NQExpression), node); return (NQExpression)top; } return new NotExpression( new ComparisonExpression( fieldValue, new ConstValue(null), ComparisonOperator.ValueEquality)); } FieldValue ToFieldValue(Expression node) { Visit(node); return PopFieldValue(node); } private FieldValue PopFieldValue(Expression node) { return (FieldValue)Pop(node, typeof(FieldValue)); } void Push(object value) { Assert(_current == null, "expression stack must be empty before Push"); _current = value; } object Pop(Expression node, Type expectedType) { object value = Pop(); AssertType(value, expectedType, node); return value; } private static void AssertType(object value, Type expectedType, Expression sourceExpression) { Type actualType = value.GetType(); if (!expectedType.IsAssignableFrom(actualType)) { UnsupportedPredicate( string.Format("Unsupported expression: {0}. Unexpected type on stack. Expected: {1}, Got: {2}.", ExpressionPrinter.ToString(sourceExpression), expectedType, actualType)); } } object Pop() { Assert(_current != null, "expression stack is empty"); object value = _current; _current = null; return value; } private static void Assert(bool condition, string message) { System.Diagnostics.Debug.Assert(condition, message); } } } internal class BoxedValueTypeProcessor : TraversingExpressionVisitor { override public void Visit(ComparisonExpression expression) { TypeReference fieldType = GetFieldType(expression.Left()); if (!fieldType.IsValueType) return; ConstValue constValue = expression.Right() as ConstValue; if (constValue == null) return; AdjustConstValue(fieldType, constValue); } private static TypeReference GetFieldType(FieldValue field) { return ((CecilFieldRef) field.Field).FieldType; } private static void AdjustConstValue(TypeReference typeRef, ConstValue constValue) { object value = constValue.Value(); if (!value.GetType().IsValueType) return; System.Type type = ResolveTypeReference(typeRef); if (!type.IsEnum || value.GetType() == type) return; constValue.Value(Enum.ToObject(type, value)); } private static Type ResolveTypeReference(TypeReference typeRef) { Assembly assembly = LoadAssembly(typeRef.Scope); return assembly.GetType(typeRef.FullName.Replace('/', '+'), true); } private static Assembly LoadAssembly(IMetadataScope scope) { AssemblyNameReference nameRef = scope as AssemblyNameReference; if (null != nameRef) return Assembly.Load(nameRef.FullName); ModuleDefinition moduleDef = scope as ModuleDefinition; return LoadAssembly(moduleDef.Assembly.Name); } } }././@LongLink0000000000000000000000000000020000000000000011555 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/UnsupportedPredicateException.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Unsup0000644000175000017500000000156111520622624032656 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.NativeQueries { using System; public class UnsupportedPredicateException : Exception { public UnsupportedPredicateException(string reason) : base(reason) { } } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/AssemblyResolver.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Assem0000644000175000017500000000456511520622624032623 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections.Generic; using System.Reflection; using Db4objects.Db4o.Internal.Query; using Mono.Cecil; namespace Db4objects.Db4o.NativeQueries { internal class AssemblyResolver { public AssemblyResolver(ICachingStrategy assemblyCache) { _assemblyCachingStrategy = assemblyCache; } public AssemblyDefinition ForTypeReference(TypeReference type) { AssemblyNameReference scope = (AssemblyNameReference)type.Scope; string assemblyName = scope.FullName; AssemblyDefinition definition = LookupAssembly(assemblyName); if (null == definition) { Assembly assembly = Assembly.Load(assemblyName); string location = assembly.GetType(type.FullName, true).Module.FullyQualifiedName; definition = _assemblyCachingStrategy.Get(location); RegisterAssembly(definition); } return definition; } private AssemblyDefinition LookupAssembly(string fullName) { return _assemblies.ContainsKey(fullName) ? _assemblies[fullName] : null; } /// /// Registers an assembly so it can be looked up by its assembly name /// string later. /// /// private void RegisterAssembly(AssemblyDefinition assembly) { _assemblies.Add(assembly.Name.FullName, assembly); } public AssemblyDefinition ForType(TypeDefinition type) { AssemblyDefinition assembly = type.Module.Assembly; RegisterAssembly(assembly); return assembly; } private readonly ICachingStrategy _assemblyCachingStrategy; readonly IDictionary _assemblies = new Dictionary(); } } ././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/SingleItemCachingStrategy.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/native/Db4objects.Db4o.NativeQueries/Singl0000644000175000017500000000404111520622624032614 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Db4o.Internal.Query { public delegate R Producer(T arg); /// /// A very simple caching strategy that caches only the last added item. /// public class SingleItemCachingStrategy : ICachingStrategy { private K _lastKey; private V _lastItem; private object _monitor = new object(); private readonly Producer _producer; public SingleItemCachingStrategy(Producer producer) { _producer = producer; } #region ICachingStrategy Members public void Add(K key, V item) { if (!typeof(K).IsValueType && null == key) throw new ArgumentNullException("key"); lock (_monitor) { _lastKey = key; _lastItem = item; } } public V Get(K key) { if (null == key) throw new ArgumentNullException("key"); lock (_monitor) { if (!key.Equals(_lastKey)) { Add(key, _producer(key)); } return _lastItem; } } #endregion } public class NullCachingStrategy : ICachingStrategy { public static readonly ICachingStrategy Default = new NullCachingStrategy(); #region ICachingStrategy Members public void Add(object key, object item) { } public object Get(object key) { return null; } #endregion } }db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries-2008.csproj0000644000175000017500000001616411520622044032145 0ustar directhexdirecthex Debug AnyCPU 9.0.21022 2.0 {AB1BF369-A9C4-4876-9797-178DB8AD437F} Library Properties Db4objects.Db4o.NativeQueries Db4objects.Db4o.NativeQueries 2.0 v3.5 true ../db4objects.snk true full false bin\Debug\ DEBUG;TRACE;NET_3_5 prompt 4 bin\Debug\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5 prompt 4 bin\Release\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; False ..\Libs\net-2.0\Cecil.FlowAnalysis.dll False ..\Libs\net-2.0\Mono.Cecil.dll 3.5 {FFA59708-14D1-4C22-B9A4-1A389EE796D5} Db4objects.Db4o.Instrumentation-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Db4objects.Db4o.NativeQueries-2010.csproj0000644000175000017500000002100611520622044032125 0ustar directhexdirecthex Debug AnyCPU 9.0.21022 2.0 {AB1BF369-A9C4-4876-9797-178DB8AD437F} Library Properties Db4objects.Db4o.NativeQueries Db4objects.Db4o.NativeQueries 3.5 v4.0 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5;NET_4_0 prompt 4 bin\Debug\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5;NET_4_0 prompt 4 bin\Release\Db4objects.Db4o.NativeQueries.xml 1591;1572;1573;1574;0419; False ..\Libs\net-2.0\Cecil.FlowAnalysis.dll False ..\Libs\net-2.0\Mono.Cecil.dll 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {DFE1C46F-BB18-4B6A-AE34-4366F58BEB5A} Db4objects.Db4o.Instrumentation-2010 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Makefile0000644000175000017500000000031611520622054024430 0ustar directhexdirecthex include ../../db4o.net/include.mk OUTDIR = ../../db4o.net/bin TARGET = library ASSEMBLY = $(NQ) REFERENCES = -r:$(OUTDIR)/$(CORE) -r:$(OUTDIR)/$(INSTR) -r:$(OUTDIR)/$(CECIL) -r:$(OUTDIR)/$(FLOWANALYSIS) db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Properties/0000755000175000017500000000000011520622052025122 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.NativeQueries/Properties/AssemblyInfo.cs0000644000175000017500000000264111520622624030054 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.InteropServices; using System.Security; [assembly: AssemblyTitle("db4o - native query handling")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // attributes are automatically set by the build [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyKeyFile("")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyDescription("Db4objects.Db4o.NativeQueries 8.0.184.15484 (.NET)")] #if !CF [assembly: AllowPartiallyTrustedCallers] #endif [assembly: ComVisible(false)] db4o-8.0.184.15484+dfsg/src/tools/0000755000175000017500000000000011621751251016577 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/0000755000175000017500000000000011520622066022300 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/0000755000175000017500000000000011520622040023556 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/0000755000175000017500000000000011520622042026636 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/0000755000175000017500000000000011520622070030764 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/ClientConnectionsMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/ClientC0000644000175000017500000000313011520622622032230 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.CS.Config; using Db4objects.Db4o.CS.Internal; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.CS.Monitoring { public class ClientConnectionsMonitoringSupport : IServerConfigurationItem { public void Prepare(IServerConfiguration configuration) { } public void Apply(IObjectServer server) { PerformanceCounter clientConnections = null; ObjectContainerBase container = (ObjectContainerBase) server.Ext().ObjectContainer(); container.WithEnvironment(delegate { clientConnections = Db4oClientServerPerformanceCounters.CounterForNetworkingClientConnections(server); }); ServerEventsFor(server).Closed += delegate { clientConnections.RemoveInstance();}; } private static IObjectServerEvents ServerEventsFor(IObjectServer server) { return ((IObjectServerEvents) server); } } } #endif././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/MonitoredServerSocket4.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Monitor0000644000175000017500000000242011520622622032337 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Monitoring { public class MonitoredServerSocket4 : ServerSocket4Decorator { public MonitoredServerSocket4(IServerSocket4 serverSocket) : base(serverSocket) { _serverSocket = serverSocket; } public override ISocket4 Accept() { return new MonitoredServerSideClientSocket4(_serverSocket.Accept(), _counters); } public override void Close() { base.Close(); _counters.Close(); } private readonly NetworkingCounters _counters = new NetworkingCounters(); } } #endif././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/MonitoredClientSocket4.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Monitor0000644000175000017500000000233111520622622032340 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Monitoring { public class MonitoredClientSocket4 : MonitoredSocket4Base { public MonitoredClientSocket4(ISocket4 socket) : base(socket) { } public override void Close() { base.Close(); _counters.Close(); } protected override NetworkingCounters Counters() { if (null == _counters) { _counters = new NetworkingCounters(); } return _counters; } private NetworkingCounters _counters; } } #endif././@LongLink0000000000000000000000000000020100000000000011556 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/MonitoredServerSideClientSocket4.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Monitor0000644000175000017500000000220711520622622032342 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Monitoring { public class MonitoredServerSideClientSocket4 : MonitoredSocket4Base { public MonitoredServerSideClientSocket4(ISocket4 socket, NetworkingCounters counters) : base(socket) { _counters = counters; } protected override NetworkingCounters Counters() { return _counters; } private readonly NetworkingCounters _counters; } } #endif././@LongLink0000000000000000000000000000020400000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Db4oClientServerPerformanceCounters.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Db4oCli0000644000175000017500000000332611520622622032136 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.CS.Internal; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Monitoring; namespace Db4objects.Db4o.CS.Monitoring { public class Db4oClientServerPerformanceCounters : Db4oPerformanceCounters { public static PerformanceCounter CounterForNetworkingClientConnections(IObjectServer server) { PerformanceCounter clientConnections = NewDb4oCounter(PerformanceCounterSpec.NetClientConnections.Id, false); IObjectServerEvents serverEvents = (IObjectServerEvents) server; serverEvents.ClientConnected += delegate { clientConnections.Increment(); }; serverEvents.ClientDisconnected += delegate { clientConnections.Decrement(); }; return clientConnections; } /* * TODO: Remove */ private static PerformanceCounter NewDb4oCounter(string counterName, bool readOnly) { string instanceName = My.Instance.ToString(); return NewDb4oCounter(counterName, instanceName, readOnly); } } } #endif././@LongLink0000000000000000000000000000017000000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/MonitoredSocket4Factory.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Monitor0000644000175000017500000000262211520622622032343 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Monitoring { public class MonitoredSocket4Factory : ISocket4Factory { private readonly ISocket4Factory _socketFactory; public MonitoredSocket4Factory(ISocket4Factory socketFactory) { _socketFactory = socketFactory; } public ISocket4 CreateSocket(string hostName, int port) { return new MonitoredClientSocket4(_socketFactory.CreateSocket(hostName, port)); } public IServerSocket4 CreateServerSocket(int port) { return new MonitoredServerSocket4(_socketFactory.CreateServerSocket(port)); } } } #endif././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/NetworkingCounters.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Network0000644000175000017500000000375311520622622032353 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Diagnostics; using Db4objects.Db4o.Monitoring; namespace Db4objects.Db4o.CS.Monitoring { public class NetworkingCounters { internal PerformanceCounter BytesSent() { if (null == _bytesSent) { _bytesSent = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.NetBytesSentPerSec, false); } return _bytesSent; } internal PerformanceCounter BytesReceived() { if (null == _bytesReceived) { _bytesReceived = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.NetBytesReceivedPerSec, false); } return _bytesReceived; } internal PerformanceCounter MessagesSent() { if (null == _messagesSent) { _messagesSent = Db4oPerformanceCounters.CounterFor(PerformanceCounterSpec.NetMessagesSentPerSec, false); } return _messagesSent; } public void Close() { Dispose(_bytesSent); Dispose(_bytesReceived); Dispose(_messagesSent); } private static void Dispose(PerformanceCounter counter) { if (null != counter) { counter.RemoveInstance(); counter.Dispose(); } } private PerformanceCounter _bytesSent; private PerformanceCounter _bytesReceived; private PerformanceCounter _messagesSent; } } #endif././@LongLink0000000000000000000000000000016500000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/MonitoredSocket4Base.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Monitor0000644000175000017500000000263711520622622032351 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Monitoring { public abstract class MonitoredSocket4Base : Socket4Decorator { protected MonitoredSocket4Base(ISocket4 socket) : base(socket) { } public override void Write(byte[] bytes, int offset, int count) { base.Write(bytes, offset, count); Counters().BytesSent().IncrementBy(count); Counters().MessagesSent().Increment(); } public override int Read(byte[] buffer, int offset, int count) { int bytesReceived = base.Read(buffer, offset, count); Counters().BytesReceived().IncrementBy(bytesReceived); return bytesReceived; } protected abstract NetworkingCounters Counters(); } } #endif././@LongLink0000000000000000000000000000017400000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/NetworkingMonitoringSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Monitoring/Network0000644000175000017500000000273611520622622032353 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using Db4objects.Db4o.Config; using Db4objects.Db4o.CS.Config; using Db4objects.Db4o.CS.Foundation; using Db4objects.Db4o.CS.Internal.Config; using Db4objects.Db4o.Internal; namespace Db4objects.Db4o.CS.Monitoring { public class NetworkingMonitoringSupport:IConfigurationItem { public void Prepare(IConfiguration configuration) { INetworkingConfiguration networkConfig = Db4oClientServerLegacyConfigurationBridge.AsNetworkingConfiguration(configuration); ISocket4Factory currentSocketFactory = networkConfig.SocketFactory; networkConfig.SocketFactory = new MonitoredSocket4Factory(currentSocketFactory); } public void Apply(IInternalObjectContainer container) { } } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/0000755000175000017500000000000011520622070030745 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/ServerSslSocket.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/ServerS0000644000175000017500000000227011520622622032265 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Security.Cryptography.X509Certificates; namespace Db4objects.Db4o.CS.Foundation { internal class ServerSslSocket : ServerSocket4Decorator { public ServerSslSocket(IServerSocket4 socket, X509Certificate2 certificate) : base(socket) { _certificate = certificate; } public override ISocket4 Accept() { ISocket4 socket = base.Accept(); return new SslSocket(socket, _certificate); } private readonly X509Certificate2 _certificate; } } #endif././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/Socket4Stream.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/Socket40000644000175000017500000000353111520622622032211 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; namespace Db4objects.Db4o.CS.Foundation { internal class Socket4Stream : Stream { public Socket4Stream(ISocket4 socket) { _socket = socket; } public override void Flush() { _socket.Flush(); } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } public override void SetLength(long value) { throw new NotSupportedException(); } public override int Read(byte[] buffer, int offset, int count) { return _socket.Read(buffer, offset, count); } public override void Write(byte[] buffer, int offset, int count) { _socket.Write(buffer, offset, count); } public override bool CanRead { get { return true ; } } public override bool CanSeek { get { return false; } } public override bool CanWrite { get { return true; } } public override long Length { get { throw new NotSupportedException(); } } public override long Position { get { throw new NotSupportedException(); } set { throw new NotSupportedException(); } } private readonly ISocket4 _socket; } }././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/SslSocket.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/SslSock0000644000175000017500000000417011520622622032256 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System; using System.Net.Security; using System.Security.Cryptography.X509Certificates; namespace Db4objects.Db4o.CS.Foundation { internal class SslSocket : ISocket4 { private SslSocket(ISocket4 socket) { _socket = socket; } public SslSocket(ISocket4 socket, string hostName, RemoteCertificateValidationCallback certificateValidationCallback) : this(socket) { _sslStream = new SslStream(new Socket4Stream(socket), false, certificateValidationCallback); _sslStream.AuthenticateAsClient(hostName); } public SslSocket(ISocket4 socket, X509Certificate2 certificate) : this(socket) { _sslStream = new SslStream(new Socket4Stream(socket), false); _sslStream.AuthenticateAsServer(certificate); } public void Close() { _sslStream.Close(); } public void Flush() { _sslStream.Flush(); } public void SetSoTimeout(int timeout) { _socket.SetSoTimeout(timeout); } public bool IsConnected() { return _socket.IsConnected(); } public int Read(byte[] buffer, int offset, int count) { return _sslStream.Read(buffer, offset, count); } public void Write(byte[] bytes, int offset, int count) { _sslStream.Write(bytes, offset, count); } public ISocket4 OpenParallelSocket() { throw new NotImplementedException(); } private readonly SslStream _sslStream; private readonly ISocket4 _socket; } } #endif././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/SslSocketFactory.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Foundation/SslSock0000644000175000017500000000347011520622622032260 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Net.Security; using System.Security.Cryptography.X509Certificates; namespace Db4objects.Db4o.CS.Foundation { public class SslSocketFactory : ISocket4Factory { public SslSocketFactory(ISocket4Factory delegating, X509Certificate2 certificate) { _certificate = certificate; _delegating = delegating; } public SslSocketFactory(ISocket4Factory delegating, RemoteCertificateValidationCallback validationCallback) { _delegating = delegating; _validationCallback = validationCallback; } public ISocket4 CreateSocket(string hostName, int port) { ISocket4 clientSocket = _delegating.CreateSocket(hostName, port); return new SslSocket(clientSocket, hostName, _validationCallback); } public IServerSocket4 CreateServerSocket(int port) { IServerSocket4 serverSocket = _delegating.CreateServerSocket(port); return new ServerSslSocket(serverSocket, _certificate); } private readonly ISocket4Factory _delegating; private readonly X509Certificate2 _certificate; private readonly RemoteCertificateValidationCallback _validationCallback; } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Config/0000755000175000017500000000000011520622044030045 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Config/ClientSslSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Config/ClientSslSu0000644000175000017500000000256011520622622032205 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Net.Security; using Db4objects.Db4o.CS.Foundation; using Db4objects.Db4o.Ext; namespace Db4objects.Db4o.CS.Config { public class ClientSslSupport : IClientConfigurationItem { public ClientSslSupport(RemoteCertificateValidationCallback validationCallback) { _validationCallback = validationCallback; } public void Prepare(IClientConfiguration configuration) { configuration.Networking.SocketFactory = new SslSocketFactory(configuration.Networking.SocketFactory, _validationCallback); } public void Apply(IExtClient client) { } private readonly RemoteCertificateValidationCallback _validationCallback; } } #endif././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Config/ServerSslSupport.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/native/Db4objects.Db4o.CS/Config/ServerSslSu0000644000175000017500000000244711520622622032241 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System.Security.Cryptography.X509Certificates; using Db4objects.Db4o.CS.Foundation; namespace Db4objects.Db4o.CS.Config { public class ServerSslSupport : IServerConfigurationItem { public ServerSslSupport(X509Certificate2 certificate) { _certificate = certificate; } public void Prepare(IServerConfiguration configuration) { configuration.Networking.SocketFactory = new SslSocketFactory(configuration.Networking.SocketFactory, _certificate); } public void Apply(IObjectServer server) { } private readonly X509Certificate2 _certificate; } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/Db4objects.Db4o.CS.Optional-2010.csproj0000644000175000017500000001366411520622066030756 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {2DC5A1FA-7BD9-4937-9E36-2EED126B7809} Library Properties DB4objects.Db4o.CS.Optional DB4objects.Db4o.CS.Optional v4.0 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5;NET_4_0 prompt 4 bin\Debug/DB4objects.Db4o.CS.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5;NET_4_0 prompt 4 1591;1572;1573;1574;0419; bin\Release/DB4objects.Db4o.CS.Optional.xml False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2010 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Db4objects.Db4o.Optional-2010 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/Db4objects.Db4o.CS.Optional-2008.csproj0000644000175000017500000001064711520622040030753 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {2DC5A1FA-7BD9-4937-9E36-2EED126B7809} Library Properties DB4objects.Db4o.CS.Optional DB4objects.Db4o.CS.Optional v3.5 512 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5 prompt 4 bin\Debug/DB4objects.Db4o.CS.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5 prompt 4 1591;1572;1573;1574;0419; bin\Release/DB4objects.Db4o.CS.Optional.xml {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2008 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Db4objects.Db4o.Optional-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/Db4objects.Db4o.CS.Optional-CF-2008.csproj0000644000175000017500000001365711520622064031253 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {16C8C5B5-2755-4F64-A901-FC62D0F1D9D6} Library Properties DB4objects.Db4o.CS.Optional DB4objects.Db4o.CS.Optional {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 DB4objects.Db4o.CS.Optional_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off bin\Debug/DB4objects.Db4o.CS.Optional.xml 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; bin\Release/DB4objects.Db4o.CS.Optional.xml False D:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.Core.dll {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85} Db4objects.Db4o.CS-CF-2008 {667C616E-FEA2-4D5E-93F0-9D18D17275FA} Db4objects.Db4o.Optional-CF-2008 {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/Properties/0000755000175000017500000000000011520622050024425 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.CS.Optional/Properties/AssemblyInfo.cs0000644000175000017500000000242111520622622027353 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using System.Runtime.InteropServices; using System.Security; [assembly: AssemblyTitle("db4o - optional cs functionality")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture ("")] [assembly: ComVisible (false)] [assembly: AssemblyVersion("8.0.184.15484")] #if !CF && !SILVERLIGHT [assembly: AllowPartiallyTrustedCallers] #endif [assembly: CLSCompliant(true)]db4o-8.0.184.15484+dfsg/src/Db4o-Silverlight-2010.sln0000644000175000017500000001556511520622054021627 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 11.00 # Visual Studio 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-Silverlight-2010", "Db4objects.Db4o\Db4objects.Db4o-Silverlight-2010.csproj", "{76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Optional-Silverlight-2010", "Db4objects.Db4o.Optional\Db4objects.Db4o.Optional-Silverlight-2010.csproj", "{97B6DEA6-255B-4B49-8973-38943AC2E70C}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Silverlight.TestStart-2010", "Db4objects.Db4o.Silverlight.TestStart\Db4objects.Db4o.Silverlight.TestStart-2010.csproj", "{A639AD3D-08FB-41D5-A770-B8BE540C369D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.SilverlightTestHost-2010", "Db4objects.Db4o.SilverlightTestHost\Db4objects.Db4o.SilverlightTestHost-2010.csproj", "{2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Tests-Silverlight-2010", "Db4objects.Db4o.Tests\Db4objects.Db4o.Tests-Silverlight-2010.csproj", "{C388ABDD-CB2C-4438-8942-C3A935AC8E2D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-Silverlight-2010", "Db4oUnit\Db4oUnit-Silverlight-2010.csproj", "{C74364D8-A04A-4CF9-801D-D1811D49E72A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-Silverlight-2010", "Db4oUnit.Extensions\Db4oUnit.Extensions-Silverlight-2010.csproj", "{13B5E015-9250-4E70-939D-56233D43D8C3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq-Silverlight-2010", "Db4objects.Db4o.Linq\Db4objects.Db4o.Linq-Silverlight-2010.csproj", "{2E56236C-E595-4DFF-9B9E-0E0509D29A4E}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq.Tests-Silverlight-2010", "Db4objects.Db4o.Linq.Tests\Db4objects.Db4o.Linq.Tests-Silverlight-2010.csproj", "{3384A556-4CE5-4959-B25B-59C2506B52E7}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Debug|Any CPU.Build.0 = Debug|Any CPU {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Debug|x86.ActiveCfg = Debug|Any CPU {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Release|Any CPU.ActiveCfg = Release|Any CPU {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Release|Any CPU.Build.0 = Release|Any CPU {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65}.Release|x86.ActiveCfg = Release|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Debug|Any CPU.Build.0 = Debug|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Debug|x86.ActiveCfg = Debug|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Release|Any CPU.ActiveCfg = Release|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Release|Any CPU.Build.0 = Release|Any CPU {97B6DEA6-255B-4B49-8973-38943AC2E70C}.Release|x86.ActiveCfg = Release|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Debug|x86.ActiveCfg = Debug|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Release|Any CPU.Build.0 = Release|Any CPU {A639AD3D-08FB-41D5-A770-B8BE540C369D}.Release|x86.ActiveCfg = Release|Any CPU {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Debug|x86.ActiveCfg = Debug|x86 {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Debug|x86.Build.0 = Debug|x86 {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Release|Any CPU.Build.0 = Release|Any CPU {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Release|x86.ActiveCfg = Release|x86 {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59}.Release|x86.Build.0 = Release|x86 {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Debug|Any CPU.Build.0 = Debug|Any CPU {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Debug|x86.ActiveCfg = Debug|Any CPU {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Release|Any CPU.ActiveCfg = Release|Any CPU {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Release|Any CPU.Build.0 = Release|Any CPU {C388ABDD-CB2C-4438-8942-C3A935AC8E2D}.Release|x86.ActiveCfg = Release|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Debug|Any CPU.Build.0 = Debug|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Debug|x86.ActiveCfg = Debug|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Release|Any CPU.ActiveCfg = Release|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Release|Any CPU.Build.0 = Release|Any CPU {C74364D8-A04A-4CF9-801D-D1811D49E72A}.Release|x86.ActiveCfg = Release|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Debug|x86.ActiveCfg = Debug|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Release|Any CPU.Build.0 = Release|Any CPU {13B5E015-9250-4E70-939D-56233D43D8C3}.Release|x86.ActiveCfg = Release|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Debug|Any CPU.Build.0 = Debug|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Debug|x86.ActiveCfg = Debug|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Release|Any CPU.Build.0 = Release|Any CPU {2E56236C-E595-4DFF-9B9E-0E0509D29A4E}.Release|x86.ActiveCfg = Release|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Debug|Any CPU.Build.0 = Debug|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Debug|x86.ActiveCfg = Debug|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Release|Any CPU.Build.0 = Release|Any CPU {3384A556-4CE5-4959-B25B-59C2506B52E7}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/Db4oUnit/0000755000175000017500000000000011520622070017061 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit-CF-2008.csproj0000644000175000017500000002437311520622070022621 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7} Library Properties Db4oUnit Db4oUnit {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4oUnit_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF;CF_3_5;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; False C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\mscorlib.dll False C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.dll {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit-Silverlight-2008.csproj0000644000175000017500000002307111520622060024616 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {C74364D8-A04A-4CF9-801D-D1811D49E72A} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4oUnit Db4oUnit v3.5 false true true true ../db4objects.snk true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2008 db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/0000755000175000017500000000000011520622040020506 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/0000755000175000017500000000000011520622070022141 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Check.cs0000644000175000017500000000316111520622622023511 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { /// /// Utility class to enable the reuse of object comparison and checking /// methods without asserting. /// /// /// Utility class to enable the reuse of object comparison and checking /// methods without asserting. /// public class Check { public static bool ObjectsAreEqual(object expected, object actual) { return expected == actual || (expected != null && actual != null && expected.Equals (actual)); } public static bool ArraysAreEqual(object[] expected, object[] actual) { if (expected == actual) { return true; } if (expected == null || actual == null) { return false; } if (expected.Length != actual.Length) { return false; } for (int i = 0; i < expected.Length; i++) { if (!ObjectsAreEqual(expected[i], actual[i])) { return false; } } return true; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestMethod.cs0000644000175000017500000000601311520622622024553 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { /// Reflection based db4ounit.Test implementation. /// Reflection based db4ounit.Test implementation. public class TestMethod : ITest { private readonly object _subject; private readonly MethodInfo _method; public TestMethod(object instance, MethodInfo method) { if (null == instance) { throw new ArgumentException("instance"); } if (null == method) { throw new ArgumentException("method"); } _subject = instance; _method = method; } public virtual object GetSubject() { return _subject; } public virtual MethodInfo GetMethod() { return _method; } public virtual string Label() { return _subject.GetType().FullName + "." + _method.Name; } public override string ToString() { return "TestMethod(" + _method + ")"; } public virtual void Run() { bool exceptionInTest = false; try { try { SetUp(); Invoke(); } catch (TargetInvocationException x) { exceptionInTest = true; throw new TestException(x.InnerException); } catch (Exception x) { exceptionInTest = true; throw new TestException(x); } } finally { try { TearDown(); } catch (Exception exc) { if (!exceptionInTest) { throw; } Sharpen.Runtime.PrintStackTrace(exc); } } } /// protected virtual void Invoke() { _method.Invoke(_subject, new object[0]); } protected virtual void TearDown() { if (_subject is ITestLifeCycle) { try { ((ITestLifeCycle)_subject).TearDown(); } catch (Exception e) { throw new TearDownFailureException(e); } } } protected virtual void SetUp() { if (_subject is ITestLifeCycle) { try { ((ITestLifeCycle)_subject).SetUp(); } catch (Exception e) { throw new SetupFailureException(e); } } } public virtual bool IsLeafTest() { return true; } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestFailure.cs0000644000175000017500000000274411520622622024731 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit; namespace Db4oUnit { public class TestFailure : Printable { private readonly string _testLabel; private readonly Exception _failure; public TestFailure(string test, Exception failure) { _testLabel = test; _failure = failure; } public virtual string TestLabel { get { return _testLabel; } } public virtual Exception Reason { get { return _failure; } } /// public override void Print(TextWriter writer) { writer.Write(_testLabel); writer.Write(": "); // TODO: don't print the first stack trace elements // which reference db4ounit.Assert methods TestPlatform.PrintStackTrace(writer, _failure); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/JaggedArrayAssert.cs0000644000175000017500000000317311520622622026041 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { public class JaggedArrayAssert { public static void AreEqual(object[][] expected, object[][] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); Assert.AreSame(expected.GetType(), actual.GetType()); for (int i = 0; i < expected.Length; i++) { ArrayAssert.AreEqual(expected[i], actual[i]); } } public static void AreEqual(int[][] expected, int[][] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); Assert.AreSame(expected.GetType(), actual.GetType()); for (int i = 0; i < expected.Length; i++) { ArrayAssert.AreEqual(expected[i], actual[i]); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestListener.cs0000644000175000017500000000170511520622622025234 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { public interface ITestListener { void RunStarted(); void TestStarted(ITest test); void TestFailed(ITest test, Exception failure); void RunFinished(); void Failure(string msg, Exception failure); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/SetupFailureException.cs0000644000175000017500000000170311520622622026763 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { [System.Serializable] public class SetupFailureException : TestException { private const long serialVersionUID = -7835097105469071064L; public SetupFailureException(Exception cause) : base(cause) { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/AssertionException.cs0000644000175000017500000000205311520622622026321 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { [System.Serializable] public partial class AssertionException : TestException { private const long serialVersionUID = 900088031151055525L; public AssertionException(string message) : base(message, null) { } public AssertionException(string message, Exception cause) : base(message, cause) { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ReflectionTestSuiteBuilder.cs0000644000175000017500000001627111520622622027755 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Reflection; using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class ReflectionTestSuiteBuilder : ITestSuiteBuilder { private Type[] _classes; public ReflectionTestSuiteBuilder(Type clazz) : this(new Type[] { clazz }) { } public ReflectionTestSuiteBuilder(Type[] classes) { if (null == classes) { throw new ArgumentException("classes"); } _classes = classes; } public virtual IEnumerator GetEnumerator() { return Iterators.Flatten(Iterators.Map(_classes, new _IFunction4_26(this))); } private sealed class _IFunction4_26 : IFunction4 { public _IFunction4_26(ReflectionTestSuiteBuilder _enclosing) { this._enclosing = _enclosing; } public object Apply(object arg) { Type klass = (Type)arg; try { return this._enclosing.FromClass(klass); } catch (Exception e) { return new FailingTest(klass.FullName, e); } } private readonly ReflectionTestSuiteBuilder _enclosing; } /// /// Can be overriden in inherited classes to inject new fixtures into /// the context. /// /// /// Can be overriden in inherited classes to inject new fixtures into /// the context. /// /// /// protected virtual object WithContext(IClosure4 closure) { return closure.Run(); } /// protected virtual IEnumerator FromClass(Type clazz) { if (typeof(IClassLevelFixtureTest).IsAssignableFrom(clazz)) { return Iterators.Iterate(new ClassLevelFixtureTestSuite[] { new ClassLevelFixtureTestSuite (clazz, new _IClosure4_52(this, clazz)) }); } return (IEnumerator)WithContext(new _IClosure4_63(this, clazz)); } private sealed class _IClosure4_52 : IClosure4 { public _IClosure4_52(ReflectionTestSuiteBuilder _enclosing, Type clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public object Run() { return (IEnumerator)this._enclosing.WithContext(new _IClosure4_54(this, clazz)); } private sealed class _IClosure4_54 : IClosure4 { public _IClosure4_54(_IClosure4_52 _enclosing, Type clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public object Run() { return new ContextfulIterator(this._enclosing._enclosing.SuiteFor(clazz)); } private readonly _IClosure4_52 _enclosing; private readonly Type clazz; } private readonly ReflectionTestSuiteBuilder _enclosing; private readonly Type clazz; } private sealed class _IClosure4_63 : IClosure4 { public _IClosure4_63(ReflectionTestSuiteBuilder _enclosing, Type clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public object Run() { return new ContextfulIterator(this._enclosing.SuiteFor(clazz)); } private readonly ReflectionTestSuiteBuilder _enclosing; private readonly Type clazz; } private IEnumerator SuiteFor(Type clazz) { if (!IsApplicable(clazz)) { TestPlatform.EmitWarning("DISABLED: " + clazz.FullName); return Iterators.EmptyIterator; } if (typeof(ITestSuiteBuilder).IsAssignableFrom(clazz)) { return ((ITestSuiteBuilder)NewInstance(clazz)).GetEnumerator(); } if (typeof(ITest).IsAssignableFrom(clazz)) { return Iterators.SingletonIterator(NewInstance(clazz)); } ValidateTestClass(clazz); return FromMethods(clazz); } private void ValidateTestClass(Type clazz) { if (!(typeof(ITestCase).IsAssignableFrom(clazz))) { throw new ArgumentException(string.Empty + clazz + " is not marked as " + typeof( ITestCase)); } } protected virtual bool IsApplicable(Type clazz) { return clazz != null; } // just removing the 'parameter not used' warning private IEnumerator FromMethods(Type clazz) { return Iterators.Map(clazz.GetMethods(), new _IFunction4_96(this, clazz)); } private sealed class _IFunction4_96 : IFunction4 { public _IFunction4_96(ReflectionTestSuiteBuilder _enclosing, Type clazz) { this._enclosing = _enclosing; this.clazz = clazz; } public object Apply(object arg) { MethodInfo method = (MethodInfo)arg; if (!this._enclosing.IsTestMethod(method)) { this._enclosing.EmitWarningOnIgnoredTestMethod(clazz, method); return Iterators.Skip; } return this._enclosing.FromMethod(clazz, method); } private readonly ReflectionTestSuiteBuilder _enclosing; private readonly Type clazz; } private void EmitWarningOnIgnoredTestMethod(Type clazz, MethodInfo method) { if (!StartsWithIgnoreCase(method.Name, "_test")) { return; } TestPlatform.EmitWarning("IGNORED: " + CreateTest(NewInstance(clazz), method).Label ()); } protected virtual bool IsTestMethod(MethodInfo method) { return HasTestPrefix(method) && TestPlatform.IsPublic(method) && !TestPlatform.IsStatic (method) && !TestPlatform.HasParameters(method); } private bool HasTestPrefix(MethodInfo method) { return StartsWithIgnoreCase(method.Name, "test"); } protected virtual bool StartsWithIgnoreCase(string s, string prefix) { return s.ToUpper().StartsWith(prefix.ToUpper()); } protected virtual object NewInstance(Type clazz) { try { return System.Activator.CreateInstance(clazz); } catch (Exception e) { throw new TestException("Failed to instantiate " + clazz, e); } } protected virtual ITest CreateTest(object instance, MethodInfo method) { return new TestMethod(instance, method); } protected ITest FromMethod(Type clazz, MethodInfo method) { return new ContextfulTest(new _ITestFactory_143(this, clazz, method)); } private sealed class _ITestFactory_143 : ITestFactory { public _ITestFactory_143(ReflectionTestSuiteBuilder _enclosing, Type clazz, MethodInfo method) { this._enclosing = _enclosing; this.clazz = clazz; this.method = method; } public ITest NewInstance() { return this._enclosing.CreateTest(this._enclosing.NewInstance(clazz), method); } private readonly ReflectionTestSuiteBuilder _enclosing; private readonly Type clazz; private readonly MethodInfo method; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/OpaqueTestSuiteBase.cs0000644000175000017500000000516711520622622026403 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public abstract class OpaqueTestSuiteBase : ITest { private IClosure4 _tests; public OpaqueTestSuiteBase(IClosure4 tests) { _tests = tests; } public virtual void Run() { ITestExecutor executor = ((ITestExecutor)Environments.My(typeof(ITestExecutor))); IEnumerator tests = ((IEnumerator)_tests.Run()); try { SuiteSetUp(); while (tests.MoveNext()) { executor.Execute(((ITest)tests.Current)); } SuiteTearDown(); } catch (Exception exc) { executor.Fail(this, exc); } } public virtual bool IsLeafTest() { return false; } protected virtual IClosure4 Tests() { return _tests; } public virtual ITest Transmogrify(IFunction4 fun) { return Transmogrified(new _IClosure4_38(this, fun)); } private sealed class _IClosure4_38 : IClosure4 { public _IClosure4_38(OpaqueTestSuiteBase _enclosing, IFunction4 fun) { this._enclosing = _enclosing; this.fun = fun; } public object Run() { return Iterators.Map(((IEnumerator)this._enclosing.Tests().Run()), new _IFunction4_40 (fun)); } private sealed class _IFunction4_40 : IFunction4 { public _IFunction4_40(IFunction4 fun) { this.fun = fun; } public object Apply(object test) { return ((ITest)fun.Apply(((ITest)test))); } private readonly IFunction4 fun; } private readonly OpaqueTestSuiteBase _enclosing; private readonly IFunction4 fun; } protected abstract Db4oUnit.OpaqueTestSuiteBase Transmogrified(IClosure4 tests); /// protected abstract void SuiteSetUp(); /// protected abstract void SuiteTearDown(); public abstract string Label(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/0000755000175000017500000000000011520622070023243 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/CompositeTestListenerTestCase.cs0000644000175000017500000000602211520622622031541 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Mocking; using Db4oUnit.Tests; namespace Db4oUnit.Tests { public class CompositeTestListenerTestCase : ITestCase { internal sealed class ListenerRecorder : ITestListener { private readonly MethodCallRecorder _recorder; private readonly string _label; public ListenerRecorder(string label, MethodCallRecorder recorder) { _label = label; _recorder = recorder; } public void RunFinished() { Record("runFinished"); } public void RunStarted() { Record("runStarted"); } public void TestFailed(ITest test, Exception failure) { Record("testFailed", new object[] { test, failure }); } public void TestStarted(ITest test) { Record("testStarted", new object[] { test }); } public void Failure(string msg, Exception failure) { Record("failure", new object[] { msg, failure }); } private void Record(string name) { Record(name, new object[0]); } private void Record(string name, object[] args) { _recorder.Record(new MethodCall(_label + "." + name, args)); } } public virtual void Test() { MethodCallRecorder recorder = new MethodCallRecorder(); CompositeTestListener listener = new CompositeTestListener(new CompositeTestListenerTestCase.ListenerRecorder ("first", recorder), new CompositeTestListenerTestCase.ListenerRecorder("second" , recorder)); RunsGreen test = new RunsGreen(); Exception failure = new Exception(); listener.RunStarted(); listener.TestStarted(test); listener.TestFailed(test, failure); listener.RunFinished(); recorder.Verify(new MethodCall[] { Call("first.runStarted"), Call("second.runStarted" ), Call("first.testStarted", test), Call("second.testStarted", test), Call("first.testFailed" , test, failure), Call("second.testFailed", test, failure), Call("first.runFinished" ), Call("second.runFinished") }); } private MethodCall Call(string method, object arg0, Exception arg1) { return new MethodCall(method, new object[] { arg0, arg1 }); } private MethodCall Call(string method, object arg) { return new MethodCall(method, new object[] { arg }); } private MethodCall Call(string method) { return new MethodCall(method, new object[] { }); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/OpaqueTestSuiteFailureTestCase.cs0000644000175000017500000000647711520622622031663 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class OpaqueTestSuiteFailureTestCase : ITestCase { public virtual void TestFailOnSetup() { BooleanByRef tearDownCalled = new BooleanByRef(); TestResult result = new TestResult(); new TestRunner(Iterators.Iterable(new OpaqueTestSuiteFailureTestCase.FailingTestSuite [] { new OpaqueTestSuiteFailureTestCase.FailingTestSuite(true, false, tearDownCalled ) })).Run(result); Assert.AreEqual(0, result.TestCount); Assert.AreEqual(1, result.Failures.Count); Assert.IsFalse(tearDownCalled.value); } public virtual void TestFailOnTearDown() { BooleanByRef tearDownCalled = new BooleanByRef(); TestResult result = new TestResult(); new TestRunner(Iterators.Iterable(new OpaqueTestSuiteFailureTestCase.FailingTestSuite [] { new OpaqueTestSuiteFailureTestCase.FailingTestSuite(false, true, tearDownCalled ) })).Run(result); Assert.AreEqual(1, result.TestCount); Assert.AreEqual(2, result.Failures.Count); Assert.IsTrue(tearDownCalled.value); } public class FailingTestSuite : OpaqueTestSuiteBase { private bool _failOnSetUp; private bool _failOnTeardown; private BooleanByRef _tearDownCalled; public FailingTestSuite(bool failOnSetup, bool failOnTeardown, BooleanByRef tearDownCalled ) : this(failOnSetup, failOnTeardown, tearDownCalled, new _IClosure4_34()) { } private sealed class _IClosure4_34 : IClosure4 { public _IClosure4_34() { } public object Run() { return Iterators.Iterate(new FailingTest[] { new FailingTest("fail", new AssertionException ("fail")) }); } } private FailingTestSuite(bool failOnSetup, bool failOnTeardown, BooleanByRef tearDownCalled , IClosure4 tests) : base(tests) { _failOnSetUp = failOnSetup; _failOnTeardown = failOnTeardown; _tearDownCalled = tearDownCalled; } /// protected override void SuiteSetUp() { if (_failOnSetUp) { Assert.Fail(); } } /// protected override void SuiteTearDown() { _tearDownCalled.value = true; if (_failOnTeardown) { Assert.Fail(); } } protected override OpaqueTestSuiteBase Transmogrified(IClosure4 tests) { return new OpaqueTestSuiteFailureTestCase.FailingTestSuite(_failOnSetUp, _failOnTeardown , _tearDownCalled, tests); } public override string Label() { return GetType().FullName; } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/TestLifeCycleTestCase.cs0000644000175000017500000000266511520622622027741 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Tests { public class TestLifeCycleTestCase : ITestCase { public virtual void TestLifeCycle() { ByRef tearDownCalled = ByRef.NewInstance(false); RunsLifeCycle._tearDownCalled.With(tearDownCalled, new _IRunnable_11()); Assert.IsTrue((((bool)tearDownCalled.value))); } private sealed class _IRunnable_11 : IRunnable { public _IRunnable_11() { } public void Run() { IEnumerator tests = new ReflectionTestSuiteBuilder(typeof(RunsLifeCycle)).GetEnumerator (); ITest test = (ITest)Iterators.Next(tests); FrameworkTestCase.RunTestAndExpect(test, 1); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/ReflectionTestSuiteBuilderTestCase.cs0000644000175000017500000000566311520622622032516 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class ReflectionTestSuiteBuilderTestCase : ITestCase { private sealed class ExcludingReflectionTestSuiteBuilder : ReflectionTestSuiteBuilder { public ExcludingReflectionTestSuiteBuilder(Type[] classes) : base(classes) { } protected override bool IsApplicable(Type clazz) { return clazz != typeof(ReflectionTestSuiteBuilderTestCase.NotAccepted); } } public class NonTestFixture { } public virtual void TestUnmarkedTestFixture() { ReflectionTestSuiteBuilder builder = new ReflectionTestSuiteBuilder(typeof(ReflectionTestSuiteBuilderTestCase.NonTestFixture )); AssertFailingTestCase(typeof(ArgumentException), builder); } public class Accepted : ITestCase { public virtual void Test() { } } public class NotAccepted : ITestCase { public virtual void Test() { } } public virtual void TestNotAcceptedFixture() { ReflectionTestSuiteBuilder builder = new ReflectionTestSuiteBuilderTestCase.ExcludingReflectionTestSuiteBuilder (new Type[] { typeof(ReflectionTestSuiteBuilderTestCase.Accepted), typeof(ReflectionTestSuiteBuilderTestCase.NotAccepted ) }); Assert.AreEqual(1, Iterators.Size(builder.GetEnumerator())); } public class ConstructorThrows : ITestCase { public static readonly Exception Error = new Exception("no way"); public ConstructorThrows() { throw Error; } public virtual void Test1() { } public virtual void Test2() { } } public virtual void TestConstructorFailuresAppearAsFailedTestCases() { ReflectionTestSuiteBuilder builder = new ReflectionTestSuiteBuilder(typeof(ReflectionTestSuiteBuilderTestCase.ConstructorThrows )); Assert.AreEqual(2, Iterators.ToArray(builder.GetEnumerator()).Length); } private Exception AssertFailingTestCase(Type expectedError, ReflectionTestSuiteBuilder builder) { IEnumerator tests = builder.GetEnumerator(); FailingTest test = (FailingTest)Iterators.Next(tests); Assert.AreSame(expectedError, test.Error().GetType()); return test.Error(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/TestRunnerTestCase.cs0000644000175000017500000000632211520622622027345 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Mocking; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class TestRunnerTestCase : ITestCase { internal static readonly Exception FailureException = new Exception(); public virtual void TestRun() { RunsGreen greenTest = new RunsGreen(); RunsRed redTest = new RunsRed(FailureException); IEnumerable tests = Iterators.Iterable(new object[] { greenTest, redTest }); MethodCallRecorder recorder = new MethodCallRecorder(); ITestListener listener = new _ITestListener_23(recorder); new TestRunner(tests).Run(listener); recorder.Verify(new MethodCall[] { new MethodCall("runStarted", new object[] { } ), new MethodCall("testStarted", new object[] { greenTest }), new MethodCall("testStarted" , new object[] { redTest }), new MethodCall("testFailed", new object[] { redTest , FailureException }), new MethodCall("runFinished", new object[] { }) }); } private sealed class _ITestListener_23 : ITestListener { public _ITestListener_23(MethodCallRecorder recorder) { this.recorder = recorder; } public void TestStarted(ITest test) { recorder.Record(new MethodCall("testStarted", new object[] { test })); } public void TestFailed(ITest test, Exception failure) { recorder.Record(new MethodCall("testFailed", new object[] { test, failure })); } public void RunStarted() { recorder.Record(new MethodCall("runStarted", new object[] { })); } public void RunFinished() { recorder.Record(new MethodCall("runFinished", new object[] { })); } public void Failure(string msg, Exception failure) { recorder.Record(new MethodCall("failure", new object[] { msg, failure })); } private readonly MethodCallRecorder recorder; } public virtual void TestRunWithException() { ITest test = new _ITest_58(); //$NON-NLS-1$ IEnumerable tests = Iterators.Iterable(new object[] { test }); TestResult result = new TestResult(); new TestRunner(tests).Run(result); Assert.AreEqual(1, result.Failures.Count); } private sealed class _ITest_58 : ITest { public _ITest_58() { } public string Label() { return "Test"; } public void Run() { Assert.AreEqual(0, 1); } public bool IsLeafTest() { return true; } public ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/FrameworkTestCase.cs0000644000175000017500000000433211520622622027170 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class FrameworkTestCase : ITestCase { public static readonly Exception Exception = new Exception(); public virtual void TestRunsGreen() { TestResult result = new TestResult(); new TestRunner(Iterators.SingletonIterable(new RunsGreen())).Run(result); Assert.IsTrue(result.Failures.Count == 0, "not green"); } public virtual void TestRunsRed() { TestResult result = new TestResult(); new TestRunner(Iterators.SingletonIterable(new RunsRed(Exception))).Run(result); Assert.IsTrue(result.Failures.Count == 1, "not red"); } public static void RunTestAndExpect(ITest test, int expFailures) { RunTestAndExpect(test, expFailures, true); } public static void RunTestAndExpect(ITest test, int expFailures, bool checkException ) { RunTestAndExpect(Iterators.SingletonIterable(test), expFailures, checkException); } public static void RunTestAndExpect(IEnumerable tests, int expFailures, bool checkException ) { TestResult result = new TestResult(); new TestRunner(tests).Run(result); if (expFailures != result.Failures.Count) { Assert.Fail(result.Failures.ToString()); } if (checkException) { for (IEnumerator iter = result.Failures.GetEnumerator(); iter.MoveNext(); ) { TestFailure failure = (TestFailure)iter.Current; Assert.AreEqual(Exception, failure.Reason); } } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/RunsLifeCycle.cs0000644000175000017500000000275411520622622026314 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class RunsLifeCycle : ITestCase, ITestLifeCycle { public static DynamicVariable _tearDownCalled = DynamicVariable.NewInstance(); private bool _setupCalled = false; public virtual void SetUp() { _setupCalled = true; } public virtual void TearDown() { TearDownCalled().value = true; } public virtual bool SetupCalled() { return _setupCalled; } /// public virtual void TestMethod() { Assert.IsTrue(_setupCalled); Assert.IsTrue(!(((bool)TearDownCalled().value))); throw FrameworkTestCase.Exception; } private ByRef TearDownCalled() { return ((ByRef)_tearDownCalled.Value); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/ReinstantiatePerMethodTest.cs0000644000175000017500000000172011520622622031057 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit.Tests { public class ReinstantiatePerMethodTest : ITestCase { private int a = 0; public virtual void Test1() { Assert.AreEqual(0, a); a = 1; } public virtual void Test2() { Assert.AreEqual(0, a); a = 2; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/0000755000175000017500000000000011520622066025061 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/FixtureBasedTestSuiteTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/FixtureBasedTestSuiteTestCase.0000644000175000017500000001676511520622622032772 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Fixtures; using Db4oUnit.Mocking; using Db4oUnit.Tests.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests.Fixtures { public class FixtureBasedTestSuiteTestCase : ITestCase { internal static FixtureVariable RecorderFixture = FixtureVariable.NewInstance("recorder" ); internal static FixtureVariable Fixture1 = new FixtureVariable("f1"); internal static FixtureVariable Fixture2 = new FixtureVariable("f2"); public sealed class TestUnit : ITestCase { private readonly object fixture1 = Fixture1.Value; private readonly object fixture2 = Fixture2.Value; public void TestFoo() { Record("testFoo"); } public void TestBar() { Record("testBar"); } private void Record(string test) { Recorder().Record(new MethodCall(test, new object[] { fixture1, fixture2 })); } private MethodCallRecorder Recorder() { return ((MethodCallRecorder)RecorderFixture.Value); } } public virtual void Test() { MethodCallRecorder recorder = new MethodCallRecorder(); Run(new _FixtureBasedTestSuite_45(recorder)); // System.out.println(CodeGenerator.generateMethodCallArray(recorder)); recorder.Verify(new MethodCall[] { new MethodCall("testFoo", new object[] { "f11" , "f21" }), new MethodCall("testFoo", new object[] { "f11", "f22" }), new MethodCall ("testFoo", new object[] { "f12", "f21" }), new MethodCall("testFoo", new object [] { "f12", "f22" }), new MethodCall("testBar", new object[] { "f11", "f21" }), new MethodCall("testBar", new object[] { "f11", "f22" }), new MethodCall("testBar" , new object[] { "f12", "f21" }), new MethodCall("testBar", new object[] { "f12" , "f22" }) }); } private sealed class _FixtureBasedTestSuite_45 : FixtureBasedTestSuite { public _FixtureBasedTestSuite_45(MethodCallRecorder recorder) { this.recorder = recorder; } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .RecorderFixture, new object[] { recorder }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture1, new object[] { "f11", "f12" }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture2, new object[] { "f21", "f22" }) }; } public override Type[] TestUnits() { return new Type[] { typeof(FixtureBasedTestSuiteTestCase.TestUnit) }; } private readonly MethodCallRecorder recorder; } public virtual void TestCombinationToRun() { MethodCallRecorder recorder = new MethodCallRecorder(); Run(new _FixtureBasedTestSuite_78(recorder)); // System.out.println(CodeGenerator.generateMethodCallArray(recorder)); recorder.Verify(new MethodCall[] { new MethodCall("testFoo", new object[] { "f11" , "f22" }), new MethodCall("testBar", new object[] { "f11", "f22" }) }); } private sealed class _FixtureBasedTestSuite_78 : FixtureBasedTestSuite { public _FixtureBasedTestSuite_78(MethodCallRecorder recorder) { this.recorder = recorder; } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .RecorderFixture, new object[] { recorder }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture1, new object[] { "f11", "f12" }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture2, new object[] { "f21", "f22" }) }; } public override Type[] TestUnits() { return new Type[] { typeof(FixtureBasedTestSuiteTestCase.TestUnit) }; } public override int[] CombinationToRun() { return new int[] { 0, 0, 1 }; } private readonly MethodCallRecorder recorder; } public virtual void TestInvalidCombinationToRun() { Assert.Expect(typeof(AssertionException), new _ICodeBlock_107(this)); } private sealed class _ICodeBlock_107 : ICodeBlock { public _ICodeBlock_107(FixtureBasedTestSuiteTestCase _enclosing) { this._enclosing = _enclosing; } public void Run() { this._enclosing.RunInvalidCombination(); } private readonly FixtureBasedTestSuiteTestCase _enclosing; } private void RunInvalidCombination() { Run(new _FixtureBasedTestSuite_115()); } private sealed class _FixtureBasedTestSuite_115 : FixtureBasedTestSuite { public _FixtureBasedTestSuite_115() { } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture1, new object[] { "f11", "f12" }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture2, new object[] { "f21", "f22" }) }; } public override Type[] TestUnits() { return new Type[] { typeof(FixtureBasedTestSuiteTestCase.TestUnit) }; } public override int[] CombinationToRun() { return new int[] { 0 }; } } private void Run(FixtureBasedTestSuite suite) { TestResult result = new TestResult(); new TestRunner(suite).Run(result); if (result.Failures.Count > 0) { Assert.Fail(Iterators.ToString(result.Failures)); } } public virtual void TestLabel() { FixtureBasedTestSuite suite = new _FixtureBasedTestSuite_142(); IEnumerable labels = Iterators.Map(suite, new _IFunction4_154()); Iterator4Assert.AreEqual(new object[] { TestLabel("testFoo", 0, 0), TestLabel("testFoo" , 1, 0), TestLabel("testFoo", 0, 1), TestLabel("testFoo", 1, 1), TestLabel("testBar" , 0, 0), TestLabel("testBar", 1, 0), TestLabel("testBar", 0, 1), TestLabel("testBar" , 1, 1) }, labels.GetEnumerator()); } private sealed class _FixtureBasedTestSuite_142 : FixtureBasedTestSuite { public _FixtureBasedTestSuite_142() { } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture1, new object[] { "f11", "f12" }), new SimpleFixtureProvider(FixtureBasedTestSuiteTestCase .Fixture2, new object[] { "f21", "f22" }) }; } public override Type[] TestUnits() { return new Type[] { typeof(FixtureBasedTestSuiteTestCase.TestUnit) }; } } private sealed class _IFunction4_154 : IFunction4 { public _IFunction4_154() { } public object Apply(object arg) { return ((ITest)arg).Label(); } } private string TestLabel(string testMethod, int fixture1Index, int fixture2Index) { string prefix = "(f2[" + fixture1Index + "]) (f1[" + fixture2Index + "]) "; return prefix + typeof(FixtureBasedTestSuiteTestCase.TestUnit).FullName + "." + testMethod; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/AllTests.cs0000644000175000017500000000217211520622622027143 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Tests.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class AllTests : ReflectionTestSuite { public static void Main(string[] args) { new ConsoleTestRunner(typeof(Db4oUnit.Tests.Fixtures.AllTests)).Run(); } protected override Type[] TestCases() { return new Type[] { typeof(FixtureBasedTestSuiteTestCase), typeof(FixtureContextTestCase ), typeof(Set4TestSuite) }; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/FixtureContextTestCase.cs0000644000175000017500000001252011520622622032035 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Fixtures; using Db4oUnit.Tests.Fixtures; using Sharpen.Lang; namespace Db4oUnit.Tests.Fixtures { public class FixtureContextTestCase : ITestCase { public sealed class ContextRef { public FixtureContext value; } public virtual void Test() { FixtureVariable f1 = new FixtureVariable(); FixtureVariable f2 = new FixtureVariable(); FixtureContextTestCase.ContextRef c1 = new FixtureContextTestCase.ContextRef(); FixtureContextTestCase.ContextRef c2 = new FixtureContextTestCase.ContextRef(); new FixtureContext().Run(new _IRunnable_19(this, f1, f2, c1, c2)); AssertNoValue(f1); AssertNoValue(f2); c1.value.Run(new _IRunnable_41(this, f1, f2)); c2.value.Run(new _IRunnable_48(this, f1, f2)); } private sealed class _IRunnable_19 : IRunnable { public _IRunnable_19(FixtureContextTestCase _enclosing, FixtureVariable f1, FixtureVariable f2, FixtureContextTestCase.ContextRef c1, FixtureContextTestCase.ContextRef c2) { this._enclosing = _enclosing; this.f1 = f1; this.f2 = f2; this.c1 = c1; this.c2 = c2; } public void Run() { f1.With("foo", new _IRunnable_21(this, f1, f2, c1, c2)); } private sealed class _IRunnable_21 : IRunnable { public _IRunnable_21(_IRunnable_19 _enclosing, FixtureVariable f1, FixtureVariable f2, FixtureContextTestCase.ContextRef c1, FixtureContextTestCase.ContextRef c2) { this._enclosing = _enclosing; this.f1 = f1; this.f2 = f2; this.c1 = c1; this.c2 = c2; } public void Run() { this._enclosing._enclosing.AssertValue("foo", f1); this._enclosing._enclosing.AssertNoValue(f2); c1.value = FixtureContext.Current; f2.With("bar", new _IRunnable_26(this, f1, f2, c2)); } private sealed class _IRunnable_26 : IRunnable { public _IRunnable_26(_IRunnable_21 _enclosing, FixtureVariable f1, FixtureVariable f2, FixtureContextTestCase.ContextRef c2) { this._enclosing = _enclosing; this.f1 = f1; this.f2 = f2; this.c2 = c2; } public void Run() { this._enclosing._enclosing._enclosing.AssertValue("foo", f1); this._enclosing._enclosing._enclosing.AssertValue("bar", f2); c2.value = FixtureContext.Current; } private readonly _IRunnable_21 _enclosing; private readonly FixtureVariable f1; private readonly FixtureVariable f2; private readonly FixtureContextTestCase.ContextRef c2; } private readonly _IRunnable_19 _enclosing; private readonly FixtureVariable f1; private readonly FixtureVariable f2; private readonly FixtureContextTestCase.ContextRef c1; private readonly FixtureContextTestCase.ContextRef c2; } private readonly FixtureContextTestCase _enclosing; private readonly FixtureVariable f1; private readonly FixtureVariable f2; private readonly FixtureContextTestCase.ContextRef c1; private readonly FixtureContextTestCase.ContextRef c2; } private sealed class _IRunnable_41 : IRunnable { public _IRunnable_41(FixtureContextTestCase _enclosing, FixtureVariable f1, FixtureVariable f2) { this._enclosing = _enclosing; this.f1 = f1; this.f2 = f2; } public void Run() { this._enclosing.AssertValue("foo", f1); this._enclosing.AssertNoValue(f2); } private readonly FixtureContextTestCase _enclosing; private readonly FixtureVariable f1; private readonly FixtureVariable f2; } private sealed class _IRunnable_48 : IRunnable { public _IRunnable_48(FixtureContextTestCase _enclosing, FixtureVariable f1, FixtureVariable f2) { this._enclosing = _enclosing; this.f1 = f1; this.f2 = f2; } public void Run() { this._enclosing.AssertValue("foo", f1); this._enclosing.AssertValue("bar", f2); } private readonly FixtureContextTestCase _enclosing; private readonly FixtureVariable f1; private readonly FixtureVariable f2; } private void AssertNoValue(FixtureVariable f1) { Assert.Expect(typeof(InvalidOperationException), new _ICodeBlock_57(f1)); } private sealed class _ICodeBlock_57 : ICodeBlock { public _ICodeBlock_57(FixtureVariable f1) { this.f1 = f1; } public void Run() { this.Use(f1.Value); } private void Use(object value) { } private readonly FixtureVariable f1; } private void AssertValue(string expected, FixtureVariable fixture) { Assert.AreEqual(expected, fixture.Value); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/Set4TestUnit.cs0000644000175000017500000000277411520622622027737 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Fixtures; using Db4oUnit.Tests.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class Set4TestUnit : ITestLifeCycle { private readonly ISet4 subject = (ISet4)SubjectFixtureProvider.Value(); private readonly object[] data = MultiValueFixtureProvider.Value(); public virtual void SetUp() { for (int i = 0; i < data.Length; ++i) { object element = data[i]; subject.Add(element); } } public virtual void TestSize() { Assert.AreEqual(data.Length, subject.Size()); } public virtual void TestContains() { for (int i = 0; i < data.Length; ++i) { object element = data[i]; Assert.IsTrue(subject.Contains(element)); } } /// public virtual void TearDown() { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/HashtableSet4.cs0000644000175000017500000000213111520622622030036 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Tests.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class HashtableSet4 : ISet4 { internal Hashtable _table = new Hashtable(); public virtual void Add(object value) { _table[value] = value; } public virtual bool Contains(object value) { return _table.Contains(value); } public virtual int Size() { return _table.Count; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/Set4TestSuite.cs0000644000175000017500000000346111520622622030103 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Fixtures; using Db4oUnit.Tests.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class Set4TestSuite : FixtureBasedTestSuite { public static void Main(string[] args) { new ConsoleTestRunner(typeof(Set4TestSuite)).Run(); } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SubjectFixtureProvider(new IDeferred4[] { new _IDeferred4_17(), new _IDeferred4_21() }), new MultiValueFixtureProvider(new object [][] { new object[] { }, new object[] { "foo", "bar", "baz" }, new object[] { "foo" }, new object[] { 42, -1 } }) }; } private sealed class _IDeferred4_17 : IDeferred4 { public _IDeferred4_17() { } public object Value() { return new CollectionSet4(); } } private sealed class _IDeferred4_21 : IDeferred4 { public _IDeferred4_21() { } public object Value() { return new HashtableSet4(); } } public override Type[] TestUnits() { return new Type[] { typeof(Set4TestUnit) }; } // Iterable4TestUnit.class, } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/CollectionSet4.cs0000644000175000017500000000213111520622622030236 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Tests.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class CollectionSet4 : ISet4 { private ArrayList _vector = new ArrayList(); public virtual void Add(object value) { _vector.Add(value); } public virtual bool Contains(object value) { return _vector.Contains(value); } public virtual int Size() { return _vector.Count; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/ISet4.cs0000644000175000017500000000147711520622622026347 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Tests.Fixtures { public interface ISet4 { void Add(object value); bool Contains(object value); int Size(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Fixtures/Iterable4TestUnit.cs0000644000175000017500000000242111520622622030720 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Fixtures; namespace Db4oUnit.Tests.Fixtures { public class Iterable4TestUnit : ITestCase { private readonly IEnumerable subject = (IEnumerable)SubjectFixtureProvider.Value( ); private readonly object[] data = MultiValueFixtureProvider.Value(); public virtual void TestElements() { IEnumerator elements = subject.GetEnumerator(); for (int i = 0; i < data.Length; ++i) { Assert.IsTrue(elements.MoveNext()); Assert.AreEqual(data[i], elements.Current); } Assert.IsFalse(elements.MoveNext()); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/AllTests.cs0000644000175000017500000000303311520622622025327 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Tests; namespace Db4oUnit.Tests { public class AllTests : ReflectionTestSuite { protected override Type[] TestCases() { return new Type[] { typeof(AssertTestCase), typeof(ClassLevelFixtureTestTestCase) , typeof(CompositeTestListenerTestCase), typeof(ExceptionInTearDownDoesNotShadowTestCase ), typeof(FrameworkTestCase), typeof(OpaqueTestSuiteFailureTestCase), typeof(OpaqueTestSuiteTestCase ), typeof(ReflectionTestSuiteBuilderTestCase), typeof(ReinstantiatePerMethodTest ), typeof(TestExceptionWithInnerCause), typeof(TestLifeCycleTestCase), typeof(TestRunnerTestCase ), typeof(Db4oUnit.Tests.Data.AllTests), typeof(Db4oUnit.Tests.Fixtures.AllTests ) }; } public static void Main(string[] args) { new ConsoleTestRunner(typeof(Db4oUnit.Tests.AllTests)).Run(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/AssertTestCase.cs0000644000175000017500000000475211520622622026502 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit.Tests { public class AssertTestCase : ITestCase { public virtual void TestAreEqual() { Assert.AreEqual(true, true); Assert.AreEqual(42, 42); Assert.AreEqual(42, 42); Assert.AreEqual(null, null); ExpectFailure(new _ICodeBlock_14()); ExpectFailure(new _ICodeBlock_19()); ExpectFailure(new _ICodeBlock_24()); ExpectFailure(new _ICodeBlock_29()); } private sealed class _ICodeBlock_14 : ICodeBlock { public _ICodeBlock_14() { } /// public void Run() { Assert.AreEqual(true, false); } } private sealed class _ICodeBlock_19 : ICodeBlock { public _ICodeBlock_19() { } /// public void Run() { Assert.AreEqual(42, 43); } } private sealed class _ICodeBlock_24 : ICodeBlock { public _ICodeBlock_24() { } /// public void Run() { Assert.AreEqual(new object(), new object()); } } private sealed class _ICodeBlock_29 : ICodeBlock { public _ICodeBlock_29() { } /// public void Run() { Assert.AreEqual(null, new object()); } } public virtual void TestAreSame() { ExpectFailure(new _ICodeBlock_37()); Assert.AreSame(this, this); } private sealed class _ICodeBlock_37 : ICodeBlock { public _ICodeBlock_37() { } /// public void Run() { Assert.AreSame(new object(), new object()); } } private void ExpectFailure(ICodeBlock block) { Assert.Expect(typeof(AssertionException), block); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Data/0000755000175000017500000000000011520622070024114 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Data/AllTests.cs0000644000175000017500000000204611520622622026203 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Tests.Data; namespace Db4oUnit.Tests.Data { public class AllTests : ReflectionTestSuite { public static void Main(string[] args) { new Db4oUnit.Tests.Data.AllTests().Run(); } protected override Type[] TestCases() { return new Type[] { typeof(GeneratorsTestCase), typeof(StreamsTestCase) }; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Data/GeneratorsTestCase.cs0000644000175000017500000000465111520622622030221 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Data; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests.Data { public class GeneratorsTestCase : ITestCase { public virtual void TestArbitraryIntegerValues() { CheckArbitraryValuesOf(typeof(int)); } public virtual void TestArbitraryStringValues() { CheckArbitraryValuesOf(typeof(string)); Iterator4Assert.All(Generators.ArbitraryValuesOf(typeof(string)), new _IPredicate4_16 ()); } private sealed class _IPredicate4_16 : IPredicate4 { public _IPredicate4_16() { } public bool Match(object candidate) { return this.IsValidString((string)candidate); } private bool IsValidString(string s) { for (int i = 0; i < s.Length; ++i) { char ch = s[i]; if (!char.IsLetterOrDigit(ch) && !char.IsWhiteSpace(ch) && ch != '_') { return false; } } return true; } } private void CheckArbitraryValuesOf(Type expectedType) { IEnumerable values = Generators.ArbitraryValuesOf(expectedType); Assert.IsTrue(values.GetEnumerator().MoveNext()); Iterator4Assert.AreInstanceOf(expectedType, values); } public virtual void TestTake() { string[] values = new string[] { "1", "2", "3" }; IEnumerable source = Iterators.Iterable(values); AssertTake(new object[0], 0, source); AssertTake(new object[] { "1" }, 1, source); AssertTake(new object[] { "1", "2" }, 2, source); AssertTake(values, 3, source); AssertTake(values, 4, source); } private void AssertTake(object[] expected, int count, IEnumerable source) { Iterator4Assert.AreEqual(expected, Generators.Take(count, source).GetEnumerator() ); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/Data/StreamsTestCase.cs0000644000175000017500000000273611520622622027530 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests.Data { public class StreamsTestCase : ITestCase { public virtual void TestSeries() { Collection4 calls = new Collection4(); IEnumerator series = Iterators.Series(string.Empty, new _IFunction4_11(calls)).GetEnumerator (); Assert.IsTrue(series.MoveNext()); Assert.IsTrue(series.MoveNext()); Iterator4Assert.AreEqual(new object[] { string.Empty, "*" }, calls.GetEnumerator( )); } private sealed class _IFunction4_11 : IFunction4 { public _IFunction4_11(Collection4 calls) { this.calls = calls; } public object Apply(object value) { calls.Add(value); return value + "*"; } private readonly Collection4 calls; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/OpaqueTestSuiteTestCase.cs0000644000175000017500000001120511520622622030334 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class OpaqueTestSuiteTestCase : ITestCase { private const int NumTests = 3; public virtual void TestAllSucceed() { AssertTestRuns(new int[] { }); } public virtual void TestSingleFailure() { AssertTestRuns(new int[] { NumTests / 2 }); } public virtual void TestAllFail() { int[] failingIndices = new int[NumTests]; for (int i = 0; i < NumTests; i++) { failingIndices[i] = i; } AssertTestRuns(failingIndices); } private void AssertTestRuns(int[] failingIndices) { IntByRef counter = new IntByRef(); TestResult result = new _TestResult_29(); new TestRunner(Iterators.Iterable(new OpaqueTestSuiteTestCase.SimpleTestSuite[] { new OpaqueTestSuiteTestCase.SimpleTestSuite(counter, NumTests, failingIndices) } )).Run(result); Assert.AreEqual(NumTests, result.TestCount); Assert.AreEqual(failingIndices.Length, result.Failures.Count); Assert.AreEqual(NumTests + 2, counter.value); } private sealed class _TestResult_29 : TestResult { public _TestResult_29() { } public override void TestStarted(ITest test) { base.TestStarted(test); Assert.IsInstanceOf(typeof(OpaqueTestSuiteTestCase.CountingTest), test); } } public class SimpleTestSuite : OpaqueTestSuiteBase { private IntByRef _counter; private int _numTests; public SimpleTestSuite(IntByRef counter, int numTests, int[] failingIndices) : this (counter, numTests, new _IClosure4_47(counter, numTests, failingIndices)) { } private sealed class _IClosure4_47 : IClosure4 { public _IClosure4_47(IntByRef counter, int numTests, int[] failingIndices) { this.counter = counter; this.numTests = numTests; this.failingIndices = failingIndices; } public object Run() { return Iterators.Iterate(OpaqueTestSuiteTestCase.SimpleTestSuite.Tests(counter, numTests , failingIndices)); } private readonly IntByRef counter; private readonly int numTests; private readonly int[] failingIndices; } private SimpleTestSuite(IntByRef counter, int numTests, IClosure4 tests) : base(tests ) { _counter = counter; _numTests = numTests; } /// protected override void SuiteSetUp() { Assert.AreEqual(0, _counter.value); _counter.value++; } /// protected override void SuiteTearDown() { Assert.AreEqual(_numTests + 1, _counter.value); _counter.value++; } public override string Label() { return GetType().FullName; } private static ITest[] Tests(IntByRef counter, int numTests, int[] failingIndices ) { ITest[] tests = new ITest[numTests]; for (int i = 0; i < numTests; i++) { tests[i] = new OpaqueTestSuiteTestCase.CountingTest(counter, i + 1, Arrays4.IndexOf (failingIndices, i) >= 0); } return tests; } protected override OpaqueTestSuiteBase Transmogrified(IClosure4 tests) { return new OpaqueTestSuiteTestCase.SimpleTestSuite(_counter, _numTests, tests); } } public class CountingTest : ITest { private IntByRef _counter; private int _idx; private bool _fail; public CountingTest(IntByRef counter, int idx, bool fail) { _counter = counter; _idx = idx; _fail = fail; } public virtual bool IsLeafTest() { return true; } public virtual string Label() { return GetType().FullName; } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } public virtual void Run() { Assert.AreEqual(_idx, _counter.value); _counter.value++; if (_fail) { Assert.Fail(); } } } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/ExceptionInTearDownDoesNotShadowTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/ExceptionInTearDownDoesNotShadowTestCas0000644000175000017500000000440211520622622033013 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { public class ExceptionInTearDownDoesNotShadowTestCase : ITestCase { public static readonly string InTestMessage = "in test"; public static readonly string InTeardownMessage = "in teardown"; public class RunsWithExceptions : ITestLifeCycle { public virtual void SetUp() { } public virtual void TearDown() { throw new Exception(InTeardownMessage); } /// public virtual void TestMethod() { throw FrameworkTestCase.Exception; } } public class RunsWithExceptionInTearDown : ITestLifeCycle { public virtual void SetUp() { } public virtual void TearDown() { throw FrameworkTestCase.Exception; } /// public virtual void TestMethod() { } } public virtual void TestExceptions() { IEnumerator tests = new ReflectionTestSuiteBuilder(typeof(ExceptionInTearDownDoesNotShadowTestCase.RunsWithExceptions )).GetEnumerator(); ITest test = (ITest)Iterators.Next(tests); FrameworkTestCase.RunTestAndExpect(test, 1); } public virtual void TestExceptionInTearDown() { IEnumerator tests = new ReflectionTestSuiteBuilder(typeof(ExceptionInTearDownDoesNotShadowTestCase.RunsWithExceptionInTearDown )).GetEnumerator(); ITest test = (ITest)Iterators.Next(tests); FrameworkTestCase.RunTestAndExpect(test, 1); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/ClassLevelFixtureTestTestCase.cs0000644000175000017500000000301011520622622031467 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Tests; namespace Db4oUnit.Tests { public class ClassLevelFixtureTestTestCase : ITestCase { private static int _count; public virtual void Test() { _count = 0; TestResult result = new TestResult(); new TestRunner(new ReflectionTestSuiteBuilder(typeof(ClassLevelFixtureTestTestCase.SimpleTestSuite ))).Run(result); Assert.AreEqual(3, _count); Assert.AreEqual(1, result.TestCount); Assert.AreEqual(0, result.Failures.Count); } public class SimpleTestSuite : IClassLevelFixtureTest { public static void ClassSetUp() { ClassLevelFixtureTestTestCase._count++; } public static void ClassTearDown() { ClassLevelFixtureTestTestCase._count++; } public virtual void Test() { ClassLevelFixtureTestTestCase._count++; } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/RunsRed.cs0000644000175000017500000000154611520622622025165 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit.Tests { internal class RunsRed : FailingTest { public RunsRed(Exception exception) : base("RunsRed", exception) { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/RunsGreen.cs0000644000175000017500000000207311520622622025507 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Tests { internal class RunsGreen : ITest { public virtual string Label() { return "RunsGreen"; } public virtual void Run() { } public virtual bool IsLeafTest() { return true; } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Tests/TestExceptionWithInnerCause.cs0000644000175000017500000000202711520622622031205 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit.Tests { public class TestExceptionWithInnerCause : ITestCase { public virtual void TestDetailerMessage() { string message = "Detailed message"; TestException e = new TestException(message, new Exception("The reason!")); Assert.IsGreaterOrEqual(0, e.ToString().IndexOf(message)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/IClassLevelFixtureTest.cs0000644000175000017500000000142211520622622027047 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { public interface IClassLevelFixtureTest : ITestCase { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ConsoleListener.cs0000644000175000017500000000331311520622622025603 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit; namespace Db4oUnit { public class ConsoleListener : ITestListener { private readonly TextWriter _writer; public ConsoleListener(TextWriter writer) { _writer = writer; } public virtual void RunFinished() { } public virtual void RunStarted() { } public virtual void TestFailed(ITest test, Exception failure) { PrintFailure(failure); } public virtual void TestStarted(ITest test) { Print(test.Label()); } private void PrintFailure(Exception failure) { if (failure == null) { Print("\t!"); } else { Print("\t! " + failure); } } private void Print(string message) { try { _writer.Write(message + TestPlatform.NewLine); _writer.Flush(); } catch (IOException x) { TestPlatform.PrintStackTrace(_writer, x); } } public virtual void Failure(string msg, Exception failure) { Print("\t ! " + msg); PrintFailure(failure); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestExecutor.cs0000644000175000017500000000152411520622622025244 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { public interface ITestExecutor { void Execute(ITest test); void Fail(ITest test, Exception exc); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestFactory.cs0000644000175000017500000000142411520622622025054 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { public interface ITestFactory { ITest NewInstance(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Iterator4Assert.cs0000644000175000017500000000551611520622622025541 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class Iterator4Assert { public static void AreEqual(IEnumerable expected, IEnumerable actual) { AreEqual(expected.GetEnumerator(), actual.GetEnumerator()); } public static void AreEqual(IEnumerator expected, IEnumerator actual) { if (null == expected) { Assert.IsNull(actual); return; } Assert.IsNotNull(actual); while (expected.MoveNext()) { AssertNext(expected.Current, actual); } if (actual.MoveNext()) { Unexpected(actual.Current); } } private static void Unexpected(object element) { Assert.Fail("Unexpected element: " + element); } public static void AssertNext(object expected, IEnumerator iterator) { Assert.IsTrue(iterator.MoveNext(), "'" + expected + "' expected."); Assert.AreEqual(expected, iterator.Current); } public static void AreEqual(object[] expected, IEnumerator iterator) { AreEqual(new ArrayIterator4(expected), iterator); } public static void SameContent(object[] expected, IEnumerator actual) { SameContent(new ArrayIterator4(expected), actual); } public static void SameContent(IEnumerator expected, IEnumerator actual) { Collection4 allExpected = new Collection4(expected); while (actual.MoveNext()) { object current = actual.Current; bool removed = allExpected.Remove(current); if (!removed) { Unexpected(current); } } Assert.IsTrue(allExpected.IsEmpty(), "Still missing: " + allExpected.ToString()); } public static void AreInstanceOf(Type expectedType, IEnumerable values) { for (IEnumerator i = values.GetEnumerator(); i.MoveNext(); ) { Assert.IsInstanceOf(expectedType, i.Current); } } public static void All(IEnumerable values, IPredicate4 condition) { IEnumerator iterator = values.GetEnumerator(); while (iterator.MoveNext()) { if (!condition.Match(iterator.Current)) { Assert.Fail("Condition does not hold for for value '" + iterator.Current + "'."); } } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/StringAssert.cs0000644000175000017500000000171211520622622025124 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { public class StringAssert { public static void Contains(string expected, string actual) { if (actual.IndexOf(expected) >= 0) { return; } Assert.Fail("'" + actual + "' does not contain '" + expected + "'"); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Iterable4Assert.cs0000644000175000017500000000135011520622622025467 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { public class Iterable4Assert { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ClassLevelFixtureTestSuite.cs0000644000175000017500000000327111520622622027754 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4oUnit { public class ClassLevelFixtureTestSuite : OpaqueTestSuiteBase { public static readonly string TeardownMethodName = "classTearDown"; public static readonly string SetupMethodName = "classSetUp"; private readonly Type _clazz; public ClassLevelFixtureTestSuite(Type clazz, IClosure4 tests) : base(tests) { _clazz = clazz; } /// protected override void SuiteSetUp() { Reflection4.InvokeStatic(_clazz, SetupMethodName); } /// protected override void SuiteTearDown() { Reflection4.InvokeStatic(_clazz, TeardownMethodName); } public override string Label() { return _clazz.FullName; } protected override OpaqueTestSuiteBase Transmogrified(IClosure4 tests) { return new Db4oUnit.ClassLevelFixtureTestSuite(_clazz, tests); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ContextfulTest.cs0000644000175000017500000000442511520622622025473 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit { public class ContextfulTest : Contextful, ITest { private ITestFactory _factory; public ContextfulTest(ITestFactory factory) { _factory = factory; } public virtual string Label() { return (string)Run(new _IClosure4_18(this)); } private sealed class _IClosure4_18 : IClosure4 { public _IClosure4_18(ContextfulTest _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing.TestInstance().Label(); } private readonly ContextfulTest _enclosing; } public virtual bool IsLeafTest() { return ((bool)Run(new _IClosure4_26(this))); } private sealed class _IClosure4_26 : IClosure4 { public _IClosure4_26(ContextfulTest _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing.TestInstance().IsLeafTest(); } private readonly ContextfulTest _enclosing; } public virtual void Run() { Run(new _IRunnable_34(this)); } private sealed class _IRunnable_34 : IRunnable { public _IRunnable_34(ContextfulTest _enclosing) { this._enclosing = _enclosing; } public void Run() { this._enclosing.TestInstance().Run(); } private readonly ContextfulTest _enclosing; } private ITest TestInstance() { return _factory.NewInstance(); } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/CompositeTestListener.cs0000644000175000017500000000324111520622622027003 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { public class CompositeTestListener : ITestListener { private readonly ITestListener _listener1; private readonly ITestListener _listener2; public CompositeTestListener(ITestListener listener1, ITestListener listener2) { _listener1 = listener1; _listener2 = listener2; } public virtual void RunFinished() { _listener1.RunFinished(); _listener2.RunFinished(); } public virtual void RunStarted() { _listener1.RunStarted(); _listener2.RunStarted(); } public virtual void TestFailed(ITest test, Exception failure) { _listener1.TestFailed(test, failure); _listener2.TestFailed(test, failure); } public virtual void TestStarted(ITest test) { _listener1.TestStarted(test); _listener2.TestStarted(test); } public virtual void Failure(string msg, Exception failure) { _listener1.Failure(msg, failure); _listener2.Failure(msg, failure); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/0000755000175000017500000000000011520622070023752 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/FixtureVariable.cs0000644000175000017500000000366611520622622027413 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { public class FixtureVariable { public static Db4oUnit.Fixtures.FixtureVariable NewInstance(string label) { return new Db4oUnit.Fixtures.FixtureVariable(label); } private readonly string _label; public FixtureVariable() : this(string.Empty) { } public FixtureVariable(string label) { _label = label; } public virtual string Label { get { return _label; } } public override string ToString() { return _label; } public virtual object With(object value, IClosure4 closure) { return Inject(value).Run(closure); } public virtual void With(object value, IRunnable runnable) { Inject(value).Run(runnable); } private FixtureContext Inject(object value) { return CurrentContext().Add(this, value); } public virtual object Value { get { FixtureContext.Found found = CurrentContext().Get(this); if (null == found) { throw new InvalidOperationException(); } return (object)found.value; } } private FixtureContext CurrentContext() { return FixtureContext.Current; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/IDeferred4.cs0000644000175000017500000000140311520622622026217 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Fixtures { public interface IDeferred4 { object Value(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/MultiValueFixtureProvider.cs0000644000175000017500000000250311520622622031455 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Fixtures { public class MultiValueFixtureProvider : IFixtureProvider { public static object[] Value() { return (object[])_variable.Value; } private static readonly FixtureVariable _variable = new FixtureVariable("data"); private readonly object[][] _values; public MultiValueFixtureProvider(object[][] values) { _values = values; } public virtual FixtureVariable Variable() { return _variable; } public virtual IEnumerator GetEnumerator() { return Iterators.Iterate(_values); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/FixtureBasedTestSuite.cs0000644000175000017500000001270411520622622030547 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Fixtures { /// /// TODO: experiment with ParallelTestRunner that uses a thread pool to run tests in parallel /// TODO: FixtureProviders must accept the index of a specific fixture to run with (to make it easy to reproduce a failure) /// public abstract class FixtureBasedTestSuite : ITestSuiteBuilder { private static readonly int[] AllCombinations = null; public abstract Type[] TestUnits(); public abstract IFixtureProvider[] FixtureProviders(); public virtual int[] CombinationToRun() { return AllCombinations; } public virtual IEnumerator GetEnumerator() { IFixtureProvider[] providers = FixtureProviders(); IEnumerable decorators = FixtureDecoratorsFor(providers); IEnumerable testsXdecorators = Iterators.CrossProduct(new IEnumerable[] { Tests() , Iterators.CrossProduct(decorators) }); return Iterators.Map(testsXdecorators, new _IFunction4_35(this)).GetEnumerator(); } private sealed class _IFunction4_35 : IFunction4 { public _IFunction4_35(FixtureBasedTestSuite _enclosing) { this._enclosing = _enclosing; } public object Apply(object arg) { IEnumerator tuple = ((IEnumerable)arg).GetEnumerator(); ITest test = (ITest)Iterators.Next(tuple); IEnumerable decorators = (IEnumerable)Iterators.Next(tuple); return this._enclosing.Decorate(test, decorators.GetEnumerator()); } private readonly FixtureBasedTestSuite _enclosing; } private IEnumerable FixtureDecoratorsFor(IFixtureProvider[] providers) { int[] combination = CombinationToRun(); return combination == AllCombinations ? AllFixtureDecoratorsFor(providers) : CombinationFixtureDecoratorsFor (providers, combination); } private IEnumerable CombinationFixtureDecoratorsFor(IFixtureProvider[] providers, int[] combination) { Assert.AreEqual(providers.Length, combination.Length, "Number of indexes in combinationToRun should match number of providers" ); IEnumerable decorators = Iterators.Map(Iterators.Enumerate(Iterators.Iterable(providers )), new _IFunction4_54(combination)); return decorators; } private sealed class _IFunction4_54 : IFunction4 { public _IFunction4_54(int[] combination) { this.combination = combination; } public object Apply(object arg) { EnumerateIterator.Tuple providerTuple = (EnumerateIterator.Tuple)arg; IFixtureProvider provider = (IFixtureProvider)providerTuple.value; int wantedIndex = combination[providerTuple.index]; return Iterators.Map(Iterators.Enumerate(provider), new _IFunction4_59(wantedIndex , provider)); } private sealed class _IFunction4_59 : IFunction4 { public _IFunction4_59(int wantedIndex, IFixtureProvider provider) { this.wantedIndex = wantedIndex; this.provider = provider; } public object Apply(object arg) { EnumerateIterator.Tuple tuple = (EnumerateIterator.Tuple)arg; if (tuple.index != wantedIndex) { return Iterators.Skip; } return new FixtureDecorator(provider.Variable(), tuple.value, tuple.index); } private readonly int wantedIndex; private readonly IFixtureProvider provider; } private readonly int[] combination; } private IEnumerable AllFixtureDecoratorsFor(IFixtureProvider[] providers) { IEnumerable decorators = Iterators.Map(Iterators.Iterable(providers), new _IFunction4_74 ()); return decorators; } private sealed class _IFunction4_74 : IFunction4 { public _IFunction4_74() { } public object Apply(object arg) { IFixtureProvider provider = (IFixtureProvider)arg; return Iterators.Map(Iterators.Enumerate(provider), new _IFunction4_77(provider)); } private sealed class _IFunction4_77 : IFunction4 { public _IFunction4_77(IFixtureProvider provider) { this.provider = provider; } public object Apply(object arg) { EnumerateIterator.Tuple tuple = (EnumerateIterator.Tuple)arg; return new FixtureDecorator(provider.Variable(), tuple.value, tuple.index); } private readonly IFixtureProvider provider; } } private IEnumerable Tests() { Type[] units = TestUnits(); if (units == null || units.Length == 0) { throw new InvalidOperationException(GetType() + " has no TestUnits."); } return new ReflectionTestSuiteBuilder(units); } private ITest Decorate(ITest test, IEnumerator decorators) { while (decorators.MoveNext()) { test = ((ITestDecorator)decorators.Current).Decorate(test); } return test; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/TestWithFixture.cs0000644000175000017500000000603311520622622027430 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { public sealed class TestWithFixture : ITest { private ITest _test; private readonly FixtureVariable _variable; private readonly object _value; private readonly string _fixtureLabel; public TestWithFixture(ITest test, FixtureVariable fixtureVariable, object fixtureValue ) : this(test, null, fixtureVariable, fixtureValue) { } public TestWithFixture(ITest test, string fixtureLabel, FixtureVariable fixtureVariable , object fixtureValue) { _test = test; _fixtureLabel = fixtureLabel; _variable = fixtureVariable; _value = fixtureValue; } public string Label() { ObjectByRef label = new ObjectByRef(); RunDecorated(new _IRunnable_26(this, label)); return (string)label.value; } private sealed class _IRunnable_26 : IRunnable { public _IRunnable_26(TestWithFixture _enclosing, ObjectByRef label) { this._enclosing = _enclosing; this.label = label; } public void Run() { label.value = "(" + this._enclosing.FixtureLabel() + ") " + this._enclosing._test .Label(); } private readonly TestWithFixture _enclosing; private readonly ObjectByRef label; } public void Run() { RunDecorated(_test); } public ITest Test() { return _test; } private void RunDecorated(IRunnable block) { _variable.With(Value(), block); } private object Value() { return _value is IDeferred4 ? ((IDeferred4)_value).Value() : _value; } private object FixtureLabel() { return (_fixtureLabel == null ? _value : _fixtureLabel); } public bool IsLeafTest() { BooleanByRef isLeaf = new BooleanByRef(); RunDecorated(new _IRunnable_58(this, isLeaf)); return isLeaf.value; } private sealed class _IRunnable_58 : IRunnable { public _IRunnable_58(TestWithFixture _enclosing, BooleanByRef isLeaf) { this._enclosing = _enclosing; this.isLeaf = isLeaf; } public void Run() { isLeaf.value = this._enclosing._test.IsLeafTest(); } private readonly TestWithFixture _enclosing; private readonly BooleanByRef isLeaf; } public ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/SubjectFixtureProvider.cs0000644000175000017500000000264111520622622030770 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Fixtures { public class SubjectFixtureProvider : IFixtureProvider { public static object Value() { return (object)_variable.Value; } private static readonly FixtureVariable _variable = new FixtureVariable("subject" ); private readonly IEnumerable _values; public SubjectFixtureProvider(IEnumerable values) { _values = values; } public SubjectFixtureProvider(object[] values) : this(Iterators.Iterable(values)) { } public virtual FixtureVariable Variable() { return _variable; } public virtual IEnumerator GetEnumerator() { return _values.GetEnumerator(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/ContextfulIterator.cs0000644000175000017500000000450611520622622030156 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { public class ContextfulIterator : Contextful, IEnumerator { private readonly IEnumerator _delegate; public ContextfulIterator(IEnumerator delegate_) { _delegate = delegate_; } public virtual object Current { get { return Run(new _IClosure4_17(this)); } } private sealed class _IClosure4_17 : IClosure4 { public _IClosure4_17(ContextfulIterator _enclosing) { this._enclosing = _enclosing; } public object Run() { return this._enclosing._delegate.Current; } private readonly ContextfulIterator _enclosing; } public virtual bool MoveNext() { BooleanByRef result = new BooleanByRef(); Run(new _IRunnable_26(this, result)); return result.value; } private sealed class _IRunnable_26 : IRunnable { public _IRunnable_26(ContextfulIterator _enclosing, BooleanByRef result) { this._enclosing = _enclosing; this.result = result; } public void Run() { result.value = this._enclosing._delegate.MoveNext(); } private readonly ContextfulIterator _enclosing; private readonly BooleanByRef result; } public virtual void Reset() { Run(new _IRunnable_35(this)); } private sealed class _IRunnable_35 : IRunnable { public _IRunnable_35(ContextfulIterator _enclosing) { this._enclosing = _enclosing; } public void Run() { this._enclosing._delegate.Reset(); } private readonly ContextfulIterator _enclosing; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/SimpleFixtureProvider.cs0000644000175000017500000000236211520622622030622 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Fixtures { public class SimpleFixtureProvider : IFixtureProvider { private readonly FixtureVariable _variable; private readonly object[] _values; public SimpleFixtureProvider(FixtureVariable variable, object[] values) { _variable = variable; _values = values; } public virtual FixtureVariable Variable() { return _variable; } public virtual IEnumerator GetEnumerator() { return Iterators.Iterate(_values); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/EnvironmentProvider.cs0000644000175000017500000000342411520622622030326 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { public class EnvironmentProvider : IFixtureProvider { private sealed class _FixtureVariable_7 : FixtureVariable { public _FixtureVariable_7() { } public override void With(object value, IRunnable runnable) { base.With(value, new _IRunnable_9(value, runnable)); } private sealed class _IRunnable_9 : IRunnable { public _IRunnable_9(object value, IRunnable runnable) { this.value = value; this.runnable = runnable; } public void Run() { Environments.RunWith((IEnvironment)value, runnable); } private readonly object value; private readonly IRunnable runnable; } } private readonly FixtureVariable _variable = new _FixtureVariable_7(); public virtual FixtureVariable Variable() { return _variable; } public virtual IEnumerator GetEnumerator() { return Iterators.SingletonIterator(Environments.NewConventionBasedEnvironment()); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/ILabeled.cs0000644000175000017500000000140111520622622025741 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Fixtures { public interface ILabeled { string Label(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/FixtureDecorator.cs0000644000175000017500000000371711520622622027605 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Fixtures { internal sealed class FixtureDecorator : ITestDecorator { private readonly object _fixture; private readonly FixtureVariable _provider; private readonly int _fixtureIndex; internal FixtureDecorator(FixtureVariable provider, object fixture, int fixtureIndex ) { _fixture = fixture; _provider = provider; _fixtureIndex = fixtureIndex; } public ITest Decorate(ITest test) { string label = Label(); return test.Transmogrify(new _IFunction4_22(this, label)); } private sealed class _IFunction4_22 : IFunction4 { public _IFunction4_22(FixtureDecorator _enclosing, string label) { this._enclosing = _enclosing; this.label = label; } public object Apply(object innerTest) { return new TestWithFixture(((ITest)innerTest), label, this._enclosing._provider, this._enclosing._fixture); } private readonly FixtureDecorator _enclosing; private readonly string label; } private string Label() { string label = _provider.Label + "[" + _fixtureIndex + "]"; if (_fixture is ILabeled) { label += ":" + ((ILabeled)_fixture).Label(); } return label; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/IFixtureProvider.cs0000644000175000017500000000153211520622622027557 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Fixtures; namespace Db4oUnit.Fixtures { public interface IFixtureProvider : IEnumerable { FixtureVariable Variable(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/Contextful.cs0000644000175000017500000000250311520622622026437 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { public class Contextful { protected readonly FixtureContext _context; public Contextful() { _context = CurrentContext(); } protected virtual object Run(IClosure4 closure4) { return CombinedContext().Run(closure4); } protected virtual void Run(IRunnable runnable) { CombinedContext().Run(runnable); } private FixtureContext CombinedContext() { return CurrentContext().Combine(_context); } private FixtureContext CurrentContext() { return FixtureContext.Current; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/FixtureTestSuiteDescription.cs0000644000175000017500000000237011520622622032012 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Fixtures; namespace Db4oUnit.Fixtures { public class FixtureTestSuiteDescription : FixtureBasedTestSuite { private IFixtureProvider[] _providers; private Type[] _testUnits; public virtual void FixtureProviders(IFixtureProvider[] providers) { _providers = providers; } public virtual void TestUnits(Type[] testUnits) { _testUnits = testUnits; } public override IFixtureProvider[] FixtureProviders() { return _providers; } public override Type[] TestUnits() { return _testUnits; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/LabeledObject.cs0000644000175000017500000000306711520622622026771 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Fixtures; namespace Db4oUnit.Fixtures { public class LabeledObject : ILabeled { private readonly object _value; private readonly string _label; public LabeledObject(object value, string label) { _value = value; _label = label; } public LabeledObject(object value) : this(value, null) { } public virtual string Label() { if (_label == null) { return _value.ToString(); } return _label; } public virtual object Value() { return _value; } public static Db4oUnit.Fixtures.LabeledObject[] ForObjects(object[] values) { Db4oUnit.Fixtures.LabeledObject[] labeledObjects = new Db4oUnit.Fixtures.LabeledObject [values.Length]; for (int i = 0; i < values.Length; i++) { labeledObjects[i] = new Db4oUnit.Fixtures.LabeledObject(values[i]); } return labeledObjects; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Fixtures/FixtureContext.cs0000644000175000017500000000641711520622622027307 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit.Fixtures { /// /// Set of live /// FixtureVariable /// /value pairs. /// public class FixtureContext { private sealed class _DynamicVariable_13 : DynamicVariable { public _DynamicVariable_13() { this.EmptyContext = new FixtureContext(); } private readonly FixtureContext EmptyContext; protected override object DefaultValue() { return this.EmptyContext; } } private static readonly DynamicVariable _current = new _DynamicVariable_13(); public static FixtureContext Current { get { return (FixtureContext)_current.Value; } } public virtual object Run(IClosure4 closure) { return _current.With(this, closure); } public virtual void Run(IRunnable block) { _current.With(this, block); } internal class Found { public readonly object value; public Found(object value_) { value = value_; } } internal virtual FixtureContext.Found Get(FixtureVariable fixture) { return null; } public virtual FixtureContext Combine(FixtureContext parent) { return new _FixtureContext_49(this, parent); } private sealed class _FixtureContext_49 : FixtureContext { public _FixtureContext_49(FixtureContext _enclosing, FixtureContext parent) { this._enclosing = _enclosing; this.parent = parent; } internal override FixtureContext.Found Get(FixtureVariable fixture) { FixtureContext.Found found = this._enclosing.Get(fixture); if (null != found) { return found; } return parent.Get(fixture); } private readonly FixtureContext _enclosing; private readonly FixtureContext parent; } internal virtual FixtureContext Add(FixtureVariable fixture, object value) { return new _FixtureContext_59(this, fixture, value); } private sealed class _FixtureContext_59 : FixtureContext { public _FixtureContext_59(FixtureContext _enclosing, FixtureVariable fixture, object value) { this._enclosing = _enclosing; this.fixture = fixture; this.value = value; } internal override FixtureContext.Found Get(FixtureVariable key) { if (key == fixture) { return new FixtureContext.Found(value); } return this._enclosing.Get(key); } private readonly FixtureContext _enclosing; private readonly FixtureVariable fixture; private readonly object value; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestFailureCollection.cs0000644000175000017500000000420711520622622026741 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using System.IO; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class TestFailureCollection : Printable, IEnumerable { private readonly Collection4 _failures = new Collection4(); public virtual IEnumerator GetEnumerator() { return _failures.GetEnumerator(); } public virtual int Count { get { return _failures.Size(); } } public virtual void Add(TestFailure failure) { _failures.Add(failure); } /// public override void Print(TextWriter writer) { PrintSummary(writer); PrintDetails(writer); } /// private void PrintSummary(TextWriter writer) { int index = 1; IEnumerator e = GetEnumerator(); while (e.MoveNext()) { writer.Write(index.ToString()); writer.Write(") "); writer.Write(((TestFailure)e.Current).TestLabel); writer.Write(TestPlatform.NewLine); ++index; } } /// private void PrintDetails(TextWriter writer) { int index = 1; IEnumerator e = GetEnumerator(); while (e.MoveNext()) { writer.Write(TestPlatform.NewLine); writer.Write(index.ToString()); writer.Write(") "); ((Printable)e.Current).Print(writer); writer.Write(TestPlatform.NewLine); ++index; } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestCase.cs0000644000175000017500000000166011520622622024322 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { /// Marker interface for test cases. /// /// Marker interface for test cases. /// Required for IDE support and automatic test case /// discovery. /// public interface ITestCase { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestLifeCycle.cs0000644000175000017500000000206311520622622025304 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { /// For test cases that need setUp/tearDown support. /// For test cases that need setUp/tearDown support. public interface ITestLifeCycle : ITestCase { /// void SetUp(); /// void TearDown(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Data/0000755000175000017500000000000011520622064023015 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Data/Streams.cs0000644000175000017500000000660511520622622024771 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit.Data; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Data { /// Factory for infinite sequences of values. /// Factory for infinite sequences of values. public class Streams { private static readonly Random random = new Random(); public static IEnumerable RandomIntegers() { return Iterators.Series(null, new _IFunction4_15()); } private sealed class _IFunction4_15 : IFunction4 { public _IFunction4_15() { } public object Apply(object arg) { return Streams.random.Next(); } } public static IEnumerable RandomNaturals(int ceiling) { return Iterators.Series(null, new _IFunction4_23(ceiling)); } private sealed class _IFunction4_23 : IFunction4 { public _IFunction4_23(int ceiling) { this.ceiling = ceiling; } public object Apply(object arg) { return Streams.random.Next(ceiling); } private readonly int ceiling; } public static IEnumerable RandomStrings() { int maxLength = 42; return Iterators.Map(RandomNaturals(maxLength), new _IFunction4_32()); } private sealed class _IFunction4_32 : IFunction4 { public _IFunction4_32() { } public object Apply(object arg) { int length = ((int)arg); return Streams.RandomString(length); } } private static string RandomString(int length) { return Iterators.Join(Generators.Take(length, PrintableCharacters()), string.Empty ); } public static IEnumerable PrintableCharacters() { return Iterators.Filter(RandomCharacters(), new _IPredicate4_45()); } private sealed class _IPredicate4_45 : IPredicate4 { public _IPredicate4_45() { } public bool Match(object candidate) { char character = (char)candidate; return this.IsPrintable(character); } private bool IsPrintable(char value) { if (value >= 'a' && value <= 'z') { return true; } if (value >= 'A' && value <= 'Z') { return true; } if (value >= '0' && value <= '9') { return true; } switch (value) { case '_': case ' ': case '\r': case '\n': { return true; } } return false; } } public static IEnumerable RandomCharacters() { char maxCharInclusive = 'z'; return Iterators.Map(RandomNaturals(1 + (int)maxCharInclusive), new _IFunction4_75 ()); } private sealed class _IFunction4_75 : IFunction4 { public _IFunction4_75() { } public object Apply(object value) { return (char)((int)value); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Data/Generators.cs0000644000175000017500000000611011520622622025453 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit.Data; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Data { public partial class Generators { public static IEnumerable ArbitraryValuesOf(Type type) { IEnumerable platformSpecific = PlatformSpecificArbitraryValuesOf(type); if (null != platformSpecific) { return platformSpecific; } if (type == typeof(int)) { return Take(10, Streams.RandomIntegers()); } if (type == typeof(string)) { return Take(10, Streams.RandomStrings()); } throw new NotImplementedException("No generator for type " + type); } internal static IEnumerable Trace(IEnumerable source) { return Iterators.Map(source, new _IFunction4_32()); } private sealed class _IFunction4_32 : IFunction4 { public _IFunction4_32() { } public object Apply(object value) { Sharpen.Runtime.Out.WriteLine(value); return value; } } public static IEnumerable Take(int count, IEnumerable source) { return new _IEnumerable_41(source, count); } private sealed class _IEnumerable_41 : IEnumerable { public _IEnumerable_41(IEnumerable source, int count) { this.source = source; this.count = count; } public IEnumerator GetEnumerator() { return new _IEnumerator_43(source, count); } private sealed class _IEnumerator_43 : IEnumerator { public _IEnumerator_43(IEnumerable source, int count) { this.source = source; this.count = count; this._taken = 0; this._delegate = source.GetEnumerator(); } private int _taken; private IEnumerator _delegate; public object Current { get { if (this._taken > count) { throw new InvalidOperationException(); } return this._delegate.Current; } } public bool MoveNext() { if (this._taken < count) { if (!this._delegate.MoveNext()) { this._taken = count; return false; } ++this._taken; return true; } return false; } public void Reset() { this._taken = 0; this._delegate = source.GetEnumerator(); } private readonly IEnumerable source; private readonly int count; } private readonly IEnumerable source; private readonly int count; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/IteratorAssert.cs0000644000175000017500000000522511520622622025452 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class IteratorAssert { public static void AreEqual(IEnumerable expected, IEnumerable actual) { AreEqual(expected.GetEnumerator(), actual.GetEnumerator()); } public static void AreEqual(IEnumerator expected, IEnumerator actual) { if (null == expected) { Assert.IsNull(actual); return; } Assert.IsNotNull(actual); while (expected.MoveNext()) { Assert.IsTrue(actual.MoveNext()); Assert.AreEqual(expected.Current, actual.Current); } Assert.IsFalse(actual.MoveNext()); } public static void AreEqual(object[] expected, IEnumerator iterator) { ArrayList v = new ArrayList(); for (int i = 0; i < expected.Length; i++) { v.Add(expected[i]); } AreEqual(v.GetEnumerator(), iterator); } public static void SameContent(object[] expected, IEnumerable actual) { IList expectedList = new ArrayList(); for (int expectedObjectIndex = 0; expectedObjectIndex < expected.Length; ++expectedObjectIndex) { object expectedObject = expected[expectedObjectIndex]; expectedList.Add(expectedObject); } SameContent(expectedList, actual); } public static void SameContent(IEnumerable expected, IEnumerable actual) { SameContent(expected.GetEnumerator(), actual.GetEnumerator()); } public static void SameContent(IEnumerator expected, IEnumerator actual) { Collection4 allExpected = new Collection4(); while (expected.MoveNext()) { allExpected.Add(expected.Current); } while (actual.MoveNext()) { object current = actual.Current; bool removed = allExpected.Remove(current); if (!removed) { Unexpected(current); } } Assert.IsTrue(allExpected.IsEmpty(), allExpected.ToString()); } private static void Unexpected(object element) { Assert.Fail("Unexpected element: " + element); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Printable.cs0000644000175000017500000000206611520622622024417 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.IO; namespace Db4oUnit { public abstract class Printable { public override string ToString() { StringWriter writer = new StringWriter(); try { Print(writer); } catch (IOException) { } return writer.ToString(); } /// public abstract void Print(TextWriter writer); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestResult.cs0000644000175000017500000000432611520622622024616 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit; using Db4oUnit.Util; namespace Db4oUnit { public class TestResult : Printable, ITestListener { private TestFailureCollection _failures = new TestFailureCollection(); private int _testCount = 0; private readonly StopWatch _watch = new StopWatch(); public TestResult() { } public virtual void TestStarted(ITest test) { ++_testCount; } public virtual void TestFailed(ITest test, Exception failure) { _failures.Add(new TestFailure(test.Label(), failure)); } public virtual void Failure(string msg, Exception failure) { } public virtual int TestCount { get { return _testCount; } } public virtual bool Green { get { return _failures.Count == 0; } } public virtual TestFailureCollection Failures { get { return _failures; } } /// public override void Print(TextWriter writer) { if (Green) { writer.Write("GREEN (" + _testCount + " tests) - " + ElapsedString() + TestPlatform .NewLine); return; } writer.Write("RED (" + _failures.Count + " out of " + _testCount + " tests failed) - " + ElapsedString() + TestPlatform.NewLine); _failures.Print(writer); } private string ElapsedString() { return _watch.ToString(); } public virtual void RunStarted() { _watch.Start(); } public virtual void RunFinished() { _watch.Stop(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ConsoleTestRunner.cs0000644000175000017500000000547311520622622026140 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.IO; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class ConsoleTestRunner { private readonly IEnumerable _suite; private readonly bool _reportToFile; public ConsoleTestRunner(IEnumerator suite) : this(suite, true) { } public ConsoleTestRunner(IEnumerator suite, bool reportToFile) { if (null == suite) { throw new ArgumentException("suite"); } _suite = Iterators.Iterable(suite); _reportToFile = reportToFile; } public ConsoleTestRunner(IEnumerable suite) : this(suite, true) { } public ConsoleTestRunner(IEnumerable suite, bool reportToFile) { if (null == suite) { throw new ArgumentException("suite"); } _suite = suite; _reportToFile = reportToFile; } public ConsoleTestRunner(Type clazz) : this(new ReflectionTestSuiteBuilder(clazz) ) { } public virtual int Run() { return Run(TestPlatform.GetStdErr()); } protected virtual TestResult CreateTestResult() { return new TestResult(); } public virtual int Run(TextWriter writer) { TestResult result = CreateTestResult(); new TestRunner(_suite).Run(new CompositeTestListener(new ConsoleListener(writer), result)); ReportResult(result, writer); return result.Failures.Count; } private void Report(Exception x) { TestPlatform.PrintStackTrace(TestPlatform.GetStdErr(), x); } private void ReportResult(TestResult result, TextWriter writer) { if (_reportToFile) { ReportToTextFile(result); } Report(result, writer); } private void ReportToTextFile(TestResult result) { try { TextWriter writer = TestPlatform.OpenTextFile("db4ounit.log"); try { Report(result, writer); } finally { writer.Close(); } } catch (IOException e) { Report(e); } } private void Report(TestResult result, TextWriter writer) { try { result.Print(writer); writer.Flush(); } catch (IOException e) { Report(e); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/FailingTest.cs0000644000175000017500000000276711520622622024720 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { /// A test that always fails with a specific exception. /// A test that always fails with a specific exception. public class FailingTest : ITest { private readonly Exception _error; private readonly string _label; public FailingTest(string label, Exception error) { _label = label; _error = error; } public virtual string Label() { return _label; } public virtual Exception Error() { return _error; } public virtual void Run() { throw new TestException(_error); } public virtual bool IsLeafTest() { return true; } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITest.cs0000644000175000017500000000161511520622622023526 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit { public interface ITest : IRunnable { string Label(); bool IsLeafTest(); ITest Transmogrify(IFunction4 fun); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ICodeBlock.cs0000644000175000017500000000145511520622622024436 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { public interface ICodeBlock { /// void Run(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestDecorationAdapter.cs0000644000175000017500000000231511520622622026724 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; namespace Db4oUnit { public class TestDecorationAdapter : ITest { private readonly ITest _test; public TestDecorationAdapter(ITest test) { _test = test; } public virtual string Label() { return _test.Label(); } public virtual void Run() { _test.Run(); } public virtual bool IsLeafTest() { return _test.IsLeafTest(); } public virtual ITest Transmogrify(IFunction4 fun) { return ((ITest)fun.Apply(this)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Assert.cs0000644000175000017500000001714111520622622023740 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { public sealed partial class Assert { public static Exception Expect(Type exception, ICodeBlock block) { Exception e = GetThrowable(block); AssertThrowable(exception, e, null); return e; } public static Exception Expect(Type exception, Type cause, ICodeBlock block) { return Expect(exception, cause, block, null); } public static Exception Expect(Type exception, Type cause, ICodeBlock block, string customMessage) { Exception e = GetThrowable(block); AssertThrowable(exception, e, customMessage); AssertThrowable(cause, e.InnerException, customMessage); return e; } private static void AssertThrowable(Type exception, Exception e, string customMessage ) { if (exception.IsInstanceOfType(e)) { return; } string messagePrefix = customMessage != null ? customMessage + ": " : string.Empty; string message = e == null ? "Exception '" + exception.FullName + "' expected" : "Expecting '" + exception.FullName + "' but got '" + e.GetType().FullName + "'"; Fail(messagePrefix + message, e); } private static Exception GetThrowable(ICodeBlock block) { try { block.Run(); } catch (Exception e) { return e; } return null; } public static void Fail() { Fail("FAILURE"); } public static void Fail(string msg) { throw new AssertionException(msg); } public static void Fail(string msg, Exception cause) { throw new AssertionException(msg, cause); } public static void IsTrue(bool condition) { IsTrue(condition, "FAILURE"); } public static void IsTrue(bool condition, string msg) { if (condition) { return; } Fail(msg); } public static void IsNull(object reference) { if (reference != null) { Fail(FailureMessage("null", reference)); } } public static void IsNull(object reference, string message) { if (reference != null) { Fail(message); } } public static void IsNotNull(object reference) { if (reference == null) { Fail(FailureMessage("not null", reference)); } } public static void IsNotNull(object reference, string message) { if (reference == null) { Fail(message); } } public static void AreEqual(bool expected, bool actual) { if (expected == actual) { return; } Fail(FailureMessage(expected, actual)); } public static void AreEqual(int expected, int actual) { AreEqual(expected, actual, null); } public static void AreEqual(int expected, int actual, string message) { if (expected == actual) { return; } Fail(FailureMessage(expected, actual, message)); } public static void AreEqual(double expected, double actual) { AreEqual(expected, actual, null); } public static void AreEqual(double expected, double actual, string message) { if (expected == actual) { return; } Fail(FailureMessage(expected, actual, message)); } public static void AreEqual(long expected, long actual) { if (expected == actual) { return; } Fail(FailureMessage(expected, actual)); } public static void AreEqual(object expected, object actual, string message) { if (Check.ObjectsAreEqual(expected, actual)) { return; } Fail(FailureMessage(expected, actual, message)); } public static void AreEqual(object expected, object actual) { AreEqual(expected, actual, null); } public static void AreSame(object expected, object actual) { if (expected == actual) { return; } Fail(FailureMessage(expected, actual)); } public static void AreNotSame(object unexpected, object actual) { if (unexpected != actual) { return; } Fail("Expecting not '" + unexpected + "'."); } private static string FailureMessage(object expected, object actual) { return FailureMessage(expected, actual, null); } private static string FailureMessage(object expected, object actual, string customMessage ) { return FailureMessage(expected, actual, string.Empty, customMessage); } private static string FailureMessage(object expected, object actual, string cmpOper , string customMessage) { return (customMessage == null ? string.Empty : customMessage + ": ") + "Expected " + cmpOper + "'" + expected + "' but was '" + actual + "'"; } private static string FailureMessage(long expected, long actual, string cmpOper, string customMessage) { return (customMessage == null ? string.Empty : customMessage + ": ") + "Expected " + cmpOper + "'" + expected + "' but was '" + actual + "'"; } public static void IsFalse(bool condition) { IsTrue(!condition); } public static void IsFalse(bool condition, string message) { IsTrue(!condition, message); } public static void IsInstanceOf(Type expectedClass, object actual) { IsTrue(expectedClass.IsInstanceOfType(actual), FailureMessage(expectedClass, actual == null ? null : actual.GetType())); } public static void IsGreater(long expected, long actual) { if (actual > expected) { return; } Fail(FailureMessage(expected, actual, "greater than ", null)); } public static void IsGreaterOrEqual(long expected, long actual) { if (actual >= expected) { return; } Fail(expected, actual, "greater than or equal to ", null); } public static void IsSmaller(long expected, long actual) { if (actual < expected) { return; } Fail(FailureMessage(expected, actual, "smaller than ", null)); } public static void IsSmallerOrEqual(long expected, long actual) { if (actual <= expected) { return; } Fail(expected, actual, "smaller than or equal to ", null); } private static void Fail(long expected, long actual, string @operator, string customMessage ) { Fail(FailureMessage(expected, actual, @operator, null)); } public static void AreNotEqual(long unexpected, long actual) { AreNotEqual(unexpected, actual, null); } public static void AreNotEqual(long unexpected, long actual, string customMessage ) { if (actual != unexpected) { return; } Fail(unexpected, actual, "not equal to ", customMessage); } public static void AreNotEqual(object unexpected, object actual) { if (!Check.ObjectsAreEqual(unexpected, actual)) { return; } Fail("Expecting not '" + unexpected + "'"); } public static void EqualsAndHashcode(object obj, object same, object other) { AreEqual(obj, obj); AreEqual(obj, same); AreNotEqual(obj, other); AreEqual(obj.GetHashCode(), same.GetHashCode()); AreEqual(same, obj); AreNotEqual(other, obj); AreNotEqual(obj, null); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ReflectionTestSuite.cs0000644000175000017500000000326111520622622026441 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; namespace Db4oUnit { /// Support for hierarchically chained test suites. /// /// Support for hierarchically chained test suites. /// In the topmost test package define an AllTests class which extends /// ReflectionTestSuite and returns all subpackage.AllTests classes as /// testCases. Example: /// package org.acme.tests; /// public class AllTests extends ReflectionTestSuite { /// protected Class[] testCases() { /// return new Class[] { /// org.acme.tests.subsystem1.AllTests.class, /// org.acme.tests.subsystem2.AllTests.class, /// }; /// } /// } /// public abstract class ReflectionTestSuite : ITestSuiteBuilder { public virtual IEnumerator GetEnumerator() { return new ReflectionTestSuiteBuilder(TestCases()).GetEnumerator(); } protected abstract Type[] TestCases(); public virtual int Run() { return new ConsoleTestRunner(GetEnumerator()).Run(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TearDownFailureException.cs0000644000175000017500000000171111520622622027405 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; namespace Db4oUnit { [System.Serializable] public class TearDownFailureException : TestException { private const long serialVersionUID = -5998743679496701084L; public TearDownFailureException(Exception cause) : base(cause) { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestSuiteBuilder.cs0000644000175000017500000000166111520622622026050 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; namespace Db4oUnit { /// Custom test suite builder interface. /// Custom test suite builder interface. public interface ITestSuiteBuilder : ITestCase, IEnumerable { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ITestDecorator.cs0000644000175000017500000000143511520622622025371 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit { public interface ITestDecorator { ITest Decorate(ITest test); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Mocking/0000755000175000017500000000000011520622070023530 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Mocking/CodeGenerator.cs0000644000175000017500000000524311520622622026607 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Mocking; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Mocking { public class CodeGenerator { /// /// Generates an array that can be used with /// MethodCallRecorder.Verify(db4ounit.mocking.MethodCall[]) /// /// . /// Example: /// MethodCallRecorder recorder = new MethodCallRecorder(); /// runTest(recorder); /// System.out.println(CodeGenerator.generateMethodCallArray(recorder)) /// /// MethodCall generator /// array string public static string GenerateMethodCallArray(IEnumerable calls) { IEnumerable callStrings = Iterators.Map(calls, new _IFunction4_23()); return Iterators.Join(callStrings.GetEnumerator(), "," + TestPlatform.NewLine); } private sealed class _IFunction4_23 : IFunction4 { public _IFunction4_23() { } public object Apply(object arg) { return CodeGenerator.GenerateMethodCall((MethodCall)arg); } } public static string GenerateValue(object value) { if (value == null) { return "null"; } if (value is string) { return "\"" + value + "\""; } if (value is object[]) { return GenerateArray((object[])value); } return value.ToString(); } public static string GenerateArray(object[] array) { IEnumerator values = Iterators.Map(Iterators.Iterate(array), new _IFunction4_45() ); return "new Object[] " + Iterators.Join(values, "{", "}", ", "); } private sealed class _IFunction4_45 : IFunction4 { public _IFunction4_45() { } public object Apply(object arg) { return CodeGenerator.GenerateValue(arg); } } public static string GenerateMethodCall(MethodCall call) { return "new MethodCall(\"" + call.methodName + "\", " + GenerateArray(call.args) + ")"; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Mocking/MethodCallRecorder.cs0000644000175000017500000000340311520622622027564 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Mocking; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Mocking { public class MethodCallRecorder : IEnumerable { private readonly Collection4 _calls = new Collection4(); public virtual IEnumerator GetEnumerator() { return _calls.GetEnumerator(); } public virtual void Record(MethodCall call) { _calls.Add(call); } public virtual void Reset() { _calls.Clear(); } /// Asserts that the method calls were the same as expectedCalls. /// /// Asserts that the method calls were the same as expectedCalls. /// Unfortunately we cannot call this method 'assert' because /// it's a keyword starting with java 1.5. /// /// public virtual void Verify(MethodCall[] expectedCalls) { Iterator4Assert.AreEqual(expectedCalls, GetEnumerator()); } public virtual void VerifyUnordered(MethodCall[] expectedCalls) { Iterator4Assert.SameContent(expectedCalls, GetEnumerator()); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/Mocking/MethodCall.cs0000644000175000017500000000544011520622622026101 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Mocking; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Mocking { public class MethodCall { private sealed class _object_9 : object { public _object_9() { } public override string ToString() { return "..."; } } public static readonly object IgnoredArgument = new _object_9(); public interface IArgumentCondition { void Verify(object argument); } public class Conditions { public static MethodCall.IArgumentCondition IsA(Type expectedClass) { return new _IArgumentCondition_21(expectedClass); } private sealed class _IArgumentCondition_21 : MethodCall.IArgumentCondition { public _IArgumentCondition_21(Type expectedClass) { this.expectedClass = expectedClass; } public void Verify(object argument) { Assert.IsInstanceOf(expectedClass, argument); } private readonly Type expectedClass; } } public readonly string methodName; public readonly object[] args; public MethodCall(string methodName, object[] args) { this.methodName = methodName; this.args = args; } public override string ToString() { return methodName + "(" + Iterators.Join(Iterators.Iterate(args), ", ") + ")"; } public override bool Equals(object obj) { if (null == obj) { return false; } if (GetType() != obj.GetType()) { return false; } MethodCall other = (MethodCall)obj; if (!methodName.Equals(other.methodName)) { return false; } if (args.Length != other.args.Length) { return false; } for (int i = 0; i < args.Length; ++i) { object expectedArg = args[i]; if (expectedArg == IgnoredArgument) { continue; } object actualArg = other.args[i]; if (expectedArg is MethodCall.IArgumentCondition) { ((MethodCall.IArgumentCondition)expectedArg).Verify(actualArg); continue; } if (!Check.ObjectsAreEqual(expectedArg, actualArg)) { return false; } } return true; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/ArrayAssert.cs0000644000175000017500000001173511520622622024742 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4oUnit { public partial class ArrayAssert { public static void Contains(long[] array, long expected) { if (-1 != IndexOf(array, expected)) { return; } Assert.Fail("Expecting '" + expected + "'."); } public static void ContainsByIdentity(object[] array, object[] expected) { for (int i = 0; i < expected.Length; i++) { if (-1 == Arrays4.IndexOfIdentity(array, expected[i])) { Assert.Fail("Expecting contains '" + expected[i] + "'."); } } } public static void ContainsByEquality(object[] array, object[] expected) { for (int i = 0; i < expected.Length; i++) { if (-1 == Arrays4.IndexOfEquals(array, expected[i])) { Assert.Fail("Expecting contains '" + expected[i] + "'."); } } } public static void AreEqual(object[] expected, object[] actual) { AreEqualImpl(expected, actual); } public static void AreEqual(string[] expected, string[] actual) { // JDK 1.1 needs the conversion AreEqualImpl(StringArrayToObjectArray(expected), StringArrayToObjectArray(actual) ); } private static object[] StringArrayToObjectArray(string[] expected) { object[] expectedAsObject = new object[expected.Length]; System.Array.Copy(expected, 0, expectedAsObject, 0, expected.Length); return expectedAsObject; } private static string IndexMessage(int i) { return "expected[" + i + "]"; } public static void AreEqual(byte[] expected, byte[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } public static void AreNotEqual(byte[] expected, byte[] actual) { Assert.AreNotSame(expected, actual); for (int i = 0; i < expected.Length; i++) { if (expected[i] != actual[i]) { return; } } Assert.IsTrue(false); } public static void AreEqual(int[] expected, int[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } public static void AreEqual(long[] expected, long[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } public static void AreEqual(float[] expected, float[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } public static void AreEqual(double[] expected, double[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } public static void AreEqual(char[] expected, char[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); } Assert.AreEqual(expected.Length, actual.Length); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } private static int IndexOf(long[] array, long expected) { for (int i = 0; i < array.Length; ++i) { if (expected == array[i]) { return i; } } return -1; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit/Db4oUnit/TestRunner.cs0000644000175000017500000000536611520622622024616 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; using Sharpen.Lang; namespace Db4oUnit { public class TestRunner { public static DynamicVariable Executor = DynamicVariable.NewInstance(); private readonly IEnumerable _tests; public TestRunner(IEnumerable tests) { _tests = tests; } public virtual void Run(ITestListener listener) { listener.RunStarted(); ITestExecutor executor = new _ITestExecutor_19(this, listener); Environments.RunWith(Environments.NewClosedEnvironment(new object[] { executor }) , new _IRunnable_28(this, listener)); listener.RunFinished(); } private sealed class _ITestExecutor_19 : ITestExecutor { public _ITestExecutor_19(TestRunner _enclosing, ITestListener listener) { this._enclosing = _enclosing; this.listener = listener; } public void Execute(ITest test) { this._enclosing.RunTest(test, listener); } public void Fail(ITest test, Exception failure) { listener.TestFailed(test, failure); } private readonly TestRunner _enclosing; private readonly ITestListener listener; } private sealed class _IRunnable_28 : IRunnable { public _IRunnable_28(TestRunner _enclosing, ITestListener listener) { this._enclosing = _enclosing; this.listener = listener; } public void Run() { IEnumerator iterator = this._enclosing._tests.GetEnumerator(); while (iterator.MoveNext()) { this._enclosing.RunTest((ITest)iterator.Current, listener); } } private readonly TestRunner _enclosing; private readonly ITestListener listener; } private void RunTest(ITest test, ITestListener listener) { if (test.IsLeafTest()) { listener.TestStarted(test); } try { test.Run(); } catch (TestException x) { Exception reason = x.GetReason(); listener.TestFailed(test, reason == null ? x : reason); } catch (Exception failure) { listener.TestFailed(test, failure); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/0000755000175000017500000000000011520622040020344 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/0000755000175000017500000000000011520622070021777 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/AssertionException.cs0000644000175000017500000000167511520622622026170 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { public partial class AssertionException { #if !CF && !SILVERLIGHT public AssertionException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } #endif } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/NullTextWriter.cs0000644000175000017500000000170511520622622025310 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Text; using System.IO; namespace Db4oUnit { class NullTextWriter : TextWriter { override public Encoding Encoding { get { return Encoding.UTF8; } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Data/0000755000175000017500000000000011520622066022655 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Data/Generators.cs0000644000175000017500000000227411520622622025320 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Data { public partial class Generators { public static IEnumerable PlatformSpecificArbitraryValuesOf(Type type) { if (IsNullable(type)) { return Iterators.Append(Generators.ArbitraryValuesOf(type.GetGenericArguments()[0]), null); } return null; } private static bool IsNullable(Type type) { return type.IsGenericType && typeof(Nullable<>) == type.GetGenericTypeDefinition(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/TestException.cs0000644000175000017500000000254511520622622025135 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4oUnit { public class TestException : Exception { public TestException(string message, Exception reason) : base(message, reason) { } public TestException(Exception reason) : base(reason.Message, reason) { } #if !CF && !SILVERLIGHT public TestException(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context) { } #endif public Exception GetReason() { return InnerException; } override public string ToString() { if (null != InnerException) return InnerException.ToString(); return base.ToString(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/TestPlatform.cs0000644000175000017500000000367711520622622024772 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { using System; using System.IO; using System.Reflection; public class TestPlatform { #if CF public static string NewLine = "\n"; #else public static string NewLine = Environment.NewLine; #endif // will be assigned from the outside on CF public static TextWriter Out; public static TextWriter Error; static TestPlatform() { Out = Console.Out; Error = Console.Error; } public static void PrintStackTrace(TextWriter writer, Exception e) { writer.Write(e); } public static TextWriter GetNullWriter() { return new NullTextWriter(); } public static TextWriter GetStdErr() { return Error; } public static void EmitWarning(string warning) { Out.WriteLine(warning); } public static bool IsStatic(MethodInfo method) { return method.IsStatic; } public static bool IsPublic(MethodInfo method) { return method.IsPublic; } public static bool HasParameters(MethodInfo method) { return method.GetParameters().Length > 0; } public static TextWriter OpenTextFile(string fname) { return new StreamWriter(fname); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Util/0000755000175000017500000000000011520622064022717 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Util/PlatformInformation.cs0000644000175000017500000000155311520622622027244 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Util { public class PlatformInformation { public static bool IsJava() { return false; } public static bool IsDotNet() { return true; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Util/StopWatch.cs0000644000175000017500000000223711520622622025166 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Util { public class StopWatch { private System.DateTime _started; private System.DateTime _finished; public StopWatch() { } public virtual void Start() { _started = System.DateTime.Now; } public virtual void Stop() { _finished = System.DateTime.Now; } public virtual System.TimeSpan Elapsed() { return _finished - _started; } public override string ToString() { return Elapsed().ToString(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/Assert.cs0000644000175000017500000000277511520622622023605 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4oUnit { public delegate void CodeBlock(); public partial class Assert { public static Exception Expect(System.Type exception, CodeBlock block) { return Assert.Expect(exception, new DelegateCodeBlock(block)); } public static Exception Expect(CodeBlock block) where TException : Exception { return Assert.Expect(typeof(TException), block); } private class DelegateCodeBlock : ICodeBlock { private readonly CodeBlock _block; public DelegateCodeBlock(CodeBlock block) { _block = block; } public void Run() { _block(); } } public static void InRange(double value, double from, double to) { Assert.IsTrue(value >= from && value <= to, string.Format("'{0}' not in range '{1}'..'{2}'", value, from, to)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/native/Db4oUnit/ArrayAssert.cs0000644000175000017500000000244411520622622024575 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit { public partial class ArrayAssert { public static void AreEqual(T[] expected, T[] actual) { AreEqualImpl(expected, actual); } static void AreEqualImpl(T[] expected, T[] actual) { if (expected == actual) { return; } if (expected == null || actual == null) { Assert.AreSame(expected, actual); return; } Assert.AreEqual(expected.Length, actual.Length); Assert.AreSame(expected.GetType(), actual.GetType()); for (int i = 0; i < expected.Length; i++) { Assert.AreEqual(expected[i], actual[i], IndexMessage(i)); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit-Silverlight-2010.csproj0000644000175000017500000002417311520622060024613 0ustar directhexdirecthex v3.5 true ../db4objects.snk Debug AnyCPU 9.0.30729 2.0 {C74364D8-A04A-4CF9-801D-D1811D49E72A} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4oUnit Db4oUnit v4.0 false true true true ../db4objects.snk Silverlight $(TargetFrameworkVersion) 3.5 true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2010 db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit-2008.csproj0000644000175000017500000002252411520622052022327 0ustar directhexdirecthex 9.0.30729 2.0 {8F82F8B0-95B6-4553-BDA8-BD9A954E682F} Debug AnyCPU Db4oUnit Library Db4oUnit OnBuildSuccess v3.5 512 true ../db4objects.snk bin\Debug\ false 285212672 false true TRACE;DEBUG;NET_3_5 4096 false 1591;1572;1573;1574;0419; false false false false 0 bin\Release\ false 285212672 false false TRACE;NET_3_5 4096 false 1591;1572;1573;1574;0419; true false false false 4 System {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/Db4oUnit/Db4oUnit-2010.csproj0000644000175000017500000002554111520622052022322 0ustar directhexdirecthex 9.0.30729 2.0 {8F82F8B0-95B6-4553-BDA8-BD9A954E682F} Debug AnyCPU Db4oUnit Library Db4oUnit OnBuildSuccess v4.0 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk bin\Debug\ false 285212672 false true TRACE;DEBUG;NET_3_5;NET_4_0 4096 false 1591;1572;1573;1574;0419; false false false false 0 bin\Release\ false 285212672 false false TRACE;NET_3_5;NET_4_0 4096 false 1591;1572;1573;1574;0419; true false false false 4 System False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 db4o-8.0.184.15484+dfsg/src/Db4oUnit/Makefile0000644000175000017500000000014011520622052020514 0ustar directhexdirecthex include ../include.mk TARGET = library ASSEMBLY = $(UNIT) REFERENCES = -r:$(OUTDIR)/$(CORE) db4o-8.0.184.15484+dfsg/src/Db4oUnit/Properties/0000755000175000017500000000000011520622060021214 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit/Properties/AssemblyInfo.cs0000644000175000017500000000256311520622622024150 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Security; [assembly: AssemblyTitle("db4o - database for objects")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyName("")] // attributes are automatically set by the build [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyKeyFile("")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyDescription("Db4oUnit 8.0.184.15484 (.NET)")]db4o-8.0.184.15484+dfsg/src/drs/0000755000175000017500000000000011520622056016225 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/compatibility.net.html0000644000175000017500000000202711520622042022545 0ustar directhexdirecthex COMPATIBILITY

db4o Replication System for .Net (Drs)
Compatibility

Drs is compatible with the following products:

.NET v 2.0 or later
db4o v @db4o.version.dotted@

db4o-8.0.184.15484+dfsg/src/drs/QuickStart/0000755000175000017500000000000011520622070020313 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/QuickStart/QuickStart-2008.sln0000644000175000017500000000464311520622054023523 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QuickStart-2008", "QuickStart-2008.csproj", "{11C2A893-D0DA-48FC-82EC-12B3C3AC5F78}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "..\..\Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Drs-2008", "..\Db4objects.Drs\Db4objects.Drs-2008.csproj", "{B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS-2008", "..\..\Db4objects.Db4o.CS\Db4objects.Db4o.CS-2008.csproj", "{9FA8178A-3E77-42C5-A252-6690EA9BA257}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {11C2A893-D0DA-48FC-82EC-12B3C3AC5F78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {11C2A893-D0DA-48FC-82EC-12B3C3AC5F78}.Debug|Any CPU.Build.0 = Debug|Any CPU {11C2A893-D0DA-48FC-82EC-12B3C3AC5F78}.Release|Any CPU.ActiveCfg = Release|Any CPU {11C2A893-D0DA-48FC-82EC-12B3C3AC5F78}.Release|Any CPU.Build.0 = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.Build.0 = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/drs/QuickStart/Db4objects.Drs.Quickstart/0000755000175000017500000000000011520622044025157 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/QuickStart/Db4objects.Drs.Quickstart/Simple/0000755000175000017500000000000011520622070026407 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/QuickStart/Db4objects.Drs.Quickstart/Simple/Pilot.cs0000644000175000017500000000176211520622640030036 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Quickstart.Simple { public class Pilot { public string _name; public int _age; public Pilot() { } internal Pilot(string name, int age) { this._name = name; this._age = age; } public override string ToString() { return _name + "/" + _age; } } } db4o-8.0.184.15484+dfsg/src/drs/QuickStart/Db4objects.Drs.Quickstart/Simple/Simple.cs0000644000175000017500000001425411520622640030200 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Drs.Db4o; namespace Db4objects.Drs.Quickstart.Simple { public class Simple { public static void Main(string[] args) { new Db4objects.Drs.Quickstart.Simple.Simple().DoOneWayReplcation(); new Db4objects.Drs.Quickstart.Simple.Simple().DoBiDirectionalReplication(); new Db4objects.Drs.Quickstart.Simple.Simple().DoSelectiveReplication(); } public virtual void DoSelectiveReplication() { Db4objects.Db4o.IObjectContainer handheld = OpenDb(ConfigureDb4oForReplication(), "handheld.yap"); StoreSomePilots(handheld); Db4objects.Db4o.IObjectContainer desktop = OpenDb(ConfigureDb4oForReplication(), "desktop.yap"); DisplayContents("Selective Replication", "Before", handheld, desktop); Db4objects.Drs.IReplicationSession replication = Db4objects.Drs.Replication.Begin(ProviderFor(handheld), ProviderFor(desktop)); Db4objects.Db4o.IObjectSet changed = replication.ProviderA().ObjectsChangedSinceLastReplication (); while (changed.HasNext()) { Db4objects.Drs.Quickstart.Simple.Pilot p = (Db4objects.Drs.Quickstart.Simple.Pilot )changed.Next(); if (p._name.StartsWith("S")) { replication.Replicate(p); } } replication.Commit(); DisplayContents(string.Empty, "After", handheld, desktop); CloseDb(handheld); CloseDb(desktop); } private Db4oEmbeddedReplicationProvider ProviderFor(IObjectContainer handheld) { return new Db4oEmbeddedReplicationProvider(handheld); } private void DoBiDirectionalReplication() { Db4objects.Db4o.IObjectContainer handheld = OpenDb(ConfigureDb4oForReplication(), "handheld.yap"); StoreSomePilots(handheld); Db4objects.Db4o.IObjectContainer desktop = OpenDb(ConfigureDb4oForReplication(), "desktop.yap"); StoreSomeMorePilots(desktop); DisplayContents("Bi-Directional", "Before", handheld, desktop); Db4objects.Drs.IReplicationSession replication = Db4objects.Drs.Replication.Begin(ProviderFor(handheld), ProviderFor(desktop)); Db4objects.Db4o.IObjectSet changed = replication.ProviderA().ObjectsChangedSinceLastReplication (); while (changed.HasNext()) { replication.Replicate(changed.Next()); } changed = replication.ProviderB().ObjectsChangedSinceLastReplication(); while (changed.HasNext()) { replication.Replicate(changed.Next()); } replication.Commit(); DisplayContents(string.Empty, "After", handheld, desktop); CloseDb(handheld); CloseDb(desktop); } private void DisplayContents(string methodname, string pointintime, Db4objects.Db4o.IObjectContainer handheld, Db4objects.Db4o.IObjectContainer desktop) { if (methodname != string.Empty) { Sharpen.Runtime.Out.WriteLine(methodname + " Replication"); Sharpen.Runtime.Out.WriteLine(); } Sharpen.Runtime.Out.WriteLine(pointintime + " Replication"); Sharpen.Runtime.Out.WriteLine(); DisplayContentsOf("Contents of Handheld", handheld); DisplayContentsOf("Contents of Desktop", desktop); } private void StoreSomeMorePilots(Db4objects.Db4o.IObjectContainer db) { db.Store(new Db4objects.Drs.Quickstart.Simple.Pilot("Peter van der Merwe", 37)); db.Store(new Db4objects.Drs.Quickstart.Simple.Pilot("Albert Kwan", 30)); } private void DisplayContentsOf(string heading, Db4objects.Db4o.IObjectContainer db ) { Sharpen.Runtime.Out.WriteLine(heading); Sharpen.Runtime.Out.WriteLine(); Db4objects.Db4o.IObjectSet result = db.QueryByExample(new Db4objects.Drs.Quickstart.Simple.Pilot()); ListResult(result); } private void CloseDb(Db4objects.Db4o.IObjectContainer db) { db.Close(); } private Db4objects.Db4o.IObjectContainer OpenDb(IEmbeddedConfiguration config, string dbname) { new Sharpen.IO.File(dbname).Delete(); return Db4oEmbedded.OpenFile(config, dbname); } private IEmbeddedConfiguration ConfigureDb4oForReplication() { IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration(); configuration.File.GenerateUUIDs = ConfigScope.Globally; configuration.File.GenerateVersionNumbers = ConfigScope.Globally; return configuration; } private void DoOneWayReplcation() { Db4objects.Db4o.IObjectContainer handheld = OpenDb(ConfigureDb4oForReplication(), "handheld.yap"); StoreSomePilots(handheld); Db4objects.Db4o.IObjectContainer desktop = OpenDb(ConfigureDb4oForReplication(), "desktop.yap"); DisplayContents("One-way Replication", "Before", handheld, desktop); Db4objects.Drs.IReplicationSession replication = Db4objects.Drs.Replication.Begin (ProviderFor(handheld), ProviderFor(desktop)); Db4objects.Db4o.IObjectSet changed = replication.ProviderA().ObjectsChangedSinceLastReplication (); while (changed.HasNext()) { replication.Replicate(changed.Next()); } replication.Commit(); DisplayContents(string.Empty, "After", handheld, desktop); CloseDb(handheld); CloseDb(desktop); } private void StoreSomePilots(Db4objects.Db4o.IObjectContainer db) { db.Store(new Db4objects.Drs.Quickstart.Simple.Pilot("Scott Felton", 52)); db.Store(new Db4objects.Drs.Quickstart.Simple.Pilot("Frank Green", 45)); } public virtual void ListResult(Db4objects.Db4o.IObjectSet result) { while (result.HasNext()) { Sharpen.Runtime.Out.WriteLine(result.Next()); } Sharpen.Runtime.Out.WriteLine(); } } } db4o-8.0.184.15484+dfsg/src/drs/QuickStart/QuickStart-2008.csproj0000644000175000017500000001140311520622060024214 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {11C2A893-D0DA-48FC-82EC-12B3C3AC5F78} Exe Properties QuickStart QuickStart Db4objects.Drs.Quickstart.Simple.Simple 2.0 v3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../../db4objects.snk true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 3.5 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6} Db4objects.Drs-2008 False .NET Framework Client Profile false False .NET Framework 2.0 %28x86%29 true False .NET Framework 3.0 %28x86%29 false False .NET Framework 3.5 false False .NET Framework 3.5 SP1 false db4o-8.0.184.15484+dfsg/src/drs/QuickStart/Properties/0000755000175000017500000000000011520622070022447 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/QuickStart/Properties/AssemblyInfo.cs0000644000175000017500000000241311520622640025374 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Db4objects.Drs.QuickStart")] [assembly: AssemblyDescription("QuickStart 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("8.0.184.15484")] db4o-8.0.184.15484+dfsg/src/drs/drs.license.html0000644000175000017500000005300311520622056021325 0ustar directhexdirecthex GNU GENERAL PUBLIC LICENSE

GNU GENERAL PUBLIC LICENSE

Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

The precise terms and conditions for copying, distribution and modification follow.

GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

NO WARRANTY

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

END OF TERMS AND CONDITIONS

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 convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. 

<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items -whatever suits your program.

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.

<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice

This 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 Library General Public License instead of this License.

db4o-8.0.184.15484+dfsg/src/drs/readme.html0000644000175000017500000000370211520622056020352 0ustar directhexdirecthex README

Getting Started

For the fastest start with dRS please work through the tutorial, available in different formats in the following folder:

./docs/

Then you can look at an example replication in ./QuickStart project.

http://ant.apache.org/

Introductory online documentation is available at:

http://developer.db4o.com/Resources/view.aspx/Reference/Db4o_Replication_System_dRS

About this software

The software contained in this distribution is the open source db4o Replication System library "dRS" supplied by:

Versant Inc.
1900 South Norfolk Street
Suite 350
San Mateo, CA, 94403
USA

Make sure that you have downloaded the latest version from the db4objects website:
http://developer.db4o.com/files/

db4o Replication System may be used under the GNU General Public License, GPL.
You should have received a copy of the GPL with the download.

Your db4objects team.

db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/0000755000175000017500000000000011520622070020733 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs-2008.csproj0000644000175000017500000001407611520622056025272 0ustar directhexdirecthex Debug AnyCPU 9.0.21022 2.0 {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6} Library Properties Db4objects.Drs Db4objects.Drs v3.5 512 true ../../db4objects.snk true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs-2008.sln0000644000175000017500000001075211520622066024564 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Drs-2008", "Db4objects.Drs-2008.csproj", "{B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Drs.Tests-2008", "..\Db4objects.Drs.Tests\Db4objects.Drs.Tests-2008.csproj", "{C0BA12AD-54B4-43B0-A570-0299F6253AC7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS-2008", "..\..\Db4objects.Db4o.CS\Db4objects.Db4o.CS-2008.csproj", "{9FA8178A-3E77-42C5-A252-6690EA9BA257}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "..\..\Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-2008", "..\..\Db4oUnit\Db4oUnit-2008.csproj", "{8F82F8B0-95B6-4553-BDA8-BD9A954E682F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-2008", "..\..\Db4oUnit.Extensions\Db4oUnit.Extensions-2008.csproj", "{9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Optional-2008", "..\..\Db4objects.Db4o.Optional\Db4objects.Db4o.Optional-2008.csproj", "{E9588FE7-C19D-445E-BB53-AE539EA4F0E6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq-2008", "..\..\Db4objects.Db4o.Linq\Db4objects.Db4o.Linq-2008.csproj", "{23531440-0922-43EB-A483-6592FFC2F093}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.Build.0 = Release|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Release|Any CPU.Build.0 = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.Build.0 = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.Build.0 = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.Build.0 = Release|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9588FE7-C19D-445E-BB53-AE539EA4F0E6}.Release|Any CPU.Build.0 = Release|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.Build.0 = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.ActiveCfg = Release|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/0000755000175000017500000000000011520622056022225 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/0000755000175000017500000000000011520622064024736 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Inside/0000755000175000017500000000000011520622056026152 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Inside/ReplicationPlatform.cs0000644000175000017500000001143511520622640032462 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Net; namespace Db4objects.Drs.Inside { /// /// Platform dependent code goes here to minimize manually /// converted code. /// public class ReplicationPlatform { interface ICollectionInitializer { void Clear(); void Add(object o); } public static void CopyCollectionState(object original, object destination, Db4objects.Drs.Inside.ICounterpartFinder counterpartFinder) { System.Collections.IEnumerable originalCollection = (System.Collections.IEnumerable )original; ICollectionInitializer destinationCollection = CollectionInitializerFor(destination); destinationCollection.Clear(); foreach (object element in originalCollection) { object counterpart = counterpartFinder.FindCounterpart(element); destinationCollection.Add(counterpart); } } private static ICollectionInitializer CollectionInitializerFor(object destination) { if (destination is IList) { return new ListInitializer((IList) destination); } Type collectionElementType = CollectionElementTypeFor(destination); if (collectionElementType != null) { Type genericProtocolType = typeof(GenericCollectionInitializer<>).MakeGenericType(collectionElementType); return (ICollectionInitializer) Activator.CreateInstance(genericProtocolType, destination); } throw new ArgumentException("Unknown collection: " + destination); } private static Type CollectionElementTypeFor(object destination) { foreach (Type interfaceType in destination.GetType().GetInterfaces()) { if (IsGenericCollection(interfaceType)) { return interfaceType.GetGenericArguments()[0]; } } return null; } private static bool IsGenericCollection(Type type) { return type.GetGenericTypeDefinition() == typeof(ICollection<>); } private class GenericCollectionInitializer : ICollectionInitializer { private ICollection _collection; public GenericCollectionInitializer(ICollection collection) { _collection = collection; } public void Clear() { _collection.Clear(); } public void Add(object o) { _collection.Add((T)o); } } private class ListInitializer : ICollectionInitializer { private readonly IList _list; public ListInitializer(IList list) { _list = list; } public void Clear() { _list.Clear(); } public void Add(object o) { _list.Add(o); } } public static System.Collections.ICollection EmptyCollectionClone(ICollectionSource source, System.Collections.ICollection original) { if (original is System.Collections.ArrayList) { return new System.Collections.ArrayList(original.Count); } try { return (System.Collections.ICollection) Activator.CreateInstance(original.GetType()); } catch (MissingMethodException x) { throw new ArgumentException(string.Format("Parameterless ctor required for type '{0}'", original.GetType()), x); } } public static bool IsValueType(object o) { if (null == o) return false; return o.GetType().IsValueType; } static readonly Type[] _nonGeneric = new Type[] { typeof(ArrayList), typeof(SortedList), typeof(Queue), typeof(Stack), }; static readonly Type[] _generic = new Type[] { typeof(List<>), typeof(LinkedList<>), typeof(Stack<>), }; internal static bool IsBuiltinCollectionClass(ReplicationReflector reflector, IReflectClass claxx) { Type type = NetReflector.ToNative(claxx); if (Contains(_nonGeneric, type)) return true; if (!type.IsGenericType) return false; if (Contains(_generic, type.GetGenericTypeDefinition())) return true; return false; } private static bool Contains(Type[] array, Type type) { return ((IList)array).Contains(type); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Foundation/0000755000175000017500000000000011520622066027046 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Foundation/ObjectSetCollection4Facade.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Foundation/ObjectSetCollection40000644000175000017500000000537111520622640032757 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Foundation { public class ObjectSetCollection4Facade : ObjectSetAbstractFacade { internal Db4objects.Db4o.Foundation.Collection4 _delegate; private System.Collections.IEnumerator _currentIterator; enum Enumerator_Status { RESET, MOVING, EOF, }; Enumerator_Status _status; public ObjectSetCollection4Facade(Db4objects.Db4o.Foundation.Collection4 delegate_ ) { this._delegate = delegate_; } public override object Next() { object obj; if (HasNext()) { obj = CurrentIterator().Current; MoveNext(); return obj; } else { return null; } } public override bool HasNext() { if (_status == Enumerator_Status.RESET) { MoveNext(); } return _status != Enumerator_Status.EOF; } public override void Reset() { CurrentIterator().Reset(); _status = Enumerator_Status.RESET; } public override int Size() { return this._delegate.Size(); } public override bool Contains(object value) { return this._delegate.Contains(value); } private System.Collections.IEnumerator CurrentIterator() { if (_currentIterator == null) { _currentIterator = _delegate.GetEnumerator(); _status = Enumerator_Status.RESET; } return _currentIterator; } private void MoveNext() { if (CurrentIterator().MoveNext()) { _status = Enumerator_Status.MOVING; } else { _status = Enumerator_Status.EOF; } } } }././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Foundation/ObjectSetAbstractFacade.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/native/Db4objects.Drs/Foundation/ObjectSetAbstractFac0000644000175000017500000000520011520622640032744 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Ext; namespace Db4objects.Drs.Foundation { public abstract class ObjectSetAbstractFacade : Db4objects.Db4o.IObjectSet { public IExtObjectSet Ext() { throw new NotImplementedException(); } public virtual bool HasNext() { throw new NotImplementedException(); } public virtual object Next() { throw new NotImplementedException(); } public virtual void Reset() { throw new NotImplementedException(); } public virtual int Size() { throw new NotImplementedException(); } public int Add(object value) { throw new NotImplementedException(); } public virtual bool Contains(object value) { throw new NotImplementedException(); } public void Clear() { throw new NotImplementedException(); } public int IndexOf(object value) { throw new NotImplementedException(); } public void Insert(int index, object value) { throw new NotImplementedException(); } public void Remove(object value) { throw new NotImplementedException(); } public void RemoveAt(int index) { throw new NotImplementedException(); } public object this[int index] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public bool IsReadOnly { get { throw new NotImplementedException(); } } public bool IsFixedSize { get { throw new NotImplementedException(); } } public void CopyTo(Array array, int index) { throw new NotImplementedException(); } public int Count { get { throw new NotImplementedException(); } } public object SyncRoot { get { throw new NotImplementedException(); } } public bool IsSynchronized { get { throw new NotImplementedException(); } } public IEnumerator GetEnumerator() { throw new NotImplementedException(); } } }db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/0000755000175000017500000000000011520622070023445 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/IObjectState.cs0000644000175000017500000000401511520622640026317 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs { /// The state of the entity in a provider. /// The state of the entity in a provider. /// Albert Kwan /// Klaus Wuestefeld /// 1.2 /// dRS 1.2 public interface IObjectState { /// The entity. /// The entity. /// null if the object has been deleted or if it was not replicated in previous replications. /// object GetObject(); /// Is the object newly created since last replication? /// true when the object is newly created since last replication bool IsNew(); /// Was the object modified since last replication? /// true when the object was modified since last replication bool WasModified(); /// The time when the object is modified in a provider. /// The time when the object is modified in a provider. /// time when the object is modified in a provider. long ModificationDate(); /// whether or not the object is known to the ReplicationProvider. /// whether or not the object is known to the ReplicationProvider. bool IsKnown(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/IReplicationEventListener.cs0000644000175000017500000000265311520622640031077 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs; namespace Db4objects.Drs { /// Defines the contract for handling of replication events generated from a replication session. /// /// /// Defines the contract for handling of replication events generated from a replication session. /// Users can implement this interface to resolve replication conflicts according to their own business rules. /// /// 1.2 /// dRS 1.2 public interface IReplicationEventListener { /// invoked when a replication of an object occurs. /// invoked when a replication of an object occurs. /// the event void OnReplicate(IReplicationEvent e); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/0000755000175000017500000000000011520622066024242 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/ReplicationRecord.cs0000644000175000017500000000760611520622640030210 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Query; namespace Db4objects.Drs.Db4o { /// /// tracks the version of the last replication between /// two Objectcontainers. /// /// /// tracks the version of the last replication between /// two Objectcontainers. /// /// /// public class ReplicationRecord : IInternal4 { public Db4oDatabase _youngerPeer; public Db4oDatabase _olderPeer; public long _version; public ReplicationRecord() { } public ReplicationRecord(Db4oDatabase younger, Db4oDatabase older) { _youngerPeer = younger; _olderPeer = older; } public virtual void SetVersion(long version) { _version = version; } public virtual void Store(ObjectContainerBase container) { container.ShowInternalClasses(true); try { Transaction trans = container.CheckTransaction(); container.StoreAfterReplication(trans, this, container.UpdateDepthProvider().ForDepth (1), false); container.Commit(trans); } finally { container.ShowInternalClasses(false); } } public static Db4objects.Drs.Db4o.ReplicationRecord BeginReplication(Transaction transA, Transaction transB) { ObjectContainerBase peerA = transA.Container(); ObjectContainerBase peerB = transB.Container(); Db4oDatabase dbA = ((IInternalObjectContainer)peerA).Identity(); Db4oDatabase dbB = ((IInternalObjectContainer)peerB).Identity(); dbB.Bind(transA); dbA.Bind(transB); Db4oDatabase younger = null; Db4oDatabase older = null; if (dbA.IsOlderThan(dbB)) { younger = dbB; older = dbA; } else { younger = dbA; older = dbB; } Db4objects.Drs.Db4o.ReplicationRecord rrA = QueryForReplicationRecord(peerA, transA , younger, older); Db4objects.Drs.Db4o.ReplicationRecord rrB = QueryForReplicationRecord(peerB, transB , younger, older); if (rrA == null) { if (rrB == null) { return new Db4objects.Drs.Db4o.ReplicationRecord(younger, older); } rrB.Store(peerA); return rrB; } if (rrB == null) { rrA.Store(peerB); return rrA; } if (rrA != rrB) { peerB.ShowInternalClasses(true); try { int id = peerB.GetID(transB, rrB); peerB.Bind(transB, rrA, id); } finally { peerB.ShowInternalClasses(false); } } return rrA; } public static Db4objects.Drs.Db4o.ReplicationRecord QueryForReplicationRecord(ObjectContainerBase container, Transaction trans, Db4oDatabase younger, Db4oDatabase older) { container.ShowInternalClasses(true); try { IQuery q = container.Query(trans); q.Constrain(typeof(Db4objects.Drs.Db4o.ReplicationRecord)); q.Descend("_youngerPeer").Constrain(younger).Identity(); q.Descend("_olderPeer").Constrain(older).Identity(); IObjectSet objectSet = q.Execute(); return objectSet.HasNext() ? (Db4objects.Drs.Db4o.ReplicationRecord)objectSet.Next () : null; } finally { container.ShowInternalClasses(false); } } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oReplicationProviderSignature.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oReplicationProviderSignature.0000644000175000017500000000240211520622640032616 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Ext; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Db4o { /// public class Db4oReplicationProviderSignature : IReadonlyReplicationProviderSignature { private readonly Db4oDatabase _delegate; public Db4oReplicationProviderSignature(Db4oDatabase delegate_) { _delegate = delegate_; } public virtual long GetId() { return 0; } public virtual byte[] GetSignature() { return _delegate.GetSignature(); } public virtual long GetCreated() { return _delegate.GetCreationTime(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oProviderFactory.cs0000644000175000017500000000255611520622640030432 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Db4o.Internal; using Db4objects.Drs.Db4o; namespace Db4objects.Drs.Db4o { /// public class Db4oProviderFactory { public static IDb4oReplicationProvider NewInstance(IObjectContainer oc, string name ) { if (IsClient(oc)) { return new Db4oClientServerReplicationProvider(oc, name); } else { return new Db4oEmbeddedReplicationProvider(oc, name); } } public static IDb4oReplicationProvider NewInstance(IObjectContainer oc) { return NewInstance(oc, null); } private static bool IsClient(IObjectContainer oc) { return ((IInternalObjectContainer)oc).IsClient; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oSignatureMap.cs0000644000175000017500000000315411520622640027702 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4objects.Drs.Db4o { internal class Db4oSignatureMap { private readonly IInternalObjectContainer _stream; private readonly Hashtable4 _identities; internal Db4oSignatureMap(IInternalObjectContainer stream) { _stream = stream; _identities = new Hashtable4(); } internal virtual Db4oDatabase Produce(byte[] signature, long creationTime) { Db4oDatabase db = (Db4oDatabase)_identities.Get(signature); if (db != null) { return db; } db = new Db4oDatabase(signature, creationTime); db.Bind(_stream.Transaction); _identities.Put(signature, db); return db; } public virtual void Put(Db4oDatabase db) { Db4oDatabase existing = (Db4oDatabase)_identities.Get(db.GetSignature()); if (existing == null) { _identities.Put(db.GetSignature(), db); } } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oEmbeddedReplicationProvider.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oEmbeddedReplicationProvider.c0000644000175000017500000003175311520622640032524 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Replication; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.TA; using Db4objects.Drs.Db4o; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Db4o { public class Db4oEmbeddedReplicationProvider : IDb4oReplicationProvider { private IReadonlyReplicationProviderSignature _mySignature; protected readonly ExternalObjectContainer _container; private readonly IReflector _reflector; private ReplicationRecord _replicationRecord; internal Db4oReplicationReferenceImpl _referencesByObject; private Db4oSignatureMap _signatureMap; private readonly string _name; private readonly IProcedure4 _activationStrategy; private long _commitTimestamp; public Db4oEmbeddedReplicationProvider(IObjectContainer objectContainer, string name ) { // TODO: Add additional query methods (whereModified ) IConfiguration cfg = objectContainer.Ext().Configure(); cfg.Callbacks(false); _name = name; _container = (ExternalObjectContainer)objectContainer; _reflector = _container.Reflector(); _signatureMap = new Db4oSignatureMap(_container); _activationStrategy = CreateActivationStrategy(); } public Db4oEmbeddedReplicationProvider(IObjectContainer objectContainer) : this(objectContainer , objectContainer.ToString()) { } private IProcedure4 CreateActivationStrategy() { if (IsTransparentActivationEnabled()) { return new _IProcedure4_86(this); } return new _IProcedure4_94(this); } private sealed class _IProcedure4_86 : IProcedure4 { public _IProcedure4_86(Db4oEmbeddedReplicationProvider _enclosing) { this._enclosing = _enclosing; } public void Apply(object obj) { IObjectInfo objectInfo = this._enclosing._container.GetObjectInfo(obj); ((IActivator)objectInfo).Activate(ActivationPurpose.Read); } private readonly Db4oEmbeddedReplicationProvider _enclosing; } private sealed class _IProcedure4_94 : IProcedure4 { public _IProcedure4_94(Db4oEmbeddedReplicationProvider _enclosing) { this._enclosing = _enclosing; } public void Apply(object obj) { if (obj == null) { return; } IReflectClass claxx = this._enclosing._reflector.ForObject(obj); int level = claxx.IsCollection() ? 3 : 1; this._enclosing._container.Activate(obj, level); } private readonly Db4oEmbeddedReplicationProvider _enclosing; } private bool IsTransparentActivationEnabled() { return TransparentActivationSupport.IsTransparentActivationEnabledOn(_container); } public virtual IReadonlyReplicationProviderSignature GetSignature() { if (_mySignature == null) { _mySignature = new Db4oReplicationProviderSignature(_container.Identity()); } return _mySignature; } private object Lock() { return _container.Lock(); } public virtual void StartReplicationTransaction(IReadonlyReplicationProviderSignature peerSignature) { ClearAllReferences(); lock (Lock()) { Transaction trans = _container.Transaction; Db4oDatabase myIdentity = _container.Identity(); _signatureMap.Put(myIdentity); Db4oDatabase otherIdentity = _signatureMap.Produce(peerSignature.GetSignature(), peerSignature.GetCreated()); Db4oDatabase younger = null; Db4oDatabase older = null; if (myIdentity.IsOlderThan(otherIdentity)) { younger = otherIdentity; older = myIdentity; } else { younger = myIdentity; older = otherIdentity; } _replicationRecord = ReplicationRecord.QueryForReplicationRecord(_container, trans , younger, older); if (_replicationRecord == null) { _replicationRecord = new ReplicationRecord(younger, older); _replicationRecord.Store(_container); } else { _container.RaiseCommitTimestamp(_replicationRecord._version + 1); } _commitTimestamp = _container.GenerateTransactionTimestamp(0); } } public virtual void CommitReplicationTransaction() { StoreReplicationRecord(); _container.Commit(); _container.UseDefaultTransactionTimestamp(); } private void StoreReplicationRecord() { _replicationRecord._version = _commitTimestamp; _replicationRecord.Store(_container); } public virtual void RollbackReplication() { _container.Rollback(); _referencesByObject = null; } public virtual long GetLastReplicationVersion() { return _replicationRecord._version; } public virtual void StoreReplica(object obj) { Logger4Support.LogIdentity(obj, GetName()); lock (Lock()) { _container.StoreByNewReplication(this, obj); } } public virtual void Activate(object obj) { _activationStrategy.Apply(obj); } public virtual IDb4oReplicationReference ReferenceFor(object obj) { if (_referencesByObject == null) { return null; } return _referencesByObject.Find(obj); } public virtual IReplicationReference ProduceReference(object obj, object unused, string unused2) { if (obj == null) { return null; } if (_referencesByObject != null) { Db4oReplicationReferenceImpl existingNode = _referencesByObject.Find(obj); if (existingNode != null) { return existingNode; } } // TODO: Why refresh here? Try without and run all tests! Refresh(obj); IObjectInfo objectInfo = _container.GetObjectInfo(obj); if (objectInfo == null) { return null; } Db4oUUID uuid = objectInfo.GetUUID(); if (uuid == null) { throw new ArgumentNullException(); } Db4oReplicationReferenceImpl newNode = new Db4oReplicationReferenceImpl(objectInfo , obj); AddReference(newNode); return newNode; } protected virtual void Refresh(object obj) { } //empty in File Provider private void AddReference(Db4oReplicationReferenceImpl newNode) { if (_referencesByObject == null) { _referencesByObject = newNode; } else { _referencesByObject = _referencesByObject.Add(newNode); } } public virtual IReplicationReference ReferenceNewObject(object obj, IReplicationReference counterpartReference, IReplicationReference referencingObjCounterPartRef, string fieldName) { IDrsUUID uuid = counterpartReference.Uuid(); if (uuid == null) { return null; } byte[] signature = uuid.GetSignaturePart(); long longPart = uuid.GetLongPart(); long version = counterpartReference.Version(); Db4oDatabase db = _signatureMap.Produce(signature, 0); Db4oReplicationReferenceImpl @ref = new Db4oReplicationReferenceImpl(obj, db, longPart , version); AddReference(@ref); return @ref; } public virtual IReplicationReference ProduceReferenceByUUID(IDrsUUID uuid, Type hint ) { if (uuid == null) { return null; } object obj = _container.GetByUUID(new Db4oUUID(uuid.GetLongPart(), uuid.GetSignaturePart ())); if (obj == null) { return null; } if (!_container.IsActive(obj)) { _container.Activate(obj, 1); } return ProduceReference(obj); } public virtual void VisitCachedReferences(IVisitor4 visitor) { if (_referencesByObject != null) { _referencesByObject.Traverse(new _IVisitor4_284(visitor)); } } private sealed class _IVisitor4_284 : IVisitor4 { public _IVisitor4_284(IVisitor4 visitor) { this.visitor = visitor; } public void Visit(object obj) { Db4oReplicationReferenceImpl node = (Db4oReplicationReferenceImpl)obj; visitor.Visit(node); } private readonly IVisitor4 visitor; } public virtual void ClearAllReferences() { _referencesByObject = null; } public virtual IObjectSet ObjectsChangedSinceLastReplication() { IQuery q = _container.Query(); WhereModified(q); return q.Execute(); } public virtual IObjectSet ObjectsChangedSinceLastReplication(Type clazz) { IQuery q = _container.Query(); q.Constrain(clazz); WhereModified(q); return q.Execute(); } /// /// adds a constraint to the passed Query to query only for objects that were /// modified since the last replication process between this and the other /// ObjectContainer involved in the current replication process. /// /// /// adds a constraint to the passed Query to query only for objects that were /// modified since the last replication process between this and the other /// ObjectContainer involved in the current replication process. /// /// the Query to be constrained public virtual void WhereModified(IQuery query) { query.Descend(VirtualField.CommitTimestamp).Constrain(GetLastReplicationVersion() ).Greater(); } public virtual IObjectSet GetStoredObjects(Type type) { IQuery query = _container.Query(); query.Constrain(type); return query.Execute(); } public virtual void StoreNew(object o) { Logger4Support.LogIdentity(o, GetName()); _container.Store(o); } public virtual void Update(object o) { _container.Store(o); } public virtual string GetName() { return _name; } public virtual void Destroy() { } // do nothing public virtual void Commit() { _container.Commit(); } public virtual void DeleteAllInstances(Type clazz) { IQuery q = _container.Query(); q.Constrain(clazz); IEnumerator objectSet = q.Execute().GetEnumerator(); while (objectSet.MoveNext()) { Delete(objectSet.Current); } } public virtual void Delete(object obj) { _container.Delete(obj); } public virtual bool WasModifiedSinceLastReplication(IReplicationReference reference ) { return reference.Version() > GetLastReplicationVersion(); } public virtual bool SupportsMultiDimensionalArrays() { return true; } public virtual bool SupportsHybridCollection() { return true; } public virtual bool SupportsRollback() { return false; } public override string ToString() { return GetName(); } public virtual void ReplicateDeletion(IDrsUUID uuid) { object obj = _container.GetByUUID(new Db4oUUID(uuid.GetLongPart(), uuid.GetSignaturePart ())); if (obj == null) { return; } _container.Delete(obj); } public virtual IExtObjectContainer GetObjectContainer() { return _container; } public virtual bool IsProviderSpecific(object original) { return false; } public virtual void ReplicationReflector(Db4objects.Drs.Inside.ReplicationReflector replicationReflector) { } public virtual IObjectSet GetStoredObjects() { return _container.Query().Execute(); } public virtual IReplicationReference ProduceReference(object obj) { return ProduceReference(obj, null, null); } public virtual object ReplaceIfSpecific(object value) { return value; } public virtual bool IsSecondClassObject(object obj) { return false; } public virtual long ObjectVersion(object @object) { return _container.GetObjectInfo(@object).GetCommitTimestamp(); } public virtual long CreationTime(object @object) { return _container.GetObjectInfo(@object).GetUUID().GetLongPart(); } public virtual void EnsureVersionsAreGenerated() { Commit(); } public virtual Db4objects.Drs.Foundation.TimeStamps TimeStamps() { return new Db4objects.Drs.Foundation.TimeStamps(_replicationRecord._version, _commitTimestamp ); } public virtual void WaitForPreviousCommits() { } // do nothing public virtual void SyncCommitTimestamp(long syncedTimeStamp) { if (syncedTimeStamp <= _commitTimestamp) { return; } _commitTimestamp = syncedTimeStamp; _container.RaiseCommitTimestamp(syncedTimeStamp + 1); _container.GenerateTransactionTimestamp(syncedTimeStamp); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oClientServerReplicationProvider.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oClientServerReplicationProvid0000644000175000017500000000230511520622640032657 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Drs.Db4o; namespace Db4objects.Drs.Db4o { public class Db4oClientServerReplicationProvider : Db4oEmbeddedReplicationProvider { public Db4oClientServerReplicationProvider(IObjectContainer objectContainer) : base (objectContainer, "null") { } public Db4oClientServerReplicationProvider(IObjectContainer objectContainer, string name) : base(objectContainer, name) { } protected override void Refresh(object obj) { _container.Refresh(obj, 1); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/IDb4oReplicationProvider.cs0000644000175000017500000000200011520622640031365 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal.Replication; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Db4o { public interface IDb4oReplicationProvider : ITestableReplicationProvider, IDb4oReplicationReferenceProvider , ITestableReplicationProviderInside { IExtObjectContainer GetObjectContainer(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Db4o/Db4oReplicationReferenceImpl.cs0000644000175000017500000001131011520622640032206 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Replication; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Db4o { /// public class Db4oReplicationReferenceImpl : ObjectReference, IReplicationReference , IDb4oReplicationReference { private object _counterPart; private bool _markedForReplicating; private bool _markedForDeleting; private readonly long _version; internal Db4oReplicationReferenceImpl(IObjectInfo objectInfo, object obj) { if (obj == null) { throw new InvalidOperationException("obj may not be null"); } _version = objectInfo.GetCommitTimestamp(); ObjectReference @ref = (ObjectReference)objectInfo; Transaction trans = @ref.Transaction(); Db4objects.Db4o.Internal.VirtualAttributes va = @ref.VirtualAttributes(trans); if (va != null) { SetVirtualAttributes((Db4objects.Db4o.Internal.VirtualAttributes)va.ShallowClone( )); } else { SetVirtualAttributes(new Db4objects.Db4o.Internal.VirtualAttributes()); } SetObject(obj); Ref_init(); } public Db4oReplicationReferenceImpl(object obj, Db4oDatabase db, long longPart, long version) { if (obj == null) { throw new InvalidOperationException("obj may not be null"); } SetObject(obj); Ref_init(); Db4objects.Db4o.Internal.VirtualAttributes va = new Db4objects.Db4o.Internal.VirtualAttributes (); va.i_database = db; va.i_uuid = longPart; va.i_version = version; _version = version; SetVirtualAttributes(va); } public virtual Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl Add(Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl newNode) { return (Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl)Hc_add(newNode); } public virtual Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl Find(object obj) { return (Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl)Hc_find(obj); } public virtual void Traverse(IVisitor4 visitor) { Hc_traverse(visitor); } public virtual IDrsUUID Uuid() { Db4oDatabase db = SignaturePart(); if (db == null) { return null; } return new DrsUUIDImpl(new Db4oUUID(LongPart(), db.GetSignature())); } public virtual long Version() { return _version; } public virtual object Object() { return GetObject(); } public virtual object Counterpart() { return _counterPart; } public virtual void SetCounterpart(object obj) { _counterPart = obj; } public virtual void MarkForReplicating(bool flag) { _markedForReplicating = flag; } public virtual bool IsMarkedForReplicating() { return _markedForReplicating; } public virtual void MarkForDeleting() { _markedForDeleting = true; } public virtual bool IsMarkedForDeleting() { return _markedForDeleting; } public virtual void MarkCounterpartAsNew() { throw new NotSupportedException("TODO"); } public virtual bool IsCounterpartNew() { throw new NotSupportedException("TODO"); } public virtual Db4oDatabase SignaturePart() { return VirtualAttributes().i_database; } public virtual long LongPart() { return VirtualAttributes().i_uuid; } public override Db4objects.Db4o.Internal.VirtualAttributes VirtualAttributes() { return VirtualAttributes(null); } public sealed override bool Equals(object o) { if (this == o) { return true; } if (o == null || o.GetType() != GetType()) { return false; } Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl other = (Db4objects.Drs.Db4o.Db4oReplicationReferenceImpl )o; return Version() == other.Version() && Uuid().Equals(other.Uuid()); } public sealed override int GetHashCode() { return 29 * Uuid().GetHashCode() + (int)(Version() ^ ((Version()) >> (32 & 0x1f)) ); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/0000755000175000017500000000000011520622070024660 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ICollectionSource.cs0000644000175000017500000000145011520622640030577 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Inside { public interface ICollectionSource { bool IsProviderSpecific(object original); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/GenericReplicationSession.cs0000644000175000017500000003312611520622640032331 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside { public sealed class GenericReplicationSession : IReplicationSession { private const int Size = 10000; private readonly ReplicationReflector _reflector; private readonly Db4objects.Drs.Inside.ICollectionHandler _collectionHandler; private IReplicationProviderInside _providerA; private IReplicationProviderInside _providerB; private IReplicationProvider _directionTo; private readonly IReplicationEventListener _listener; private readonly ITraverser _traverser; private HashSet4 _processedUuids = new HashSet4(Size); private bool _isReplicatingOnlyDeletions; public GenericReplicationSession(IReplicationProviderInside _peerA, IReplicationProviderInside _peerB) : this(_peerA, _peerB, new DefaultReplicationEventListener()) { } public GenericReplicationSession(IReplicationProvider providerA, IReplicationProvider providerB, IReplicationEventListener listener) : this(providerA, providerB, listener , null) { } public GenericReplicationSession(IReplicationProvider providerA, IReplicationProvider providerB, IReplicationEventListener listener, IReflector reflector) { //null means bidirectional replication. _reflector = new ReplicationReflector(providerA, providerB, reflector); _collectionHandler = new CollectionHandlerImpl(_reflector); _traverser = new GenericTraverser(_reflector, _collectionHandler); _providerA = (IReplicationProviderInside)providerA; _providerB = (IReplicationProviderInside)providerB; _listener = listener; _providerA.StartReplicationTransaction(_providerB.GetSignature()); _providerB.StartReplicationTransaction(_providerA.GetSignature()); long syncedTimeStamp = Math.Max(_providerA.TimeStamps().Commit(), _providerB.TimeStamps ().Commit()); _providerA.SyncCommitTimestamp(syncedTimeStamp); _providerB.SyncCommitTimestamp(syncedTimeStamp); } public void Close() { _providerA.Destroy(); _providerB.Destroy(); _providerA = null; _providerB = null; _processedUuids = null; } public void Commit() { _providerA.CommitReplicationTransaction(); _providerB.CommitReplicationTransaction(); } public IReplicationProvider ProviderA() { return _providerA; } public IReplicationProvider ProviderB() { return _providerB; } public void Replicate(object root) { try { PrepareGraphToBeReplicated(root); CopyStateAcross(_providerA, _providerB); CopyStateAcross(_providerB, _providerA); StoreChangedObjectsIn(_providerA); StoreChangedObjectsIn(_providerB); } finally { _providerA.ClearAllReferences(); _providerB.ClearAllReferences(); } } public void ReplicateDeletions(Type extent) { ReplicateDeletions(extent, _providerA); ReplicateDeletions(extent, _providerB); } private void ReplicateDeletions(Type extent, IReplicationProviderInside provider) { _isReplicatingOnlyDeletions = true; try { IEnumerator instances = provider.GetStoredObjects(extent).GetEnumerator(); while (instances.MoveNext()) { Replicate(instances.Current); } } finally { _isReplicatingOnlyDeletions = false; } } public void Rollback() { // TODO: Write tests for rollback. _providerA.RollbackReplication(); _providerB.RollbackReplication(); } public void SetDirection(IReplicationProvider replicateFrom, IReplicationProvider replicateTo) { if (replicateFrom == _providerA && replicateTo == _providerB) { _directionTo = _providerB; } if (replicateFrom == _providerB && replicateTo == _providerA) { _directionTo = _providerA; } } private void PrepareGraphToBeReplicated(object root) { _traverser.TraverseGraph(root, new InstanceReplicationPreparer(_providerA, _providerB , _directionTo, _listener, _isReplicatingOnlyDeletions, _processedUuids, _traverser , _reflector, _collectionHandler)); } private object ArrayClone(object original, IReflectClass claxx, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { IReflectClass componentType = _reflector.GetComponentType(claxx); int[] dimensions = _reflector.ArrayDimensions(original); object result = _reflector.NewArrayInstance(componentType, dimensions); object[] flatContents = _reflector.ArrayContents(original); //TODO Optimize: Copy the structure without flattening. Do this in ReflectArray. if (!(_reflector.IsValueType(claxx) || _reflector.IsValueType(componentType))) { ReplaceWithCounterparts(flatContents, sourceProvider, targetProvider); } _reflector.ArrayShape(flatContents, 0, result, dimensions, 0); return result; } private void CopyFieldValuesAcross(object src, object dest, IReflectClass claxx, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider ) { if (dest == null) { throw new InvalidOperationException("Dest cannot be null: src=" + src + ", class=" + claxx + ", source=" + sourceProvider.GetName() + ", target=" + targetProvider .GetName()); } IEnumerator fields = FieldIterators.PersistentFields(claxx); while (fields.MoveNext()) { IReflectField field = (IReflectField)fields.Current; object value = field.Get(src); field.Set(dest, FindCounterpart(value, sourceProvider, targetProvider)); } IReflectClass superclass = claxx.GetSuperclass(); if (superclass == null) { return; } CopyFieldValuesAcross(src, dest, superclass, sourceProvider, targetProvider); } private void CopyStateAcross(IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { if (_directionTo == sourceProvider) { return; } sourceProvider.VisitCachedReferences(new _IVisitor4_182(this, sourceProvider, targetProvider )); } private sealed class _IVisitor4_182 : IVisitor4 { public _IVisitor4_182(GenericReplicationSession _enclosing, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { this._enclosing = _enclosing; this.sourceProvider = sourceProvider; this.targetProvider = targetProvider; } public void Visit(object obj) { this._enclosing.CopyStateAcross((IReplicationReference)obj, sourceProvider, targetProvider ); } private readonly GenericReplicationSession _enclosing; private readonly IReplicationProviderInside sourceProvider; private readonly IReplicationProviderInside targetProvider; } private void CopyStateAcross(IReplicationReference sourceRef, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { if (!sourceRef.IsMarkedForReplicating()) { return; } object source = sourceRef.Object(); object target = sourceRef.Counterpart(); if (source == null) { throw new InvalidOperationException("source may not be null"); } if (target == null) { throw new InvalidOperationException("target may not be null"); } CopyStateAcross(source, target, sourceProvider, targetProvider); } private void CopyStateAcross(object source, object dest, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { IReflectClass claxx = _reflector.ForObject(source); CopyFieldValuesAcross(source, dest, claxx, sourceProvider, targetProvider); } private void DeleteInDestination(IReplicationReference reference, IReplicationProviderInside destination) { if (!reference.IsMarkedForDeleting()) { return; } destination.ReplicateDeletion(reference.Uuid()); } private object FindCounterpart(object value, IReplicationProviderInside sourceProvider , IReplicationProviderInside targetProvider) { if (value == null) { return null; } value = sourceProvider.ReplaceIfSpecific(value); // TODO: need to clone and findCounterpart of each reference object in the // struct if (ReplicationPlatform.IsValueType(value)) { return value; } IReflectClass claxx = _reflector.ForObject(value); if (claxx.IsArray()) { return ArrayClone(value, claxx, sourceProvider, targetProvider); } if (Platform4.IsTransient(claxx)) { return null; } // TODO: make it a warning if (_reflector.IsValueType(claxx)) { return value; } if (_collectionHandler.CanHandle(value)) { return CollectionClone(value, claxx, sourceProvider, targetProvider); } //if value is a Collection, result should be found by passing in just the value IReplicationReference @ref = sourceProvider.ProduceReference(value, null, null); if (@ref == null) { throw new InvalidOperationException("unable to find the ref of " + value + " of class " + value.GetType()); } object result = @ref.Counterpart(); if (result != null) { return result; } IReplicationReference targetRef = targetProvider.ProduceReferenceByUUID(@ref.Uuid (), value.GetType()); if (targetRef == null) { throw new InvalidOperationException("unable to find the counterpart of " + value + " of class " + value.GetType()); } return targetRef.Object(); } private object CollectionClone(object original, IReflectClass claxx, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { return _collectionHandler.CloneWithCounterparts(sourceProvider, original, claxx, new _ICounterpartFinder_248(this, sourceProvider, targetProvider)); } private sealed class _ICounterpartFinder_248 : ICounterpartFinder { public _ICounterpartFinder_248(GenericReplicationSession _enclosing, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { this._enclosing = _enclosing; this.sourceProvider = sourceProvider; this.targetProvider = targetProvider; } public object FindCounterpart(object original) { return this._enclosing.FindCounterpart(original, sourceProvider, targetProvider); } private readonly GenericReplicationSession _enclosing; private readonly IReplicationProviderInside sourceProvider; private readonly IReplicationProviderInside targetProvider; } private IReplicationProviderInside Other(IReplicationProviderInside peer) { return peer == _providerA ? _providerB : _providerA; } private void ReplaceWithCounterparts(object[] objects, IReplicationProviderInside sourceProvider, IReplicationProviderInside targetProvider) { for (int i = 0; i < objects.Length; i++) { object @object = objects[i]; if (@object == null) { continue; } objects[i] = FindCounterpart(@object, sourceProvider, targetProvider); } } private void StoreChangedCounterpartInDestination(IReplicationReference reference , IReplicationProviderInside destination) { //System.out.println("reference = " + reference); bool markedForReplicating = reference.IsMarkedForReplicating(); //System.out.println("markedForReplicating = " + markedForReplicating); if (!markedForReplicating) { return; } destination.StoreReplica(reference.Counterpart()); } private void StoreChangedObjectsIn(IReplicationProviderInside destination) { IReplicationProviderInside source = Other(destination); if (_directionTo == source) { return; } destination.VisitCachedReferences(new _IVisitor4_280(this, destination)); source.VisitCachedReferences(new _IVisitor4_286(this, destination)); } private sealed class _IVisitor4_280 : IVisitor4 { public _IVisitor4_280(GenericReplicationSession _enclosing, IReplicationProviderInside destination) { this._enclosing = _enclosing; this.destination = destination; } public void Visit(object obj) { this._enclosing.DeleteInDestination((IReplicationReference)obj, destination); } private readonly GenericReplicationSession _enclosing; private readonly IReplicationProviderInside destination; } private sealed class _IVisitor4_286 : IVisitor4 { public _IVisitor4_286(GenericReplicationSession _enclosing, IReplicationProviderInside destination) { this._enclosing = _enclosing; this.destination = destination; } public void Visit(object obj) { this._enclosing.StoreChangedCounterpartInDestination((IReplicationReference)obj, destination); } private readonly GenericReplicationSession _enclosing; private readonly IReplicationProviderInside destination; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ICounterpartFinder.cs0000644000175000017500000000145011520622640030761 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Inside { public interface ICounterpartFinder { object FindCounterpart(object original); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ISimpleObjectContainer.cs0000644000175000017500000000227411520622640031553 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; namespace Db4objects.Drs.Inside { public interface ISimpleObjectContainer { void Activate(object @object); void Commit(); void Delete(object obj); void DeleteAllInstances(Type clazz); IObjectSet GetStoredObjects(Type type); /// Will cascade to save the whole graph of objects void StoreNew(object o); /// Updating won't cascade. /// Updating won't cascade. void Update(object o); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ReplicationReferenceImpl.cs0000644000175000017500000000557411520622640032137 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public class ReplicationReferenceImpl : IReplicationReference { private bool _objectIsNew; private readonly object _obj; private readonly IDrsUUID _uuid; private readonly long _version; private object _counterPart; private bool _markedForReplicating; private bool _markedForDeleting; public ReplicationReferenceImpl(object obj, IDrsUUID uuid, long version) { this._obj = obj; this._uuid = uuid; this._version = version; } public object Counterpart() { return _counterPart; } public sealed override bool Equals(object o) { if (this == o) { return true; } if (o == null || o.GetType() != GetType()) { return false; } Db4objects.Drs.Inside.ReplicationReferenceImpl other = (Db4objects.Drs.Inside.ReplicationReferenceImpl )o; return _version == other._version && _uuid.Equals(other._uuid); } public sealed override int GetHashCode() { return 29 * _uuid.GetHashCode() + (int)(_version ^ ((_version) >> (32 & 0x1f))); } public virtual bool IsCounterpartNew() { return _objectIsNew; } public bool IsMarkedForDeleting() { return _markedForDeleting; } public bool IsMarkedForReplicating() { return _markedForReplicating; } public virtual void MarkCounterpartAsNew() { _objectIsNew = true; } public void MarkForDeleting() { _markedForDeleting = true; } public void MarkForReplicating(bool flag) { _markedForReplicating = flag; } public object Object() { return _obj; } public void SetCounterpart(object obj) { _counterPart = obj; } public override string ToString() { return "ReplicationReferenceImpl{" + "_objectIsNew=" + _objectIsNew + ", _obj=" + _obj + ", _uuid=" + _uuid + ", _version=" + _version + ", _counterPart=" + _counterPart + ", _markedForReplicating=" + _markedForReplicating + ", _markedForDeleting=" + _markedForDeleting + '}'; } public IDrsUUID Uuid() { return _uuid; } public long Version() { return _version; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ICollectionHandler.cs0000644000175000017500000000233211520622640030714 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Reflect; using Db4objects.Drs.Inside; using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside { public interface ICollectionHandler : ICollectionFlattener { object EmptyClone(ICollectionSource sourceProvider, object originalCollection, IReflectClass originalCollectionClass); void CopyState(object original, object dest, ICounterpartFinder finder); object CloneWithCounterparts(ICollectionSource sourceProvider, object original, IReflectClass claxx, ICounterpartFinder elementCloner); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ReplicationEventImpl.cs0000644000175000017500000000406511520622640031314 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { internal sealed class ReplicationEventImpl : IReplicationEvent { internal readonly ObjectStateImpl _stateInProviderA = new ObjectStateImpl(); internal readonly ObjectStateImpl _stateInProviderB = new ObjectStateImpl(); private bool _isConflict; internal IObjectState _actionChosenState; internal bool _actionWasChosen; internal bool _actionShouldStopTraversal; internal long _creationDate; public IObjectState StateInProviderA() { return _stateInProviderA; } public IObjectState StateInProviderB() { return _stateInProviderB; } public long ObjectCreationDate() { return _creationDate; } public bool IsConflict() { return _isConflict; } public void OverrideWith(IObjectState chosen) { if (_actionWasChosen) { throw new Exception(); } //FIXME Use Db4o's standard exception throwing. _actionWasChosen = true; _actionChosenState = chosen; } public void StopTraversal() { _actionShouldStopTraversal = true; } internal void ResetAction() { _actionChosenState = null; _actionWasChosen = false; _actionShouldStopTraversal = false; _creationDate = -1; } internal void Conflict(bool isConflict) { _isConflict = isConflict; } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/DefaultReplicationEventListener.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/DefaultReplicationEventListener0000644000175000017500000000321711520622640033077 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs; namespace Db4objects.Drs.Inside { /// A default implementation of ConflictResolver. /// /// A default implementation of ConflictResolver. In case of a conflict, /// if the object is known to only one database the object is copied /// to the other database. If the object is known in both databases /// a /// Db4objects.Drs.ReplicationConflictException /// /// is thrown. /// /// 1.1 /// dRS 1.0 public class DefaultReplicationEventListener : IReplicationEventListener { public virtual void OnReplicate(IReplicationEvent e) { if (e.IsConflict()) { if (!e.StateInProviderA().IsKnown()) { e.OverrideWith(e.StateInProviderB()); } else { if (!e.StateInProviderB().IsKnown()) { e.OverrideWith(e.StateInProviderA()); } } } } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ITestableReplicationProviderInside.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ITestableReplicationProviderIns0000644000175000017500000000213511520622640033042 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public interface ITestableReplicationProviderInside : IReplicationProviderInside, ISimpleObjectContainer { bool SupportsMultiDimensionalArrays(); bool SupportsHybridCollection(); bool SupportsRollback(); void Commit(); long ObjectVersion(object storedObject); void WaitForPreviousCommits(); long CreationTime(object obj); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/MapHandler.cs0000644000175000017500000000627411520622640027236 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public class MapHandler : Db4objects.Drs.Inside.ICollectionHandler { private readonly IReflectClass _reflectMapClass; private readonly ReplicationReflector _reflector; public MapHandler(ReplicationReflector reflector) { _reflector = reflector; _reflectMapClass = reflector.ForClass(typeof(IDictionary)); } public virtual bool CanHandleClass(IReflectClass claxx) { return _reflectMapClass.IsAssignableFrom(claxx); } public virtual bool CanHandle(object obj) { return CanHandleClass(_reflector.ForObject(obj)); } public virtual bool CanHandleClass(Type c) { return CanHandleClass(_reflector.ForClass(c)); } public virtual IEnumerator IteratorFor(object collection) { IDictionary map = (IDictionary)collection; Collection4 result = new Collection4(); IEnumerator it = map.GetEnumerator(); while (it.MoveNext()) { DictionaryEntry entry = (DictionaryEntry)it.Current; result.Add(entry.Key); result.Add(entry.Value); } return result.GetEnumerator(); } public virtual object EmptyClone(ICollectionSource sourceProvider, object original , IReflectClass originalCollectionClass) { if (sourceProvider.IsProviderSpecific(original) || original is Hashtable) { return new Hashtable(((IDictionary)original).Count); } return _reflector.ForObject(original).NewInstance(); } public virtual void CopyState(object original, object destination, ICounterpartFinder counterpartFinder) { IDictionary originalMap = (IDictionary)original; IDictionary destinationMap = (IDictionary)destination; destinationMap.Clear(); IEnumerator it = originalMap.GetEnumerator(); while (it.MoveNext()) { DictionaryEntry entry = (DictionaryEntry)it.Current; object keyClone = counterpartFinder.FindCounterpart(entry.Key); object valueClone = counterpartFinder.FindCounterpart(entry.Value); destinationMap[keyClone] = valueClone; } } public virtual object CloneWithCounterparts(ICollectionSource sourceProvider, object originalMap, IReflectClass claxx, ICounterpartFinder elementCloner) { IDictionary original = (IDictionary)originalMap; IDictionary result = (IDictionary)EmptyClone(sourceProvider, original, claxx); CopyState(original, result, elementCloner); return result; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/CollectionHandlerImpl.cs0000644000175000017500000000724511520622640031435 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public class CollectionHandlerImpl : Db4objects.Drs.Inside.ICollectionHandler { private readonly Db4objects.Drs.Inside.ICollectionHandler _mapHandler; private readonly ReplicationReflector _reflector; public CollectionHandlerImpl(ReplicationReflector reflector) { _mapHandler = new MapHandler(reflector); _reflector = reflector; } public virtual bool CanHandleClass(IReflectClass claxx) { if (_mapHandler.CanHandleClass(claxx)) { return true; } return ReplicationPlatform.IsBuiltinCollectionClass(_reflector, claxx); } public virtual bool CanHandle(object obj) { return CanHandleClass(_reflector.ForObject(obj)); } public virtual bool CanHandleClass(Type c) { return CanHandleClass(_reflector.ForClass(c)); } public virtual object EmptyClone(ICollectionSource sourceProvider, object originalCollection , IReflectClass originalCollectionClass) { if (_mapHandler.CanHandleClass(originalCollectionClass)) { return _mapHandler.EmptyClone(sourceProvider, originalCollection, originalCollectionClass ); } ICollection original = (ICollection)originalCollection; ICollection clone = ReplicationPlatform.EmptyCollectionClone(sourceProvider, original ); if (null != clone) { return clone; } return _reflector.ForClass(original.GetType()).NewInstance(); } public virtual IEnumerator IteratorFor(object collection) { if (_mapHandler.CanHandleClass(_reflector.ForObject(collection))) { return _mapHandler.IteratorFor(collection); } IEnumerable subject = (IEnumerable)collection; return Copy(subject).GetEnumerator(); } private Collection4 Copy(IEnumerable subject) { Collection4 result = new Collection4(); IEnumerator it = subject.GetEnumerator(); while (it.MoveNext()) { result.Add(it.Current); } return result; } public virtual void CopyState(object original, object destination, ICounterpartFinder counterpartFinder) { if (_mapHandler.CanHandle(original)) { _mapHandler.CopyState(original, destination, counterpartFinder); } else { ReplicationPlatform.CopyCollectionState(original, destination, counterpartFinder); } } public virtual object CloneWithCounterparts(ICollectionSource sourceProvider, object originalCollection, IReflectClass claxx, ICounterpartFinder counterpartFinder) { if (_mapHandler.CanHandleClass(claxx)) { return _mapHandler.CloneWithCounterparts(sourceProvider, originalCollection, claxx , counterpartFinder); } ICollection original = (ICollection)originalCollection; ICollection result = (ICollection)EmptyClone(sourceProvider, originalCollection, claxx); CopyState(original, result, counterpartFinder); return result; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ObjectStateImpl.cs0000644000175000017500000000336011520622640030245 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs; namespace Db4objects.Drs.Inside { public class ObjectStateImpl : IObjectState { public const long Unknown = -1; private object _object; private bool _isNew; private bool _wasModified; private long _modificationDate; public virtual object GetObject() { return _object; } public virtual bool IsNew() { return _isNew; } public virtual bool WasModified() { return _wasModified; } public virtual long ModificationDate() { return _modificationDate; } internal virtual void SetAll(object obj, bool isNew, bool wasModified, long modificationDate ) { _object = obj; _isNew = isNew; _wasModified = wasModified; _modificationDate = modificationDate; } public override string ToString() { return "ObjectStateImpl{" + "_object=" + _object + ", _isNew=" + _isNew + ", _wasModified=" + _wasModified + ", _modificationDate=" + _modificationDate + '}'; } public virtual bool IsKnown() { return _modificationDate != Unknown; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ITestableReplicationProvider.cs0000644000175000017500000000155411520622640033000 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public interface ITestableReplicationProvider : IReplicationProvider, ISimpleObjectContainer { } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/IReplicationProviderInside.cs0000644000175000017500000001046011520622640032444 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Drs; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; namespace Db4objects.Drs.Inside { public interface IReplicationProviderInside : IReplicationProvider, ICollectionSource , ISimpleObjectContainer { /// Clear the ReplicationReference cache void ClearAllReferences(); void CommitReplicationTransaction(); /// Destroys this provider and frees up resources. /// Destroys this provider and frees up resources. void Destroy(); long GetLastReplicationVersion(); string GetName(); IReadonlyReplicationProviderSignature GetSignature(); IReplicationReference ProduceReference(object obj); /// /// Collection version of getting a ReplicationReference: /// If the object is not a first class object, we need the /// parent object. /// /// /// Collection version of getting a ReplicationReference: /// If the object is not a first class object, we need the /// parent object. /// /// null, if there is no reference for this object. IReplicationReference ProduceReference(object obj, object parentObject, string fieldNameOnParent ); /// Returns the ReplicationReference of an object by specifying the uuid of the object. /// /// Returns the ReplicationReference of an object by specifying the uuid of the object. /// /// the uuid of the object /// the type of the object /// the ReplicationReference or null if the reference cannot be found IReplicationReference ProduceReferenceByUUID(IDrsUUID uuid, Type hint); IReplicationReference ReferenceNewObject(object obj, IReplicationReference counterpartReference , IReplicationReference referencingObjRef, string fieldName); /// Rollbacks all changes done during the replication session and terminates the Transaction. /// /// /// Rollbacks all changes done during the replication session and terminates the Transaction. /// Guarantees the changes will not be applied to the underlying databases. /// void RollbackReplication(); /// Start a Replication Transaction with another ReplicationProvider /// the signature of another ReplicationProvider. void StartReplicationTransaction(IReadonlyReplicationProviderSignature peerSignature ); /// Stores the new replicated state of obj. /// /// Stores the new replicated state of obj. It can also be a new object to this /// provider. /// /// Object with updated state or a clone of new object in the peer. /// void StoreReplica(object obj); /// Visits the object of each cached ReplicationReference. /// Visits the object of each cached ReplicationReference. /// implements the visit functions, including copying of object states, and storing of changed objects /// void VisitCachedReferences(IVisitor4 visitor); bool WasModifiedSinceLastReplication(IReplicationReference reference); void ReplicateDeletion(IDrsUUID uuid); object ReplaceIfSpecific(object value); bool IsSecondClassObject(object obj); void EnsureVersionsAreGenerated(); Db4objects.Drs.Foundation.TimeStamps TimeStamps(); void SyncCommitTimestamp(long syncedTimeStamp); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/DrsDebug.cs0000644000175000017500000000202311520622640026706 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Inside { public class DrsDebug { private static bool production = false; public static readonly bool runEventListenerEmbedded = !production; public const bool verbose = false; public const bool fastReplicationFeaturesMain = true; public static long Timeout(long designed) { return designed; } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/IReadonlyReplicationProviderSignature.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/IReadonlyReplicationProviderSig0000644000175000017500000000152411520622640033046 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Inside { public interface IReadonlyReplicationProviderSignature { long GetId(); byte[] GetSignature(); long GetCreated(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/IReplicationReference.cs0000644000175000017500000000326011520622640031414 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Inside { public interface IReplicationReference { IDrsUUID Uuid(); /// /// Must return the latests version of the object AND OF /// ALL COLLECTIONS IT REFERENCES IN ITS FIELDS because /// collections are treated as 2nd class objects /// (just like arrays) for Hibernate replication /// compatibility purposes. /// /// /// Must return the latests version of the object AND OF /// ALL COLLECTIONS IT REFERENCES IN ITS FIELDS because /// collections are treated as 2nd class objects /// (just like arrays) for Hibernate replication /// compatibility purposes. /// long Version(); object Object(); object Counterpart(); void SetCounterpart(object obj); void MarkForReplicating(bool flag); bool IsMarkedForReplicating(); void MarkForDeleting(); bool IsMarkedForDeleting(); void MarkCounterpartAsNew(); bool IsCounterpartNew(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/ReplicationReflector.cs0000644000175000017500000001060111520622640031327 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; using Db4objects.Drs; using Db4objects.Drs.Db4o; namespace Db4objects.Drs.Inside { public class ReplicationReflector { private IInternalObjectContainer _container; private IReflector _reflector; public ReplicationReflector(IReplicationProvider providerA, IReplicationProvider providerB, IReflector reflector) { if (reflector == null) { if ((_container = ContainerFrom(providerA)) != null) { return; } if ((_container = ContainerFrom(providerB)) != null) { return; } } GenericReflector genericReflector = new GenericReflector(null, reflector == null ? Platform4.ReflectorForType(typeof(Db4objects.Drs.Inside.ReplicationReflector)) : reflector); Platform4.RegisterCollections(genericReflector); _reflector = genericReflector; } public virtual object[] ArrayContents(object array) { int[] dim = ArrayReflector().Dimensions(array); object[] result = new object[Volume(dim)]; ArrayReflector().Flatten(array, dim, 0, result, 0); //TODO Optimize add a visit(Visitor) method to ReflectArray or navigate the array to avoid copying all this stuff all the time. return result; } private int Volume(int[] dim) { int result = dim[0]; for (int i = 1; i < dim.Length; i++) { result = result * dim[i]; } return result; } public virtual IReflectClass ForObject(object obj) { return Reflector().ForObject(obj); } public virtual IReflectClass ForClass(Type clazz) { return Reflector().ForClass(clazz); } internal virtual IReflectClass GetComponentType(IReflectClass claxx) { return ArrayReflector().GetComponentType(claxx); } internal virtual int[] ArrayDimensions(object obj) { return ArrayReflector().Dimensions(obj); } public virtual object NewArrayInstance(IReflectClass componentType, int[] dimensions ) { return ArrayReflector().NewInstance(componentType, dimensions); } public virtual int ArrayShape(object[] a_flat, int a_flatElement, object a_shaped , int[] a_dimensions, int a_currentDimension) { return ArrayReflector().Shape(a_flat, a_flatElement, a_shaped, a_dimensions, a_currentDimension ); } public virtual bool IsValueType(IReflectClass clazz) { if (_container == null) { return clazz.IsImmutable(); } ClassMetadata classMetadata = _container.ClassMetadataForReflectClass(clazz); if (classMetadata == null) { return false; } return classMetadata.IsValueType(); } private IInternalObjectContainer ContainerFrom(IReplicationProvider provider) { if (!(provider is IDb4oReplicationProvider)) { return null; } IDb4oReplicationProvider db4oProvider = (IDb4oReplicationProvider)provider; IExtObjectContainer container = db4oProvider.GetObjectContainer(); if (!(container is IInternalObjectContainer)) { return null; } return (IInternalObjectContainer)container; } private IReflectArray ArrayReflector() { return Reflector().Array(); } // return _container.reflector().array(); private IReflector Reflector() { return _container == null ? _reflector : _container.Reflector(); } public virtual void CopyState(object to, object from) { IReflectClass fromClass = Reflector().ForObject(from); // FIXME: We need to get the classes parents fields copied too. foreach (IReflectField f in fromClass.GetDeclaredFields()) { if (f.IsStatic()) { continue; } f.Set(to, f.Get(from)); } } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/0000755000175000017500000000000011520622066026630 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/FieldIterators.cs0000644000175000017500000000273011520622640032077 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Reflect; namespace Db4objects.Drs.Inside.Traversal { public class FieldIterators { public static IEnumerator PersistentFields(IReflectClass claxx) { return Iterators.Filter(claxx.GetDeclaredFields(), new _IPredicate4_31()); } private sealed class _IPredicate4_31 : IPredicate4 { public _IPredicate4_31() { } public bool Match(object candidate) { IReflectField field = (IReflectField)candidate; if (field.IsStatic()) { return false; } if (field.IsTransient()) { return false; } if (Platform4.IsTransient(field.GetFieldType())) { return false; } return true; } } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/GenericTraverser.cs0000644000175000017500000001024511520622640032431 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Inside; using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside.Traversal { public class GenericTraverser : ITraverser { protected readonly ReplicationReflector _reflector; protected readonly ICollectionTraverser _collectionHandler; protected readonly IQueue4 _queue = new NonblockingQueue(); public GenericTraverser(ReplicationReflector reflector, ICollectionTraverser collectionHandler ) { _reflector = reflector; _collectionHandler = collectionHandler; } public virtual void TraverseGraph(object @object, IVisitor visitor) { QueueUpForTraversing(@object); while (true) { object next = _queue.Next(); if (next == null) { return; } TraverseObject(next, visitor); } } protected virtual void TraverseObject(object @object, IVisitor visitor) { if (!visitor.Visit(@object)) { return; } IReflectClass claxx = _reflector.ForObject(@object); TraverseAllFields(@object, claxx); } protected virtual void TraverseAllFields(object @object, IReflectClass claxx) { TraverseFields(@object, claxx); TraverseSuperclass(@object, claxx); } private void TraverseSuperclass(object @object, IReflectClass claxx) { IReflectClass superclass = claxx.GetSuperclass(); if (superclass == null) { return; } TraverseAllFields(@object, superclass); } private void TraverseFields(object @object, IReflectClass claxx) { IEnumerator fields = FieldIterators.PersistentFields(claxx); while (fields.MoveNext()) { IReflectField field = (IReflectField)fields.Current; object value = field.Get(@object); QueueUpForTraversing(value); } } protected virtual void TraverseCollection(object collection) { IEnumerator elements = _collectionHandler.IteratorFor(collection); //TODO Optimization: visit instead of flattening. while (elements.MoveNext()) { object element = elements.Current; if (element == null) { continue; } QueueUpForTraversing(element); } } protected virtual void TraverseArray(IReflectClass claxx, object array) { IEnumerator contents = ArrayHandler.Iterator(claxx, array); while (contents.MoveNext()) { QueueUpForTraversing(contents.Current); } } protected virtual void QueueUpForTraversing(object @object) { if (@object == null) { return; } IReflectClass claxx = _reflector.ForObject(@object); if (IsValueTypeOrArrayOfValueType(claxx) || Platform4.IsTransient(claxx)) { return; } if (_collectionHandler.CanHandleClass(claxx)) { TraverseCollection(@object); return; } if (claxx.IsArray()) { TraverseArray(claxx, @object); return; } QueueAdd(@object); } protected virtual void QueueAdd(object @object) { _queue.Add(@object); } protected virtual bool IsValueTypeOrArrayOfValueType(IReflectClass claxx) { // TODO Optimization: Compute this lazily in ReflectClass; if (_reflector.IsValueType(claxx)) { return true; } return claxx.IsArray() && _reflector.IsValueType(claxx.GetComponentType()); } public virtual void ExtendTraversalTo(object disconnected) { QueueUpForTraversing(disconnected); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/IVisitor.cs0000644000175000017500000000143311520622640030726 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Inside.Traversal { public interface IVisitor { bool Visit(object @object); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/ITraverser.cs0000644000175000017500000000332511520622640031246 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside.Traversal { public interface ITraverser { /// /// Traversal will only stop when visitor.visit(...) returns false, EVEN IN /// THE PRESENCE OF CIRCULAR REFERENCES. /// /// /// Traversal will only stop when visitor.visit(...) returns false, EVEN IN /// THE PRESENCE OF CIRCULAR REFERENCES. So it is up to the visitor to detect /// circular references if necessary. Transient fields are not visited. The /// fields of second class objects such as Strings and Dates are also not visited. /// void TraverseGraph(object @object, IVisitor visitor); /// Should only be called during a traversal. /// /// Should only be called during a traversal. Will traverse the graph /// for the received object too, using the current visitor. Used to /// extend the traversal to a possibly disconnected object graph. /// void ExtendTraversalTo(object disconnected); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/ICollectionFlattener.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/ICollectionFlattener.0000644000175000017500000000163111520622640032701 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside.Traversal { public interface ICollectionFlattener : ICollectionTraverser { bool CanHandle(object obj); bool CanHandleClass(Type c); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/ICollectionTraverser.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/Traversal/ICollectionTraverser.0000644000175000017500000000164311520622640032735 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o.Reflect; namespace Db4objects.Drs.Inside.Traversal { public interface ICollectionTraverser { bool CanHandleClass(IReflectClass claxx); IEnumerator IteratorFor(object collection); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Inside/InstanceReplicationPreparer.cs0000644000175000017500000003734111520622640032661 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Drs; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; using Db4objects.Drs.Inside.Traversal; namespace Db4objects.Drs.Inside { internal class InstanceReplicationPreparer : IVisitor { private readonly IReplicationProviderInside _providerA; private readonly IReplicationProviderInside _providerB; private readonly IReplicationProvider _directionTo; private readonly IReplicationEventListener _listener; private readonly bool _isReplicatingOnlyDeletions; private readonly HashSet4 _uuidsProcessedInSession; private readonly ITraverser _traverser; private readonly ReplicationReflector _reflector; private readonly Db4objects.Drs.Inside.ICollectionHandler _collectionHandler; /// /// Purpose: handle circular references /// TODO Big Refactoring: Evolve this to handle ALL reference logic (!) and remove it from the providers. /// /// /// Purpose: handle circular references /// TODO Big Refactoring: Evolve this to handle ALL reference logic (!) and remove it from the providers. /// private readonly IdentitySet4 _objectsPreparedToReplicate = new IdentitySet4(100); /// /// key = object originated from one provider /// value = the counterpart ReplicationReference of the original object /// private IMap4 _counterpartRefsByOriginal = new IdentityHashtable4(100); private readonly ReplicationEventImpl _event; private readonly ObjectStateImpl _stateInA; private readonly ObjectStateImpl _stateInB; private object _obj; private object _referencingObject; private string _fieldName; internal InstanceReplicationPreparer(IReplicationProviderInside providerA, IReplicationProviderInside providerB, IReplicationProvider directionTo, IReplicationEventListener listener , bool isReplicatingOnlyDeletions, HashSet4 uuidsProcessedInSession, ITraverser traverser, ReplicationReflector reflector, Db4objects.Drs.Inside.ICollectionHandler collectionHandler) { _event = new ReplicationEventImpl(); _stateInA = _event._stateInProviderA; _stateInB = _event._stateInProviderB; _providerA = providerA; _providerB = providerB; _directionTo = directionTo; _listener = listener; _isReplicatingOnlyDeletions = isReplicatingOnlyDeletions; _uuidsProcessedInSession = uuidsProcessedInSession; _traverser = traverser; _reflector = reflector; _collectionHandler = collectionHandler; } private IReplicationProviderInside DirectionFrom() { return _providerA == _directionTo ? _providerB : _providerA; } public bool Visit(object obj) { if (DirectionFrom().IsSecondClassObject(obj)) { return false; } if (IsValueType(obj)) { return true; } if (_objectsPreparedToReplicate.Contains(obj)) { return false; } _objectsPreparedToReplicate.Add(obj); return PrepareObjectToBeReplicated(obj, null, null); } private bool IsValueType(object o) { return ReplicationPlatform.IsValueType(o); } private bool PrepareObjectToBeReplicated(object obj, object referencingObject, string fieldName) { //TODO Optimization: keep track of the peer we are traversing to avoid having to look in both. Logger4Support.LogIdentity(obj); _obj = obj; _referencingObject = referencingObject; _fieldName = fieldName; IReplicationReference refA = _providerA.ProduceReference(_obj, _referencingObject , _fieldName); IReplicationReference refB = _providerB.ProduceReference(_obj, _referencingObject , _fieldName); if (refA == null && refB == null) { throw new Exception(string.Empty + _obj.GetType() + " " + _obj + " must be stored in one of the databases being replicated." ); } //FIXME: Use db4o's standard for throwing exceptions. if (refA != null && refB != null) { throw new Exception(string.Empty + _obj.GetType() + " " + _obj + " cannot be referenced by both databases being replicated." ); } //FIXME: Use db4o's standard for throwing exceptions. IReplicationProviderInside owner = refA == null ? _providerB : _providerA; IReplicationReference ownerRef = refA == null ? refB : refA; IReplicationProviderInside other = Other(owner); IDrsUUID uuid = ownerRef.Uuid(); IReplicationReference otherRef = other.ProduceReferenceByUUID(uuid, _obj.GetType( )); if (refA == null) { refA = otherRef; } else { refB = otherRef; } //TODO for circular referenced object, otherRef should not be null in the subsequent pass. //But db4o always return null. A bug. check! if (otherRef == null) { //Object is only present in one ReplicationProvider. Missing in the other. Could have been deleted or never replicated. if (WasProcessed(uuid)) { IReplicationReference otherProcessedRef = other.ProduceReferenceByUUID(uuid, _obj .GetType()); if (otherProcessedRef != null) { ownerRef.SetCounterpart(otherProcessedRef.Object()); } return false; } MarkAsProcessed(uuid); long creationTime = ownerRef.Uuid().GetLongPart(); if (creationTime > owner.TimeStamps().From()) { //if it was created after the last time two ReplicationProviders were replicated it has to be treated as new. if (_isReplicatingOnlyDeletions) { return false; } return HandleNewObject(_obj, ownerRef, owner, other, _referencingObject, _fieldName , true, false); } else { // If it was created before the last time two ReplicationProviders were replicated it has to be treated as deleted. // No, not always, in a three-way replication setup it can also be new. return HandleMissingObjectInOther(_obj, ownerRef, owner, other, _referencingObject , _fieldName); } } if (_isReplicatingOnlyDeletions) { return false; } ownerRef.SetCounterpart(otherRef.Object()); otherRef.SetCounterpart(ownerRef.Object()); if (WasProcessed(uuid)) { return false; } //Has to be done AFTER the counterpart is set because object yet to be replicated might reference the current one, replicated previously. MarkAsProcessed(uuid); object objectA = refA.Object(); object objectB = refB.Object(); bool changedInA = _providerA.WasModifiedSinceLastReplication(refA); //System.out.println("changedInA = " + changedInA); bool changedInB = _providerB.WasModifiedSinceLastReplication(refB); //System.out.println("changedInB = " + changedInB); if (!changedInA && !changedInB) { return false; } bool conflict = false; if (changedInA && changedInB) { conflict = true; } if (changedInA && _directionTo == _providerA) { conflict = true; } if (changedInB && _directionTo == _providerB) { conflict = true; } object prevailing = _obj; _providerA.Activate(objectA); _providerB.Activate(objectB); _event.ResetAction(); _event.Conflict(conflict); _event._creationDate = TimeStampIdGenerator.IdToMilliseconds(uuid.GetLongPart()); _stateInA.SetAll(objectA, false, changedInA, TimeStampIdGenerator.IdToMilliseconds (ownerRef.Version())); _stateInB.SetAll(objectB, false, changedInB, TimeStampIdGenerator.IdToMilliseconds (otherRef.Version())); _listener.OnReplicate(_event); if (conflict) { if (!_event._actionWasChosen) { ThrowReplicationConflictException(); } if (_event._actionChosenState == null) { return false; } if (_event._actionChosenState == _stateInA) { prevailing = objectA; } if (_event._actionChosenState == _stateInB) { prevailing = objectB; } } else { if (_event._actionWasChosen) { if (_event._actionChosenState == _stateInA) { prevailing = objectA; } if (_event._actionChosenState == _stateInB) { prevailing = objectB; } if (_event._actionChosenState == null) { return false; } } else { if (changedInA) { prevailing = objectA; } if (changedInB) { prevailing = objectB; } } } IReplicationProviderInside prevailingPeer = prevailing == objectA ? _providerA : _providerB; if (_directionTo == prevailingPeer) { return false; } if (!conflict) { prevailingPeer.Activate(prevailing); } //Already activated if there was a conflict. if (prevailing != _obj) { otherRef.SetCounterpart(_obj); otherRef.MarkForReplicating(true); MarkAsNotProcessed(uuid); _traverser.ExtendTraversalTo(prevailing); } else { //Now we start traversing objects on the other peer! Is that cool or what? ;) ownerRef.MarkForReplicating(true); } return !_event._actionShouldStopTraversal; } private void MarkAsNotProcessed(IDrsUUID uuid) { _uuidsProcessedInSession.Remove(uuid); } private void MarkAsProcessed(IDrsUUID uuid) { if (_uuidsProcessedInSession.Contains(uuid)) { throw new Exception("illegal state"); } _uuidsProcessedInSession.Add(uuid); } private bool WasProcessed(IDrsUUID uuid) { return _uuidsProcessedInSession.Contains(uuid); } private IReplicationProviderInside Other(IReplicationProviderInside peer) { return peer == _providerA ? _providerB : _providerA; } private bool HandleMissingObjectInOther(object obj, IReplicationReference ownerRef , IReplicationProviderInside owner, IReplicationProviderInside other, object referencingObject , string fieldName) { bool isConflict = false; bool wasModified = owner.WasModifiedSinceLastReplication(ownerRef); if (wasModified) { isConflict = true; } if (_directionTo == other) { isConflict = true; } object prevailing = null; //by default, deletion prevails if (isConflict) { owner.Activate(obj); } _event.ResetAction(); _event.Conflict(isConflict); _event._creationDate = TimeStampIdGenerator.IdToMilliseconds(ownerRef.Uuid().GetLongPart ()); long modificationDate = TimeStampIdGenerator.IdToMilliseconds(ownerRef.Version()); if (owner == _providerA) { _stateInA.SetAll(obj, false, wasModified, modificationDate); _stateInB.SetAll(null, false, false, ObjectStateImpl.Unknown); } else { //owner == _providerB _stateInA.SetAll(null, false, false, ObjectStateImpl.Unknown); _stateInB.SetAll(obj, false, wasModified, modificationDate); } _listener.OnReplicate(_event); if (isConflict && !_event._actionWasChosen) { ThrowReplicationConflictException(); } if (_event._actionWasChosen) { if (_event._actionChosenState == null) { return false; } if (_event._actionChosenState == _stateInA) { prevailing = _stateInA.GetObject(); } if (_event._actionChosenState == _stateInB) { prevailing = _stateInB.GetObject(); } } if (prevailing == null) { //Deletion has prevailed. if (_directionTo == other) { return false; } ownerRef.MarkForDeleting(); return !_event._actionShouldStopTraversal; } bool needsToBeActivated = !isConflict; //Already activated if there was a conflict. return HandleNewObject(obj, ownerRef, owner, other, referencingObject, fieldName, needsToBeActivated, true); } private bool HandleNewObject(object obj, IReplicationReference ownerRef, IReplicationProviderInside owner, IReplicationProviderInside other, object referencingObject, string fieldName , bool needsToBeActivated, bool listenerAlreadyNotified) { if (_directionTo == owner) { return false; } if (needsToBeActivated) { owner.Activate(obj); } if (!listenerAlreadyNotified) { _event.ResetAction(); _event.Conflict(false); _event._creationDate = TimeStampIdGenerator.IdToMilliseconds(ownerRef.Uuid().GetLongPart ()); if (owner == _providerA) { _stateInA.SetAll(obj, true, false, ObjectStateImpl.Unknown); _stateInB.SetAll(null, false, false, ObjectStateImpl.Unknown); } else { _stateInA.SetAll(null, false, false, ObjectStateImpl.Unknown); _stateInB.SetAll(obj, true, false, ObjectStateImpl.Unknown); } if (_listener != null) { _listener.OnReplicate(_event); if (_event._actionWasChosen) { if (_event._actionChosenState == null) { return false; } if (_event._actionChosenState.GetObject() != obj) { return false; } } } } object counterpart = EmptyClone(owner, obj); ownerRef.SetCounterpart(counterpart); ownerRef.MarkForReplicating(true); IReplicationReference otherRef = other.ReferenceNewObject(counterpart, ownerRef, GetCounterpartRef(referencingObject), fieldName); otherRef.SetCounterpart(obj); PutCounterpartRef(obj, otherRef); if (_event._actionShouldStopTraversal) { return false; } return true; } private void ThrowReplicationConflictException() { throw new ReplicationConflictException("A replication conflict ocurred and the ReplicationEventListener, if any, did not choose which state should override the other." ); } private object EmptyClone(IReplicationProviderInside sourceProvider, object obj) { if (obj == null) { return null; } IReflectClass claxx = ReflectClass(obj); if (_reflector.IsValueType(claxx)) { throw new Exception("IllegalState"); } // if (claxx.isArray()) return arrayClone(obj, claxx, sourceProvider); //Copy arrayClone() from GenericReplicationSession if necessary. if (claxx.IsArray()) { throw new Exception("IllegalState"); } //Copy arrayClone() from GenericReplicationSession if necessary. if (_collectionHandler.CanHandleClass(claxx)) { return CollectionClone(sourceProvider, obj, claxx); } object result = claxx.NewInstance(); if (result == null) { throw new Exception("Unable to create a new instance of " + obj.GetType()); } //FIXME Use db4o's standard for throwing exceptions. return result; } private IReflectClass ReflectClass(object obj) { return _reflector.ForObject(obj); } private object CollectionClone(IReplicationProviderInside sourceProvider, object original, IReflectClass claxx) { return _collectionHandler.EmptyClone(sourceProvider, original, claxx); } private IReplicationReference GetCounterpartRef(object original) { return (IReplicationReference)_counterpartRefsByOriginal.Get(original); } private void PutCounterpartRef(object obj, IReplicationReference otherRef) { if (_counterpartRefsByOriginal.Get(obj) != null) { throw new Exception("illegal state"); } _counterpartRefsByOriginal.Put(obj, otherRef); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/IReplicationEvent.cs0000644000175000017500000000466211520622640027373 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs; namespace Db4objects.Drs { /// Defines an event class for the replication of an entity. /// Defines an event class for the replication of an entity. /// dRS 1.2 public interface IReplicationEvent { /// Does a conflict occur? /// true when a conflict occur bool IsConflict(); /// Overrides default replication behaviour with some state chosen by the user. /// /// Overrides default replication behaviour with some state chosen by the user. /// /// the ObjectState of the prevailing object or null if replication should ignore this object and not traverse to its referenced objects. /// void OverrideWith(IObjectState chosen); /// The ObjectState in provider A. /// The ObjectState in provider A. /// ObjectState in provider A IObjectState StateInProviderA(); /// The ObjectState in provider B. /// The ObjectState in provider B. /// ObjectState in provider B IObjectState StateInProviderB(); /// The time when the object is created in one provider. /// The time when the object is created in one provider. /// time when the object is created in one provider. long ObjectCreationDate(); /// The replication process will not traverse to objects referenced by the current one. /// /// The replication process will not traverse to objects referenced by the current one. /// void StopTraversal(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Replication.cs0000644000175000017500000001072311520622640026253 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Reflect; using Db4objects.Drs; using Db4objects.Drs.Inside; namespace Db4objects.Drs { /// Factory to create ReplicationSessions. /// Factory to create ReplicationSessions. /// 1.3 /// com.db4o.drs.hibernate.HibernateReplication /// /// IReplicationProvider /// IReplicationEventListener /// dRS 1.0 public class Replication { /// /// Begins a replication session between two ReplicationProviders without a /// ReplicationEventListener and with no Reflector provided. /// /// /// Begins a replication session between two ReplicationProviders without a /// ReplicationEventListener and with no Reflector provided. /// /// when conflicts occur /// IReplicationEventListener public static IReplicationSession Begin(IReplicationProvider providerA, IReplicationProvider providerB) { return Begin(providerA, providerB, null, null); } /// /// Begins a replication session between two ReplicationProviders using a /// ReplicationEventListener and with no Reflector provided. /// /// /// Begins a replication session between two ReplicationProviders using a /// ReplicationEventListener and with no Reflector provided. /// /// when conflicts occur /// IReplicationEventListener public static IReplicationSession Begin(IReplicationProvider providerA, IReplicationProvider providerB, IReplicationEventListener listener) { return Begin(providerA, providerB, listener, null); } /// /// Begins a replication session between two ReplicationProviders without a /// ReplicationEventListener and with a Reflector provided. /// /// /// Begins a replication session between two ReplicationProviders without a /// ReplicationEventListener and with a Reflector provided. /// /// when conflicts occur /// IReplicationEventListener public static IReplicationSession Begin(IReplicationProvider providerFrom, IReplicationProvider providerTo, IReflector reflector) { return Begin(providerFrom, providerTo, null, reflector); } /// /// Begins a replication session between two ReplicationProviders using a /// ReplicationEventListener and with a Reflector provided. /// /// /// Begins a replication session between two ReplicationProviders using a /// ReplicationEventListener and with a Reflector provided. /// /// when conflicts occur /// IReplicationEventListener public static IReplicationSession Begin(IReplicationProvider providerFrom, IReplicationProvider providerTo, IReplicationEventListener listener, IReflector reflector) { if (listener == null) { listener = new DefaultReplicationEventListener(); } ReplicationReflector rr = new ReplicationReflector(providerFrom, providerTo, reflector ); providerFrom.ReplicationReflector(rr); providerTo.ReplicationReflector(rr); return new GenericReplicationSession(providerFrom, providerTo, listener, reflector ); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/ReplicationConflictException.cs0000644000175000017500000000252011520622640031610 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Ext; namespace Db4objects.Drs { /// Thrown when a conflict occurs and no ReplicationEventListener is specified. /// /// Thrown when a conflict occurs and no ReplicationEventListener is specified. /// /// Albert Kwan /// Klaus Wuestefeld /// 1.2 /// IReplicationEventListener /// dRS 1.2 [System.Serializable] public class ReplicationConflictException : Db4oRecoverableException { public ReplicationConflictException(string message) : base(message) { } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/0000755000175000017500000000000011520622070025553 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/StackAnalyzer.cs0000644000175000017500000000204311520622640030657 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Drs.Foundation { public class StackAnalyzer { public static string MethodCallAboveAsString(Type clazz) { return "stack analyis NA"; } public static string MethodCallAsString(int depth) { return "stack analyis NA"; } // What? The class we are calling from is not available? Hm, we are not on Java. } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/Logger4.cs0000644000175000017500000000316211520622640027412 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Foundation; using Sharpen; namespace Db4objects.Drs.Foundation { /// Experiment field for future db4o logging. /// /// Experiment field for future db4o logging. /// This will become an interface in the future. /// It will also allow wrapping to Log4j /// For now we are just collecting requirments. /// We are not using log4j directly on purpose, so /// we can keep the footprint small for embedded /// devices /// public class Logger4 { public virtual void LogIdentity(object obj, string message) { if (obj == null) { Log(message + " [null]"); } Log(message + " " + obj.GetType() + " " + Runtime.IdentityHashCode(obj)); } public virtual void Log(string message) { return; Sharpen.Runtime.Out.WriteLine(StackAnalyzer.MethodCallAboveAsString(typeof(Logger4Support )) + " " + message); Sharpen.Runtime.Out.Flush(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/Logger4Support.cs0000644000175000017500000000301111520622640031000 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Foundation { /// Experiment field for future db4o logging. /// /// Experiment field for future db4o logging. /// This will become an interface in the future. /// It will also allow wrapping to Log4j /// For now we are just collecting requirments. /// We are not using log4j directly on purpose, so /// we can keep the footprint small for embedded /// devices /// public class Logger4Support { private static readonly Logger4 _logger = new Logger4(); public static void LogIdentity(object obj, string message) { _logger.LogIdentity(obj, message); } public static void LogIdentity(object obj) { LogIdentity(obj, string.Empty); } public static void Log(string str) { _logger.Log(str); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/Signatures.cs0000644000175000017500000000266111520622640030236 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections.Generic; using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Foundation { public class Signatures { private readonly IDictionary _loidBySignature = new Dictionary(); private readonly IDictionary _signatureByLoid = new Dictionary(); public virtual void Add(Signature signature, long signatureLoid) { _loidBySignature[signature] = signatureLoid; _signatureByLoid[signatureLoid] = signature; } public virtual long LoidForSignature(Signature signature) { return _loidBySignature[signature]; } public virtual Signature SignatureForLoid(long signatureLoid) { return _signatureByLoid[signatureLoid]; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/Signature.cs0000644000175000017500000000357211520622640030055 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Text; using Db4objects.Db4o.Foundation; namespace Db4objects.Drs.Foundation { public class Signature { public readonly byte[] bytes; public Signature(byte[] bytes) { this.bytes = bytes; } public override bool Equals(object obj) { if (this == obj) { return true; } if (!(obj is Db4objects.Drs.Foundation.Signature)) { return false; } Db4objects.Drs.Foundation.Signature other = (Db4objects.Drs.Foundation.Signature) obj; return Arrays4.Equals(bytes, other.bytes); } public override int GetHashCode() { int hc = 0; for (int i = 0; i < bytes.Length; i++) { hc <<= 2; hc = hc ^ bytes[i]; } return hc; } public override string ToString() { return ToString(bytes); } public static string ToString(byte[] bytes) { return BytesToString(bytes); } private static string BytesToString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { char c = (char)bytes[i]; sb.Append(c); } return sb.ToString(); } public virtual string AsString() { return BytesToString(bytes); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/IDrsUUID.cs0000644000175000017500000000145511520622640027442 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Foundation { public interface IDrsUUID { long GetLongPart(); byte[] GetSignaturePart(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/TimeStamps.cs0000644000175000017500000000211511520622640030172 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Foundation { public class TimeStamps { private long _from; private long _commit; public TimeStamps(long from, long commit) { this._from = from; this._commit = commit; } public virtual long To() { return _commit - 1; } public virtual long From() { return _from; } public virtual long Commit() { return _commit; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/LinePrinter.cs0000644000175000017500000000272111520622640030342 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.IO; using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Foundation { public abstract class LinePrinter { private sealed class _LinePrinter_9 : LinePrinter { public _LinePrinter_9() { } public override void Println(string str) { } } public static readonly LinePrinter NullPrinter = new _LinePrinter_9(); // do nothing public abstract void Println(string str); public static LinePrinter ForPrintStream(TextWriter ps) { return new _LinePrinter_20(ps); } private sealed class _LinePrinter_20 : LinePrinter { public _LinePrinter_20(TextWriter ps) { this.ps = ps; } public override void Println(string str) { ps.WriteLine(str); } private readonly TextWriter ps; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/Foundation/DrsUUIDImpl.cs0000644000175000017500000000367211520622640030156 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Ext; using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Foundation { public class DrsUUIDImpl : IDrsUUID { private readonly Signature _signature; private readonly long _longPart; public DrsUUIDImpl(Signature signature, long longPart) { _signature = signature; _longPart = longPart; } public DrsUUIDImpl(byte[] signature, long longPart) : this(new Signature(signature ), longPart) { } public DrsUUIDImpl(Db4oUUID db4oUUID) : this(db4oUUID.GetSignaturePart(), db4oUUID .GetLongPart()) { } public virtual long GetLongPart() { return _longPart; } public virtual byte[] GetSignaturePart() { return _signature.bytes; } public override bool Equals(object obj) { if (!(obj is Db4objects.Drs.Foundation.DrsUUIDImpl)) { return false; } Db4objects.Drs.Foundation.DrsUUIDImpl other = (Db4objects.Drs.Foundation.DrsUUIDImpl )obj; return _longPart == other._longPart && _signature.Equals(other._signature); } public override int GetHashCode() { return ((int)_longPart) ^ _signature.GetHashCode(); } public override string ToString() { return "longpart " + _longPart + " signature " + _signature.AsString(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/IReplicationSession.cs0000644000175000017500000001352611520622640027734 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs; namespace Db4objects.Drs { /// Execute a round of replication between two ReplicationProviders. /// /// Execute a round of replication between two ReplicationProviders. ///

/// Sample code of using ReplicationSession: ///

	/// ReplicationSession session = Replication.begin(objectContainer1, objectContainer2);
	/// session.replicate(object);
	/// session.commit();
	/// session.close();
	/// 
///
/// 1.2 /// Replication /// dRS 1.0 public interface IReplicationSession { /// Closes this session and frees used resources. /// /// Closes this session and frees used resources. Sessions that were opened /// during the creation of ReplicationProviders will be closed as well. ///

/// Hibernate Sessions created from Hibernate Configurations will be closed. /// db4o ObjectContainers will remain open. /// /// if the session is still active (neither commitReplicationTransaction() nor rollback is called). /// void Close(); ///

/// Commits replication changes to both ReplicationProviders and marks the /// involved ReplicationProviders to be "clean" against each other - to contain /// no modified objects. /// /// /// Commits replication changes to both ReplicationProviders and marks the /// involved ReplicationProviders to be "clean" against each other - to contain /// no modified objects. /// void Commit(); /// /// Returns the ReplicationProvider representing the first persistence /// system passed as a parameter when the replication session was instantiated. /// /// /// Returns the ReplicationProvider representing the first persistence /// system passed as a parameter when the replication session was instantiated. /// /// the first persistence system IReplicationProvider ProviderA(); /// /// Returns the ReplicationProvider representing the second persistence /// system passed as a parameter when the replication session was instantiated. /// /// /// Returns the ReplicationProvider representing the second persistence /// system passed as a parameter when the replication session was instantiated. /// /// the second persistence system IReplicationProvider ProviderB(); /// /// Replicates an individual object and traverses to member objects as long as /// members are new or modified since the last time the two ReplicationProviders /// were replicated. /// /// /// Replicates an individual object and traverses to member objects as long as /// members are new or modified since the last time the two ReplicationProviders /// were replicated. /// /// the object to be replicated. /// IReplicationEventListener void Replicate(object obj); /// Replicates all deletions between the two providers. /// /// Replicates all deletions between the two providers. /// Cascade delete is disabled, regardless the user's settings. ///

/// If the deletion violates referential integrity, exception will be thrown. /// You can use the dRS replication callback to check whether the object to /// be deleted violates referential integrity. If so, you can stop traversal. /// /// the Class that you want to delete void ReplicateDeletions(Type extent); ///

Rollbacks all changes done during the replication session. /// /// Rollbacks all changes done during the replication session. This call /// guarantees the changes will not be applied to the underlying databases. The /// state of the objects involved in the replication is undefined. /// Both ReplicationProviders may still contain cached references of touched objects. ///

/// To restart replication, it is recommended to reopen both involved /// ReplicationProviders and to start a new ReplicationSession. /// void Rollback(); ///

Sets the direction of replication. /// /// Sets the direction of replication. By default, if this method is not called, replication is bidirectional, /// which means the newer copy of the object is copied to the other provider.. ///

If you want to force unidirectional replication, call this method before calling /// Replicate(object) /// . /// /// objects in this provider will not be changed. /// objects will be copied to this provider if copies in "from" is newer /// void SetDirection(IReplicationProvider from, IReplicationProvider to); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Db4objects.Drs/IReplicationProvider.cs0000644000175000017500000000474611520622640030107 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; namespace Db4objects.Drs { ///

Facade for persistence systems that provide replication support. /// /// Facade for persistence systems that provide replication support. /// Interacts with another ReplicationProvider and a ReplicationSession /// to allows replication of objects between two ReplicationProviders. ///

///

To create an instance of this class, use the methods of /// Replication /// . /// /// IReplicationSession /// Replication /// dRS 1.0 public interface IReplicationProvider { ///

Returns newly created objects and changed objects since last replication with the opposite provider. /// /// Returns newly created objects and changed objects since last replication with the opposite provider. /// /// newly created objects and changed objects since last replication with the opposite provider. /// IObjectSet ObjectsChangedSinceLastReplication(); /// Returns newly created objects and changed objects since last replication with the opposite provider. /// /// Returns newly created objects and changed objects since last replication with the opposite provider. /// /// the type of objects interested /// newly created objects and changed objects of the type specified in the clazz parameter since last replication /// IObjectSet ObjectsChangedSinceLastReplication(Type clazz); void ReplicationReflector(Db4objects.Drs.Inside.ReplicationReflector replicationReflector ); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Properties/0000755000175000017500000000000011520622070023067 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs/Properties/AssemblyInfo.cs0000644000175000017500000000240011520622640026010 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using System.Runtime.InteropServices; [assembly: AssemblyTitle("dRS")] [assembly: AssemblyDescription("Db4objects.Drs 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("8.0.184.15484")] [assembly: CLSCompliant(true)]db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/0000755000175000017500000000000011520622054022036 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests-2008.csproj0000644000175000017500000002376511520622054027477 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {C0BA12AD-54B4-43B0-A570-0299F6253AC7} Exe Properties Db4objects.Drs.Tests Db4objects.Drs.Tests v3.5 512 Db4objects.Drs.Tests.Db4oDrsTestSuiteBuilder true full false bin\Debug\ DEBUG;TRACE prompt 4 pdbonly true bin\Release\ TRACE prompt 4 3.5 3.5 3.5 {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3} Db4oUnit.Extensions-2008 {8F82F8B0-95B6-4553-BDA8-BD9A954E682F} Db4oUnit-2008 {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6} Db4objects.Drs-2008 db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/0000755000175000017500000000000011520622056023326 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/0000755000175000017500000000000011520622066027142 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/ReplicationTestPlatform.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/ReplicationTestPlat0000644000175000017500000000155611520622640033024 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; namespace Db4objects.Drs.Tests { class ReplicationTestPlatform { public static IEnumerator Adapt(IEnumerator enumerator) { return enumerator; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/ListTest.cs0000644000175000017500000001177111520622640031251 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ListTest : DrsTestCase { public virtual void Test() { ActualTest(); } protected virtual void ActualTest() { StoreListToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyInProviderB(); ReplicateAllStep2(); AddElementInProviderA(); ReplicateHolderStep3(); } private void StoreListToProviderA() { ListHolder lh = CreateHolder(); ListContent lc1 = new ListContent("c1"); ListContent lc2 = new ListContent("c2"); lh.Add(lc1); lh.Add(lc2); A().Provider().StoreNew(lh); A().Provider().Commit(); EnsureContent(A(), new string[] {"h1"}, new string[] {"c1", "c2"}); } protected virtual ListHolder CreateHolder() { ListHolder lh = new ListHolder("h1"); lh.SetList(new ArrayList()); return lh; } private void ReplicateAllToProviderBFirstTime() { ReplicateAll(A().Provider(), B().Provider()); EnsureContent(A(), new string[] {"h1"}, new string[] {"c1", "c2"}); EnsureContent(B(), new string[] {"h1"}, new string[] {"c1", "c2"}); } private void ModifyInProviderB() { ListHolder lh = (ListHolder) GetOneInstance (B(), typeof (ListHolder)); lh.SetName("h2"); IEnumerator itor = lh.GetList().GetEnumerator(); itor.MoveNext(); ListContent lc1 = (ListContent) itor.Current; itor.MoveNext(); ListContent lc2 = (ListContent) itor.Current; lc1.SetName("co1"); lc2.SetName("co2"); B().Provider().Update(lc1); B().Provider().Update(lc2); B().Provider().Update(lh.GetList()); B().Provider().Update(lh); B().Provider().Commit(); EnsureContent(B(), new string[] {"h2"}, new string[] {"co1", "co2"}); } private void ReplicateAllStep2() { ReplicateAll(B().Provider(), A().Provider()); EnsureContent(B(), new string[] {"h2"}, new string[] {"co1", "co2"}); EnsureContent(A(), new string[] {"h2"}, new string[] {"co1", "co2"}); } private void AddElementInProviderA() { ListHolder lh = (ListHolder) GetOneInstance (A(), typeof (ListHolder)); lh.SetName("h3"); ListContent lc3 = new ListContent("co3"); A().Provider().StoreNew(lc3); lh.GetList().Add(lc3); A().Provider().Update(lh.GetList()); A().Provider().Update(lh); A().Provider().Commit(); EnsureContent(A(), new string[] {"h3"}, new string[] {"co1", "co2", "co3"}); } private void ReplicateHolderStep3() { ReplicateClass(A().Provider(), B().Provider(), typeof (ListHolder) ); EnsureContent(A(), new string[] {"h3"}, new string[] {"co1", "co2", "co3"}); EnsureContent(B(), new string[] {"h3"}, new string[] {"co1", "co2", "co3"}); } private void EnsureContent(IDrsProviderFixture fixture, string[] holderNames, string[] contentNames) { int holderCount = holderNames.Length; EnsureInstanceCount(fixture, typeof (ListHolder), holderCount); int i = 0; IEnumerator objectSet = fixture.Provider().GetStoredObjects(typeof (ListHolder)).GetEnumerator(); while (objectSet.MoveNext()) { ListHolder lh = (ListHolder) objectSet.Current; Assert.AreEqual(holderNames[i], lh.GetName()); IEnumerator itor = lh.GetList().GetEnumerator(); int idx = 0; while (itor.MoveNext()) { Assert.AreEqual(contentNames[idx], ((ListContent) itor.Current).GetName()); idx++; } } } } }db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Db4oDrsTestSuite.cs0000644000175000017500000000236111520622640032604 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs.Tests.Dotnet; namespace Db4objects.Drs.Tests { partial class Db4oDrsTestSuite { protected override Type[] TestCases() { return Concat(PlatformSpecificTestCases(), Concat(base.TestCases(), SpecificTestCases())); } private Type[] PlatformSpecificTestCases() { return new Type[] { typeof(Regression.DelegateTestCase), typeof(Regression.GenericListTestSuite), typeof(Regression.GenericDictionaryTestCase), typeof(GenericEqualityComparerTestCase), }; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Foundation/0000755000175000017500000000000011520622044031244 5ustar directhexdirecthex././@LongLink0000000000000000000000000000020200000000000011557 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Foundation/ObjectSetCollection4FacadeTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Foundation/ObjectSe0000644000175000017500000000402511520622640032670 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Foundation { public class ObjectSetCollection4FacadeTestCase : Db4oUnit.ITestCase { public static void Main(string[] args) { new Db4oUnit.ConsoleTestRunner(typeof(Db4objects.Drs.Tests.Foundation.ObjectSetCollection4FacadeTestCase) ).Run(); } public virtual void TestEmpty() { Db4objects.Drs.Foundation.ObjectSetCollection4Facade facade = new Db4objects.Drs.Foundation.ObjectSetCollection4Facade (new Db4objects.Db4o.Foundation.Collection4()); Db4oUnit.Assert.IsFalse(facade.HasNext()); Db4oUnit.Assert.IsFalse(facade.HasNext()); } public virtual void TestIteration() { Db4objects.Db4o.Foundation.Collection4 collection = new Db4objects.Db4o.Foundation.Collection4 (); collection.Add("bar"); collection.Add("foo"); Db4objects.Drs.Foundation.ObjectSetCollection4Facade facade = new Db4objects.Drs.Foundation.ObjectSetCollection4Facade (collection); Db4oUnit.Assert.IsTrue(facade.HasNext()); Db4oUnit.Assert.AreEqual("bar", facade.Next()); Db4oUnit.Assert.IsTrue(facade.HasNext()); Db4oUnit.Assert.AreEqual("foo", facade.Next()); Db4oUnit.Assert.IsFalse(facade.HasNext()); facade.Reset(); Db4oUnit.Assert.AreEqual("bar", facade.Next()); Db4oUnit.Assert.AreEqual("foo", facade.Next()); Db4oUnit.Assert.IsFalse(facade.HasNext()); } } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/GenericEqualityComparerTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/GenericEqualityComp0000644000175000017500000000263411520622640033001 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Text; using Db4objects.Db4o; using Db4oUnit; namespace Db4objects.Drs.Tests { class GenericEqualityComparerTestCase : DrsTestCase { public class Item { public IEqualityComparer comparer; public Item(IEqualityComparer comparer) { this.comparer = comparer; } } public void Test() { A().Provider().StoreNew(new Item(EqualityComparer.Default)); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider()); IObjectSet found = B().Provider().GetStoredObjects(typeof(Item)); Assert.AreEqual(1, found.Count); Item item = (Item) found[0]; Assert.IsNotNull(item.comparer); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/DelegatingList.cs0000644000175000017500000000463111520622640032372 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; namespace Db4objects.Drs.Tests { public class DelegatingList : IList { private IList _delegate; public DelegatingList(IList @delegate) { _delegate = @delegate; } #region IList Members public int Add(object value) { return _delegate.Add(value); } public void Clear() { throw new NotImplementedException(); } public bool Contains(object value) { throw new NotImplementedException(); } public int IndexOf(object value) { throw new NotImplementedException(); } public void Insert(int index, object value) { throw new NotImplementedException(); } public bool IsFixedSize { get { throw new NotImplementedException(); } } public bool IsReadOnly { get { throw new NotImplementedException(); } } public void Remove(object value) { throw new NotImplementedException(); } public void RemoveAt(int index) { throw new NotImplementedException(); } public object this[int index] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } #endregion #region ICollection Members public void CopyTo(Array array, int index) { throw new NotImplementedException(); } public int Count { get { throw new NotImplementedException(); } } public bool IsSynchronized { get { throw new NotImplementedException(); } } public object SyncRoot { get { throw new NotImplementedException(); } } #endregion #region IEnumerable Members public IEnumerator GetEnumerator() { return _delegate.GetEnumerator(); } #endregion } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/0000755000175000017500000000000011520622070031255 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericListTestSuite.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericL0000644000175000017500000000433511520622640032700 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Foundation; using Db4oUnit.Fixtures; namespace Db4objects.Drs.Tests.Regression { class GenericListTestSuite : FixtureBasedTestSuite { public override Type[] TestUnits() { return new Type[] { typeof(GenericListTestCase) }; } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SubjectFixtureProvider(GenerateLists()), }; } private IEnumerable GenerateLists() { IEnumerable tenStrings = GenerateStrings(10); yield return new List(); yield return new List(tenStrings); yield return new ArrayList(); yield return new ArrayList(new List(tenStrings)); yield return new LinkedList(tenStrings); yield return new LinkedList(); yield return new LinkedList(Range(0, 10)); yield return new List(GenerateContainers(tenStrings)); } private IEnumerable GenerateContainers(IEnumerable names) { foreach (string name in names) { yield return new Container(name, null); } } private static IEnumerable Range(int begin, int end) { for (int i=begin; i GenerateStrings(int count) { if (count < 0) throw new ArgumentOutOfRangeException("count"); for (int i = 0; i < count; i++) { yield return "string " + i; } } } }././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericCollectionTestCaseBase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericC0000644000175000017500000000353611520622640032671 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using Db4objects.Drs.Tests; using Db4objects.Drs.Inside; using Db4objects.Db4o; using Db4oUnit; namespace Db4objects.Drs.Tests.Regression { abstract class GenericCollectionTestCaseBase : DrsTestCase { public void Test() { StoreToProviderA(); ReplicateAllToProviderB(); EnsureContent(B().Provider()); } private void StoreToProviderA() { ITestableReplicationProviderInside providerA = A().Provider(); providerA.StoreNew(CreateItem()); providerA.Commit(); } private void ReplicateAllToProviderB() { ReplicateAll(A().Provider(), B().Provider()); } public object QueryItem(ITestableReplicationProviderInside provider, Type type) { IObjectSet result = provider.GetStoredObjects(type); Assert.AreEqual(1, result.Count); return result.Next(); } public abstract object CreateItem(); public abstract void EnsureContent(ITestableReplicationProviderInside provider); } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericListTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericL0000644000175000017500000000341411520622640032675 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Drs.Inside; using Db4oUnit; using Db4oUnit.Fixtures; namespace Db4objects.Drs.Tests.Regression { class GenericListTestCase : GenericCollectionTestCaseBase { public class RootContainer : Container { public RootContainer(string name, IEnumerable items) : base(name, items) { } } public override object CreateItem() { return new RootContainer("ROOT", (IEnumerable) SubjectFixtureProvider.Value()); } public override void EnsureContent(ITestableReplicationProviderInside provider) { Container replicated = (Container) QueryItem(provider, typeof(RootContainer)); Container expected = (Container) CreateItem(); Assert.AreSame(expected.GetType(), replicated.GetType()); Assert.AreNotSame(expected, replicated); Assert.AreEqual(expected._name, replicated._name); Iterator4Assert.AreEqual(expected._items.GetEnumerator(), replicated._items.GetEnumerator()); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/Container.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/Containe0000644000175000017500000000241211520622640032742 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; namespace Db4objects.Drs.Tests.Regression { public class Container { public string _name; public IEnumerable _items; public Container(string name, IEnumerable items) { _name = name; _items = items; } public override string ToString() { return string.Format("Container({0})", _name); } public override bool Equals(object obj) { Container other = obj as Container; if (null == other) return false; return _name == other._name; } public override int GetHashCode() { return _name.GetHashCode(); } } }././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/DelegateTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/Delegate0000644000175000017500000000615211520622640032721 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using Db4objects.Db4o; using Db4oUnit; namespace Db4objects.Drs.Tests.Regression { class DelegateTestCase : DrsTestCase { public class Item { public event EventHandler Foo; public string Value; public object untyped; public object[] array; public Item(string value) { Value = value; } public int HandlerCount { get { if (Foo == null) return 0; return Foo.GetInvocationList().Length; } } } public void TestDelegateFields() { Item item = new Item("the item"); item.Foo += delegate { }; item.untyped = StringAction(); item.array = new object[] { StringAction() }; Item replicated = Replicate(item); Assert.IsNotNull(replicated); Assert.AreEqual(item.Value, replicated.Value); Assert.AreEqual(0, replicated.HandlerCount); Assert.IsNull(replicated.untyped); Assert.AreEqual(1, replicated.array.Length); Assert.IsNull(replicated.array[0]); } private static Action StringAction() { return new System.Action(Console.WriteLine); } public class DictionaryHolder { public Dictionary> actionDictionary; public object untyped; public object[] array; } public void TestDictionaryHolder() { DictionaryHolder item = new DictionaryHolder(); item.actionDictionary = NewActionDictionary(); item.untyped = NewActionDictionary(); item.array = new object[] { NewActionDictionary() }; DictionaryHolder replicated = Replicate(item); Assert.IsNotNull(replicated.actionDictionary); Assert.IsNotNull(replicated.untyped); Assert.IsNotNull(replicated.array[0]); } private static Dictionary> NewActionDictionary() { Dictionary> d = new Dictionary>(); d["print"] = StringAction(); return d; } private T Replicate(T item) { StoreToA(item); ReplicateAll(); return QueryReplicated(); } private T QueryReplicated() { IObjectSet found = B().Provider().GetStoredObjects(typeof(T)); Assert.AreEqual(1, found.Count); return (T)found.Next(); } private void ReplicateAll() { ReplicateAll(A().Provider(), B().Provider()); } private void StoreToA(object item) { A().Provider().StoreNew(item); A().Provider().Commit(); } } } ././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericDictionaryTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Db4objects.Drs.Tests/Regression/GenericD0000644000175000017500000000410311520622640032661 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Collections; using Db4objects.Drs.Inside; using Db4oUnit; namespace Db4objects.Drs.Tests.Regression { class GenericDictionaryTestCase : GenericCollectionTestCaseBase { public class Container { public string _name; public IDictionary _items; public Container(string name, IDictionary items) { _name = name; _items = items; } } public override object CreateItem() { Dictionary dictionary = new Dictionary(); for (int i = 0; i < 10; i++) { dictionary.Add("Key " + i, i); } Container container = new Container("Dictionary Item", dictionary); return container; } public override void EnsureContent(ITestableReplicationProviderInside provider) { Container replicated = (Container)QueryItem(provider, typeof(Container)); Container expected = (Container)CreateItem(); Assert.AreNotSame(expected, replicated); Assert.AreEqual(expected._name, replicated._name); Iterator4Assert.AreEqual(expected._items.GetEnumerator(), replicated._items.GetEnumerator()); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Sharpen.Util/0000755000175000017500000000000011520622056025642 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/native/Sharpen.Util/IdentityHashMap.cs0000644000175000017500000000240311520622640031222 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; namespace Sharpen.Util { public class IdentityHashMap : Hashtable { public IdentityHashMap() : base(EqualityComparer.Default) { } public override void Add(object key, object value) { this[key] = value; } class EqualityComparer : IEqualityComparer { public static readonly IEqualityComparer Default = new EqualityComparer(); public bool Equals(object x, object y) { return x == y; } public int GetHashCode(object obj) { return Sharpen.Runtime.IdentityHashCode(obj); } } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests-2008.sln0000644000175000017500000000666411520622054026772 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "..\..\Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-2008", "..\..\Db4oUnit\Db4oUnit-2008.csproj", "{8F82F8B0-95B6-4553-BDA8-BD9A954E682F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-2008", "..\..\Db4oUnit.Extensions\Db4oUnit.Extensions-2008.csproj", "{9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Drs-2008", "..\Db4objects.Drs\Db4objects.Drs-2008.csproj", "{B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Drs.Tests-2008", "Db4objects.Drs.Tests-2008.csproj", "{C0BA12AD-54B4-43B0-A570-0299F6253AC7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.CS-2008", "..\..\Db4objects.Db4o.CS\Db4objects.Db4o.CS-2008.csproj", "{9FA8178A-3E77-42C5-A252-6690EA9BA257}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.Build.0 = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.Build.0 = Release|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Debug|Any CPU.Build.0 = Debug|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B8BF0B55-AB4E-4335-80D1-DEDAD410FAD6}.Release|Any CPU.Build.0 = Release|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU {C0BA12AD-54B4-43B0-A570-0299F6253AC7}.Release|Any CPU.Build.0 = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Debug|Any CPU.Build.0 = Debug|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FA8178A-3E77-42C5-A252-6690EA9BA257}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/0000755000175000017500000000000011520622070025647 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicationEventTest.cs0000644000175000017500000001657111520622640032326 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ReplicationEventTest : DrsTestCase { private static readonly string InA = "in A"; private static readonly string ModifiedInA = "modified in A"; private static readonly string ModifiedInB = "modified in B"; private void EnsureNames(IDrsProviderFixture fixture, string parentName, string childName ) { EnsureOneInstanceOfParentAndChild(fixture); SPCParent parent = (SPCParent)GetOneInstance(fixture, typeof(SPCParent)); if (!parent.GetName().Equals(parentName)) { Sharpen.Runtime.Out.WriteLine("expected = " + parentName); Sharpen.Runtime.Out.WriteLine("actual = " + parent.GetName()); } Assert.AreEqual(parent.GetName(), parentName); Assert.AreEqual(childName, parent.GetChild().GetName()); } private void EnsureNotExist(ITestableReplicationProviderInside provider, Type type ) { Assert.IsTrue(!provider.GetStoredObjects(type).GetEnumerator().MoveNext()); } private void EnsureOneInstanceOfParentAndChild(IDrsProviderFixture fixture) { EnsureOneInstance(fixture, typeof(SPCParent)); EnsureOneInstance(fixture, typeof(SPCChild)); } private void ModifyInProviderA() { SPCParent parent = (SPCParent)GetOneInstance(A(), typeof(SPCParent)); parent.SetName(ModifiedInA); SPCChild child = parent.GetChild(); child.SetName(ModifiedInA); A().Provider().Update(parent); A().Provider().Update(child); A().Provider().Commit(); EnsureNames(A(), ModifiedInA, ModifiedInA); } private void ModifyInProviderB() { SPCParent parent = (SPCParent)GetOneInstance(B(), typeof(SPCParent)); parent.SetName(ModifiedInB); SPCChild child = parent.GetChild(); child.SetName(ModifiedInB); B().Provider().Update(parent); B().Provider().Update(child); B().Provider().Commit(); EnsureNames(B(), ModifiedInB, ModifiedInB); } private void ReplicateAllToProviderBFirstTime() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), InA, InA); EnsureNames(B(), InA, InA); } private void StoreParentAndChildToProviderA() { SPCChild child = new SPCChild(InA); SPCParent parent = new SPCParent(child, InA); A().Provider().StoreNew(parent); A().Provider().Commit(); EnsureNames(A(), InA, InA); } public virtual void TestNewObject() { StoreParentAndChildToProviderA(); ReplicationEventTest.BooleanClosure invoked = new ReplicationEventTest.BooleanClosure (false); IReplicationEventListener listener = new _IReplicationEventListener_203(invoked); ReplicateAll(A().Provider(), B().Provider(), listener); Assert.IsTrue(invoked.GetValue()); EnsureNames(A(), InA, InA); EnsureNotExist(B().Provider(), typeof(SPCParent)); EnsureNotExist(B().Provider(), typeof(SPCChild)); } private sealed class _IReplicationEventListener_203 : IReplicationEventListener { public _IReplicationEventListener_203(ReplicationEventTest.BooleanClosure invoked ) { this.invoked = invoked; } public void OnReplicate(IReplicationEvent @event) { invoked.SetValue(true); IObjectState stateA = @event.StateInProviderA(); IObjectState stateB = @event.StateInProviderB(); Assert.IsTrue(stateA.IsNew()); Assert.IsTrue(!stateB.IsNew()); Assert.IsNotNull(stateA.GetObject()); Assert.IsNull(stateB.GetObject()); @event.OverrideWith(null); } private readonly ReplicationEventTest.BooleanClosure invoked; } public virtual void TestNoAction() { StoreParentAndChildToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyInProviderB(); IReplicationEventListener listener = new _IReplicationEventListener_234(); //do nothing ReplicateAll(B().Provider(), A().Provider(), listener); EnsureNames(A(), ModifiedInB, ModifiedInB); EnsureNames(B(), ModifiedInB, ModifiedInB); } private sealed class _IReplicationEventListener_234 : IReplicationEventListener { public _IReplicationEventListener_234() { } public void OnReplicate(IReplicationEvent @event) { } } public virtual void TestOverrideWhenConflicts() { StoreParentAndChildToProviderA(); ReplicateAllToProviderBFirstTime(); //introduce conflicts ModifyInProviderA(); ModifyInProviderB(); IReplicationEventListener listener = new _IReplicationEventListener_254(); ReplicateAll(A().Provider(), B().Provider(), listener); EnsureNames(A(), ModifiedInB, ModifiedInB); EnsureNames(B(), ModifiedInB, ModifiedInB); } private sealed class _IReplicationEventListener_254 : IReplicationEventListener { public _IReplicationEventListener_254() { } public void OnReplicate(IReplicationEvent @event) { Assert.IsTrue(@event.IsConflict()); if (@event.IsConflict()) { @event.OverrideWith(@event.StateInProviderB()); } } } public virtual void TestOverrideWhenNoConflicts() { StoreParentAndChildToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyInProviderB(); IReplicationEventListener listener = new _IReplicationEventListener_274(); ReplicateAll(B().Provider(), A().Provider(), listener); EnsureNames(A(), InA, InA); EnsureNames(B(), InA, InA); } private sealed class _IReplicationEventListener_274 : IReplicationEventListener { public _IReplicationEventListener_274() { } public void OnReplicate(IReplicationEvent @event) { Assert.IsTrue(!@event.IsConflict()); @event.OverrideWith(@event.StateInProviderB()); } } public virtual void TestStopTraversal() { StoreParentAndChildToProviderA(); ReplicateAllToProviderBFirstTime(); //introduce conflicts ModifyInProviderA(); ModifyInProviderB(); IReplicationEventListener listener = new _IReplicationEventListener_295(); ReplicateAll(A().Provider(), B().Provider(), listener); EnsureNames(A(), ModifiedInA, ModifiedInA); EnsureNames(B(), ModifiedInB, ModifiedInB); } private sealed class _IReplicationEventListener_295 : IReplicationEventListener { public _IReplicationEventListener_295() { } public void OnReplicate(IReplicationEvent @event) { Assert.IsTrue(@event.IsConflict()); @event.OverrideWith(null); } } internal class BooleanClosure { private bool value; public BooleanClosure(bool value) { this.value = value; } internal virtual void SetValue(bool v) { value = v; } public virtual bool GetValue() { return value; } } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TransparentActivationTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TransparentActivationTestC0000644000175000017500000000364211520622640033070 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.TA; using Db4objects.Drs.Db4o; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; using Sharpen; namespace Db4objects.Drs.Tests { public class TransparentActivationTestCase : DrsTestCase { protected override void Configure(IConfiguration config) { config.Add(new TransparentActivationSupport()); } /// public virtual void Test() { ActivatableItem item = new ActivatableItem("foo"); A().Provider().StoreNew(item); A().Provider().Commit(); if (A().Provider() is IDb4oReplicationProvider) { // TODO: We can't reopen Hibernate providers here if // they run on an in-memory database. // db4o should be reopened, otherwise Transparent Activation // is not tested. Reopen(); } ReplicateAll(A().Provider(), B().Provider()); Runtime.Gc(); // Improve chances TA is really required IObjectSet items = B().Provider().GetStoredObjects(typeof(ActivatableItem)); Assert.IsTrue(items.HasNext()); ActivatableItem replicatedItem = (ActivatableItem)items.Next(); Assert.AreEqual(item.Name(), replicatedItem.Name()); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/IDrsProviderFixture.cs0000644000175000017500000000163311520622640032127 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Inside; namespace Db4objects.Drs.Tests { public interface IDrsProviderFixture { ITestableReplicationProviderInside Provider(); void Open(); void Close(); void Clean(); void Destroy(); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/UntypedFieldTestCase.cs0000644000175000017500000001003511520622640032230 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class UntypedFieldTestCase : DrsTestCase { public virtual void TestUntypedString() { AssertUntypedReplication("42"); } public virtual void TestUntypedStringArray() { AssertUntypedReplication(new object[] { "42" }); } public virtual void TestUntypedStringJaggedArray() { AssertJaggedArray("42"); } public virtual void TestUntypedReferenceTypeJaggedArray() { AssertJaggedArray(new UntypedFieldData(42)); } public virtual void TestUntypedDate() { AssertUntypedReplication(new DateTime(100, 2, 2)); } public virtual void TestUntypedDateArray() { AssertUntypedReplication(new object[] { new DateTime(100, 2, 2) }); } public virtual void TestUntypedMixedArray() { AssertUntypedReplication(new object[] { "42", new UntypedFieldData(42) }); Assert.AreEqual(42, ((UntypedFieldData)SingleReplicatedInstance(typeof(UntypedFieldData ))).GetId()); } public virtual void TestArrayAsCloneable() { object[] array = new object[] { "42", new UntypedFieldData(42) }; ItemWithCloneable replicated = (ItemWithCloneable)Replicate(new ItemWithCloneable (array)); AssertEquals(array, replicated.value); } private void AssertUntypedReplication(object data) { AssertEquals(data, ReplicateItem(data).GetUntyped()); } private void AssertJaggedArray(object data) { object[] expected = new object[] { new object[] { data } }; object[] actual = (object[])ReplicateItem(expected).GetUntyped(); Assert.AreEqual(expected.Length, actual.Length); object[] nested = (object[])actual[0]; object actualValue = nested[0]; Assert.AreEqual(data, actualValue); AssertNotSame(data, actualValue); } private void AssertNotSame(object expectedReference, object actual) { if (!IsPrimitive(expectedReference.GetType())) { Assert.AreNotSame(expectedReference, actual); } } private bool IsPrimitive(Type klass) { if (klass.IsPrimitive) { return true; } if (klass == typeof(string)) { return true; } if (klass == typeof(DateTime)) { return true; } return false; } private void AssertEquals(object expected, object actual) { if (expected is object[]) { AssertEquals((object[])expected, (object[])actual); } else { Assert.AreEqual(expected, actual); AssertNotSame(expected, actual); } } private void AssertEquals(object[] expectedArray, object[] actualArray) { ArrayAssert.AreEqual(expectedArray, actualArray); for (int i = 0; i < expectedArray.Length; ++i) { AssertNotSame(expectedArray[i], actualArray[i]); } } private UntypedFieldItem ReplicateItem(object data) { return (UntypedFieldItem)Replicate(new UntypedFieldItem(data)); } private object Replicate(object item) { A().Provider().StoreNew(item); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider()); return SingleReplicatedInstance(item.GetType()); } private object SingleReplicatedInstance(Type klass) { IObjectSet found = B().Provider().GetStoredObjects(klass); Assert.AreEqual(1, found.Count); return found[0]; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oDb4oDrsTestSuite.cs0000644000175000017500000000211311520622636032027 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class Db4oDb4oDrsTestSuite : ITestSuiteBuilder, IDb4oTestCase { public virtual IEnumerator GetEnumerator() { return new DrsTestSuiteBuilder(new Db4oDrsFixture("db4o-a"), new Db4oDrsFixture("db4o-b" ), typeof(Db4oDrsTestSuite)).GetEnumerator(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TheSimplestTestSuite.cs0000644000175000017500000000721411520622640032320 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class TheSimplestTestSuite : FixtureBasedTestSuite { public class TheSimplest : DrsTestCase { public virtual void Test() { StoreInA(); Replicate(); ModifyInB(); Replicate2(); ModifyInA(); Replicate3(); } private void Replicate3() { ReplicateClass(A().Provider(), B().Provider(), typeof(SPCChild)); EnsureNames(A(), "c3"); EnsureNames(B(), "c3"); } private void ModifyInA() { SPCChild child = GetTheObject(A()); child.SetName("c3"); A().Provider().Update(child); A().Provider().Commit(); EnsureNames(A(), "c3"); } private void Replicate2() { ReplicateAll(B().Provider(), A().Provider()); EnsureNames(A(), "c2"); EnsureNames(B(), "c2"); } private void StoreInA() { SPCChild child = new SPCChild("c1"); A().Provider().StoreNew(child); A().Provider().Commit(); EnsureNames(A(), "c1"); } private void Replicate() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), "c1"); EnsureNames(B(), "c1"); } private void ModifyInB() { SPCChild child = GetTheObject(B()); child.SetName("c2"); B().Provider().Update(child); B().Provider().Commit(); EnsureNames(B(), "c2"); } private void EnsureNames(IDrsProviderFixture fixture, string childName) { EnsureOneInstance(fixture, typeof(SPCChild)); SPCChild child = GetTheObject(fixture); Assert.AreEqual(childName, child.GetName()); } private SPCChild GetTheObject(IDrsProviderFixture fixture) { return (SPCChild)GetOneInstance(fixture, typeof(SPCChild)); } protected override void ReplicateClass(ITestableReplicationProviderInside providerA , ITestableReplicationProviderInside providerB, Type clazz) { //System.out.println("ReplicationTestcase.replicateClass"); IReplicationSession replication = Replication.Begin(providerA, providerB, null, _fixtures .reflector); IEnumerator allObjects = providerA.ObjectsChangedSinceLastReplication(clazz).GetEnumerator (); while (allObjects.MoveNext()) { object obj = allObjects.Current; //System.out.println("obj = " + obj); replication.Replicate(obj); } replication.Commit(); } } private static readonly FixtureVariable ConstructorConfigFixture = new FixtureVariable ("config"); public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SimpleFixtureProvider(TheSimplestTestSuite.ConstructorConfigFixture , new object[] { false, true }) }; } public override Type[] TestUnits() { return new Type[] { typeof(TheSimplestTestSuite.TheSimplest) }; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/PerformanceTestCase.cs0000644000175000017500000001306511520622640032103 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class PerformanceTestCase : DrsTestCase { private static int ListHolderCount = 10; private static int ObjectCount = 100; private static int TotalObjectCount = ListHolderCount + (ListHolderCount * ObjectCount * 2); public virtual void Test() { Sharpen.Runtime.Out.WriteLine("**** Simple Replication Performance Test ****"); long duration = StopWatch.Time(new _IBlock4_24(this)); Sharpen.Runtime.Out.WriteLine("**** Total time taken " + duration + "ms ****"); } private sealed class _IBlock4_24 : IBlock4 { public _IBlock4_24(PerformanceTestCase _enclosing) { this._enclosing = _enclosing; } public void Run() { Sharpen.Runtime.Out.WriteLine("Storing in " + this._enclosing.A().Provider().GetName ()); this._enclosing.StoreInA(); Sharpen.Runtime.Out.WriteLine("Replicating " + this._enclosing.A().Provider().GetName () + " to " + this._enclosing.B().Provider().GetName()); this._enclosing.Replicate(this._enclosing.A().Provider(), this._enclosing.B().Provider ()); Sharpen.Runtime.Out.WriteLine("Modifying in " + this._enclosing.B().Provider().GetName ()); this._enclosing.ModifyInB(); Sharpen.Runtime.Out.WriteLine("Replicating " + this._enclosing.B().Provider().GetName () + " to " + this._enclosing.A().Provider().GetName()); this._enclosing.Replicate(this._enclosing.B().Provider(), this._enclosing.A().Provider ()); } private readonly PerformanceTestCase _enclosing; } private void StoreInA() { long duration = StopWatch.Time(new _IBlock4_40(this)); Sharpen.Runtime.Out.WriteLine("Time to store " + TotalObjectCount + " objects: " + duration + "ms"); } private sealed class _IBlock4_40 : IBlock4 { public _IBlock4_40(PerformanceTestCase _enclosing) { this._enclosing = _enclosing; } public void Run() { for (int i = 0; i < PerformanceTestCase.ListHolderCount; i++) { SimpleListHolder listHolder = new SimpleListHolder("CreatedHolder"); for (int j = 0; j < PerformanceTestCase.ObjectCount; j++) { SimpleItem child = new SimpleItem("CreatedChild"); SimpleItem parent = new SimpleItem(listHolder, child, "CreatedParent"); this._enclosing.A().Provider().StoreNew(parent); listHolder.Add(parent); } this._enclosing.A().Provider().StoreNew(listHolder); this._enclosing.A().Provider().Commit(); } this._enclosing.A().Provider().Commit(); } private readonly PerformanceTestCase _enclosing; } private void Replicate(ITestableReplicationProviderInside from, ITestableReplicationProviderInside to) { long duration = StopWatch.Time(new _IBlock4_60(this, from, to)); Sharpen.Runtime.Out.WriteLine("Time to replicate " + TotalObjectCount + " objects: " + duration + "ms"); } private sealed class _IBlock4_60 : IBlock4 { public _IBlock4_60(PerformanceTestCase _enclosing, ITestableReplicationProviderInside from, ITestableReplicationProviderInside to) { this._enclosing = _enclosing; this.from = from; this.to = to; } public void Run() { this._enclosing.ReplicateAll(from, to); } private readonly PerformanceTestCase _enclosing; private readonly ITestableReplicationProviderInside from; private readonly ITestableReplicationProviderInside to; } private void ModifyInB() { long duration = StopWatch.Time(new _IBlock4_69(this)); Sharpen.Runtime.Out.WriteLine("Time to update " + TotalObjectCount + " objects: " + duration + "ms"); } private sealed class _IBlock4_69 : IBlock4 { public _IBlock4_69(PerformanceTestCase _enclosing) { this._enclosing = _enclosing; } public void Run() { IObjectSet storedObjects = this._enclosing.B().Provider().GetStoredObjects(typeof( SimpleListHolder)); while (storedObjects.HasNext()) { SimpleListHolder listHolder = (SimpleListHolder)storedObjects.Next(); listHolder.SetName("modifiedHolder"); IEnumerator i = listHolder.GetList().GetEnumerator(); while (i.MoveNext()) { SimpleItem parent = (SimpleItem)i.Current; parent.SetValue("ModifiedParent"); this._enclosing.B().Provider().Update(parent); SimpleItem child = parent.GetChild(); child.SetValue("ModifiedChild"); this._enclosing.B().Provider().Update(child); this._enclosing.B().Provider().Commit(); } this._enclosing.B().Provider().Update(listHolder); this._enclosing.B().Provider().Update(listHolder.GetList()); } } private readonly PerformanceTestCase _enclosing; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ArrayTestSuite.cs0000644000175000017500000000557411520622636031151 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Handlers.Array; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ArrayTestSuite : FixtureBasedTestSuite { public class TestUnit : DrsTestCase { public virtual void Test() { ItemWithUntypedField item = new ItemWithUntypedField(Subject()); StoreToProviderA(item); ReplicatedAllToB(); ItemWithUntypedField replicated = ReplicatedItem(); Assert.IsNotNull(replicated.Array()); Iterator4Assert.AreEqual(ArrayIterator(item.Array()), ArrayIterator(replicated.Array ())); } private IEnumerator ArrayIterator(object array) { return ArrayHandler.Iterator(ReflectClass(array), array); } private IReflectClass ReflectClass(object array) { return GenericReflector().ForObject(array); } private Db4objects.Db4o.Reflect.Generic.GenericReflector GenericReflector() { return new Db4objects.Db4o.Reflect.Generic.GenericReflector(null, Platform4.ReflectorForType (GetType())); } private void ReplicatedAllToB() { ReplicateAll(A().Provider(), B().Provider()); } private void StoreToProviderA(ItemWithUntypedField item) { A().Provider().StoreNew(item); A().Provider().Commit(); } private ItemWithUntypedField ReplicatedItem() { IEnumerator iterator = B().Provider().GetStoredObjects(typeof(ItemWithUntypedField )).GetEnumerator(); if (iterator.MoveNext()) { return (ItemWithUntypedField)iterator.Current; } return null; } private object Subject() { return SubjectFixtureProvider.Value(); } } public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SubjectFixtureProvider(new object[] { new object [] { }, new string[] { "foo", "bar" }, new int[] { 42, -1, 0 }, new int[][] { } , new DateTime[] { new DateTime() } }) }; } public override Type[] TestUnits() { return new Type[] { typeof(ArrayTestSuite.TestUnit) }; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Staging/0000755000175000017500000000000011520622064027246 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Staging/MapElementCustomHashCodeTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Staging/MapElementCustomHa0000644000175000017500000000274311520622640032672 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Staging; namespace Db4objects.Drs.Tests.Staging { public class MapElementCustomHashCodeTestCase : EqualsHashCodeOverriddenTestCaseBase { public class Holder { internal IDictionary _map = new Hashtable(); public Holder(EqualsHashCodeOverriddenTestCaseBase.Item itemA, EqualsHashCodeOverriddenTestCaseBase.Item itemB) { // DRS-118 // NOTE: This test does not necessarily reproduce the symptom. _map[itemA] = itemA; _map[itemB] = itemB; } } public virtual void TestReplicatesMap() { AssertReplicates(new MapElementCustomHashCodeTestCase.Holder(new EqualsHashCodeOverriddenTestCaseBase.Item ("item"), new EqualsHashCodeOverriddenTestCaseBase.Item("item"))); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oClientServerDrsFixture.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oClientServerDrsFixture0000644000175000017500000000401311520622636032736 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Db4o.CS; using Db4objects.Db4o.CS.Internal.Config; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Db4o; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class Db4oClientServerDrsFixture : Db4oDrsFixture { private static readonly string Host = "localhost"; private static readonly string Username = "db4o"; private static readonly string Password = Username; private IObjectServer _server; private int _port; public Db4oClientServerDrsFixture(string name, int port) : base(name) { _port = port; } public override void Close() { base.Close(); _server.Close(); } public override void Open() { Config().MessageLevel(-1); _server = Db4oClientServer.OpenServer(Db4oClientServerLegacyConfigurationBridge.AsServerConfiguration (CloneConfiguration()), testFile.GetPath(), _port); _server.GrantAccess(Username, Password); _db = Db4oClientServer.OpenClient(Db4oClientServerLegacyConfigurationBridge.AsClientConfiguration (CloneConfiguration()), Host, _port, Username, Password).Ext(); _provider = Db4oProviderFactory.NewInstance(_db, _name); } private IConfiguration CloneConfiguration() { return (IConfiguration)((IDeepClone)Config()).DeepClone(Config()); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4o/0000755000175000017500000000000011520622070026437 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016700000000000011571 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4o/PartialCollectionReplicationTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4o/PartialCollectionRepl0000644000175000017500000001741411520622636032634 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4oUnit; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Db4o; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Db4o; namespace Db4objects.Drs.Tests.Db4o { public class PartialCollectionReplicationTestCase : DrsTestCase { public class Data { private IList _children; private string _id; public Data(string id) { _id = id; _children = new ArrayList(); } public virtual object Id() { return _id; } public virtual void Id(string id) { _id = id; } public virtual void Add(PartialCollectionReplicationTestCase.Data data) { _children.Add(data); } public override string ToString() { return "Data(" + _id + ", " + _children + ")"; } } public virtual void TestNoReplicationForUntouchedElements() { PartialCollectionReplicationTestCase.Data root = new PartialCollectionReplicationTestCase.Data ("root"); PartialCollectionReplicationTestCase.Data c1 = new PartialCollectionReplicationTestCase.Data ("c1"); PartialCollectionReplicationTestCase.Data c2 = new PartialCollectionReplicationTestCase.Data ("c2"); root.Add(c1); root.Add(c2); Store(root, 1); IList created = ReplicateAllCapturingCreatedObjects (); AssertData(created, "root", "c1", "c2"); PartialCollectionReplicationTestCase.Data c3 = new PartialCollectionReplicationTestCase.Data ("c3"); root.Add(c3); Store(root, 2); c2.Id("c2*"); c2.Add(new PartialCollectionReplicationTestCase.Data("c4")); IList updated = ReplicateAllCapturingUpdatedObjects (); } // The following fails after cleaning references has been removed from #replicate(obj) // assertData(updated, "c3", "root"); private void AssertData(IEnumerable data , params string[] expectedIds) { Iterator4Assert.SameContent(expectedIds, Ids(data)); } private IEnumerator Ids(IEnumerable data ) { Collection4 ids = new Collection4(); foreach (PartialCollectionReplicationTestCase.Data d in data) { ids.Add(d.Id()); } return ids.GetEnumerator(); } private IList ReplicateAllCapturingUpdatedObjects () { IList changed = new List(); ListenToUpdated(changed); ListenToCreated(changed); ReplicateAll(); return changed; } private IList ReplicateAllCapturingCreatedObjects () { IList created = new List(); ListenToCreated(created); ReplicateAll(); return created; } private void ListenToUpdated(IList updated ) { EventRegistryFor(B()).Updated += new System.EventHandler (new _IEventListener4_97(this, updated).OnEvent); } private sealed class _IEventListener4_97 { public _IEventListener4_97(PartialCollectionReplicationTestCase _enclosing, IList updated) { this._enclosing = _enclosing; this.updated = updated; } public void OnEvent(object sender, Db4objects.Db4o.Events.ObjectInfoEventArgs args ) { object o = ((ObjectEventArgs)args).Object; if (o is PartialCollectionReplicationTestCase.Data) { updated.Add((PartialCollectionReplicationTestCase.Data)o); } this._enclosing.Ods(o); } private readonly PartialCollectionReplicationTestCase _enclosing; private readonly IList updated; } private void ReplicateAll() { Ods("BEGIN REPLICATION"); ReplicateAll(A().Provider(), B().Provider()); Ods("END REPLICATION"); } private void ListenToCreated(IList created ) { EventRegistryFor(B()).Created += new System.EventHandler (new _IEventListener4_115(this, created).OnEvent); } private sealed class _IEventListener4_115 { public _IEventListener4_115(PartialCollectionReplicationTestCase _enclosing, IList created) { this._enclosing = _enclosing; this.created = created; } public void OnEvent(object sender, Db4objects.Db4o.Events.ObjectInfoEventArgs args ) { object o = ((ObjectEventArgs)args).Object; if (o is PartialCollectionReplicationTestCase.Data) { created.Add((PartialCollectionReplicationTestCase.Data)o); } this._enclosing.Ods(o); } private readonly PartialCollectionReplicationTestCase _enclosing; private readonly IList created; } private IEventRegistry EventRegistryFor(IDrsProviderFixture fixture) { return EventRegistryFactory.ForObjectContainer(ContainerFor(fixture)); } public virtual void TestCollectionUpdateDoesNotTouchExistingElements() { PartialCollectionReplicationTestCase.Data root = new PartialCollectionReplicationTestCase.Data ("root"); PartialCollectionReplicationTestCase.Data c1 = new PartialCollectionReplicationTestCase.Data ("c1"); PartialCollectionReplicationTestCase.Data c2 = new PartialCollectionReplicationTestCase.Data ("c2"); root.Add(c1); root.Add(c2); Store(root, 1); long c1Version = VersionFor(c1); long c2Version = VersionFor(c2); PartialCollectionReplicationTestCase.Data c3 = new PartialCollectionReplicationTestCase.Data ("c3"); root.Add(c3); Store(root, 2); Assert.IsGreater(0, VersionFor(c3)); Assert.AreEqual(c1Version, VersionFor(c1)); Assert.AreEqual(c2Version, VersionFor(c2)); } private void Store(PartialCollectionReplicationTestCase.Data root, int depth) { IExtObjectContainer container = ContainerFor(A()); container.Ext().Store(root, depth); container.Commit(); } private IExtObjectContainer ContainerFor(IDrsProviderFixture fixture) { return ((IDb4oReplicationProvider)fixture.Provider()).GetObjectContainer(); } private long VersionFor(PartialCollectionReplicationTestCase.Data c1) { return ObjectInfoFor(c1).GetCommitTimestamp(); } private IObjectInfo ObjectInfoFor(PartialCollectionReplicationTestCase.Data c1) { return ContainerFor(A()).Ext().GetObjectInfo(c1); } private void Ods(object o) { } // System.out.println(o); public static void Main(string[] args) { new ConsoleTestRunner(new DrsTestSuiteBuilder(new Db4oDrsFixture("db4o-a"), new Db4oDrsFixture ("db4o-b"), typeof(PartialCollectionReplicationTestCase))).Run(); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicationAfterDeletionTest.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicationAfterDeletionTe0000644000175000017500000000245211520622640033010 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ReplicationAfterDeletionTest : DrsTestCase { public virtual void Test() { Replicate(); Clean(); Replicate(); Clean(); } protected override void Clean() { Delete(new Type[] { typeof(SPCChild), typeof(SPCParent) }); } private void Replicate() { SPCChild child = new SPCChild("c1"); SPCParent parent = new SPCParent(child, "p1"); A().Provider().StoreNew(parent); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider()); } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/CollectionHandlerImplTest.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/CollectionHandlerImplTest.0000644000175000017500000000410511520622636032733 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class CollectionHandlerImplTest : DrsTestCase { private CollectionHandlerImpl _collectionHandler; public virtual void TestVector() { ArrayList vector = new ArrayList(); Assert.IsTrue(CollectionHandler().CanHandle(vector)); Assert.IsTrue(CollectionHandler().CanHandleClass(ReplicationReflector().ForObject (vector))); Assert.IsTrue(CollectionHandler().CanHandleClass(typeof(ArrayList))); } public virtual void TestMap() { IDictionary map = new Hashtable(); Assert.IsTrue(CollectionHandler().CanHandle(map)); Assert.IsTrue(CollectionHandler().CanHandleClass(ReplicationReflector().ForObject (map))); Assert.IsTrue(CollectionHandler().CanHandleClass(typeof(IDictionary))); } public virtual void TestString() { string str = "abc"; Assert.IsTrue(!CollectionHandler().CanHandle(str)); Assert.IsTrue(!CollectionHandler().CanHandleClass(ReplicationReflector().ForObject (str))); Assert.IsTrue(!CollectionHandler().CanHandleClass(typeof(string))); } private Db4objects.Drs.Inside.ICollectionHandler CollectionHandler() { if (_collectionHandler == null) { _collectionHandler = new CollectionHandlerImpl(ReplicationReflector()); } return _collectionHandler; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/SimpleArrayTest.cs0000644000175000017500000001030711520622640031272 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class SimpleArrayTest : DrsTestCase { public virtual void Test() { StoreListToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyInProviderB(); ReplicateAllStep2(); AddElementInProviderA(); ReplicateHolderStep3(); } protected override void Clean() { Delete(new Type[] { typeof(SimpleArrayHolder), typeof(SimpleArrayContent) }); } private void StoreListToProviderA() { SimpleArrayHolder sah = new SimpleArrayHolder("h1"); SimpleArrayContent sac1 = new SimpleArrayContent("c1"); SimpleArrayContent sac2 = new SimpleArrayContent("c2"); sah.Add(sac1); sah.Add(sac2); A().Provider().StoreNew(sah); A().Provider().Commit(); EnsureContent(A(), new string[] { "h1" }, new string[] { "c1", "c2" }); } private void ReplicateAllToProviderBFirstTime() { ReplicateAll(A().Provider(), B().Provider()); EnsureContent(A(), new string[] { "h1" }, new string[] { "c1", "c2" }); EnsureContent(B(), new string[] { "h1" }, new string[] { "c1", "c2" }); } private void ModifyInProviderB() { SimpleArrayHolder sah = (SimpleArrayHolder)GetOneInstance(B(), typeof(SimpleArrayHolder )); sah.SetName("h2"); SimpleArrayContent sac1 = sah.GetArr()[0]; SimpleArrayContent sac2 = sah.GetArr()[1]; sac1.SetName("co1"); sac2.SetName("co2"); B().Provider().Update(sac1); B().Provider().Update(sac2); B().Provider().Update(sah); B().Provider().Commit(); EnsureContent(B(), new string[] { "h2" }, new string[] { "co1", "co2" }); } private void ReplicateAllStep2() { ReplicateAll(B().Provider(), A().Provider()); EnsureContent(B(), new string[] { "h2" }, new string[] { "co1", "co2" }); EnsureContent(A(), new string[] { "h2" }, new string[] { "co1", "co2" }); } private void AddElementInProviderA() { SimpleArrayHolder sah = (SimpleArrayHolder)GetOneInstance(A(), typeof(SimpleArrayHolder )); sah.SetName("h3"); SimpleArrayContent lc3 = new SimpleArrayContent("co3"); A().Provider().StoreNew(lc3); sah.Add(lc3); A().Provider().Update(sah); A().Provider().Commit(); EnsureContent(A(), new string[] { "h3" }, new string[] { "co1", "co2", "co3" }); } private void ReplicateHolderStep3() { ReplicateClass(A().Provider(), B().Provider(), typeof(SimpleArrayHolder)); EnsureContent(A(), new string[] { "h3" }, new string[] { "co1", "co2", "co3" }); EnsureContent(B(), new string[] { "h3" }, new string[] { "co1", "co2", "co3" }); } private void EnsureContent(IDrsProviderFixture fixture, string[] holderNames, string [] contentNames) { int holderCount = holderNames.Length; int contentCount = contentNames.Length; EnsureInstanceCount(fixture, typeof(SimpleArrayHolder), holderCount); EnsureInstanceCount(fixture, typeof(SimpleArrayContent), contentCount); int i = 0; IObjectSet objectSet = fixture.Provider().GetStoredObjects(typeof(SimpleArrayHolder )); IEnumerator iterator = objectSet.GetEnumerator(); while (iterator.MoveNext()) { SimpleArrayHolder lh = (SimpleArrayHolder)iterator.Current; Assert.AreEqual(holderNames[i], lh.GetName()); SimpleArrayContent[] sacs = lh.GetArr(); for (int j = 0; j < contentNames.Length; j++) { Assert.AreEqual(contentNames[j], sacs[j].GetName()); } } } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/SameHashCodeTestCase.cs0000644000175000017500000000257511520622640032132 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class SameHashCodeTestCase : EqualsHashCodeOverriddenTestCaseBase { public class Holder { internal EqualsHashCodeOverriddenTestCaseBase.Item _itemA; internal EqualsHashCodeOverriddenTestCaseBase.Item _itemB; public Holder(EqualsHashCodeOverriddenTestCaseBase.Item itemA, EqualsHashCodeOverriddenTestCaseBase.Item itemB) { _itemA = itemA; _itemB = itemB; } } public virtual void TestReplicatesSimpleHolder() { AssertReplicates(new SameHashCodeTestCase.Holder(new EqualsHashCodeOverriddenTestCaseBase.Item ("item"), new EqualsHashCodeOverriddenTestCaseBase.Item("item"))); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/UuidConversionTestCase.cs0000644000175000017500000000344711520622640032621 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class UuidConversionTestCase : DrsTestCase { public virtual void Test() { SPCChild child = StoreInA(); Replicate(); IReplicationReference @ref = A().Provider().ProduceReference(child); B().Provider().ClearAllReferences(); IDrsUUID expectedUuid = @ref.Uuid(); IReplicationReference referenceByUUID = B().Provider().ProduceReferenceByUUID(expectedUuid , null); Assert.IsNotNull(referenceByUUID); IDrsUUID actualUuid = referenceByUUID.Uuid(); Assert.AreEqual(expectedUuid.GetLongPart(), actualUuid.GetLongPart()); } private SPCChild StoreInA() { string name = "c1"; SPCChild child = CreateChildObject(name); A().Provider().StoreNew(child); A().Provider().Commit(); return child; } private void Replicate() { ReplicateAll(A().Provider(), B().Provider()); } protected virtual SPCChild CreateChildObject(string name) { return new SPCChild(name); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/CollectionAssert.cs0000644000175000017500000000222411520622636031463 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class CollectionAssert { public static void AreEqual(IEnumerable expected, IEnumerable actual) { Iterator4Assert.AreEqual(CollectionAssert.Adapt(expected.GetEnumerator()), CollectionAssert .Adapt(actual.GetEnumerator())); } internal static IEnumerator Adapt(IEnumerator iterator) { return ReplicationTestPlatform.Adapt(iterator); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/VersantDrsTestSuite.cs0000644000175000017500000000204711520622640032151 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class VersantDrsTestSuite : DrsTestSuite { protected override Type[] TestCases() { return Concat(base.TestCases(), SpecificTestcases()); } private Type[] SpecificTestcases() { return new Type[] { typeof(ArrayTestSuite), typeof(CustomArrayListTestCase) }; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TheSimplest.cs0000644000175000017500000000614311520622640030446 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class TheSimplest : DrsTestCase { public virtual void Test() { StoreInA(); Replicate(); ModifyInB(); Replicate2(); ModifyInA(); Replicate3(); } private void StoreInA() { string name = "c1"; SPCChild child = CreateChildObject(name); A().Provider().StoreNew(child); A().Provider().Commit(); EnsureNames(A(), "c1"); } private void Replicate() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), "c1"); EnsureNames(B(), "c1"); } private void ModifyInB() { SPCChild child = GetTheObject(B()); child.SetName("c2"); B().Provider().Update(child); B().Provider().Commit(); EnsureNames(B(), "c2"); } private void Replicate2() { ReplicateAll(B().Provider(), A().Provider()); EnsureNames(A(), "c2"); EnsureNames(B(), "c2"); } private void ModifyInA() { SPCChild child = GetTheObject(A()); child.SetName("c3"); A().Provider().Update(child); A().Provider().Commit(); EnsureNames(A(), "c3"); } private void Replicate3() { ReplicateClass(A().Provider(), B().Provider(), typeof(SPCChild)); EnsureNames(A(), "c3"); EnsureNames(B(), "c3"); } protected virtual SPCChild CreateChildObject(string name) { return new SPCChild(name); } private void EnsureNames(IDrsProviderFixture fixture, string childName) { EnsureOneInstance(fixture, typeof(SPCChild)); SPCChild child = GetTheObject(fixture); Assert.AreEqual(childName, child.GetName()); } private SPCChild GetTheObject(IDrsProviderFixture fixture) { return (SPCChild)GetOneInstance(fixture, typeof(SPCChild)); } protected override void ReplicateClass(ITestableReplicationProviderInside providerA , ITestableReplicationProviderInside providerB, Type clazz) { IReplicationSession replication = Replication.Begin(providerA, providerB, _fixtures .reflector); IEnumerator allObjects = providerA.ObjectsChangedSinceLastReplication(clazz).GetEnumerator (); while (allObjects.MoveNext()) { object obj = allObjects.Current; //System.out.println("obj = " + obj); replication.Replicate(obj); } replication.Commit(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ByteArrayTest.cs0000644000175000017500000000614111520622636030752 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { /// /// Design of this case is copied from /// com.db4o.db4ounit.common.types.arrays.ByteArrayTestCase. /// /// /// Design of this case is copied from /// com.db4o.db4ounit.common.types.arrays.ByteArrayTestCase. /// public class ByteArrayTest : DrsTestCase { internal const int ArrayLength = 5; internal static byte[] initial = CreateByteArray(); internal static byte[] modInB = new byte[] { 2, 3, 5, 68, 69 }; internal static byte[] modInA = new byte[] { 15, 36, 55, 8, 9, 28, 65 }; public virtual void Test() { StoreInA(); Replicate(); ModifyInB(); Replicate2(); ModifyInA(); Replicate3(); } private void StoreInA() { IIByteArrayHolder byteArrayHolder = new ByteArrayHolder(CreateByteArray()); A().Provider().StoreNew(byteArrayHolder); A().Provider().Commit(); EnsureNames(A(), initial); } private void Replicate() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), initial); EnsureNames(B(), initial); } private void ModifyInB() { IIByteArrayHolder c = GetTheObject(B()); c.SetBytes(modInB); B().Provider().Update(c); B().Provider().Commit(); EnsureNames(B(), modInB); } private void Replicate2() { ReplicateAll(B().Provider(), A().Provider()); EnsureNames(A(), modInB); EnsureNames(B(), modInB); } private void ModifyInA() { IIByteArrayHolder c = GetTheObject(A()); c.SetBytes(modInA); A().Provider().Update(c); A().Provider().Commit(); EnsureNames(A(), modInA); } private void Replicate3() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), modInA); EnsureNames(B(), modInA); } private void EnsureNames(IDrsProviderFixture fixture, byte[] bs) { EnsureOneInstance(fixture, typeof(ByteArrayHolder)); IIByteArrayHolder c = GetTheObject(fixture); ArrayAssert.AreEqual(c.GetBytes(), bs); } private IIByteArrayHolder GetTheObject(IDrsProviderFixture fixture) { return (ByteArrayHolder)GetOneInstance(fixture, typeof(ByteArrayHolder)); } internal static byte[] CreateByteArray() { byte[] bytes = new byte[ArrayLength]; for (byte i = 0; i < bytes.Length; ++i) { bytes[i] = i; } return bytes; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/0000755000175000017500000000000011520622070026520 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ByteArrayHolder.cs0000644000175000017500000000212111520622636032113 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class ByteArrayHolder : IIByteArrayHolder { private byte[] _bytes; public ByteArrayHolder() { } public ByteArrayHolder(byte[] bytes) { this._bytes = bytes; } public virtual byte[] GetBytes() { return _bytes; } public virtual void SetBytes(byte[] bytes) { _bytes = bytes; } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ItemWithUntypedField.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ItemWithUntypedField.0000644000175000017500000000204011520622636032574 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class ItemWithUntypedField { private object _array; public ItemWithUntypedField() { } public ItemWithUntypedField(object array) { Array(array); } public virtual void Array(object array) { this._array = array; } public virtual object Array() { return _array; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ActivatableItem.cs0000644000175000017500000000312311520622636032114 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Activation; using Db4objects.Db4o.TA; namespace Db4objects.Drs.Tests.Data { /// public class ActivatableItem : IActivatable { private string name; [System.NonSerialized] private IActivator _activator; public ActivatableItem() { } public ActivatableItem(string name) { this.name = name; } public virtual void Activate(ActivationPurpose purpose) { if (_activator != null) { _activator.Activate(purpose); } } public virtual void Bind(IActivator activator) { _activator = activator; } public virtual object Name() { Activate(ActivationPurpose.Read); return name; } public virtual string GetName() { Activate(ActivationPurpose.Read); return name; } public virtual void SetName(string name) { Activate(ActivationPurpose.Write); this.name = name; } } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SPCChildWithoutDefaultConstructor.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SPCChildWithoutDefaul0000644000175000017500000000161211520622636032551 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class SPCChildWithoutDefaultConstructor : SPCChild { public SPCChildWithoutDefaultConstructor(string name) : base(name) { } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/CollectionHolder.cs0000644000175000017500000000367511520622636032323 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Sharpen.Util; namespace Db4objects.Drs.Tests.Data { public class CollectionHolder { private string name; private IDictionary map; private IList list; private Sharpen.Util.ISet set; public CollectionHolder(string name, IDictionary theMap, Sharpen.Util.ISet theSet , IList theList) { this.name = name; map = theMap; set = theSet; list = theList; } public CollectionHolder() : this("HashMap", new Hashtable(), new HashSet(), new ArrayList ()) { } public CollectionHolder(string name) : this() { this.name = name; } public override string ToString() { return name + ", hashcode = " + GetHashCode(); } public virtual void Map(IDictionary map) { this.map = map; } public virtual IDictionary Map() { return map; } public virtual void List(IList list) { this.list = list; } public virtual IList List() { return list; } public virtual void Set(Sharpen.Util.ISet set) { this.set = set; } public virtual Sharpen.Util.ISet Set() { return set; } public virtual void Name(string name) { this.name = name; } public virtual string Name() { return name; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/R0.cs0000644000175000017500000000232511520622636027342 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class R0 { internal string name; internal R0 r0; internal R1 r1; public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual R0 GetR0() { return r0; } public virtual void SetR0(R0 r0) { this.r0 = r0; } public virtual R1 GetR1() { return r1; } public virtual void SetR1(R1 r1) { this.r1 = r1; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ListContent.cs0000644000175000017500000000212211520622636031322 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class ListContent { private string name; public ListContent() { } public ListContent(string name) { this.name = name; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public override string ToString() { return "name = " + name; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/Car.cs0000644000175000017500000000230411520622636027563 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class Car { private string _model; private Pilot _pilot; public Car() { } public Car(string model) { _model = model; } public virtual string GetModel() { return _model; } public virtual void SetModel(string model) { _model = model; } public virtual Pilot GetPilot() { return _pilot; } public virtual void SetPilot(Pilot newPilot) { _pilot = newPilot; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/Pilot.cs0000644000175000017500000000217411520622636030152 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class Pilot { private string _name; private int _age; public Pilot() { } public Pilot(string name, int age) { this._name = name; this._age = age; } public virtual void SetName(string name) { this._name = name; } public virtual string Name() { return _name; } public override string ToString() { return "Pilot name:" + Name(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/MapContent.cs0000644000175000017500000000300311520622636031123 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class MapContent { private string name; public MapContent() { } public MapContent(string name) { this.name = name; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public override string ToString() { return "name = " + name; } public override bool Equals(object o) { if (this == o) { return true; } if (o == null || GetType() != o.GetType()) { return false; } Db4objects.Drs.Tests.Data.MapContent that = (Db4objects.Drs.Tests.Data.MapContent )o; if (!name.Equals(that.name)) { return false; } return true; } public override int GetHashCode() { return name.GetHashCode(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/UntypedFieldData.cs0000644000175000017500000000226711520622636032254 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public sealed class UntypedFieldData { private int id; public UntypedFieldData() { } public UntypedFieldData(int value) { SetId(value); } public override bool Equals(object obj) { Db4objects.Drs.Tests.Data.UntypedFieldData other = (Db4objects.Drs.Tests.Data.UntypedFieldData )obj; return GetId() == other.GetId(); } public void SetId(int id) { this.id = id; } public int GetId() { return id; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SimpleArrayHolder.cs0000644000175000017500000000313011520622636032442 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; using Sharpen; namespace Db4objects.Drs.Tests.Data { public class SimpleArrayHolder { private string name; private SimpleArrayContent[] arr; public SimpleArrayHolder() { } public SimpleArrayHolder(string name) { this.name = name; } public virtual SimpleArrayContent[] GetArr() { return arr; } public virtual void SetArr(SimpleArrayContent[] arr) { this.arr = arr; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual void Add(SimpleArrayContent sac) { if (arr == null) { arr = new SimpleArrayContent[] { sac }; return; } SimpleArrayContent[] temp = arr; arr = new SimpleArrayContent[temp.Length + 1]; System.Array.Copy(temp, 0, arr, 0, temp.Length); arr[temp.Length] = sac; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SimpleItem.cs0000644000175000017500000000531011520622636031126 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class SimpleItem { private string value; private Db4objects.Drs.Tests.Data.SimpleItem child; private SimpleListHolder parent; public SimpleItem() { } public SimpleItem(SimpleListHolder parent_, Db4objects.Drs.Tests.Data.SimpleItem child_, string value_) { parent = parent_; value = value_; child = child_; } public SimpleItem(string value_) : this(null, null, value_) { } public SimpleItem(Db4objects.Drs.Tests.Data.SimpleItem child, string value_) : this (null, child, value_) { } public SimpleItem(SimpleListHolder parent_, string value_) : this(parent_, null, value_) { } public virtual string GetValue() { return value; } public virtual void SetValue(string value_) { value = value_; } public virtual Db4objects.Drs.Tests.Data.SimpleItem GetChild() { return GetChild(0); } public virtual Db4objects.Drs.Tests.Data.SimpleItem GetChild(int level) { Db4objects.Drs.Tests.Data.SimpleItem tbr = child; while (--level > 0 && tbr != null) { tbr = tbr.child; } return tbr; } public virtual void SetChild(Db4objects.Drs.Tests.Data.SimpleItem child_) { child = child_; } public virtual SimpleListHolder GetParent() { return parent; } public virtual void SetParent(SimpleListHolder parent_) { parent = parent_; } public override bool Equals(object obj) { if (obj.GetType() != typeof(Db4objects.Drs.Tests.Data.SimpleItem)) { return false; } Db4objects.Drs.Tests.Data.SimpleItem rhs = (Db4objects.Drs.Tests.Data.SimpleItem) obj; return rhs.GetValue().Equals(GetValue()); } public override string ToString() { string childString; if (child != null) { childString = child != this ? child.ToString() : "this"; } else { childString = "null"; } return value + "[" + childString + "]"; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SPCChild.cs0000644000175000017500000000214311520622636030450 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class SPCChild { private string name; public SPCChild() { } public SPCChild(string name) { this.name = name; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public override string ToString() { return "SPCChild{" + "name='" + name + '\'' + '}'; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/MapHolder.cs0000644000175000017500000000264311520622636030737 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; namespace Db4objects.Drs.Tests.Data { public class MapHolder { private string name; private IDictionary map; public MapHolder() { } public MapHolder(string name) { this.name = name; this.map = new Hashtable(); } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual IDictionary GetMap() { return map; } public virtual void SetMap(IDictionary map) { this.map = map; } public virtual void Put(object key, object value) { map[key] = value; } public override string ToString() { return "name = " + name + ", map = " + map; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/Value.cs0000644000175000017500000000210011520622636030124 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public struct Value { public int value; public Value(int value) { this.value = value; } public override bool Equals(object obj) { if (!(obj is Db4objects.Drs.Tests.Data.Value)) { return false; } Db4objects.Drs.Tests.Data.Value other = (Db4objects.Drs.Tests.Data.Value)obj; return other.value == value; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/NamedList.cs0000644000175000017500000000203311520622636030735 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests.Data { public class NamedList : DelegatingList { private string _name; public NamedList() : this(null) { } public NamedList(string name) : base(new ArrayList()) { _name = name; } public virtual string Name() { return _name; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/NewPilot.cs0000644000175000017500000000273711520622636030631 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class NewPilot { internal string name; internal int points; internal int[] arr; public NewPilot() { } public NewPilot(string name, int points, int[] arr) { this.name = name; this.points = points; this.arr = arr; } public virtual int[] GetArr() { return arr; } public virtual void SetArr(int[] arr) { this.arr = arr; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual int GetPoints() { return points; } public virtual void SetPoints(int points) { this.points = points; } public override string ToString() { return name + "/" + points; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SPCParent.cs0000644000175000017500000000270011520622636030655 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class SPCParent { private SPCChild child; private string name; public SPCParent() { } public SPCParent(string name) { this.name = name; } public SPCParent(SPCChild child, string name) { this.child = child; this.name = name; } public virtual SPCChild GetChild() { return child; } public virtual void SetChild(SPCChild child) { this.child = child; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public override string ToString() { return "SPCParent{" + "child=" + child + ", name='" + name + '\'' + '}'; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/IIByteArrayHolder.cs0000644000175000017500000000146711520622636032351 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public interface IIByteArrayHolder { byte[] GetBytes(); void SetBytes(byte[] bytes); } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/Container.cs0000644000175000017500000000205211520622636031000 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class Container { private Value value; public Container() { } public Container(Value value) { this.SetValue(value); } public virtual void SetValue(Value value) { this.value = value; } public virtual Value GetValue() { return value; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SimpleListHolder.cs0000644000175000017500000000251711520622636032307 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class SimpleListHolder { private string _name; private IList list = new ArrayList(); public SimpleListHolder() { } public SimpleListHolder(string name) { _name = name; } public virtual IList GetList() { return list; } public virtual void SetList(IList list) { this.list = list; } public virtual void Add(SimpleItem item) { list.Add(item); } public virtual void SetName(string name) { _name = name; } public virtual string GetName() { return _name; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/R4.cs0000644000175000017500000000170511520622636027347 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class R4 : R3 { internal R0 circle4; public virtual R0 GetCircle4() { return circle4; } public virtual void SetCircle4(R0 circle4) { this.circle4 = circle4; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ItemWithCloneable.cs0000644000175000017500000000163611520622636032424 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Drs.Tests.Data { public sealed class ItemWithCloneable { public ICloneable value; public ItemWithCloneable() { } public ItemWithCloneable(ICloneable c) { value = c; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/UntypedFieldItem.cs0000644000175000017500000000204111520622636032267 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public sealed class UntypedFieldItem { private object untyped; public UntypedFieldItem() { } public UntypedFieldItem(object value) { SetUntyped(value); } public void SetUntyped(object untyped) { this.untyped = untyped; } public object GetUntyped() { return untyped; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/Replicated.cs0000644000175000017500000000347611520622636031145 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Sharpen; namespace Db4objects.Drs.Tests.Data { public class Replicated { private string name; private Db4objects.Drs.Tests.Data.Replicated link; public Replicated() { } public Replicated(string name) { this.SetName(name); } public override string ToString() { return GetName() + ", hashcode = " + GetHashCode() + ", identity = " + Runtime.IdentityHashCode (this); } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual Db4objects.Drs.Tests.Data.Replicated GetLink() { return link; } public virtual void SetLink(Db4objects.Drs.Tests.Data.Replicated link) { this.link = link; } public override bool Equals(object o) { if (o == null) { return false; } if (!(o is Db4objects.Drs.Tests.Data.Replicated)) { return false; } return ((Db4objects.Drs.Tests.Data.Replicated)o).name.Equals(name); } public override int GetHashCode() { if (name == null) { return 0; } return name.GetHashCode(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/R3.cs0000644000175000017500000000212411520622636027342 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class R3 : R2 { internal R0 circle3; internal R4 r4; public virtual R0 GetCircle3() { return circle3; } public virtual void SetCircle3(R0 circle3) { this.circle3 = circle3; } public virtual R4 GetR4() { return r4; } public virtual void SetR4(R4 r4) { this.r4 = r4; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/R2.cs0000644000175000017500000000212411520622636027341 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class R2 : R1 { internal R0 circle2; internal R3 r3; public virtual R0 GetCircle2() { return circle2; } public virtual void SetCircle2(R0 circle2) { this.circle2 = circle2; } public virtual R3 GetR3() { return r3; } public virtual void SetR3(R3 r3) { this.r3 = r3; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ArrayHolder.cs0000644000175000017500000000253111520622636031274 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class ArrayHolder { public string _name; public Db4objects.Drs.Tests.Data.ArrayHolder[] _array; public Db4objects.Drs.Tests.Data.ArrayHolder[][] _arrayN; public ArrayHolder() { } public ArrayHolder(string name) { _name = name; } public override string ToString() { return _name + ", hashcode = " + GetHashCode(); } public virtual string GetName() { return _name; } public virtual Db4objects.Drs.Tests.Data.ArrayHolder[] Array() { return _array; } public virtual Db4objects.Drs.Tests.Data.ArrayHolder[][] ArrayN() { return _arrayN; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ListHolder.cs0000644000175000017500000000262311520622636031133 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class ListHolder { private string name; private IList list; public ListHolder() { } public ListHolder(string name) { this.name = name; } public virtual void Add(ListContent obj) { list.Add(obj); } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } public virtual IList GetList() { return list; } public virtual void SetList(IList list) { this.list = list; } public override string ToString() { return "name = " + name + ", list = " + list; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/ItemDates.cs0000644000175000017500000000375011520622636030743 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Sharpen.Util; namespace Db4objects.Drs.Tests.Data { public sealed class ItemDates { private DateTime date1; private DateTime date2; private DateTime[] dateArray; public ItemDates() { } public ItemDates(DateTime date1, DateTime date2) { this.SetDate1(date1); this.SetDate2(date2); this.SetDateArray(new DateTime[] { date1, date2 }); } public override bool Equals(object obj) { Db4objects.Drs.Tests.Data.ItemDates other = (Db4objects.Drs.Tests.Data.ItemDates) obj; if (!other.GetDate1().Equals(GetDate1())) { return false; } if (!other.GetDate2().Equals(GetDate2())) { return false; } return Arrays.Equals(GetDateArray(), other.GetDateArray()); } public override string ToString() { return "ItemDates [_date1=" + GetDate1() + ", _date2=" + GetDate2(); } public void SetDate1(DateTime date1) { this.date1 = date1; } public DateTime GetDate1() { return date1; } public void SetDate2(DateTime date2) { this.date2 = date2; } public DateTime GetDate2() { return date2; } public void SetDateArray(DateTime[] dateArray) { this.dateArray = dateArray; } public DateTime[] GetDateArray() { return dateArray; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/SimpleArrayContent.cs0000644000175000017500000000203111520622636032636 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Drs.Tests.Data { public class SimpleArrayContent { private string name; public SimpleArrayContent() { } public SimpleArrayContent(string name) { this.name = name; } public virtual string GetName() { return name; } public virtual void SetName(string name) { this.name = name; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Data/R1.cs0000644000175000017500000000212411520622636027340 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Data { public class R1 : R0 { internal R0 circle1; internal R2 r2; public virtual R0 GetCircle1() { return circle1; } public virtual void SetCircle1(R0 circle1) { this.circle1 = circle1; } public virtual R2 GetR2() { return r2; } public virtual void SetR2(R2 r2) { this.r2 = r2; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ComplexListTestCase.cs0000644000175000017500000001116311520622636032107 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ComplexListTestCase : DrsTestCase { public virtual void Test() { Store(A(), CreateList()); ReplicateAndTest(A(), B()); RoundTripTest(); } private void RoundTripTest() { ChangeInProviderB(); B().Provider().Commit(); ReplicateAndTest(B(), A()); } private void ChangeInProviderB() { SimpleListHolder simpleListHolder = (SimpleListHolder)GetOneInstance(B(), typeof( SimpleListHolder)); SimpleItem fooBaby = new SimpleItem(simpleListHolder, "foobaby"); B().Provider().StoreNew(fooBaby); simpleListHolder.Add(fooBaby); SimpleItem foo = GetItem(simpleListHolder, "foo"); foo.SetChild(fooBaby); B().Provider().Update(foo); B().Provider().Update(simpleListHolder.GetList()); B().Provider().Update(simpleListHolder); } private void ReplicateAndTest(IDrsProviderFixture source, IDrsProviderFixture target ) { ReplicateAll(source.Provider(), target.Provider()); EnsureContents(target, (SimpleListHolder)GetOneInstance(source, typeof(SimpleListHolder ))); } private void Store(IDrsProviderFixture fixture, SimpleListHolder listHolder) { ITestableReplicationProviderInside provider = fixture.Provider(); provider.StoreNew(listHolder); provider.StoreNew(GetItem(listHolder, "foo")); provider.StoreNew(GetItem(listHolder, "foobar")); provider.Commit(); EnsureContents(fixture, listHolder); } private void EnsureContents(IDrsProviderFixture actualFixture, SimpleListHolder expected ) { SimpleListHolder actual = (SimpleListHolder)GetOneInstance(actualFixture, typeof( SimpleListHolder)); IList expectedList = expected.GetList(); IList actualList = actual.GetList(); AssertListWithCycles(expectedList, actualList); } private void AssertListWithCycles(IList expectedList, IList actualList) { Assert.AreEqual(expectedList.Count, actualList.Count); for (int i = 0; i < expectedList.Count; ++i) { SimpleItem expected = (SimpleItem)expectedList[i]; SimpleItem actual = (SimpleItem)actualList[i]; AssertItem(expected, actual); } AssertCycle(actualList, "foo", "bar", 1); AssertCycle(actualList, "foo", "foobar", 1); AssertCycle(actualList, "foo", "baz", 2); } private void AssertCycle(IList list, string childName, string parentName, int level ) { SimpleItem foo = GetItem(list, childName); SimpleItem bar = GetItem(list, parentName); Assert.IsNotNull(foo); Assert.IsNotNull(bar); Assert.AreSame(foo, bar.GetChild(level)); Assert.AreSame(foo.GetParent(), bar.GetParent()); } private void AssertItem(SimpleItem expected, SimpleItem actual) { if (expected == null) { Assert.IsNull(actual); return; } Assert.AreEqual(expected.GetValue(), actual.GetValue()); AssertItem(expected.GetChild(), actual.GetChild()); } private SimpleItem GetItem(SimpleListHolder holder, string tbf) { return GetItem(holder.GetList(), tbf); } private SimpleItem GetItem(IList list, string tbf) { int itemIndex = list.IndexOf(new SimpleItem(tbf)); return (SimpleItem)(itemIndex >= 0 ? list[itemIndex] : null); } public virtual SimpleListHolder CreateList() { // list : {foo, bar, baz, foobar} // // baz -----+ // | // bar --> foo // ^ // | // foobar ----------+ SimpleListHolder listHolder = new SimpleListHolder("root"); SimpleItem foo = new SimpleItem(listHolder, "foo"); SimpleItem bar = new SimpleItem(listHolder, foo, "bar"); listHolder.Add(foo); listHolder.Add(bar); listHolder.Add(new SimpleItem(listHolder, bar, "baz")); listHolder.Add(new SimpleItem(listHolder, foo, "foobar")); return listHolder; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DrsTestSuite.cs0000644000175000017500000000400611520622636030610 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Regression; namespace Db4objects.Drs.Tests { public abstract class DrsTestSuite : ReflectionTestSuite { public const bool RunOneSingleTest = false; protected override Type[] TestCases() { return new Type[] { typeof(DateReplicationTestCase), typeof(Db4objects.Drs.Tests.Foundation.AllTests ), typeof(TheSimplest), typeof(ReplicationEventTest), typeof(ReplicationProviderTest ), typeof(ReplicationAfterDeletionTest), typeof(SimpleArrayTest), typeof(SimpleParentChild ), typeof(ByteArrayTest), typeof(ComplexListTestCase), typeof(ListTest), typeof( R0to4Runner), typeof(ReplicationFeaturesMain), typeof(CollectionHandlerImplTest) , typeof(BidirectionalReplicationTestCase), typeof(TimestampTestCase), typeof(MapTest ), typeof(ArrayReplicationTest), typeof(SingleTypeCollectionReplicationTest), typeof( MixedTypesCollectionReplicationTest), typeof(TransparentActivationTestCase), typeof( DRS42Test), typeof(SameHashCodeTestCase) }; } // Simple // Collection // Complex // General //regression protected virtual Type[] Concat(Type[] x, Type[] y) { Collection4 c = new Collection4(x); c.AddAll(y); return (Type[])c.ToArray(new Type[c.Size()]); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/R0to4Runner.cs0000644000175000017500000001563311520622640030313 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o.Reflect; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class R0to4Runner : DrsTestCase { private const int Linkers = 4; public R0to4Runner() : base() { } // ------------------------------ FIELDS ------------------------------ // --------------------------- CONSTRUCTORS --------------------------- protected override void Clean() { Delete(A().Provider()); Delete(B().Provider()); } protected virtual void Delete(ITestableReplicationProviderInside provider) { ArrayList toDelete = new ArrayList(); IEnumerator rr = provider.GetStoredObjects(typeof(R0)).GetEnumerator(); while (rr.MoveNext()) { object o = rr.Current; IReflectClass claxx = ReplicationReflector().ForObject(o); SetFieldsToNull(o, claxx); toDelete.Add(o); } object commitObject = null; for (IEnumerator iterator = toDelete.GetEnumerator(); iterator.MoveNext(); ) { object o = iterator.Current; //System.out.println("o = " + o); provider.Delete(o); commitObject = o; } if (commitObject != null) { provider.Commit(); } else { provider.Commit(); } } private void CompareR4(ITestableReplicationProviderInside a, ITestableReplicationProviderInside b, bool isSameExpected) { IEnumerator it = a.GetStoredObjects(typeof(R4)).GetEnumerator(); while (it.MoveNext()) { string name = ((R4)it.Current).GetName(); IEnumerator it2 = b.GetStoredObjects(typeof(R4)).GetEnumerator(); bool found = false; while (it2.MoveNext()) { string name2 = ((R4)it2.Current).GetName(); if (name.Equals(name2)) { found = true; } } Assert.IsTrue(found == isSameExpected); } } private void ReplicateAllToB(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { Assert.AreEqual(Linkers * 5, ReplicateAll(peerA, peerB, false)); } private void EnsureCount(ITestableReplicationProviderInside provider, int linkers ) { EnsureCount(provider, typeof(R0), linkers * 5); EnsureCount(provider, typeof(R1), linkers * 4); EnsureCount(provider, typeof(R2), linkers * 3); EnsureCount(provider, typeof(R3), linkers * 2); EnsureCount(provider, typeof(R4), linkers * 1); } private void EnsureCount(ITestableReplicationProviderInside provider, Type clazz, int count) { IEnumerator instances = provider.GetStoredObjects(clazz).GetEnumerator(); int i = count; while (instances.MoveNext()) { object o = instances.Current; i--; } Assert.AreEqual(0, i); } private void EnsureR4Different(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { CompareR4(peerB, peerA, false); } private void EnsureR4Same(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { CompareR4(peerB, peerA, true); CompareR4(peerA, peerB, true); } private void Init(ITestableReplicationProviderInside peerA) { R0Linker lCircles = new R0Linker(); lCircles.SetNames("circles"); lCircles.LinkCircles(); lCircles.Store(peerA); R0Linker lList = new R0Linker(); lList.SetNames("list"); lList.LinkList(); lList.Store(peerA); R0Linker lThis = new R0Linker(); lThis.SetNames("this"); lThis.LinkThis(); lThis.Store(peerA); R0Linker lBack = new R0Linker(); lBack.SetNames("back"); lBack.LinkBack(); lBack.Store(peerA); peerA.Commit(); } private void ModifyR4(ITestableReplicationProviderInside provider) { object commitObject = null; IEnumerator it = provider.GetStoredObjects(typeof(R4)).GetEnumerator(); while (it.MoveNext()) { R4 r4 = (R4)it.Current; r4.SetName(r4.GetName() + "_"); provider.Update(r4); commitObject = r4; } provider.Commit(); } private int Replicate(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { return ReplicateAll(peerA, peerB, true); } private int ReplicateAll(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB, bool modifiedOnly) { IReplicationSession replication = Replication.Begin(peerA, peerB, null, _fixtures .reflector); IEnumerator it = modifiedOnly ? peerA.ObjectsChangedSinceLastReplication(typeof(R0 )).GetEnumerator() : peerA.GetStoredObjects(typeof(R0)).GetEnumerator(); int replicated = 0; while (it.MoveNext()) { R0 r0 = (R0)it.Current; replication.Replicate(r0); replicated++; } replication.Commit(); EnsureCount(peerA, Linkers); EnsureCount(peerB, Linkers); return replicated; } private void ReplicateNoneModified(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { Assert.IsTrue(Replicate(peerA, peerB) == 0); } private void ReplicateR4(ITestableReplicationProviderInside peerA, ITestableReplicationProviderInside peerB) { int replicatedObjectsCount = ReplicateAll(peerA, peerB, true); Assert.AreEqual(Linkers, replicatedObjectsCount); } private void SetFieldsToNull(object @object, IReflectClass claxx) { IReflectField[] fields; fields = claxx.GetDeclaredFields(); for (int i = 0; i < fields.Length; i++) { IReflectField field = fields[i]; if (field.IsStatic()) { continue; } if (field.IsTransient()) { continue; } field.Set(@object, null); } IReflectClass superclass = claxx.GetSuperclass(); if (superclass == null) { return; } SetFieldsToNull(@object, superclass); } public virtual void Test() { Init(A().Provider()); EnsureCount(A().Provider(), Linkers); ReplicateAllToB(A().Provider(), B().Provider()); ReplicateNoneModified(A().Provider(), B().Provider()); ModifyR4(A().Provider()); EnsureR4Different(A().Provider(), B().Provider()); ReplicateR4(A().Provider(), B().Provider()); EnsureR4Same(A().Provider(), B().Provider()); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicatingTwiceTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicatingTwiceTestCase.c0000644000175000017500000000246111520622640032712 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ReplicatingTwiceTestCase : DrsTestCase { public virtual void Test() { Pilot pilot = new Pilot("one", 1); A().Provider().StoreNew(pilot); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider(), null); pilot.SetName("modified"); A().Provider().Update(pilot); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider(), null); Pilot pilotFromB = (Pilot)GetOneInstance(B(), typeof(Pilot)); Assert.AreEqual("modified", pilotFromB.Name()); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oDrsTestSuiteBuilder.cs0000644000175000017500000000424011520622636032630 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class Db4oDrsTestSuiteBuilder : ITestSuiteBuilder { public static void Main(string[] args) { new ConsoleTestRunner(new Db4oDrsTestSuiteBuilder()).Run(); } public virtual IEnumerator GetEnumerator() { if (false) { return new DrsTestSuiteBuilder(new Db4oDrsFixture("db4o-a"), new Db4oDrsFixture("db4o-b" ), typeof(Db4oDrsTestSuite)).GetEnumerator(); } if (false) { return new DrsTestSuiteBuilder(new Db4oClientServerDrsFixture("db4o-cs-a", unchecked( (int)(0xdb40))), new Db4oClientServerDrsFixture("db4o-cs-b", 4455), typeof(Db4oDrsTestSuite )).GetEnumerator(); } return Iterators.Concat(Iterators.Concat(new DrsTestSuiteBuilder(new Db4oDrsFixture ("db4o-a"), new Db4oDrsFixture("db4o-b"), typeof(Db4oDrsTestSuite)).GetEnumerator (), new DrsTestSuiteBuilder(new Db4oClientServerDrsFixture("db4o-cs-a", unchecked( (int)(0xdb40))), new Db4oClientServerDrsFixture("db4o-cs-b", 4455), typeof(Db4oDrsTestSuite )).GetEnumerator()), Iterators.Concat(new DrsTestSuiteBuilder(new Db4oDrsFixture ("db4o-a"), new Db4oClientServerDrsFixture("db4o-cs-b", 4455), typeof(Db4oDrsTestSuite )).GetEnumerator(), new DrsTestSuiteBuilder(new Db4oClientServerDrsFixture("db4o-cs-a" , 4455), new Db4oDrsFixture("db4o-b"), typeof(Db4oDrsTestSuite)).GetEnumerator() )); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicationFeaturesMain.cs0000644000175000017500000004773511520622640032776 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; using Db4objects.Drs.Tests.Foundation; using Sharpen; namespace Db4objects.Drs.Tests { public class ReplicationFeaturesMain : DrsTestCase { private const bool Debug = false; private static readonly string AStuff = "A"; private static readonly string BStuff = "B"; private readonly Set4 _setA = new Set4(1); private readonly Set4 _setB = new Set4(1); private readonly Set4 _setBoth = new Set4(2); private readonly Set4 None = Set4.EmptySet; private Set4 _direction; private Set4 _containersToQueryFrom; private Set4 _containersWithNewObjects; private Set4 _containersWithChangedObjects; private Set4 _containersWithDeletedObjects; private Set4 _containerStateToPrevail; private string _intermittentErrors = string.Empty; private int _testCombination; private static void Fail(string @string) { Sharpen.Runtime.Err.WriteLine(@string); throw new Exception(@string); } private void ReplicateQueryingFrom(IReplicationSession replication, IReplicationProvider origin, IReplicationProvider other) { ReplicationConflictException exception = null; IEnumerator changes = origin.ObjectsChangedSinceLastReplication().GetEnumerator(); while (changes.MoveNext()) { object changed = changes.Current; try { replication.Replicate(changed); } catch (ReplicationConflictException e) { exception = e; } } if (exception != null) { throw exception; } } private bool IsReplicationConflictExceptionExpectedReplicatingModifications() { return WasConflictReplicatingModifications() && IsDefaultReplicationBehaviorAllowed (); } private bool IsReplicationConflictExceptionExpectedReplicatingDeletions() { return WasConflictReplicatingDeletions() && IsDefaultReplicationBehaviorAllowed(); } private bool WasConflictReplicatingDeletions() { if (_containersWithDeletedObjects.Size() != 1) { return false; } string container = (string)FirstContainerWithDeletedObjects(); if (HasChanges(Other(container))) { return true; } if (_direction.Size() != 1) { return false; } return _direction.Contains(container); } private string FirstContainerWithDeletedObjects() { return First(_containersWithDeletedObjects.GetEnumerator()); } private bool IsDefaultReplicationBehaviorAllowed() { return _containerStateToPrevail != null && _containerStateToPrevail.IsEmpty(); } private void ChangeObject(ITestableReplicationProviderInside container, string name , string newName) { Replicated obj = Find(container, name); if (obj == null) { return; } obj.SetName(newName); container.Update(obj); Out("CHANGED: " + container + ": " + name + " => " + newName + " - " + obj); } private void CheckEmpty(ITestableReplicationProviderInside provider) { if (provider.GetStoredObjects(typeof(Replicated)).GetEnumerator().MoveNext()) { throw new Exception(provider.GetName() + " is not empty"); } } private int checkNameCount = 0; private void CheckName(ITestableReplicationProviderInside container, string name, bool isExpected) { Out(string.Empty); Out(name + (isExpected ? " " : " NOT") + " expected in container " + ContainerName (container)); Replicated obj = Find(container, name); Out(checkNameCount.ToString()); checkNameCount++; if (isExpected) { Assert.IsNotNull(obj, "Expecting: " + name + " in " + ContainerName(container)); } else { Assert.IsNull(obj); } } private string ContainerName(ITestableReplicationProviderInside container) { return container == A().Provider() ? "A" : "B"; } private void CheckNames() { CheckNames(AStuff, AStuff); CheckNames(AStuff, BStuff); CheckNames(BStuff, AStuff); CheckNames(BStuff, BStuff); } private void CheckNames(string origin, string inspected) { CheckName(Container(inspected), "oldFrom" + origin, IsOldNameExpected(inspected)); CheckName(Container(inspected), "newFrom" + origin, IsNewNameExpected(origin, inspected )); CheckName(Container(inspected), "oldFromAChangedIn" + origin, IsChangedNameExpected (origin, inspected)); CheckName(Container(inspected), "oldFromBChangedIn" + origin, IsChangedNameExpected (origin, inspected)); } private ITestableReplicationProviderInside Container(string aOrB) { return aOrB.Equals(AStuff) ? A().Provider() : B().Provider(); } private void DeleteObject(ITestableReplicationProviderInside container, string name ) { Replicated obj = Find(container, name); container.Delete(obj); } private void DoIt() { InitState(); PrintProvidersContent("before changes"); PerformChanges(); PrintProvidersContent("after changes"); IReplicationEventListener listener = new _IReplicationEventListener_167(this); //Default replication behaviour. IReplicationSession replication = new GenericReplicationSession(A().Provider(), B ().Provider(), listener, _fixtures.reflector); if (_direction.Size() == 1) { if (_direction.Contains(AStuff)) { replication.SetDirection(B().Provider(), A().Provider()); } if (_direction.Contains(BStuff)) { replication.SetDirection(A().Provider(), B().Provider()); } } Out("DIRECTION: " + _direction); bool successful = TryToReplicate(replication); replication.Commit(); PrintProvidersContent("after replication"); if (successful) { CheckNames(); } Clean(); } private sealed class _IReplicationEventListener_167 : IReplicationEventListener { public _IReplicationEventListener_167(ReplicationFeaturesMain _enclosing) { this._enclosing = _enclosing; } public void OnReplicate(IReplicationEvent e) { if (this._enclosing._containerStateToPrevail == null) { e.OverrideWith(null); return; } if (this._enclosing._containerStateToPrevail.IsEmpty()) { return; } IObjectState @override = this._enclosing._containerStateToPrevail.Contains(ReplicationFeaturesMain .AStuff) ? e.StateInProviderA() : e.StateInProviderB(); e.OverrideWith(@override); } private readonly ReplicationFeaturesMain _enclosing; } private void PrintProvidersContent(string msg) { return; Sharpen.Runtime.Out.WriteLine("*** " + msg); PrintProviderContent(A().Provider()); PrintProviderContent(B().Provider()); } private void PrintProviderContent(ITestableReplicationProviderInside provider) { IObjectSet storedObjects = provider.GetStoredObjects(typeof(Replicated)); Sharpen.Runtime.Out.WriteLine("PROVIDER: " + provider); while (storedObjects.HasNext()) { object @object = storedObjects.Next(); Sharpen.Runtime.Out.WriteLine("-> " + @object + " - c:" + CreationTime(provider, @object) + " v:" + Version(provider, @object)); } } private long Version(ITestableReplicationProviderInside provider, object obj) { return provider.ObjectVersion(obj); } private long CreationTime(ITestableReplicationProviderInside provider, object obj ) { return provider.CreationTime(obj); } private bool TryToReplicate(IReplicationSession replication) { try { Replicate(replication, AStuff); Replicate(replication, BStuff); Assert.IsFalse(IsReplicationConflictExceptionExpectedReplicatingModifications()); } catch (ReplicationConflictException) { Out("Conflict exception during modification replication."); Assert.IsTrue(IsReplicationConflictExceptionExpectedReplicatingModifications()); return false; } try { if (IsDeletionReplicationTriggered()) { replication.ReplicateDeletions(typeof(Replicated)); } Assert.IsFalse(IsReplicationConflictExceptionExpectedReplicatingDeletions()); } catch (ReplicationConflictException) { Out("Conflict exception during deletion replication."); Assert.IsTrue(IsReplicationConflictExceptionExpectedReplicatingDeletions()); return false; } return true; } private void Replicate(IReplicationSession replication, string originName) { IReplicationProvider origin = Container(originName); IReplicationProvider destination = Container(Other(originName)); if (!_containersToQueryFrom.Contains(originName)) { return; } ReplicateQueryingFrom(replication, origin, destination); } private Replicated Find(ITestableReplicationProviderInside container, string name ) { IEnumerator storedObjects = container.GetStoredObjects(typeof(Replicated)).GetEnumerator (); int resultCount = 0; Replicated result = null; while (storedObjects.MoveNext()) { Replicated replicated = (Replicated)storedObjects.Current; if (replicated == null) { throw new Exception(); } if (name.Equals(replicated.GetName())) { result = replicated; resultCount++; } } if (resultCount > 1) { Fail("At most one object with name " + name + " was expected."); } return result; } private bool HasChanges(string container) { return _containersWithChangedObjects.Contains(container); } private bool HasDeletions(string container) { return _containersWithDeletedObjects.Contains(container); } private void InitState() { CheckEmpty(A().Provider()); CheckEmpty(B().Provider()); A().Provider().StoreNew(new Replicated("oldFromA")); B().Provider().StoreNew(new Replicated("oldFromB")); A().Provider().Commit(); B().Provider().Commit(); PrintProvidersContent("init state"); IReplicationSession replication = new GenericReplicationSession(A().Provider(), B ().Provider(), null, _fixtures.reflector); ReplicateQueryingFrom(replication, A().Provider(), B().Provider()); ReplicateQueryingFrom(replication, B().Provider(), A().Provider()); replication.Commit(); } private bool IsChangedNameExpected(string changedContainer, string inspectedContainer ) { if (!HasChanges(changedContainer)) { return false; } if (IsDeletionExpected(inspectedContainer)) { return false; } if (IsDeletionExpected(changedContainer)) { return false; } if (inspectedContainer.Equals(changedContainer)) { return !DidReceiveRemoteState(inspectedContainer); } return DidReceiveRemoteState(inspectedContainer); } private bool DidReceiveRemoteState(string inspectedContainer) { string other = Other(inspectedContainer); if (IsDirectionTo(other)) { return false; } if (_containerStateToPrevail == null) { return false; } if (_containerStateToPrevail.Contains(inspectedContainer)) { return false; } if (_containerStateToPrevail.Contains(other)) { if (IsModificationReplicationTriggered()) { return true; } if (IsDeletionReplicationTriggered()) { return true; } return false; } //No override to prevail. Default replication behavior. if (HasChanges(inspectedContainer)) { return false; } //A conflict would have been ignored long ago. return IsModificationReplicationTriggered(); } private bool IsDeletionReplicationTriggered() { return !_containersWithDeletedObjects.IsEmpty(); } private bool IsDirectionTo(string container) { return _direction.Size() == 1 && _direction.Contains(container); } private bool WasConflictReplicatingModifications() { return WasConflictWhileReplicatingModificationsQueryingFrom(AStuff) || WasConflictWhileReplicatingModificationsQueryingFrom (BStuff); } private bool IsModificationReplicationTriggered() { return WasModificationReplicationTriggeredQueryingFrom(AStuff) || WasModificationReplicationTriggeredQueryingFrom (BStuff); } private bool IsDeletionExpected(string inspectedContainer) { if (_containerStateToPrevail == null) { return HasDeletions(inspectedContainer); } if (_containerStateToPrevail.Contains(inspectedContainer)) { return HasDeletions(inspectedContainer); } string other = Other(inspectedContainer); if (IsDirectionTo(other)) { return HasDeletions(inspectedContainer); } if (_containerStateToPrevail.Contains(other)) { return HasDeletions(other); } //_containerStateToPrevail is empty (default replication behaviour) return IsDeletionReplicationTriggered(); } private bool IsNewNameExpected(string origin, string inspected) { if (!_containersWithNewObjects.Contains(origin)) { return false; } if (origin.Equals(inspected)) { return true; } if (_containerStateToPrevail == null) { return false; } if (_containerStateToPrevail.Contains(inspected)) { return false; } if (!_containersToQueryFrom.Contains(origin)) { return false; } return _direction.Contains(inspected); } private bool IsOldNameExpected(string inspectedContainer) { if (IsDeletionExpected(inspectedContainer)) { return false; } if (IsChangedNameExpected(AStuff, inspectedContainer)) { return false; } if (IsChangedNameExpected(BStuff, inspectedContainer)) { return false; } return true; } private string Other(string aOrB) { return aOrB.Equals(AStuff) ? BStuff : AStuff; } private void PerformChanges() { if (_containersWithNewObjects.Contains(AStuff)) { A().Provider().StoreNew(new Replicated("newFromA")); } if (_containersWithNewObjects.Contains(BStuff)) { B().Provider().StoreNew(new Replicated("newFromB")); } if (HasDeletions(AStuff)) { DeleteObject(A().Provider(), "oldFromA"); DeleteObject(A().Provider(), "oldFromB"); } if (HasDeletions(BStuff)) { DeleteObject(B().Provider(), "oldFromA"); DeleteObject(B().Provider(), "oldFromB"); } if (HasChanges(AStuff)) { ChangeObject(A().Provider(), "oldFromA", "oldFromAChangedInA"); ChangeObject(A().Provider(), "oldFromB", "oldFromBChangedInA"); } if (HasChanges(BStuff)) { ChangeObject(B().Provider(), "oldFromA", "oldFromAChangedInB"); ChangeObject(B().Provider(), "oldFromB", "oldFromBChangedInB"); } A().Provider().Commit(); B().Provider().Commit(); } private string Print(Set4 containerSet) { if (containerSet == null) { return "null"; } if (containerSet.IsEmpty()) { return "NONE"; } if (containerSet.Size() == 2) { return "BOTH"; } return First(containerSet); } private string First(Set4 containerSet) { return First(containerSet.GetEnumerator()); } private string First(IEnumerator iterator) { return (string)Iterators.Next(iterator); } private void RunCurrentCombination() { _testCombination++; Out(string.Empty + _testCombination + " ================================="); PrintCombination(); if (_testCombination < 0) { //Use this when debugging to skip some combinations and avoid waiting. return; } int _errors = 0; while (true) { try { DoIt(); break; } catch (Exception rx) { _errors++; if (_errors == 1) { Sleep(100); PrintCombination(); throw; } } } if (_errors > 0) { _intermittentErrors += "\n\t Combination: " + _testCombination + " (" + _errors + " errors)"; } } public virtual void Test() { long start = Runtime.CurrentTimeMillis(); ActualTest(); long stop = Runtime.CurrentTimeMillis(); long duration = stop - start; Sharpen.Runtime.Out.WriteLine("ReplicationFeaturesMain takes " + duration + "ms"); Sharpen.Runtime.Out.WriteLine("Run combinations " + _testCombination); } private static void Out(string @string) { } private void PrintCombination() { return; Out(string.Empty + _testCombination + " ================================="); Out("Deleted Objects In: " + Print(_containersWithDeletedObjects)); Out("Direction: To " + Print(_direction)); Out("Querying From: " + Print(_containersToQueryFrom)); Out("New Objects In: " + Print(_containersWithNewObjects)); Out("Changed Objects In: " + Print(_containersWithChangedObjects)); Out("Prevailing State: " + Print(_containerStateToPrevail)); } protected virtual void ActualTest() { Clean(); _setA.Add(AStuff); _setB.Add(BStuff); _setBoth.AddAll(_setA); _setBoth.AddAll(_setB); _testCombination = 0; TstWithDeletedObjectsIn(None); TstWithDeletedObjectsIn(_setA); TstWithDeletedObjectsIn(_setB); TstWithDeletedObjectsIn(_setBoth); if (_intermittentErrors.Length > 0) { Sharpen.Runtime.Err.WriteLine("Intermittent errors found in test combinations:" + _intermittentErrors); Assert.IsTrue(false); } } private void TstWithDeletedObjectsIn(Set4 containers) { _containersWithDeletedObjects = containers; TstDirection(_setA); TstDirection(_setB); TstDirection(_setBoth); } private void TstDirection(Set4 direction) { _direction = direction; TstQueryingFrom(_setA); TstQueryingFrom(_setB); TstQueryingFrom(_setBoth); } private void TstQueryingFrom(Set4 containersToQueryFrom) { _containersToQueryFrom = containersToQueryFrom; TstWithNewObjectsIn(None); TstWithNewObjectsIn(_setA); TstWithNewObjectsIn(_setB); TstWithNewObjectsIn(_setBoth); } private void TstWithNewObjectsIn(Set4 containersWithNewObjects) { _containersWithNewObjects = containersWithNewObjects; TstWithChangedObjectsIn(None); TstWithChangedObjectsIn(_setA); TstWithChangedObjectsIn(_setB); TstWithChangedObjectsIn(_setBoth); } private void TstWithChangedObjectsIn(Set4 containers) { _containersWithChangedObjects = containers; TstWithContainerStateToPrevail(_setA); return; TstWithContainerStateToPrevail(None); TstWithContainerStateToPrevail(_setA); TstWithContainerStateToPrevail(_setB); TstWithContainerStateToPrevail(null); } private void TstWithContainerStateToPrevail(Set4 containers) { _containerStateToPrevail = containers; RunCurrentCombination(); } private bool WasConflictWhileReplicatingModificationsQueryingFrom(string container ) { if (!WasModificationReplicationTriggeredQueryingFrom(container)) { return false; } if (_containersWithChangedObjects.ContainsAll(_direction)) { return true; } return HasDeletions(Other(container)); } private bool WasModificationReplicationTriggeredQueryingFrom(string container) { if (!_containersToQueryFrom.Contains(container)) { return false; } if (_containersWithDeletedObjects.Contains(container)) { return false; } return _containersWithChangedObjects.Contains(container); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/R0Linker.cs0000644000175000017500000000372711520622640027640 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Drs.Inside; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { internal class R0Linker { internal R0 r0; internal R1 r1; internal R2 r2; internal R3 r3; internal R4 r4; internal R0Linker() { r0 = new R0(); r1 = new R1(); r2 = new R2(); r3 = new R3(); r4 = new R4(); } internal virtual void SetNames(string name) { r0.SetName("0" + name); r1.SetName("1" + name); r2.SetName("2" + name); r3.SetName("3" + name); r4.SetName("4" + name); } internal virtual void LinkCircles() { LinkList(); r1.SetCircle1(r0); r2.SetCircle2(r0); r3.SetCircle3(r0); r4.SetCircle4(r0); } internal virtual void LinkList() { r0.SetR1(r1); r1.SetR2(r2); r2.SetR3(r3); r3.SetR4(r4); } internal virtual void LinkThis() { r0.SetR0(r0); r1.SetR1(r1); r2.SetR2(r2); r3.SetR3(r3); r4.SetR4(r4); } internal virtual void LinkBack() { r1.SetR0(r0); r2.SetR1(r1); r3.SetR2(r2); r4.SetR3(r3); } public virtual void Store(ITestableReplicationProviderInside provider) { provider.StoreNew(r4); provider.StoreNew(r3); provider.StoreNew(r2); provider.StoreNew(r1); provider.StoreNew(r0); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DrsFixture.cs0000644000175000017500000000264511520622636030314 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class DrsFixture { public readonly IDrsProviderFixture a; public readonly IDrsProviderFixture b; public readonly IReflector reflector; public DrsFixture(IDrsProviderFixture fixtureA, IDrsProviderFixture fixtureB) : this (fixtureA, fixtureB, null) { } public DrsFixture(IDrsProviderFixture fixtureA, IDrsProviderFixture fixtureB, IReflector reflector) { if (null == fixtureA) { throw new ArgumentException("fixtureA"); } if (null == fixtureB) { throw new ArgumentException("fixtureB"); } a = fixtureA; b = fixtureB; this.reflector = reflector; } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/SingleTypeCollectionReplicationTest.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/SingleTypeCollectionReplic0000644000175000017500000001501211520622640033032 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4oUnit; using Db4oUnit.Fixtures; using Db4objects.Db4o.Config; using Db4objects.Db4o.TA; using Db4objects.Drs.Db4o; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; using Sharpen.Util; namespace Db4objects.Drs.Tests { public class SingleTypeCollectionReplicationTest : FixtureBasedTestSuite { private static readonly FixtureVariable TransparentActivationFixture = FixtureVariable .NewInstance("Transparent Activation"); public override IFixtureProvider[] FixtureProviders() { return new IFixtureProvider[] { new SubjectFixtureProvider(new SingleTypeCollectionReplicationTest.CollectionHolderFactory [] { Collection1(), Collection2(), Collection3() }), new SimpleFixtureProvider(TransparentActivationFixture , (object[])LabeledObject.ForObjects(new object[] { false, true })) }; } public abstract class CollectionHolderFactory : ILabeled { public abstract CollectionHolder NewCollectionHolder(); public abstract string Label(); } private SingleTypeCollectionReplicationTest.CollectionHolderFactory Collection1() { return new _CollectionHolderFactory_56(this); } private sealed class _CollectionHolderFactory_56 : SingleTypeCollectionReplicationTest.CollectionHolderFactory { public _CollectionHolderFactory_56(SingleTypeCollectionReplicationTest _enclosing ) { this._enclosing = _enclosing; } public override CollectionHolder NewCollectionHolder() { return this._enclosing.Initialize(new CollectionHolder("Hashtable", new Hashtable (), new HashSet(), new ArrayList())); } public override string Label() { return "Hashtable"; } private readonly SingleTypeCollectionReplicationTest _enclosing; } private SingleTypeCollectionReplicationTest.CollectionHolderFactory Collection2() { return new _CollectionHolderFactory_74(this); } private sealed class _CollectionHolderFactory_74 : SingleTypeCollectionReplicationTest.CollectionHolderFactory { public _CollectionHolderFactory_74(SingleTypeCollectionReplicationTest _enclosing ) { this._enclosing = _enclosing; } public override CollectionHolder NewCollectionHolder() { return this._enclosing.Initialize(new CollectionHolder("HashMap", new Dictionary< string, string>(), new HashSet(), new List())); } public override string Label() { return "HashMap"; } private readonly SingleTypeCollectionReplicationTest _enclosing; } private SingleTypeCollectionReplicationTest.CollectionHolderFactory Collection3() { return new _CollectionHolderFactory_92(this); } private sealed class _CollectionHolderFactory_92 : SingleTypeCollectionReplicationTest.CollectionHolderFactory { public _CollectionHolderFactory_92(SingleTypeCollectionReplicationTest _enclosing ) { this._enclosing = _enclosing; } public override CollectionHolder NewCollectionHolder() { return this._enclosing.Initialize(new CollectionHolder("TreeMap", new SortedList< string, string>(), new HashSet(), new ArrayList())); } public override string Label() { return "TreeMap"; } private readonly SingleTypeCollectionReplicationTest _enclosing; } private CollectionHolder Initialize(CollectionHolder h1) { h1.Map()["1"] = "one"; h1.Map()["2"] = "two"; h1.Set().Add("two"); h1.List().Add("three"); return h1; } public override Type[] TestUnits() { return new Type[] { typeof(SingleTypeCollectionReplicationTest.TestUnit) }; } public class TestUnit : DrsTestCase { protected override void Configure(IConfiguration config) { LabeledObject transparentActivation = (LabeledObject)TransparentActivationFixture .Value; if ((bool)transparentActivation.Value()) { config.Add(new TransparentActivationSupport()); } } public virtual void Test() { CollectionHolder h1 = Subject(); StoreNewAndCommit(A().Provider(), h1); ReplicateAll(A().Provider(), B().Provider()); IEnumerator it = B().Provider().GetStoredObjects(typeof(CollectionHolder)).GetEnumerator (); Assert.IsTrue(it.MoveNext()); CollectionHolder replica = (CollectionHolder)it.Current; B().Provider().Activate(replica); AssertSameClassIfDb4o(h1.Map(), replica.Map()); foreach (object key in h1.Map().Keys) { B().Provider().Activate(replica.Map()); Assert.AreEqual(h1.Map()[key], replica.Map()[key]); } AssertSameClassIfDb4o(h1.Set(), replica.Set()); foreach (object element in h1.Set()) { Assert.IsTrue(replica.Set().Contains(element)); } AssertSameClassIfDb4o(h1.List(), replica.List()); Assert.AreEqual(h1.List().Count, replica.List().Count); CollectionAssert.AreEqual(h1.List(), replica.List()); } private CollectionHolder Subject() { SingleTypeCollectionReplicationTest.CollectionHolderFactory factory = (SingleTypeCollectionReplicationTest.CollectionHolderFactory )SubjectFixtureProvider.Value(); return factory.NewCollectionHolder(); } private void AssertSameClassIfDb4o(object expectedInstance, object actualInstance ) { if (!IsDb4oProvider(A())) { return; } if (!IsDb4oProvider(B())) { return; } Assert.AreSame(expectedInstance.GetType(), actualInstance.GetType()); } private bool IsDb4oProvider(IDrsProviderFixture fixture) { return fixture.Provider() is IDb4oReplicationProvider; } private void StoreNewAndCommit(ITestableReplicationProviderInside provider, CollectionHolder h1) { provider.StoreNew(h1); provider.Activate(h1); provider.Commit(); } } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/BidirectionalReplicationTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/BidirectionalReplicationTe0000644000175000017500000000632011520622636033036 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class BidirectionalReplicationTestCase : DrsTestCase { public virtual void TestObjectsAreOnlyReplicatedOnce() { ITestableReplicationProviderInside providerA = A().Provider(); ITestableReplicationProviderInside providerB = B().Provider(); StoreNewPilotIn(providerA); int replicatedObjects = ReplicateBidirectional(providerA, providerB, null); Assert.AreEqual(1, replicatedObjects); ModifyPilotIn(providerA, "modifiedInA"); replicatedObjects = ReplicateBidirectional(providerA, providerB, typeof(Pilot)); Assert.AreEqual(1, replicatedObjects); ModifyPilotIn(providerB, "modifiedInB"); replicatedObjects = ReplicateBidirectional(providerA, providerB, null); Assert.AreEqual(1, replicatedObjects); StoreNewPilotIn(providerA); StoreNewPilotIn(providerB); replicatedObjects = ReplicateBidirectional(providerA, providerB, typeof(Pilot)); Assert.AreEqual(2, replicatedObjects); } private void ModifyPilotIn(ITestableReplicationProviderInside provider, string newName ) { Pilot pilot; pilot = (Pilot)provider.GetStoredObjects(typeof(Pilot)).Next(); pilot.SetName(newName); provider.Update(pilot); provider.Commit(); provider.WaitForPreviousCommits(); } private int ReplicateBidirectional(ITestableReplicationProviderInside providerA, ITestableReplicationProviderInside providerB, Type clazz) { int replicatedObjects = 0; IReplicationSession replicationSession = Replication.Begin(providerA, providerB, null, _fixtures.reflector); IObjectSet changedInA = clazz == null ? providerA.ObjectsChangedSinceLastReplication () : providerA.ObjectsChangedSinceLastReplication(clazz); foreach (object obj in changedInA) { replicatedObjects++; replicationSession.Replicate(obj); } IObjectSet changedInB = clazz == null ? providerB.ObjectsChangedSinceLastReplication () : providerB.ObjectsChangedSinceLastReplication(clazz); foreach (object obj in changedInB) { replicatedObjects++; replicationSession.Replicate(obj); } replicationSession.Commit(); return replicatedObjects; } private void StoreNewPilotIn(ITestableReplicationProviderInside provider) { Pilot pilot = new Pilot(); provider.StoreNew(pilot); provider.Commit(); provider.WaitForPreviousCommits(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oDrsTestSuite.cs0000644000175000017500000000221711520622636031323 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Db4o; using Db4objects.Drs.Tests.Dotnet; namespace Db4objects.Drs.Tests { public partial class Db4oDrsTestSuite : VersantDrsTestSuite, IDb4oTestCase { private Type[] SpecificTestCases() { return new Type[] { typeof(StructTestCase), typeof(UntypedFieldTestCase), typeof( PartialCollectionReplicationTestCase), typeof(TheSimplestWithCallConstructors) }; } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/MixedTypesCollectionReplicationTest.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/MixedTypesCollectionReplic0000644000175000017500000000707611520622640033055 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class MixedTypesCollectionReplicationTest : DrsTestCase { protected virtual void ActualTest() { if (!A().Provider().SupportsHybridCollection()) { return; } if (!B().Provider().SupportsHybridCollection()) { return; } CollectionHolder h1 = new CollectionHolder("h1"); CollectionHolder h2 = new CollectionHolder("h2"); h1.Map()["key"] = "value"; h1.Map()["key2"] = h1; h1.Map()[h1] = "value2"; h2.Map()["key"] = h1; h2.Map()[h2] = h1; h1.List().Add("one"); h1.List().Add(h1); h2.List().Add("two"); h2.List().Add(h1); h2.List().Add(h2); h1.Set().Add("one"); h1.Set().Add(h1); h2.Set().Add("two"); h2.Set().Add(h1); h2.Set().Add(h2); B().Provider().StoreNew(h2); B().Provider().StoreNew(h1); IReplicationSession replication = new GenericReplicationSession(A().Provider(), B ().Provider()); replication.Replicate(h2); //Traverses to h1. replication.Commit(); IEnumerator objects = A().Provider().GetStoredObjects(typeof(CollectionHolder)).GetEnumerator (); Check(NextCollectionHolder(objects), h1, h2); Check(NextCollectionHolder(objects), h1, h2); } private CollectionHolder NextCollectionHolder(IEnumerator objects) { Assert.IsTrue(objects.MoveNext()); return (CollectionHolder)objects.Current; } private void Check(CollectionHolder holder, CollectionHolder original1, CollectionHolder original2) { Assert.IsTrue(holder != original1); Assert.IsTrue(holder != original2); if (holder.Name().Equals("h1")) { CheckH1(holder); } else { CheckH2(holder); } } private void CheckH1(CollectionHolder holder) { Assert.AreEqual("value", holder.Map()["key"]); Assert.AreEqual(holder, holder.Map()["key2"]); Assert.AreEqual("value2", holder.Map()[holder]); Assert.AreEqual("one", holder.List()[0]); Assert.AreEqual(holder, holder.List()[1]); Assert.IsTrue(holder.Set().Contains("one")); Assert.IsTrue(holder.Set().Contains(holder)); } private void CheckH2(CollectionHolder holder) { Assert.AreEqual("h1", ((CollectionHolder)holder.Map()["key"]).Name()); Assert.AreEqual("h1", ((CollectionHolder)holder.Map()[holder]).Name()); Assert.AreEqual("two", holder.List()[0]); Assert.AreEqual("h1", ((CollectionHolder)holder.List()[1]).Name()); Assert.AreEqual(holder, holder.List()[2]); Assert.IsTrue(holder.Set().Remove("two")); Assert.IsTrue(holder.Set().Remove(holder)); CollectionHolder remaining = NextCollectionHolder(holder.Set().GetEnumerator()); Assert.AreEqual("h1", remaining.Name()); } public virtual void Test() { ActualTest(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/0000755000175000017500000000000011520622056027761 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/Set4Testcase.cs0000644000175000017500000000273311520622636032634 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Tests.Foundation; namespace Db4objects.Drs.Tests.Foundation { public class Set4Testcase : ITestCase { public virtual void TestSingleElementIteration() { Set4 set = NewSet("first"); Assert.AreEqual("first", Iterators.Next(set.GetEnumerator())); } public virtual void TestContainsAll() { Set4 set = NewSet("42"); set.Add("foo"); Assert.IsTrue(set.ContainsAll(NewSet("42"))); Assert.IsTrue(set.ContainsAll(NewSet("foo"))); Assert.IsTrue(set.ContainsAll(set)); Set4 other = new Set4(set); other.Add("bar"); Assert.IsFalse(set.ContainsAll(other)); } private Set4 NewSet(string firstElement) { Set4 set = new Set4(); set.Add(firstElement); return set; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/Set4.cs0000644000175000017500000000374711520622636031146 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o.Foundation; namespace Db4objects.Drs.Tests.Foundation { public class Set4 : IEnumerable { public static readonly Db4objects.Drs.Tests.Foundation.Set4 EmptySet = new Db4objects.Drs.Tests.Foundation.Set4 (0); private readonly Hashtable4 _table; public Set4() { _table = new Hashtable4(); } public Set4(int size) { _table = new Hashtable4(size); } public Set4(IEnumerable keys) : this() { AddAll(keys); } public virtual void Add(object element) { _table.Put(element, element); } public virtual void AddAll(IEnumerable other) { IEnumerator i = other.GetEnumerator(); while (i.MoveNext()) { Add(i.Current); } } public virtual bool IsEmpty() { return _table.Size() == 0; } public virtual int Size() { return _table.Size(); } public virtual bool Contains(object element) { return _table.Get(element) != null; } public virtual bool ContainsAll(Db4objects.Drs.Tests.Foundation.Set4 other) { return _table.ContainsAllKeys(other); } public virtual IEnumerator GetEnumerator() { return _table.Keys(); } public override string ToString() { return Iterators.Join(GetEnumerator(), "[", "]", ", "); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/AllTests.cs0000644000175000017500000000217011520622636032047 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Drs.Tests.Foundation; namespace Db4objects.Drs.Tests.Foundation { public class AllTests : ReflectionTestSuite { public static void Main(string[] args) { new Db4objects.Drs.Tests.Foundation.AllTests().Run(); } protected override Type[] TestCases() { return new Type[] { typeof(ObjectSetCollection4FacadeTestCase), typeof(Set4Testcase ), typeof(SignatureTestCase) }; } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/SignatureTestCase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Foundation/SignatureTestCa0000644000175000017500000000243611520622636032762 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Encoding; using Db4objects.Drs.Foundation; namespace Db4objects.Drs.Tests.Foundation { public class SignatureTestCase : ITestCase { public virtual void Test() { StatefulBuffer writer = new StatefulBuffer(null, 300); string stringRepresentation = SignatureGenerator.GenerateSignature(); new LatinStringIO().Write(writer, stringRepresentation); Signature signature = new Signature(writer.GetWrittenBytes()); Assert.AreEqual(stringRepresentation, signature.ToString()); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/CustomArrayListTestCase.cs0000644000175000017500000000262011520622636032747 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class CustomArrayListTestCase : DrsTestCase { public virtual void Test() { NamedList original = new NamedList("foo"); original.Add("bar"); A().Provider().StoreNew(original); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider()); IEnumerator iterator = B().Provider().GetStoredObjects(typeof(NamedList)).GetEnumerator (); Assert.IsTrue(iterator.MoveNext()); NamedList replicated = (NamedList)iterator.Current; Assert.AreEqual(original.Name(), replicated.Name()); CollectionAssert.AreEqual(original, replicated); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TimestampTestCase.cs0000644000175000017500000000614511520622640031606 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class TimestampTestCase : DrsTestCase { public virtual void Test() { ITestableReplicationProviderInside providerA = A().Provider(); ITestableReplicationProviderInside providerB = B().Provider(); providerA.StoreNew(new Pilot()); providerA.Commit(); IReplicationSession replication = Replication.Begin(providerA, providerB, null, _fixtures .reflector); TimeStamps initialTimeStampsB = AssertTimeStampsForFirstReplication(providerB); IObjectSet modifiedObjects = providerA.ObjectsChangedSinceLastReplication(); while (modifiedObjects.HasNext()) { replication.Replicate(modifiedObjects.Next()); } replication.Commit(); Pilot replicatedPilot = (Pilot)providerB.GetStoredObjects(typeof(Pilot)).Next(); long version = providerB.ObjectVersion(replicatedPilot); Assert.AreEqual(initialTimeStampsB.Commit(), version); replication = Replication.Begin(providerA, providerB, null, _fixtures.reflector); TimeStamps timestampsBAfterReplication = AssertTimeStampsForSecondReplication(initialTimeStampsB , providerB); replication.Commit(); Pilot pilotStoredAfterReplication = new Pilot(); providerB.StoreNew(pilotStoredAfterReplication); providerB.Commit(); providerB.WaitForPreviousCommits(); version = providerB.ObjectVersion(pilotStoredAfterReplication); Assert.IsGreater(timestampsBAfterReplication.Commit(), version); } private TimeStamps AssertTimeStampsForFirstReplication(ITestableReplicationProviderInside provider) { TimeStamps timeStamps = provider.TimeStamps(); Assert.IsNotNull(timeStamps); Assert.AreEqual(0, timeStamps.From()); Assert.IsGreater(0, timeStamps.To()); Assert.AreEqual(timeStamps.To() + 1, timeStamps.Commit()); return timeStamps; } private TimeStamps AssertTimeStampsForSecondReplication(TimeStamps initialTimeStamps , ITestableReplicationProviderInside provider) { TimeStamps timeStamps = provider.TimeStamps(); Assert.IsNotNull(timeStamps); Assert.AreEqual(initialTimeStamps.Commit(), timeStamps.From()); Assert.IsGreater(timeStamps.From(), timeStamps.To()); Assert.AreEqual(timeStamps.To() + 1, timeStamps.Commit()); return timeStamps; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ArrayReplicationTest.cs0000644000175000017500000000575411520622636032331 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ArrayReplicationTest : DrsTestCase { public virtual void Test() { if (!A().Provider().SupportsMultiDimensionalArrays()) { return; } if (!B().Provider().SupportsMultiDimensionalArrays()) { return; } ArrayHolder h1 = new ArrayHolder("h1"); ArrayHolder h2 = new ArrayHolder("h2"); h1._array = new ArrayHolder[] { h1 }; h2._array = new ArrayHolder[] { h1, h2, null }; h1._arrayN = new ArrayHolder[][] { new ArrayHolder[] { h1 } }; h2._arrayN = new ArrayHolder[][] { new ArrayHolder[] { h1, null }, new ArrayHolder [] { null, h2 }, new ArrayHolder[] { null, null } }; //TODO Fix ReflectArray.shape() and test with innermost arrays of varying sizes: {{h1}, {null, h2}, {null}} B().Provider().StoreNew(h2); B().Provider().StoreNew(h1); B().Provider().Commit(); IReplicationSession replication = new GenericReplicationSession(A().Provider(), B ().Provider(), null, _fixtures.reflector); replication.Replicate(h2); //Traverses to h1. replication.Commit(); IEnumerator objects = A().Provider().GetStoredObjects(typeof(ArrayHolder)).GetEnumerator (); CheckNext(objects); CheckNext(objects); Assert.IsFalse(objects.MoveNext()); } private void CheckNext(IEnumerator objects) { Assert.IsTrue(objects.MoveNext()); Check((ArrayHolder)objects.Current); } private void Check(ArrayHolder holder) { if (holder.GetName().Equals("h1")) { CheckH1(holder); } else { CheckH2(holder); } } protected virtual void CheckH1(ArrayHolder holder) { Assert.AreEqual(holder.Array()[0], holder); Assert.AreEqual(holder.ArrayN()[0][0], holder); } protected virtual void CheckH2(ArrayHolder holder) { Assert.AreEqual(holder.Array()[0].GetName(), "h1"); Assert.AreEqual(holder.Array()[1], holder); Assert.AreEqual(holder.Array()[2], null); Assert.AreEqual(holder.ArrayN()[0][0].GetName(), "h1"); Assert.AreEqual(holder.ArrayN()[1][0], null); Assert.AreEqual(holder.ArrayN()[1][1], holder); Assert.AreEqual(holder.ArrayN()[2][0], null); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/SimpleParentChild.cs0000644000175000017500000000624511520622640031557 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class SimpleParentChild : DrsTestCase { public virtual void Test() { StoreParentAndChildToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyParentInProviderB(); ReplicateAllStep2(); ModifyParentAndChildInProviderA(); ReplicateParentClassStep3(); } private void EnsureNames(IDrsProviderFixture fixture, string parentName, string childName ) { EnsureOneInstanceOfParentAndChild(fixture); SPCParent parent = (SPCParent)GetOneInstance(fixture, typeof(SPCParent)); if (!parent.GetName().Equals(parentName)) { Sharpen.Runtime.Out.WriteLine("expected = " + parentName); Sharpen.Runtime.Out.WriteLine("actual = " + parent.GetName()); } Assert.AreEqual(parentName, parent.GetName()); Assert.AreEqual(childName, parent.GetChild().GetName()); } private void EnsureOneInstanceOfParentAndChild(IDrsProviderFixture fixture) { EnsureOneInstance(fixture, typeof(SPCParent)); EnsureOneInstance(fixture, typeof(SPCChild)); } private void ModifyParentAndChildInProviderA() { SPCParent parent = (SPCParent)GetOneInstance(A(), typeof(SPCParent)); parent.SetName("p3"); SPCChild child = parent.GetChild(); child.SetName("c3"); A().Provider().Update(parent); A().Provider().Update(child); A().Provider().Commit(); EnsureNames(A(), "p3", "c3"); } private void ModifyParentInProviderB() { SPCParent parent = (SPCParent)GetOneInstance(B(), typeof(SPCParent)); parent.SetName("p2"); B().Provider().Update(parent); B().Provider().Commit(); EnsureNames(B(), "p2", "c1"); } private void ReplicateAllStep2() { ReplicateAll(B().Provider(), A().Provider()); EnsureNames(A(), "p2", "c1"); EnsureNames(B(), "p2", "c1"); } private void ReplicateAllToProviderBFirstTime() { ReplicateAll(A().Provider(), B().Provider()); EnsureNames(A(), "p1", "c1"); EnsureNames(B(), "p1", "c1"); } private void ReplicateParentClassStep3() { ReplicateClass(A().Provider(), B().Provider(), typeof(SPCParent)); EnsureNames(A(), "p3", "c3"); EnsureNames(B(), "p3", "c3"); } private void StoreParentAndChildToProviderA() { SPCChild child = new SPCChild("c1"); SPCParent parent = new SPCParent(child, "p1"); A().Provider().StoreNew(parent); A().Provider().Commit(); EnsureNames(A(), "p1", "c1"); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DrsFixtureVariable.cs0000644000175000017500000000216511520622636031757 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class DrsFixtureVariable { private static readonly FixtureVariable _variable = new FixtureVariable("drs"); public static DrsFixture Value() { return (DrsFixture)_variable.Value; } public static object With(DrsFixture pair, IClosure4 closure) { return _variable.With(pair, closure); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DrsTestSuiteBuilder.cs0000644000175000017500000000420211520622636032115 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Tests; using Sharpen; namespace Db4objects.Drs.Tests { public class DrsTestSuiteBuilder : ReflectionTestSuiteBuilder { private DrsFixture _fixtures; public DrsTestSuiteBuilder(IDrsProviderFixture a, IDrsProviderFixture b, Type clazz ) : this(a, b, new Type[] { clazz }, null) { } public DrsTestSuiteBuilder(IDrsProviderFixture a, IDrsProviderFixture b, Type clazz , IReflector reflector) : this(a, b, new Type[] { clazz }, reflector) { } public DrsTestSuiteBuilder(IDrsProviderFixture a, IDrsProviderFixture b, Type[] classes , IReflector reflector) : base(AppendDestructor(classes)) { _fixtures = new DrsFixture(a, b, reflector); } private static Type[] AppendDestructor(Type[] classes) { Type[] newClasses = new Type[classes.Length + 1]; System.Array.Copy(classes, 0, newClasses, 0, classes.Length); newClasses[newClasses.Length - 1] = typeof(DrsTestSuiteBuilder.DrsFixtureDestructor ); return newClasses; } public class DrsFixtureDestructor : ITestCase { public virtual void TestFixtureDestruction() { DrsFixture fixturePair = DrsFixtureVariable.Value(); fixturePair.a.Destroy(); fixturePair.b.Destroy(); } } protected override object WithContext(IClosure4 closure) { return DrsFixtureVariable.With(_fixtures, closure); } } } ././@LongLink0000000000000000000000000000016200000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/EqualsHashCodeOverriddenTestCaseBase.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/EqualsHashCodeOverriddenTe0000644000175000017500000000543311520622636032753 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; using Db4objects.Drs; using Db4objects.Drs.Db4o; using Db4objects.Drs.Tests; namespace Db4objects.Drs.Tests { public class EqualsHashCodeOverriddenTestCaseBase : ITestCase { public class Item { public string _name; public Item(string name) { _name = name; } public override bool Equals(object obj) { if (obj == this) { return true; } if (obj == null || GetType() != obj.GetType()) { return false; } return _name.Equals(((EqualsHashCodeOverriddenTestCaseBase.Item)obj)._name); } public override int GetHashCode() { return _name.GetHashCode(); } } private IStorage _storage = new MemoryStorage(); public EqualsHashCodeOverriddenTestCaseBase() : base() { } protected virtual void AssertReplicates(object holder) { IEmbeddedObjectContainer sourceDb = OpenContainer("source"); sourceDb.Store(holder); sourceDb.Commit(); IEmbeddedObjectContainer targetDb = OpenContainer("target"); try { Db4oEmbeddedReplicationProvider providerA = new Db4oEmbeddedReplicationProvider(sourceDb ); Db4oEmbeddedReplicationProvider providerB = new Db4oEmbeddedReplicationProvider(targetDb ); IReplicationSession replication = Replication.Begin(providerA, providerB); IObjectSet changed = replication.ProviderA().ObjectsChangedSinceLastReplication(); while (changed.HasNext()) { object o = changed.Next(); if (holder.GetType() == o.GetType()) { replication.Replicate(o); break; } } replication.Commit(); } finally { sourceDb.Close(); targetDb.Close(); } } private IEmbeddedObjectContainer OpenContainer(string filePath) { IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration(); config.File.Storage = _storage; config.File.GenerateUUIDs = ConfigScope.Globally; config.File.GenerateCommitTimestamps = true; return Db4oEmbedded.OpenFile(config, filePath); } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TheSimplestWithCallConstructors.csdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/TheSimplestWithCallConstru0000644000175000017500000000213511520622640033045 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Config; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class TheSimplestWithCallConstructors : TheSimplest { protected override void Configure(IConfiguration config) { config.CallConstructors(true); } protected override SPCChild CreateChildObject(string name) { return new SPCChildWithoutDefaultConstructor(name); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/ReplicationProviderTest.cs0000644000175000017500000002440111520622640033026 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Drs.Foundation; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class ReplicationProviderTest : DrsTestCase { protected byte[] BSignatureBytes; protected IReadonlyReplicationProviderSignature BSignature; private IReadonlyReplicationProviderSignature ASignature; public virtual void TestReplicationLifeCycle() { BSignatureBytes = B().Provider().GetSignature().GetSignature(); ASignature = A().Provider().GetSignature(); BSignature = B().Provider().GetSignature(); TstObjectUpdate(); TstSignature(); TstObjectsChangedSinceLastReplication(); TstReferences(); TstStore(); TstRollback(); TstDeletion(); } protected virtual void TstDeletion() { A().Provider().StoreNew(new Pilot("Pilot1", 42)); Pilot o = new Pilot("Pilot2", 43); A().Provider().StoreNew(o); A().Provider().Commit(); A().Provider().StoreNew(new Pilot("Pilot3", 44)); A().Provider().Delete(FindPilot("Pilot1")); Car car = new Car("Car1"); car.SetPilot(FindPilot("Pilot2")); A().Provider().StoreNew(car); A().Provider().Commit(); StartReplication(); IDrsUUID uuidCar1 = Uuid(FindCar("Car1")); Assert.IsNotNull(uuidCar1); A().Provider().ReplicateDeletion(uuidCar1); CommitReplication(); Assert.IsNull(FindCar("Car1")); StartReplication(); IDrsUUID uuidPilot2 = Uuid(FindPilot("Pilot2")); Assert.IsNotNull(uuidPilot2); A().Provider().ReplicateDeletion(uuidPilot2); CommitReplication(); Assert.IsNull(FindPilot("Pilot2")); } private void CommitReplication() { A().Provider().CommitReplicationTransaction(); B().Provider().CommitReplicationTransaction(); } private object FindCar(string model) { IEnumerator cars = A().Provider().GetStoredObjects(typeof(Car)).GetEnumerator(); while (cars.MoveNext()) { Car candidate = (Car)cars.Current; if (candidate.GetModel().Equals(model)) { return candidate; } } return null; } private Pilot FindPilot(string name) { IEnumerator pilots = A().Provider().GetStoredObjects(typeof(Pilot)).GetEnumerator (); while (pilots.MoveNext()) { Pilot candidate = (Pilot)pilots.Current; if (candidate.Name().Equals(name)) { return candidate; } } return null; } private SPCChild GetOneChildFromA() { return GetOneChild(A()); } private SPCChild GetOneChild(IDrsProviderFixture fixture) { IObjectSet storedObjects = fixture.Provider().GetStoredObjects(typeof(SPCChild)); Assert.AreEqual(1, storedObjects.Count); IEnumerator iterator = storedObjects.GetEnumerator(); Assert.IsTrue(iterator.MoveNext()); return (SPCChild)iterator.Current; } private void StartReplication() { A().Provider().StartReplicationTransaction(BSignature); B().Provider().StartReplicationTransaction(ASignature); } private void TstObjectUpdate() { SPCChild child = new SPCChild("c1"); A().Provider().StoreNew(child); A().Provider().Commit(); StartReplication(); SPCChild reloaded = GetOneChildFromA(); long oldVer = A().Provider().ProduceReference(reloaded, null, null).Version(); CommitReplication(); SPCChild reloaded2 = GetOneChildFromA(); reloaded2.SetName("c3"); //System.out.println("==============BEGIN DEBUG"); A().Provider().Update(reloaded2); A().Provider().Commit(); //System.out.println("==============END DEBUG"); StartReplication(); SPCChild reloaded3 = GetOneChildFromA(); long newVer = A().Provider().ProduceReference(reloaded3, null, null).Version(); CommitReplication(); Assert.IsGreater(oldVer, newVer); } private void TstObjectsChangedSinceLastReplication() { Pilot object1 = new Pilot("John Cleese", 42); Pilot object2 = new Pilot("Terry Gilliam", 53); Car object3 = new Car("Volvo"); A().Provider().StoreNew(object1); A().Provider().StoreNew(object2); A().Provider().StoreNew(object3); A().Provider().Commit(); StartReplication(); IObjectSet changed = A().Provider().ObjectsChangedSinceLastReplication(); Assert.AreEqual(3, changed.Count); IObjectSet os = A().Provider().ObjectsChangedSinceLastReplication(typeof(Pilot)); Assert.AreEqual(2, os.Count); IEnumerator pilots = os.GetEnumerator(); // Assert.isTrue(pilots.contains(findPilot("John Cleese"))); // Assert.isTrue(pilots.contains(findPilot("Terry Gilliam"))); IEnumerator cars = A().Provider().ObjectsChangedSinceLastReplication(typeof(Car)) .GetEnumerator(); Assert.AreEqual("Volvo", ((Car)Next(cars)).GetModel()); Assert.IsFalse(cars.MoveNext()); CommitReplication(); StartReplication(); Assert.IsFalse(A().Provider().ObjectsChangedSinceLastReplication().GetEnumerator( ).MoveNext()); CommitReplication(); Pilot pilot = (Pilot)Next(A().Provider().GetStoredObjects(typeof(Pilot)).GetEnumerator ()); pilot.SetName("Terry Jones"); Car car = (Car)Next(A().Provider().GetStoredObjects(typeof(Car)).GetEnumerator()); car.SetModel("McLaren"); A().Provider().Update(pilot); A().Provider().Update(car); A().Provider().Commit(); StartReplication(); Assert.AreEqual(2, A().Provider().ObjectsChangedSinceLastReplication().Count); pilots = A().Provider().ObjectsChangedSinceLastReplication(typeof(Pilot)).GetEnumerator (); Assert.AreEqual("Terry Jones", ((Pilot)Next(pilots)).Name()); Assert.IsFalse(pilots.MoveNext()); cars = A().Provider().ObjectsChangedSinceLastReplication(typeof(Car)).GetEnumerator (); Assert.AreEqual("McLaren", ((Car)Next(cars)).GetModel()); Assert.IsFalse(cars.MoveNext()); CommitReplication(); A().Provider().DeleteAllInstances(typeof(Pilot)); A().Provider().DeleteAllInstances(typeof(Car)); A().Provider().Commit(); } private object Next(IEnumerator iterator) { Assert.IsTrue(iterator.MoveNext()); return iterator.Current; } private void TstReferences() { Pilot pilot = new Pilot("tst References", 42); A().Provider().StoreNew(pilot); A().Provider().Commit(); StartReplication(); Pilot object1 = (Pilot)Next(A().Provider().GetStoredObjects(typeof(Pilot)).GetEnumerator ()); IReplicationReference reference = A().Provider().ProduceReference(object1, null, null); Assert.AreEqual(object1, reference.Object()); IDrsUUID uuid = reference.Uuid(); IReplicationReference ref2 = A().Provider().ProduceReferenceByUUID(uuid, typeof(Pilot )); Assert.AreEqual(reference, ref2); A().Provider().ClearAllReferences(); IDrsUUID db4oUUID = A().Provider().ProduceReference(object1, null, null).Uuid(); Assert.AreEqual(uuid, db4oUUID); CommitReplication(); A().Provider().DeleteAllInstances(typeof(Pilot)); A().Provider().Commit(); } private void TstRollback() { if (!A().Provider().SupportsRollback()) { return; } if (!B().Provider().SupportsRollback()) { return; } StartReplication(); Pilot object1 = new Pilot("Albert Kwan", 25); IDrsUUID uuid = new DrsUUIDImpl(new Db4oUUID(5678, BSignatureBytes)); IReplicationReference @ref = new ReplicationReferenceImpl(object1, uuid, 1); A().Provider().ReferenceNewObject(object1, @ref, null, null); A().Provider().StoreReplica(object1); Assert.IsFalse(A().Provider().WasModifiedSinceLastReplication(@ref)); A().Provider().RollbackReplication(); A().Provider().StartReplicationTransaction(BSignature); Assert.IsNull(A().Provider().ProduceReference(object1, null, null)); IReplicationReference byUUID = A().Provider().ProduceReferenceByUUID(uuid, object1 .GetType()); Assert.IsNull(byUUID); A().Provider().RollbackReplication(); B().Provider().RollbackReplication(); } private void TstSignature() { Assert.IsNotNull(A().Provider().GetSignature()); } private void TstStore() { StartReplication(); Pilot object1 = new Pilot("John Cleese", 42); IDrsUUID uuid = new DrsUUIDImpl(new Db4oUUID(15, BSignatureBytes)); IReplicationReference @ref = new ReplicationReferenceImpl("ignoredSinceInOtherProvider" , uuid, 1); A().Provider().ReferenceNewObject(object1, @ref, null, null); A().Provider().StoreReplica(object1); IReplicationReference reference = A().Provider().ProduceReferenceByUUID(uuid, object1 .GetType()); Assert.AreEqual(reference, A().Provider().ProduceReference(object1, null, null)); Assert.AreEqual(object1, reference.Object()); CommitReplication(); StartReplication(); IEnumerator storedObjects = A().Provider().GetStoredObjects(typeof(Pilot)).GetEnumerator (); Pilot reloaded = (Pilot)Next(storedObjects); Assert.IsFalse(storedObjects.MoveNext()); reference = A().Provider().ProduceReferenceByUUID(uuid, object1.GetType()); Assert.AreEqual(reference, A().Provider().ProduceReference(reloaded, null, null)); reloaded.SetName("i am updated"); A().Provider().StoreReplica(reloaded); A().Provider().ClearAllReferences(); CommitReplication(); StartReplication(); reference = A().Provider().ProduceReferenceByUUID(uuid, reloaded.GetType()); Assert.AreEqual("i am updated", ((Pilot)reference.Object()).Name()); CommitReplication(); A().Provider().DeleteAllInstances(typeof(Pilot)); A().Provider().Commit(); } private IDrsUUID Uuid(object obj) { return A().Provider().ProduceReference(obj, null, null).Uuid(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Dotnet/0000755000175000017500000000000011520622062027105 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Dotnet/StructTestCase.cs0000644000175000017500000000371011520622636032364 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Dotnet { public class StructTestCase : DrsTestCase { internal Container template = new Container(new Value(42)); public virtual void Test() { StoreToProviderA(); ReplicateAllToProviderB(); } internal virtual void StoreToProviderA() { ITestableReplicationProviderInside provider = A().Provider(); provider.StoreNew(template); provider.Commit(); EnsureContent(template, provider); } internal virtual void ReplicateAllToProviderB() { ReplicateAll(A().Provider(), B().Provider()); EnsureContent(template, B().Provider()); } private void EnsureContent(Container container, ITestableReplicationProviderInside provider) { IObjectSet result = provider.GetStoredObjects(container.GetType()); Assert.AreEqual(1, result.Count); Container c = Next(result); Assert.AreEqual(template.GetValue(), c.GetValue()); } private Container Next(IObjectSet result) { IEnumerator iterator = result.GetEnumerator(); if (iterator.MoveNext()) { return (Container)iterator.Current; } return null; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DrsTestCase.cs0000644000175000017500000001610711520622636030377 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Drs; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; using Sharpen.Lang; namespace Db4objects.Drs.Tests { public abstract class DrsTestCase : ITestCase, ITestLifeCycle { public static readonly Type[] mappings; public static readonly Type[] extraMappingsForCleaning = new Type[] { typeof(IList ), typeof(IDictionary) }; static DrsTestCase() { mappings = new Type[] { typeof(Car), typeof(CollectionHolder), typeof(ListContent ), typeof(ListHolder), typeof(MapContent), typeof(Pilot), typeof(R0), typeof(Replicated ), typeof(SimpleArrayContent), typeof(SimpleArrayHolder), typeof(SimpleItem), typeof( SimpleListHolder), typeof(SPCChild), typeof(SPCParent), typeof(ItemWithUntypedField ), typeof(ItemDates), typeof(NamedList), typeof(ItemWithCloneable) }; } protected readonly DrsFixture _fixtures = DrsFixtureVariable.Value(); private Db4objects.Drs.Inside.ReplicationReflector _reflector; /// public virtual void SetUp() { CleanBoth(); ConfigureBoth(); OpenBoth(); Store(); Reopen(); } private void CleanBoth() { A().Clean(); B().Clean(); } protected virtual void Clean() { for (int i = 0; i < mappings.Length; i++) { A().Provider().DeleteAllInstances(mappings[i]); B().Provider().DeleteAllInstances(mappings[i]); } for (int i = 0; i < extraMappingsForCleaning.Length; i++) { A().Provider().DeleteAllInstances(extraMappingsForCleaning[i]); B().Provider().DeleteAllInstances(extraMappingsForCleaning[i]); } A().Provider().Commit(); B().Provider().Commit(); } protected virtual void Store() { } private void ConfigureBoth() { ConfigureInitial(_fixtures.a); ConfigureInitial(_fixtures.b); } private void ConfigureInitial(IDrsProviderFixture fixture) { IConfiguration config = Db4oConfiguration(fixture); if (config == null) { return; } config.GenerateUUIDs(ConfigScope.Globally); config.GenerateCommitTimestamps(true); Configure(config); } private IConfiguration Db4oConfiguration(IDrsProviderFixture fixture) { if (!(fixture is Db4oDrsFixture)) { return null; } return ((Db4oDrsFixture)fixture).Config(); } protected virtual void Configure(IConfiguration config) { } /// protected virtual void Reopen() { CloseBoth(); OpenBoth(); } /// private void OpenBoth() { A().Open(); B().Open(); _reflector = new Db4objects.Drs.Inside.ReplicationReflector(A().Provider(), B().Provider (), _fixtures.reflector); A().Provider().ReplicationReflector(_reflector); B().Provider().ReplicationReflector(_reflector); } /// public virtual void TearDown() { CloseBoth(); CleanBoth(); } /// private void CloseBoth() { A().Close(); B().Close(); } public virtual IDrsProviderFixture A() { return _fixtures.a; } public virtual IDrsProviderFixture B() { return _fixtures.b; } protected virtual void EnsureOneInstance(IDrsProviderFixture fixture, Type clazz) { EnsureInstanceCount(fixture, clazz, 1); } protected virtual void EnsureInstanceCount(IDrsProviderFixture fixture, Type clazz , int count) { IObjectSet objectSet = fixture.Provider().GetStoredObjects(clazz); Assert.AreEqual(count, objectSet.Count); } protected virtual object GetOneInstance(IDrsProviderFixture fixture, Type clazz) { IEnumerator objectSet = fixture.Provider().GetStoredObjects(clazz).GetEnumerator( ); object candidate = null; if (objectSet.MoveNext()) { candidate = objectSet.Current; if (objectSet.MoveNext()) { throw new Exception("Found more than one instance of + " + clazz + " in provider = " + fixture); } } return candidate; } protected virtual void ReplicateAll(ITestableReplicationProviderInside providerFrom , ITestableReplicationProviderInside providerTo) { IReplicationSession replication = Replication.Begin(providerFrom, providerTo, _fixtures .reflector); IObjectSet changedSet = providerFrom.ObjectsChangedSinceLastReplication(); if (changedSet.Count == 0) { throw new Exception("Can't find any objects to replicate"); } ReplicateAll(replication, changedSet.GetEnumerator()); } protected virtual void ReplicateAll(IReplicationSession replication, IEnumerator allObjects) { while (allObjects.MoveNext()) { object changed = allObjects.Current; // System.out.println("Replicating = " + changed); replication.Replicate(changed); } replication.Commit(); } protected virtual void ReplicateAll(ITestableReplicationProviderInside from, ITestableReplicationProviderInside to, IReplicationEventListener listener) { IReplicationSession replication = Replication.Begin(from, to, listener, _fixtures .reflector); ReplicateAll(replication, from.ObjectsChangedSinceLastReplication().GetEnumerator ()); } protected virtual void Delete(Type[] classes) { for (int i = 0; i < classes.Length; i++) { A().Provider().DeleteAllInstances(classes[i]); B().Provider().DeleteAllInstances(classes[i]); } A().Provider().Commit(); B().Provider().Commit(); } protected virtual void ReplicateClass(ITestableReplicationProviderInside providerA , ITestableReplicationProviderInside providerB, Type clazz) { IReplicationSession replication = Replication.Begin(providerA, providerB, null, _fixtures .reflector); IEnumerator allObjects = providerA.ObjectsChangedSinceLastReplication(clazz).GetEnumerator (); ReplicateAll(replication, allObjects); } protected static void Sleep(int millis) { try { Thread.Sleep(millis); } catch (Exception e) { throw new Exception(e.ToString()); } } protected virtual Db4objects.Drs.Inside.ReplicationReflector ReplicationReflector () { return _reflector; } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/DateReplicationTestCase.cs0000644000175000017500000000272211520622636032714 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; using Sharpen; namespace Db4objects.Drs.Tests { public class DateReplicationTestCase : DrsTestCase { public virtual void Test() { ItemDates item1 = new ItemDates(new DateTime(0), new DateTime()); ItemDates item2 = new ItemDates(new DateTime(10000), new DateTime(Runtime.CurrentTimeMillis () - 10000)); A().Provider().StoreNew(item1); A().Provider().StoreNew(item2); A().Provider().Commit(); ReplicateAll(A().Provider(), B().Provider()); IObjectSet found = B().Provider().GetStoredObjects(typeof(ItemDates)); Iterator4Assert.SameContent(new object[] { item2, item1 }, ReplicationTestPlatform .Adapt(found.GetEnumerator())); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Db4oDrsFixture.cs0000644000175000017500000000645611520622636031031 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; using Db4objects.Drs.Db4o; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Sharpen; using Sharpen.IO; namespace Db4objects.Drs.Tests { public class Db4oDrsFixture : IDrsProviderFixture { protected string _name; protected IExtObjectContainer _db; protected ITestableReplicationProviderInside _provider; protected readonly File testFile; private IConfiguration _config; internal static readonly string RamDriveProperty = "db4o.drs.path"; private static readonly string Path; static Db4oDrsFixture() { // TODO: No need to maintain the database here. It can be in the provider. string path = Runtime.GetProperty(RamDriveProperty); if (path == null) { path = Runtime.Getenv(RamDriveProperty); } if (path == null || path.Length == 0) { Sharpen.Runtime.Out.WriteLine("You can tune dRS tests by setting the environment variable " ); Sharpen.Runtime.Out.WriteLine(RamDriveProperty); Sharpen.Runtime.Out.WriteLine("to your RAM drive."); path = "."; } Path = path; } public Db4oDrsFixture(string name) : this(name, null) { } public Db4oDrsFixture(string name, IReflector reflector) { _name = name; File folder = new File(Path); if (!folder.Exists()) { Sharpen.Runtime.Out.WriteLine("Path " + Path + " does not exist. Using current working folder." ); Sharpen.Runtime.Out.WriteLine("Check the " + RamDriveProperty + " environment variable on your system." ); folder = new File("."); } testFile = new File(folder.GetPath() + "/drs_cs_" + _name + ".db4o"); if (reflector != null) { Config().ReflectWith(reflector); } } public virtual ITestableReplicationProviderInside Provider() { return _provider; } public virtual void Clean() { testFile.Delete(); _config = null; } public virtual void Close() { _provider.Destroy(); _db.Close(); _provider = null; } public virtual void Open() { _db = Db4oFactory.OpenFile(CloneConfiguration(), testFile.GetPath()).Ext(); _provider = Db4oProviderFactory.NewInstance(_db, _name); } private IConfiguration CloneConfiguration() { return (IConfiguration)((IDeepClone)Config()).DeepClone(null); } public virtual IConfiguration Config() { if (_config == null) { _config = Db4oFactory.NewConfiguration(); } return _config; } public virtual void Destroy() { } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/MapTest.cs0000644000175000017500000001101711520622640027556 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests { public class MapTest : DrsTestCase { protected virtual void ActualTest() { StoreMapToProviderA(); ReplicateAllToProviderBFirstTime(); ModifyInProviderB(); ReplicateAllStep2(); AddElementInProviderA(); ReplicateHolderStep3(); } private void StoreMapToProviderA() { MapHolder mh = new MapHolder("h1"); MapContent mc1 = new MapContent("c1"); MapContent mc2 = new MapContent("c2"); mh.Put("key1", mc1); mh.Put("key2", mc2); A().Provider().StoreNew(mh); A().Provider().Commit(); EnsureContent(A(), new string[] { "h1" }, new string[] { "key1", "key2" }, new string [] { "c1", "c2" }); } private void ReplicateAllToProviderBFirstTime() { ReplicateAll(A().Provider(), B().Provider()); EnsureContent(A(), new string[] { "h1" }, new string[] { "key1", "key2" }, new string [] { "c1", "c2" }); EnsureContent(B(), new string[] { "h1" }, new string[] { "key1", "key2" }, new string [] { "c1", "c2" }); } private void ModifyInProviderB() { MapHolder mh = (MapHolder)GetOneInstance(B(), typeof(MapHolder)); mh.SetName("h2"); MapContent mc1 = (MapContent)mh.GetMap()["key1"]; MapContent mc2 = (MapContent)mh.GetMap()["key2"]; mc1.SetName("co1"); mc2.SetName("co2"); B().Provider().Update(mc1); B().Provider().Update(mc2); B().Provider().Update(mh.GetMap()); B().Provider().Update(mh); B().Provider().Commit(); EnsureContent(B(), new string[] { "h2" }, new string[] { "key1", "key2" }, new string [] { "co1", "co2" }); } private void ReplicateAllStep2() { ReplicateAll(B().Provider(), A().Provider()); EnsureContent(A(), new string[] { "h2" }, new string[] { "key1", "key2" }, new string [] { "co1", "co2" }); EnsureContent(B(), new string[] { "h2" }, new string[] { "key1", "key2" }, new string [] { "co1", "co2" }); } private void AddElementInProviderA() { MapHolder mh = (MapHolder)GetOneInstance(A(), typeof(MapHolder)); mh.SetName("h3"); MapContent mc3 = new MapContent("co3"); A().Provider().StoreNew(mc3); mh.GetMap()["key3"] = mc3; A().Provider().Update(mh.GetMap()); A().Provider().Update(mh); A().Provider().Commit(); EnsureContent(A(), new string[] { "h3" }, new string[] { "key1", "key2", "key3" } , new string[] { "co1", "co2", "co3" }); } private void ReplicateHolderStep3() { ReplicateClass(A().Provider(), B().Provider(), typeof(MapHolder)); EnsureContent(A(), new string[] { "h3" }, new string[] { "key1", "key2", "key3" } , new string[] { "co1", "co2", "co3" }); EnsureContent(B(), new string[] { "h3" }, new string[] { "key1", "key2", "key3" } , new string[] { "co1", "co2", "co3" }); } private void EnsureContent(IDrsProviderFixture fixture, string[] holderNames, string [] keyNames, string[] valueNames) { int holderCount = holderNames.Length; EnsureInstanceCount(fixture, typeof(MapHolder), holderCount); // After dropping generating uuid for collection, it does not // make sense to count collection because collection is never reused // ensureInstanceCount(provider, Map.class, holderCount); int i = 0; IEnumerator objectSet = fixture.Provider().GetStoredObjects(typeof(MapHolder)).GetEnumerator (); while (objectSet.MoveNext()) { MapHolder lh = (MapHolder)objectSet.Current; Assert.AreEqual(holderNames[i], lh.GetName()); IDictionary Map = lh.GetMap(); for (int j = 0; j < keyNames.Length; j++) { MapContent mc = (MapContent)Map[keyNames[j]]; string name = mc.GetName(); Assert.AreEqual(valueNames[j], name); } } } public virtual void Test() { ActualTest(); } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Regression/0000755000175000017500000000000011520622070027767 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Db4objects.Drs.Tests/Regression/DRS42Test.cs0000644000175000017500000000406211520622640031761 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4objects.Db4o; using Db4objects.Drs.Inside; using Db4objects.Drs.Tests; using Db4objects.Drs.Tests.Data; namespace Db4objects.Drs.Tests.Regression { public class DRS42Test : DrsTestCase { internal NewPilot andrew = new NewPilot("Andrew", 100, new int[] { 100, 200, 300 } ); public virtual void Test() { StoreToProviderA(); ReplicateAllToProviderB(); } internal virtual void StoreToProviderA() { ITestableReplicationProviderInside provider = A().Provider(); provider.StoreNew(andrew); provider.Commit(); EnsureContent(andrew, provider); } internal virtual void ReplicateAllToProviderB() { ReplicateAll(A().Provider(), B().Provider()); EnsureContent(andrew, B().Provider()); } private void EnsureContent(NewPilot newPilot, ITestableReplicationProviderInside provider) { IObjectSet objectSet = provider.GetStoredObjects(typeof(NewPilot)); Assert.AreEqual(1, objectSet.Count); IEnumerator iterator = objectSet.GetEnumerator(); Assert.IsTrue(iterator.MoveNext()); NewPilot p = (NewPilot)iterator.Current; Assert.AreEqual(newPilot.GetName(), p.GetName()); Assert.AreEqual(newPilot.GetPoints(), p.GetPoints()); for (int j = 0; j < newPilot.GetArr().Length; j++) { Assert.AreEqual(newPilot.GetArr()[j], p.GetArr()[j]); } } } } db4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Properties/0000755000175000017500000000000011520622040024165 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/drs/Db4objects.Drs.Tests/Properties/AssemblyInfo.cs0000644000175000017500000000242011520622640027113 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Db4objects.Drs.Tests")] [assembly: AssemblyDescription("Db4objects.Drs.Tests 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("8.0.184.15484")] db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/0000755000175000017500000000000011520622064021222 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions-2010.csproj0000644000175000017500000003002011520622042026601 0ustar directhexdirecthex 9.0.30729 2.0 Debug AnyCPU Db4oUnit.Extensions Library Db4oUnit.Extensions OnBuildSuccess v4.0 512 {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3} 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk bin\Debug\ false 285212672 false true TRACE;DEBUG;NET_3_5;NET_4_0 4096 false 1591;1572;1573;1574;0419; false false false false 0 bin\Release\ false 285212672 false false TRACE;NET_3_5;NET_4_0 4096 false 1591;1572;1573;1574;0419; true false false false 4 System False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2010 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Db4objects.Db4o.Optional-2010 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 {8F82F8B0-95B6-4553-BDA8-BD9A954E682F} Db4oUnit-2010 db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/0000755000175000017500000000000011520622070025005 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutAndroid.cs0000644000175000017500000000136611520622622030211 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Extensions { public interface IOptOutAndroid { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/AbstractInMemoryDb4oTestCase.cs0000644000175000017500000000212011520622622032722 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; namespace Db4oUnit.Extensions { public class AbstractInMemoryDb4oTestCase : AbstractDb4oTestCase, IOptOutMultiSession { /// protected override void Configure(IConfiguration config) { config.Storage = new MemoryStorage(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IFixtureConfiguration.cs0000644000175000017500000000162411520622622031631 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions { public interface IFixtureConfiguration { string GetLabel(); void Configure(IDb4oTestCase testCase, IConfiguration config); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ExcludingReflector.cs0000644000175000017500000000433311520622622031132 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Reflect; namespace Db4oUnit.Extensions { public class ExcludingReflector : Db4objects.Db4o.Reflect.Net.NetReflector { private readonly Collection4 _excludedClasses; public ExcludingReflector(Type[] excludedClasses) { _excludedClasses = new Collection4(); for (int claxxIndex = 0; claxxIndex < excludedClasses.Length; ++claxxIndex) { Type claxx = excludedClasses[claxxIndex]; _excludedClasses.Add(claxx.FullName); } } public ExcludingReflector(ByRef loaderClass, Type[] excludedClasses) { _excludedClasses = new Collection4(); for (int claxxIndex = 0; claxxIndex < excludedClasses.Length; ++claxxIndex) { Type claxx = excludedClasses[claxxIndex]; _excludedClasses.Add(claxx.FullName); } } public ExcludingReflector(Collection4 excludedClasses) { _excludedClasses = excludedClasses; } public ExcludingReflector(ByRef loaderClass, Collection4 excludedClasses) { _excludedClasses = excludedClasses; } public override object DeepClone(object obj) { return new Db4oUnit.Extensions.ExcludingReflector(_excludedClasses); } public override IReflectClass ForName(string className) { if (_excludedClasses.Contains(className)) { return null; } return base.ForName(className); } public override IReflectClass ForClass(Type clazz) { if (_excludedClasses.Contains(clazz.FullName)) { return null; } return base.ForClass(clazz); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/0000755000175000017500000000000011520622070026107 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/UnhandledExceptionInThreadTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/UnhandledExceptionInThread0000644000175000017500000000337111520622622033241 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Tests; using Db4objects.Db4o.Internal; using Sharpen.Lang; namespace Db4oUnit.Extensions.Tests { public class UnhandledExceptionInThreadTestCase : ITestCase { public class ExceptionThrowingTestCase : AbstractDb4oTestCase { public virtual void Test() { Container().ThreadPool().Start(ReflectPlatform.SimpleName(typeof(UnhandledExceptionInThreadTestCase )) + " Throwing Exception Thread", new _IRunnable_15()); } private sealed class _IRunnable_15 : IRunnable { public _IRunnable_15() { } public void Run() { throw new InvalidOperationException(); } } } public virtual void TestSolo() { Db4oTestSuiteBuilder suite = new Db4oTestSuiteBuilder(new Db4oInMemory(), typeof( UnhandledExceptionInThreadTestCase.ExceptionThrowingTestCase)); TestResult result = new TestResult(); new TestRunner(suite).Run(result); Assert.AreEqual(1, result.Failures.Count); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/DynamicFixtureTestCase.cs0000644000175000017500000000432011520622622033027 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Tests; using Db4oUnit.Fixtures; namespace Db4oUnit.Extensions.Tests { public class DynamicFixtureTestCase : ITestSuiteBuilder { public virtual IEnumerator GetEnumerator() { // The test case simply runs FooTestSuite // with a Db4oInMemory fixture to ensure the // the db4o fixture can be successfully propagated // to FooTestUnit#test. return new Db4oTestSuiteBuilder(new Db4oInMemory(), typeof(DynamicFixtureTestCase.FooTestSuite )).GetEnumerator(); } /// One of the possibly many test units. /// One of the possibly many test units. public class FooTestUnit : AbstractDb4oTestCase { private readonly object[] values = MultiValueFixtureProvider.Value(); public virtual void Test() { Assert.IsNotNull(Db()); Assert.IsNotNull(values); } } /// The test suite which binds together fixture providers and test units. /// The test suite which binds together fixture providers and test units. public class FooTestSuite : FixtureTestSuiteDescription { public FooTestSuite() { { FixtureProviders(new IFixtureProvider[] { new MultiValueFixtureProvider(new object [][] { new object[] { "foo", "bar" }, new object[] { 1, 42 } }) }); TestUnits(new Type[] { typeof(DynamicFixtureTestCase.FooTestUnit) }); } } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/AllTests.cs0000644000175000017500000000235211520622622030176 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions.Tests; namespace Db4oUnit.Extensions.Tests { public class AllTests : ReflectionTestSuite { public static void Main(string[] args) { new Db4oUnit.Extensions.Tests.AllTests().Run(); } protected override Type[] TestCases() { return new Type[] { typeof(Db4oEmbeddedSessionFixtureTestCase), typeof(DynamicFixtureTestCase ), typeof(ExcludingReflectorTestCase), typeof(FixtureConfigurationTestCase), typeof( FixtureTestCase), typeof(UnhandledExceptionInThreadTestCase) }; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/NotAcceptedTestCase.cs0000644000175000017500000000173611520622622032275 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Tests { public class NotAcceptedTestCase : AbstractDb4oTestCase, IOptOutFromTestFixture { public virtual void Test() { Assert.Fail("Opted out test should not be run."); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/ExcludingReflectorTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/ExcludingReflectorTestCase0000644000175000017500000000304611520622622033264 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Tests; using Db4objects.Db4o.Reflect; namespace Db4oUnit.Extensions.Tests { public class ExcludingReflectorTestCase : ITestCase { public class Excluded { } public virtual void TestExcludedClasses() { AssertNotVisible(typeof(ExcludingReflectorTestCase.Excluded)); } private void AssertNotVisible(Type type) { Assert.IsNull(ReflectClassForName(type.FullName)); } private IReflectClass ReflectClassForName(string className) { return new ExcludingReflector(new Type[] { typeof(ExcludingReflectorTestCase.Excluded ) }).ForName(className); } public virtual void TestVisibleClasses() { AssertVisible(GetType()); } private void AssertVisible(Type type) { Assert.IsNotNull(ReflectClassForName(type.FullName)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/AcceptedTestCase.cs0000644000175000017500000000152711520622622031612 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions.Tests { public class AcceptedTestCase : AbstractDb4oTestCase { public virtual void Test() { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/SimpleDb4oTestCase.cs0000644000175000017500000000350611520622622032043 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Tests; using Db4oUnit.Mocking; using Db4objects.Db4o.Config; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions.Tests { public class SimpleDb4oTestCase : AbstractDb4oTestCase { public static readonly DynamicVariable RecorderVariable = DynamicVariable.NewInstance (); public class Data { } protected override void Configure(IConfiguration config) { Record(new MethodCall("fixture", new object[] { Fixture() })); Record(new MethodCall("configure", new object[] { config })); } private void Record(MethodCall call) { Recorder().Record(call); } private MethodCallRecorder Recorder() { return ((MethodCallRecorder)RecorderVariable.Value); } protected override void Store() { Record(new MethodCall("store", new object[] { })); Fixture().Db().Store(new SimpleDb4oTestCase.Data()); } public virtual void TestResultSize() { Record(new MethodCall("testResultSize", new object[] { })); Assert.AreEqual(1, Fixture().Db().QueryByExample(typeof(SimpleDb4oTestCase.Data)) .Count); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/MultipleDb4oTestCase.cs0000644000175000017500000000241511520622622032403 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Tests { public class MultipleDb4oTestCase : AbstractDb4oTestCase { private static int configureCalls = 0; public static void ResetConfigureCalls() { configureCalls = 0; } public static int ConfigureCalls() { return configureCalls; } protected override void Configure(IConfiguration config) { configureCalls++; } public virtual void TestFirst() { Assert.Fail(); } public virtual void TestSecond() { Assert.Fail(); } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/Db4oEmbeddedSessionFixtureTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/Db4oEmbeddedSessionFixture0000644000175000017500000000420311520622622033151 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Tests; namespace Db4oUnit.Extensions.Tests { public class Db4oEmbeddedSessionFixtureTestCase : ITestCase { internal readonly Db4oEmbeddedSessionFixture subject = new Db4oEmbeddedSessionFixture (); public virtual void TestDoesNotAcceptRegularTest() { Assert.IsFalse(subject.Accept(typeof(Db4oEmbeddedSessionFixtureTestCase.RegularTest ))); } public virtual void TestAcceptsDb4oTest() { Assert.IsTrue(subject.Accept(typeof(Db4oEmbeddedSessionFixtureTestCase.Db4oTest)) ); } public virtual void TestDoesNotAcceptOptOutCS() { Assert.IsFalse(subject.Accept(typeof(Db4oEmbeddedSessionFixtureTestCase.OptOutTest ))); } public virtual void TestDoesNotAcceptOptOutAllButNetworkingCS() { Assert.IsFalse(subject.Accept(typeof(Db4oEmbeddedSessionFixtureTestCase.OptOutAllButNetworkingCSTest ))); } public virtual void TestAcceptsOptOutNetworking() { Assert.IsTrue(subject.Accept(typeof(Db4oEmbeddedSessionFixtureTestCase.OptOutNetworkingTest ))); } internal class RegularTest : ITestCase { } internal class Db4oTest : IDb4oTestCase { } internal class OptOutTest : IOptOutMultiSession { } internal class OptOutNetworkingTest : IOptOutNetworkingCS { } internal class OptOutAllButNetworkingCSTest : IOptOutAllButNetworkingCS { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/FixtureTestCase.cs0000644000175000017500000000727111520622622031532 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Tests; using Db4oUnit.Extensions.Util; using Db4oUnit.Mocking; using Db4oUnit.Tests; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Foundation.IO; using Sharpen.Lang; namespace Db4oUnit.Extensions.Tests { public class FixtureTestCase : ITestCase { private sealed class ExcludingInMemoryFixture : Db4oInMemory { public override bool Accept(Type clazz) { return !typeof(IOptOutFromTestFixture).IsAssignableFrom(clazz); } internal ExcludingInMemoryFixture(FixtureTestCase _enclosing) { this._enclosing = _enclosing; } private readonly FixtureTestCase _enclosing; } public virtual void TestSingleTestWithDifferentFixtures() { AssertSimpleDb4o(new Db4oInMemory()); AssertSimpleDb4o(new Db4oSolo()); } public virtual void TestMultipleTestsSingleFixture() { MultipleDb4oTestCase.ResetConfigureCalls(); FrameworkTestCase.RunTestAndExpect(new Db4oTestSuiteBuilder(new Db4oInMemory(), typeof( MultipleDb4oTestCase)), 2, false); Assert.AreEqual(2, MultipleDb4oTestCase.ConfigureCalls()); } public virtual void TestSelectiveFixture() { IDb4oFixture fixture = new FixtureTestCase.ExcludingInMemoryFixture(this); IEnumerator tests = new Db4oTestSuiteBuilder(fixture, new Type[] { typeof(AcceptedTestCase ), typeof(NotAcceptedTestCase) }).GetEnumerator(); ITest test = NextTest(tests); Assert.IsFalse(tests.MoveNext()); FrameworkTestCase.RunTestAndExpect(test, 0); } private void AssertSimpleDb4o(IDb4oFixture fixture) { IEnumerator tests = new Db4oTestSuiteBuilder(fixture, typeof(SimpleDb4oTestCase)) .GetEnumerator(); ITest test = NextTest(tests); MethodCallRecorder recorder = new MethodCallRecorder(); SimpleDb4oTestCase.RecorderVariable.With(recorder, new _IRunnable_46(test)); recorder.Verify(new MethodCall[] { new MethodCall("fixture", new object[] { fixture }), new MethodCall("configure", new object[] { MethodCall.IgnoredArgument }), new MethodCall("store", new object[] { }), new MethodCall("testResultSize", new object [] { }) }); } private sealed class _IRunnable_46 : IRunnable { public _IRunnable_46(ITest test) { this.test = test; } public void Run() { FrameworkTestCase.RunTestAndExpect(test, 0); } private readonly ITest test; } private ITest NextTest(IEnumerator tests) { return (ITest)Iterators.Next(tests); } public virtual void TestInterfaceIsAvailable() { Assert.IsTrue(typeof(IDb4oTestCase).IsAssignableFrom(typeof(AbstractDb4oTestCase) )); } /// public virtual void TestDeleteDir() { System.IO.Directory.CreateDirectory("a/b/c"); Assert.IsTrue(System.IO.File.Exists("a")); IOUtil.DeleteDir("a"); Assert.IsFalse(System.IO.File.Exists("a")); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/FixtureConfigurationTestCase.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Tests/FixtureConfigurationTestCa0000644000175000017500000000605411520622622033324 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Tests; using Db4oUnit.Mocking; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Tests { public class FixtureConfigurationTestCase : ITestCase { internal sealed class MockFixtureConfiguration : MethodCallRecorder, IFixtureConfiguration { public void Configure(IDb4oTestCase testCase, IConfiguration config) { Record(new MethodCall("configure", new object[] { testCase, config })); } public string GetLabel() { return "MOCK"; } } public sealed class TestCase1 : AbstractDb4oTestCase { public void Test() { } } public sealed class TestCase2 : AbstractDb4oTestCase { public void Test() { } } public virtual void TestSolo() { AssertFixtureConfiguration(new Db4oSolo()); } public virtual void TestClientServer() { AssertFixtureConfiguration(Db4oFixtures.NewNetworkingCS()); } public virtual void TestInMemory() { AssertFixtureConfiguration(new Db4oInMemory()); } private void AssertFixtureConfiguration(IDb4oFixture fixture) { FixtureConfigurationTestCase.MockFixtureConfiguration configuration = new FixtureConfigurationTestCase.MockFixtureConfiguration (); fixture.FixtureConfiguration(configuration); Assert.IsTrue(fixture.Label().EndsWith(" - " + configuration.GetLabel()), "FixtureConfiguration label must be part of Fixture label." ); new TestRunner(new Db4oTestSuiteBuilder(fixture, new Type[] { typeof(FixtureConfigurationTestCase.TestCase1 ), typeof(FixtureConfigurationTestCase.TestCase2) })).Run(new TestResult()); configuration.Verify(new MethodCall[] { new MethodCall("configure", new object[] { MethodCall.Conditions.IsA(typeof(FixtureConfigurationTestCase.TestCase1)), MethodCall .IgnoredArgument }), new MethodCall("configure", new object[] { MethodCall.Conditions .IsA(typeof(FixtureConfigurationTestCase.TestCase1)), MethodCall.IgnoredArgument }), new MethodCall("configure", new object[] { MethodCall.Conditions.IsA(typeof( FixtureConfigurationTestCase.TestCase2)), MethodCall.IgnoredArgument }), new MethodCall ("configure", new object[] { MethodCall.Conditions.IsA(typeof(FixtureConfigurationTestCase.TestCase2 )), MethodCall.IgnoredArgument }) }); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/BTreeAssert.cs0000644000175000017500000001121211520622622027517 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Handlers; using Db4objects.Db4o.Internal.Ids; using Db4objects.Db4o.Internal.Slots; namespace Db4oUnit.Extensions { public class BTreeAssert { public static void TraverseKeys(IBTreeRange result, IVisitor4 visitor) { IEnumerator i = result.Keys(); while (i.MoveNext()) { visitor.Visit(i.Current); } } public static void AssertKeys(Transaction transaction, BTree btree, int[] keys) { ExpectingVisitor visitor = ExpectingVisitor.CreateExpectingVisitor(keys); btree.TraverseKeys(transaction, visitor); visitor.AssertExpectations(); } public static void AssertEmpty(Transaction transaction, BTree tree) { ExpectingVisitor visitor = new ExpectingVisitor(new object[0]); tree.TraverseKeys(transaction, visitor); visitor.AssertExpectations(); Assert.AreEqual(0, tree.Size(transaction)); } public static void DumpKeys(Transaction trans, BTree tree) { tree.TraverseKeys(trans, new _IVisitor4_37()); } private sealed class _IVisitor4_37 : IVisitor4 { public _IVisitor4_37() { } public void Visit(object obj) { Sharpen.Runtime.Out.WriteLine(obj); } } public static int FillSize(BTree btree) { return btree.NodeSize() + 1; } public static int[] NewBTreeNodeSizedArray(BTree btree, int value) { return IntArrays4.Fill(new int[FillSize(btree)], value); } public static void AssertRange(int[] expectedKeys, IBTreeRange range) { Assert.IsNotNull(range); ExpectingVisitor visitor = ExpectingVisitor.CreateSortedExpectingVisitor(expectedKeys ); TraverseKeys(range, visitor); visitor.AssertExpectations(); } public static BTree CreateIntKeyBTree(ObjectContainerBase container, int id, int nodeSize) { return new BTree(container.SystemTransaction(), id, new IntHandler(), nodeSize); } public static void AssertSingleElement(Transaction trans, BTree btree, object element ) { Assert.AreEqual(1, btree.Size(trans)); IBTreeRange result = btree.SearchRange(trans, element); ExpectingVisitor expectingVisitor = new ExpectingVisitor(new object[] { element } ); BTreeAssert.TraverseKeys(result, expectingVisitor); expectingVisitor.AssertExpectations(); expectingVisitor = new ExpectingVisitor(new object[] { element }); btree.TraverseKeys(trans, expectingVisitor); expectingVisitor.AssertExpectations(); } /// public static void AssertAllSlotsFreed(LocalTransaction trans, BTree bTree, ICodeBlock block) { LocalObjectContainer container = (LocalObjectContainer)trans.Container(); ITransactionalIdSystem idSystem = trans.IdSystem(); IEnumerator allSlotIDs = bTree.AllNodeIds(trans.SystemTransaction()); Collection4 allSlots = new Collection4(); while (allSlotIDs.MoveNext()) { int slotID = ((int)allSlotIDs.Current); Slot slot = idSystem.CurrentSlot(slotID); allSlots.Add(slot); } Slot bTreeSlot = idSystem.CurrentSlot(bTree.GetID()); allSlots.Add(bTreeSlot); Collection4 freedSlots = new Collection4(); IFreespaceManager freespaceManager = container.FreespaceManager(); container.InstallDebugFreespaceManager(new FreespaceManagerForDebug(new _ISlotListener_99 (freedSlots))); block.Run(); container.InstallDebugFreespaceManager(freespaceManager); Assert.IsTrue(freedSlots.ContainsAll(allSlots.GetEnumerator())); } private sealed class _ISlotListener_99 : ISlotListener { public _ISlotListener_99(Collection4 freedSlots) { this.freedSlots = freedSlots; } public void OnFree(Slot slot) { freedSlots.Add(slot); } private readonly Collection4 freedSlots; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oTestSuiteBuilder.cs0000644000175000017500000000415311520622622031313 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions { public class Db4oTestSuiteBuilder : ReflectionTestSuiteBuilder { private IDb4oFixture _fixture; public Db4oTestSuiteBuilder(IDb4oFixture fixture, Type clazz) : this(fixture, new Type[] { clazz }) { } public Db4oTestSuiteBuilder(IDb4oFixture fixture, Type[] classes) : base(classes) { Fixture(fixture); } private void Fixture(IDb4oFixture fixture) { if (null == fixture) { throw new ArgumentNullException("fixture"); } _fixture = fixture; } protected override bool IsApplicable(Type clazz) { return _fixture.Accept(clazz); } protected override ITest CreateTest(object instance, MethodInfo method) { ITest test = base.CreateTest(instance, method); return new _TestDecorationAdapter_38(test, test); } private sealed class _TestDecorationAdapter_38 : TestDecorationAdapter { public _TestDecorationAdapter_38(ITest test, ITest baseArg1) : base(baseArg1) { this.test = test; } public override string Label() { return "(" + Db4oFixtureVariable.Fixture().Label() + ") " + test.Label(); } private readonly ITest test; } protected override object WithContext(IClosure4 closure) { return Db4oFixtureVariable.FixtureVariable.With(_fixture, closure); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oConcurrencyTestCase.cs0000644000175000017500000000311411520622622031775 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions { /// public class Db4oConcurrencyTestCase : Db4oClientServerTestCase { private bool[] _done; /// protected override void Db4oSetupAfterStore() { InitTasksDoneFlag(); base.Db4oSetupAfterStore(); } private void InitTasksDoneFlag() { _done = new bool[ThreadCount()]; } protected virtual void MarkTaskDone(int seq, bool done) { _done[seq] = done; } /// protected virtual void WaitForAllTasksDone() { while (!AreAllTasksDone()) { Runtime4.Sleep(1); } } private bool AreAllTasksDone() { for (int i = 0; i < _done.Length; ++i) { if (!_done[i]) { return false; } } return true; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IContainerBlock.cs0000644000175000017500000000155611520622622030354 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o; namespace Db4oUnit.Extensions { public interface IContainerBlock { /// void Run(IObjectContainer client); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oAssert.cs0000644000175000017500000000217411520622622027315 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o.Ext; namespace Db4oUnit.Extensions { public class Db4oAssert { public static void PersistedCount(int expected, Type extent) { Assert.AreEqual(expected, Db().Query(extent).Count); } private static IExtObjectContainer Db() { return Fixture().Db(); } private static IDb4oFixture Fixture() { return Db4oFixtureVariable.Fixture(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/AbstractDb4oTestCase.cs0000644000175000017500000002717411520622622031262 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Concurrency; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Marshall; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; namespace Db4oUnit.Extensions { public partial class AbstractDb4oTestCase : IDb4oTestCase, ITestLifeCycle { private const int DefaultConcurrencyThreadCount = 10; [System.NonSerialized] private int _threadCount = DefaultConcurrencyThreadCount; public static IDb4oFixture Fixture() { return Db4oFixtureVariable.Fixture(); } public virtual bool IsMultiSession() { return Fixture() is IMultiSessionFixture; } protected virtual bool IsEmbedded() { return Fixture() is Db4oEmbeddedSessionFixture; } protected virtual bool IsNetworking() { return Fixture() is Db4oNetworking; } public virtual IExtObjectContainer OpenNewSession() { IMultiSessionFixture fixture = (IMultiSessionFixture)Fixture(); try { return fixture.OpenNewSession(this); } catch (Exception e) { throw new Db4oException(e); } } /// protected virtual void Reopen() { Fixture().Reopen(this); } /// public void SetUp() { IDb4oFixture _fixture = Fixture(); _fixture.Clean(); Db4oSetupBeforeConfigure(); Configure(_fixture.Config()); _fixture.Open(this); Db4oSetupBeforeStore(); Store(); _fixture.Db().Commit(); _fixture.Close(); _fixture.Open(this); Db4oSetupAfterStore(); } /// public void TearDown() { try { Db4oTearDownBeforeClean(); } finally { IDb4oFixture fixture = Fixture(); fixture.Close(); IList uncaughtExceptions = fixture.UncaughtExceptions(); fixture.Clean(); HandleUncaughtExceptions(uncaughtExceptions); } Db4oTearDownAfterClean(); } protected virtual void HandleUncaughtExceptions(IList uncaughtExceptions) { if (uncaughtExceptions.Count > 0) { Assert.Fail("Uncaught exceptions: " + Iterators.Join(Iterators.Iterator(uncaughtExceptions ), ", "), ((Exception)uncaughtExceptions[0])); } } /// protected virtual void Db4oSetupBeforeConfigure() { } /// protected virtual void Db4oSetupBeforeStore() { } /// protected virtual void Db4oSetupAfterStore() { } /// protected virtual void Db4oTearDownBeforeClean() { } /// protected virtual void Db4oTearDownAfterClean() { } /// protected virtual void Configure(IConfiguration config) { } /// protected virtual void Store() { } public virtual IExtObjectContainer Db() { return Fixture().Db(); } protected virtual Type[] TestCases() { return new Type[] { GetType() }; } public virtual int RunAll() { return new ConsoleTestRunner(Iterators.Concat(new IEnumerable[] { SoloSuite(), NetworkingSuite (), EmbeddedSuite() })).Run(); } public virtual int RunSolo(string testLabelSubstring) { return new ConsoleTestRunner(Iterators.Filter(SoloSuite(), new _IPredicate4_131(testLabelSubstring ))).Run(); } private sealed class _IPredicate4_131 : IPredicate4 { public _IPredicate4_131(string testLabelSubstring) { this.testLabelSubstring = testLabelSubstring; } public bool Match(object candidate) { return (((ITest)candidate).Label().IndexOf(testLabelSubstring) >= 0); } private readonly string testLabelSubstring; } public virtual int RunSoloAndClientServer() { return new ConsoleTestRunner(Iterators.Concat(new IEnumerable[] { SoloSuite(), NetworkingSuite () })).Run(); } public virtual int RunSoloAndEmbeddedClientServer() { return new ConsoleTestRunner(Iterators.Concat(new IEnumerable[] { SoloSuite(), EmbeddedSuite () })).Run(); } public virtual int RunSolo() { return new ConsoleTestRunner(SoloSuite()).Run(); } public virtual int RunInMemory() { return new ConsoleTestRunner(InMemorySuite()).Run(); } public virtual int RunNetworking() { return new ConsoleTestRunner(NetworkingSuite()).Run(); } public virtual int RunEmbedded() { return new ConsoleTestRunner(EmbeddedSuite()).Run(); } public virtual int RunConcurrency() { return new ConsoleTestRunner(ConcurrenyClientServerSuite(false, "CONC")).Run(); } public virtual int RunEmbeddedConcurrency() { return new ConsoleTestRunner(ConcurrenyClientServerSuite(true, "CONC EMBEDDED")). Run(); } public virtual int RunConcurrencyAll() { return new ConsoleTestRunner(Iterators.Concat(new IEnumerable[] { ConcurrenyClientServerSuite (false, "CONC"), ConcurrenyClientServerSuite(true, "CONC EMBEDDED") })).Run(); } protected virtual Db4oTestSuiteBuilder SoloSuite() { return new Db4oTestSuiteBuilder(Db4oFixtures.NewSolo(), TestCases()); } protected virtual Db4oTestSuiteBuilder InMemorySuite() { return new Db4oTestSuiteBuilder(Db4oFixtures.NewInMemory(), TestCases()); } protected virtual Db4oTestSuiteBuilder NetworkingSuite() { return new Db4oTestSuiteBuilder(Db4oFixtures.NewNetworkingCS(), TestCases()); } protected virtual Db4oTestSuiteBuilder EmbeddedSuite() { return new Db4oTestSuiteBuilder(Db4oFixtures.NewEmbedded(), TestCases()); } protected virtual Db4oTestSuiteBuilder ConcurrenyClientServerSuite(bool embedded, string label) { return new Db4oConcurrencyTestSuiteBuilder(embedded ? Db4oFixtures.NewEmbedded(label ) : Db4oFixtures.NewNetworkingCS(label), TestCases()); } protected virtual IInternalObjectContainer Stream() { return (IInternalObjectContainer)Db(); } protected virtual ObjectContainerBase Container() { return Stream().Container; } public virtual LocalObjectContainer FileSession() { return Fixture().FileSession(); } public virtual Transaction Trans() { return ((IInternalObjectContainer)Db()).Transaction; } protected virtual Transaction SystemTrans() { return Trans().SystemTransaction(); } protected virtual IQuery NewQuery(Transaction transaction, Type clazz) { IQuery query = NewQuery(transaction); query.Constrain(clazz); return query; } protected virtual IQuery NewQuery(Transaction transaction) { return Container().Query(transaction); } protected virtual IQuery NewQuery() { return NewQuery(Db()); } protected static IQuery NewQuery(IExtObjectContainer oc) { return oc.Query(); } protected virtual IQuery NewQuery(Type clazz) { return NewQuery(Db(), clazz); } protected static IQuery NewQuery(IExtObjectContainer oc, Type clazz) { IQuery query = NewQuery(oc); query.Constrain(clazz); return query; } protected virtual IReflector Reflector() { return Stream().Reflector(); } protected virtual void IndexField(IConfiguration config, Type clazz, string fieldName ) { config.ObjectClass(clazz).ObjectField(fieldName).Indexed(true); } protected virtual Transaction NewTransaction() { lock (Container().Lock()) { return Container().NewUserTransaction(); } } public virtual object RetrieveOnlyInstance(Type clazz) { return RetrieveOnlyInstance(Db(), clazz); } public static object RetrieveOnlyInstance(IExtObjectContainer oc, Type clazz) { IObjectSet result = NewQuery(oc, clazz).Execute(); Assert.AreEqual(1, result.Count); return result.Next(); } protected virtual int CountOccurences(Type clazz) { return CountOccurences(Db(), clazz); } protected virtual int CountOccurences(IExtObjectContainer oc, Type clazz) { IObjectSet result = NewQuery(oc, clazz).Execute(); return result.Count; } protected virtual void AssertOccurrences(Type clazz, int expected) { AssertOccurrences(Db(), clazz, expected); } protected virtual void AssertOccurrences(IExtObjectContainer oc, Type clazz, int expected) { Assert.AreEqual(expected, CountOccurences(oc, clazz)); } protected virtual void Foreach(Type clazz, IVisitor4 visitor) { Foreach(Db(), clazz, visitor); } protected virtual void Foreach(IExtObjectContainer container, Type clazz, IVisitor4 visitor) { IObjectSet set = NewQuery(container, clazz).Execute(); while (set.HasNext()) { visitor.Visit(set.Next()); } } protected void DeleteAll(Type clazz) { DeleteAll(Db(), clazz); } protected void DeleteAll(IExtObjectContainer oc, Type clazz) { Foreach(oc, clazz, new _IVisitor4_316(oc)); } private sealed class _IVisitor4_316 : IVisitor4 { public _IVisitor4_316(IExtObjectContainer oc) { this.oc = oc; } public void Visit(object obj) { oc.Delete(obj); } private readonly IExtObjectContainer oc; } protected void DeleteObjectSet(IObjectSet os) { DeleteObjectSet(Db(), os); } protected void DeleteObjectSet(IObjectContainer oc, IObjectSet os) { while (os.HasNext()) { oc.Delete(os.Next()); } } public void Store(object obj) { Db().Store(obj); } protected virtual ClassMetadata ClassMetadataFor(Type clazz) { return Stream().ClassMetadataForReflectClass(ReflectClass(clazz)); } protected virtual IReflectClass ReflectClass(Type clazz) { return Reflector().ForClass(clazz); } /// protected virtual void Defragment() { Fixture().Close(); Fixture().Defragment(); Fixture().Open(this); } public int ThreadCount() { return _threadCount; } public void ConfigureThreadCount(int count) { _threadCount = count; } protected virtual IEventRegistry EventRegistry() { return EventRegistryFor(Db()); } protected virtual IEventRegistry EventRegistryFor(IExtObjectContainer container) { return EventRegistryFactory.ForObjectContainer(container); } protected virtual IEventRegistry ServerEventRegistry() { return EventRegistryFor(FileSession()); } protected virtual IContext Context() { return Trans().Context(); } protected virtual void Commit() { Db().Commit(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutStackOverflowIssue.cs0000644000175000017500000000152011520622622032423 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutStackOverflowIssue : IOptOutAndroid { // related to issue COR-2010 } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oClientServerTestCase.cs0000644000175000017500000000173611520622622032120 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions { public class Db4oClientServerTestCase : AbstractDb4oTestCase, IOptOutSolo { public virtual IDb4oClientServerFixture ClientServerFixture() { return (IDb4oClientServerFixture)Fixture(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ComposibleReflectionTestSuite.cs0000644000175000017500000000205611520622622033323 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public abstract class ComposibleReflectionTestSuite : ReflectionTestSuite { protected virtual Type[] ComposeTests(Type[] classes) { return ComposibleTestSuite.Concat(classes, ComposeWith()); } protected virtual Type[] ComposeWith() { return new Type[0]; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/0000755000175000017500000000000011520622070026616 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutFromTestFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutFromTestFixture.0000644000175000017500000000234711520622622033226 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions.Fixtures { /// /// 'Abstract' marker interface to denote that implementing test cases should be /// excluded from running against specific fixtures. /// /// /// 'Abstract' marker interface to denote that implementing test cases should be /// excluded from running against specific fixtures. Concrete marker interfaces /// for specific fixtures should extend OptOutFromTestFixture. /// public interface IOptOutFromTestFixture : IDb4oTestCase { } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNoInheritedClassPath.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNoInheritedClass0000644000175000017500000000253011520622622033226 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases using JavaServices /// should be excluded from fixtures that run in an environment where the classpath /// is not captured in the java.class.path system property. /// /// /// Marker interface to denote that implementing test cases using JavaServices /// should be excluded from fixtures that run in an environment where the classpath /// is not captured in the java.class.path system property. /// public interface IOptOutNoInheritedClassPath : IOptOutFromTestFixture { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/AbstractDb4oFixture.cs0000644000175000017500000001174411520622622033002 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit.Extensions; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Events; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Threading; namespace Db4oUnit.Extensions.Fixtures { public abstract class AbstractDb4oFixture : IDb4oFixture { private IFixtureConfiguration _fixtureConfiguration; private IConfiguration _configuration; private IList _uncaughtExceptions; protected AbstractDb4oFixture() { ResetUncaughtExceptions(); } private void ResetUncaughtExceptions() { _uncaughtExceptions = new ArrayList(); } public virtual void FixtureConfiguration(IFixtureConfiguration fc) { _fixtureConfiguration = fc; } public virtual IList UncaughtExceptions() { return _uncaughtExceptions; } protected virtual void ListenToUncaughtExceptions(IThreadPool4 threadPool) { if (null == threadPool) { return; } // mocks don't have thread pools threadPool.UncaughtException += new System.EventHandler (new _IEventListener4_42(this).OnEvent); } private sealed class _IEventListener4_42 { public _IEventListener4_42(AbstractDb4oFixture _enclosing) { this._enclosing = _enclosing; } public void OnEvent(object sender, UncaughtExceptionEventArgs args) { this._enclosing._uncaughtExceptions.Add(((UncaughtExceptionEventArgs)args).Exception ); } private readonly AbstractDb4oFixture _enclosing; } /// public virtual void Reopen(IDb4oTestCase testInstance) { Close(); Open(testInstance); } public virtual IConfiguration Config() { if (_configuration == null) { _configuration = NewConfiguration(); } return _configuration; } public virtual void Clean() { DoClean(); ResetConfig(); ResetUncaughtExceptions(); } public abstract bool Accept(Type clazz); protected abstract void DoClean(); public virtual void ResetConfig() { _configuration = null; } /// Method can be overridden in subclasses with special instantiation requirements (oSGI for instance). /// /// Method can be overridden in subclasses with special instantiation requirements (oSGI for instance). /// /// protected virtual IConfiguration NewConfiguration() { return Db4oFactory.NewConfiguration(); } /// protected virtual void Defragment(string fileName) { string targetFile = fileName + ".defrag.backup"; DefragmentConfig defragConfig = new DefragmentConfig(fileName, targetFile); defragConfig.ForceBackupDelete(true); defragConfig.Db4oConfig(CloneConfiguration()); Db4objects.Db4o.Defragment.Defragment.Defrag(defragConfig); } protected virtual string BuildLabel(string label) { if (null == _fixtureConfiguration) { return label; } return label + " - " + _fixtureConfiguration.GetLabel(); } protected virtual void ApplyFixtureConfiguration(IDb4oTestCase testInstance, IConfiguration config) { if (null == _fixtureConfiguration) { return; } _fixtureConfiguration.Configure(testInstance, config); } public override string ToString() { return Label(); } protected virtual Config4Impl CloneConfiguration() { return CloneDb4oConfiguration((Config4Impl)Config()); } protected virtual Config4Impl CloneDb4oConfiguration(IConfiguration config) { return (Config4Impl)((Config4Impl)config).DeepClone(this); } protected virtual IThreadPool4 ThreadPoolFor(IObjectContainer container) { if (container is ObjectContainerBase) { return ((ObjectContainerBase)container).ThreadPool(); } return null; } public abstract string Label(); public abstract void Close(); public abstract void ConfigureAtRuntime(IRuntimeConfigureAction arg1); public abstract IExtObjectContainer Db(); public abstract void Defragment(); public abstract LocalObjectContainer FileSession(); public abstract void Open(IDb4oTestCase arg1); } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/NonStandardBlockSizeFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/NonStandardBlockSizeFix0000644000175000017500000000241211520622622033233 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Fixtures { public class NonStandardBlockSizeFixture : Db4oSolo { protected override IObjectContainer CreateDatabase(IConfiguration config) { config.BlockSize(7); return base.CreateDatabase(config); } public override bool Accept(Type clazz) { return base.Accept(clazz) && !typeof(IOptOutNonStandardBlockSize).IsAssignableFrom (clazz); } public override string Label() { return "BlockSize-" + base.Label(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oDefragSolo.cs0000644000175000017500000000466411520622622031720 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions.Fixtures { public class Db4oDefragSolo : Db4oSolo { protected override IObjectContainer CreateDatabase(IConfiguration config) { Sharpen.IO.File origFile = new Sharpen.IO.File(GetAbsolutePath()); if (origFile.Exists()) { try { string backupFile = GetAbsolutePath() + ".defrag.backup"; IIdMapping mapping = new InMemoryIdMapping(); // new // BTreeIDMapping(getAbsolutePath()+".defrag.mapping",4096,1,1000); DefragmentConfig defragConfig = new DefragmentConfig(GetAbsolutePath(), backupFile , mapping); defragConfig.ForceBackupDelete(true); // FIXME Cloning is ugly - wrap original in Decorator within // DefragContext instead? IConfiguration clonedConfig = (IConfiguration)((IDeepClone)config).DeepClone(null ); defragConfig.Db4oConfig(clonedConfig); Db4objects.Db4o.Defragment.Defragment.Defrag(defragConfig, new _IDefragmentListener_30 ()); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } } return base.CreateDatabase(config); } private sealed class _IDefragmentListener_30 : IDefragmentListener { public _IDefragmentListener_30() { } public void NotifyDefragmentInfo(DefragmentInfo info) { Sharpen.Runtime.Err.WriteLine(info); } } public override bool Accept(Type clazz) { return base.Accept(clazz) && !typeof(IOptOutDefragSolo).IsAssignableFrom(clazz); } public override string Label() { return "Defrag-" + base.Label(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IdSystemFixture.cs0000644000175000017500000000527511520622622032271 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal.Config; using Db4objects.Db4o.Internal.Ids; namespace Db4oUnit.Extensions.Fixtures { public class IdSystemFixture : Db4oSolo { private readonly byte _idSystemType; public IdSystemFixture(byte idSystemType) { _idSystemType = idSystemType; } public IdSystemFixture() { _idSystemType = StandardIdSystemFactory.StackedBtree; } protected override IObjectContainer CreateDatabase(IConfiguration config) { IEmbeddedConfiguration embeddedConfiguration = Db4oLegacyConfigurationBridge.AsEmbeddedConfiguration (config); switch (_idSystemType) { case StandardIdSystemFactory.PointerBased: { embeddedConfiguration.IdSystem.UsePointerBasedSystem(); break; } case StandardIdSystemFactory.StackedBtree: { embeddedConfiguration.IdSystem.UseStackedBTreeSystem(); break; } case StandardIdSystemFactory.InMemory: { embeddedConfiguration.IdSystem.UseInMemorySystem(); break; } default: { throw new InvalidOperationException(); } } // embeddedConfiguration.file().freespace().useBTreeSystem(); return base.CreateDatabase(config); } public override string Label() { string idSystemType = string.Empty; switch (_idSystemType) { case StandardIdSystemFactory.PointerBased: { idSystemType = "PointerBased"; break; } case StandardIdSystemFactory.StackedBtree: { idSystemType = "BTree"; break; } case StandardIdSystemFactory.InMemory: { idSystemType = "InMemory"; break; } default: { throw new InvalidOperationException(); } } return "IdSystem-" + idSystemType + " " + base.Label(); } public override bool Accept(Type clazz) { return base.Accept(clazz) && !typeof(IOptOutIdSystem).IsAssignableFrom(clazz); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IDb4oClientServerFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IDb4oClientServerFixtur0000644000175000017500000000167311520622622033204 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; namespace Db4oUnit.Extensions.Fixtures { public interface IDb4oClientServerFixture : IDb4oFixture, IMultiSessionFixture { IObjectServer Server(); int ServerPort(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oFixtureProvider.cs0000644000175000017500000000214411520622622033023 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4oUnit.Extensions; using Db4oUnit.Fixtures; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions.Fixtures { public class Db4oFixtureProvider : IFixtureProvider { public virtual FixtureVariable Variable() { return Db4oFixtureVariable.FixtureVariable; } public virtual IEnumerator GetEnumerator() { return Iterators.SingletonIterator(Variable().Value); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNonStandardBlockSize.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNonStandardBlock0000644000175000017500000000151411520622622033217 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public interface IOptOutNonStandardBlockSize : IOptOutFromTestFixture { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oInMemory.cs0000644000175000017500000000417011520622622031422 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; namespace Db4oUnit.Extensions.Fixtures { public class Db4oInMemory : AbstractSoloDb4oFixture { private static readonly string DbUri = "test_db"; public Db4oInMemory() : base() { } public Db4oInMemory(IFixtureConfiguration fc) : this() { FixtureConfiguration(fc); } public override bool Accept(Type clazz) { if (!base.Accept(clazz)) { return false; } if (typeof(IOptOutInMemory).IsAssignableFrom(clazz)) { return false; } return true; } private readonly PagingMemoryStorage _storage = new PagingMemoryStorage(63); protected override IObjectContainer CreateDatabase(IConfiguration config) { return Db4oFactory.OpenFile(config, DbUri); } protected override IConfiguration NewConfiguration() { IConfiguration config = base.NewConfiguration(); config.Storage = _storage; return config; } protected override void DoClean() { try { _storage.Delete(DbUri); } catch (IOException exc) { Sharpen.Runtime.PrintStackTrace(exc); } } public override string Label() { return BuildLabel("IN-MEMORY"); } /// public override void Defragment() { Defragment(DbUri); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutDefragSolo.cs0000644000175000017500000000221611520622622032462 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running against a defragmenting fixture. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running against a defragmenting fixture. /// public interface IOptOutDefragSolo : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/ICustomClientServerConfiguration.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/ICustomClientServerConf0000644000175000017500000000205611520622622033266 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Fixtures { public interface ICustomClientServerConfiguration : IDb4oTestCase { /// void ConfigureServer(IConfiguration config); /// void ConfigureClient(IConfiguration config); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IMultiSessionFixture.cs0000644000175000017500000000171011520622622033265 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Ext; namespace Db4oUnit.Extensions.Fixtures { public interface IMultiSessionFixture : IDb4oFixture { /// IExtObjectContainer OpenNewSession(IDb4oTestCase testInstance); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNetworkingCS.cs0000644000175000017500000000224411520622622033013 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running with the networking Client/Server fixture. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running with the networking Client/Server fixture. /// public interface IOptOutNetworkingCS : IOptOutFromTestFixture { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutIdSystem.cs0000644000175000017500000000150011520622622032171 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public interface IOptOutIdSystem : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/AbstractSoloDb4oFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/AbstractSoloDb4oFixture0000644000175000017500000000467111520622622033234 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Threading; namespace Db4oUnit.Extensions.Fixtures { public abstract class AbstractSoloDb4oFixture : AbstractDb4oFixture { private IExtObjectContainer _db; protected AbstractSoloDb4oFixture() { } public sealed override void Open(IDb4oTestCase testInstance) { Assert.IsNull(_db); IConfiguration config = CloneConfiguration(); ApplyFixtureConfiguration(testInstance, config); _db = CreateDatabase(config).Ext(); ListenToUncaughtExceptions(ThreadPool()); PostOpen(testInstance); } private IThreadPool4 ThreadPool() { return ThreadPoolFor(_db); } /// public override void Close() { try { PreClose(); } finally { if (null != _db) { Assert.IsTrue(_db.Close()); try { ThreadPool().Join(3000); } finally { _db = null; } } } } public override bool Accept(Type clazz) { return !typeof(IOptOutSolo).IsAssignableFrom(clazz); } public override IExtObjectContainer Db() { return _db; } public override LocalObjectContainer FileSession() { return (LocalObjectContainer)_db; } public override void ConfigureAtRuntime(IRuntimeConfigureAction action) { action.Apply(Config()); } protected virtual void PreClose() { } protected virtual void PostOpen(IDb4oTestCase testInstance) { } protected abstract IObjectContainer CreateDatabase(IConfiguration config); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oSolo.cs0000644000175000017500000000230311520622622030573 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public class Db4oSolo : AbstractFileBasedDb4oFixture { private static readonly string File = "db4oSoloTest.db4o"; public Db4oSolo() { } public Db4oSolo(IFixtureConfiguration fixtureConfiguration) { FixtureConfiguration(fixtureConfiguration); } public override string Label() { return BuildLabel("SOLO"); } protected override string FileName() { return File; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oFixtures.cs0000644000175000017500000000257211520622622031500 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public class Db4oFixtures { public static Db4oSolo NewSolo() { return new Db4oSolo(); } public static Db4oInMemory NewInMemory() { return new Db4oInMemory(); } public static IMultiSessionFixture NewEmbedded() { return new Db4oEmbeddedSessionFixture(); } public static IMultiSessionFixture NewEmbedded(string label) { return new Db4oEmbeddedSessionFixture(label); } public static Db4oNetworking NewNetworkingCS() { return new Db4oNetworking(); } public static Db4oNetworking NewNetworkingCS(string label) { return new Db4oNetworking(label); } } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutCustomContainerInstantiation.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutCustomContainerI0000644000175000017500000000242011520622622033254 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Opts out from fixtures that require customized ways of creating/opening ObjectContainer /// instances and won't work with test cases explicitly invoking the common factory methods. /// /// /// Opts out from fixtures that require customized ways of creating/opening ObjectContainer /// instances and won't work with test cases explicitly invoking the common factory methods. /// public interface IOptOutCustomContainerInstantiation : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutBTreeFreespaceManager.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutBTreeFreespaceMa0000644000175000017500000000151511520622622033127 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public interface IOptOutBTreeFreespaceManager : IOptOutFromTestFixture { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oNetworking.cs0000644000175000017500000001746311520622622032023 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !SILVERLIGHT using System; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Util; using Db4objects.Db4o; using Db4objects.Db4o.CS.Config; using Db4objects.Db4o.CS.Internal.Config; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Threading; namespace Db4oUnit.Extensions.Fixtures { public class Db4oNetworking : AbstractDb4oFixture, IDb4oClientServerFixture { private const int ThreadpoolTimeout = 3000; protected static readonly string File = "Db4oClientServer.db4o"; public static readonly string Host = "127.0.0.1"; public static readonly string Username = "db4o"; public static readonly string Password = Username; private IObjectServer _server; private readonly Sharpen.IO.File _file; private IExtObjectContainer _objectContainer; private string _label; private int _port; private IConfiguration _serverConfig; private readonly IClientServerFactory _csFactory; public Db4oNetworking(IClientServerFactory csFactory, string label) { _csFactory = csFactory != null ? csFactory : DefaultClientServerFactory(); _file = new Sharpen.IO.File(FilePath()); _label = label; } private IClientServerFactory DefaultClientServerFactory() { return new StandardClientServerFactory(); } public Db4oNetworking(string label) : this(null, label) { } public Db4oNetworking() : this("C/S") { } /// public override void Open(IDb4oTestCase testInstance) { OpenServerFor(testInstance); OpenClientFor(testInstance); ListenToUncaughtExceptions(); } private void ListenToUncaughtExceptions() { ListenToUncaughtExceptions(ServerThreadPool()); IThreadPool4 clientThreadPool = ClientThreadPool(); if (null != clientThreadPool) { ListenToUncaughtExceptions(clientThreadPool); } } private IThreadPool4 ClientThreadPool() { return ThreadPoolFor(_objectContainer); } private IThreadPool4 ServerThreadPool() { return ThreadPoolFor(_server.Ext().ObjectContainer()); } /// private void OpenClientFor(IDb4oTestCase testInstance) { IConfiguration config = ClientConfigFor(testInstance); _objectContainer = OpenClientWith(config); } /// private IConfiguration ClientConfigFor(IDb4oTestCase testInstance) { if (RequiresCustomConfiguration(testInstance)) { IConfiguration customServerConfig = NewConfiguration(); ((ICustomClientServerConfiguration)testInstance).ConfigureClient(customServerConfig ); return customServerConfig; } IConfiguration config = CloneConfiguration(); ApplyFixtureConfiguration(testInstance, config); return config; } private IExtObjectContainer OpenSocketClient(IConfiguration config) { return _csFactory.OpenClient(AsClientConfiguration(config), Host, _port, Username , Password).Ext(); } /// public virtual IExtObjectContainer OpenNewSession(IDb4oTestCase testInstance) { IConfiguration config = ClientConfigFor(testInstance); return OpenClientWith(config); } private IExtObjectContainer OpenClientWith(IConfiguration config) { return OpenSocketClient(config); } /// private void OpenServerFor(IDb4oTestCase testInstance) { _serverConfig = ServerConfigFor(testInstance); _server = _csFactory.OpenServer(AsServerConfiguration(_serverConfig), _file.GetAbsolutePath (), -1); _port = _server.Ext().Port(); _server.GrantAccess(Username, Password); } /// private IConfiguration ServerConfigFor(IDb4oTestCase testInstance) { if (RequiresCustomConfiguration(testInstance)) { IConfiguration customServerConfig = NewConfiguration(); ((ICustomClientServerConfiguration)testInstance).ConfigureServer(customServerConfig ); return customServerConfig; } return CloneConfiguration(); } private bool RequiresCustomConfiguration(IDb4oTestCase testInstance) { if (testInstance is ICustomClientServerConfiguration) { return true; } return false; } /// public override void Close() { if (null != _objectContainer) { IThreadPool4 clientThreadPool = ClientThreadPool(); _objectContainer.Close(); _objectContainer = null; if (null != clientThreadPool) { clientThreadPool.Join(ThreadpoolTimeout); } } CloseServer(); } /// private void CloseServer() { if (null != _server) { IThreadPool4 serverThreadPool = ServerThreadPool(); _server.Close(); _server = null; if (null != serverThreadPool) { serverThreadPool.Join(ThreadpoolTimeout); } } } public override IExtObjectContainer Db() { return _objectContainer; } protected override void DoClean() { _file.Delete(); } public virtual IObjectServer Server() { return _server; } /// /// Does not accept a clazz which is assignable from OptOutCS, or not /// assignable from Db4oTestCase. /// /// /// Does not accept a clazz which is assignable from OptOutCS, or not /// assignable from Db4oTestCase. /// /// /// returns false if the clazz is assignable from OptOutCS, or not /// assignable from Db4oTestCase. Otherwise, returns true. /// public override bool Accept(Type clazz) { if (!typeof(IDb4oTestCase).IsAssignableFrom(clazz)) { return false; } if (typeof(IOptOutMultiSession).IsAssignableFrom(clazz)) { return false; } if (typeof(IOptOutNetworkingCS).IsAssignableFrom(clazz)) { return false; } return true; } public override LocalObjectContainer FileSession() { return (LocalObjectContainer)_server.Ext().ObjectContainer(); } /// public override void Defragment() { Defragment(FilePath()); } public override string Label() { return BuildLabel(_label); } public virtual int ServerPort() { return _port; } private static string FilePath() { return CrossPlatformServices.DatabasePath(File); } public override void ConfigureAtRuntime(IRuntimeConfigureAction action) { action.Apply(Config()); action.Apply(_serverConfig); } private IClientConfiguration AsClientConfiguration(IConfiguration serverConfig) { return Db4oClientServerLegacyConfigurationBridge.AsClientConfiguration(serverConfig ); } private IServerConfiguration AsServerConfiguration(IConfiguration serverConfig) { return Db4oClientServerLegacyConfigurationBridge.AsServerConfiguration(serverConfig ); } } } #endif // !SILVERLIGHT db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutSolo.cs0000644000175000017500000000216011520622622031347 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running with a Solo fixture. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running with a Solo fixture. /// public interface IOptOutSolo : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNoFileSystemData.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutNoFileSystemData0000644000175000017500000000256211520622622033210 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running within a fixture that may not provide access to required data /// on the file system. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running within a fixture that may not provide access to required data /// on the file system. (This opt-out probably should be replaced by a less /// file system dependent access mechanism to this data.) /// public interface IOptOutNoFileSystemData : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/BTreeFreespaceManagerFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/BTreeFreespaceManagerFi0000644000175000017500000000244111520622622033136 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Fixtures { public class BTreeFreespaceManagerFixture : Db4oSolo { protected override IObjectContainer CreateDatabase(IConfiguration config) { config.Freespace().UseBTreeSystem(); return base.CreateDatabase(config); } public override bool Accept(Type clazz) { return base.Accept(clazz) && !typeof(IOptOutBTreeFreespaceManager).IsAssignableFrom (clazz); } public override string Label() { return "BTreeFreespace-" + base.Label(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutMultiSession.cs0000644000175000017500000000231011520622622033066 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running both with the embedded and networking Client/Server fixture. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running both with the embedded and networking Client/Server fixture. /// public interface IOptOutMultiSession : IOptOutFromTestFixture { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutSilverlight.cs0000644000175000017500000000220511520622622032727 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running in silverlight environment. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running in silverlight environment. /// public interface IOptOutSilverlight : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oEmbeddedSessionFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oEmbeddedSessionFixt0000644000175000017500000000420211520622622033143 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o.Ext; namespace Db4oUnit.Extensions.Fixtures { public class Db4oEmbeddedSessionFixture : AbstractFileBasedDb4oFixture, IMultiSessionFixture { private static readonly string File = "db4oEmbeddedSession.db4o"; private readonly string _label; private IExtObjectContainer _session; public Db4oEmbeddedSessionFixture(string label) { _label = label; } public Db4oEmbeddedSessionFixture() : this("E/S") { } public override string Label() { return BuildLabel(_label); } public override IExtObjectContainer Db() { return _session; } protected override string FileName() { return File; } public override bool Accept(Type clazz) { if (!typeof(IDb4oTestCase).IsAssignableFrom(clazz)) { return false; } if (typeof(IOptOutMultiSession).IsAssignableFrom(clazz)) { return false; } if (typeof(IOptOutAllButNetworkingCS).IsAssignableFrom(clazz)) { return false; } return true; } protected override void PostOpen(IDb4oTestCase testInstance) { _session = OpenNewSession(testInstance); } protected override void PreClose() { if (null != _session) { _session.Close(); } } public virtual IExtObjectContainer OpenNewSession(IDb4oTestCase testInstance) { return FileSession().OpenSession().Ext(); } } } ././@LongLink0000000000000000000000000000015500000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/AbstractFileBasedDb4oFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/AbstractFileBasedDb4oFi0000644000175000017500000000326411520622622033043 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Extensions.Util; using Db4objects.Db4o; using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions.Fixtures { public abstract class AbstractFileBasedDb4oFixture : AbstractSoloDb4oFixture { private readonly Sharpen.IO.File _databaseFile; public AbstractFileBasedDb4oFixture() { string fileName = FileName(); _databaseFile = new Sharpen.IO.File(CrossPlatformServices.DatabasePath(fileName)); } protected abstract string FileName(); protected override IObjectContainer CreateDatabase(IConfiguration config) { return Db4oFactory.OpenFile(config, GetAbsolutePath()); } public virtual string GetAbsolutePath() { return _databaseFile.GetAbsolutePath(); } /// public override void Defragment() { Defragment(GetAbsolutePath()); } protected override void DoClean() { if (_databaseFile.Exists()) { _databaseFile.Delete(); } } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutAllButNetworkingCS.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutAllButNetworking0000644000175000017500000000223711520622622033267 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { /// /// Marker interface to denote that implementing test cases should be excluded /// from running with any fixture but a networking C/S one. /// /// /// Marker interface to denote that implementing test cases should be excluded /// from running with any fixture but a networking C/S one. /// public interface IOptOutAllButNetworkingCS : IOptOutSolo { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/IOptOutInMemory.cs0000644000175000017500000000150011520622622032167 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public interface IOptOutInMemory : IOptOutFromTestFixture { } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oConsistencyCheckSolo.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Fixtures/Db4oConsistencyCheckSol0000644000175000017500000000675011520622622033202 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4oUnit; using Db4oUnit.Extensions.Fixtures; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Consistency; using Db4objects.Db4o.Defragment; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; namespace Db4oUnit.Extensions.Fixtures { public class Db4oConsistencyCheckSolo : Db4oSolo { protected override IObjectContainer CreateDatabase(IConfiguration config) { Check(CloneConfig(config)); Defrag(CloneConfig(config)); Check(CloneConfig(config)); return base.CreateDatabase(config); } protected override void PreClose() { base.PreClose(); if (Db() != null && !Db().IsClosed()) { Db().Close(); } Check(CloneConfiguration()); Defrag(CloneConfiguration()); Check(CloneConfiguration()); } public override bool Accept(Type clazz) { return base.Accept(clazz) && !typeof(IOptOutDefragSolo).IsAssignableFrom(clazz); } private void Check(IConfiguration config) { IObjectContainer db = base.CreateDatabase(config); ConsistencyChecker.ConsistencyReport report = new ConsistencyChecker(db).CheckSlotConsistency (); CloseAndWait(db); if (!report.Consistent()) { throw new TestException(report.ToString(), null); } } private void Defrag(IConfiguration config) { Sharpen.IO.File origFile = new Sharpen.IO.File(GetAbsolutePath()); if (origFile.Exists()) { try { string backupFile = GetAbsolutePath() + ".defrag.backup"; IIdMapping mapping = new InMemoryIdMapping(); // new // BTreeIDMapping(getAbsolutePath()+".defrag.mapping",4096,1,1000); DefragmentConfig defragConfig = new DefragmentConfig(GetAbsolutePath(), backupFile , mapping); defragConfig.ForceBackupDelete(true); // FIXME Cloning is ugly - wrap original in Decorator within // DefragContext instead? IConfiguration clonedConfig = (IConfiguration)((IDeepClone)config).DeepClone(null ); defragConfig.Db4oConfig(clonedConfig); Db4objects.Db4o.Defragment.Defragment.Defrag(defragConfig, new _IDefragmentListener_65 ()); } catch (IOException e) { Sharpen.Runtime.PrintStackTrace(e); } } } private sealed class _IDefragmentListener_65 : IDefragmentListener { public _IDefragmentListener_65() { } public void NotifyDefragmentInfo(DefragmentInfo info) { Sharpen.Runtime.Err.WriteLine(info); } } private IConfiguration CloneConfig(IConfiguration config) { return (IConfiguration)((IDeepClone)config).DeepClone(null); } private void CloseAndWait(IObjectContainer db) { db.Close(); try { ((ObjectContainerBase)db).ThreadPool().Join(3000); } catch (Exception) { } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutWorkspaceIssue.cs0000644000175000017500000000151211520622622031571 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutWorkspaceIssue : IOptOutAndroid { //related to issue UNIT-31 } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ObjectSetAssert.cs0000644000175000017500000000412211520622622030402 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o; using Db4objects.Db4o.Foundation; namespace Db4oUnit.Extensions { public class ObjectSetAssert { public static void SameContent(IObjectSet objectSet, object[] expectedItems) { Iterator4Assert.SameContent(Iterators.Iterate(expectedItems), Iterate(objectSet)); } public static void AreEqual(IObjectSet objectSet, object[] expectedItems) { Iterator4Assert.AreEqual(expectedItems, Iterate(objectSet)); } public static IEnumerator Iterate(IObjectSet objectSet) { return new ObjectSetAssert.ObjectSetIterator4(objectSet); } internal class ObjectSetIterator4 : IEnumerator { private static readonly object Invalid = new object(); private IObjectSet _objectSet; private object _current; public ObjectSetIterator4(IObjectSet collection) { _objectSet = collection; } public virtual object Current { get { if (_current == Invalid) { throw new InvalidOperationException(); } return _current; } } public virtual bool MoveNext() { if (_objectSet.HasNext()) { _current = _objectSet.Next(); return true; } _current = Invalid; return false; } public virtual void Reset() { _objectSet.Reset(); _current = Invalid; } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ComposibleTestSuite.cs0000644000175000017500000000250111520622622031303 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit.Extensions; using Sharpen; namespace Db4oUnit.Extensions { public abstract class ComposibleTestSuite : Db4oTestSuite { protected Type[] ComposeTests(Type[] testCases) { return Concat(testCases, ComposeWith()); } protected virtual Type[] ComposeWith() { return new Type[0]; } public static Type[] Concat(Type[] testCases, Type[] otherTests) { Type[] result = new Type[otherTests.Length + testCases.Length]; System.Array.Copy(testCases, 0, result, 0, testCases.Length); System.Array.Copy(otherTests, 0, result, testCases.Length, otherTests.Length); return result; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IDb4oTestCase.cs0000644000175000017500000000142411520622622027675 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; namespace Db4oUnit.Extensions { public interface IDb4oTestCase : ITestCase { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IDb4oFixture.cs0000644000175000017500000000316011520622622027607 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit.Extensions; using Db4oUnit.Fixtures; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; namespace Db4oUnit.Extensions { public interface IDb4oFixture : ILabeled { /// void Open(IDb4oTestCase testInstance); /// void Close(); /// void Reopen(IDb4oTestCase testInstance); void Clean(); LocalObjectContainer FileSession(); IExtObjectContainer Db(); IConfiguration Config(); bool Accept(Type clazz); /// void Defragment(); void ConfigureAtRuntime(IRuntimeConfigureAction action); void FixtureConfiguration(IFixtureConfiguration configuration); void ResetConfig(); IList UncaughtExceptions(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutVerySlow.cs0000644000175000017500000000147711520622622030426 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutVerySlow : IOptOutAndroid { // related to UNIT-35 } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutExcludingClassLoaderIssue.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutExcludingClassLoaderIssue0000644000175000017500000000152611520622622033273 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutExcludingClassLoaderIssue : IOptOutAndroid { // related to issue UNIT-34 } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ISlotListener.cs0000644000175000017500000000152311520622622030100 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Internal.Slots; namespace Db4oUnit.Extensions { /// public interface ISlotListener { void OnFree(Slot slot); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Util/0000755000175000017500000000000011520622064025725 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Util/Binary.cs0000644000175000017500000000232711520622622027504 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4oUnit.Extensions.Util { /// public class Binary { public static long LongForBits(long bits) { return (long)((Math.Pow(2, bits)) - 1); } public static int NumberOfBits(long l) { if (l < 0) { throw new ArgumentException(); } long bit = 1; int counter = 0; for (int i = 0; i < 64; i++) { if ((l & bit) == 0) { counter++; } else { counter = 0; } bit = bit << 1; } return 64 - counter; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Util/CrossPlatformServices.cs0000644000175000017500000000277111520622622032565 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; using Db4objects.Db4o.Foundation.IO; using Db4objects.Db4o.Internal; using Sharpen; namespace Db4oUnit.Extensions.Util { public class CrossPlatformServices { public static string SimpleName(string typeName) { int index = typeName.IndexOf(','); if (index < 0) { return typeName; } return Sharpen.Runtime.Substring(typeName, 0, index); } public static string FullyQualifiedName(Type klass) { return ReflectPlatform.FullyQualifiedName(klass); } public static string DatabasePath(string fileName) { string path = Runtime.GetProperty("db4ounit.file.path"); if (path == null || path.Length == 0) { path = "."; } else { System.IO.Directory.CreateDirectory(path); } return Path.Combine(path, fileName); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Util/IOUtil.cs0000644000175000017500000000246411520622622027427 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.IO; using Db4objects.Db4o.Foundation.IO; namespace Db4oUnit.Extensions.Util { /// public class IOUtil { /// Deletes the directory /// public static void DeleteDir(string dir) { string absolutePath = new Sharpen.IO.File(dir).GetCanonicalPath(); Sharpen.IO.File fDir = new Sharpen.IO.File(dir); if (fDir.IsDirectory()) { string[] files = fDir.List(); for (int i = 0; i < files.Length; i++) { DeleteDir(Path.Combine(absolutePath, files[i])); } } File4.Delete(dir); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/TAFixtureConfiguration.cs0000644000175000017500000000266111520622622031747 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Config; using Db4objects.Db4o.TA; namespace Db4oUnit.Extensions { /// /// Configure the test case to run with TransparentActivationSupport /// enabled unless the test case implements OptOutTA. /// /// /// Configure the test case to run with TransparentActivationSupport /// enabled unless the test case implements OptOutTA. /// public class TAFixtureConfiguration : IFixtureConfiguration { public virtual void Configure(IDb4oTestCase testCase, IConfiguration config) { if (testCase is IOptOutTA) { return; } config.Add(new TransparentActivationSupport()); } public virtual string GetLabel() { return "TA"; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oFixtureVariable.cs0000644000175000017500000000204511520622622031145 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4oUnit.Fixtures; namespace Db4oUnit.Extensions { public sealed class Db4oFixtureVariable { public static readonly FixtureVariable FixtureVariable = new FixtureVariable("db4o" ); public static IDb4oFixture Fixture() { return (IDb4oFixture)FixtureVariable.Value; } private Db4oFixtureVariable() { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IRuntimeConfigureAction.cs0000644000175000017500000000150611520622622032075 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Config; namespace Db4oUnit.Extensions { public interface IRuntimeConfigureAction { void Apply(IConfiguration config); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/FreespaceManagerForDebug.cs0000644000175000017500000000475511520622622032160 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Freespace; using Db4objects.Db4o.Internal.Slots; namespace Db4oUnit.Extensions { public class FreespaceManagerForDebug : IFreespaceManager { private readonly ISlotListener _listener; public FreespaceManagerForDebug(ISlotListener listener) { _listener = listener; } public virtual Slot AllocateSafeSlot(int length) { return null; } public virtual void FreeSafeSlot(Slot slot) { } public virtual void BeginCommit() { } public virtual void Commit() { } public virtual void EndCommit() { } public virtual int SlotCount() { return 0; } public virtual void Free(Slot slot) { _listener.OnFree(slot); } public virtual void FreeSelf() { } public virtual Slot AllocateSlot(int length) { return null; } public virtual void Start(int id) { } public virtual byte SystemType() { return AbstractFreespaceManager.FmDebug; } public virtual void Traverse(IVisitor4 visitor) { } public virtual void Write(LocalObjectContainer container) { } public virtual void Listener(IFreespaceListener listener) { } public virtual void MigrateTo(IFreespaceManager fm) { } // TODO Auto-generated method stub public virtual int TotalFreespace() { // TODO Auto-generated method stub return 0; } public virtual void SlotFreed(Slot slot) { } // TODO Auto-generated method stub public virtual bool IsStarted() { return false; } public virtual Slot AllocateTransactionLogSlot(int length) { return null; } public virtual void Read(LocalObjectContainer container, Slot slot) { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ContainerServices.cs0000644000175000017500000000204711520622622030770 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; using Db4objects.Db4o; namespace Db4oUnit.Extensions { public class ContainerServices { /// public static void WithContainer(IObjectContainer container, IContainerBlock block ) { try { block.Run(container); } finally { container.Close(); } } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oConcurrencyTestSuite.cs0000644000175000017500000000217311520622622032217 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Concurrency; namespace Db4oUnit.Extensions { public abstract class Db4oConcurrencyTestSuite : AbstractDb4oTestCase, ITestSuiteBuilder { public virtual IEnumerator GetEnumerator() { return new Db4oConcurrencyTestSuiteBuilder(Fixture(), TestCases()).GetEnumerator( ); } protected abstract override Type[] TestCases(); } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutNotSupportedJavaxManagement.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutNotSupportedJavaxManageme0000644000175000017500000000147111520622622033315 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutNotSupportedJavaxManagement : IOptOutAndroid { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/0000755000175000017500000000000011520622056027303 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/ConcurrencyConventions.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/ConcurrencyConventio0000644000175000017500000000251011520622622033402 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions.Concurrency { public class ConcurrencyConventions { internal static string CheckMethodNameFor(string testMethodName) { int testPrefixLength = TestPrefix().Length; string subMethodName = Sharpen.Runtime.Substring(testMethodName, testPrefixLength ); return CheckPrefix() + subMethodName; } private static string CheckPrefix() { if (Db4oUnitPlatform.IsPascalCase()) { return "Check"; } return "check"; } public static string TestPrefix() { if (Db4oUnitPlatform.IsPascalCase()) { return "Conc"; } return "conc"; } } } ././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/Db4oConcurrencyTestSuiteBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/Db4oConcurrencyTestS0000644000175000017500000000376511520622622033226 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Concurrency; using Db4objects.Db4o.Ext; namespace Db4oUnit.Extensions.Concurrency { public class Db4oConcurrencyTestSuiteBuilder : Db4oTestSuiteBuilder { public Db4oConcurrencyTestSuiteBuilder(IDb4oFixture fixture, Type clazz) : base(fixture , clazz) { } public Db4oConcurrencyTestSuiteBuilder(IDb4oFixture fixture, Type[] classes) : base (fixture, classes) { } protected override ITest CreateTest(object instance, MethodInfo method) { return new ConcurrencyTestMethod(instance, method); } protected override bool IsTestMethod(MethodInfo method) { string name = method.Name; return StartsWithIgnoreCase(name, ConcurrencyConventions.TestPrefix()) && TestPlatform .IsPublic(method) && !TestPlatform.IsStatic(method) && HasValidParameter(method); } internal static bool HasValidParameter(MethodInfo method) { Type[] parameters = Sharpen.Runtime.GetParameterTypes(method); if (parameters.Length == 1 && parameters[0] == typeof(IExtObjectContainer)) { return true; } if (parameters.Length == 2 && parameters[0] == typeof(IExtObjectContainer) && parameters [1] == typeof(int)) { return true; } return false; } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/ConcurrencyTestMethod.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Concurrency/ConcurrencyTestMetho0000644000175000017500000001250311520622622033355 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Concurrency; using Db4oUnit.Extensions.Fixtures; using Db4oUnit.Fixtures; using Db4objects.Db4o.Ext; using Sharpen.Lang; namespace Db4oUnit.Extensions.Concurrency { public class ConcurrencyTestMethod : TestMethod { private Thread[] threads; internal Exception[] failures; public ConcurrencyTestMethod(object instance, MethodInfo method) : base(instance, method) { } /// protected override void Invoke() { AbstractDb4oTestCase toTest = Subject(); MethodInfo method = GetMethod(); InvokeConcurrencyMethod(toTest, method); } private AbstractDb4oTestCase Subject() { return (AbstractDb4oTestCase)GetSubject(); } /// private void InvokeConcurrencyMethod(AbstractDb4oTestCase toTest, MethodInfo method ) { Type[] parameters = Sharpen.Runtime.GetParameterTypes(method); bool hasSequenceParameter = false; if (parameters.Length == 2) { // ExtObjectContainer, seq hasSequenceParameter = true; } int threadCount = toTest.ThreadCount(); threads = new Thread[threadCount]; failures = new Exception[threadCount]; for (int i = 0; i < threadCount; ++i) { threads[i] = new Thread(new ConcurrencyTestMethod.RunnableTestMethod(this, toTest , method, i, hasSequenceParameter), "ConcurrencyTestMethod.invokeConcurrencyMethod Thread[" + i + "]"); } // start threads simultaneously for (int i = 0; i < threadCount; ++i) { threads[i].Start(); } // wait for the threads to end for (int i = 0; i < threadCount; ++i) { threads[i].Join(); } // check if any of the threads ended abnormally for (int i = 0; i < threadCount; ++i) { if (failures[i] != null) { // TODO: show all failures by throwing another kind of exception. throw failures[i]; } } // check test result CheckConcurrencyMethod(toTest, method.Name); } /// private void CheckConcurrencyMethod(AbstractDb4oTestCase toTest, string testMethodName ) { MethodInfo checkMethod = CheckMethodFor(toTest.GetType(), testMethodName); if (null == checkMethod) { return; } // pass ExtObjectContainer as a param to check method IExtObjectContainer oc = Fixture().Db(); try { checkMethod.Invoke(toTest, new object[] { oc }); } finally { oc.Close(); } } private MethodInfo CheckMethodFor(Type testClass, string testMethodName) { try { Type[] types = new Type[] { typeof(IExtObjectContainer) }; return Sharpen.Runtime.GetDeclaredMethod(testClass, ConcurrencyConventions.CheckMethodNameFor (testMethodName), types); } catch (Exception) { // if checkMethod is not availble, return as success return null; } } internal class RunnableTestMethod : Contextful, IRunnable { private AbstractDb4oTestCase toTest; private MethodInfo method; private int seq; private bool showSeq; internal RunnableTestMethod(ConcurrencyTestMethod _enclosing, AbstractDb4oTestCase toTest, MethodInfo method, int seq, bool showSeq) { this._enclosing = _enclosing; this.toTest = toTest; this.method = method; this.seq = seq; this.showSeq = showSeq; } public virtual void Run() { this.Run(new _IRunnable_115(this)); } private sealed class _IRunnable_115 : IRunnable { public _IRunnable_115(RunnableTestMethod _enclosing) { this._enclosing = _enclosing; } public void Run() { this._enclosing.RunMethod(); } private readonly RunnableTestMethod _enclosing; } internal virtual void RunMethod() { IExtObjectContainer oc = null; try { oc = this._enclosing.Fixture().OpenNewSession(this.toTest); object[] args; if (this.showSeq) { args = new object[2]; args[0] = oc; args[1] = this.seq; } else { args = new object[1]; args[0] = oc; } this.method.Invoke(this.toTest, args); } catch (Exception e) { this._enclosing.failures[this.seq] = e; } finally { if (oc != null) { oc.Close(); } } } private readonly ConcurrencyTestMethod _enclosing; } internal virtual IMultiSessionFixture Fixture() { return ((IMultiSessionFixture)AbstractDb4oTestCase.Fixture()); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutTA.cs0000644000175000017500000000161511520622622027132 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4oUnit.Extensions { /// /// Marks a test case as non valid for the /// TAFixtureConfiguration /// . /// public interface IOptOutTA { } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/ExpectingVisitor.cs0000644000175000017500000001014511520622622030646 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit; using Db4oUnit.Extensions; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4oUnit.Extensions { public class ExpectingVisitor : IVisitor4 { private const bool Debug = false; private readonly object[] _expected; private readonly bool _obeyOrder; private readonly Collection4 _unexpected = new Collection4(); private bool _ignoreUnexpected; private int _cursor; private sealed class _object_24 : object { public _object_24() { } public override string ToString() { return "[FOUND]"; } } private static readonly object Found = new _object_24(); public ExpectingVisitor(object[] results, bool obeyOrder, bool ignoreUnexpected) { _expected = new object[results.Length]; System.Array.Copy(results, 0, _expected, 0, results.Length); _obeyOrder = obeyOrder; _ignoreUnexpected = ignoreUnexpected; } public ExpectingVisitor(object[] results) : this(results, false, false) { } public ExpectingVisitor(object singleObject) : this(new object[] { singleObject } ) { } /// Expect empty public ExpectingVisitor() : this(new object[0]) { } public virtual void Visit(object obj) { if (_obeyOrder) { VisitOrdered(obj); } else { VisitUnOrdered(obj); } } private void VisitOrdered(object obj) { if (_cursor < _expected.Length) { if (AreEqual(_expected[_cursor], obj)) { Ods("Expected OK: " + obj.ToString()); _expected[_cursor] = Found; _cursor++; return; } } Unexpected(obj); } private void Unexpected(object obj) { if (_ignoreUnexpected) { return; } _unexpected.Add(obj); Ods("Unexpected: " + obj); } private void VisitUnOrdered(object obj) { for (int i = 0; i < _expected.Length; i++) { object expectedItem = _expected[i]; if (AreEqual(obj, expectedItem)) { Ods("Expected OK: " + obj); _expected[i] = Found; return; } } Unexpected(obj); } private bool AreEqual(object obj, object expectedItem) { return expectedItem == obj || (expectedItem != null && obj != null && expectedItem .Equals(obj)); } private static void Ods(string message) { } public virtual void AssertExpectations() { if (_unexpected.Size() > 0) { Assert.Fail("UNEXPECTED: " + _unexpected.ToString()); } for (int i = 0; i < _expected.Length; i++) { Assert.AreSame(Found, _expected[i]); } } public static Db4oUnit.Extensions.ExpectingVisitor CreateExpectingVisitor(int value , int count) { int[] values = new int[count]; for (int i = 0; i < values.Length; i++) { values[i] = value; } return new Db4oUnit.Extensions.ExpectingVisitor(IntArrays4.ToObjectArray(values)); } public static Db4oUnit.Extensions.ExpectingVisitor CreateExpectingVisitor(int[] keys ) { return new Db4oUnit.Extensions.ExpectingVisitor(IntArrays4.ToObjectArray(keys)); } public static Db4oUnit.Extensions.ExpectingVisitor CreateSortedExpectingVisitor(int [] keys) { return new Db4oUnit.Extensions.ExpectingVisitor(IntArrays4.ToObjectArray(keys), true , false); } public static Db4oUnit.Extensions.ExpectingVisitor CreateExpectingVisitor(int expectedID ) { return CreateExpectingVisitor(expectedID, 1); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IOptOutBigMathIssue.cs0000644000175000017500000000151211520622622031146 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { public interface IOptOutBigMathIssue : IOptOutAndroid { // related to issue COR-2007 } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/FieldIndexAssert.cs0000644000175000017500000000433711520622622030543 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4oUnit; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal; using Db4objects.Db4o.Internal.Btree; namespace Db4oUnit.Extensions { public class FieldIndexAssert { private readonly Type _clazz; private readonly string _name; public FieldIndexAssert(Type clazz, string name) { _clazz = clazz; _name = name; } public virtual void AssertSingleEntry(LocalObjectContainer container, long id) { BooleanByRef called = new BooleanByRef(); Index(container).TraverseKeys(container.SystemTransaction(), new _IVisitor4_24(id , called)); Assert.IsTrue(called.value); } private sealed class _IVisitor4_24 : IVisitor4 { public _IVisitor4_24(long id, BooleanByRef called) { this.id = id; this.called = called; } public void Visit(object key) { Assert.AreEqual(id, ((IFieldIndexKey)key).ParentID()); Assert.IsFalse(called.value); called.value = true; } private readonly long id; private readonly BooleanByRef called; } private BTree Index(LocalObjectContainer container) { return FieldMetadata(container).GetIndex(null); } private Db4objects.Db4o.Internal.FieldMetadata FieldMetadata(LocalObjectContainer container) { return ClassMetadata(container).FieldMetadataForName(_name); } private Db4objects.Db4o.Internal.ClassMetadata ClassMetadata(LocalObjectContainer container) { return container.ClassMetadataForReflectClass(container.Reflector().ForClass(_clazz )); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Dbmock/0000755000175000017500000000000011520622070026204 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Dbmock/MockClient.cs0000644000175000017500000002242611520622622030574 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.IO; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; using Db4objects.Db4o.Reflect; using Db4objects.Db4o.Reflect.Generic; namespace Db4oUnit.Extensions.Dbmock { public partial class MockClient : IExtClient { public virtual bool IsAlive() { throw new NotImplementedException(); } public virtual void SwitchToFile(string fileName) { throw new NotImplementedException(); } public virtual void SwitchToMainFile() { throw new NotImplementedException(); } /// /// public virtual void Activate(object obj) { throw new NotImplementedException(); } /// /// /// public virtual void Backup(string path) { throw new NotImplementedException(); } /// /// /// public virtual void Backup(IStorage targetStorage, string path) { throw new NotImplementedException(); } /// /// public virtual void Bind(object obj, long id) { throw new NotImplementedException(); } public virtual IConfiguration Configure() { throw new NotImplementedException(); } public virtual void Deactivate(object obj) { throw new NotImplementedException(); } public virtual object Descend(object obj, string[] path) { throw new NotImplementedException(); } /// /// public virtual object GetByID(long Id) { throw new NotImplementedException(); } /// /// public virtual object GetByUUID(Db4oUUID uuid) { throw new NotImplementedException(); } public virtual long GetID(object obj) { throw new NotImplementedException(); } public virtual IObjectInfo GetObjectInfo(object obj) { throw new NotImplementedException(); } public virtual Db4oDatabase Identity() { throw new NotImplementedException(); } public virtual bool IsActive(object obj) { throw new NotImplementedException(); } public virtual bool IsCached(long Id) { throw new NotImplementedException(); } public virtual bool IsClosed() { throw new NotImplementedException(); } /// public virtual bool IsStored(object obj) { throw new NotImplementedException(); } public virtual IReflectClass[] KnownClasses() { throw new NotImplementedException(); } public virtual object Lock() { throw new NotImplementedException(); } public virtual object PeekPersisted(object @object, int depth, bool committed) { throw new NotImplementedException(); } public virtual void Purge() { throw new NotImplementedException(); } public virtual void Purge(object obj) { throw new NotImplementedException(); } public virtual GenericReflector Reflector() { throw new NotImplementedException(); } public virtual void Refresh(object obj, int depth) { throw new NotImplementedException(); } public virtual void ReleaseSemaphore(string name) { throw new NotImplementedException(); } public virtual bool SetSemaphore(string name, int waitForAvailability) { throw new NotImplementedException(); } public virtual void Store(object obj, int depth) { throw new NotImplementedException(); } public virtual IStoredClass StoredClass(object clazz) { throw new NotImplementedException(); } public virtual IStoredClass[] StoredClasses() { throw new NotImplementedException(); } public virtual ISystemInfo SystemInfo() { throw new NotImplementedException(); } public virtual long Version() { throw new NotImplementedException(); } /// /// public virtual void Activate(object obj, int depth) { throw new NotImplementedException(); } /// public virtual bool Close() { throw new NotImplementedException(); } /// /// /// public virtual void Commit() { throw new NotImplementedException(); } /// public virtual void Deactivate(object obj, int depth) { throw new NotImplementedException(); } /// /// /// public virtual void Delete(object obj) { throw new NotImplementedException(); } public virtual IExtObjectContainer Ext() { throw new NotImplementedException(); } /// /// public virtual IObjectSet Get(object template) { throw new NotImplementedException(); } /// public virtual IQuery Query() { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Type clazz) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate, IQueryComparator comparator) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate, IComparer comparator) { throw new NotImplementedException(); } /// /// public virtual IObjectSet QueryByExample(object template) { throw new NotImplementedException(); } /// /// /// public virtual void Rollback() { throw new NotImplementedException(); } /// /// public virtual void Store(object obj) { throw new NotImplementedException(); } public virtual IObjectContainer OpenSession() { throw new NotImplementedException(); } public virtual IQLin From(Type clazz) { throw new NotImplementedException(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Dbmock/MockEmbedded.cs0000644000175000017500000001214311520622622031042 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4objects.Db4o; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Qlin; using Db4objects.Db4o.Query; namespace Db4oUnit.Extensions.Dbmock { public partial class MockEmbedded : IEmbeddedObjectContainer { /// /// /// public virtual void Backup(string path) { throw new NotImplementedException(); } public virtual IObjectContainer OpenSession() { throw new NotImplementedException(); } /// /// public virtual void Activate(object obj, int depth) { throw new NotImplementedException(); } /// public virtual bool Close() { throw new NotImplementedException(); } /// /// /// public virtual void Commit() { throw new NotImplementedException(); } /// public virtual void Deactivate(object obj, int depth) { throw new NotImplementedException(); } /// /// /// public virtual void Delete(object obj) { throw new NotImplementedException(); } public virtual IExtObjectContainer Ext() { throw new NotImplementedException(); } /// /// public virtual IObjectSet Get(object template) { throw new NotImplementedException(); } /// public virtual IQuery Query() { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Type clazz) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate, IQueryComparator comparator) { throw new NotImplementedException(); } /// /// public virtual IObjectSet Query(Predicate predicate, IComparer comparator) { throw new NotImplementedException(); } /// /// public virtual IObjectSet QueryByExample(object template) { throw new NotImplementedException(); } /// /// /// public virtual void Rollback() { throw new NotImplementedException(); } /// /// public virtual void Store(object obj) { throw new NotImplementedException(); } public virtual IQLin From(Type clazz) { throw new NotImplementedException(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Dbmock/MockServer.cs0000644000175000017500000000234111520622622030616 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o; using Db4objects.Db4o.Ext; namespace Db4oUnit.Extensions.Dbmock { public partial class MockServer : IObjectServer { public virtual bool Close() { throw new NotImplementedException(); } public virtual IExtObjectServer Ext() { throw new NotImplementedException(); } public virtual void GrantAccess(string userName, string password) { throw new NotImplementedException(); } public virtual IObjectContainer OpenClient() { throw new NotImplementedException(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/IntArrays4.cs0000644000175000017500000000361711520622622027346 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using Db4objects.Db4o.Foundation; using Sharpen; namespace Db4oUnit.Extensions { public class IntArrays4 { public static int[] Fill(int[] array, int value) { for (int i = 0; i < array.Length; ++i) { array[i] = value; } return array; } public static int[] Concat(int[] a, int[] b) { int[] array = new int[a.Length + b.Length]; System.Array.Copy(a, 0, array, 0, a.Length); System.Array.Copy(b, 0, array, a.Length, b.Length); return array; } public static int Occurences(int[] values, int value) { int count = 0; for (int i = 0; i < values.Length; i++) { if (values[i] == value) { count++; } } return count; } public static int[] Clone(int[] bars) { int[] array = new int[bars.Length]; System.Array.Copy(bars, 0, array, 0, bars.Length); return array; } public static object[] ToObjectArray(int[] values) { object[] ret = new object[values.Length]; for (int i = 0; i < values.Length; i++) { ret[i] = values[i]; } return ret; } public static IEnumerator NewIterator(int[] values) { return new ArrayIterator4(ToObjectArray(values)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions/Db4oTestSuite.cs0000644000175000017500000000247311520622622030007 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using Db4oUnit; using Db4oUnit.Extensions; namespace Db4oUnit.Extensions { /// Base class for composable db4o test suites (AllTests classes inside each package, for instance). /// /// Base class for composable db4o test suites (AllTests classes inside each package, for instance). /// public abstract class Db4oTestSuite : AbstractDb4oTestCase, ITestSuiteBuilder { public virtual IEnumerator GetEnumerator() { return new Db4oTestSuiteBuilder(Fixture(), TestCases()).GetEnumerator(); } protected abstract override Type[] TestCases(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/0000755000175000017500000000000011520622040022502 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/0000755000175000017500000000000011520622064026276 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/AbstractDb4oTestCase.cs0000644000175000017500000000202411520622622032533 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Config; using Db4objects.Db4o.IO; namespace Db4oUnit.Extensions { /// /// Additional helper methods to make it easier to create /// test cases in c#. /// public partial class AbstractDb4oTestCase { protected T RetrieveOnlyInstance() { return (T) RetrieveOnlyInstance(typeof(T)); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Fixtures/0000755000175000017500000000000011520622070030104 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Fixtures/SilverlightFixture.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Fixtures/SilverlightFixtu0000644000175000017500000000364011520622622033351 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if SILVERLIGHT using Db4objects.Db4o; using Db4objects.Db4o.Config; using Db4objects.Db4o.Internal.Config; using Db4objects.Db4o.IO; namespace Db4oUnit.Extensions.Fixtures { public class SilverlightFixture : AbstractSoloDb4oFixture { protected override void DoClean() { if (null != _storage) { _storage.Delete(DatabaseFileName); } } public override string Label() { return BuildLabel("Silverlight Solo"); } public override void Defragment() { Defragment(DatabaseFileName); } protected override IObjectContainer CreateDatabase(IConfiguration config) { _storage = config.Storage; return Db4oFactory.OpenFile(config, DatabaseFileName); } protected override IConfiguration NewConfiguration() { var config = base.NewConfiguration(); var embeddedConfig = new EmbeddedConfigurationImpl(config); embeddedConfig.AddConfigurationItem(new SilverlightSupport()); return config; } public override bool Accept(System.Type clazz) { if (typeof(IOptOutSilverlight).IsAssignableFrom(clazz)) return false; return base.Accept(clazz); } private const string DatabaseFileName = "SilverlightDatabase.db4o"; private IStorage _storage; } } #endif././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Fixtures/Db4oNetworking.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Fixtures/Db4oNetworking.c0000644000175000017500000000514111520622622033114 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if SILVERLIGHT using System; using System.Collections; using Db4objects.Db4o.Config; using Db4objects.Db4o.Ext; using Db4objects.Db4o.Internal; using Db4oUnit.Fixtures; namespace Db4oUnit.Extensions.Fixtures { public class Db4oNetworking : IMultiSessionFixture { public Db4oNetworking() { throw new NotImplementedException(); } public Db4oNetworking(string label) { throw new NotImplementedException(); } string ILabeled.Label() { throw new NotImplementedException(); } void IDb4oFixture.Open(IDb4oTestCase testInstance) { throw new NotImplementedException(); } void IDb4oFixture.Close() { throw new NotImplementedException(); } void IDb4oFixture.Reopen(IDb4oTestCase testInstance) { throw new NotImplementedException(); } void IDb4oFixture.Clean() { throw new NotImplementedException(); } LocalObjectContainer IDb4oFixture.FileSession() { throw new NotImplementedException(); } IExtObjectContainer IDb4oFixture.Db() { throw new NotImplementedException(); } IConfiguration IDb4oFixture.Config() { throw new NotImplementedException(); } bool IDb4oFixture.Accept(Type clazz) { throw new NotImplementedException(); } void IDb4oFixture.Defragment() { throw new NotImplementedException(); } void IDb4oFixture.ConfigureAtRuntime(IRuntimeConfigureAction action) { throw new NotImplementedException(); } void IDb4oFixture.FixtureConfiguration(IFixtureConfiguration configuration) { throw new NotImplementedException(); } void IDb4oFixture.ResetConfig() { throw new NotImplementedException(); } IList IDb4oFixture.UncaughtExceptions() { throw new NotImplementedException(); } IExtObjectContainer IMultiSessionFixture.OpenNewSession(IDb4oTestCase testInstance) { throw new NotImplementedException(); } } } #endifdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Util/0000755000175000017500000000000011520622064027213 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Util/DiagnosticCollector.csdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Util/DiagnosticCollector.0000644000175000017500000000270111520622622033147 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections.Generic; using System.Text; using Db4objects.Db4o.Diagnostic; namespace Db4oUnit.Extensions.Util { public class DiagnosticCollector : IDiagnosticListener { public void OnDiagnostic(IDiagnostic d) { if (typeof(T) == d.GetType()) { _diagnostics.Add(d); } } public IList Diagnostics { get { return _diagnostics; } } public bool Empty { get { return _diagnostics.Count == 0; } } public override string ToString() { StringBuilder sb = new StringBuilder(); foreach (IDiagnostic diagnostic in _diagnostics) { sb.Append(diagnostic + "\r\n"); } return sb.ToString(); } private readonly IList _diagnostics = new List(); } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Util/IOServices.cs0000644000175000017500000000724411520622622031564 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Diagnostics; using System.IO; using System.Text; namespace Db4oUnit.Extensions.Util { public class IOServices { public static string FindParentDirectory(string path) { #if !CF string parent = Path.GetFullPath(".."); while (true) { if (Directory.Exists(Path.Combine(parent, path))) return parent; string oldParent = parent; parent = Path.GetDirectoryName(parent); if (parent == oldParent || parent == null) break; } #endif return null; } public static void WriteFile(string fname, string contents) { CreateParentDirectories(fname); using (StreamWriter writer = new StreamWriter(fname)) { writer.Write(contents); } } private static void CreateParentDirectories(string fname) { Directory.CreateDirectory(Path.GetDirectoryName(fname)); } public static string JoinQuotedArgs(string[] args) { return JoinQuotedArgs(' ', args); } public static string JoinQuotedArgs(char separator, params string[] args) { StringBuilder builder = new StringBuilder(); foreach (string arg in args) { if (builder.Length > 0) builder.Append(separator); builder.Append(Quote(arg)); } return builder.ToString(); } public static string Quote(string s) { if (s.StartsWith("\"")) return s; return "\"" + s + "\""; } #if !CF && !SILVERLIGHT public static string Exec(string program, params string[] arguments) { return Exec(program, JoinQuotedArgs(arguments)); } private static string Exec(string program, string arguments) { ProcessStartInfo psi = new ProcessStartInfo(program); psi.UseShellExecute = false; psi.Arguments = arguments; psi.RedirectStandardOutput = true; psi.RedirectStandardError = true; psi.WorkingDirectory = Path.GetTempPath(); psi.CreateNoWindow = true; Process p = Process.Start(psi); string stdout = p.StandardOutput.ReadToEnd(); string stderr = p.StandardError.ReadToEnd(); p.WaitForExit(); if (p.ExitCode != 0) throw new ApplicationException(stdout + stderr); return stdout + stderr; } public static string CopyEnclosingAssemblyTo(Type type, string directory) { return CopyTo(type.Assembly.Location, directory); } #endif public static string BuildTempPath(string fname) { #if SILVERLIGHT return "/temp" + DateTime.Now.Ticks + "/" + fname; #elif !CF && !MONO return Path.Combine(Environment.GetEnvironmentVariable("TEMP"), fname); #else return Path.Combine(Path.GetTempPath(), fname); #endif } public static string CopyTo(string fname, string targetDirectory) { Directory.CreateDirectory(targetDirectory); string targetFileName = Path.Combine(targetDirectory, Path.GetFileName(fname)); File.Copy(fname, targetFileName, true); return targetFileName; } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Dbmock/0000755000175000017500000000000011520622070027472 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Dbmock/MockClient.cs0000644000175000017500000000335611520622622032063 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; namespace Db4oUnit.Extensions.Dbmock { public partial class MockClient : IDisposable { public virtual void Dispose() { } public virtual IList Query(Predicate match) { throw new System.NotImplementedException(); } public virtual IList Query(Predicate match, IComparer comparer) { throw new System.NotImplementedException(); } public virtual IList Query(Predicate match, Comparison comparison) { throw new System.NotImplementedException(); } public virtual IList Query(Type extent) { throw new System.NotImplementedException(); } public virtual IList Query() { throw new System.NotImplementedException(); } public virtual IList Query(IComparer comparer) { throw new System.NotImplementedException(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Dbmock/MockEmbedded.cs0000644000175000017500000000326711520622622032337 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; namespace Db4oUnit.Extensions.Dbmock { public partial class MockEmbedded : IDisposable { public void Dispose() { } public IList Query(Predicate match) { throw new System.NotImplementedException(); } public IList Query(Predicate match, IComparer comparer) { throw new System.NotImplementedException(); } public IList Query(Predicate match, Comparison comparison) { throw new System.NotImplementedException(); } public IList Query(Type extent) { throw new System.NotImplementedException(); } public IList Query() { throw new System.NotImplementedException(); } public IList Query(IComparer comparer) { throw new System.NotImplementedException(); } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Dbmock/MockServer.cs0000644000175000017500000000146111520622622032106 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4oUnit.Extensions.Dbmock { public partial class MockServer : IDisposable { public void Dispose() { } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/native/Db4oUnit.Extensions/Db4oUnitPlatform.cs0000644000175000017500000000246511520622622031771 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using Db4objects.Db4o.IO; using Db4objects.Db4o.Reflect.Net; namespace Db4oUnit.Extensions { public class Db4oUnitPlatform { public static bool IsPascalCase() { return true; } public static bool IsUserField(FieldInfo field) { if (field.IsStatic) return false; if (NetField.IsTransient(field)) return false; if (field.Name.IndexOf("$") != -1) return false; return true; } public static IStorage NewPersistentStorage() { #if SILVERLIGHT return new IsolatedStorageStorage(); #else return new FileStorage(); #endif } } } db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions-CF-2008.csproj0000644000175000017500000002660011520622060027107 0ustar directhexdirecthex Debug AnyCPU 9.0.21022 2.0 {6C7B5203-2178-4BFC-B8AB-D387D7C28A65} Library Properties Db4oUnit.Extensions Db4oUnit.Extensions {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4oUnit.Extensions_CF_2008 v3.5 2.0 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;CF_3_5;CF;$(PlatformFamilyName) true true prompt 512 4 Off 1591;1572;1573;1574;0419; {89BB3D10-B9D5-4172-A0D9-3BB856AC5B85} Db4objects.Db4o.CS-CF-2008 {667C616E-FEA2-4D5E-93F0-9D18D17275FA} Db4objects.Db4o.Optional-CF-2008 {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 {7C7F460A-A3A0-40D5-872C-B7BA617F9BA7} Db4oUnit-CF-2008 False C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\mscorlib.dll False C:\Program Files (x86)\Microsoft.NET\SDK\CompactFramework\v3.5\WindowsCE\System.dll db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions-2008.csproj0000644000175000017500000002500311520622052026616 0ustar directhexdirecthex 9.0.21022 2.0 Debug AnyCPU Db4oUnit.Extensions Library Db4oUnit.Extensions OnBuildSuccess v3.5 512 {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3} true ../db4objects.snk bin\Debug\ false 285212672 false true TRACE;DEBUG;NET_3_5 4096 false 1591;1572;1573;1574;0419; false false false false 0 bin\Release\ false 285212672 false false TRACE;NET_3_5 4096 false 1591;1572;1573;1574;0419; true false false false 4 System {9FA8178A-3E77-42C5-A252-6690EA9BA257} Db4objects.Db4o.CS-2008 {E9588FE7-C19D-445E-BB53-AE539EA4F0E6} Db4objects.Db4o.Optional-2008 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 {8F82F8B0-95B6-4553-BDA8-BD9A954E682F} Db4oUnit-2008 db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions-Silverlight-2008.csproj0000644000175000017500000002425711520622042031121 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {13B5E015-9250-4E70-939D-56233D43D8C3} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4oUnit.Extensions Db4oUnit.Extensions v3.5 false true true true ../db4objects.snk true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {97B6DEA6-255B-4B49-8973-38943AC2E70C} Db4objects.Db4o.Optional-Silverlight-2008 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2008 {C74364D8-A04A-4CF9-801D-D1811D49E72A} Db4oUnit-Silverlight-2008 db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Makefile0000644000175000017500000000017111520622054022660 0ustar directhexdirecthex include ../include.mk TARGET = library ASSEMBLY = $(UNIT_EXT) REFERENCES = -r:$(OUTDIR)/$(UNIT) -r:$(OUTDIR)/$(CORE) db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Properties/0000755000175000017500000000000011520622064023356 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Properties/AssemblyInfo.cs0000644000175000017500000000257611520622622026312 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Security; [assembly: AssemblyTitle("db4o - database for objects")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyName("")] // attributes are automatically set by the build [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyKeyFile("")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyDescription("Db4oUnit.Extensions 8.0.184.15484 (.NET)")]db4o-8.0.184.15484+dfsg/src/Db4oUnit.Extensions/Db4oUnit.Extensions-Silverlight-2010.csproj0000644000175000017500000002536111520622044031111 0ustar directhexdirecthex v3.5 true ../db4objects.snk Debug AnyCPU 9.0.30729 2.0 {13B5E015-9250-4E70-939D-56233D43D8C3} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4oUnit.Extensions Db4oUnit.Extensions v4.0 false true true true ../db4objects.snk Silverlight $(TargetFrameworkVersion) 3.5 true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 {97B6DEA6-255B-4B49-8973-38943AC2E70C} Db4objects.Db4o.Optional-Silverlight-2010 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2010 {C74364D8-A04A-4CF9-801D-D1811D49E72A} Db4oUnit-Silverlight-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/0000755000175000017500000000000011520622070024174 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/WebBrowerHost.resx0000644000175000017500000001326611520622070027643 0ustar directhexdirecthex text/microsoft-resx 2.0 System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Db4objects.Db4o.SilverlightTestHost.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Db4objects.Db4o.SilverlightTestHost.0000644000175000017500000000724111520622054032746 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59} Exe Properties Db4objects.Db4o.SilverlightTestHost Db4objects.Db4o.SilverlightTestHost v3.5 512 true full false bin\Debug\ DEBUG;TRACE prompt 4 x86 pdbonly true bin\Release\ TRACE prompt 4 true bin\x86\Debug\ DEBUG;TRACE full x86 prompt bin\x86\Release\ TRACE true pdbonly x86 prompt 3.5 3.5 3.5 Form WebBrowerHost.cs WebBrowerHost.cs db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/WebBrowerHost.Designer.cs0000644000175000017500000000467711520622624031041 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.SilverlightTestHost { partial class WebBrowerHost { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.silverlightTestHost = new System.Windows.Forms.WebBrowser(); this.SuspendLayout(); // // silverlightTestHost // this.silverlightTestHost.Dock = System.Windows.Forms.DockStyle.Fill; this.silverlightTestHost.Location = new System.Drawing.Point(0, 0); this.silverlightTestHost.MinimumSize = new System.Drawing.Size(20, 20); this.silverlightTestHost.Name = "silverlightTestHost"; this.silverlightTestHost.Size = new System.Drawing.Size(575, 525); this.silverlightTestHost.TabIndex = 0; // // WebBrowerHost // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(575, 525); this.Controls.Add(this.silverlightTestHost); this.Name = "WebBrowerHost"; this.Text = "WebBrowerHost"; this.ResumeLayout(false); } #endregion private System.Windows.Forms.WebBrowser silverlightTestHost; } }././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Db4objects.Db4o.SilverlightTestHost-2010.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Db4objects.Db4o.SilverlightTestHost-0000644000175000017500000000773511520622066032760 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {2E3829A5-D028-43BC-8ED5-14C0BE7A4A59} Exe Properties Db4objects.Db4o.SilverlightTestHost Db4objects.Db4o.SilverlightTestHost v4.0 512 3.5 true ../db4objects.snk true full false bin\Debug\ DEBUG;TRACE prompt 4 x86 pdbonly true bin\Release\ TRACE prompt 4 true bin\x86\Debug\ DEBUG;TRACE full x86 prompt bin\x86\Release\ TRACE true pdbonly x86 prompt 3.5 3.5 3.5 Form WebBrowerHost.cs WebBrowerHost.cs db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Program.cs0000644000175000017500000000207411520622624026142 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO; namespace Db4objects.Db4o.SilverlightTestHost { class Program { [STAThread] static int Main(string[] args) { if (args.Length < 1) { Console.Error.WriteLine("Missing silverlight tests folder."); return -1; } WebBrowerHost host = new WebBrowerHost(); return host.Navigate(Path.Combine(args[0], "TestPage.html")); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Properties/0000755000175000017500000000000011520622052026330 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/Properties/AssemblyInfo.cs0000644000175000017500000000433311520622624031262 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("Db4objects.Db4o.SilverlightTestHost")] [assembly: AssemblyDescription("Db4objects.Db4o.SilverlightTestHost 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("acc20ef7-3dc8-47be-b98c-453d2b0d2a26")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("8.0.184.15484")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("8.0.184.15484")] db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.SilverlightTestHost/WebBrowerHost.cs0000644000175000017500000000355111520622624027270 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Threading; using System.Windows.Forms; using Timer=System.Threading.Timer; namespace Db4objects.Db4o.SilverlightTestHost { public partial class WebBrowerHost : Form { private string _url; private Timer _timer; public WebBrowerHost() { InitializeComponent(); } public int ErrorCount { get; set; } public int Navigate(string url) { _url = url; ShowDialog(); return ErrorCount; } protected override void OnHandleCreated(EventArgs e) { silverlightTestHost.Navigate(_url); _timer = new Timer(state => Invoke((ThreadStart) CheckTestsCompletion), null, 1000, 1000); } private void CheckTestsCompletion() { HtmlElement element = silverlightTestHost.Document.GetElementById("completed"); if (element != null) { _timer.Dispose(); string testResults = silverlightTestHost.Document.GetElementById("result").InnerText; ErrorCount = Int32.Parse(ErrorCountFromHtmlPage()); Console.Error.WriteLine(testResults); Close(); } } private string ErrorCountFromHtmlPage() { return silverlightTestHost.Document.InvokeScript("getErrorCount").ToString(); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/0000755000175000017500000000000011520622070021105 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-2008.sln0000644000175000017500000000570311520622064025676 0ustar directhexdirecthex Microsoft Visual Studio Solution File, Format Version 10.00 # Visual Studio 2008 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq-2008", "Db4objects.Db4o.Linq-2008.csproj", "{23531440-0922-43EB-A483-6592FFC2F093}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o.Linq.Tests-2008", "..\Db4objects.Db4o.Linq.Tests\Db4objects.Db4o.Linq.Tests-2008.csproj", "{22AB6F58-39BF-4580-821B-5900E31AC33A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4objects.Db4o-2008", "..\Db4objects.Db4o\Db4objects.Db4o-2008.csproj", "{600CD3BF-2ED2-4183-87F7-ADD78A968AE0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit-2008", "..\Db4oUnit\Db4oUnit-2008.csproj", "{8F82F8B0-95B6-4553-BDA8-BD9A954E682F}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4oUnit.Extensions-2008", "..\Db4oUnit.Extensions\Db4oUnit.Extensions-2008.csproj", "{9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Debug|Any CPU.Build.0 = Debug|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.ActiveCfg = Release|Any CPU {23531440-0922-43EB-A483-6592FFC2F093}.Release|Any CPU.Build.0 = Release|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Debug|Any CPU.Build.0 = Debug|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Release|Any CPU.ActiveCfg = Release|Any CPU {22AB6F58-39BF-4580-821B-5900E31AC33A}.Release|Any CPU.Build.0 = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {600CD3BF-2ED2-4183-87F7-ADD78A968AE0}.Release|Any CPU.Build.0 = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Debug|Any CPU.Build.0 = Debug|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8F82F8B0-95B6-4553-BDA8-BD9A954E682F}.Release|Any CPU.Build.0 = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Debug|Any CPU.Build.0 = Debug|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.ActiveCfg = Release|Any CPU {9446B00C-E8A6-4CEB-83DE-2CAC5168DFE3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-2010.csproj0000644000175000017500000001741411520622070026372 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {23531440-0922-43EB-A483-6592FFC2F093} Library Properties Db4objects.Db4o.Linq Db4objects.Db4o.Linq v4.0 512 3.5 publish\ true Disk false Foreground 7 Days false false true 0 1.0.0.%2a false false true true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;NET_3_5;NET_4_0 prompt 4 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;NET_3_5;NET_4_0 prompt 4 1591;1572;1573;1574;0419; False ..\Libs\net-3.5\Mono.Reflection.dll 3.5 False .NET Framework 3.5 SP1 Client Profile false False .NET Framework 3.5 SP1 true False Windows Installer 3.1 true {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/0000755000175000017500000000000011520622066024566 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/IDb4oLinqQuery.cs0000644000175000017500000000234511520622624027674 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq { /// /// IDb4oLinqQuery is the query type of Linq to db4o. Standard query operators /// are defined in Db4oLinqQueryExtensions. /// /// The type of the objects that are queried from the database. public interface IDb4oLinqQuery : IDb4oLinqQuery, IEnumerable { } public interface IDb4oLinqQuery : IEnumerable { } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/0000755000175000017500000000000011520622070027103 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByDescendingClauseVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByDescendingC0000644000175000017500000000251211520622624032470 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Linq.Expressions; using System.Reflection; using Db4objects.Db4o.Internal.Caching; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Expressions { internal class OrderByDescendingClauseVisitor : OrderByClauseVisitorBase { private static ICache4 _cache = ExpressionCacheFactory.NewInstance(10); protected override ICache4 GetCachingStrategy() { return _cache; } protected override void ApplyDirection(IQuery query) { query.OrderDescending(); } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionCacheFactory.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionCacheFac0000644000175000017500000000221111520622624032524 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Linq.Expressions; using Db4objects.Db4o.Internal.Caching; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq.Expressions { internal class ExpressionCacheFactory { internal static ICache4 NewInstance(int cacheSize) { return CacheFactory.For(CacheFactory.New2QXCache(cacheSize), ExpressionEqualityComparer.Instance); } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/WhereClauseVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/WhereClauseVisitor0000644000175000017500000001441311520622624032625 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Linq.Expressions; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Expressions { internal class WhereClauseVisitor : ExpressionQueryBuilder { private static readonly ICache4 _cache = ExpressionCacheFactory.NewInstance(42); protected override ICache4 GetCachingStrategy() { return _cache; } protected override void VisitMethodCall(MethodCallExpression m) { Visit(m.Object); VisitExpressionList(m.Arguments); if (OptimizeableMethodConstrains.IsStringMethod(m.Method)) { ProcessStringMethod(m); return; } if (OptimizeableMethodConstrains.IsIListOrICollectionOfTMethod(m.Method)) { ProcessCollectionMethod(m); return; } AnalyseMethod(Recorder, m.Method); } private void ProcessStringMethod(MethodCallExpression call) { switch (call.Method.Name) { case "EndsWith": RecordConstraintApplication(c => c.EndsWith(true)); return; case "StartsWith": RecordConstraintApplication(c => c.StartsWith(true)); return; case "Contains": RecordConstraintApplication(c => c.Contains()); return; case "Equals": return; } CannotOptimize(call); } private void RecordConstraintApplication(Func application) { Recorder.Add(ctx => ctx.ApplyConstraint(application)); } private void ProcessCollectionMethod(MethodCallExpression call) { switch (call.Method.Name) { case "Contains": if (IsCallOnCollectionOfStrings(call)) { RecordConstraintApplication(c => c.Contains()); } return; } CannotOptimize(call); } private static bool IsCallOnCollectionOfStrings(MethodCallExpression call) { return call.Method.DeclaringType.IsGenericType && call.Method.DeclaringType.GetGenericArguments()[0] == typeof(string); } private static bool IsComparisonExpression(Expression expression) { switch (expression.NodeType) { case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: return true; default: return false; } } private static bool IsConditionalExpression(Expression expression) { switch (expression.NodeType) { case ExpressionType.AndAlso: case ExpressionType.OrElse: return true; default: return false; } } protected override void VisitBinary(BinaryExpression b) { if (IsConditionalExpression(b)) { ProcessConditionalExpression(b); return; } if (IsComparisonExpression(b)) { ProcessPredicateExpression(b); return; } CannotOptimize(b); } protected override void VisitUnary(UnaryExpression u) { var operand = u.Operand; if (u.NodeType == ExpressionType.Not) { Visit(operand); RecordConstraintApplication(c => c.Not()); return; } if (u.NodeType == ExpressionType.Convert) { Visit(operand); return; } CannotOptimize(u); } private void ProcessConditionalExpression(BinaryExpression b) { VisitPreservingQuery(b.Left); VisitPreservingQuery(b.Right); switch (b.NodeType) { case ExpressionType.AndAlso: Recorder.Add(ctx => ctx.ApplyConstraint(c => c.And(ctx.PopConstraint()))); break; case ExpressionType.OrElse: Recorder.Add(ctx => ctx.ApplyConstraint(c => c.Or(ctx.PopConstraint()))); break; } } private void VisitPreservingQuery(Expression expression) { PreservingQuery(() => Visit(expression)); } private void PreservingQuery(Action action) { Recorder.Add(ctx => ctx.SaveQuery()); action(); Recorder.Add(ctx => ctx.RestoreQuery()); } private void ProcessPredicateExpression(BinaryExpression b) { if (ParameterReferenceOnLeftSide(b)) { Visit(b.Left); Visit(b.Right); } else { Visit(b.Right); Visit(b.Left); } ProcessPredicateExpressionOperator(b); } protected override void VisitMemberAccess(MemberExpression m) { if (!StartsWithParameterReference(m)) CannotOptimize(m); ProcessMemberAccess(m); } protected override void VisitConstant(ConstantExpression c) { var value = c.Value; Recorder.Add(ctx => ctx.PushConstraint(ctx.CurrentQuery.Constrain(ctx.ResolveValue(value)))); } static bool ParameterReferenceOnLeftSide(BinaryExpression b) { if (StartsWithParameterReference(b.Left)) return true; if (StartsWithParameterReference(b.Right)) return false; CannotOptimize(b); return false; } private void ProcessPredicateExpressionOperator(BinaryExpression b) { switch (b.NodeType) { case ExpressionType.Equal: break; case ExpressionType.NotEqual: RecordConstraintApplication(c => c.Not()); break; case ExpressionType.LessThan: RecordConstraintApplication(c => c.Smaller()); break; case ExpressionType.LessThanOrEqual: RecordConstraintApplication(c => c.Smaller().Equal()); break; case ExpressionType.GreaterThan: RecordConstraintApplication(c => c.Greater()); break; case ExpressionType.GreaterThanOrEqual: RecordConstraintApplication(c => c.Greater().Equal()); break; default: CannotOptimize(b); break; } } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByClauseVisitorBase.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByClauseVisit0000644000175000017500000000327411520622624032563 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Linq.Expressions; using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Expressions { internal abstract class OrderByClauseVisitorBase : ExpressionQueryBuilder { protected abstract void ApplyDirection(IQuery query); protected override void VisitMethodCall(MethodCallExpression methodCall) { Visit(methodCall.Object); AnalyseMethod(Recorder, methodCall.Method); } protected override void VisitMemberAccess(MemberExpression m) { ProcessMemberAccess(m); } public override IQueryBuilderRecord Process(LambdaExpression expression) { if (!StartsWithParameterReference(expression.Body)) CannotOptimize(expression.Body); return ApplyDirection(base.Process(expression)); } private IQueryBuilderRecord ApplyDirection(IQueryBuilderRecord record) { QueryBuilderRecorder recorder = new QueryBuilderRecorder(record); recorder.Add(ctx => ApplyDirection(ctx.CurrentQuery)); return recorder.Record; } } } ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionQueryBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionQueryBui0000644000175000017500000001207011520622624032660 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Linq.Expressions; using System.Reflection; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.CodeAnalysis; using Db4objects.Db4o.Linq.Internals; using Expression=System.Linq.Expressions.Expression; using UnaryExpression=System.Linq.Expressions.UnaryExpression; namespace Db4objects.Db4o.Linq.Expressions { internal abstract class ExpressionQueryBuilder : ExpressionVisitor { private QueryBuilderRecorder _recorder; public QueryBuilderRecorder Recorder { get { return _recorder; } } public virtual IQueryBuilderRecord Process(LambdaExpression expression) { return ProcessExpression(SubtreeEvaluator.Evaluate(Normalize(expression))); } private static Expression Normalize(Expression expression) { return new ExpressionTreeNormalizer().Normalize(expression); } protected abstract ICache4 GetCachingStrategy(); private IQueryBuilderRecord ProcessExpression(Expression expression) { return GetCachingStrategy().Produce(expression, CreateRecord); } private IQueryBuilderRecord CreateRecord(Expression expression) { _recorder = new QueryBuilderRecorder(); Visit(expression); return _recorder.Record; } private static bool IsParameter(Expression expression) { return expression.NodeType == ExpressionType.Parameter; } protected static bool StartsWithParameterReference(Expression expression) { if (IsParameter(expression)) return true; var unary = expression as UnaryExpression; if (unary != null) return StartsWithParameterReference(unary.Operand); var me = expression as MemberExpression; if (me != null) return StartsWithParameterReference(me.Expression); var call = expression as MethodCallExpression; if (call != null && call.Object != null) return StartsWithParameterReference(call.Object); return false; } protected static bool IsFieldAccessExpression(MemberExpression m) { return m.Member.MemberType == MemberTypes.Field; } protected static bool IsPropertyAccessExpression(MemberExpression m) { return m.Member.MemberType == MemberTypes.Property; } protected static MethodInfo GetGetMethod(MemberExpression m) { return ((PropertyInfo)m.Member).GetGetMethod(); } protected void ProcessMemberAccess(MemberExpression m) { Visit(m.Expression); if (IsFieldAccessExpression(m)) { Type descendingEnumType = ResolveDescendingEnumType(m); _recorder.Add( ctx => { ctx.Descend(m.Member.Name); ctx.PushDescendigFieldEnumType(descendingEnumType); }); return; } if (IsPropertyAccessExpression(m)) { AnalyseMethod(_recorder, GetGetMethod(m)); return; } CannotOptimize(m); } private static Type ResolveDescendingEnumType(Expression expression) { if (!expression.Type.IsEnum) return null; return expression.Type; } protected void AnalyseMethod(QueryBuilderRecorder recorder, MethodInfo method) { try { var analyser = MethodAnalyser.FromMethod(method); analyser.Run(recorder); } catch (Exception e) { throw new QueryOptimizationException(e.Message, e); } } protected static void CannotOptimize(Expression e) { throw new QueryOptimizationException(e.ToString()); } protected static void CannotOptimize(ElementInit init) { throw new QueryOptimizationException(init.ToString()); } protected static void CannotOptimize(MemberBinding binding) { throw new QueryOptimizationException(binding.ToString()); } protected override void VisitBinding(MemberBinding binding) { CannotOptimize(binding); } protected override void VisitConditional(ConditionalExpression conditional) { CannotOptimize(conditional); } protected override void VisitElementInitializer(ElementInit initializer) { CannotOptimize(initializer); } protected override void VisitInvocation(InvocationExpression invocation) { CannotOptimize(invocation); } protected override void VisitListInit(ListInitExpression init) { CannotOptimize(init); } protected override void VisitNew(NewExpression nex) { CannotOptimize(nex); } protected override void VisitNewArray(NewArrayExpression newArray) { CannotOptimize(newArray); } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionTransformer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionTransfor0000644000175000017500000002471611520622624032723 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { public abstract class ExpressionTransformer { protected virtual Expression Visit(Expression exp) { if (exp == null) return exp; switch (exp.NodeType) { case ExpressionType.Negate: case ExpressionType.NegateChecked: case ExpressionType.Not: case ExpressionType.Convert: case ExpressionType.ConvertChecked: case ExpressionType.ArrayLength: case ExpressionType.Quote: case ExpressionType.TypeAs: case ExpressionType.UnaryPlus: return VisitUnary((UnaryExpression)exp); case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.Divide: case ExpressionType.Power: case ExpressionType.Modulo: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.Coalesce: case ExpressionType.ArrayIndex: case ExpressionType.RightShift: case ExpressionType.LeftShift: case ExpressionType.ExclusiveOr: return VisitBinary((BinaryExpression)exp); case ExpressionType.TypeIs: return VisitTypeIs((TypeBinaryExpression)exp); case ExpressionType.Conditional: return VisitConditional((ConditionalExpression)exp); case ExpressionType.Constant: return VisitConstant((ConstantExpression)exp); case ExpressionType.Parameter: return VisitParameter((ParameterExpression)exp); case ExpressionType.MemberAccess: return VisitMemberAccess((MemberExpression)exp); case ExpressionType.Call: return VisitMethodCall((MethodCallExpression)exp); case ExpressionType.Lambda: return VisitLambda((LambdaExpression)exp); case ExpressionType.New: return VisitNew((NewExpression)exp); case ExpressionType.NewArrayInit: case ExpressionType.NewArrayBounds: return VisitNewArray((NewArrayExpression)exp); case ExpressionType.Invoke: return VisitInvocation((InvocationExpression)exp); case ExpressionType.MemberInit: return VisitMemberInit((MemberInitExpression)exp); case ExpressionType.ListInit: return VisitListInit((ListInitExpression)exp); default: throw new Exception(string.Format("Unhandled expression type: '{0}'", exp.NodeType)); } } protected virtual MemberBinding VisitBinding(MemberBinding binding) { switch (binding.BindingType) { case MemberBindingType.Assignment: return VisitMemberAssignment((MemberAssignment)binding); case MemberBindingType.MemberBinding: return VisitMemberMemberBinding((MemberMemberBinding)binding); case MemberBindingType.ListBinding: return VisitMemberListBinding((MemberListBinding)binding); default: throw new Exception(string.Format("Unhandled binding type '{0}'", binding.BindingType)); } } protected virtual ElementInit VisitElementInitializer(ElementInit initializer) { ReadOnlyCollection arguments = VisitExpressionList(initializer.Arguments); if (arguments != initializer.Arguments) return Expression.ElementInit(initializer.AddMethod, arguments); return initializer; } protected virtual Expression VisitUnary(UnaryExpression u) { Expression operand = Visit(u.Operand); if (operand != u.Operand) return Expression.MakeUnary(u.NodeType, operand, u.Type, u.Method); return u; } protected virtual Expression VisitBinary(BinaryExpression b) { Expression left = Visit(b.Left); Expression right = Visit(b.Right); Expression conversion = Visit(b.Conversion); if (left != b.Left || right != b.Right || conversion != b.Conversion) { if (b.NodeType == ExpressionType.Coalesce && b.Conversion != null) { return Expression.Coalesce(left, right, conversion as LambdaExpression); } else { return Expression.MakeBinary(b.NodeType, left, right, b.IsLiftedToNull, b.Method); } } return b; } protected virtual Expression VisitTypeIs(TypeBinaryExpression b) { Expression expr = Visit(b.Expression); if (expr != b.Expression) { return Expression.TypeIs(expr, b.TypeOperand); } return b; } protected virtual Expression VisitConstant(ConstantExpression c) { return c; } protected virtual Expression VisitConditional(ConditionalExpression c) { Expression test = Visit(c.Test); Expression ifTrue = Visit(c.IfTrue); Expression ifFalse = Visit(c.IfFalse); if (test != c.Test || ifTrue != c.IfTrue || ifFalse != c.IfFalse) { return Expression.Condition(test, ifTrue, ifFalse); } return c; } protected virtual Expression VisitParameter(ParameterExpression p) { return p; } protected virtual Expression VisitMemberAccess(MemberExpression m) { Expression exp = Visit(m.Expression); if (exp != m.Expression) { return Expression.MakeMemberAccess(exp, m.Member); } return m; } protected virtual Expression VisitMethodCall(MethodCallExpression m) { Expression obj = Visit(m.Object); IEnumerable args = VisitExpressionList(m.Arguments); if (obj != m.Object || args != m.Arguments) { return Expression.Call(obj, m.Method, args); } return m; } protected virtual ReadOnlyCollection VisitExpressionList(ReadOnlyCollection original) { var list = VisitList(original, Visit); if (list == null) return original; return new ReadOnlyCollection(list); } protected virtual MemberAssignment VisitMemberAssignment(MemberAssignment assignment) { Expression e = Visit(assignment.Expression); if (e != assignment.Expression) return Expression.Bind(assignment.Member, e); return assignment; } protected virtual MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding) { IEnumerable bindings = VisitBindingList(binding.Bindings); if (bindings != binding.Bindings) return Expression.MemberBind(binding.Member, bindings); return binding; } protected virtual MemberListBinding VisitMemberListBinding(MemberListBinding binding) { IEnumerable initializers = VisitElementInitializerList(binding.Initializers); if (initializers != binding.Initializers) return Expression.ListBind(binding.Member, initializers); return binding; } protected virtual IEnumerable VisitBindingList(ReadOnlyCollection original) { return VisitList(original, VisitBinding); } protected virtual IEnumerable VisitElementInitializerList(ReadOnlyCollection original) { return VisitList(original, VisitElementInitializer); } private IList VisitList(ReadOnlyCollection original, Func visit) { List list = null; for (int i = 0, n = original.Count; i < n; i++) { TElement element = visit(original[i]); if (list != null) { list.Add(element); } else if (!EqualityComparer.Default.Equals(element, original[i])) { list = new List(n); for (int j = 0; j < i; j++) { list.Add(original[j]); } list.Add(element); } } if (list != null) return list; return original; } protected virtual Expression VisitLambda(LambdaExpression lambda) { Expression body = Visit(lambda.Body); if (body != lambda.Body) return Expression.Lambda(lambda.Type, body, lambda.Parameters); return lambda; } protected virtual NewExpression VisitNew(NewExpression nex) { IEnumerable args = VisitExpressionList(nex.Arguments); if (args != nex.Arguments) { if (nex.Members != null) return Expression.New(nex.Constructor, args, nex.Members); else return Expression.New(nex.Constructor, args); } return nex; } protected virtual Expression VisitMemberInit(MemberInitExpression init) { NewExpression n = VisitNew(init.NewExpression); IEnumerable bindings = VisitBindingList(init.Bindings); if (n != init.NewExpression || bindings != init.Bindings) return Expression.MemberInit(n, bindings); return init; } protected virtual Expression VisitListInit(ListInitExpression init) { NewExpression n = VisitNew(init.NewExpression); IEnumerable initializers = VisitElementInitializerList(init.Initializers); if (n != init.NewExpression || initializers != init.Initializers) return Expression.ListInit(n, initializers); return init; } protected virtual Expression VisitNewArray(NewArrayExpression na) { IEnumerable exprs = VisitExpressionList(na.Expressions); if (exprs != na.Expressions) { if (na.NodeType == ExpressionType.NewArrayInit) { return Expression.NewArrayInit(na.Type.GetElementType(), exprs); } else { return Expression.NewArrayBounds(na.Type.GetElementType(), exprs); } } return na; } protected virtual Expression VisitInvocation(InvocationExpression iv) { IEnumerable args = VisitExpressionList(iv.Arguments); Expression expr = Visit(iv.Expression); if (args != iv.Arguments || expr != iv.Expression) return Expression.Invoke(expr, args); return iv; } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionComparison.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionComparis0000644000175000017500000001233011520622624032667 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { internal class ExpressionComparison : ExpressionVisitor { private bool _areEqual = true; private Queue _candidates; private Expression _candidate; public bool AreEqual { get { return _areEqual; } } public ExpressionComparison(Expression a, Expression b) { _candidates = new Queue(new ExpressionEnumeration(b)); Visit(a); if (_candidates.Count > 0) Stop(); } private Expression PeekCandidate() { if (_candidates.Count == 0) return null; return _candidates.Peek(); } private Expression PopCandidate() { return _candidates.Dequeue(); } private bool CheckAreOfSameType(Expression candidate, Expression expression) { if (!CheckEqual(expression.NodeType, candidate.NodeType)) return false; if (!CheckEqual(expression.Type, candidate.Type)) return false; return true; } private void Stop() { _areEqual = false; } private T CandidateFor(T original) where T : Expression { return (T)_candidate; } protected override void Visit(Expression expression) { if (expression == null) return; if (!AreEqual) return; _candidate = PeekCandidate(); if (!CheckNotNull(_candidate)) return; if (!CheckAreOfSameType(_candidate, expression)) return; PopCandidate(); base.Visit(expression); } protected override void VisitConstant(ConstantExpression constant) { var candidate = CandidateFor(constant); if (!CheckEqual(constant.Value, candidate.Value)) return; } protected override void VisitMemberAccess(MemberExpression member) { var candidate = CandidateFor(member); if (!CheckEqual(member.Member, candidate.Member)) return; base.VisitMemberAccess(member); } protected override void VisitMethodCall(MethodCallExpression methodCall) { var candidate = CandidateFor(methodCall); if (!CheckEqual(methodCall.Method, candidate.Method)) return; base.VisitMethodCall(methodCall); } protected override void VisitParameter(ParameterExpression parameter) { var candidate = CandidateFor(parameter); if (!CheckEqual(parameter.Name, candidate.Name)) return; } protected override void VisitTypeIs(TypeBinaryExpression type) { var candidate = CandidateFor(type); if (!CheckEqual(type.TypeOperand, candidate.TypeOperand)) return; base.VisitTypeIs(type); } protected override void VisitBinary(BinaryExpression binary) { var candidate = CandidateFor(binary); if (!CheckEqual(binary.Method, candidate.Method)) return; if (!CheckEqual(binary.IsLifted, candidate.IsLifted)) return; if (!CheckEqual(binary.IsLiftedToNull, candidate.IsLiftedToNull)) return; base.VisitBinary(binary); } protected override void VisitUnary(UnaryExpression unary) { var candidate = CandidateFor(unary); if (!CheckEqual(unary.Method, candidate.Method)) return; if (!CheckEqual(unary.IsLifted, candidate.IsLifted)) return; if (!CheckEqual(unary.IsLiftedToNull, candidate.IsLiftedToNull)) return; base.VisitUnary(unary); } protected override void VisitNew(NewExpression nex) { var candidate = CandidateFor(nex); if (!CheckEqual(nex.Constructor, candidate.Constructor)) return; CompareList(nex.Members, candidate.Members); base.VisitNew(nex); } private void CompareList(ReadOnlyCollection collection, ReadOnlyCollection candidates) { CompareList(collection, candidates, (item, candidate) => EqualityComparer.Default.Equals(item, candidate)); } private void CompareList(ReadOnlyCollection collection, ReadOnlyCollection candidates, Func comparer) { if (!CheckAreOfSameSize(collection, candidates)) return; for (int i = 0; i < collection.Count; i++) { if (!comparer(collection[i], candidates[i])) { Stop(); return; } } } private bool CheckAreOfSameSize(ReadOnlyCollection collection, ReadOnlyCollection candidate) { return CheckEqual(collection.Count, candidate.Count); } private bool CheckNotNull(T t) where T : class { if (t == null) { Stop(); return false; } return true; } private bool CheckEqual(T t, T candidate) { if (!EqualityComparer.Default.Equals(t, candidate)) { Stop(); return false; } return true; } } } ././@LongLink0000000000000000000000000000015600000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionTreeNormalizer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionTreeNorm0000644000175000017500000001073311520622624032652 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Linq.Expressions; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq.Expressions { class ExpressionTreeNormalizer : ExpressionTransformer { protected override Expression VisitLambda(LambdaExpression lambda) { if (IsBooleanMemberAccess(lambda.Body)) { return Expression.Lambda(ExpandExpression(lambda.Body, true)); } return base.VisitLambda(lambda); } protected override Expression VisitUnary(UnaryExpression u) { if (u.NodeType != ExpressionType.Not) { return base.VisitUnary(u); } if (IsBooleanMemberAccess(u.Operand) || IsNonOptimizeableBooleanMethodCall(u.Operand)) { return ExpandExpression(u.Operand, false); } return base.VisitUnary(u); } protected override Expression VisitBinary(BinaryExpression b) { var expression = NormalizeBooleanMemberAccess(b); return NormalizeVisualBasicOperator(expression) ?? base.VisitBinary(expression); } protected override Expression VisitMethodCall(MethodCallExpression method) { Visit(method.Object); VisitExpressionList(method.Arguments); if (IsNonOptimizeableBooleanMethodCall(method)) { return ExpandExpression(method, true); } return base.VisitMethodCall(method); } private static bool IsNonOptimizeableBooleanMethodCall(Expression expression) { return expression.NodeType == ExpressionType.Call && expression.Type == typeof(bool) && !IsOptimizeableMethodCall((MethodCallExpression) expression); } private static bool IsOptimizeableMethodCall(MethodCallExpression expression) { return OptimizeableMethodConstrains.CanBeOptimized(expression.Method); } private static BinaryExpression ExpandExpression(Expression expression, bool value) { return Expression.Equal(expression, Expression.Constant(value)); } private static bool IsBooleanMemberAccess(Expression expression) { return expression.NodeType == ExpressionType.MemberAccess && expression.Type == typeof(bool); } private static BinaryExpression NormalizeBooleanMemberAccess(BinaryExpression expression) { if (!IsLogicalOperator(expression)) return expression; if (IsBooleanMemberAccess(expression.Right)) { expression = Expression.MakeBinary(expression.NodeType, expression.Left, ExpandExpression(expression.Right, true)); } if (IsBooleanMemberAccess(expression.Left)) { expression = Expression.MakeBinary(expression.NodeType, ExpandExpression(expression.Left, true), expression.Right); } return expression; } private static bool IsLogicalOperator(Expression expression) { switch (expression.NodeType) { case ExpressionType.OrElse: case ExpressionType.AndAlso: return true; default: return false; } } private static Expression NormalizeVisualBasicOperator(BinaryExpression b) { var call = b.Left as MethodCallExpression; if (call == null) return null; if (call.Object != null) return null; if (call.Method.DeclaringType.FullName != "Microsoft.VisualBasic.CompilerServices.Operators") return null; switch (call.Method.Name) { case "CompareString": { switch (b.NodeType) { case ExpressionType.Equal: return ToStringEquals(call); case ExpressionType.NotEqual: return Expression.Not(ToStringEquals(call)); } return null; } } return null; } private static MethodCallExpression ToStringEquals(MethodCallExpression call) { var stringEquals = typeof(string).GetMethod("Equals", new[] {typeof(string)}); return Expression.Call(call.Arguments[0], stringEquals, call.Arguments[1]); } public Expression Normalize(Expression expression) { return Visit(expression); } } } ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/SubtreeEvaluator.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/SubtreeEvaluator.c0000644000175000017500000000642511520622624032557 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { class Set { #if SILVERLIGHT Dictionary items = new Dictionary(); #else HashSet items = new HashSet(); #endif public bool Contains(T item) { #if SILVERLIGHT return items.ContainsKey(item); #else return items.Contains(item); #endif } public void Add(T item) { #if SILVERLIGHT items.Add (item, item); #else items.Add(item); #endif } } public class SubtreeEvaluator : ExpressionTransformer { private Set _candidates; private SubtreeEvaluator(Set candidates) { _candidates = candidates; } public static Expression Evaluate(Expression expression) { var nominator = new Nominator(expression, exp => exp.NodeType != ExpressionType.Parameter); return new SubtreeEvaluator(nominator.Candidates).Visit(expression); } protected override Expression Visit(Expression expression) { if (expression == null) return null; if (_candidates.Contains(expression)) return EvaluateCandidate(expression); return base.Visit(expression); } private Expression EvaluateCandidate(Expression expression) { if (expression.NodeType == ExpressionType.Constant) return expression; var evaluator = Expression.Lambda(expression).Compile(); return Expression.Constant( #if !CF_3_5 evaluator.DynamicInvoke(null), #else evaluator.Method.Invoke(evaluator.Target, new object[0]), #endif expression.Type); } class Nominator : ExpressionTransformer { readonly Func _predicate; readonly Set _candidates = new Set(); bool cannotBeEvaluated; public Set Candidates { get { return _candidates; } } public Nominator(Expression expression, Func predicate) { _predicate = predicate; Visit(expression); } private void AddCandidate(Expression expression) { _candidates.Add(expression); } // TODO: refactor protected override Expression Visit(Expression expression) { if (expression == null) return null; bool saveCannotBeEvaluated = cannotBeEvaluated; cannotBeEvaluated = false; base.Visit(expression); if (cannotBeEvaluated) return expression; if (_predicate(expression)) { AddCandidate(expression); } else { cannotBeEvaluated = true; } cannotBeEvaluated |= saveCannotBeEvaluated; return expression; } } } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionVisitor.0000644000175000017500000001607411520622624032640 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.ObjectModel; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { internal abstract class ExpressionVisitor { protected virtual void Visit(Expression expression) { if (expression == null) return; switch (expression.NodeType) { case ExpressionType.Negate: case ExpressionType.NegateChecked: case ExpressionType.Not: case ExpressionType.Convert: case ExpressionType.ConvertChecked: case ExpressionType.ArrayLength: case ExpressionType.Quote: case ExpressionType.TypeAs: case ExpressionType.UnaryPlus: VisitUnary((UnaryExpression)expression); break; case ExpressionType.Add: case ExpressionType.AddChecked: case ExpressionType.Subtract: case ExpressionType.SubtractChecked: case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: case ExpressionType.Divide: case ExpressionType.Power: case ExpressionType.Modulo: case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Or: case ExpressionType.OrElse: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.Coalesce: case ExpressionType.ArrayIndex: case ExpressionType.RightShift: case ExpressionType.LeftShift: case ExpressionType.ExclusiveOr: VisitBinary((BinaryExpression)expression); break; case ExpressionType.TypeIs: VisitTypeIs((TypeBinaryExpression)expression); break; case ExpressionType.Conditional: VisitConditional((ConditionalExpression)expression); break; case ExpressionType.Constant: VisitConstant((ConstantExpression)expression); break; case ExpressionType.Parameter: VisitParameter((ParameterExpression)expression); break; case ExpressionType.MemberAccess: VisitMemberAccess((MemberExpression)expression); break; case ExpressionType.Call: VisitMethodCall((MethodCallExpression)expression); break; case ExpressionType.Lambda: VisitLambda((LambdaExpression)expression); break; case ExpressionType.New: VisitNew((NewExpression)expression); break; case ExpressionType.NewArrayInit: case ExpressionType.NewArrayBounds: VisitNewArray((NewArrayExpression)expression); break; case ExpressionType.Invoke: VisitInvocation((InvocationExpression)expression); break; case ExpressionType.MemberInit: VisitMemberInit((MemberInitExpression)expression); break; case ExpressionType.ListInit: VisitListInit((ListInitExpression)expression); break; default: throw new ArgumentException(string.Format("Unhandled expression type: '{0}'", expression.NodeType)); } } protected virtual void VisitBinding(MemberBinding binding) { switch (binding.BindingType) { case MemberBindingType.Assignment: VisitMemberAssignment((MemberAssignment)binding); break; case MemberBindingType.MemberBinding: VisitMemberMemberBinding((MemberMemberBinding)binding); break; case MemberBindingType.ListBinding: VisitMemberListBinding((MemberListBinding)binding); break; default: throw new ArgumentException(string.Format("Unhandled binding type '{0}'", binding.BindingType)); } } protected virtual void VisitElementInitializer(ElementInit initializer) { VisitExpressionList(initializer.Arguments); } protected virtual void VisitUnary(UnaryExpression unary) { Visit(unary.Operand); } protected virtual void VisitBinary(BinaryExpression binary) { Visit(binary.Left); Visit(binary.Right); Visit(binary.Conversion); } protected virtual void VisitTypeIs(TypeBinaryExpression type) { Visit(type.Expression); } protected virtual void VisitConstant(ConstantExpression constant) { } protected virtual void VisitConditional(ConditionalExpression conditional) { Visit(conditional.Test); Visit(conditional.IfTrue); Visit(conditional.IfFalse); } protected virtual void VisitParameter(ParameterExpression parameter) { } protected virtual void VisitMemberAccess(MemberExpression member) { Visit(member.Expression); } protected virtual void VisitMethodCall(MethodCallExpression methodCall) { Visit(methodCall.Object); VisitExpressionList(methodCall.Arguments); } protected virtual void VisitList(ReadOnlyCollection list, Action visitor) { foreach (T element in list) { visitor(element); } } protected virtual void VisitExpressionList(ReadOnlyCollection list) where TExp : Expression { VisitList(list, Visit); } protected virtual void VisitMemberAssignment(MemberAssignment assignment) { Visit(assignment.Expression); } protected virtual void VisitMemberMemberBinding(MemberMemberBinding binding) { VisitBindingList(binding.Bindings); } protected virtual void VisitMemberListBinding(MemberListBinding binding) { VisitElementInitializerList(binding.Initializers); } protected virtual void VisitBindingList(ReadOnlyCollection list) where TBinding : MemberBinding { VisitList(list, VisitBinding); } protected virtual void VisitElementInitializerList(ReadOnlyCollection list) { VisitList(list, VisitElementInitializer); } protected virtual void VisitLambda(LambdaExpression lambda) { Visit(lambda.Body); } protected virtual void VisitNew(NewExpression nex) { VisitExpressionList(nex.Arguments); } protected virtual void VisitMemberInit(MemberInitExpression init) { VisitNew(init.NewExpression); VisitBindingList(init.Bindings); } protected virtual void VisitListInit(ListInitExpression init) { VisitNew(init.NewExpression); VisitElementInitializerList(init.Initializers); } protected virtual void VisitNewArray(NewArrayExpression newArray) { VisitExpressionList(newArray.Expressions); } protected virtual void VisitInvocation(InvocationExpression invocation) { VisitExpressionList(invocation.Arguments); Visit(invocation.Expression); } } } ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/HashCodeCalculation.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/HashCodeCalculatio0000644000175000017500000000562111520622624032516 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.ObjectModel; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { internal class HashCodeCalculation : ExpressionVisitor { private int _hashCode; public int HashCode { get { return _hashCode; } } public HashCodeCalculation(Expression expression) { Visit(expression); } private void Add(int i) { _hashCode *= 37; _hashCode ^= i; } protected override void Visit(Expression expression) { if (expression == null) return; Add((int)expression.NodeType); Add(expression.Type.GetHashCode()); base.Visit(expression); } protected override void VisitList(ReadOnlyCollection list, Action visitor) { Add(list.Count); base.VisitList(list, visitor); } protected override void VisitConstant(ConstantExpression constant) { if (constant != null && constant.Value != null) Add(constant.Value.GetHashCode()); } protected override void VisitMemberAccess(MemberExpression member) { Add(member.Member.GetHashCode()); base.VisitMemberAccess(member); } protected override void VisitMethodCall(MethodCallExpression methodCall) { Add(methodCall.Method.GetHashCode()); base.VisitMethodCall(methodCall); } protected override void VisitParameter(ParameterExpression parameter) { Add(parameter.Name.GetHashCode()); } protected override void VisitTypeIs(TypeBinaryExpression type) { Add(type.TypeOperand.GetHashCode()); base.VisitTypeIs(type); } protected override void VisitBinary(BinaryExpression binary) { if (binary.Method != null) Add(binary.Method.GetHashCode()); if (binary.IsLifted) Add(1); if (binary.IsLiftedToNull) Add(1); base.VisitBinary(binary); } protected override void VisitUnary(UnaryExpression unary) { if (unary.Method != null) Add(unary.Method.GetHashCode()); if (unary.IsLifted) Add(1); if (unary.IsLiftedToNull) Add(1); base.VisitUnary(unary); } protected override void VisitNew(NewExpression nex) { Add(nex.Constructor.GetHashCode()); VisitList(nex.Members, member => Add(member.GetHashCode())); base.VisitNew(nex); } } } ././@LongLink0000000000000000000000000000015300000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionEnumeration.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionEnumerat0000644000175000017500000000264311520622624032700 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { internal class ExpressionEnumeration : ExpressionVisitor, IEnumerable { private List _expressions = new List(); public ExpressionEnumeration(Expression expression) { Visit(expression); } protected override void Visit(Expression expression) { if (expression == null) return; _expressions.Add(expression); base.Visit(expression); } public IEnumerator GetEnumerator() { return _expressions.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/QueryableTransformer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/QueryableTransform0000644000175000017500000001502711520622624032665 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF_3_5 using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Linq.Expressions; using System.Reflection; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq.Expressions { internal class QueryableTransformer : ExpressionTransformer { private bool _optimize = true; private bool Optimize { get { return _optimize; } set { _optimize = value; } } public static Expression Transform(Expression expression) { return new QueryableTransformer().Visit(expression); } protected override Expression VisitLambda(LambdaExpression lambda) { return lambda; } protected override Expression VisitMethodCall(MethodCallExpression call) { if (IsQueryableExtensionMethod(call.Method)) { return ReplaceQueryableMethodCall(call); } return base.VisitMethodCall(call); } protected override Expression VisitConstant (ConstantExpression constant) { var queryable = constant.Value as IDb4oLinqQueryable; if (queryable == null) return constant; return Expression.Constant(queryable.GetQuery()); } private static bool IsQueryableExtensionMethod(MethodInfo method) { return method.IsExtension() && typeof(IQueryable).IsAssignableFrom(method.GetParameters().First().ParameterType); } private MethodCallExpression ReplaceQueryableMethodCall(MethodCallExpression call) { var target = null as Expression; if (call.Object != null) target = Visit(call.Object); var arguments = VisitExpressionList(call.Arguments); var method = ReplaceQueryableMethod(call.Method); return Expression.Call(target, method, ProcessArguments(method, arguments)); } private IEnumerable ProcessArguments(MethodInfo method, ReadOnlyCollection arguments) { var parameters = method.GetParameters(); for (int i = 0; i < parameters.Length; i++) yield return TryUnquoteExpression(arguments[i], parameters[i].ParameterType); } private static Expression TryUnquoteExpression(Expression expression, Type delegateType) { if (expression.NodeType != ExpressionType.Quote) return expression; var lambda = (LambdaExpression)((UnaryExpression)expression).Operand; if (lambda.Type == delegateType) return lambda; return expression; } private MethodInfo ReplaceQueryableMethod(MethodInfo method) { MethodInfo match; if (Optimize) { if (TryMatchMethod(typeof(Db4oLinqQueryExtensions), method, out match)) return match; } if (TryMatchMethod(typeof(Enumerable), method, out match)) { if (Optimize) Optimize = false; return match; } throw new ArgumentException(string.Format("Failed to find a replacement for {0}", method)); } private static bool TryMatchMethod(Type target, MethodInfo method, out MethodInfo match) { foreach (var candidate in target.GetMethods()) { if (TryMatchMethod(method, candidate, out match)) return true; } match = null; return false; } private static bool TryMatchMethod(MethodInfo method, MethodInfo candidate, out MethodInfo match) { match = null; if (candidate.Name != method.Name) return false; if (!candidate.IsExtension()) return false; if (!LengthMatch(method.GetParameters(), candidate.GetParameters())) return false; if (!TryMatchGenericMethod(method, ref candidate)) return false; if (!TryMatchMethodSignature(method, candidate)) return false; match = candidate; return true; } private static bool TryMatchGenericMethod(MethodInfo method, ref MethodInfo candidate) { if (method.IsGenericMethod) { if (!candidate.IsGenericMethod) return false; if (!LengthMatch(candidate.GetGenericArguments(), method.GetGenericArguments())) return false; candidate = candidate.MakeGenericMethodFrom(method); } return true; } private static bool TryMatchMethodSignature(MethodInfo method, MethodInfo candidate) { var parameters = method.GetParameterTypes(); var candidateParameters = candidate.GetParameterTypes(); var compare = GetTypeComparer(candidate.DeclaringType); if (!compare(method.ReturnType, candidate.ReturnType)) return false; for (int i = 0; i < candidateParameters.Length; i++) { if (!compare(parameters[i], candidateParameters[i])) return false; } return true; } private static bool LengthMatch(T1[] a, T2[] b) { return a.Length == b.Length; } private static Func GetTypeComparer(Type type) { Func mapper; if (!_mappers.TryGetValue(type, out mapper)) mapper = t => t; return (a, b) => { if (a == b) return true; return mapper(a) == b; }; } private static Dictionary> _mappers = new Dictionary> { { typeof(Db4oLinqQueryExtensions), MapQueryableToDb4o }, { typeof(Enumerable), MapQueryableToEnumerable }, }; private static Type MapQueryableToDb4o(Type type) { if (type.IsGenericInstanceOf(typeof(IQueryable<>)) || type.IsGenericInstanceOf(typeof(IOrderedQueryable<>))) { type = typeof(IDb4oLinqQuery<>).MakeGenericTypeFrom(type); } return type; } private static Type MapQueryableToEnumerable(Type type) { if (type.IsGenericInstanceOf(typeof(IQueryable<>))) { type = typeof(IEnumerable<>).MakeGenericTypeFrom(type); } else if (type.IsGenericInstanceOf(typeof(IOrderedQueryable<>))) { type = typeof(IOrderedEnumerable<>).MakeGenericTypeFrom(type); } else if (type.IsGenericInstanceOf(typeof(Expression<>))) { type = type.GetFirstGenericArgument(); } else if (type == typeof(IQueryable)) { type = typeof(IEnumerable); } return type; } } } #endif././@LongLink0000000000000000000000000000016300000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByAscendingClauseVisitor.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/OrderByAscendingCl0000644000175000017500000000236611520622624032503 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Linq.Expressions; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Expressions { internal class OrderByAscendingClauseVisitor : OrderByClauseVisitorBase { private static ICache4 _cache = ExpressionCacheFactory.NewInstance(10); protected override ICache4 GetCachingStrategy() { return _cache; } protected override void ApplyDirection(IQuery query) { query.OrderAscending(); } } } ././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionEqualityComparer.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Expressions/ExpressionEquality0000644000175000017500000000230011520622624032703 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Linq.Expressions; namespace Db4objects.Db4o.Linq.Expressions { public class ExpressionEqualityComparer : IEqualityComparer { public static ExpressionEqualityComparer Instance = new ExpressionEqualityComparer(); public bool Equals(Expression a, Expression b) { return new ExpressionComparison(a, b).AreEqual; } public int GetHashCode(Expression expression) { return new HashCodeCalculation(expression).HashCode; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/0000755000175000017500000000000011520622070026520 5ustar directhexdirecthex././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/QueryBuilderContext.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/QueryBuilderContext.0000644000175000017500000000456511520622624032521 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Internals { internal class QueryBuilderContext { private readonly IQuery _root; private IQuery _currentQuery; private readonly Stack _constraints = new Stack(); private Stack _descendStack = new Stack(); private Type _descendigFieldEnum; public IQuery CurrentQuery { get { return _currentQuery; } } public QueryBuilderContext(IQuery root) { _root = root; _currentQuery = _root; } internal void PushDescendigFieldEnumType(Type descendigFieldEnum) { _descendigFieldEnum = descendigFieldEnum; } private Type PopDescendigFieldEnumType() { Type returnType = _descendigFieldEnum; _descendigFieldEnum = null; return returnType; } public void PushConstraint(IConstraint constraint) { _constraints.Push(constraint); } public IConstraint PopConstraint() { return _constraints.Pop(); } public void ApplyConstraint(Func constraint) { PushConstraint(constraint(PopConstraint())); } internal object ResolveValue(object value) { Type type = PopDescendigFieldEnumType(); return (type != null) ? Enum.ToObject(type, value) : value; } public void Descend(string name) { _currentQuery = _currentQuery.Descend(name); } public void SaveQuery() { _descendStack.Push(_currentQuery); } public void RestoreQuery() { _currentQuery = _descendStack.Pop(); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/Db4oLinqQueryable.cs0000644000175000017500000000522411520622624032345 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF_3_5 using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Db4objects.Db4o.Linq.Expressions; namespace Db4objects.Db4o.Linq.Internals { internal class Db4oQueryable : IDb4oLinqQueryable, IQueryProvider { Expression _expression; IDb4oLinqQuery _query; public Type ElementType { get { return typeof(T); } } public Expression Expression { get { return _expression; } } public IQueryProvider Provider { get { return this; } } public Db4oQueryable(Expression expression) { _expression = expression; } public Db4oQueryable(IDb4oLinqQuery query) { _expression = Expression.Constant(this); _query = query; } public IDb4oLinqQuery GetQuery() { return _query; } public IEnumerator GetEnumerator () { return Execute>(_expression).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator () { return GetEnumerator(); } public IQueryable CreateQuery(Expression expression) { return new Db4oQueryable(expression); } public IQueryable CreateQuery(Expression expression) { return (IQueryable)Activator.CreateInstance( MakeGenericDb4oQueryable(expression.Type), expression); } private static Type MakeGenericDb4oQueryable(Type type) { return typeof(Db4oQueryable<>).MakeGenericType(type.GetFirstGenericArgument()); } private static Expression TransformQuery(Expression expression) { var result = QueryableTransformer.Transform(expression); return result; } public TResult Execute(Expression expression) { return Expression.Lambda>(TransformQuery(expression)).Compile().Invoke(); } public object Execute(Expression expression) { return Expression.Lambda(TransformQuery(expression)).Compile().DynamicInvoke(); } } } #endif././@LongLink0000000000000000000000000000016000000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/OptimizeableMethodConstrains.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/OptimizeableMethodCo0000644000175000017500000000270311520622624032521 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace Db4objects.Db4o.Linq.Internals { internal class OptimizeableMethodConstrains { public static bool CanBeOptimized(MethodInfo method) { return IsIListOrICollectionOfTMethod(method) || IsStringMethod(method); } public static bool IsStringMethod(MethodInfo method) { return method.DeclaringType == typeof(string); } public static bool IsIListOrICollectionOfTMethod(MethodInfo method) { Type declaringType = method.DeclaringType; return declaringType.IsGenericInstanceOf(typeof(ICollection<>)) || typeof(IList).IsAssignableFrom(declaringType) || declaringType == typeof(Enumerable); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/UnoptimizedQuery.cs0000644000175000017500000000343311520622624032414 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace Db4objects.Db4o.Linq.Internals { internal class UnoptimizedQuery : IDb4oLinqQueryInternal { private IEnumerable _result; public UnoptimizedQuery(IEnumerable result) { if (result == null) throw new ArgumentNullException("result"); _result = result; } public IEnumerable Result { get { return _result; } } public IEnumerator GetEnumerator() { return _result.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #region IDb4oLinqQueryInternal Members public IEnumerable UnoptimizedThenBy(Func function) { return ((IOrderedEnumerable)_result).ThenBy(function); } public IEnumerable UnoptimizedThenByDescending(Func function) { return ((IOrderedEnumerable)_result).ThenByDescending(function); } public IEnumerable UnoptimizedWhere(Func func) { return _result.Where(func); } #endregion } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/ObjectSequence.cs0000644000175000017500000000422511520622624031756 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using Db4objects.Db4o; namespace Db4objects.Db4o.Linq.Internals { /// /// A generic wrapper around a not generic IEnumerable, /// Faithfully hoping that all items in the enumeration /// are of the same kind, otherwise it will throw a /// ClassCastException on access. /// /// The type of the items public class ObjectSequence : IEnumerable { private IEnumerable _enumerable; public ObjectSequence(IEnumerable enumerable) { _enumerable = enumerable; } public IEnumerator GetEnumerator() { return new ObjectSequenceEnumerator(this); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } internal class ObjectSequenceEnumerator : IEnumerator { private IEnumerator _enumerator; public T Current { get { return (T)_enumerator.Current; } } object IEnumerator.Current { get { return Current; } } public ObjectSequenceEnumerator(ObjectSequence sequence) { _enumerator = sequence._enumerable.GetEnumerator(); } public bool MoveNext() { return _enumerator.MoveNext(); } public void Reset() { _enumerator.Reset(); } public void Dispose() { IDisposable enumerator = _enumerator as IDisposable; if (enumerator == null) return; enumerator.Dispose(); } } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/ObjectSetWrapper.cs0000644000175000017500000000202211520622624032273 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using Db4objects.Db4o; namespace Db4objects.Db4o.Linq.Internals { public class ObjectSetWrapper : ObjectSequence { private IObjectSet _set; public int Count { get { return _set.Count; } } public ObjectSetWrapper(IObjectSet set) : base(set) { _set = set; } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/Db4oQuery.cs0000644000175000017500000000716111520622624030677 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Query.Processor; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Internals { internal class Db4oQuery : IDb4oLinqQueryInternal { private readonly ISodaQueryFactory _queryFactory; private readonly IQueryBuilderRecord _record; public Db4oQuery(ISodaQueryFactory queryFactory) { if (queryFactory == null) throw new ArgumentNullException("queryFactory"); _queryFactory = queryFactory; _record = NullQueryBuilderRecord.Instance; } public Db4oQuery(Db4oQuery parent, IQueryBuilderRecord record) { _queryFactory = parent.QueryFactory; _record = new CompositeQueryBuilderRecord(parent.Record, record); } public ISodaQueryFactory QueryFactory { get { return _queryFactory; } } public IQueryBuilderRecord Record { get { return _record; } } public int Count { get { return Execute().Count; } } public ObjectSetWrapper GetExtentResult() { var query = NewQuery(); return Wrap(ExecuteQuery(query, MonitorUnoptimizedQuery)); } private IObjectSet Execute() { var query = NewQuery(); _record.Playback(query); return ExecuteQuery(query, MonitorOptimizedQuery); } private static IObjectSet ExecuteQuery(IQuery query, Action4 monitorAction) { var result = query.Execute(); ((IInternalQuery)query).Container.WithEnvironment(monitorAction); return result; } private void MonitorOptimizedQuery() { My.Instance.OnOptimizedQuery(); } private void MonitorUnoptimizedQuery() { My.Instance.OnUnoptimizedQuery(); } private IQuery NewQuery() { var query = _queryFactory.Query(); query.Constrain(typeof(T)); return query; } static ObjectSetWrapper Wrap(IObjectSet set) { return new ObjectSetWrapper(set); } public IEnumerator GetEnumerator() { return Wrap(Execute()).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } #region IDb4oLinqQueryInternal Members public IEnumerable UnoptimizedThenBy(Func function) { throw new NotImplementedException("cannot fallback on UnoptimizedThenBy"); } public IEnumerable UnoptimizedThenByDescending(Func function) { throw new NotImplementedException("cannot fallback on UnoptimizedThenBy"); /* IOrderByRecord record = _orderByRecord; IOrderedEnumerable ordered = record.OrderBy(this); record = record.Next; while (record != null) { ordered = record.ThenBy(record); } return ordered.ThenByDescending(function); * */ } public IEnumerable UnoptimizedWhere(Func func) { return GetExtentResult().Where(func); } #endregion } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/LinqQueryMonitorImpl.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/LinqQueryMonitorImpl0000644000175000017500000000162111520622624032573 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Linq; namespace Db4objects.Db4o.Internal.Linq { public class LinqQueryMonitorImpl : ILinqQueryMonitor { public void OnOptimizedQuery() { } public void OnUnoptimizedQuery() { } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/PlaceholderQuery.cs0000644000175000017500000000256411520622624032333 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Collections; using System.Collections.Generic; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Internals { internal class PlaceHolderQuery : IDb4oLinqQuery { private ISodaQueryFactory _queryFactory; public ISodaQueryFactory QueryFactory { get { return _queryFactory; } } public PlaceHolderQuery(ISodaQueryFactory queryFactory) { _queryFactory = queryFactory; } public IEnumerator GetEnumerator() { var query = _queryFactory.Query(); query.Constrain(typeof(T)); return new ObjectSequence(query.Execute()).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/Extensions.cs0000644000175000017500000000342511520622624031217 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; namespace Db4objects.Db4o.Linq.Internals { internal static class Extensions { public static Type[] GetParameterTypes(this MethodBase self) { return self.GetParameters().Select(p => p.ParameterType).ToArray(); } public static Type MakeGenericTypeFrom(this Type self, Type type) { return self.MakeGenericType(type.GetGenericArguments()); } public static Type GetFirstGenericArgument(this Type self) { return self.GetGenericArguments()[0]; } public static bool IsGenericInstanceOf(this Type self, Type type) { return self.IsGenericType && self.GetGenericTypeDefinition() == type; } public static MethodInfo MakeGenericMethodFrom(this MethodInfo self, MethodInfo method) { return self.MakeGenericMethod(method.GetGenericArguments()); } public static bool IsExtension(this MethodInfo self) { return self.GetCustomAttributes(typeof(ExtensionAttribute), false).Length > 0; } } } ././@LongLink0000000000000000000000000000015000000000000011561 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/QueryBuilderRecorder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/QueryBuilderRecorder0000644000175000017500000000551611520622624032561 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq.Internals { internal interface IQueryBuilderRecord { void Playback(IQuery query); void Playback(QueryBuilderContext context); } internal class NullQueryBuilderRecord : IQueryBuilderRecord { public static readonly NullQueryBuilderRecord Instance = new NullQueryBuilderRecord(); private NullQueryBuilderRecord() { } public void Playback(IQuery query) { } public void Playback(QueryBuilderContext context) { } } internal abstract class QueryBuilderRecordImpl : IQueryBuilderRecord { public void Playback(IQuery query) { Playback(new QueryBuilderContext(query)); } public abstract void Playback(QueryBuilderContext context); } internal class CompositeQueryBuilderRecord : QueryBuilderRecordImpl { private readonly IQueryBuilderRecord _first; private readonly IQueryBuilderRecord _second; public CompositeQueryBuilderRecord(IQueryBuilderRecord first, IQueryBuilderRecord second) { _first = first; _second = second; } override public void Playback(QueryBuilderContext context) { context.SaveQuery(); _first.Playback(context); context.RestoreQuery(); _second.Playback(context); } } internal class ChainedQueryBuilderRecord : QueryBuilderRecordImpl { private readonly Action _action; private readonly IQueryBuilderRecord _next; public ChainedQueryBuilderRecord(IQueryBuilderRecord next, Action action) { _next = next; _action = action; } override public void Playback(QueryBuilderContext context) { _next.Playback(context); _action(context); } } internal class QueryBuilderRecorder { private IQueryBuilderRecord _last = NullQueryBuilderRecord.Instance; public QueryBuilderRecorder() { } public QueryBuilderRecorder(IQueryBuilderRecord record) { _last = record; } public IQueryBuilderRecord Record { get { return _last; } } public void Add(Action action) { _last = new ChainedQueryBuilderRecord(_last, action); } } } ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/IDb4oLinqQueryInternal.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Internals/IDb4oLinqQueryIntern0000644000175000017500000000203311520622624032401 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Linq.Internals { using System; using System.Collections.Generic; interface IDb4oLinqQueryInternal : IDb4oLinqQuery { IEnumerable UnoptimizedThenBy(Func function); IEnumerable UnoptimizedThenByDescending(Func function); IEnumerable UnoptimizedWhere(Func func); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/QueryOptimizationException.cs0000644000175000017500000000202211520622624032504 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Db4o.Linq { public class QueryOptimizationException : Exception { internal QueryOptimizationException() { } internal QueryOptimizationException(string message) : base(message) { } internal QueryOptimizationException(string message, Exception innerException) : base(message, innerException) { } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/ObjectContainerExtensions.cs0000644000175000017500000000352211520622624032250 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Query; namespace Db4objects.Db4o.Linq { public static class ObjectContainerExtensions { /// /// This is the entry point of Linq to db4o. /// It allows the compiler to call the standard query operators /// in IDb4oLinqQuery. The optimized methods are defined as extension methods /// on the IDb4oLinqQuery marker interface. /// /// The type to query the ObjectContainer /// A query factory (any IObjectContainer implementation) /// A IDb4oLinqQuery marker interface public static IDb4oLinqQuery Cast(this ISodaQueryFactory queryFactory) { if (typeof(T) == typeof(object)) return new PlaceHolderQuery(queryFactory); return new Db4oQuery(queryFactory); } #if !CF_3_5 public static IDb4oLinqQueryable AsQueryable(this ISodaQueryFactory queryFactory) { return queryFactory.Cast().AsQueryable(); } #endif } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/0000755000175000017500000000000011520622070027137 5ustar directhexdirecthex././@LongLink0000000000000000000000000000015700000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/ReflectionMethodAnalyser.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/ReflectionMethodA0000644000175000017500000001106011520622624032421 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF && !SILVERLIGHT using System; using System.Reflection; using System.Reflection.Emit; using Mono.Reflection; using Db4objects.Db4o.Activation; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal class ReflectionMethodAnalyser : IMethodAnalyser { private static ICache4 _fieldCache = CacheFactory.For(CacheFactory.New2QXCache(5)); private static ILPattern ActivateCall() { return new ActivateCallPattern(); } private class ActivateCallPattern : ILPattern { static ILPattern pattern = ILPattern.Sequence( ILPattern.Optional(OpCodes.Nop), ILPattern.OpCode(OpCodes.Ldarg_0), ILPattern.OpCode(OpCodes.Ldc_I4_0), ILPattern.Either( ILPattern.OpCode(OpCodes.Call), ILPattern.OpCode(OpCodes.Callvirt))); public override void Match(MatchContext context) { pattern.Match(context); if (!context.IsMatch) return; var match = GetLastMatchingInstruction(context); var method = (MethodInfo)match.Operand; if (!IsActivateCall(method)) context.IsMatch = false; } private static bool IsActivateCall(MethodInfo method) { if (method == null) return false; if (method.IsStatic) return false; if (method.Name != "Activate") return false; var parameters = method.GetParameters(); if (parameters.Length != 1) return false; if (parameters[0].ParameterType != typeof(ActivationPurpose)) return false; return true; } } private static ILPattern BackingField() { return new BackingFieldPattern(); } private class BackingFieldPattern : ILPattern { public static readonly object BackingFieldKey = new object(); private static ILPattern pattern = ILPattern.Sequence( ILPattern.Optional(OpCodes.Nop), ILPattern.OpCode(OpCodes.Ldarg_0), ILPattern.OpCode(OpCodes.Ldfld)); public override void Match(MatchContext context) { pattern.Match (context); if (!context.IsMatch) return; var match = GetLastMatchingInstruction(context); var field = (FieldInfo)match.Operand; context.AddData(BackingFieldKey, field); } } private static ILPattern _getterPattern = ILPattern.Sequence( ILPattern.Optional(ActivateCall()), BackingField(), ILPattern.Optional( OpCodes.Stloc_0, OpCodes.Br_S, OpCodes.Ldloc_0), ILPattern.OpCode(OpCodes.Ret)); private MethodInfo _method; private ReflectionMethodAnalyser(MethodInfo method) { _method = method; } private static MatchContext MatchGetter(MethodInfo method) { return ILPattern.Match(method, _getterPattern); } public void Run(QueryBuilderRecorder recorder) { RecordField(recorder, GetBackingField(_method)); } private static void RecordField(QueryBuilderRecorder recorder, FieldInfo field) { recorder.Add(ctx => { ctx.Descend(field.Name); ctx.PushDescendigFieldEnumType(field.FieldType.IsEnum ? field.FieldType : null); }); } private static FieldInfo GetBackingField(MethodInfo method) { return _fieldCache.Produce(method, ResolveBackingField); } private static FieldInfo ResolveBackingField(MethodInfo method) { var context = MatchGetter(method); if (!context.IsMatch) throw new QueryOptimizationException("Analysed method is not a simple getter"); return GetFieldFromContext (context); } private static FieldInfo GetFieldFromContext(MatchContext context) { object data; if (!context.TryGetData(BackingFieldPattern.BackingFieldKey, out data)) throw new NotSupportedException(); return (FieldInfo)data; } public static IMethodAnalyser FromMethod(MethodInfo method) { return new ReflectionMethodAnalyser(method); } } } #endif ././@LongLink0000000000000000000000000000015200000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/CecilMethodAnalyser.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/CecilMethodAnalys0000644000175000017500000000504711520622624032425 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if CF || SILVERLIGHT using System; using System.Reflection; using Db4objects.Db4o.Internal.Caching; using Db4objects.Db4o.Linq.Caching; using Db4objects.Db4o.Linq.Internals; using Cecil.FlowAnalysis; using Cecil.FlowAnalysis.ActionFlow; using Cecil.FlowAnalysis.CodeStructure; using Mono.Cecil; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal class CecilMethodAnalyser : IMethodAnalyser { private static ICache4 _graphCache = CacheFactory.For(CacheFactory.New2QXCache(5)); private readonly Expression _queryExpression; private CecilMethodAnalyser(ActionFlowGraph graph) { if (graph == null) throw new ArgumentNullException("graph"); _queryExpression = QueryExpressionFinder.FindIn(graph); } public void Run(QueryBuilderRecorder recorder) { if (_queryExpression == null) throw new QueryOptimizationException("No query expression"); _queryExpression.Accept(new CodeQueryBuilder(recorder)); } public static IMethodAnalyser FromMethod(MethodInfo info) { return GetAnalyserFor(ResolveMethod(info)); } private static MethodDefinition ResolveMethod(MethodInfo info) { if (info == null) throw new ArgumentNullException("info"); var method = MetadataResolver.Instance.ResolveMethod(info); if (method == null) throw new QueryOptimizationException( string.Format("Cannot resolve method {0}", info)); return method; } private static IMethodAnalyser GetAnalyserFor(MethodDefinition method) { var graph = _graphCache.Produce(method, CreateActionFlowGraph); return new CecilMethodAnalyser(graph); } private static ActionFlowGraph CreateActionFlowGraph(MethodDefinition method) { return FlowGraphFactory.CreateActionFlowGraph(FlowGraphFactory.CreateControlFlowGraph(method)); } } } #endif ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/MetadataResolver.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/MetadataResolver.0000644000175000017500000000744111520622624032415 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if CF || SILVERLIGHT using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Db4objects.Db4o.Internal.Caching; using Db4objects.Db4o.Linq.Caching; using Mono.Cecil; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal class MetadataResolver { public static MetadataResolver Instance = new MetadataResolver(); private ICache4 _assemblyCache; private ICache4 _methodCache; private MetadataResolver() { _assemblyCache = CacheFactory.For(CacheFactory.New2QXCache(5)); _methodCache = CacheFactory.For(CacheFactory.New2QXCache(5)); } private AssemblyDefinition GetAssembly(Assembly assembly) { return _assemblyCache.Produce(assembly, ReadAssembly); } private static AssemblyDefinition ReadAssembly(Assembly assembly) { #if CF return AssemblyDefinition.ReadAssembly(assembly.ManifestModule.FullyQualifiedName); #elif SILVERLIGHT var reference = AssemblyNameReference.Parse(assembly.FullName); var streamInfo = System.Windows.Application.GetResourceStream(new Uri(reference.Name + ".dll", UriKind.Relative)); return AssemblyDefinition.ReadAssembly(streamInfo.Stream); #endif } #if CF private static string GetFullName(Type type) { if (type.DeclaringType != null) return type.FullName.Replace('+', '/'); return type.FullName; } private TypeDefinition GetType(Type type) { var assembly = GetAssembly(type.Assembly); return assembly.MainModule.GetType(GetFullName(type)); } private static bool ParameterMatch(ParameterDefinition parameter, ParameterInfo info) { return parameter.ParameterType.FullName == GetFullName(info.ParameterType); } private static bool ParametersMatch(IList parameters, ParameterInfo[] infos) { if (parameters.Count != infos.Length) return false; for (int i = 0; i < parameters.Count; i++) { if (!ParameterMatch(parameters[i], infos[i])) return false; } return true; } private static bool MethodMatch(MethodDefinition method, MethodInfo info) { if (method.Name != info.Name) return false; if (method.ReturnType.Name != info.ReturnType.Name) return false; return ParametersMatch(method.Parameters, info.GetParameters()); } private MethodDefinition GetMethod(MethodInfo method) { TypeDefinition type = GetType(method.DeclaringType); var matches = from MethodDefinition candidate in type.Methods where MethodMatch(candidate, method) select candidate; return matches.FirstOrDefault(); } #elif SILVERLIGHT private MethodDefinition GetMethod(MethodInfo method) { var assembly = GetAssembly(method.DeclaringType.Assembly); return (MethodDefinition)assembly.MainModule.LookupToken(method.MetadataToken); } #endif public MethodDefinition ResolveMethod(MethodInfo method) { if (method == null) throw new ArgumentNullException("method"); return _methodCache.Produce(method, GetMethod); } } } #endif ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/CodeQueryBuilder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/CodeQueryBuilder.0000644000175000017500000000642311520622624032361 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if CF || SILVERLIGHT using System; using Cecil.FlowAnalysis.CodeStructure; using Mono.Cecil; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal class CodeQueryBuilder : AbstractCodeStructureVisitor { private readonly QueryBuilderRecorder _recorder; public CodeQueryBuilder(QueryBuilderRecorder recorder) { _recorder = recorder; } public override void Visit(ArgumentReferenceExpression node) { CannotOptimize(node); } public override void Visit(AssignExpression node) { CannotOptimize(node); } public override void Visit(BinaryExpression node) { CannotOptimize(node); } public override void Visit(CastExpression node) { CannotOptimize(node); } public override void Visit(FieldReferenceExpression node) { Type descendingEnumType = ResolveDescendingEnumType(node); _recorder.Add( ctx => { ctx.Descend(node.Field.Name); ctx.PushDescendigFieldEnumType(descendingEnumType); }); } public override void Visit(LiteralExpression node) { CannotOptimize(node); } public override void Visit(MethodInvocationExpression node) { CannotOptimize(node); } public override void Visit(MethodReferenceExpression node) { CannotOptimize(node); } public override void Visit(PropertyReferenceExpression node) { CannotOptimize(node); } public override void Visit(ThisReferenceExpression node) { CannotOptimize(node); } public override void Visit(UnaryExpression node) { CannotOptimize(node); } public override void Visit(VariableReferenceExpression node) { CannotOptimize(node); } private static void CannotOptimize(Expression expression) { throw new QueryOptimizationException(ExpressionPrinter.ToString(expression)); } private static Type ResolveDescendingEnumType(FieldReferenceExpression node) { var type = ResolveType(node.Field.FieldType); if (type == null) return null; if (!type.IsEnum) return null; return type; } private static Type ResolveType(TypeReference type) { var assemblyName = type.Module.Assembly.Name.FullName; var assembly = System.Reflection.Assembly.Load(assemblyName); if (assembly == null) return null; return assembly.GetType(NormalizeTypeName(type)); } private static string NormalizeTypeName(TypeReference type) { return type.FullName.Replace('/', '+'); } } } #endif ././@LongLink0000000000000000000000000000015400000000000011565 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/QueryExpressionFinder.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/QueryExpressionFi0000644000175000017500000001036411520622624032537 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if CF || SILVERLIGHT using System.Collections.Generic; using Cecil.FlowAnalysis.ActionFlow; using Cecil.FlowAnalysis.CodeStructure; using Mono.Cecil; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal class QueryExpressionFinder { private ActionFlowGraph _graph; private Expression _queryExpression; private Dictionary _variables; private Expression QueryExpression { get { return _queryExpression; } } private QueryExpressionFinder(ActionFlowGraph graph) { _graph = graph; _variables = new Dictionary(); FindQueryExpression(); } public static Expression FindIn(ActionFlowGraph graph) { var finder = new QueryExpressionFinder(graph); return finder.QueryExpression; } private static ActionBlock GetFirstBlock(ActionFlowGraph graph) { if (graph.Blocks.Count < 1) return null; return graph.Blocks[0]; } private void FindQueryExpression() { var block = GetFirstBlock(_graph); while (block != null) { switch (block.ActionType) { case ActionType.Invoke: block = OnInvokeAction((InvokeActionBlock)block); break; case ActionType.ConditionalBranch: block = OnConditionalBranch((ConditionalBranchActionBlock)block); break; case ActionType.Branch: block = OnBranch((BranchActionBlock)block); break; case ActionType.Assign: block = OnAssign((AssignActionBlock)block); break; case ActionType.Return: block = OnReturn((ReturnActionBlock)block); break; } } } private ActionBlock OnInvokeAction(InvokeActionBlock block) { MethodInvocationExpression invocation = block.Expression; if (!IsActivateInvocation(invocation)) CannotOptimize(invocation); return block.Next; } private ActionBlock OnConditionalBranch(ConditionalBranchActionBlock block) { throw new QueryOptimizationException(); } private ActionBlock OnBranch(BranchActionBlock block) { return block.Target; } private ActionBlock OnAssign(AssignActionBlock block) { var assign = block.AssignExpression; var variable = assign.Target as VariableReferenceExpression; if (variable == null) CannotOptimize(assign); if (HasBeenAlreadyAssignedTo(variable)) CannotOptimize(assign.Expression); _variables.Add(GetVariableIndex(variable), assign.Expression); return block.Next; } private bool HasBeenAlreadyAssignedTo(VariableReferenceExpression variable) { return _variables.ContainsKey(GetVariableIndex(variable)); } private ActionBlock OnReturn(ReturnActionBlock block) { Expression expression = block.Expression; VariableReferenceExpression variable = expression as VariableReferenceExpression; _queryExpression = variable != null ? _variables[GetVariableIndex(variable)] : expression; return null; } private static bool IsActivateInvocation(MethodInvocationExpression invocation) { MethodReferenceExpression methodRef = invocation.Target as MethodReferenceExpression; if (null == methodRef) return false; return IsActivateMethod(methodRef.Method); } private static bool IsActivateMethod(MethodReference method) { return method.Name == "Activate"; } private static int GetVariableIndex(VariableReferenceExpression variable) { return variable.Variable.Index; } private static void CannotOptimize(Expression expression) { throw new QueryOptimizationException(ExpressionPrinter.ToString(expression)); } } } #endif ././@LongLink0000000000000000000000000000014600000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/IMethodAnalyser.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/IMethodAnalyser.c0000644000175000017500000000155511520622624032346 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal interface IMethodAnalyser { void Run(QueryBuilderRecorder recorder); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/CodeAnalysis/MethodAnalyser.cs0000644000175000017500000000177711520622624032426 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System.Reflection; namespace Db4objects.Db4o.Linq.CodeAnalysis { internal static class MethodAnalyser { public static IMethodAnalyser FromMethod(MethodInfo method) { #if CF || SILVERLIGHT return CecilMethodAnalyser.FromMethod(method); #else return ReflectionMethodAnalyser.FromMethod(method); #endif } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Caching/0000755000175000017500000000000011520622070026115 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Caching/CacheFactory.cs0000644000175000017500000000717111520622624031012 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using Db4objects.Db4o.Foundation; using Db4objects.Db4o.Internal.Caching; namespace Db4objects.Db4o.Linq.Caching { /// /// Generic wrappers for . /// /// /// public class CacheFactory { public static ICache4 For(ICache4 cache4) { return new Cache4CachingStrategy(cache4); } public static ICache4 For(ICache4 cache4, IEqualityComparer comparer) { return new Cache4CachingStrategyWithComparer(cache4, comparer); } } internal class Cache4CachingStrategy : ICache4 { private readonly ICache4 _cache4; public Cache4CachingStrategy(ICache4 cache4) { _cache4 = cache4; } virtual public TValue Produce(TKey key, Func producer) { return (TValue) Cache4Produce(key, producer); } virtual protected object Cache4Produce(object key, Func producer) { return Cache4Produce(key, new Function4Func(producer)); } virtual protected object Cache4Produce(object key, IFunction4 producer) { return _cache4.Produce(key, producer, null); } } internal class Cache4CachingStrategyWithComparer : Cache4CachingStrategy { private readonly IEqualityComparer _comparer; public Cache4CachingStrategyWithComparer(ICache4 cache4, IEqualityComparer comparer) : base(cache4) { _comparer = comparer; } public override TValue Produce(TKey key, Func producer) { return (TValue) Cache4Produce(new ComparableKey(_comparer, key), new UnwrappingProducer(producer)); } internal class UnwrappingProducer : IFunction4 { private readonly Func _producer; public UnwrappingProducer(Func producer) { _producer = producer; } #region Implementation of IFunction4 public object Apply(object arg) { return _producer(((ComparableKey) arg).Key); } #endregion } internal class ComparableKey { private readonly IEqualityComparer _comparer; private readonly TKey _key; public ComparableKey(IEqualityComparer comparer, TKey key) { _comparer = comparer; _key = key; } public TKey Key { get { return _key; } } public override bool Equals(object obj) { return _comparer.Equals(_key, ((ComparableKey) obj)._key); } public override int GetHashCode() { return _comparer.GetHashCode(_key); } } } internal class Function4Func : IFunction4 { private readonly Func _func; public Function4Func(Func func) { _func = func; } public object Apply(object arg) { return _func((T) arg); } } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Caching/ICache4.cs0000644000175000017500000000152111520622624027650 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; namespace Db4objects.Db4o.Linq.Caching { public interface ICache4 { TValue Produce(TKey key, Func producer); } } ././@LongLink0000000000000000000000000000014700000000000011567 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Caching/TracingCacheDecorator.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Caching/TracingCacheDecorator.0000644000175000017500000000313611520622624032304 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Diagnostics; #if !SILVERLIGHT namespace Db4objects.Db4o.Linq.Caching { public class TracingCacheDecorator : ICache4 { private readonly ICache4 _delegate; public TracingCacheDecorator(ICache4 @delegate) { _delegate = @delegate; } public TValue Produce(TKey key, Func producer) { var hit = true; var result = _delegate.Produce(key, delegate(TKey newKey) { hit = false; return producer(newKey); }); TraceCacheHitMiss(key, hit); return result; } private void TraceCacheHitMiss(TKey key, bool hit) { if (hit) Trace.WriteLine("Cache hit: " + key); else Trace.WriteLine("Cache miss: " + key); } } } #endif db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/ILinqQueryMonitor.cs0000644000175000017500000000163211520622624030531 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Linq { /// /// commonConfiguration.Environment.Add(new MyLinqQueryMonitor()); /// public interface ILinqQueryMonitor { void OnOptimizedQuery(); void OnUnoptimizedQuery(); } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/Db4oLinqQueryExtensions.cs0000644000175000017500000001126211520622624031641 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using Db4objects.Db4o.Linq.Expressions; using Db4objects.Db4o.Linq.Internals; namespace Db4objects.Db4o.Linq { /// /// A class that defines some standard linq query operations /// that can be optimized. /// public static class Db4oLinqQueryExtensions { public static IDb4oLinqQuery Where(this IDb4oLinqQuery self, Expression> expression) { return Process(self, query => new WhereClauseVisitor().Process(expression), data => data.UnoptimizedWhere(expression.Compile()) ); } public static int Count(this IDb4oLinqQuery self) { if (self == null) throw new ArgumentNullException("self"); var query = self as Db4oQuery; if (query != null) return query.Count; return Enumerable.Count(self); } private static IDb4oLinqQuery Process( IDb4oLinqQuery query, Func, IQueryBuilderRecord> queryProcessor, Func, IEnumerable> fallbackProcessor) { if (query == null) { throw new ArgumentNullException("query"); } var candidate = query as Db4oQuery; if (candidate == null) { return new UnoptimizedQuery(fallbackProcessor((IDb4oLinqQueryInternal) EnsureDb4oQuery(query))); } try { IQueryBuilderRecord record = queryProcessor(candidate); return new Db4oQuery(candidate, record); } catch (QueryOptimizationException) { return new UnoptimizedQuery(fallbackProcessor(candidate)); } } private static IDb4oLinqQuery EnsureDb4oQuery(IDb4oLinqQuery query) { var placeHolderQuery = query as PlaceHolderQuery; if (placeHolderQuery == null) { return query; } return new Db4oQuery(placeHolderQuery.QueryFactory); } private static IDb4oLinqQuery ProcessOrderBy( IDb4oLinqQuery query, OrderByClauseVisitorBase visitor, Expression> expression, Func, IEnumerable> fallbackProcessor) { return Process(query, q => visitor.Process(expression), fallbackProcessor); } public static IDb4oLinqQuery OrderBy(this IDb4oLinqQuery self, Expression> expression) { return ProcessOrderBy(self, new OrderByAscendingClauseVisitor(), expression, data => data.OrderBy(expression.Compile()) ); } public static IDb4oLinqQuery OrderByDescending(this IDb4oLinqQuery self, Expression> expression) { return ProcessOrderBy(self, new OrderByDescendingClauseVisitor(), expression, data => data.OrderByDescending(expression.Compile()) ); } public static IDb4oLinqQuery ThenBy(this IDb4oLinqQuery self, Expression> expression) { return ProcessOrderBy(self, new OrderByAscendingClauseVisitor(), expression, data => data.UnoptimizedThenBy(expression.Compile()) ); } public static IDb4oLinqQuery ThenByDescending(this IDb4oLinqQuery self, Expression> expression) { return ProcessOrderBy(self, new OrderByDescendingClauseVisitor(), expression, data => data.UnoptimizedThenByDescending(expression.Compile()) ); } public static IDb4oLinqQuery Select(this IDb4oLinqQuery self, Func selector) { var placeHolderQuery = self as PlaceHolderQuery; if (placeHolderQuery != null) return new Db4oQuery(placeHolderQuery.QueryFactory); return new UnoptimizedQuery(Enumerable.Select(self, selector)); } #if !CF_3_5 public static IDb4oLinqQueryable AsQueryable(this IDb4oLinqQuery self) { return new Db4oQueryable(self); } #endif } } db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq/IDb4oLinqQueryable.cs0000644000175000017500000000234411520622624030517 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if !CF_3_5 using System.Linq; namespace Db4objects.Db4o.Linq { /// /// IDb4oLinqQueryable is the query type of Linq to db4o when working with an API requiring /// a LINQ provider implementing IQueryable. /// The type of the objects that are queried from the database. /// public interface IDb4oLinqQueryable : IDb4oLinqQueryable, IOrderedQueryable { } public interface IDb4oLinqQueryable : IOrderedQueryable { IDb4oLinqQuery GetQuery(); } } #endifdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/ExtensionAttribute.cs0000644000175000017500000000154711520622624025310 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ #if CF namespace System.Runtime.CompilerServices { public class ExtensionAttribute : Attribute { static ExtensionAttribute() { } public ExtensionAttribute() { } } } #endif db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-Silverlight-2008.csproj0000644000175000017500000001604311520622064030673 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {96E9DCEB-D739-419F-8346-1BC2EE86F562} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o.Linq Db4objects.Db4o.Linq v3.5 false true true true ../db4objects.snk true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 False ..\Libs\silverlight\Cecil.FlowAnalysis.dll False ..\Libs\silverlight\Mono.Cecil.dll {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Makefile0000644000175000017500000000031311520622056022546 0ustar directhexdirecthex include ../../db4o.net/include.mk OUTDIR = ../../db4o.net/bin TARGET = library ASSEMBLY = Db4objects.Db4o.Linq.dll REFERENCES = -r:$(OUTDIR)/$(CORE) -r:$(OUTDIR)/$(CECIL) -r:$(OUTDIR)/$(FLOWANALYSIS) db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Properties/0000755000175000017500000000000011520622060023240 5ustar directhexdirecthexdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Properties/AssemblyInfo.cs0000644000175000017500000000256111520622624026174 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Reflection; using System.Runtime.InteropServices; using System.Security; [assembly: AssemblyTitle("Db4objects.Db4o.Linq")] [assembly: AssemblyDescription("Db4objects.Db4o.Linq 8.0.184.15484 (.NET)")] [assembly: AssemblyConfiguration(".NET")] [assembly: AssemblyCompany("Versant Corp., Redwood City, CA, USA")] [assembly: AssemblyProduct("db4o - database for objects")] [assembly: AssemblyCopyright("Versant Corp. 2000 - 2011")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible (false)] [assembly: AssemblyVersion("8.0.184.15484")] #if !CF &&!SILVERLIGHT [assembly: AllowPartiallyTrustedCallers] #endif [assembly: CLSCompliant(true)] db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-2008.csproj0000644000175000017500000001415511520622042026377 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {23531440-0922-43EB-A483-6592FFC2F093} Library Properties Db4objects.Db4o.Linq Db4objects.Db4o.Linq v3.5 512 true ../db4objects.snk true full false bin\Debug\ DEBUG;TRACE prompt 4 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE prompt 4 1591;1572;1573;1574;0419; False ..\Libs\net-3.5\Mono.Reflection.dll 3.5 {600CD3BF-2ED2-4183-87F7-ADD78A968AE0} Db4objects.Db4o-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-Silverlight-2010.csproj0000644000175000017500000001643411520622064030670 0ustar directhexdirecthex Debug AnyCPU 8.0.50727 2.0 {2E56236C-E595-4DFF-9B9E-0E0509D29A4E} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o.Linq Db4objects.Db4o.Linq Silverlight v4.0 $(TargetFrameworkVersion) false true true true ../db4objects.snk v3.5 true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 ..\Libs\silverlight\Cecil.FlowAnalysis.dll ..\Libs\silverlight\Mono.Cecil.dll {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2010 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Linq/Db4objects.Db4o.Linq-CF-2008.csproj0000644000175000017500000001714011520622070026663 0ustar directhexdirecthex Debug AnyCPU 9.0.30729 2.0 {4F7E0FA5-7023-4C49-90DD-BC6A1DCC733D} Library Properties Db4objects.Db4o.Linq Db4objects.Db4o.Linq {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} PocketPC 3C41C503-53EF-4c2a-8DD4-A8217CAD115E 4.20 Db4objects.Db4o.Linq v3.5 Pocket PC 2003 true ../db4objects.snk true full false bin\Debug\ TRACE;DEBUG;PocketPC;CF_3_5,CF true true prompt 512 4 Off 1591;1572;1573;1574;0419; pdbonly true bin\Release\ TRACE;PocketPC;CF_3_5,CF true true prompt 512 4 Off 1591;1572;1573;1574;0419; False ..\Libs\compact-2.0\Cecil.FlowAnalysis.dll False ..\Libs\compact-2.0\Mono.Cecil.dll {95FD1C64-F1A3-4C8A-B170-D518E899B2FE} Db4objects.Db4o-CF-2008 {92FFA693-E97C-42AF-B479-E311BB4A7321} System.Linq.Expressions-CF-2008 db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/0000755000175000017500000000000011520622060024431 5ustar directhexdirecthex././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart-2010.csprojdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000001611311520622040032646 0ustar directhexdirecthex v3.5 true ../db4objects.snk Debug AnyCPU 9.0.30729 2.0 {A639AD3D-08FB-41D5-A770-B8BE540C369D} {A1591282-1198-4647-A2B1-27E5FF5F6F3B};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} Library Properties Db4objects.Db4o.Silverlight.TestStart Db4objects.Db4o.Silverlight.TestStart v4.0 true true true Db4objects.Db4o.Silverlight.TestStart.xap Properties\AppManifest.xml Db4objects.Db4o.Silverlight.TestStart.App TestPage.html true true false true OnBuildSuccess Silverlight $(TargetFrameworkVersion) 3.5 true full false Bin\Debug DEBUG;TRACE;SILVERLIGHT true true prompt 4 pdbonly true Bin\Release TRACE;SILVERLIGHT true true prompt 4 App.xaml MainPage.xaml Designer MSBuild:MarkupCompilePass1 MSBuild:Compile Designer Designer MSBuild:MarkupCompilePass1 MSBuild:Compile Designer Always {C53361EB-4B4F-4D0F-9ECC-8F216F15A705} Db4objects.Db4o.Linq.Tests-Silverlight-2010 {97B6DEA6-255B-4B49-8973-38943AC2E70C} Db4objects.Db4o.Optional-Silverlight-2010 {C388ABDD-CB2C-4438-8942-C3A935AC8E2D} Db4objects.Db4o.Tests-Silverlight-2010 {76FFA4C5-6CC6-4C8C-BACF-B1C76AE0CA65} Db4objects.Db4o-Silverlight-2010 {13B5E015-9250-4E70-939D-56233D43D8C3} Db4oUnit.Extensions-Silverlight-2010 {C74364D8-A04A-4CF9-801D-D1811D49E72A} Db4oUnit-Silverlight-2010 xcopy $(ProjectDir)Db4objects.Db4o.Silverlight.TestStart\TestPage.html /Y ././@LongLink0000000000000000000000000000015100000000000011562 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/db4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000755000175000017500000000000011520622066032652 5ustar directhexdirecthex././@LongLink0000000000000000000000000000017100000000000011564 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/MainPage.xaml.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000477111520622624032665 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.IO.IsolatedStorage; using System.Threading; using System.Windows.Browser; using Db4oUnit; using Db4oUnit.Extensions; using Db4oUnit.Extensions.Fixtures; namespace Db4objects.Db4o.Silverlight.TestStart { public partial class MainPage { public MainPage() { InitializeComponent(); ThreadPool.QueueUserWorkItem(unused => TestRunnerEntry()); } private void TestRunnerEntry() { try { Type[] testCases = new[] { typeof(Tests.Silverlight.AllTests), typeof(Linq.Tests.AllTests), typeof(Tests.Common.AllTests), typeof(Tests.CLI1.AllTests), typeof(Tests.CLI2.AllTests), }; InitializeVersion(); new TestRunner(SilverlightSuite(testCases)).Run(new SilverlightTestListener(Dispatcher)); Complete(); } catch(Exception ex) { AppendException(ex); } } private void InitializeVersion() { var version = Environment.Version.ToString(); Dispatcher.BeginInvoke(() => HtmlPage.Window.Eval(string.Format("initialize('{0}');", version))); } private void Complete() { Dispatcher.BeginInvoke(() => HtmlPage.Window.Eval("completed();")); } private void AppendException(Exception exception) { Dispatcher.BeginInvoke(() => HtmlPage.Window.Eval("appendException(\"" + exception.ToJScriptString() + "\");")); } private static Db4oTestSuiteBuilder SilverlightSuite(params Type[] testCases) { return new Db4oTestSuiteBuilder(new SilverlightFixture(), testCases); } private void OnIncreaseDiskQuotaClick(object sender, System.Windows.RoutedEventArgs e) { var isolatedStorageManager = IsolatedStorageFile.GetUserStoreForApplication(); isolatedStorageManager.IncreaseQuotaTo(1024*1024*100); } } } ././@LongLink0000000000000000000000000000016100000000000011563 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/App.xamldb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000050011520622042032641 0ustar directhexdirecthex ././@LongLink0000000000000000000000000000017500000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/JScriptExtensions.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000171111520622624032654 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ namespace Db4objects.Db4o.Silverlight.TestStart { public static class JScriptExtensions { public static string ToJScriptString(this object value) { return value.ToString() .Replace("\"", @"\\""") .Replace("\r", @"\r") .Replace("\n", @"\n"); } } } ././@LongLink0000000000000000000000000000016400000000000011566 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/App.xaml.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000347011520622624032660 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Diagnostics; using System.Windows; using System.Windows.Browser; namespace Db4objects.Db4o.Silverlight.TestStart { public partial class App { public App() { Startup += Application_Startup; UnhandledException += Application_UnhandledException; InitializeComponent(); } private void Application_Startup(object sender, StartupEventArgs e) { RootVisual = new MainPage(); } private static void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) { if (!Debugger.IsAttached) { MessageBox.Show(e.ToString()); e.Handled = true; Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); }); } } private static void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) { try { string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace; errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n"); HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); } catch (Exception) { } } } } ././@LongLink0000000000000000000000000000020300000000000011560 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/SilverlightTestListener.csdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000700211520622624032653 0ustar directhexdirecthex/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2010 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Browser; using System.Windows.Threading; using Db4oUnit; namespace Db4objects.Db4o.Silverlight.TestStart { public class SilverlightTestListener : ITestListener { public SilverlightTestListener(Dispatcher dispatcher) { _dispatcher = dispatcher; } public void RunStarted() { Run("append", "Tests started..."); _startTime = DateTime.Now; } public void TestStarted(ITest test) { NewTest(test.Label()); } public void TestFailed(ITest test, Exception failure) { _failures.Add(new TestFailure(test.Label(), failure)); MarkLastAsError(); } public void Failure(String msg, Exception failure) { _failures.Add(new TestFailure(msg, failure)); } public void RunFinished() { AppendTestsResult(); Append(FailuresMessage()); } private void Append(string message) { Run("append", message); } private void AppendTestsResult() { Run("appendTestsResult", DateTime.Now.Subtract(_startTime).TotalSeconds); } private void NewTest(string message) { _latestAppended = Run("newTest", message); } private static string RemoveExtraCommaAtStart(string arguments) { return arguments.Remove(0, 1); } private void Dispatch(Action action) { _dispatcher.BeginInvoke(action); } private void MarkLastAsError() { _dispatcher.BeginInvoke(() => HtmlPage.Window.Invoke("markAsFailure", _latestAppended)); } private string FailuresMessage() { int count = 1; return _failures.Aggregate(new StringBuilder(), (acc, failure) => acc.AppendFormat("{0}) {1} {2}

", count++, failure.TestLabel, failure.Reason)).Replace("\r\n", "
").ToJScriptString(); } private object Run(string functionName, params object[] args) { Dispatch(delegate { string code = functionName + "(" + ToStringArgumentList(args) + ");"; object result = HtmlPage.Window.Eval(code); if (result != null) { _latestAppended = result; } }); return _latestAppended; } private static string ToStringArgumentList(IEnumerable objects) { string arguments = objects.Aggregate("", (acc, current) => acc + "," + AddQuotes(RemoveInternalQuotes(current.ToJScriptString()))); return RemoveExtraCommaAtStart(arguments); } private static string RemoveInternalQuotes(string source) { return source.Replace('"', '\''); } private static string AddQuotes(object item) { return "\"" + item + "\""; } private object _latestAppended; private DateTime _startTime; private readonly IList _failures = new List(); private readonly Dispatcher _dispatcher; } } ././@LongLink0000000000000000000000000000016600000000000011570 Lustar rootrootdb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestStart/MainPage.xamldb4o-8.0.184.15484+dfsg/src/Db4objects.Db4o.Silverlight.TestStart/Db4objects.Db4o.Silverlight.TestSt0000644000175000017500000000101011520622042032636 0ustar directhexdirecthex