pax_global_header00006660000000000000000000000064117343765350014530gustar00rootroot0000000000000052 comment=713a4d948cf7d86daf681aab3c28aa0fdd9847d3 technomancy-leiningen-713a4d9/000077500000000000000000000000001173437653500163445ustar00rootroot00000000000000technomancy-leiningen-713a4d9/.gitattributes000066400000000000000000000001341173437653500212350ustar00rootroot00000000000000#disable autocrlf for all .bat files since they already have CRLF in raw format *.bat -crlf technomancy-leiningen-713a4d9/.gitignore000066400000000000000000000003731173437653500203370ustar00rootroot00000000000000test_projects/*/lib test_projects/*/classes/ test_projects/*/nomnomnom*.jar test_projects/sample/pom.xml classes/ lib/ leiningen*.jar lein-swank/lein-swank*.jar autodoc/ bin/nom .lein-failures /lein.man /scratch.clj .lein-deps-sum .lein-plugins /wiki technomancy-leiningen-713a4d9/.travis.yml000066400000000000000000000002141173437653500204520ustar00rootroot00000000000000--- script: bin/lein self-install; bin/lein test branches: only: - 1.x - master notifications: irc: "irc.freenode.org#leiningen"technomancy-leiningen-713a4d9/COPYING000066400000000000000000000257641173437653500174150ustar00rootroot00000000000000Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor tocontrol, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of Washington and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. technomancy-leiningen-713a4d9/NEWS.md000066400000000000000000000325241173437653500174500ustar00rootroot00000000000000# Leiningen News -- history of user-visible changes ## 1.7.1 / 2012-03-27 * Fix a bug where the repl task left JVM processes running. * Make upgrade task accept arbitrary versions. * Fix a bug where javac classes would get removed before AOT compilation. * Allow :aot to contain both symbols and regexes. (Dan Lidral-Porter) * Fix bug where clean task would be incredibly slow. * Apply :jvm-opts with :eval-in-leiningen. * Prevent misbehaving plugins from pulling in conflicting Clojure versions. ## 1.7.0 / 2012-02-06 * Allow any task to perform trampolining. * Fix a bug where JVM_OPTS with spaces would cause failures. * Keep pom dependencies off the classpath. * Block plugins from erroneously including their own Clojure version. * Allow poms to set parent element. (Nelson Morris) * Support emitting Maven extensions in pom. (Max Penet) * Allow faster booting on 64-bit JVMs with tiered compilation. * Fix a bug where shell wrappers had the wrong classpath. (Tavis Rudd) * Exclude all signature files from uberjars. (Tim McCormack) * Allow test selectors to apply to entire namespaces. (Kevin Downey) * Use LEIN_JAVA_CMD to allow different JVM for Leiningen itself. (Tavis Rudd) * Honor :plugins key inside project.clj. * Accept :repl-init namespace as argument to repl task. * Allow :java-source-path to be nested inside :source-path. (Anthony Grimes) * Fix a bug where native deps weren't made available. (Anthony Grimes) ## 1.6.2 / 2011-11-11 * Let run task work with main functions from Java classes. * Fix bug where exceptions would break interactive task. * Default to Clojure 1.3.0 for new projects. * Allow Leiningen home to exist inside project directory. (Heinz N. Gies) * Remove old versions of plugins when upgrading. * Add user-level :deploy-repositories list. (Michał Marczyk) * Fix a bug where class files from proxy objects weren't considered part of the project. (Stephen Compall) * Make deps cause implicit clean to avoid AOT version mismatches. * Include Java source files in jar. (Nathan Marz) * Add separate :deploy-repositories list. (Chas Emerick) * Maintain order in repositories list. (Colin Jones) * Fix a bug where :omit-default-repos wouldn't skip Maven Central. (Chas Emerick) * Make deps extract native dependencies for all architectures, not just current. * Fix page count on search results. * Fix a bug where "lein plugin install" could skip dependencies. * Reimplement eval-in-project to use clojure.java.shell instead of Ant. * Separate LEIN\_JVM\_OPTS from JVM_OPTS. ## 1.6.1.1 / 2011-09-06 * Turn off workaround for Clojure's agent thread pool keeping the JVM alive by default. Use :shutdown-agents in project.clj to enable it. ## 1.6.1 / 2011-07-06 * Allow alternate main namespace to be used during uberjar creation. * Add :checkout-deps-shares to share more directories in checkout dependencies. * Fix a bug where agent thread pool would be shut down in repl task. * Support :project-init in project.clj to allow pprint to be used in :repl-options. * Fix a bug where tests would not run using Clojure 1.3. * Support for .classpath file to include context specific classpath elements. ## 1.6.0 / 2011-06-29 * Enforce project names as readable symbols. * Add trampoline task. * Fix a bug where plugins would be unavailable in MinGW. * Allow functions other than -main to be called using run task. * Support constructing classpath out of ~/.m2 instead of copying to lib/. * Fix a bug where help output could be truncated by plugin issues. * Support native dependencies. * Test selectors no longer require additional hooke dependency. * Add retest task. * Add search task. * Remove deprecated build.clojure.org repositories. * Remove user/\*classpath\* var. * Support :extra-classpath-dirs in project.clj. ## 1.5.2 / 2011-04-13 * Check rlwrap for support of custom quotes before using. * Improve Solaris support. (Donald Clark Jackson) * Fix curl error relating to missing $https_proxy. (Pirmin Fix) ## 1.5.1 / 2011-04-12 * Improve rlwrap quote support. (Ambrose Bonnaire-Sergeant) * Prevent ns load exceptions from halting help. * Fix :repl-init namespace handling. * Make deps for :eval-in-leiningen projects available to lein process. * Pass $https_proxy environment variable to curl. * Fix :eval-in-leiningen when used with init arg. * Pom now includes dev-dependencies as test-scoped. (Thomas Engelschmidt) * Fix handling of arguments with spaces. (Stuart Fehr) * Fix a plugin bug where it would look for dev-dependencies. * Fix :min-lein-version checking. (Colin Jones) * Honor user settings in more places. * Fix running-as-root warning. * Revert back to warning when repository checksums don't match. ## 1.5.0 / 2011-03-22 * New projects now use Clojure 1.2.1. * Honor per-repository :update/:checksum policies. * Allow some repositories to be releases/snapshots-only. * Honor global :exclusions. (Joe Gallo) * Honor :class-file-whitelist to make classes/ deletion more manageable. * Accept :repl-init namespace in project.clj. * Warn when falling back to jline if rlwrap is not found. * Add prepend-task macro for simple hook usage. * Add flexibility to clean task with :extra-files-to-clean and :regex-to-clean. * Fix bug in interactive task that would cause infinite loop. * Add version into shell wrapper template. * Add pcmpl-lein.el for eshell completion. * Skip fetching dependencies when they haven't changed in project.clj if :checksum-deps is set. * Add system property for $PROJECT.version. * Add deploy task. * Reload tests in interactive mode. * Make test! task accept namespace list as argument. (Joe Gallo) * Use current year in readme for project skeleton. (Joe Gallo) ## 1.4.2 / 2010-12-31 * Fix a bug where init to eval-in-project was ignored in interactive task. * Fix a bug in path calculation for native dependencies. (wburke) * Fix a bug where built-in tasks shadowed plugins (javac, run). * Allow a seq of regexes in :clean-non-project-classes for more flexibility. * Fix a bug where the first argument to run would be parsed wrong. (Alex Osborne) * Use JVM\_OPTS environment variable instead of JAVA\_OPTS, though the latter is still supported for backwards-compatibility. ## 1.4.1 / 2010-12-16 * Allow boosting :repl-retry-limit in project.clj for slow-starting projects. * Turn :clean-non-project-classes off by default. * Support :skip-aot metadata on :main in project.clj. * Alias :deps/:dev-deps to :dependencies/:dev-dependencies in project.clj. * Support setting clojure.debug property. * Don't allow stable versions to depend upon snapshots. * Fix exit code for chained tasks. ## 1.4.0 / 2010-12-02 * Support readme, tutorial, news, and copying in help task. * Show short help summaries in help task overview. * Keep project JVM running between task runs in interactive task. * Support :uberjar-exclusions as a seq of regexes in project.clj. * Support :repl-options in project.clj that get passed to clojure.main/repl. * Shell wrappers are installed on Windows. (Matjaz Gregoric) * Windows and Cygwin path fixes. (Matjaz Gregoric) * Solaris compatibility fixes. (Heinz Gies) * Deprecated :jar-dir in favour of :target-dir. * Deprecated unused eval-in-project arguments. (handler, skip-auto-compile) * Deprecated :namespaces and :test-resources-path in project.clj. * Delete non-project .class files after AOT compilation. (Luc Prefontaine) * Merge run task from lein-run plugin. (Siddhartha Reddy) * Improve subtask help output. (Colin Jones) * Support :eval-in-leiningen for easier testing of plugins. * Merge javac task from lein-javac plugin. (Antonio Garrote) * Add init argument to eval-in-project to help with the Gilardi Scenario. See http://technomancy.us/143 for details. * Fix bug involving repl I/O flushing. * Run subset of test suite using test selector predicates. * Specify what file patterns to exclude from jars. (Zehua Liu) * Sort and de-dupe help output. (Sergio Arbeo) * Add plugin task: easily install user-level plugins (Colin Jones, Michael Ivey) ## 1.3.1 / 2010-09-07 * Support regex matching in :aot list. (Alex Ott) * Run self-install automatically if uberjar is missing. * Fix bugs that caused standalone install task to fail. * Allow dependency type to be specified in project.clj. (John Sanda) * Stop jar/uberjar task if compile fails. (Alan Dipert) * Support :min-lein-version in project.clj so if a project uses newer Leiningen features it will warn users of old lein versions. (Isaac Hodes) * Fix a bug where tests would get skipped if their first form was not ns. * Fix a bug where "lein help" would hang if run from a dir with a large src/. * Fix a bug where repl task would hang on unreadable input. (Isaac Hodes) * Allow repl task to work outside project. (Colin Jones) * If curl/wget is found, self-install works on Windows. (Shantanu Kumar) * Fix bug causing standalone install task to fail. * Allow custom shell-wrappers. * Start repls in user ns if no :main is in project.clj. ## 1.3.0 / 2010-08-19 * Add :omit-source option to project.clj for shipping aot-only jars. * Make repl task listen on a socket as well as the command-line. * Write shell wrapper scripts at installation time. See TUTORIAL.md. * Put user-level plugins in ~/.lein/plugins on the classpath. * Load ~/.lein/init.clj on startup. * Execution of per-project initialization script, specified in :repl-init-script option. (Alex Ott) * Switch to /bin/sh instead of bash. (Mike Meyer) * Allow multiple tasks to be chained from the command-line. (Colin Jones) * Add test! task that cleans and does deps before testing. * Add interactive task for entering tasks in a shell-like environment. * Work around argument escaping bug on Windows. (Laurence Hygate) * Require hooks to be specified in project.clj. * Detect download failures in self-install. * Add resources and test-resources paths to pom. (Brian Weber) * Fix bug causing crash if OS name wasn't recognized. * Improve AOT staleness determination heuristic. * Fix bug where uberjar left out dependencies for non-AOT'd projects. (Alex Ott) ## 1.2.0 / 2010-07-18 * Don't enable repl rlwrap when unnecessary. (dumb terms, Emacs, etc.) * Add support for password-protected repositories. * Allow :jar-name and :uberjar-name to be customized. * Allow unquoting in defproject form. * Support classifiers in dependencies. * Clean before running uberjar task. * Implicitly clean lib/ before running deps. * Add support for test-resources directory. * Fix help output that AOT sometimes drops. * Clear out lib/dev on lein clean even if :library-path is customized. * Some tasks suppress useless output. * Snapshot versions now allow self-install. * Allow compile task to take a list of namespaces overriding project.clj. * Handle more types of project metadata. * Add plugin creation guide. * Include arglists in help output. * Make lein script usable from any subdirectory in the project root. * Fix repl task to work with forked subprocess. * Fork subprocess unconditionally for greater compatibility. * Allow $JAVA_CMD to be customized. * Fix a bug causing everything to recompile in tests. Thanks, Stuart! * Fix exit code for test runs. * Automatically compile and fetch deps when needed. * Allow :jvm-opts and :warn-on-reflection to be set in project.clj. * Merge lein-swank plugin into swank-clojure. * Add :aot as an alias in project.clj for :namespaces to AOT-compile. * Add option to omit-default-repositories. * Allow group-id to be omitted when depending on Clojure and Contrib. * Keep dev-dependencies in lib/dev, exclude them from uberjars. * Include version numbers in jar filenames. * Fix repl task to use project subclassloader. * Don't allow "new" task to create *jure names. * Add classpath command. * Implement Checkout Dependencies. See README. * Add option to symlink deps into lib/ instead of copying. * Fixed bug for file timestamps inside jars. * Generated poms should work in Java IDEs. * Improved Cygwin support. * Added TUTORIAL.md file for introductory concepts. ## 1.1.0 / 2010-02-16 * Added "lein upgrade" task * Don't download snapshot releases unless actually needed. * Make subclassloader's classpath available to projects. * Fixed "install" task to place pom in local repository. * Bug fixes to "new" task. * Only AOT-compile namespaces specified in project.clj. * Better error handling. * Add exclusions support for dependencies. * Support dependencies with native code. * Added experimental Windows support. ## 1.0.1 / 2009-12-10 * Added bash completion. * Honor $JAVA_OPTS. * Fix new task. * Add version task. * Use jline for repl task. * Fix pom task for Java 1.5 compatibility. ## 1.0.0 / 2009-12-05 * Source, test, and compilation paths can be set in project.clj. * Project code runs in an isolated classloader; can now compile/test projects that require a different version of Clojure from Leiningen. (Does not support 1.0's test-is yet.) * Install task no longer requires maven to be installed. * Only compile namespaces whose .class files are older than .clj files. * Add "new" task for generating blank projects. * Set tag when generating pom.xml. * Include pom.xml, pom.properties, and more detailed manifest in jars. * Summarize pass/fail counts from test runs across all namespaces. * Accept a list of namespaces for test task rather than testing all. * Create $PROJECT-standalone.jar file from uberjar to distinguish from regular jar files. * Plugins have more flexibility to set the classpath and other arguments for running project code. * Add resources/ directory to classpath and generated jars. * Start Leiningen faster by using -Xbootclasspath argument. ## 0.5.0 / 2009-11-17 * Initial release! technomancy-leiningen-713a4d9/README.md000066400000000000000000000300571173437653500176300ustar00rootroot00000000000000# Leiningen > "Leiningen!" he shouted. "You're insane! They're not creatures you can > fight--they're an elemental--an 'act of God!' Ten miles long, two > miles wide--ants, nothing but ants! And every single one of them a > fiend from hell..." > -- from Leiningen Versus the Ants by Carl Stephenson Leiningen is for automating Clojure projects without setting your hair on fire. Leiningen logo Working on Clojure projects with tools designed for Java can be an exercise in frustration. With Leiningen, you just write Clojure. ## Installation Leiningen bootstraps itself using the `lein` shell script; there is no separate install script. It installs its dependencies upon the first run on unix, so the first run will take longer. 1. [Download the script](https://raw.github.com/technomancy/leiningen/stable/bin/lein). 2. Place it on your path. (I like to use `~/bin`) 3. Set it to be executable. (`chmod 755 ~/bin/lein`) On Windows most users can get [the batch file](https://raw.github.com/technomancy/leiningen/stable/bin/lein.bat). If you have wget.exe or curl.exe already installed and in PATH, you can just run `lein self-install`, otherwise get the standalone jar from the [downloads page](https://github.com/technomancy/leiningen/downloads). If you have [Cygwin](http://www.cygwin.com/) you should be able to use the shell script above rather than the batch file. ## Usage The [tutorial](https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md) has a detailed walk-through of the steps involved in creating a new project, but here are the commonly-used tasks: $ lein new NAME # generate a new project skeleton $ lein test [TESTS] # run the tests in the TESTS namespaces, or all tests $ lein repl # launch an interactive REPL session and socket server $ lein jar # package up the whole project as a .jar file $ lein install [NAME VERSION] # install a project $ lein search ... # find recent jars for your project.clj dependencies Use `lein help` to see a complete list. `lein help $TASK` shows the usage for a specific one. You can also chain tasks together in a single command by using commas: $ lein clean, test foo.test-core, jar Most tasks need to be run from somewhere inside a project directory to work, but some (`new`, `help`, `version`, `plugin`, and the two-argument version of `install`) may run from anywhere. The install task places shell scripts in the `~/.lein/bin` directory for projects that include them, so if you want to take advantage of this, you should put it on your `$PATH`. ## Configuration The `project.clj` file in the project root should look like this: ```clojure (defproject myproject "0.5.0-SNAPSHOT" :description "A project for doing things." :url "http://github.com/technomancy/myproject" :dependencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure-contrib "1.2.0"]] :dev-dependencies [[lein-ring "0.4.5"]]) ``` If you're looking for the most recent jar of one of your dependencies, use `lein search`. The `lein new` task generates a project skeleton with an appropriate starting point from which you can work. See the [sample.project.clj](https://github.com/technomancy/leiningen/blob/stable/sample.project.clj) file for a detailed listing of configuration options. You can also have user-level configuration that applies for all projects. The `~/.lein/init.clj` file will be loaded every time Leiningen launches; any arbitrary code may go there. This code is executed inside Leiningen itself, not in your project. Set the `:repl-init` key in project.clj to point to a namespace if you want code executed inside your project. ## Leiningen Plugins Leiningen supports plugins. See [the plugins wiki page](https://github.com/technomancy/leiningen/wiki/Plugins) for a full list. If a plugin is needed for successful test or build runs, (such as lein-tar) then it should be added to `:dev-dependencies` in project.clj, but if it's for your own convenience (such as swank-clojure) then it should be added using the `plugin` task: $ lein plugin install lein-clojars "0.6.0" See the plugin task's help for more information. $ lein plugin help ## FAQ **Q:** How do you pronounce Leiningen? **A:** It's LINE-ing-en. ['laɪnɪŋən] **Q:** What does this offer over [Lancet](https://github.com/stuarthalloway/lancet)? **A:** Lancet is more of a library than a build tool. It doesn't predefine any tasks apart from what Ant itself offers, so there is nothing Clojure-specific in it. Leiningen builds on Lancet, but takes things further. In addition, it includes some Maven functionality for dependencies. **Q:** But Maven is terrifying! **A:** That's not a question. Anyway, Leiningen only uses the dependency resolution parts of Maven, which are quite tame. For some other build-related functionality it uses Ant under the covers via Lancet. **Q:** But Ant is terrifying! **A:** That's [true](http://www.defmacro.org/ramblings/lisp.html). Ant is an interpreter for a [procedural language with a regrettable syntax](http://blogs.tedneward.com/2005/08/22/When+Do+You+Use+XML+Again.aspx). But if you treat it as a standard library of build-related functions and are able to write it with a more pleasing syntax, it's not bad. **Q:** What's a group ID? How do snapshots work? **A:** See the [tutorial](https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md) for background. **Q:** How should I pick my version numbers? **A:** Use [semantic versioning](http://semver.org). **Q:** It says a required artifact is missing for "super-pom". What's that? **A:** The Maven API that Leiningen uses refers to your project as "super-pom". It's just a quirk of the API. It probably means there is a typo in your :dependency declaration in project.clj. **Q:** What if my project depends on jars that aren't in any repository? **A:** The [deploy guide](https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md) explains how to set up a private repository. If you are not sharing them with a team you could also just [install locally.](https://github.com/kumarshantanu/lein-localrepo) **Q:** How do I write my own tasks? **A:** If it's a task that may be useful to more than just your project, you should make it into a [plugin](https://github.com/technomancy/leiningen/blob/stable/doc/PLUGINS.md). You can also include one-off tasks in your src/leiningen/ directory if they're not worth spinning off; the plugin guide shows how. **Q:** I want to hack two projects in parallel, but it's annoying to switch between them. **A:** If you create a directory called `checkouts` in your project root and symlink some other project roots into it, Leiningen will allow you to hack on them in parallel. That means changes in the dependency will be visible in the main project without having to go through the whole install/switch-projects/deps/restart-repl cycle, and the copy in `checkouts` will take precedence over the dependency declared in project.clj. Note that this is not a replacement for listing the project in `:dependencies`; it simply supplements that for convenience. You can run `lein classpath` to see how the addition of the checkouts affects the project's classpath. **Q:** Is it possible to exclude indirect dependencies? **A:** Yes. Some libraries, such as log4j, depend on projects that are not included in public repositories and unnecessary for basic functionality. Projects listed as `:dependencies` may exclude any of their dependencies by using the `:exclusions` key. See `sample.project.clj` for details. **Q:** What does `java.lang.NoSuchMethodError: clojure.lang.RestFn.(I)V mean?` **A:** It means you have some code that was AOT (ahead-of-time) compiled with a different version of Clojure than the one you're currently using. If it persists after running `lein clean` then it is a problem with your dependencies. Note that for your own project that AOT compilation in Clojure is much less important than it is in other languages. There are a few language-level features that must be AOT-compiled to work, generally for Java interop. If you are not using any of these features, you should not AOT-compile your project if other projects may depend upon it. **Q:** I'm behind an HTTP proxy; how can I fetch my dependencies? **A:** Currently you need to configure the underlying Maven library by creating `~/.m2/settings.xml` as explained in the [Maven guide](http://maven.apache.org/guides/mini/guide-proxies.html). **Q:** What can be done to speed up launch? **A:** The main delay involved in Leiningen comes from starting the JVM. Launching `lein interactive` will give you an interactive session so you can run many tasks against the same process instead of launching a new one every time. Depending on your editor you may also be able to take advantage of its Clojure integration. (See [swank-clojure](http://github.com/technomancy/swank-clojure) or [VimClojure](https://bitbucket.org/kotarak/vimclojure), for example.) **Q:** Still too slow; what else can make startup faster? **A:** There are two flavours of the JVM, client and server. The server is optimized for long-running processes and has quite a poor startup time. Leiningen will try to launch a client JVM, but this only works on 32-bit JVM installations. If you are on a 64-bit machine you can still use a client JVM if you install 32-bit packages; on Debian try ia32-sun-java6-bin. Once you've installed it, run `sudo update-java-alternatives -s ia32-java-6-sun`. It is possible to use a 32-bit JVM for the `lein` process while using a 64-bit JVM for sub-processes such as swank-clojure, by setting the environment variable LEIN_JAVA_CMD to the path of your 32-bit java binary and the JAVA_CMD env variable to the path of the 64-bit version. **Q:** I don't have access to stdin inside my project. **A:** This is a limitation of the JVM's process-handling methods; none of them expose stdin correctly. This means that functions like `read-line` will not work as expected in most contexts, though the `repl` task necessarily includes a workaround. You can also use the `trampoline` task to launch your project's JVM after Leiningen's has exited rather than launching it as a subprocess. ## Contributing Please report issues on the [Github issue tracker](https://github.com/technomancy/leiningen/issues) or the [mailing list](http://groups.google.com/group/leiningen). Personal email addresses are not appropriate for bug reports. See the file HACKING.md for more details on how Leiningen's codebase is structured. ## Building You don't need to "build" Leiningen per se, but when you're using a checkout you will need to get its dependencies in place. In most cases a `lein self-install` will usually get you what you need. However, this will occasionally fail for very new SNAPSHOT versions since the standalone jar will not have been uploaded yet. Alternatively if you have a copy of an older Leiningen version around (at least 1.1.0, installed as lein-stable, for example), then you can run `lein-stable deps` in your checkout. If Leiningen's dependencies change it will be necessary to remove the lib/ directory entirely before running `lein deps` again. (This is not necessary for most projects, but Leiningen has unique bootstrapping issues when working on itself.) You can also use Maven, just for variety's sake: $ mvn dependency:copy-dependencies $ mv target/dependency lib Symlink `bin/lein` from your checkout into a location on the $PATH. The script can figure out when it's being called from inside a checkout and use the checkout rather than the self-install uberjar if necessary. ## License Copyright © 2009-2011 Phil Hagelberg, Alex Osborne, Dan Larkin, and [other contributors](https://www.ohloh.net/p/leiningen/contributors). Thanks to Stuart Halloway for Lancet and Tim Dysinger for convincing me that good builds are important. Distributed under the Eclipse Public License, the same as Clojure uses. See the file COPYING. technomancy-leiningen-713a4d9/TUTORIAL.md000066400000000000000000000001341173437653500201270ustar00rootroot00000000000000The [tutorial has moved](https://github.com/technomancy/leiningen/blob/stable/TUTORIAL.md)! technomancy-leiningen-713a4d9/bash_completion.bash000066400000000000000000000023661173437653500223600ustar00rootroot00000000000000_lein_completion() { local cur prev tasks COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" tasks="classpath clean compile deploy deps help install interactive jar javac new plugin pom repl run swank test test! uberjar version" case "${prev}" in classpath | clean | compile | deploy | deps | install | interactive | jar | javac | new | plugin | pom | repl | swank | uberjar | version) COMPREPLY=() ;; help) # Show tasks again, but only once; don't infinitely recurse local prev2="${COMP_WORDS[COMP_CWORD-2]}" if [ "$prev2" == "help" ]; then COMPREPLY=() else COMPREPLY=( $(compgen -W "${tasks}" -- ${cur}) ) fi ;; run | test | test!) # list project's test namespaces: local namespaces=$(find test/ -type f -name "*.clj" -exec grep -E \ '^\(ns[[:space:]]+\w+' '{}' ';' | sed -n 's/(ns[ ]*//p') COMPREPLY=( $(compgen -W "${namespaces}" -- ${cur}) ) ;; lein) COMPREPLY=( $(compgen -W "${tasks}" -- ${cur}) ) ;; esac return 0 } complete -F _lein_completion lein technomancy-leiningen-713a4d9/bin/000077500000000000000000000000001173437653500171145ustar00rootroot00000000000000technomancy-leiningen-713a4d9/bin/lein000077500000000000000000000232611173437653500177750ustar00rootroot00000000000000#!/bin/bash export LEIN_VERSION="1.7.1" case $LEIN_VERSION in *SNAPSHOT) SNAPSHOT="YES" ;; *) SNAPSHOT="NO" ;; esac # Make sure classpath is in unix format for manipulating, then put # it back to windows format when we use it if [ "$OSTYPE" = "cygwin" ] && [ "$CLASSPATH" != "" ]; then CLASSPATH=`cygpath -up $CLASSPATH` fi if [ `whoami` = "root" ] && [ "$LEIN_ROOT" = "" ]; then echo "WARNING: You're currently running as root; probably by accident." echo "Press control-C to abort or Enter to continue as root." echo "Set LEIN_ROOT to disable this warning." read _ fi NOT_FOUND=1 ORIGINAL_PWD="$PWD" while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ] do cd .. if [ "$(dirname "$PWD")" = "/" ]; then NOT_FOUND=0 cd "$ORIGINAL_PWD" fi done if [ "$LEIN_HOME" = "" ]; then if [ -d "$PWD/.lein" ] && [ "$PWD" != "$HOME" ]; then echo "Leiningen is running in bundled mode." export LEIN_HOME="$PWD/.lein" else export LEIN_HOME="$HOME/.lein" fi fi DEV_PLUGINS="$(ls -1 lib/dev/*jar .lein-plugins/*jar 2> /dev/null)" USER_PLUGINS="$(ls -1 "$LEIN_HOME"/plugins/*jar 2> /dev/null)" artifact_name () { which rev > /dev/null if [ $? -eq 0 ]; then echo "$1" | sed -e "s/.*\/\(.*\)/\1/" | \ rev | sed -e "s/raj[-[:digit:].]*-\(.*\)/\1/" | rev else echo "$1" fi } unique_user_plugins () { saveIFS="$IFS" IFS="$(printf '\n\t')" plugins="$(echo "$DEV_PLUGINS"; echo "$USER_PLUGINS")" artifacts="$(for i in $plugins; do echo "$(artifact_name "$i")"; done)" duplicates="$(echo "$artifacts" | sort | uniq -d)" if [ -z "$duplicates" ]; then echo "$USER_PLUGINS" else for i in $USER_PLUGINS; do artifact="$(artifact_name "$i")" if ! echo "$duplicates" | grep -xq "$artifact"; then echo "$i" fi done fi IFS="$saveIFS" } LEIN_PLUGIN_PATH="$(echo "$DEV_PLUGINS" | tr \\n :)" LEIN_USER_PLUGIN_PATH="$(echo "$(unique_user_plugins)" | tr \\n :)" CLASSPATH="$CLASSPATH:$LEIN_PLUGIN_PATH:$LEIN_USER_PLUGIN_PATH:test/:src/:resources/" LEIN_JAR="$LEIN_HOME/self-installs/leiningen-$LEIN_VERSION-standalone.jar" CLOJURE_JAR="$HOME/.m2/repository/org/clojure/clojure/1.2.1/clojure-1.2.1.jar" NULL_DEVICE=/dev/null # apply context specific CLASSPATH entries if [ -f .lein-classpath ]; then CLASSPATH="`cat .lein-classpath`:$CLASSPATH" fi # normalize $0 on certain BSDs if [ "$(dirname "$0")" = "." ]; then SCRIPT="$(which $(basename "$0"))" else SCRIPT="$0" fi # resolve symlinks to the script itself portably while [ -h "$SCRIPT" ] ; do ls=`ls -ld "$SCRIPT"` link=`expr "$ls" : '.*-> \(.*\)$'` if expr "$link" : '/.*' > /dev/null; then SCRIPT="$link" else SCRIPT="$(dirname "$SCRIPT"$)/$link" fi done BIN_DIR="$(dirname "$SCRIPT")" if [ -r "$BIN_DIR/../src/leiningen/core.clj" ]; then # Running from source checkout LEIN_DIR="$(dirname "$BIN_DIR")" LEIN_LIBS="$(find -H "$LEIN_DIR/lib" -mindepth 1 -maxdepth 1 -print0 2> /dev/null | tr \\0 \:)" CLASSPATH="$CLASSPATH:$LEIN_LIBS:$LEIN_DIR/src:$LEIN_DIR/classes:$LEIN_DIR/resources:$LEIN_JAR" if [ "$LEIN_LIBS" = "" -a "$1" != "self-install" -a ! -r "$LEIN_JAR" ]; then echo "Leiningen is missing its dependencies. Please see \"Building\" in the README." exit 1 fi else # Not running from a checkout CLASSPATH="$CLASSPATH:$LEIN_JAR" if [ ! -r "$LEIN_JAR" -a "$1" != "self-install" ]; then "$0" self-install fi fi HTTP_CLIENT="wget --no-check-certificate -O" if type -p curl >/dev/null 2>&1; then if [ "$https_proxy" != "" ]; then CURL_PROXY="-x $https_proxy" fi HTTP_CLIENT="curl $CURL_PROXY --insecure -f -L -o" fi # If we don't have Leiningen's own Clojure on the bootclasspath, boot # will be slower, and versions of Clojure in :dev-dependencies can # take precedence. if [ ! -r "$CLOJURE_JAR" ]; then CLOJURE_JAR_URL=http://build.clojure.org/releases/org/clojure/clojure/1.2.1/clojure-1.2.1.jar CLOJURE_HASH="be088d20c078ce48d42afba05984f1ef7c02142b" mkdir -p "$(dirname $CLOJURE_JAR)" $HTTP_CLIENT $CLOJURE_JAR $CLOJURE_JAR_URL if [ "`shasum -a 1 $CLOJURE_JAR | cut -f 1 -d \" \"`" != "$CLOJURE_HASH" ]; then echo "WARNING: Clojure jar failed to download from $CLOJURE_JAR_URL" fi fi export JAVA_CMD=${JAVA_CMD:-"java"} export LEIN_JAVA_CMD=${LEIN_JAVA_CMD:-$JAVA_CMD} # Support $JAVA_OPTS for backwards-compatibility. export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}" export LEIN_JVM_OPTS=${LEIN_JVM_OPTS:-$JVM_OPTS} # TODO: investigate http://skife.org/java/unix/2011/06/20/really_executable_jars.html # If you're packaging this for a package manager (.deb, homebrew, etc) # you need to remove the self-install and upgrade functionality. if [ "$1" = "self-install" ]; then if [ -r "$LEIN_JAR" ]; then echo "The self-install jar already exists at $LEIN_JAR." echo "If you wish to re-download, delete it and rerun \"$0 self-install\"." exit 1 fi echo "Downloading Leiningen now..." LEIN_DIR=`dirname "$LEIN_JAR"` mkdir -p "$LEIN_DIR" LEIN_URL="https://github.com/downloads/technomancy/leiningen/leiningen-$LEIN_VERSION-standalone.jar" $HTTP_CLIENT "$LEIN_JAR" "$LEIN_URL" if [ $? != 0 ]; then echo "Failed to download $LEIN_URL" if [ $SNAPSHOT = "YES" ]; then echo "If you have Maven installed, you can do" echo "mvn dependency:copy-dependencies; mv target/dependency lib" echo "See README.md for further SNAPSHOT build instructions." fi rm $LEIN_JAR 2> /dev/null exit 1 fi elif [ "$1" = "upgrade" ]; then if [ "$LEIN_DIR" != "" ]; then echo "The upgrade task is not meant to be run from a checkout." exit 1 fi if [ $SNAPSHOT = "YES" ]; then echo "The upgrade task is only meant for stable releases." echo "See the \"Hacking\" section of the README." exit 1 fi if [ ! -w "$SCRIPT" ]; then echo "You do not have permission to upgrade the installation in $SCRIPT" exit 1 else TARGET_VERSION="${2:-"stable"}" echo "The script at $SCRIPT will be upgraded to the latest $TARGET_VERSION version." echo -n "Do you want to continue [Y/n]? " read RESP case "$RESP" in y|Y|"") echo echo "Upgrading from $LEIN_VERSION..." TARGET="/tmp/lein-$$-upgrade" LEIN_SCRIPT_URL="https://github.com/technomancy/leiningen/raw/$TARGET_VERSION/bin/lein" $HTTP_CLIENT "$TARGET" "$LEIN_SCRIPT_URL" \ && mv "$TARGET" "$SCRIPT" \ && chmod +x "$SCRIPT" \ && echo && "$SCRIPT" self-install && echo && echo "Now running" `$SCRIPT version` exit $?;; *) echo "Aborted." exit 1;; esac fi else if [ "$OSTYPE" = "cygwin" ]; then # When running on Cygwin, use Windows-style paths for java CLOJURE_JAR=`cygpath -w "$CLOJURE_JAR"` ORIGINAL_PWD=`cygpath -w "$ORIGINAL_PWD"` CLASSPATH=`cygpath -wp "$CLASSPATH"` NULL_DEVICE=NUL fi if [ $DEBUG ]; then echo $CLASSPATH echo $CLOJURE_JAR fi JLINE="" if [ -z $INSIDE_EMACS ] && [ "$TERM" != "dumb" ]; then # Use rlwrap if it's available, otherwise fall back to JLine RLWRAP=`which rlwrap` if [ ! -x "$RLWRAP" ] || [ "$RLWRAP" = "" ]; then if [ ! -r "$LEIN_HOME/.jline-warn" ]; then echo "Using JLine for console I/O; install rlwrap for optimum experience." touch "$LEIN_HOME/.jline-warn" fi RLWRAP="" JLINE=jline.ConsoleRunner if [ "$OSTYPE" = "cygwin" ]; then JLINE="-Djline.terminal=jline.UnixTerminal jline.ConsoleRunner" CYGWIN_JLINE=y fi else # Test to see if rlwrap supports custom quote chars rlwrap -m -q '"' echo "hi" > /dev/null 2>&1 if [ $? -eq 0 ]; then RLWRAP="$RLWRAP -r -m -q '\"'" fi # see if there is a clojure-completion-file RLWRAP_CLJ_WORDS_FILE=${RLWRAP_CLJ_WORDS_FILE:-"${HOME}/.clj_completions"} RLWRAP_CLJ_WORDS_OPTION="" if [ -r "${RLWRAP_CLJ_WORDS_FILE}" ]; then RLWRAP_CLJ_WORDS_OPTION="-f ${RLWRAP_CLJ_WORDS_FILE}"; fi RLWRAP="${RLWRAP} $RLWRAP_OPTIONS -b \"(){}[],^%$#@\";:'\" ${RLWRAP_CLJ_WORDS_OPTION}" fi fi test $CYGWIN_JLINE && stty -icanon min 1 -echo TRAMPOLINE_FILE="/tmp/lein-trampoline-$$" if [ "$OSTYPE" = "cygwin" ]; then TRAMPOLINE_FILE=`cygpath -w $TRAMPOLINE_FILE` fi # The -Xbootclasspath argument is optional here: if the jar # doesn't exist everything will still work, it will just have a # slower JVM boot. ## TODO: -XX:+UseCompressedOops only works on 64 bit jvm # is there some way of detecting 64bit at this stage? - tavisrudd $RLWRAP $LEIN_JAVA_CMD \ -Xbootclasspath/a:"$CLOJURE_JAR" \ -client $LEIN_JVM_OPTS \ -XX:+TieredCompilation \ -Dleiningen.original.pwd="$ORIGINAL_PWD" \ -Dleiningen.trampoline-file=$TRAMPOLINE_FILE \ -cp "$CLASSPATH" \ $JLINE clojure.main \ -e "(use 'leiningen.core)(-main)" \ $NULL_DEVICE "$@" EXIT_CODE=$? if [ -r $TRAMPOLINE_FILE ]; then TRAMPOLINE="$(cat $TRAMPOLINE_FILE)" rm $TRAMPOLINE_FILE exec sh -c "exec $TRAMPOLINE" else test $CYGWIN_JLINE && stty icanon echo exit $EXIT_CODE fi fi technomancy-leiningen-713a4d9/bin/lein-pkg000066400000000000000000000105761173437653500205560ustar00rootroot00000000000000#!/bin/bash # This variant of the lein script is meant for downstream packagers. # It has all the cross-platform stuff stripped out as well as the # logic for running from checkouts and self-upgrading. export LEIN_VERSION="1.7.1" if [ `whoami` = "root" ] && [ "$LEIN_ROOT" = "" ]; then echo "WARNING: You're currently running as root; probably by accident." echo "Press control-C to abort or Enter to continue as root." echo "Set LEIN_ROOT to disable this warning." read _ fi # cd to the project root, if applicable NOT_FOUND=1 ORIGINAL_PWD="$PWD" while [ ! -r "$PWD/project.clj" ] && [ "$PWD" != "/" ] && [ $NOT_FOUND -ne 0 ]; do cd .. if [ "$(dirname "$PWD")" = "/" ]; then NOT_FOUND=0 cd "$ORIGINAL_PWD" fi done # Support $JAVA_OPTS for backwards-compatibility. export JAVA_CMD=${JAVA_CMD:-"java"} export JVM_OPTS="${JVM_OPTS:-"$JAVA_OPTS"}" export LEIN_JAVA_CMD=${LEIN_JAVA_CMD:-$JAVA_CMD} export LEIN_JVM_OPTS="${LEIN_JVM_OPTS:-"$JVM_OPTS"}" if [ "$LEIN_HOME" = "" ]; then if [ -d "$PWD/.lein" ] && [ "$PWD" != "$HOME" ]; then echo "Leiningen is running in bundled mode." export LEIN_HOME="$PWD/.lein" else export LEIN_HOME="$HOME/.lein" fi fi DEV_PLUGINS="$(ls -1 lib/dev/*jar .lein-plugins/*jar 2> /dev/null)" USER_PLUGINS="$(ls -1 "$LEIN_HOME"/plugins/*jar 2> /dev/null)" artifact_name () { echo "$1" | sed -e "s/.*\/\(.*\)/\1/" | \ rev | sed -e "s/raj[-[:digit:].]*-\(.*\)/\1/" | rev } unique_user_plugins () { saveIFS="$IFS" IFS="$(printf '\n\t')" plugins="$(echo "$DEV_PLUGINS"; echo "$USER_PLUGINS")" artifacts="$(for i in $plugins; do echo "$(artifact_name "$i")"; done)" duplicates="$(echo "$artifacts" | sort | uniq -d)" if [ -z "$duplicates" ]; then echo "$USER_PLUGINS" else for i in $USER_PLUGINS; do artifact="$(artifact_name "$i")" if ! echo "$duplicates" | grep -xq "$artifact"; then echo "$i" fi done fi IFS="$saveIFS" } LEIN_PLUGIN_PATH="$(echo "$DEV_PLUGINS" | tr \\n :)" LEIN_USER_PLUGIN_PATH="$(echo "$(unique_user_plugins)" | tr \\n :)" CLASSPATH="$CLASSPATH:$LEIN_PLUGIN_PATH:$LEIN_USER_PLUGIN_PATH:test/:src/:resources/" CLOJURE_JAR="/usr/share/java/clojure-1.2.jar:/usr/share/java/asm3.jar:/usr/share/java/asm3-commons.jar" # apply context specific CLASSPATH entries if [ -f .lein-classpath ]; then CLASSPATH="`cat .lein-classpath`:$CLASSPATH" fi SHARE_JARS="ant ant-launcher classworlds clojure-1.2 clojure-contrib \ lucene-memory maven-ant-tasks maven-artifact maven-artifact-manager \ maven-error-diagnostics maven-model maven-settings maven-project maven-profile \ maven-repository-metadata plexus-container-default-alpha plexus-interpolation \ plexus-utils wagon-file wagon-http-lightweight wagon-http-shared wagon-provider-api \ xml-apis lucene-core lucene-highlighter clucy robert-hooke lancet \ backport-util-concurrent" # NFI why that last one is necessary for JAR in $SHARE_JARS; do CLASSPATH="$CLASSPATH":"/usr/share/java/$JAR.jar" done # Do not use installed leiningen jar during self-compilation if ! { [ "$1" = "compile" ] && grep -qsE 'defproject leiningen[[:space:]]+"[[:digit:].]+"' \ project.clj ;}; then CLASSPATH="$CLASSPATH":/usr/share/java/leiningen-$LEIN_VERSION.jar fi if [ $DEBUG ]; then echo $CLASSPATH echo $CLOJURE_JAR fi # Use rlwrap if appropriate if ([ -z $INSIDE_EMACS ] && [ "$TERM" != "dumb" ]); then which rlwrap > /dev/null if [ $? -eq 0 ]; then RLWRAP="rlwrap -r -m -q '\"'" # custom quote chars fi RLWRAP_CLJ_WORDS_FILE=${RLWRAP_CLJ_WORDS_FILE:-"${HOME}/.clj_completions"} RLWRAP_CLJ_WORDS_OPTION="" if [ -r "${RLWRAP_CLJ_WORDS_FILE}" ]; then RLWRAP_CLJ_WORDS_OPTION="-f ${RLWRAP_CLJ_WORDS_FILE}"; fi RLWRAP="${RLWRAP} $RLWRAP_OPTIONS -b \"(){}[],^%$#@\";:'\" ${RLWRAP_CLJ_WORDS_OPTION}" fi TRAMPOLINE_FILE="/tmp/lein-trampoline-$$" $RLWRAP $LEIN_JAVA_CMD \ -Xbootclasspath/a:"$CLOJURE_JAR" \ -client $LEIN_JVM_OPTS \ -XX:+TieredCompilation \ -Dleiningen.original.pwd="$ORIGINAL_PWD" \ -Dleiningen.trampoline-file=$TRAMPOLINE_FILE \ -cp "$CLASSPATH" \ clojure.main -e "(use 'leiningen.core)(-main)" /dev/null "$@" EXIT_CODE=$? if [ -r $TRAMPOLINE_FILE ]; then TRAMPOLINE="$(cat $TRAMPOLINE_FILE)" rm $TRAMPOLINE_FILE exec sh -c "exec $TRAMPOLINE" else exit $EXIT_CODE fi technomancy-leiningen-713a4d9/bin/lein.bat000066400000000000000000000166511173437653500205440ustar00rootroot00000000000000@echo off set LEIN_VERSION=1.7.1 setLocal EnableExtensions EnableDelayedExpansion if "%LEIN_VERSION:~-9%" == "-SNAPSHOT" ( set SNAPSHOT=YES ) else ( set SNAPSHOT=NO ) set ORIGINAL_PWD=%CD% :: If ORIGINAL_PWD ends with a backslash (such as C:\), :: we need to escape it with a second backslash. if "%ORIGINAL_PWD:~-1%x" == "\x" set "ORIGINAL_PWD=%ORIGINAL_PWD%\" call :FIND_DIR_CONTAINING_UPWARDS project.clj if "%DIR_CONTAINING%" neq "" cd "%DIR_CONTAINING%" :: LEIN_JAR and LEIN_HOME variables can be set manually. if "x%LEIN_HOME%" == "x" ( if exist "%CD%\.lein" ( if /I NOT "%CD%"=="%USERPROFILE%" echo Running in bundled mode. set LEIN_HOME=%CD%\.lein ) else ( set LEIN_HOME=%USERPROFILE%\.lein ) ) if "x%LEIN_JAR%" == "x" set LEIN_JAR="!LEIN_HOME!\self-installs\leiningen-!LEIN_VERSION!-standalone.jar" if "%1" == "self-install" goto SELF_INSTALL if "%1" == "upgrade" goto NO_UPGRADE set DEV_PLUGINS=" for %%j in (".\lib\dev\*.jar") do ( set DEV_PLUGINS=!DEV_PLUGINS!;%%~fj ) set DEV_PLUGINS=!DEV_PLUGINS!" call :BUILD_UNIQUE_USER_PLUGINS set CLASSPATH="%CLASSPATH%";%DEV_PLUGINS%;%UNIQUE_USER_PLUGINS%;test;src;resources :: Apply context specific CLASSPATH entries set CONTEXT_CP= if exist ".lein-classpath" set /P CONTEXT_CP=<.lein-classpath if NOT "%CONTEXT_CP%"=="" set CLASSPATH="%CONTEXT_CP%";%CLASSPATH% if exist "%~f0\..\..\src\leiningen\core.clj" ( :: Running from source checkout. call :SET_LEIN_ROOT "%~f0\..\.." set LEIN_LIBS=" for %%j in ("!LEIN_ROOT!\lib\*") do set LEIN_LIBS=!LEIN_LIBS!;%%~fj set LEIN_LIBS=!LEIN_LIBS!" if "x!LEIN_LIBS!" == "x" if not exist %LEIN_JAR% goto NO_DEPENDENCIES set CLASSPATH=%CLASSPATH%;!LEIN_LIBS!;"!LEIN_ROOT!\src";"!LEIN_ROOT!\resources";%LEIN_JAR% ) else ( :: Not running from a checkout. if not exist %LEIN_JAR% goto NO_LEIN_JAR set CLASSPATH=%CLASSPATH%;%LEIN_JAR% ) if not "x%DEBUG%" == "x" echo CLASSPATH=%CLASSPATH% :: ################################################## if not "x%INSIDE_EMACS%" == "x" goto SKIP_JLINE if "%1" == "repl" goto SET_JLINE if "%1" == "interactive" goto SET_JLINE if "%1" == "int" goto SET_JLINE goto SKIP_JLINE :SET_JLINE set JLINE=jline.ConsoleRunner :SKIP_JLINE if "x%JAVA_CMD%" == "x" set JAVA_CMD="java" if "x%JVM_OPTS%" == "x" set JVM_OPTS=%JAVA_OPTS% set CLOJURE_JAR=%USERPROFILE%\.m2\repository\org\clojure\clojure\1.2.1\clojure-1.2.1.jar goto RUN :: Builds a classpath fragment consisting of user plugins :: which aren't already present as a dev dependency. :BUILD_UNIQUE_USER_PLUGINS call :BUILD_PLUGIN_SEARCH_STRING %DEV_PLUGINS% set UNIQUE_USER_PLUGINS=" for %%j in ("%LEIN_HOME%\plugins\*.jar") do ( call :MAKE_SEARCH_TOKEN %%~nj echo %PLUGIN_SEARCH_STRING%|findstr ;!SEARCH_TOKEN!; > NUL if !ERRORLEVEL! == 1 ( set UNIQUE_USER_PLUGINS=!UNIQUE_USER_PLUGINS!;%%~fj ) ) set UNIQUE_USER_PLUGINS=!UNIQUE_USER_PLUGINS!" goto EOF :: Builds a search string to match against when ensuring :: plugin uniqueness. :BUILD_PLUGIN_SEARCH_STRING for %%j in (".\lib\dev\*.jar") do ( call :MAKE_SEARCH_TOKEN %%~nj set PLUGIN_SEARCH_STRING=!PLUGIN_SEARCH_STRING!;!SEARCH_TOKEN! ) set PLUGIN_SEARCH_STRING=%PLUGIN_SEARCH_STRING%; goto EOF :: Takes a jar filename and returns a reversed jar name without version. :: Example: lein-multi-0.1.1.jar -> itlum-niel :MAKE_SEARCH_TOKEN call :REVERSE_STRING %1 call :STRIP_VERSION !RSTRING! set SEARCH_TOKEN=!VERSIONLESS! goto EOF :: Reverses a string. :REVERSE_STRING set NUM=0 set INPUTSTR=%1 set RSTRING= :REVERSE_STRING_LOOP call set TMPCHR=%%INPUTSTR:~%NUM%,1%%% set /A NUM+=1 if not "x%TMPCHR%" == "x" ( set RSTRING=%TMPCHR%%RSTRING% goto REVERSE_STRING_LOOP ) goto EOF :: Takes a string and removes everything from the beginning up to :: and including the first dash character. :STRIP_VERSION set INPUT=%1 for /F "delims=- tokens=1*" %%a in ("%INPUT%") do set VERSIONLESS=%%b goto EOF :NO_LEIN_JAR echo. echo %LEIN_JAR% can not be found. echo You can try running "lein self-install" echo or change LEIN_JAR environment variable echo or edit lein.bat to set appropriate LEIN_JAR path. echo. goto EOF :NO_DEPENDENCIES echo. echo Leiningen is missing its dependencies. echo Please see "Building" in the README. echo. goto EOF :SELF_INSTALL if exist %LEIN_JAR% ( echo %LEIN_JAR% already exists. Delete and retry. goto EOF ) for %%f in (%LEIN_JAR%) do set LEIN_INSTALL_DIR="%%~dpf" if not exist %LEIN_INSTALL_DIR% mkdir %LEIN_INSTALL_DIR% echo Downloading Leiningen now... set HTTP_CLIENT=wget --no-check-certificate -O wget>nul 2>&1 if ERRORLEVEL 9009 ( curl>nul 2>&1 if ERRORLEVEL 9009 goto NO_HTTP_CLIENT set HTTP_CLIENT=curl --insecure -f -L -o ) set LEIN_JAR_URL=https://github.com/downloads/technomancy/leiningen/leiningen-%LEIN_VERSION%-standalone.jar %HTTP_CLIENT% %LEIN_JAR% %LEIN_JAR_URL% if ERRORLEVEL 1 ( del %LEIN_JAR%>nul 2>&1 goto DOWNLOAD_FAILED ) goto EOF :DOWNLOAD_FAILED echo. echo Failed to download %LEIN_JAR_URL% if %SNAPSHOT% == YES echo See README.md for SNAPSHOT build instructions. echo. goto EOF :NO_HTTP_CLIENT echo. echo ERROR: Wget/Curl not found. Make sure at least either of Wget and Curl is echo installed and is in PATH. You can get them from URLs below: echo. echo Wget: "http://users.ugent.be/~bpuype/wget/" echo Curl: "http://curl.haxx.se/dlwiz/?type=bin&os=Win32&flav=-&ver=2000/XP" echo. goto EOF :NO_UPGRADE echo. echo Upgrade feature is not available on Windows. Please edit the value of echo variable LEIN_VERSION in file %~f0 echo then run "lein self-install". echo. goto EOF :SET_LEIN_ROOT set LEIN_ROOT=%~f1 goto EOF :: Find directory containing filename supplied in first argument :: looking in current directory, and looking up the parent :: chain until we find it, or run out :: returns result in %DIR_CONTAINING% :: empty string if we don't find it :FIND_DIR_CONTAINING_UPWARDS set DIR_CONTAINING=%CD% set LAST_DIR= :LOOK_AGAIN if "%DIR_CONTAINING%" == "%LAST_DIR%" ( :: didn't find it set DIR_CONTAINING= goto EOF ) if EXIST "%DIR_CONTAINING%\%1" ( :: found it - use result in DIR_CONTAINING goto EOF ) set LAST_DIR=%DIR_CONTAINING% call :GET_PARENT_PATH "%DIR_CONTAINING%\.." set DIR_CONTAINING=%PARENT_PATH% goto LOOK_AGAIN :GET_PARENT_PATH set PARENT_PATH=%~f1 goto EOF :RUN :: We need to disable delayed expansion here because the %* variable :: may contain bangs (as in test!). There may also be special :: characters inside the TRAMPOLINE_FILE. setLocal DisableDelayedExpansion if "%1" == "trampoline" goto RUN_TRAMPOLINE else goto RUN_NORMAL :RUN_TRAMPOLINE set "TRAMPOLINE_FILE=%TEMP%\lein-trampoline-%RANDOM%.bat" %JAVA_CMD% -client %LEIN_JVM_OPTS% -Xbootclasspath/a:"%CLOJURE_JAR%" ^ -Dleiningen.original.pwd="%ORIGINAL_PWD%" ^ -Dleiningen.trampoline-file="%TRAMPOLINE_FILE%" ^ -cp %CLASSPATH% %JLINE% clojure.main -e "(use 'leiningen.core)(-main)" NUL %* if not exist "%TRAMPOLINE_FILE%" goto EOF call "%TRAMPOLINE_FILE%" del "%TRAMPOLINE_FILE%" goto EOF :RUN_NORMAL %JAVA_CMD% -client %LEIN_JVM_OPTS% -Xbootclasspath/a:"%CLOJURE_JAR%" ^ -Dleiningen.original.pwd="%ORIGINAL_PWD%" ^ -cp %CLASSPATH% %JLINE% clojure.main -e "(use 'leiningen.core)(-main)" NUL %* :EOF technomancy-leiningen-713a4d9/doc/000077500000000000000000000000001173437653500171115ustar00rootroot00000000000000technomancy-leiningen-713a4d9/doc/DEPLOY.md000066400000000000000000000101521173437653500204260ustar00rootroot00000000000000# Deploying Libraries Getting your library into [Clojars](http://clojars.org) is fairly straightforward as is documented near the end of [the Leiningen tutorial](https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md). However, deploying is not always as straightforward as the process described there. ## Clojars Forks Sometimes you'll need to publish libraries that you don't directly maintain, either because the original maintainer hasn't published it or because you need some bugfixes that haven't been applied upstream yet. Don't do this if it's at all possible to get the upstream project to release a snapshot somewhere with the changes you need, but in some cases it's unavoidable. In this case you don't want to publish it under its original group-id, since either you won't have permission to do so (if it's already on Clojars) or it will conflict with the same artifact on other repositories. You should use "org.clojars.$USERNAME" as the group-id instead. If it's a Clojure project that already has a project.clj file, it's easy enough to just follow the regular `lein jar, pom; scp [...]` path. If you don't have a readily-available pom, you can create a dummy project with `lein new`. Edit `project.clj` to include your `org.clojars.$USERNAME` group-id, the project's original artifact name, and the version. Then you can use the output from `lein pom` to upload to clojars. ## Private Repositories There may be times when you want to make a library available to your team without making it public. This is best done by setting up a private Maven repository. The simplest way to do this is by hosting a repository on [Amazon's S3 service](http://aws.amazon.com/s3/). You can use the [s3-wagon-private](https://github.com/technomancy/s3-wagon-private) plugin to deploy and consume from S3. Once you've signed up for an Amazon account, create a "bucket" to contain your repositories. It's best to keep snapshots and released versions separate, so add both to the `:repositories` in `project.clj`; in this example the "s3p" URL scheme is used for S3 private repositories: ```clj :repositories {"releases" "s3p://mybucket/releases/" "snapshots" "s3p://mybucket/snapshots/"} ``` If you don't mind running your own server, both [Archiva](http://archiva.apache.org/) and [Nexus](http://nexus.sonatype.org/) will allow you to set up private, password-protected repositories. These also provide proxying to other repositories, so you can set `:omit-default-repositories` in `project.clj`, and dependency downloads will speed up by quite a bit with only one server to check. If you are are deploying to a repository that is _only_ used for deployment and never for dependency resolution, then it should be specified in a `:deploy-repositories` slot instead of included in the more general-purpose `:repositories` map; the former is checked by `lein deploy` before the latter. Deployment-only repositories useful across a number of locally developed projects may also be specified in the `settings` map in `~/.lein/init.clj`: ```clj (def settings {:deploy-repositories { ... }}) ``` ### Authentication Private repositories will need authentication credentials. You'll need to provide a `:username` and `:password` or `:passphrase` depending on the repository. In order to avoid putting sensitive information into your `project.clj` file, you should store authentication information in `~/.lein/init.clj` as a `leiningen-auth` map keyed off the repository's URL: ```clj (def leiningen-auth {"http://localhost:8080/archiva/repository/internal/" {:username "milgrim" :password "locative.2"}}) ``` This also allows different users using the same checkout to upload using different credentials. ### Deployment Once you've set up a private repository and configured project.clj appropriately, you can deploy to it: $ lein deploy If the project's current version is a SNAPSHOT, it will deploy to the `snapshots` repository; otherwise it will go to `releases`. The `deploy` task also takes a repository name as an argument that will be looked up in the `:deploy-repositories` and `:repositories` maps if you want to override this. technomancy-leiningen-713a4d9/doc/HACKING.md000066400000000000000000000054531173437653500205060ustar00rootroot00000000000000# Hacking Leiningen Leiningen is very small. The latest release is only around a couple thousand lines of Clojure; you could probably read through the whole project in an hour. When you launch Leiningen, it must start an instance of Clojure to load itself. But this instance must not affect the project that you're building. It may use a different version of Clojure from Leiningen, and the project should be in a fresh JVM. Leiningen uses ant's java task to fork off a separate process for this purpose. The leiningen.compile namespace implements this; specifically the eval-in-project function. Any code that must execute within the context of the project (AOT compilation, test runs) needs to go through this function. The exception to this rule is when :eval-in-leiningen in project.clj is true, as is commonly used for Leiningen plugins. TODO: what goes where? a tour through the launching of a task Leiningen is extensible; you can define new tasks in plugins. Add your plugin as a dev-dependency of your project, and you'll be able to call lein $YOUR_COMMAND. See the [plugins guide](https://github.com/technomancy/leiningen/blob/stable/doc/PLUGINS.md) for details. The [mailing list](http://groups.google.com/group/leiningen) and the leiningen or clojure channels on Freenode are the best places to bring up questions or suggestions. If you're planning on adding a feature or fixing a nontrivial bug, please discuss it first to avoid duplicating effort. If you haven't discussed it on the mailing list, please include in your pull request details of what problem your patch intends to solve as well as the approach you took. Contributions are preferred as either Github pull requests or using "git format-patch" and the mailing list as is requested [for contributing to Clojure itself](http://clojure.org/patches). Please use standard indentation with no tabs, trailing whitespace, or lines longer than 80 columns. See [this post on submitting good patches](http://technomancy.us/135) for some tips. If you've got some time on your hands, reading this [style guide](http://mumble.net/~campbell/scheme/style.txt) wouldn't hurt either. See the [complete list of known issues](https://github.com/technomancy/leiningen/issues). TODO: integrate with plugin guide ## Download Totals ```clj (apply + (for [d (tentacles.repos/downloads "technomancy" "leiningen") :when (re-find #"\d\.\d\.\d-standalone.jar" (:name d))] (:download_count d))) ``` # Release Checklist * update NEWS, bin/lein, bin/lein-pkg, bin/lein.bat, project.clj, pom * rm -rf lib classes, compile :all, generate uberjar, upload * test self-install * git tag * push, push tags, update stable branch * announce on mailing list * bump version numbers (bin/lein, bin/lein.bat, project.clj) * regenerate pom.xml technomancy-leiningen-713a4d9/doc/PLUGINS.md000066400000000000000000000135641173437653500205650ustar00rootroot00000000000000# Leiningen Plugins Leiningen tasks are simply functions named $TASK in a leiningen.$TASK namespace. So writing a Leiningen plugin is pretty straightforward; as long as it's available on the classpath, Leiningen will be able to use it: ```clj (ns leiningen.debug (:require [clojure.pprint :as pprint])) (defn debug "Emit a pretty-printed representation of the project map." [project] (pprint/pprint project)) ``` Plugins may be installed on a per-project or user-wide basis. To use a plugin in a single project, add it to your project.clj :dev-dependencies and run "lein deps". To install it for your user, run "lein plugin install ARTIFACT-ID VERSION". ## Writing a Plugin Start by generating a new project with "lein new myplugin", and add a leiningen.myplugin namespace with a myplugin function. Add :eval-in-leiningen true to your project.clj so Leiningen knows to execute its code inside the Leiningen process rather than spinning up a subprocess. Some tasks may only be run in the context of a project. For tasks like this, name the first argument project. Leiningen will inspect the argument list and pass in the current project if needed. The project is a map which is based on the project.clj file, but it also has :name, :group, :version, and :root keys added in. If you want it to take parameters from the command-line invocation, you can make the function take more arguments. Tasks without a project argument will be able to be run from anywhere. The "lein help" task will display the first line of the task function's docstring as a summary. Then "lein help $TASK" will use the task function's full docstring for detailed help. The function's arglists will also be shown, so pick argument names that are clear and descriptive. If you set :help-arglists in the function's metadata, it will be used instead for those cases where alternate arities exist that aren't intended to be exposed to the user. If your task returns an integer, it will be used as the exit code for the process. ## Lancet If your plugins need to do a fair amount of filesystem-y things, you may want to take a look at using Ant tasks to do them since the JDK lacks a lot of simple functionality of this kind. Using the Ant API directly is a pain, but it can be eased to a degree using [Lancet](https://github.com/stuarthalloway/lancet). Lancet is the Clojure adapter for Ant that is developed as the sample project in the [Programming Clojure](http://www.pragprog.com/titles/shcloj/programming-clojure) book. You can look over the [Ant API documentation's listing of tasks](http://www.jajakarta.org/ant/ant-1.6.1/docs/en/manual/api/org/apache/tools/ant/taskdefs/package-summary.html) to find an appropriate task. See the deps task for an example of how to call a task from Clojure. ## Hooks You can modify the behaviour of built-in tasks to a degree using hooks. Hook functionality is provided by the [Robert Hooke](https://github.com/technomancy/robert-hooke) library. This is an implied dependency; as long as Leiningen 1.2 or higher is used it will be available. Inspired by clojure.test's fixtures functionality, hooks are functions which wrap tasks and may alter their behaviour by using binding, altering the return value, only running the function conditionally, etc. The add-hook function takes a var of the task it's meant to apply to and a function to perform the wrapping: ```clj (ns leiningen.hooks.integration (:require [robert.hooke] [leiningen.test])) (defn add-test-var-println [f & args] `(binding [~'clojure.test/assert-expr (fn [msg# form#] (println "Asserting" form#) ((.getRawRoot #'clojure.test/assert-expr) msg# form#))] ~(apply f args))) (robert.hooke/add-hook #'leiningen.test/form-for-testing-namespaces add-test-var-println) ``` Hooks compose, so be aware that your hook may be running inside another hook. To take advantage of your hooks functionality, projects must set the :hooks key in project.clj to a seq of namespaces to load that call add-hook. Note that in Leiningen 1.2, hooks get loaded and used without being specified in project.clj; this is a bug. In 1.3 and on they are opt-in only. See [the documentation for Hooke](https://github.com/technomancy/robert-hooke/blob/master/README.md) for more details. ## Altering Leiningen's Classpath Leiningen's classpath will include all plugins from :dev-dependencies as well as user plugins. To further modify the classpath of Leiningen itself, add a '.lein-classpath' file a project's root. Its contents will be prepended to Leiningen's classpath when Leiningen is invoked upon that project. ## Clojure Version Note that Leiningen is an implied dependency of all plugins; you don't need to explicitly list it in the project.clj file. You also don't need to list Clojure or Contrib, but you will be locked into using the same version of Clojure that Leiningen is using. Versions of Leiningen prior to 1.2.0 used Clojure 1.1, while the rest of the 1.x line uses Clojure 1.2. Leiningen 2.0 will use Clojure 1.3. If you need to use a different version of Clojure from within a Leiningen plugin, you can use `eval-in-project` with a dummy project argument: ```clj (eval-in-project {:local-repo-classpath true :dependencies '[[org.clojure/clojure "1.3.0"]] :native-path "/tmp" :root "/tmp" :compile-path "/tmp"} '(println "hello from" *clojure-version*)) ``` ## Lancet Custom classpath elements can be added to Leiningen's startup command by adding a '.lein_classpath' file the the working directory. When present, the content from '.lein_.classclasspath' will be prepended to the classpath before invoking the JVM. ## Have Fun Please add your plugins to [the list on the wiki](http://wiki.github.com/technomancy/leiningen/plugins). Hopefully the plugin mechanism is simple and flexible enough to let you bend Leiningen to your will. technomancy-leiningen-713a4d9/doc/TUTORIAL.md000066400000000000000000000423131173437653500207010ustar00rootroot00000000000000# Tutorial For those of you new to the JVM who have never touched Ant or Maven in anger: don't panic. Leiningen is designed with you in mind. This tutorial will help you get started and explain Leiningen's take on project automation and JVM-land dependency management. ## Creating a Project We'll assume you've got Leiningen installed as per the [README](https://github.com/technomancy/leiningen/blob/stable/README.md). Generating a new project is easy: $ lein new myproject Created new project in: myproject $ cd myproject $ tree . |-- project.clj |-- README |-- src | `-- myproject | `-- core.clj `-- test `-- myproject `-- test `-- core.clj Here we've got your project's README, a src/ directory containing the code, a test/ directory, and a project.clj file which describes your project to Leiningen. The src/myproject/core.clj file corresponds to the myproject.core namespace. Note that we use myproject.core instead of just myproject since single-segment namespaces are discouraged in Clojure. Also if you have namespaces with dashes in the name, the corresponding file will need to use underscores instead since the JVM has trouble loading files with dashes in the name. ## Packaging You can package your project up now, even though at this stage it's fairly useless: $ lein jar Created ~/src/myproject/myproject-1.0.0-SNAPSHOT.jar Libraries for the JVM are packaged up as .jar files, which are basically just .zip files with a little extra JVM-specific metadata. They usually contain .class files (JVM bytecode) and .clj source files, but they can also contain other things like config files. Leiningen downloads jar files of dependencies from remote Maven repositories for you. ## project.clj $ cat project.clj ```clj (defproject myproject "1.0.0-SNAPSHOT" :description "FIXME: write description" :dependencies [[org.clojure/clojure "1.2.1"]]) ``` Fill in the :description with a short paragraph so that your project will show up in search results once you publish it. At some point you'll need to flesh out the README too, but for now let's skip ahead to setting :dependencies. Note that Clojure is just another dependency here. Unlike most languages, it's easy to swap out any version of Clojure. If you've got a simple pure-clojure project, you may be fine with the default of depending only on Clojure, but otherwise you'll need to list other dependencies. ## Dependencies By default, Leiningen projects download dependencies from [Clojars](http://clojars.org) and [Maven Central](http://search.maven.org). Clojars is the Clojure community's centralized jar repository, while Maven Central is for the wider JVM community. The lein search command will search each remote repository: $ lein search lancet == Results from clojars - Showing page 1 / 1 total [lancet "1.0.0"] Dependency-based builds, Clojure Style. [lancet "1.0.1"] Dependency-based builds, Clojure Style. This shows two versions available with the dependency vector notation for each. You can copy one of these directly into the :dependencies section in project.clj. The "artifact id" here is "lancet", and "1.0.1" is the version you require. Every library also has a "group id", though for Clojure libraries it is often the same as the artifact-id, in which case you may leave it out of the Leiningen dependency notation. For Java libraries often a reversed domain name is used as the group id. Sometimes versions will end in "-SNAPSHOT". This means that it is not an official release but a development build. Relying on snapshot dependencies is discouraged but is sometimes necessary if you need bug fixes, etc. that have not made their way into a release yet. However, snapshot versions are not guaranteed to stick around, so it's important that released code never depends upon snapshot versions that you don't control. Adding a snapshot dependency to your project will cause Leiningen to actively go seek out the latest version of the dependency once a day when you run lein deps, (whereas normal release versions are cached in the local repository) so if you have a lot of snapshots it will slow things down. Speaking of the local repository, all the dependencies you pull in using Leiningen or Maven get cached in $HOME/.m2/repository since Leiningen uses the Maven API under the covers. You can install the current project in the local repository with this command: $ lein install Wrote pom.xml [INFO] Installing myproject-1.0.0-SNAPSHOT.jar to ~/.m2/repository/myproject/myproject/1.0.0-SNAPSHOT/myproject-1.0.0-SNAPSHOT.jar Note that some libraries make their group-id and artifact-id correspond with the namespace they provide inside the jar, but this is just a convention. There is no guarantee they will match up at all, so consult the library's documentation before writing your :require clauses. If you set :checksum-deps to true in project.clj, Leiningen will automatically detect when your :dependencies key changes and run lein deps behind the scenes when necessary. You can add third-party repositories by setting the :repositories key in project.clj. See the [sample.project.clj](https://github.com/technomancy/leiningen/blob/stable/sample.project.clj). ## Dev Dependencies Sometimes you want to pull in dependencies that are really only for your convenience while developing; they aren't strictly required for the project to function. Leiningen calls these :dev-dependencies. They're listed in project.clj alongside regular dependencies and downloaded when you run lein deps, but they are not brought along when another project depends on your project. Using [midje](https://github.com/marick/Midje) for your tests would be a typical example; you would not want it included at runtime, but it's needed to run the tests. Dev dependencies may include plugin code that runs in Leiningen's process (providing additional tasks or augmenting existing ones) or code that runs in the context of your project. Note that dependencies that are not _necessary_ for developing but just for convenience (things like [Swank Clojure](http://github.com/technomancy/swank-clojure) for Emacs support or [lein-difftest](http://github.com/brentonashworth/lein-difftest)) are better suited for user-level plugins than dev-deps: $ lein plugin install swank-clojure 1.3.4 ## Writing the Code This is the part Leiningen can't really help you with; you're on your own here. Well—not quite. Leiningen can help you with running your tests. $ lein test Testing myproject.core-test FAIL in (replace-me) (core_test.clj:6) No tests have been written. expected: false actual: false Ran 1 tests containing 1 assertions. 1 failures, 0 errors. Of course, we haven't written any tests yet, so we've just got the skeleton failing tests that Leiningen gave us with lein new. But once we fill it in the test suite will become more useful. Sometimes if you've got a large test suite you'll want to run just one or two namespaces at a time: $ lein test myproject.parser-test Testing myproject.parser-test Ran 2 tests containing 10 assertions. 0 failures, 0 errors. Rather than running your whole suite or just a few namespaces at a time, you can run a subset of your tests using test selectors. To do this, you attach metadata to various deftests. ```clj (deftest ^{:integration true} network-heavy-test (is (= [1 2 3] (:numbers (network-operation))))) ``` Then add a :test-selectors map to project.clj: ```clj :test-selectors {:default (fn [v] (not (:integration v))) :integration :integration :all (fn [_] true)} ``` Now if you run "lein test" it will only run deftests that don't have :integration metadata, while "lein test :integration" will only run the integration tests and "lein test :all" will run everything. You can include test selectors and listing test namespaces in the same run. Running "lein test" from the command-line is not a good solution for test-driven development due to the slow startup time of the JVM. For quick feedback, try starting an interactive session with "lein int" and running tests from in there. Other options include editor integration (see [clojure-test-mode](https://github.com/technomancy/clojure-mode) for Emacs) or keeping a repl open and calling run-tests from there as you work. Keep in mind that while keeping a single process around is convenient, it's easy for that process to get into a state that doesn't reflect the files on disk—functions that are loaded and then deleted from the file will remain in memory, making it easy to miss problems arising from missing functions (often referred to as "getting slimed"). Because of this it's advised to do a "lein test" run with a fresh instance periodically, perhaps before you commit. ## AOT Compiling If you're lucky you'll be able to get away without doing any AOT (ahead-of-time) compilation. But there are some Java interop features that require it, so if you need to use them you should add an :aot option into your project.clj file. It should be a seq of namespaces you want AOT-compiled. Again, the [sample.project.clj](https://github.com/technomancy/leiningen/blob/stable/sample.project.clj) has example usage. Like dependencies, this should happen for you automatically when needed, but if you need to force it you can: $ lein compile Compiling myproject.core For your code to compile, it must be run. This means that you shouldn't have any code with side-effects in the top-level. Anything outside a function definition that doesn't start with def is suspect. If you have code that should run on startup, place it in a -main function as explained below under "Uberjar". For projects that include some Java code, you can set the :java-source-path key in project.clj to a directory containing Java files. (You can set it to "src" to keep Java alongside Clojure source or keep them it in a separate directory.) Then the javac compiler will run before your Clojure code is AOT-compiled, or you can run it manually with the javac task. There's [a problem in Clojure](http://dev.clojure.org/jira/browse/CLJ-322) where AOT-compiling a namespace will also AOT compile all the namespaces it depends upon. This often causes unrelated compilation artifacts to be included in the jars, but you can set :class-file-whitelist to a regex which will be matched against .class file names you want to keep in order to remove the unwanted file. ## What to do with it Generally speaking, there are three different goals that are typical of Leiningen projects: * An application you can distribute to end-users * A server-side application * A library for other Clojure projects to consume For the first, you typically either build an uberjar or use a shell-wrapper. For libraries, you will want to have them published to a repository like Clojars or a private repository. For server-side applications it varies as described below. ### Uberjar The simplest thing to do is to distribute an uberjar. This is a single standalone executable jar file most suitable for giving to nontechnical users. For this to work you'll need to specify a namespace as your :main in project.clj. By this point our project.clj file should look like this: ```clj (defproject myproject "1.0.0-SNAPSHOT" :description "This project is MINE." :dependencies [[org.clojure/clojure "1.2.0"] [org.apache.lucene/lucene-core "3.0.2"] [lancet "1.0.0"]] :main myproject.core) ``` The namespace you specify will need to contain a -main function that will get called when your standalone jar is run. This namespace should have a (:gen-class) declaration in the ns form at the top. The -main function will get passed the command-line arguments. Let's try something simple in src/myproject/core.clj: ```clj (ns myproject.core (:gen-class)) (defn -main [& args] (println "Welcome to my project! These are your args:" args)) ``` Now we're ready to generate your uberjar: $ lein uberjar Cleaning up Copying 3 files to /home/phil/src/leiningen/myproject/lib Created ~/src/myproject/myproject-1.0.0.jar Including myproject-1.0.0-SNAPSHOT.jar Including lancet-1.0.0.jar Including clojure-1.2.0.jar Including lucene-core-3.0.2.jar Created myproject-1.0.0-standalone.jar This creates a single jar file that contains the contents of all your dependencies. Users can run it with a simple java invocation, or on some systems just by double-clicking the jar file. $ java -jar myproject-1.0.0-standalone.jar Hello world. Welcome to my project! These are your args: (Hello world.) You can run a regular (non-uber) jar with the java command-line tool, but that requires constructing the classpath yourself, so it's not a good solution for end-users. Invoking "lein run" will launch your project's -main function as if from an uberjar, but without going through the packaging process. You can also specify an alternate namespace in which to look for -main with "lein run -m my.alternate.namespace ARG1 ARG2". For long-running "lein run" processes, you may wish to use the trampoline task, which allows the Leiningen JVM process to exit before launching your project's JVM. This can save memory: $ lein trampoline run -m myproject.server 5000 ### Shell Wrappers There are a few downsides to uberjars. It's relatively awkward to invoke them compared to other command-line tools. You also can't control how the JVM is launched. To solve this, you can include a shell script in your jar file that can be used to launch the project. Leiningen places this shell script into the ~/.lein/bin directory at install time. Of course, this is only suitable if your users already use Leiningen. If you simply include :shell-wrapper true in your project.clj, Leiningen automatically generates a simple shell script wrapper when you create your jar file. However, if you need more control you can provide a map instead: ```clj :shell-wrapper {:main myproject.core :bin "bin/myproject"} ``` Normally the shell wrapper will invoke the -main function in your project's :main namespace, but specifying this option triggers AOT for uberjars, so if you wish to avoid this or use a different :main for the shell wrapper vs uberjar you can specify a :main ns inside the :shell-wrapper map. You may also specify a :bin key, which should point to a file relative to the project's root to use as a shell wrapper template instead of the default. The format function is called with the contents of this file along with the necessary classpath and the main namespace, so put %s in the right place. See [the default wrapper](https://github.com/technomancy/leiningen/blob/stable/resources/script-template) for an example. ### Server-side Projects There are many ways to get your project deployed as a server-side application. Simple programs can be packaged up as tarballs with accompanied shell scripts using the [lein-tar plugin](https://github.com/technomancy/lein-tar) and then deployed using [pallet](http://hugoduncan.github.com/pallet/), [chef](http://opscode.com/chef/), or other mechanisms. Debian packages can be created with [lein-deb](https://github.com/travis/lein-deb). Web applications may be deployed using .war (web application archive) files created by the [lein-ring plugin](https://github.com/weavejester/lein-ring). You can even create [Hadoop projects](https://github.com/ndimiduk/lein-hadoop). These kinds of deployments are so varied that they are better-handled using plugins rather than tasks that are built-in to Leiningen itself. It may be tempting to deploy by just checking out your project and using "lein run" on production servers. However, unless you take steps to freeze all the dependencies before deploying, it could be easy to end up with unrepeatable deployments. It's much better to use Leiningen to create a deployable artifact in a continuous integration setting instead. For example, you could have a [Jenkins](http://jenkins-ci.org) CI server run your project's full test suite, and if it passes, upload a tarball to S3. Then deployment is just a matter of pulling down and extracting the known-good tarball on your production servers. ### Publishing Libraries If your project is a library and you would like others to be able to use it as a dependency in their projects, you will need to get it into a public repository. While it's possible to [maintain your own private repository](https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md) or get it into Maven central, the easiest way is to publish it at [Clojars](http://clojars.org). Once you have created an account there, publishing is easy: $ lein jar, pom $ scp pom.xml myproject-1.0.0.jar clojars@clojars.org: Once that succeeds it will be available as a package on which other projects may depend. You will need to have permission to publish to the project's group-id under Clojars, though if that group-id doesn't exist yet then Clojars will automatically create it and give you permissions. For further details about publishing including setting up private repositories, see the [deploy guide](https://github.com/technomancy/leiningen/blob/stable/doc/DEPLOY.md) ## That's It! Now go start coding your next project! technomancy-leiningen-713a4d9/doc/lein.1000066400000000000000000000044671173437653500201350ustar00rootroot00000000000000.\"to render: groff -Tascii -man doc/lein.1 > lein.man" .TH LEININGEN 1 "2011 June 30" .SH NAME lein \- Automate Clojure projects .SH SYNOPSIS .B lein [\fITASK\fR [\fIARGS\fR] [\fI, TASK2\fR [\fIARGS\fR] ...\fR]\fR] .SH DESCRIPTION Leiningen is for automating Clojure projects without setting your hair on fire. Working on Clojure projects with tools designed for Java can be an exercise in frustration. With Leiningen, you just write Clojure. .SH TASKS .B lein help will show the complete list of tasks, while .B lein help TASK shows usage for a specific one. .B lein help tutorial has a detailed walk-through of the various tasks, but the most commonly-used are: .TP \fBlein new NAME\fR generate a new project skeleton .TP \fBlein test [TESTS]\fR run the tests in the TESTS namespaces, or all tests .TP \fBlein repl\fR launch an interactive REPL session and socket server .TP \fBlein jar\fR package up the whole project as a .jar file .TP \fBlein install [NAME VERSION]\fR install a project .SH CONFIGURATION Leiningen reads its configuration from the .B project.clj file in your project root. Either use .B lein new to create a fresh project from which to work, or see the exhaustive list of configuration options with .B lein help sample. You can also have user-level configuration that applies for all projects. The .B ~/.lein/init.clj file will be loaded every time Leiningen launches; any arbitrary code may go there. This code is executed inside Leiningen itself, not in your project. Set the .B :repl-init key in project.clj to point to a namespace if you want code executed inside your project. You can also manage user-level plugins with the plugin task; see .B lein help plugin .SH BUGS Check https://github.com/technomancy/leiningen/issues to see if your problem is a known issue. If not, please open a new issue on that site or join the mailing list at http://groups.google.com/group/leiningen/. Please include the output of .B lein version as well as your .B project.clj file and as much of the relevant code from your project as possible. .SH COPYING Copyright .if t \(co .if n (C) 2009-2011 Phil Hagelberg and contributors. Distributed under the Eclipse Public License, the same as Clojure uses. See the file /usr/share/doc/leiningen/copyright. .SH AUTHOR This manpage is written by Phil Hagelberg technomancy-leiningen-713a4d9/pcmpl-lein.el000066400000000000000000000064671173437653500207430ustar00rootroot00000000000000;;; pcmpl-lein.el --- pcomplete for Leiningen tasks; works with eshell ;; Copyright (C) 2011 Phil Hagelberg ;; ;; Author: Phil Hagelberg ;; URL: http://github.com/technomancy/leiningen ;; Version: 0.1 ;; Keywords: eshell completion ;; Created: 2011-01-15 ;; This file is not part of GNU Emacs. ;;; Commentary: ;; Provides completion of leiningen tasks using pcomplete, suitable ;; for eshell. Does not support custom :source-path or :test-path. ;;; License: ;; 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 GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Code: (require 'cl) (require 'pcomplete) (require 'esh-util) (defvar pcmpl-lein-tasks-alist nil "Cached alist of project roots to task lists.") (defvar pcmpl-lein-project-root nil) (defun pcmpl-lein-tasks () (or (cdr (assoc pcmpl-lein-project-root pcmpl-lein-tasks-alist)) (let* ((help (progn (message "Getting Leiningen task list...") (shell-command-to-string "lein help"))) (tasks (split-string help "\n")) (tasks (subseq tasks 4 -3)) (tasks (mapcar (lambda (line) (substring line 0 (string-match " " line))) tasks))) ;; OHAI MEMOIZE. (add-to-list 'pcmpl-lein-tasks-alist (cons pcmpl-lein-project-root tasks)) tasks))) (defun pcmpl-lein-namespaces-dir () (let ((task (cadr pcomplete-args))) (cond ((equal "test" task) "test") ((or (equal "run" task) (equal "compile" task)) "src")))) (defun pcmpl-lein-transform-filename (file) (subst-char-in-string ?/ ?. (substring file (+ (length pcmpl-lein-project-root) (length namespaces-dir) 1) -4))) (defun pcmpl-lein-namespaces-in-dir (file) (if (not (file-directory-p file)) (if (string-match "\\.clj$" file) (pcmpl-lein-transform-filename file)) (eshell-flatten-list (mapcar 'pcmpl-lein-namespaces-in-dir (directory-files file t "^[^\\.]"))))) (defun pcmpl-lein-namespaces () (let ((namespaces-dir (pcmpl-lein-namespaces-dir))) (when namespaces-dir (pcmpl-lein-namespaces-in-dir namespaces-dir)))) ;;;###autoload (defun pcomplete/lein () (let ((pcmpl-lein-project-root (expand-file-name (locate-dominating-file default-directory "project.clj")))) (pcomplete-here (pcmpl-lein-tasks)) (if (not (string= "run" (cadr pcomplete-args))) (pcomplete-here (pcmpl-lein-namespaces)) (pcomplete-here (list "-m")) (pcomplete-here (pcmpl-lein-namespaces))))) (provide 'pcmpl-lein) ;;; pcmpl-lein.el ends here technomancy-leiningen-713a4d9/pom.xml000066400000000000000000000061021173437653500176600ustar00rootroot00000000000000 4.0.0 leiningen leiningen 1.7.1 leiningen Automate Clojure projects without setting your hair on fire. https://github.com/technomancy/leiningen Eclipse Public License scm:git:git://github.com/technomancy/leiningen.git scm:git:ssh://git@github.com/technomancy/leiningen.git 78ab0f6877b11f3b49a9d307350f2d8f6157869f https://github.com/technomancy/leiningen src test resources test-resources central http://repo1.maven.org/maven2 clojars http://clojars.org/repo/ org.clojure clojure 1.2.1 org.clojure clojure-contrib 1.2.0 clucy clucy 0.2.2 lancet lancet 1.0.1 jline jline 0.9.94 junit junit robert hooke 1.1.2 org.apache.maven maven-ant-tasks 2.1.3 ant ant technomancy-leiningen-713a4d9/project.clj000066400000000000000000000014721173437653500205100ustar00rootroot00000000000000;; The only requirement of the project.clj file is that it includes a ;; defproject form. It can have other code in it as well, including ;; loading other task definitions. (defproject leiningen "1.7.1" :description "Automate Clojure projects without setting your hair on fire." :url "https://github.com/technomancy/leiningen" :license {:name "Eclipse Public License"} :dependencies [[org.clojure/clojure "1.2.1"] [org.clojure/clojure-contrib "1.2.0"] [clucy "0.2.2"] [lancet "1.0.1"] [jline "0.9.94" :exclusions [junit]] [robert/hooke "1.1.2"] [org.apache.maven/maven-ant-tasks "2.1.3" :exclusions [ant]]] :test-selectors {:offline (complement :online)} :disable-implicit-clean true :eval-in-leiningen true) technomancy-leiningen-713a4d9/resources/000077500000000000000000000000001173437653500203565ustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen.png000066400000000000000000002175571173437653500230550ustar00rootroot00000000000000PNG  IHDRVwsRGBbKGD pHYs  tIME 4H|QtEXtCommentThis is the good man known as Leiningen. Image courtesy of Loren Broach.,c IDATxy%u;f_]=N>Y0 vf!ReQa ![aCa9EHd; f2a. l/յ3̗UtLLur_-3w99~(G4':l~·~2>9 << q2<6 T@ns ~O63<C`/!#px @{p X ;_/:p$#P4 \ >^S RSaӘ ߳>@k9R(%ph[͒]9ZRᜄ 670Fqcu]w:tiw5GpH|=!Tp>|2NGuY^3z9 G8u8KKDZO~nXQ޲,nU|y=\yq|u=m82|WxOA|b{ā9~ zvq,,OLdiEpxTGGXXX$f3@*[;i3Jgؒ+uށQr-UJ!? `QZS?O˿";]iY[O!=gy_xqqO ,-E^٭zv71yڈ tov`QqEzcĉePʻ1Ik~qo%w'?O?al|gb ^. nUҷ_%29C,xg˼m|avMQJZ RVPN"O^7Jӏ/ewV`[m'D8{h{nL8)l!7Mx"&ޓҲOaZ)^O%9ȷrGgag8Gj'ta\y`C0\$ko_f.\q0~"Q3Ǚ!# CdelHLb `cMoOn\_._b%G">q _i"3?sm$b2Ox1Kq#MF؛_Z;ss|ok'(??ȫ?j<{>(J(=U81&\hr/Y a8rLz7a#*?W,{dk[!;i|-wF9Av? ^\|3?3gO \f',j(L4UA6B/_譪`qh!$b ,gHVن_&6]GUNmOWJ!#Ɨ^uH}^^Zӟx  puOd6y;/ :FtCɈ4uZcH!"iLhEw] ]N?w;]嗿JGR_A|o_sBqG~8sd>2խvb=^u)G X4:f}cW6ֻƈZS̴jU*f47h5:.ۛCD4RfZ5j:ZDKa͕D"TZyO9 ^}"v]C#_ۢ$RVsleqLٓ>c7VB7fŊZ5&IGk]z N|h%^'BXQYpGnh44+tw ")_79wt:_+f > ׀V@gT4!֎ǎ Ys +e:=qıfaqv>⢩`$ȃ:MPRX]orcm[|;C@G%W^1{>~tOtq,oZHO{KѬii;1x1Dju0 +25sVt[H%y7RZZ="#;./4+Ša-zC,ͭ]wg1(W"R=)L@V#f[ j1ބ\z}sk1+K"5f;;׳ ?[Ny}ܨ XJ.67q4vG9<rzi$%xK'4`kKf!RFJ9-GYߦ1L))7o k-iTDDTZ]zJR"헴Xb)U*R*XNnp(b i)"ڃ& ,fX'hU#͘VJY7<N1:h1'8' kNy^"οu<5{}fu_W(ɽm ws כ%/ SO`hɠ+$qrvwG5Q8бon7iT*P8/saCrX}O761e*ZN߀1uQǚJ7 qU&Q Zީ ))BhD;7F"c +ŴXݮ6;{q]lv0Q&T q,z26q?;K=2G\[e4u;|;e8*R&/x_AXk{*YJ 3|S?/Fs7%ޡ;[|qt{o"E^RJ%fvLBVA!K,CrHXJUAk;vFcpb1ƕ dZnMžZ`Iyͫ8UZ4jX(|B wޓdWG g-D+D&S Թ6E#G[u[DZam(AYcx&t,@h &utإ?PHeQjl'4hyn1*OeIXH|w *\](KlZRThi7k45 )4 3+ G=U#D)7f tPNJGR(q$jjJ"T(Q(&3&3ltuO1c^c`#/X6<$9@]hd HQ~:E\9/ľ"K;R|CuׯOvv^ b7ǟxc]z-D ?AUS_SRf*-fKַ-UbN CVW`TDZ3ӪQ%#n )䲝(I%a .j&+h\pQ?s|=`DXiiCcHQQZZVy`qR~IdJA0 $’bR\B%ɨ*cHSr "q,̶6IbH`|~ xlwoN!v-ƳAw0_jē ∴'Ǭ]G 0'Lŗ>`ˏo0Rs̵:q̙3gfIj5gxG|:!h_km=K+'9rD cKQ ͙d?<,q9sr>]ᔠ`+ MW=!~K N$w _xԘrZ2P6+'lXE8espa)g3;z\f IeN38i_HP8Fm3f{{O!! Lʠ14lt ,/mR8Rdy+` Un%OOEtzݠYKHZOhy9T1ժ[5Y#ԓ~Q7G%ɯp9%X_V7p"Gl#GbTBD'ƅEu` q(#E:*Έ[@d' ɭipW{*X\;;w- 3iE.8`dNxfB,|c.\X-EkluGtzǖ G:"D"%YVǑ9.ycϝY䑥VTUD, uJm'lRP +V@Y];. `nGDJ"fU1\Zd)l2JC?[|;ߛ^f9X߇X}|;XXXn.RBl*8SXޔ1?XLXdww(5(eT+1ss $O'7>@ņN-O@GPoTiRWȬa84ԏRll9M$K.lL*X9"8Mj;plsz6 ;,>şn iALͅ(a#ro>,[O; *a!\Z1y^YAtf0@ķ)SMٌF &5AWbv{K:ᜣݪ1?[/XDfp[[؊g9rԧwϬIyM=Xm%HOH!+TE llR &h9\B9D^U5n_kXrꎏi %HijN"_ZNυM} v5Iprylt_^W*XWhע0Bp3綸L85Ggc>Q ( 8. xUzip[X1 b[] SElP$q(ȴ"N<$O~u3͹k;_3 lMhƚ뒧ESLASz׶nD=Nǰ7"s)Z$I.]<ϥ˗O9 >q9ak Jgpq3 G4XrQ"B1W|*hl!Po$ZJifQh 7(UnwAGܽ k˥N uܚYg}$Ѩ1W,s,kDb1xN + 2J%XoHCFY6q8 #u~9GJh ]"tʯu,Qvַ Vw- XfE-_+A :L]#kBzϲ"8Z6El,6\Xa}{H1YWe š45=R9^kj2摧֮_፷,?~20;]" ЃgQ g e]e}[c`gKiilijC%H~NRM*>d>F"3v[@quu^oE g|tA/Ѿٗyg#8sdN/Ӫ3:JJL=5^Su,vgV"``c4t::.I^ - A;! ЮŧWqywvAZ조n+:<'{BV"DN{sxdk-suТ&!:V< ?ڠ72\s~Ս!qފsQKYOYD ֍/Tηŕ,,TO|UR{@K̂w ]xS!oc))@e(k|}Y e[MTX+lĩ}y*HIʛPȪX7 g9R#ofQʄ\@+c3eIŅ6? gN.2nplv;;^&Ɔ0!, H4 IDATT"ȉ$[1D#LA: vvv٠`0lq<+lxGTx )\Y}w 204(Ƴ9R'4c|O\pqHipfI?Ք׮l;0 |R@g+R׽G:Z>W!| ].]5 xt? %nN8UH[$sѤ "_M{NoeEq2y:)dNa:͹7٬ў0bXez`$AQ嫕 }f\gHQ*fq#<Ʊc j[^f˗v B(q%`E儎N^EH:$IBՂVȲt4bkk,#2>noliĕ3>'l]h)>2Ǐy6Ya+*yjpj.`\D/_`iEmΉ21{g4ת O o\ʵ.N*F\V|{ /Q&/_`y~98FiXkӝ.oz1HDlb[ .[_ ?+S,,-΅2†]a:c ,Fe?) IqVv17Scyq(,.͐e)bn7+rfX6}ԕB:Zx mc;v̫.ڜG۬;soz1s +TTKL^/X1FZʱxXz7q宩#7(hNϵ95bg0`4 R^p;lu qI!ڈ%oV'8loocAGcb<KlJgSfxhk޸ͥt .g]Gg{ y$VL4eP.v?=8 |GPUI@tz)ۻ=66vH3xD4fw {62q2)C'S#h0x  \nֲ2XbH WV;%‰ a]D4ʥX4{(ϟYjr#!-Yg%†8NjxCϰɕ+W,,XGZ ,$FG9["n2+JkEkMk2/g}}7-_|X8ڍ{6<8sX2ᥗ6^qg<4;3g9w\$CK ('#䒭%I'k:RcoyV>78o3s̷laXZ4@3@אwNa?'̡Jɜ!dPm Lhc]g-Gr ׮rꆏC/e"1nM:m\Xdi>13m]%ƉA(EFB;x 'p"J Q j|ɲј :EGP95}-.|{ŵkXvh]W`M\uy9GgVosq0s8eG'yJѬpV^_6PRx%ǓqT^(sƀo_eu*\{#fgZzI0e}idtD_&WCj9j"R.* JqQ:X$ٔUqUFiXNyP,4`>Np 7vr}׋v3m(c.N,<"j>RĩV|DVɂ7mEӿΡU4.#6o2=Cw@!+l. >33sXi9b%r-|gwγwܛ7 'F|>?Ӣ 7GxՍ߻=adsggOg !pR{WܼHLtݬ)#mHc,Jd& 7AT]m?dfCoTbLf rNPWI5;] FFJ?sDe#c14j5~O|yg~vݳ!q.6ekTjlsq 2'묥)x+0uIѣǨ4Tj f,О] T؀m 9eonDD(!}&e*xw#TY\>B li,ia3&UӜ^YV5ZR$q,pHU./w 7`t|K_zW1qa&~ %vf] IJ{zE-n"  t%dp/RWh. &3I>xO@ D\Cg' 35Z&κBHP (ve>W:A\XƺBaLXRf2[_L`OLFJ[^„Ų.V2lff>o O<|Qq.ZYoy"Lh6/,1Dm7^˗.qETxDB݉+B~pN {9Kǜ:sauƄ[H9mgu ?LTē=8cy?9\6n9sZY*ɸku.6h8cuZ\]k \śW ƂR "~9lk<m}=9Hy;A,S!nT6Cs K<ē!߬x  9*q:D)sQDZVkPfyǞzy)+7Jp$ z#`D#4ɚtghy nA\*psn)Dgv V6SE[篼v~~( }WTy ,XM yjGB3/̴s/dGVSk?ʛ8V,.-c1~tI ;1ԴK|hھ˕Ҽ׳]2R1f4?/W v-~MA&"/K/@dЍ6x@R+*[r ;#K*n 8v&nyzډFksET"2V7]G=Ш8~U>/,SOrZIcox|DȽo`MXJǟxv+ #,ω gyXՇ1AG@P2[+\(xAkIw$XcU3շ]^d]wv/'}վLƩ,2TEy4#!5+x5$ ֺ]rJj:ޮ5Zj *g]&X;^|Mq'޽ngllmc=WA lEN/'\_ի[Cnz_p SWgEE f5*Qy[Eh]ԭXmJo@t-Z8R'A!3Vv`w3Gfu9z`p}qu dbJd+ 7o/ߏJ{ZeH#GpU_8$>k*q!/]LL^wo 瀓+&*])S鏆l201jYZXV*Dj 8/,򝻅RϦ(J/Mxo5mPb}'"mncpFٹ 9/YCuR9}NfnuycpEQ̃7^h"B-RtajA;"o/"NQ@I5 5s\i&v=$,. Ghrπtz MbMFi/}AkwW;>Y6=yp#@1?HR+"Zog)=z' VSM PAv/nOg;EB{l+̈́`H xuSř=Z $}X%wQy+ԒJavM{ H `jդ7rDDr$`O9爫-_@1JI+RjZ@ȈQ9@-?9jFFAiVVy/ ;YeJkZЮ{frw0d][<?jNtcVG:%29.cgMa^rleiKmJ =%~U"c R{@lf[fDJYN  ytW4;<>أLtM:ϦNϜ8:VCqpBL{a8<&g( @Lp3P>hWn=mhf UܲА*y/D|05L'ܦ-p+؝.}WHqH sMnz#,04N;}Q49] c n%sm̖_:8 @|?PJշ SLoe~>"RtA:|{؋KQ'U a7W^Ĺ`{kް[ಇHɺMfŖ2 ‡?G9{bj?7;1J6<'mjq9^ CB6Mѥ3ju3Ѓ+O=-{@HVvﯵp*7ְHQ7h4Z>QTH(nO'[tﺘ~{MƑ_fe<8/~絲y*~qTp1 pߒV10)Ƹо:|,?"SsZKQ]SMXFOLm4JhT?L ,,̅btGog7]-'IL'j5j,ZJ~`!'FwR\ w ?t?19|m4pkAkn(v9`4 lY9Ǡ?e:4?H|7jU|j.33ĚclVa0 aľMdvvVEZM̃7R,\ӛٝXq?t8&MӲK}U; bTzX)D,΁YiOBVc0_L֠i\MA><[k@!35)IEt6KvX~ߘjB{K}a*˵~g{YKM5o nu{]B/W`m`3\4х\fm82n<Wq{ċ~ctBGGXw<$&7<!o7.cO=2Ku?["Q\)Y6sJk4*C?P,Zk06X&`,\cxL#,wsZzXQ@z}݈slo+/k!J+}hčry8Z΍]:*#4Jr((>º?8ck4@:.0vպ|s eer,Ψ-8ʷ΅Bp.a8ruv4p1Щ w:_,1ʝx$)5;w{n^ghT3j qTuK-guxr,hQ |O5RYQI˞ EJ%XK`sp{7z7OG^$"~@n>07;mw["[xy`_c9+8c}ى,C뵩p⒉zejuweC5YfG<۲3 "Oyq4 wz/XEJ̴.l1|M <~|=_Ǘ? v(QQSiw| U gxmeD2 ͰMR_G_#2eNh9o`T {4+D` 3zAp~й‰Ţ+C^C"G= A5.nmm}JÏE q]JPl%,z^1;Uu'h$H{;D8I'#0g~3/*o\*wVvmx-}E<^8xp9U;Jw?k|8sCm.i H-* eՠVaEj{q~ }.5;:3Q(`pZE i DZ1\qwv.wjǒ"3,oX7I_OK%V)hw,+2:aKHHrz‰gO-4; 3%e9Vť# ^JjC?S0&sUWfi`cZ"L @* ]ާ\:[FQm]ܛYx V h" *9jhCT]\ |VJ\~7ÈVD{Oq;|wO# F TlSXq焵H@Ē!N`~{F#FIu+M3>ZL9D9}{s+8980$I±'J -!a/)wf,N]Yy5Z&cwmAQ'y׻'aƲZrks흹pk JRVv@_;7c;~5'Odee;PŖB P;b~|3_^i`12)kV`c1W8Xygf`vZ0@ %aVxwh6C'ɜ[(:CKo` F^b8e/ IDAT2Q.mF!k8\|n{G1Cg9rdgNܱ?9*+[;u1@,$BGhbj2Y>P>;l{ E({o(s0bvy2@iO2Hɝ)/EMݵXӪ֑HB7|巸ţ3[n70Pcbq"kܼ`S%C!L:2d>NVkU8vվLԾi;#ׁ#YX (݋ŷr1NEsO+3 BmGoNٝvb{˳suo[oePEJ K$;Nd=  a8H^,@ؒ'bRj#Eq(re3==~,y8ުMNP4Xͩw~w.ؕ~-UPaFG¸>jN0N"q8)q^6οbEdCs˿j%h!/@ B"Q$R7a~~ۇX 2y sFM 㜜AKqn؀a8FC*>N8#Y8CH a6 "'О'*MeG1_7hSOǼ->VĹ 2܊4Qi 8NfNG`*r1!xv$k:49cmŁ%P{66!6" bw|[QDD*LCPw NyLB-7`0qppZסv${njY3G8(f;k+҄Ѭw.^6)W^~k847hypl'z!ȳA#y^{)RwKE^/韜WPz7 ş9 Yec-g烘s9{ yZ:>q:ΝwG^ zVt%anLԸ pʸ"xS. wbcsܕ;X?dkuB'Rc)? &!T1 ci-t(ܜ%i$dDt•uutQ>+'U]9"|\bwxJ_gtӗ@ V;l8Cn,u/@O]l۷y/MY~;;"M[kݭUzxd8kXd7r)ExBp*N gOCqLfbzi!z< .vw6HȔqg4Ƭ,&D 9wad)e1Zj֐ZAЏ+s\YYl{HjQ1?~?zu&e(ŕEh<Rqy-1ӱ'i%مηw~ai,-qqx2 /c 4s_('>ug J(?rV-kIiS՘M2dY1{2 Sph4`8͘U+43gX#g#n\EQę.j<S8O' N'X'e%B\m@;ܹ gX\vJvAy7~\=kK/&BA~ӏ{N^:6V'R)5QAV-awk)@((a<-F$nGs<r瞼ocG[$bME9pQV .h2L$ǥN0r*bkc9teous؟A(/4 M<[X6VDC&;G|$`4*f_{6L4j3LeQJ0.*GMSY\Ij% XnwB`l0o7SW{/Iwa]5q" S%±?l6Y[[aeyaxg,_Y/7'~Lp䘵QJ/x4S&X^Y$J 5L>+yMڛxs8ƽ:nu Sh$urK[cww'O܅(*3Y5fS)XYnQ Ӳd8 `HAxO#"G(PVkSNS hzZh9LuʒJEW7U#>lTh$˙L2.4մ5vm+_1B*{k3t|Bޠi@W&8&h[yÏAurQ|\Ku;wev# zIGQո|izQd"[Ҽۉ8G766H4֣do>}3xSip8PQΊ 0jtKK5Fѥ׫ޣ,Lf 喊 CvtQ鴈$,MDGִ >Y88H$/z c,z~c@(?qhz,cVUWdWftu굄 Y{wO;a#,^j,U($ -&V,*;u6<_ݻ;1qgPW2JNx1ayx}圡~/a H͕gC5WVB81L{oT$=FJ1wr}&wL)<'Qwa&B tW`y)e Xitp!@C.|(咴l,N ݐ}0WXH/^,v AIxQG'I>՚ n߽x~9>[zqof9x4!QV0V$RIQ@d0c:Θt'91ChsfXVEJjB/m"0չ*̱(38>ӺdSXi.<&)'nZJ7Ms5`p)cVzQ&؆v(t(T\Ʌֹ44uأdks NHL%Hjʲ2hJ5!')xqA Kox[NXN?6弜6u HL8K8NR*g|.|cBH u;].o@嘋^}E7 UHZnr` " zYr G9TGQ"_8VxHѦ֣ EeJ3. o:;NU9;A`489iJ(pV̦wy4c<_x;ceE=k&C_NNBj?܅?28HɒLą7<'6i6Cy%88sopPPVGnm xE}2JY@#|x/ RD/\Oj;|Zv?YvZndx0jh>\g}!XHk+۽0S|Wo"sXLB {Nf'ӌrN|Y9`Q:׀u ,e/<]**eY*L$ ҂H3A9t '9<5W8cC-\<~orCz'QyGQ ƔL}Xsf9 Kx5&,n+bT/pErDzuLPZN0Н4q;V j BӁRkԹBP =3|H#ޅaRXO)4w Ӽ ߟ߭;DTiA*SyŃ~f-asGed0&5)z&mR6OGOKZ-Vc dek`21Hrn7o>WNOq4`NC$dzJiN3J7mMs{`oާZb5sh,` '%E2܅q|YHȩ$T>M]k&!] c@W;ŋA_@$rgF0YKA* ;Mz; ~+m v>\>%y8xyoD;('d <^d(k-"yYp2N Fx! 5hce|Z1 ,znR)1ˍ=E&B7!5e L*\h F9AD k6.&q7R,EdRi8sSX٘N0Kg~$,L[# "lN@Hwj}\M:Z;ܹwZ4",^gWx*S ^`pBYJ,:W6d%{Mť%^7L.̫P>JڼXTJ g;3F">9d\R1*,'v;a ǧc,px ۪Hy<=W!DIIa㢤^b1uG'`Mxy.\z1è_@Dxߒ;i촑u04gHYV949/Ow!αg!.yx.*H,0f>"/UhlqݘvߒƱYzrzx>zN']-?wr c\-Ҡ≎)07!"?V ZuEZ$'g? o؁3Փ%yX0&\pUe)X\vzSVLs,Rx:eUGI>PT$g!1@|Dyu YZHc |V 8T(MD62'UsUx IDAT".$F~>% p>#Q- =  y1? tBixo*5gnz"QNG*|k |B}ALf`[ípc;J1hxX6$z(Pki7##x/ҔBqk)&刨Cu &z5DK|eC?[ RNVZI(۩ SԳ?ʹ;IJSw FUp1&qBXhު~8=/e 10 +&D%BHO֝ Jc/>sRZ up1)+8pM5R+:_}ʃ12=ڿ3U.rދ 4/::J!1GR]{z)qm':)Ԉz*8~5 f%$wFDbܔĠbV& $ Xʌ4̲Ys4+-Y$$a#/I#xXkJ&M˵LghoWvEVԤ@%T4b lTU({Q:P83HhTEj-T3ǡÂlQżrgk N(\md(7ŊlsbU9SÌNrF+ASuZ#ZlltRcUJuۅ1)`>j9!h0:=bm3R#OgY .!!,QEY'@`+$U%Ki, Bdz iտlR.xYlZQbE*^b!I;UE0]"! L'AgTlH[i(UR`hq! &3Ǩ4i`DVJƆ,2=Z^Y)尕ԔS|WJicRqNq\C3lu,@VhNgX/.\iF'졽%˧"BUd5y2n`W^zޓ C-M^;ԔZ dik#ImFi)Zx!j8R%_B*I,,Gsyk;$iE$ q~.nj"(qVSxVHn[^BInJ*"U`KS%e%yiRϠ),m/&I@S[`ÀNb OBs7 9kois5RRJ2?y3jƢ$Q'!vvYm't)jHiݶY @T,/21hU`@HcҰJY)+.sBGУ)S!{Orӂê{T ^cimoK/pOG1?S?F_/}a7oC2uQg(RC][(zjֱgR(Ka#,R(Joj2Xjm@hY^^l67 α۔$Vbct:?C f,͘>!MpJy2 &.h~ۼb\y f;;;HuWV&'WLZO,bxsysյ.ҹp DKF+/{Wo0Y[ƭ|O_>I{䟒7~Ѵd6-hyIj@ TO)jl{&"؁jz )fkLr2/… A]³fcc5Y>eLs %HθfS d=BJ{OX m4I!O^||?"3y}yO}a+oZH-]p;Fu%$Dh*Mh%?W*rhCO*Ź?!2h.'zWf2ZIf=wO~ŪڹJ}\%d2cVJ38W_|{'0ōeM1/rxwiqkjF)"6<(IDc8{M&1 ÌZg7iRq+7Hk*Lw4_kll2-Jl(1ddbIl826֣;&/SW7~54B݃g%ҡ^ Ddxka$KؖɇĜ^PD}8u2 BSk5'>W0 4c&o߆|Fc3˘IX)*Ixb#=䈵lzNo> o@P ?Dh[k=* W8$I,S{T)EDhQ{fA.dx{\9*9f(bIΖkxApKF3KJEyOo.8 Tg8-9<i'g7u̖¡R_b+qu=IZhx=d0xVoG"fz# p2 5`'㳿O͟77a (e ;GzWX2 D\C}ٿ{{GC 1{6\Jwu%T†UR?yۥ,^@YV<8tr>3N q$lٟ86◢d.sm=.`KHP4`p [*QXޏ?[q AxO=[/%(޳KbJ X! ,}$2}*㨩7kU{2'&]?)hl_Ճ׮=I*Sa ("q}aȓ(pUBI>3:-sW(议w?`6+r!+~2i.(ICI\PV ~֬ +KZ$I.xQz^z&l^Z/JxlמB2npB]{\ॏ?0x~%v Nۼaq=P>}~`gpRF׺EIJ6T !,^TxYZ,.G,C+\臔8I|)~K)v-QIH uQ:+.GX g\TRǛ#fU]D Kt.(N菧*w)[K)sCke$*HWZƃR<{N87iZٷֆQxCisO)G,uC#BFƓM3f!&xLy`b򒤖 q'Bp˅*jKhkO4c!}nV^#H ˇ9;~`{ ;v޽§>aC`-ʥ-=R(bx-Ik'TlQoFV;x=O~.6(AZ!Ϝu}X{)$ؕ"ף"O^!8*&B {u0cx(gx+2KjҲԢ?(b 4?c.%੍ *B)"Hh18S3ɟiB6>S,+: e:p%ܓ,O{@MFƸ,KOO{<(2zFgsP`ݟ'[**[t:^d܅\y O?A"j}\_+Z1jv_?$Q-ů}b&eoG >K!6 ><غFI~, k8!xq!(*&45:&*7T#p>xp*ظHx~23nݝQP2Nf+VdԜP>.GUmmc}33*A:_؁[(eQp:v 癵&Ki8b _/ /ߺsEnߤ :.^B"U" 6\Z>,|(pRNGI6X٢/lQ)ion{FX͡g,=yk۴Z@xfٔdByAkZ$[I y(22aШ O_ޢѬ1NB6CY o]!7O5ke7S!s:x uX4gYj=ϼ<@eRMzX0C(WxsG^4,CuO+X ]x>9=ٝB}6~ъ!(yiMqnBgyVXgH U˝(#i~~kpi~#a29ʑh@rG͐֓&'(.8*!PQ,HH fls'c**|/«3 ,NO{ZE]3($\yo,=R"HFuR5yC/pL>y)C^gcKp?k@$z׎>w;hHvZ{/Z>WoNs:[__~&<{m-#4 H=Z**İ;^r][Fg7_zOr+@ SFIcŻEv<5p`̬4K `VgzuA8͖сifI ^{zt4 _98!j–0(m,6`wK(%QB/Dng*1fX$)Xe7#X,t;Vڠc64)i.[^\9b}< vJ|S楗u%8n_== {'<bfݵ"<ř|{~ ^huǣ FO}ib'd(´|XPjNy/xj6^"0e$ڹ7SY*iAv嵏R.-ƭcNF%d̦hez^ZEʑ02aWv|gi5RN+e;5Ji UauV픕5"dfV&HoBlMftU. Rfn;(E E%.]Rq5m~n"Qz9Vdc>dt!fmc}xgכ\~I\d2A14[̀R{az<7ߜ-&݅>g._e0?:W 3n?\X|*.$I荼(ۇ~߽Df ZG_ͩ`c80<bllS~Og4{ ˮsιoz_g_@DK(1#J,Ɏ8SYY*V";JRN1QT%#rU[%EI@egz=s}@̀ҭjL7u}m۠n!J)V9}> <9"pzǸf:(r9r F{=x6 ^tZ ѨqꂇtezNyӈl]xH[2'+k -3XfX( |G= ./hQ`m:_ƛguLBJQ:i9dc0rm0 !JQW18 ϯ5x{~r]&ԛ넺C k\,llWGL.KgL\.( Lfva"MX$&ZFEݦ86k-Q_pɩqW! L#3h%oX?K/HnylO IDAT^l{3]m~ Hd !|#K!jG2D [NH*2@[FpԪXc8qp\ڽ5Q+d3C rέqyE[q#o r<"Jg?~Wi|.wG׳0^FIBENZK915gri6,9 299X%2Jka;,}Z,ڰ*v:Zk5fIDN! Ä G<E>!&[P*exx'bt~)F( |[)Ԣa La*!殱M=Zx;mq#J -9޼0!̌'#s rm7*&dP{g0]/}֏|rm Z:$X5]]1 _l Ht,OVnw^lIJ6^a0jCJrAЁ yN)##qG?j ~׾nHq'8nF{i$@(N$9qdUPGB W]0wʐ9q>NdžY8qx᧭aldɊ7@!: JI Ej!ؐ/,96>gUQH"䒟Cjr p0"R='^:z\Ŝ+:r361I<ڋ Aq!yT*%&CEk \2K6}E/(u&rU8i(CI Ba#qpqFnm܉bD Eb1` lmVr䑇?\`qb^Ά W5:H$Z]t莥Y to.֚3{r&/fcVB+PE8ۓhH;@ԞE cBC> 7n!x`7O,nV,HIcH&֦(]jt h1Ulkll']&_!Ictɾ6v,--X6Qz!>F2dQJ!P(1X&#$ɒ:yS!BY8yO硶/M^Ts i^o[J&0a$$2.jygӆ|9.C7nNvݛol QdX]p_usx|6#&#l⦧1=pddYvB8l_cm:)dmyF7fo V$H_\#O|#x0J<9TWm[Pİ/QdX!-&LC RiAhM+\6+6Zx1Љ[9…['*.HP'LbK [%"v>cwJaoo-?4djj)is,/'S1?@ -24C"2ף>׭jvvh<_/l\riW뢝,NWP.{Dt}M!rK^$J:jfkÈDqlRt]q\L!l#,V֖>7ġCzh2gysLYCgj|ͭtz׾y 2$'d{n^ݵH{hc-B/fW#O{@F'ރBhzrFG0vmn/z*?$oY^| >-+LjN?#֚|i^t1t|vϋq?.`>Ck~I{bQnur͙bct" l<]E/ \;|H0l7{΍~=\tTNGܑCfrx)![(yߛG:ԆsoΥ H%r(J7pCӣ 8˼_8MZNW87p2PȒ 2L uD' ] wtURFuDbhp0w;6.]N66ɍctW SOZp(WpE/yHjЖH%n'Cw+_젃ݭ"6ѻ{˘d<.1v[7􅫍ok!"jVl{jcds)xh5VaIZJ=H\=õkWx75EqDǏpp;o78߼̍ o%& ob&tCJ%}M7&i?1hriHJD}NA\`@=ikB"1b돁*O{H/`fj2 ͧ|mdN Z2?C(`g6"oXʏ%u=v-vå?Fa ʌT pjjxxh:&&Y{ ? a`MSO13ƢX5Yg:~byƊ"S{=omk%b8<~nHmH'̻\Y%| H:&9M ڝKj&(c!E>=/^3^¥+ \C)"kz2+rR،Zddծ FH' C ]EZ8+xz kov$U035A!uX,..飯~zVWo1:칯 Q<3Kߓ#G;= k / #3V`sbedt q?+Kl6"V6h!R6)Hx;61IZOF]-hUGڞHΌ^dX7[ڲް7oOpڣͤ<MzꫬiV?4ԕ6 \feu/KA3{ܸ׿|Uf\4P`l_\ݯ"npo/>[WUf"i_y\b||!kf/Ӊ3HTYw>z>1YEh UktRս_jTm'~HG*%nZ335$X?f0Pw6;jn+&&p!Y^Lk,-PVsR1?r1ix ,T0cE_+^^"n5CXb^̯֫VQR Ӽ}$?s -h2N8&!*C((|%:Q*: ˡDLc;6Z)veNs"%W,d(V.TC#<LN`_존=?b(m߭2À' s+<J9Z :±KM&,^<{i(LUMx ګunky v w߰|R|.6hO ,!WY-Zu(С=R޽hy a׽#cJe* kJrS8t:r Bf|ר5/mZN_[Wdj3hw:DnKף2r`8qdr9-lTNzUD3ݭ%#5Li PJ+kudxwhޣC߿1%(=:×!$\K\t_;\7 CJd>z0la-o]7{J1Y@/塘GN .W#^_FR ;OL %Zlxop…q{7\GXwk_( ~DBۓ(\ vNx{T@2%@ڐbWe?83ׁ_^ ytޑGKc, 90 CNϠT_}mZ2U8=ZݱXѕ?V rE!_L 뵔2AWVg}/PDݪJ)*ʎCf搤0˞]QaQ&p %塓O_M~Ny7!|_}bQ>Ḫ ɓ#L"dSPDJZv#"`D+Qw@҇i!BQik!*1_aF$Ď/mt #SX5:<-._NnyPGwK b.͸TH|C)LȌ&~]-j=G?_Ur? t\agϲ.T^g.V́)+%LO#e@_݁]jP2}he6bqe)"w\R pC%}lRJ|ʹsz<) {7IԸ5sy;[0|1"$&h~|Ÿx\\W yvֺ:&{Kfap {Oqiq:KdE#R8m"tlcǭō<Ƥ. IDAT{b>㦜G'<k5C_w ܸ=^#5%j6)pr~FխDh`R2J BG?~8Flg}:}e}*8NeD\0UT %qP*@gt&a xM\Yl5#~ 6 շw=J5:<@wtRM ?/h4ۓY,]j+‹3/>ˋϽȋϽVؘ̇ nG +#lGoSo(DZO`!@h<]7H1Y 8ggtmW..sl.y+dKݕEkM(((Gf]_At *gƸ|ƸM!eWKWY]]ɓ8~QT{f_ȃ&f2~"xOclZM |X D|~&,V(]`"I!(&'YXXKN?ֲۚY3ҋ/1448`zz!vE]ʚCQdB #.0ͪb޺aE-hT>ל:ӈ-68_8^Ҋ߭k.P A5R|#<7U7n 1BHżՉ4vH^! >5:8(P5>6'NX< nWY56[[ۜ?>jQפB䎊n,ha~Ac4NztjUwN}e1Y^x*VGԲ}8H1([)Ns0Bċm!h!6 @%2bJk{"!\Ϙcr|'׋ej6=9H7R幾ciˡ'*]ߵH[FuWjl-P6/mFoqmj02o\Za є!gjr/}Re18ؤ\:gfI/wAD6D`3hkby6aG]Q[L M!Lj\ 0[׈k!T7NQ)+-qQ8 sCb33:>@=`v5vn@1wS(=}Ʒ]F8Ġ s<7 ` %k>l[_~zO{epChz+7Amߘ peX/rQCå/^YR0aP։JlX+H*бI1^zXƑ" s.PT96G% yls O KxɥFB,^G 6$_B'%,V݃2drtoef{k,FȤ`k=Y:Q  ,QWxWY6ڋoxJpkFbs WYu}̮v![4v!fJ`d&)k]'~K .'iUJ)=?LE:^O&p!N:CJ?C\~gz5OeWx%r'=l4G ۭTfNu{;7d]w&p@n٫(G0ϯ<( 6d&:٘أK\u,+uzƉ*`CC4 "dz2BbJAy]]Uu0>2Le 1.I[Oq,d$L #DR(N#"^U[lI &M9 1аs9^S@bˆ9B.B]c:E;خz_6^ p״a2F* .lcs  rmIkZ aLdq~]XMVcCTwq~2@٦q%pZ<Ha{Yw$OMkIKk$ -܉15a\1L&Hc+EXj[>kk4چ)j]~{1`p_ 0|P[u~TZTk+@S5 Gjۜ_n1V:t X : V) 䳏Aes e><%b.jͯD|Q&!l(k8PAJ33ɰJ^~uM郄 wx1|]$ehتnd2 Uʔ$Bu_oS8{wI+ҬBmp2E&&8z(R@)C)mq h4xzMj2|~@ xp47^\C}No [jS (K HNf rrb˫M׉BMh5hh&BH&EN P !mA#s[Hz|(UL̂VNVz0}Ҳ( -@Yv7WDN;t8{@Şړ%B0!sRDQD`ޠVmE+B6/ +VjWxacc?qG255VUΝ;+m@fhxRLg(pd? =tF)~91=UJDX#]W "X&%U4&k[4Z֚C1w)R)9zp? T<)+;z{Y`y^:Q~xumKDAJT?|lFv䶫8#!!2k+k\psj{Md3,,Sk4B!" eXJoG~}UÍ-~ ([/|{y IN,=ozc2PS.iGu굆 IĘi%broXXs(+n.CdaZHtYbaa0WN({[Z.ߪY_ۤZk1S:o&SI] s,\E&GNvHf6de5V=6_8"`xgg ?J~٨6_')rCXNfkSI0i[(PB.K DQ R+*PK?cȖ] r5:ҕk Pٌ)F b>iԛٮ6w-aEj&D7ťB97`=jZ7gWt:z? @h|ᩗX]|c.[ g鶈MrwҺNhAF*H[)/XÍ?^rn굆 ȸi0 7D Z/Szԟ^\ewݳ*"KDQZqF^?L+l",o|\8K7^̛WHt.XXqS8 7 #N:&PʣPah4IkM U,$R(,m0.G0]vf%lhuת{x;]Q)iCޮ'sm#O2BV# +IGX vsWwkx/y3;z=K(2m+Bxڃ޶VV8f#L{wO=:f/ lw+8 !%ıe*t^_&Ƈ 4is7B8u4xnݙ4ڸ񞮙F`QBej[&aj?~c/r;<׿BB#L8B$tVMޡjv-X'[*b`tOz6HwCY:\gE-¦kIy4 {Ťa_}qdA$|wF'x!"Ko/s}aK$@jۨYVk#<ϸAzxxrL9REzEu_""#ٹ ^:7GV ࠕ3nF8ވi , Bqcy.d6ưᄯbey^[֢+ϡd8C ^%2$}6?D۽# &q !ltJʳ@ӲnOYvխ-זkCD~ĴZ 9޺JfP(`uRV 9"^w&~[(~&Zӱ!x+\[ K[[& /xQo?Q-=ۘkc;:4o]ZC*HFѤGX?fV $ָS<*bJa<֩Mtj'_f*`Ez  ?+{/nx)"ly7hv:aRc@ DuT`@X% kM H@a1(61CYki-O&E"FflfS\<)d2{78{M'T-J(U@PBt$j2&!k)$BCl#B:9+`VG)Dq[k+UT,(Nq`L.M IfzFȰlYm`RӠމh2W8L|~eϬG7ϩ;wey եUJL)?Kk#+hHWd-K90:N.o('f+|ܼi583H 0D{z)pQvd$":2 W*# t2Y/3 Y"~G\DfK63c.jt UjvFL@`;Լye*(fYg:nMJVIi:Ɛ7qs8ެw;g%-?#-}0wuSyq,|OQJRn1DJ11A*mpzȗ58r!Y0\]o/0?شG2a?xAKą,bv˗|mvpjr!l6?(ojdY f,y"(Fre;diYn"D\.Kvhf lCFdm7"X YjtBEB+ Y+hUMtWa3Ƈ_>Yo^_==9I#Ng'Z+KLM @[$3`rhcDrP^'?qJ]O[<2Q6PyD#{!3@+9oooꫯRFV dDvL,Aq qIV984=WuyR #9hk7-sh.Rm56V$g!N:7"AVcuXO'@ @sheVat [t (o8V6,q >p/7npbڃQlGw#Rkœ@Pou[dX dx`K$?<92F;l*E7jl\[\qryOc>7)";~{jE6۟R:j nRWBAA8T)\nG S5uN}eZQ TFill +pxxFbS.+./U]hmV\Zb5"ݫpVz߱ &dl-e\-3yl +>shFZnI+f1ðőӜ{"R!}swt }]w\_g/cDUNs)4RB E1cdD:gٮ0K&a O e VKݠ~H2RJVWWop3r8-S8)a%V6hFBqfrU4}{P_硓ӎXɁ^ zR!T?$By*!T!tcFb-'ki}e*s!u$|XfhR! N?đSСq UP`M`wf~[T{3lBoWXڲRmHB hjsj0!ak"VVVWF?'VO[xᇵz°5Q ˃cЄ`zN4D50X*`S@B==n^{]5'@*FGw{(Zs׼:0>uo|2. FlSy_ōjP{q'CeG) `|>Vs`XXෟ|f '@WHXh ( C6Нt{inYP' tRb73\O!0:y9ɂf`Ȣ<&ZHF0Xdx,jE#pѓB%[Dl=`zX0Q)0>1ő3=뜺~&[.ͱldzl8c8]7P[i;]*AFAѥL@R)u秲{NP)d)d\[\k/ m# ӗ-l\wn* _AS9+.RW1Z &E Nĵkר7lolDbɵgpxdʠfCR`qfd0ډu07#F ~:VfBm#:yf #_I;y\45Nabb<cBq7q,mՎ=_*P1x Uy IDATR2W6 ח(fJw:%4ϿՆӇG88RN]}@oVJ#҉_( 6שno$/$1[^kp,VG\_䇉͑yn*)wRS\+gyJS>8jͼzb:0>:L> 0?}fmZ㟥ʊX1j3\&ĉXkq}tz.287nXޢP)F> =Mk%dltks~Qi^4'>G>pߩ{g 2y&OT2n9byAdnGtzBf˜0Zgm}ul44D `XP(o0'Nrhe W<^IGo |wMVoJ!+˥K/Ԯ,7n ŭDgMc-szCͬ,lvzP[Rٖ-+-H $A 8_ $| P ZDF5fdlzw·Ϲ*ŮP:@XU{Y{_X2­YmXX27_B',cHF?Kb04ּc |7-cfAXzXk,xtݼ?mc4eUB# %ڻU].pՁf)-8B JX;}\5ƠVk9jRcRH/_<'חf-gn׿~q:ȳmum%*c)rճS8 7vG("/qK>ΰ!$AVf40AS)EU4{]Ξ^#*p{,wKlR݌ IbJ3)oM^ d8dցԃ n(;4Zms% aw܊5Hu&p32GbaBiQ0nGcZOfwx9(-{άNY8W˫1FZ+S€sO3_!qsQ*Rͭ>/}{y88k8wl0 rϝ ppK HpG[:( AL;GI%"3=l ŀ6Ng/{Ja 2xOw 4)ZNg%Q"[ ILj,k [ݘm,ֺ%ٻf<'z0\v@5  %g>/%wew=$IRʥ"I)FKq탃 0,/.P:BR1@X<Ϲ3YCNk\<)p@ko=|5y| Xm#SY2X6k$qpY5H$jz +7[, GE p./5V,T |>Đh5O@o|MIy/Ji

uSY[Yj2C.XW8ħ>Qnmmqsk:5'9kWx*sW quVnwB4\ncBۢfgBVb3yF4c~p!!z XBJgRXw?ocj:a%]a᫟$Mi{`S,.T\b`467 JJ(JC%wjL wlC?f3On^+SDq3X[82P.XP0W''摳'C#B.ndgFg4_s$[?e(s&|gX[YRkFF BSG/?iʑĦBZR/L~C_HBaԉ9YpyF2*hS\] l+%=IBX͈-!^Bs d A(h˵(uEmznLx;O,ac{y\HҊQaDBc2DaY>7 +ҹ4"1 S(1TGuN<}˾7>`̍&?|3f%B@P ,F:}òY+ H7i<~$ nbtc•j~̍֩ڑ ߌ/䝽iTڍJ55)c#ZJtc@7` $a<64Z@`dsX#_d.(`4v={s PM:Ղ`LX *i0t͞ShbJ R|M^z*{Mzf4q~Nˎ+y}7נ& !e&ayknd%W%N_l\$?}.eǸ 0-_{f,h7#Ry;F)~a!}yd0N#2Me;! FX7NA|$!;d;7™!H+[^LeY*$?ƚ[ #/a}eH`#܀PXssE*YQL)85+կno56OR*Nɞ b‰eVo޸2\HA"|}"OZ,F 4)P\6}oD D۔!ϴvHiw,l047tS2#mDڙJ:{O +cZ9= [;APsU w@%n pƎgA{3t?t{86^~[RxA5DA ]dPns,T}[M'gp_w!B?SXɵi&K435Fq:"'x(~eawN3T{ڐ{Z*txaDbU29S0BYK7RX V t8{dYaT0g>#4wJu<Ϙ F1q 3Y ^9ڰsO7݁a{aS-m8{ ?A͕hg-r:+G_/ϝ[!-*a<0ZRT@y`/_a9#K(Rc˿[ $Ȳ5HX\o@0h;dhO])Z8nkgEYPB| 3Ӹm,f'fo[& $ @J0n a2 F"$͔ՏfNϒ*N;Qts%ghcht$ƋP ~+Wy@Bd'K0ʉKRQ_x˻^u{/k)mi33bjS hSk#XGZ;_F?A^(wƴ`M*#<1ωZm•=F`9e#a  @=t?Om|9( 0R,)8hNvR@޳9h!2O \3RH16ɉ#! l7\aj:-ŀ67Ni$\B(g}u]J (1M03e T. `<"=N[ZfO|,Pƚ>Wr[ Dm #zOS.^O;R{ jp% lLڞ:mO2_,9e:՞8pvZ=UCR(HE޺[W8slr1@.)hp,X] 4+^I- hD@CX@ K 1ɃzjBD[֙yIVm${17AJ"[#֠p~W^2)sGc^^DP"|."dnf{C_,0Znl=FzK2I>h2S}{ZB'*1\K24MT c@)!aJ\"RANt7NSK7`1h_a;6ZΞj |s,84_W >Ha+9`'c@^]36I}Rtj82_ɳz&/}H%-d2.%84h`e3u^AɐdT%WE$ CC5(0,]:,)8IH;*DRNEdi%S Z'Xnl2rJ vu(ew=9dRmǞ.| h+k hj" : ^cubB/侷z ghrh lnﲴ8OTBI$M:>a\HLA<;iJK%v F+;)GbQ/|M1 絊[U}ݺl9'M0CJ0 hu;!VtG QPR Cj2i3cv<&Izm`SB9R L1ݯtt4~imΙL<+,IE(p.#h0\EꕂӭvbOgoތ: ?+I1pH $q i$HemIJIϕz /#t54:TEBvi~DL]X !Y IS37BwkHt(Q)o\H 1VmRT;q67\[.#ۣ, cDG0"5,fv@`_LBX`Ve4A|ll,<Ҳ@ ~#~׸S:V(K,3=g%$Z(~/ |\0> dkAi(CVjU€bP=x6wwkڝNL?=FTpzV t{GV帻%nlƔ7)V*&: ӕ:Rhn#3}!X [ zm'35(#*QHVx.6KKKJa|!U}Scgx|i& &W0v3K)7۱rq8C"O~#Hz(uuA\vVI_0r`h+~̋o$ _;5׃J#YO[lD?3Z]-푣JzNa*&:dD  *X][ z`# K%WSÄ͝ `?3l9ÃNVn넣K.d) 4aq@{0,רD[{{h3 l+302Ca^,`L0laPX]XfeFy Z˿3$kDZa~'#Z Mq!'(qK>xv ׁ:I?HA,` /p1"2s@1Mfis^á ^?ۯĘO5zNfb}Z7#xį~nNXk0\o)8ytzh٫5H\`YkNXcѠNbPD;F[d--`MJgH0Gx\KTd{!L0v zoh ng6D[8xkj:3"Gtzv-Օ2Woliv y\᯿stS?.sZ.2HPH+%?|tpZ 7i5oY FM1D0HjcZAVB^w'tCq8IyP ku$ڍһv(0ʉ=ן6 8bĂ 0B.yj25O,-֩TJ :>BRᤕojޭF'Su@2)i Wpwwm՞~|g0 =A$YR6XJSǏp6Hs :b _xykoqaILxw-~@7isHzdgO/߿ɛ X̨5- 0/ 'Cj}"TP IDAT6X_%cC;$J$3LCnº h73ˢuؗ/?qPR-#3_Msf1yJ jmZ #H^y 'n.k5]rVɘlB$߭5h? 9՛|bpL?b%fMĉ,sotYbЏi-*ޑi1}/XU6fc!0`n!oaJ\!ZsDQZB9XϺB xkMIXN_6m_)֌& +XDC\9k\֗'1% QأH敷6IRٟ|B!N2We nm g J(y2Oêfg !1ǩ#HpYҤܡ^O|E ^KY0)H HXZrƯN $F"X*=L%ԔE"EX" ubFHr}599!׶gJ{Po@8Glm=8-0fE Al7}?#!R٩ޭ!uf;͍Ftf诔B7xMZ?'XZ#`Me]-nD$EaZdܺ'tc.WF\`2-nQfiNӸ% msL6ѻbR2 ;. jWxFk-GT9;qd. $K5檨0DXqChgfl{8( /.>3%0‘Gw3}N8r᡽ր닌 բC;t 9}k7 G>eb@-G(77|w^gS<~nšlqBMߵg!c+DLH`7- Ce_-1icFl$23Q2,{7&~SH CңBZET0J5(j#Y2_/R(K(峷;HMpKe ֈ@:R(|+7-Y=$&竃S9߻̧.#IG4뿗 <6й~Z)GOP.x.^3;sgVBX+S‰] -X2OnZJUk9c njF1zVkњ81L R? n,\&TEzA1W A K!HkE*byN8KvDj!VP*%1f{WlϞ||#m|]{ǸPlG$ZEkރr:J0>y} GoI@ N,רW vyo|-.^/0_+_+Zm=#+/a~s`f{W_z ~TQe< ~c;6Gca鮿yNؘqJƱ'῔B,*ŧ/>_y'έS~}N)9yޠ+=)qE9S6s>/76 ʖ+y?|fMY"oXyvX"W>9RqP`Rzuea$02Zњx@ mڕ=4<;B5~/faTUAh1FGLto#a'+r,TjޥjV5X(-XC)W ߻Oȱջ{iArf.vʗX3įl?[6x!;mdJbғl>F,޾YָPƋE/w6SdY8bz=q0d{o@4WGY!"_Y.oόwL>Ib5IbGU3Jݔ]2Hk9qJƱ&$JY=Wnsu_o5~3qlNX)f:}g᭙)=f HvNϢ=Ȗ|Ę>L(3Vvj,nVA ?)RH1^``FIVuJT8lJ!q#S0ʱ"b2]C8)߻x7)k<#CVj5>&D"uUœ9ztKx6> \PA9Mp_<}KB@]Vu78g닿ϔ^!MSi[hdJo>d2%0V*gOsQ*/=1 g8Z݋6/lr{9wuf_%B{M9n9tJJ2Gt}z݄fC\˩Zs.VVzw[.cNkTRi!tFP*WY\^Fn'~DޯH> ukVW%Sɹ_Gȶuar(η(J ~S|ST ߼ɿ :CM>R~++3Buc &9uR a'I 'Rdo{q1G0?ipV?ʕZjYtWWf+AN8(CΝ9\NAOO=ʳP|땫7;Efsk~w7+61 arҪbiYidJ:azyYtĨǍmذs>\J~_đ>N>}ʹ!bǔerP{>S]ZzpfՖGX_scå ^|y䓧8rB큳r(pN0.+ƃ\N(Ħg3`S:ncY*Sݮhlm1n^ ˔f}SjKjo };pDE30׌5gk+,Wil2l@ʄ G+?@o0dsyKolK< 4 U@g!Q W>%7fl2]*y33S5`EЯ[MC'^^ ?+p>}摩V+e"bJ=q/d2zqnͽP,Ksȼ|`<\0M}e|;m{LqRk`NFKZ#NZ1=}How=|_۟|Jb|8TOLjJk~f'q) XƤ$Ƣdwa J֖Y[q|} ADI}1SOyeysQҢ݉yK\Gs3kQR)p: *_A~2??FPȑ(,,d"M6BYNUי]V^8+PF'[t{T~,gt2mllwզ7b[82Wa~.=\!|H%hmEs4;C˼vy i1FXh mگ׀s]at :O=#'א6XA}\Ⲏwyd1XL%Qyea;c{O)3' ƀ&ީ5 cnN2@a (㬮̱Teue@0BI~KwJ+hfF;)r &2Bi7& րF^A ,Q, Lj2K$mhG$^8v{?Fdl@ 7; fŨxR}D3 nC&_݊h\z3zZFegg4qH^R׺ ݿUR.NS@NX3H,/q@RU ֖8z:@6) /3" (cш0XF185$q.>F\ظorkA!I%kݻ\κCh~P2׃tḙFaN1$ rO|(%N谿 N@zml0^Nz)%PJsȂ_.#PZXc0Zc>m{-vm0-;ΌNfN8_zXHj, X}u}qycFAT!;j|ya'|2f8ȓe=} *|3#Tj,8hoDDZ2379If*@)0X39~ g=F5}j^|G M$:-c1Rɘ;CTB<JE:xN:MB.#b#,{ˏv1I&γbV1Sξ{B(9`>) }? ,"FkXc 3\P,=KT ~q|A%5djp)eۉ?(*c5KIZP<5Y{M8q\铜>ub)D+$t8&3s#*`fZ%hۤi ಿ(BFpvf bsvg_8{t=4SҗNg笔q2rA\~Bf{ -%T*92… -.Q( EsVRM2PܹCy%MҏVVx8U>\*ww$RaaJZ?t:=FT## ަTE_XJg]jt,=' @Mi;ZR^*e1qTnKP*3 ެ7~p1WX u $a˾-9 a=8̫;S8.DQr*NZ4&c%~^.n+w=|-fūF阱v©BJB曌:~iqh Zj?)&h'[Oݕe58?ǧz{CbiqqRtW8B'|B2E{`1& X2M J(""6|qRd _oO-p+cj s|e9*H3S,"B&0GjqO<"'GIT/FtRv۸+z0pmПVF^ 6>hKpȴ1@RDpZ  ktWuΞ=S6Ibm{am=[YjD! -38pz}NeVD{W/,,y {LN[vv+ N~6w;H)&p| &[f듉<Ob5  7[\؛>! ̏R? /P.Q|wB>,sO> ?rf m .oN4ˏuO tVJ9IWJ%M% !Sԧ~#֖cs{C6L> w+ǙX~?G!fJ$܄-+<[R㏳|$e;i)~9Wx70qk%5& xbxǽ{.} +yP(O8f]tRؙJȀk nLC!a=%3Wj ޻Vp3Z^26 ,py9䃸ns{3%^ọ,;SnYW|PӉuHf `ȅ%W[Ǯ 'rkL?0fdiY8>h-(FD2R+ZofmDxg;r 1~@ Ns\%cU\U=*%r<6㧨x#QRZRKEY |$ۯʼxy W|t߱?zT3hexQ7R6L:3tSl+S2?)B5%\` 4kL3Ȁ@x^S"}hbnY;vv+0@ƪA9mjj`mމ'2!T>o,rޥB%mZ&p 5^AuWbՓIcc#7ֻH Wgw?J`vD>2e|ٚ|G$3 !PJdHJ:Ȭd4_Z #܏O7}81J[-mJ% `AK|>ϸqȢjj֕7&7LM-\d"8|]Mn)A}\QV"#]U3#2rWNLgon o$$^xڗ/984P-xO2p)5RYk RF,b#'AE5>mJ)RM{"pߓ=ɺgyDZJ%7<;RF FCޗҵ A@=E9xO.Fw<\RGMBȅ2D,eg'J-,a෸^d"c鍴ϪJt9 8`M*.Ӿ~4j 6m}'UPW[>7|N/ϒamJ4z@؏$.6WBg)`]8F}U%ê udT- 7`!iN 1GH{| t5ЉZXmܻ~5v!0dD&Xb9x|'gjd>V\aSz^X͜s/eK L= FȰ|eCӇ5@m'pHIXOr>K^j7B͔5H\U"/:;_o}+1l4dn5+)ꭩ7m>P+nwg Q yB%|̯H<\.ƕjZB)k:[fqġޥ@aǵ4&nc!߻VJFT&t a)fvpڥ~?01\@'߅ x=/մrȉa qzYWӡ~pT`65ֽ^)1=4:]ツTS Y&0شu߼V}ޫvC(ҕKrqHq;a0•`:y#L?(P|q $1"o \c"zU,["R+#=1#jgD2)mdbim}[AtJ:ێH<}+/E.E%FX !k%֊cX{a<}f yqLm"aYPKos.tq:W`|Y3&$~t n^qF"m|0\P@-N{&,@"\_Ejrŏƺz⨜nI~sQu3$ Nƈ3Z4CV}8\w$@ֱŵώ6_b,()F#ܸW)!+S'xf %z:favl>S[ns'|4n[@oh(1lݺ?<RJ5o'ǻ˂[ $ u<*S7s.es+ =&OS$@*.]A!35dY&O:MM mfKN #x,!)|XooVy 7M!,IfrE n{V6oBSS=͓8Ӛhq]reyoǜUn⺢擪+[p§Ogي x | }aƖM$4"UW/^]wMgGW IFh˟YNX5==9'Ml6gV4(\)@1 g*lmmcyrG1VE)`>)Tc{QGѺ !*BҧxUtt\M㏜NcC8/K[NgI\u79zt@"uPdbٌ䀱JeZZ[Yq0OV)Ҳ- $L_j̻ߨPǕ/70Dύ.<;zx`S9c:ȋ`A =uAڕ5ɹjk9w0퐃ںaA](K 4 3fEc\: k93އۋ9Ν,(F/˥&>eg3CZs^QC(o3N+ZƍY5ƍ1y"-7PCUe +Ɍ˟!IL=āģ xpaRENhsN?}qH!TB~FMo@ ijE TxǿH 8iW_':$@FIwɿe8~}ޝUmҽ}U` nYa؏| ~j3vD6G8_+ JI=>,+6TۼɿEsbiT+JK'ekgxkL#D606P_'GY),`J~E`KTkH*YJ:-)YkvcS4g hdKK%lltWu;o%ezB,*n8(c=1(aor5[)LJ-GqM"\~ m|f]wgMLm"~5^3L'RIbI N`Gq)p"\ ^}ŒZFe0XpU#hJye堃&[&0MJ6hE_8֬GP Yt|]k xrrRVũāoW?Iއ19^S+V'XƺոȤZbJ&4~l $|ͭ2~ut1k#w?V'ŝJ,LpФTf@H38H+. ʆLHO~S+ ,EX }ɏYvSP,[N~0H 711 8r ׯl+g_=M$#f$[E@@ h.9@GWKA )q(w?iH9wjK5ϩ#ֽ^_ϼYOmt?#X@}G @u`)Ts[[;˞[EB}W e q@u`p듁K5;օgUH1). q@" v|产9 ?a!h'M5\8 8|9\ˮFG׍ $$A"]K^x !kV CϏ+'Tm +go_|׿S rA,!H0hO1lmK ^kt.Fkp}k6mxy>AjFu&!hylq̑3a`r|{n 4jwx $} 8i8$m7_$5Ý/`$d~HW})p@ }jpJ0NAI8PDIENDB`technomancy-leiningen-713a4d9/resources/leiningen/000077500000000000000000000000001173437653500223265ustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/000077500000000000000000000000001173437653500232565ustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/copying000077700000000000000000000000001173437653500265402../../../COPYINGustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/deploying000077700000000000000000000000001173437653500301122../../../doc/DEPLOY.mdustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/news000077700000000000000000000000001173437653500255102../../../NEWSustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/readme000077700000000000000000000000001173437653500265512../../../README.mdustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/sample000077700000000000000000000000001173437653500307362../../../sample.project.cljustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/leiningen/help/tutorial000077700000000000000000000000001173437653500302322../../../doc/TUTORIAL.mdustar00rootroot00000000000000technomancy-leiningen-713a4d9/resources/script-template000066400000000000000000000006301173437653500234150ustar00rootroot00000000000000#!/bin/sh # This script was automatically generated by Leiningen. CLASSPATH="%s" NULL_DEVICE=/dev/null JVM_OPTS=${JVM_OPTS:-$JAVA_OPTS} MAIN="%s" VERSION="%s" if [ "$OSTYPE" = "cygwin" ]; then CLASSPATH=`cygpath -wp "$CLASSPATH"` NULL_DEVICE=NUL fi java -cp "$CLASSPATH" $JVM_OPTS -Dproject.version=$VERSION \ clojure.main -e "(use '$MAIN)(apply -main *command-line-args*)" $NULL_DEVICE "$@" technomancy-leiningen-713a4d9/resources/script-template.bat000066400000000000000000000005261173437653500241660ustar00rootroot00000000000000@echo off rem This script was automatically generated by Leiningen. setLocal if "x%%JVM_OPTS%%" == "x" set JVM_OPTS=%%JAVA_OPTS%% set CLASSPATH="%s" set MAIN="%s" set VERSION="%s" java -cp "%%CLASSPATH%%" %%JVM_OPTS%% -Dproject.version=%%VERSION%%^ clojure.main -e "(use '%%MAIN%%)(apply -main *command-line-args*)" NUL %%* technomancy-leiningen-713a4d9/sample.project.clj000066400000000000000000000273301173437653500217710ustar00rootroot00000000000000;; This is an annotated example of the options that may be set in a ;; project.clj file. It is a fairly contrived example in order to ;; cover all options exhaustively; it shouldn't be considered a ;; representative configuration. For a more detailed explanation of ;; some of the terms run "lein help tutorial". ;; The project is named "sample", and its group-id is "org.example". (defproject org.example/sample "1.0.0-SNAPSHOT" ; version "1.0.0-SNAPSHOT" ;; Beyond this point you may prepend a form with unquote, or ~, to eval it. ;; The descrption text is searchable from repositories like Clojars. :description "A sample project" :url "http://example.org/sample-clojure-project" ;; The mailing list of the project. If the project has multiple mailing ;; lists, use the :mailing-lists key (bound to a seq of mailing list ;; descriptions as below). :mailing-list {:name "sample mailing list" :archive "http://example.org/sample-mailing-list-archives" :other-archives ["http://example.org/sample-list-archive2" "http://example.org/sample-list-archive3"] :post "list@example.org" :subscribe "list-subscribe@example.org" :unsubscribe "list-unsubscribe@example.org"} ;; The project's license. :distribution should be :repo or :manual; ;; :repo means it is ok for public repositories to host this project's ;; artifacts. A seq of :licenses is also supported. :license {:name "Eclipse Public License - v 1.0" :url "http://www.eclipse.org/legal/epl-v10.html" :distribution :repo :comments "same as Clojure"} ;; Dependencies are listed as [group-id/name version]. :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"] [org.jclouds/jclouds "1.0-RC6" :classifier "jdk15"] [net.sf.ehcache/ehcache "2.3.1" :type "pom"] [log4j "1.2.15" :exclusions [javax.mail/mail javax.jms/jms com.sun.jdmk/jmxtools com.sun.jmx/jmxri]]] ;; The plugins listed here will be accessible in Leiningen's own ;; process, but not in the project. :plugins [[lein-tar "1.0.6"]] ;; Dev dependencies are intended for use only during ;; development. Projects that depend on this project will not pull ;; in its dev-dependencies, and they won't be included in the uberjar. ;; These will appear both in Leiningen's process and the project's. :dev-dependencies [[org.clojure/swank-clojure "1.2.1"]] ;; Global exclusions are applied across the board, as an alternative ;; to duplication for multiple depedencies with the same excluded libraries. :exclusions [org.apache.poi/poi org.apache.poi/poi-ooxml] ;; Only re-fetch dependencies when they change in project.clj or ;; when :library-path directory is empty. :checksum-deps true ;; Warns users of earlier versions of Leiningen. :min-lein-version "1.3.0" ;; Before fetching dependencies, the contents of the lib/ directory ;; will get deleted unless this is set to true. :disable-deps-clean false ;; Delete .class files that do not have a correspoinding package in ;; the src/ directory. Workaround for Clojure bug CLJ-322. Causes problems ;; with protocols in upstream libraries; false by default. Set to ;; true to delete all non-project classes or set to a seq of regexes ;; to only delete class files that match one of the regexes. :clean-non-project-classes true ;; If :clean-non-project-classes is set to true, you can set this to ;; be a regex; all class filenames that match this regex will be preserved. :class-file-whitelist #"^(org/example|clojure)" ;; Additional files (besides :compile-path contents and jars/uberjars) ;; to be deleted during clean phase. May contain %s, which will be replaced ;; with the project's current version number. :extra-files-to-clean ["tmp" "sample-%s.tar"] ;; If the files you want to delete can't be exact matches, you can ;; use a regex that will be matched against filenames in the project root. ;; Defaults to #"^$NAME-.*\.jar$". :regex-to-clean #"hs_err_pid.*" ;; Paths to include on the classpath from each project in the ;; checkouts/ directory. (See the FAQ in the Readme for more details ;; about checkout dependencies.) Set this to be a vector of ;; functions that take the target project as argument. Defaults to ;; [:source-path :compile-path :resources-path], but you could use ;; the following to share code from the test suite: :checkout-deps-shares [:source-path :test-path ~(fn [p] (str (:root p) "/lib/dev/*"))] ;; Load these namespaces on startup to pick up hooks from them. Hooks ;; generally come from plugins, but may be included in your project source. :hooks [leiningen.hooks.difftest] ;; Predicates to determine whether to run a test or not. See tutorial. :test-selectors {:default (fn [t] (not (or (:integration v) (:regression v)))) :integration :integration :regression :regression} ;; Set this to true to search the classpath for hooks. Will load all ;; namespaces matching leiningen.hooks.*. Warning: this will cause ;; Leiningen to start slowly, especially with many dependencies. :implicit-hooks false ;; These namespaces will be AOT-compiled. Needed for gen-class and ;; other Java interop functionality. :namespaces is an alias for this. ;; Put a regex here to compile all namespaces whose names match. :aot [org.example.sample] ;; The -main function in this namespace will be run at launch if you ;; create an uberjar. Repl sessions will start in this namespace as well. ;; Set :skip-aot metadata on this symbol to use it for other things like the ;; run task or shell wrappers without bringing in AOT if you don't need an ;; executable uberjar. :main org.example.sample ;; This namespace will get loaded automatically when you launch a repl. :repl-init sample.repl-helper ;; This file will get loaded automatically when you launch a repl, ;; but it's deprecated; use :repl-init above instead. :repl-init-script "src/main/clojure/init.clj" ;; These will get passed to clojure.main/repl; see its docstring for details. :repl-options [:prompt (fn [] (print "your command, master? ") (flush))] ;; Customize the socket the repl task listens on. :repl-port 4001 :repl-host "0.0.0.0" ;; A form to prepend to every form that is evaluated inside your project. ;; Allows working around the Gilardi Scenario: http://technomancy.us/143 :project-init (require 'clojure.pprint) ;; If your -main namespace takes a long time to load, it could time out the ;; repl connection. Increase this to give it more time. Defaults to 100. :repl-retry-limit 1000 ;; Emit warnings on all reflection calls. :warn-on-reflection true ;; Set this in order to only use the :repositories you list below. Note that, ;; if any artifacts are not found, Maven Central will still be reported to ;; have been checked, even though it was not. :omit-default-repositories true :repositories {"java.net" "http://download.java.net/maven/2" "sonatype" {:url "http://oss.sonatype.org/content/repositories/releases" ;; If a repository contains releases only; setting :snapshots ;; to false will speed up dependency checking. :snapshots false ;; You can also set the policies for how to handle :checksum ;; failures to :fail, :warn, or :ignore. In :releases, :daily, ;; :always, and :never are supported. :releases {:checksum :fail :update :always}} ;; Repositories named "snapshots" and "releases" automatically ;; have their :snapshots and :releases disabled as appropriate. "snapshots" {:url "http://blueant.com/archiva/snapshots" ;; You should store credentials in your ~/.lein/init.clj ;; file; see "lein help deploy" for details. ;; Also supports :private-key and :passphrase. :username "milgrim" :password "locative.1"} "releases" {:url "http://blueant.com/archiva/internal" :username "milgrim" :password "locative.1"}} ;; the deploy task will give preference to repositories specified in ;; :deploy-repositories, and repos listed there will not be used for ;; dependency resolution :deploy-repositories {"releases" {:url "http://blueant.com/archiva/internal/releases" :username "milgrim" :password "locative.1"} "snapshots" "http://blueant.com/archiva/internal/snapshots"} ;; If you'd rather use a different directory structure, you can set these. :source-path "src/main/clojure" :compile-path "target/classes" ; for .class files :library-path "target/dependency" ; for .jar files :test-path "src/test/clojure" :resources-path "src/main/resource" ; non-code files included in classpath/jar :dev-resources-path "src/test/resource" ; added to dev classpath but not jar :native-path "src/native" ; where to look for native dependencies :target-dir "target/ " ; where to place the project's jar file :extra-classpath-dirs ["script"] ; more classpath entries not included in jar :jar-name "sample.jar" ; name of the jar produced by 'lein jar' :uberjar-name "sample-standalone.jar" ; as above for uberjar ;; Construct classpath from jars in ~/.m2 rather than copying to :library-path :local-repo-classpath true ;; Options to pass to java compiler for java source ;; See http://ant.apache.org/manual/Tasks/javac.html :javac-options {:destdir "classes/"} :java-source-path "src/main/java" ; location of Java source ;; Leave the contents of :source-path out of jars (for AOT projects) :omit-source true ;; Files with names matching any of these patterns will be excluded from jars :jar-exclusions [#"(?:^|/).svn/"] ;; Same thing, but for uberjars. :uberjar-exclusions [#"META-INF/DUMMY.SF"] ;; Set arbitrary key/value pairs for the jar's manifest. :manifest {"Project-awesome-level" "super-great"} ;; You can set JVM-level options here. :jvm-opts ["-Xmx1g"] ;; If your project is a Leiningen plugin, set this to skip the subprocess step :eval-in-leiningen false ;; Leiningen includes a workaround for a problem with Clojure's ;; agent thread pool. If you see RejectedExecutionException using ;; futures or agents, you may be working with a plugin that doesn't ;; take this workaround into account yet--see the "Threads" section ;; of doc/PLUGINS.md. This key will disable Leiningen's workaround. ;; It may cause some other plugins to fail to exit when they finish. :skip-shutdown-agents true ;; Set parent for working with in a multi-module maven project :parent [org.example/parent "0.0.1" :relative-path "../parent/pom.xml"] ;; You can add extensions to the build process (such as add an ftp ;; provider for the Wagon transport mechanism), as well as make ;; plugins active which make changes to the build lifecycle. :extensions [[org.apache.maven.wagon/wagon-webdav "1.0-beta-2"] [foo/bar-baz "1.0"]]) ;; You can use Robert Hooke to modify behaviour of any task function, ;; but the prepend-tasks function is shorthand that is more convenient ;; on tasks that take a single project argument. (use '[leiningen.core :only [prepend-tasks]] '[leiningen.deps :only [deps]] '[leiningen.clean :only [clean]] '[leiningen.pom :only [pom]]) (prepend-tasks #'deps clean pom) technomancy-leiningen-713a4d9/src/000077500000000000000000000000001173437653500171335ustar00rootroot00000000000000technomancy-leiningen-713a4d9/src/lancet.clj000077500000000000000000000107211173437653500210770ustar00rootroot00000000000000(ns lancet (:gen-class) (:import (java.beans Introspector) (java.util.concurrent CountDownLatch) (org.apache.tools.ant.types Path))) (println "WARNING: lancet namespace is deprecated; use lancet.core.") (def #^{:doc "Dummy ant project to keep Ant tasks happy"} ant-project (let [proj (org.apache.tools.ant.Project.) logger (org.apache.tools.ant.NoBannerLogger.)] (doto logger (.setMessageOutputLevel org.apache.tools.ant.Project/MSG_INFO) (.setEmacsMode true) (.setOutputPrintStream System/out) (.setErrorPrintStream System/err)) (doto proj (.init) (.addBuildListener logger)))) (defmulti coerce (fn [dest-class src-inst] [dest-class (class src-inst)])) (defmethod coerce [java.io.File String] [_ str] (java.io.File. str)) (defmethod coerce [Boolean/TYPE String] [_ str] (contains? #{"on" "yes" "true"} (.toLowerCase str))) (defmethod coerce :default [dest-cls obj] (cast dest-cls obj)) (defmethod coerce [Path String] [_ str] (Path. lancet/ant-project str)) (defn env [val] (System/getenv (name val))) (defn- build-sh-args [args] (concat (.split (first args) " +") (rest args))) (defn property-descriptor [inst prop-name] (first (filter #(= prop-name (.getName %)) (.getPropertyDescriptors (Introspector/getBeanInfo (class inst)))))) (defn get-property-class [write-method] (first (.getParameterTypes write-method))) (defn set-property! [inst prop value] (let [pd (property-descriptor inst prop)] (when-not pd (throw (Exception. (format "No such property %s." prop)))) (let [write-method (.getWriteMethod pd) dest-class (get-property-class write-method)] (.invoke write-method inst (into-array [(coerce dest-class value)]))))) (defn set-properties! [inst prop-map] (doseq [[k v] prop-map] (set-property! inst (name k) v))) (defn instantiate-task [project name props & filesets] (let [task (.createTask project name)] (when-not task (throw (Exception. (format "No task named %s." name)))) (doto task (.init) (.setProject project) (set-properties! props)) (doseq [fs filesets] (.addFileset task fs)) task)) (defn runonce "Create a function that will only run once. All other invocations return the first calculated value. The function *can* have side effects and calls to runonce *can* be composed. Deadlock is possible if you have circular dependencies. Returns a [has-run-predicate, reset-fn, once-fn]" [function] (let [sentinel (Object.) result (atom sentinel) reset-fn (fn [] (reset! result sentinel)) has-run-fn (fn [] (not= @result sentinel))] [has-run-fn reset-fn (fn [& args] (locking sentinel (if (= @result sentinel) (reset! result (function)) @result)))])) (defmacro has-run? [f] `((:has-run (meta (var ~f))))) (defmacro reset [f] `((:reset-fn (meta (var ~f))))) (def targets (atom #{})) (defmacro deftarget [sym doc & forms] (swap! targets #(conj % sym)) (let [has-run (gensym "hr-") reset-fn (gensym "rf-")] `(let [[~has-run ~reset-fn once-fn#] (runonce (fn [] ~@forms))] (def ~(with-meta sym {:doc doc :has-run has-run :reset-fn reset-fn}) once-fn#)))) (defmacro define-ant-task [clj-name ant-name] `(defn ~clj-name [& props#] (let [task# (apply instantiate-task ant-project ~(name ant-name) props#)] (.execute task#) task#))) (defmacro define-ant-type [clj-name ant-name] `(defn ~clj-name [props#] (let [bean# (new ~ant-name)] (set-properties! bean# props#) (when (property-descriptor bean# "project") (set-property! bean# "project" ant-project)) bean#))) (defn task-names [] (map symbol (seq (.. ant-project getTaskDefinitions keySet)))) (defn safe-ant-name [n] (if (ns-resolve 'clojure.core n) (symbol (str "ant-" n)) n)) (defmacro define-all-ant-tasks [] `(do ~@(map (fn [n] `(define-ant-task ~n ~n)) (task-names)))) (defmacro define-all-ant-tasks [] `(do ~@(map (fn [n] `(define-ant-task ~(safe-ant-name n) ~n)) (task-names)))) (define-all-ant-tasks) ;; The version of ant that maven-ant-tasks requires doesn't have this class: ;; (define-ant-type files org.apache.tools.ant.types.resources.Files) (define-ant-type fileset org.apache.tools.ant.types.FileSet) (defn -main [& targs] (load-file "build.clj") (if targs (doseq [targ (map symbol targs)] (eval (list targ))) (println "Available targets: " @targets))) technomancy-leiningen-713a4d9/src/leiningen/000077500000000000000000000000001173437653500211035ustar00rootroot00000000000000technomancy-leiningen-713a4d9/src/leiningen/classpath.clj000066400000000000000000000045431173437653500235650ustar00rootroot00000000000000(ns leiningen.classpath "Print the classpath of the current project." (:use [leiningen.core :only [read-project no-dev?]] [leiningen.deps :only [find-deps-files]] [leiningen.util.paths :only [leiningen-home]] [clojure.java.io :only [file]] [clojure.string :only [join]])) (defn- read-dependency-project [dep] (let [project (.getAbsolutePath (file dep "project.clj"))] (try (read-project project) (catch Exception e (throw (Exception. (format "Problem loading %s" project) e)))))) (defn- ensure-absolute [path root] (.getCanonicalPath (let [f (file path)] (if (.isAbsolute f) f (file root f))))) (defn checkout-deps-paths [project] (apply concat (for [dep (.listFiles (file (:root project) "checkouts")) ;; Note that this resets the leiningen.core/project var! :let [proj (read-dependency-project dep)] :when proj] (for [d (:checkout-deps-shares project [:source-path :compile-path :resources-path])] (ensure-absolute (d proj) dep))))) (defn user-plugins [] (for [jar (.listFiles (file (leiningen-home) "plugins")) :when (re-find #"\.jar$" (.getName jar))] (.getAbsolutePath jar))) (defn get-classpath "Answer a list of classpath entries for PROJECT." [project] ;; TODO: special-case for eval-in-leiningen (concat (if-not (no-dev?) [(:test-path project) (:dev-resources-path project)]) [(:source-path project) (:compile-path project) (:resources-path project)] (:extra-classpath-dirs project) (checkout-deps-paths project) (find-deps-files project) (if-not (no-dev?) (user-plugins)))) (defn get-classpath-string [project] (join java.io.File/pathSeparatorChar (get-classpath project))) (defn classpath "Print the classpath of the current project. Suitable for java's -classpath option. Warning: due to a bug in ant, calling this task with :local-repo-classpath set when the dependencies have not been fetched will result in spurious output before the classpath. In such cases, pipe to tail -n 1." [project] (println (get-classpath-string project))) technomancy-leiningen-713a4d9/src/leiningen/clean.clj000066400000000000000000000020731173437653500226610ustar00rootroot00000000000000(ns leiningen.clean "Remove compiled class files from project." (:require [leiningen.util.paths :as paths]) (:use [leiningen.util.file :only [delete-file-recursively]] [clojure.java.io :only [file]])) (defn clean-jar-pred [project] (let [default-regex (re-pattern (format "^%s-.*\\.jar$" (:name project)))] (fn [f] (re-find (:regex-to-clean project default-regex) (.getName f))))) (defn files-to-clean [project] (concat [(:compile-path project)] (filter (clean-jar-pred project) (.listFiles (file (:root project)))) (for [f (:extra-files-to-clean project)] (format f (:version project))))) (defn clean "Remove compiled class files and jars from project. Set :extra-files-to-clean in project.clj to delete other files. Dependency jars are not deleted; run deps task to delete all jars and get fresh ones." [project] (doseq [f (files-to-clean project)] (delete-file-recursively f :silently)) ;; This sometimes helps release files for deletion on windows. (when (= :windows (paths/get-os)) (System/gc))) technomancy-leiningen-713a4d9/src/leiningen/compile.clj000066400000000000000000000267371173437653500232440ustar00rootroot00000000000000(ns leiningen.compile "Compile Clojure source into .class files." (:use [leiningen.deps :only [deps find-deps-files]] [leiningen.core :only [defdeprecated user-settings *interactive?*]] [leiningen.javac :only [javac]] [leiningen.classpath :only [get-classpath-string]] [clojure.java.io :only [file resource reader copy]] [leiningen.util.ns :only [namespaces-in-dir]]) (:require [leiningen.util.paths :as paths] [clojure.string :as string]) (:refer-clojure :exclude [compile]) (:import (java.io PushbackReader))) (declare compile) (def ^{:dynamic true} *silently* false) (def ^{:dynamic true} *skip-auto-compile* false) (defn- regex? "Returns true if we have regex class" [str-or-re] (instance? java.util.regex.Pattern str-or-re)) (defn- matching-namespaces [re-or-sym namespaces] (if (regex? re-or-sym) (filter #(re-find re-or-sym (name %)) namespaces) [re-or-sym])) (defn- find-namespaces-by-regex "Trying to generate list of namespaces, matching to given regexs" [project nses] (let [project-nses (namespaces-in-dir (:source-path project))] (mapcat #(matching-namespaces % project-nses) nses))) (defn- compile-main? [{:keys [main source-path] :as project}] (and main (not (:skip-aot (meta main))) (.exists (file source-path (paths/ns->path main))))) (defn compilable-namespaces "Returns a seq of the namespaces that are compilable, regardless of whether their class files are present and up-to-date." [project] (when (:namespaces project) (println "WARNING: :namespaces in project.clj is deprecated; use :aot.")) (let [nses (or (:aot project) (:namespaces project)) nses (if (= :all nses) (namespaces-in-dir (:source-path project)) (find-namespaces-by-regex project nses))] (if (compile-main? project) (conj nses (:main project)) nses))) (defn stale-namespaces "Return a seq of namespaces that are both compilable and that have missing or out-of-date class files." [project] (filter (fn [n] (let [clj-path (paths/ns->path n) class-file (file (:compile-path project) (.replace clj-path "\\.clj" "__init.class"))] (or (not (.exists class-file)) (> (.lastModified (file (:source-path project) clj-path)) (.lastModified class-file))))) (compilable-namespaces project))) ;; eval-in-project (defdeprecated get-os paths/get-os) (defdeprecated get-os paths/get-arch) (defn platform-nullsink [] (file (if (= :windows (paths/get-os)) "NUL" "/dev/null"))) (defn- as-str [x] (if (instance? clojure.lang.Named x) (name x) (str x))) (defn- d-property [[k v]] (format "-D%s=%s" (as-str k) v)) ;; TODO: this would still screw up with something like this: ;; export JAVA_OPTS="-Dmain.greeting=\"hello -main\" -Xmx512m" (defn- join-broken-arg [args x] (if (= \- (first x)) (conj args x) (conj (vec (butlast args)) (str (last args) " " x)))) (defn ^{:internal true} get-jvm-opts-from-env [env-opts] (when (seq env-opts) (reduce join-broken-arg [] (.split env-opts " ")))) (defn ^{:internal true} get-jvm-args [project] (let [native-arch-path (paths/native-arch-path project)] `(~@(get-jvm-opts-from-env (System/getenv "JVM_OPTS")) ~@(:jvm-opts project) ~@(:jvm-opts (user-settings)) ~@(map d-property {:clojure.compile.path (:compile-path project) (str (:name project) ".version") (:version project) :clojure.debug (boolean (or (System/getenv "DEBUG") (:debug project)))}) ~@(when (and native-arch-path (.exists native-arch-path)) [(d-property [:java.library.path native-arch-path])])))) (defn- injected-forms [] (with-open [rdr (-> "robert/hooke.clj" resource reader PushbackReader.)] `(do (ns ~'leiningen.util.injected) ~@(doall (take 6 (rest (repeatedly #(read rdr))))) (ns ~'user)))) (defn get-readable-form [java project form init] (let [form `(do ~init ~(:project-init project) ~@(let [user-clj (file (paths/leiningen-home) "user.clj")] (if (.exists user-clj) [(list 'load-file (str user-clj))])) ~(injected-forms) (set! ~'*warn-on-reflection* ~(:warn-on-reflection project)) (try ~form ;; non-daemon threads will prevent process from exiting; ;; see http://tinyurl.com/2ueqjkl (finally (when (and ~(:shutdown-agents project false) (not= "1.5" (System/getProperty "java.specification.version")) ~(not *interactive?*)) (shutdown-agents)))))] ;; work around java's command line handling on windows ;; http://bit.ly/9c6biv This isn't perfect, but works for what's ;; currently being passed; see ;; http://www.perlmonks.org/?node_id=300286 for some of the ;; landmines involved in doing it properly (if (and (= (paths/get-os) :windows) (not (:eval-in-leiningen project))) (pr-str (pr-str form)) (pr-str form)))) (defn prep [{:keys [compile-path checksum-deps] :as project} skip-auto-compile] (when (and (not (or *skip-auto-compile* skip-auto-compile)) compile-path (empty? (.list (file compile-path)))) (binding [*silently* true] (compile project))) (when (or (empty? (find-deps-files project)) checksum-deps) (deps project)) (when compile-path (.mkdirs (file compile-path)))) (defn eval-in-leiningen [project form-string] ;; bootclasspath workaround: http://dev.clojure.org/jira/browse/CLJ-673 (require '[clojure walk repl]) (require '[clojure.java io shell browse]) (when (:debug project) (System/setProperty "clojure.debug" "true")) (doseq [opt (get-jvm-args project) :when (.startsWith opt "-D") :let [[_ k v] (re-find #"^-D(.*?)=(.*)$" opt)]] (System/setProperty k v)) ;; need to at least pretend to return an exit code (try (binding [*warn-on-reflection* (:warn-on-reflection project), *ns* *ns*] (eval (read-string form-string))) 0 (catch Exception e (.printStackTrace e) 1))) (defn- pump [reader out] (let [buffer (make-array Character/TYPE 1000)] (loop [len (.read reader buffer)] (when-not (neg? len) (.write out buffer 0 len) (.flush out) (Thread/sleep 100) (recur (.read reader buffer)))))) ;; clojure.java.shell/sh doesn't let you stream out/err (defn sh [& cmd] (let [proc (.exec (Runtime/getRuntime) (into-array cmd))] (.addShutdownHook (Runtime/getRuntime) (Thread. (fn [] (.destroy proc)))) (with-open [out (reader (.getInputStream proc)) err (reader (.getErrorStream proc))] (let [pump-out (doto (Thread. #(pump out *out*)) .start) pump-err (doto (Thread. #(pump err *err*)) .start)] (.join pump-out) (.join pump-err)) (.waitFor proc)))) (defn eval-in-subprocess [project form-string] (apply sh `(~(or (System/getenv "JAVA_CMD") "java") "-cp" ~(get-classpath-string project) ~@(get-jvm-args project) "clojure.main" "-e" ~form-string))) (defn eval-in-project "Executes form in an isolated classloader with the classpath and compile path set correctly for the project. If the form depends on any requires, put them in the init arg to avoid the Gilardi Scenario: http://technomancy.us/143" [project form & [handler skip-auto-compile init]] (when skip-auto-compile (println "WARNING: eval-in-project's skip-auto-compile arg is deprecated.")) (prep project skip-auto-compile) (let [form-string (get-readable-form nil project form init)] (if (:eval-in-leiningen project) (eval-in-leiningen project form-string) (eval-in-subprocess project form-string)))) ;; .class file cleanup (defn- has-source-package? "Test if the class file's package exists as a directory in source-path." [project f source-path] (and source-path (let [[[parent] [_ _ proxy-mod-parent]] (->> f, (iterate #(.getParentFile %)), (take-while identity), rest, (split-with #(not (re-find #"^proxy\$" (.getName %)))))] (.isDirectory (file (.replace (.getPath (or proxy-mod-parent parent)) (:compile-path project) source-path)))))) (defn- class-in-project? [project f] (or (has-source-package? project f (:source-path project)) (has-source-package? project f (:java-source-path project)) (.exists (file (str (.replace (.getParent f) (:compile-path project) (:source-path project)) ".clj"))))) (defn- relative-path [project f] (let [root-length (if (= \/ (last (:compile-path project))) (count (:compile-path project)) (inc (count (:compile-path project))))] (subs (.getAbsolutePath f) root-length))) (defn- blacklisted-class? [project f] ;; true indicates all non-project classes are blacklisted (or (true? (:clean-non-project-classes project)) (some #(re-find % (relative-path project f)) (:clean-non-project-classes project)))) (defn- whitelisted-class? [project f] (or (class-in-project? project f) (and (:class-file-whitelist project) (re-find (:class-file-whitelist project) (relative-path project f))))) (defn clean-non-project-classes [project] (when (:clean-non-project-classes project) (doseq [f (file-seq (file (:compile-path project))) :when (and (.isFile f) (not (whitelisted-class? project f)) (blacklisted-class? project f))] (.delete f)))) ;; actual task (defn- status [code msg] (when-not *silently* ; TODO: should silently only affect success? (binding [*out* (if (zero? code) *out* *err*)] (println msg))) code) (def ^{:private true} success (partial status 0)) (def ^{:private true} failure (partial status 1)) (defn compile "Compile Clojure source into .class files. Uses the namespaces specified under :aot in project.clj or those given as command-line arguments." ([project] (when (:java-source-path project) (javac project)) (if (seq (compilable-namespaces project)) (if-let [namespaces (seq (stale-namespaces project))] (binding [*skip-auto-compile* true] (try (if (zero? (eval-in-project project `(doseq [namespace# '~namespaces] (when-not ~*silently* (println "Compiling" namespace#)) (clojure.core/compile namespace#)))) (success "Compilation succeeded.") (failure "Compilation failed.")) (finally (clean-non-project-classes project)))) (success "All namespaces already :aot compiled.")) (success "No namespaces to :aot compile listed in project.clj."))) ([project & namespaces] (compile (assoc project :aot (if (= namespaces [":all"]) :all (map symbol namespaces)))))) technomancy-leiningen-713a4d9/src/leiningen/core.clj000066400000000000000000000325671173437653500225420ustar00rootroot00000000000000(ns leiningen.core (:use [leiningen.util.ns :only [namespaces-matching]] [leiningen.util.plugins :only [download-plugins]] [clojure.walk :only [walk]] [robert.hooke :only [add-hook]] [clojure.java.io :only [file]]) (:require [leiningen.util.paths :as paths]) (:import (java.io File) (org.apache.maven.artifact.versioning DefaultArtifactVersion))) (def ^{:dynamic true} *interactive?* false) (defmacro defdeprecated [old new] `(let [new# ~(str (.getName (:ns (meta (resolve new)))) "/" (name new)) warn# (delay (println "Warning:" '~old "is deprecated; use" new#))] (defn ~(vary-meta old assoc :doc (format "Compatibility alias for %s" new)) [& args#] (force warn#) (apply ~(resolve new) args#)))) (defdeprecated home-dir paths/leiningen-home) (defdeprecated ns->path paths/ns->path) (defdeprecated normalize-path paths/normalize-path) (defn no-dev? "Should the dev dependencies and directories be ignored? Warning: alpha; subject to change." [] (System/getenv "LEIN_NO_DEV")) (defn user-init "Load the user's ~/.lein/init.clj file, if present." [] (let [init-file (File. (paths/leiningen-home) "init.clj")] (when (.exists init-file) (try (load-file (.getAbsolutePath init-file)) (catch Exception e (.printStackTrace e)))))) (defn user-settings "Look up the settings map from init.clj or an empty map if it doesn't exist." [] (if-let [settings-var (resolve 'user/settings)] @settings-var {})) ;;; defproject (def ^{:private true} project nil) (defn- unquote-project [args] (walk (fn [item] (cond (and (seq? item) (= `unquote (first item))) (second item) ;; needed if we want fn literals to be usable by eval-in-project (or (seq? item) (symbol? item)) (list 'quote item) :else (unquote-project item))) identity args)) (def ^{:internal true} match-jar-sig-file #"(?i)^META-INF/[^/]*\.SF$") (defmacro defproject [project-name version & args] ;; This is necessary since we must allow defproject to be eval'd in ;; any namespace due to load-file; we can't just create a var with ;; def or we would not have access to it once load-file returned. `(let [m# (apply hash-map ~(cons 'list (unquote-project args))) root# ~(.getParent (File. *file*)) normalize-path# (partial ~paths/normalize-path root#)] (alter-var-root #'project (fn [_#] (assoc m# :name ~(name project-name) :group ~(or (namespace project-name) (name project-name)) :version ~version :dependencies (or (:dependencies m#) (:deps m#)) :dev-dependencies (or (:dev-dependencies m#) (:dev-deps m#)) :checksum-deps (:checksum-deps m# true) :compile-path (normalize-path# (or (:compile-path m#) "classes")) :source-path (normalize-path# (or (:source-path m#) "src")) :java-source-path (normalize-path# (:java-source-path m#)) :library-path (normalize-path# (or (:library-path m#) "lib")) :test-path (normalize-path# (or (:test-path m#) "test")) :resources-path (normalize-path# (or (:resources-path m#) "resources")) :dev-resources-path (normalize-path# (or (:dev-resources-path m#) (:test-resources-path m#) "test-resources")) :test-resources-path (normalize-path# (or (:dev-resources-path m#) (:test-resources-path m#) "test-resources")) :native-path (normalize-path# (:native-path m# "native")) :target-dir (normalize-path# (or (:target-dir m#) (:jar-dir m#) root#)) :jar-dir (normalize-path# (or (:target-dir m#) (:jar-dir m#) root#)) :jar-exclusions (:jar-exclusions m# [#"^\."]) :uberjar-exclusions (:uberjar-exclusions m# [match-jar-sig-file]) :root root#))) (when (:test-resources-path m#) (println (str "WARNING: :test-resources-path is deprecated; use " ":dev-resources-path."))) (when (:jar-dir m#) (println (str "WARNING: :jar-dir is deprecated; use " ":target-dir."))) #'project)) (defn read-project ([file] (try (binding [*ns* (the-ns 'leiningen.core)] (load-file file)) project (catch java.io.FileNotFoundException _))) ([] (read-project "project.clj"))) (def default-repos {"central" {:url "http://repo1.maven.org/maven2" :snapshots false} ;; TODO: possibly separate releases/snapshots in 2.0. "clojars" {:url "http://clojars.org/repo/"}}) ;; you can't remove or omit "central", you can only disable it; ;; maven/maven-ant-tasks adds it implicitly, and will continue to ;; report it in the list of checked repositories, even though it's ;; not been consulted. The URL will hopefully be clear enough to users. (def disabled-central-repo {"central" {:url "http://disabled-central" :snapshots false :releases false}}) (defn- init-settings [id settings] (cond (string? settings) {:url settings} ;; infer snapshots/release policy from repository id (= "releases" id) (merge {:snapshots false} settings) (= "snapshots" id) (merge {:releases false} settings) :else settings)) (defn repositories-for "Returns an ordered map of repositories including or excluding defaults. By default bases results on contents of :repositories. If another key is specified via a :kind kwarg, that key will be used to query the project. e.g. (repositories-for project :kind :deploy-repositories) will return an ordered map of repositories intended solely for deployment operations. Note: transforming this map via assoc, merge, or similar removes the order guarantee." [project & {:keys [kind] :or {kind :repositories}}] (let [project-repos (for [[id settings] (kind project)] [id (init-settings id settings)]) user-deploy-repos (when (= kind :deploy-repositories) (into [] (:deploy-repositories (user-settings)))) all-repos (concat (into [] (if (:omit-default-repositories project) disabled-central-repo default-repos)) user-deploy-repos project-repos)] (apply array-map (mapcat identity all-repos)))) (defn exit "Call System/exit. Defined as a function so that rebinding is possible." ([code] (shutdown-agents) (System/exit code)) ([] (exit 0))) (defn abort "Print msg to standard err and exit with a value of 1." [& msg] (binding [*out* *err*] (apply println msg) (exit 1))) ;;; Task execution (def ^{:dynamic true} *current-task* nil) (def aliases (atom {"--help" "help" "-h" "help" "-?" "help" "-v" "version" "--version" "version" "überjar" "uberjar" "cp" "classpath" "int" "interactive"})) (defn task-not-found [& _] (abort "That's not a task. Use \"lein help\" to list all tasks.")) (defn resolve-task ([task not-found] (let [task-ns (symbol (str "leiningen." task)) task (symbol task)] (try (when-not (find-ns task-ns) (require task-ns)) (or (ns-resolve task-ns task) not-found) (catch java.io.FileNotFoundException e not-found)))) ([task] (resolve-task task #'task-not-found))) (defn- hook-namespaces [project] (sort (concat (or (:hooks project) (and (:implicit-hooks project) (namespaces-matching "leiningen.hooks"))) (:hooks (user-settings))))) (defn- load-hooks [project] (doseq [n (hook-namespaces project)] (try (require n) (catch Exception e (when-not (empty? (.list (File. "lib"))) (println "Warning: problem requiring" n "hook:" (.getMessage e)) (when (System/getenv "DEBUG") (.printStackTrace e))))))) (defn arglists [task-name] (:arglists (meta (resolve-task task-name)))) (defn- project-needed? [parameters] (if (vector? parameters) (= 'project (first parameters)) (every? project-needed? parameters))) (defn- project-accepted? [parameters] (and (first parameters) (re-find #"^project($|-or-)" (name (first parameters))))) (defn- arg-count [parameters project] (if (and project (project-accepted? parameters)) (dec (count parameters)) (count parameters))) (defn matching-arity? [task-name project args] (some (fn [parameters] (and (if (= '& (last (butlast parameters))) (>= (count args) (- (arg-count parameters project) 2)) (= (arg-count parameters project) (count args))) (or project (not (project-needed? parameters))) parameters)) ;; use project.clj if possible (reverse (sort-by count (arglists task-name))))) (defn apply-task [task-name project args not-found] (let [task (resolve-task task-name not-found)] (if-let [parameters (matching-arity? task-name project args)] (binding [*current-task* task-name] (if (project-accepted? parameters) (apply task project args) (apply task args))) (let [args (arglists task-name)] (if (and (not project) (project-needed? args)) (abort "Couldn't find project.clj, which is needed for" task-name) (abort "Wrong number of arguments to" task-name "task." "\nExpected" args)))))) (defn prepend-tasks "Add a hook to target-var to run tasks-to-add, which must be tasks taking a project argument and nothing else." [target-var & tasks-to-add] (add-hook target-var (fn [target project & args] (doseq [t tasks-to-add] (t project)) (apply target project args)))) (def arg-separator ",") (defn- append-to-group [groups arg] (update-in groups [(dec (count groups))] conj arg)) (defn make-groups ([args] (reduce make-groups [[]] args)) ;; This could be a separate defn, but I can't think of a good name for it... ([groups arg] (if (.endsWith arg arg-separator) (-> groups (append-to-group (apply str (butlast arg))) (conj [])) (append-to-group groups arg)))) (defn version-greater-eq? "Check if v1 is greater than or equal to v2, where args are version strings. Takes major, minor and incremental versions into account." [v1 v2] (>= (.compareTo (DefaultArtifactVersion. v1) (DefaultArtifactVersion. v2)) 0)) (defn verify-min-version [project] (when-not (version-greater-eq? (System/getenv "LEIN_VERSION") (:min-lein-version project)) (println (str "\n*** Warning: This project requires Leiningen version " (:min-lein-version project) " ***" "\n*** Using version " (System/getenv "LEIN_VERSION") " could cause problems. ***\n" "\n- Get the latest verison of Leiningen at\n" "- https://github.com/technomancy/leiningen\n" "- Or by executing \"lein upgrade\"\n\n")))) (defn -main ([task-name & args] (user-init) (let [task-name (or (@aliases task-name) task-name "help") project (if (.exists (File. "project.clj")) (read-project)) compile-path (:compile-path project)] (when (:min-lein-version project) (verify-min-version project)) (when compile-path (.mkdirs (File. compile-path))) (download-plugins project) (binding [*compile-path* compile-path] (when project (load-hooks project)) (apply-task task-name project args task-not-found)))) ([] (doseq [[task & args] (make-groups *command-line-args*) :let [result (apply -main (or task "help") args)]] (when (and (number? result) (pos? result)) (exit result))) (exit 0))) technomancy-leiningen-713a4d9/src/leiningen/deploy.clj000066400000000000000000000053171173437653500230770ustar00rootroot00000000000000(ns leiningen.deploy "Build and deploy jar to remote repository." (:require [lancet.core :as lancet]) (:use [leiningen.core :only [abort repositories-for]] [leiningen.jar :only [jar]] [leiningen.pom :only [pom snapshot?]] [leiningen.util.maven :only [make-model make-artifact]] [leiningen.deps :only [make-repository]] [clojure.java.io :only [file]]) (:import (org.apache.maven.artifact.ant DeployTask Pom Authentication) (org.apache.tools.ant BuildException) (org.apache.maven.project MavenProject))) (defn- make-maven-project [project] (doto (MavenProject. (make-model project)) (.setArtifact (make-artifact (make-model project))))) (defn- get-repository [project repository-name] (let [deploy-repositories (repositories-for project :kind :deploy-repositories) repositories (repositories-for project) repository (or (deploy-repositories repository-name) (repositories repository-name) {:url repository-name})] (make-repository [repository-name repository]))) (defn deploy "Build jar and deploy to remote repository. The target repository will be looked up in :repositories: snapshot versions will go to the repo named \"snapshots\" while stable versions will go to \"releases\". You can also deploy to another repository in :repositories by providing its name as an argument. :repositories {\"java.net\" \"http://download.java.net/maven/2\" \"snapshots\" {:url \"https://blueant.com/archiva/snapshots\" :username \"milgrim\" :password \"locative\"} \"releases\" {:url \"https://blueant.com/archiva/internal\" :private-key \"etc/id_dsa\"}} You can set authentication options keyed by repository name in ~/.lein/init.clj to avoid checking sensitive information into source control: (def leiningen-auth {\"https://blueant.com/archiva/internal\" {:passphrase \"vorpalbunny\"}}) " ([project repository-name] (try (doto (DeployTask.) (.setProject lancet/ant-project) (.getSupportedProtocols) ;; see note re: exceptions in deps.clj (.setFile (file (jar project))) (.addPom (doto (Pom.) (.setMavenProject (make-maven-project project)) (.setProject lancet/ant-project) (.setFile (file (pom project))))) (.addRemoteRepository (get-repository project repository-name)) (.execute)) (catch BuildException _ 1))) ([project] (deploy project (if (snapshot? project) "snapshots" "releases")))) technomancy-leiningen-713a4d9/src/leiningen/deps.clj000066400000000000000000000216131173437653500225330ustar00rootroot00000000000000(ns leiningen.deps "Download all dependencies and put them in :library-path." (:require [lancet.core :as lancet]) (:use [leiningen.core :only [repositories-for user-settings *current-task* no-dev?]] [leiningen.clean :only [clean]] [leiningen.util.maven :only [make-dependency]] [leiningen.util.file :only [delete-file-recursively]] [leiningen.util.paths :only [get-os get-arch]] [leiningen.util.plugins :only [deps-checksum]] [clojure.java.io :only [file copy]]) (:import (java.io File) (java.util.jar JarFile) (java.security MessageDigest) (org.apache.maven.artifact.ant Authentication DependenciesTask RemoteRepository RepositoryPolicy) (org.apache.maven.settings Server) (org.apache.maven.artifact.repository ArtifactRepositoryPolicy) (org.apache.tools.ant.util FlatFileNameMapper))) (def dev-exclusions '[org.clojure/clojure org.clojure/clojure-contrib]) (def update-policies {:daily ArtifactRepositoryPolicy/UPDATE_POLICY_DAILY :always ArtifactRepositoryPolicy/UPDATE_POLICY_ALWAYS :never ArtifactRepositoryPolicy/UPDATE_POLICY_NEVER}) (def checksum-policies {:fail ArtifactRepositoryPolicy/CHECKSUM_POLICY_FAIL :ignore ArtifactRepositoryPolicy/CHECKSUM_POLICY_IGNORE :warn ArtifactRepositoryPolicy/CHECKSUM_POLICY_WARN}) (defn- make-policy [policy-settings enabled?] (doto (RepositoryPolicy.) (.setUpdatePolicy (update-policies (:update policy-settings :daily))) (.setChecksumPolicy (checksum-policies (:checksum policy-settings :warn))) (.setEnabled (boolean enabled?)))) (defn- set-policies [repo {:keys [snapshots releases] :as settings}] (.addSnapshots repo (make-policy snapshots (:snapshots settings true))) (.addReleases repo (make-policy releases (:releases settings true)))) (defn make-auth [settings] (let [user-options (when-let [user-opts (resolve 'user/leiningen-auth)] (get @user-opts (:url settings))) {:keys [username password passphrase private-key] :as settings} (merge user-options settings) auth (Authentication.)] (when (System/getenv "DEBUG") (prn :repository settings)) (when (seq settings) (when username (.setUserName auth username)) (when password (.setPassword auth password)) (when passphrase (.setPassphrase auth passphrase)) (when private-key (.setPrivateKey auth private-key)) auth))) (defn make-repository [[id settings]] (let [repo (RemoteRepository.)] (set-policies repo settings) (.setId repo id) (.setUrl repo (:url settings)) (when-let [auth (make-auth settings)] (.addAuthentication repo auth)) repo)) (defn make-repositories [project] (map make-repository (repositories-for project))) ;; Add symlinking to Lancet's toolbox. (lancet/define-ant-task symlink symlink) (defmulti copy-dependencies (fn [k destination flatten? fileset] k)) (defmethod copy-dependencies :default [k destination flatten? fileset] (lancet/copy {:todir destination :flatten (if flatten? "on" "off") :overwrite "on"} ; needed for plugins fileset)) (defmethod copy-dependencies :symlink [k destination flatten? fileset] (let [files (.getIncludedFiles (.getDirectoryScanner fileset lancet/ant-project)) dir (.getDir fileset)] ;; In principle, this should work... but it doesn't. ;; Instead we link each file in turn. #_(symlink {:action "record" :linkfilename destination} fileset) (doseq [f files] (symlink {:link destination :resource (.getCanonicalPath (File. dir f))})))) (defn make-deps-task [project deps-set] (let [deps-task (DependenciesTask.)] (.setProject deps-task lancet/ant-project) ;; in maven-ant-tasks (at least 2.0.10 and 2.1.1) if there's an ;; exception thrown, there must be a call to ;; AbstractArtifactTask.getContainer() made to set some local ;; state on the task, before the exception happens, or else you ;; don't see stack traces. getContainer is a protected ;; method. Since we don't have contrib, we can't use ;; wall-hack-method, and clojure.lang.Reflector doesn't call ;; private methods, we'll call a public method that we know calls ;; getContainer, getSupportedProtocols. (.getSupportedProtocols deps-task) (.setBasedir lancet/ant-project (:root project "")) (.setFilesetId deps-task "dependency.fileset") (.setPathId deps-task (:name project)) (doseq [repo (make-repositories project)] (.addConfiguredRemoteRepository deps-task repo)) (doseq [dep (project deps-set)] (.addDependency deps-task (make-dependency dep project))) deps-task)) (defn- new-deps-checksum-file ([project name] (File. (:root project) name)) ([project] (new-deps-checksum-file project ".lein-deps-sum"))) (defn- has-dependencies? [project] (some (comp seq project) [:dependencies :dev-dependencies])) (defn fetch-deps? [project] (let [deps-checksum-file (new-deps-checksum-file project)] (and (has-dependencies? project) (or (= "deps" *current-task*) (empty? (.list (File. (:library-path project)))) (not (:checksum-deps project (:checksum-deps (user-settings)))) (not (.exists deps-checksum-file)) (not= (slurp deps-checksum-file) (deps-checksum project)))))) (defn do-deps [project deps-set] (let [deps-task (make-deps-task project deps-set)] (when (seq (deps-set project)) (.execute deps-task) (when-not (and (:local-repo-classpath project) (= :dependencies deps-set)) (.mkdirs (File. (:library-path project))) (copy-dependencies (:jar-behavior project) ;; Leiningen's process only has access to lib/dev. (if (or (= :dev-dependencies deps-set) (and (:eval-in-leiningen project) (not= "leiningen" (:name project)))) (str (:root project) "/lib/dev") (:library-path project)) true (.getReference lancet/ant-project (.getFilesetId deps-task))))) (.getReference lancet/ant-project (.getFilesetId deps-task)))) (defn- fileset-paths [fileset] (-> fileset (.getDirectoryScanner lancet/ant-project) (.getIncludedFiles))) (defn- find-local-repo-jars [project] ;; TODO: Shut up, ant. You are useless. Nobody cares about what you say. ;; Removing ant-project loggers and redirecting their output streams ;; does nothing. How to suppress output? (for [path (fileset-paths (do-deps project :dependencies))] (file (System/getProperty "user.home") ".m2" "repository" path))) (defn- find-lib-jars [project] (.listFiles (file (:library-path project)))) (defn ^{:internal true} find-deps-files [project] (remove #(or (.isDirectory %) (.endsWith (str %) ".pom")) (concat (if (:local-repo-classpath project) (find-local-repo-jars project) (find-lib-jars project)) ;; This must be hard-coded because it's used in ;; bin/lein and thus can't be changed in project.clj. (.listFiles (file (:root project) "lib/dev"))))) (defn- find-jars [project] (filter #(.endsWith (.getName %) ".jar") (find-deps-files project))) (defn extract-native-deps [project] (doseq [jar (map #(JarFile. %) (find-jars project)) entry (enumeration-seq (.entries jar)) :when (.startsWith (.getName entry) "native/")] (let [f (file (:native-path project) (subs (.getName entry) (count "native/")))] (if (.isDirectory entry) (.mkdirs f) (copy (.getInputStream jar entry) f))))) (defn deps "Download :dependencies and put them in :library-path." [project & [skip-dev]] (when skip-dev (println "WARNING: passing an argument to deps is deprecated.")) (when (fetch-deps? project) (when-not (or (:disable-deps-clean project) (:disable-implicit-clean project)) (when (.startsWith (:library-path project) (:root project)) ;; if :library-path is outside the root, you're on your own (delete-file-recursively (:library-path project) :silently)) (delete-file-recursively (:native-path project) :silently) (clean project)) (let [fileset (do-deps project :dependencies)] (when-not (or skip-dev (no-dev?)) (do-deps (update-in project [:exclusions] (fnil into []) dev-exclusions) :dev-dependencies)) (extract-native-deps project) (when (:checksum-deps project) (spit (new-deps-checksum-file project) (deps-checksum project))) fileset))) technomancy-leiningen-713a4d9/src/leiningen/help.clj000066400000000000000000000071231173437653500225300ustar00rootroot00000000000000(ns leiningen.help "Display a list of tasks or help for a given task." (:use [leiningen.util.ns :only [namespaces-matching]]) (:require [clojure.string :as string] [clojure.java.io :as io])) (def tasks (->> (namespaces-matching "leiningen") (filter #(re-find #"^leiningen\.(?!core|util)[^\.]+$" (name %))) (distinct) (sort))) (defn get-arglists [task] (for [args (or (:help-arglists (meta task)) (:arglists (meta task)))] (vec (remove #(= 'project %) args)))) (def help-padding 3) (defn- formatted-docstring [command docstring padding] (apply str (replace {\newline (apply str (cons \newline (repeat (+ padding (count command)) \space)))} docstring))) (defn- formatted-help [command docstring longest-key-length] (let [padding (+ longest-key-length help-padding (- (count command)))] (format (str "%1s" (apply str (repeat padding \space)) "%2s") command (formatted-docstring command docstring padding)))) (defn- get-subtasks-and-docstrings-for [task] (map (fn [subtask] (let [m (meta subtask)] [(str (:name m)) (first (.split (:doc m "") "\n"))])) (:subtasks (meta task)))) (defn subtask-help-for [task-ns task] (let [subtasks (get-subtasks-and-docstrings-for task)] (if (empty? subtasks) nil (let [longest-key-length (apply max (map (comp count first) subtasks)) help-fn (ns-resolve task-ns 'help)] (string/join "\n" (concat ["\n\nSubtasks available:"] (for [[subtask doc] subtasks] (formatted-help subtask doc longest-key-length)))))))) (defn- resolve-task [task-name] (let [task-ns (doto (symbol (str "leiningen." task-name)) require) task (ns-resolve task-ns (symbol task-name))] [task-ns task])) (defn static-help [name] (when-let [reader (io/resource (format "leiningen/help/%s" name))] (slurp reader))) (defn help-for "Help for a task is stored in its docstring, or if that's not present in its namespace." [task-name] (let [[task-ns task] (resolve-task task-name) help-fn (ns-resolve task-ns 'help)] (str (or (and (not= task-ns 'leiningen.help) help-fn (help-fn)) (:doc (meta task)) (:doc (meta (find-ns task-ns)))) (subtask-help-for task-ns task) (when (some seq (get-arglists task)) (str "\n\nArguments: " (pr-str (get-arglists task))))))) ;; affected by clojure ticket #130: bug of AOT'd namespaces losing metadata (defn help-summary-for [task-ns] (try (let [task-name (last (.split (name task-ns) "\\.")) ns-summary (:doc (meta (find-ns (doto task-ns require)))) first-line (first (.split (help-for task-name) "\n"))] ;; Use first line of task docstring if ns metadata isn't present (str task-name (apply str (repeat (- 12 (count task-name)) " ")) (or ns-summary first-line))) (catch Throwable e (binding [*out* *err*] (str task-ns " Problem loading: " (.getMessage e)))))) (defn help "Display a list of tasks or help for a given task. Also provides readme, tutorial, news, sample, deploying and copying documentation." ([task] (println (or (static-help task) (help-for task)))) ([] (println "Leiningen is a tool for working with Clojure projects.\n") (println "Several tasks are available:") (doseq [task-ns tasks] (println (help-summary-for task-ns))) (println "\nRun lein help $TASK for details.") (println "See also: readme, tutorial, copying, sample, deploying and news."))) technomancy-leiningen-713a4d9/src/leiningen/install.clj000066400000000000000000000073421173437653500232510ustar00rootroot00000000000000(ns leiningen.install "Install the current project or download the project specified." (:use [leiningen.core :only [default-repos read-project]] [leiningen.jar :only [jar manifest-map local-repo-path extract-jar]] [leiningen.deps :only [deps copy-dependencies]] [leiningen.util.maven :only [container make-model make-remote-artifact make-remote-repo make-local-repo make-artifact add-metadata]] [leiningen.util.file :only [tmp-dir delete-file-recursively]] [leiningen.util.paths :only [get-os leiningen-home]] [leiningen.pom :only [pom]] [clojure.java.io :only [file copy]]) (:import (java.util.jar JarFile) (java.util UUID) (org.apache.maven.artifact.resolver ArtifactResolver) (org.apache.maven.artifact.installer ArtifactInstaller))) (defn bin-path [] (doto (file (leiningen-home) "bin") .mkdirs)) (defn install-shell-wrappers [jarfile] (when-let [bin-name ((manifest-map (.getManifest jarfile)) "Leiningen-shell-wrapper")] (let [entry-paths (if (= :windows (get-os)) [bin-name (format "%s.bat" bin-name)] [bin-name])] (doseq [entry-path entry-paths] (let [bin-file (file (bin-path) (last (.split entry-path "/")))] (when-let [zip-entry (.getEntry jarfile entry-path)] (.mkdirs (.getParentFile bin-file)) (println "Installing shell wrapper to" (.getAbsolutePath bin-file)) (copy (.getInputStream jarfile zip-entry) bin-file) (when (not= "1.5" (System/getProperty "java.specification.version")) (.setExecutable bin-file true)))))))) (defn standalone-download [name group version] (.resolveAlways (.lookup container ArtifactResolver/ROLE) (make-remote-artifact name group version) (map make-remote-repo default-repos) (make-local-repo))) (defn install "Install current project or download specified project. With no arguments, installs the current project and its dependencies in your local repository. With two arguments, (group/name and version) downloads and installs a project from a remote repository. Places shell wrappers in ~/.lein/bin when provided." ([project] (let [jarfile (jar project) model (make-model project) artifact (make-artifact model) installer (.lookup container ArtifactInstaller/ROLE) local-repo (make-local-repo)] ;; for packaging other than "pom" there should be "pom.xml" ;; generated and installed in local repo (when (not= "pom" (.getPackaging model)) (add-metadata artifact (file (pom project)))) (if (number? jarfile) ;; if we failed to create the jar, return the status code for exit jarfile (do (install-shell-wrappers (JarFile. jarfile)) (.install installer (file jarfile) artifact local-repo) 0)))) ([project-name version] (let [[name group] ((juxt name namespace) (symbol project-name)) _ (standalone-download name (or group name) version) temp-project (format "%s/lein-%s" tmp-dir (UUID/randomUUID)) jarfile (local-repo-path (or group name) name version)] (install-shell-wrappers (JarFile. jarfile)) ;; TODO: use lancet/unjar? (try (extract-jar (file jarfile) temp-project) (binding [copy-dependencies (constantly nil)] (when-let [p (read-project (str temp-project "/project.clj"))] (deps (dissoc p :dev-dependencies :native-dependencies)))) (finally (delete-file-recursively temp-project :silently)))))) technomancy-leiningen-713a4d9/src/leiningen/interactive.clj000066400000000000000000000056051173437653500241200ustar00rootroot00000000000000(ns leiningen.interactive "Enter interactive task shell." (:require [clojure.string :as string] [clojure.java.io :as io]) (:use [leiningen.core :only [apply-task exit *interactive?*]] [leiningen.test :only [*exit-after-tests*]] [leiningen.repl :only [repl-server repl-socket-on copy-out-loop poll-repl-connection]] [leiningen.compile :only [eval-in-project]])) (def welcome "Welcome to Leiningen. Type help for a list of commands.") (def prompt "lein> ") (defn not-found [& _] (println "That's not a task. Use help to list all tasks.")) (defn- eval-client-loop [reader buffer socket] (let [len (.read reader buffer)] (when-not (neg? len) (.write *out* buffer 0 len) (.flush *out*) (when-not (.isClosed socket) (Thread/sleep 100) (recur reader buffer socket))))) (defn eval-in-repl [connect project form & [_ _ init]] (let [[reader writer socket] (connect)] (.write writer (str "(do " (pr-str init) (pr-str form) "\n" ' (.close *in*) ")\n")) (.flush writer) (try (eval-client-loop reader (make-array Character/TYPE 1000) socket) 0 (catch Exception e (.printStackTrace e) 1) (finally (.close reader) (.close writer))))) (defn print-prompt [] (print prompt) (flush)) (defn task-repl [project] (print-prompt) (loop [input (.readLine *in*)] (when (and input (not= input "exit")) (let [[task-name & args] (string/split input #"\s")] ;; TODO: don't start a second repl server for repl task (try (apply-task task-name project args not-found) ;; TODO: not sure why, but repl seems to put an extra EOF on *in* (when (= "repl" task-name) (.read *in*)) (catch Exception e (println (.getMessage e)))) (print-prompt) (recur (.readLine *in*)))))) (defn interactive "Enter an interactive task shell. Aliased to \"int\"." [project] (.delete (io/file "/tmp/bugger-all")) (let [[port host] (repl-socket-on project)] (println welcome) (future (binding [*interactive?* true] (eval-in-project project (repl-server project host port :prompt '(fn []) :caught '(fn [t] (println (.getMessage t)) (.printStackTrace t) (.close *in*)))))) (let [connect #(poll-repl-connection port 0 vector)] (binding [eval-in-project (partial eval-in-repl connect) *exit-after-tests* false *interactive?* true exit (fn exit [& _] (prn))] (task-repl project))) (exit))) technomancy-leiningen-713a4d9/src/leiningen/jar.clj000066400000000000000000000214351173437653500223560ustar00rootroot00000000000000(ns leiningen.jar "Package up all the project's files into a jar file." (:require [leiningen.compile :as compile] [clojure.string :as string] [lancet.core :as lancet]) (:use [leiningen.pom :only [make-pom make-pom-properties]] [leiningen.deps :only [deps]] [leiningen.util.maven :only [make-local-repo]] [clojure.java.io :only [copy file]]) (:import (java.util.jar Manifest JarEntry JarOutputStream) (java.util.regex Pattern) (java.util.jar JarFile) (java.io BufferedOutputStream FileOutputStream ByteArrayInputStream))) (defn- read-resource [resource-name] (-> (.getContextClassLoader (Thread/currentThread)) (.getResourceAsStream resource-name) (slurp))) (defn- read-bin-template [system] (case system :unix (read-resource "script-template") :windows (read-resource "script-template.bat"))) (defn unix-path [path] (.replace path "\\" "/")) (defn windows-path [path] (.replace path "/" "\\")) (defn local-repo-path ([group name version] (local-repo-path {:group group :name name :version version})) ([{:keys [group name version]}] (unix-path (format "%s/%s/%s/%s/%s-%s.jar" (.getBasedir (make-local-repo)) (.replace group "." "/") name version name version)))) (defn- script-local-repo-path "A soft-coded version of local-repo-path for use in shell-wrapper classpath." [{:keys [group name version]}] (format "$HOME/.m2/repository/%s/%s/%s/%s-%s.jar" (.replace group "." "/") name version name version)) (defn- script-classpath-for [project deps-fileset system] (let [deps (when deps-fileset (-> deps-fileset (.getDirectoryScanner lancet/ant-project) (.getIncludedFiles))) unix-paths (conj (for [dep deps] (unix-path (format "$HOME/.m2/repository/%s" dep))) (script-local-repo-path project))] (case system :unix (string/join ":" unix-paths) :windows (string/join ";" (for [path unix-paths] (windows-path (.replace path "$HOME" "%USERPROFILE%"))))))) (defn- shell-wrapper-name [project] (get-in project [:shell-wrapper :bin] (format "bin/%s" (:name project)))) (defn- shell-wrapper-contents [project bin-name main deps-fileset system] (let [file-name (case system :unix bin-name :windows (format "%s.bat" bin-name)) bin-file (file file-name)] (format (if (.exists bin-file) (slurp bin-file) (read-bin-template system)) (script-classpath-for project deps-fileset system) main (:version project)))) (defn- shell-wrapper-filespecs [project deps-fileset] (when (:shell-wrapper project) (let [main (or (:main (:shell-wrapper project)) (:main project)) bin-name (shell-wrapper-name project) read-bin #(shell-wrapper-contents project bin-name main deps-fileset %)] [{:type :bytes :path bin-name :bytes (.getBytes (read-bin :unix))} {:type :bytes :path (format "%s.bat" bin-name) :bytes (.getBytes (read-bin :windows))}]))) (def default-manifest {"Created-By" (str "Leiningen " (System/getenv "LEIN_VERSION")) "Built-By" (System/getProperty "user.name") "Build-Jdk" (System/getProperty "java.version")}) (defn make-manifest [project & [extra-entries]] (Manifest. (ByteArrayInputStream. (.getBytes (reduce (fn [manifest [k v]] (str manifest "\n" k ": " v)) "Manifest-Version: 1.0" (merge default-manifest (:manifest project) (when (:shell-wrapper project) {"Leiningen-shell-wrapper" (shell-wrapper-name project)}) (when-let [main (:main project)] {"Main-Class" (.replaceAll (str main) "-" "_")}))))))) (defn manifest-map [manifest] (let [attrs (.getMainAttributes manifest)] (zipmap (map str (keys attrs)) (vals attrs)))) (defn skip-file? [file relative-path patterns] (or (not (.exists file)) (.isDirectory file) (re-find #"^\.?#" (.getName file)) (re-find #"~$" (.getName file)) (some #(re-find % relative-path) patterns))) (defmulti copy-to-jar (fn [project jar-os spec] (:type spec))) (defn- trim-leading-str [s to-trim] (.replaceAll s (str "^" (Pattern/quote to-trim)) "")) (defmethod copy-to-jar :path [project jar-os spec] (let [root (str (unix-path (:root project)) \/) noroot #(trim-leading-str (unix-path %) root) [resources classes src] (map noroot (map project [:resources-path :compile-path :source-path]))] (doseq [child (file-seq (file (:path spec)))] (let [path (reduce trim-leading-str (unix-path (str child)) [root resources classes src "/"])] (when-not (skip-file? child path (:jar-exclusions project)) (.putNextEntry jar-os (doto (JarEntry. path) (.setTime (.lastModified child)))) (copy child jar-os)))))) (defmethod copy-to-jar :bytes [project jar-os spec] (when-not (some #(re-find % (:path spec)) (:jar-exclusions project)) (.putNextEntry jar-os (JarEntry. (:path spec))) (copy (ByteArrayInputStream. (:bytes spec)) jar-os))) (defn write-jar [project out-filename filespecs] (let [manifest (make-manifest project)] (with-open [jar-os (-> out-filename (FileOutputStream.) (BufferedOutputStream.) (JarOutputStream. manifest))] (doseq [filespec filespecs] (copy-to-jar project jar-os filespec))))) (defn get-default-jar-name [project] (or (:jar-name project) (str (:name project) "-" (:version project) ".jar"))) (defn get-jar-filename ([project jar-name] (let [target-dir (:target-dir project)] (.mkdirs (file target-dir)) (str target-dir "/" jar-name))) ([project] (get-jar-filename project (get-default-jar-name project)))) (defn get-default-uberjar-name [project] (or (:uberjar-name project) (str (:name project) \- (:version project) "-standalone.jar"))) (defn- filespecs [project deps-fileset] (let [javasrc (:java-source-path project) cljsrc (:source-path project)] (concat [{:type :bytes :path (format "META-INF/maven/%s/%s/pom.xml" (:group project) (:name project)) :bytes (make-pom project)} {:type :bytes :path (format "META-INF/maven/%s/%s/pom.properties" (:group project) (:name project)) :bytes (make-pom-properties project)} {:type :path :path (:compile-path project)} {:type :path :path (str (:root project) "/project.clj")}] (when (and (:resources-path project) (.exists (file (:resources-path project)))) [{:type :path :path (:resources-path project)}]) (when (and javasrc (not (:omit-source project)) (not (.startsWith javasrc cljsrc)) (not (.startsWith cljsrc javasrc))) [{:type :path :path javasrc}]) (when-not (:omit-source project) [{:type :path :path cljsrc}]) (shell-wrapper-filespecs project deps-fileset)))) (defn extract-jar "Unpacks jar-file into target-dir. jar-file can be a JarFile instance or a path to a jar file on disk." [jar-file target-dir] (let [jar (if (isa? jar-file JarFile) jar-file (JarFile. jar-file true)) entries (enumeration-seq (.entries jar)) target-file #(file target-dir (.getName %))] (doseq [entry entries :when (not (.isDirectory entry)) :let [f (target-file entry)]] (.mkdirs (.getParentFile f)) (copy (.getInputStream jar entry) f)))) (defn ^{:help-arglists '([])} jar "Package up all the project's files into a jar file. Create a $PROJECT-$VERSION.jar file containing project's source files as well as .class files if applicable. If project.clj contains a :main key, the -main function in that namespace will be used as the main-class for executable jar." ([project jar-name] (when jar-name (println "WARNING: Using the jar task with an argument is deprecated.")) (let [deps-fileset (deps (assoc project :checksum-deps false)) status (compile/compile project)] (if (zero? status) (let [jar-path (get-jar-filename project (get-default-jar-name project))] (write-jar project jar-path (filespecs project deps-fileset)) (println "Created" jar-path) jar-path) status))) ([project] (jar project nil))) technomancy-leiningen-713a4d9/src/leiningen/javac.clj000066400000000000000000000027651173437653500226730ustar00rootroot00000000000000(ns leiningen.javac "Compile Java source files." (:use [leiningen.classpath :only [get-classpath-string]] [leiningen.util.paths :only [normalize-path]] [leiningen.deps :only [deps]]) (:require [lancet.core :as lancet]) (:import (java.io File))) (def ^{:doc "Default options for the java compiler." :dynamic true} *default-javac-options* {:debug "false" :fork "true" :includejavaruntime "yes" :includeantruntime "false" :source "1.5" :target "1.5"}) (defn- extract-javac-task "Extract a compile task from the given spec." [project [path & options]] (merge *default-javac-options* (:javac-options project) {:destdir (:compile-path project) :srcdir (normalize-path (:root project) path) :classpath (get-classpath-string project)} (apply hash-map options))) (defn- extract-javac-tasks "Extract all compile tasks of the project." [project] (let [specs (:java-source-path project)] (for [spec (if (string? specs) [[specs]] specs)] (extract-javac-task project spec)))) (defn- run-javac-task "Compile the given task spec." [task-spec] (lancet/mkdir {:dir (:destdir task-spec)}) (lancet/javac task-spec)) (defn javac "Compile Java source files. Add a :java-source-path key to project.clj to specify where to find them." [project & [directory]] (deps project) (doseq [task (extract-javac-tasks project) :when (or (nil? directory) (= directory (:srcdir task)))] (run-javac-task task))) technomancy-leiningen-713a4d9/src/leiningen/new.clj000066400000000000000000000073731173437653500224000ustar00rootroot00000000000000(ns leiningen.new "Create a new project skeleton." (:use [leiningen.core :only [abort]] [leiningen.util.paths :only [ns->path]] [clojure.java.io :only [file]] [clojure.string :only [join]]) (:import (java.util Calendar))) (defn format-settings [settings] (letfn [(format-map [m] (map #(str " " %1 " " %2) (map str (keys m)) (map str (vals m))))] (apply str (interpose "\n" (format-map settings))))) (defn write-project [project-dir project-name] (let [default-settings {:dependencies [['org.clojure/clojure "1.3.0"]]} settings (merge-with #(if %2 %2 %1) default-settings)] (.mkdirs (file project-dir)) (spit (file project-dir "project.clj") (str "(defproject " project-name " \"1.0.0-SNAPSHOT\"\n" " :description \"FIXME: write description\"\n" (format-settings (into (sorted-map) settings)) ")" )))) (defn write-implementation [project-dir project-clj project-ns] (.mkdirs (.getParentFile (file project-dir "src" project-clj))) (spit (file project-dir "src" project-clj) (str "(ns " project-ns ")\n"))) (defn write-test [project-dir test-ns project-ns] (.mkdirs (.getParentFile (file project-dir "test" (ns->path test-ns)))) (spit (file project-dir "test" (ns->path test-ns)) (str "(ns " (str test-ns) "\n (:use [" project-ns "])" "\n (:use [clojure.test]))\n\n" "(deftest replace-me ;; FIXME: write\n (is false " "\"No tests have been written.\"))\n"))) (defn- year [] (.get (Calendar/getInstance) Calendar/YEAR)) (defn write-readme [project-dir artifact-id] (spit (file project-dir "README") (join "\n\n" [(str "# " artifact-id) "FIXME: write description" "## Usage" "FIXME: write" "## License" (str "Copyright (C) " (year) " FIXME") (str "Distributed under the Eclipse Public" " License, the same as Clojure.\n")]))) (def project-name-blacklist #"(?i)(? (System/getProperty "leiningen.original.pwd") (file project-dir) (.getAbsolutePath ))] (write-project project-dir project-name) (let [prefix (.replace (str project-name) "/" ".") project-ns (str prefix ".core") test-ns (str prefix ".test.core") project-clj (ns->path project-ns)] (spit (file project-dir ".gitignore") (apply str (interleave ["/pom.xml" "*jar" "/lib" "/classes" "/native" "/.lein-failures" "/checkouts" "/.lein-deps-sum"] (repeat "\n")))) (write-implementation project-dir project-clj project-ns) (write-test project-dir test-ns project-ns) (write-readme project-dir artifact-id) (println "Created new project in:" project-dir) (println "Look over project.clj and start coding in" project-clj))))) technomancy-leiningen-713a4d9/src/leiningen/plugin.clj000066400000000000000000000070451173437653500231010ustar00rootroot00000000000000(ns leiningen.plugin "Manage user-level plugins." (:use [leiningen.core :only [read-project abort]] [leiningen.uberjar :only [write-components]] [leiningen.deps :only [deps dev-exclusions]] [leiningen.jar :only [local-repo-path extract-jar get-default-uberjar-name]] [leiningen.util.file :only [tmp-dir delete-file-recursively]] [leiningen.util.paths :only [leiningen-home]] [clojure.java.io :only [file]]) (:require [leiningen.install] [leiningen.help]) (:import (java.util.zip ZipOutputStream) (java.io File FileOutputStream))) (def plugins-path (file (leiningen-home) "plugins")) (defn plugin-standalone-filename [group name version] (str (if group (str group "-") nil) name "-" version ".jar")) (defn extract-name-and-group [project-name] ((juxt name namespace) (symbol project-name))) (defn uninstall "Delete the plugin jarfile Syntax: lein plugin uninstall [GROUP/]ARTIFACT-ID VERSION" [project-name version] (let [[name group] (extract-name-and-group project-name) jarfile (file plugins-path (plugin-standalone-filename group name version))] (if (.exists jarfile) (if (.delete jarfile) (println (format "Uninstalled %s %s." project-name version)) (abort (format "Failed to delete \"%s\"." (.getAbsolutePath jarfile)))) (abort (format "Plugin \"%s %s\" doesn't appear to be installed." project-name version))))) (defn- uninstall-old [project-name] (doseq [plugin (.list plugins-path) :let [pat (re-pattern (format "^\\Q%s\\E-.*\\.jar$" project-name))] :when (re-find pat plugin)] (.delete (file plugins-path plugin)))) (defn install "Download, package, and install plugin jarfile into ~/.lein/plugins Syntax: lein plugin install [GROUP/]ARTIFACT-ID VERSION You can use the same syntax here as when listing Leiningen dependencies." [project-name version] (uninstall-old project-name) (leiningen.install/install project-name version) (.mkdirs plugins-path) (let [[name group] (extract-name-and-group project-name) temp-project (file tmp-dir (str "lein-" (java.util.UUID/randomUUID))) jarfile (-> (local-repo-path (or group name) name version) (.replace "$HOME" (System/getProperty "user.home"))) _ (extract-jar (file jarfile) temp-project) project (read-project (str (file temp-project "project.clj"))) project (assoc project :exclusions dev-exclusions) standalone-filename (plugin-standalone-filename group name version)] (deps (dissoc project :dev-dependencies :native-dependencies :eval-in-leiningen)) (with-open [out (-> (file plugins-path standalone-filename) (FileOutputStream.) (ZipOutputStream.))] (let [deps (->> (.listFiles (file (:library-path project))) (filter #(.endsWith (.getName %) ".jar")) (cons (file jarfile)))] (write-components project deps out))) (delete-file-recursively temp-project) (println "Created" standalone-filename))) (defn ^{:doc "Manage user-level plugins." :help-arglists '([subtask project-name version]) :subtasks [#'install #'uninstall]} plugin ([] (println (leiningen.help/help-for "plugin"))) ([_] (plugin)) ([_ _] (plugin)) ([subtask project-name version] (case subtask "install" (install project-name version) "uninstall" (uninstall project-name version) (plugin)))) technomancy-leiningen-713a4d9/src/leiningen/pom.clj000066400000000000000000000044531173437653500223760ustar00rootroot00000000000000(ns leiningen.pom "Write a pom.xml file to disk for Maven interop." (:use [leiningen.util.maven :only [make-model]] [leiningen.core :only [abort]] [clojure.java.io :only [copy file]]) (:import (java.io StringWriter ByteArrayOutputStream) (java.util Properties) (org.apache.maven.project MavenProject))) (def #^{:doc "A notice to place at the bottom of generated files."} disclaimer "\n\n") (defn snapshot? [project] (re-find #"SNAPSHOT" (:version project))) (def ^{:doc "For backwards-compatibility"} default-repos leiningen.core/default-repos) (defn check-for-snapshot-deps [project] (when (and (not (snapshot? project)) (not (System/getenv "LEIN_SNAPSHOTS_IN_RELEASE")) (some #(re-find #"SNAPSHOT" (second %)) (:dependencies project))) (abort "Release versions may not depend upon snapshots." "\nFreeze snapshots to dated versions or set the" "LEIN_SNAPSHOTS_IN_RELEASE environment variable to override this."))) (defn make-pom ([project] (make-pom project false)) ([project disclaimer?] (check-for-snapshot-deps project) (with-open [w (StringWriter.)] (.writeModel (MavenProject. (make-model project)) w) (when disclaimer? (.write w disclaimer)) (.getBytes (str w))))) (defn make-pom-properties [project] (with-open [baos (ByteArrayOutputStream.)] (.store (doto (Properties.) (.setProperty "version" (:version project)) (.setProperty "groupId" (:group project)) (.setProperty "artifactId" (:name project))) baos "Leiningen") (.getBytes (str baos)))) (defn ^{:help-arglists '([])} pom "Write a pom.xml file to disk for Maven interop." ([project pom-location silently?] (let [pom-file (file (:root project) pom-location)] (copy (make-pom project true) pom-file) (when-not silently? (println "Wrote" (.getName pom-file))) (.getAbsolutePath pom-file))) ([project pom-location] (pom project pom-location false)) ([project] (pom project "pom.xml"))) technomancy-leiningen-713a4d9/src/leiningen/repl.clj000066400000000000000000000156271173437653500225520ustar00rootroot00000000000000(ns leiningen.repl "Start a repl session either with the current project or standalone." (:require [clojure.main]) (:use [leiningen.core :only [exit user-settings *interactive?*]] [leiningen.compile :only [eval-in-project]] [leiningen.deps :only [find-deps-files deps]] [leiningen.trampoline :only [*trampoline?*]] [clojure.java.io :only [copy]]) (:import (java.net Socket InetAddress ServerSocket SocketException) (java.io OutputStreamWriter InputStreamReader File PrintWriter) (clojure.lang LineNumberingPushbackReader))) (def retry-limit 200) (defn repl-options [project options] (let [options (apply hash-map options) init `#(let [is# ~(:repl-init-script project) in# '~(:repl-init project) mn# '~(:main project)] ~(:init options) (when (and is# (.exists (File. (str is#)))) (println (str "Warning: :repl-init-script is " "deprecated; use :repl-init.")) (load-file is#)) (when in# (require in#)) (when mn# (require mn#)) (in-ns (or in# mn# '~'user))) ;; Suppress socket closed since it's part of normal operation caught `(fn [t#] (when-not (instance? SocketException t#) (~(:caught options 'clojure.main/repl-caught) t#))) ;; clojure.main/repl has no way to exit without signalling EOF, ;; which we can't do with a socket. We can't rebind skip-whitespace ;; in Clojure 1.3, so we have to duplicate the function read `(fn [request-prompt# request-exit#] (or ({:line-start request-prompt# :stream-end request-exit#} (try (clojure.main/skip-whitespace *in*) (catch Exception _# :stream-end))) (let [input# (read)] (clojure.main/skip-if-eol *in*) (if (= ::exit input#) ; programmatically signal close (do (.close *in*) request-exit#) input#))))] (apply concat [:init init :caught caught :read read] (dissoc options :caught :init :read)))) (defn repl-server [project host port & options] `(do (try ;; transitive requires don't work for stuff on bootclasspath (require '~'clojure.java.shell) (require '~'clojure.java.browse) ;; these are new in clojure 1.2, so swallow exceptions for 1.1 (catch Exception _#)) (set! *warn-on-reflection* false) (let [server# (ServerSocket. ~port 0 (InetAddress/getByName ~host)) acc# (fn [s#] (let [ins# (.getInputStream s#) outs# (.getOutputStream s#) out-writer# (OutputStreamWriter. outs#)] (doto (Thread. #(binding [*in* (-> ins# InputStreamReader. LineNumberingPushbackReader.) *out* out-writer# *err* (PrintWriter. out-writer#) *warn-on-reflection* ~(:warn-on-reflection project)] (clojure.main/repl ~@(repl-options project options)))) .start)))] (doto (Thread. #(when-not (.isClosed server#) (try (acc# (.accept server#)) (catch SocketException e# (.printStackTrace e#))) (recur))) .start) (if ~*trampoline?* (clojure.main/repl ~@options) (do (when-not ~*interactive?* (println "REPL started; server listening on" ~host "port" ~port)) ;; block to avoid shutdown-agents @(promise)))))) (defn copy-out-loop [reader] (let [buffer (make-array Character/TYPE 1000)] (loop [length (.read reader buffer)] (when-not (neg? length) (.write *out* buffer 0 length) (flush) (Thread/sleep 100) (recur (.read reader buffer)))))) (defn repl-client [reader writer & [socket]] (.start (Thread. #(do (copy-out-loop reader) (exit 0)))) (loop [] (let [input (read-line)] (when (and input (not= "" input) (not (.isClosed socket))) (.write writer (str input "\n")) (.flush writer) (recur))))) (defn- connect-to-server [socket handler] (let [reader (InputStreamReader. (.getInputStream socket)) writer (OutputStreamWriter. (.getOutputStream socket))] (handler reader writer socket))) (defn poll-repl-connection ([port retries handler] (when (> retries retry-limit) (throw (Exception. "Couldn't connect"))) (Thread/sleep 100) (let [val (try (connect-to-server (Socket. "localhost" port) handler) (catch java.net.ConnectException _ ::retry))] (if (= ::retry val) (recur port (inc retries) handler) val))) ([port] (poll-repl-connection port 0 repl-client))) (defn repl-socket-on [{:keys [repl-port repl-host]}] [(Integer. (or repl-port (System/getenv "LEIN_REPL_PORT") (dec (+ 1024 (rand-int 64512))))) (or repl-host (System/getenv "LEIN_REPL_HOST") "localhost")]) (defn repl "Start a repl session either with the current project or standalone. A socket-repl will also be launched in the background on a socket based on the :repl-port key in project.clj or chosen randomly. Running outside a project directory will start a standalone repl session." ([] (repl nil)) ([project] (when (and project (or (empty? (find-deps-files project)) (:checksum-deps project))) (deps project)) (let [[port host] (repl-socket-on project) server-form (apply repl-server project host port (concat (:repl-options project) (:repl-options (user-settings)))) retries (- retry-limit (or (:repl-retry-limit project) ((user-settings) :repl-retry-limit) retry-limit))] (if *trampoline?* (eval-in-project project server-form) (do (future (if (empty? project) (clojure.main/with-bindings (println (eval server-form))) (eval-in-project project server-form))) (poll-repl-connection port retries repl-client) (exit))))) ([project init-namespace] (if (= init-namespace ":lein") (repl nil) (repl (assoc project :repl-init (symbol init-namespace)))))) technomancy-leiningen-713a4d9/src/leiningen/retest.clj000066400000000000000000000010721173437653500231030ustar00rootroot00000000000000(ns leiningen.retest "Run only the test namespaces which failed last time around." (:require [leiningen.test])) (defn retest "Run only the test namespaces which failed last time around. Requires loading leiningen.hooks.retest to :hooks in project.clj." [project & selectors] ;; TODO: detect branch change; clear failure list (apply leiningen.test/test project (concat (if (.exists (java.io.File. ".lein-failures")) (->> (slurp ".lein-failures") read-string sort (map name))) selectors))) technomancy-leiningen-713a4d9/src/leiningen/run.clj000066400000000000000000000046221173437653500224050ustar00rootroot00000000000000(ns leiningen.run "Run a -main function with optional command-line arguments." (:use [leiningen.compile :only [eval-in-project]] [leiningen.core :only [abort]]) (:import (java.io FileNotFoundException) (clojure.lang Reflector))) (defn- normalize-main [given] (when-not (or (symbol? given) (string? given)) (throw (Exception. ":main should be a symbol refering to a namespace."))) (if (namespace (symbol given)) (symbol given) (symbol (name given) "-main"))) (defn- run-form [given args] `(let [v# (resolve '~(normalize-main given))] (if (ifn? v#) (v# ~@args) (Reflector/invokeStaticMethod ~(name given) "main" (into-array [(into-array String '~args)]))))) (defn- run-main "Loads the project namespaces as well as all its dependencies and then calls ns/f, passing it the args." [project given & args] (eval-in-project project (run-form given args) nil nil `(try (require '~(symbol (namespace (normalize-main given)))) (catch FileNotFoundException _#)))) (defn ^{:help-arglists '([])} run "Run the project's -main function. USAGE: lein run [--] [ARGS...] Calls the -main function in the namespace specified as :main in project.clj. You may use -- to escape the first argument in case it begins with `-' or `:'. If your main function is not called \"-main\", you may use a namespaced symbol like clojure.main/main. USAGE: lein run -m NAMESPACE[/MAIN_FUNCTION] [ARGS...] Calls the main function in the specified namespace. USAGE: lein run :alias [ARGS...] Aliases can be defined in project.clj as :run-aliases {:alias a.namespace/my-main :alias2 another.namespace} See also \"lein help trampoline\" for a way to save memory using this task." [project & [flag & args :as all-args]] (let [kw (when (= (first flag) \:) (keyword (subs flag 1))) alias (get (:run-aliases project) kw) all-args (if (= flag "--") args all-args)] (cond alias (apply run project "-m" (cons alias args)) (= flag "-m") (if (first args) (apply run-main project args) (abort "Option -m requires a namespace argument.")) (:main project) (apply run-main project (:main project) all-args) :else (abort "No :main namespace specified in project.clj.")))) technomancy-leiningen-713a4d9/src/leiningen/search.clj000066400000000000000000000101531173437653500230420ustar00rootroot00000000000000(ns leiningen.search (:use [leiningen.core :only [repositories-for user-settings]] [leiningen.util.file :only [delete-file-recursively]] [leiningen.util.paths :only [leiningen-home]]) (:require [clojure.java.io :as io] [clojure.string :as string] [clucy.core :as clucy]) (:import (java.util.zip ZipFile) (java.net URL))) ;;; Fetching Indices (defn- unzip [source target-dir] (let [zip (ZipFile. source) entries (enumeration-seq (.entries zip)) target-file #(io/file target-dir (.getName %))] (doseq [entry entries :when (not (.isDirectory entry)) :let [f (target-file entry)]] (.mkdirs (.getParentFile f)) (io/copy (.getInputStream zip entry) f)))) (defn index-location [url] (io/file (leiningen-home) "indices" (string/replace url #"[:/]" "_"))) (defn remote-index-url [url] (URL. (format "%s/.index/nexus-maven-repository-index.zip" url))) (defn- download-index [[id {url :url}]] (with-open [stream (.openStream (remote-index-url url))] (println "Downloading index from" id "-" url "... this may take a while.") (let [tmp (java.io.File/createTempFile "lein" "index")] (try (io/copy stream tmp) (unzip tmp (index-location url)) (finally (.delete tmp)))))) (defn- download-needed? [[id {:keys [url]}]] (not (.exists (index-location url)))) (defn ensure-fresh-index [repository] (try (when (download-needed? repository) (download-index repository)) true (catch java.io.IOException _ false))) ;;; Searching (def ^{:private true} page-size (:search-page-size (user-settings) 25)) (defn search-repository [[id {:keys [url]} :as repo] query page] (if (ensure-fresh-index repo) (let [location (.getAbsolutePath (index-location url)) fetch-count (* page page-size) offset (* (dec page) page-size) results (clucy/search (clucy/disk-index location) query fetch-count :default-field :a)] (with-meta (drop offset results) (meta results))) (binding [*out* *err*] (println "Warning: couldn't download index for" url)))) (defn parse-result [{:keys [u d]}] (let [[group artifact version classifier] (.split u "\\|") group (if (not= group artifact) group) identifier [(symbol group artifact) (format "\"%s\"" version)]] (if d [identifier d] [identifier]))) (defn- print-results [[id] results page] (when (seq results) (println " == Results from" id "-" "Showing page" page "/" (-> results meta :_total-hits (/ page-size) Math/ceil int) "total") (doseq [result (map parse-result results)] (apply println result)) (prn))) (defn ^{:help-arglists '([query] [query page])} search "Search remote maven repositories for matching jars. The first run will download a set of indices, which will take a while. Pass in --update as the query to force a fresh download of all indices. The query is evaluated as a lucene search. You can search for simple string matches or do more advanced queries such as this 'lein search \"clojure AND http AND NOT g:org.clojars*\"' Also accepts a second parameter for fetching successive pages." ;; support running outside project ([query] (search {} query)) ([project-or-query query-or-page] ;; this arity does double-duty: simple query inside project or ;; query+page outside project (if (string? project-or-query) (search {} project-or-query query-or-page) (search project-or-query query-or-page 1))) ([project query page] ;; you know what would be just super? pattern matching. (if (= "--update" query) (doseq [[_ {url :url} :as repo] (repositories-for project) :when (not= url "http://disabled-central")] (delete-file-recursively (index-location url) :silently) (ensure-fresh-index repo)) (doseq [repo (dissoc (repositories-for project) "disabled-central") :let [page (Integer. page)] :when (not= (:url (val repo)) "http://disabled-central")] (print-results repo (search-repository repo query page) page))))) technomancy-leiningen-713a4d9/src/leiningen/test!.clj000066400000000000000000000006061173437653500226170ustar00rootroot00000000000000(ns leiningen.test! "Run the project's tests after cleaning and fetching dependencies." (:refer-clojure :exclude [test]) (:use [leiningen.clean :only [clean]] [leiningen.deps :only [deps]] [leiningen.test :only [test]])) (defn test! "Run a project's tests after cleaning and fetching dependencies." [project & nses] (apply test (doto project clean deps) nses)) technomancy-leiningen-713a4d9/src/leiningen/test.clj000066400000000000000000000102111173437653500225470ustar00rootroot00000000000000(ns leiningen.test "Run the project's tests." (:refer-clojure :exclude [test]) (:use [clojure.java.io :only [file]] [leiningen.core :only [*interactive?*]] [leiningen.util.ns :only [namespaces-in-dir]] [leiningen.compile :only [eval-in-project]]) (:import (java.io File))) (def ^{:dynamic true} *exit-after-tests* true) (defn- form-for-hook-selectors [selectors] `(when (seq ~selectors) (leiningen.util.injected/add-hook (resolve 'clojure.test/test-var) (fn test-var-with-selector [test-var# var#] (when (reduce #(or %1 (%2 (assoc (meta var#) ::var var#))) false ~selectors) (test-var# var#)))))) (defn form-for-testing-namespaces "Return a form that when eval'd in the context of the project will test each namespace and print an overall summary." ([namespaces result-file & [selectors]] `(do (doseq [n# '~namespaces] (require n# :reload)) ~(form-for-hook-selectors selectors) (let [failures# (atom #{}) _# (leiningen.util.injected/add-hook #'clojure.test/report (fn report-with-failures [report# m# & args#] (when (#{:error :fail} (:type m#)) (swap! failures# conj (-> clojure.test/*testing-vars* first meta :ns ns-name))) (apply report# m# args#))) summary# (binding [clojure.test/*test-out* *out*] (apply ~'clojure.test/run-tests ~(if (seq selectors) `(distinct (for [ns# '~namespaces [_# var#] (ns-publics ns#) :when (reduce #(or %1 (%2 (assoc (meta var#) ::var var#))) false ~selectors)] ns#)) (list 'quote namespaces))))] (spit ".lein-failures" (pr-str @failures#)) ;; Stupid ant won't let us return anything, so write results to disk (with-open [w# (-> (java.io.File. ~result-file) (java.io.FileOutputStream.) (java.io.OutputStreamWriter.))] (.write w# (pr-str summary#))) (when (or ~*exit-after-tests* (not ~*interactive?*)) (System/exit (+ (:error summary#) (:fail summary#)))))))) (defn- read-args [args project] (let [args (map read-string args) nses (if (or (empty? args) (every? keyword? args)) (sort (namespaces-in-dir (:test-path project))) (filter symbol? args)) selectors (map (merge {:all '(constantly true)} (:test-selectors project)) (filter keyword? args)) selectors (if (and (empty? selectors) (:default (:test-selectors project))) [(:default (:test-selectors project))] selectors)] (when (and (not (:test-selectors project)) (some keyword? args)) (throw (Exception. "Must specify :test-selectors in project.clj"))) [nses selectors])) (defn test "Run the project's tests. Accepts either a list of test namespaces to run or a list of test selectors. With no arguments, runs all tests." [project & tests] (when (:eval-in-leiningen project) (require '[clojure walk template stacktrace])) (let [[nses selectors] (read-args tests project) result (doto (File/createTempFile "lein" "result") .deleteOnExit)] (eval-in-project project (form-for-testing-namespaces nses (.getAbsolutePath result) (vec selectors)) nil nil '(require 'clojure.test)) (if (and (.exists result) (pos? (.length result))) (let [summary (read-string (slurp (.getAbsolutePath result))) success? (zero? (+ (:error summary) (:fail summary)))] (if success? 0 1)) 1))) technomancy-leiningen-713a4d9/src/leiningen/trampoline.clj000066400000000000000000000032311173437653500237460ustar00rootroot00000000000000(ns leiningen.trampoline (:refer-clojure :exclude [trampoline]) (:use [leiningen.core :only [apply-task task-not-found abort]] [leiningen.compile :only [sh]] [leiningen.classpath :only [get-classpath-string]]) (:require [clojure.string :as string] [clojure.java.io :as io] [clojure.java.shell :as shell] [leiningen.util.paths :as paths])) (def ^{:dynamic true} *trampoline?* false) (defn win-batch? [] (.endsWith (System/getProperty "leiningen.trampoline-file") ".bat")) (defn write-trampoline [command] (spit (System/getProperty "leiningen.trampoline-file") (string/join " " (if (win-batch?) command (conj (vec (butlast command)) (with-out-str (prn (last command)))))))) (defn trampoline "Run a task without nesting the project's JVM inside Leiningen's. Calculates what needs to run in the project's process for the provided task and runs it after Leiningen's own JVM process has exited rather than as a subprocess of Leiningen's project. Use this to save memory or to work around things like stdin issues. Not compatible with chaining. ALPHA: subject to change without warning." [project task-name & args] (let [command (atom nil)] (when (:eval-in-leiningen project) (println "Warning: trampoline has no effect with :eval-in-leiningen.")) (binding [*trampoline?* true sh (fn [& c] (reset! command c) 0)] (apply-task task-name project args task-not-found)) (if @command (write-trampoline @command) (abort task-name "did not run any project code for trampolining.")))) technomancy-leiningen-713a4d9/src/leiningen/uberjar.clj000066400000000000000000000075531173437653500232410ustar00rootroot00000000000000(ns leiningen.uberjar "Package up the project files and deps into a jar file." (:require [clojure.xml :as xml]) (:use [clojure.zip :only [xml-zip children]] [clojure.java.io :only [file copy]] [leiningen.core :only [abort]] [leiningen.clean :only [clean]] [leiningen.jar :only [get-jar-filename get-default-uberjar-name jar]] [leiningen.deps :only [deps]]) (:import (java.util.zip ZipFile ZipOutputStream ZipEntry) (java.io File FileOutputStream PrintWriter))) (defn read-components [zipfile] (when-let [entry (.getEntry zipfile "META-INF/plexus/components.xml")] (->> (xml-zip (xml/parse (.getInputStream zipfile entry))) children (filter #(= (:tag %) :components)) first :content))) ;; We have to keep this separate from skip-set for performance reasons. (defn- make-skip-pred [project] (fn [filename] (some #(re-find % filename) (:uberjar-exclusions project)))) (defn- copy-entries "Copies the entries of ZipFile in to the ZipOutputStream out, skipping the entries which satisfy skip-pred. Returns the names of the entries copied." [in out skip-set skip-pred] (for [file (enumeration-seq (.entries in)) :let [filename (.getName file)] :when (not (or (skip-set filename) (skip-pred filename)))] (do (.setCompressedSize file -1) ; some jars report size incorrectly (.putNextEntry out file) (copy (.getInputStream in file) out) (.closeEntry out) (.getName file)))) ;; we have to keep track of every entry we've copied so that we can ;; skip duplicates. We also collect together all the plexus components so ;; that we can merge them. (defn include-dep [out skip-pred [skip-set components] dep] (println "Including" (.getName dep)) (with-open [zipfile (ZipFile. dep)] [(into skip-set (copy-entries zipfile out skip-set skip-pred)) (concat components (read-components zipfile))])) (defn write-components "Given a list of jarfiles, writes contents to a stream" [project jars out] (let [[_ components] (reduce (partial include-dep out (make-skip-pred project)) [#{"META-INF/plexus/components.xml"} nil] jars)] (when-not (empty? components) (.putNextEntry out (ZipEntry. "META-INF/plexus/components.xml")) (binding [*out* (PrintWriter. out)] (xml/emit {:tag :component-set :content [{:tag :components :content components}]}) (.flush *out*)) (.closeEntry out)))) (defn uberjar "Package up the project files and all dependencies into a jar file. Includes the contents of each of the dependency jars. Suitable for standalone distribution. With an argument, the uberjar will be built with an alternate main. The namespace you choose as main should have :gen-class in its ns form as well as defining a -main function." ([project main] (when-not (:disable-implicit-clean project) (clean project)) (if (jar (if main (assoc project :main (symbol main)) project)) (let [uberjar-name (get-default-uberjar-name project) standalone-filename (get-jar-filename project uberjar-name)] (with-open [out (-> standalone-filename (FileOutputStream.) (ZipOutputStream.))] (let [deps (->> (.listFiles (file (:library-path project))) (filter #(.endsWith (.getName %) ".jar"))) jars (cons (file (get-jar-filename project)) deps)] (write-components project jars out))) (println "Created" standalone-filename) standalone-filename) (abort "Uberjar aborting because jar/compilation failed."))) ([project] (uberjar project nil))) technomancy-leiningen-713a4d9/src/leiningen/upgrade.clj000066400000000000000000000003471173437653500232300ustar00rootroot00000000000000(ns leiningen.upgrade "Upgrade Leiningen to specified version or latest stable.") ;; This file is only a placeholder. The real upgrade ;; implementation can be found in the 'lein' script. (defn upgrade ([]) ([target-version])) technomancy-leiningen-713a4d9/src/leiningen/util/000077500000000000000000000000001173437653500220605ustar00rootroot00000000000000technomancy-leiningen-713a4d9/src/leiningen/util/file.clj000066400000000000000000000012031173437653500234650ustar00rootroot00000000000000(ns leiningen.util.file (:use [clojure.java.io :only [file delete-file]])) (def tmp-dir (System/getProperty "java.io.tmpdir")) (defn unique-lein-tmp-dir [] (file tmp-dir (str "lein-" (java.util.UUID/randomUUID)))) ;; grumble, grumble; why didn't this make it into clojure.java.io? (defn delete-file-recursively "Delete file f. If it's a directory, recursively delete all its contents. Raise an exception if any deletion fails unless silently is true." [f & [silently]] (let [f (file f)] (if (.isDirectory f) (doseq [child (.listFiles f)] (delete-file-recursively child silently))) (delete-file f silently))) technomancy-leiningen-713a4d9/src/leiningen/util/maven.clj000066400000000000000000000233251173437653500236650ustar00rootroot00000000000000(ns leiningen.util.maven (:use [leiningen.core :only [repositories-for abort]] [clojure.java.io :only [file reader]]) (:import (java.io File) (org.apache.maven.model Build Model Parent Dependency Resource Exclusion Extension Repository Scm License MailingList) (org.apache.maven.project.artifact ProjectArtifactMetadata) (org.apache.maven.settings MavenSettingsBuilder) (org.apache.maven.artifact.repository ArtifactRepositoryFactory DefaultArtifactRepository) (org.apache.maven.artifact.factory ArtifactFactory) (org.apache.maven.artifact.repository ArtifactRepositoryPolicy) (org.apache.maven.artifact.repository.layout ArtifactRepositoryLayout) (org.codehaus.plexus.embed Embedder))) ;; Welcome to the absurdist self-parodying world of Dependency Injection (def container (.getContainer (doto (Embedder.) (.start)))) (def layout (.lookup container ArtifactRepositoryLayout/ROLE "default")) (def policy (ArtifactRepositoryPolicy. true ArtifactRepositoryPolicy/UPDATE_POLICY_DAILY ArtifactRepositoryPolicy/CHECKSUM_POLICY_FAIL)) (defn make-settings [] (.buildSettings (.lookup container MavenSettingsBuilder/ROLE))) ;; repositories (def local-repo-path (.getLocalRepository (make-settings))) (defn make-local-repo [] (let [url (if (.startsWith local-repo-path "file:") local-repo-path (str "file://" local-repo-path))] (-> (.lookup container ArtifactRepositoryFactory/ROLE) (.createDeploymentArtifactRepository "local" url layout true)))) ;; TODO: support settings from leiningen.deps/make-repository (defn make-remote-repo [[name url]] (-> (.lookup container ArtifactRepositoryFactory/ROLE) (.createArtifactRepository name (:url url url) ; heh layout policy policy))) (defn add-metadata [artifact pomfile] (.addMetadata artifact (ProjectArtifactMetadata. artifact pomfile))) (defn make-artifact [model] (.createArtifactWithClassifier (.lookup container ArtifactFactory/ROLE) (.getGroupId model) (.getArtifactId model) (.getVersion model) (.getPackaging model) nil)) (defn make-remote-artifact [name group version] (.createArtifact (.lookup container ArtifactFactory/ROLE) (or group name) name version "compile" "jar")) ;; git (defn- read-git-ref "Reads the commit SHA1 for a git ref path." [git-dir ref-path] (.trim (slurp (str (file git-dir ref-path))))) (defn- read-git-head "Reads the value of HEAD and returns a commit SHA1." [git-dir] (let [head (.trim (slurp (str (file git-dir "HEAD"))))] (if-let [ref-path (second (re-find #"ref: (\S+)" head))] (read-git-ref git-dir ref-path) head))) (defn- read-git-origin "Reads the URL for the remote origin repository." [git-dir] (with-open [rdr (reader (file git-dir "config"))] (->> (map #(.trim %) (line-seq rdr)) (drop-while #(not= "[remote \"origin\"]" %)) (next) (take-while #(not (.startsWith % "["))) (map #(re-matches #"url\s*=\s*(\S*)\s*" %)) (filter identity) (first) (second)))) (defn- parse-github-url "Parses a GitHub URL returning a [username repo] pair." [url] (when url (next (or (re-matches #"(?:git@)?github.com:([^/]+)/([^/]+).git" url) (re-matches #"[^:]+://(?:git@)?github.com/([^/]+)/([^/]+).git" url))))) (defn- github-urls [url] (when-let [[user repo] (parse-github-url url)] {:public-clone (str "git://github.com/" user "/" repo ".git") :dev-clone (str "ssh://git@github.com/" user "/" repo ".git") :browse (str "https://github.com/" user "/" repo)})) (defn- make-git-scm [git-dir] (try (let [origin (read-git-origin git-dir) head (read-git-head git-dir) urls (github-urls origin) scm (Scm.)] (.setUrl scm (:browse urls)) (.setTag scm head) (when (:public-clone urls) (.setConnection scm (str "scm:git:" (:public-clone urls)))) (when (:dev-clone urls) (.setDeveloperConnection scm (str "scm:git:" (:dev-clone urls)))) scm) (catch java.io.FileNotFoundException e nil))) ;; model (defn make-parent [parent version & {:as opts}] (doto (Parent.) (.setArtifactId (name parent)) (.setGroupId (or (namespace parent) (name parent))) (.setVersion version) (.setRelativePath (:relative-path opts)))) (defn make-exclusion [excl] (doto (Exclusion.) (.setGroupId (or (namespace excl) (name excl))) (.setArtifactId (name excl)))) (defn make-dependency "Makes a dependency from a seq. The seq (usually a vector) should contain a symbol to define the group and artifact id, then a version string. The remaining arguments are combined into a map. The value for the :classifier key (if present) is the classifier on the dependency (as a string). The value for the :exclusions key, if present, is a seq of symbols, identifying group ids and artifact ids to exclude from transitive dependencies." ([dependency] (make-dependency dependency {})) ([dependency project] (make-dependency dependency project nil)) ([dependency project scope] (when (and dependency (not (vector? dependency))) (throw (Exception. (str "Dependencies must be specified as vector:" dependency)))) (let [[dep version & extras] dependency extras-map (apply hash-map extras) exclusions (:exclusions extras-map) classifier (:classifier extras-map) type (:type extras-map) es (map make-exclusion (concat exclusions (:exclusions project)))] (doto (Dependency.) ;; Allow org.clojure group to be omitted from clojure/contrib deps. (.setGroupId (if (and (nil? (namespace dep)) (re-find #"^clojure(-contrib)?$" (name dep))) "org.clojure" (or (namespace dep) (name dep)))) (.setArtifactId (name dep)) (.setVersion version) (.setScope scope) (.setClassifier classifier) (.setType (or type "jar")) (.setExclusions es))))) (defn make-repository [[id settings]] (let [repo (Repository.)] (.setId repo id) (if (string? settings) (.setUrl repo settings) (.setUrl repo (:url settings))) repo)) (defn make-license [{:keys [name url distribution comments]}] (doto (License.) (.setName name) (.setUrl url) (.setDistribution (and distribution (clojure.core/name distribution))) (.setComments comments))) (defn make-mailing-list [{:keys [name archive other-archives post subscribe unsubscribe]}] (let [mailing-list (MailingList.)] (doto mailing-list (.setName name) (.setArchive archive) (.setPost post) (.setSubscribe subscribe) (.setUnsubscribe unsubscribe)) (doseq [other-archive other-archives] (.addOtherArchive mailing-list other-archive)) mailing-list)) (defn make-extension "Makes an extension from a seq. The seq (usually a vector) should contain a symbol to define the group and artifact id, then a version string. More details: http://maven.apache.org/pom.html#Extensions" [extension] (when (and extension (not (vector? extension))) (throw (Exception. (str "Extensions must be specified as vector:" extension)))) (let [[ext version] extension] (doto (Extension.) (.setGroupId (or (namespace ext) (name ext))) (.setArtifactId (name ext)) (.setVersion version)))) (defn make-extensions [project] (map make-extension (:extensions project))) (defn- relative-path [project path-key] (.replace (path-key project) (str (:root project) File/separator) "")) (defn make-resource [project resource-path] (doto (Resource.) (.setDirectory (relative-path project resource-path)))) (defn make-build [project] (doto (Build.) (.setResources [(make-resource project :resources-path)]) (.setTestResources [(make-resource project :dev-resources-path)]) (.setSourceDirectory (relative-path project :source-path)) (.setTestSourceDirectory (relative-path project :test-path)) (.setExtensions (make-extensions project)))) (defn make-model [project] (let [model (doto (Model.) (.setModelVersion "4.0.0") (.setArtifactId (:name project)) (.setName (:name project)) (.setVersion (:version project)) (.setGroupId (:group project)) (.setDescription (:description project)) (.setUrl (:url project)) (.setBuild (make-build project)))] (doseq [dev (:dev-dependencies project)] (.addDependency model (make-dependency dev project "test"))) (doseq [dep (:dependencies project)] (.addDependency model (make-dependency dep project))) (doseq [repo (repositories-for project)] (.addRepository model (make-repository repo))) (when-let [scm (make-git-scm (file (:root project) ".git"))] (.setScm model scm)) (when-let [parent (:parent project)] (.setParent model (apply make-parent parent))) (doseq [license (concat (map project (filter project [:licence :license])) (:licences project) (:licenses project))] (.addLicense model (make-license license))) (doseq [mailing-list (concat (if-let [ml (:mailing-list project)] [ml] []) (:mailing-lists project))] (.addMailingList model (make-mailing-list mailing-list))) model)) technomancy-leiningen-713a4d9/src/leiningen/util/ns.clj000066400000000000000000000046701173437653500232010ustar00rootroot00000000000000(ns leiningen.util.ns "Inspired by clojure.contrib.find-namespaces, but trimmed down to just what Leiningen needs." (:use [clojure.java.io :only [file reader]]) (:import (java.util.jar JarFile) (java.io File BufferedReader PushbackReader InputStreamReader))) ;; The contrib version has a couple issues: it searches the whole ;; classpath rather than allowing you to specify a prefix, which means ;; you can't use it in (for example) my $HOME dir, where ~/src is over ;; 50 GB. Also it never looks past the first form to find a namespace ;; declaration. (def classpath-files (for [f (.split (System/getProperty "java.class.path") (System/getProperty "path.separator"))] (file f))) (defn clj? [f] (.endsWith (.getName f) ".clj")) (defn jar? [f] (and (.isFile f) (.endsWith (.getName f) ".jar"))) (defn read-ns-form [r f] ;; bug in Clojure 1.2 allows reading "{foo}" and throws when str'd (let [form (try (doto (read r false ::done) str) (catch Exception e ::done))] (if (and (list? form) (= 'ns (first form))) form (when-not (= ::done form) (recur r f))))) (defn find-ns-form [f] (when (and (.isFile (file f)) (clj? f)) (read-ns-form (PushbackReader. (reader f)) f))) (defn namespaces-in-dir [dir] (sort (for [f (file-seq (file dir)) :let [ns-form (find-ns-form f)] :when ns-form] (second ns-form)))) (defn ns-in-jar-entry [jarfile entry] (with-open [rdr (-> jarfile (.getInputStream (.getEntry jarfile (.getName entry))) InputStreamReader. BufferedReader. PushbackReader.)] (read-ns-form rdr jarfile))) (defn namespaces-in-jar [jar] (let [jarfile (JarFile. jar)] (for [entry (enumeration-seq (.entries jarfile)) :when (and (not (.isDirectory entry)) (clj? entry))] (if-let [ns-form (ns-in-jar-entry jarfile entry)] (second ns-form))))) (defn namespaces-matching [prefix] (concat (mapcat namespaces-in-dir (for [dir classpath-files :when (.isDirectory dir)] (file dir (-> prefix (.replaceAll "\\." "/") (.replaceAll "-" "_"))))) (filter #(and % (.startsWith (name %) prefix)) (mapcat namespaces-in-jar (filter jar? classpath-files))))) technomancy-leiningen-713a4d9/src/leiningen/util/paths.clj000066400000000000000000000034401173437653500236720ustar00rootroot00000000000000(ns leiningen.util.paths (:use [clojure.java.io :only [file]])) (defn ^{:internal true} normalize-path [project-root path] (when path (let [f (file path)] (.getAbsolutePath (if (.isAbsolute f) f (file project-root path)))))) (defn- get-by-pattern "Gets a value from map m, but uses the keys as regex patterns, trying to match against k instead of doing an exact match." [m k] (m (first (drop-while #(nil? (re-find (re-pattern %) k)) (keys m))))) (def ^{:private true} native-names {"Mac OS X" :macosx "Windows" :windows "Linux" :linux "FreeBSD" :freebsd "OpenBSD" :openbsd "amd64" :x86_64 "x86_64" :x86_64 "x86" :x86 "i386" :x86 "arm" :arm "SunOS" :solaris "sparc" :sparc "Darwin" :macosx}) (defn get-os "Returns a keyword naming the host OS." [] (get-by-pattern native-names (System/getProperty "os.name"))) (defn get-arch "Returns a keyword naming the host architecture" [] (get-by-pattern native-names (System/getProperty "os.arch"))) (defn native-arch-path "Path to the os/arch-specific directory containing native libs." [project] (when (and (get-os) (get-arch)) (file (:native-path project) (name (get-os)) (name (get-arch))))) (defn leiningen-home "Returns full path to Lein home dir ($LEIN_HOME or $HOME/.lein)." [] (.getAbsolutePath (doto (if-let [lein-home (System/getenv "LEIN_HOME")] (file lein-home) (file (or (System/getenv "HOME") (System/getenv "USERPROFILE")) ".lein")) .mkdirs))) (defn ns->path [n] (str (.. (str n) (replace \- \_) (replace \. \/)) ".clj")) (defn path->ns [path] (.. (.replaceAll path "\\.clj" "") (replace \_ \-) (replace \/ \.))) technomancy-leiningen-713a4d9/src/leiningen/util/plugins.clj000066400000000000000000000102211173437653500242270ustar00rootroot00000000000000(ns leiningen.util.plugins (:require [clojure.string :as string] [clojure.java.io :as io] [clojure.set :as set] [leiningen.util.file :as file]) (:import (java.lang.management ManagementFactory) (java.security MessageDigest) (java.io File))) ;; This whole namespace is a bit messy, but it's going away in ;; Leiningen 2.0 (with pomegranate), so that's totally A-OK!. (defn- sha1-digest [content] (.toString (BigInteger. 1 (-> (MessageDigest/getInstance "SHA1") (.digest (.getBytes content)))) 16)) (defn ^{:internal true} deps-checksum ([project keys] (sha1-digest (pr-str (map project keys)))) ([project] (deps-checksum project [:dependencies :dev-dependencies]))) ;; Split this function out for better testability. (defn- get-raw-input-args [] (.getInputArguments (ManagementFactory/getRuntimeMXBean))) (defn- get-input-args "Returns a vector of input arguments, accounting for a bug in RuntimeMXBean that splits arguments which contain spaces." [] ;; RuntimeMXBean.getInputArguments() is buggy when an input argument ;; contains spaces. For an input argument of -Dprop="hello world" it ;; returns ["-Dprop=hello", "world"]. Try to work around this bug. (letfn [(join-broken-args [v arg] (if (= \- (first arg)) (conj v arg) (conj (vec (butlast v)) (format "%s %s" (last v) arg))))] (reduce join-broken-args [] (get-raw-input-args)))) (defn- classpath-with-plugins [project plugins] (string/join File/pathSeparator (concat (for [plugin plugins] (.getAbsolutePath (io/file (:root plugin) ".lein-plugins" (.getName (io/file plugin))))) [(System/getProperty "java.class.path")]))) (defn- write-self-trampoline [project plugins] ;; Attempt to reconstruct the command by which the current JVM was ;; launched. Basically work around the fact that the JVM doesn't ;; have $0 and $@. (spit (System/getProperty "leiningen.trampoline-file") (string/join " " `(~(System/getenv "JAVA_CMD") "-client" ~@(get-input-args) "-cp" ~(classpath-with-plugins project plugins) "clojure.main" "-e" "\"(use 'leiningen.core)(-main)\"" "/dev/null" ~@*command-line-args*)))) (defn plugin-files [project dir] ;; Trust me, the alternative is too terrible to comprehend. ;; Basically we'd have to restructure half of leiningen.deps and ;; leiningen.util.maven to factor out the parts that don't depend on ;; the leiningen.core namespace. (require 'leiningen.deps) (-> ((resolve 'leiningen.deps/do-deps) (assoc project :library-path (.getAbsolutePath dir) :exclusions @(resolve 'leiningen.deps/dev-exclusions)) :plugins) .getDirectoryScanner .getIncludedFiles)) (defn stale? [project dir] (and (seq (:plugins project)) (or (not (.exists (io/file dir "checksum"))) (not= (deps-checksum project [:plugins]) (slurp (io/file dir "checksum")))))) (defn delete-stale [dir old-plugins new-plugins] ;; We can't delete theese earlier because it could interfere ;; with dependency fetching in the case of wagons, etc. (let [new-set (set (for [p new-plugins] (.getName (io/file p))))] (doseq [old old-plugins :when (not (new-set old))] (.delete (io/file dir old))))) (defn download-plugins [project] (let [dir (io/file (:root project) ".lein-plugins") old-plugins (.list dir)] (when (stale? project dir) (let [plugins (plugin-files project dir)] (delete-stale dir old-plugins plugins) (spit (io/file dir "checksum") (deps-checksum project [:plugins])) ;; We can't access the plugins we just downloaded, so we need ;; to exit the JVM and relaunch using trampolining. (write-self-trampoline project plugins) (System/exit 0))))) technomancy-leiningen-713a4d9/src/leiningen/version.clj000066400000000000000000000004651173437653500232670ustar00rootroot00000000000000(ns leiningen.version "Print version for Leiningen and the current JVM.") (defn version "Print version for Leiningen and the current JVM." [] (println "Leiningen" (System/getenv "LEIN_VERSION") "on Java" (System/getProperty "java.version") (System/getProperty "java.vm.name"))) technomancy-leiningen-713a4d9/test/000077500000000000000000000000001173437653500173235ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test/leiningen/000077500000000000000000000000001173437653500212735ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test/leiningen/test/000077500000000000000000000000001173437653500222525ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test/leiningen/test/compile.clj000066400000000000000000000077371173437653500244120ustar00rootroot00000000000000(ns leiningen.test.compile (:refer-clojure :exclude [compile]) (:use [clojure.test] [clojure.java.io :only [file]] [clojure.java.shell :only [with-sh-dir]] [leiningen.compile] [leiningen.core :only [read-project]] [leiningen.test.helper :only [sample-project sample-failing-project tricky-name-project dev-deps-project]] [leiningen.util.file :only [delete-file-recursively]])) (use-fixtures :each (fn [f] (delete-file-recursively (file "test_projects" "sample" "classes") true) (delete-file-recursively (file "test_projects" "sample_failing" "classes") true) (f))) (deftest test-compile (is (zero? (compile sample-project))) (is (.exists (file "test_projects" "sample" "classes" "nom" "nom" "nom.class"))) (is (pos? (compile sample-failing-project)))) (deftest test-compile-regex (is (zero? (compile (assoc tricky-name-project :aot [#"unch"])))) (is (not (.exists (file (:compile-path tricky-name-project) "org" "domain" "tricky_name" "core__init.class")))) (is (.exists (file (:compile-path tricky-name-project) "org" "domain" "tricky_name" "brunch__init.class"))) (is (.exists (file (:compile-path tricky-name-project) "org" "domain" "tricky_name" "munch__init.class")))) (deftest test-plugin (is (zero? (eval-in-project (assoc sample-project :eval-in-leiningen true :skip-shutdown-agents true :main nil) '(do (require 'leiningen.compile) :compiled))))) (deftest test-cleared-transitive-aot (is (zero? (compile (assoc sample-project :clean-non-project-classes true)))) (is (zero? (eval-in-project sample-project '(require 'nom.nom.nom))) "can't load after compiling") (let [classes (seq (.list (file "test_projects" "sample" "classes" "nom" "nom")))] (doseq [r [#"nom\$fn__\d+.class" #"nom\$loading__\d+__auto____\d+.class" #"nom\$_main__\d+.class" #"nom.class" #"nom__init.class"]] (is (some (partial re-find r) classes) (format "missing %s" r)))) (is (not (.exists (file "test_projects" "sample" "classes" "sample2" "core.class")))) (is (not (.exists (file "test_projects" "sample" "classes" "sample2" "alt.class"))))) (deftest test-cleared-transitive-aot-by-regexes (is (zero? (compile (assoc sample-project :clean-non-project-classes [#"core"])))) (let [classes (seq (.list (file "test_projects" "sample" "classes" "nom" "nom")))] (doseq [r [#"nom\$fn__\d+.class" #"nom\$loading__\d+__auto____\d+.class" #"nom\$_main__\d+.class" #"nom.class" #"nom__init.class"]] (is (some (partial re-find r) classes) (format "missing %s" r)))) (is (not (.exists (file "test_projects" "sample" "classes" "sample2" "core.class")))) (is (.exists (file "test_projects" "sample" "classes" "sample2" "alt__init.class")))) (deftest test-skip-aot-on-main (delete-file-recursively (:compile-path tricky-name-project) :silent) (is (zero? (compile tricky-name-project))) (is (empty? (.list (file (:compile-path tricky-name-project)))))) (deftest test-injection (is (zero? (eval-in-project sample-project '#'leiningen.util.injected/add-hook)))) (deftest test-compile-java-main (is (zero? (compile dev-deps-project)))) (deftest test-jvm-opts (is (= ["-Dhello=\"guten tag\"" "-XX:+HeapDumpOnOutOfMemoryError"] (get-jvm-opts-from-env (str "-Dhello=\"guten tag\" " "-XX:+HeapDumpOnOutOfMemoryError")))))technomancy-leiningen-713a4d9/test/leiningen/test/core.clj000066400000000000000000000054151173437653500237010ustar00rootroot00000000000000(ns leiningen.test.core (:use [clojure.test] [leiningen.core] [leiningen.test.helper :only [sample-project]])) (deftest test-make-groups-empty-args (is (= [[]] (make-groups [])))) (deftest test-make-groups-single-task (is (= [["pom"]] (make-groups ["pom"])))) (deftest test-make-groups-without-args (is (= [["clean"] ["deps"] ["test"]] (make-groups ["clean," "deps," "test"])))) (deftest test-make-groups-with-args (is (= [["test" "test-core"] ["version"]] (make-groups ["test" "test-core," "version"])))) (deftest test-make-groups-with-long-chain (is (= [["help" "help"] ["help" "version"] ["version"] ["test" "test-compile"]] (make-groups '("help" "help," "help" "version," "version," "test" "test-compile"))))) (deftest test-matching-arity-with-project (is (matching-arity? "test" {} [])) (is (matching-arity? "test" {} ["test-core"])) (is (not (matching-arity? "version" {} ["bogus" "arg" "s"]))) (is (matching-arity? "search" {} ["clojure"])) (is (matching-arity? "search" {} ["clojure" "2"]))) (deftest test-matching-arity-without-project (is (matching-arity? "version" nil [])) (is (not (matching-arity? "test" nil []))) (is (not (matching-arity? "test" nil ["test-core"]))) (is (matching-arity? "search" nil ["clojure"])) (is (matching-arity? "search" nil ["clojure" "2"]))) (deftest test-unquote (is (= ['org.clojure/clojure "1.1.0"] (first (:dependencies sample-project)))) (is (= '(fn [_] (> (rand) 0.5))))) (deftest test-version-greater-eq (is (version-greater-eq? "1.5.0" "1.4.2")) (is (not (version-greater-eq? "1.4.2" "1.5.0"))) (is (version-greater-eq? "1.2.3" "1.1.1")) (is (version-greater-eq? "1.2.0" "1.2")) (is (version-greater-eq? "1.2" "1"))) (deftest test-repositories-for-omitting-central (let [repos (repositories-for {:omit-default-repositories true :repositories {"repo-1" "http://repo-1-url"}})] (is (= ["http://disabled-central" "http://repo-1-url"] (map :url (vals repos)))))) (deftest test-repositories-for-including-defaults (let [repos (repositories-for sample-project)] (is (get repos "central")) (is (get repos "clojars")) (is (get repos "snapshots")))) (deftest test-repositories-for-many-repos-ordered (let [repo-names (map #(str "repo-" %) (range 20)) fake-url-ify #(str % "-url") repos (repositories-for {:omit-default-repositories true :repositories (map #(vector % (fake-url-ify %)) repo-names)})] (is (= clojure.lang.PersistentArrayMap (class repos))) (is (= {:url "repo-11-url"} (get repos "repo-11"))) (is (= (map fake-url-ify repo-names) (rest (map :url (vals repos))))))) technomancy-leiningen-713a4d9/test/leiningen/test/deploy.clj000066400000000000000000000032761173437653500242500ustar00rootroot00000000000000(ns leiningen.test.deploy (:use [clojure.test] [clojure.java.io :only [file]] [leiningen.deploy] [leiningen.core :only [read-project defproject]] [leiningen.util.file :only [delete-file-recursively tmp-dir]] [leiningen.test.helper :only [sample-project]])) (defn- repo-path [relative-repo-path] (format "%s/%s" tmp-dir relative-repo-path)) (defn- repo-url [absolute-repo-path] (str "file://" absolute-repo-path)) (defn- deploy-snapshots [project relative-repo-path & [explicit-deploy-repo?]] (let [repo-path (repo-path relative-repo-path) repo-url (repo-url repo-path)] (delete-file-recursively repo-path :silently) (deploy project (if explicit-deploy-repo? repo-url "snapshots")) (let [dir (file repo-path "nomnomnom/nomnomnom/0.5.0-SNAPSHOT/") files (.list dir)] (is (seq files)) ;; TODO: this is vulnerable to the y3k bug! (is (seq (filter #(re-find #"nomnomnom-0.5.0-2\d{7}\." %) files)))))) (deftest test-deploy (testing "simple deployment to `snapshots` already defined in project.clj" (deploy-snapshots sample-project "lein-repo"))) (deftest test-deploy-custom-url (testing "deployment to a repo specified as a URL argument to `deploy`" (deploy-snapshots sample-project "lein-custom-repo" true))) (deftest test-deploy-repositories-key (testing "preferring repository specified in :deploy-repositories over one specified in :repositories" (deploy-snapshots (assoc sample-project :deploy-repositories {"snapshots" (-> "deploy-only-repo" repo-path repo-url)}) "deploy-only-repo"))) technomancy-leiningen-713a4d9/test/leiningen/test/deps.clj000066400000000000000000000136401173437653500237030ustar00rootroot00000000000000(ns leiningen.test.deps (:use [leiningen.core :only [read-project defproject apply-task]] [leiningen.deps :only [deps do-deps]] [clojure.test] [clojure.java.io :only [file]] [leiningen.util.file :only [delete-file-recursively]] [leiningen.util.paths :only [get-os get-arch native-arch-path]] [leiningen.test.helper :only [sample-project dev-deps-project m2-dir with-no-log native-project]])) (defn lib-populated? [project re] (some #(re-find re (.getName %)) (file-seq (file (:library-path project))))) (deftest ^{:online true} test-deps (delete-file-recursively (:library-path sample-project) true) (deps sample-project) (let [jars (set (map #(.getName %) (.listFiles (file (:library-path sample-project)))))] (doseq [j ["jdom-1.0.jar" "tagsoup-1.2.jar" "rome-0.9.jar"]] (is (jars j))))) (deftest ^{:online true} test-dev-deps-only (delete-file-recursively (:library-path dev-deps-project) true) (deps dev-deps-project) (let [jars (set (map #(.getName %) (.listFiles (file (:root dev-deps-project) "lib" "dev"))))] (is (not (contains? jars "clojure-1.2.0.jar"))) (is (contains? jars "cheshire-2.0.2.jar")))) (deftest ^{:online true} test-snapshots-releases (try (let [pr (assoc sample-project :omit-default-repositories true :repositories {"clojars" {:url "http://clojars.org/repo/" :snapshots false}}) ps (assoc sample-project :omit-default-repositories true :repositories {"clojars" {:url "http://clojars.org/repo/" :releases false}}) slamhound ['slamhound "1.1.0-SNAPSHOT"] hooke ['robert/hooke "1.0.1"] deps (fn [project] (delete-file-recursively (apply m2-dir slamhound) :quiet) (delete-file-recursively (apply m2-dir hooke) :quiet) (leiningen.deps/deps project))] (deps (assoc pr :dependencies [hooke])) (is (lib-populated? ps #"hooke")) (deps (assoc ps :dependencies [slamhound])) (is (lib-populated? ps #"slamhound")) (let [snaps-repo-rel-dep (assoc ps :dependencies [hooke])] (is (thrown? Exception (with-no-log (deps snaps-repo-rel-dep))))) (let [rel-repo-snaps-dep (assoc pr :dependencies [slamhound])] (is (thrown? Exception (with-no-log (deps rel-repo-snaps-dep)))))) (finally (delete-file-recursively (:library-path sample-project) :silently)))) (def native-lib-files-map {:linux {:x86 #{"libjri.so" "libjinput-linux.so" "liblwjgl.so" "libopenal.so" "librxtxSerial.so" "libjtokyocabinet.so" "libjtokyocabinet.so.1" "libjtokyocabinet.so.1.1.0" "libtokyocabinet.a" "libtokyocabinet.so" "libtokyocabinet.so.9" "libtokyocabinet.so.9.10.0" "libtokyocabinet.so.9.8.0"} :x86_64 #{"libjri.so" "libjinput-linux64.so" "liblwjgl64.so" "libopenal64.so" "librxtxSerial.so" "libjtokyocabinet.so" "libjtokyocabinet.so.1" "libjtokyocabinet.so.1.1.0" "libtokyocabinet.a" "libtokyocabinet.so" "libtokyocabinet.so.9" "libtokyocabinet.so.9.10.0" "libtokyocabinet.so.9.8.0"}} :macosx {:x86 #{"libjri.jnilib" "libjinput-osx.jnilib" "liblwjgl.jnilib" "openal.dylib" "librxtxSerial.jnilib" "libjtokyocabinet.1.1.0.dylib" "libjtokyocabinet.1.dylib" "libjtokyocabinet.dylib" "libjtokyocabinet.jnilib" "libtokyocabinet.9.10.0.dylib" "libtokyocabinet.9.8.0.dylib" "libtokyocabinet.9.dylib" "libtokyocabinet.a" "libtokyocabinet.dylib"} :x86_64 #{"libjri.jnilib" "libjinput-osx.jnilib" "liblwjgl.jnilib" "openal.dylib" "librxtxSerial.jnilib" "libjtokyocabinet.1.1.0.dylib" "libjtokyocabinet.1.dylib" "libjtokyocabinet.dylib" "libjtokyocabinet.jnilib" "libtokyocabinet.9.10.0.dylib" "libtokyocabinet.9.8.0.dylib" "libtokyocabinet.9.dylib" "libtokyocabinet.a" "libtokyocabinet.dylib"}} :windows {:x86 #{"jri.dll" "rJava.dll" "jinput-dx8.dll" "jinput-raw.dll" "lwjgl.dll" "OpenAL32.dll" "rxtxSerial.dll"} :x86_64 #{"jri.dll rJava.dll" "jinput-dx8_64.dll" "jinput-raw_64.dll" "lwjgl64.dll" "OpenAL64.dll" "rxtxSerial.dll"}} :solaris {:x86 #{"liblwjgl.so" "libopenal.so"} :x86_64 #{"liblwjgl64.so" "libopenal.so"}}}) (deftest ^{:online true} test-native-deps (delete-file-recursively (:library-path native-project) true) (delete-file-recursively (:native-path native-project) true) (deps native-project) (is (= (conj (get-in native-lib-files-map [(get-os) (get-arch)]) ".gitkeep") (set (for [f (rest (file-seq (native-arch-path native-project)))] (.getName f)))))) (deftest ^{:online true} test-checksum-deps (delete-file-recursively (:library-path sample-project) true) (deps (assoc sample-project :checksum-deps true)) (let [deps-ran (atom false)] (binding [do-deps (fn [& _] (reset! deps-ran true))] (deps (assoc sample-project :checksum-deps true)) (is (not @deps-ran))))) (deftest ^{:online true} test-explicit-checksum-deps (delete-file-recursively (:library-path sample-project) true) (deps (assoc sample-project :checksum-deps true)) (let [deps-ran (atom false)] (binding [do-deps (fn [& _] (reset! deps-ran true))] (apply-task "deps" (assoc sample-project :checksum-deps true) [] #()) (is @deps-ran)))) technomancy-leiningen-713a4d9/test/leiningen/test/help.clj000066400000000000000000000023411173437653500236740ustar00rootroot00000000000000(ns leiningen.test.help (:use [leiningen.help] [clojure.test])) (def formatted-docstring @#'leiningen.help/formatted-docstring) (def get-subtasks-and-docstrings-for @#'leiningen.help/get-subtasks-and-docstrings-for) (def formatted-help @#'leiningen.help/formatted-help) (def resolve-task @#'leiningen.help/resolve-task) (deftest blank-subtask-help-for-new (let [subtask-help (apply subtask-help-for (resolve-task "new"))] (is (= nil subtask-help)))) (deftest subtask-help-for-plugin (let [subtask-help (apply subtask-help-for (resolve-task "plugin"))] (is (re-find #"install" subtask-help)) (is (re-find #"uninstall" subtask-help)))) (deftest test-docstring-formatting (is (= "This is an AWESOME command For real!" (formatted-docstring "install" "This is an\n AWESOME command\nFor real!" 5)))) (deftest test-formatted-help (is (= "install This is an AWESOME command For real!" (formatted-help "install" "This is an\nAWESOME command\nFor real!" 15)))) (deftest test-get-subtasks (let [m (get-subtasks-and-docstrings-for (second (resolve-task "plugin")))] (is (= ["install" "uninstall"] (map first m))))) technomancy-leiningen-713a4d9/test/leiningen/test/helper.clj000066400000000000000000000023601173437653500242240ustar00rootroot00000000000000(ns leiningen.test.helper (:require [lancet.core :as lancet]) (:use [clojure.java.io :only [file]] [leiningen.compile :only [platform-nullsink]] [leiningen.core :only [read-project]] [leiningen.util.maven :only [make-local-repo]])) (def local-repo (.getBasedir (make-local-repo))) (defn m2-dir [n v] (file local-repo (if (string? n) n (or (namespace n) (name n))) (name n) v)) (defn- read-test-project [name] (binding [*ns* (find-ns 'leiningen.core)] (read-project (format "test_projects/%s/project.clj" name)))) (def sample-project (read-test-project "sample")) (def dev-deps-project (read-test-project "dev-deps-only")) (def sample-failing-project (read-test-project "sample_failing")) (def sample-no-aot-project (read-test-project "sample_no_aot")) (def tricky-name-project (read-test-project "tricky-name")) (def native-project (read-test-project "native")) (def logger (first (.getBuildListeners lancet/ant-project))) (defmacro with-no-log [& body] `(do (.setOutputPrintStream logger (platform-nullsink)) (.setErrorPrintStream logger (platform-nullsink)) (try ~@body (finally (.setOutputPrintStream logger System/out) (.setErrorPrintStream logger System/err))))) technomancy-leiningen-713a4d9/test/leiningen/test/install.clj000066400000000000000000000037151173437653500244200ustar00rootroot00000000000000(ns leiningen.test.install (:use [leiningen.core :only [read-project]] [leiningen.util.paths :only [get-os leiningen-home]] [leiningen.install] :reload) (:use [clojure.test] [leiningen.test.helper] [clojure.java.io :only [file]] [leiningen.util.file :only [delete-file-recursively]])) (def unix-shell-wrapper (file (leiningen-home) "bin" "nom")) (def windows-shell-wrapper (file (leiningen-home) "bin" "nom.bat")) (defn delete-shell-wrappers [] (.delete unix-shell-wrapper) (.delete windows-shell-wrapper)) (deftest test-install (delete-file-recursively (m2-dir "nomnomnom" "0.5.0-SNAPSHOT") true) (delete-shell-wrappers) (is (zero? (install sample-project))) (is (not (empty? (.listFiles (m2-dir "nomnomnom" "0.5.0-SNAPSHOT"))))) (is (.exists unix-shell-wrapper)) (if (= :windows (get-os)) (is (.exists windows-shell-wrapper)) (is (not (.exists windows-shell-wrapper))))) (def jdom-dir (file local-repo "jdom" "jdom" "1.0")) (deftest ^{:online true} test-standalone-install (delete-file-recursively jdom-dir true) (delete-shell-wrappers) (install "nomnomnom" "0.5.0-SNAPSHOT") (is (not (empty? (.listFiles jdom-dir)))) (is (.exists unix-shell-wrapper))) (def tricky-m2-dir (file local-repo "org" "domain" "tricky-name" "1.0")) (def tricky-unix-shell-wrapper (file (leiningen-home) "bin" "tricky-name")) (def tricky-windows-shell-wrapper (file (leiningen-home) "bin" "tricky-name.bat")) (defn delete-tricky-shell-wrappers [] (.delete tricky-unix-shell-wrapper) (.delete tricky-windows-shell-wrapper)) (deftest test-tricky-name-install (delete-file-recursively tricky-m2-dir true) (delete-shell-wrappers) (install tricky-name-project) (install "org.domain/tricky-name" "1.0") (is (not (empty? (.listFiles tricky-m2-dir)))) (is (.exists tricky-unix-shell-wrapper)) (if (= :windows (get-os)) (is (.exists tricky-windows-shell-wrapper)) (is (not (.exists tricky-windows-shell-wrapper))))) technomancy-leiningen-713a4d9/test/leiningen/test/jar.clj000066400000000000000000000060211173437653500235170ustar00rootroot00000000000000(ns leiningen.test.jar (:use [clojure.test] [leiningen.core :only [defproject read-project]] [leiningen.jar] [leiningen.compile :only [platform-nullsink]] [leiningen.test.helper :only [tricky-name-project sample-failing-project sample-no-aot-project sample-project]]) (:import [java.util.jar JarFile])) (def mock-project @(defproject mock-project "1.0" :main foo.one-two.three-four.bar :manifest {"hello" "world"})) (deftest test-manifest (is (= {"Main-Class" "foo.one_two.three_four.bar", "hello" "world"} (-> mock-project make-manifest manifest-map (select-keys ["hello" "Main-Class"]))))) (deftest test-jar (let [jar-file (JarFile. (jar sample-project)) manifest (manifest-map (.getManifest jar-file)) bin (slurp (.getInputStream jar-file (.getEntry jar-file "bin/nom"))) bat (slurp (.getInputStream jar-file (.getEntry jar-file "bin/nom.bat")))] (is (= "bin/nom" (manifest "Leiningen-shell-wrapper"))) (is (re-find #"org/clojure/clojure/1\.1\.0/" bin)) (is (re-find #"org\\clojure\\clojure\\1\.1\.0" bat)) (is (re-find #"MAIN=\"nom\.nom\.nom\"" bin)) (is (re-find #"set MAIN=\"nom\.nom\.nom\"" bat)) (is (re-find #"use '\$MAIN\)\(apply -main .command-line-args." bin)) (is (re-find #"use '%MAIN%\)\(apply -main .command-line-args." bat)) (is (re-find #"\$HOME/\.m2/repository/rome/rome/0\.9/rome-0\.9\.jar" bin)) (is (re-find #"%USERPROFILE%\\\.m2\\repository\\rome\\rome\\0\.9\\rome-0\.9\.jar" bat)))) (deftest test-no-bin-jar (let [jar-file (JarFile. (jar (dissoc sample-project :shell-wrapper))) manifest (manifest-map (.getManifest jar-file))] (is (nil? (.getEntry jar-file "META-INF/maven/nomnomnom/nomnomnom/pom.properties"))) (is (nil? (.getEntry jar-file "bin/nom"))) (is (nil? (.getEntry jar-file "bin/nom.bat"))) (is (nil? (manifest "Leiningen-shell-wrapper"))))) (deftest test-jar-fails (binding [*err* (java.io.PrintWriter. (platform-nullsink))] (is (pos? (jar sample-failing-project))))) (deftest test-no-aot-jar-succeeds (with-out-str (is (jar sample-no-aot-project)))) (deftest test-tricky-name (let [jar-file (JarFile. (jar tricky-name-project)) manifest (manifest-map (.getManifest jar-file)) bin (slurp (.getInputStream jar-file (.getEntry jar-file "bin/tricky-name"))) bat (slurp (.getInputStream jar-file (.getEntry jar-file "bin/tricky-name.bat")))] (is (= "bin/tricky-name" (manifest "Leiningen-shell-wrapper"))) (is (re-find #"org/domain/tricky-name/1\.0/tricky-name-1\.0\.jar" bin)) (is (re-find #"\\domain\\tricky-name\\1\.0\\tricky-name-1\.0\.jar" bat)))) (deftest test-no-deps-jar (let [jar-file (jar (dissoc sample-project :dependencies :dev-dependencies))] (is (.exists (java.io.File. jar-file))))) technomancy-leiningen-713a4d9/test/leiningen/test/javac.clj000066400000000000000000000010241173437653500240250ustar00rootroot00000000000000(ns leiningen.test.javac (:use [clojure.test] [clojure.java.io :only [file]] [leiningen.javac :only [javac]] [leiningen.core :only [read-project defproject]] [leiningen.util.file :only [delete-file-recursively]] [leiningen.test.helper :only [dev-deps-project]])) (deftest test-javac (delete-file-recursively (:compile-path dev-deps-project) true) (javac dev-deps-project) (is (.exists (file "test_projects/dev-deps-only/classes" "dev_deps_only" "Junk.class")))) technomancy-leiningen-713a4d9/test/leiningen/test/new.clj000066400000000000000000000006021173437653500235330ustar00rootroot00000000000000(ns leiningen.test.new (:require [leiningen.new] :reload) (:use [clojure.test] [clojure.java.io :only [file]] [leiningen.util.file :only [delete-file-recursively]])) (deftest test-new (leiningen.new/new "a.b/test-new-proj") (is (.exists (file "test-new-proj" "src" "a" "b" "test_new_proj" "core.clj"))) (delete-file-recursively (file "test-new-proj") false)) technomancy-leiningen-713a4d9/test/leiningen/test/plugin.clj000066400000000000000000000025101173437653500242400ustar00rootroot00000000000000(ns leiningen.test.plugin (:use [leiningen.plugin] [leiningen.util.file :only [unique-lein-tmp-dir delete-file-recursively]] [leiningen.compile :only [platform-nullsink]] [leiningen.core :only [read-project defproject]] [leiningen.test.helper :only [sample-project]] [clojure.test] [clojure.java.io :only [file]])) (deftest test-plugin-standalone-filename (is (= (plugin-standalone-filename "tehgroup" "tehname" "0.0.1") "tehgroup-tehname-0.0.1.jar")) (is (= (plugin-standalone-filename nil "tehname" "0.0.1") "tehname-0.0.1.jar"))) (deftest test-extract-name-and-group (is (= (extract-name-and-group "tehgroup/tehname") ["tehname" "tehgroup"])) (is (= (extract-name-and-group "tehname") ["tehname" nil]))) (deftest test-help-mentions-subtasks (let [out (with-out-str (plugin "help"))] (is (re-find #"install" out)) (is (re-find #"uninstall" out)))) (deftest test-install (with-out-str (leiningen.install/install sample-project) (binding [plugins-path (unique-lein-tmp-dir) leiningen.install/install (constantly nil)] (install "nomnomnom" "0.5.0-SNAPSHOT") (is (.exists (file plugins-path "nomnomnom-0.5.0-SNAPSHOT.jar"))) (delete-file-recursively plugins-path)))) technomancy-leiningen-713a4d9/test/leiningen/test/pom.clj000066400000000000000000000016531173437653500235440ustar00rootroot00000000000000(ns leiningen.test.pom (:use [clojure.test] [clojure.java.io :only [file delete-file]] [leiningen.core :only [read-project defproject]] [leiningen.util.maven :only [make-model]] [leiningen.pom :only [pom]] [leiningen.test.helper :only [sample-project]])) (deftest test-pom (let [pom-file (file (:root sample-project) "pom.xml")] (delete-file pom-file true) (pom sample-project) (is (.exists pom-file)))) (deftest test-make-model-includes-build-settings (let [model (make-model sample-project)] (is (= "src" (-> model .getBuild .getSourceDirectory))) (is (= "test" (-> model .getBuild .getTestSourceDirectory))))) (deftest test-snapshot-checking (let [aborted? (atom false)] (binding [leiningen.core/abort #(reset! aborted? %&)] (pom (assoc sample-project :version "1.0" :dependencies [['clojure "1.0.0-SNAPSHOT"]])) (is @aborted?)))) technomancy-leiningen-713a4d9/test/leiningen/test/run.clj000066400000000000000000000025231173437653500235520ustar00rootroot00000000000000(ns leiningen.test.run (:use [clojure.test] [clojure.java.io :only [delete-file]] [leiningen.core :only [read-project]] [leiningen.javac :only [javac]] [leiningen.run] [leiningen.util.file :only [tmp-dir]] [leiningen.test.helper :only [tricky-name-project dev-deps-project]])) (def out-file (format "%s/lein-test" tmp-dir)) (use-fixtures :each (fn [f] (f) (delete-file out-file :silently))) (deftest test-basic (is (zero? (run tricky-name-project "/unreadable"))) (is (= "nom:/unreadable" (slurp out-file)))) (deftest test-alt-main (is (zero? (run tricky-name-project "-m" "org.domain.tricky-name.munch" "/unreadable"))) (is (= ":munched (\"/unreadable\")" (slurp out-file)))) (deftest test-aliases (is (zero? (run tricky-name-project ":bbb" "/unreadable"))) (is (= "BRUNCH" (slurp out-file))) (delete-file out-file :silently) (is (zero? (run tricky-name-project ":mmm" "/unreadable"))) (is (= ":munched (\"/unreadable\")" (slurp out-file)))) (deftest test-escape-args (is (zero? (run tricky-name-project "--" ":bbb"))) (is (= "nom::bbb" (slurp out-file))) (is (zero? (run tricky-name-project "--" "-m"))) (is (= "nom:-m" (slurp out-file)))) (deftest test-run-java-main (is (zero? (run dev-deps-project))))technomancy-leiningen-713a4d9/test/leiningen/test/search.clj000066400000000000000000000015651173437653500242200ustar00rootroot00000000000000(ns leiningen.test.search (:require [clojure.java.io :as io]) (:use [clojure.test] [leiningen.search])) (deftest test-searchy (binding [remote-index-url (constantly (io/resource "test/sample-index.zip"))] (ensure-fresh-index ["test" {:url "http://example.com/repo"}]) (is (= #{"segments.gen" "_0.cfx" "timestamp" "_0.cfs" "segments_2"} (set (.list (index-location "http://example.com/repo"))))) (let [results (search-repository ["test" {:url "http://example.com/repo"}] "hooke" 1)] (is (= '#{[[robert/hooke "\"1.0.0\""] "Hooke your functions!"] [[robert/hooke "\"1.0.1\""] "Hooke your functions!"] [[robert/hooke "\"1.0.2\""] "Hooke your functions!"] [[robert/hooke "\"1.1.0\""] "Hooke your functions!"]} (set (map parse-result results))))))) technomancy-leiningen-713a4d9/test/leiningen/test/test.clj000066400000000000000000000023321173437653500237230ustar00rootroot00000000000000(ns leiningen.test.test (:refer-clojure :exclude [test]) (:use [clojure.test] [leiningen.test] [leiningen.util.file :only [tmp-dir]] [leiningen.core :only [read-project]] [leiningen.test.helper :only [sample-no-aot-project]])) (use-fixtures :each (fn [f] (f) (.delete (java.io.File. tmp-dir "lein-test-ran")))) (defn ran? [& expected] (= (set expected) (set (map read-string (.split (slurp (format "%s/lein-test-ran" tmp-dir)) "\n"))))) (deftest test-project-selectors (is (= [:default :integration :int2 :no-custom] (keys (:test-selectors sample-no-aot-project)))) (is (every? ifn? (map eval (vals (:test-selectors sample-no-aot-project)))))) (deftest test-default-selector (test sample-no-aot-project ":default") (is (ran? :regular :int2 :not-custom))) (deftest test-basic-selector (test sample-no-aot-project ":integration") (is (ran? :integration))) (deftest test-complex-selector (test sample-no-aot-project ":no-custom") (is (ran? :integration :regular :int2))) (deftest test-two-selectors (test sample-no-aot-project ":integration" ":int2") (is (ran? :integration :int2))) technomancy-leiningen-713a4d9/test/leiningen/test/uberjar.clj000066400000000000000000000016041173437653500243770ustar00rootroot00000000000000(ns leiningen.test.uberjar (:use [leiningen.uberjar] :reload) (:use [clojure.test] [leiningen.jar :only [get-jar-filename get-default-uberjar-name jar]] [leiningen.core :only [read-project]] [leiningen.test.helper :only [sample-no-aot-project]]) (:import [java.util.zip ZipFile])) (deftest test-uberjar (let [filename (get-jar-filename sample-no-aot-project (get-default-uberjar-name sample-no-aot-project)) _ (with-out-str (uberjar sample-no-aot-project)) entries (->> (ZipFile. filename) .entries enumeration-seq (map (memfn getName)) set)] (is (entries "nom/nom/nom.clj")) (is (entries "org/codehaus/janino/Compiler$1.class")) (is (not (some #(re-find #"dummy" %) entries))))) technomancy-leiningen-713a4d9/test/sample-index.zip000066400000000000000000013745211173437653500224520ustar00rootroot00000000000000PKt> segments.gen?`PK} PKt> segments_2F+9]* @300IPaPKS&1PKt>_0.cfs l2'vyf?m61F(Jߛ=4;{Qeitnni6_ĺ.b)KYJ]ERe)EEԗԥ.RR.B}huU$433<WGw?ÿp6>ᐐ[?}<{oz| > O;>cx??~?秄>Ϟ7Ϳooͷ#ή+< Z]_Iۮx3ƞW3cѕNCənl=yI]/1ĭ০sǐJO71ď'6scnC-uo}}F\ v,^썽40{A9>ŧac`)&?GGL19sV^I.hlS<#t_ќ1w^$\-hNuiPYе㥱|ZAܐEb9}e;V7jhZ1$=b"sx:>l '7؁( fښKC6a3WZxp.V18Td.H,W.H/M^iV]x圖=ViU$YZ&3Fx߀:3Y2]J3C)6YPՔ=MT)kVr/r1TKNWtIFV]IQؑ\kO5a\حm"/۪N7rbqn.aؗ6'3NJ]syuL7#seIxaue[Xa@]ٮVsu=E!qs.!TAY-s?3145)IJ~=㳦QYy=o!=3gv'ؙ~h=z`Jj|Q2cVp+ nrW׆t^c&l`& |&%K].9*iow0^n >Pho͵Z =XhZ.֏=ߊp]R^Ux\ J:*nXra)=ec6*ΖS  0c94e ~쌽&ʮ!"O vʉ(sbj" #ݱuG5]vteIS7FNV O\VD\5hpl:t4dyC.y"3)Gqejc+KxQ%5G_TQ~ؚ¾$*=%Lxop*Cnwno6qÜ|۞i(;oqʲy =UYO1`*uMt%vXΞ9SKd吟_.PeD7x|c+*9 {COVq2Y|'$inܭgOG={b"y]mcYՖʖp.O֙ҡ,2ǚ;i#<$?6j[rk۹C60f6n݅cmf.7AIVnkL_mMsrޛwxRլW0ˁ$Uܵ.'qZ h)f}RɅ #(`։0YƎ=tF25>[v$MȏaFt1QkzڒQrGRufՠA /uՙC%}9>4~[l)=TCAѹ3 8 G;uj jBG~,-{y7 <\T0W+iMW"e=]JXhnƶvBs3aX'2lԢ.ƖL#iZ+^^&u=%sF<9or+vfB-{m! ؊͒=ure=jcᘌ.u,հ쯍l5Xʪ횟taj15G}J;'y] kwtdmZBY: U w#JJV&ɞ}[uWKֻo'ٴnkuƾxf4w2ƒbzMY.`Wry-$罫Nziz):7#8 :UW=M7^-/kꯙ~.< y֊2c VVk)ꂎ\R7[+՚rGe6ܛ΀b,LNXО| ÙxfNDYHO6ͷ!g>y洴f>c6`=x)CNwo$٪b};J(u1xҘf`ˏ'w긥45+l]N[睏fKUw]<3o7Ҏbzo3߯x𐥽-F֑圸},4T4n,;ew _n7z?m Ⲹ#pFHb/k>0]-%a6 htυ+nX{(I[Õɽz 㞓+0} (Ny`a{K=5L0ƅ^.gs!l^ 'R>޺v&15{-q{s{RF=ͣ?lۆ#l~Rhx*m\UD6^z'|Y6]k.Qф6š>p;Cg$`ú%woOd [w>1+͢GdtqNHQeUqhn_]n&lj-̏`{`|lAՆгT\:Mqug.B ~27w}itdU?z,>$9ṓzsQTBœŷvm:jcfR7[5ΑKp^Y^Cd™\1m=}1aݭՔFm%6Z $nk} 4l*^Xu:JҤZѹ Ҿɞ܋1pf5V[ʛoB-m/F3CK&TxGe*U_ҫ#޾[x%.RtMMef F%;+}g+O>X? Ğku_(ڎI[lnuunk5/⎡cfkW^-i8v7v QB߃f$ѡ'(Uƶi>b^GW~N BL[{ YSX2ے̶4Y__:fG:5`^}H,kȚRַx7*Gƽ%%o4]šZYk鑧⚣Vފ[B3Lr;ڼ#[cu^9$gc'էrx_iR2- aG+>ܽ%mBBŪ>] Zf[G`c%׶:`goioR[6ĹD\1(CyN'FfX\>՞/L)ymiqyNw-ud6SUR'0rt\ s-ԆY/՝eזoWgB},;,+*X+ <+]Hq\78K΀ O3hQ鹻=co}<k'Ĥ8qޓ!功<8IDp[7#I{u`6fX GiYYN)c[+I.h>VJC]G^눎Uv0#[[DݵsӒ/ۛ;;KOuuhr֎j56͍[`v)]ZZMw\%'%m [|3=S)ۙ8'΢5s=M8FyeXw'9n9vnf^1s{f.tI=_[@trs\}i ڮ|`L_'CmYK7l]|6q cKannNN^A(F\5ַ8OuyÕ:( j`Od27}F^Oi\T67`óu oɕ‡k\n5rݥb|!?qCD0Z?^9klaWjpׯjW6~{`-_kK%jVBtbiy+07Zětټ _(X ZU& kPWBmcQr\`,t۶}{arV[7ZDy7>xə=g@uQ]mhpBV=]iL3Um+o5G̑f9¼zAUzJ8vb9Jl\, $^3 G#n8_Fhv%w$%Qcu|xag=Igšfh;]-:&|0枛K@vzŻ̎$4 ǶnV=gKcpD1G!|K״C"6{΂WlbՔ0V#<#wp*GsE)1Y<"89W֒VpjK3.=gǚPփt=>Z^ lgLZJQsӓ5fGw6xϧD9%x@ n5#!t!~UBc#WŸ-DBH } N#.||~&` {$)N!`§ ;/; $hO)9)eed$$Bqs ǡx(ZX, ki?qF{ACa"JqKͰ<8XwC]F[I·{;p ̃b.sCV\,}I A^p#09<W0n" (~Ӄ݂Uxf.sO9XVr9'(9,,#遺nR8f+xlC"( dEMx7d'0񘚼K90(S#GueTgz*6I1ysVw5p^cP-qc3÷ RSFE~2hy$!¹S-˄Sr:aaj5vpxv||m:B[ ynib &8^E8yl-:v+7֤y! /^@Z[w*`jط#:ueVCE&)!.><#K~\W; ApR^'>vFU5I·y`UörK1RV ʲ )љitu-g##ްC"^oKI`P@ MlY^a},psvF/~#``FV.Y?oO(?̾mAw_??sozo__FIA W jz95E= $ b |dez, b`XHm=5`IFL@VN %Dc$O);A ) i'!E񡎄I 2|ȧdbLB EGwSi4  aC_'v> F,!нbke!4AZH&1p.ހ~ H F8]h4*11&6.B^zB $AW"u M>:$TMG2bRH"1m5/hAdZJ( JkYhyX?c 30`?F }&k 75a ws>}ace?A{?ca<ͲЋ&a@c3n.(7VI$|5gfw"߂iBо<0{CV/{eqӢNv^sNbcM1*CP?LZQCw$*4B)& g3_RQ):kQ;bvEτHYwӔNH€P64 -9d3:h=G,3KH rn2h&`'?gu&FVHc0?B}aP̜"0>nm{'/Fޅt7U.c,P=6ëUj!b ~ͻW gfs .UF81%C!OHx$n=)uB $5{,O5-#K0r5֦OKT D!3)zLEmA^g Lqz)C+̺UNb.@ 5g{>e?'(c ~y1Y}jjmSS\"-jEHuGX@dzc"/~ ;poR?|T/Ni ]z@b{ tJK)T3صzf`B4 )g\?Y:'Q'7tmmyZ6ra V F/AsUd)whB@KN H7sҐ d߁]B-T~ ̇[3]$x${ *~d?ɒ߰ffQU ~O`;]]/t.PAa{kzEc02)Ib'K'x߁+#?yħ0xAǗ) .6HX8 #M*}܈}~ ,eÛ; ;9ma@[Psjö P6w  O؊2`a|L«y~#hϴU+嬶ֵچ66ymA5ܮ{0 ~<|]9'p*S1Xi\ >3C@@ɾC*C꩕% }2 gl|c;)?I~/LI>x?zdw!??"y*aS)&H- FV!+ .I[R5 l KD~p|m# 5A,K|p$71N,шveQ`K%${4/C 8EaYLJ1? F6!qq s-ؑ_"nNSV!t^ Ll/@%^<_HX/ވ˓[-$V֜F&D|ieκ vRLG`|y+EB0n?]$vc*RzLk yTyGH .HDEz8dD=Nq+MX(auO.@betboPֽpxfdΠ޷6TjBInD'u"?+ ΞKvƭcU >'6w9QCxj~D"Rg_V XJID G\I F] kWT2x`T͓<K^`iqTuDiN@Q!q2B+k* DK\Lh8AiB9O}Rn]^OހOQpF| cOO쯼&Y'؏}Hч܃"v jr2E!yj LiZս~w8^ŦsJ}7'@4@` A#ʫYCA )l]z+=쫉KSL9El)cE ޕ0' /H K'-T{P+4쇯6ǢBDcb,MTsdf(XGr'jO4ȧb/Q_S30e.bId l%&_ UPbI%"O7hA7@bMG񯮐`ov:ks 闺kO(Έڿy C#<OL ˑ9 /ƾOG#G3 4#vX/Kado.jk]1~6$/8 6`#*Qg7$BSQ2r[8u{WvS]܏Ǒ{yOc:O(1WLk dTco0872MlƄp8uCqmRi~f*J,^eDhIv&O`N~ , ~ 3M O?"cx OP9Wyij)@)g$}`=rT Cfp8 Q!4c-,,{{#>n\!!PأxrF7ޙk#럀l[odžsq<"ʬrs,9]NKL݌; *Vc(:CJKfz~T2^žyl쩚Ss#݂>2 ' ^KVE09w`p]f{'L! XRDhYt9fPF[5nCI_)5INQP!n@ gM:d{U i${U&߮* ;܈J ֱS;м֔qmDԽ!L-?=1ÊzHr~qQ[Q 0w1#hɍpj8-7{ Z8!<&7>la/.پJLO{޽\}1z4gH7oj]a%m,? ZVD(FC Lwdli4# @a%.{Gpg( BwK31Un GPE֦@NUfA8]| }V>@! ^ÏwR:0z= a!# Ցtu9gGr%f=QOv^XCY5.ؐ8" srE*͓(zxK##zebh;\Ij7@s݁}-s 9Pۼjn_#mn ոa@.x޹p3'G@j=n daGZMEC(۳4ǒsg7!{1׊ m1g( z9 ^DN7&~K ae=8e>q 镽@/E ?,",vs]䭃;4l,8W(&)g-Fm h&a :! RxRDPʇ~x~ ǐ,Ⱦ0:<Ԁ\É8 C 8A͗A>}k+?_Qq0 `%C"?.eT7XmfH;S~B$sr LwŮ.C~/2޹@Q Cr#7S &cWrzuq]N""Džîrjnw|ȧ8؀lchJ܇- 7 ~\r&BKkIv9Qd 4UhNN!ȉ! >:iphBPU+W,G J9mé% ٙ:$CL;IOr,PGz{ I^+`M>t@t7iO|paRƿ':J6mԆ !b5HEM.O҅ء y"HL20:_c sݒmEJ颜%Sl牅%4i͕rZoq66~P>&90Ŭ~p%&2Ų[<Ոyy"g[ 8wC ;>l82/.)"\隰F#7pBBŭefuuhA!,mo&i.BP@M;1Ali8ބUۭ*`&S uϻR VtKqsKYv>\r::KW.q~A2<ߧesю@Ad^aЅWDU5 F-䗚 S&u0ߗe Kb'v,U:آ?M"7I畤7>ҼIs;>{/2ǐ3+@~MK?'$L@E`kAAKUw5~d!1t$'؉ȓ+3Xa LBNձe0 c<%i~Nդ\<{y<} Ltn;OS3e ;, a2FӔSCr X@3-~@å."-x̻]%4&:ߒYOk;<; @ +2/.{k0bKkjG i<'(XO=yh"Js -D)v(xD=暯H\4~uJ1Ǝ {Qzy1. ?t<wƇt5ۼ 8#ОwVUWῺ;QEXQtZ)}Q -%cǼ OzeX;40 U{<1 {G \1dҴ37>uʰf[-cIG߳{AK?-GՔ{f__&T iwd`簿tR߮O(.53KP. i'ұEΆC2Gmx'o5?X…/+< iG~"wz)5߇׏t”y:4e1y<'z[Ӣ=nǮ'%i1yߍU_X|C~ݍL?OǛ7ab 14>%x1GiyF/[IAAWS"yWL= `\}@h^:3K? }{R7E~3/r5vkfHzG<1\*&w.~|ZҵZN?`+h)7 sq*a,61 m8m ]!] 2`I!t: R2:?\гX7<”q5} u7->/rS<@HtxkO.gxtM̞ |5c{+nDDӲ|z8*[7#4`y?6GY Ӷ. ԶK \DddS -Fq1G$s~%M$ K"IĽK>G.2t.'2¯t"Tu Lt[v&Vg:u(:EQϫN=u}Νvi[Mw=Nղ:8n  &0fLb0!!aA DDY*Nkoήk .Oa(%'nߎ߰64ߙ-d'"O0a,M~u>Pr;Ιa*^ưV&eiµHpִ<_Ym[vRPZO mD9U>Ib&j'I S.ܣbxkDAekWޭS]y\ޜ՜KzV|%0v {|s᏶w~q\]n.=@ݫu浦5kMxekjӛeժ.~q>-{߶l׿u^։X1N@5sfp\kd4TiWVT'r#-cCeL?PpD[2ˊ%}ž'ێ>σa?L{wg]Tn&ʷےxsݾ~P ޑ{ 9yݷ«~B=6(;~(<+ .  ٽ-AX jeϠ 2\p^:+s:N5:9}5x-x*!!Rf- ކoU;R]Β aEA=o' s!VʸӳskvUwyf 5t4oZs9G">ǃovSt+x$:xsMg.AkܥZ}rZne.sK-ix~[o ۧIO|ڣūCۭ䟰fea\^W'HT u>gvY(c\Z<ƫCoVC5zNxq63@ĵ]9d@7$@OoAǿEgfv9ߚs+ v+ zE=(@ܨ} A8}4?w_mz?]{ -D//g{=#!Ov_mG?Cߟ#p6OY06)z{_oL_alf}V@,rxaO~p [WJx& $C6OlTYl}Uջu] "qQV-yVۄuͺg=^ѦêƅƱ&v0i;)qgKFk}ҶҁÊeb:TR{YG̭]1P3[tD')qV0NqqPpHUwuGM{jfV~AaQDߒ?<<4՜Ԝ\\YYYYYNj#QvXC=fOSg8kEBnSѢvYbn^aQuUa(x,(9T_WU5Oi׵9=9MvRIS YʓӮ;,S?>js]-o T JQTuI颺˜NK/e>jjⱢ-t{pJ 5@m6,4,6,55ݦQJ777F5Ʃ҉ґҋҩ j`1IMSS 5KzyjZ.W\U]w>Nؗejq(a[iv67.揔q]JQ'ۡU9EP.u\qQ_YQ­qz3 N*&+O*ʖg۫N<}O췎|sG1uB yӲi2i%gԜrnylZuM٬ X^PuMPuO=PլkѵtN]K׭pj˳97>554646566n4m64]q}|x``9uuC⥊͊ʇ͚ړ½E3s=ţ'gE-8!sӸ9 8ϊZE[8'sT7u6n5 #9OfSq _s[r/+cgnG5-xclCrXI}=ZfzaqhRZUAy%}v8\AL}(GLæ6OZBwBb'v=o!zG1z')zq@cA{c੠((Z*Z.Z)Z-*Z+,Z/.v|yg㢓ŢӢ]QqULx wB˒YzݱV_8Gv엾TUP9j9??ecoP4c9bsribBѫ:Ao[44ݶg4wW;An 6֟4лPp͓59}v/]S.([̬T1}He9fZ^V.g9}Au9\k޴Hɨuu }M{Ӫ,+۩ǘ3朹bnk撹`uOgJ's)B{tƽT:^)u/gKݫkM-kߞoԷ;{½pwaOaoa_a!N[mwڻ{gˎ ־`m 'NJbmշz4ڮtw;]Vm٭-9~H?7V+Fcq}{Bӕ;r_/ZvܽeDDpv*8Nڙ@lpv.R>XyU9Z5T;-o-߮l+ߪ<|(m/oܫZvwoVTTVVUWlU-˗3ֲʱ`73lsY1)gA?e[a[]ɇ]֯蕄?o---n-/\_ 7-~Gǹvx7Pcg\{g'?֞ҫ鲹:MvqjiPg|@ԏQۛf ߪ٨7999w99Oղ7o7B!)-\ԟ6Ϩg޳\*Y/])o^綃Jiʟ{<%-UN^鯬SC ϢgxdtzMjx_[{=%vjVfy[mV!j7t: mkoLgʳY/^+.]+oެ=vS~-o|ny<;[%;O7۵^6<`Goڇڋ:b)-mם]՝6B]Dx2<,9t]vޘ.r/s[E999Wy=E7nùc5 ޢsυ3\]qZ9`h^  Nӥ9Z #QØa0a4Lpzu]U=< gka)Iw0SsLpQmۛ>UWUTڝ7oZWsܾƣ{-vW\՜=1H^yL'&!HNȋz8h)-r=kɚжaxlu9 O <;8wN5\3E}on|;5'$o7LBfa?PxP6FHmp\g+vH}{e;euסYP6y# ԟ7l6n7467=4m:}éAHh\_  RCm>8ʨRUaJ3W:Bf?\5h_pkB(U5YՊosĖiUNMR\|q#!&#-%bwtR|av)R9>%)Tȿy6b[̹Vӑ= ْ#I6kHy)~ZIIQ:ZI:D=ʬ(Vڪ":eT4JGjQʒCg RerLC IE{t`2̘:úYSRK +8*C Q0AmfIk$2RdPR GJaR!F^.Bx,ʗ"a$A >o6}ޗl4fBTR*2x?|Yr&S5i]i,@Kn)`ߢ(PHB*|*a-ȯFedd8$E {ٳ'J+fH / sGbg=e".eZƓ}ݵk &s[;I"aR,eW-ڵYa,cx+~9o& O2RJh}<\ sǣS/N^fIf)XJiA/:\ "e _xa( ~Ґw0b% UeYEM-*CԔK+3) kP R*N^!T,IϽ6lI}\z9B lo@ ʜ6TF.HHA#P6-yBȠzUT,6#˅*'%R:ʄ5K MSZjrEAe~Ԩ|eHj{)[ҪLPT3@*L)B긌V{HhJg y&|jmԪQ9iPJRe6(BY~DT!v A DSZ(`gVQ*3W ,Ä OҢ)ķh$0!~O$\؞ j3y~韠.!~ABE?F_G! D?#7t_DſE9_i.t2LQ8-,d^ݖBgQ-? \v{5a[Nj:6WrYvrK_mgVhZX0n7g E $톓,4݆g]\ AOl68baXvpok/X61#f8aPtZ햔N.Am6+ A]R%X8[(=q:r5uBaY| 0/.\j| dp=0_EE " _ Tn@W-b~\ d fk]x A$a0fxCp\v@QQ>_ϿP1G:Kq+ [u~]?XuPI8)DyV+i-k%(#z@ ԂLH"q |LfYa,<}U=%7k(( )AY&hda5*U!?t^3x}6#ԄOV$ix )M }" a?Z!n]yi~2fb:w&! wZ 8!GMM (Y>\?-4|CmYLؘ `ՓZkAS^1Ѭ8pu暝 w:i Z4/ A nѸ=q"{ CU\Y~2Z 2 DZUba=Rt*̤DucJ[y)Jf*h'OMQ;R z5Ҕ>Q&|\fs0Lq] S낸a*mbb)J2u_bY8fb\dAn_PPa-Bju,E^i,v,4C:jez,VʷXyZ7 6B,?]!Ev|"O:Z%D 1Gh;MS kZ&ۍcl!vK,|m!馽A@]zNi$Iƺy8V1F۬2; (>6h0Y XAiQqMONNx`$~dw7FhClW*)C.2iH:_t ,&~8O?ҳ^2K &Yjy(㞤0 GEЀLY(h ba2X߹A-ce4Z|d& n@R[4fb_EeS /Wˍ<;Hj5{8t!K),4p:Nx#i5A}HfZd6Pxh9+@/vʹ(7RǴB g~J0"р P€L9NA$:;m7yaN@̂7(-\Dh;?C#ˊTU& x &[=F61+1 gSe*XpF+ϴ=u葉e8( `f;Ͽ(@Qs\qԈL¤!0Z@FOmŭ&E;irۣxi?`&(+LI x2VaA&]gc('f 4#ߔN) V+Mf`0;)f:1K3&gqnt}S~"j67a,G6[ V#40De6w-X,^6[ 3lP-xYa74-0K\ Y+,1~`4172L|a-?~bO?`ٿg4lhXPc_,Ŭ_XVz^DYoHӆvXl3TO)~x;7g>~0Rk޽ɮu(ς`yN0S̜ NLw8ڥQKޕkQ9*PN~  ,..Pj S:cn@ =_51L ƠS2+P\/fEqQ夵CM$Ҍu7 ۣha`H6M~ fnaӧ`ǠQٍ.5X١gxD\|*^.ht)F)p`V ]R_ 8cee+´CA^ ܀)kulifYh`r픖,p#C:Ī]c ]O- h* [+YkwIWihC mV]N+^"4 }n&FjXQB_8pS4FipjU|B҆a573prSnvtVSĚ/b#ff_ûN9!ôa:tCY77zzd\k'`NSKx 3:Y禌 2Gݴh7ؘӯKVB4Z{'r4jS\l͵:op}׾nl: )7xij$|j:$u7 C9B` M0j" T%YΚ,X(&7UY炁[1B9IwGպB?).! 3B?b?S~~eԟϯO&o_&~s2hFZ_m'r1iEmmz1@G _!?qfwo(jo؍c`pM:~.夽5YY~>p :AN}f235_`\Z+ =߃/_q_#~Z̔k0}4үL>@(iDf4h&1=7hK-@aJq >& bze&¢;~n_|ԓ/܌  Z=Ls ?ϐ-8 tvPבq%Y7VOm+Y h#wcnlCǠ֦ 61FhW6QOx:v"h`@Ư Do3ژ.t;6'Pe5no @ $qWkG dz(qu;֦WZNn{ǝ(XkeJ2g|P'HO ӡ|ʿzl]ГOȹOKm9f~^ۈp."ȞC%rWl#i?mC##צU*zjfioϻGxHnӎuvȸJ}I*Y@7iD(mmN?|_w3ay*l)4J&LHF R.fƄ,_B B t_ʄB/҄EA)MŃ &9 ։?3cY7˚ %tW5B|d 8M<!TQ\n>M~0= 9kVze$ݞ56QUaEX 6cj&HӊIKEx|/ 2@ƏXz[)LQLAL㛲o+n Lxt.&l. #fy0ů@Y% 4t j ]ɒèYTlc7Meyͥ:gޚ7:aoZ[lv;y%@ b~:q3L-|_ݮaż| <{~aǿ|_D&ta#e 0L!_Uw*P7b~~EhS>r!ts)caFL;Jy1Z4Req~ئ{ 36(Jzzzz:'@7I$j RKjr/+hPV˄+\Lz| R!g#5xJ#߂/it6_RNJųF6qһҐwB`o-мC =0Af]Bt8'daciǞhO}Ȟ UHp fhdNZdn)/]&%ʒ֑5LeN0QKBMS9 L84 $)LŮnp!'/#/Z,~JtߙSeԽ(w ~a4?W6x&;$xIBa^?/zOi{O ^ҖQ*eV+0 mFEdžl욗M %x&ˣJjid(F\,,=n\EhTTm, OxLXܑG%mE򃵒Y$='X6(z0߲=Yʥ V-iE3b$$\#T2Q#, MCJHnZu=iYFpBxL@!nI*?gp_>{"]x tb$AKb7}! eB )aG!2/"D^KY2+(He jB=dm'GlWR6ҷ #(qUu+Ogh#YJ*|D8TY52#E!T6B#fTT_z(BҌ!q=/qCBz_=QҊ XTPH\A.! Q sC#EHQcG4xkыρIOBH-Ob!Fj^Nj@5FDG\dePLx[$缅ݝ APBH5RH "ifo*U8j㒅.C}aB S\PyMڧl7:EҤ=!um~F!y"/|IzJ([f"(C i8eS9:R-;Q٣@lf5.'QxV!P նHWʪ)^o:RWywعLVO$)DV8j(s=7W6MV$H[enCH(ʉT=aODO X&/IZ"CF5JN(WAIٻ!IFd^Sz[4EM/{:$E5b_%fywCD#6׈ X)rIbg2h}{OT0NPP1cq/HR`k EIHH,$Gy޲E9' L"+uGnxZCRZ-~R ޟZZC|%lI&W=З}=?ϠgBk )/W:R.RK"X5z |{A_"\F@﫻_ZT3ڬJ_b E?^u!(^E 0𓣩zT8Lz}ɘ7 E8Dž@2 d*G4^q dJDP:&}!o"F#x4LTƎ*\ |t,)/ƒH _%+`JD!2 ah:Ih cѰP4 mwbd4OCtx"`0zFd4ECt,P4NOyaoZ(H&Rh K)*NX*K#>oڛrB٤H\2HC^o:B Dx0N|bw9_ܗD"qo(Œ\Kc(' ,NƂiH FP8R1%}P* œ\ʗK ?O!bh"A< жH:G@a0oJs@: D`X\ވf.!P @ I_"0&D4FBPq)I# .Lp8Ic14gh.Šc|D,M:9$@DB#~QyCAh5`1o1&|QD::$t^oAǡ5?$i4+ Kcs^. rT0(M&^?LiFHGB=ih(z,3M>0 ¤iˆ}P, A@`x$ N%2S.}`0M)ҠPNsTLT*SA&ߗOq.C~T'cQH:o0i@P#?]\$J#`N(s ȋ$I7FArb\0ZFts$8!8 N78 ŧӠ0(0``x8֔L#}-BWTxN^a1ۣp>e4( d/EM4\0M{fe _J phap$ dG zJȁ+'X(@vc 85aK0 o0c!A зx $R1)HID#qxh2% F!Ď < XA|qb)vq s T(*k 6݆Is@(&lWd800? 0b/6h2<5)z0R@BZ:H\`\ -:B%XN7mǤ'PJDTH{ p2:&!8` #i L ^`^qDu{h0 DBL t8J@r*\) /0%Ԥ]A*̇@( 4,L-GJ&pxP\_'J-*NS{p`km^. ~ُ)H- * !8 @ˣ`i`x<H!:B Fat08H<=.'D8x,T `_xXsJ%XdDu9 ,wbh" L` Xlu8V&q݊/ NcݲmǑ#RVCJcHDsĊRjdFZ$f0A=7ǷŜo߹?ux:W oN5xhp:{B35q_) swS0$R>g`a(Q65v0$BM/=܎l| y[C,yoV1+ M a#>S`>}B1nfd\e.hϝ0y`CpI e*@Dz">Z8y qV:o+4۵s j,"Ժ1k}n;a.䔷M)LskH9$6?qC,'gXĂàG p,8.N&G}|l]XB% ?[wSmc(]1F\I)&I@Q~oyU P÷;a\ ?0&Btx \tsQk, 5(dh I$pAlwA=1V:y5LaY` d~2 OYv"-%ߌd?~G=ŸAKvqEX~|G@łv];11/:5;Bġp~|摹iHΑx1z`8orb6`YgܣHggA'/ؠp[m9xxȊRϦ`(}qoU@Iws~8沘u=gxy3yH`PZF9Q~>:J SMF'ƀ?t}@e>‹0W*pw2o?-A"Kӊ&xO pEv 56Hހ0, B;$gdж 5|LP2Fw>a/%<"q'kG h eBKc`WHDyeg8Sm p)üexhf';aJl\7R$y8/l8r1B#g>3M pa9a%; uxoF; 5Z\~.R57NPW|Apvg/80ge nʸyw0 .(/9 "hs/ f_kx} ?lkf>A oYL#>د*ㆻ@2*X* QǛ.9\7kغPgi&<J.O<@~X" Zy>쯮U /;wp fq8_<ve>h $p hfOVx/\/$7\lDcq톹rj91-H6 Ȁ(}?a-9OvFXEꂚ<)ؼÆ@\\D`~|_XsZg?\V@w߷ouc1֋싃έɀ@Ǘ`Ox)Rj6졞|C j+ϵpȇ=¿pD!V,5_@05$x ԅJƚ6 rxpxlGC6ukgKc qk2*RpV+7*x?ԱlW2'`z"8 kx'tL ~⹮5%`[A7g*HǾ!9/3!F\-=Ucq:ac0\~#1O0b̓*K:>P6@=֍%=7 lu 6e7?3`TW|nA[/A'< M aE7!GI|81G^ `㷻P_2Msr5!@a.z-6Nl]:1Ro/%7Hxo\T W3k< 6O!td)h۰;z<f ̽ӷxɝM0 +@}M \{y9ň> 3"<KBsv[VtpfŦ ˵ [@!pDBh&v/]vThw.Ζx"2dCgxM,h^\_Sh;3T0=0gó$s;St8&ٸKoI+:1{Ld=,ҫcʠ(r6SV a[`{PhdoP.=šr]9rY9w]UU]X3fl*4+z7$^`yYk1?YM`o4bl7n[b~x3O̥c;y׫zS;mljp "nX A Q"!7;'1cxWn܊3s )'?Nn,Ě6/tĚ4aIoSotN2b~yk. W L"'6f[;m Y"31^ /q/5O+b6}.^ \XrހUtK8bhv^cEQg\I5mcڋzzoǘżWo_W<&zzw]61xx_XbaS l;.&F |U떞'u]'0r[\ f ĮĻqn!4\[ Gn ] .-i`f; 9XE @`d.7E,+MÎ(f1_?:l@ӤOYz%O"d πO`Q`٢7[m5hĺ܅5pi0\7$;>0 @M8_VP]aЪڬź"6gؐ8o;m xeӆwE k@^5cu64`G: >x??kq2/ňUn7%E#oC`6/?ru!CUqXki#~^py lj e Kǝ/nJ_C(4e0-+񍻟\7ѻF8xxfNll],$ [lApoyR| wMp1Pj_0ep`[kŸ+wwym3ő28CSqX0<݀  xl8#m V<.|e3jځp/k.SJOx7ێX̊geL*?欈+ǽY Jf}|F@yz`d^*kOi %aT+?VGjhؼ.}w:fkeQepe>;s@+p?%`"WcIx `,ZVABP;67j;ey썉seLpY^g='ZO xX],5ͦU2%qU ׂsõ2Ȱ;%r8b&2=1qR`skBޔVT6CcmA2?pi S4qϲTT >8cD9\Cc-2 8^+2ZK꣡ۃgK'Bb,089Mq-4Uŷ^Ҷ 84p`q_L<&`* (}VcCs@`ۣ)w< U4=AC cJ |gD"cW=(ik84Kvr`3m)6v y겹y'VwuwϬaV -[=Ql(nU.,"&sU: މA+ލ]_4a|m"l]fpV,`1\p780J:A2k"7nM"k1*'ac?jynӚM?Z #ἪG;z4籔_&;P 3%m|b5Yc]7nD<`4Kxτ,\wl.?H'Yy} TqApfqHw?v4 kXlT19v$+d$`"mYFsF[?Qs1ZdGvGy | glZH!-,ob`֒c 7m1 Ek o ];ll\~c ` (76y TP3k~OK@1 $э8:]ʬQxϵs76*=v?v4N!égF; (cw"ZoW$Ap˰9Lmr 曳ʃٞ}J˶5vĠk *d4aG[p7(i &$GaOL,B\/YyNqAjb f&+pZܹc;*Gf"(BU"]ߘ74V 8 2cYjvKakJN=[n5fɱ/ȗ&nU`0<<\$|uSkG7q P_f7c]8Bux7gu'7XGudSUܸc<>)3{vR_i}b^ʣ_}szau?Ylf E˦/#jlo %ZCos^xJN!O1$Z6cWھ498p+ K)lόm>7؈}&2m 1sx̂͘+r>׾8W Ѝl=&) ~LS"*xg9/Nw1|YϗM6~b؏ RLǮZK,tiu8v&y/*hĹ`L-`bXq-L>%6E~5ϩW1 ׽+L y妎7K;\n ^ڗ.[ q K7: K`spں~-8w$#> .Ը*8KD85Ǔq {kq|V`}$/.2G.wdEl`^^vR-ؽ-LYV0#U<Ȼ5fJ2 cAK\X &Ve\Y:lb}Zp& M[ ϜڛЭڂk ,nq\82j*ϔOi܀1yYeDZmmƙMhns%B&}:e%u.mz]G-nMe "6p lmL_ X6'Ӯ`fU5+YgE|\ z7+og8l%DdE涣;fj30+PaS/a8v!<jۣ`k2)g_ޭa0YXm4Css:$.0 ;%R9lďr,ʻ?|3zh6y.[AЛJxhS@ʭý,@E kנAe .cd| O,lS(4(p~ϐ} gyWh9"/K Iaӣ6=Lr)Ɨ)/Jp~: 7+QXX~HuX->hx5cΖV;< 6e¨\x,dj hscE>m8?澿\!qAMmlM^D&fbcE+nGюj+. 獃Ͽd@u568~7R]ݜ;/Pn6:3zCl4V56!NsU)?uTl V޷`@HPA5[64Y x-AYoa[i ϥo x,_B 9p.K9~t,"Wa);vCa [-vOVMI6Eeсq-I~. tҀֆB0Z|X/mŤ`|UoJ K ibnk/u,{[xS&831vw eY8%C>.V6d⾬Ɲe'ǃ\:AWpu)"puj ܶ Qxsc*+7lxM mn-X^baNqdnhY-ә Mc"ޅyaL A5N [1nn+Zh'(pV"c2 nJݜ$%gc*X>)@Ky{m5>Cؗ%|N})#Lq* 77z<6B{N -Z5n~{$O.~LfQ2J;n\& ;iZ6 )V܍\6ڤѮZ1ZZ'٨'f|Gw< O-'4u}4+AQv0~چrE|0spIza~o̺zag[(2jTVQl;wjrLUpԽEi]U>l8wJuE V DRt?.d[{cl1'֔g_!g4hIXȇf.Xsʚqmi2zN]>X&אᅭ$rZ,T,By@fSV{pDw >AB],i_PPC`v{Y}pW.|_!(Wo4QkNGLVK0v>J' 1}?B;.-6q%[d b}%d$! xk4jX}iQx%k|>68J;%]@D*=[9*4: ܲ^Т&1Wu$]uu> 6LXn 1q 3 ط1_ 8 OM8 jlSzC}%E!޲rvz5!= N۱f)2ƹ\$X-+Fr~\m? M:ޏQ[W > ǧ=f[szbB!oQ $e<4cNWG̬T8R : e5fDNtˏ*C=>;힏[%C&hf\66I#ȐP{A[.ɚ!P ~AU\WNY?ŀ,E_Кtwb&g70Frs=ѭO ZRE8ml-k%f{\-j+j }.Mx6 .^4slA8?7[Rs`mb$zaW0SCU-tH GYǂKaϫ$!*˻}VZxXJו;>r۶(xu:&s@Ca}v)jofbHkX9l)*>j 3O9,ّڏm@W,v؇)۞w,Tl (NA5Qu ]ƆxnV0-\Z㑭#T{z:ԿSMjs5  d@Smss_u{M*d*Y AQu"MC[806\6=lwY&s<)xmf@p^NsgW3-rSztÞcnF?LMƙmN+dpP@d8AM.}`G""dݨ"#^ ZJT*:;3~nԕ~շ1``_spVI-XSFƭЙhaˁ\cy&94ļl~4 jY46տ p`k*\:kOL8خfR.Aq=dE'X4d`9Fcul|_˶]=8Nfqڻ$pb<5U5W3"cZeo֦A x%qAU%uTm[aLF;+^gk0^-E.[Yl8 bJ+ؐ:ܥbiT40X ܲ|;R\{Y~);p=[O}QbQ2XUة e3*M; I`g9a2S0GKuCQc9TA&պɓŵg`7aT|T\J?O7%vS ŹT]ۚ:{wTam}BN ܗQ7W'!'K^3ZMÜt(uC@AVh[g1st*7xO>8N12:ǭ\eoX_߄mqt3c*q*A=u'brVP;\4شg U"r؁Nx 'TDL5UJ1k"/a?!ҭgCSU1D gL\vřJ *;%"*@=ZhKq"gX.ezmuksD[:߆ mR`SG+?[VwOYuKU;?TsO\sLk, +x:i幝|FB] `='w)ZxV@l~|NjcDIsQi's]2u>KoDmtOfz[S],f ͑= 5ƦHYYx֪rqk 7{UzbӽPXl劕.#V vms4F*[cۀrI8 /z:g=w xWB'Z16 *19⯜|Ue0pR=eSX+"k^j p` &$eMCIgJ?n*O#CXC x{6P6 H$L\_ W`TX5wCp&&ڤ%Q:+Us!=]&"WR0[G8u)D }3^aEjAnKH,iсb%89-ĻbUT5SV⨲5ˣ %u"^+|jf; UX?3wW y1vN٢3ҽNUMى olUK1X!t㈕;@e]v\s5x`Y]Avޑ vàBU T0{Rp)xǖ–6P[V Zψva7U.Zir): w,L ۊˈSl-:T timbj2Y _0I^g޷/lqgA Yݱ8эT Vkas :$=|@_EUIY)% lP:K@T b> 5O~|.v`)R_eV}#ogf!v֜`.Ȫ@_[>cZOYpCcW}5f[ղv\L5 mua)viW M G̀rsM+`r{Xs謮6G$8kG&Tي&_Gƴ:S+@Z@mn [?%B܊:su_L(rN9sfo18h9Jw'qcΞwyc>(bZ~3.N1; 8N6ZWWuTpU2ropx>tTvorMwϻeD%3#>sz;s*S([[ \w%М# i=mZ怷dXivsiTQL1NP"VBp;|P>a+H;Z+ '$_42ax[:"9;|9H?[acQ᷍_\<^tK {GU;(r(c{sm8`|-RwCEpV&k=Eq,>z{[q:-C Bz ڲ]y#.ۙzs9ɖ0Z>ሸ{5\~L:Ą\ ~ lkϊǝ)lP.cE@JW"G}-u- ͇}lUў"=*)[/*zMEգTȖP^CtKv(,arI`ڧqfѮAa-qswoN.pڌwJe8AԀS·>l#K(ΡY7W猯V0tR5J Vn kr:}rmS/ y;gveY jV'ҟSVetP#sbtY,=2sbWb)guoV>57VW'[baU!x`2e  L-֖۟5<8:fdlx[~l7Zf7@S V 9ƖE}e,_!;3hu$'TZ2bGU](@o{ Q:rWˠ =峜إz\}s4~W#xwh^u+uY{ epx3evXvU@Sbt8H({% $p<yu˂8'XX˹e-:F,`}}.dX_|(eHe3sWRGc[gYfϏ* "SuacC)[PK:0U PFǑ`OF%H1&Q ^rs=Y#/,p&LqiOU e'+íS4$+S vSzxÑR`ܰӂ@ RtRXʊr'Dv#,-ȫoRi\79R^hiWkrnDyl؂TNNܥP&Cp (#omIԜ;$|8T FI"T\ka6e{9I/ E+8W]Vfoݫtl[Wikg8S=G§Tv8K gW=+ٱr"a;6˫jd^cQfnVlq8;eN_ko^FKct[sB%aqiu2u3H=Q:+mj\SouVGpl5vs&a bo3\ Exm `Mq Ngj( mz<[:bц'q\ɡLgYa<ѹ\?9gtbۭת&/826a1Cs&ĘUb}^W3A,UlP-Mc|[uխ:Bʾu)sa',CʡU"UδZD+a^O]Nx矖 lRY>9'k*ʖ6K, naWO4s}:X::_ ` `g^Sb25(j<4..!S8#`سR;zr1x2ͮDKM:iqBnGN2jdUW)ZrP5ߖӷϣ+.^Y#i#kK9џ1C]fW*91|yfp/ 0ӥNmZ*DO9Tǟ*>>ё.eVNƅ`7d3}pʘ2]Eղaɑ*y䭋KbBNX*^ Aco< e]6SY^[4jvM7ڛNa9!*d8Y[ߦbV=,]*vR-*ڭ͚p}R[WYmW,yTgWNpFWa3E+adQ|!R!Lp{`a_綇12:pm賸 ?BOƬzkp}&v5hC6 7a'BqԊ]n9ncU&Ѹng평) \ ?W/Au3Y Hwr961ܭ|*mZ@s8 6Hˎ;Z;tqa^hs)&pVDc)_I zjptoБYo'1=w|aX ℋ=|d6NŊ0yž .4mxe.RDyJ"%`T| &1$17KN%@ <%ޡ1- һ[aN c>g@~c\S:ְTӠ+Q.r͝\2,0YSy5Շ]7u~o;Ʃ]qVODUTeh}l|<8d[F>#A:ek. S pH3\$!ݱ!ǂ+\BN*\D~bk?3!ݮ#&ʀϲ (rCͳ1x R& u?:n:=m!pό.ꤟ¦] 7'eǺޱ J**F x Nt8{(`0Gܷ=ԟ,1(?`'k:rNKC?HXx3hX/+Vg9Tvx |Ar |8sϐ*htPj$h?$dDǙplPYǷg,'|g@ 7pʩ$墠:J9U:~ FКN %guwrv?xnԀE?95.G^r9H12 N Cd ؋ܵib \|h>`ߩE%Ɏہ: 9[mQe(&*IWY nw}va˚\ykAbN)9pIa3E[։Tnh gUev;KĪ8'N<>#~8=lqt _S;- [,GCs`E# |m+Pr/J:W,E0plmL FeW5-=:L8jڮt!^AQ[O pf 51p]g>-GUZ!:E!ݪVzka.cәgvU͆D"+z(ߩ WO;K9[O[_s'M+%bJ@ţk8H_q1:1'&S6X(6쨆X2*~cwK}PjO?"\7R\UИlM+푋tykXy5xwZɷ03PP)s.C@Nٖ3 ԼPQHd%Z2]4]ց'm`bmFXT@5ʼnnsᒀV^ܼ}߭R67Cw[r`McWo(<'!@F_Q4qֱ]ڐ{]isuaLަy.#uV?KjbTjcVvI=Zi!Ks:3FV tp;ul.2&pֵtp d|#)#`Pm997sr@[ɧ.VOau9ƊX`A!#[ŝNu Ssg3CQTfW2g l展Y7HI?`nDþ|,C¯֋C'g6t;8~s(T}v[sy2Bq^U-K|nYRCQ9A3۷\ьquN<aA:[mL߬]M)rPr B N@b$̿pPKp9,N*_ÛVywA8AX4Uhk dPIpbRus>6?'-cqT~Aߦ?nc"8pż.Zʎ_{)vV KV 샫ش=6˖g[ JA4(Ma7ċ!8!Nyhg~nQ:KEsTuZ2]xOUza/4zYqjβVt?ݎ՝>|Oj0qs`76#d<VFs-b+K?'<|'[-pjkhxM=([MX]`QJ1RY!3oʯǸarb}EƑ~(3-b?sԮH;jãLHޜ[VTPau;/E_+)t%fa8jNJSw`V_tXV@|y'6g?2? ҂. g+c#t2HRfLl 6ŨJT3JSӎbQ1O)DTrpzWs +{3gRp?[4w,$kB;Ӆ plAd5cGy&s<'X |MýKo߃bץ+> jw˩*'/:'iq:  `|1~C8hJ ڼaQa}%DSh0JUES oŒ#<7xY&NP3ےѢ;y.9 aMA96moK;|xYt0ۣRK\/ǓC۵;0w{-ǒ O_ڸv9=SCȭ崟8J(L?64* R>SҨo>xg1/O].wO;Ԯ rLr߽;Gf yzz: *z#ɼK4'O\yA[tR ZjyD׶`ǎ:'Ҏh ljq\_{zi:8D ;R~KBp?qgb茤Ŏ»&i,6FX[ńsPҲi`lxh_1\'9Mx|h`ك *#?nu^$ ~ТsncWy\T<Գ}`[YSAK* 39Ե^;7 n ȯ vͰv:=LmTzO3!=LWng}ƏGN'9'VFxq}4bN8Z#5TQRTzSV>dGrXp6h9m3qoz&Gֲ vXnJsTk:GJx`=lOx9wk1r]lVCX3yuy^ #΁SPΞ8A19;t*y ?Ytڻ1{XgD]8dY=  Q5=q \LV{8~-m_s鳻W̓ CT"sS9-$21[ҴQjICT&%᭹h&cиŻ]sI5/l{;?]܄[TzIJ%.!I eqG^}[Dp-D~)3eU[ڂ빕slÍkj s:uR?"$Ļ4B$չ ̮ߟԮ-V8m%l|W5;gʟYeohp.}6^m&gKoߴB3IYmb?N|Hѽ@M?4ʥ3b#qPH':C@Fma){,/ J~_B Ә9'GvysoMySs4)?cppK-!qkY9 afnDGXZwg8%)*/rE^ӾAu_r'jZ>Y 7Z~FOkҗijOX5߹KVP~5by:w3 RV cw$BCWa[V7ܖv֨%­m[$E_uvhH!H ,V}QdClvE(=I+klR'wP^ Nbro+}3I0W+j<1ǏEew/l>lX\ ;E^>DgX.o% )8#c f鄅'޻}9oWxբxR$ &P)1E-[6ZdhB|gxR'ےD CQU'm98S,ߠyPVq5Zpf{SDAڛ$LjH“KXQ{K+G!wDW 6.< }7j۔vK:4=5H"CWSȄ*&^ ~tÞ䆤!KD'ia7#(CѭmTq<5s]+Իm֠^J+ĩEcU{o'/꜓e/n)1eSQW)\&q%m)/RiO>#+7[x@85^LNOo*G3I+vF[gqt7R(%mnI!aV`Ps]$;2-wxfL+[.w7*)䓐Eރw \O y]f:.eF)~T,,PS\ոv._C\V4_*tzt*]D%|yliʻe,^Dvm]"hdvLw#@[W.Q{ Ϯ{{άpCX730O%3RM<.J}ղeM'A%}i4-[|\}R4 =O;c ύSC~PfdOj&4 n\g[FHJ忯%_?s.[D JRu(EgP_lL|Uk)M*5m:?襁n3~11:plB90xٔ=I_&Ipcz_p(q(i XO͒Wy.U.eNKєN+<ͳr))[=nSzr 8>z$נG<D"r&xqhts;R9@e Gt7m9%r9yj9+9)V_{ґ)˫J*6tۃ;~ohefUnף? "9 *unq*bv-n0^ȤUBf3nb%jT)󼋮>*$bn3OҔ;3>RvHVkS.{{Q,kFǯ1}M;#ϰ'*!LVhĝ!69XU$SojݓƧ<_gI׼ަRÁ3*'B8Ϳ/$i䎺;~a*ePה=s#)-QE?85%:huVCsB~эXWf%V5Yo Q9m瓛:!Cqʟ]z*rɧ:M™1DnaʱJT"^̬{K;]vڑJrŸ| WRL+Ca$?VT3~SRg$Em"s[y'1t'McjZcMюCpM"'xU Rf>ܣK ]1|]R՚LzC(D2>{=;rr3t=.\F,UUIBS@? ;G9(LwΝۆXѷ+سOO67͊Ţ|!Z7Yt6bJYS;+/P ;CDy!omoI#{A> YrQ&\OIuREr)H n]KÃנ0]W ~cSM"vȾ*\>_xRy[^D%pvYx(}*SI(7 d *U;;7 H3e Ygώeڠ8I4-$b7ŀ%1@BHB*$4I̵2z5`Ю*ua7ǽ)F#p֛#(' K ޛCYf!h.,6aIg=4a75J8QB 3u,rQrʣstXxtwbB UN{>mi \/O׭A]wG#GΊEW$M>v[NQsza!Z Yk(huGx=|3(]̨G)U/X9+4J Oz-._"ne5ww숺a.F)diAkuN{k10l(%cBlph#J~HVs9զt{OTtF䄸Е&u&1ۻqZQ[ѥE[['jZtt+gUUgN77q"|kuX6dX]⫷Їh{!abCnj(j~~e^STv\CqƼO)%tҲ*ʒK(<y9j쒮}@+_9ƅUD@Hz9n$g+uKҲefo|1jDTsl;ml@lq>ZR뚚V]Q-bdMᖛS0[3߳n>39Rݶ Q"7Ň.$RoH*ln+.@ Y(ؑ:dID0v@OV;yaiRȔd/P{2@8yלuI)e :LΕi6qfHQ$šֶrUGVՒ]Z@|[&CRD?wYpRY?Ob%Q}là`,k[ٝ*oj!9A/ݢS`:n偁L7p(. SM[DJzkjUm 5l♑[o,@ڮ'n*aKxMCjXo2Lj Kj&58}dއ;{p5 *`.|8w^AjY# wɕ;J5sSeHU rOݔRy|):R4jd]7TH#(*%/x q?p}d,ibظ=Uh Y,mthNw@&m@u tr''K TnzΤcSY;]fyMךyA< `,QV9UWݲS#IWU-P=twjʒ.zxw^y  PX+D%]9g`=uX>ܟR\[tkťzZBv>lŜ[Z UuEK">hC:0fU7j:^YC8`xZ$H} -?+޵m̯@ȋ5ω'Kr5=JKn%.']/-{0 RCkߴa?>.QN2qGB\PxgK~A\̺EͺVO.'BA5UBI#WL:'!Iߺ瑭dV/,^+S\ZV;ͽR[8-SrnBx: d()1d9Խ{;Il8. Ue)dE<9Y/7 nk›Uĝ@ʉ|\H[;8Q:Pe SM@1_ZhÖ ᘧ"R5.U&;^[i( 7X=56T"jY;9q7pc2yks\K(Kesy=Um[XaT.'C H):sӘm(@H5+G$qI3W{c{$OUሒDb"Uw9WKNGOH=X\FmRBV(^a2O!d٥3ڏ"TE:HW}~B D(/QyHCQڜK5W|7Ahڥu ~ %]'vKJ)M^bw]l5NM2ҖUuFr+~䨸bvs_G֖P'tͅL.4"\bL#"wU#BrK1lKhNMyq|4>9Wi'/ 0S)RN5ߥ56Sxkyoia{;iǐQ!{=IUhw/rUKws[{Z*}Lקgo؜F-?;o kq+ZzkEt NGÈ{-1ElҔ^nap3/NuTyS/Sį#)ɐN/!r]>KȦw^~C!}}| j\uWrw ܍i6 \WCm5GsP_m[%L꽥DKGq+v8c٧-uu*|/,c9hkT4N=pIڢm_ЛvMWtD{gAí*[>S?nFBdM*{ (+cF[[ZZ"jYGos8/q? L]$ZnWy)bq*urѫUdjm%lr?`28QnkT +rn;ݷ3O;ez6k-?YՃj#3}9F`ĥFn0DVMu_כ& K=j ݼH};6qo "A}FyENVV892N@1_I~\ zmf 4-O (.@}RArw኏Gg#{qk|qCOE+X{ RuПFU-puG]tjJrn7S|է uONŜ~]3~k;Q(#A*KBX}=(@x!NؖtzSoS:ҨxV)q7(dkw t?WgDSYm]U_u:!>uۛYeˑr!WBު8󸕳Y._,ov8-=4_k(~O@@7އxTU]Q`-5ג4j(U~IjuCDkZNM?7|ko\Vʑw5̈́4bjb04d-PժJ#U{͉K7碟j02Pr̯\ʽ|`OSD(LJgݒ%֘Kl ' *zָp2ehp\x%؎"b*A ]BV%(äCS]:vY*  2TZ I*(Տ6W,~jUj`%֦/\^d2qP;K'uvBkI. x\D.w#cƠ&8>B~٭_`v]z-gjAs~H\Y$۳ĝd^EV7]w;rʶM*k߆ VVp 8 [ UW*[MV^7e&kvU5yDe?AyXu1jtInɦZ}@%KT Nn*4zgxZ/ؤ_+Ϳ{:[BXuW0W}K{F/"P E?. UQvJ tk-0=V rޢx|tKN blJjRT]W堧'y.E޻I׼V0r S!/ij{\C0rHYiMuB$wGEh}dǜhPYU<( LGPtOU&ך㠔yk0N8,s#EѐDh[FH~i@6S@;)hŵZ.^7 5.r+MoI/EMs8]D,dezE@2ɭUzwlyRQ#ɹp'o0/7B0^EIϹwo5 jRݧ9ͲהC4ە-T=a+sa@_9.摒I䪫ѫP7fm OO{曒k ϻ}+7JP\ ArSC6JN[A.*AЏSm#KcWL;8&k 5g/VDQy9]iU}nBGno7wۛZ#)@Ǻu,fٖ%R#>!;/Bw=@C5<] ZL[upZ%?' \>QId9W]S;QŹꬤým;~LT-toȉRJc0S)&. 1ƺqր7D$ϻzTk@d]Uoqw(GGwJY+> qc7d*1vyykVeJMTUUu3Ъ;睓C{3o[1+Io&U"b({ P5O9ib>*Wv7D:«cX]qr9ܐWft9t7ڲ| ?Tj;Y{ڠ./sBRCjM~.mn#3wDZ(/⍠Fq[I ,;+StUVLOM.IdKvk$P{-S1f@`~XWc?8 3]Ĉ^޽9;EycKbGNJiP<}+x/;g@o^JJDkWf2to=M>B)H_.mW4+gONh<=<7^ [(r AA#]ߝxj jxf=ߤd^YƝ_j} ӝw8IO+"QM)ڟWX.zN憵s}HB-pGҞm#LIPn& سkEJJjM24G,pөTHvfye P<'դ^\_k6 ̒6&p|v+0Ы~_AN&fUbO9F)8 ~8KBj2YηN5!M%rrVR|F#h .ue+e޵FQrsslzjR(_MS%xZQwB8t{vSe GSܛVHm<:uL]h1Dmrk]l_&kl.ʕ mP^ǦboiE8'*$ogJI^NEb=2ŀnѢXBF٘Anf[V&JaHj'TNXə0$qTn(`q=4=7LMfFlMuĭ@0o2>kzjORwdH< ;%v.y3(9٪?έtɛ3ToT/R)p Jy\]S CLORsO&n ~ V= ~>b5㤷#k Tv]etLh^6i9}k`[y Iك^2kӹq5{<\{\"<_6fOq))]K;wjB50s-MAw_IkDEmyX+{Ji_%W~DsVnZc?Y?gn?tڹWww?aM\v˲2)p9CrSnoSI%J'޵W-^ܽeU8`S\zVQ ऽ>,g{@KxRl v#bxʁUQsյk QM8Hl4lA x#ǝի>t-5ҽgTvIlwO(Rܞ>JYy_ KH@pmQ{(Zsp<ʹsK˒2Q;uJVڕ`#fBKCQ"Aڏ]ѯߕ)ib "=KQ^zT%jjV@u=ޒ2UK4%tV=. X41ץP t'Aq p^_s*W|: ȟ[,/7PtLRYctPMsdQ&tm7.`O&/0R/Ц Ò(Ү;)DU{'K|hv ) t2@Z6pY.~иCC^NѻrSKL4qVyH)`nÙfw~ Tg =['R23ܮ؟!=DYj]W p |ڑ+jJܭ[K{{1e'hr{ !ٴNi)sl(װ<8q-r&0[!S^@SAL*-" R Vz9YF"ߗVG_pGF,i'./0U)>hhHA ߏU>ݳ5! @cVӆEn`MjwqeEH9-V]c,[ێG3EX+(j5JTIlfR#ߒ7hjN'MdzkQeZ [|OohkU53L#9ۤ-]$xA @>qS5d5Uظ: VN_ P=`ϒ87w!ҡlt~.*VVwgyn\Mu ?7W'k΄_!x! k)K\FE*-s9[s$P!ɑBP9]GB.f jﵟEgpkwqEvRU~ ~#߃l}RD9|(..{գZ+b կ ̠ԏ(T\W~NEv+_ؕs-v\?[HUU{ 6.΋s\˃rn.q>.ܯ-g=v]R<̢mB% Ԋc՞PW=V8-A!( P2r/S`(amulN8|}'-X (dx QViJH{(Ϧ+mc+ `i9`Db`oEʼotj?;r ίjl' (DCg rMTi|6ަ]rҒbV5/Eu~#ܰ[A%ujv+OK dG7n\Mܔx ]}QuȳN(ݤjkż!:- ЀLBhK<9JcMx1]9sgoF<4'(Lv;q9rMԦu^1 ˦_K ]$b?xAAfH}_w:ڃZ?gPf?3roi2j-) 7 寁IOS@!vʹiBuN@pοA`C2@s筧䩺:$ƊM1~v]5эU-)i{̤[=.Wn(ߒpUc堆p_+֤*!^5zCBqw<\˥Wx܅p"筁Ҵ"v_MK_qjrY'K eLB"cKgMr,XZ"ij%-7g۪bζP͗>=Ф;/9 ;_Ӆ I>#7wr_q Y>Eiz{K(̵-aU} Х&uOTH;\wjiN{ujhpJM52!)S[х u 2RoVܑGZDW_XӌբB娙2Ϩ#3W ڤTżHoϜUy\0`%:,:sUZKcdw *\~z1I#Sc`s˓\bzTQ/P6㚤cëUjZy<i\.rN^N}K:H7Fx.iu_N_k&)ť{y[/SkL~Z6=E{Ǻv>MdOUZkmv g,eU1d;/ F,v=Ɲwo xFm,Q[^,~\~_uIKzӸI+C9j׳R uO]ERBHG"=4 ɳbn&_=GWx|tҏ5GSgZͫ~1n=S*=_pRamM4Duvp,0xOɆt-˅zޕs씢OO+c0/FiiN+?JcQQuZLv.U}SUetx*ț4-zGDyԶYw 3;ԍ&=ݡWe}Ҹ@Y)s^ hOW[>\t_ b'4Sgy13W\sx[qqh3egmzwىݻX*!sne@Ek` ,^.f0l-cA -!BUCŔ `RkC[bPy7u8M()^}B{]бC :#8u$] .qPqm]Vk:^YVv4%nW ~rnUA=l`vl}2-(jGPo$.2aΏE_X:^X8]+w~ H7'0CWgˆ+P" i/oNPo&aK$_5jOPM&)pPA.7\_n6yz<-w(E)׏ HK*|!K7Ktpw\}A׮8۞t#v(=Hq)yͨ~`j{g5+Lԅ!Tbhu|wH8C@%eu ԧ#F.7yun.W6 D}\&v*4Χ8"eGybB"?RNtkp/(Ke=mckL;χ֒oIU+fעE ikMlij\4= gdqNϻɱIWXOr"SÐAdn1%^nG$4dVM|heEEK$W$-9;.n`#ޮO9 YpGD|3PM,Y( k o0HtfYnSLsmߺk2BʮȡJ{BtGHD P^-¹o="&jh/J +Pv Oi(+Z?A1H )V^UZ&}+(-LeQj"+CΎ5aӂ#Y_7_ߣ|.5Fy$>Aa3$x8Mws-G?@ _2&ᶛm{վע&a\4ʡXw1u5Wm{Mf&"c.<; | :p/P<& < oud3W*3K|7G$!ƒeC`ۇ uy^yt~[qdJRv]i7P$N;d_ozj:^+}wהިUbtwȲMs=rʍtC#kP|)bx汝L _ݖj%]^퇈vk;I*U7jqgFĤ! mmb_@c SI*GpmcܘvKksHs/cv[\t|f z^rUϬy/)]MY!d8')-CCRN:U5?#W3ZbZ%Ez(N4M<*ߙ]\,ÊCDeSဏB*@<Ύm[>bS0^U}Ҍp Rǽ_wWEjڃ\MzOMq纜aG4B aRjʹuv9r*h y툓적=L7w%4u=[9#&wu~2\ʸ}fnkmEy3df;DŽd1 ]o7n:^rb(#HKD[a)gO(ހGFbD&gb8'BGoj+|{ O5]#&ּJE!)B_4>kOW^CEyP^sLL/fwé}hOE"۰ʝ6`-sV2~dc#U߅rO}*R^ i_E9n 96=>Yݩ[.>oK`*=>6݇<;A^x@_h&C}>poӯ!u޻ Z:txoͩb;tq5,UiL(n;QiHRp萵**9d>vA E }nnwm׬!&C!Ws"G&[BX^)u""@Pf^ Ni6sBjPqcA*|r#7g\eJVrvLVVyhv^ aKIp#5ʷ4]I:9ܗ,Ʒ;pV  `>9!̇8k]H/?OU~y^O f@pS𹨂 s[70zn=㛐َ tq\krKBvr#9"}5!uY֮ J|dH؞ncJ*2sS:k|nWWc5^tv'!<7if(羹ў}D7.uvsFN!i:}|0Oڣ %-(5vk ZЮo`ӥ<qǘa>~ŎUǗL嶏TJS\n ۲XrRʝ]q*c}SK6C˿\.}XR5^A}I&ݜƱ꼦>K^I ;te./ @!tJ"5vRxYM:s  ';VLݎ;PdNrӛ |(&/1q7C(]XLdHߵUlK׆Cj8!i)7S̸Igꆋ6qKEVM4)n(xCv஡;?T駢nɹV[cz=ӵH:$uVC*~c4qb$"QR\l#AT]\K*Y8n4?]6-?Ca`%_LN  ?epF_MD$m JD^g_&f`p@2%8|v\ϲs jGn:v!;^/HrSCLIPֲ׽N'ZSԢy:ZE.{L|xte):#e)Y =Z/}~Zd%axI*)0e:6sqXGz 16T6VRJ-TOzzMCKQBuA+LiS9(ށbidz=^qv/ˏbМ 6^=Hgʭ{~;^3dR҈O 1Fg STS+*CB*% @?^x8={D;Z^M ؼ~Ptс ə>4C=vழ?s CiN;Qbv_ u;n?/kZ̑Ӽ2lyB4vϴR O5NCXr\?W՛W^cw^3 ĖQ~):Snt{dPS2Bnoʓeދ-zX *`~p|?Y:oTy[bʱTc~q%Zkg]+߬L(6v5xjۂ=<\F,/i#AtQx3 Q|ܰ>W[,ѕAۅeޕ !Ih45VoIr ,n9I]-w9e*d[*xiݰPqnY-*c{J7XZ}ьP%ai#y?dErR> ȝ*؃ @/A5g|*~uleרFYRWt)הu.!XV.%żru {@]ĩʈ,^n_F!ȇS%\7D'kZZar%H- ||^[1^VHn{"F ]ERڱLڗ1pH CDbrs`v;|983_TgpC&=NJ~w! <אO/L\޺zZq7Nq.(sYڧע) &xe+!"~IF2(wYnsDu Li}K i;q_罆<2Krͪn]S0Z57_aOCL@CGʪ-Q߂G)6ӫ:99Ͻv'J7ݲPheJP*OUHTa8݉W]?q3xMw'TK5V ,Vx/.Le ˩4I^APcJbPz(|89]oQrCO< $yΧFGXLkL9UjiqQK@@Wx:g;ZH4V]GJުi|,*־e0O zE$/N'W=7 4i&kzUv4]1yT~Icy57Hk  SB}sq,ARߓMu,<9 gRת,gt7NnSqa~oy)﹌*[zP7s$*9H#>| Wo8R3Yp:ޝz6U_>nr:mQ%v_ۣQ ^оUukIYŔi%fEo.ŦtS [~~U46eVYP-󪐭JmYqT%/>O\Yi${Jzͅn jSrR #Hzb-hxĄ<{7Qie<ϸ!gMEz>HdmYf?`=#-he!'9,s9ڡƝ+*O۵myJ$:=Om&r044)fUfmt^ǖ%WFQ8J+AٿCL\)adNtyPӧ|*fĈ}%`=[U&Ƙ1&>!Cmם Iq/~$sVzHz%ðH4 [pQ׭BF슜O:1nz15J e%5But!CǐTLno b bKPE/a#$`N/5C;IW5 h%Lw>JйtM:8\}Q⒍<$xTIoq![F4:NYvN7Wh vڝVI,z5 g6]a@,i ̻q,{Y[vl;-`GBy D9wDFo$dR"vs=f:UnI`FQxe8B'D{-d'OrE%eosŽՅ=KH5@0x :!-eߏ砒:'P]{tť\M8m~)dgR|Bo NM*4.&Aܝ=75u[;xjD-^d-r`9P.\t$)2/XA 5ŷrʮ AzqelsURbqMW/jFN!&ʩM:n3)'$el{nS]4|giJ<ʲ|;:L29: ^muUq_NŊu˺$%R8{ljlbح:-*9w2>_@zW~5{8Gzqo_"g^* /]z\)fq R,1Tβ:b+klaѸяVʵxGt!՗'TIMG ?*G t/BTSTծ>ڴpQՌM+tדkn~j%u6q^CQ95-iji*=uK58F"jc4WVd 'AbN<2"c;ғ6&n?mTt]h~Sk ilO~ʖxTC(rajQ\*Ք3wҞ Rn EMFHR\^ophʬz%*%࿲&?{.1ǐduгO>l/$\#t!KA 1cJOcuy#hSW*pʵg*gvP;Oh7w!yxq[(DE6 tm;ɻc Nb8hҡ5roI.]Xһf5 ?\ JAXaă%9*EJQe;YJ˲ѫW?2&V*k76<@;J6g^VN$"fɰF vwlU벹˄ gݮ\+58.{ VB+&(+RL =:pmGJE׺F86Ϗ;5t AӠ[2~@IG-f(b| ]ӭLܭNeMVm`WA;;%QYޡ=5}CkӍnW7nu%nt2g #Y|nvMDe0. J"IlGq)}VCZ4o$^ܟh1ISgN*^%Ut+q#wck_mSpYQ@Tׇ꽿]4tfpá xV.Nܦ1Lu5CO߯+cӦT 3U$\Fd~%2"a`-}}VhK6*Ei$@ɪS ~v/;yEQ<^s%I y2—3$vՐ!QEosiѦ6"R-_;IA ķYȉyM pb\":%jB|kwy 9I$.Qtcp}ےƏ{5p3ke6- !aU2nJUfpnl&΂GHhA=]}1Dcޖx4[vRHCؖ *l@Gh.ѳôVJAK,*MZ `rWwƢJOcin#AL+  ~kͣˡ]76 WE&uJ7\T[jUT7H` |~+OM!P|⑹l2 ~wFS\/.wl&LꯣtZ~T5,]уtOzI8>=ZBi#0-kwΫig@k[XθTT։d*O9/Fen+hw4ˏD(Yi \3'/j["kA^|vtP+\Ǻm|Z^Zn[%~Y uSt/7TH+a8;6Ι _0;A %5+ިuu)% =TksmI lԨy@rP8 iWT;N kLU׆*P^f& _]b2]GXwn+Փg(O P喗v㉡:$+YS\* ?(T{Kc2M%@r&GW.T?xͅrn!8ShSnCE%`m .6=HF7Áx-+n|d A1L%̺/G.tn#VъU[s#!y XQ ו#^]-W4=ԩ͡:/E\7$-j:Z_"kw7MrKw$ܭAR%qBP샭3|kLǦļr(x\phSMC7?l7~S 7$7+ſ!hӢ[ oA>e9qv˷r>R\ LhCޣ?-7vQ˒W_{2v{KOKM+?_F:u}l ZbqVz1㷤(!o5({ eOzI2PvYhB1u"PE ]{7s'Lq3ni -4GI[k&OށV5dV}S]7F7\ *d פ$xϾ@f&+MDQgWֈtnYi0iWĊSj Ïx|,k_?+}5+H(>& 4񡱖ޏTЌ#}hQTi5CǦ>մ/ۃM!2uanպM!Oę8#(wcUr-;aZIE{?4dlw;Qtob?qxR$" U˾RA3Q((iiJ8Q),THh>d_l) vcrB},X2%1|NjL33u#֞>V>@ q|We3!-4m-\dP8U6\Xj)tUי"wG}Ĥ:M灲^I5wd:UA(~iW<4.jڍ+]SzdIՉu2dF\G 礂Nr20'$$a[EFwf(Q ڱQP&hǒ/峡*7 6v] Wt|+J^X<`0Xd(N;̗[[Kv&wYW &GٳVe}jz.f*Rl W!ORoħDHӗ3ЪdU"Jo/Md[gNg:jV+m}:/Uȥ]o푨y ΋ޡf{pDeVz#,In& RPsg|ffxna^:a(m+'c>l«4d;z;Q 玤n#}Wkr fwpI5qZ;FΩ 1:Z|r٨EZl; Sr$@=Sqs6#mX`8d0U {ZCvm׭aN@5pֆvcNo6Wߪ D^Π@hIv!{^g\l'ā=j۵"1Gv,wwv+v$F:dq(26+Ppzg&)~)jL>^\"5ru/ч% nQ|>{8Rȍ `_`}o#yZM]V 1ߥW Q!ohqe ؎<Ӭ$}彼X 'P?D ܡL`ݛtr1rqïR JOȸ#d014ֲ u,=r"SEOҏ BG rDϫ_]VbZv.EuPlT۟$"heD2b+7$\X.mHSUk:(#Ua[־$89P] `nQV)/NqO2&)Q=SSuY_yiKVlVpiRPux֑sS_taYzp:d79ʓ:2s+޵M-ӕf 8t cbڸ\)(BT􏓰@Ư?OcLe:ښ͞^N&vh?֞$5RL^q#d٢)l)iΉױmGhw"5?xW- H;۰)*u.z8oG&ɻ#f (3_N6CyjL@>JkZYդzd5㉑VK'kYKw?w5%+A,ɕHiy+^ch?6jY~)aƏ$5ކ*Kjz@`gAYSP"$q/ېqcK$S$x(=C,#ړ n.DSϞ ^b,]_f}UN*`v9j/(@=6Q \apЯRܷuN@mg}M]5S,}rMY(ECIݱtv@ty]6(ggyqQVƁÁ})'t].ΌSУj-Igzxu$\F8?kj)8ʓEzU}ȗIQ)tqiGk*GB t(/0ܦQn p|ލz$0!E JC،.* dQ{xC*8Y1\?r*5;Òsҟ'NУ1cW| =M>/W@"+}g=W^XԁSrEbMn`) +f⟶kPfG9;,12α5I呶޼.@X6 o&E*KЛ֯4ƀ##pSbSa+MرTչ|fIuguu? :[|nA0ZTf9D//4w2W/eum_Ώq0ݤ C:=$җ)i"i@cS4&;i}/0m6!BE kJoX*kCB@'ku%-r׊h_QUyh4*UϤN3b@s}Mޤ)Z&h|&7+kYr$ S󼦢@[1yd9=RWm~sޑ/Z +CsjrPPir eEH_u0 ]5o8#,}mkP‰5dNTI #A{&4\7t`Iٟ\$𷩨]/!s*$P~{;ݹ݊MEšp^_/]%K>N$uy^jZ`~ wM]+{s෍ZgwtlKJE0!$Ktd\r_bp,D`-{Gk:"Am6u /x"9WoUޔ7YrV$,]q `$_:ԅz'l:xkkNeԎA5(Oѱ2m/SjrtCOWYKӧL/{/?Kd*~-)ThOCTjrlRw"Sr.?s^{8^KB<b"\/d~i&edGxgn)**t\ܰ4Dv(~${Ssgm޻bUuD;cMMZ773ڞi4<:d?lU" U%j?w\ ^X^؞x:Iwy9\㼐Q8Xkqonʯ/f8D\Gh?{nϑh9% [ȜS]w[|fSۓk ȧk28i\jq0+G"w Ѣ/2ֵtH-cCœSZ38Mk3Xf6`_KP&Ry\5RfӇek@g .^X jV7SFfZ8 $qE?{vvd@Qv0\zr~ 0ekxt.6.?!+袀]IW^9QQ2>B s ,2yn{8rn,FS|7Ҏs럶Aq2rv\*&ַ 9u*^*jz ݝ7V_f2>aĩ0A$}($g}!]O{\n!Sn}nuܮ^x>sVǞe"n5F0&=] l|Ir%GmT؊hĚe Kb9-WpP:ֱ'0]CY+O6b!WG0o̔9 Saɦ97"=oS-*eQ..KZ'Z:ERTƮRggݕ 1kZ1aZq&;`Q=|b+ OK}qϚ/im.m*ވ\_GIiSO K:QsSߒM JBOoH^>ݿH`s$E`W{;hT#NZ9YnS.$S'i(c== ~}mTx7Mpyd5z/psPE2i5W%e_W9=gK뼓BF"P`޵G sN.)W2@C^^i9dNK_KH&q49*&TU!%d=pŸm%58=Jxd%:ڔNڡR'qUϝoSseUC5.ҠUjO\>Joϳ4}O[óO|(nUܹ$(HO{ jJ›Q%U-hG"~O@Muϩ'XieV-xzϴFEeC }l]G~iK@٣SBDu.MgN7uӛ/v4Ag%ďI0_=򚞳i׵bR oJU2[S3cj@gݾF.PCpySUs/o{k-^WesX ]9 IwDJ"e@F-Hu7A)iFjۭ֕"%˥9J24ssAD1oF-S" %TR+E9@*?҄Wi(mIaNM?juk;a|wUfe;qEL/đOWU Z͌Z(54t;?ܪC')=j70?=Jt v>6p,V( 曁J._|/yM?5Fh'm#w8RVFy s{+{U(zވ-[ ,Q-ݽz T~ lS49:eY=zjvֶ~aSr?n NS<%hZ^V{/+)vt;*~WPFF@pKYQwW#K4C:Х5!C%kIW)keSγJQx&I @!k15㿱)S/׌[x鏭 `E u(WHNYAnVp=XvV3 lPy8:TՙGԕ%Prb$#y)aamW0jRIԬ6WԪIJʆȡbDbL6?{*KWW$( jK.uLū%S6'liz{WePA=mU MZx>){}ZdQ4KcpIQB^y ~E?Ψsʍ0V0Nph1iG)5jF+]rFPl>n)QXm6+i}1*~}W?*O)2t¡/9DhOFR8UO BN|")NPtizd%*bMcQ5XCx|z>?UOW5#Jᤦ.sE8]\K~'DKP}+cU"CA/k6# Cs~Qr+BA|]ס7\&( K1"Sn.TRvm5-m"$*c▶>?fUO z<)db.r)@L:w.%hNǒTKDVy^(2als)ML5g$HWjFNnݽߧcnj>>9u+nK)NWȗiCZMqbÓ_^ٿʌ7էn;qƹIJ;JpڐFv./7]ڑ["aVI7 @B{]'?uM)s]S{>Ur~5-;I}|aѶxNu R)wIK-8uTp(OƏ8cHV_,QV[@؎#zeq8J53&tpAڒ~?͠B軠 dJGDʅ? Sr1%(N.#l(NQmʍ|T&*RV=t>a.%ZZL"z!L uQUOKSO> AծȠR] w)UX gjCqF<|=zeǚ$+M5⬹ģVhځ#ԶvySxCy]g*A!Cn0cN.9[WO%Mb|ݼw#|jRQhy5iڞÉXeyФsϚcNS?R%~rmɹ\UG+uFJkE } w.?Y- +bmIbRh!ܒtɮ/ H?KТx꒰ϳLe[@XѡZM%$>w׳o.Sq=uӻ^d6Ͼ_G<w ХS֠,Wk<(#5}J IU8,;7q#}NY&@iD<-Ó%2yGڿʂy35MzJT>r+_ثKE ۦ{BӣqGZJeH)Xd')/5+ ;,ZnR׳20=-^cHPZr9U2X*N;?#)^q؂!\|tG;(H+-+%kr}poZE aB!wɺ*\u8;'&5YLmz9[H@ ju]BH 4H!%gST!fϫ2;o( A·nG(\tq~ƵF@{sxpH>=Ν( X>_ȍ§Z|=cx((wv+eFKUkCIFye]]遳Zgb{q.*!w)|BY(fҐtȪ,wq#oiC_i:B-AOpg9pيQϧ16&"D>uPCQSf/j)4B𡘬@~mP#!HK8*-vȧ.=7̖'Εb_6áAW釸y}7X]2IIv*%> h{&j_fH]t +WNqng>xCj lskH V$\ew~-e|v"8ZrVZTBd0; Rxyޟ!mxGvaٲ|b6P季M#Di [w4BG |HPzn lK"J Wj(!o)"涊IUm-uyb)P^[nD[\2SVAV7fk]ysGE& wK?ѱP2Q=~WgY d8>Wb;Cov3Bӂ`Nlu)6,ܷ~FȖ´izYwHE; m>:#vWT3C4˷@u=*SU7s.8y,.W_=iwS(a/l n0y*+t.o\y9uTEc(^\ q1It#iuBes4kBT4*hV=y;e~[\w‡Zj'enZ,k'[<@M+>+롛ę-ܮ%Rv`27ݏ1#8UTs j{LՙPǝ]ߊ&V\>A=,(oeUO5m)_zu(%+ho0&:$~`VPњEZnǩndq__`ӮLsqzSXk^64At 煿n;mA>8}cQPUGsg9:xi7*:r$E:2VPT(e+KHb{*9o~ԁ;kܻNr9MU;%ʩ6q3/6}|w|T=) sRsFE!=S]&_'>:5oE` p=,UpP?VǹwWfB)}ܡHーe*6V,Wœ){K[kXDgїˠ.~l.D) Sm*;g:dj}핧J宄rh7$s?*[xVxI;M9x5ut麂[j}c;6R7ʅJB"L> gKzn xS-ޏD`oͬ$7KN \@r\yl &Ol]dˠIyR ֻ:K7σr8ǟ$}w&}JwQ2M5{66xYh#}?\slh](|pE`a,&ܞBD,2gT;eM~iwպh֓$]-8-.aKDot"P}lΌKZ8཯kSdvʏKD&?t XW&om3aBٚ4S jȋYJpn ʈEb.<GOPh=uu~>Xq}yF8D 0\7: $-j_؛R5Ni{!EQ/AS{}v;(1*.sm MV^n4SF^jKi/_x5;9d{`/oԽďp߾ $1\Y PrJqZk[b|_{'%*6Pʂo,`ȓ~"!QS-C58߫P%&qI(2lYաN33#}%˟s?wX6ƚ!wy|s”K|.̈_:Khwێ0O46V욲Aؼ?e0[eUnv}ɿѮfle'%X>j,ϽTlJBEN Ft 1"gO՞VSIVA<;{!YqW]SW!!pMy&u գY%^jlQsiC w\@0t[H[1E ݜ.k$54)ݺIv\PmU$iм]0Ufj޻o{.԰E )["̞wАfT5v9leq_W5پο8E=Ȯ>K,>9JAGkTxUQؙ?QΡVb3e8 s;Բw,n-E-ė\*'ͨN5F3]%¦co[56zEi/[76h›k \.]bԟϹb!c|,MKem.)U pk1WC$6!\p s8z$ uo{ø0$W{ȏyz-r%](U"?%籕%.a3M-FtUeN\r%Wӷb"AFK-WYR'<=9)Iz.`_-B `1IM%=s IΝyw\nU:GpS_$`J20yA>}םNOrm~7ѰUJ[Ǡrl;FB<~L-gWc5 j"\ ᅟigu%M-˙{ט8Qmcu^ 6S qOkå`+@ JZ v7ȒofPC1=ck("AUSZ.8g~\aiGp~CUQoR#ܭ{D[ R]?xy@KWkz#XfP!M58]KU[<\e4[[wn{K|bbfy.2m@z^ L*5X*ݶF2<+VFyuuɻBy({LHOKf;d9V$|TiȮW`͞ҫ=WAD]bg)0"`8Hkzg 0^"t#ڲ2j477\S[V,kzR\yri4$IjFMJkV/EUFw^#* WAiI* :2m`صr\<5VXeR ƇtAN/qߎ@+YF\oX<$&Hu"E4m09$H@Ρ{VZvw*$a&kS(w$9ڽrݱslIr^ρ_tWh&"PeRcXQ$}$}=iQWᯕAX|[ ݵ`1uSm&n^?N(\s TsEEFT֫)X)3Uѽ4)ܪR/߇,#o Y̔.0: 2'YuJ{^ rFV8 i+m66ֺ :U?t^w݋S $e:8 TzI]k U?Y[nK"rڐO@۸J~S2جas.ݱ?KWjus~S\7_"=i!}vk:yA)O?\ JG1R]1j[V~yGBʧ 0!'=Ay4u{0rn'\;@]zYS:HK9-m*2c\}MP.8F3dM;\[˥/jfiWyS(әp=ݣ"wUyڬ=`L"j'n%nDR駰:uzѦٛVm K m[hbt̟ osk>jN/r5X ^ChkmA|.iVڰVܘD ׫pI4>{^t.;؈sՇѕo/tlk'Bʤ]mGx(aZcFeJ=O޷a* k(%(P7@aMz^0D>awY,wTҽл3l"RSTRۍ*0?kܶGɲ$˶|s-rI9+TT:ws)p.^"T~~B;MH^kN 8 J'iU+b(@)WpɭoQyF,7LOGJzN as0(]޹CZX@;epuc+*&xKq$>VRDҽ!l[tK2'j$ w.4 Cw.}ZOz|ɒbܓӻJCeЀI]a$#~.|.UʯNDB쁳J4Ϙ<&qx EOp@9F2u€JiHR&I=ڇϺ4e,3<cM,ONKI=47r_pK_jXsY-x*h" ꦅO*!Q]t qcP(@`!cibS;e=|$J2v,uT~O|V_LV;?`G;OS-^w8Lw_>Pǎ 綷θ wf\0x[,X$L<!LL]2z2~襦EˍZN[%+FD+D3 3EsO=XA._`8xn5 D} T\`ސ8 ́΀դ!QiBH17G⎳''уҖP7zi8 pe/)0?rBՀwuJ3~a}1NX~ذ=]H 4E q4Y^}E0]0ht%zĺto3d˳h 0KAjg}&#aFX0́g9,k,1|\ '$f-r{z4!J=KdR`x|)r S1gEӺLEc,}JjA_At1;l_=nps7˴(=X %88=f =FL1閜tvA$^z-uw/N:0 PKȑV*b-3 ?.ѡcw1#W?϶`m+W49qK9b J*1j.X)>K=LU( ΠY=]ǽ4۬cj.jG f%fZ0xi":IUZ2P=s'T;e)3,A.\Q[܎0dwi@`~ i_% p>caYO3M/Yr5k<>74 e2xq°P/tK)c~oÊg]i#)X/7''+0cD*h|l.ml;b) FpV6KAV:;tb]=%YJq4H˪s į٧28eRDvI8up1s )JnC$a_ީ'#o$+K@t3w\<9g$#K&q1ϝ{qdQ^Onw\)NXûpt,-xu< `D?1%w<퓕{ɂg%O7dIHBxɍ%'O)),:NUBwc1}j@%CfP w;Y3NϺC.#nJCqƾ@X U=O+? fjGW٘!/CKB.he;mbnr%hŨYFΘ.e6b8KCX8=]]:0&n4" *2;n܅kB] <5yL 8[{灏40v<w13\c%MG>0=4d2ǏA,zi` .;, rLFl.[bkCRӌ#ٕtC %[ݥ;+QvG*{X{tW.fnqV41>,3wmʽ(>/%;?<i&Iы,s'f]H^PHKV:?NJ` {EΌ'sS1}h>?fy:xt}{iޑxІ !of d/|zln=z/i~ei P8g 7t,(@3;;Oh53<>VzS kOpn\d"o~j8T}5Ú80'J7̪?B3Uvhnί=P*x/e!&~SeڦE0x-MZLڪ|wMQo9eDawumU o3ia4D?Q1_2>)4q~}eRUGxLNj2V>͟ Ulk|RfeuK ; !k<ȴx/鐅GMVˆU0VqC0+C1**{rw3ҷP3`eOAZ2ڋkU1}e;eQZM7쇳_9@'0=h\DzQxУxm*srqY 1`4Sp\0wzV1@Z5Iʊ}` ,&>Q΃џ[!B,;^xr1N4'>pMC^ʨc?|1SsL32F(UY 2H+ (SFS`:3M0/L?՞ޛhs{& a;`Bka8zXfV4Cݣ #y2þ)\}2r=fΛz2[Dg98z ~W I[)WHN&A8#L^sqPО3pz!Kn sf7d } r N5ժ$mSNݬǩZ1¥5< HFڛ o'[@BEWzELض.5TsȖB-y"V4hŹo]ȋԱlKO.wZ֪yU]RkRƍ?p=E {T(EӴK\ 1\ Hw8HZ!n%$ɱr9n4-i5*k[ P]*Kpˀ$х_pUUlPFqmVUo*VWuL:Wl_]Kԏ0f\vȉq)X% aQКUt~E),L5 Qd+ 6JV>Z`vjgM{L(&,ZRrB?;YE$g,QƁijQBEiɥ_EbUV 6˅ mGAK+cW\.pq)?nO1`&l^=F\x?bΕu'o ڮ`r*| gžJ<ؿ<2Tx|* u_Z82 o/{`J { ȬLaϫ `]L]a%IL5*„K\APͅ#2,?S-fo#}Ot)i2~2Aסu4K]UMEb_T8ԟ i i0j0ԟ#U%7ڱgpHhǟ*BLzBx32@ j ZN \&$0O$|H:K"V(' V?Y9ʟ \ߩ_@jTZfa  PU B秪Z r7+٪zi/Xu {N|aD)UhvJB$H œ[P2'o*}PTO ZXKios%dv/U $`c/|ؖh@lgQO{A蘡f}=^QDTb4: n6z0`n#r!s3!~1LC)Є,EhOt^}LI:,\uU !^!#/߁fԖPr ̡fuG#kՄ'xOQ۷3͕|K𼥦(W!N )G|_XP=f zk`H7]jl?9|cK4?/UfT&t˧r83ѓ_^v@uF`B8]7P}-H2p2ʦD5dSoNu{!3fe@Xqp|m_9Yhc_ysזV ©B (Fo4ֺ惫#1ɝ|邥1{>"3lNYb>P+S*IjV_UV±A@ !lhPEsɚLgb:0{U pz2y>I:VƟj ,h +`R?[NGdƗ}ø=sazݾWskT4XSo$m+S%f(s,/Tr8}yo]W.*szw*8ZU=ߊҭci @ĕQS7WvP# BN]F,8:#z5g##cBY2x,zC9k+_Y\L`ؐ2N ɔa֛!d&jyB}w PJQ։v8%04eD 9f`B ]~U 8|JcthTh g7?jUڰF$M#opAà6 'P#'r; ~s4[ DO[@|}HAOhq" DۭGQ7g 'o<ۜӃu zF#-&2Hi~p  H/H|e #/zZF7 4z;" dp3)*h̑FyhwS3@hPOw=3xD~ε#E   U(;10pu'@[m *Q siujcog= f/=zFBo $ee{bgN4 we1ih(H4#yZE=|ɩ؋(DNbL{ФH,{a#2b8Q׸ż|}T‘y EI?j&&26}Hg_Y>3 y&o)HtP8i0P x>^b0I6fpee,#~}Yl4zз DʹBm3͘:!6x˩Qj([M06q*˾kپF@XQFMc,pjXbEnPz0W SEZf厦EaF@DUy8If}ҁfT UJxn 7떬* Zs0+`V9 yӵЭfbౠU ʺUf ??XN5t 9M- 8F|UTL)oD6Hg9&@ʾ-,v[!W)hNiϯDC,Ķ/^olB'1- y*[ؚA暩ޏX y bA7C? ls&0NfYe-g (>05LCsǹ f 9OX!23gdBP+c@*DbvB]ihWaPŽq 4EWF T[F z"VU@d'pP]\ݑBM%LWQ==%q%֕;hZ/n&@ډ!mwTc- M.e˰>EH (N ĿO$}MFayzaEA. *-|UԲʡǷ!25HаmFRD`|M\@n>[F18YRE'W^ Q U4qs?rVEIA@z1C jhMP o5 =MʹQ,Z"8$MP H~Mx{HEn`̨Թ6AXf14aDN(W*A:Kc/tZ[  zLՈRFaeCVb*b^ JCVbYmTTB]H Z[&ysnn;~:ѮM{AĥMڄzb0> =ڟ:j~K _}Sd"*a3<ޘ^ QE`@.. KЯ4h(۪FB8W*Jwih1-ZCL۟mKPs?r̐R /x, {C mbʔ na,b6k?,iG3'z=MŽ z!9qm7(^4 A>hh{u|ѽ5zD(@ gt|*LnX*zmڀI$ աG{>{:[nm`^p!k˴ 5Dv-t-0 *҆Pa&Ye,c=C-GCOϠD@,Q0? ]G=N4, d&Фs\DX,tR$Ɔ:e ft X PK@dITLǦ'rty7 DZ~̙\S{S^vG4m{6]gbqB0d] ǵi>K\lЃS;[ǽ/1Ɵ>*Zl : ߟQE}Y b(/TuhCv3نttMAUv ZKekw:%HP v@_jED6GW3v}44܈h;G=p1f:z'9Ip}L`ֵ%!@~bGܯqx97PMXEg da"Z&P|, PYмkEX >,KiI#f=ZsͰ9nJ4^ }Dp Md:`+NMZ"t:2of%j~|e6ۆUǾPz* P[3,kHmkE^PT^Dr>IB:xIid* 7j|" ve|qYP%;| Amt=H?Axdu@' @RHjUp+@5Y ldh@~S6![CWSK p!ehqIp t9?/(uL[%4*`OcӉ-~:kFuʌP3 Am[Łr!4ꋊ_5"P kYcoI ni$m0$֑J9YL-yUTqsY P\:Cj*c&CYc!/+FB"lgepy/"10zz$E *;kj턐bL{I5 o>9$nI R@oMx4c?%΄.R^U2D^F(՟L њ'I 0rC?1Aa/|-4WKJoL .1tӧ v&/j ?t%Gֿiӆ;ݽG{5 #ӒND5Zj@(lm"\zDE#.< I`:CK.pdJ'ri&Ah']%bjL]HZ_$` NM$5! $ՌZ}Ҿg8 =P 4XBs:F%b+"S`9)??aO9&+1]=hAQZljRL6:ׂ h @ZH| r WϪ&i(6$-ڭmحQcEԆۄUv٣$מ8c޹]\麐U=fK=.h0;Gx0vj V#{vL ~UoR|mNm\([+ikwK JXB+̷]B&mm8 0e5%Q.}rBt,,%hrTs%WѨ4F@u,fÃGo+ax6gO( ġw=&tZb\]!]ƶ:{*OKVZ}h\L-⿽۳PUDfm*QBan*Go3V-{HbmHm“) +e3 gb0FZi0^EB\]tHkۗ2 nkR$4ضņ{; vȢvhN^RmiUq~C/`Щ'bY>W%.&ұ$HeqEtxg"Q8&#PceT쑟L cl!}>)El:amӟi$D¥" 2\ PAMҖxetFqkQqͶڮwk:v:[5[\ ܞ|vܥ?mY71;3ǣkVAnY b\EGkU,GE682` >-xBg93}7dk.kr mu5˞{2Ux!SV(c\x_Kq0ldddјJq%lQBO4'UL06o,kMP^RǼ&u[e, dZ]𷜼["Ce|> tCj&h2Xu]B)[CgUhZw D=o mBpMeLg936;ŀ#ckq'oz]`VU4NO'@?zQ皭A-$w2B"a7 wwWY,ϩ)¸FBTmys`cΎ3,|Zu/,-7\hޘ49g_;-^O2t%t#>ˡg/u*Y&nV5ǮSPf}"H ?l@( N)x@ޡѿ ԒoPs;):{ Zm0É&wկM'ui k/WZd'r5 &rCefrP[\#W$Bbv*Uu>`EWu*Td9 AoiK1!JAuu+alpcy`` IפÿDq0q}ۭaB:f?)Ƅ9Fd("+lN~\@=h HZԁꖦO摥,ϰ ;fz BX ڏk)4.:DSSaI!򣄔iΥcDjK" /މWv L hU 'z86/~;|>y̲=y_I{)ݿSƿu6 ?!kA#$vȭW97~]Uovr.1ZM cYvs"v|;Z#UjFYY# >hup*V {0\4L"d؁-G3-'XtMOlO9˶e4riKx V𲑅 PB,wMq ֑OW•?N$M8,SsZ Ք7CkSP1Dt.VX+&p~@]rw`69,rfNDQQ03ʳ?^?1vuf$̳xCe3Gi"t18bsL& Aܮ/cfyZ6ge+lZȄ9A]Cy2Ҧ=?n3:+r.N%f]`pЎ鋣ѯRO:DlBGwVîh(ho($vy;%"鶃i"jH~6H(S[%76E;5LDjЁ.y%֕<4%MfѴz2&V:nϖ:'!7^tʁ IҴUg KS!\z6$`ilw0+ ݡw;tF񍪤Dn^Qȷj**"; bb4wFaڿd(WSO9-i<, TuFa'N<Չv)`S;G=Ou7ӨLTa :{0b$t#fk or\@-ڄi3~OWn;Lh9'^l M&hc:K1}JNjX5_ULE$Mjj:7>=}`ED| OFݪ&miօo4ߠ\كֶk}SAnx۬oGpzF߫化T๔[ܿ4t6+@hAׂ1$@M,QlLA8I駉a2=Vfis3-/sYݹUH;mja k7_a=bt2E5h+Z4.Jjj5Ӵ9o<&Tf=pĔ[0Lo2u6dxQ.<1mJ˽ 7(bmb-38l$cU1 ejktrsw, sq=3a$Cv$Okd@N@#q_3.fw?cZb6p%l b6I(jY &@@iնLнF(j [F"V5" r|bohZwm} tU#\ vB2Y LYUS!*E-rlm; O(,f)/^ Oثwnx7ihrk01>o3bڦ4)o;q0*ieLc챉Whh[:Tē"1+fUo;%WA#a}l:P)Z֭jjBxvFC˂oVs FCĜ~yr{@s*3޽kUVeyyJ {r&xXk-e0ΛM,\ƚg_UwB0"ͲGt$r/ReRX_5jQRmuf%mBsm;-g`i2K޲ UޭuW j:8V?l@B2V7}ZDfמP5{iuvȣ:-勦2з:xNMys`l;f2R2aHa(څ4S&H49TAMMTS"C?׭ؿ h\Bj(:v7j4eWVByQS퇋 }dFM(f*xhOn^ t@4}AD>+$PlyfddԖhOtDO*8tHM`ި>̋f>vH'4h&hiϣ2[Y0lyq=|AڒYk\oMo}ƕT zljōf&?h4 U/1 gccj}#đHtPQ~\(n7Sgv0f7H:'6j_=Z^k)ղ4?gmA>N}5NB_bZCFIT'V " a4h>]Er#ꌆђ}.rs5zIAĜa;GN\>]m_UZ׶. ݶJ^Jdm'3/PR\*X5xǛ5ntys}x:"'TI@VLyёgtڗU1V¸ƝO_UfU~l'^iGI߻['Z_u@D姼vb[+}kƤjIgn!|Jə(ڬXz;s[>/EԓWZi'ȫS%^R=:GK߆9Y4׌xxWcX,iZ[-d]Vu)2IQ4߻Ro \RbdQiQK92Jı)7ɜrӌ)WgL+NN'I-hK{ %)U$Ő$Iw”;zX9 iLBn4HCBd&٘$H2v&m۞{_Ggh܆NNj/#JqP.FA tu4Ra5ۀ'5\?Kߖ@bm,mzRNIb$JRbkV n:ÌZ,iHKjŲxCӅk%gFЯa:(IHl$E "z4H`^k1#ڑdIUڔEbeXv`k{^ܾT`RUgK5CL{JQ[̡̱ <`;Hprm Tؒk}V_VѝvI6o$(|8 Ay۩,IJ if~cfg6%ۉ< TCH'NVjSҵnjJQ{ӏHHL-Ez*P\@XtOza,gئ$HبN$as]GGR5]ۨ>J쮅-nmIˑyWZP,(2odۈI,P1F7վ M!&r:}HЩja@MCCg6Y~V`VgNoɘ ˭'oU \7e|dNzN͎NgY=:g}];UvAԃe3=͓-R+ZΒ KH7Mz?3 2'\zQThSO}Bkt~17(S6WSFN7[.3Pfk*֍W~L=7_ˊͷIJ[͎s.}B4'Z<7WaA'ح䳔wJ&bX1c|Yf$ J(tǹ`I?Z$FuEt;){Trd& ˝\bog-Jl)<;L W+#i{zP3!tFʅҧ,{qFUظGYǍ^w?[LN09w}C&MztDZe0ɴxt|.n.$5Gy31kFB u8e l}I'&3~Q2~=ILcp懫ma_~ɳGW=}3C>>Mi÷ƙ"Ѫ+ߵ·RbToI}h)9sWW=?x&zQZgʏag>{+ٮ+|Y?iAK?D49.maI۬UqؾMiu]&U{k{t/ÿ{_CRĿ)9mȭO{51x0.{RkʷFFJ2?sہ,N%ƋTqnD3ԯZU¥DiY1p{,۶6yl3U:'Iwj;Y,nU('y;>†x֮n6o%,ЭxP30M*!RT6Hi6:{T_owDݭ99.;MX>ټ)M_rxM!ײIp7;:ɎN7֗YU??,_+/"=&PKn.+ә}7Ygd}1o4;:ˎγ292T/skwc_s6{N3?EVa'):*QV7MepSW{]^-pfOQ._Kyl|ݦlL@2iźsUn65<ٴ[{rUjf>6O~w%HϺ΄=uƉ_r[r_K T֋U^&H$KGevtsm%dGYvt]dGQ0}ZCiH{rP:λ&o}'ҍڼ(U/ 2=>* EɆ ~ Zэ䨴u$ʟgڛ̯l$UHOY*uLU~ʜWjʇ?f#1 |?B)nq)˵޳R5i$AHt;0 Kpњ[ 7<@RE_ۇe\>.zϺ1rF\A$Ga΃&5hٷud5և暳^L'Ie}a{ ɹS܃|ݓe~y=?iyEx~[ml~_DA >K|dzR߱Y$vӺ{̖r@vO[}˕rPrK)yGPzZ/c0q/O ?~goeY?WQdj XOiFs{KFrT=^IY9LCsN@󳔍JnW6?fltNu;WS|{(Ϋa/Z?T_ 'Y%q6K47y&ɦm6=osך7yyrզq7.gGQf0( }JfkLln/~k3}q7Uvs~kǏ, Ȍx~~LG߱az~Jjsr#NûCQw6ٜǺJ>ma<"x$,|rbXFǏ=2J65o>O?HIG#3x;lRec&F[ =W^?]19a%5;X 66٣!/5 lN> ;ˁn1s8*MN sv笣~ΖP{K9Z0s$-;[x嗵. [/Q8..b_R:> e _tU_{(9_Z8W:w^2A}/]1{\g E_7{]5JOi'&q~Aڻ{M޻K!)*x?e'ػ2|*LJ|1|Fs?gSh(ғY[hZ2(-v?U;f'Z>K^Ytl~LV~D?7MPAȞ?ixz8 }2z.Z<ܟ"Ά!-"_;w\_ͅor7['Q:7R3VX;kST~}+Ge߱d$jk߫/Kdz^7:̃ڴ_{҇q{u`gƫ<] Sao73t٩rcC 8NJn=:`Twԉ>u|t^P6N%aZ\Sݣؗ΀@Ϩ׌|!_3U]je/74p!O>.3fY:vƎ=ɓb2N&7+Oz ^1Uny[%q wR݋CP%n3 -#iR+*?*._ %_ no¿Gv?i@r8]K˱0~)sк疥Y{?OHu 75[݀bB8[=慯ʛV _ȫ3N&nhyj|+KBN I^ōT~:~w;{ :L7#JYH$NqUE1ch<^){.kT8U1KHKW(jӷmm"% (u6ji~/.&k~dK~xA7˯ɚTm<'dMԗl @<*?./"p W}[:%ee̘s73@<)lWRR,KJn.@*/0j);7[y{+ű| XVimj[= 讆/OKb&oZ_>Ժk\)C7oKzl\f( ehSm6x@w<ʩL8j|v!2{3ơh\^pPj3 Cdu_jyoa< cBIy~Q*y5L{*(So(k*"H>z5*9W?&LFAybdm t3tCdKoWp-KyΘqHj$t>1W|m)ڗ֏7ۭ6<N8^:wvk$yMلC`$l?ҹ}S/*,_r?W4{[/+j1So:?K-1z{u\ n6__]=ٛ}u? QƯWҾ.WyydY'%v2ܵPecYZmFz dܗ={NܞYr,qP95KQQF]uhCc9KynbY ƙbʯY~\ wHa xU<^#So߬ZAN3jE*w9}6kSQ{ܣWR&$]y"YlATcT7/66Fw)?-t4ftɣ AJy()+gs;oˉXFi@߻)a^S濝<'; n>WxLLﯟA{I`cᷓGٛ壓BۼwᷓG{&ĩ Y:O%o'#,!)'W&("O*0V}~SA?>ϒx<'YNW7V8)^,"oHs]ȁIГ51V"_c=n1|[ªj{a![b`6F 囬2de ~ >AAH%p%yg;ǯ) ^x`gw^;)(Q[2Ytxø`ͮտ7Y-v|sJo% IBAJg||u|ur6I.!DN ,c$uMW6=nSni0kp9ZB oo薥95yR/KǍ8*+o]f/W`rfeuvx̠h/J`M^|չʔð`.寔 <]:&L;3t $'ɢv3|[/ o4y{t==֛0]0{S sv=n<.oi7h],xƻi0z'.=9X`{Ti>OO|zr`;嬼VfҰ5@{sR.<w{nݕބO/G{7|l7Qn#65n#}IG$x}~1WL&-#^n|^eV s菵Xݱ7{+kSoa'~rXWF;CqYDCߟ"hz|P' c'LA{Gј#fM5Vny4pǏb-:NiOHGF0yDm– e[}c.pOX} {gX:?xhYc0Kq*(yXo8P"%bq}'m"OI/c6Z,kN :4-^b^O޽|Y >4X E,, C$ )yϘbt|YӼT+"9.Sʨ%t>hFk?AZ^0',s$<{I%:doYݽze4wȿ9(=XWĞlc(\ȃ޽K=[|Y'ޞe >ꌴBrڏ:fx7 <"J#q[RBk#MxLR2hfq5ƕmM jؽw޽{U 悮4wftgm|춽U?d O!M @B 1R@H@H"eDD0$B!$B"B0hUUkr-wɽU[o}?1'c.7V'T|F8mQ4 (:,n1w WI0@%&.u;0 "7KKO۶\{VM"| syyaIr>YZ5E>%6D=de"{v=0S~Y \Wo2ش ^wX~w!v͝)Eϲ%xEzZ;KL=W ^lh'>?C&#rvRyķy]AX.\HΡ0wIF|-k `VFr1m97r.DO}^ы%'Yv˃8T(3_Sv~! 7LSX}`oqSš0jaԖW/E`]9e#|;X9{(~`o.0H [Ń+h](%tmʂu>~\taGON~2RC)u"/jQC$|*vg+}+VpŔĪ_&dyw. 8>+XqVrz7G#35D* F[H`CO0^6SB3 [/ftLsA TK箆\a4c,D>ye4a3 @n6pDl+}G$h>rzXg7\.JTSm]`ײ]Ը=z82q:0;ER6V&cid??ݟOTw}}g] uw]P׈4Wc/nHGs?P/6iK}D_l˵>i0ܸO 囀,'QZ)l_}ٹ'H}^Phh"_eP: o{p%PGlɭ o_#KO*WD'{VȀcC`pF1I˼VذYb5? -G@0!2hnU:>YE.||s69PNz`յ+xr3+Vp 5B{? >5Zk pTţ̆If}=4N(pݹ4~q9}˙%|GGÞ&Ao v2WDtma0HJ_d/sDN,(hF3#S/Gs,lߋvF}n0䫇+:S- Q\p h4:kmug EYV`rVYfSGzU "u?99z=0kDF۳6|ao9A4m I>xD aЏDu\Ŭso_?/79~~rsTO" PjiHu;#M#Kkr&'do˭b&{op{gYGQon%=,(VA?Q8q8v}lk] ߈2} oWAukE-ȍEߊCloe'638RAĶ.o{COw/b^!feuS4m>Vubax6ۤhy-9 3>܃UoBwպl^?Jݣ]c"fq ϱ:M&dĵm=ֈ's,M2n"0z-RF8$;Pc֫Ǯ?\Yz kU/ao쇺Z#xҲ٩6Y\ T;QLLc.ϕ&t#6rЃi Cu{p #+z jrMQ:f(àH 0 &|^m \֗<]Q-N[QSL=C?@@0') raC r0m CQ\EG-GWߎi;f Zfji1taǕR5[֑ttI(u5kKlymEMA˔$ExNG/Gcߞsj7 aIwƩC}OvPnG :ȥ `Q4.;X}w7)9>\ݎqgGQ9>p MZirT pgG2Au8q@fŮ]cV?G7^tۑ IkEdΖq&C+( .kѭ5hp$SEeZ [׶v9 `fxQv`]`rpF {n]ѭG'FJ ,N=i>_1)G#$mkBHe]܎CܻBGTi2'& PrT7?t:.j}w{v^5S18Mj $'m 8dn3j<{;(tnGu>CdlU^fiXs9>K.xi{}u$X $6p>R[D,H Ӈ*|<7x4TT< |==s04Ek$/]Y(aA>z:`#0 h4C %9#.e9pd9ʎįL!Ik:Z[PR\؞XCVHJ4sBD1-Nj;V ;؝0+۳[?NRt4XXQh>K)F :s,?uL1jxzd!ㅱ[CM[S1qǸnd[ u%peэFĈm'[[E?= ۢ5K9KV3o{8ޛ[4q  Jkg(¾R a{v;ALQ&XT(bOo/Fz9v&J .P\COkIxh{vh~ժиt B7g|>9g:{m$ࠥY)n'cy8s#S"W Q4f?\qH*/F.Pqwc7X :mg.5cI-hWJn?= $<ICn8Q?cH,a]\.; D:Q`PJeP$CgfR)wdGf2ò Nt߷C߽ll9Y0IN kT:jfGPkM{ȉFklхw"ş$+]Zm"$vv\-G4ښ$uNG1<[1$ U{Tr<'xF^+Ѯy#G:f}GY# fR:46mڔ)')@ *m12h0wګ`%򮯋h?(x7sg؇;¼T6t7 F.;Y. _ԙK Z6#m/OTDQeḋKv$YʝLXo11 z|T[wMx 7{*(h4R1Zn6On2ؐeހ qe\ڌTN#/w1n7ytVn,!9fJ9P!s,VǦzXՇo}o)ٲݭ`\ba]t9aBf^c_ %+)Կ`}v |5R0}}Z?3ws^λ;jP q?u"^0ܭD j_ޡ[,?DPpBn26]q` a٣Y,|nx q亗7ٮ ]={9_ r<O TġE6*N/.)xL(g1=; [^(Lo4jcn *o9i͇G0{Trߍ{㳃dK^>Ovm71ټ[SDb.n]/N"6IkSjٶ" K{>`q ;OdItGaR$I4I G"u8' ':ݺXww̺O07hhRb\0Go6wfcrPdKx@ \*L(H۞Q>mrI7{3v50q@XpIqx~y{zՇu:Ok-~ZɎ.3=Gh>xmXyh6@Qb4GU*XP\d{niK1V9&jNHXNyBjpwMj #HYWQǢbz/8131jF]Mi軩yP]a!쀞`aͥRRO ܋\JV V؛|<|9|sU,tɀtKw|h:OD-4Uùrndosun B9йO| &@p .Dq.wz 3]Oy7={F [P˅#wQn/dPF.w4<7.M΋dIpӄBz 6#Wa,q5!&N0uؘ/?_[Q%d$1BmZ}?Yd թ\O3 R1Lްñ,D$ MEv 89-o%$ԶWLr[G8H(oۯ%'rLۥFzDݻZPD_[]5Qo9XFsK8;k;Zеc٩di T?q쀏i@%;*%\.&ŏE j T1g_X4 00DF"폃qHcv4%>r!,@#&h&J>>Ƶzb(PuS Eunf;f,D"F ζ(XhO4'?1KfHv {ŰԱf8qQ̵3'Pޣ/_pt]Lقu.Paݪ}nBÇͨ|3ŮyyMI˪;|$G#kbZ2qg)d rlciwDCIqʼn2[NhͰ}n" L,EL'YƲN9ԶYBks҈jD9# n0{ۉԈsѫGeSK([L2Qxd N'97Dzk'nc<ְ1 '8C]h#p6xafy•Uڧbœj{ q޿ƃkUv, rP+~No*nVPK]Z? ,w9 S]|b{yw" JvDQOxBF-"3 ^QE׏1M09J65| ez{wYtk0HPX&:w Rο{[+t?b#dftͳZ?wdXοMNb tҵ;+UΫnQF2ߦ,==&; 2?&A5dsX3|ƛ{(ij$h*'>ފWI'ghxQ>[(BY^¦9h20`0m#phj_Z.fqftw rAT_==eMWsggf78&szY; $f7أhsz臎 t^˯TuID8j ;85vH >{>qV5H|۩.ohPFIl|k>N\|ؿNr\/_̽|˽<@F e 0BQudfX{ą%LH e/ {xbz(9Y֯G~;L~"rP `/qLZsflqvx*T'moW_-jX@*UBU41ˎ7yݹיzxU+{+\}Y|"]e\^qK[A΋#~uՃkVԧX#Йk +q'-F0(VYךS ȂVF+n읲-nNY.v@!2X?C%bmn؟P[xQQȧA: l+G'[o!ۈz54{+`3yceԔGilgJJ;G`>AHn^݌}?=ۍn5D 1\c+Y 6\ an PROz.zO=1wU,t/hQ1Q fnQ]l=1Nϟhon bׅt/򏠃Q(tEL-Êm9ROy9x[8~|$:cwr*Q9QЋdFEE3)W r `t]"P^\|!jȫݯjć )'xLLttC߹jqbQ_}m[. ;rV\gžFX~҆-vD8C;{b{@w1쌽85 8"K{T?%yJ߭|LDV Lp{/_n|z='/hc,'Br|E#q³XX0s|o#@,ǜE:΂XiyzخT/J~h n-, #h'#D^LBPVRzQEktK #Y9V\{nl%g Pdv~L*;Yno,:p*wqm^;ܽjw&GO2qf@> ً0WzdIpV/_\k=7yŤ қ#O"7 \j4 l} !y+v6sj9T.{ GpNPߊ>>Ϝ,(#rӵngJorfrG1ӝ: V:D-,77Oq.bt)^=T9|R?He(̨]aBkZ9;\r'\>{?!D^S` :s eՆX2e8UpU.BB{uNGfm;ɕ!\ȡΔމ( +tKEl|S `B ߡ?l[ﴰkYalA7)[}4_ZֽКiNlY,ifQJ)6Cv'j9O=nܩM*,>Ys:oA e~r%a?/ EI3n~a%sCthGDd@Asb;u(`c](9@6r@aK#_'>9""$cr˿x 'i. ؚT[6uH1z+gt`)Sg{GTO=N( O X/Z[Vu+;5`[kgbEx%iU!y^rezM>?hsUr4_,FOCsunjwω裡@9=LF3pXy{ɪ WKn(U(߰2mD[ϓN+LCV[cZ,43֘\\,hK/gproǷSeh 9ޮVJ¦XK`>Mˑ1Ќ>n Y 8ʊ;@ V^c6쇁(5G)WZ~8[;g8#h#} jE*ܸ~I ɅfXW1M8:MD q{9ŕGn3Mn8I2/P>Ć 3fTb,`l D;Y\>^ ԮW"xp[ t,Fp#'? t,H!8fRzN]̷[ۉxHp  U~!Λ;J?'wPB'̫x69W}K+;ʎ@+;*W$n 4OQfh:sfQ,h<G8|(TDN˟RޢBwqGF0z&lIαq KBĚ8BF_%OgsBG) v:f#Bg~.]y#`?cm.uN^::eɏa 1Fs^?sN8~/-5 -| a"W_DYkBoԢM&:Y=#JRozǯ(@qˠb!q '")duܣ)9xȇ;-ϖOs:0<2cW! M[CE'w`G0/us---Dpkx_40g%ޗ\$ttOX.} SP PiJڵCd-b Bzðw}܎䆧,_4Iv'2WP,WY\~-aMh& wp`#B;0Y~-K&)&r\;++ J{ZY ќ&G\'ȴ6I[Yc<ݲ }2$Mriţ䇇nC0q/J!v}7J~g V`}utv*< jVޱxףE#nHۼtZ$d(lUs[h)=6Lq>}&sU*\W^*"U?RR* |%W֠aZ)=[+AjKjZ.N ZƩ$;hTp1%RZT'HbK:)@e(;?_5/Ín| ߭6WgU,a彣z!HڲI0RZ*n(Ivl>lj/b"Wu$=I!ɱu /3ERd(k`v`%' l=D7R?x#m&A0"E' QBzd0ي޻,J5`;Dܶhiۚީ&t{ nf{WUSig-S3tG4I: :ǕR5[֑tt H G@y4; XGCi KcBlȫ_Jy:UFXmz31J.$ WoZKזTڐ_jPC3/):̡tdhz[J6w CI;VP3wRZHđn2$b%7 +ʥ+w */|,X)^'1 S1+$9HAM[zAzb-(DA+#'􌩙)DMTY*d+,"*ƛYSE͏geXfWM6zkQ>ꍬRgƟ~k^WG8?a7@s*+{-)YR~RVʳ9X"{+]nmsdB5KL 4Ɏm ۶UF 9FK?__> m8䙒 XR@ʞṆ՟,OdI-vێijo$|PbjQP۴1 &PBŦ HJ_,Oxm vmS*AT# Sm]rԎQEFʚ#4bx˒l@?Ue`˜8chPKEb=g%5m%#?~m2/,(۞-يa߇m +{ Цh82dK!Ǒ@aBҟ(B:P)l( S((tTx2~LCA:nypI-b h*LLUil\&qHU=CU܍A&T ,US]W*Lm-䨪$moC fz/ZTj{@Xn!]&#; g I$چt*Nmr)/&L DZ@8>į%ɶTauZPl.d*F 8b-u``J8m҆q`a>m0[rMG_郍jh;@2zu`dA#X24plj(vq`h؆1` ؚ-wq1 bpW:a+m4J)"-doMlcօ0 #n\E U3òc@y:ᲓU C`)&i\3a-ղ u83[0؋OR1z}L1bCW+Ab>?qUohƂhs[?ӭ`ՙy4=:@eijF3pHuuZ"7>Eē?We>@)՟}s6W^Z\YqtB.o3VՋovV^?3'{RvQ_ٸɸS嵼Z^ky-嵼Z^T_S|ѧYOOzoq+N2pmZH dY./v4mQӤ锴sFHHW&|7jpY9%`nhlP&~6MF%w͒Ogc8k蔶"tg4$o.Ώ^2S䆞v!,f%θ4;{5$RseʵP"K-Y<7p 䝐fό"8] >bFM3֣(R@NrO9$N88]٘$2,H 2e1ބ`3'z6z D@e(=HL1G@ Sl!?D\rMx|^N8͡sOM,Y[;(43]X%8J 3781jƬ'a1WtOs:9jƚ=-QJg6SYBLbOgf%ʆ<-.v;$xE2qqdsfAK?selL`# o5nq23A/:{3'=β NJ .0-{2ko3I3xSRe~Iy\I.gLG&YF"R Йe9؉U78ODВXS>,1$ٴūG3{|f<]G|M){Hx~z^q60,mpI̯襠^DfW?fLlEP6fƣ\eŘi5_Z=OژGA 3n.~:~w㧃ǃ4{}VKM 5*ͭỉx7cM877C8c):g&&fo>QO=,<^lMB_0.cfxܽY#ɕ. nÙP${7YY2Wb7nUMg|DHȪ. zoѫ^d^%zd&L!q;~uݯyݾ|?Goӧ4{r.JZm}~m~3? sgF ݆ύrȿ=[dcAZnUU!N{fW.y7GCR,z/Uڸ< sFpqFp˄5LvTHU0Yf0sT&hTQF||qq-5=l_/n/0$L~bq~KaR;八YYYMһ!TƘGzVr]N7{Lcb[;S#C_&$L./'&ϗ˲l,Yy/HdI)L_fs18SZKdq \[݉%Y{eM/d^>\OyYsbQ'9꾮K/fӲOKZkyp.k+*zmu-8?iov~crԈ$1s#xF(%Ym< b~[' „~\/ׄ '5.)7eqd>PKLJDŽ*f18 ӑL;$TNO& ^rXFD'C@Rm|K6, O& $a\X4^B+ eds+v|.6G^: >J7tC0XܻƣGREAd!s[t󆾦W@ [D@2XX S X w$ 7R^̧aʼQgɲBY r of5!U tōsBJ^0ZCCƒO 8Йަ27Z$LDɘy @o\ya5~-2FhpO$0Yf |n4I Ԧ>Å4:*WW?v in}Z$p2'FR)M٦(,$ѻ_ps6)l 8Y? 0ʀNdr&f KkpKXx}v-sBl: ڻS-jG"%& oxqCC/}r6K4T<;h/ 3*,J9v[sRK󷇤Q$۹d: HL?I\PۻôN&*qKc"8O3"HN8G,g[Ct&b.έ:tN({S $ΊVhp8'[;/hwgG?|N^W X;tw5fG 7Iş 憝1Hwk͐(f`"JxY&~1m|]$=,V,z&Z$1@^"NuZfy~;bCqUeRE"pX/TPg_vɂ2&a? #Ţs5P[ y!vV?М. }My,-I*` i~(_4l7Ls l'Ӿ\0#w2b`L39k *yi[.yfA |:xsZQ}S6ĒBb)xWt1: pojҊvz+ɺ&(fq&8~q{x/V\h֗t~SفB+NSȍ82O#D+F/V9N9&\w{rH*?'0OnWJM# Z #WW;UbwjelJCUMgG?|߁y:ͪLOILYK3jp20qXѻBQnvw8L@mcING|BG*#.a X+tu=y]ڔ ) Eg ~+b1O,*yEJM{Nzs-ɳih;gog=Gဴ2Yh?P񑖡])ˡju{`Z;0QS^"*/7!E⹷ còO1|ʠsփNߜe `wcs-S/5J KJCG.թXZI X;ty,ewxbl];hEE I5}F+{e!ph@Urn*wz)3)ttIKXiNȶ5/ih\yE/;ZElZs`h(̂0H3t9ճnCs*A(-G]b<ҏq4/B;ݯV6VsOio4_aD- kAl`lxXx> ̆$K,N||-t`qFv\8-Tdn NNK Jk| :[1h7+|be Ɖ།sůכh[\ ڹzݜrRfc<@N4,o9'XnXR 'Ck%'YWEtꎇ[[P$[Zs̪Q*Do20R^{3oq<͙f!F|)oE%; ?0ԁ9Lގux'n[r PdhjȗJ԰K؁esĮ3\ˣ]aY7i-' LfIBA`:Y"oSfkmXx_[AP̳5Ct9U5H$t7lǣpJS@V>XP!%4P,xg$Zt }=DV)c'͇=e^2~8ؖ~0S愆7V5$ M%?[B/, xW 5U Zː<$Ȟr⫍gI1=ܺákZ5F`@9YIZ#|&tuxZ\og' Yoaxݮ5,]sTR<)B{Qo%9IxV hnnG+ Y!:x̸6>[*H./hFtPfwpuk[`\`\(Gz:ix<] IuJ@X`pi\,ZGq^&e8za@ t",![^BEԩx30JsѦExt}ܵM~kpU!sɣ|6!&ihbI8t gʘ޴yϕa)OѤ;u 2OY$'v76϶7q̙. c6#J2CʞdL*R]~ݖ*\ճw{.cv^ -ջsǣ~.˙憔ۏ4j]  FRMsث.~u6fo{w+b~P*}a՞ߛZArG={$St&Ai)Y?x_O񳭀t}nv=At0moFR h|<8xĒ o?ҘBt:1U@.N2D룇l_S"aVeB.L%t,H n)U\xiH :$KcUMX0&E{j^7~#!/(nP9_;q}xIuyVZaaֳ>+2٬s;{BNJV*pRm%&Ͷ, --%Hm$:Uw,x]:=]ei!W`m0NŲV4V%y}T&m}]Kʨq"2:gt)E{ePij4Wła9ˌջo)RuMJkmbD֦ȨmA0ejy-. T!QX$ZT_k>;nG}!%#WZT !KUO 2 bP0g-'{gmNp@Kpj_dpB*ÅcUb}=nҋM-#)䦛ppx֭i+ <Ymzzi5(Yd 2t= *&tP*Ù, F@PrA4LtLީ*CN3)h^A3l1(gե,eY5 I3s0=B 7_4Wqʢ:&Ol梡T j'<:椦ߖ.O&d&@|Si̥hP9_ϳ;i<bvG>-&J -t7M?b>NvY62yܑ*R ScRE((KE=cߛxY7u!O$>L!t41ol_ սH9?=_,܍t ܝ:&sQZC>'r1+$--x5]=K+)w_\OS/p})dk>x3lGv'os$_ɣ?7ޤw~';) ZBܚJ0mT,L~jߢ'{7OVUYx4jϽ裫uMo=FDo HGEu ڢIMrGWiD;zs=rW \dQrLƣ߀O).UIV֩Z ^)E3\J`_esZM̓J` [) j P.+4joCXXO)Jt`J.Bw~iט< ϑ{;awiL´U1Ǘ\n]fv[>okaqB7ѝsr'$+\2lz_0#;]ZԤU"Z2&:DPHh*zE{ޛİɜIZ\=?Ҝ4& oS3~j]Jlݟ8li獵πe. ʵbqT[FƒTX&<3x *:s5=@NTk-N<Tl*ȷPHbBrNѩJ}#\ivjš.Fp,C5iint2CU @0 ٘0M>v13Ta qUBI!V #)ZLq7m Rrzs=:\xM&~pW<]RSu,'d+1gbo^qnn.oV׫M`!ƣv/w`be0gWީY%ɡ3LGmvTN:w!^}a4z_SaOLr: :(S@{d,bUC(Aiw)(Tq-G衍6+A傩2 .R\W?Ov_tuA#,ۯ4%CBe :~`g?iP`d!@Xˉ#q99bx|$ӮaP@&Q6&]pӤsRR#\C#K$*rS3*0rΟS=Urȁ>ߝ*ת˒`DmJU2h4Pi>_;f-h ۫vX '.ss eK'_Wev&XZ#crBKKU E]`ϓ7q2 =zs[q\nQ{V ~4_ 4$ CYYʼnD!MqW!T<9]n!䇻@ZH&!'I9L|3fpmFJA6^3òV9Px8ҒdBu eT̨܋T!DF:9򩿙&r~e) |B~ J%Qd-kq,h)> 3̲-2kV(hU2ip/V՛H'U_s\c[T =gIk|[QʨK:շC\wDwmސH3,a]߻v$ԽI=f\_^Z"`b dT eъe1DžW ( IaK#i]_E8(%i"5s#`pj<%$1:ُ%QLKOU,/ !ɶzR"q('U>D":ڬwdP7"%%:JnOJ4䚕ݮVAWCe&WpI5!7]P$Zgt pUEs"挶@w$0`UZ<{ hhgqcl%[A^*9eS$W~l{q!Pȶz{?˽kGw~vH&SsB A(*Ejmڍ]7~nTTf i,`,υ sc{5]5vw.ano0r.'Pլa̝Cd׎ (4z}="MPbrB.@F_s6=.\oZ جQ7aPwx~e!),`˥'a<Mި(φ~Yv~oyXTAve A_^^_TYLhW5KAJPVz3@{)΂p[Jn\?vZۋzoYM)J25+ 82tqDN' Ƨ.z@PaV=x2,)&3F>SDeDL@}A]]ioA7jQzC*mlm_WZo97;r_|5)gb~u!28Ԡ49#Y@ ?N!3Ӝ~ S\ dO/0x 0w 8-UXu)^0on_f3*Tj $UړgE M ^߫R3DSKj"EZh+Gүښt48Hey E[yWGۇi/  }8 @̲I8bgߒ|Z]o-Emx'Z'el,n4nˋ/uQ}]{~U9/+D(032SI&FY:VtYA{c{̻߶o e&b)Cj(U(oLm[;Gl#sX8t 9Gh<4+ų ۗ }2:jM=y[Ds]*g3TP4j-U^9&O5*^60/y|G„ҮieCQd53Vr}kuOt˟C`bhȾuWxef2hH\:([ȟֹN]OզZ vZ/=n 4 S7E8(p k>2hwsM˄ _OK/LtqjFl͊RaN{IYVc;O(q[C#j:Xß ޵kiwxfJoKhU2OL7. L"^E*5D /GOV/f]9a.YmOяʹūDB`d`L2 f26]Q;o"$-wg#S`6' dTf't7I j=vD<_ ̪Β"fBC#mT[Kyjht j3v\v k$J~eHG fe??͝ȋ^M~ٮ3pZNH3S!P`K?J1 4vǡH ~nÈ/n/0}WP|" B@C%&ArF$ڜm*fĬ݁pGK21$ b۟JdlĨӭŔy\/LOM2 #MT#ӱ HOAj DdaҮzseIO7_*3cve8dZ&J=X)zQR3fgkE_Eb&~*v|$TI5N峣V5Inu7eeb` o;+9L+tVkq؉ؤ⮉v z()c52mZur .ԅB`$?{keYLCKSJ BSwݚf+$[;e&6RB0`ՆD @&DC{{Pj<07yiD>jv`Gkq\y*[Ztb.ZLJظWقw"Ć)"t jCQ}韞XJ>]jP=y<(m˪yAe'XviՐo.ymvg`J9LHT`@eWj5Ex:igƅ u3} RR+U< P`JZ.Ջ՟fܼU"\S[t/a7+O[cXb48{P稁oj'ۙ\WEHF[^ss{&81PcoL{&W R5/E. ;=WLN܇6(Q"+^55/ T(yeVm^b;h t Y3ǣ< FLThS'HBaPz$i\wUÂA.Mg=VęnaUS\Oe}?=^b;S<}>j|Zk=,Ȭ˔K*$Lc+J)Gjln QȽ0/g),L5A^82;V Lѩ_\Q: z'`~xp*WEQּBB>L?=)Jvw>|hMf%f{SFڙ=ke oߟg>-FG6]c|{*Uȅkv2`; 8KQۧhJ7En/-&"P7#*sN}@Q~GXg+GUX{܋S綮!3 +ކo5xm5﻽%G6Z#yY֛,^[d7- beԏ f()#)bҗ*~Uj7ogE*T%\\>͒8wVk)Eߠa*+Ӣ\ "$x`- pjC]ŠzyxnC^CIR D#*d7 wxRHsjos;G%ٯ:]+JxS0VTnʺz5j;_]n|S-@R(K8sl0JO2:91,1GN\AD,֥KBqF= h*7ؤgxC*fyW o&bwxͦ71M}ikX~HQKq5-6j>X |9V; 6O UQCA&p$ DN0/JvfWh)c͓CiqQ޽ɓE)9~ p&m3]W- 2XzH$d&4qIFx=/6=u`:i5oNnm@xM,pIPXPiL\}^">vhIb+LiȄLmJF%%c:meFob9siܶ,ieb_]5]h)e%sZQ&mIŒBR c9u:YHjW}J!t)H{ $T.m`m(Ck2W$+ZOqa|G]0W@j4 4oO~.e~YmG2[MoHG}m"gY0(o@rD '6>ǘ8*9PhW"炙 NsҦ6-5+JF\_Y ԰qL<|u R DZOXPQ:dk b [<.I+]$g.X tLRA%AeA0[6>$YFG+ 5𤬥 CLDgصIsM͗:~{_.l엞ۺ^4AxV\i98X ;%M*Y)gZU%*r o\gAs wd]|\|-v'oag|/nrMni=Z,!Gv0?8zJ*(3oM[[}%,??A᭷xM SPeŕ˰ť__^RAYx+t+q.LAWʥR]L; J!Kվ)xg٫_6?iHzqrVqkFD D&kRTgA4ߕ7y!9Dnl[86nD=!+]bb3<[WE][Иy޲SN|*Qd3XHAyi'85=An$Xa ~67W6vUPoe:ϋ7wź%rjosbodEilao2槜i懀l|WMz.}1HɃpbpq'? W쭂/Ek sv{W0/ZcPOq%ErKXVG[\NWw) U18L$Pqv!9:\VkP˛%@3Fxces}%gYrIn ES+ǨN(*>H!O/(-ߟ NZR&}j-nxZ-ZW_ypR_H`TMIj{$%VvU6gvf|G~I46wTb-PJːX ,(@cqP_UNa-C ?J UCD#^D0|Tc٩XVIH:ֶ+ * cNIfE,l+=/+F̖:.m{W YWFEٻǮZIs D\</&􇇓CkiJSi\J$ށn Uj s瞰"'#=[Ι?;u6O%WoXFTȨ4GLI``FfJJdFU\KQ*? t}̲W,x02 rb,)H7cW,1>`}H\K&kE`QL(&;*DIf"XT!`w6ֈ17u"~A]b9eMɲ&{ ˘`5!ovlQwT>hwl`vXarĠ0IXT0wZfq[;XEMY!C4+V* b` u-P2z 'ZOx ?Mc bs*jo!:>8\f</*T=*Ud:AD:Uwi~\R@<)hػ"SA*L_lp4^)e===a20ge˓_"Ql .G`R|A#|{`}/nUq]\0}?*D 6z!2.bD=$U]#U)3t| J*Zԓ*:5cp`(h |1+ fg8&Zn$] ?b_ܞ7wOte)%Q'M:iyZHe!L=T"VS&2ڴBMg^6=%47ݳ3IUJԂRjB0(OgSԕ*q(OM(&vw^VW]3.YS"1j$Yirub4w]:eQPp |nt9F6lP_,_Խcu&YuͲIZ{III͢-r{k2iɪ<`~Zk`aeq9V۴U 3vo tAɻ[f~GhAdq(w:37`V}r06J&de(ɜwX5@= 1 p;"AO0`@ r(Etc2iNǗRʸ{oʟO1cy YJ NuOmzy Yyz\,۠X(߫[=N!=l/"o=N`6$ʟz`q8wzhy*R =/Q?-LT⳼l) {#nϜiO7nFW͒g0P1i彍C#(:Kl{i?|)N5\3-@IgXѱY[ζYyW#8óUЭ:!S'zw,qaQG:'Rn!a{WzM. 7dotgn*{Zi'By˟©G,0TN=>25MGb4O:ᵂk[y9|.^]6Eǣ/QjX9 JA?/UIxυjU;%u݌vȂ2eN ĽPzlͺKKE#j*$st!8(u-%ya[; QY l)E yfC"ؑC($ |+qyli0O ^tb6OfnQ=6%j)"੍TμUT 9a"tc5C$UFDgֺ`q$[4ftAT7l#;Rj.eF`P`~M$GMp(:c_\.T{z9.%"a]q6\\)ѭ_<{¯~9-.ެ>&>Bk0WZkS1 hVnAM(k:/?@#CP%f!Gϧ 4!#2Y=Qi'fDM'$5F!,B.̢#jp%R2.bƙ{p9-L2*z KT4yЮ,6A75pV{ `bbqxXjcҗ}BgMAs+_Z(-Tğ:|KkspΈBD_c }^>mv:y,z+XӔ؊2g!0$ S!d)cNo=b |w gtٝ !?TD:j'LFUȐ]JdZ098mS9|/n,>n =,Qo2K=`sD) >tf*<>>@>; ɉAcu=d|5ɷfd>s#'RsdeP>$EW)搈SX`C&jf'IpnR *~+wȃIr euf.}?ouQӺ)Q G㧓m>%eAc;تK' 8Ll2Olm6ϥܫ%7-;6lNZ֟5 x٧Hj+<sSG}EQՈ\ BBt"uM1ave=Q6$e`Pd-@(7.Nnv^"\tB,p e[٪i]GϧizM̾%::L 3x:07^7A;H*\DN]F|7yOfQuGd%i8/OQmr~w~Dkjظ3K]DZzw$Z_T:9hkFC1)_*@*Op#-[?R*'B? 9BBcr0CP%xV35TgUdK3]IW->ݸ^O/ЄrZƄhXT C@fّWtglj]*v`_6!I4 %@ ĶXGw3dvjwiG܎X>daR'%+TG}m ,|w#YӓHT=Ӯ0Ju#o G7i} jFeX%ԹR:G&Z3qⱧ;7%\[ +d> !r31 Ex"i{hCWNɵ4]F. v7+*jUXE(璦?rN$YBq{k~rK衇WhR%Q &d;LM'mQJby@B31dkj:1^u@-ȪpYW$<9hh/+:tP0"&jX.5x1C?_fj Y\n~3|{"NG|י}͘-VqjJR8;Ҭ?==HVb&B%L;E-$93,: t}ް]m+\Xρˇxt.!DJ{Xy P M$<Ϟ*|xklqՏdEzhtfzcNK>-t U還RⅹJw4zGkʮu^ʰkC ؾ@ qb\:jLsBܪq\?ȏɫџv\_&>W+2j&t&#2r'",N !6K7Jn7CZ mp6`!h%X#T0%1\4LRv>H.5*RCjįNseus)f`2aCecp"\x^/F);J@e:-w1u^y* cX֖p6/kch{ݦ,RcHZ<9bΆph 9 p*v? 6o^^[O?rݓe/rdGP[YEnDp([0WwW93(.zzHmV` Wq7[͉.;^>gؙk ?\为 >}Yy?{o,2gmy-$Mݖ=)s8 J/mC/-Wp)-ʒWngL7C)R J(.l.057>V7#B42 * Vܳw7P~?;$`AΎimTJH<4EpRi#^Nµ->aG)DX\p8'm.Q. ) GGhhi@/U<[ 1؊Ci=S3x"@g>. q93*{Sy!{J!I!sdKLigc7vz;aEKft:hSM'M=L bQF7 FNGW[P@\(h-T"t&HlF-/G;* bFS(&cPĭ B'm9[aŵ*4e 8uAֲ?A#XkIaQ@,R+e?=C|G}]9*Ⱦ-wWO@ͲɛQ6(ҷ h\!grr*չ} F!T?%z|r=_b8mbxލ)4!<6H;~B9MȯTn~=?oAOy# %)" GYWf<ۼ>2͛źaֲU=\Os @ VQ147HI͜[aW0:?rb[ 6MQ y =Eܨ-&$uo@@]b Q|ZP΍"q$ǯg5?;po~gD&EFB3›BLN&D] H!9BKOfQ𸇥{BLTzBaB HYԞ^׵H7n$hT`93d +"G*uNd\yA1Yv^c''lQ<a{PU>͔K9iې*4Γ?]S@ct##PUqU;*cŦ76bd. ,];,6e)7F=;Z~r4!\놊pћ=(fJa;q!/2=xEjMr I0 oyfuU]HdgMecp%Ki`E()KiJ'b~3PU oo`<>Ra1r|v2,Ԃ|I)KQ[x[X@03)`~}0(&"Stpƒr>o*u00"Ei+X%c)c1,1dz29`ĥu9L@f%B;:N3 lhPsW-[)1550i_,VOw+&G+@u5(IԚnRz#Z4ǣϰw">JjбiwD&ϛa7>bm% N3`'k!V,цP:<W '4̑acCBYYQc!_Z($`C]>u~ wqX@ ̋JYdD T @E@DP%_>H 9l]2vt>_]͟d8!kEIRw>2-j0˹P{NT,8:yHnQ?lwO%ՖCB@lzNĈc7W=xE^X46"goWYSF¤κDv?0mn6޵='%QUؠ}=63:*^c:ѻ[lD8~ИfxDeHfEL}"F7 ['[=t߼g)n /}{v}b;b&p)G5˅gCٝb/ﮰlպO7#q#\KA{mJ<%| E:OQ%UPXd\jSdrv$q~^ײdpS]N\)L1_a"/QIVî ,Q)@??(UFN'_m4+"SJ&9+ ORrPWȩm{˪+n %8֗BTćL%+$Rz$$4>E4T]Moz4Mjf>=zN"+sObREg8]rm f_Pm+|7h5C@7QxN#8~Q٬TUrGM((ٙh|s>Dq~zqrQ~×f:m`N G>)@lh%oK.||@BuֹEm\8 ^a #\\<&..,|2J4 U(P*^| čr},aOGg[$U7g;ߥ;_<ɽ*dsKj|Rw ^">PJc4V*67Hmy>[ #ThûȐoբ+8ǎX7t{ݚ^ު@w`t}5g_}ն0Y[ ^7T{vB ܟ>vן}yUe]64XAXpX^竊W1Ñ+-xtb49reV(~-mP#𛣱 ۸5c9ܞ_  gYJp K#!rkU"ǹkJx@r#ըi3j:糿"#TBǮ0!8FR#f^sCZ+})"W?v:~>>#8CHEz*=6ە'q=ܺC{ޘYHa`4?q5Om=F(U2CbŔ xC"hy͸b4/yX-Ĉ^fWօdDIl 7ٱc3 qll5oa,~h:v<,(W+VLI.p`U~u|]NNQ/l<НXG;~m*Do?6zUC!DE{B'PﱳQ(e=|>ߡ ݂#v NRԮwa%A>={`jJ 綪rR<2\Po$)BPB] Qw\V12z R֠K!;I~ft\9։y9HX}MȉERHbG7(fk+Z_()әUSL2@x ]ᠢVen)qS sؐA@kL'1~>PRHDɢ jh쵳hWZq KP")28H =U-Odݱj4-Dő*g;8@^a@us*{b"NK vr!^`B ip:uiu x\cۧ54Pcd{./bu5G5CQQ7I>hy\^T{~Ix*$5\9%r\-.O u [k$֖|Y(L#ATZS,'q Q^j/QpWp{;lmt"~UQ+5A) C&sGhɈ(KN0~EnxQ:"MeQD'$Xq:{t\wY{!q?O7VYfr@KX<.O*5V X'%۴%:XD[(M`W8˞`K`r,n4٦r LKceJc@}F+ 6VƐ7߫Qt! -JWT[`.% ѹa WWx1֔m^1qK2}12 x2F&J""Kƕom|Ј-DJIj<'xxyp}g]BWXUWI2 )Vwaw丗\4D!ЁN'oOI]/ bƜsALt!zR2@nls&;*׆.vt7gʲDh)vzNyz2Y !&l*QJ Vl&mc69څ:!R%WGbȣʭ h 0t Ҿvf0 US"[uW֬$?qjLpho#k* [.RI#7К|%ŗAe粎˂A!.v쭉L䨇 aۚ.G(nj5H%ʥҴ(=\#̈-IQOd*ɛٮLnZʧs1 \׭"kn1\r牺C_=ᄇBͮtd$(?Bʱg!K ZL*xl.F Ek@q⨠ףg1#sedՌ]"^UCg"V-ծ:03HQe 'UR JܿgN WB!mmTPϳƢGxU3Me,|HsV!2T zdV*'t@,@J'6r@UXŵwQ-J3t:λ\ܙR8Qw,'4Bc}3Mۓn)[@MȠqBILpdk\VBzOY:p?&HiŘSr>O ~>‚ /ׄ;.[QpDzT d.RLE A?K}~ru2=g|}0x:''~ 1P^X`r>.h /ȉ[Assyr}%K*ldžv_ٌd0_0&EFWՆQnF*gsBp+j(r^;$>V+IP /?"=2w^9lA@r9/¬>U>] tf8/Fdb$obͨ۳ՙ',3xS].Z_,d셚қ}׋z> dt"MxZ[>)"v(!55M2rcɫ,Sºd^wyQ't3XTӘi# H'`]Eo îIF"v՞=gCF3\:X[qBmV䅕50:_1O·|ݠcC4T6ZKeD-a !VeW|$rH"{j%ýfJHoE G4'#QaQřNfJ5m<".NK0⥇)(A CTMhZ:82o.b92ikm┝KL'D[Zy]? ofszB:+SCД}Mn >}N"*GW^Da\{JھúaV@DUI:Ju:$IH`: UJ{ qƂJq20+>L^Tf:]>lI^@(Ky"8'45bĪFLW4/sK ՘oOvoRiہɷ?u6Q-祵5imRy*| ؈iGܦQmoFnO#T VQ3g';:g.BVc Lznº@Yq('Na.PRԞQ@O[-BlxfL)RD}J`̻BRWck* Hc8YœltE;N.\1SIJCRpgR2VEܮbE9~Ry ><Sz^$澦؜;#^B1+Ή8-T4& >&͚a1o8SOG=-$HpdE )nc^cRzEZV*o:mi 9 }kL'ߩWCDu E$I!t(0OQe)KH@+cu֙LC720[>tJXKVX[.huG6U1/V>-n]_Bɖaҵ"'{WN~z{p5V ÉHl4{(gCP}Uؒ/V<|NGWG^ &&1t L'ټih@0ow6ۍ_i_~v·IWV[ֳJsAXf!ѓ'TjF֗,6:ni"xzYKs_n%!s^8]Ċr8?پ?~w|gٖ0)>]:/ #ShWy/w%ͫ㿺1E\1м}o0o\;Ko0Op Xމgxo2-73|~bU @x5:]UC}SOzgͫw.-<"].WC_v,`G(Ać2v%n׾P#_&B'M򦅦y{G"#(q:ϩx( E$8] !/-; -C$^ b4 L,/ωI2ҘuȀ&$@ֱ0L8\wLHE7yn؜x׶ 6oV lMHe!-UZ8t}^f9z)3Mx9Pǒ[2=aJ wv[PY;fv_ .7z%jYpk\ZY=HT(!pw"9$>}8:sC鲨p??:a181$b,f;JA͞_b%Xl+%?X5ۛ$G%/IBT0X->wDu$.{l d:$b[d JULmJ0"lYL‘*i<y+-p"BPR̯: yqӰ;=,6 <nn*ޛgP6[XcgLXjPw)soոldl 2*텋کY]?n'k/n]a$Z??hȦr.ESGX`l>ڱ pq]_6,xUxRRsU"M%e'%"Bvg29l25M"_ SsX?m?4 [gyT)@)N+J'_]>Ј4W2^㨝<[E³5`ɿh~˻29O%m Њ&_2?NsO>RBB~|^]=j TeSa}r"AFϕka %Bz;jDQYjTe;ҬT]:i ]OLtJ?б]ES>U熶j 7 vGcK~x0k뗩6nJ9Ō0#5ޮJ)D"+0?OC+=WSPf1G K:6|ʬJ YEҰ4'`}ouaي_~b^8Wx('.D"Mr|kvjv5iZ1LAsᢳVE >Q3"msx 'o¨i(#FAeBOM>:^ 5Oj bL)2?xtvqQ]kڦVG"Ԩg3l:a߽~߽/k77gp>˷'[>[Z{xA"``GiL ^W E` >wA(C?fP dZ[}]5+TSi|(+3Y#/4v# DmKS.1aDǘ(ȷ@Wlʰ!3nb6{#CB Lt(櫫''m%|Q03K 5)|q}qBlO'?P J#2hO0^;1?q3`yaBǃsI{ R ~\sbөNèA6{˾jWٙo6;MMF Kl}*0].QpM`iq*<݃mVݍxgto@,ߪ%e_Q{h({w~oBңgQ .+T-fȷEߢK&}u2۝ءI2z?AQ_sXպ@B,nPe-F[h<(35 xABF "џunޒn.9ub vǓ&B+$7Q"F ]$)J;^~<ˋ5Tߋ0tV7ݗ۰ZSS>]sL/lpx `qtϗ>މҶ*UCnX+6h:Qu[NƬC+Bqf!Bs)LA^vS}89oğGԦUk6$F9=%ќh H"0wD<-!tr|pu#ٰ[6!0v;@\.*D=i/S pnSo#R7n%GXw#J{%dpT3V4 Czx.0ut[(_ ,N{3" o1 Q axQcdg0b(%TicE+]'t$ Flj .a͓-xc hwgdN~Gj9涜ǫ[ޤ 9 S ^Zgtb͌Mo MY/qWp?l#0SC<N.}oZmE~Qǰw㓳?_|>nFtf~*{־J(K$6D3E!R~D)w*bFHn/>7u1hK6X%]<Y)'~'4zvBf.E8&V@B!2G Nf?sHdG"!a(}Eb!@RA"6 **Tg#:b=$K~QcM2: 9'pk3ӔKD ,ЄzS|l}?~Ѱt_x39!Uu;&.s7 _VG03o7 !wDDVS&DSL~~/|ۜifzpq]1t1[J.LIb]x_,{iAb(<\'\UF 9^;ia?wC>-dCPc R4׀r5ءki&F!AftchJ~])jKU5x;na%曆~TX$qasLp;r-wSVj2·ţ5{p۞k4㝱{osG9^'Ş`aQ Er%85pjdp ;6f.xy~n3gZ"@ -obYΒ_WΛ` 2Rә5q\{逸/'"MvMHB i=gAxYc^2<P,3pC(Yo e YO3zj8j:vέ90 I:x#`@_ۮ d8LF[O^J$y}Bh>rp!w7ץNγ>tY9o/72[pO3W߯a~='4u0YD7p;Jf͂"]PYc`CQUcs6͆kN/9_wωjYpk3ԧ\£ $8b#d>u24qQ*j1Zz9Ԯp! M,=cc@=|ԕ,Z1IqQy8 (pG8)#? Z<d[񒒹fwr"JM=ŵѮ6˯?GOԌWl/Ҵ3#Ͱ}п@P.5t SzZטKvl[^e!jj5!&8BCM9žEFY7x/^'F5= Nn0[A]P /O+ b{_.ZSE L%0PffsRZԅ.Jj~i)=0Eg~` ' `t>}C}d2Dt2$8#&V([-ű5:If2vFN'w?xBjK;xvEؙ:"G%#jϫR-.R8&\=>Fm&1}O1":`rd<-45]Bth"DKvN'惝?yO!x"XyY8Db%^|Yai8v@]t{0cf%?t;Ob/U$n[4$j@l&ބ;8̶,m˒lYKJMQ&w_4=KI4Yskd X:%/ޗ{DPEꌏ xw"nG^}?*#{#T}}Ͻڸ,3M ){~fn]6B5b\@=<|>}: Ԇsp%m3}>*e 8'.trT[H!؍},//:#vh# ^@1aIefU8\?L@\ (&|c&ݴA,EdR6il\T`IORmL2MV' XWrcbӃg ș$+IG]v0(JŠKQ?^M Dݴ-3DN"RW z8-o˽]C Fqb >k19 [/h% MOe?}U!옱/w~pNg-~>Z.3,=q?hQQìƦ ]41e%n7<ؠ%~6FqjE B%@Hk\o67=ygI$%1k͢ LP -Ƴ~&=[ B ,Q+Qƃ%90cޙlOH~@\ ЦƤ&6.ԙ:ߜ'BQFi4|܀ PEM*Y"^6@hT ^<41,Ɂ4J1)-*N"Q/;eDY(2r>me~_HC'5q-w]oҔD*֕(KY;VRnau|A4vEc`.#HW9{*ř%1Rg -eZ1V(泟 G_?9)ϗy:+jan`F-^]N'Eg%Xχ}rkS`45%`BH+EPhS),NTB`VMx7r!$&8(8xbޓVlhݸ#%:ǭK(\WJG˳BA7vd7Vpt̏72q?zE/=,yAD3!yj$f=x1en/܇d=>ٽ8tj}Zpkr%MSB짥't^ öZ#VLgV-FKnHs uFd_F۝#-sX|k HV^R)@AYXA[O?ÐJ9"WKz |osh83Ou 햍 }S:Fڑ_eeN KYaH#T~Yg0 3i[-*wj. x]HR9dK>w!/O@|:JMSСxi=eA"f3&ݓ2d>Lt4Q˛ߨu$^kĤ]x,$mZF$jPQ {.Aɒ|uSU WTsԑ//D7} ~v5][}c^DE!XܮA"T 5 %@`EIB3󓽬C2b 60%MpA3'؄`#)P'e҆#Cj6cGșT?*ycOy0)ǟq|êp xJmK{64nz*DZ5zQ+.lDxeI[HKP>)F!ӁT?6s8 hͪREVWQ%7Sa D@ [йʸg#ll RC5i@v *"՗rD}M_#u)O,#!`&*13w# 1[.'tpL$9ߦz[8*Y>xzܴŐCm V `&v.)k gABuHEWfnbuH/˩M%n=|iPe_3 wQˏr|!L UNa( KVC "H̰Sj>IϮV- 57\z8%oݏ;O=>hO@ Zp>/À{StP)C&jŽ|<)g>)Rs|tSG4wؿ6ځgYl\M,gr|D-)M\TtC^վk7\{0Qʓc Gg̱Of`0Zy+s[Iz ѩя O>mvSBʎ!ƼD,Z.^PܜLPQ4r~!]B;[I]|L9% u%}Y8!o잞)YCً/ߵd@eB3LB'C=_^@G\4c _ qbI'D!M'Ԙd̕4;yn[b>R9[B7HמwihEƵhD[ Q)cqv2kLJ XL& :|K#a|RP{ZlF@ùZ(AnZ<8j8l R3a*5=Ih kt0co3JcN* 4(xpq6C kcِs;m=1Zλ09:M)\T6Òk{Sܞ OL]Z2?"{upӞb3o 9iT>47cFSu=r*%EuhSjdXx]7(xA%Nʜ%bSP&''M w׸Iy*ü,L۔`!w{aLHOMd 7k\+D϶Lst K9x^U />i>xĜ6:[ cS&`GV@W>JLVX 7֐[hw Br`/.izSFccbCG9#k($IL;XKvvClgՐ2+n)H)}( ?7NP;.}?(y%_殆e6))[9\z"/݇6տs,Jľ¨1K81VBVUM7",Ǩj؜JDZ,d4r`ܓb-|V9С"C_^8yflI)C*d-D?c`Kn\):tG qwoл/ѸvϾ[wmȇ<>Y|yM.;;*aC|"l#g0x؏w|7G9;ɍ.hL@ɴU>9jЊQK|@ݶ@|h淕jl4\v+͊!̄%* ̛xCU2(y8[~Cֽ}eZ}LѴV̼Nd!M8/W9 @1Ɋ p~ɸw[ h[Zd]I*%Ìx= /[.vc,^~=R$u|m[I(֍ $" !XC'~$. 7ٿu@gHݫ_^\@XɔKG >'~8 HfG|jabUa'p ep BNOt۸JnYcF Ũw*D,a|#j*9'M_>רʈ囵TxSX7QW{zZz[Xjl泿S_{?Ei[*3X,6p1zX*j#k6=0tV*L\u ҪGw~0=nV2LHeI$Z6ºp,V^ tT>'{Jgo?_kܙ Rw?m &#p'urصag=hԸ3jv#@+]kŜ%gUL*Eq[`MS%dkn``o6Pc.iXNY H\b\ZU(T/uOeモ3mϺY ENj:&AARO3K&BMD7Qlcwe9Sh=G ;z` ~o|#q H.Y,PX->T^0"Qx4ma-{87Ұ_۽x>󿛴q!-\RC|ۧYFYc؏ؐJD( ,6sODf]}rx E+w V?_[a͇} Hsz F8K7Z|hNuG x&O[m?{tLxE˟j,.NJX=*(h>BE"Q[ TvVa$TbJƴLa~VP~Tќ=SL]Rlы.UwU$MQrsCb绵$f6R< gg*K(r6eϝiTgC {\F BnfWSNp=nJ@NDdyY=].Q=ȗ_}t| zA#ɢћu^`Q!X xGy& MMbڹs0@XRV2L#O\08Dh^GOW-eF (tVpy}|e~ -]a5€'WBpYJmU3+ <:yɕش|c#|epb?~Y:K"lxİJHry4 {0E#<ntp'ԥ>3+ЊHaS\F<5Zw&t/!Kp^+t5l[[c JdxP2^;,w`C9T*4چ*1mG5}dF/w{k$(]{gz-ϗv? \ch ߸ -0(m@@I"$SƓ<" LC%bcXpUG310H"KX]4;򼜞|YkO\ց4я\MD_4u>o~{ӟk @jؖ,tR#Ǩ)Vo \BݴN wCD4L?Frc?] } JGYtgET36'*L UR=ƶ"o| 9+w#/o?=F9hGЭHyKUe뚱@Cq>Giy*碁30)\':jwQmT`뀱.Y-ŋ=`7 tォFMH𤋮h='N`Jv%-\ GGd#~Elvxa~PU:hy%S$(S%bHQhS~]nyQz\ޮ?U1NB?UzYcO.O&;NWCPxcώ.-w7W?^vjqt''-LHmV/Nw>J˓ӳtr(NOQ84Eg8-fmu1$`J d 8Y0MK~+!ƹnZ\?,OJ&ڳI!5f}Ębs|kMOLxsӓOS_x;Y$ͷi>9nW z,=:_ ^ Շ˧ڋqk &b.D_jac߸{Brfm} bfWƗqj_So7ل_ \k{NfbDYsb:P#ŭ͜z8#RH ī˧9\zb=,,tFޭ<4{ڛl:Hjd -gPdbɀyPqC?cIVO'z.坄u5B%qe=馔@"9նooDq4qn¯s'/3<e{-J`&SE1SQ$oN9#ЯG@rVۧf=UH3[ r!ppHz ظe}>ӭVR5qxrphkƕdW `6IQ֚I(Cme+):&El :+?H0u>^N].zyx.`ζ-rk#:Kb?kTC'Z&t'.{Vd^D- =jQU 6={aAdg7XWd 9OpLҀRQ3Y7j}5|bd0?`M1/ާӰy{VԖu 315u2SWyM .>2ؾ\TuƧb9xmRfT?~v~zΞkIo1z6(;z>ޯiq֡Mls4}P1/P>rMFXTNMq%#eNEPogo_lSw8O,V;O)($QtL*-KaSuU9a6Sh>JoRB j1#h\$'u8 1Gjzw*KU7f~MY3Ň4[p#`橗S[ԓ*yxzEߤ`HƧ_r?CTM}@5OFSCL¬`6LJS0}uUUzHw%+8!m.̠h@VCJ͇-0RI̩ˮTyr_Pl(7yZ'eR fcas/;"N/WS"oޣ#Bk;edV\J cZE}H=<-|,¡0=y\Zcjg4 A1x#1)2z*v\(7n?:k3Gd@CBne3P!Uf Y#h~ )%_\oDsɲ%]۬?ڑ!ފ_-7^vԕ.E^=_ MܪF)f "W!vwuC'W?Ib Pw{gAGb@e r=\_?;,VMZ% J{jDk0>EX cc+bCX[Z r>TA&ׄwF)|p>f !RRd}×[:bZ߲Nlw0l̹[X\ ۲uN''e$,R ( B2B BBX 2@Tބ/]p9R[-B`QPz=ZN59*+>h >?4 9ͣ|):l"a:W[>X)]E8%aΖ>L )Lq_5̬.K;X\<+bC*[7̃o6ҾzAE,0J3iuft>HlQ`=Q!*v "43W԰m"?O:.2HjvlQ4dF <9&- tLxX &}>PH^Z@!@ApSAV&M{NbmīGTF4d&";ה ,:B~́8Tu+F`}lTa‰k(}x8SO6ka֊Xc_5UhQ,d*8`"2R]TV,L UF8]eBoֳO["twY"Pƿg/ٞm?Ίm͟.p9 EY]"FfZQ &r|נğRN᳠O)0e!BK)uj my):B^|~Qe/;/AKiP2 *Aky~r\(!WSG`~p]vKfbCZ.bI> vϱp&x&ʊ+Qd%e #[*Y]\s`aͻĨȤW|i_qh2V.hJswJ_o/&XWLL.9b`>sX,E*fpP`Li\#I͘ &fI ǜ /F!Fsi)rlDuPd9nZI?&5yiZ@y&-PrvRb04-!OՌZkI0S-@ ÊLA}EA:wc4`M % mrR+1LQd6 ⑥`tB m`s̴o<=-5'˱+<6͇vpwI,wrxr<+K_m┵$Mp,RPxFEL${Ȓ_Z R1!&#}ؠ,d7E'U[k);9|wj"˒ ֔EbT<8.1=R[{bFGN"7*3**G˰N3_oOК,u脎l\ayY%QS2D4 C6eGiCO) z Zeqb,0]DCHIwny͑nZ2F6xD m-CÉSy@oH7h["cQL@l.#&I bL6}b3F6Wnoٗ(K)YmdK,*o{GTSK Ć(IW#G%n^s83N_rx*UQRl66; '!jZmb.t6^zeLGLa6/JSd}/ sz/PYRx)nDzcWP]Dxֳw|ʕ/4XEW^9x@}VA2djy;}쩞#XR:cH5X2IX 噿Z>7BZ(77Y a,Dp .(rp9aˋe^wvNC/P+aɍ$0/6h#h.c`}1npuZ s9̧ċğoqJ?ڋ,4ǽ"^.L'i!rc*\@J؍֬dD`gfY啰ư+ i!`h^L >|_ Rk@}5hrȊR<꩞V.~j; ]"_[\K(G%@U"5fr֩|Ldq;pZ3e ZbBE`2/c8UVp檼CN\A-O(nJRTUNj}e@~(uUhzr =8@A+\)[\zY!ID'DLh@m%ʣFkllt Ѻ; D@XPڶ3J{#lWo:X%ѢsUdēgR&T5y^]KQ*j&멙,&ʨJXh&!$*\kL7rhb4[ M Uc|oBM &h`;U//lk#zS;ʘ#q6 98+TᄰӁ2KJ@N]9Vu9䀭r%TT0(>HLE:fnlpc^,^Q+zi0:_Piy9_[\]SԞEjhqjʵWv·?,GB*פ 6mfy fC-1$!\)>PL}H'pUNQ ϯ+ )Xƾǜǐ),Op `;K1Q+:<ڼp+p n>ZY;g_suwYYyXm[9LJquj*VdQc h`uj OY\2sV&~>=NJ _:WOJ2!R0þ}q&O!CO1MJ2]22wB8Zx`CK/@}WX(R GGABJ /1៰_˙IQ-r/(6f4$Vd^)ڬƃc\y(I9gW׋"/NV3AxXnIYt&IsWlXdҩ7;S'f] g{2S[f 4o4wl[Ѳ=QAIp:6-Pru)^yjgО7j 9ոV6:կ]-VTiZwĞxRjzB+{|Nޞ4@Trx4Eɐ8 @.Xщh ^ɞtMl/fSV \Q3e2~Rp([tv$(܉&m}q5O2g-qj>E8E1Hȁ>|NS i*zW~G а2r᎖ty>Y폷Fй^~!W/ij"zc8V7QQGY*h/pc C..WWvT6d\O).9kW<*/"j9EjIDp7i}e@\5ɉYB] 6 Y(Ϟ=QZ49Qtr_NU4.'OM}L^-˔d;V }CR1ďN,wG!pdX6&:vjj7e-"reM;;$ V@TEQ]lc@|sTZ&'T-b1%E>`Xv`Yx$<WOsI򞽖e-5Sl~/o{ei9'[%IY<^b˧ oۅ\zr6#T¼}*i^ f/c3|zR>v 3Rpo>p9}tdzWYQns{Nlal,V(xyԞ+YW-tB=S;3~K[=yV<]',@84zٝ}o .U 񴿴 ԚCBv66k)qU^$AK q'wWItAML÷6Q œVd ~@'KԳrF]n/m:iq/=* nyw;|MJRzkqQ{q9M3оowcH U >;gJ\cVd>~y%,}CIkL |esW¢qf)*/cXvZy) I!U#JG *֠]da`03Os`zH3 /_xYາ*rRt \:Zyz|nMZ{b'NQq bx4Lr gz*YJ5U7լ@s:} 8ߕƿU83UNU[TI՟ Bi{GW,E*)+(n<:(5Yנwt֭ %P5 / u"JHMOjR=J,ɖ6}M! ;*PbstFNcEOᬡI: zd SSH:-+ZrGh{lv7-ϖⷄo{G/,}!E-a(9hǫ6J'l^r _dZh:t't`H{7hdVr*Rҁa-R: ,H==y+uM, ⋐P65y+O_N7]Ǻũ4{RI+ SHKn]s[u!5 5Rsx%L5SFǢvj ݡ9͚}%W |Q+1N߹D8֝UXiol*T 5R\gB2"ZtA3ʊ㵥 jhp*`0Tx_1|J6[[_[g(PEVb,ɨ[Č il[Íؚε^{x(Ra%RjFSBTL>p6X$bۘZ>Qzk~mjC-$X[3;/@QpHӋV/{#u`z;mewT! +ƇjYjt?|B}NX(,t݌35ENNoRaB{TC6bb9)0HO&@A4YN֮Hb:zC2jaUʹ8WЭL5ŒIo>{B sԂ{bTp]k'toGIq$Y#xG$ `aBL1"^l"M'IuQ\wz?:I~6$՜ȜJ/s@⽳U)`Z=拋tZ!%GNE丮-=g-̣rr5->| ICT""!WJEZŰBۤܮM _K)NW#%@s!)IO9CIڼzۭᇌ+NVx+糷~~4~m=7-~ @~<&s4Eg-p2FÕ/BN{OgO`{r-^Z^Ef'38K W6lf֧}L$N~ʤ8 PG7bG[pN k 5y 1D𺄦TƒyXVlÎo+ԽE;L]M$Akv@: >"yњ.aՁMnyR^p26£Amڵ~=] s+aq'p YV 3`*uyvh҅ 2JjJ<Ᵽ`8H/JNX*ڡD:zeUvexrpzo0h0dnN m#|YK 11>z-%VyV{` WE\v;J zH;b#o?Tʎ]a0c"[+g #L2sj;mr%oo%V#+3NaDw'#QĜS%[8l0_O}FptkuUw놊`wY+*RE%blE-e%3AEn%^Uˡ:̑ -6VGk)G=jg:|}泿^ҵҵX i*1S B[0OJm_;=̓}4" ߐ\ G&mLVS J](reN\}c+d}"`,5~t銝C4Zdzn/Jzt<fQq&0~L꨷~hc Ϳɜ4H^UY̳HB[?</i4)ryS#W4+/;>i mGŪE8Y-P}+;[LGJ kdxh%ήUYڊqlx:|S*x]3+21Խ5n1KQv_:!M;e5w#Ǵ )PD#1"̺:\ԨC ΁'-o'j*6tZ–&l 3X;[=].OFox; iW1R_۽Lr%Z ,+o^ *1)zMD!jFt 1[ޒi\~9s]nO fJuZ\} A¡S{*çݐI8r|1W˳i+wL:DJ_۽eSKQZW*S hp-{^p,t,7{qc94p]-%J PxTƗFyVXۥЁ*g-ě0nÕ6w^Uzpz[ŘJً+Tݲ1P9<㡧7RƸ54g>>uZC> [3Niӡ@ah>߼O/|(o̚Vv;PUfޛl+ c1QԸbls',/"J~IO>$$i|b&Gaԋ$}PSDj툻bFj8p\5:1K~Q֨\7M;5 #ٵ)u`;.G%-'* <(Hi<ħX~iأx_?p]e =tZwIL'4ECXJRJx/\ #5=SݽX TP5Z 1Gܔijegy [>Rm& lhWW7j׃@Bu,|VaU1AhLU%-4VԗB+1<*&jx#Pd) %_3bZ>Λc^[yx /O~3g!-E4w?1:~xFݗDE0oyldEKVHhD/^9_>\XcEhπMQ.9C;*獅TrxUm~$/t׆maOFc?۹r>0NO'4kCIY*ZU$(RHq) i ]`.dg+ U-\d" 糣oBR-qbC׊V/ZN16'o} ,b 1hVl[nzSwzC2)ϪgjT꒢Vx e|ϣћTgGZv/9{^ e3uLd&r׉{m%hG١S=Wgont\ H[Bur*Tt0FZe /[q)߰S`ǽ@4\6>^ji;/>(OgT"wZ7u'SRm V[kZx s VI(j!Zu $R'LQߣl@o I!,rr='$Djv|57Q`t-\ wH~QtJ2;)pFy:)" +T]\i.3UZ om?=o]^U(44 ,)I6RF޾FÑyuMDל< Ռ35P=ьw>}*9˓P*f{ў0Q LS!%{Yx9 6/=yxx|ڻӦ QO[\H?)5l !p^Y.jcYee6##ɐqM8/\vn]7> 'Neؑ:_KB䝷:ji\D@U_nqtMP{3Ƨ/s-1Cc}{ ΰIdT ~&yM>=M,{U!)Z=ΌM2HTkm% %=]]>ӔkeC?۹`ƐmYPp:nDu5*IjKjʮ6/=}P<5![_ e[Q 8$3u+ 0klbTnVϪ S %,Zz:[ EPw97&1\`YAS|6T`$ʻ98PLqj AM/ uq] Xˑ-ٲeIVQD]f/:LeP̦<|3ĵ\tuyY;2Y4ݔ=  {Zu?^-ONĽOOɆk]RLb>/o>YXR&23ӟOe^x%КƒI,alLog"ݔP&FCUʙRDH.AÍʘH3}#Ľ/ie(-2$[R %FXd yR$9ϲ>B/n5I;mrAFHQRqE&fjƇ$LJLz!&_PݘPYyw^P."N< kym_n'MNvlޠk7>>iUBGHhuMtO3ˀ'ؘn ~RLtۭA CC^eT"hIo/,G C.iV,1A7︳,}`dI$LSs:퇰EdCm5"Á\.I';o% `pϩRTxF֠x6F 2& 2Q-1p W8Ƅg6W|)$YITV$!OFXj &ޘ L(0 J~r*%y͢; c^<{=1|ý)1/J"aS(DU>H6p)|ocWL瑔j  ADqy2ڜ:9[;;)Z?E!Q+#(UC!fLNptP;N? PG/GL":J8>LnCWEtC֨oH}\&y-Bk-quKAٛ1%$0"b(C$"SIo3 # ;o?z?\y +{}?\ݳAV^hdw66JmY`As[%_݋eO/֛N.r׾črM#OΎ11-PBV4sTYDƅ4L_ܐvM!uc~LYiP/Z7-!̂$D+Hď-xZ7l~fFӄ!;맓Wbz0t3"*䭍n\jQMɦfb[֚WQ>X;!WGN'=*t]ތt VCҙШ}/~Z+jK2M>~ZV4=Wգj# PxUaуٿ~~jvu/籵o6^  qQ!jS.ғz塞V|f &U, *]-NpY+kHX$Qq|x ewx(W3nYW<{5{p g9n+IDL\*@JkcG!J;ce.|}z915|Z)|RC%'4bTdmԼF.*QҾزzznp`N&ՠh{jmB܊p}CYX( 0A H`ړGHyOrۄjU+4",ZD[O5-hxs@" E4\e X8:DR_11P_UH'CLVoTWwy9#nM'?eW?Om.O:]+i"Ml9V-um*Xv;3FpbUWs(X>YTAogXoaMKklR9I}ol%f qe%Ukئ)HfG C5)Z0qQ=N))w5,p,<-$_\Փ՞nΒKsF "C~M_>ˉ x󚪲su?"1]*h|P$ `'ڊzHU\H a!&JkXm[U~|?ԡ5 0|?c(. #H"%"x IyuP{kFncIv˒ѺvtG[=~ 0jLF1MV@a BB ^wcfglS?&?ͬfc$xʜedQH:BgY)X/z66a1|IMg5=~źH_"fqQr:C c.y@>O}]oJ)ꯟRw%۳Ƅ#QZ"D d!Yx֥&ڑO'q:@'P& yn]{. `9G,>IMŬưW7hErLC֕g/S ya1WnJ/d6}+lxmu7wIe'uo#??.׽5 .>. )E\ 8ȐӆjlV<`Cxi5qíIݷtЭߚɒlJB•荝|LuNOmbvKIZgu{ Ĭ׵H>/| Ν6;dn(ߩikn [kLȰd/0a 6Fn9_oY/vۉOqF Or:Y |c*^lfSEVÇs&].p+?PՆw#ɣ^o/wMtvu1~V˫'M$d@GJe!xF A{QgȵkS5Y12ixH5C0QHѐf)LL`_.',[^gc/pmN岜`Pb?FN>ͻۧ%`'}^Ϟ`0+(BF !z{V9{Wz_UsGS hY*FWH)1wv ;9<ds؜{mր3++HTrHW\ &'tIJ vJ?U3"KY$eZ}F?CfK@0tjNnjTx_~/U:GɌ6CHTdTttlj.A$?`9M՞uZT> $Qf?ngBK]a$|P) d:n4@Nx a>!(jad)|lO3`xWa 9|MG! JTjIMx荭C/-.I4?YsS 럽pC:?;DL>zԅx*>m?n#.]N9_uQbITl"  w"89Y#f҆(EEjSUF2צ#֧7jKٱݺYUeˇﯜNڿS Shu:G_+qBntx\#W' {LY:=!W1 }ӿ5Ԥ ):sfU$Í 'P蜍mOԁR%M >1^KD[F*JqpD+X=.i`t#?OIh$OH'*1|/1)a'Oc48)o?^m'[6#n^ l!+JW'GIw\Nnѣ<PQ~幘TirrTKc:0,J(A2W8ߐ!G} 9c<İ_y:YRudݥd0m Ydx;"n㣦kwGۿ],na<^@*fF*@*RKI ňcpXƠtmbJ^m_|Ea)FoAjp;bfJd*`AO:jm^aկ/n0j'Ȇ.eg0xtAX\Ql%n,"*MZ̅> wh_b- k[:l^雜r`dW'cmvרCN*w}§Zr0E5[RUL](Ol]UC TA?0$>xOŐFR 3nu7"0f׊KdJVf"I)Kt~tl7"˰u&^/LKwI$$ru!9Yօ+6#T;;H޳m+ &$KcVBB$a ^14puyu0h{e:!8GMgpNL#ǭWC|53>ku##֭:bvF~"w3u2ʤ80}bK+N Š$H%ȀLwq~Em}k $ _iFXbqR"&U2dJ;~zpױCXK6qTK5k\r뫗=f2\۾'{^4@KBQŪ !k>s,nst]Rz^1S5u4x-& VYZ_,aphxrLV~ >,Fkgn!ܛM7cQ{gl%ƚ0Zc)qo<ʽz7 c"wɖò㙓L'#T+.²= We-#FJmb6x nn# tWb|I+WI$W/g2֊;:=u1{j/|*0SZcx0S+Q&mH𥲋9`VRUq6x&WDT`d8;j4r.9N@":(% d?+Y*vNRS SGvYɑxe8]^E j^z]v_惾%?xTNOZ~.HٓjLJL,0:RINpvo) ;dwzg7`B郢ρaI٫8נKB<`QVmlkagԶ |ت@)KGWO'dM nXUyaL F|)Y`JBv~4>m܎E]]_$NӉ }#Y&YF_` <-T V}GXS VSh4!۟IO/evjZetJ[z!WN'O[xs'մ!gx>ج:ozj6^\ps'(`"Yhc?}D=?gڠ]41}"X,Lɶ] S +1C,BD$qCu)IlyՠZy8$*jƦ̂貉uLl}ϴ-rǎH>(烱2|Yx]V3[Yd3K)Ŋ'|L/Qv[㘬iON Ucسm$]lM%焠IzZG"Ouv ϙt͢IL(<xOdp*x-QM)K{ZۚRj>{J2!a8`lHTk^ig~X^H p).Cg?/9'Rf8JbdGEEfl[1\4E?)7]柖2D '̼J͍ {/Jf 0/6IaiM 糋*HI(0O'ܑ3btTk#cU 穌8uvBMJHdZ&%2#2 7MDB06 vk!k{FBIx1+݉6O jx N⑞e{r579``\ =j]Pٸg2ҒuHz2(IQlYAU R@$@^LQe|XBKw$m2a4όΐS$DuߤkJx{z) dX1Ry͇s#KW `LN{(# rJ>BΑOFXH_:.xi2E=N'o,]-mߺ|ͺݶᡕOdfc:O^P B'q۝eHpӕzz_,STK,TdU;uFC,Q\Ϸ)mX`G)Rth"]8zp1d&k/'qeJcE~H.+G׷2 9vo+dZ%#[I}5q[$=g* dD;,ՠIݵp#;Ң+㉨;bĪ1#{GҧSBĐJY +)on,wGýqnxZ]5)v;3R- aS RQ#2 ypm<\xx zL<ꮚNoڋI(^HY^]" k34QSHZ9hنD36ʸ"%Hw*- "/u{x ۝oƺ{BlǀW+JF H=T'4|4ʶn>c5$RH_C}ϐXm!fF{$Iw % 33Rs ObZ#F}5 wڨ)|ڎE2}(08Ԃ)j,l"!mc=(޾fp)d7VW^$h@,t^o'1O*bw^Tk5+=h/QݯZ\SB JF[# NQ] rP*ģ.(v0&8pI59Eh^7В+7EĠ>/ У;v˱U8%޿wPoDd71.EPpJ˸EheTX|<|}p$vt&#ջ(mAE[)T V#)IQUQo05 I1*`n]1Fũu–X҆Q9Xo_rF\_m!y$]6~/]#Üǽ_ V<XX8k*V3cZ+. !G Fu bcdL~\TԾʫ>)LxȤ5d:ӬW#"T>u[bBaڍ,@ nseqMO՚Sl(ѻiwk[K-:G*VZ7gЗҝdT6#.45,RB4}cUG\vvd{Y{ϺsĢQfh:l= T7ja9*fE5K"ʌD(Bү֪\$DCmg;)H5~SP #H+U<lBZʍlGFSe#˶Jd)a ngmg~$e2{Qa|w pzlu?|xk՜+R5Ik1MbXk1wލ 'h Qb$ $xi6S]nk˯/]@k jG?ur>V` B{nLORe #xTK3ZS5ZBx_1u8e6b&  F#YBVLm"!!>ʘ2{h}l/7pv.#~astmvG6:Q;#'A+xZu+r}\iSH#i^XW ?eV3 ~d1b9Q9I"5*b `a?9:䭐_8F-N|=FX9%2*ˎ[}Pm}$\sizv=^m2!"d'C~q0F$`LR\xca4s>`sfY# YV0CD HXax,/!*{.!Aٻ;k{RbX#iJRK68-QEvmc.n; g"Fld a+]eMPTf¾qGJmJIMKyIDl42ԒB Ůw~usi??M*DG;u`ZܺpA|FFE#g`"qf8=N;\%c^_]Nn@DNnWv`9 sx)|х uh8sU&{rUx z~0%/ja!U5Dmʸ?\;YY]TNf7}pD{{}yQUϴO22r* b]_T:`^xn|T~5"[VʬCW&dKTeݢnsۻYՓ&3><`"A  L,Hx4(={8D K-@5Uk+~ɳJ^do6Fm[QGim~!4FYe WDcBrD2H0x4zZR%ܨW#z2R|e%*)\f*49a~*p4o%~ b1VI6GǶw3QIz">`[oOK"r Z~e 6ΑF+OYeUjZ>\Vr۱p7wb;Y&ڎrA!Ɏt/E$Xnu&Q!Qe)Fb~Qj7-xN~~={VzƾWgmB{*[ "ٴ KX0oz_L:(t8_jv^3Zb0mSP0&eZvaX/ʴvۡxt <ϻ[%wx@=c@Ú[%S2z't 68>7*\^\}VIIT}bA96Qc{#c;PH%5ll%E.D醔2 x6UhEeĐEd4\̟ʵ8,Bzcjq_]>G`&fZ@LTdv&TE;)a>Ginz޺Җ7Ntn:d_ڻFg,`$rbp%s֘i|*ޛX^t$C݅G?O c;?_\eIq۬8jnv(7}>Աwҳao|~VZBbϋXd;/(j}q3]n07Mh*$4r7&#*/!F -팽}xX.\ol9=^kvT9$3(^xcaE{B\"Yy `4E1rcޙuavGWz9/iG1q^pbꑊMHHO^>wC ?͓I)z`NXIU"{" >6sGOaݤdU$k|BENPF8Γ)|^0WOʞހ^+WȡߟlNU:˫tAcr`HҘYFYQsvVr,OO׷ K"b~hDl~_~Sͫ^*|~uK#3ǭ3qG̖< ,xF IrkcjEn>ల8$Q3t*d'`+r movzK: SSl?1l"/DFXVV$i2l%2덃6%\xt ΃]ÆA7XSRd>Zx17UZzU _] ""y"C0pXs;U"X28e<[oҪcȝ V|l:{x{MjKJZ! DJ%hG(Uuv&H`iKq`5L#%)PoQ]\Q: C!kjW@l")Js2!V,KgZ \ec>KdoF7@ٳhR)&PM4#𗄗/  "'6k#-bƱ@R1~ߌR?PR\rRH=UERi|3~IW[HV#Q5|6#eH(zP9 #ѯch%"Lc9#Q gꢓ|ϨYXlZ=_KaEJILzdýû!w?:[9}m0r^ E{bζxNb̘ Gzrx?޾8u OrCe7֪&HQ&aǧDT4OI3LjƚDž$FIJ 9y$y,t;k #iXhH"C$l샰|XGRYB8=#f+Ɣ$Q.5U[8Ë8Z/SD,4e 6* ]m;ɑ ٤bVwM2 XE;"W%$֜׮[eVbd1 (I{푨&ܓZ->#-tT>b5KN3YIgd۵ёΖltˈZd!F˝/ 8OB:䨦0Gr$Hܷx%0(spX*w ƱgsIatj©V^\Y9N2[†j_\ #oU./CrIJ|,s (y[d}uY Tғc xlDe@L9ܟuajǴ)h'h,4V]o_4;hOĵ|4sN>dO C ̚X<H@6㍊|t/~pnv6%#)vY_iN%.x4o9)Z!d{Y"XR֨bBy%Q5/š2f !ƒdAP#?HcDǪFme b:ܘB@a'8ϭ͑aXFUB£!.Y5' G ĩL馨82F]& Xˈ/E^cāϋ NvzA{c#c'%|WP\Y{n dž=a/#m*$*B17Q.XBG+AQaPҺ#HNP1BPU3lPx~OFέgbf9pdk+p +!},"ko/ Y*[U/:I q,thlĚc腢6ZU4!:<#oRu/?(6J-$-MEPO͋2/z&/.pK>y|tWbg .{VxgцB[HrCRbjVi?ڞ&1Pz <`ƥ@#4d8}2o[[T!بmYo$f>fvcCh ٮg^`RP%H#XA$&V o^n IC{.D{kD`xVl ]9D`x2)VgO֯OwQYD; c}XEChj"0K2Ħ&)xJ3WEAiG:TQUF*ŸtӈTY!6"r Cm2ģY}ݞ;Cvo\L nqs, IG{T"2Adޥ lpZX.ӣAw<&Gw\U L"BG)U| J7^F;ʙ)Ҹ1(:CH:1Vu1I t#:uۯ1])+Ii*iDk!ʢ#cksS2&vMV{M Y: B/Qߌml+˄}aZ|}M"opYVWUĐ5zňsbp)9+*-kSVSTb"#9>*@OnGCL%ͰjH4rCmvZT!rF|:W-R?}l7"`P(^gj"5+!oY>T+,eHۍdBp4Mz,, i| !b_\8ve݂m]0mjԎ0aI ŧoψrjǼ΂Œg`UˢS8PQF#me(\l+u^4K]jDH;v'7[-%p!4G6~S$)07Ft[Kad;yt?jmD~sOLFeGá:e@누ǜްFyN%7*"W(}k;h~d *՚$v%눈u=*rh ƿ=8̫G {uMxܼH6D0<LMl<ij?mj[s[aWW{нeH%eO RH ~un0񷣵0׋=MON.p1ΊNxҸ nܐHO+`Ȋh%Ϩ)p;$sTGG,S+Yk!!6t$qgr[\^pp+G:"F2[P27owVv>Q8@:KlLXI*_eq~>^q|F"TÇ5/ϙNf>|Vٿ?hmq(۱@Ra2cĔ)]rӓ&{yq1 )4No#8'n]R> Gg:6UIXPXLL6a \UƘT!@BF5'x1L~:4M$_^?\s}xN%Mp@q4U[KE̬,Q&=/ uLgY)֯ N~hKٽ9o\=h.JVrw".TI[ [[Pb<6Y-ŧ;Ҷڳ_z_ڻt:yX:#^>-骯:.'̪E*Q!3 *19ImBowDMv~t=.cM$KnElt G` D h8:Cne/Q1N) kj?8k)+ ^쉗IE. ȜTF%/፺ xIտ;/55Hbs$I|%:fo%M'ԴR^R&C-H#Cz#PxHfi+亣H3kb+J>"1Ķ_];꽟;Rډۿ|@9#=xCXEλ~={Vje!D ꤲxiY_A\O;YbG@]9+A̚d=1& [p`Ba3)RnQ4ƙAqʯ8!.!VH Jb oYT_mv/{ֳ>yam345z.ef.\pWYf*Ŧ& Rj3^*v|W[,jK[s}?l-kbVYX~˄N^\$sTԤ,f"URxGXT0\p!]Rq^k0V@7GO;-XО Yˌ H ~%`X+ߢz7w@>ACێ'i泷Y]^bĦ9>Kӗ LSZxp:b<vuͽsQ_߳ $}$og߿zu;?m:޿s |=m sЦȡD,T[66]V3_G #y^,/e>M#*nC4yhoZ;p!р(~nUX\er9~V A(<#8m|Lh@pTwq-+Qlj)4`y<n-Cڧ18 ǥW>%J?gQDI(x!j86aNל]R\pv"m9w'N2`bڈ`1O}R6S9JUqy϶l5mj݀fP%Fmp ī$^=wKvMI7YDwJhy'Eh;& pBfRdt=xwETGxM yjIϻ}o"<7})¶؜ZLT2JrG̍}يy"DK݋{T@-xᑞ.Op.0|{,:zKOH%jbdiy{r0<i:^6>բɃsD 4VZVhU!5<)bi@G",$~[Y,AO_W/IlRG})%Ui2G5/N L1vmK0ȐjN3'UIѓN;XQeC@DfSsnDe1_P)M*= qEX #O줽 cuWKYap&âP, A- H~ KX&$Ȯ(jx°3i0bRiv31w't{v'Z>"z>*b6LI{]J&\Y#,mfq0潪7KZYtLĊS[IFEN!~zd8=OpuMoI()bYE 3P_{JLpz+A; '̩ଲTSi 9al!zڙ X!@'x2~ۥ Ql90蕵aM΄VlΒZmk7{mgSk RJ^;ɻ }g7k:!xP1 |VX`,0JùU7z6_g*VD5x&2DrTurYϡ B.`\xGI%*qlxft2.Mj8 z#@'aMj\/r"9 (LV`6r nf d Dfu8l>ω>E,L %V*a@oDhۇ%=.l;= QwO(1t'IQ6ޔw\UC.1>H "wL+Fh;'Njj&!TB4 %"^c 8v=Q'j${X#'ou< h*ɯL筤Q]UPF4"rS?,ˈ D#ㅃkLjJgCKUuK;ZR F)I\?=dYK=Jj:|уG:AYxm^7 d"]M=H2+TUPs:[n`!8#od>wR-/8v_" Nh6A5kîa?ܽ;T@NJg?YZoMkbhoH?虑9:VI2Tyt-(Y*Q*j FcU5$Qn\f<./ea*V w!(HZF`އ5ԹƼnv|v_Ca#.&GLje߄iTPD1sQ9xJ& du`k('d1wjoJs`yV2dHi x||: #2mǏ$F 2MXX=#Bzɦ  v5 XSm/% { ]XK25Dӈ cS[eW^ w$vGgfty^&P<{v-[Stz҇tXAM`k G5M mJ >{&"( o#0 g a1F$xI / eyLkzXsN`"hע]e '&"Ψs_].VuI8DCoou Vg7ExUM aH QSc*$wꅊ1HBjR{AytIT8Go%MiC\2@􆅜`ɊzQMOvA{>]Vȳz]ʮ=s9b`IYj0LS偊*)FG{XDco,ks!R& +2D^S?b65`Q(Cm PtMCIZb}V7-fg^mp7(`>eKVV]bGC6  ,/\@(W$["&糯S7r/}L#~j8-DAJ&l-5u^WJ{k1}s;7y+:s߭]-0#u:8↤6 _g*i#;qEO:[hjO7j/֍yAϸ2D^\3/ G˲NDM=VtG|q{Mw{O0CQhR׺XXo;e:^X ӎu/:>=Kv(;wD]HF`K:xV\rY^\ɻ,| Gg>ů-Ɏss/ykl{Y:m},9-ooËO)>HۂIV9:dMՁkBHtil^rx%,HQF;Fߔ+SWfU`%xIr"UO\d'kL>ّqz6̲-GQL,p|w#ʽUd1}FwzP$pRm_]7߃DFczWތv|Ow-F FTӕk !͖FR(g*$.b/Xj,!16{/5 2泷U^.I cQ"up{F{<41,71zCg-'b-\94?<=ywu&z.f ӃOxR#7$$E(VW'^SRQGΎ='JEBwh+Z/D(a;=e n0n\ Aŀ!hnf(]ꄝ糯;7S[ K!8&TxܱRW4QM?QZBQ "QJy":ezBTsoj%&+88΢**j)'e'x#k&z@OUVYŒELXMԆI5AD80󸞈o`j2P.L'-4H!9fV.oM+j /ʦsYԺs3WοAGgz?|M}5mЯ[0swfEr|bjb0V9E׫~&_OY9'w\ۘY_YHԘ˳H)2߯Kn>YՋ͉RC8ugk@L;2#AXeSLU8"j$ Rj˫gg7T{qtZ$Gh{|7ذ{Zay!IA/,q^Zh)0i 1fLmYԱjgPK-3 l=VK%%qb*:SdƉ{:PaEVϘ ٰ딈f8> .kUm{w\J4nwI TWgp>'D|qvJQ/<nEBP%$$UMT Ez ZmiA\.rQ@AۍaǮh'0~ٿ./~}`psX >g%=4d>[\cI糇A^Y ( KUOrSTlEK]"Q9:Ӯ:>SRh>5,Vj0ʔ w~l_&]):"'-@"qtCJfP7ňT2m77*I+'# UX̍ XDSTMҜ!eY+K")7wNg|hR~\a&&@G⧋~U阿SsXQl9ueoxdH/&:&)9Ee'&$T#. V|؇Bz}pI+.ZUZÜmgBɶeL1^&o WIGCa32hO@c H^ uY=R*?#qdޜpp]IOB -3'֘]Wx7~ŋSfDFɌ"l9̍=cLL*,o4Vt>5ef-ڜ9yx43bN'˺l{j2N~n8|>Gh Z-S)ˎys4U֋}Cw:PhjeZFg`LA@T^zkZju{iTࢨߨtO=G%WNԡT`\WJ1DGiak}LuE.>)o#D_@47"w'Qz7 y 3)CCgY"bd-L1PzJ Ak_}^MHҊh=#72o!.yCupIYTL!B$|DI;0}ϧ8Q/~_mⷅ{Ubr6400qDm\+YG9-Fٚ䤋j\? X,KleLD^L-k|kZm?80lP 518n>S29bel(/s,0M7:KIҒ=:O&zuݻq{P8*ޤ #$5[7ϗTS?pJ[W {(QT*q@qVx x3[ B3 ccndn?\}XoVj7P*zn j Xe̤XKF0\>[V̻i+6*4z 'KX/ٱ~JS)21p;]1Nήrj?Q*a'v (]#VJR9y&so2W|7r>@Bv3g;7j>df"L f+[l zKr8O-=⯨a1}9OҚ JD0HVP߇9[n67Z3Z8s`f߾-[ߖ[x[)/t+ B,sՅG,q%ILM(Ҵw l͑߅?G$뀭)Ä` `1s/0uԫw[zPB3@{&,0.) ?bHD*zkZTQŶ7֤V^f#Ē=nS82:z>yJ3w^M§^lI`]P#PH),D*ѕRG.f\^쁩܍R\gf;m&WsT3T*r{p*(7>Hu.7 >eMmXe8n>ۗ碕vPDX&Q PݼJ?^haH̄g+ 痭̏EW% m*̓e"a#u} |t w|޻~yAŸ,~qy?:>My#׽*̤C(6i<:ը'a; /L!9ԚI+JFe %PZehg/rkqO]D9^SM $@n#@r6=F4ZbnqQ:""PÎP6ml&Oe(u@ib64Q2ڬ/Qr[D.,0L{LC;|>{fFLV Pq}D2VeV0RKtAs.A_PE<Q>Xo>_'ԕPskySLV6J.H-8'^b0y:U > mvN6@h*wQ:z[<k K|-m#V'۷BOdf6aLOTP8]v`Dd@Ƕ8{ TFOZ&#ŀ?~VN@~(Ylѳa}#IZw j XZf_.&\WM$ta"־I6D }־,vEqZ00- E+\k-rs{t&#>n5:L쎝ϾjJ%^Ӫq0DF$X^yQ-k`HDhX&aؽ+-J#)/2nVDeﬖ`{iJ۔ dX,KmK .mI*TqJli}Z`%Hߺ >O/7G>bӝ=G&P糯"7Ca=ϱ6IV{}Uun_^ܜo^ 8,"uӒ,+ c( zl$QK`;t@4##.v<^} c5w }Pxގ#fA3[zC)u{>BxX4 -9a9IU Zfq7Y_O;ӡZ93^bʃL։@S#!"ʺ,%Ot xYOIgp6'k#l)!BйBPKq.7cdi1Fq85rXjuV`[8 6{ [ZB:ڏDlt (ns0`ḵOZm)2UDgWwR h%I|8a~.?8^SCy~{|vDzIr} QУ:n#jHEH׫;UgIZ ǀ+P0s&ֈ dJR^}!uiS׿XRShXp )ZS#m%{ٳP"+?.gW'nKţT:Ix %2Ra #EmiB枫4>6}ʒGHB'TR.6(Ze>ޞOڗٱV5v+e#*}r5<`\ U`()9kaE*_Op;{:^pݰ>cS`/$X.`ޓ8gQҲjSwq4 N` J4( f8 ͊&R %.v5=h: yFӐIo!{8GXb Y* |.٘pz-'Aȍ;g.FbN=X&+FYQy,;(eq K!݋=" v|RraӼX??_\,GqY\ q̢-!Vb9N,DVH18rVËߞУ G`vhpmΠsִWمcqD9`PnUb}TY3-N'Wϖm7&j}_"Z=% 2@C$V('ݺSj[=0 J:90X*xDD"H6Wae %1BU[WWSc/ZHW~;l>[=UT-f˛֋m#E \~@s!,oVx~ŏZ\ԋWrTJ!IYeNB&rL_r<(BM~Un=cm!ݬG* FD:Q"Ś;7gᄉ?~b4x0=0)/)r"F`/9ZΉ.dW!!1ɿ 6 Ӎea$G嶮2¢kYE+{CDuGa/T¶){q$'0 zaُw)Ckw9]UD7a0N+%Ec5  [#(xuRO@QVJ*լg.K \u[%kۋ^;HN h~$ԑS=AFo>rD#B/x$ȡjYv3"7%o/`džG ,7nۤ97ai'h"[âeX "PmS0XutH*Ć\ޠ&arlo) ,+9GʈJ,"^%gAQUR?`$"Qm:`¿<_CScbqLŅ8<0vT5Xe.0nKua_lv/Ω `8hx&5ЙKSR ZI9A_&eЗƝ=#OQoе kB UGN6J^|UVz rK@DpWrL [zoS4wGO,ƑQAF#堒\'t|p$1bv>{AzcGQ)V۽;}ibu{ޖKjA q[΍!B&j0YR[F1IUk͙Pxl޷ ĚpK>7>ʢ^4H#F;"0)G8d&8~Rq+!5R %dŸY$^WÌ^=pj 5ׅHnxgWŏ))͑SgZy.{Ů.Z"%I|rVu@0RxC*d(96cGWDU&*=FPa'z'#8y@Eb& UD)TӉ9O,bI(q(j3~wO;0G)Nd/N2t9+~Bw޵ ?,.痷tuԎԋpa{xF"e`6PXx.N|Wg9{^X7Eߺm} ϗ07o ^CyϞΐ kxAD<LyqS"Gv{"rvzo{K,]XOg*,^IJ,{|IT$Ieo\ "M%0Cra. r4Wq|Mbb}MG55xHC$f ç0UiT:kJ9ݯz[d80 ǹ%9pMD PSļHf;(cj;Wj`hSM4f'5 zUk8D_) x2'TO6 'WO۫ʅuWMKg ydmmQsl%> {Lt裏uyKx].po_T* $flYYS,Dhcwp(H1ơ߼LsڐD b4)%2GNi߄G'!Pwm.} p1p|ë9.H]onֶEӇ(!(J0L# Qg^Bh)}+'.W -Wc?T=r,#,9OmF UTϮCDukTznR?9|>_25zJx>o>hV$ 9i& .\>=`Y˦"Jy61FVd hRF$LNK2~T&9փOV= M5R9d MNKRn_|jp`y kobg?@ "t0EC]pEP$mYS2+xhlG&qAWa}P #_ڢc4]vT疷v-i+2 + v t_iOP^eMf^pFg@19p LWٸ0(Gnr @?pF0Θ;w\~2 dKwcTLR`Bܙl@8S^GFwl)d2ޤLXEM&m)ȀMNQÐE6)\d&ڦxMm;n@JvjjH(Jv}H:S&nCkmRzw q֩8]As֘5*;3"}_QBTDn2w茢͏I}rzж@D4XFJdI1adFhL Z]o1Ywmtѵ wN ]*j*XkI\H<JՃi?~:kq5UG݄J m7`;Do$#H|OɾjDшx!E+x2)'P".,D zȎ%S1+UP`| MIFɧtC+O= H)'8DT(( xIrE=`85,1 yh < D2.Yhpqihmg3M=": 8A.*$TU)V)ZbCCcj3F_pTME]xS-?\P,n b <68;-3ї)W\\GrT^qW7HHt⃲̸Kgide|o-j{0K; L1M шSRin~A'NrӃS굈vYa})<̒jD$qY1FAx*o|ՎepkKS!Dۮl" s=;(ٔ5\x#Kc`=t< }V;e*4@W6q腋Vxf.n>W-G;TQUFu5"\MޤS$/';`1ݹ-8c g_ۥ{6MR9saL$r94!Q cdE9%ajfH"MpwFw.yue}h~-gtދ|v5RX2)p%lWIAe0k l ֏"]}>*!Z5'b`Rn|hm~)E$)I&AE=N~UJ ܡ%EH[+/ֶhb{ŦiEb[JZ݁z7TBi({ jي#7򪅀Yb$LE 2bK_J8)5-ܴHj32t|]{ (y Br I5B hN ጕo~`>Ћ. 쬸"Uy!r!Z Bg3|P(R%^X0IA YbR2pT5)3@0%yL~,MZIX?5<WnQ @dFGL&yS@@Zd(aV^Y~^?M`= I <3_#NEMEe+m@,3?tw[exϯ;_h D>8{$siT^GdkUwnzY+ `E?BdlX),ux.'Ѵ")xr >]glj1咾9&{jov0i*}!x%Öxz۹ҷ$FNĊ`\رFMM>aW1rq@.`ZkWVқ9Ql.Vx<u3[5I7܏lk^Ч i#~a^*&Rc<6#;c6ogϴV(@v#23kbımmD"ሽ吸*펆s<ճ9lw?>6(S``M@B,I6xN [p3%fDx4e*`Jm:UM+\EW9+5Dd:.WC,on[(`F;ZϴZ0+ !$d%Z~*4AQc~\18y^ xD5V`&<!?df|ӥGEg_^|bz1F}9?n$ĉHEkNu|6cbeEU$)LO2ap~ry*{sB=/ H5PdK]{kWXb38@I ~Xs*9Pqfդ6fR7 X{{ QK2 [X.d!t1Q|J2O7sךxżSٹh1u <izH̝eSx#cBfmJ5QSk^S8#,I}g _Fr*W&C]qל?:|2H rVDkaXJeǻ>؃ L'f  L:q G"&l ˰ @@@5"SQw-Waɒdw|~ZMH FF`[(IRkNĜ0̶>X0?O+w3W $g&@-iy.h riL joraF r+D*֮RlV\ 3=TP3(TRtu9f}5WDa31aHPJ 0Ag';vE؜=F9Hz{Tvٯ=dItl5-n Vbt[K&ֶbQLs4NNEEau#j:ɄmD}WOOOѷVyXÅSIڐvgS5"6 Q/컎TB;%)NfVSO-iR Ԋ_T}H-Jj-[eULj͞Ҡ N;aV#,X NjuM*V]+.=TjUf VKLHmJ$,N\.@EC|5j HJ93"J6HW9h48WᦷHɽxJۘ2OvO= >:?Ev`SJE=mhSB1ay_/8 \p_u^D>+n@ȸLBe:{B1V+D޷b/*dJ5L& bJE,pzy"&PE;t2ŻRQ,% 867|ib-#(y7lA|К/|5;zTWpdV6] 2赪ڨlbGٸFp0+=$ndMr]V1D]sJ7껳XUCXdʱq91Etn7o=>X a򸵇8g|O[a<W2r)pV|0;\+J~c~/naq׌kq|qL8_Iɞ({C$ä.D=2pA[LG! ^ƛ@zr|ᮒ|óNhoD" 02*;&cZ̸sQ? fܣ77ms|uEF;;lO`m-v%ud 5vaQS (֟tK և)%V^H:@+őNSfX6;8jzFXLj)ow&8yx>/mL % Y+b[8{bQK&b(qB'&D 슌@@I't2UYԷi]cAļjދrщʏX=|+? HnR,Mч*[z Ϛ; >HqO;mxyڢx*1$h$X= $ޮ/SꌎOS!.:IkCa*S~-_bZ>>v|ֈL $ @K!wa峇w:8=!za|L~oc~֪絩kʖi_k5ֆf,ldT79l3b"i5yML"Q;g]L Cl85P[Dl`&iOb.,uQmm?֮`MTJ{kפ|VP ɢk+m0$YEc#棐W'oz$^HX 0ʁ筮$LpΩ cJo;ǝB 8.ZC"m>#@Fӏ(^mZ>.y9?nӰZ .]pDph#b *ֱSQ'ۇOGϧ#:MQjΞ}iu2<8eUOĿ|VHF,CUj w"p914ͩ'wNLšW->368MZ;xCoZqm&1eq#5yeîz1<п??Ra6* m͆$J#9]U>9::A/?q|`\Zei xXzq`a0KGL$E~s̏ܚJ/ \Ȳ06+F2 #)l){(.E|SLBS=F^DEҙt`cDlwO)L X aJ 4bӂM?3Z6k)>:TayEJi?^@ q`{o-1?)!=W͋gt6E>T13. 'xrq @uK‖'[vo]폝Q!|$LR+`O-:<|^b1g4ËYa\ӫAJ⾎lkrp:v,r)Ȥ))]bNR=<[ R' GUv!^.run]衩TyA(*b:C<~}lF0FN+a>75gaJ},GwMD\m2RD\1,QJ$jPAg|Laypo{E.Ê.@ &@l?޶\>Ih~uY W'G=۝QiAS)˦+N!L4Ďt+GЭ"@1X}qԾ1 Ts aS D)+)Jpju*y#~vD_;n> z.@iĸBδӇ~ Nթ$ j=GY q>,˳^j&?]'3ƀκx,]}0fM_]^_N҈I6V`Cl dZSDJ 7,7Wy}.Y"͑Zd5l,gr&ED/bod0s7/Z1 &zm v9L3(Ҵʰ? 'v{'̍U^~܂qAi*Q"6\ԷTtYlM" &i7_v@Iwq`MvL>oYyf`bDȕüW FBE#Zh+VBZ_iJގX{GgR/Z;bYb TH,ToZđL6Qr Db,( kIUĂOr Vb"d۸iihOW5P9}phJg>T*n)HSpN6jNQM!lic&R%wamC1LuXb?:c_ϣr=d8+.%j[w xkHWQir;nzyY&f2]2dJ/d7Qz݌ްfg@Ȫ3eq!6H"ry{dAP$q1pc𚜊9KbϔK.)kwgJT%ѕ6Nb& e >bm7VJ9I[jm9xСoLk:VI%pωT,+`-u˃BMgD{~}zچ9Xc糿X;,$#1,yiHѐrwVz05M >pK̡UfϽ:~>{GNIJOEZ|we܎"ŇA*OLa[Q;jZRsωow}IeI?04w>7NZ筣u+!Y5JqnMF DX&逘ܬc u]EIw q;1![`>LJr]QQQ"'mOu6[oOFR0igU3J!:X@&xxf^ eaUeL S;() fAS!z>(kBpEư1:V-skQտO lajӿxxH$8(JrC2ɢ<"Q Bʸ<`[DkFphe5?)焩,p]pqje̪nw'iAO.Fcxr1: 2 X|(ԼGL&;3qiR{V#T"ׇd}4"'_vA WW ;ƌ͗'gh)xu!mRE ,дgIXZCߐwB1:J#n70.K`֋T`PqDFu CMDӀu܅sPr4hX#Iu^I$(9R.lIv䤀 ci; -3psKqj{HU3`t̿uB[ 7B5D',1n\2^vbUQDe=vk NEA1++9CaX"9I۹csZn]O :5Or//Ky>::[ӲR]ߗQE$::_ /Z[ +yu JjI{!EdY&mU$]8> ,VBɃT?nikD.'KD,/'b3X}s"=Y^nl9ޅd˓3 ~Ft';"hM:WwGuy?9_^q??i}8YpKjfE݉,,\D'7Zِ"Vp~=߸A;AAo4GXKH&QURTg!bP6ֿހPjcɅWgϾ2⭳9kM;UUcVsоTf 8PrlX~KY^3ɛlٶNdNr".nvjdDY01֒%C'8n7,ia5O ;Y8j>{yv/U(")sc&✓zI'l/6_%l__5B(!D&:"X3۪( ;Bimn2 >hk} H$c5IRnu@\=׻-=.d#)2$ZyZjkZ !/eY"6@ڧa,鳛Je'{6xz :'IKY`)@I ˸WJT*gCQ]o\JL6pcF*onXOY 4ٿR2w~yA|U\~I]5yx@+*OOˣůKG1r>&UW-FAk0M/v7A<#duD3Jb>q@}{]Tݑ;CMc`r2D TnX$AM_^^b틑ji:3ܤ\EwX+լF#|iČXx>{ENr?mojR<]jr҅@[r-c |LDr7{HCffiXD䩢Ү<.VցU8n/j:|{ci/lN4 k nSy3\#IB%Cu N į︔-+Yno]ďHg~HmW<&~/;Q,gU(GH/"xSE4\w ? 8[&Y`US k3rĪ4yWSdLJ9Ċ2ZBx?&`M{K_Yts6^OR*[-Z1ӵilҴ=":]z4\^ ^ ^yA!泿&^=DCa 6%= @,55Oh-._*77@p?>h>*A\^Rxę8*ml6p)$:M.̦`#D#IxVV=Īn|nnr3ӆ+;]|EA[EIn~-v*l0WUJf*BJYa(aWb|{)Ju)]qaL OBd[x-п5: {BI^l||rbmRۄXk,80Jo!s(Bҋp 9͖ǓsLɛ䍹 >j3aV{~}[.Svݠ6%٢\"2_'qv;dz 璸/rYrA! u ZoNo*a7ʿ:M*`&DP$j$p<^+cZ&gͫ=ߛY+Me34E@U+VaB3RZ!8lQ /r,~=gϾa7PӖx'q0NʜpFB .WF dn\\"G-ũŇŇ\"ίG)*[+H}׿7|я~oxW [mgE, چbu4~T'_m]?ˏ'Wu8 W;ʒzmzƜGX~/y?\*F^Ҿ_ktMejN$Cʉ#yTTeXַc] ez?$hUJ00ejPz$E$J+Q&5zt6<진oRr#$` :TWLisS>@JL8^AΧR,ī"En9q-km>?Z.G2DJwcy`>{u(8wr$ȳ"YXs,܂Vqr,@fEQظ0 KAeµ[Vg3}uR~\~ e1[Ŀ=|уw!Qƈ?* Vtl*e8Geh#ν\GM3&`07>^_x[ Xb+jhH`/f-H z>r>;~Z_[j\ӦfŗJ,0õL"dZUD-֖˛HgI8o85kj%I4;eS繼Wh'WN[\)3L@#ewܤ̯\ ҆vџgxە7YF?NߗwY"@>P]β,/aq?({ جPu92H!%.3wɅ]ȼ4CHJq2O-7oHmԋR 3T^>dbHF)]T ~W;O$^?#lb8?i PA#*"V7imWϰoX◶R-ca>^2 FXX9'邡$GLOԔ@T5(7 q aQGɮ,8^yX1DNIT^[t2JݸT (w;[|pR΍?|Dజ̥bDC?HK,6$ uħ%uJCTI*3Xbg SXvO4ndcj Gg<::&\v9qz_n(7ȨHr1GQZM&KҌ&ۮxi||9]>Gp4q6=C~;oi%Y!*9y`rsTԬ^v>{33+ zHayNn-Tnx^3w›)ظaكbmrsyxԻ4ᓾi-ebDCg-eDMk7 q׏-ZW S50q/s$.gNXѳ\Y/hMR9IR&F5jP' 糿jjm |͟k[I˩a3DQ_RVܚw!=j{עIp5cz@܉VVqL(.SqmfA[0v0ele7fŪ<W&817xi,24 c`"[C D4'@S\#583gI!?5І`cmTڐ35rkDmbp@AHMYDȢmj@4TC {܌ӡ7n8x36(#-jjY蝜!S|Y\)i0Im CN ӃR75e#b۳M8ױdz.hLXdEzWQ9U&b쓇H@ujgc_NDOb 9 N)Vm! -j\!YenYߺ`sq}x: ǔ|]o4?ZGĖn}Q1xwDHpC,Q'k=: 'nC겜-!Cf:|ؘY{O2f>Y%=iClo ǣբeP'H躕;YcBn$&Ʃ9lĸѱ<%I'h[l:.IY<z}1J639F/aՎ>ՊKZh TB:sN8(['V]ׅ|4N($ab}[i+Rw>:ҿ?oD.#(aU*E_ce"g̓4fxTUR#B9bUKҰ]%Kh>2+jnqmIDw%r6Ϊ79"z.&HD_"NTQ80B"#Q] a\&6ªS>=^E/2BI*U@ ;DD1Pkܞ/E6mQ)Z<vw?X *f#ǵFsLЇۢw#uRI!U^T=X'OPts.S: U8w 6bEA2a(baOPӲq|Kߗ^ZRraS>.ERRӏk8S~~pǺ* AQmc 2c-N,p-dThytMyXPheG Zs EA' 0mF_=Z|ptWA2_gwz"rxra'DxTBC{fVؗHD2 PPT%?k)$&?lI5401ag_]~NxTfp|yl߰ ,)0A%O{VNj*cՙZ .YEפ14۶gwf9nX |,:*IźLȊU<ي3@Z2&z- + qV5g#o3kԁ{z{ndR'4_/X`8U/&#@$;YZ !q_AO\-ʇfSm2ۤX½:UTLW'!c]G ,-6hJ"CA|޶sT`Fz=EXlҥ@a` FO 0/nrkV4dED^i3Dͷx1 0FX*^kpg~sk#" d4,] vХjpfÃLб*#ɺ&1 Tf$#@dC AWC YY2;Ğe?qFYh((S!A$-nw{&K:\.q#'q JL\CsnaܖfRazgۣU V/fu4I:x\ge*FRV"\ep'-mƕJOFڋ?#nNDp+s,[qf R'w[h\)w\*==VgX;un_eƤϮ  vR 8z3-K;{X+{4VPeE+3x2!®Jc T4ҋuJs}gKfD#Q3}aM^^'Q DKq)KpVpp^ߞFE8zp8ܳEm'1~LC [AdJhy*!&Χ|bS5TdssʞfMs3ʾΩNT"DAJVjUFF`xk*-_N0OEֺ@W}||Xw/?}|"bhNJ+X"b>T$Wwۂp.c˗o^ p@q?bu*F1ĥtx^։~E`8/ʉ1:ᔂJm(yHk [KMKsn`NmD:ԤByw('hIѫa/9JY2Er,9$(7JjbtgB=졋ɖ̬/V5c SzlH/bH7RLϴ'tUSRSGg'9eOIͰ '_w.ʤD!i+R O,ؖ8A$UC5kg'TC]xbhGΣc BT!W3nVߺ>?iYQwMD|}u|\pv\+'UGfnJa3j \r OnǪ[=>K}}uãrXuP  Fካ6 EDi )Fƞ [Ǡuno,J\>ɚ7s WdUl)O1lljzOVq@͑7+!9 e܀m{FgCmM cz2NT$W1N2&[ nC?9e2ijw{Y(WnT_ރ3-FEFU Br.&&t4ӻ)@O)䟢`Cl/tzjG [uL!HM !C[>_ԫt753n=oC;xl,Zw*cD r )B!]vTŲ̤N!籐$brR5*ڏL#3\yXQp׺fKi\?m5P2G*cxֶt $UjR8 +]w<}\N'ֳƣ+@ɐ\g^RMey?[FLz&*=?*^_Q"_&$]q::# ^H|\i#/ ˓6î]ADJ('PL[-Sy%{-4W}+bնƤ<.%y"zTIۖy'g7'kմ{HCDGyy;~>{rތjqA !"`/lmebkZfͮpS.nIg9!EDg$PJ"j`0ĕdMca;#_>jVWUBY#%&f[UQ֢R0h_?}X,H`j yjdk |yQX3T9gtsĪ؂)Q6v?<!O,45W.";FŜkmj@5+-^FTȱ8C& Go`#̽Ώ@C}qjfjDb~|k/0kE+4V$ 9pOI >DIB4#d ӷBϽZ9aKDZZ'H=?9@1v"Ti$2 cІ YF>(NK{@eݴA9<YjG#O@1(Ty-Iæ7]\ݬ~_8v LGԼEcs/ n6ji=ˎjc<3x񿤈jZoǙC;13^k_v_:F% i-be!3#+9o(6jJ]DǸI3r]xV껕)^c:L!:T6H5jk,pb$Wh$ 9 L+wlEܒ!Df)[%eى0,aSEĶ,\: :}[JMnY'Gg?\EK?kP>"3!ꑘ*j"g$|cqE9xiew{*{$p_7Y)Z_&r D T-#uQ,6M]CWMb}O>* &fpk $HTrr[pz /4ۯ*مʀk .n.bc;Sea?GuiA$V)Uh|*y4÷WߥAjhkU%V|Q!klQf/:'tQ?R60+,lH<=}i'9ÕKR2R\Hb&pƋKX0Fƃv17nAzU-O% Zْ.& BB`es`[_xMzj]L^wQaٷ{{Sv) )3W&,ɁgcY lki~ʉpWxD-@>"rpUqj@=%oĶ.ql ?>9=d =嘚Y/lϾZxh/r¼9^}Yջڞ3QQ|S03=8zr}6)ɬk4ʿzHb؄tևUl,.!r{ԁtbU ^A)E&HcEλGd}Gۮ$Į;׺c(IU.1V%hM0퀒")^CxUXk ҥ,Ol*߸NI<=Nl.qXhB~1hYeN*T&WP1]O ٘Hܶ+@d_RG]YN"C b B I*x6Y#`RY< 'c!<^0&cԻv WF#nxtA5ƶS};9n5xUZ \j5M9I 泟>j8*QnxKgs*(+FyؓOg&*-EzfV4=G_Q̦R='8c`p" HyHn΀X S'=ˈ2@OwX$̫0 s1n՝ԁBOjrO|!CrDkU T$5R]PKQ4~:.Ĉ8 &T= t[⒀c7t$ =mx!".;G3O*[op/N|øM Y^ӔY<,Q?;ώ{. ,,[e.EhnC\㣳rxZ'קk}r&26HqNѨ/b@ޗR% fR~tu?Z<}@$NeBa;`b،m:}Cz X7S{i74Yd,G0Va56?YG$r4WnToaovwRH^ .E[`$EXrCJ7|!qqT pR17F7pI@ %|ȽB+j#r3"UbWO@0fE2L)s/I40UZcA WW gP3Dp934-SVQcXBs5 /Q~^s]c31:xc*lb܀j4m{8oRUgVY4/b }mse@bБs4>9(\ʪ*U`$(dɾ{@zEx˘OFzs{@C#4$:$:a!wp8LKfeň,ÑwA'=F?z X䫻 7V:Y*41xJ%DCVvy}'`kH}WUN4پ9ZR.$ WMoOB9%NED U!Z+*%w3}[))m_ u|޼Q)]5m$f`vXeޓĻp{yUTa+1Z\!a}60Ѥ{yOZX}㑿"l 2ΝeA6*r0єuU;A_̛ߴnZ1^EVEbu4Ŀ']e޻CTE(<ـT,DaZj`kDybpxOK6Ҽwu2 Cvϼy5mF#N I1ʗ#bĀ ihW79K&)vfp斈no qFOkx֘ W XJO^@F0_#rѓ͓;J2( 'oa4ucɽHf!] #WA}Q"pi'HN,&D}n]z2?Pjr>ɴhT+9P&BvtfRrw ?˰FJx*D2zۗrhxRPvM)aRSW< ݳ'ק'p=!m_G۴ 㹼>?Yn?mh@cA:&cG+@={S?8Y$eA쁟jL`& ҏʳt8G-}XWoNGc𑪉Xb @5$/65Q{en%a߆[ShO0KgG ou!=5Td_|vTD5 4]*vi,=SM4kٳwۦqȕO1ʐMR7O0KKth_ +;YWU7Sƣ^d8efϲg[Q94F} K5CaNP7b7$jS(MN'w\1=[AhqN~%.NR/#.DvV% - At>C_7^s67&#Nٙ R|۔tbH=ឿRu է+-48nPYJ7wM*@Ng?|.ŌUBӧ ӫtUD7_&_dR@ *QA|I*\7zOUR7v$@Pc3/p2hI,_RpS/Adb)$ivr5]嶵߾yHsOe*G!%1Tc#Oۧ^9Y۔ੀ(mЁI={`: 9mi._=>c$?9ę7oFr-Q XoB~ۣòI1a}LnvpA&PeWcc5)KjL3ji&j_42R `"Ɠ_91#f\qJN-k/E崿7\jLt>/=Rq<Ƅ A *D! PHɡU{i7jljYq/Dș܃IBM^$)#nͼ``1ZkG`ގA`6w7ĝҪc.a#ǤFa V7‡U~}o_1_l(S{Vr۷f[wLgmfU;9Uf{ӉdBL(G+;= /p}v<ʣEܗs WIzN.;/1i52ΨvC5@"ZRyLqh5Ԃ1*'i+>v ~ zn*V> 8j-Bk  <כ(:8Q,[r+8ͫېusgߩ 'ܥ "dM|3xօH1} ,Y& !D'utB?>y>DVمF]Z&j!gCM{w MweGd/.ƕj(]+&6L2덃emA/ZIkS^_zuΏu>Yuv=knpk"-k6 }NL#2h)'[ym3g̘y@ߏ~o>l;4rlUҺj  B-oZ"̊?h|uy}oڏ=6ԑv@ 8z rcR|hxrUo[X4$VTAS V:(nv>3qsћ4W?DH.X,p[{Ava^E{GD:^]TjrP&YA>"Hͅ]܌7:M:\ n/?*WۍMUdyT .V̌Ab,O/>( Kf +r WS&f7Y?ҶuJ"""X#AXv隶H@ۻ"mF mjLLW RlT8m9=캾 UdZD*B!Niu\zZ;qDDwTLSWW0¡DKĐDvnkMc×:(cɢ0i%bMnVfP|O#7+dL,$lSPXuw*3k?e3#$7kj ɑ)so7/ Z  %Gy'U*P/Ldm\>ܨD1s*]&t+&^Z橋Ar'0oϾemtÞvK"&13D'jUmj ?789+ 蟌:FiLpP*1}x#wQԊ}jWODĞu z+rATFl!X EUE݉qtۢuXz} Wa݋v9%+}@_$^rBdN9GjX`1Ԋdlł2]7䝚heq,+^?@̍8c6k)-Y:L/OW ИQ(>͘2xb}l+y='FAT5W21Ti~%Ee0C2Dn; hF#~Ց[r"psI o,m_!*ZͪЭ[! }#ȋ dGňAZ0p ~d"P6'0Nb%1$=dq>: -5|røv#DgSB,P B,,?Շ8Eq?c*¯L~ hJAQ>0r!bJ*:,Ry)N;uV$[Sm飠b>h,C;0LS(q>@ULrx_'p>{;;(VzNad %$J6^]*V|p PjU^+K /%TVm=JTEJd1nN}$D[{z,e<}WhA/ Rx*lʳp纇lY*kdua}c|.ZovgJُW_@ޭhUh5E~ ŢҍIT* D?**3@Id fXd366oo w0L`QߛϬ^t|<6oM0%5s53#iM ot>/Z6'}7AW%δR6E,MX3W`T c9L"]gb޳24g' E+3z0'@_DZ.ZP(UGj&IPYc'stSbd%HP QI&j" NH){EGк+>Y n7`]Sl]ϣ~|_Z^4Y38/1 1k\s针p~yؘJ΍N;@E:. 'KX DG6q^mE%}"a:VapR?6sΤ"\= kNC ęh3A|Ϸh"4%*-6cx $D61q#0;;9JXoN2xSBy/hx W ǹmY'%ՙ'b~ c% ǷW$Dk9VdA<]1Y L֪jei|:)"GH9PZhؔGO>SaM$cnyÄyrni)KHZR;@H*=!QAGJ1fwp$KK9F}3#AV^قؕS@[tknOx߬_l<.>NJL'tjt͈)PY [rn!V![t'f̻0Ls\*Z>cEԤe&Xgl=?~=MGm)S+uqJieMqK={J;9cU:z>f xlKPMyf1bnådž &BWtʅ |'IBkbQs"f!eQU;ILE`ꜧ]"E/IhcRW7Κ_s+بnnjr26GhikYS 6(]&IB.lƙ3H%_S#z!67PBYQ=AZ=|# C\K[5q=k/vU $fݎ_& zb-#Hy+dQpWn;H@l`~#Qq)mb#lY}%X6t[`oÁU@fԠh<;3Py Ri|F9h\HnV>c$R5KMU'rGD_uֶ}H{47Cb){ \{?\{UW~>VOg+8"E dlqV笧qk]I7%`k/Μ%(oˇh֛#cp mjpSY+O'W? i\`_$>e=lbr{Is[F-fMeQiVT^E}Adxl|^~z Pԝ5L&أED u"s&FJ|İ/xw!"jD90W%`o&["Np3ڳǞmq;g:+"@})aS E@H{Q5Dssc{":b|:M?ͮƾlqJh[9aLZ6]5`8^ktGN 5z!gc/V<_ <:"'IН+v9_Gr.o_\44 \ ;U.uYz#!P -M+鎳CfW|u/^Q[oӢqL n|۟23[u><. no.JR`5*+Wjj:;H7Q/ek{&54W ۭu2/ika`" &Z ,Q)HGBONqD'9Cx^TksIz61w #YMgxIWE8" lT=8-pWS%uEgGh]$DAaˊQaƪZ&m lD<9J!k@!2=,g3atܗp9c X[c*sv^Njf+\lm3&/ PYp6]cLf|:z76[9nlVF!2B(J-xt-^6yBת&S9 Ǔ#i'|aJU>6yK2wMf>b)B98?n#L*lU&B:rb$r]aRB:TUD :x2hBe:~z1:BRvgAwan/b3e.'QQiZ"PC+`C,=I^&9<ԍ 1> xX=Ӿǝf"Sѵ WPdseRV݀{ Zf4F9xe!uq}+1V>1{fz +x}o>~bc>~ CC=j[ .,"N_4qD zuqDpZ/iKԒ6%' #'+mf [ xՄBbx쥨ĉX{ZA4p}\w#%u3M}pNJ%RI#O;T&h+JD4HBV^Bsyw:NqOU泿xp>`ó0_` [{ClR.b{2L!Fw*GkdOө9xKE&#mޑ(19#:1joVB ?L!ɯc!yz>Oˣ'XV=$:=F|~: gu__@!.bN 3(1Iu}3lupa h4c$mo= _?VfR]$gRb?8'gvğcEk`НHtL^>w<蜽CFb゜VLF«Q17h%.#HM).J!'gu6OΖ1 #_N]a =1(gk%XL@Wk7~:?֘ X#(>b0:tУKLVo$7Kڪf͠4"F~|>%9\ٲ)-QaNTvtښr`jqLJJ8nϧ7a|͖Eh̸_"^]nryC},q]u;;k˒zJHd!ol0&WZRM> {;C.XۅK0^6cO"km] w_<[`DǔhqT(;俻w1 f47=cF(mQj]%&P&"(pb&tAC\+Bh£I\z#!޾汓 UݢufhP}'yL[ˋ Ν-  C̪h @Usǜp.-/-L;L'uW墝7I،}.꤇Z3^ةF'.$u&Ƕzvm,1)n0 78h#JPqq,[|zzϏZB4#epZu+^^bŜP$ue?N#LKJp"5K[#:C}&G '4U3'cNQPIE.ώNG߰dc`ʅ;7a-a|T.h-W QI5S{!,vLɤu\ERe^UԸُN}77g2%ϪB\?t,lm\}lϺ_70|2 L\tB}7iNaZVbpA+nWϚj ]oBrkIK39)т̖" $c\\L)#C3LZy6j'e؇/@#oot7Lz;h)M^h _; H 0v*\A8%= )aor8(]VTah ~yj>{s3$aw~ gZI$mE{*h~ɉZT+Ua1lo:=a )Cs:4Mг}'n_3:9gD; Q 6n]ϞF݋VY8{6m;r;" 8sQ=5sbդdËuVA8ϭo_ϐ}Ѫ q 9Q(-f-믷.n-e~2Mx Ua"B2|&w x\E C^t>=!뭦" iNFÎ[/ר$(,IZL҆V962+S)Pk( =`+JC: }f ؐJ@3@{8RQzo5Z5cћO-&QK3^3?R ytܿH-kJ [lPɴl9^閘)l[cN/5VD*N*d1f:WoK 2Uflceٸ2t /[v`e [JgpZ3v*bCv,lݵH=E"]Bv˖e us*)v5u2`(HX*;. tw . eǜ[Ŗ=r,`VU1*/vzlIWۺM~9=#avp=_k?凋_r뤢LDj4T%zK9v7 B7Ⱥ 祾*kG.JP,(u@ЊH8$1$C,ί.Pj& t2T߅NM"*8(*c'ȍEK1{N[{vPsH &$3ڐLHI =|-:\PQÉCoscW!< nbRT WJF\x-Md_Nou[@wkdeAV,9F"3EN("p iHcGgvݴFn?/?ǟӰanyshԘV&n!A[%<r4*:_eK= ojss|Ûi^_KE`.`U`0 Ax OdLP4!'Y>)r-˦&I\boVoS{v k<13wC;ЩgY+:\8F{!ͩ޲;S@VAhNIgG9".;e 5/y[];Zy}Pֽ.o.t2*쥃[wڵYp*Ŀ?\/i.Kpݑ˗#8@CGVm1OŢNbM%l[82N8YcfS׍l;{Jk3'#pqp(oN\)B7~d OU(6dv<CJXҋru>s,"'Hm+*7GQW#6Rut2r{E6NԮSbcDTB`YD\j o 2ʯoq'v͇g^g.DN }G^iSq CܚfRJqe$_|}NVNA]NwF36?Y5J-N)Ljo?*+׀m9 N-)YI9&Xx,yu _ 'վ5"mOڪ^qUu!vI۶ETb"IUw'۝u/G Cg7j1lE}a3hPd}935[Z. "`,sS%ǫ::Kex8p.Ͼ*g/H%(P's8SКdsPfKOM9;>^Y8Ҹa~>@E 1~Uۋ .l $h3ѼUV OGbۢ6hl]t"zĞ_pޛ[/Y`V]jQ#yi5Ɉ&&U\V>^e; &U\=8 Aߎ.3OX}h7gz! 6/NZ “'Y~ZU61`wV{w>x]Jc4i]xÏ?~lEt%;$cJ:4U-cBK6~3 ^/{˚u@ރi]stoTU©xg }ߐ󞕥z/޻!s{ۇgOy#k) O{u8[:9ZFU-/gGxdqyVa3xUe63:xgp0"+$jΖQί{Ihs[F۸b>OJo/~@QHSGY: URPkw_Z.[-)ØMo>rbI8kh/[%# %83H+kHфh[Xjdf8'|Kf&s*X2DDμ 5DkxbJ:/Itxqn[dj${2,eCd{zM8:c=Ɉ=K+W}&x|ڧ*#~;9ZAU%(~ڧ[DuRW}*NR1Ub"n2XV5Ojq&t"9xC`~?rwE|!ϟ6 Gk| <+xACӌ `3v:.8D6UbnA_ݏfǽ?併mVY+YP}A2Jn=Dbl/J W^G[n pM4rlg~檜>V#xu|rI ﭅./j- I\E*OkHuIw-)E뽈]<6}?JiZ38 ]]vfٍyfBd@L!{RY# + -Glٯ0y=('uJӐh%z*a)^ّ %!?IFnV[rvu|7"h %B=ÎgL*Yi4]cדoi|1|>_on蚌f}% bޒ#nst|q\/>H5yv/ XP@|6ぐQ(DZI$f"RlܭhuXZonȶG;bR>g^}6ZG\Wx> Txe-CX)b) wѫ}N֦\:FʳA+sɗ>|XQC*FMw qLL3k"VɼZ5mXF]An:܀VD&EZLKOƉ$.Nhkz-n3\#(|ByS_}a#Á5RG2,L\I 1yY7*!e5opG}9(Ҳ%p-b8RZ:ËH;Jlxi9.ĝk3վy؉uPUzR5{LmMB*)zlN^ѥTt5xi1EIFamT:=<>^nrg?۷&gՊ h#%w#!RH2ե`"Zُc3۲! ƭ_gTpyҲGGyqi[˂[3vSKӠw!GtG)p s@4)j7%W+^RKC{63!__6}煉~Uzx_~Rl1N*):ۗE)^KxYD8*qDZ2e'L}"щERU}xI(aH=6CƜin4Id~#ծ>򼜝?\UtJ2e8s~X"7*=ˏON $R<[kdr56',d (qJŒTzk-mf= PcAv*"Y?n\yA@mǜ777`v#TL'lR^/WG޾HΞ/OπѠ`A]Tb`>#fҚȼRdyffY$|}d)^RTƂKP(,wzO`Q/E9dB?'R1 :m *$<Ji, ip7]? ]p^P+,b` V].uiYӓ=ڡT^ى]5QH(a ZC] PP^ф|)!86(v#`,pԯ|yvݙ3|e}|AV?=jōݓЪd"v"e@76GNJ6J5sxVF1ڊ"53l`FVqUi;W= ʧugr"7gI+dHőJELe9g<^G1(WSy< a|%"_\Mz,qKRո@yz@j4XA*qbTx4x]`_!bdg5ew_^1Ԩz\6,\xd.JS}w3`F ԌOT~wR53) (RKr* ^+ccEhmD d2VFQR$.3|H\l`\(ҫ]Ķ_}R4Y՛  1d88]IA̰L:D^80`Po/HI1$ڛtNQge@銣NDžA)|ljk\z=ˉF2𓫳\+gXeuu'C`ȥUE_W[^uDfHd_e=^ѓй!FbDJTl)QiGF"@?ѿvTxblK.X4ƴPoJyz?( Bϭ$i9BDo/p+*jI!Ƌ¥i'3OLe@[" XBuŘ0!*iD\`x&uYKĸaOGHcAV(ZZSW^>tLŋ֪%*d픜P>d>_wn&Dx3#w: %=VSqx)4!{UdSU^KW7s璥Jܿ8rc{$>ĴFHW;=mu)E>y USE6]$;MvH*Y:uQ}ʣ()VmdPj~p^!'!Μ^>?֐hOա*POe_-~>"poFWiI apۘL19?-L&wSi#Ce*G1vaTX‘^eH\O)}|M:nn+. ","H9}oQ5g="2񔈬4>é}d[xoKUR&XUo ]N UI4`tf>{ W><1%j駟;YRB4]ĨBt6%͌v4̅.+Ftr49A~'7M+i[g8?5tJreQ rW)É ҥHһ  aM j !.@.UQ dTXDlExkm' cUED*)A#o>wq0ܘK|\:΀*B,t4XŒr(S`G o􋂊C#kt{]<VFu4)ȬV1SNA91I\\_n ߠ@)4:WgX566 .-J wHۨzz coa 'n%NXgjIsjҹ=c8h]Y7c" d8_9n$5uxD:;ք$&%a0QbJ_.GrBu_ b8㒏=BjEZ:0nbAT]D0Y~[|JsDp)#BaK؋ȩa^>Я5/tܮ_{^NGN Ou|W9,mM`4"G=1D.JX:(ej?a_mu8.*G'!ޢ{_cE8 Zd"p!kP:dFP5ffzяc/'yHhTί_OLm @{?oI[סVbM2>PWڎJ0XFp+]e*YQ7Z ۯ[GLوB|i8\ ?thHBնZMTȒl4*UC+Wg\orkZ;yCzpɫc u'POeT4F3ڤCvԶzN q_+F2eOPxVK!Rኞq+:M_JBO=0XQa-?]tN Q 8gH@DN @k 9tUr^9 \).ndNM'ǣ[ᝂTolQ{Ͼ7Υ(~$(Q!(HՂ׺(u2<3φG=ުxO5eMv>eWv"x$5j\N^|42iGgSg׏OZBy(K[ƍɿ}лZ.ntru̸X:o(-u<$&|JςuDEDaqV.){kHRQ6W\+R&eQ1غx:O(c]ROEstxuK %c)߹p>Ɠ|DVtWhИ $+0\xo-S-ry + 1&csah}@m'?á,aW鐻5yk6kzaKdk$orS[]|n}k#XWii/IQ)U8 +5]&NLjtg$G".:|CWkC||u'ϰ 0Uf +s NB%*PkN!0̅c=.7띔图K !$,/ڱCd*|5?89:œϗxZb>vybRCFoU M`j'm}#&!9i~1ik\5P6D!$ ChمFF8њnYQDu$R||vvӄ݈OYw&X"MQ@Ng,tcN96i[ffS#+6?n0j/98VuHD2҃fms>3T?+M4Bifh"TV!*eR!dtXXP"TL 5ۮB@y@ N"}Dadg[+ĜY!T rѺ&юnj+(LLdIrꅫQWۖ#TYJTfE: lN;_ċE>.Ez\Ԁ耣qM >DM\icڀ}pF$`r__~8ԓHv1Njt+)S  B1Y:<:h0zzVz>,IW~.?smJ ;M~+=D8k՜0=.L*DZ~J z>3kfIquJ f3`aC]^$ %ղ$1sNj/Q I 16N^o ?'<B6_މV0x[ Sb8 1ebB<[& P=wy61쐎7o}|_aMg<=(.R.[i}#%oIE5Q`i/8e 'Ya-T~u}|]2MV'Ħex~|)_S1$ \*3J >X5}alBgsUPV!Pxю.Pr>I||ku|(w𰥊x޳8mdPf҂eLYqYR]r";pg'Ցޡg6BԐ5a&NE n+J{dd$T& !a+)HtÓe޼سKHc;[;]ﮎ^J]|y rRC$qV%aƎh$}|YVƅa2PJ`cyXehJA/;K{t1r>t})p"`@(MCT'^Ԉt  '1G[/ݺJmo1htǟ2ݻߊ\ry%U4 NޖSסS"=0Uai//i9^U St.; ;<\uJ%z YmCz뤿9U7Jk=N Q1#MIgViyy8yq%{ހBl@yC4HtrGi 艫n;lyv7Y٢xDV\Op"/PEfMvfVèNWRbR+rTYMn%Ldz:nA.a.ӱ0jau&?P7;'jǿrGX>pRnK4?MJQ:g2SHOqSXX%|.2&$j蜀R^M2:(cztnupc'__ gI695OO.gɟjuBEuȾ5-$1YHƸY\S,gfwno%R#eoMwuNo?Śin~G= 3~W/bܽEMLnψqBE\gw߭MYӻ-v<{k|@px_W6W)y7NGߟ^?E^y>)s-~1šԬ,eD^wRlRY& tTt~MV{!0lQkzAb^߹ާiI4~ݞd+\[!v4DN(@ B;"`5)IX$i_ULt.mHN85p˺Q{\RUtIO ?بVm1Ii J<0Č^bMPPoֵr?-PC5gm j6T-wZ5ȪHR"oHf1!6֖mnOc_e% b%fRj&4)L֞Za]_TMT?&vRh>3?[Op‚q)zJem#)>$YV.z^gx"Aw:gȵ1(`"'tM/ӑ!L9=4[ɰɴx]`k>93 <UYgܲQ:5SEP T2NUS_8c⩤R+aA\\RAH8lmˁݩG'"Ul0AWr $ ܢۡs#8nא]^҉iWls Y$CWƫ KpJNnOlyTrn\@{[xTU%sQ˩TI7Fy.CVJRtk(ȭJKca=pb %":/Rhϱ>z*ѽHq4<*+5t%)j*HJ<cۯo;4J{9)ן鯏i9|uJ~3)ǝjGK:A% 3!T⅀Рה[&|mz*P̄y3شKX8/ JQ2.ߊʰr}}~/QS)YMjf?1M҆ONËeSVz,-\ɧ wv,`WMka0i܋I9ͅkߡVx^`'vQZWelJԧlak[kU<1cn.!"4! o>dZ]n &u糿\:%/jٽ"/~xxRRU0R)؝@6I+ ttL7nףOY&boh3r7oZg>ۙ0<'d8⬣b4!{ÓB ף{33pT3qExP3Lͱ~|xri4Na[I[M/~㳶[-K{1 j12XC"RD~߮X;mLzwĊiIK &qkbdDy,??r@a#ap׆rGD<˩sy~:k@)y[]9@lEbjU<]JF;`jyyuNQ- DirRu'sa#84!68NcRvGϱiv)A@""8E1ȼU8_`VτAەA L4REDpuQ^Ă nZ#~;yY G)N(§XOL7G27nbFbفH$6hB <̃y0kA11q莰G)'WL=Ku`͝Ą@!'Fŀ/k6" x"R޼oگe԰ 랿O__Q*,'[lRz*QҙaĬ!B1%ƯO !Fp,#bµ~z_% n#/kn[p|q7'-)WFgbne?>jIBS6 (p^WDŽ5{LDR%Xʶ# bsnPlUl 1ogI90ժ`'=D&^a ` ^eR5(p4Cy"o ]_Y_='MFܯ^`,9)8!%2=oJA=E~6=N1q7/Ͼ/8-_ )DEf"b k ![8ꔱ:))N>= ylGnaCb2;N~}9 QFNq5g-|ˆeMD&B`mp7=&S$^#&=2Aa*W0&* ^1l \'Q\> ?Q\|wXœk٥c E&@)-T@6T>\&F)Fͨ1Q%*u@P^44|~|[ #H᧯z,S7c~{&fŬҨBٖTQ[͊P"dl!vf0b#,`}RBD=V,Bь$z#グG쾰]u~wT(Y'pKo1' fJ)2e?UxFGӽ@1)0:թ8p6n HW=bP&F`42jw03 pџ:Ҧ4 `:sW>geuΎ<:\\PKqBjtHÈ7lwڡhNwVomCUe vނ yL,=f:>N/Wt` 70qfŻܔAo|ψNZN90Y g_*#PH~S>;`KkMkeQ|{mG J,1V`UkI Y"0-AÏOS[=&fr&5,7b%ʽ6->hF 6 Bm.0 \ec zCre7Z3DƏˋOHirh_~ynr0!A"ιhID7K@VfoNfK3 Z)yƴ65;DCj;F w5"t$|4"%nNě<ǦV`Ÿ9V$mؚ̮HՙPI71eeJ Xaz,ƱsXvYǁ6x9Ak%m @ #]KrYybpbrU +I4T o;F`]BF(! HvF tKEϣ2){;VPt;m73`ϊV9 IKakts'2w_uN2Yg-'&uB±ȷzZvz=7Ǻn`) CDX[Ib[wv VVk;"O,7Am+<'_诩eOg`⺠aedΠ4,W >I"0knu/&,}N ~v[]չ`pPcې2`VtQV!c[UGFfI% =Y֎;"2 L!cךk}:%^<),5Vj{6^7齃E9o,qŸ!yCo0Aڦie GO=* eM֘,iH?(wysi9wrxH ouo}^9Ow~x;Lx`fly\|bq\|*.>&7L` 'KnUbyz;b XI RWDTj8]&QIWVxkeb/f, $0(_M|TX  )ez ͸Pr8,kƶӃ: ǫn8VJ\e۶ 3)d=9#l F,FS.wcںr vFгKV76`_i>{A;~e7pT%5I &1P͸%iOjŊR:-!D08W\56b>4U{O07]qy`ݙ^ګ.# S5#ԷBo(KTQxx. %5(yJo7ԶUiuhSDtQ.6cLJ~`溼奢.};N`(1ЊRtXak̋""\$?ES=GFQ,2|AdF$E'Lb۸5(hq'7vEaX wJ-Qrdz񝟅珮3X¥D2M9RɡRԌTHË>NTW<ٖs5\p-^D<+٪D y8at5LAׯW|R,Ut*G:*RF "Hk|;{kRVF#ofA Oms\zTZsW]Dqy!֕ J\N~RK~y|'w/Jtf_-+ϟ9.$NSdG1GG8P.QB8"+ᦺOQX\,o/eIvB0ܪAhڍGOA$!; b WwD: мTlm T%y "k`&HE`M)Dv.>B 0"cn=(щX=&Rd,0n%$6fÕe뚧>l_T3Ȥ2XKhj8Cɀp;Pbzh1r)K0aJT3NQd 7Eܕbih<EUEy(Yk$&57&7Io޿pcۏɓ)2EKzTh8#C^߯?qZ8'gTUӲG )|W`Fpxrq֪!| vml(_\(^]PT6Bm/8|\f$فD7Œv9动Zv5ķEOZ[V|bǔņધ0Ґ 3|Zʓp>J_ch탕c/:E3۹XEgԨT2g:{}q1RJiwԁJ4cZmQIWwI'd}/%chs C?η>эbV˚ Q&m&UD 0XpeW!K[~~z @B\x:DJjzKfA?r>_ë:!jkՋ~ե&ڦDLTU#U !sX£A~'YnxѳWY1VHz)k ).;ۤo+ȧB~2A0e4NWFv6 HjQ |߄k`VeҊtK Z qVp.G'+8%Q|ED=)%H*Xa\/){Q Eܖ|Lssg}%FP4fn x<_}2y3CU.|Q/m_1]Vb"!DnJ~tAKq~j`5prS)06c ќ$WKIy@jpX! HX)ӯV*=\cPi EUJ'u9iz5~*t Z/09Vx4eSP <^g^l%c6KWֈx3$(T`u=.MzMN^Ektq0e Ԗ.}NJI겲h!!sU5wMǜ]ѱB|~GZxsfS,4qMȪh bIE#湠ULMT8;Ǘk/7*qO-wu|iӌB&MC<==I!^d""-.]5d$V Vx '\g[TjXʶ߳m6`"Z`Ӥ-sMIn Q W`Vyj߇BLA0\%VD&PHڍP5Ep19_X W7}lf [TI(O0GvwB?ZF" wUS } q'cr_hig!)Q O/qk=١kbGQ31Ozp|q,Gal KhS. g0YRΈApf#6/7gVm4MHQdѮ,hUXcʛJJ:E2q"4^9B Oe۪ˈ<KQ>XKB0DKsmdqb68D݌TMV^Lt j8Բ} F˒$' WMWis>RC,bUD&L T)!0HZA*227aM.dwQGKd"nJR༑5(i40q'G78 ,8}q썏테!]jMo4`q#T|ֻ GR alqor[̷1Z|1*1 hf"e{XYa)ix򧏰TeZ׶j7/SP\SEy!.=hgH62 jfa0L*@7RI{3k_%H}4'rnhF+۴Ҝҽ)6,r,2Ȫ)S^QQa'3#B6IػKoM켫5rמ/S~<p["aQ3XOmwݪnjz`ğl,րMm^䮫PX*C/ƫڋT`keY6&T!F˕]SVvSjR!j\K.SxzڦBzX# Ixw{gFS3,^Pd"ԅ-ZbIO.bϕg// ,=\+@*DaD#rzS$5\Nɪ":ˣZ/ ҍ[JnLfIaHy3s͈:_^l%.f5ca_,E0Ӌ՛A * "3*y'% ()ӆW,٧GK7JiC> x\D͂+4BF%-9#ɔYF8ުhO(=< aW"aF^$DҴGO<J\$9#R=8?+'\V.X2g@BTpDl7DQNqߎ[GmO aHrhSq^qwb2]@1v|vQ0dT[@E%5T)cWi\{yM4+Tߕv f_:|w7&֯￷&pS:fF OI`QWy*Gn x҃L(g%Q<$ߢ;8oxyBxz:d`9+Q$$i, uUL00umDwbM (:̖S(1"}J OǥV s /IK[z[U_׶`>/{?_7U>mm˺I`pI5){_iød'۷6wo xd7ڜRJ¨撔\gr嶡T |lDՁp?%OpY S9WSIWF˒kt)9zс[J jZ޾:aݮyڳpUpRelzDّy$BDRv}>:蠧XѤK?U r*3 Mɜ_6J\B.EӶP[بCEnR#鼄}JU^e9k)[e&ĝ8d":Tk(߉ZFҴ$jz-#Ј~iAX1[6CMހ59!JZ~kW*%bI-ִmBqQ`oy+5=䦣Ire̛d1@L(C7|x?t>nr/N`>y%l RH]bR (lPX/li >Z„/N0h(J]>QyrÒ=2!\Nv5m.fA@.t(,1$J[{=')RxBOzg#lk45cc_]XJOsO>Zje)+))97j=|/Yb3~]wv.6/l~j˅m~J͑_-y))7WK7'*zs6/o|ʱOsO-i-q+^jO?ί޼;Ֆ7?e6m|JoԛX #q1oۦRR8NG P3m#[3MP}$ZE٨x"<R/8rH2e_ *Ţ-.ߛM^iR? Ilj" eթ䀭$z (dMkr$,zZ |"p`"]iL_C\yX.['9Mv B|jՖ~գǁ]":gŋ͛{IOzŸXM](Z~|~~~,y@{T₪FB-O1b)2P?dh[,ŸWLPJS o'^iZ0%8q8:Ey|r 8Z8;H"f2@(Z5qi,Wa2 `DO׆b£HAPZ&vxrv g}̵QANF1(S s_!!%9"D܄jɛ p׈&[xİt(7WW1ZosydM!j;.<<|Byڞ;?S_8_yp|qĺQ#zIu%ad=\֪(IWIv\,pcҥÂGF Ÿ,NʢMEyڄ)pBUƿn}Pr,bsS1]Q<*V q[4'^xmoB}Jߧ^^*^-v;J=:p>ړO4%JDuq֩ǺBZ"A[Lw؇*Nj'm,@Htcʷ/yݣ)={?xD)W#_M#-m/vo1${ F탠2hc &v`Y:y*LxDvAF鰣͋hS.^xjD$RfBUvj*#!PųrU bemiU0T <a3Ϫ5-k$e06-P?kѱ7Zpaɘ1Ȑ>⵶y]pM.$/g9%Wu so 5ݗa}TrrP9bT6TJxqXJ[{kdsx$[#0i )M X$3Np&Ӟ[e.1 w9ђ,g)IRm/f9hO- 匊1|3N#I<[.,MxKwfqRY )ϰW͕%LY51FUK.%;hـBLB'r뛛A.G`kN1U&Q;GeqJCyڱ4(ěYRvJˢMq&T=0&Et .ooŏLҬΙj5@om-XB0HI411ǿ`KաF?,+PNfT,݌esWH#&Wd O@"WN"&@_bUCꩌ*zQChx;x%&W&p4wZRԛ״?)a&; m^ AZU[:!ZM!maNq Qo^}}AeS^)URgŢ [7V YN;GWn韬fS67HB.s ^@ZeҙiLlDv wWFcW. s]3LR:s.'CʁC[yl@x*h]a1oEѮ#cRiUkؤ.$X,1Y LĘ\l!R?cLxV`U\@r&V 0J>/|vICXb6ồ, o}-*s${&CF6c7!0t_=o&d!'O Ϊd5:,䯳!ua0F182TR.05+`h >ΉMtkRڶ^EeNrgF  g5wgY^lة\=uZ*IG˝[E#n)vO%n7)I050 |LOeªAx{/m7PDQt@!12O# pj :&/&/ ɄDȍDKtvCχgXǿVwLZV"V7U 2,Q:UwOpc2ڟ"e4Qn}v@H+LP nzE)%r,'GtDR9lG3.I泯rQZ^X_B{YPIzR39J Eu6ir 1fw(v$O ,Q`wJI:qZ%;,Et#)V"n]8>/X>ߣ6yq8?+hn3YBajo- j^";#$Pel0@ea2´:*|l[u[ 5l(?ҟ?8=uUq 3Q#w֛%cM_8>3u'4z^8}o4zکWж]X)؈(Gstqv4?}"Y;;"G%;@WOc=:Y]8{𫟷yB=xqRiC͕$JQbDO?jqgȅe,XXMp~㇇2ţ&^|JXƥW g{?D\CzS<:-9˗T, ]Rʒj^i;{z'Ύh{4Я8<Xec *n RH765&8eR Ys\scyUJPDL|E+g, r{t5nLr'糿h u@.f2e-HDg}R0FU!eYcSƞ!*ٹ29?8~>c?D=s?jq=D]ZH22JjeWa8emP;PLR{t- ,=p} \ Du1 hÛ"?FFS_mUc54IJoS<QX:8-E`E:DU:7 AFԩoL2{)HC*{;Խ~ w){ / "z%ˆW<#VbZ-z`qA@ _Ud~1gK6*AZMPmp9t~PrGۄbz{S{ @d^^Fh8BܠCsDqĪe!רõRCI׵9԰0\<(8DL %X'Dmk/˶`ɾ&(3d e[n~O~n㕏v_J`aXbԕW]PAPZ2Ʃ3 +0x ʇ%Ó;1OTZr $rOvj}‡ݽŐT a]H\.*eT%wȠ$_.{Rf{LL"6.K'=a"E5<D^]eą"E%^mcwۄV0}Ńg'ibe&QJ"" ag͒C^F0i2IZdiF4E{JP20'N޳@'G̓l W ]yX9y)O4T{p(N/QK;d9xZQai*"M>Ye2-1Z؊u5pol6{GIɬzU7`LT6]Iu\hycvIɯE o' _zln*`pJn<۸@"3|ɚ ( cWՌ\fûKA"أl\'߸N-שu"[ rTftDĨ (0ZG8ȟ^tՈtsȗ]rFI1`Q&4:?,I1d2ZwygMqY*ƌ2K *5f8jyCSے6iC@%KRdou':VlruN'JFO*XB%X5.FT.gNm)D;Ui@pxJbh+VT$f nKaUQ"7^V}vps|tqvxxrrT;߄l"g)p|?  2'!Q`h̰sA\3ؒb:㜁#JYYb5x*H>Ix,>ϭcEVX* PJN–Jy2bcٯ 6w$e=m9|S.*o> ZVU u)XBQ$اZsOЄáqv$o=euuz!UB;}7?z+uKVr&LUyj9,5o]3ɨAW%w0jK$9lj8RZ!WNL}weƪo`z`K͟4(糿 *r0' &&UXnYV!]%S>\xs|1%g_ɻΏ>&AH¯hi.u̦(t#ץQ0|yyۙ/qcَ/~sw]юjàsf)]6U"mـ @f3DjJL<\ːbXjim3@Md]9]'QxR_FzP:|WI֥BS Dˣ]Ė@B%^aq$6LM❇gS+-HGxzb"0:v>мv+F0KĽ!JTs)z(\;>l:9j:+ؒ^evT ٷWLZwE DLRS2V f-Xd6לQի-gk2g4_XXpǦRKaU`\hQMu,6 hv,;f/CL&sLc02ʩIDZt77ilva&i0_HCprk&1mu߬m%͘j0ׄMTMB\|ʴf=f*H Mu:aM>wDpI WuU\No7v$79`a9kT,+&'gh*Sشe],n[ʏ?=9S Loy8M)3\Ne΀z|{.dO۶ 3?[56ZZ_m9v ^w%_} _|2y/Fq> _~ǟ}*!hdOڟ{hcc;TU# Jzrm$" , ,@8 } "5bR9Ż|p8Pl1Fj+3P I~2=dƖTWV-#1x6tI1QN@{rvbýEO'J(Wr%Hh$h @o&UZ4Z$//YQr2xr[]|TBK>Gb7ˋ <%Sq q֊UeB\٠{]jC?wu+*ruICxwUv@H9 BRYZRFar;8|̧SOrvrX"6~?W$:Y0+ۮDyXCyB|GɚK9_mp*&V }V~cW\޿qB2 R&doy$ȘpBPtMKO;՚OVg߽w.b饖C}\ ĢM Ri8yP%j4?Ǣ_s廃M|ѦL)/]DCY;˓PA:BD{ыFm9qr(?U^jn6ڽj<^D` K%\TRb꓃pf}+]i6|{JXkI7>hec^}sh$Il3n{Ky8X8Ǔ! $ r5E0ZYGXM!v my AS<_N.L6C= 3Co&[A{Ys^naXYжL$ǝNjzi_i$hW[,73=5vQXVˈ0\pT<`Btq|]Y$ +z Rޏ|C ªWe<,-Ip&9Di}grUj%(H8 "p1HF9?x ̬ISŘXϨe^q}6U';PJY.JI nlɀ ;Ë,3"8gg]t\/ɒ嚒R (b}戂Lۍ/pVR!^yQV gJ3R)5NSu\/0E1+c$UE9VJ4U"PϷh|XP CWqUVC.m)Kf5,(m-p'K`qC.s4!X}hQU15+՜Ḓ"YVGy5wn|G^tUN1D/<(#˒@<pUkT7Ix㺄v55&rx3g[(JPƲӈ-@dLx` #;I1k)/PȞ3z/Ύ{?h=<:9{ƥb1%&(i'L`1:Uuܚq8^S -1{,|v|io~Vk`}@MX䃬+bUANʮ*圾NIGrpJRkG4͇uw洤}c#&CR%T!V&WM SfZޤ֊:|r:j*@J[7jEBC`I1w^\+WOygnD$2i؟>׵ ]L4'X-mEZ=,KxR䙧7bv|mψ*~E{d*X2i0SףtpBm_-|JXpt"iR eL.,2<;R .d b6϶aa-^^VIՅK7gQ*^=?9 3ߨZ-m6>%$Tm_Y5'-qfU6@ s0_LZlL2HC3 |== gOE2~l rȅʨs"QKVJ!FDJׯM2~9gNoAƗK~__n6tN{š$l&Ry\uI,r+ԱлRL3/lS|vG''OλE`.#ʊ$PíqCM/]ij|?1]:"ll"^+H/oߣj^7-D)ѩEâ/Rj^g(S>~tp~^Zr $fg#6>Y4$II8EQo9y6޷Kl~^B1^D[ :08iuv:%ԑ9?p]2 jЀp.9oHt`}c/|\>oǴ3 n9mlx` \<h@ oԡ=U*ctWe)Q/@>&}jEjpuQ[c5$(֤&o#J z? d|ix軿xnǴ+ ;^>\!}rbzxtAόE>{r(<^֣i9|;9"A|0|iU雈2֜[ƇB)UQJpZEXp}vAjڣY-:n/ͅE@l8L|nJ'ҺHjkŴHSPQb"Y3 P }ȅ@SCQ)&uuW`%׺l{[d]37v K/bR_ ,&%m!Ɍ+UⲦQV9ybzm0O6_'-Zo}/o3 ӳt_[aJk5TI ӕXӭU-a= qDh`IċhlAd%B= @&HNnXo ؜Lt1XL.x">f`w4{4bN$5b8+-w p7L^G+0WԤ@#d$hw֮ɤDpJx]&[D   7#CY?z%Q?h O损Pٳ F i9R5<LaYsCx]E߮j&*dDfGGgntt{~G~lŇyҴtFhcs20}S؂!x/^ oo! {isD Z3, i~_?ޮP6~RװE]Ãfqpzzp]$F:-6N1S<vuCL32ȶEp0j:Wo;+En}o^iGp|Ԡ!={ #>A Ljs 0i=/ xg5m;lI39wcwKJK3&0SXQ4ڝ*pBRShqCPD]-#V)Rǫ[bIBb[V.i-#V/j wLeGª@Ru,Pi~}qZ3q7iauV9Y?j>e#"-?n\^yHovH|o}%}ERyb*@<#hŷ998"FHo\ 1wU)QaTM5x`fX$r56 fVR{//]4YKYF^|R9kTlۦqދf v >8P=dEr҅F)N~S®ف=Βn~+9ͽ֢988\PmeiY( uC)^\ y,ğay/1=7yloŇ֑uJR SNZڻnamM "tUdbpjc٥Rΐ x;B4VSLBġ\J(8!}`t|_䓽zе<Ȗ&cШҮ5M6Ƞriic A)hӣJCÏ-kC}Rn>}~8&1ÓkF{D^VnpbqrgE B6$|`7hlH*0kF"nZNɪ[W bKANQ J;#Ei5"ˁ,˫WX+`K!7q0h9w.UzfMRĔ2Qx#(!zn8 Y&^4 lu\{2D#n'dvC[#IZeĝjU;荎BOm<<`dhg9YJ_.$ \$0H47C^n1=Q8[=qr4tt m sBJ,=(n~l\|ǗMg/,J>8Qڰ0dh>EjkFi49 AiG/ c00o<ޏ''O`#)u&)Q=7}:v>?swx#G$O!H;{or9sN\,V[ 21?$z|ppܘCW9޸sp;{~~gG^HKsдYh dP W]OO:JDg<[m|` R:9nWpCW@ </Y,2詽i9s1ļn\Fms2@8!7QȗYn? L/kKvz>ƙ|RS-i#ͭ H&8᫔2%3njFb5-j ÇҲqWMn!@c6|e@`aY#}Cew˖a+ =ljy;U5,ض Ֆ(7eHUJ@:g),rֳo 7)l®:z6\L!$4qt,tRGxvSCՎm?{`- "Y,g&H*>GK9N`gqs[GߴX5~:d:&^bC%F?9`^Oe8_ Ap 'jsN)%=ezrvdm8i@%68h>]H\YHB؋tvpzNNj0ȩ#>%&mЕDK:,!zNS-K˛xҞwyR" %09fPۗnʕRpmvDLV0\mrdnT8 Z^{T*x*I\\77^¯xOIcŇ3guQ(| 00XW#}1n#r{$Rk I,\UsZp_fpԎ{rb( cYeɆj55EQ- Ey pӁQsOcaw,L" -u.ILИCغ !]U^˛*x`6Zјu/* d=8_t߶1KF~`c0uul[-ɉ3׌$H5%"+Zѯ7#[*,C,8*?gCLʊ9jb2d+*#2 $v|ܔǿor*+H|^'G?'^8~xA%hn!$,U׷“3@&_EfCe,XWVO𭦨+ xd-NA`GN{vlϗixg/t16%&b#d+{1hYnp0Ҧ[O. .Y *Tɸb~rߎ@e_/U"<-~8a ;(BP{'vm㓳lު57ЗM]h _(g;f,$znIEa 8+HaQħ۳sHw"\ UKAd#sU¡k&ˎjiM8T )`5!Ǎ9T@Xӿ X-0x˫Wlp: O{D쾰:p>I_,0zG%\T,A gIhZN~{)/v{6]R429}RdRHFj'OӣueCygS3ޕf1y yoBDL6o=I5Is67#:mHH%ap]N8n$Mk$>ovWIuRAz7wOXnI%ЄB-)(-pKCahM<KDt (%[VۘO7NEZe;^ %ȳS$8<_11yɉ}E9xr% T]f],ނ.r9oY{1.'+üÓvS)K8Xr]e]m&< &[Mk*p%Xyn?OgPF2pL0+^1R4Nt(ExLҏ(ZȈt4D5$*ܘX몱'Fxr,|<T|qL a5=m[҅ JNW>0QWn59 ʇɩ{tULWGJ(*;YT.yvjjrbiԋ)(%EqW 5 ̽Mk.g2Iem 0q/ "p1FIĨ0,x $'C6{߿?ѻzg>q l.fzZ0O̐eGyjt@;:R<|\(~J\0<$y%@"VokB,e1j]k0Lx1Nn]㱐QoL($,l]R"Qqjt湣##Bĥ'R1}5FX\SX[S]Ǖ` Ŗ(1HЍ,5sHP}*rcF&|6g~\sYY ZАX/ҟ?wkfZ'6'EDqK*xѶfHu 5i҄ 0朹!a)HI[A '_-/ɚhD3jK3?xT5bbҙv}wM& g x(zGF6ty:V7|w BCfR,#8?> ksv/V]mךLXk#w$k[>o.>nPcЉx1FLB_3k꾅#M"wa9:?:;Qzսo͇1ٻ~0MBnVwa2'%2Sv|F;N)N!}!f0BhJ/2BG+:ƚ =b"07vq9$o Xh많Aʗd3Kr<5B ns$J"3|pkhU 7%,X[=M>q Ia:[nQ>Ew-RtFWb8Koh˓ 7P %VHhWVcsů;?Y<,z_|L ;,. '2^%*rUJm19iA$9VT&Y f$ Ovp# GQwī ̻J!۪"^XBkwFxSQ[2}S2^gBG4ǨG5DbRh=עO5Z6Ӕ5%;ĦjT3bcWTVJ1kEW`@qI3n: }ؿ.>_ɦF +QTDC,\=<ӡ'e|on%_$ MĴ ר=.л .R3J҇Z&ԍ b ((tQcTƯO:k!sn]]htrPXaD6۬`ϝ0X\H&7Ƚ sDUW}6Vđ%V 'vd6N4595%UM(D@K Y[Qqݔo./ʡq|Ԯ5c>)Fs}jq;=LWa|Yd < 9pފ$j'F=]Cdbu*g ,XC،i]VskpOr@I=iÚT(HkSت'>a`$"lY>e-HiZyoMW5`d9XFr%^,IJ4QeaN #$96\D"G𧻓!RS@,\zKl?yC~HjWD$Ct*IWY}ج\!X`^,`!PaA#NBlseO]7C>d/^X3TiޚϾ~p*cⰗU1Y)ㅤ# E2~D6vyL0zQWivQ8)'據 .b|gXTdl!C$4WU:MIK¤Jl$I8ޓNd1~F5BFP)k=+Zm_ux8BE):(Yki60]o)&'pD@p$3oO3tyC+̡v|w ,e\F3!R:U6To ,+bƏ13y(NPUP$8|c RҘ@ږB SOdHvHrpyJxg;aƽi_[Bcr9@+QuYb5KրVxCUlԔazjt0a) Q@ p=u;INNuB ×X'i(X`݆<\QA7Hju8AT<7*0SXSx7NBaCQV<ӝacy9DL""* 6Vnj35F9^:&TPk8c:^餸ԤZElcuf?%[8-D'pP9T^ ^2X5Rpdp.*斎dّŤ39xŒ!BXKҠ. p PFǸoFi?ˆWmij/||2CDf*AzGZfy:Nٴ{t|Bٲ $lL =ejqo)H H8+jmww6]>{ݧ{%Ϛy*6!pPWr RgZI 7h%ɂRdA`aB8 f.E!bMJZyK8uQ7NpWTraE1V 0 F%wGx'nȉka1L/i:=<']>}/Qm6&92([h-Nb>NE/b H$b`f 3LX&fF)uyx=P : 5C `+Ɩg^6.'^<@(}ENjfN/(e&Jjk\fclǽ=|p^QrֵMM_Zdɔ +ZyYSZ~V/^Ys! >HT$M6Sý3ɪ 9$teL?.)$CXGo-&x(K0juK6<.a4yUëޤtRUB:H63Pr0EKR]spXM Ez}-~ƫ=m^硟)|Hֲ|1BPҢ=TP4=^j;: Ki~3]A-UY2C<,32Qt ]N~ʬviA%ѱR0'm _\G0{{z:|y◟|u.mSViPSDX] 4M|Y:例g^}ۏ&s]>n'?U jUE$u zV{Y3gu.N3>v}Yud Jw}!}t+ui!ΈpYG`:#n}'E o>d>6x[ P  '>[]_bߞ5OryEmDhbԲDzZ.dM 6速=&\ީn _^:?$af=f1Fg,t+X|:Tk>(%=Zş<;?9t F7qǏ΁>j ߝ5㫧}^3Xz 57-/exJSj`_KĄ.~;n)|ryDvVbXz}}~8g>"tncncm0J[W?\'uw?}j bYNe.?}y<ΉGX ^.5RTUD|0& p*uG"eϾc[ ЦzhmkkIr'%74>B)kt*%fSKeVRh3{'b8;)=n{} ?Ĕ_\^C_l>xەZE>"*3Irx:7 驽v'CW{O{Da*=\74ޗ4po5.q/f\&s!\T5Ժ'IחW`\ x&[bhLzcss9}ve:7hcRuDL#6*ј77QU@_}%jdM$b8S?̉^^DW S1nu;>E̟EL-Y<#!` 8IꢔJDLj; jJgtBf'u_olG;R)Bx:0葈&[sO.V;h=<)O.7|zŲ?G=Uɠҁa_|mOS:`1_o UjKJ€HVMH]hepV#(w1Juw˟]j$iqBj\os8ݪ18uy;xR5؅u6 Xk糷?9c !}`=1c> UeOsC}UaPj+糣͹q3pFj__g gm뒃 /elsEud+C=}uj>3۳.XD5st+ݕ-00;&;c>g*yst8=X;vcrgW9C^'FY㈖#Co}}0AI97v>b>{an~gӤWea0ڱe"b&1U+1>idzywĄ^6ժja dƪ-6Ӂʱ-y`6V7PTP3[0jzo#Q~`ckΜH *j OOүX CY\M]iꕔR糿iĴԎ ϗDT཰T]G'T!G @'Q9JV*KaȒhvNץeK)3&l5_g_Tjn5s!ؿhģ8ϋFR&$98wY oE^x f/z|yRL!zzY_?uJ3x $W mTE# Z 7cUgjr %{҉WE{ |%U%c^q- $!=o3 ;WO|of!ϣ6YKhrHӄ"^X:hVǣpYkQJߧ=y?.[+xT6][("H3>87"xx|yL g%&{Nm1_[ִz1#{4nwklokv/."qxvFCc<"5`M#*$PA })ߎIVtu5Rېʺ3ȸ@>.҇]~ϩBU}ØKF؟O>jֹ"FQ * ""l˪f62ֈFn懇/, a@bz|fr?:jV. !eqlDmj|B G&+2C2W0~*Ԋo6ZT,~o ry!/sX|kT},8 I#EL*Q9wdDi8Ds8bKA/Bqgב5[駣S~ _v\}YОG"HC+qR[=|.5ez4AKwFۈ=WM 8&]r5kfYxd_Oq0 *u͔O6! X8Km7؄ \\Gs );,|?掖V믔'Q8)ظT[x)sMFL2 Xѩ~JYh3M2XNr"!gq%Q'iBt`{Y3Z,H370yw~K= Oqo4RbiU8ߜn@E.ϩKR{hoYNB:i dMJ͹-2+RU1&׊ȴN=veYkY5F3zV7?Y>ni5EIGeQ`(3ɵ #\ɱBqa7@V<2BgH,((9\Zl(W3q9p15!R̐US HưwJJA~cEڛ*JR逻D*"$LYfLF悦Y9bu|RIO;gy=;ջ {s HA\Q3I,KP0'`J@+b& 墨H1R('k扄aȘneo} GRU;SQ777]? }@Cڠ?<``HP,Cfi^bm2|Vjb!8m*AETQodJsTNg)gPA%ѱU"X_ "WߘDw٣I`4bħtRiI-`Yz! eO u KR rV+ދ1v>{s=;Fd2\戔8B5O:.ݛQsJh vB^2-D څmc &8u&e"Spnz GU|׭d ҂. ?,F/g_5}/6Je,e 0t~9^Ȭ&z W;( #2nŜ*]#TW`!'aGs̩/sPFqMxB( aDkΆ`>H4YxY<˕4!o81u'Wc-?\x|_/OϿLL"DT]*JbKrWXGsx J7h@va:7EQ%8F~ ^J___V&{4]#Lfǭ+.s>uSDrxdwÒbs$3B&`N 'n;܅ؿ q~JČaRQJ Tȭw!@>Ó_=o[*ǘiB,B|AB8q=^67g/v I $aqgZNFD(Jt| zڼf#نBp5f"^6ߔwP'{<}lJzjsS@0KkCVլh:xO:]|}seJ:ZQd&o!~=ሯR>w. 4> Rޡ4xy>8BM%v$R#0Q 5y q7u|;2}#M^dPFt^V߹Kypɿ} ߊ') }D b#d3GU]Ζƪq椢.cŊ .;kQĽEԪrERӎ eĢoz1]LR PhE!nNZkpӈnM#;T+F WG\R1j5k%K+u9m\Zۘv5vrKnHAS<Q8̳ HqZy6A-q!$ZDnwbzBd{dŌ_WB rjHMݲA!Ul[79,w8+cG MG#rO$2 bA\}Gh"OCZQjhxt~d#" ki՘Aebz`kF84^h'3q$ N]׫]Fc&y+<4G4%pk`U>V( 'w. ^_!"[ofx]<}eO4OB* W Vd=MmsP?4ُbT+bR h$ #0$)qT5=NP>[þm_|4e=D%A³ȫdOeX/[lloAl@+,-Iz#l50DQKf (!؟_dtQc9kL[Fͽz[_}c vWH`Ԩd0W"'SO[b6SuaGevCj} Ĥ*Rv#^ԗ_g J#@'58>i!q`Tqixj%b0?K O' ))cw`xxbPR|$roDhj }qFnq+e' 9e3ham̲Ny鍧{;:<#0Fo|#-E$sUo' 7&yS ඹPeO@༖$&+Tj C LjyG?@Ѿ<|tW12p Wp(u`?Nl5)SP3]6[/MR BDm;/2&lƼT0DG܍^#` X@!W?A…'KϻtԚ¹͔ ea &@]L\e 7,gQNIj7{ְTrQ^- 81+aM)>ﰦGZpg  җX +USy%5T)Xi#lj @=Lv`O53\X~޵ޞDeBYY9nCN@ ԇ_1Pʊ߼5#Tgx"} M`'XɄ!^d 9aզӐ 3$Nr0YL*oREDm9t=>*_\e;x=t"4=( ^/u{M* o'5ũ#:RD3gӓCps75 7r|^,DK: EG}NUT;g}R8h{'M&G\=m1hX&ӧp4`0tsoh}k7~|D4Kr:Kv 侜Y:%2I1^BUL/VQ5ݠ#@y'49xajQKElѹPS8ZЀۣks>c oׅ_PⱥF4!}+>QJ' oT& "],m!#|{ j|tܢg1/F_b 'znǨ1M]BEn靋@ʝOV;/ SQ[8,7׷3.y[bd}Ʈ+ @Y2DI[+PL:j=RBz ǚ>HJq'fkP`\@ s" MSvf[Ory6|;Cu |cj/e[F6j#FFj ^%쩑ˇLTԆ-젚*nkqS x7b;3/[jEǔ"}vM&NI^;N]ᝐ}_U@ "Țr2yd 1`r!2 ` Cߘqtj>;rA95"Cpf%Dƈ#rIŃ3ӠUЏۋ8E|Ӂ.Ͼ)mc&G)Zi_u<M$f)?r[w10s<۬xFt}efcWp_/6IE*Y:D\C½zMT|h5o϶^Nf=@|R 9tN8Vv5|15~o`76 |V(J([ I'`۷jyBzh7(X N3{>BX#53ZXjws:hp#b GS#FLnL;ۃ񋭨 9DWasCD##bGxJު+-Zuio 9׷ 8U~PI8v7[uJm#ёk(qu%ŁKsⱞ?)|TPU $Y EqrsC]:&{P߫m/4h;1*ʕ2"6#(5Pa?0ȷKYF tivS=/&}xN3G!-~`__8Cg_L^(sOݼǏ->>)4ZۏR#6mբ7ar Qc*L夀 y%9,uSI˴f5aE#SY?۽vR$1awڑ  D2 @bDFer, l.% 4ҕx]W{ڽo 7.ogzA]45C_r k'-T pZ1ID#!4 }ɧغܾ DbESlbdV5h֓AIxBڗkQBId*BLf{ݒ\j2RZvXbWpѼS|>֒<@x D2[3\^Z-hΕD9 HHJ͏p1T$ܐI,&o"=OO콃3l% U]̩b4"l3)g#xX@s Zeb`{Z6TUjqA& $>iʺaw q?C뎎JblQpQDҥPSq5%ti(!UcDĀa O#Q`Q#t"WO`=`p?^zߗ Q0pmQq19@P-ajVvJ*:@qfE/D=FRz:Lx:,oU~pzԮ-Fq`%*+@K!I PdQɋ52"^գz5)nȢr^~{)ӆ*M*qeLI,:_2'2 qo¸udId i5RN@<Q< -]Le" 7go(ֆJD (qRz*b.>K[,Y9bg4z蒞򾾽p>{90nGC(TeF?sn:K_0db;9 9\\5CCU]=vW0} &G͌BE^KqD]̥BbMo#Kn%P_6\:MvS4JNڛ9£ru +Ć 4 85Jz]-5r hFR9> ֪B"/Lɟ$gDHD;.N}qQi\$LF$9q8*Gič!Ӱq[le`w`[m)gBG <zhD; 2IhlʁqĦ] Ñ@f쭾~>ˁv7mTK:&JGaӴb~LPX4/3%½RsPSBV3g욗)a5N"4n/*|"R`B6x")v [!A4?޾8 …Fw ~Ҁh!Ή+<RЍTFŵµa&˽1O/>ڥ:<&B@q,`aMEk|e8KtcAG:Bq,~da)hi?k /T:4&\y#CuDZ&>;Ӊ|g:ZTJ`F;"e çtO5.2Oz:*PM#nץM .31xIY>+yA@b!T Þ{h:Y% cABuTIXq*7L!I)v(">$FHG.#v40X2[s\ٿ'h%-l:ez̑Qw02\93ĆWMzzJ?_;-N;:9^^#(+b& V 6e;MnzQu+w?%?etڇA?Q-ihiUv)!"hdnݛ*!0vЫۛHd$ a !NX¾^fXEP,PmdXfj:ɇ'OӰR3G\VbIHJ1F?FLzt 1;5 dU tRY K=Cl PӑJcSmjGD?/5o' Xr9??Nk0ߗ:phpvk|!V>_RrMoDdl}FhKx6nq[ ?] Szn5ܗ_˕V(ЪF4T)o%`IYVDHc},͍ }X|Hj`ME ?чsR!W1ŀ1jQ q /<|(mիҰ}R;~>1oz"Ycӎʈv0"#/SuspK1|[PaBڝ8}ct-ዳ;ض9$NzFšFBlt?co25$MSvy1=BP81'_[_4}xR 0 +,ɴe/Pb-껒LX;{p0y@+npkExf$I³YwJ%Cu#lh.zſܻ~>n˘=߃j~gme6a L!E&5j Z8)De?)]_/qOW_>ISδTSX}ŧ_4Ĝ)ݩ* HT$ bIә5xvy kuPJ+'N^^:ٮpq`PK,ԪAuJ梟\+f H$i,8U\lV#^_^C4Mřb2}^5Fc(,[A6E#=mdG'-DY c6Zn<@n !QsΙ4\qXm6)nu4ɯo/I/UŨvNbqts8YS:?ޤ\_~w$J*Aʒ*gURu\vB_9pv Qw)Ң泿=,Q\6HQۄbNcL(ƾ=h_~$JZ*fýtpr\Ńw;3L%aY"VNԢaݧ R%tJJ@'*הiFi(\wzl^x(G:*kE?%#l&o/7=b.&"/:>^ZX@^HAH(K$|ajX-2;%')yQXH7ؒJlĻtY:_R@@o#p2feؑz10mz'l )&QU:Mi QRg#RX|k^'Ai+(l(L4;Y~&J!%K"[ټ-4ؓ <]|N;J#IKa+@ހT¸q [:P ,v p0]ŽOE?JrK&4BP<JZTؓ8B%b^RKg֥znM>V"8 'Բ#eR ߺ,,fL;o~9Ae?^.>+|Y}lu"@ߊuݓ3U:6NhC  _hRi*dA SL{G<<=wn}xP6 O; xzo~#*p/t%X 6wrq8] _nKИF8>W7*F)ZP6KpTA ݶv\\joNz}ڽo]dA-a;zPOejpN/{6lsҞM F]ՅWvyn:&i u< ^AjlGgo_/~^fZ&j sE.%,d%ZDg.<@I }I  ADUukgzKW̛g/⎻""" ⾯>SU53//??wfzn5xT42I vX7col\ߝ|eTVE}~">u؊9Cq {ЯԢDa,6" +j8scݽ˂CbI , 3 WT#sɥ#sw}d~6wr,P%ZiQ4z_g*@:/@'o@ Ԥ6)V8I䆙88'U9@бo18Aj'{M~8Vt|6beR+(˘ʂ4) L-M}H9!Բ#=OQ˒-jv9 n.:I*3;Si UnC9F`ͭfw{di,['}qFR{ə݃uC0 IC@VNɕ&M8*0w>fImFv:d%0J5s%wC@r㟤>YX0j kQ:4$m JЈmΚ^}Jpz2&hNM:nIH5LIDb/.uJ߅qq"(7lACR $v%[e~JK'̩(i eѧR,Fe\1;<^_aGlDC`%VR ̝fv(,`G㳏߄s3:W~SS9J9Ɣ)f >XmM-g,>h-bɽpA#j֔B-R(D-Uk0??4 O_9-[Ts"b.Vvr7+jD}ʩJ Lk˦ij$IGN%:,&!jb}6#?z+¶,TGO8G3$ ML/ L?y}iplQ;̀XNj>a} _ؠt._Lm~ 9vB* A-SXN,ŃDܫ -~:½;׊5gYn(:?q[Զ z5h:.iB24#/ 1dIA؊T"?Fɠ[)Yb#yQ}$@nE@>yԳ ˄J0@ ֙XMt);.h[uj x5]/WiJ@?qĦϩM R!m?4&PU'RO+.Z?G_ͥCWҐf t`rrfɪHtY I(cx3!G8Jc*Lq`԰Tk۷2/YI(oCock]f<6.[de޼ lnHEʁ5,yFo TC+W+١PA|K"})xtpOWcJ~)Z$ql7[Qau=RY57"0r*hhQc2 \"hTQjac66I'{Pw5uftA|go5Hm lj r/0 ͧ)#/%HC @,iQD{zkCjZf޳`-yb$W)g쳸PonmJA 4 YݎmWW|qe:lDR55&z5; }WكL+*\V廎O}a|IyyN8wNteSR5Mڍk[QBWt6wȡ48h4c-E5C[*ZVdj;w(Uy_?@&ZfIz(^?fC]疿psN/K;52|)-K4%ܩi3 I5`W"ee.z쁢B3!KaԨly>_^b~Leltㅴs9 NHibcFbC:őƞ9 e*Ց-A7 0Cط(ۋ38, o B&!`k;ĶYqӐEkO:Sv-5EY$,E81z:@jw0%gIx`lJ;YhXLƺ76fmiLvť n%n Qa6t"۶~lJYaH$)8X߁.Nc.x\F-!b;z*bK],Ȗ#7 T@C*VspIݐ<ǁc)7ep1T1c.Pཨz'5aJD,sCi}e$Ug3%zKΡrkܬ7p|-#駮oпcH$S2E}P#xI5̌u *C B.W`@7 2`\-?ajYF[z]J~܇aCR0eYOTrV5zW=ԓcOOeX_{IFKY e{"_l',6CH,Z7XëDDIСɨpRyRUj%D (}Ϣb)dSM:nQR\nB ,-ZVg5XiXDn͜z<&))\CdeO 4>]5#מR"v?6p,Z CRe`L`ji TZ B.f1.#=ݺwŅkϝ 3-Q#oжdktT U$5xlR-0˃WlE$|4gjP'` &|+<@Ju1p )N$ar(3&|Ҕ DA, ۝JZ!,HLjpk'+ ՘b@vCE#lAnPBRUX8 -=;} *{ZؼN悽ı~6Kz6/<9W"A(?PGTl8<~REb|j9p*[0.C-[_4P [ L˔㉫at"V;B7 lgfA+Dp޶܍J$h4f gS^P}J )޵Tw3UgtLF%Q: 뗹6 #U9:C|3UB\ ;c&'3iqW!䅵'!D$m!AȊ>`1OPio)SˇJ8hͨlSbN4 ܭ]?Jk'ԻLB:n8Fx׀d|[;P=Kc,b Rhr;P&[a#vNFQX8QT ;d=Аc:F1?^ I gOf #4a۽9ԘpB~̤rEN3F ;YY BSbb;dp;ϧT؂ylӋ=nmI1+钖vnԨ/ѷ|2fY>C'9y gBOas4\}ܡdc,/T`]ir''Zm&}Q;nK 32fX0lop6}Qמ7ع֓U75:MvdZ*>.G4E=^*/YU^afϢ/= "9۩8p4<_F$OJ.+Nh;?} rZm c0U'kƪGNQOi2ՖI.:ǿEQ<"q-hڥ9;IKl, HrS+IɺfnW9_'X6hT'v|ɘ09hD4l y14h@.ຩQk(R~\ۅ0fSBz۵ 9Q4ںw~o@6s;;MMFK6/hA|:%#h*x3)aSeDo=}zFtĂ؜hr(u")~]m[oic_>Nc9=MhG:P0< J03|$P?Bc}qcH/ M:fT:ѥ&޷NU` D\p4Y5\!z̓CsЎ5TVneIKc ^q@6N}"8$Ν(ܢ kNZ奎N=*Ck" ^1Z_XGRM4 <*rK IJIF;Ί\1H=X4vcoz(/gI cH4ǘNd&'T:EC bGg{J[@GgVd)  +Gˣub؛r΄tWtcdkpۇaouqj%`Mm8 0{19BN'Zx\IƖB/_$̯LzLqnJUMgI̚lof8;Hb)gyٖ__y7E煐6nuן" 1w}z5aDGI`IFm'( X2l%̵n ;0ISjWf(r@i &vf$Ֆtz"E3Fz}_7p3SYZYC 3@Ȋ+W.QrޤK(Xo9u7'nS1jB%zbFrUP~G&L6{mp/U^~  )\֑n4),/R歹LC@ML%:RP }Q+.2Er@FkRM'%DyqUd*4 ,&hŦx| C[g ۂllqScʍ[IC^ɭB;N~:#G&E|l-__{( I.$P#u5G窌te̶ZpeUZd4 ]P@OJDap8[zړ`c2>n{.5YqCCvtIeR6;jiJQDk"z+ӡ+DN$e]y62={%mC2\'v;4JS(3@^fi(s^cT6].c;Ay% szׇ [HdSBw^&>,$妣.&%y)gi~=.*Z6WW+6.a# ?)ea䔱& 0_f!q5+ze>1qH/3 8rNP BBIR9bt4V+ S0e?:/__֋OTmabX彮 MԢ F䴲n{PSqw˸ k oܺ9acxMBu`mBpZ`>K*?^FUը宩LKe8W̓딕?Y_{u&0F%%=8 sLJgYXs3S reUH#mQ:k;,<۲}_Se'DAPW#Jz(Aɝ]= Ÿ;BYB=9z[uc۟SX;d#´;Nq:ԉG$U[EX܋(WuiJN݃u#/B+T/ lj* y4e<7Jf柦(1W=j\ÔJ/ڣofں|6HKYNT|)Ji3Yat_.yie>a+ũ4xLUjֹc|l?:K~e\g9tt<dwD#+PԕJR; =ꗞf,4n/y5492mk؜ * tgW9,u8nۺ(M(ց2e:LEf)䥣xXRs3Ͷg*RA77=/N6jyc'MJO= Q^Y4㋖>bl=Q\DCxQCdbTv`4jDx@SGJ!"$ Q|mh$D.rC(kWB Swe[yDǗ @Nq8hQ+Ξ++F3 <+TԶ^ېs)eAaDpQ۔Ih[i )shr զ0H}/LiXN0jbvm/z }yI1N =7Уg&QQlOT_jҷKIuVcVwer4?I^e꬙V[4Nj7nb#gZTz&5AS0D$Kk*;:v=SsQ u7Qc"R6j^X<eDTǷk` '`YhSāU7L]1Pcrx Y*(+ȡG@$2A4Jؒ/{] ׯ}s^ZRE얱Jۮdqua'xɛHmۊJSaJqE4`%Hmuc02tշ FY4+N==xX@E )_ 'G<6dk QbӞP%:zҀ4r0}gӬd/~JƼ1֣aAfz]oKk\y帛>;t&5[xU%|@||FWݫl6ʕuI;i~d<01LЏgX9Rd[nPWt2?)-*}F'tH8XT hi*75)5o*mԥ viu{5yt>:+`m\8e{i`W7E i:XێE[I n $r=*nRm0C\ZnaK՟MƁ(M(xup=H$i;K!e.Dg9PCv8ec& IDy~̦n”PL;wK|Yy3)#͠RBljFa)FnxPu "bG7qrc8 S&NqR$NlP @ALy ּ`Υ9 1kWӬ;?-Ĥ r3+w#KNM֨ZhKe)Mb'K54ZvDL5#[ Lp~b'K 0, lq=?LtY`Pex-ȵ YNFZ汱{=+iiWs v0r @d5a;~})(5V!\L%|.I$ʌ%HK ;$šVqEpkJT=pН;/5滕}Y5{AL҅ĄTX)MrgnRiܣw]Jep^%Iu0J?SpSTZMćMsbף zsIG9B | dHbQ:HзZ?d0C<ǩ:@bcf_=__xEDWaD\.xSdI T,XQ1C-)#mS+ﰾv;nFeO^955. R Iݳ7#EmÖ qQZZA&k۸4T!A~vS.A̩|D_tD.DI]fl#<4|ip Da8Jz90RbƳ7Z{~[(#ckkHr~^R>vh Yu:g~VYƆũ_z0c 6[n371eVdZ]9  ',ܚkC Sb旫|S5_Xy%*u~/v4ؚ4ںr>̝ ?Lu -0ƙ<h d+;ILs?%\Fj1n1pKJ 9NҶI=>oqw7kPI,I(:C0~h!Y c+O]MSۙi|@Q ˖p޿yl|TmkV*5uVOCMG{ltnKQŷ~@Ra'is4+\4ovqjZa s[#+Hĉr*rDT5WGG`A ^mAZ5CqRl,ˢܔVZQZ P(1h x*4B>eUyVbC33*@A0̡\/8LvcmS@P/Hx#K4LT%]*0XrΫu)vEy0-٪=FزtC>^35Xr ֋$rN093UB tM7/33?uM/TVdб]L3(i}13lФ IDQ;uZr; e ɰ" 䭬0/&[#dyUN}Quw8AbڡbT̪*Zt Hsحi7τ/5g{<|ZpN{j̓x Mpj_%lzagn)3%If`On0Lw`]ufel}[:Ǘ$q=߆PcAׁ&Ẋ32y Ѓ?5Ug㰘{9QM܄*8V҈J# pbDNuvvԶfžvJ}LZ9{e}m^je<,o%ھJS7^ӵ[:JzKi qrO8>ṁdF7Vkґ+pk \ 56sW"rIeI3_a嶎 b*gƔx9k;^FKj`VY7p T~xnQМT 6I+u(S2@֝KƋQN^حc{*\=ΦH<]X2pDVdvB_Y`=cDmfn qaulyڣ=h`܊ΤL)/FeVAQ L m 8kŰ2+.~]ߕadvv Kz!}.(>h`g;Sp8#M%R;7iJ1Lj 7];Lۄɴ;&ǥ8cƣ#/ )5;|qRw5 hp63wBy(#b^->)a1ZH lmzjsGWm U\~ ` CE4,TZAWQtn3"ߏ+\ cLS#&wg zz&e(2?mM i#p4?|8 )&`=C@i6|t([ 5ұڇF]!jg_wg亙]C;-0ef'QPvw&\lՙb׃z<[$#es3Z憎V0cPMN36g61 ӊTNNwVtHcyw9_L0KB~~݃^,1t3mt0tѥv&Tr5v|*h%郝^Fo2Or'I16]>&wan ̘t1)ZOjdv՞dN eo#<~˄?L0z3S/Ӟ>,\P߰bF,w˵Rg֝]9*ǘ1l<[/:K/fusk=2ˑ%A;d)T5۟ tjgi5Nm0'n93ٔ`^<tN<|g@L;t\bM||Wp~BL,QF*콜of!fDL6%X Ipw:ͺ )rL.N>ݚjf+]9~TcThtwS<6_I75ׇYo/u-e ]>(fg RED;]nwŒ"4e4;)/(6 yrnc1dw ]'bL6bд1emovY*gZ513*;@\etRH ,2%ͦRL4e(tӁN3+UsL&8Y*Wf>= ru @@X3;b5c\ -ޮ9D7u栯FKs"k|z_,3jdɐ8p:05y K`=^1m2Lzcž*Tu6h" 1َ>ff N^^4a)@ LiMWcD^.#Ӭ:@"R|*P>Єf&!f.FR)Ac]2ΡJOx ~ LݪfvA $a'ܳcE(KZǚ<]ޘUA)#((mƭF 2Ns=\>%8P):#A9B1hlt.x"ABNBLI1{q9 SmMּ`#{ȍ3mSx:dR]s)MM'wy/qXx=(mu)g a͢ek>,R1|e6BhʲtV'iUk,͆+:FXɰ>)fz rzI"OibPVDތl8G9w1s%h'f !g5SnF9,5`);x.IZNZ$Al؟9W n!I}gpb:F'biERφܐD/% [WM=RdҎ]t\4o6$)M_tIJr{dP@C@.&Tfe;!^ :[d&:0_Ycqa! H$DlUi錊R-*aؙiP 1biye( يY8]YP%Uâ`zDDV 1tqJBMhIs#q]=T*Љg[t +bZzǽl%c8-eBM<+F`4ceDyQy3%|YeK{kjyΏ0= ` ]p= 1;hV.ubYg2^ |?AC["TBI\',Ic LJ-)8Abn0-cǦ# , Ù21Kn-I_mA9j#:U3H%cw+dW4&d)x ؋4)4>OUr Yr-Fw+DKEٙCEtŀ^ajP)4C J,]IRjA})528%E [G.TẀt Dl^Utn5"IGA<򓝑&=ZUyyoj">ƺQ">(vL֓D=+d9,TR*=`Ӷ^$E\$MVOWy& ~iaHuÿ9Vwlvh d.<2 A9Nm)?$c-w|Z]vC}fl\={.^`[K#zAժKZÕV5p|RauzN׼e=sfFU'>.j v>8mJߙjH[VC7=u pʻ҇&{ts!Ċ_mDKUNJfc 7c15#j_m`gV"#FUȉ}#殱1Z8Z rŬUfkeG}UTK?gtp3V갾TlENS}`fc]]=Fd39q-kկ2s_:Ԫ3Վ㠗NWuN}gz4ci/]=j+^7%)xln2xlR/=)CIȓ>aIw؄Fיִh]`+^KKxUa !gNjtREtRuZf5F@B顪Jg6!]q`_&FC8UAl5yBŅxwT2stW eڄu{{q7Z`9xVy(Z93H^)A3viR1^wsHTMpX[5\Vƍew<^Ɯԙf66`|SˁnMYn0r`'ݭ|wf긋ܘ@Ydl24؛{wVU !=je>j޵cjǸ\stl4(9Rc,,uՙ`e5"4R0|h5F@3E>=lBL zA5=kg -3PԎN_k7Ur5wɕl{؄JAS:޶6Mrpmm;4b"Ob@[jůVKݬF"/' ܨp5>pꗣLlη5Tr5&wmn8jAz89-qs\fft+m?[j̠77}i $dGR]]aY:ǫ!4^-Nx8j-s-+S7Up'q%QDVު޵eN5qMA%1~e.>.Bň:pgds|[vDD'Kάz9Qb=0N#Ub UT ]U∪՞bbm˳uU-\R≢zJ ^f`Nvg&ț3[0J+<j+#hq'^$Ļc6O_BG/)Mpޙ3:ҽ>*Gj[g)Žyj&*OU,@5>JZ>d :kDs4olT:Uwi|pM eKii-o┩d4)F;Xaw!W 0ejjHQj}6w=Sq̔v7C-SPADn72䧩6Q<2aKsvLw SKrNMkTܥE+IqR,򧜕+%dpۦD.fvwh1mH pQt0X1B /wƜץ&zSmL +\1gpm J!K*N8 -~8UݲtT8| EK6Ӫ&ͫi\Nu6A#z+Nmmmbog2L|jq'R, =(4o\Aޞ.D/%P5UxgefD3$dTEʔdJ7L2Q\KtR ds82`nuuEV}S!6ORP@~HkaExذ)SK$<7UM!] w;UI&ۜL 6)vLClJ^U',LZ7UM2.63ҽ@1 )J(wwiR4j9Plw Bs:|'lnȵZVaIUDɲ:6& +/W3`8MSHzj-t%iNZH4`s) 7b `_Ҫ8Xv%yEJT4Oud(5Cצ5lvFu)s)c_ʶz"ӊ\N"qְ йՐv%{8鉮5a#I MgtH\cTM-gUr)=p) Tq2|@aPM;M$^3 b&67.:obmlLV)IR3='"_T7߹MTZ|zgpV LFL7*dof45jq`G&3-T(\c&'HMcL'6fsLmh&l~ 4rL{:5sJ)e)xa7*R[)3IM$0l3-9LX4 ~8-XT;Ad7YQ_4ӜLy72iiS|T!Hș fXަoiy.Ƀj? {)#LS5%O0;kKW49\d:}|STMo$fR[L)LqۃESM#Tb$<ݬl*o#(]1OFS.T M)_dLCyM>dY&;Cxĩ;gukPw-jenSE/,?FS5q8ᩚ㴈Zd;%Nb2riU,Nt2>&Ị!D {Zwq)}[z8}TǴ̜?bIT #TҋIq2Tzu)!F%Q)UyY$-T3"t;Ӭc*G897!>ؖ8W[lJac0{ T|SbDz*j2ZqrjGw@gHVT ݜkJU9Zh2olMww9oO Oڴ,pfi c0@-қ*jI=uM!vf>֫f>-DCUSj'k|$ 4SW{$0KR1U^Hܚ56-C]zԙ4TNi#~kެOOoCe墵Τϴ$ķ0=B0=L/w31#^Lc uɸ{1~r_%>%B;L"SB~пe/c g!Y2}{>>wL1}l(n0}\,?^*se2_#TW1}E*|0+gL-YO/d|+S)B'a|Be}#X5O|O*2W>BeXodzf0=)Gk_g/i{_I7=LoLooq7Y^ W@=*oHŲO"ӗ0+~KO3}692}+~Vr@2M@/#Te.-[۲/iBv<&T/?>42ޡѫ_t,m,Y\.Ts&-{L}N˾9-Lj_,K}B?d޾\WW>\3e_k~s^LuL_+~;$T>F{`2,-'E z1o{=7|ǘ~yyP9%廅~|{e~WeQ>~?YL^B+?rd%occrL,2?yy[e}&MOyz wzϟ>)T;_̺P9qK~1w~x729&>Y$Ty_ ">+L5LID|Hć"?>cL%gGdU徿<)[?eBeW0˄ }9/?u#;$ yc?6??c^,"O_˸fCȯw^ .2G?#1\'^eY_~N~R'eMٿ ?w9)9/Oه%|2Oo-d>#3|[kOzPV%B?DO(y_tr.gKiK~37օxu/gzыynwšO1׷pP?x$ yKx|eyzj=L' <B1}|;^!_n|==A2T2rY'~''~j].r9֓e+juX^6b|ղery<_-ʸmE2Bxt>g\,Tsguϒuzdz2ϹJ(IkX~sz _ۄx3_k ezF9/7ɼM![d¸u+ nezJ[/d\z/uK*^*R׭fyzBe/c=9razrWRrDM|2me2㶖}˺tLk{Sok22]Zu[}旭@PPHtNKZX(Bc"oSO=ӲNB~g~+zk y70}W/*'v_ ,OZ_"H«*|I,Z_*|d>qdYNqB'R+Yl}՗0jƛ~s^˸A{)V%qS<~#qM[YN^/|fm? Yogy e=KY{nLW2?odPGgG eykW2aYf#2o$Md~,f֯Z?.qorn~7vKx뭲O&m¿~]OzO?Sw%]"?~w-9y#‡zZ}'|Ÿ/r/re~@"?~AA/v/˼2և.*C?$C[A_+Z<[(ZzPӿfl'iߒw+LO9 (  'W[xg&r\_~ ׭]"F?cGs1|ow{].`|j"׷/J~}/Z|~?[g>~%G̿q_2e`>rFǍwouIM27˼"֗ڷ2?iBYNoM\J#o_(B^,qK.xY/e{G/*29#Z3iNJNWSƹL[ Ѳos~K \%TgWήNn}fOϕ}4=o9mo~]?Kݲ#F9wod=}"ǾK !?GD^2}YDžoE[B[UD|쿟b~;D4+}N?zx]"gr[>9=r~{Eq}V9ߡ ?(Q/1nȳ_>!a߿"#0~nï _5/~P᏿!7Ykփ mYy~O9CHsDßz~TG/BeJ_<+;Yns2$d>&1Dž\Dž?B'|Be>)I9&"C)b}Kp}i#!?a_3rN>T(O)׉l8qS2: e~xl/8qW st,wN\'.r=}o{b'xIoxă\ă:L=u.iA.FEA$QD$yνZk{gQVS--/ʮSCs(g.P(-ZR/)ӢD~A{THsEE2jT/TD%ķQJt1*UTG5D -+%ĵ/P\#J*~JKBTGrOu̓Dfc쨆fGPzՒE ((?Q}DE@Q=5QGA`Ԡ,(5YwcI-Pqn F-{ %yR~jGckEcs8v|:@>O&IA)y4Lעi4'@9hf "fs|ii4>(z|} (_=>#KGDyҽh>8x>y<| ~~}§GWyha2(^^gXwq r7s _JMM^, Dх;;Jtg]yu|T:^G_|>ZCެeXP>1|>/֣Ǽ}L*icw%M ~zQifz'>/M_%T?hW3 sd3 ]B!Cϰ TiF#()3<#2cӃ8O^Ojo&rn$)b2>YbPS9i4b_7353:((0=A酙Co6ϩ_4s,ou|u8>7 Fl$m6smW[mw:ץ ͘N} y<-m>E?}~|&@;P9 ɓ8ﵛ՟#Qq }=F~@oW_k.g㗎'7' [ydF~8%jx|>|9M~Np3Y>=?G#<{^95>\~.P5'0oe wsn^]S?`~'9A| ?m* —ߛM|?~/fجE(~u6G_PzesJ/m!Cᕡ0p86\}}G?#v0;JӎNGscX 09};^$oJd͟1EsU;U gRoglf|}Z:;ޙ#lofYs\`.G>_5ϱ//O/ji_"/Wƾ"c_-;/ [-E"N ^ /.V?lD_Kե@xmd2v9Vpޗ+Y*Yv5뿇_ k8!y!| fG=v=|=:7toFmۤ~nv <<?oc4Yv}y(gwqOOnSuyG} OCC~t|=?·B'k~f?>(< c %%<5kqqa{-? "_3ٱ :yh@wW?a r_ E":Ke2{D'u]s-~zzSe /ꞹ}_s ?/||ہ;.qG~އ{5w9K>GG.* |U^9'w]pŊKyKU C:x. Pu҉']zeP=@:2+.|N]V%M:鲫^tCrjxy\'o|@˯|pʀ']AՃ+>MA+"~sEG\rg%Xw + $~Wiգ++[>rGW>(q/.!(p[%婫l@Q4(}tUkzin媓wՕ.K>5\M_{v6D]K&6K}__9kFqYPk6 >]3`|8(r-ﮥtеb=cP:ڐoC]{"ס~u$^ޅ,~t]OW+Fd\tcEo꩷搮OP׹~qտ:pa 1<$q5_pOP?CAʺ. A7E|FQף5sc2XG>˯ c"q y;M§S5wsn:PfRt=~͡~搯Ϩ?s?in&<1||>˽^d/79>{Es^n@>-T^/jq~ot\M⿄]2xl|[N],t+w2c*x!]Cn5[M9{ H^ukx6>snS n#Q+&tus.Bnt[m6r;(H}МLN>w.|n[粒OG=^{Osz8!x0<|H>_oG8ݗWUAs5(!~' z->IOQ/\489; O%/~hrs9Ƕ zSsc^x ~]/__ѩKo@5 <|sy]U_ts$:gJnM&~BEn;5gvcwK}5{>?")4U5Ff,SO J|qeP}OOUS>M/PǧU|} ا׾}<>Ϥ{Ϭ>gQ&ϳw>\;V]<]@~./'{x|&HMPJ7}1 /|\חPKĵڗ_|/+_ՉObVP> 5Q-^ x$I;H\߀g`'ip-~'-@֝$[_u_?C^j<d<ח]@}o(ʀX>7}3\z߂|iYoVm@K}koc@ߖ9#HM Sit1u/@U~:̆G5p>ϠG|.UߎAc_ϯ<ۯWy_HߣX{|><\4A7G'~D m@76gM&o3z>ol. N~7|[ύb/<߭ȃq;H^>G'ᛣ?돑_l rYqsu:}ܟD_Nr);=u=p?y8!Ϣg5?sE@#y<{| |z_$.—R'БyAx zp^9#'H]o R7R7?= [ dmt?N9ݥn{b~<]xgxDq )z+D@C0|uoCPtR!*BjyHT]΀2(CF!S6P>0d *o7'dY5 يoCvTȑTr/\|K<rs3&!t'P T B *+je( ŸO1e(. %K@PFxrP>T Ӑ}ij1T9@]E}UUB恡:]]:5O 5]Ms"$':@/벎@[O~*OՏа"H|IB jԼ-4? Jijx2߆AoM>hvG;98t BGI9t O ]׮ĥ|uFvc?3d}=7^1׆b諾4%Mgʁ׳=@t9\˾ʿy+yy k^·ϗreJ|y^N, Ku~X$ސ KÛɒ=%Kᑥ2LAXN}-g+;J=W 4G jVsΫw{A zuvׇu\gs[~|D7ȿFֽo&[-a+:Fo'5? ;Ca'%>v=)~f C/[?{ :D|3gyv>==Ǿ`_ʀ-Au<3~\$|c8I ow\{}ڃz_e8?A7CyZ |}8yGG~oė]D~%~-\bݗ߇9pʹ]#?? pp? i_A o}U _j~nsNy}K|Q9O~/7< R3GqV[ƏjG9AAl?-}8^yڠ~q,^S8x>N8kӱʛ8!Ψ3A8.{l%@qv38W1PI[s8O>e]yq>=_s׸x3.5.D 3q )*>c~}\\~3.O%sR@t}ʔq ?_S^yq֓ W$gq%I\Y}^\*z5^@>Ok$|M=/k\5N"ԏuħq:+cĻa~PcNX n"7rfܧy J_qKRs:;HdqیW{Qwb?'.ոk3PInoq< أ(I{_uO>7~/k`^zT$΃ɓϘ߿`Ce@ipr|hF<A]OGIh1P<}%Ǒշ g"<2)H><(̹L&OSz^O:ӤtE timestampc``ԻӹPK] PKt>}  segments.genPKt>S&1 Esegments_2PKt>?1d5_0.cfsPKt>{'^D We_0.cfxPKt>]  timestampPK*technomancy-leiningen-713a4d9/test_projects/000077500000000000000000000000001173437653500212345ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/README.txt000066400000000000000000000003201173437653500227250ustar00rootroot00000000000000These projects are used for leiningen's test suite, so don't change any of these values without updating the relevant tests. If you just want a basic project to work from, generate a new one with "lein new". technomancy-leiningen-713a4d9/test_projects/dev-deps-only/000077500000000000000000000000001173437653500237225ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/dev-deps-only/.gitignore000066400000000000000000000000311173437653500257040ustar00rootroot00000000000000pom.xml *jar lib classes technomancy-leiningen-713a4d9/test_projects/dev-deps-only/project.clj000066400000000000000000000002741173437653500260650ustar00rootroot00000000000000(defproject dev-deps-only "1.0.0-SNAPSHOT" :java-source-path "src" :dev-dependencies [[cheshire "2.0.2"] [org.clojure/clojure "1.2.1"]] :main dev_deps_only.Junk)technomancy-leiningen-713a4d9/test_projects/dev-deps-only/src/000077500000000000000000000000001173437653500245115ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/dev-deps-only/src/dev_deps_only/000077500000000000000000000000001173437653500273435ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/dev-deps-only/src/dev_deps_only/Junk.java000066400000000000000000000001431173437653500311130ustar00rootroot00000000000000package dev_deps_only; public class Junk { public static void main(String[] args) { ; } } technomancy-leiningen-713a4d9/test_projects/dev-deps-only/src/dev_deps_only/core.clj000066400000000000000000000000301173437653500307560ustar00rootroot00000000000000(ns dev-deps-only.core) technomancy-leiningen-713a4d9/test_projects/native/000077500000000000000000000000001173437653500225225ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/native/.gitignore000066400000000000000000000001031173437653500245040ustar00rootroot00000000000000pom.xml *jar /lib /nnnative /classes .lein-failures .lein-deps-sum technomancy-leiningen-713a4d9/test_projects/native/project.clj000066400000000000000000000006121173437653500246610ustar00rootroot00000000000000(defproject project-name "1.0.0-SNAPSHOT" :description "Test support for transitive native dependencies" :native-path "nnnative" :dependencies [[org.clojure/clojure "1.2.1"] [serial-port "1.0.7"] [penumbra/lwjgl "2.4.2"] [org.clojars.samaaron/rxtx "2.2.0"] [jriengine "0.8.4"] [tokyocabinet "1.24.0"]]) technomancy-leiningen-713a4d9/test_projects/sample/000077500000000000000000000000001173437653500225155ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/000077500000000000000000000000001173437653500245055ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/000077500000000000000000000000001173437653500260505ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/.gitignore000066400000000000000000000000301173437653500300310ustar00rootroot00000000000000pom.xml *jar lib classestechnomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/README000066400000000000000000000001651173437653500267320ustar00rootroot00000000000000# sample2 FIXME: write description ## Usage FIXME: write ## Installation FIXME: write ## License FIXME: write technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/project.clj000066400000000000000000000002521173437653500302070ustar00rootroot00000000000000(defproject sample2 "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.1.0"] [org.clojure/clojure-contrib "1.1.0"]])technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/src/000077500000000000000000000000001173437653500266375ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/src/sample2/000077500000000000000000000000001173437653500302025ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/src/sample2/alt.clj000066400000000000000000000000211173437653500314450ustar00rootroot00000000000000(ns sample2.alt) technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/src/sample2/core.clj000066400000000000000000000000721173437653500316230ustar00rootroot00000000000000(ns sample2.core (:require sample2.alt) (:gen-class)) technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/test/000077500000000000000000000000001173437653500270275ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/test/sample2/000077500000000000000000000000001173437653500303725ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/checkouts/sample2/test/sample2/core_test.clj000066400000000000000000000002061173437653500330510ustar00rootroot00000000000000(ns sample2.core-test (:use [sample2.core] :reload-all) (:use [clojure.test])) (deftest replace-me ;; FIXME: write (is false)) technomancy-leiningen-713a4d9/test_projects/sample/project.clj000066400000000000000000000017171173437653500246630ustar00rootroot00000000000000;; This project is used for leiningen's test suite, so don't change ;; any of these values without updating the relevant tests. If you ;; just want a basic project to work from, generate a new one with ;; "lein new". (def clj-version "1.1.0") (defproject nomnomnom "0.5.0-SNAPSHOT" :description "A test project" :dependencies [[~(symbol "org.clojure" "clojure") ~clj-version] [rome/rome ~(str "0." "9")] [org.ccil.cowan.tagsoup/tagsoup "1.2"]] :main nom.nom.nom :warn-on-reflection true :shell-wrapper {:main nom.nom.nom :bin "bin/nom"} :jar-exclusions [#"^META-INF"] :test-selectors {:integration :integration :default (complement :integration) :random (fn [_] (> (rand) ~(float 1/2))) :all (constantly true)} :repositories {"snapshots" ~(format "file://%s/lein-repo" (System/getProperty "java.io.tmpdir"))}) technomancy-leiningen-713a4d9/test_projects/sample/src/000077500000000000000000000000001173437653500233045ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/src/nom/000077500000000000000000000000001173437653500240755ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/src/nom/nom/000077500000000000000000000000001173437653500246665ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/src/nom/nom/nom.clj000066400000000000000000000006731173437653500261570ustar00rootroot00000000000000(ns nom.nom.nom (:import [org.jdom.adapters CrimsonDOMAdapter]) (:require [sample2.core]) (:gen-class)) (when-not (= "1.1.0" (clojure-version)) (throw (Exception. (str "Not running Clojure 1.1.0 Snapshot: " (clojure-version))))) (def unused-proxy (proxy [Object] [] (toString [] "unused"))) (defn -main [& args] (when-not (empty? args) (println "NOM! Munched" (first args)) (recur (rest args)))) technomancy-leiningen-713a4d9/test_projects/sample/test/000077500000000000000000000000001173437653500234745ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample/test/test_nom_nom_nom.clj000066400000000000000000000002741173437653500275430ustar00rootroot00000000000000(ns test-nom-nom-nom (:use [nom.nom.nom] [clojure.test])) (defn f [x] (.list x)) (deftest should-use-1.1.0 (is (= "1.1.0" (clojure-version))) (f (java.io.File. "/tmp"))) technomancy-leiningen-713a4d9/test_projects/sample_failing/000077500000000000000000000000001173437653500242065ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_failing/project.clj000066400000000000000000000005251173437653500263500ustar00rootroot00000000000000;; This project is used for leiningen's test suite, so don't change ;; any of these values without updating the relevant tests. If you ;; just want a basic project to work from, generate a new one with ;; "lein new". (defproject nomnomnom "0.5.0-SNAPSHOT" :dependencies [[~(symbol "org.clojure" "clojure") ~"1.1.0"]] :main nom.nom.nom) technomancy-leiningen-713a4d9/test_projects/sample_failing/src/000077500000000000000000000000001173437653500247755ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_failing/src/nom/000077500000000000000000000000001173437653500255665ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_failing/src/nom/nom/000077500000000000000000000000001173437653500263575ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_failing/src/nom/nom/nom.clj000066400000000000000000000004001173437653500276340ustar00rootroot00000000000000(ns nom.nom.nom (:gen-class)) failure-expected-here-dont-freak-out This noming squirrel will cause compilation of this file to fail. ,;;:;, ;;;;; ,:;;:; ,'=. ;:;:;' .=" ,'_\ ':;:;,/ ,__:=@ ';;:; =./)_ `"=\_ )_"` ``'" technomancy-leiningen-713a4d9/test_projects/sample_no_aot/000077500000000000000000000000001173437653500240545ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_no_aot/project.clj000066400000000000000000000010651173437653500262160ustar00rootroot00000000000000;; This project is used for leiningen's test suite, so don't change ;; any of these values without updating the relevant tests. If you ;; just want a basic project to work from, generate a new one with ;; "lein new". (defproject nomnomnom "0.5.0-SNAPSHOT" :dependencies [[clojure "1.2.0"] [janino "2.5.15"]] :uberjar-exclusions [#"DUMMY"] :test-selectors {:default (fn [m] (not (:integration m))) :integration :integration :int2 :int2 :no-custom (fn [m] (not (false? (:custom m))))}) technomancy-leiningen-713a4d9/test_projects/sample_no_aot/src/000077500000000000000000000000001173437653500246435ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_no_aot/src/nom/000077500000000000000000000000001173437653500254345ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_no_aot/src/nom/nom/000077500000000000000000000000001173437653500262255ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_no_aot/src/nom/nom/nom.clj000066400000000000000000000000631173437653500275070ustar00rootroot00000000000000(ns nom.nom.nom) ;; This file is not AOT compiled! technomancy-leiningen-713a4d9/test_projects/sample_no_aot/test/000077500000000000000000000000001173437653500250335ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/sample_no_aot/test/selectors.clj000066400000000000000000000011001173437653500275200ustar00rootroot00000000000000(ns selectors (:use [clojure.test] [clojure.java.io])) (defn record-ran [t] (let [file-name (format "%s/lein-test-ran" (System/getProperty "java.io.tmpdir"))] (with-open [w (writer file-name :append true)] (.write w (str t "\n"))))) (deftest ^{:integration true} integration-test (record-ran :integration) (is true)) (deftest regular (record-ran :regular) (is true)) (deftest ^{:custom false} not-custom (record-ran :not-custom) (is true)) (deftest ^{:int2 true} integration-2 (record-ran :int2) (is true)) technomancy-leiningen-713a4d9/test_projects/tricky-name/000077500000000000000000000000001173437653500234575ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/tricky-name/.gitignore000066400000000000000000000000311173437653500254410ustar00rootroot00000000000000pom.xml *jar lib classes technomancy-leiningen-713a4d9/test_projects/tricky-name/project.clj000066400000000000000000000004761173437653500256260ustar00rootroot00000000000000(defproject org.domain/tricky-name "1.0" :description "One with a tricky group and project name" :dev-dependencies [[clojure "1.2.0"]] :shell-wrapper true :main ^{:skip-aot true} org.domain.tricky-name.core :run-aliases {:bbb org.domain.tricky-name.brunch :mmm org.domain.tricky-name.munch}) technomancy-leiningen-713a4d9/test_projects/tricky-name/src/000077500000000000000000000000001173437653500242465ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/000077500000000000000000000000001173437653500250355ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/domain/000077500000000000000000000000001173437653500263045ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/domain/tricky_name/000077500000000000000000000000001173437653500306115ustar00rootroot00000000000000technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/domain/tricky_name/brunch.clj000066400000000000000000000002121173437653500325570ustar00rootroot00000000000000(ns org.domain.tricky-name.brunch) (defn -main [& args] (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir")) "BRUNCH")) technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/domain/tricky_name/core.clj000066400000000000000000000003301173437653500322270ustar00rootroot00000000000000(ns org.domain.tricky-name.core) (defn -main [& args] (when-not (empty? args) (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir")) (str "nom:" (first args))) (recur (rest args)))) technomancy-leiningen-713a4d9/test_projects/tricky-name/src/org/domain/tricky_name/munch.clj000066400000000000000000000002371173437653500324170ustar00rootroot00000000000000(ns org.domain.tricky-name.munch) (defn -main [& args] (spit (format "%s/lein-test" (System/getProperty "java.io.tmpdir")) (pr-str :munched args))) technomancy-leiningen-713a4d9/todo.org000066400000000000000000000143721173437653500200310ustar00rootroot00000000000000Leiningen TODOs See also https://github.com/technomancy/leiningen/issues * For 1.7.0 - [X] System/exit in repl (#324) - [X] interactive task takes full CPU (#346) - [X] whole-namespace test selectors (#242) - [X] Auto-exclusions for dev-deps and plugins (#375) - [X] Investigate NPE on lein test (#388) - [X] Bring back rlwrap (#381) * For 1.6.2 - [X] resources with eval-in-leiningen (#248) - [X] fix :omit-default-repositories wrt central (#211) - [X] deps should run an implicit clean - [X] don't let multiple versions of a plugin interfere with each other (#301) - [X] non-jar deps on classpath (#244) - [X] recover from error in interactive (#234) - [X] use java class in run task (#249) - [X] fix deploy with new maven-ant-tasks * For 1.6.1 - [X] upgrade hooke - [X] make it easier to use :repl-options [:print clojure.pprint/pprint] - [X] fix shutdown-agents with repl - [X] don't clear out lib/dev upon jarring (221) - [X] support alternate main namespace for uberjar. * For 1.6.0 - [X] Trampoline functionality - [X] move exit-after-tests check to eval-in-project (discuss on list?) - [X] don't freak out when attempting to download non-existent indices - [X] improve error message for unconfigured deploy - [X] make search work outside project - [X] clear up home directory duality in Windows/MinGW - [X] show total result count in search results - [X] transitive native-deps support - [X] make :repl-init change initial ns of repl and swank - [X] more flexibility in search results - [X] support ns/name in run task - [X] add option to use ~/.m2-based classpath instead of copying to lib/ - [X] Merge lein-search - [X] Merge lein-retest - [X] Merge native-deps - [X] Add leiningen.util.injected namespace * For 1.5.1 - [X] Move ns docstrings to :help-summary to allow AOT given CLJ-130. - [X] Put :eval-in-lein deps in lib/dev for leiningen process access. - [X] Revert back to :warn on checksum failure. - [X] Fix LEIN_ROOT warning in bin/lein. - [X] Honor user-settings in more places. * For 1.5.0 - unify auth options between :repositories and :deploy-to - suppress socket closed stacktrace in interactive task - checksum deps set; don't re-download if unchanged - allow whitelist for post-compile class file deletion - fix warn-on-reflection for repl task (#176) - explain how to do manual self-install if it fails - failure to upgrade leaves lein as a zero-length file (#153) - ensure project jar is last in uberjar (#178) - investigate uberjar slowdown? (#160) * For 1.4.0 - socket timing issues with interactive tests - connect to socket repl in interactive task - :uberjar-exclusions? - :all test-selector built-in - test selectors need to support things like constantly, complement - detect missing level of nesting in project.clj's deps/dev-deps - clear out non-transitive .class files after AOT Luc Prefontaine has code for this. - plugin task for managing/upgrading plugins Manually copying jar files into ~/.lein/plugins is pretty lame. Let's get a task to handle this. It could be implemented as a plugin at first, maybe. - merge lein-run task? Ditto; this is something useful that many projects need. - expose original pwd as property - merge lein-javac task Also make the compile task run it where appropriate. - test selectors using metadata; run a subset of tests We could have a :test-selectors key in project.clj that would map keywords to predicate functions. Then the test task could take a keyword argument and only run the subset of the tests for which calling the predicate on its metadata returns true. * For 1.3.0 - specify min. lein version in project.clj - :omit-source - lein install $PROJECT (works outside project root) - write shell wrappers on install - include shell wrapper in jar file from template - set arbitrary jar metadata - errors in read-project should show filename - user-level plugin installation and activation - user-level config file (with hook list) - get no-project-needed from arglist - argument chaining - interactive task - resources in generated pom * For 1.2.0 - Fix self-build clean problem - Don't catch reader exceptions unless they are from ^D - document checkout dependencies - Re-enable rlwrap - Move the intro into a tutorial - bin script has stabilized; self-install for dev versions should work - accept list of namespaces to compile from command-line options - document version ranges - include lib/dev in find-lib-jars - document plugin creation - document all known project.clj keys - disable frickin [null] logging from ant (come on srsly) - recover from missing test exit map gracefully - Help task should display arglist - walk up the filesystem to find project.clj - make inter-task dependencies honor hooks - wire repl task up to socket repl - allow \*warn-on-reflection\* to be turned on in project.clj - Expose hooks in built-in tasks so plugins may extend them - make org.clojure implied for clojure/contrib deps - better way to force setFork in eval-in-project - rename :namespaces key in project.clj - include version in jar filenames - classpath task to just print configured classpath - move repl task from shell script to clojure code * For 1.1.0 - upgrade task (patch submitted) - doc generation (autodoc plugin) * For 1.0 - Remove install task dependency on having Maven installed - Use -Xbootclasspath where possible - Don't write manifest, pom, etc. to disk when jarring - Don't put uberjar in ~/.m2 - Perform compilation in either a subprocess or with a separate classloader - Allow test task to take namespaces as an argument - Fix eval-in-project to let plugins pass in extra args - Resources directory added to classpath (for properties, etc) * Git-aware dependencies (experimental back-burner idea) Talking with Rich after Emerging Langs day 1 Problem: you can pull in two versions of the same library transitively without realizing it if people fork on clojars. How do we detect this problem and de-dupe? - What if artifacts could be correlated with the git rev that produced them? - They have repository and sha1 metadata in their pom (but no history tree) - Cross-correlate with a separate revision metadata store? technomancy-leiningen-713a4d9/zsh_completion.zsh000066400000000000000000000050331173437653500221300ustar00rootroot00000000000000#compdef lein # Lein ZSH completion function # Drop this somewhere in your $fpath (like /usr/share/zsh/site-functions) # and rename it _lein _lein() { if (( CURRENT > 2 )); then # shift words so _arguments doesn't have to be concerned with second command (( CURRENT-- )) shift words # use _call_function here in case it doesn't exist _call_function 1 _lein_${words[1]} else _values "lein command" \ "classpath[Print the classpath of the current project.]" \ "clean[Remove compiled class files and jars from project.]" \ "compile[Compile Clojure source into \.class files.]" \ "deploy[Build jar and deploy to remote repository.]" \ "deps[Download :dependencies and put them in :library-path.]" \ "help[Display a list of tasks or help for a given task.]" \ "install[Install current project or download specified project.]" \ "interactive[Enter an interactive task shell.]" \ "jack-in[Jack in to a Clojure SLIME session from Emacs.]" \ "jar[Package up all the project's files into a jar file.]" \ "javac[Compile Java source files.]" \ "new[Create a new project skeleton.]" \ "plugin[Manage user-level plugins.]" \ "pom[Write a pom.xml file to disk for Maven interop.]" \ "repl[Start a repl session either with the current project or standalone.]" \ "retest[Run only the test namespaces which failed last time around.]" \ "run[Run the project's -main function.]" \ "search[Search remote repositories.]" \ "swank[Launch swank server for Emacs to connect.]" \ "test[Run the project's tests.]" \ "test![Run a project's tests after cleaning and fetching dependencies.]" \ "trampoline[Run a task without nesting the project's JVM inside Leiningen's.]" \ "uberjar[Package up the project files and all dependencies into a jar file.]" \ "upgrade[Upgrade Leiningen to the latest stable release.]" \ "version[Print version for Leiningen and the current JVM.]" fi } _lein_plugin() { _values "lein plugin commands" \ "install[Download, package, and install plugin jarfile into ~/.lein/plugins]" \ "uninstall[Delete the plugin jarfile: \[GROUP/\]ARTIFACT-ID VERSION]" } _lein_namespaces() { if [ -d test ]; then _values "lein valid namespaces" $(find $1 -type f -name "*.clj" -exec grep -E \ '^\(ns[[:space:]]+\w+' '{}' ';' | awk '/\(ns[ ]*([A-Za-z\.]+)/ {print $2}') fi } _lein_run() { _lein_namespaces "src/" } _lein_test() { _lein_namespaces "test/" } _lein_test!() { _lein_namespaces "test/" }