From 9f7ceda159998803db17c7073daa33091fa596f7 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Jul 2022 11:28:25 +0000 Subject: [PATCH] Deployer 7.0.0-rc.9 --- .gitattributes | 8 - .github/FUNDING.yml | 1 - .github/ISSUE_TEMPLATE/bug_report.md | 11 - .github/ISSUE_TEMPLATE/config.yml | 8 - .github/ISSUE_TEMPLATE/feature_request.md | 7 - .github/PULL_REQUEST_TEMPLATE.md | 8 - .github/dependabot.yml | 8 - .github/workflows/check.yml | 62 - .github/workflows/docs.yml | 44 - .github/workflows/release.yml | 69 - .github/workflows/sync.yml | 46 - .github/workflows/test.yml | 75 - .gitignore | 4 - bin/build | 92 - bin/dep | 97 - bin/docgen | 56 - composer.json | 96 +- composer.lock | 4819 ----------------- dep | Bin 0 -> 777027 bytes docs/KNOWN_BUGS.md | 57 - docs/UPGRADE.md | 250 - docs/api.md | 562 -- docs/avoid-php-fpm-reloading.md | 54 - docs/basics.md | 233 - docs/ci-cd.md | 96 - docs/cli.md | 146 - docs/contrib/bugsnag.md | 42 - docs/contrib/cachetool.md | 125 - docs/contrib/chatwork.md | 190 - docs/contrib/cimonitor.md | 215 - docs/contrib/cloudflare.md | 45 - docs/contrib/cpanel.md | 179 - docs/contrib/crontab.md | 58 - docs/contrib/directadmin.md | 87 - docs/contrib/discord.md | 144 - docs/contrib/grafana.md | 58 - docs/contrib/hangouts.md | 128 - docs/contrib/hipchat.md | 89 - docs/contrib/ispmanager.md | 241 - docs/contrib/mattermost.md | 208 - docs/contrib/ms-teams.md | 176 - docs/contrib/newrelic.md | 67 - docs/contrib/npm.md | 53 - docs/contrib/phinx.md | 117 - docs/contrib/php-fpm.md | 75 - docs/contrib/rabbit.md | 69 - docs/contrib/raygun.md | 48 - docs/contrib/rocketchat.md | 229 - docs/contrib/rollbar.md | 59 - docs/contrib/rsync.md | 221 - docs/contrib/sentry.md | 73 - docs/contrib/slack.md | 217 - docs/contrib/telegram.md | 141 - docs/contrib/webpack_encore.md | 66 - docs/contrib/workplace.md | 148 - docs/contrib/yammer.md | 142 - docs/contrib/yarn.md | 48 - docs/getting-started.md | 138 - docs/hosts.md | 184 - docs/installation.md | 29 - docs/recipe/cakephp.md | 77 - docs/recipe/codeigniter.md | 53 - docs/recipe/common.md | 220 - docs/recipe/composer.md | 28 - docs/recipe/contao.md | 115 - docs/recipe/deploy/check_remote.md | 21 - docs/recipe/deploy/cleanup.md | 31 - docs/recipe/deploy/clear_paths.md | 38 - docs/recipe/deploy/copy_dirs.md | 29 - docs/recipe/deploy/info.md | 20 - docs/recipe/deploy/lock.md | 36 - docs/recipe/deploy/push.md | 22 - docs/recipe/deploy/release.md | 82 - docs/recipe/deploy/rollback.md | 46 - docs/recipe/deploy/setup.md | 20 - docs/recipe/deploy/shared.md | 43 - docs/recipe/deploy/symlink.md | 28 - docs/recipe/deploy/update_code.md | 82 - docs/recipe/deploy/vendors.md | 50 - docs/recipe/deploy/writable.md | 88 - docs/recipe/drupal7.md | 96 - docs/recipe/drupal8.md | 81 - docs/recipe/flow_framework.md | 83 - docs/recipe/fuelphp.md | 43 - docs/recipe/joomla.md | 64 - docs/recipe/laravel.md | 386 -- docs/recipe/magento.md | 81 - docs/recipe/magento2.md | 266 - docs/recipe/pimcore.md | 51 - docs/recipe/prestashop.md | 90 - docs/recipe/provision.md | 150 - docs/recipe/provision/databases.md | 73 - docs/recipe/provision/nodejs.md | 31 - docs/recipe/provision/php.md | 44 - docs/recipe/provision/website.md | 51 - docs/recipe/shopware.md | 212 - docs/recipe/silverstripe.md | 88 - docs/recipe/statamic.md | 176 - docs/recipe/sulu.md | 46 - docs/recipe/symfony.md | 137 - docs/recipe/typo3.md | 86 - docs/recipe/wordpress.md | 64 - docs/recipe/yii.md | 53 - docs/recipe/zend_framework.md | 28 - docs/sidebar.js | 26 - docs/tasks.md | 135 - docs/yaml.md | 31 - recipe/cakephp.php | 48 - recipe/codeigniter.php | 22 - recipe/common.php | 184 - recipe/composer.php | 13 - recipe/contao.php | 105 - recipe/deploy/check_remote.php | 49 - recipe/deploy/cleanup.php | 20 - recipe/deploy/clear_paths.php | 24 - recipe/deploy/copy_dirs.php | 31 - recipe/deploy/info.php | 7 - recipe/deploy/lock.php | 32 - recipe/deploy/push.php | 24 - recipe/deploy/release.php | 194 - recipe/deploy/rollback.php | 90 - recipe/deploy/setup.php | 20 - recipe/deploy/shared.php | 88 - recipe/deploy/symlink.php | 20 - recipe/deploy/update_code.php | 117 - recipe/deploy/vendors.php | 32 - recipe/deploy/writable.php | 134 - recipe/drupal7.php | 79 - recipe/drupal8.php | 31 - recipe/flow_framework.php | 47 - recipe/fuelphp.php | 21 - recipe/joomla.php | 16 - recipe/laravel.php | 230 - recipe/magento.php | 50 - recipe/magento2.php | 220 - recipe/pimcore.php | 35 - recipe/prestashop.php | 43 - recipe/provision.php | 285 - recipe/provision/databases.php | 63 - recipe/provision/nodejs.php | 12 - recipe/provision/php.php | 69 - recipe/provision/website.php | 90 - recipe/shopware.php | 184 - recipe/silverstripe.php | 65 - recipe/statamic.php | 126 - recipe/sulu.php | 32 - recipe/symfony.php | 69 - recipe/typo3.php | 47 - recipe/wordpress.php | 16 - recipe/yii.php | 22 - recipe/zend_framework.php | 16 - src/Collection/Collection.php | 91 - src/Command/BlackjackCommand.php | 392 -- src/Command/CommandCommon.php | 40 - src/Command/ConfigCommand.php | 77 - src/Command/CustomOption.php | 50 - src/Command/InitCommand.php | 258 - src/Command/MainCommand.php | 234 - src/Command/RunCommand.php | 88 - src/Command/SelectCommand.php | 120 - src/Command/SshCommand.php | 111 - src/Command/TreeCommand.php | 178 - src/Command/WorkerCommand.php | 57 - src/Component/PharUpdate/Console/Command.php | 132 - src/Component/PharUpdate/Console/Helper.php | 32 - .../PharUpdate/Exception/Exception.php | 35 - .../Exception/ExceptionInterface.php | 12 - .../PharUpdate/Exception/FileException.php | 12 - .../Exception/InvalidArgumentException.php | 12 - .../PharUpdate/Exception/LogicException.php | 12 - src/Component/PharUpdate/Manager.php | 112 - src/Component/PharUpdate/Manifest.php | 131 - src/Component/PharUpdate/Update.php | 272 - src/Component/PharUpdate/Version/Builder.php | 278 - .../PharUpdate/Version/Comparator.php | 174 - src/Component/PharUpdate/Version/Dumper.php | 52 - .../Exception/InvalidIdentifierException.php | 45 - .../Exception/InvalidNumberException.php | 45 - .../InvalidStringRepresentationException.php | 45 - .../Version/Exception/VersionException.php | 14 - src/Component/PharUpdate/Version/Parser.php | 115 - .../PharUpdate/Version/Validator.php | 57 - src/Component/PharUpdate/Version/Version.php | 139 - src/Component/Pimple/Container.php | 287 - .../Exception/ExpectedInvokableException.php | 20 - .../Exception/FrozenServiceException.php | 27 - .../InvalidServiceIdentifierException.php | 27 - .../Exception/UnknownIdentifierException.php | 27 - src/Component/ProcessRunner/Printer.php | 74 - src/Component/ProcessRunner/ProcessRunner.php | 90 - src/Component/Ssh/Client.php | 127 - src/Component/Ssh/IOArguments.php | 73 - src/Configuration/Configuration.php | 241 - src/Deployer.php | 380 -- src/Documentation/ApiGen.php | 111 - src/Documentation/DocConfig.php | 34 - src/Documentation/DocGen.php | 259 - src/Documentation/DocRecipe.php | 162 - src/Documentation/DocTask.php | 37 - src/Exception/ConfigurationException.php | 13 - src/Exception/Exception.php | 68 - src/Exception/GracefulShutdownException.php | 25 - src/Exception/HttpieException.php | 13 - src/Exception/RunException.php | 83 - src/Exception/TimeoutException.php | 20 - src/Exception/WillAskUser.php | 16 - src/Executor/Master.php | 285 - src/Executor/Messenger.php | 158 - src/Executor/Planner.php | 68 - src/Executor/Server.php | 114 - src/Executor/Worker.php | 55 - src/Host/Host.php | 305 -- src/Host/HostCollection.php | 23 - src/Host/Localhost.php | 17 - src/Host/Range.php | 42 - src/Importer/Importer.php | 264 - src/Logger/Handler/FileHandler.php | 27 - src/Logger/Handler/HandlerInterface.php | 14 - src/Logger/Handler/NullHandler.php | 16 - src/Logger/Logger.php | 57 - src/Selector/Selector.php | 114 - src/Support/ObjectProxy.php | 30 - src/Support/Reporter.php | 45 - src/Support/helpers.php | 254 - src/Support/update_manifest.php | 41 - src/Task/Context.php | 85 - src/Task/GroupTask.php | 52 - src/Task/ScriptManager.php | 123 - src/Task/Task.php | 273 - src/Task/TaskCollection.php | 28 - src/Utility/Httpie.php | 185 - src/Utility/Rsync.php | 152 - src/functions.php | 951 ---- src/schema.json | 130 - 234 files changed, 29 insertions(+), 27456 deletions(-) delete mode 100644 .gitattributes delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/config.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/check.yml delete mode 100644 .github/workflows/docs.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/sync.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .gitignore delete mode 100755 bin/build delete mode 100755 bin/dep delete mode 100755 bin/docgen delete mode 100644 composer.lock create mode 100755 dep delete mode 100644 docs/KNOWN_BUGS.md delete mode 100644 docs/UPGRADE.md delete mode 100644 docs/api.md delete mode 100644 docs/avoid-php-fpm-reloading.md delete mode 100644 docs/basics.md delete mode 100755 docs/ci-cd.md delete mode 100755 docs/cli.md delete mode 100644 docs/contrib/bugsnag.md delete mode 100644 docs/contrib/cachetool.md delete mode 100644 docs/contrib/chatwork.md delete mode 100644 docs/contrib/cimonitor.md delete mode 100644 docs/contrib/cloudflare.md delete mode 100644 docs/contrib/cpanel.md delete mode 100644 docs/contrib/crontab.md delete mode 100644 docs/contrib/directadmin.md delete mode 100644 docs/contrib/discord.md delete mode 100644 docs/contrib/grafana.md delete mode 100644 docs/contrib/hangouts.md delete mode 100644 docs/contrib/hipchat.md delete mode 100644 docs/contrib/ispmanager.md delete mode 100644 docs/contrib/mattermost.md delete mode 100644 docs/contrib/ms-teams.md delete mode 100644 docs/contrib/newrelic.md delete mode 100644 docs/contrib/npm.md delete mode 100644 docs/contrib/phinx.md delete mode 100644 docs/contrib/php-fpm.md delete mode 100644 docs/contrib/rabbit.md delete mode 100644 docs/contrib/raygun.md delete mode 100644 docs/contrib/rocketchat.md delete mode 100644 docs/contrib/rollbar.md delete mode 100644 docs/contrib/rsync.md delete mode 100644 docs/contrib/sentry.md delete mode 100644 docs/contrib/slack.md delete mode 100644 docs/contrib/telegram.md delete mode 100644 docs/contrib/webpack_encore.md delete mode 100644 docs/contrib/workplace.md delete mode 100644 docs/contrib/yammer.md delete mode 100644 docs/contrib/yarn.md delete mode 100755 docs/getting-started.md delete mode 100644 docs/hosts.md delete mode 100755 docs/installation.md delete mode 100644 docs/recipe/cakephp.md delete mode 100644 docs/recipe/codeigniter.md delete mode 100644 docs/recipe/common.md delete mode 100644 docs/recipe/composer.md delete mode 100644 docs/recipe/contao.md delete mode 100644 docs/recipe/deploy/check_remote.md delete mode 100644 docs/recipe/deploy/cleanup.md delete mode 100644 docs/recipe/deploy/clear_paths.md delete mode 100644 docs/recipe/deploy/copy_dirs.md delete mode 100644 docs/recipe/deploy/info.md delete mode 100644 docs/recipe/deploy/lock.md delete mode 100644 docs/recipe/deploy/push.md delete mode 100644 docs/recipe/deploy/release.md delete mode 100644 docs/recipe/deploy/rollback.md delete mode 100644 docs/recipe/deploy/setup.md delete mode 100644 docs/recipe/deploy/shared.md delete mode 100644 docs/recipe/deploy/symlink.md delete mode 100644 docs/recipe/deploy/update_code.md delete mode 100644 docs/recipe/deploy/vendors.md delete mode 100644 docs/recipe/deploy/writable.md delete mode 100644 docs/recipe/drupal7.md delete mode 100644 docs/recipe/drupal8.md delete mode 100644 docs/recipe/flow_framework.md delete mode 100644 docs/recipe/fuelphp.md delete mode 100644 docs/recipe/joomla.md delete mode 100644 docs/recipe/laravel.md delete mode 100644 docs/recipe/magento.md delete mode 100644 docs/recipe/magento2.md delete mode 100644 docs/recipe/pimcore.md delete mode 100644 docs/recipe/prestashop.md delete mode 100644 docs/recipe/provision.md delete mode 100644 docs/recipe/provision/databases.md delete mode 100644 docs/recipe/provision/nodejs.md delete mode 100644 docs/recipe/provision/php.md delete mode 100644 docs/recipe/provision/website.md delete mode 100644 docs/recipe/shopware.md delete mode 100644 docs/recipe/silverstripe.md delete mode 100644 docs/recipe/statamic.md delete mode 100644 docs/recipe/sulu.md delete mode 100644 docs/recipe/symfony.md delete mode 100644 docs/recipe/typo3.md delete mode 100644 docs/recipe/wordpress.md delete mode 100644 docs/recipe/yii.md delete mode 100644 docs/recipe/zend_framework.md delete mode 100644 docs/sidebar.js delete mode 100644 docs/tasks.md delete mode 100644 docs/yaml.md delete mode 100644 recipe/cakephp.php delete mode 100644 recipe/codeigniter.php delete mode 100644 recipe/common.php delete mode 100644 recipe/composer.php delete mode 100644 recipe/contao.php delete mode 100644 recipe/deploy/check_remote.php delete mode 100644 recipe/deploy/cleanup.php delete mode 100644 recipe/deploy/clear_paths.php delete mode 100644 recipe/deploy/copy_dirs.php delete mode 100644 recipe/deploy/info.php delete mode 100644 recipe/deploy/lock.php delete mode 100644 recipe/deploy/push.php delete mode 100644 recipe/deploy/release.php delete mode 100644 recipe/deploy/rollback.php delete mode 100644 recipe/deploy/setup.php delete mode 100644 recipe/deploy/shared.php delete mode 100644 recipe/deploy/symlink.php delete mode 100644 recipe/deploy/update_code.php delete mode 100644 recipe/deploy/vendors.php delete mode 100644 recipe/deploy/writable.php delete mode 100644 recipe/drupal7.php delete mode 100644 recipe/drupal8.php delete mode 100644 recipe/flow_framework.php delete mode 100644 recipe/fuelphp.php delete mode 100644 recipe/joomla.php delete mode 100644 recipe/laravel.php delete mode 100644 recipe/magento.php delete mode 100644 recipe/magento2.php delete mode 100644 recipe/pimcore.php delete mode 100644 recipe/prestashop.php delete mode 100644 recipe/provision.php delete mode 100644 recipe/provision/databases.php delete mode 100644 recipe/provision/nodejs.php delete mode 100644 recipe/provision/php.php delete mode 100644 recipe/provision/website.php delete mode 100644 recipe/shopware.php delete mode 100644 recipe/silverstripe.php delete mode 100644 recipe/statamic.php delete mode 100644 recipe/sulu.php delete mode 100644 recipe/symfony.php delete mode 100644 recipe/typo3.php delete mode 100644 recipe/wordpress.php delete mode 100644 recipe/yii.php delete mode 100644 recipe/zend_framework.php delete mode 100644 src/Collection/Collection.php delete mode 100644 src/Command/BlackjackCommand.php delete mode 100644 src/Command/CommandCommon.php delete mode 100644 src/Command/ConfigCommand.php delete mode 100644 src/Command/CustomOption.php delete mode 100644 src/Command/InitCommand.php delete mode 100644 src/Command/MainCommand.php delete mode 100644 src/Command/RunCommand.php delete mode 100644 src/Command/SelectCommand.php delete mode 100644 src/Command/SshCommand.php delete mode 100644 src/Command/TreeCommand.php delete mode 100644 src/Command/WorkerCommand.php delete mode 100644 src/Component/PharUpdate/Console/Command.php delete mode 100644 src/Component/PharUpdate/Console/Helper.php delete mode 100644 src/Component/PharUpdate/Exception/Exception.php delete mode 100644 src/Component/PharUpdate/Exception/ExceptionInterface.php delete mode 100644 src/Component/PharUpdate/Exception/FileException.php delete mode 100644 src/Component/PharUpdate/Exception/InvalidArgumentException.php delete mode 100644 src/Component/PharUpdate/Exception/LogicException.php delete mode 100644 src/Component/PharUpdate/Manager.php delete mode 100644 src/Component/PharUpdate/Manifest.php delete mode 100644 src/Component/PharUpdate/Update.php delete mode 100644 src/Component/PharUpdate/Version/Builder.php delete mode 100644 src/Component/PharUpdate/Version/Comparator.php delete mode 100644 src/Component/PharUpdate/Version/Dumper.php delete mode 100644 src/Component/PharUpdate/Version/Exception/InvalidIdentifierException.php delete mode 100644 src/Component/PharUpdate/Version/Exception/InvalidNumberException.php delete mode 100644 src/Component/PharUpdate/Version/Exception/InvalidStringRepresentationException.php delete mode 100644 src/Component/PharUpdate/Version/Exception/VersionException.php delete mode 100644 src/Component/PharUpdate/Version/Parser.php delete mode 100644 src/Component/PharUpdate/Version/Validator.php delete mode 100644 src/Component/PharUpdate/Version/Version.php delete mode 100644 src/Component/Pimple/Container.php delete mode 100644 src/Component/Pimple/Exception/ExpectedInvokableException.php delete mode 100644 src/Component/Pimple/Exception/FrozenServiceException.php delete mode 100644 src/Component/Pimple/Exception/InvalidServiceIdentifierException.php delete mode 100644 src/Component/Pimple/Exception/UnknownIdentifierException.php delete mode 100644 src/Component/ProcessRunner/Printer.php delete mode 100644 src/Component/ProcessRunner/ProcessRunner.php delete mode 100644 src/Component/Ssh/Client.php delete mode 100644 src/Component/Ssh/IOArguments.php delete mode 100644 src/Configuration/Configuration.php delete mode 100755 src/Deployer.php delete mode 100644 src/Documentation/ApiGen.php delete mode 100644 src/Documentation/DocConfig.php delete mode 100644 src/Documentation/DocGen.php delete mode 100644 src/Documentation/DocRecipe.php delete mode 100644 src/Documentation/DocTask.php delete mode 100644 src/Exception/ConfigurationException.php delete mode 100644 src/Exception/Exception.php delete mode 100644 src/Exception/GracefulShutdownException.php delete mode 100644 src/Exception/HttpieException.php delete mode 100644 src/Exception/RunException.php delete mode 100644 src/Exception/TimeoutException.php delete mode 100644 src/Exception/WillAskUser.php delete mode 100644 src/Executor/Master.php delete mode 100644 src/Executor/Messenger.php delete mode 100644 src/Executor/Planner.php delete mode 100644 src/Executor/Server.php delete mode 100644 src/Executor/Worker.php delete mode 100644 src/Host/Host.php delete mode 100644 src/Host/HostCollection.php delete mode 100644 src/Host/Localhost.php delete mode 100644 src/Host/Range.php delete mode 100644 src/Importer/Importer.php delete mode 100644 src/Logger/Handler/FileHandler.php delete mode 100644 src/Logger/Handler/HandlerInterface.php delete mode 100644 src/Logger/Handler/NullHandler.php delete mode 100644 src/Logger/Logger.php delete mode 100644 src/Selector/Selector.php delete mode 100644 src/Support/ObjectProxy.php delete mode 100644 src/Support/Reporter.php delete mode 100644 src/Support/helpers.php delete mode 100644 src/Support/update_manifest.php delete mode 100644 src/Task/Context.php delete mode 100644 src/Task/GroupTask.php delete mode 100644 src/Task/ScriptManager.php delete mode 100644 src/Task/Task.php delete mode 100644 src/Task/TaskCollection.php delete mode 100644 src/Utility/Httpie.php delete mode 100644 src/Utility/Rsync.php delete mode 100644 src/functions.php delete mode 100644 src/schema.json diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index e98291135..000000000 --- a/.gitattributes +++ /dev/null @@ -1,8 +0,0 @@ -/.gitattributes export-ignore -/.github/ export-ignore -/.gitignore export-ignore -/docs/ export-ignore -/phpcs.xml export-ignore -/phpstan.neon export-ignore -/phpunit.xml export-ignore -/tests/ export-ignore diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index bc2800951..000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: antonmedv diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 534a8a3bd..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve. -title: '' -labels: '' -assignees: '' ---- -- Deployer version: -- Deployment OS: - - Please, provide a minimal reproducible example of deploy.php diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index e4626d2ba..000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Ask question - url: https://github.com/deployphp/deployer/discussions/category_choices - about: Please ask questions in discussions. - - name: 💰 Paid Support - url: https://github.com/deployphp/deployer/discussions/3031 - about: We can offer a paid support for Deployer. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 3e9561cf8..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project. -title: '' -labels: '' -assignees: '' ---- diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 3f7bff1e8..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ -- [ ] Bug fix #…? -- [ ] New feature? -- [ ] BC breaks? -- [ ] Tests added? -- [ ] Docs added? - - Please, regenerate docs by running next command: - $ php bin/docgen diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 46c62116f..000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: 2 - -updates: - - package-ecosystem: "composer" - directory: / - schedule: - interval: "monthly" - versioning-strategy: increase-if-necessary diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml deleted file mode 100644 index 0dd9b0c4e..000000000 --- a/.github/workflows/check.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: check - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - phpstan: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run test suite - run: composer phpstan - - phpcs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run test suite - run: composer phpcs diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 4dd06de77..000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: doc - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - docgen: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run docgen - run: php bin/docgen - - - name: Check for uncommitted changes - run: | - status=$(git status --porcelain docs/); - [ -z "$status" ] || { - echo "Please, run bin/docgen and commit next files:"; - echo $status; - exit 1; - } diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index ab185017c..000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: release - -on: - release: - types: - - created - -jobs: - release: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Get version - run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/v}" >> $GITHUB_ENV - - - name: Build phar - run: php -d phar.readonly=0 bin/build -v"$RELEASE_VERSION" - - - name: Verify version - run: php deployer.phar -V - - - name: Upload phar - run: gh release upload v"$RELEASE_VERSION" deployer.phar - env: - GITHUB_TOKEN: ${{ secrets.MY_TOKEN }} - - - name: Calculate sha1 - run: echo "SHA1=$(sha1sum deployer.phar | awk '{print $1;}')" >> $GITHUB_ENV - - - name: Update manifest - uses: deployphp/action@v1 - with: - private-key: ${{ secrets.PRIVATE_KEY }} - deployer-binary: bin/dep - dep: -f deploy.yaml release -o sha1=${{ env.SHA1 }} -o version=${{ env.RELEASE_VERSION }} - - - name: Add deployer.phar - shell: bash - run: | - set -x - git checkout -b dist - mv deployer.phar dep - chmod +x dep - git add -f dep - - - name: Remove obsolete files & dirs - shell: bash - run: | - set -x - git rm -r .github/ bin/ docs/ recipe/ src/ *.lock .gitattributes .gitignore - - - name: Update composer.json - shell: bash - run: | - set -x - cat composer.json | jq 'del(.autoload) | del(.scripts) | del(.require) | del(."require-dev") | setpath(["bin"]; "dep")' > composer-new.json - mv composer-new.json composer.json - git add composer.json - - - name: Push release tag - shell: bash - run: | - set -x - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git config --global user.name "github-actions" - git commit -m "Deployer $RELEASE_VERSION" - git tag "v$RELEASE_VERSION" --force - git push origin "v$RELEASE_VERSION" --force diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml deleted file mode 100644 index 9da229034..000000000 --- a/.github/workflows/sync.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: sync - -on: - push: - branches: [ master ] - -jobs: - docs: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run docgen - run: php bin/docgen - - - name: Add & Commit - uses: EndBug/add-and-commit@v7 - with: - add: 'docs' - message: '[automatic] Update docs with bin/docgen' - - - name: Deploy docs - run: gh --repo "$REPO" workflow run deploy-docs - env: - GITHUB_TOKEN: ${{ secrets.MY_TOKEN }} - REPO: ${{ secrets.DOCS_REPO }} - diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 8fb575716..000000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,75 +0,0 @@ -name: test - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - unit: - runs-on: ubuntu-latest - strategy: - matrix: - php-versions: [ '7.3', '7.4', '8.0', '8.1' ] - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extensions: mbstring, intl - coverage: xdebug - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run test suite - run: composer test - - e2e: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: satackey/action-docker-layer-caching@v0.0.8 - continue-on-error: true - - - name: Build the docker-compose stack - run: cd tests/docker && docker-compose build - - - name: Get Composer Cache Directory - id: composer-cache - run: | - echo "::set-output name=dir::$(composer config cache-files-dir)" - - - uses: actions/cache@v2 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-composer- - - - name: Install dependencies - if: steps.composer-cache.outputs.cache-hit != 'true' - run: composer install --prefer-dist --no-progress - - - name: Run E2E test suite - run: cd tests/docker && docker-compose up --abort-on-container-exit diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a8419a718..000000000 --- a/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/vendor/ -*.phar -.phpunit.result.cache -docker-compose.override.yml diff --git a/bin/build b/bin/build deleted file mode 100755 index 1f34e3c81..000000000 --- a/bin/build +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -if (ini_get('phar.readonly') === '1') { - throw new \Exception('Writing to phar files is disabled. Change your `php.ini` or append `-d phar.readonly=false` to the shebang, if supported by your `env` executable.'); -} - -define('__ROOT__', realpath(__DIR__ . '/..')); -chdir(__ROOT__); - -$opt = getopt('v:', ['nozip']); - -$version = $opt['v'] ?? null; -if (empty($version)) { - echo "Please, specify version as \"-v7.0.0-beta.42\".\n"; - exit(1); -} -if (!preg_match('/^\d+\.\d+\.\d+(\-\w+(\.\d+)?)?$/', $version)) { - echo "Version must be \"7.0.0-beta.42\". Got \"$version\".\n"; - exit(1); -} - -`composer install --no-dev --prefer-dist --optimize-autoloader`; - -$pharName = "deployer.phar"; -$pharFile = __ROOT__ . '/' . $pharName; -if (file_exists($pharFile)) { - unlink($pharFile); -} - -$ignore = [ - '.anton', - '.git', - 'Tests', - 'tests', - 'deploy.php', -]; - -$phar = new \Phar($pharFile, 0, $pharName); -$phar->setSignatureAlgorithm(\Phar::SHA1); -$phar->startBuffering(); -$iterator = new RecursiveDirectoryIterator(__ROOT__, FilesystemIterator::SKIP_DOTS); -$iterator = new RecursiveCallbackFilterIterator($iterator, function (SplFileInfo $fileInfo) use ($ignore) { - return !in_array($fileInfo->getBasename(), $ignore, true); -}); -$iterator = new RecursiveIteratorIterator($iterator); -$iterator = new CallbackFilterIterator($iterator, function (SplFileInfo $fileInfo) { - return in_array($fileInfo->getExtension(), ['php', 'exe'], true); -}); - -foreach ($iterator as $fileInfo) { - $file = str_replace(__ROOT__, '', $fileInfo->getRealPath()); - echo "Add file: " . $file . "\n"; - $phar->addFile($fileInfo->getRealPath(), $file); - - if (!array_key_exists('nozip', $opt)) { - $phar[$file]->compress(Phar::GZ); - - if (!$phar[$file]->isCompressed()) { - echo "Could not compress File: $file\n"; - } - } -} - -// Add schema.json -echo "Add file: /src/schema.json\n"; -$phar->addFile(realpath(__DIR__ . '/../src/schema.json'), '/src/schema.json'); - -// Add bin/dep file -echo "Add file: /bin/dep\n"; -$depContent = file_get_contents(__ROOT__ . '/bin/dep'); -$depContent = str_replace("#!/usr/bin/env php\n", '', $depContent); -$depContent = str_replace('__FILE__', 'str_replace("phar://", "", Phar::running())', $depContent); -$depContent = preg_replace("/run\('.+?'/", "run('$version'", $depContent); -$phar->addFromString('bin/dep', $depContent); -$phar->setStub(<<stopBuffering(); -unset($phar); - -echo "$pharName was created successfully.\n"; diff --git a/bin/dep b/bin/dep deleted file mode 100755 index 2bfa43b83..000000000 --- a/bin/dep +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -// Detect deploy.php location -$deployFile = null; -foreach ($argv as $i => $arg) { - if (preg_match('/^(-f|--file)$/', $arg, $match) && $i + 1 < count($argv)) { - $deployFile = $argv[$i + 1]; - break; - } - if (preg_match('/^--file=(?.+)$/', $arg, $match)) { - $deployFile = $match['file']; - break; - } - if (preg_match('/^-f=?(?.+)$/', $arg, $match)) { - $deployFile = $match['file']; - break; - } -} -if (!empty($deployFile)) { - $deployFile = realpath($deployFile); -} -$lookUp = function (string $name): ?string { - $dir = getcwd(); - for ($i = 0; $i < 10; $i++) { - $path = "$dir/$name"; - if (is_readable($path)) { - return $path; - } - $dir = dirname($dir); - } - return ''; -}; -if (empty($deployFile)) { - $deployFile = $lookUp('deploy.php'); -} -if (empty($deployFile)) { - $deployFile = $lookUp('deploy.yaml'); -} -if (empty($deployFile)) { - $deployFile = $lookUp('deploy.yml'); -} - -// Detect autoload location -$autoload = [ - __DIR__ . '/../vendor/autoload.php', // The dep located at "deployer.phar/bin" or in development. - __DIR__ . '/../../../autoload.php', // The dep located at "vendor/deployer/deployer/bin". - __DIR__ . '/../autoload.php', // The dep located at "vendor/bin". -]; -$includes = [ - __DIR__ . '/..', - __DIR__ . '/../../../deployer/deployer', - __DIR__ . '/../deployer/deployer', -]; -$includePath = false; -for ($i = 0; $i < count($autoload); $i++) { - if (file_exists($autoload[$i]) && is_dir($includes[$i])) { - require $autoload[$i]; - $includePath = $includes[$i]; - break; - } -} -if (empty($includePath)) { - fwrite(STDERR, "Error: The `autoload.php` file not found in:\n"); - for ($i = 0; $i < count($autoload); $i++) { - $a = file_exists($autoload[$i]) ? 'true' : 'false'; - $b = is_dir($includes[$i]) ? 'true' : 'false'; - fwrite(STDERR, " - file_exists($autoload[$i]) = $a\n"); - fwrite(STDERR, " is_dir($includes[$i]) = $b\n"); - } - exit(1); -} - -// Errors to exception -set_error_handler(function ($severity, $message, $filename, $lineno) { - if (error_reporting() == 0) { - return; - } - if (error_reporting() & $severity) { - throw new ErrorException($message, 0, $severity, $filename, $lineno); - } -}); - -// Enable recipe loading -set_include_path($includePath . PATH_SEPARATOR . get_include_path()); - -// Deployer constants -define('DEPLOYER', true); -define('DEPLOYER_BIN', __FILE__); -define('DEPLOYER_DEPLOY_FILE', $deployFile); - -Deployer\Deployer::run('master', $deployFile); diff --git a/bin/docgen b/bin/docgen deleted file mode 100755 index 645358e04..000000000 --- a/bin/docgen +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env php - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer; - -use Deployer\Documentation\ApiGen; -use Deployer\Documentation\DocGen; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Output\ConsoleOutput; - -require __DIR__ . '/../vendor/autoload.php'; - -chdir(realpath(__DIR__ . '/..')); - -$input = new ArgvInput(); -$output = new ConsoleOutput(); -$app = new Application('DocGen', '1.0.0'); -$app->setDefaultCommand('all'); - -$api = function () use ($output) { - $parser = new ApiGen(); - $parser->parse(file_get_contents(__DIR__ . '/../src/functions.php')); - $md = $parser->markdown(); - file_put_contents(__DIR__ . '/../docs/api.md', $md); - $output->writeln('API Reference documentation updated.'); -}; - -$recipes = function () use ($input, $output) { - $docgen = new DocGen(__DIR__ . '/..'); - $docgen->parse(__DIR__ . '/../recipe'); - $docgen->parse(__DIR__ . '/../contrib'); - - if ($input->getOption('json')) { - echo json_encode($docgen->recipes, JSON_PRETTY_PRINT); - return; - } - - $docgen->gen(__DIR__ . '/../docs'); - $output->writeln('Recipes documentation updated.'); -}; - -$app->register('api')->setCode($api); -$app->register('recipes')->setCode($recipes)->addOption('json'); -$app->register('all')->setCode(function () use ($recipes, $api) { - $api(); - $recipes(); - echo `git status`; -})->addOption('json'); - -$app->run($input, $output); diff --git a/composer.json b/composer.json index c92dc5153..5bd9de8e0 100644 --- a/composer.json +++ b/composer.json @@ -1,70 +1,32 @@ { - "name": "deployer/deployer", - "description": "Deployment Tool", - "license": "MIT", - "homepage": "https://deployer.org", - "support": { - "docs": "https://deployer.org/docs", - "source": "https://github.com/deployphp/deployer", - "issues": "https://github.com/deployphp/deployer/issues" - }, - "authors": [ - { - "name": "Anton Medvedev", - "email": "anton@medv.io" - } - ], - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/antonmedv" - } - ], - "autoload": { - "psr-4": { - "Deployer\\": "src/" - }, - "files": [ - "src/Support/helpers.php", - "src/functions.php" - ] - }, - "scripts": { - "test": "pest", - "test:e2e": "pest --config tests/e2e/phpunit-e2e.xml", - "phpcs": "phpcs", - "fix": "phpcbf", - "phpstan": "phpstan analyse -c phpstan.neon", - "phpstan:baseline": "@phpstan --generate-baseline tests/phpstan-baseline.neon" - }, - "bin": [ - "bin/dep" - ], - "require": { - "php": "^8.0|^7.3", - "ext-json": "*", - "justinrainbow/json-schema": "^5.2", - "psr/http-message": "^1", - "react/http": "^1.5", - "symfony/console": "^5", - "symfony/polyfill-php80": "^1.22", - "symfony/process": "^5", - "symfony/yaml": "^5" - }, - "require-dev": { - "pestphp/pest": "^1.0", - "phpstan/phpstan": "^1.4", - "phpunit/php-code-coverage": "^9.2", - "phpunit/phpunit": "^9.3", - "slevomat/coding-standard": "^7.0", - "squizlabs/php_codesniffer": "^3.5" - }, - "config": { - "sort-packages": true, - "process-timeout": 0, - "allow-plugins": { - "pestphp/pest-plugin": true, - "dealerdirect/phpcodesniffer-composer-installer": true - } + "name": "deployer/deployer", + "description": "Deployment Tool", + "license": "MIT", + "homepage": "https://deployer.org", + "support": { + "docs": "https://deployer.org/docs", + "source": "https://github.com/deployphp/deployer", + "issues": "https://github.com/deployphp/deployer/issues" + }, + "authors": [ + { + "name": "Anton Medvedev", + "email": "anton@medv.io" } + ], + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/antonmedv" + } + ], + "bin": "dep", + "config": { + "sort-packages": true, + "process-timeout": 0, + "allow-plugins": { + "pestphp/pest-plugin": true, + "dealerdirect/phpcodesniffer-composer-installer": true + } + } } diff --git a/composer.lock b/composer.lock deleted file mode 100644 index 5f45ee781..000000000 --- a/composer.lock +++ /dev/null @@ -1,4819 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "23d858f83416e3f7d060d76320142419", - "packages": [ - { - "name": "evenement/evenement", - "version": "v3.0.1", - "source": { - "type": "git", - "url": "https://github.com/igorw/evenement.git", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/igorw/evenement/zipball/531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "reference": "531bfb9d15f8aa57454f5f0285b18bec903b8fb7", - "shasum": "" - }, - "require": { - "php": ">=7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "Evenement": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - } - ], - "description": "Événement is a very simple event dispatching library for PHP", - "keywords": [ - "event-dispatcher", - "event-emitter" - ], - "support": { - "issues": "https://github.com/igorw/evenement/issues", - "source": "https://github.com/igorw/evenement/tree/master" - }, - "time": "2017-07-23T21:35:13+00:00" - }, - { - "name": "fig/http-message-util", - "version": "1.1.5", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message-util.git", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message-util/zipball/9d94dc0154230ac39e5bf89398b324a86f63f765", - "reference": "9d94dc0154230ac39e5bf89398b324a86f63f765", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "suggest": { - "psr/http-message": "The package containing the PSR-7 interfaces" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Fig\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Utility classes and constants for use with PSR-7 (psr/http-message)", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "issues": "https://github.com/php-fig/http-message-util/issues", - "source": "https://github.com/php-fig/http-message-util/tree/1.1.5" - }, - "time": "2020-11-24T22:02:12+00:00" - }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.11", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ab6744b7296ded80f8cc4f9509abbff393399aa", - "reference": "2ab6744b7296ded80f8cc4f9509abbff393399aa", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.11" - }, - "time": "2021-07-22T09:24:00+00:00" - }, - { - "name": "psr/container", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/container.git", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", - "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Psr\\Container\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common Container Interface (PHP FIG PSR-11)", - "homepage": "https://github.com/php-fig/container", - "keywords": [ - "PSR-11", - "container", - "container-interface", - "container-interop", - "psr" - ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, - "time": "2021-03-05T17:36:06+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "support": { - "source": "https://github.com/php-fig/http-message/tree/master" - }, - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "react/cache", - "version": "v1.1.1", - "source": { - "type": "git", - "url": "https://github.com/reactphp/cache.git", - "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/cache/zipball/4bf736a2cccec7298bdf745db77585966fc2ca7e", - "reference": "4bf736a2cccec7298bdf745db77585966fc2ca7e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/promise": "^3.0 || ^2.0 || ^1.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async, Promise-based cache interface for ReactPHP", - "keywords": [ - "cache", - "caching", - "promise", - "reactphp" - ], - "support": { - "issues": "https://github.com/reactphp/cache/issues", - "source": "https://github.com/reactphp/cache/tree/v1.1.1" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-02-02T06:47:52+00:00" - }, - { - "name": "react/dns", - "version": "v1.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/dns.git", - "reference": "6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/dns/zipball/6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb", - "reference": "6d38296756fa644e6cb1bfe95eff0f9a4ed6edcb", - "shasum": "" - }, - "require": { - "php": ">=5.3.0", - "react/cache": "^1.0 || ^0.6 || ^0.5", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7 || ^1.2.1", - "react/promise-timer": "^1.8" - }, - "require-dev": { - "clue/block-react": "^1.2", - "phpunit/phpunit": "^9.3 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Dns\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async DNS resolver for ReactPHP", - "keywords": [ - "async", - "dns", - "dns-resolver", - "reactphp" - ], - "support": { - "issues": "https://github.com/reactphp/dns/issues", - "source": "https://github.com/reactphp/dns/tree/v1.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-12-20T08:46:54+00:00" - }, - { - "name": "react/event-loop", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/event-loop.git", - "reference": "be6dee480fc4692cec0504e65eb486e3be1aa6f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/event-loop/zipball/be6dee480fc4692cec0504e65eb486e3be1aa6f2", - "reference": "be6dee480fc4692cec0504e65eb486e3be1aa6f2", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "suggest": { - "ext-event": "~1.0 for ExtEventLoop", - "ext-pcntl": "For signal handling support when using the StreamSelectLoop", - "ext-uv": "* for ExtUvLoop" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\EventLoop\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", - "keywords": [ - "asynchronous", - "event-loop" - ], - "support": { - "issues": "https://github.com/reactphp/event-loop/issues", - "source": "https://github.com/reactphp/event-loop/tree/v1.2.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-07-11T12:31:24+00:00" - }, - { - "name": "react/http", - "version": "v1.6.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/http.git", - "reference": "59961cc4a5b14481728f07c591546be18fa3a5c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/http/zipball/59961cc4a5b14481728f07c591546be18fa3a5c7", - "reference": "59961cc4a5b14481728f07c591546be18fa3a5c7", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "fig/http-message-util": "^1.1", - "php": ">=5.3.0", - "psr/http-message": "^1.0", - "react/event-loop": "^1.2", - "react/promise": "^2.3 || ^1.2.1", - "react/promise-stream": "^1.1", - "react/socket": "^1.9", - "react/stream": "^1.2", - "ringcentral/psr7": "^1.2" - }, - "require-dev": { - "clue/block-react": "^1.5", - "clue/http-proxy-react": "^1.7", - "clue/reactphp-ssh-proxy": "^1.3", - "clue/socks-react": "^1.3", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Http\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Event-driven, streaming HTTP client and server implementation for ReactPHP", - "keywords": [ - "async", - "client", - "event-driven", - "http", - "http client", - "http server", - "https", - "psr-7", - "reactphp", - "server", - "streaming" - ], - "support": { - "issues": "https://github.com/reactphp/http/issues", - "source": "https://github.com/reactphp/http/tree/v1.6.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-03T13:17:37+00:00" - }, - { - "name": "react/promise", - "version": "v2.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" - }, - { - "name": "react/promise-stream", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-stream.git", - "reference": "3ebd94fe0d8edbf44937948af28d02d5437e9949" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-stream/zipball/3ebd94fe0d8edbf44937948af28d02d5437e9949", - "reference": "3ebd94fe0d8edbf44937948af28d02d5437e9949", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/promise": "^2.1 || ^1.2", - "react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6" - }, - "require-dev": { - "clue/block-react": "^1.0", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/event-loop": "^1.0 || ^0.5 || ^0.4 || ^0.3", - "react/promise-timer": "^1.0" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\Stream\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "The missing link between Promise-land and Stream-land for ReactPHP", - "homepage": "https://github.com/reactphp/promise-stream", - "keywords": [ - "Buffer", - "async", - "promise", - "reactphp", - "stream", - "unwrap" - ], - "support": { - "issues": "https://github.com/reactphp/promise-stream/issues", - "source": "https://github.com/reactphp/promise-stream/tree/v1.3.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-10-18T10:47:09+00:00" - }, - { - "name": "react/promise-timer", - "version": "v1.8.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise-timer.git", - "reference": "0bbbcc79589e5bfdddba68a287f1cb805581a479" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise-timer/zipball/0bbbcc79589e5bfdddba68a287f1cb805581a479", - "reference": "0bbbcc79589e5bfdddba68a287f1cb805581a479", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "react/event-loop": "^1.2", - "react/promise": "^3.0 || ^2.7.0 || ^1.2.1" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\Timer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A trivial implementation of timeouts for Promises, built on top of ReactPHP.", - "homepage": "https://github.com/reactphp/promise-timer", - "keywords": [ - "async", - "event-loop", - "promise", - "reactphp", - "timeout", - "timer" - ], - "support": { - "issues": "https://github.com/reactphp/promise-timer/issues", - "source": "https://github.com/reactphp/promise-timer/tree/v1.8.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-12-06T11:08:48+00:00" - }, - { - "name": "react/socket", - "version": "v1.11.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/socket.git", - "reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/socket/zipball/f474156aaab4f09041144fa8b57c7d70aed32a1c", - "reference": "f474156aaab4f09041144fa8b57c7d70aed32a1c", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.0", - "react/dns": "^1.8", - "react/event-loop": "^1.2", - "react/promise": "^2.6.0 || ^1.2.1", - "react/promise-timer": "^1.8", - "react/stream": "^1.2" - }, - "require-dev": { - "clue/block-react": "^1.5", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", - "react/promise-stream": "^1.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Socket\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", - "keywords": [ - "Connection", - "Socket", - "async", - "reactphp", - "stream" - ], - "support": { - "issues": "https://github.com/reactphp/socket/issues", - "source": "https://github.com/reactphp/socket/tree/v1.11.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-01-14T10:14:32+00:00" - }, - { - "name": "react/stream", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/stream.git", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/stream/zipball/7a423506ee1903e89f1e08ec5f0ed430ff784ae9", - "reference": "7a423506ee1903e89f1e08ec5f0ed430ff784ae9", - "shasum": "" - }, - "require": { - "evenement/evenement": "^3.0 || ^2.0 || ^1.0", - "php": ">=5.3.8", - "react/event-loop": "^1.2" - }, - "require-dev": { - "clue/stream-filter": "~1.2", - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "React\\Stream\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", - "keywords": [ - "event-driven", - "io", - "non-blocking", - "pipe", - "reactphp", - "readable", - "stream", - "writable" - ], - "support": { - "issues": "https://github.com/reactphp/stream/issues", - "source": "https://github.com/reactphp/stream/tree/v1.2.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2021-07-11T12:37:55+00:00" - }, - { - "name": "ringcentral/psr7", - "version": "1.3.0", - "source": { - "type": "git", - "url": "https://github.com/ringcentral/psr7.git", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ringcentral/psr7/zipball/360faaec4b563958b673fb52bbe94e37f14bc686", - "reference": "360faaec4b563958b673fb52bbe94e37f14bc686", - "shasum": "" - }, - "require": { - "php": ">=5.3", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "RingCentral\\Psr7\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "PSR-7 message implementation", - "keywords": [ - "http", - "message", - "stream", - "uri" - ], - "support": { - "source": "https://github.com/ringcentral/psr7/tree/master" - }, - "time": "2018-05-29T20:21:04+00:00" - }, - { - "name": "symfony/console", - "version": "v5.4.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d8111acc99876953f52fe16d4c50eb60940d49ad", - "reference": "d8111acc99876953f52fe16d4c50eb60940d49ad", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" - }, - "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0" - }, - "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "", - "symfony/lock": "", - "symfony/process": "" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.4.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-02-24T12:45:35+00:00" - }, - { - "name": "symfony/deprecation-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "files": [ - "function.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "A generic function and convention to trigger deprecation notices", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-07-12T14:48:14+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "30885182c981ab175d4d034db0f6f469898070ab" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", - "reference": "30885182c981ab175d4d034db0f6f469898070ab", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-ctype": "*" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-10-20T20:35:02+00:00" - }, - { - "name": "symfony/polyfill-intl-grapheme", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-grapheme.git", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/81b86b50cf841a64252b439e738e97f4a34e2783", - "reference": "81b86b50cf841a64252b439e738e97f4a34e2783", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Grapheme\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's grapheme_* functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "grapheme", - "intl", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-23T21:10:46+00:00" - }, - { - "name": "symfony/polyfill-intl-normalizer", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", - "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-intl": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Intl\\Normalizer\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for intl's Normalizer class and related functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "intl", - "normalizer", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, - { - "name": "symfony/polyfill-mbstring", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/0abb51d2f102e00a4eefcf46ba7fec406d245825", - "reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" - }, - "suggest": { - "ext-mbstring": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Mbstring extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "mbstring", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-30T18:21:41+00:00" - }, - { - "name": "symfony/polyfill-php73", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", - "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-06-05T21:20:04+00:00" - }, - { - "name": "symfony/polyfill-php80", - "version": "v1.25.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "reference": "4407588e0d3f1f52efb65fbe92babe41f37fe50c", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php80\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ion Bazan", - "email": "ion.bazan@gmail.com" - }, - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.25.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-03-04T08:16:47+00:00" - }, - { - "name": "symfony/process", - "version": "v5.4.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/95440409896f90a5f85db07a32b517ecec17fa4c", - "reference": "95440409896f90a5f85db07a32b517ecec17fa4c", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v5.4.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-30T18:16:22+00:00" - }, - { - "name": "symfony/service-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" - }, - "conflict": { - "ext-psr": "<1.1|>=2" - }, - "suggest": { - "symfony/service-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\Service\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to writing services", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-04T16:48:04+00:00" - }, - { - "name": "symfony/string", - "version": "v5.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/92043b7d8383e48104e411bc9434b260dbeb5a10", - "reference": "92043b7d8383e48104e411bc9434b260dbeb5a10", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" - }, - "conflict": { - "symfony/translation-contracts": ">=3.0" - }, - "require-dev": { - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/http-client": "^4.4|^5.0|^6.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0|^6.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.4.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-02T09:53:40+00:00" - }, - { - "name": "symfony/yaml", - "version": "v5.4.3", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/e80f87d2c9495966768310fc531b487ce64237a2", - "reference": "e80f87d2c9495966768310fc531b487ce64237a2", - "shasum": "" - }, - "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "symfony/console": "<5.3" - }, - "require-dev": { - "symfony/console": "^5.3|^6.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "bin": [ - "Resources/bin/yaml-lint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Loads and dumps YAML files", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.3" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-01-26T16:32:32+00:00" - } - ], - "packages-dev": [ - { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.2", - "source": { - "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" - }, - "require-dev": { - "composer/composer": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "autoload": { - "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl", - "role": "Developer / IT Manager" - }, - { - "name": "Contributors", - "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], - "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" - }, - "time": "2022-02-04T12:51:07+00:00" - }, - { - "name": "doctrine/instantiator", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", - "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.22" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.4.1" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-03-03T08:28:38+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v2.15.8", - "phpunit/phpunit": "^9.3.11", - "vimeo/psalm": "^3.17.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "support": { - "issues": "https://github.com/facade/ignition-contracts/issues", - "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" - }, - "time": "2020-10-16T08:27:54+00:00" - }, - { - "name": "filp/whoops", - "version": "2.14.5", - "source": { - "type": "git", - "url": "https://github.com/filp/whoops.git", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "reference": "a63e5e8f26ebbebf8ed3c5c691637325512eb0dc", - "shasum": "" - }, - "require": { - "php": "^5.5.9 || ^7.0 || ^8.0", - "psr/log": "^1.0.1 || ^2.0 || ^3.0" - }, - "require-dev": { - "mockery/mockery": "^0.9 || ^1.0", - "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", - "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" - }, - "suggest": { - "symfony/var-dumper": "Pretty print complex values better with var-dumper available", - "whoops/soap": "Formats errors as SOAP responses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.7-dev" - } - }, - "autoload": { - "psr-4": { - "Whoops\\": "src/Whoops/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Filipe Dobreira", - "homepage": "https://github.com/filp", - "role": "Developer" - } - ], - "description": "php error handling for cool kids", - "homepage": "https://filp.github.io/whoops/", - "keywords": [ - "error", - "exception", - "handling", - "library", - "throwable", - "whoops" - ], - "support": { - "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.14.5" - }, - "funding": [ - { - "url": "https://github.com/denis-sokolov", - "type": "github" - } - ], - "time": "2022-01-07T12:00:00+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", - "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3,<3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2022-03-03T13:19:32+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v4.13.2", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=7.0" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.9-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" - }, - "time": "2021-11-30T19:35:32+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v5.11.0", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.14.3", - "php": "^7.3 || ^8.0", - "symfony/console": "^5.0" - }, - "require-dev": { - "brianium/paratest": "^6.1", - "fideloper/proxy": "^4.4.1", - "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "8.x-dev", - "nunomaduro/larastan": "^0.6.2", - "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^6.0", - "phpstan/phpstan": "^0.12.64", - "phpunit/phpunit": "^9.5.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2022-01-10T16:22:52+00:00" - }, - { - "name": "pestphp/pest", - "version": "v1.21.2", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest.git", - "reference": "63f009fadf9b37f611fda43928d03336475d5d9f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/63f009fadf9b37f611fda43928d03336475d5d9f", - "reference": "63f009fadf9b37f611fda43928d03336475d5d9f", - "shasum": "" - }, - "require": { - "nunomaduro/collision": "^5.10.0|^6.0", - "pestphp/pest-plugin": "^1.0.0", - "php": "^7.3 || ^8.0", - "phpunit/phpunit": "^9.5.5" - }, - "require-dev": { - "illuminate/console": "^8.47.0", - "illuminate/support": "^8.47.0", - "laravel/dusk": "^6.15.0", - "pestphp/pest-dev-tools": "dev-master", - "pestphp/pest-plugin-parallel": "^1.0" - }, - "bin": [ - "bin/pest" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - }, - "pest": { - "plugins": [ - "Pest\\Plugins\\Coverage", - "Pest\\Plugins\\Init", - "Pest\\Plugins\\Version", - "Pest\\Plugins\\Environment" - ] - }, - "laravel": { - "providers": [ - "Pest\\Laravel\\PestServiceProvider" - ] - } - }, - "autoload": { - "files": [ - "src/Functions.php", - "src/Pest.php" - ], - "psr-4": { - "Pest\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "An elegant PHP Testing Framework.", - "keywords": [ - "framework", - "pest", - "php", - "test", - "testing", - "unit" - ], - "support": { - "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v1.21.2" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/lukeraymonddowning", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/octoper", - "type": "github" - }, - { - "url": "https://github.com/olivernybroe", - "type": "github" - }, - { - "url": "https://github.com/owenvoke", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2022-03-05T19:34:40+00:00" - }, - { - "name": "pestphp/pest-plugin", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "fc8519de148699fe612d9c669be60554cd2db4fa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/fc8519de148699fe612d9c669be60554cd2db4fa", - "reference": "fc8519de148699fe612d9c669be60554cd2db4fa", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1 || ^2.0", - "php": "^7.3 || ^8.0" - }, - "conflict": { - "pestphp/pest": "<1.0" - }, - "require-dev": { - "composer/composer": "^1.10.19", - "pestphp/pest": "^1.0", - "pestphp/pest-dev-tools": "dev-master" - }, - "type": "composer-plugin", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - }, - "class": "Pest\\Plugin\\Manager" - }, - "autoload": { - "psr-4": { - "Pest\\Plugin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Pest plugin manager", - "keywords": [ - "framework", - "manager", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v1.0.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2021-01-03T15:53:42+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.3" - }, - "time": "2021-07-20T11:28:43+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" - }, - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "77a32518733312af16a44300404e945338981de3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", - "reference": "77a32518733312af16a44300404e945338981de3", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" - }, - "time": "2022-03-15T21:29:03+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" - }, - "time": "2021-12-08T12:19:24+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "4cb3021a4e10ffe3d5f94a4c34cf4b3f6de2fa3d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/4cb3021a4e10ffe3d5f94a4c34cf4b3f6de2fa3d", - "reference": "4cb3021a4e10ffe3d5f94a4c34cf4b3f6de2fa3d", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^1.5", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/1.4.2" - }, - "time": "2022-03-30T13:33:37+00:00" - }, - { - "name": "phpstan/phpstan", - "version": "1.4.10", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "898c479c39caa727bedf4311dd294a8f4e250e72" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/898c479c39caa727bedf4311dd294a8f4e250e72", - "reference": "898c479c39caa727bedf4311dd294a8f4e250e72", - "shasum": "" - }, - "require": { - "php": "^7.1|^8.0" - }, - "conflict": { - "phpstan/phpstan-shim": "*" - }, - "bin": [ - "phpstan", - "phpstan.phar" - ], - "type": "library", - "autoload": { - "files": [ - "bootstrap.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPStan - PHP Static Analysis Tool", - "support": { - "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.4.10" - }, - "funding": [ - { - "url": "https://github.com/ondrejmirtes", - "type": "github" - }, - { - "url": "https://github.com/phpstan", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpstan", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", - "type": "tidelift" - } - ], - "time": "2022-03-14T10:25:45+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "9.2.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", - "php": ">=7.3", - "phpunit/php-file-iterator": "^3.0.3", - "phpunit/php-text-template": "^2.0.2", - "sebastian/code-unit-reverse-lookup": "^2.0.2", - "sebastian/complexity": "^2.0", - "sebastian/environment": "^5.1.2", - "sebastian/lines-of-code": "^1.0.3", - "sebastian/version": "^3.0.1", - "theseer/tokenizer": "^1.2.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcov": "*", - "ext-xdebug": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-07T09:28:20+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "3.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-12-02T12:48:52+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "3.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:58:55+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T05:33:50+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "5.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:16:10+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "9.5.20", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/12bc8879fb65aef2138b26fc633cb1e3620cffba", - "reference": "12bc8879fb65aef2138b26fc633cb1e3620cffba", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.3.1", - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.1", - "phar-io/manifest": "^2.0.3", - "phar-io/version": "^3.0.2", - "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.13", - "phpunit/php-file-iterator": "^3.0.5", - "phpunit/php-invoker": "^3.1.1", - "phpunit/php-text-template": "^2.0.3", - "phpunit/php-timer": "^5.0.2", - "sebastian/cli-parser": "^1.0.1", - "sebastian/code-unit": "^1.0.6", - "sebastian/comparator": "^4.0.5", - "sebastian/diff": "^4.0.3", - "sebastian/environment": "^5.1.3", - "sebastian/exporter": "^4.0.3", - "sebastian/global-state": "^5.0.1", - "sebastian/object-enumerator": "^4.0.3", - "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^3.0", - "sebastian/version": "^3.0.2" - }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, - "suggest": { - "ext-soap": "*", - "ext-xdebug": "*" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "9.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.20" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-04-01T12:37:26+00:00" - }, - { - "name": "psr/log", - "version": "1.1.4", - "source": { - "type": "git", - "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Log\\": "Psr/Log/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for logging libraries", - "homepage": "https://github.com/php-fig/log", - "keywords": [ - "log", - "psr", - "psr-3" - ], - "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" - }, - "time": "2021-05-03T11:20:27+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:08:49+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", - "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:08:54+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "2.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:30:19+00:00" - }, - { - "name": "sebastian/comparator", - "version": "4.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/diff": "^4.0", - "sebastian/exporter": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:49:45+00:00" - }, - { - "name": "sebastian/complexity", - "version": "2.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.7", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T15:52:27+00:00" - }, - { - "name": "sebastian/diff", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:10:38+00:00" - }, - { - "name": "sebastian/environment", - "version": "5.1.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T05:52:38+00:00" - }, - { - "name": "sebastian/exporter", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2021-11-11T14:18:36+00:00" - }, - { - "name": "sebastian/global-state", - "version": "5.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^9.3" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-02-14T08:28:10+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "1.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.6", - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-11-28T06:42:11+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", - "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", - "shasum": "" - }, - "require": { - "php": ">=7.3", - "sebastian/object-reflector": "^2.0", - "sebastian/recursion-context": "^4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:12:34+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:14:26+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", - "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-10-26T13:17:30+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:45:17+00:00" - }, - { - "name": "sebastian/type", - "version": "3.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "require-dev": { - "phpunit/phpunit": "^9.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2022-03-15T09:54:48+00:00" - }, - { - "name": "sebastian/version", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c6c1022351a901512170118436c764e473f6de8c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", - "reference": "c6c1022351a901512170118436c764e473f6de8c", - "shasum": "" - }, - "require": { - "php": ">=7.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2020-09-28T06:39:44+00:00" - }, - { - "name": "slevomat/coding-standard", - "version": "7.1", - "source": { - "type": "git", - "url": "https://github.com/slevomat/coding-standard.git", - "reference": "b521bd358b5f7a7d69e9637fd139e036d8adeb6f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/b521bd358b5f7a7d69e9637fd139e036d8adeb6f", - "reference": "b521bd358b5f7a7d69e9637fd139e036d8adeb6f", - "shasum": "" - }, - "require": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7", - "php": "^7.2 || ^8.0", - "phpstan/phpdoc-parser": "^1.4.1", - "squizlabs/php_codesniffer": "^3.6.2" - }, - "require-dev": { - "phing/phing": "2.17.2", - "php-parallel-lint/php-parallel-lint": "1.3.2", - "phpstan/phpstan": "1.4.10|1.5.2", - "phpstan/phpstan-deprecation-rules": "1.0.0", - "phpstan/phpstan-phpunit": "1.0.0|1.1.0", - "phpstan/phpstan-strict-rules": "1.1.0", - "phpunit/phpunit": "7.5.20|8.5.21|9.5.19" - }, - "type": "phpcodesniffer-standard", - "extra": { - "branch-alias": { - "dev-master": "7.x-dev" - } - }, - "autoload": { - "psr-4": { - "SlevomatCodingStandard\\": "SlevomatCodingStandard" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", - "support": { - "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/7.1" - }, - "funding": [ - { - "url": "https://github.com/kukulich", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", - "type": "tidelift" - } - ], - "time": "2022-03-29T12:44:16+00:00" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.6.2", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/5e4e71592f69da17871dba6e80dd51bce74a351a", - "reference": "5e4e71592f69da17871dba6e80dd51bce74a351a", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "time": "2021-12-12T21:44:58+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.10.0" - }, - "time": "2021-03-09T10:59:23+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], - "prefer-stable": false, - "prefer-lowest": false, - "platform": { - "php": "^8.0|^7.3", - "ext-json": "*" - }, - "platform-dev": [], - "plugin-api-version": "2.2.0" -} diff --git a/dep b/dep new file mode 100755 index 0000000000000000000000000000000000000000..ff8e03231967550e9c49d46056f89c166c2f3e0a GIT binary patch literal 777027 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

|^P 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

H!XqDVCT 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

D^4L+1DB`&Z>D79s)SOhVI?E!gPpbMO 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

tn~E{rQ%g4ZEmXtat1|Vw1k#+{(PrCH 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 ['--bwlimit=4096']]); -}); -``` - -The issue was also described in the [Github Action](https://github.com/deployphp/action/issues/35). \ No newline at end of file diff --git a/docs/UPGRADE.md b/docs/UPGRADE.md deleted file mode 100644 index a92e53dfb..000000000 --- a/docs/UPGRADE.md +++ /dev/null @@ -1,250 +0,0 @@ -# Upgrade from 6.x to 7.x - -## Step 1: Update deploy.php -1. Change config `hostname` to `alias`. -2. Change config `real_hostname` to `hostname`. -3. Change config `user` to `remote_user`. -4. Update `host()` definitions: - 1. Add `set` prefix to all setters: `identityFile` -> `setIdentityFile` or `set('identity_file')` - 2. Update `host(...)->addSshOption('UserKnownHostsFile', '/dev/null')` to `host(...)->setSshArguments(['-o UserKnownHostsFile=/dev/null']);` - 3. Replace _stage_ with labels, i.e. - ```php - host('deployer.org') - ->set('labels', ['stage' => 'prod']); - ``` - When deploying use instead of `dep deploy prod` use `dep deploy stage=prod`. - 4. `alias()` is deleted, `host()` itself sets alias and hostname, to override hostname use `setHostname()`. -5. Update `task()` definitions. - 1. Replace `onRoles()` with `select()`: - ```php - task(...) - ->select('stage=prod'); - ``` -6. Third party recipes now live inside main Deployer repo in _contrib_: - ```php - require 'contrib/rsync.php'; - ``` -7. Replace `inventory()` with `import()`. It now can import hosts, configs, tasks: - ```yaml - import: recipe/common.php - - config: - application: deployer - shared_dirs: - - uploads - - storage/logs/ - - storage/db - shared_files: - - .env - - config/test.yaml - keep_releases: 3 - http_user: false - - hosts: - prod: - local: true - - tasks: - deploy: - - deploy:prepare - - deploy:vendors - - deploy:publish - - deploy:vendors: - - run: 'cd {{release_path}} && echo {{bin/composer}} {{composer_options}} 2>&1' - ``` -8. Rename task `success` to `deploy:success` and `cleanup` to deploy:cleanup`. -9. Verbosity function (`isDebug()`, etc) deleted. Use `output()->isDebug()` instead. -10. runLocally() commands are executed relative to the recipe file directory. This behaviour can be overridden via an environment variable: - ``` - DEPLOYER_ROOT=. vendor/bin/dep taskname` - ``` -11. Replace `local()` tasks with combination of `once()` and `runLocally()` func. -12. Replace `locateBinaryPath()` with `which()` func. -13. Configuration property `default_stage` is not supported. - -## Step 2: Deploy - -Since the release history numbering is not compatible between v6 and v7, you need to specify the `release_name` manually for the first time. Otherwise you start with release 1. - -1. Find out next release name (ssh to the host, `ls` releases dir, find the biggest number). Example: `42`. -2. Deploy with release_name: - ``` - dep deploy -o release_name=43 - ``` - -:::note -In case a rollback is needed, manually change the `current` symlink: -``` -ln -nfs releases/42 current -``` -::: - -:::note -In case there are multiple hosts with different release names, you should create a `{{deploy_path}}/.dep/latest_release` file in each host with the current release number of that particular host. -::: - -## Other versions - -### Upgrade from 5.x to 6.x - -1. Changed branch option priority - - If you have host definition with `branch(...)` parameter, adding `--branch` option will not override it any more. - If no `branch(...)` parameter persists, branch will be fetched from current local git branch. - - ```php - host('prod') - ->set('branch', 'production') - ``` - - In order to return to old behavior add checking of `--branch` option. - - ```php - host('prod') - ->set('branch', function () { - return input()->getOption('branch') ?: 'production'; - }) - ``` - -2. Add `deploy:info` task to the beginning to `deploy` task. - -3. `run` returns string instead of `Deployer\Type\Result` - - Now `run` and `runLocally` returns `string` instead of `Deployer\Type\Result`. - Replace method calls as: - - * `run('command')->toString()` → `run('command')` - * `run('if command; then echo "true"; fi;')->toBool()` → `test('command')` - -4. `env_vars` renamed to `env` - - * `set('env_vars', 'FOO=bar');` → `set('env', ['FOO' => 'bar']);` - - If your are using Symfony recipe, then you need to change `env` setting: - - * `set('env', 'prod');` → `set('symfony_env', 'prod');` - -### Upgrade from 4.x to 5.x - -1. Servers to Hosts - - * `server($hostname)` to `host($hostname)`, and `server($name, $hostname)` to `host($name)->hostname($hostname)` - * `localServer($name)` to `localhost()` - * `cluster($name, $nodes, $port)` to `hosts(...$hodes)` - * `serverList($file)` to `inventory($file)` - - If you need to deploy to same server use [host aliases](https://deployer.org/docs/hosts#host-aliases): - - ```php - host('domain.com/green', 'domain.com/blue') - ->set('deploy_path', '~/{{hostname}}') - ... - ``` - - Or you can define different hosts with same hostname: - - ```php - host('production') - ->hostname('domain.com') - ->set('deploy_path', '~/production') - ... - - host('beta') - ->hostname('domain.com') - ->set('deploy_path', '~/beta') - ... - ``` - -2. Configuration options - - * Rename `{{server.name}}` to `{{hostname}}` - -3. DotArray syntax - - In v5 access to nested arrays in config via dot notation was removed. - If you was using it, consider to move to plain config options. - - Refactor this: - - ```php - set('a', ['b' => 1]); - - // ... - - get('a.b'); - ``` - - To: - - ```php - set('a_b', 1); - - // ... - - get('a_b'); - ``` - -4. Credentials - - Best practice in new v5 is to omit credentials for connection in `deploy.php` and write them in `~/.ssh/config` instead. - - * `identityFile($publicKeyFile,, $privateKeyFile, $passPhrase)` to `identityFile($privateKeyFile)` - * `pemFile($pemFile)` to `identityFile($pemFile)` - * `forwardAgent()` to `forwardAgent(true)` - -5. Tasks constraints - - * `onlyOn` to `onHosts` - * `onlyOnStage` to `onStage` - - -### Upgrade from 3.x to 4.x - -1. Namespace for functions - - Add to beginning of *deploy.php* next line: - - ```php - use function Deployer\{server, task, run, set, get, add, before, after}; - ``` - - If you are using PHP version less than 5.6, you can use this: - - ```php - namespace Deployer; - ``` - -2. `env()` to `set()`/`get()` - - Rename all calls `env($name, $value)` to `set($name, $value)`. - - Rename all rvalue `env($name)` to `get($name)`. - - Rename all `server(...)->env(...)` to `server(...)->set(...)`. - -3. Moved *NonFatalException* - - Rename `Deployer\Task\NonFatalException` to `Deployer\Exception\NonFatalException`. - -4. Prior release cleanup - - Due to changes in release management, the new cleanup task will ignore any prior releases deployed with 3.x. These will need to be manually removed after migrating to and successfully releasing via 4.x. - -### Upgrade from 2.x to 3.x - -1. ### `->path('...')` - - Replace your server paths configuration: - - ```php - server(...) - ->path(...); - ``` - - to: - - ```php - server(...) - ->env('deploy_path', '...'); - ``` diff --git a/docs/api.md b/docs/api.md deleted file mode 100644 index 168eea97b..000000000 --- a/docs/api.md +++ /dev/null @@ -1,562 +0,0 @@ - - - - -# API Reference - -## host() - -```php -host(string ...$hostname) -``` - -Defines a host or hosts. -```php -host('example.org'); -host('prod.example.org', 'staging.example.org'); -``` - -Inside task can be used to get `Host` instance of an alias. -```php -task('test', function () { - $port = host('example.org')->get('port'); -}); -``` - - - -## localhost() - -```php -localhost(string ...$hostnames) -``` - - - -## currentHost() - -```php -currentHost(): Host -``` - -Returns current host. - - -## select() - -```php -select(string $selector): array -``` - -Returns hosts based on provided selector. - -```php -on(select('stage=prod, role=db'), function (Host $host) { - ... -}); -``` - - - -## selectedHosts() - -```php -selectedHosts(): array -``` - -Returns array of hosts selected by user via CLI. - - - -## import() - -```php -import(string $file): void -``` - -Import other php or yaml recipes. - -```php -import('recipe/common.php'); -``` - -```php -import(__DIR__ . '/config/hosts.yaml'); -``` - - - -## desc() - -```php -desc(?string $title = null): ?string -``` - -Set task description. - - -## task() - -```php -task(string $name, $body = null): Task -``` - -Define a new task and save to tasks list. - -Alternatively get a defined task. - - - -| Argument | Type | Comment | -|---|---|---| -| `$name` | `string` | Name of current task. | -| `$body` | `callable():void` or `array` or `null` | Callable task, array of other tasks names or nothing to get a defined tasks | - -## before() - -```php -before(string $task, $do) -``` - -Call that task before specified task runs. - - - - -| Argument | Type | Comment | -|---|---|---| -| `$task` | `string` | The task before $that should be run. | -| `$do` | `string` or `callable():void` | The task to be run. | - -## after() - -```php -after(string $task, $do) -``` - -Call that task after specified task runs. - - - - -| Argument | Type | Comment | -|---|---|---| -| `$task` | `string` | The task after $that should be run. | -| `$do` | `string` or `callable():void` | The task to be run. | - -## fail() - -```php -fail(string $task, $do) -``` - -Setup which task run on failure of $task. -When called multiple times for a task, previous fail() definitions will be overridden. - - - - -| Argument | Type | Comment | -|---|---|---| -| `$task` | `string` | The task which need to fail so $that should be run. | -| `$do` | `string` or `callable():void` | The task to be run. | - -## option() - -```php -option(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null): void -``` - -Add users options. - - - -| Argument | Type | Comment | -|---|---|---| -| `$name` | `string` | The option name | -| `$shortcut` | `string` or `array` or `null` | The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts | -| `$mode` | `int` or `null` | The option mode: One of the VALUE_* constants | -| `$description` | `string` | A description text | -| `$default` | `string` or `string[]` or `int` or `bool` or `null` | The default value (must be null for self::VALUE_NONE) | - -## cd() - -```php -cd(string $path): void -``` - -Change the current working directory. - - -## within() - -```php -within(string $path, callable $callback) -``` - -Execute a callback within a specific directory and revert back to the initial working directory. - - - -## run() - -```php -run(string $command, ?array $options = [], ?int $timeout = null, ?int $idle_timeout = null, ?string $secret = null, ?array $env = null, ?bool $real_time_output = false, ?bool $no_throw = false): string -``` - -Executes given command on remote host. - -Examples: - -```php -run('echo hello world'); -run('cd {{deploy_path}} && git status'); -run('password %secret%', secret: getenv('CI_SECRET')); -run('curl medv.io', timeout: 5); -``` - -```php -$path = run('readlink {{deploy_path}}/current'); -run("echo $path"); -``` - - - - -| Argument | Type | Comment | -|---|---|---| -| `$command` | `string` | Command to run on remote host. | -| `$options` | `array` or `null` | Array of options will override passed named arguments. | -| `$timeout` | `int` or `null` | Sets the process timeout (max. runtime). The timeout in seconds (default: 300 sec; see {{default_timeout}}, `null` to disable). | -| `$idle_timeout` | `int` or `null` | Sets the process idle timeout (max. time since last output) in seconds. | -| `$secret` | `string` or `null` | Placeholder `%secret%` can be used in command. Placeholder will be replaced with this value and will not appear in any logs. | -| `$env` | `array` or `null` | Array of environment variables: `run('echo $KEY', env: ['key' => 'value']);` | -| `$real_time_output` | `bool` or `null` | Print command output in real-time. | -| `$no_throw` | `bool` or `null` | Don't throw an exception of non-zero exit code. | - -## runLocally() - -```php -runLocally(string $command, ?array $options = [], ?int $timeout = null, ?int $idle_timeout = null, ?string $secret = null, ?array $env = null, ?string $shell = null): string -``` - -Execute commands on a local machine. - -Examples: - -```php -$user = runLocally('git config user.name'); -runLocally("echo $user"); -``` - - - - -| Argument | Type | Comment | -|---|---|---| -| `$command` | `string` | Command to run on localhost. | -| `$options` | `array` or `null` | Array of options will override passed named arguments. | -| `$timeout` | `int` or `null` | Sets the process timeout (max. runtime). The timeout in seconds (default: 300 sec, `null` to disable). | -| `$idle_timeout` | `int` or `null` | Sets the process idle timeout (max. time since last output) in seconds. | -| `$secret` | `string` or `null` | Placeholder `%secret%` can be used in command. Placeholder will be replaced with this value and will not appear in any logs. | -| `$env` | `array` or `null` | Array of environment variables: `runLocally('echo $KEY', env: ['key' => 'value']);` | -| `$shell` | `string` or `null` | Shell to run in. Default is `bash -s`. | - -## test() - -```php -test(string $command): bool -``` - -Run test command. -Example: - -```php -if (test('[ -d {{release_path}} ]')) { -... -} -``` - - - -## testLocally() - -```php -testLocally(string $command): bool -``` - -Run test command locally. -Example: - - testLocally('[ -d {{local_release_path}} ]') - - - -## on() - -```php -on($hosts, callable $callback): void -``` - -Iterate other hosts, allowing to call run a func in callback. - -```php -on(select('stage=prod, role=db'), function ($host) { - ... -}); -``` - -```php -on(host('example.org'), function ($host) { - ... -}); -``` - -```php -on(Deployer::get()->hosts, function ($host) { - ... -}); -``` - - - -## invoke() - -```php -invoke(string $taskName): void -``` - -Runs a task. -```php -invoke('deploy:symlink'); -``` - - - -## upload() - -```php -upload($source, string $destination, array $config = []): void -``` - -Upload file or directory to host. - -> You may have noticed that there is a trailing slash (/) at the end of the first argument in the above command, this is necessary to mean “the contents of build“. -> -> The alternative, without the trailing slash, would place build, including the directory, within public. This would create a hierarchy that looks like: {{release_path}}/public/build - - The `$config` array supports the following keys: - -- `flags` for overriding the default `-azP` passed to the `rsync` command -- `options` with additional flags passed directly to the `rsync` command -- `timeout` for `Process::fromShellCommandline()` (`null` by default) -- `progress_bar` to display upload/download progress -- `display_stats' to display rsync set of statistics - - - - -## download() - -```php -download(string $source, string $destination, array $config = []): void -``` - -Download file or directory from host - - - - -## info() - -```php -info(string $message): void -``` - -Writes an info message. - - -## warning() - -```php -warning(string $message): void -``` - -Writes an warning message. - - -## writeln() - -```php -writeln(string $message, int $options = 0): void -``` - -Writes a message to the output and adds a newline at the end. - - -## parse() - -```php -parse(string $value): string -``` - -Parse set values. - - -## set() - -```php -set(string $name, $value): void -``` - -Setup configuration option. - - -## add() - -```php -add(string $name, array $array): void -``` - -Merge new config params to existing config array. - - - -## get() - -```php -get(string $name, $default = null) -``` - -Get configuration value. - - - - -## has() - -```php -has(string $name): bool -``` - -Check if there is such configuration option. - - -## ask() - -```php -ask(string $message, ?string $default = null, ?array $autocomplete = null): ?string -``` - - - -## askChoice() - -```php -askChoice(string $message, array $availableChoices, $default = null, bool $multiselect = false) -``` - - - -## askConfirmation() - -```php -askConfirmation(string $message, bool $default = false): bool -``` - - - -## askHiddenResponse() - -```php -askHiddenResponse(string $message): string -``` - - - -## input() - -```php -input(): InputInterface -``` - - - -## output() - -```php -output(): OutputInterface -``` - - - -## commandExist() - -```php -commandExist(string $command): bool -``` - -Check if command exists - - - -## commandSupportsOption() - -```php -commandSupportsOption(string $command, string $option): bool -``` - - - -## which() - -```php -which(string $name): string -``` - - - -## remoteEnv() - -```php -remoteEnv(): array -``` - -Returns remote environments variables as an array. -```php -$remotePath = remoteEnv()['PATH']; -run('echo $PATH', env: ['PATH' => "/home/user/bin:$remotePath"]); -``` - - -## error() - -```php -error(string $message): Exception -``` - -Creates a new exception. - - -## timestamp() - -```php -timestamp(): string -``` - -Returns current timestamp in UTC timezone in ISO8601 format. - - -## fetch() - -```php -fetch(string $url, string $method = 'get', array $headers = [], ?string $body = null, ?array &$info = null, bool $nothrow = false): string -``` - -Example usage: -```php -$result = fetch('{{domain}}', info: $info); -var_dump($info['http_code'], $result); -``` - - diff --git a/docs/avoid-php-fpm-reloading.md b/docs/avoid-php-fpm-reloading.md deleted file mode 100644 index 7699378d6..000000000 --- a/docs/avoid-php-fpm-reloading.md +++ /dev/null @@ -1,54 +0,0 @@ -# Avoid PHP-FPM Reloading - -Deployer symlinks _current_ to latest release dir. - -``` -current -> releases/3/ -releases/ - 1/ - 2/ - 3/ -``` - -## The problem - -PHP Opcodes get cached. And if `SCRIPT_FILENAME` contains _current_ symlink, on -new deploy nothing updates. Usually, a solution is simple to reload **php-fpm** -after deploy, but such reload can lead to **dropped** or **failed** requests. -The correct fix is to configure your server set `SCRIPT_FILENAME` to a resolved path. -You can check your server configuration by printing `SCRIPT_FILENAME`. - -```php -echo $_SERVER['SCRIPT_FILENAME']; -``` - -If it prints something like `/home/deployer/example.com/current/index.php` with -_current_ in the path, your server configured incorrectly. - -## Fix for Nginx - -Nginx has special variable `$realpath_root`, use it to set up `SCRIPT_FILENAME`: - -```diff -location ~ \.php$ { - include fastcgi_params; - fastcgi_pass unix:/var/run/php/php-fpm.sock; -- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; -+ fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; -} -``` - -## Fix for Caddy - -:::tip -If you're already using servers provisioned by Deployer, you don't need to fix -anything, as everything is already configured properly. -::: - -Use `resolve_root_symlink`: - -``` -php_fastcgi * unix//run/php/php-fpm.sock { - resolve_root_symlink -} -``` diff --git a/docs/basics.md b/docs/basics.md deleted file mode 100644 index 87a0042cd..000000000 --- a/docs/basics.md +++ /dev/null @@ -1,233 +0,0 @@ -# Basics - -Deployer has two main concepts: [**hosts**](hosts.md) and [**tasks**](tasks.md). - -A **recipe** is a file containing definitions for **hosts** and **tasks**. - -Deployer CLI requires two arguments to run: a **task** to run and a **host** -or group of **hosts**. - -``` -$ dep deploy deployer.org - --- ------ ------------ - | | | - | | `--- The host - | `------------- The task - `------------------ The CLI -``` - -Then Deployer takes the given task, performs some preparation (described later), -and executes the task on all specified hosts. - -The `dep` CLI looks for `deploy.php` or `deploy.yaml` file in current directory. - -Or recipe can be specified explicitly via `-f` or `--file` option. -``` -$ dep --file=deploy.php deploy deployer.org -``` - -Let's write a recipe. - -```php -// We are going to use functions declared primarily in Deployer namespace, -// to simplify recipe we will use Deployer namespace too. Alternativly, -// you can import individual functions via "use function". -namespace Deployer; - -host('deployer.org'); - -task('my_task', function () { - run('whoami'); -}); -``` - -Let's try to run our task on deployer.org. - -``` -$ dep my_task -task my_task -$ -``` - -If no host provided, Deployer will show an interactive prompt for selecting hosts. -If your recipe contains only one host, Deployer will automatically choose it. -To select all hosts specify `all`. - -But where is our `whoami` command output? By default, Deployer runs with normal verbosity -level and shows only names of executed tasks. Let's increase verbosity to verbose, and -rerun our task. - -Add `-v` option to increase verbosity. Read more about [CLI usage](cli.md). - -``` -$ dep my_task -v -task my_task -[deployer.org] run whoami -[deployer.org] deployer -$ -``` - -Now let's add second host: - -```php -host('deployer.org'); -host('medv.io'); -``` - -How does Deployer know how to connect to a host? It uses same `~/.ssh/config` file as -the `ssh` command. Alternatively, you can specify [connection options](hosts.md) in recipe. - -Let's run `my_task` task on both hosts: - -``` -$ dep my_task -v all -task my_task -[deployer.org] run whoami -[medv.io] run whoami -[medv.io] anton -[deployer.org] deployer -``` - -Deployer runs a task in parallel on each host. This is why the output is mixed. We can -limit it to run only one host. - -``` -$ dep my_task -v all --limit 1 -task my_task -[deployer.org] run whoami -[deployer.org] deployer -[medv.io] run whoami -[medv.io] deployer -``` - -Limit level also possible to [specified per task](tasks.md). - -Each host has a configuration: a list of key-value pairs. Let's define our first -configuration option for both our hosts: - -```php -host('deployer.org') - ->set('my_config', 'foo'); -host('medv.io') - ->set('my_config', 'bar'); -``` - -In the task we can get current executing host with [currentHost](api.md#currenthost) function: - -```php -task('my_task', function () { - $myConfig = currentHost()->get('my_config'); - writeln("my_config: " . $myConfig); -}); -``` - -Or with [get](api.md#get) function: - -```diff -task('my_task', function () { -- $myConfig = currentHost()->get('my_config'); -+ $myConfig = get('my_config'); - writeln("my_config: " . $myConfig); -}); -``` - -Or via [parse](api.md#parse) function which replaces brackets `{{ ... }}` and value -with of config option. - -All functions (writeln, run, runLocally, cd, upload, etc) call **parse** function -internally. So you don't need to call **parse** function by your self. - -```diff -task('my_task', function () { -- $myConfig = get('my_config'); -- writeln("my_config: " . $myConfig); -+ writeln("my_config: {{my_config}}"); -}); -``` - -Let's try to run our task: - -``` -$ dep my_task all -task my_task -[deployer.org] my_config: foo -[medv.io] my_config: bar -``` - -Awesome! Each host configuration inherits global configuration. Let's refactor -our recipe to define one global config option: - -```php -set('my_config', 'global'); - -host('deployer.org'); -host('medv.io'); -``` - -The config option `my_config` will be equal to `global` on both hosts. - -Also, config option value can be specified as a callback, such callback -executed on first access and returned result saved in host configuration. - -```php -set('whoami', function () { - return run('whoami'); -}); - -task('my_task', function () { - writeln('Who am I? {{whoami}}'); -}); -``` - -Let's try to run it: - -``` -$ dep my_task all -task my_task -[deployer.org] Who am I? deployer -[medv.io] Who am I? anton -``` - -We can use this to create dynamic configuration which uses current host information. - -Only the first call will trigger the callback execution. All subsequent checks use saved value. - -Here is an example: - -```php -set('current_date', function () { - return run('date'); -}); - -task('my_task', function () { - writeln('What time is it? {{current_date}}'); - run('sleep 5'); - writeln('What time is it? {{current_date}}'); -}); -``` - -If we run my_task we will see that `date` is called only once on -`{{current_date}}` access. - -``` -$ dep my_task deployer.org -v -task my_task -[deployer.org] run date -[deployer.org] Wed 03 Nov 2021 01:16:53 PM UTC -[deployer.org] What time is it? Wed 03 Nov 2021 01:16:53 PM UTC -[deployer.org] run sleep 5 -[deployer.org] What time is it? Wed 03 Nov 2021 01:16:53 PM UTC -``` - -We can override a config option via CLI option `-o` like this: - -``` -$ dep my_task deployer.org -v -o current_date="I don't know" -task my_task -[deployer.org] What time is it? I don't know -[deployer.org] run sleep 5 -[deployer.org] What time is it? I don't know -``` - -Since the `current_date` config option is overridden there is no need to call the callback. -So there is no 'run date'. diff --git a/docs/ci-cd.md b/docs/ci-cd.md deleted file mode 100755 index f1b174013..000000000 --- a/docs/ci-cd.md +++ /dev/null @@ -1,96 +0,0 @@ -# CI/CD - -## GitHub Actions - -Use official [GitHub Action for Deployer](https://github.com/deployphp/action). - -Create `.github/workflows/deploy.yml` file with following content: - -```yaml -name: deploy - -on: - push: - branches: [ master ] - -concurrency: production_environment - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: '8.0' - - - name: Deploy - uses: deployphp/action@v1 - with: - private-key: ${{ secrets.PRIVATE_KEY }} - dep: deploy -``` - -:::warning -The `concurrency: production_environment` is important as it prevents concurrent -deploys. -::: - -## GitLab CI/CD - -Set the following variables in GitLab project: - -- `SSH_KNOW_HOSTS`: Content of `~/.ssh/known_hosts` file. -The public SSH keys for a host may be obtained using the utility `ssh-keyscan`. -For example: `ssh-keyscan deployer.org`. -- `SSH_PRIVATE_KEY`: Private key for connecting to remote hosts. -To generate private key: `ssh-keygen -t ed25519 -C 'gitlab@deployer.org'`. - -Create .gitlab-ci.yml file with following content: - -```yml -stages: - - deploy - -deploy: - stage: deploy - image: - name: deployphp/deployer:7 - entrypoint: [""] - before_script: - - mkdir -p ~/.ssh - - eval $(ssh-agent -s) - - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts - - chmod 644 ~/.ssh/known_hosts - - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null - script: - - dep deploy -vvv - resource_group: production - only: - - master -``` - -### Deployment concurrency - -Only one deployment job runs at a time with the [`resource_group` keyword](https://docs.gitlab.com/ee/ci/yaml/index.html#resource_group) in .gitlab-ci.yml. - -In addition, you can ensure that older deployment jobs are cancelled automatically when a newer deployment runs by enabling the [skip outdated deployment jobs](https://docs.gitlab.com/ee/ci/pipelines/settings.html#skip-outdated-deployment-jobs) feature. - -### Deploy secrets - -Is not recommended committing secrets in the repository, you could use a GitLab variable to store them. - -Many frameworks use dotenv to store secrets, let's create a GitLab file variable named `DOTENV`, so it can be deployed along with the code. - -Set up a deployer task to copy secrets to the server: - -```php -task('deploy:secrets', function () { - upload(getenv('DOTENV'), '{{deploy_path}}/shared/.env'); -}); -``` - -Run the task immediately after updating the code. diff --git a/docs/cli.md b/docs/cli.md deleted file mode 100755 index 886e8419b..000000000 --- a/docs/cli.md +++ /dev/null @@ -1,146 +0,0 @@ -# CLI Usage - -We recommend adding next alias to your .bashrc file: - -```bash -alias dep='vendor/bin/dep' -``` - -As well as installing completion script for Deployer, completion supports: -- tasks, -- options, -- host names, -- and configs. - -For example for macOS run next commands: - -```bash -brew install bash-completion -dep completion bash > /usr/local/etc/bash_completion.d/deployer -``` - -## Overriding configuration options - -For example, if your _deploy.php_ file contains this configuration: - -```php -set('ssh_multiplexing', false); -``` - -And you want to enable [ssh multiplexing](https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing) without modifying the recipe, you can pass the `-o` option to the `dep` command: - -``` -dep deploy -o ssh_multiplexing=true -``` - -To override multiple config options, you can pass multiple `-o` args: - -``` -dep deploy -o ssh_multiplexing=true -o branch=master -``` - -## Running arbitrary commands - -Run any command on one or more hosts: - -``` -dep run 'uptime -p' -``` - -## Tree command - -Deployer has group tasks and before/after hooks, so see task tree use **dep tree** command: - -``` -$ dep tree deploy -The task-tree for deploy: -└── deploy - ├── deploy:prepare - │ ├── deploy:info - │ ├── deploy:setup - │ ├── deploy:lock - │ ├── deploy:release - │ ├── deploy:update_code - │ ├── build // after deploy:update_code - │ ├── deploy:shared - │ └── deploy:writable - ├── deploy:vendors - ├── artisan:storage:link - ├── artisan:config:cache - ├── artisan:route:cache - ├── artisan:view:cache - ├── artisan:migrate - └── deploy:publish - ├── deploy:symlink - ├── deploy:unlock - ├── deploy:cleanup - └── deploy:success -``` - -## Execution plan - -Before executing tasks, Deployer needs to flatten task tree and to decide in which order it will be executing tasks -on which hosts. Use `--plan` option to output table with tasks/hosts: - -``` -$ dep deploy --plan all -┌──────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┐ -│ prod01 │ prod02 │ prod03 │ prod04 │ -├──────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤ -│ deploy:info │ deploy:info │ deploy:info │ deploy:info │ -│ deploy:setup │ deploy:setup │ deploy:setup │ deploy:setup │ -│ deploy:lock │ deploy:lock │ deploy:lock │ deploy:lock │ -│ deploy:release │ deploy:release │ deploy:release │ deploy:release │ -│ deploy:update_code │ deploy:update_code │ deploy:update_code │ deploy:update_code │ -│ build │ build │ build │ build │ -│ deploy:shared │ deploy:shared │ deploy:shared │ deploy:shared │ -│ deploy:writable │ deploy:writable │ deploy:writable │ deploy:writable │ -│ deploy:vendors │ deploy:vendors │ deploy:vendors │ deploy:vendors │ -│ artisan:storage:link │ artisan:storage:link │ artisan:storage:link │ artisan:storage:link │ -│ artisan:config:cache │ artisan:config:cache │ artisan:config:cache │ artisan:config:cache │ -│ artisan:route:cache │ artisan:route:cache │ artisan:route:cache │ artisan:route:cache │ -│ artisan:view:cache │ artisan:view:cache │ artisan:view:cache │ artisan:view:cache │ -│ artisan:migrate │ artisan:migrate │ artisan:migrate │ artisan:migrate │ -│ deploy:symlink │ - │ - │ - │ -│ - │ deploy:symlink │ - │ - │ -│ - │ - │ deploy:symlink │ - │ -│ - │ - │ - │ deploy:symlink │ -│ deploy:unlock │ deploy:unlock │ deploy:unlock │ deploy:unlock │ -│ deploy:cleanup │ deploy:cleanup │ deploy:cleanup │ deploy:cleanup │ -│ deploy:success │ deploy:success │ deploy:success │ deploy:success │ -└──────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┘ -``` - -The **deploy.php*: - -```php -host('prod[01:04]'); -task('deploy:symlink')->limit(1); -``` - -## The `runLocally` working dir - -By default `runLocally()` commands are executed relative to the recipe file directory. -This can be overridden globally by setting an environment variable: - -``` -DEPLOYER_ROOT=. dep taskname` -``` - -Alternatively the root directory can be overridden per command via the cwd configuration. - -```php -runLocally('ls', ['cwd' => '/root/directory']); -``` - -## Play blackjack - -> Yeah, well. I'm gonna go build my own theme park... with blackjack and hookers! -> -> In fact, forget the park! -> -> — Bender - -``` -dep blackjack -``` diff --git a/docs/contrib/bugsnag.md b/docs/contrib/bugsnag.md deleted file mode 100644 index 63db28444..000000000 --- a/docs/contrib/bugsnag.md +++ /dev/null @@ -1,42 +0,0 @@ - - - - -# bugsnag - -[Source](/contrib/bugsnag.php) - - - -Add to your _deploy.php_ - -```php -require 'contrib/bugsnag.php'; -``` - -## Configuration - -- *bugsnag_api_key* – the API Key associated with the project. Informs Bugsnag which project has been deployed. This is the only required field. -- *bugsnag_provider* – the name of your source control provider. Required when repository is supplied and only for on-premise services. -- *bugsnag_app_version* – the app version of the code you are currently deploying. Only set this if you tag your releases with semantic version numbers and deploy infrequently. (Optional.) - -## Usage - -Since you should only notify Bugsnag of a successful deployment, the `bugsnag:notify` task should be executed right at the end. - -```php -after('deploy', 'bugsnag:notify'); -``` - - - -## Tasks - -### bugsnag:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/bugsnag.php#L28) - -Notifies Bugsnag of deployment. - - - - diff --git a/docs/contrib/cachetool.md b/docs/contrib/cachetool.md deleted file mode 100644 index b5eb136eb..000000000 --- a/docs/contrib/cachetool.md +++ /dev/null @@ -1,125 +0,0 @@ - - - - -# cachetool - -[Source](/contrib/cachetool.php) - - - -Add to your _deploy.php_ - -```php -require 'contrib/cachetool.php'; -``` - -## Configuration - -- **cachetool** *(optional)*: accepts a *string* with the unix socket or ip address to php-fpm. If `cachetool` is not given, then the application will look for a `cachetool.yml` file and read the configuration from there. - - ```php - set('cachetool', '/var/run/php-fpm.sock'); - // or - set('cachetool', '127.0.0.1:9000'); - ``` - -You can also specify different cachetool settings for each host: -```php -host('staging') - ->set('cachetool', '127.0.0.1:9000'); - -host('production') - ->set('cachetool', '/var/run/php-fpm.sock'); -``` - -By default, if no `cachetool` parameter is provided, this recipe will fallback to the global setting. - -If your deployment user does not have permission to access the php-fpm.sock, you can alternatively use -the web adapter that creates a temporary php file and makes a web request to it with a configuration like -```php -set('cachetool_args', '--web --web-path=./public --web-url=https://{{hostname}}'); -``` - -## Usage - -Since APCu and OPcache deal with compiling and caching files, they should be executed right after the symlink is created for the new release: - -```php -after('deploy:symlink', 'cachetool:clear:opcache'); -or -after('deploy:symlink', 'cachetool:clear:apcu'); -``` - -## Read more - -Read more information about cachetool on the website: -http://gordalina.github.io/cachetool/ - - -## Configuration -### cachetool -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L53) - - - - - -### cachetool_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L54) - - - -```php title="Default value" -'https://github.com/gordalina/cachetool/releases/download/7.0.0/cachetool.phar' -``` - - -### cachetool_args -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L55) - - - - - -### bin/cachetool -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L56) - - - - - -### cachetool_options -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L62) - - - - - - -## Tasks - -### cachetool:clear:opcache -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L79) - -Clears OPcode cache. - -Clear opcache cache - - -### cachetool:clear:apcu -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L87) - -Clears APCu system cache. - -Clear APCU cache - - -### cachetool:clear:stat -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cachetool.php#L95) - -Clears file status and realpath caches. - -Clear file status cache, including the realpath cache - - diff --git a/docs/contrib/chatwork.md b/docs/contrib/chatwork.md deleted file mode 100644 index ac20ba087..000000000 --- a/docs/contrib/chatwork.md +++ /dev/null @@ -1,190 +0,0 @@ - - - - -# chatwork - -[Source](/contrib/chatwork.php) - - - -# Chatwork Recipe - -## Installing - 1. Create chatwork account by any manual in the internet - 2. Take chatwork token (Like: b29a700e2d15bef3f26ae6a5c142d1ea) and set `chatwork_token` parameter - 3. Take chatwork room id from url after clicked on the room, and set `chatwork_room_id` parameter - 4. If you want, you can edit `chatwork_notify_text`, `chatwork_success_text` or `chatwork_failure_text` - 5. Require chatwork recipe in your `deploy.php` file - -```php -# https://deployer.org/recipes.html - -require 'recipe/chatwork.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'chatwork:notify'); -``` - -## Configuration - -- `chatwork_token` – chatwork bot token, **required** -- `chatwork_room_id` — chatwork room to push messages to **required** -- `chatwork_notify_text` – notification message template - ``` - [info] - [title](*) Deployment Status: Deploying[/title] - Repo: {{repository}} - Branch: {{branch}} - Server: {{hostname}} - Release Path: {{release_path}} - Current Path: {{current_path}} - [/info] - ``` -- `chatwork_success_text` – success template, default: - ``` - [info] - [title](*) Deployment Status: Successfully[/title] - Repo: {{repository}} - Branch: {{branch}} - Server: {{hostname}} - Release Path: {{release_path}} - Current Path: {{current_path}} - [/info]" - ``` -- `chatwork_failure_text` – failure template, default: - ``` - [info] - [title](*) Deployment Status: Failed[/title] - Repo: {{repository}} - Branch: {{branch}} - Server: {{hostname}} - Release Path: {{release_path}} - Current Path: {{current_path}} - [/info]" - ``` - -## Tasks - -- `chatwork:notify` – send message to chatwork -- `chatwork:notify:success` – send success message to chatwork -- `chatwork:notify:failure` – send failure message to chatwork - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'chatwork:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('success', 'chatwork:notify:success'); -``` -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'chatwork:notify:failure'); -``` - - -## Configuration -### chatwork_token -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L91) - -Chatwork settings - - - -### chatwork_room_id -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L94) - - - - - -### chatwork_api -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L97) - - - - - -### chatwork_notify_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L102) - -The Messages - -```php title="Default value" -"[info]\n[title](*) Deployment Status: Deploying[/title]\nRepo: {{repository}}\nBranch: {{branch}}\nServer: {{hostname}}\nRelease Path: {{release_path}}\nCurrent Path: {{current_path}}\n[/info]" -``` - - -### chatwork_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L103) - - - -```php title="Default value" -"[info]\n[title](*) Deployment Status: Successfully[/title]\nRepo: {{repository}}\nBranch: {{branch}}\nServer: {{hostname}}\nRelease Path: {{release_path}}\nCurrent Path: {{current_path}}\n[/info]" -``` - - -### chatwork_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L104) - - - -```php title="Default value" -"[info]\n[title](*) Deployment Status: Failed[/title]\nRepo: {{repository}}\nBranch: {{branch}}\nServer: {{hostname}}\nRelease Path: {{release_path}}\nCurrent Path: {{current_path}}\n[/info]" -``` - - - -## Tasks - -### chatwork_send_message -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L107) - - - -Helpers - - -### chatwork:test -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L116) - -Tests messages. - -Tasks - - -### chatwork:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L127) - -Notifies Chatwork. - - - - -### chatwork:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L142) - -Notifies Chatwork about deploy finish. - - - - -### chatwork:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/chatwork.php#L158) - -Notifies Chatwork about deploy failure. - - - - diff --git a/docs/contrib/cimonitor.md b/docs/contrib/cimonitor.md deleted file mode 100644 index 149937d00..000000000 --- a/docs/contrib/cimonitor.md +++ /dev/null @@ -1,215 +0,0 @@ - - - - -# cimonitor - -[Source](/contrib/cimonitor.php) - - - -# CIMonitor recipe - -Monitor your deployments on [CIMonitor](https://github.com/CIMonitor/CIMonitor). - -![CIMonitorGif](https://www.steefmin.xyz/deployer-example.gif) - -Require cimonitor recipe in your `deploy.php` file: - -```php -require 'contrib/cimonitor.php'; -``` - -Add tasks on deploy: - -```php -before('deploy', 'cimonitor:notify'); -after('deploy:success', 'cimonitor:notify:success'); -after('deploy:failed', 'cimonitor:notify:failure'); -``` - -## Configuration - -- `cimonitor_webhook` – CIMonitor server webhook url, **required** - ``` - set('cimonitor_webhook', 'https://cimonitor.enrise.com/webhook/deployer'); - ``` -- `cimonitor_title` – the title of application, default the username\reponame combination from `{{repository}}` - ``` - set('cimonitor_title', ''); - ``` -- `cimonitor_user` – User object with name and email, default gets information from `git config` - ``` - set('cimonitor_user', function () { - return [ - 'name' => 'John Doe', - 'email' => 'john@enrise.com', - ]; - }); - ``` - -Various cimonitor statusses are set, in case you want to change these yourselves. See the [CIMonitor documentation](https://cimonitor.readthedocs.io/en/latest/) for the usages of different states. - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'cimonitor:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'cimonitor:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'cimonitor:notify:failure'); -``` - - -## Configuration -### cimonitor_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L70) - -Title of project based on git repo - - - -### cimonitor_user -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L75) - - - - - -### cimonitor_status_info -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L83) - -CI monitor status states and job states - -```php title="Default value" -'info' -``` - - -### cimonitor_status_warning -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L84) - - - -```php title="Default value" -'warning' -``` - - -### cimonitor_status_error -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L85) - - - -```php title="Default value" -'error' -``` - - -### cimonitor_status_success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L86) - - - -```php title="Default value" -'success' -``` - - -### cimonitor_job_state_info -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L87) - - - -```php title="Default value" -get('cimonitor_status_info') -``` - - -### cimonitor_job_state_pending -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L88) - - - -```php title="Default value" -'pending' -``` - - -### cimonitor_job_state_running -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L89) - - - -```php title="Default value" -'running' -``` - - -### cimonitor_job_state_warning -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L90) - - - -```php title="Default value" -get('cimonitor_status_warning') -``` - - -### cimonitor_job_state_error -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L91) - - - -```php title="Default value" -get('cimonitor_status_error') -``` - - -### cimonitor_job_state_success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L92) - - - -```php title="Default value" -get('cimonitor_status_success') -``` - - - -## Tasks - -### cimonitor:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L95) - -Notifies CIMonitor. - - - - -### cimonitor:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L121) - -Notifies CIMonitor about deploy finish. - - - - -### cimonitor:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cimonitor.php#L149) - -Notifies CIMonitor about deploy failure. - - - - diff --git a/docs/contrib/cloudflare.md b/docs/contrib/cloudflare.md deleted file mode 100644 index 6fe5818f4..000000000 --- a/docs/contrib/cloudflare.md +++ /dev/null @@ -1,45 +0,0 @@ - - - - -# cloudflare - -[Source](/contrib/cloudflare.php) - - - -### Installing - -Add to your _deploy.php_ - -```php -require 'contrib/cloudflare.php'; -``` - -### Configuration - -- `cloudflare` – array with configuration for cloudflare - - `service_key` – Cloudflare Service Key. If this is not provided, use api_key and email. - - `api_key` – Cloudflare API key generated on the "My Account" page. - - `email` – Cloudflare Email address associated with your account. - - `domain` – The domain you want to clear - - `zone_id` – Cloudflare Zone ID (optional). - -### Usage - -Since the website should be built and some load is likely about to be applied to your server, this should be one of, -if not the, last tasks before cleanup - - - - -## Tasks - -### deploy:cloudflare -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cloudflare.php#L29) - -Clears Cloudflare Cache. - - - - diff --git a/docs/contrib/cpanel.md b/docs/contrib/cpanel.md deleted file mode 100644 index a0beb1468..000000000 --- a/docs/contrib/cpanel.md +++ /dev/null @@ -1,179 +0,0 @@ - - - - -# cpanel - -[Source](/contrib/cpanel.php) - - - -### Installing - -Add to your _deploy.php_ - -```php -require 'contrib/cpanel.php'; -``` - -### Description -This is a recipe that uses the [cPanel 2 API](https://documentation.cPanel.net/display/DD/Guide+to+cPanel+API+2). - -Unfortunately the [UAPI](https://documentation.cPanel.net/display/DD/Guide+to+UAPI) that is recommended does not have support for creating addon domains. -The main idea behind is for staging purposes but I guess you can use it for other interesting concepts. - -The idea is, every branch possibly has its own staging domain/subdomain (staging-neat-feature.project.com) and database db_neat-feature_project so it can be tested. -This recipe can make the domain/subdomain and database creation part of the deployment process so you don't have to manually create them through an interface. - - -### Configuration -The example uses a .env file and Dotenv for configuration, but you can set the parameters as you wish -``` -set('cpanel', [ - 'host' => getenv('CPANEL_HOST'), - 'port' => getenv('CPANEL_PORT'), - 'username' => getenv('CPANEL_USERNAME'), - 'auth_type' => getenv('CPANEL_AUTH_TYPE'), - 'token' => getenv('CPANEL_TOKEN'), - 'user' => getenv('CPANEL_USER'), - 'db_user' => getenv('CPANEL_DB_USER'), - 'db_user_privileges' => getenv('CPANEL_DB_PRIVILEGES'), - 'timeout' => 500, - - 'allowInStage' => ['staging', 'beta', 'alpha'], - - 'create_domain_format' => '%s-%s-%s', - 'create_domain_values' => ['staging', 'master', get('application')], - 'subdomain_prefix' => substr(md5(get('application')), 0,4) . '-', - 'subdomain_suffix' => getenv('SUDOMAIN_SUFFIX'), - - - 'create_db_format' => '%s_%s-%s-%s', - 'create_db_values' => ['apps', 'staging','master', get('application')], - -]); -``` - -- `cpanel` – array with configuration for cPanel - - `username` – WHM account - - `user` – cPanel account that you want in charge of the domain - - `token` – WHM API token - - `create_domain_format` – Format for name creation of domain - - `create_domain_values` – The actual value reference for naming - - `subdomain_prefix` – cPanel has a weird way of dealing with addons and subdomains, you cannot create 2 addons with the same subdomain, so you need to change it in some way, example uses first 4 chars of md5(app_name) - - `subdomain_suffix` – cPanel has a weird way of dealing with addons and subdomains, so the suffix needs to be your main domain for that account for deletion purposes - - `addondir` – addon dir is different from the deploy path because cPanel "injects" /home/user/ into the path, so tilde cannot be used - - `allowInStage` – Define the stages that cPanel recipe actions are allowed in - - -#### .env file example -``` -CPANEL_HOST=xxx.xxx.xxx.xxx -CPANEL_PORT=2087 -CPANEL_USERNAME=root -CPANEL_TOKEN=xxxx -CPANEL_USER=xxx -CPANEL_AUTH_TYPE=hash -CPANEL_DB_USER=db_user -CPANEL_DB_PRIVILEGES="ALL PRIVILEGES" -SUDOMAIN_SUFFIX=.mymaindomain.com - -``` - -### Tasks - -- `cpanel:createaddondomain` Creates an addon domain -- `cpanel:deleteaddondomain` Removes an addon domain -- `cpanel:createdb` Creates a new database - -### Usage - -A complete example with configs, staging and deployment - -``` -load(); // this is used just so an .env file can be used for credentials - -require 'cpanel.php'; - - -Project name -set('application', 'myproject.com'); -Project repository -set('repository', 'git@github.com:myorg/myproject.com'); - - - - - -set('cpanel', [ - 'host' => getenv('CPANEL_HOST'), - 'port' => getenv('CPANEL_PORT'), - 'username' => getenv('CPANEL_USERNAME'), - 'auth_type' => getenv('CPANEL_AUTH_TYPE'), - 'token' => getenv('CPANEL_TOKEN'), - 'user' => getenv('CPANEL_USER'), - 'db_user' => getenv('CPANEL_DB_USER'), - 'db_user_privileges' => getenv('CPANEL_DB_PRIVILEGES'), - 'timeout' => 500, - 'allowInStage' => ['staging', 'beta', 'alpha'], - - 'create_domain_format' => '%s-%s-%s', - 'create_domain_values' => ['staging', 'master', get('application')], - 'subdomain_prefix' => substr(md5(get('application')), 0,4) . '-', - 'subdomain_suffix' => getenv('SUDOMAIN_SUFFIX'), - - - 'create_db_format' => '%s_%s-%s-%s', - 'create_db_values' => ['apps', 'staging','master', get('application')], - -]); - -host('myproject.com') - ->stage('staging') - ->set('cpanel_createdb', vsprintf(get('cpanel')['create_db_format'], get('cpanel')['create_db_values'])) - ->set('branch', 'dev-branch') - ->set('deploy_path', '~/staging/' . vsprintf(get('cpanel')['create_domain_format'], get('cpanel')['create_domain_values'])) - ->set('addondir', 'staging/' . vsprintf(get('cpanel')['create_domain_format'], get('cpanel')['create_domain_values'])); -Tasks -task('build', function () { - run('cd {{release_path}} && build'); -}); - -after('deploy:prepare', 'cpanel:createaddondomain'); -after('deploy:prepare', 'cpanel:createdb'); -``` - - - -## Tasks - -### cpanel:createdb -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cpanel.php#L203) - -Creates database though CPanel API. - - - - -### cpanel:createaddondomain -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cpanel.php#L231) - -Creates addon domain though CPanel API. - - - - -### cpanel:deleteaddondomain -[Source](https://github.com/deployphp/deployer/blob/master/contrib/cpanel.php#L254) - -Deletes addon domain though CPanel API. - - - - diff --git a/docs/contrib/crontab.md b/docs/contrib/crontab.md deleted file mode 100644 index ccc8987e2..000000000 --- a/docs/contrib/crontab.md +++ /dev/null @@ -1,58 +0,0 @@ - - - - -# crontab - -[Source](/contrib/crontab.php) - - - -Recipe for adding crontab jobs. - -It checks for duplicates by the command part of the job. Changing the schedule will update the crontab. So when you change the command part you have to manually remove the old one. Use `crontab -e` on the server to remove it. - -## Configuration - -- *crontab:jobs* - An array of strings with crontab lines. - -## Usage - -```php -require 'contrib/crontab.php'; - -after('deploy:success', 'crontab:sync'); - -add('crontab:jobs', [ - '* * * * * cd {{current_path}} && {{bin/php}} artisan schedule:run >> /dev/null 2>&1', -]); -``` - - -## Configuration -### bin/crontab -[Source](https://github.com/deployphp/deployer/blob/master/contrib/crontab.php#L26) - -Get path to bin - - - - -## Tasks - -### crontab:load -[Source](https://github.com/deployphp/deployer/blob/master/contrib/crontab.php#L31) - -Loads crontab. - - - - -### crontab:sync -[Source](https://github.com/deployphp/deployer/blob/master/contrib/crontab.php#L56) - -Sync crontab jobs. - - - - diff --git a/docs/contrib/directadmin.md b/docs/contrib/directadmin.md deleted file mode 100644 index 27a8e8fc4..000000000 --- a/docs/contrib/directadmin.md +++ /dev/null @@ -1,87 +0,0 @@ - - - - -# directadmin - -[Source](/contrib/directadmin.php) - - - -### Installing - -Add to your _deploy.php_ - -```php -require 'contrib/directadmin.php'; -``` - -### Configuration -- `directadmin` – array with configuration for DirectAdmin - - `host` – DirectAdmin host - - `port` – DirectAdmin port (default: 2222, not required) - - `scheme` – DirectAdmin scheme (default: http, not required) - - `username` – DirectAdmin username - - `password` – DirectAdmin password (it is recommended to use login keys!) - - `db_user` – Database username (required when using directadmin:createdb or directadmin:deletedb) - - `db_name` – Database namse (required when using directadmin:createdb) - - `db_password` – Database password (required when using directadmin:createdb) - - `domain_name` – Domain to create, delete or edit (required when using directadmin:createdomain, directadmin:deletedomain, directadmin:symlink-private-html or directadmin:php-version) - - `domain_ssl` – Enable SSL, options: ON/OFF, default: ON (optional when using directadmin:createdb) - - `domain_cgi` – Enable CGI, options: ON/OFF, default: ON (optional when using directadmin:createdb) - - `domain_php` – Enable PHP, options: ON/OFF, default: ON (optional when using directadmin:createdb) - - `domain_php_version` – Domain PHP Version, default: 1 (required when using directadmin:php-version) - - - - -## Tasks - -### directadmin:createdb -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L82) - -Creates a database on DirectAdmin. - - - - -### directadmin:deletedb -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L102) - -Deletes a database on DirectAdmin. - - - - -### directadmin:createdomain -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L117) - -Creates a domain on DirectAdmin. - - - - -### directadmin:deletedomain -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L135) - -Deletes a domain on DirectAdmin. - - - - -### directadmin:symlink-private-html -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L151) - -Symlink your private_html to public_html. - - - - -### directadmin:php-version -[Source](https://github.com/deployphp/deployer/blob/master/contrib/directadmin.php#L167) - -Changes the PHP version from a domain. - - - - diff --git a/docs/contrib/discord.md b/docs/contrib/discord.md deleted file mode 100644 index 8d84503ee..000000000 --- a/docs/contrib/discord.md +++ /dev/null @@ -1,144 +0,0 @@ - - - - -# discord - -[Source](/contrib/discord.php) - - - -## Installing - -Require discord recipe in your `deploy.php` file: - -```php -require 'contrib/discord.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'discord:notify'); -``` - -## Configuration - -- `discord_channel` – Discord channel ID, **required** -- `discord_token` – Discord channel token, **required** - -- `discord_notify_text` – notification message template, markdown supported, default: - ```markdown - :​information_source: **{{user}}** is deploying branch `{{branch}}` to _{{target}}_ - ``` -- `discord_success_text` – success template, default: - ```markdown - :​white_check_mark: Branch `{{branch}}` deployed to _{{target}}_ successfully - ``` -- `discord_failure_text` – failure template, default: - ```markdown - :​no_entry_sign: Branch `{{branch}}` has failed to deploy to _{{target}}_ - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'discord:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'discord:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'discord:notify:failure'); -``` - - -## Configuration -### discord_webhook -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L59) - - - - - -### discord_notify_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L64) - -Deploy messages - - - -### discord_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L69) - - - - - -### discord_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L74) - - - - - -### discord_message -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L81) - -The message - -```php title="Default value" -'discord_notify_text' -``` - - - -## Tasks - -### discord_send_message -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L84) - - - -Helpers - - -### discord:test -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L92) - -Tests messages. - -Tasks - - -### discord:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L103) - -Notifies Discord. - - - - -### discord:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L111) - -Notifies Discord about deploy finish. - - - - -### discord:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/discord.php#L119) - -Notifies Discord about deploy failure. - - - - diff --git a/docs/contrib/grafana.md b/docs/contrib/grafana.md deleted file mode 100644 index f39f1970f..000000000 --- a/docs/contrib/grafana.md +++ /dev/null @@ -1,58 +0,0 @@ - - - - -# grafana - -[Source](/contrib/grafana.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/grafana.php'; -``` - -## Configuration options - -- **url** *(required)*: the URL to the creates annotation api endpoint. -- **token** *(required)*: authentication token. Can be created at Grafana Console. -- **time** *(optional)* – set deploy time of annotation. specify epoch milliseconds. (Defaults is set to the current time in epoch milliseconds.) -- **tags** *(optional)* – set tag of annotation. -- **text** *(optional)* – set text of annotation. (Defaults is set to "Deployed " + git log -n 1 --format="%h") - -```php -deploy.php - -set('grafana', [ - 'token' => 'eyJrIj...', - 'url' => 'http://grafana/api/annotations', - 'tags' => ['deploy', 'production'], -]); - -``` - -## Usage - -If you want to create annotation about successful end of deployment. - -```php -after('deploy:success', 'grafana:annotation'); -``` - - - - -## Tasks - -### grafana:annotation -[Source](https://github.com/deployphp/deployer/blob/master/contrib/grafana.php#L45) - -Creates Grafana annotation of deployment. - - - - diff --git a/docs/contrib/hangouts.md b/docs/contrib/hangouts.md deleted file mode 100644 index 0bac12b49..000000000 --- a/docs/contrib/hangouts.md +++ /dev/null @@ -1,128 +0,0 @@ - - - - -# hangouts - -[Source](/contrib/hangouts.php) - - - -Require the Google Hangouts Chat recipe in your `deploy.php` file: - -```php -require 'contrib/chat.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'chat:notify'); -``` - -## Configuration - -- `chat_webhook` – chat incoming webhook url, **required** -- `chat_title` – the title of your notification card, default `{{application}}` -- `chat_subtitle` – the subtitle of your card, default `{{hostname}}` -- `chat_favicon` – an image for the header of your card, default `http://{{hostname}}/favicon.png` -- `chat_line1` – first line of the text in your card, default: `{{branch}}` -- `chat_line2` – second line of the text in your card, default: `{{stage}}` - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'chat:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'chat:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'chat:notify:failure'); -``` - - - -## Configuration -### chat_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L50) - -Title of project - - - -### chat_subtitle -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L54) - - - -```php title="Default value" -get('hostname') -``` - - -### favicon -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L57) - -If 'favicon' is set Google Hangouts Chat will decorate your card with an image. - -```php title="Default value" -'http://{{hostname}}/favicon.png' -``` - - -### chat_line1 -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L60) - -Deploy messages - -```php title="Default value" -'{{branch}}' -``` - - -### chat_line2 -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L61) - - - -```php title="Default value" -'{{stage}}' -``` - - - -## Tasks - -### chat:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L64) - -Notifies Google Hangouts Chat. - - - - -### chat:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L106) - -Notifies Google Hangouts Chat about deploy finish. - - - - -### chat:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hangouts.php#L148) - -Notifies Google Hangouts Chat about deploy failure. - - - - diff --git a/docs/contrib/hipchat.md b/docs/contrib/hipchat.md deleted file mode 100644 index 60771f21e..000000000 --- a/docs/contrib/hipchat.md +++ /dev/null @@ -1,89 +0,0 @@ - - - - -# hipchat - -[Source](/contrib/hipchat.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/hipchat.php'; -``` - -## Configuration - -- `hipchat_token` – Hipchat V1 auth token -- `hipchat_room_id` – Room ID or name -- `hipchat_message` – Deploy message, default is `_{{user}}_ deploying `{{branch}}` to *{{target}}*` -- `hipchat_from` – Default to target -- `hipchat_color` – Message color, default is **green** -- `hipchat_url` – The URL to the message endpoint, default is https://api.hipchat.com/v1/rooms/message - -## Usage - -Since you should only notify Hipchat room of a successful deployment, the `hipchat:notify` task should be executed right at the end. - -```php -after('deploy', 'hipchat:notify'); -``` - - - -## Configuration -### hipchat_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hipchat.php#L33) - - - -```php title="Default value" -'green' -``` - - -### hipchat_from -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hipchat.php#L34) - - - -```php title="Default value" -'{{target}}' -``` - - -### hipchat_message -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hipchat.php#L35) - - - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - -### hipchat_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hipchat.php#L36) - - - -```php title="Default value" -'https://api.hipchat.com/v1/rooms/message' -``` - - - -## Tasks - -### hipchat:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/hipchat.php#L39) - -Notifies Hipchat channel of deployment. - - - - diff --git a/docs/contrib/ispmanager.md b/docs/contrib/ispmanager.md deleted file mode 100644 index b0717f5cc..000000000 --- a/docs/contrib/ispmanager.md +++ /dev/null @@ -1,241 +0,0 @@ - - - - -# ispmanager - -[Source](/contrib/ispmanager.php) - - - -This recipe for work with ISPManager Lite panel by API. - - -## Configuration -### ispmanager_owner -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L10) - - - -```php title="Default value" -'www-root' -``` - - -### ispmanager_doc_root -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L11) - - - -```php title="Default value" -'/var/www/' . get('ispmanager_owner') . '/data/' -``` - - -### ispmanager -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L14) - -ISPManager default configuration - -```php title="Default value" -[ - 'api' => [ - 'dsn' => 'https://root:password@localhost:1500/ispmgr', - 'secure' => true, - ], - 'createDomain' => NULL, - 'updateDomain' => NULL, - 'deleteDomain' => NULL, - 'createDatabase' => NULL, - 'deleteDatabase' => NULL, - 'phpSelect' => NULL, - 'createAlias' => NULL, - 'deleteAlias' => NULL, -] -``` - - -### vhost -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L30) - -Vhost default configuration - -```php title="Default value" -[ - 'name' => '{{domain}}', - 'php_enable' => 'on', - 'aliases' => 'www.{{domain}}', - 'home' => 'www/{{domain}}', - 'owner' => get('ispmanager_owner'), - 'email' => 'webmaster@{{domain}}', - 'charset' => 'off', - 'dirindex' => 'index.php uploaded.html', - 'ssi' => 'on', - 'php' => 'on', - 'php_mode' => 'php_mode_mod', - 'basedir' => 'on', - 'php_apache_version' => 'native', - 'cgi' => 'off', - 'log_access' => 'on', - 'log_error' => 'on', -] -``` - - -### ispmanager_session -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L50) - -Storage - - - -### ispmanager_databases -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L51) - - - -```php title="Default value" -[ - 'servers' => [], - 'hosts' => [], - 'dblist' => [], -] -``` - - -### ispmanager_domains -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L57) - - - - - -### ispmanager_phplist -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L58) - - - - - -### ispmanager_aliaslist -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L59) - - - - - - -## Tasks - -### ispmanager:init -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L62) - -Installs ispmanager. - - - - -### ispmanager:db-server-list -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L85) - -Takes database servers list. - - - - -### ispmanager:db-list -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L122) - -Takes databases list. - - - - -### ispmanager:domain-list -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L144) - -Takes domain list. - - - - -### ispmanager:db-create -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L160) - -Creates new database. - - - - -### ispmanager:db-delete -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L230) - -Deletes database. - - - - -### ispmanager:domain-create -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L281) - -Creates new domain. - - - - -### ispmanager:get-php-list -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L327) - -Gets allowed PHP modes and versions. - - - - -### ispmanager:print-php-list -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L373) - -Prints allowed PHP modes and versions. - - - - -### ispmanager:domain-php-select -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L411) - -Switches PHP version for domain. - - - - -### ispmanager:domain-alias-create -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L480) - -Creates new domain alias. - - - - -### ispmanager:domain-alias-delete -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L549) - -Deletes domain alias. - - - - -### ispmanager:domain-delete -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L617) - -Deletes domain. - - - - -### ispmanager:process -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ispmanager.php#L664) - -Auto task processing. - - - - diff --git a/docs/contrib/mattermost.md b/docs/contrib/mattermost.md deleted file mode 100644 index bec6c1422..000000000 --- a/docs/contrib/mattermost.md +++ /dev/null @@ -1,208 +0,0 @@ - - - - -# mattermost - -[Source](/contrib/mattermost.php) - - - -## Installing - -Create a Mattermost incoming webhook, through the administration panel. - -Require the new recipe into your `deploy.php` - -```php -require 'contrib/mattermost.php'; -``` - -Add hook on deploy: - -``` -before('deploy', 'mattermost:notify'); -``` - -## Configuration - - - `mattermost_webhook` - incoming mattermost webook **required** - ``` - set('mattermost_webook', 'https://{your-mattermost-site}/hooks/xxx-generatedkey-xxx'); - ``` - - - `mattermost_channel` - overrides the channel the message posts in - ``` - set('mattermost_channel', 'town-square'); - ``` - - - `mattermost_username` - overrides the username the message posts as - ``` - set('mattermost_username', 'deployer'); - ``` - - - `mattermost_icon_url` - overrides the profile picture the message posts with - ``` - set('mattermost_icon_url', 'https://domain.com/your-icon.png'); - ``` - - - `mattermost_text` - notification message - ``` - set('mattermost_text', '_{{user}}_ deploying `{{branch}}` to **{{target}}**'); - ``` - - - `mattermost_success_text` – success template, default: - ``` - set('mattermost_success_text', 'Deploy to **{{target}}** successful {{mattermost_success_emoji}}'); - ``` - - - `mattermost_failure_text` – failure template, default: - ``` - set('mattermost_failure_text', 'Deploy to **{{target}}** failed {{mattermost_failure_emoji}}'); - ``` - - - `mattermost_success_emoji` – emoji added at the end of success text - - `mattermost_failure_emoji` – emoji added at the end of failure text - - For detailed information about Mattermost hooks see: https://developers.mattermost.com/integrate/incoming-webhooks/ - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'mattermost:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'mattermost:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'mattermost:notify:failure'); -``` - - - -## Configuration -### mattermost_webhook -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L86) - - - -```php title="Default value" -null -``` - - -### mattermost_channel -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L87) - - - -```php title="Default value" -null -``` - - -### mattermost_username -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L88) - - - -```php title="Default value" -'deployer' -``` - - -### mattermost_icon_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L89) - - - -```php title="Default value" -null -``` - - -### mattermost_success_emoji -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L91) - - - -```php title="Default value" -':​white_check_mark:' -``` - - -### mattermost_failure_emoji -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L92) - - - -```php title="Default value" -':​x:' -``` - - -### mattermost_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L94) - - - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to **{{target}}**' -``` - - -### mattermost_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L95) - - - -```php title="Default value" -'Deploy to **{{target}}** successful {{mattermost_success_emoji}}' -``` - - -### mattermost_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L96) - - - -```php title="Default value" -'Deploy to **{{target}}** failed {{mattermost_failure_emoji}}' -``` - - - -## Tasks - -### mattermost:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L99) - -Notifies mattermost. - - - - -### mattermost:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L120) - -Notifies mattermost about deploy finish. - - - - -### mattermost:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/mattermost.php#L141) - -Notifies mattermost about deploy failure. - - - - diff --git a/docs/contrib/ms-teams.md b/docs/contrib/ms-teams.md deleted file mode 100644 index bc2b0eda4..000000000 --- a/docs/contrib/ms-teams.md +++ /dev/null @@ -1,176 +0,0 @@ - - - - -# ms-teams - -[Source](/contrib/ms-teams.php) - - - -## Installing - -Require ms-teams recipe in your `deploy.php` file: - -Setup: -1. Open MS Teams -2. Navigate to Teams section -3. Select existing or create new team -4. Select existing or create new channel -5. Hover over channel to get tree dots, click, in menu select "Connectors" -6. Search for and configure "Incoming Webhook" -7. Confirm/create and copy your Webhook URL -8. Setup deploy.php - Add in header: -```php -require 'contrib/ms-teams.php'; -set('teams_webhook', 'https://outlook.office.com/webhook/...'); -``` -Add in content: -```php -before('deploy', 'teams:notify'); -after('deploy:success', 'teams:notify:success'); -after('deploy:failed', 'teams:notify:failure'); -``` -9.) Sip your coffee - -## Configuration - -- `teams_webhook` – teams incoming webhook url, **required** - ``` - set('teams_webhook', 'https://outlook.office.com/webhook/...'); - ``` -- `teams_title` – the title of application, default `{{application}}` -- `teams_text` – notification message template, markdown supported - ``` - set('teams_text', '_{{user}}_ deploying `{{branch}}` to *{{target}}*'); - ``` -- `teams_success_text` – success template, default: - ``` - set('teams_success_text', 'Deploy to *{{target}}* successful'); - ``` -- `teams_failure_text` – failure template, default: - ``` - set('teams_failure_text', 'Deploy to *{{target}}* failed'); - ``` - -- `teams_color` – color's attachment -- `teams_success_color` – success color's attachment -- `teams_failure_color` – failure color's attachment - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'teams:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'teams:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'teams:notify:failure'); -``` - - -## Configuration -### teams_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L78) - -Title of project - - - -### teams_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L83) - -Deploy message - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - -### teams_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L84) - - - -```php title="Default value" -'Deploy to *{{target}}* successful' -``` - - -### teams_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L85) - - - -```php title="Default value" -'Deploy to *{{target}}* failed' -``` - - -### teams_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L88) - -Color of attachment - -```php title="Default value" -'#4d91f7' -``` - - -### teams_success_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L89) - - - -```php title="Default value" -'#00c100' -``` - - -### teams_failure_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L90) - - - -```php title="Default value" -'#ff0909' -``` - - - -## Tasks - -### teams:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L93) - -Notifies Teams. - - - - -### teams:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L107) - -Notifies Teams about deploy finish. - - - - -### teams:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/ms-teams.php#L121) - -Notifies Teams about deploy failure. - - - - diff --git a/docs/contrib/newrelic.md b/docs/contrib/newrelic.md deleted file mode 100644 index f23ddf50f..000000000 --- a/docs/contrib/newrelic.md +++ /dev/null @@ -1,67 +0,0 @@ - - - - -# newrelic - -[Source](/contrib/newrelic.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/newrelic.php'; -``` - -## Configuration - -- `newrelic_app_id` – newrelic's app id -- `newrelic_api_key` – newrelic's api key -- `newrelic_description` – message to send - -## Usage - -Since you should only notify New Relic of a successful deployment, the `newrelic:notify` task should be executed right at the end. - -```php -after('deploy', 'newrelic:notify'); -``` - - - -## Configuration -### newrelic_app_id -[Source](https://github.com/deployphp/deployer/blob/master/contrib/newrelic.php#L30) - - - - - -### newrelic_description -[Source](https://github.com/deployphp/deployer/blob/master/contrib/newrelic.php#L34) - - - - - -### newrelic_revision -[Source](https://github.com/deployphp/deployer/blob/master/contrib/newrelic.php#L38) - - - - - - -## Tasks - -### newrelic:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/newrelic.php#L43) - -Notifies New Relic of deployment. - - - - diff --git a/docs/contrib/npm.md b/docs/contrib/npm.md deleted file mode 100644 index f91f81799..000000000 --- a/docs/contrib/npm.md +++ /dev/null @@ -1,53 +0,0 @@ - - - - -# npm - -[Source](/contrib/npm.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/npm.php'; -``` - -## Configuration - -- `bin/npm` *(optional)*: set npm binary, automatically detected otherwise. - -## Usage - -```php -after('deploy:update_code', 'npm:install'); -``` - - - -## Configuration -### bin/npm -[Source](https://github.com/deployphp/deployer/blob/master/contrib/npm.php#L24) - - - - - - -## Tasks - -### npm:install -[Source](https://github.com/deployphp/deployer/blob/master/contrib/npm.php#L34) - -Installs npm packages. - -Uses `npm ci` command. This command is similar to npm install, -except it's meant to be used in automated environments such as -test platforms, continuous integration, and deployment -- or -any situation where you want to make sure you're doing a clean -install of your dependencies. - - diff --git a/docs/contrib/phinx.md b/docs/contrib/phinx.md deleted file mode 100644 index 7e7d8a8d3..000000000 --- a/docs/contrib/phinx.md +++ /dev/null @@ -1,117 +0,0 @@ - - - - -# phinx - -[Source](/contrib/phinx.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/phinx.php'; -``` - -## Configuration options - -All options are in the config parameter `phinx` specified as an array (instead of the `phinx_path` variable). -All parameters are *optional*, but you can specify them with a dictionary (to change all parameters) -or by deployer dot notation (to change one option). - -### Phinx params - -- `phinx.environment` -- `phinx.date` -- `phinx.configuration` N.B. current directory is the project directory -- `phinx.target` -- `phinx.seed` -- `phinx.parser` -- `phinx.remove-all` (pass empty string as value) - -### Phinx path params - -- `phinx_path` Specify phinx path (by default phinx is searched for in $PATH, ./vendor/bin and ~/.composer/vendor/bin) - -### Example of usage - -```php -$phinx_env_vars = [ - 'environment' => 'development', - 'configuration' => './migration/.phinx.yml', - 'target' => '20120103083322', - 'remove-all' => '', -]; - -set('phinx_path', '/usr/local/phinx/bin/phinx'); -set('phinx', $phinx_env_vars); - -after('cleanup', 'phinx:migrate'); - -or set it for a specific server -host('dev') - ->user('user') - ->set('deploy_path', '/var/www') - ->set('phinx', $phinx_env_vars) - ->set('phinx_path', ''); -``` - -## Suggested Usage - -You can run all tasks before or after any -tasks (but you need to specify external configs for phinx). -If you use internal configs (which are in your project) you need -to run it after the `deploy:update_code` task is completed. - -## Read more - -For further reading see [phinx.org](https://phinx.org). Complete descriptions of all possible options can be found on the [commands page](http://docs.phinx.org/en/latest/commands.html). - - - -## Configuration -### bin/phinx -[Source](https://github.com/deployphp/deployer/blob/master/contrib/phinx.php#L87) - -Path to Phinx - - - - -## Tasks - -### phinx:migrate -[Source](https://github.com/deployphp/deployer/blob/master/contrib/phinx.php#L154) - -Migrats database with phinx. - - - - -### phinx:rollback -[Source](https://github.com/deployphp/deployer/blob/master/contrib/phinx.php#L176) - -Rollbacks database migrations with phinx. - - - - -### phinx:seed -[Source](https://github.com/deployphp/deployer/blob/master/contrib/phinx.php#L198) - -Seeds database with phinx. - - - - -### phinx:breakpoint -[Source](https://github.com/deployphp/deployer/blob/master/contrib/phinx.php#L219) - -Sets a migrations breakpoint with phinx. - - - - diff --git a/docs/contrib/php-fpm.md b/docs/contrib/php-fpm.md deleted file mode 100644 index ff7c5b611..000000000 --- a/docs/contrib/php-fpm.md +++ /dev/null @@ -1,75 +0,0 @@ - - - - -# php-fpm - -[Source](/contrib/php-fpm.php) - - - -## Installing - -:::caution -Do **not** reload php-fpm. Some user requests could fail or not complete in the -process of reloading. - -Instead, configure your server [properly](https://ï.at/avoid-php-fpm-reloading). If you're using Deployer's provision -recipe, it's already configured the right way and no php-fpm reload is needed. -::: - -Add to your _deploy.php_ - -```php -require 'contrib/php-fpm.php'; -``` - -## Configuration - -- `php_fpm_version` – The PHP-fpm version. For example: `8.0`. -- `php_fpm_service` – The full name of the PHP-fpm service. Defaults to `php{{php_fpm_version}}-fpm`. -- `php_fpm_command` – The command to run to reload PHP-fpm. Defaults to `sudo systemctl reload {{php_fpm_service}}`. - -## Usage - -Start by explicitely providing the current version of PHP-version using the `php_fpm_version`. -Alternatively, you may use any of the options above to configure how PHP-fpm should reload. - -Then, add the `php-fpm:reload` task at the end of your deployments by using the `after` method like so. - -```php -set('php_fpm_version', '8.0'); -after('deploy', 'php-fpm:reload'); -``` - - - -## Configuration -### php_fpm_version -[Source](https://github.com/deployphp/deployer/blob/master/contrib/php-fpm.php#L41) - -Automatically detects by using [bin/php](/docs/recipe/common.md#bin/php). - - - -### php_fpm_service -[Source](https://github.com/deployphp/deployer/blob/master/contrib/php-fpm.php#L45) - - - -```php title="Default value" -'php{{php_fpm_version}}-fpm' -``` - - - -## Tasks - -### php-fpm:reload -[Source](https://github.com/deployphp/deployer/blob/master/contrib/php-fpm.php#L48) - -Reloads the php-fpm service. - - - - diff --git a/docs/contrib/rabbit.md b/docs/contrib/rabbit.md deleted file mode 100644 index 0ee070317..000000000 --- a/docs/contrib/rabbit.md +++ /dev/null @@ -1,69 +0,0 @@ - - - - -# rabbit - -[Source](/contrib/rabbit.php) - - - -### Installing - -```php -deploy.php - -require 'recipe/rabbit.php'; -``` - -### Configuration options - -- **rabbit** *(required)*: accepts an *array* with the connection information to [rabbitmq](http://www.rabbitmq.com) server token and team name. - - -You can provide also other configuration options: - - - *host* - default is localhost - - *port* - default is 5672 - - *username* - default is *guest* - - *password* - default is *guest* - - *channel* - no default value, need to be specified via config - - *message* - default is **Deployment to '{$host}' on *{$prod}* was successful\n($releasePath)** - - *vhost* - default is - - -```php -deploy.php - -set('rabbit', [ - 'host' => 'localhost', - 'port' => '5672', - 'username' => 'guest', - 'password' => 'guest', - 'channel' => 'notify-channel', - 'vhost' => '/my-app' -]); -``` - -### Suggested Usage - -Since you should only notify RabbitMQ channel of a successful deployment, the `deploy:rabbit` task should be executed right at the end. - -```php -deploy.php - -before('deploy:end', 'deploy:rabbit'); -``` - - - -## Tasks - -### deploy:rabbit -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rabbit.php#L58) - -Notifies RabbitMQ channel about deployment. - - - - diff --git a/docs/contrib/raygun.md b/docs/contrib/raygun.md deleted file mode 100644 index 8cbfd824b..000000000 --- a/docs/contrib/raygun.md +++ /dev/null @@ -1,48 +0,0 @@ - - - - -# raygun - -[Source](/contrib/raygun.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/raygun.php'; -``` - -## Configuration - -- `raygun_api_key` – the API key of your Raygun application -- `raygun_version` – the version of your application that this deployment is releasing -- `raygun_owner_name` – the name of the person creating this deployment -- `raygun_email` – the email of the person creating this deployment -- `raygun_comment` – the deployment notes -- `raygun_scm_identifier` – the commit that this deployment was built off -- `raygun_scm_type` - the source control system you use - -## Usage - -To notify Raygun of a successful deployment, you can use the 'raygun:notify' task after a deployment. - -```php -after('deploy', 'raygun:notify'); -``` - - - -## Tasks - -### raygun:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/raygun.php#L34) - -Notifies Raygun of deployment. - - - - diff --git a/docs/contrib/rocketchat.md b/docs/contrib/rocketchat.md deleted file mode 100644 index aea126371..000000000 --- a/docs/contrib/rocketchat.md +++ /dev/null @@ -1,229 +0,0 @@ - - - - -# rocketchat - -[Source](/contrib/rocketchat.php) - - - -## Installing - -Create a RocketChat incoming webhook, through the administration panel. - -Require the new recipe into your `deploy.php` - -```php -require 'contrib/rocketchat.php'; -``` - -Add hook on deploy: - -``` -before('deploy', 'rocketchat:notify'); -``` - -## Configuration - - - `rocketchat_webhook` - incoming rocketchat webook **required** - ``` - set('rocketchat_webook', 'https://rocketchat.yourcompany.com/hooks/XXXXX'); - ``` - - - `rocketchat_title` - the title of the application, defaults to `{{application}}` - - `rocketchat_text` - notification message - ``` - set('rocketchat_text', '_{{user}}_ deploying {{branch}} to {{target}}'); - ``` - - - `rocketchat_success_text` – success template, default: - ``` - set('rocketchat_success_text', 'Deploy to *{{target}}* successful'); - ``` - - `rocketchat_failure_text` – failure template, default: - ``` - set('rocketchat_failure_text', 'Deploy to *{{target}}* failed'); - ``` - - - `rocketchat_color` – color's attachment - - `rocketchat_success_color` – success color's attachment - - `rocketchat_failure_color` – failure color's attachment - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'rocketchat:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'rocketchat:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'rocketchat:notify:failure'); -``` - - - -## Configuration -### rockchat_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L70) - - - - - -### rocketchat_icon_emoji -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L74) - - - -```php title="Default value" -':robot:' -``` - - -### rocketchat_icon_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L75) - - - -```php title="Default value" -null -``` - - -### rocketchat_channel -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L77) - - - -```php title="Default value" -null -``` - - -### rocketchat_room_id -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L78) - - - -```php title="Default value" -null -``` - - -### rocketchat_username -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L79) - - - -```php title="Default value" -null -``` - - -### rocketchat_webhook -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L80) - - - -```php title="Default value" -null -``` - - -### rocketchat_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L82) - - - -```php title="Default value" -'#000000' -``` - - -### rocketchat_success_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L83) - - - -```php title="Default value" -'#00c100' -``` - - -### rocketchat_failure_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L84) - - - -```php title="Default value" -'#ff0909' -``` - - -### rocketchat_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L86) - - - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - -### rocketchat_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L87) - - - -```php title="Default value" -'Deploy to *{{target}}* successful' -``` - - -### rocketchat_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L88) - - - -```php title="Default value" -'Deploy to *{{target}}* failed' -``` - - - -## Tasks - -### rocketchat:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L91) - -Notifies RocketChat. - - - - -### rocketchat:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L121) - -Notifies RocketChat about deploy finish. - - - - -### rocketchat:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rocketchat.php#L151) - -Notifies RocketChat about deploy failure. - - - - diff --git a/docs/contrib/rollbar.md b/docs/contrib/rollbar.md deleted file mode 100644 index cdb657eb1..000000000 --- a/docs/contrib/rollbar.md +++ /dev/null @@ -1,59 +0,0 @@ - - - - -# rollbar - -[Source](/contrib/rollbar.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/rollbar.php'; -``` - -## Configuration - -- `rollbar_token` – access token to rollbar api -- `rollbar_comment` – comment about deploy, default to - ```php - set('rollbar_comment', '_{{user}}_ deploying `{{branch}}` to *{{target}}*'); - ``` -- `rollbar_username` – rollbar user name - -## Usage - -Since you should only notify Rollbar channel of a successful deployment, the `rollbar:notify` task should be executed right at the end. - -```php -after('deploy', 'rollbar:notify'); -``` - - - -## Configuration -### rollbar_comment -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rollbar.php#L33) - - - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - - -## Tasks - -### rollbar:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rollbar.php#L36) - -Notifies Rollbar of deployment. - - - - diff --git a/docs/contrib/rsync.md b/docs/contrib/rsync.md deleted file mode 100644 index 01cdf40dd..000000000 --- a/docs/contrib/rsync.md +++ /dev/null @@ -1,221 +0,0 @@ - - - - -# rsync - -[Source](/contrib/rsync.php) - - - -## IMPORTANT - -This must not be confused with `/src/Utility/Rsync.php`, deployer's built-in rsync. Their configuration options are also very different, read carefully below. - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/rsync.php'; -``` - -## Configuration options - -- **rsync**: Accepts an array with following rsync options (all are optional and defaults are ok): - - *exclude*: accepts an *array* with patterns to be excluded from sending to server - - *exclude-file*: accepts a *string* containing absolute path to file, which contains exclude patterns - - *include*: accepts an *array* with patterns to be included in sending to server - - *include-file*: accepts a *string* containing absolute path to file, which contains include patterns - - *filter*: accepts an *array* of rsync filter rules - - *filter-file*: accepts a *string* containing merge-file filename. - - *filter-perdir*: accepts a *string* containing merge-file filename to be scanned and merger per each directory in rsync list on files to send - - *flags*: accepts a *string* of flags to set when calling rsync command. Please **avoid** flags that accept params, and use *options* instead. - - *options*: accepts an *array* of options to set when calling rsync command. **DO NOT** prefix options with `--` as it's automatically added. - - *timeout*: accepts an *int* defining timeout for rsync command to run locally. - -### Sample Configuration: - -Following is default configuration. By default rsync ignores only git dir and `deploy.php` file. - -```php -deploy.php - -set('rsync',[ - 'exclude' => [ - '.git', - 'deploy.php', - ], - 'exclude-file' => false, - 'include' => [], - 'include-file' => false, - 'filter' => [], - 'filter-file' => false, - 'filter-perdir'=> false, - 'flags' => 'rz', // Recursive, with compress - 'options' => ['delete'], - 'timeout' => 60, -]); -``` - -If You have multiple excludes, You can put them in file and reference that instead. If You use `deploy:rsync_warmup` You could set additional options that could speed-up and/or affect way things are working. For example: - -```php -deploy.php - -set('rsync',[ - 'exclude' => ['excludes_file'], - 'exclude-file' => '/tmp/localdeploys/excludes_file', //Use absolute path to avoid possible rsync problems - 'include' => [], - 'include-file' => false, - 'filter' => [], - 'filter-file' => false, - 'filter-perdir' => false, - 'flags' => 'rzcE', // Recursive, with compress, check based on checksum rather than time/size, preserve Executable flag - 'options' => ['delete', 'delete-after', 'force'], //Delete after successful transfer, delete even if deleted dir is not empty - 'timeout' => 3600, //for those huge repos or crappy connection -]); -``` - - -### Parameter - -- **rsync_src**: per-host rsync source. This can be server, stage or whatever-dependent. By default it's set to current directory -- **rsync_dest**: per-host rsync destination. This can be server, stage or whatever-dependent. by default it's equivalent to release deploy destination. - -### Sample configurations: - -This is default configuration: - -```php -set('rsync_src', __DIR__); -set('rsync_dest','{{release_path}}'); -``` - -If You use local deploy recipe You can set src to local release: - -```php -host('hostname') - ->hostname('10.10.10.10') - ->port(22) - ->set('deploy_path','/your/remote/path/app') - ->set('rsync_src', '/your/local/path/app') - ->set('rsync_dest','{{release_path}}'); -``` - -## Usage - -- `rsync` task - - Set `rsync_src` to locally cloned repository and rsync to `rsync_dest`. Then set this task instead of `deploy:update_code` in Your `deploy` task if Your hosting provider does not allow git. - -- `rsync:warmup` task - - If Your deploy task looks like: - - ```php - task('deploy', [ - 'deploy:prepare', - 'deploy:release', - 'rsync', - 'deploy:vendors', - 'deploy:symlink', - ])->desc('Deploy your project'); - ``` - - And Your `rsync_dest` is set to `{{release_path}}` then You could add this task to run before `rsync` task or after `deploy:release`, whatever is more convenient. - - - -## Configuration -### rsync -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L127) - - - -```php title="Default value" -[ - 'exclude' => [ - '.git', - 'deploy.php', - ], - 'exclude-file' => false, - 'include' => [], - 'include-file' => false, - 'filter' => [], - 'filter-file' => false, - 'filter-perdir' => false, - 'flags' => 'rz', - 'options' => ['delete'], - 'timeout' => 300, -] -``` - - -### rsync_src -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L143) - - - -```php title="Default value" -__DIR__ -``` - - -### rsync_dest -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L144) - - - -```php title="Default value" -'{{release_path}}' -``` - - -### rsync_excludes -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L146) - - - - - -### rsync_includes -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L161) - - - - - -### rsync_filter -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L176) - - - - - -### rsync_options -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L194) - - - - - - -## Tasks - -### rsync:warmup -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L206) - -Warmups remote Rsync target. - - - - -### rsync -[Source](https://github.com/deployphp/deployer/blob/master/contrib/rsync.php#L221) - -Rsync local->remote. - - - - diff --git a/docs/contrib/sentry.md b/docs/contrib/sentry.md deleted file mode 100644 index 6fc37d867..000000000 --- a/docs/contrib/sentry.md +++ /dev/null @@ -1,73 +0,0 @@ - - - - -# sentry - -[Source](/contrib/sentry.php) - - - -### Installing - -```php -deploy.php - -require 'contrib/sentry.php'; -``` - -### Configuration options - -- **organization** *(required)*: the slug of the organization the release belongs to. -- **projects** *(required)*: array of slugs of the projects to create a release for. -- **token** *(required)*: authentication token. Can be created at [https://sentry.io/settings/account/api/auth-tokens/] -- **version** *(required)* – a version identifier for this release. -Can be a version number, a commit hash etc. (Defaults is set to git log -n 1 --format="%h".) -- **version_prefix** *(optional)* - a string prefixed to version. -Releases are global per organization so indipentent projects needs to prefix version number with unique string to avoid conflicts -- **environment** *(optional)* - the environment you’re deploying to. By default framework's environment is used. -For example for symfony, *symfony_env* configuration is read otherwise defaults to 'prod'. -- **ref** *(optional)* – an optional commit reference. This is useful if a tagged version has been provided. -- **refs** *(optional)* - array to indicate the start and end commits for each repository included in a release. -Head commits must include parameters *repository* and *commit*) (the HEAD sha). -They can optionally include *previousCommit* (the sha of the HEAD of the previous release), -which should be specified if this is the first time you’ve sent commit data. -- **commits** *(optional)* - array commits data to be associated with the release. -Commits must include parameters *id* (the sha of the commit), and can optionally include *repository*, -*message*, *author_name*, *author_email* and *timestamp*. By default will send all new commits, -unless it's a first release, then only first 200 will be sent. -- **url** *(optional)* – a URL that points to the release. This can be the path to an online interface to the sourcecode for instance. -- **date_released** *(optional)* – date that indicates when the release went live. If not provided the current time is assumed. -- **sentry_server** *(optional)* – sentry server (if you host it yourself). defaults to hosted sentry service. -- **date_deploy_started** *(optional)* - date that indicates when the deploy started. Defaults to current time. -- **date_deploy_finished** *(optional)* - date that indicates when the deploy ended. If not provided, the current time is used. -- **deploy_name** *(optional)* - name of the deploy -- **git_version_command** *(optional)* - the command that retrieves the git version information (Defaults is set to git log -n 1 --format="%h", other options are git describe --tags --abbrev=0) - -```php -deploy.php - -set('sentry', [ - 'organization' => 'exampleorg', - 'projects' => [ - 'exampleproj' - ], - 'token' => 'd47828...', - 'version' => '0.0.1', - -]); -``` - -### Suggested Usage - -Since you should only notify Sentry of a successful deployment, the deploy:sentry task should be executed right at the end. - -```php -deploy.php - -after('deploy', 'deploy:sentry'); -``` - - - - diff --git a/docs/contrib/slack.md b/docs/contrib/slack.md deleted file mode 100644 index 5a2da2906..000000000 --- a/docs/contrib/slack.md +++ /dev/null @@ -1,217 +0,0 @@ - - - - -# slack - -[Source](/contrib/slack.php) - - - -## Installing - -Add to Slack - -Require slack recipe in your `deploy.php` file: - -```php -require 'contrib/slack.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'slack:notify'); -``` - -## Configuration - -- `slack_webhook` – slack incoming webhook url, **required** - ``` - set('slack_webhook', 'https://hooks.slack.com/...'); - ``` -- `slack_channel` - channel to send notification to. The default is the channel configured in the webhook -- `slack_title` – the title of application, default `{{application}}` -- `slack_text` – notification message template, markdown supported - ``` - set('slack_text', '_{{user}}_ deploying `{{branch}}` to *{{target}}*'); - ``` -- `slack_success_text` – success template, default: - ``` - set('slack_success_text', 'Deploy to *{{target}}* successful'); - ``` -- `slack_failure_text` – failure template, default: - ``` - set('slack_failure_text', 'Deploy to *{{target}}* failed'); - ``` - -- `slack_color` – color's attachment -- `slack_success_color` – success color's attachment -- `slack_failure_color` – failure color's attachment -- `slack_fields` - set attachments fields for pretty output in Slack, default: - ``` - set('slack_fields', []); - ``` - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'slack:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'slack:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'slack:notify:failure'); -``` - - - -## Configuration -### slack_channel -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L74) - -Channel to publish to, when false the default channel the webhook will be used - -```php title="Default value" -false -``` - - -### slack_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L77) - -Title of project - - - -### slack_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L82) - -Deploy message - -```php title="Default value" -'_{{user}}_ deploying `{{target}}` to *{{hostname}}*' -``` - - -### slack_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L83) - - - -```php title="Default value" -'Deploy to *{{target}}* successful' -``` - - -### slack_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L84) - - - -```php title="Default value" -'Deploy to *{{target}}* failed' -``` - - -### slack_rollback_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L85) - - - -```php title="Default value" -'_{{user}}_ rolled back changes on *{{target}}*' -``` - - -### slack_fields -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L86) - - - - - -### slack_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L89) - -Color of attachment - -```php title="Default value" -'#4d91f7' -``` - - -### slack_success_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L90) - - - -```php title="Default value" -'#00c100' -``` - - -### slack_failure_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L91) - - - -```php title="Default value" -'#ff0909' -``` - - -### slack_rollback_color -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L92) - - - -```php title="Default value" -'#eba211' -``` - - - -## Tasks - -### slack:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L104) - -Notifies Slack. - - - - -### slack:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L123) - -Notifies Slack about deploy finish. - - - - -### slack:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L143) - -Notifies Slack about deploy failure. - - - - -### slack:notify:rollback -[Source](https://github.com/deployphp/deployer/blob/master/contrib/slack.php#L162) - -Notifies Slack about rollback. - - - - diff --git a/docs/contrib/telegram.md b/docs/contrib/telegram.md deleted file mode 100644 index 683cd9e36..000000000 --- a/docs/contrib/telegram.md +++ /dev/null @@ -1,141 +0,0 @@ - - - - -# telegram - -[Source](/contrib/telegram.php) - - - -## Installing - 1. Create telegram bot with [BotFather](https://t.me/BotFather) and grab the token provided - 2. Send `/start` to your bot and open https://api.telegram.org/bot{$TELEGRAM_TOKEN_HERE}/getUpdates - 3. Take chat_id from response -Require telegram recipe in your `deploy.php` file: - -```php -require 'contrib/telegram.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'telegram:notify'); -``` - -## Configuration - -- `telegram_token` – telegram bot token, **required** -- `telegram_chat_id` — chat ID to push messages to -- `telegram_proxy` - proxy connection string in [CURLOPT_PROXY](https://curl.haxx.se/libcurl/c/CURLOPT_PROXY.html) form like: - ``` - http://proxy:80 - socks5://user:password@host:3128 - ``` -- `telegram_title` – the title of application, default `{{application}}` -- `telegram_text` – notification message template - ``` - _{{user}}_ deploying `{{branch}}` to *{{target}}* - ``` -- `telegram_success_text` – success template, default: - ``` - Deploy to *{{target}}* successful - - ``` -- `telegram_failure_text` – failure template, default: - ``` - Deploy to *{{target}}* failed - ``` - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'telegram:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'telegram:notify:success'); -``` -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'telegram:notify:failure'); - - - - -## Configuration -### telegram_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L67) - -Title of project - - - -### telegram_token -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L72) - -Telegram settings - - - -### telegram_chat_id -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L75) - - - - - -### telegram_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L78) - - - - - -### telegram_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L83) - -Deploy message - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - -### telegram_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L84) - - - -```php title="Default value" -'Deploy to *{{target}}* successful' -``` - - -### telegram_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L85) - - - -```php title="Default value" -'Deploy to *{{target}}* failed' -``` - - - -## Tasks - -### telegram:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/telegram.php#L89) - -Notifies Telegram. - - - - diff --git a/docs/contrib/webpack_encore.md b/docs/contrib/webpack_encore.md deleted file mode 100644 index 7223deb87..000000000 --- a/docs/contrib/webpack_encore.md +++ /dev/null @@ -1,66 +0,0 @@ - - - - -# webpack_encore - -[Source](/contrib/webpack_encore.php) - -* Requires - * [npm](/docs/contrib/npm.md) - * [yarn](/docs/contrib/yarn.md) - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/webpack_encore.php'; -``` - -## Configuration - -- **webpack_encore/package_manager** *(optional)*: set yarn or npm. We try to find if yarn or npm is available and used. - -## Usage - -```php -For Yarn -after('deploy:update_code', 'yarn:install'); -For npm -after('deploy:update_code', 'npm:install'); - -after('deploy:update_code', 'webpack_encore:build'); -``` - - -## Configuration -### webpack_encore/package_manager -[Source](https://github.com/deployphp/deployer/blob/master/contrib/webpack_encore.php#L31) - - - - - -### webpack_encore/env -[Source](https://github.com/deployphp/deployer/blob/master/contrib/webpack_encore.php#L39) - - - -```php title="Default value" -'production' -``` - - - -## Tasks - -### webpack_encore:build -[Source](https://github.com/deployphp/deployer/blob/master/contrib/webpack_encore.php#L42) - -Runs webpack encore build. - - - - diff --git a/docs/contrib/workplace.md b/docs/contrib/workplace.md deleted file mode 100644 index c5a03a86b..000000000 --- a/docs/contrib/workplace.md +++ /dev/null @@ -1,148 +0,0 @@ - - - - -# workplace - -[Source](/contrib/workplace.php) - - - -## Installing - -This recipes works with Custom Integrations and Publishing Bots. - -Require the new recipe into your `deploy.php` - -```php -require 'contrib/workplace.php'; -``` - -Add hook on deploy: - -``` -before('deploy', 'workplace:notify'); -``` - -## Configuration - - - `workplace_webhook` - incoming workplace webhook **required** - ``` - // With custom integration - set('workplace_webhook', 'https://graph.facebook.com//feed?access_token='); - - // With publishing bot - set('workplace_webhook', 'https://graph.facebook.com/v3.0/group/feed?access_token='); - - // Use markdown on message - set('workplace_webhook', 'https://graph.facebook.com//feed?access_token=&formatting=MARKDOWN'); - ``` - - - `workplace_text` - notification message - ``` - set('workplace_text', '_{{user}}_ deploying `{{branch}}` to *{{target}}*'); - ``` - - - `workplace_success_text` – success template, default: - ``` - set('workplace_success_text', 'Deploy to *{{target}}* successful'); - ``` - - `workplace_failure_text` – failure template, default: - ``` - set('workplace_failure_text', 'Deploy to *{{target}}* failed'); - ``` - - `workplace_edit_post` – whether to create a new post for deploy result, or edit the first one created, default creates a new post: - ``` - set('workplace_edit_post', false); - ``` - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'workplace:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'workplace:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'workplace:notify:failure'); -``` - - - -## Configuration -### workplace_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L77) - -Deploy message - -```php title="Default value" -'_{{user}}_ deploying `{{branch}}` to *{{target}}*' -``` - - -### workplace_success_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L78) - - - -```php title="Default value" -'Deploy to *{{target}}* successful' -``` - - -### workplace_failure_text -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L79) - - - -```php title="Default value" -'Deploy to *{{target}}* failed' -``` - - -### workplace_edit_post -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L82) - -By default, create a new post for every message - -```php title="Default value" -false -``` - - - -## Tasks - -### workplace:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L85) - -Notifies Workplace. - - - - -### workplace:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L109) - -Notifies Workplace about deploy finish. - - - - -### workplace:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/workplace.php#L120) - -Notifies Workplace about deploy failure. - - - - diff --git a/docs/contrib/yammer.md b/docs/contrib/yammer.md deleted file mode 100644 index db2b40690..000000000 --- a/docs/contrib/yammer.md +++ /dev/null @@ -1,142 +0,0 @@ - - - - -# yammer - -[Source](/contrib/yammer.php) - - - -# Yammer recipe - -## Installing - -Require yammer recipe in your `deploy.php` file: - -```php -require 'contrib/yammer.php'; -``` - -Add hook on deploy: - -```php -before('deploy', 'yammer:notify'); -``` - -## Configuration - -- `yammer_url` – The URL to the message endpoint, default is https://www.yammer.com/api/v1/messages.json -- `yammer_token` *(required)* – Yammer auth token -- `yammer_group_id` *(required)* - Group ID -- `yammer_title` – the title of application, default `{{application}}` -- `yammer_body` – notification message template, default: - ``` - {{user}} deploying {{branch}} to {{target}} - ``` -- `yammer_success_body` – success template, default: - ``` - Deploy to {{target}} successful - ``` -- `yammer_failure_body` – failure template, default: - ``` - Deploy to {{target}} failed - ``` - -## Usage - -If you want to notify only about beginning of deployment add this line only: - -```php -before('deploy', 'yammer:notify'); -``` - -If you want to notify about successful end of deployment add this too: - -```php -after('deploy:success', 'yammer:notify:success'); -``` - -If you want to notify about failed deployment add this too: - -```php -after('deploy:failed', 'yammer:notify:failure'); -``` - - - -## Configuration -### yammer_url -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L63) - - - -```php title="Default value" -'https://www.yammer.com/api/v1/messages.json' -``` - - -### yammer_title -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L66) - -Title of project - - - -### yammer_body -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L71) - -Deploy message - -```php title="Default value" -'{{user}} deploying {{branch}} to {{target}}' -``` - - -### yammer_success_body -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L72) - - - -```php title="Default value" -'Deploy to {{target}} successful' -``` - - -### yammer_failure_body -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L73) - - - -```php title="Default value" -'Deploy to {{target}} failed' -``` - - - -## Tasks - -### yammer:notify -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L76) - -Notifies Yammer. - - - - -### yammer:notify:success -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L95) - -Notifies Yammer about deploy finish. - - - - -### yammer:notify:failure -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yammer.php#L114) - -Notifies Yammer about deploy failure. - - - - diff --git a/docs/contrib/yarn.md b/docs/contrib/yarn.md deleted file mode 100644 index 470cabb2f..000000000 --- a/docs/contrib/yarn.md +++ /dev/null @@ -1,48 +0,0 @@ - - - - -# yarn - -[Source](/contrib/yarn.php) - - - -## Installing - -Add to your _deploy.php_ - -```php -require 'contrib/yarn.php'; -``` - -## Configuration - -- **bin/yarn** *(optional)*: set Yarn binary, automatically detected otherwise. - -## Usage - -```php -after('deploy:update_code', 'yarn:install'); -``` - - -## Configuration -### bin/yarn -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yarn.php#L23) - - - - - - -## Tasks - -### yarn:install -[Source](https://github.com/deployphp/deployer/blob/master/contrib/yarn.php#L29) - -Installs Yarn packages. - -In there is a {{previous_release}}, node_modules will be copied from it before installing deps with yarn. - - diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100755 index 02ed1709e..000000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,138 +0,0 @@ -# Getting Started - -In this tutorial we will cover: -- Setting up a new host with provision recipe. -- Configuring a deployment and perfoming our first deploy. - -Tutorial duration: **5 min** - -First, [install the Deployer](installation.md): - -Now lets cd into the project and run the following command: - -```sh -dep init -``` - -Deployer will ask you a few question and after finishing you will have a -**deploy.php** or **deploy.yaml** file. This is our deployment recipe. -It contains hosts, tasks and requires other recipes. All framework recipes -that come with Deployer are based on the [common](recipe/common.md) recipe. - -## Provision - -:::note -If you already have a configured webserver you may skip to -[deployment](#deploy). -::: - -Let's create a new VPS on Linode, DigitalOcean, Vultr, AWS, GCP, etc. - -Make sure the image is **Ubuntu 20.04 LTS** as this version is supported via -Deployer [provision](recipe/provision.md) recipe. - -:::tip -Configure Reverse DNS or RDNS on your server. This will allow you to ssh into -server using the domain name instead of the IP address. -::: - -Our **deploy.php** recipe contains host definition with few important params: - - `remote_user` user's name for ssh connection, - - `deploy_path` host's path where we are going to deploy. - -```php -host('example.org') - ->set('remote_user', 'deployer') - ->set('deploy_path', '~/example'); -``` - -To connect to remote host we need to specify identity key or private key. -We can add our identity key directly into host definition, but better to put it -in **~/.ssh/config** file: - -``` -Host * - IdentityFile ~/.ssh/id_rsa -``` - -Now let's provision our server. As our host doesn't have user name `deployer`, but -only `root` user. We going to override `remote_user` for provision via `-o remote_user=root`. - -```sh -dep provision -o remote_user=root -``` -:::tip -If your server doesn't have a `root` user but your remote user can use `sudo` to become root, then use: - -```sh -dep provision -o become=root -``` -::: - -Deployer will ask you a few questions during provisioning: php version, -database type, etc. You can specify it also in directly in recipe. - -Provision recipe going to do: -- Update and upgrade all Ubuntu packages to latest versions, -- Install all needed packages for our website (acl, npm, git, etc), -- Install php with all needed extensions, -- Install and configure the database, -- Install Caddy webserver and configure our website with SSL certificate, -- Configure ssh and firewall, -- Setup **deployer** user. - -Provisioning will take around **5 minutes** and will install everything we need to run a -website. It will also setup a `deployer` user, which we will need to use to ssh to our -host. A new website will be configured at [deploy_path](recipe/common.md#deploy_path). - -After we have configured the webserver, let's deploy the project. - -## Deploy - -To deploy the project: - -```sh -dep deploy -``` - -If deploy failed, Deployer will print error message and command what was unsuccessful. -Most likely we need to configure correct database credentials in _.env_ file or similar. - -Ssh to the host, for example, for editing _.env_ file: - -```sh -dep ssh -``` - -After everything is configured properly we can resume our deployment from the place it stopped (But this is not required, we can just start a new deploy): - -``` -dep deploy --start-from deploy:migrate -``` - -Now let's add a build step on our host: -```php -task('build', function () { - cd('{{release_path}}'); - run('npm install'); - run('npm run prod'); -}); - -after('deploy:update_code', 'build'); -``` - -Deployer has a useful task for examining what is currently deployed. - -``` -$ dep releases -task releases -+---------------------+--------- deployer.org -------+--------+-----------+ -| Date (UTC) | Release | Author | Target | Commit | -+---------------------+-------------+----------------+--------+-----------+ -| 2021-11-05 14:00:22 | 1 (current) | Anton Medvedev | HEAD | 943ded2be | -+---------------------+-------------+----------------+--------+-----------+ -``` - -:::tip -During development, the [dep push](recipe/deploy/push.md) task maybe useful. -::: diff --git a/docs/hosts.md b/docs/hosts.md deleted file mode 100644 index 7a16f0e83..000000000 --- a/docs/hosts.md +++ /dev/null @@ -1,184 +0,0 @@ -# Hosts - -To define a new host use the [host()](api.md#host) function. Deployer keeps a list of -all defined hosts in the `Deployer::get()->hosts` collection. - -```php -host('example.org'); -``` - -Each host contains it's own configuration key-value pairs. The [host()](api.md#host) -call defines two important configs: **alias** and **hostname**. - -- **hostname** - used when connecting to remote host. -- **alias** - used as a key in `Deployer::get()->hosts` collection. - -```php -task('test', function () { - writeln('The {{alias}} is {{hostname}}'); -}); -``` - -``` -$ dep test -[example.org] The example.org is example.org -``` - -We can override hostname via `set()` method: - -```php -host('example.org') - ->set('hostname', 'example.cloud.google.com'); -``` - -The hostname will be used for the ssh connection, but the host will be referred -by its alias when running Deployer. - -``` -$ dep test -[example.org] The example.org is example.cloud.google.com -``` - -Another important ssh connection parameter is `remote_user`. - -```php -host('example.org') - ->set('hostname', 'example.cloud.google.com') - ->set('remote_user', 'deployer'); -``` - -Now Deployer will connect using something like -`ssh deployer@example.cloud.google.com` to establishing connection. - -Also, Deployer's `Host` class has special setter methods (for better IDE -autocompletion). - -```php -host('example.org') - ->setHostname('example.cloud.google.com') - ->setRemoteUser('deployer'); -``` - -## Host config - -### `alias` - -The identifier used to identify a host. -You can use actual hostname or something like `prod` or `staging`. - -### `hostname` - -Deployer uses this config for actual ssh connection. - -### `remote_user` - -Deployer uses this config for actual ssh connection. If not specified, -Deployer will be using `RemoteUser` from **~/.ssh/config** file, or current -OS username. - -### `port` - -Port of remote ssh server to connect to. Default is `22`. - -### `config_file` - -Default is `~/.ssh/config`. - -:::info Config file -It is a good practice to keep connection parameters out of `deploy.php` file, as -they can change depending on where the deploy is executed from. Only specify -`hostname` and `remote_user` and other keep in `~/.ssh/config`: - -``` -Host * - IdentityFile ~/.ssh/id_rsa -``` -::: - -### `identity_file` - -For example, `~/.ssh/id_rsa`. - -### `forward_agent` - -Default is `true`. - -### `ssh_multiplexing` - -Default is `true`. - -### `shell` - -Default is `bash -ls`. - -### `deploy_path` - -For example, `~/myapp`. - -### `labels` - -Key-value pairs for host selector. - -### `ssh_arguments` - -For example, `['-o UserKnownHostsFile=/dev/null']` - -### `ssh_control_path` - -Default is `~/.ssh/%C`. - -If **CI** env is present, default value is `/dev/shm/%C`. - -## Multiple hosts - -You can pass multiple hosts to the host function: - -```php -host('example.org', 'deployer.org', ...) - ->setRemoteUser('anton'); -``` - -## Host ranges - -If you have a lot of hosts following similar patterns, you can describe them -like this rather than listing each hostname: - -```php -host('www[01:50].example.org'); -``` - -For numeric patterns, leading zeros can be included or removed, as desired. -Ranges are inclusive. - -You can also define alphabetic ranges: - -```php -host('db[a:f].example.org'); -``` - -## Localhost - -The [localhost()](api.md#localhost) function defines a special local host. -Deployer will not connect to this host, but will execute commands locally instead. - -```php -localhost(); // Alias and hostname will be "localhost". -localhost('ci'); // Alias is "ci", hostname is "localhost". -``` - -## YAML Inventory - -You can use the [import()](api.md#import) function to keep host definitions in a -separate file. For example, *inventory.yaml*. - -```php title="deploy.php" -import('inventory.yaml'); -``` - -```yaml title="inventory.yaml" -hosts: - example.org: - remote_user: deployer - deployer.org: - remote_user: deployer -``` diff --git a/docs/installation.md b/docs/installation.md deleted file mode 100755 index 2aaf6bb00..000000000 --- a/docs/installation.md +++ /dev/null @@ -1,29 +0,0 @@ -# Installation - -To install Deployer, run next command in your project dir: -``` -composer require --dev deployer/deployer -``` - -To initialize deployer in you project run: - -``` -vendor/bin/dep init -``` - -:::tip Bash integration -Add next alias to your _.bashrc_ file: - -```bash -alias dep='vendor/bin/dep' -``` - -Deployer comes with autocomplete support for task names, options, and hosts. - -Run the next command to add bash completion support: -``` -dep completion bash > /etc/bash_completion.d/deployer -``` - -Make sure what your _.bashrc_ file includes generated file in some way. -::: diff --git a/docs/recipe/cakephp.md b/docs/recipe/cakephp.md deleted file mode 100644 index aca08f31f..000000000 --- a/docs/recipe/cakephp.md +++ /dev/null @@ -1,77 +0,0 @@ - - - - -# cakephp - -[Source](/recipe/cakephp.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/cakephp.php#L13) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -CakePHP 4 Project Template shared dirs - -```php title="Default value" -[ - 'logs', - 'tmp', -] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/cakephp.php#L19) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -CakePHP 4 Project Template shared files - -```php title="Default value" -[ - 'config/.env', - 'config/app.php', -] -``` - - - -## Tasks - -### deploy:init -[Source](https://github.com/deployphp/deployer/blob/master/recipe/cakephp.php#L27) - - - -Create plugins' symlinks - - -### deploy:run_migrations -[Source](https://github.com/deployphp/deployer/blob/master/recipe/cakephp.php#L34) - - - -Run migrations - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/cakephp.php#L42) - - - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:init](/docs/recipe/cakephp.md#deployinit) -* [deploy:run_migrations](/docs/recipe/cakephp.md#deployrun_migrations) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/codeigniter.md b/docs/recipe/codeigniter.md deleted file mode 100644 index 87cf5843e..000000000 --- a/docs/recipe/codeigniter.md +++ /dev/null @@ -1,53 +0,0 @@ - - - - -# codeigniter - -[Source](/recipe/codeigniter.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/codeigniter.php#L9) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -CodeIgniter shared dirs - -```php title="Default value" -['application/cache', 'application/logs'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/codeigniter.php#L12) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -CodeIgniter writable dirs - -```php title="Default value" -['application/cache', 'application/logs'] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/codeigniter.php#L18) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/common.md b/docs/recipe/common.md deleted file mode 100644 index 976e7a9ad..000000000 --- a/docs/recipe/common.md +++ /dev/null @@ -1,220 +0,0 @@ - - - - -# common - -[Source](/recipe/common.php) - -* Requires - * [provision](/docs/recipe/provision.md) - * [check_remote](/docs/recipe/deploy/check_remote.md) - * [cleanup](/docs/recipe/deploy/cleanup.md) - * [clear_paths](/docs/recipe/deploy/clear_paths.md) - * [copy_dirs](/docs/recipe/deploy/copy_dirs.md) - * [info](/docs/recipe/deploy/info.md) - * [lock](/docs/recipe/deploy/lock.md) - * [push](/docs/recipe/deploy/push.md) - * [release](/docs/recipe/deploy/release.md) - * [rollback](/docs/recipe/deploy/rollback.md) - * [setup](/docs/recipe/deploy/setup.md) - * [shared](/docs/recipe/deploy/shared.md) - * [symlink](/docs/recipe/deploy/symlink.md) - * [update_code](/docs/recipe/deploy/update_code.md) - * [vendors](/docs/recipe/deploy/vendors.md) - * [writable](/docs/recipe/deploy/writable.md) - -## Configuration -### user -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L29) - -Name of current user who is running deploy. -If not set will try automatically get git user name, -otherwise output of `whoami` command. - - - -### keep_releases -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L46) - -Number of releases to preserve in releases folder. - -```php title="Default value" -10 -``` - - -### repository -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L49) - -Repository to deploy. - - - -### default_timeout -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L54) - -Default timeout for `run()` and `runLocally()` functions. - -Set to `null` to disable timeout. - -```php title="Default value" -300 -``` - - -### env -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L70) - -Remote environment variables. -```php -set('env', [ - 'KEY' => 'something', -]); -``` - -It is possible to override it per `run()` call. - -```php -run('echo $KEY', env: ['KEY' => 'over']); -``` - - - -### dotenv -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L79) - -Path to `.env` file which will be used as environment variables for each command per `run()`. - -```php -set('dotenv', '{{current_path}}/.env'); -``` - -```php title="Default value" -false -``` - - -### deploy_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L89) - -The deploy path. - -For example can be set for a bunch of host once as: -```php -set('deploy_path', '~/{{alias}}'); -``` - - - -### current_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L99) - -Return current release path. Default to [deploy_path](/docs/recipe/common.md#deploy_path)/`current`. -```php -set('current_path', '/var/public_html'); -``` - -```php title="Default value" -'{{deploy_path}}/current' -``` - - -### bin/php -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L102) - -Path to the `php` bin. - - - -### bin/git -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L110) - -Path to the `git` bin. - - - -### use_relative_symlink -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L116) - -Should [bin/symlink](/docs/recipe/common.md#bin/symlink) use `--relative` option or not. Will detect -automatically. - - - -### bin/symlink -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L121) - -Path to the `ln` bin. With predefined options `-nfs`. - - - -### sudo_askpass -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L128) - -Path to a file which will store temp script with sudo password. -Defaults to `.dep/sudo_pass`. This script is only temporary and will be deleted after -sudo command executed. - - - - -## Tasks - -### deploy:prepare -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L137) - -Prepares a new release. - - - - -This task is group task which contains next tasks: -* [deploy:info](/docs/recipe/deploy/info.md#deployinfo) -* [deploy:setup](/docs/recipe/deploy/setup.md#deploysetup) -* [deploy:lock](/docs/recipe/deploy/lock.md#deploylock) -* [deploy:release](/docs/recipe/deploy/release.md#deployrelease) -* [deploy:update_code](/docs/recipe/deploy/update_code.md#deployupdate_code) -* [deploy:shared](/docs/recipe/deploy/shared.md#deployshared) -* [deploy:writable](/docs/recipe/deploy/writable.md#deploywritable) - - -### deploy:publish -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L148) - -Publishes the release. - - - - -This task is group task which contains next tasks: -* [deploy:symlink](/docs/recipe/deploy/symlink.md#deploysymlink) -* [deploy:unlock](/docs/recipe/deploy/lock.md#deployunlock) -* [deploy:cleanup](/docs/recipe/deploy/cleanup.md#deploycleanup) -* [deploy:success](/docs/recipe/common.md#deploysuccess) - - -### deploy:success -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L158) - - - -Prints success message - - -### deploy:failed -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L167) - - - -Hook on deploy failure. - - -### logs:app -[Source](https://github.com/deployphp/deployer/blob/master/recipe/common.php#L177) - -Shows application logs. - -Follows latest application logs. - - diff --git a/docs/recipe/composer.md b/docs/recipe/composer.md deleted file mode 100644 index 90fd8e08c..000000000 --- a/docs/recipe/composer.md +++ /dev/null @@ -1,28 +0,0 @@ - - - - -# composer - -[Source](/recipe/composer.php) - -* Requires - * [common](/docs/recipe/common.md) - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/composer.php#L9) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/contao.md b/docs/recipe/contao.md deleted file mode 100644 index 7a807575f..000000000 --- a/docs/recipe/contao.md +++ /dev/null @@ -1,115 +0,0 @@ - - - - -# contao - -[Source](/recipe/contao.php) - -* Requires - * [symfony](/docs/recipe/symfony.md) - -## Configuration -### public_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L11) - -Overrides [public_path](/docs/recipe/provision/website.md#public_path) from `recipe/provision/website.php`. - -The public path is the path to be set as DocumentRoot and is defined in the `composer.json` of the project -but defaults to `public` from Contao 5.0 on. -This path is relative from the [current_path](/docs/recipe/common.md#current_path), see [`recipe/provision/website.php`](/docs/recipe/provision/website.php#public_path). - - - -### bin/console -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L29) - -Overrides [bin/console](/docs/recipe/symfony.md#bin/console) from `recipe/symfony.php`. - - - - - -### contao_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L33) - - - - - - -## Tasks - -### contao:migrate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L47) - -Run Contao migrations. - -This task updates the database. A database backup is saved automatically as a default. - -To automatically drop the obsolete database structures, you can override the task as follows: - -```php -task('contao:migrate', function () { - run('{{bin/php}} {{bin/console}} contao:migrate --with-deletes {{console_options}}'); -}); -``` - - -### contao:manager:download -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L53) - -Download the Contao Manager. - -Downloads the `contao-manager.phar.php` into the public path. - - -### contao:install:lock -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L59) - -Lock the Contao Install Tool. - -Locks the Contao install tool which is useful if you don't use it. - - -### contao:manager:lock -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L65) - -Lock the Contao Manager. - -Locks the Contao Manager which is useful if you only need the API of the Manager rather than the UI. - - -### contao:maintenance:enable -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L71) - -Enable maintenance mode. - - - - -### contao:maintenance:disable -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L86) - -Disable maintenance mode. - - - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/contao.php#L98) - -Deploy the project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [contao:maintenance:enable](/docs/recipe/contao.md#contaomaintenanceenable) -* [contao:migrate](/docs/recipe/contao.md#contaomigrate) -* [contao:maintenance:disable](/docs/recipe/contao.md#contaomaintenancedisable) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/deploy/check_remote.md b/docs/recipe/deploy/check_remote.md deleted file mode 100644 index 81410caf2..000000000 --- a/docs/recipe/deploy/check_remote.md +++ /dev/null @@ -1,21 +0,0 @@ - - - - -# check_remote - -[Source](/recipe/deploy/check_remote.php) - - - -## Tasks - -### deploy:check_remote -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/check_remote.php#L10) - -Checks remote head. - -Cancel deployment if there would be no change to the codebase. -This avoids unnecessary releases if the latest commit has already been deployed. - - diff --git a/docs/recipe/deploy/cleanup.md b/docs/recipe/deploy/cleanup.md deleted file mode 100644 index b797d1911..000000000 --- a/docs/recipe/deploy/cleanup.md +++ /dev/null @@ -1,31 +0,0 @@ - - - - -# cleanup - -[Source](/recipe/deploy/cleanup.php) - - -## Configuration -### cleanup_use_sudo -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/cleanup.php#L5) - -Use sudo in deploy:cleanup task for rm command. - -```php title="Default value" -false -``` - - - -## Tasks - -### deploy:cleanup -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/cleanup.php#L8) - -Cleanup old releases. - - - - diff --git a/docs/recipe/deploy/clear_paths.md b/docs/recipe/deploy/clear_paths.md deleted file mode 100644 index e335f457a..000000000 --- a/docs/recipe/deploy/clear_paths.md +++ /dev/null @@ -1,38 +0,0 @@ - - - - -# clear_paths - -[Source](/recipe/deploy/clear_paths.php) - - -## Configuration -### clear_paths -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/clear_paths.php#L5) - -List of paths to remove from [release_path](/docs/recipe/deploy/release.md#release_path). - - - -### clear_use_sudo -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/clear_paths.php#L8) - -Use sudo for deploy:clear_path task? - -```php title="Default value" -false -``` - - - -## Tasks - -### deploy:clear_paths -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/clear_paths.php#L11) - -Cleanup files and/or directories. - - - - diff --git a/docs/recipe/deploy/copy_dirs.md b/docs/recipe/deploy/copy_dirs.md deleted file mode 100644 index 3570adf58..000000000 --- a/docs/recipe/deploy/copy_dirs.md +++ /dev/null @@ -1,29 +0,0 @@ - - - - -# copy_dirs - -[Source](/recipe/deploy/copy_dirs.php) - - -## Configuration -### copy_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/copy_dirs.php#L6) - -List of dirs to copy between releases. -For example you can copy `node_modules` to speedup npm install. - - - - -## Tasks - -### deploy:copy_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/copy_dirs.php#L9) - -Copies directories. - - - - diff --git a/docs/recipe/deploy/info.md b/docs/recipe/deploy/info.md deleted file mode 100644 index e52a2012b..000000000 --- a/docs/recipe/deploy/info.md +++ /dev/null @@ -1,20 +0,0 @@ - - - - -# info - -[Source](/recipe/deploy/info.php) - - - -## Tasks - -### deploy:info -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/info.php#L5) - -Displays info about deployment. - - - - diff --git a/docs/recipe/deploy/lock.md b/docs/recipe/deploy/lock.md deleted file mode 100644 index 382c050ad..000000000 --- a/docs/recipe/deploy/lock.md +++ /dev/null @@ -1,36 +0,0 @@ - - - - -# lock - -[Source](/recipe/deploy/lock.php) - - - -## Tasks - -### deploy:lock -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/lock.php#L7) - -Locks deploy. - - - - -### deploy:unlock -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/lock.php#L20) - -Unlocks deploy. - - - - -### deploy:is_locked -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/lock.php#L25) - -Checks if deploy is locked. - - - - diff --git a/docs/recipe/deploy/push.md b/docs/recipe/deploy/push.md deleted file mode 100644 index 5953a53c0..000000000 --- a/docs/recipe/deploy/push.md +++ /dev/null @@ -1,22 +0,0 @@ - - - - -# push - -[Source](/recipe/deploy/push.php) - - - -## Tasks - -### push -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/push.php#L8) - -Pushes local changes to remote host. - -Creates patch of local changes and pushes them on host. -And applies to current_path. Push can be done many times. -The task purpose to be used only for development. - - diff --git a/docs/recipe/deploy/release.md b/docs/recipe/deploy/release.md deleted file mode 100644 index 9e9b8ba4d..000000000 --- a/docs/recipe/deploy/release.md +++ /dev/null @@ -1,82 +0,0 @@ - - - - -# release - -[Source](/recipe/deploy/release.php) - - -## Configuration -### release_name -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L8) - -The name of the release. - - - -### releases_log -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L16) - -Holds releases log from `.dep/releases_log` file. - - - -### releases_list -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L31) - -Return list of release names on host. - - - -### release_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L58) - -Return release path. - - - -### release_revision -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L69) - -Current release revision. Usually a git hash. - - - -### release_or_current_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L75) - -Return the release path during a deployment -but fallback to the current path otherwise. - - - - -## Tasks - -### deploy:release -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L82) - -Prepares release. - -Clean up unfinished releases and prepare next release - - -### releases -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/release.php#L149) - -Shows releases list. - -Example output: -``` -+---------------------+------example.org ------------+--------+-----------+ -| Date (UTC) | Release | Author | Target | Commit | -+---------------------+-------------+----------------+--------+-----------+ -| 2021-11-06 20:51:45 | 1 | Anton Medvedev | HEAD | 34d24192e | -| 2021-11-06 21:00:50 | 2 (bad) | Anton Medvedev | HEAD | 392948a40 | -| 2021-11-06 23:19:20 | 3 | Anton Medvedev | HEAD | a4057a36c | -| 2021-11-06 23:24:30 | 4 (current) | Anton Medvedev | HEAD | s3wa45ca6 | -+---------------------+-------------+----------------+--------+-----------+ -``` - - diff --git a/docs/recipe/deploy/rollback.md b/docs/recipe/deploy/rollback.md deleted file mode 100644 index 273ec04c9..000000000 --- a/docs/recipe/deploy/rollback.md +++ /dev/null @@ -1,46 +0,0 @@ - - - - -# rollback - -[Source](/recipe/deploy/rollback.php) - - -## Configuration -### rollback_candidate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/rollback.php#L19) - -Rollback candidate automatically will be automatically chosen by -looking at output of `ls` command and content of `.dep/releases_log`. - -If rollback candidate marked as **BAD_RELEASE**, it will be skipped. - -:::tip -You can override rollback candidate via: -``` -dep rollback -o rollback_candidate=123 -``` -::: - - - - -## Tasks - -### rollback -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/rollback.php#L62) - -Rollbacks to the previous release. - -Uses [rollback_candidate](/docs/recipe/deploy/rollback.md#rollback_candidate) for symlinking. Current release will be marked as -bad by creating file **BAD_RELEASE** with timestamp and [user](/docs/recipe/common.md#user). - -:::warning -You can always manually symlink [current_path](/docs/recipe/common.md#current_path) to proper release. -``` -dep run '{{bin/symlink}} releases/123 {{current_path}}' -``` -::: - - diff --git a/docs/recipe/deploy/setup.md b/docs/recipe/deploy/setup.md deleted file mode 100644 index 0af45460d..000000000 --- a/docs/recipe/deploy/setup.md +++ /dev/null @@ -1,20 +0,0 @@ - - - - -# setup - -[Source](/recipe/deploy/setup.php) - - - -## Tasks - -### deploy:setup -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/setup.php#L5) - -Prepares host for deploy. - - - - diff --git a/docs/recipe/deploy/shared.md b/docs/recipe/deploy/shared.md deleted file mode 100644 index 57dafc1ca..000000000 --- a/docs/recipe/deploy/shared.md +++ /dev/null @@ -1,43 +0,0 @@ - - - - -# shared - -[Source](/recipe/deploy/shared.php) - - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/shared.php#L12) - -List of dirs what will be shared between releases. -Each release will have symlink to those dirs stored in [deploy_path](/docs/recipe/common.md#deploy_path)/shared dir. -```php -set('shared_dirs', ['storage']); -``` - - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/shared.php#L19) - -List of files what will be shared between releases. -Each release will have symlink to those files stored in [deploy_path](/docs/recipe/common.md#deploy_path)/shared dir. -```php -set('shared_files', ['.env']); -``` - - - - -## Tasks - -### deploy:shared -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/shared.php#L22) - -Creates symlinks for shared files and dirs. - - - - diff --git a/docs/recipe/deploy/symlink.md b/docs/recipe/deploy/symlink.md deleted file mode 100644 index 6e97eac1c..000000000 --- a/docs/recipe/deploy/symlink.md +++ /dev/null @@ -1,28 +0,0 @@ - - - - -# symlink - -[Source](/recipe/deploy/symlink.php) - - -## Configuration -### use_atomic_symlink -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/symlink.php#L5) - -Use mv -T if available. Will check automatically. - - - - -## Tasks - -### deploy:symlink -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/symlink.php#L10) - -Creates symlink to release. - - - - diff --git a/docs/recipe/deploy/update_code.md b/docs/recipe/deploy/update_code.md deleted file mode 100644 index 8d191aa4a..000000000 --- a/docs/recipe/deploy/update_code.md +++ /dev/null @@ -1,82 +0,0 @@ - - - - -# update_code - -[Source](/recipe/deploy/update_code.php) - - -## Configuration -### branch -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L11) - -Determines which branch to deploy. Can be overridden with CLI option `--branch`. -If not specified, will get current git HEAD branch as default branch to deploy. - -```php title="Default value" -'HEAD' -``` - - -### target -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L18) - -The deploy target: a branch, a tag or a revision. - - - -### update_code_strategy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L47) - -Sets deploy:update_code strategy. -Can be one of: -- archive -- clone (if you need `.git` dir in your [release_path](/docs/recipe/deploy/release.md#release_path)) - -```php title="Default value" -'archive' -``` - - -### git_ssh_command -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L53) - -Sets environment variable _GIT_SSH_COMMAND_ for `git clone` command. -If `StrictHostKeyChecking` flag is set to `accept-new` then ssh will -automatically add new host keys to the user known hosts files, but -will not permit connections to hosts with changed host keys. - -```php title="Default value" -'ssh -o StrictHostKeyChecking=accept-new' -``` - - -### sub_directory -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L65) - -Specifies a sub directory within the repository to deploy. -Works only when [`update_code_strategy`](#update_code_strategy) is set to `archive` (default). - -Example: - - set value to `src` if you want to deploy the folder that lives at `/src/api`. - - set value to `src/api` if you want to deploy the folder that lives at `/src/api`. - -Note: do not use a leading `/`! - -```php title="Default value" -false -``` - - - -## Tasks - -### deploy:update_code -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/update_code.php#L71) - -Updates code. - -Update code at [release_path](/docs/recipe/deploy/release.md#release_path) on host. - - diff --git a/docs/recipe/deploy/vendors.md b/docs/recipe/deploy/vendors.md deleted file mode 100644 index 34c1c5f37..000000000 --- a/docs/recipe/deploy/vendors.md +++ /dev/null @@ -1,50 +0,0 @@ - - - - -# vendors - -[Source](/recipe/deploy/vendors.php) - - -## Configuration -### composer_action -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/vendors.php#L4) - - - -```php title="Default value" -'install' -``` - - -### composer_options -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/vendors.php#L6) - - - -```php title="Default value" -'--verbose --prefer-dist --no-progress --no-interaction --no-dev --optimize-autoloader' -``` - - -### bin/composer -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/vendors.php#L11) - -Returns Composer binary path in found. Otherwise try to install latest -composer version to `.dep/composer.phar`. To use specific composer version -download desired phar and place it at `.dep/composer.phar`. - - - - -## Tasks - -### deploy:vendors -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/vendors.php#L27) - -Installs vendors. - - - - diff --git a/docs/recipe/deploy/writable.md b/docs/recipe/deploy/writable.md deleted file mode 100644 index a81187d8c..000000000 --- a/docs/recipe/deploy/writable.md +++ /dev/null @@ -1,88 +0,0 @@ - - - - -# writable - -[Source](/recipe/deploy/writable.php) - - -## Configuration -### http_user -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L8) - - - - - -### http_group -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L25) - -Used to make a writable directory by a server. -Used in `chgrp` mode of [writable_mode](/docs/recipe/deploy/writable.md#writable_mode) only. -Attempts automatically to detect http user in process list. - - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L40) - -List of writable dirs. - - - -### writable_mode -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L47) - -One of: -- chown -- chgrp -- chmod -- acl - -```php title="Default value" -'acl' -``` - - -### writable_use_sudo -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L50) - -Using sudo in writable commands? - -```php title="Default value" -false -``` - - -### writable_recursive -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L53) - -Use recursive mode (-R)? - -```php title="Default value" -false -``` - - -### writable_chmod_mode -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L56) - -The chmod mode. - -```php title="Default value" -'0755' -``` - - - -## Tasks - -### deploy:writable -[Source](https://github.com/deployphp/deployer/blob/master/recipe/deploy/writable.php#L59) - -Makes writable dirs. - - - - diff --git a/docs/recipe/drupal7.md b/docs/recipe/drupal7.md deleted file mode 100644 index 1de18af15..000000000 --- a/docs/recipe/drupal7.md +++ /dev/null @@ -1,96 +0,0 @@ - - - - -# drupal7 - -[Source](/recipe/drupal7.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### drupal_site -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L14) - -Set Drupal 7 site. Change if you use different site - -```php title="Default value" -'default' -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L17) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Drupal 7 shared dirs - -```php title="Default value" -[ - 'sites/{{drupal_site}}/files', -] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L22) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -Drupal 7 shared files - -```php title="Default value" -[ - 'sites/{{drupal_site}}/settings.php', -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L27) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Drupal 7 writable dirs - -```php title="Default value" -[ - 'sites/{{drupal_site}}/files', -] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L8) - - - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - -### drupal:settings -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L33) - - - -Create and upload Drupal 7 settings.php using values from secrets - - -### drupal:upload_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal7.php#L75) - - - -Upload Drupal 7 files folder - - diff --git a/docs/recipe/drupal8.md b/docs/recipe/drupal8.md deleted file mode 100644 index d20c81cfb..000000000 --- a/docs/recipe/drupal8.md +++ /dev/null @@ -1,81 +0,0 @@ - - - - -# drupal8 - -[Source](/recipe/drupal8.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### drupal_site -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal8.php#L14) - -Set drupal site. Change if you use different site - -```php title="Default value" -'default' -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal8.php#L18) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Drupal 8 shared dirs - -```php title="Default value" -[ - 'sites/{{drupal_site}}/files', -] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal8.php#L23) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -Drupal 8 shared files - -```php title="Default value" -[ - 'sites/{{drupal_site}}/settings.php', - 'sites/{{drupal_site}}/services.yml', -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal8.php#L29) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Drupal 8 Writable dirs - -```php title="Default value" -[ - 'sites/{{drupal_site}}/files', -] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/drupal8.php#L8) - - - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/flow_framework.md b/docs/recipe/flow_framework.md deleted file mode 100644 index 754098de0..000000000 --- a/docs/recipe/flow_framework.md +++ /dev/null @@ -1,83 +0,0 @@ - - - - -# flow_framework - -[Source](/recipe/flow_framework.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### flow_context -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L9) - -Flow-Framework application-context - -```php title="Default value" -'Production' -``` - - -### flow_command -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L12) - -Flow-Framework cli-command - -```php title="Default value" -'flow' -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L15) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Flow-Framework shared directories - -```php title="Default value" -[ - 'Data/Persistent', - 'Data/Logs', - 'Configuration/{{flow_context}}' -] -``` - - - -## Tasks - -### deploy:run_migrations -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L25) - -Applies database migrations. - -Apply database migrations - - -### deploy:publish_resources -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L33) - -Publishes resources. - -Publish resources - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/flow_framework.php#L41) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:run_migrations](/docs/recipe/flow_framework.md#deployrun_migrations) -* [deploy:publish_resources](/docs/recipe/flow_framework.md#deploypublish_resources) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/fuelphp.md b/docs/recipe/fuelphp.md deleted file mode 100644 index b5416c2f1..000000000 --- a/docs/recipe/fuelphp.md +++ /dev/null @@ -1,43 +0,0 @@ - - - - -# fuelphp - -[Source](/recipe/fuelphp.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/fuelphp.php#L9) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -FuelPHP 1.x shared dirs - -```php title="Default value" -[ - 'fuel/app/cache', 'fuel/app/logs', -] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/fuelphp.php#L17) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/joomla.md b/docs/recipe/joomla.md deleted file mode 100644 index bfbc871ca..000000000 --- a/docs/recipe/joomla.md +++ /dev/null @@ -1,64 +0,0 @@ - - - - -# joomla - -[Source](/recipe/joomla.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/joomla.php#L8) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['configuration.php'] -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/joomla.php#L9) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['images'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/joomla.php#L10) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -['images'] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/joomla.php#L13) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/laravel.md b/docs/recipe/laravel.md deleted file mode 100644 index 5a4d32018..000000000 --- a/docs/recipe/laravel.md +++ /dev/null @@ -1,386 +0,0 @@ - - - - -# laravel - -[Source](/recipe/laravel.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L8) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['storage'] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L9) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['.env'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L10) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -[ - 'bootstrap/cache', - 'storage', - 'storage/app', - 'storage/app/public', - 'storage/framework', - 'storage/framework/cache', - 'storage/framework/sessions', - 'storage/framework/views', - 'storage/logs', -] -``` - - -### log_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L21) - - - -```php title="Default value" -'storage/logs/*.log' -``` - - -### laravel_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L22) - - - - - - -## Tasks - -### artisan:down -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L89) - -Puts the application into maintenance / demo mode. - - - - -### artisan:up -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L92) - -Brings the application out of maintenance mode. - - - - -### artisan:​key:generate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L99) - -Sets the application key. - - - - -### artisan:passport:keys -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L102) - -Creates the encryption keys for API authentication. - - - - -### artisan:db:seed -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L109) - -Seeds the database with records. - - - - -### artisan:migrate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L112) - -Runs the database migrations. - - - - -### artisan:migrate:fresh -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L115) - -Drops all tables and re-run all migrations. - - - - -### artisan:migrate:rollback -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L118) - -Rollbacks the last database migration. - - - - -### artisan:migrate:status -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L121) - -Shows the status of each migration. - - - - -### artisan:cache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L128) - -Flushes the application cache. - - - - -### artisan:config:cache -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L131) - -Creates a cache file for faster configuration loading. - - - - -### artisan:config:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L134) - -Removes the configuration cache file. - - - - -### artisan:event:cache -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L137) - -Discovers and cache the application\'s events and listeners. - - - - -### artisan:event:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L140) - -Clears all cached events and listeners. - - - - -### artisan:event:list -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L143) - -Lists the application\'s events and listeners. - - - - -### artisan:optimize -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L146) - -Cache the framework bootstrap files. - - - - -### artisan:optimize:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L149) - -Removes the cached bootstrap files. - - - - -### artisan:route:cache -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L152) - -Creates a route cache file for faster route registration. - - - - -### artisan:route:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L155) - -Removes the route cache file. - - - - -### artisan:route:list -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L158) - -Lists all registered routes. - - - - -### artisan:storage:link -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L161) - -Creates the symbolic links configured for the application. - - - - -### artisan:view:cache -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L164) - -Compiles all of the application\'s Blade templates. - - - - -### artisan:view:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L167) - -Clears all compiled view files. - - - - -### artisan:queue:failed -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L174) - -Lists all of the failed queue jobs. - - - - -### artisan:queue:flush -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L177) - -Flushes all of the failed queue jobs. - - - - -### artisan:queue:restart -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L180) - -Restarts queue worker daemons after their current job. - - - - -### artisan:horizon -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L183) - -Starts a master supervisor in the foreground. - - - - -### artisan:horizon:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L186) - -Deletes all of the jobs from the specified queue. - - - - -### artisan:horizon:continue -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L189) - -Instructs the master supervisor to continue processing jobs. - - - - -### artisan:horizon:list -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L192) - -Lists all of the deployed machines. - - - - -### artisan:horizon:pause -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L195) - -Pauses the master supervisor. - - - - -### artisan:horizon:purge -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L198) - -Terminates any rogue Horizon processes. - - - - -### artisan:horizon:status -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L201) - -Gets the current status of Horizon. - - - - -### artisan:horizon:terminate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L204) - -Terminates the master supervisor so it can be restarted. - - - - -### artisan:​telescope:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L211) - -Clears all entries from Telescope. - - - - -### artisan:​telescope:prune -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L214) - -Prunes stale entries from the Telescope database. - - - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/laravel.php#L220) - -Deploys your project. - -Main deploy task. - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [artisan:storage:link](/docs/recipe/laravel.md#artisanstoragelink) -* [artisan:config:cache](/docs/recipe/laravel.md#artisanconfigcache) -* [artisan:route:cache](/docs/recipe/laravel.md#artisanroutecache) -* [artisan:view:cache](/docs/recipe/laravel.md#artisanviewcache) -* [artisan:event:cache](/docs/recipe/laravel.md#artisaneventcache) -* [artisan:migrate](/docs/recipe/laravel.md#artisanmigrate) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/magento.md b/docs/recipe/magento.md deleted file mode 100644 index f4cce52fe..000000000 --- a/docs/recipe/magento.md +++ /dev/null @@ -1,81 +0,0 @@ - - - - -# magento - -[Source](/recipe/magento.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L13) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Magento shared dirs - -```php title="Default value" -['var', 'media'] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L16) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -Magento shared files - -```php title="Default value" -['app/etc/local.xml'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L19) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Magento writable dirs - -```php title="Default value" -['var', 'media'] -``` - - - -## Tasks - -### deploy:cache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L25) - -Clears cache. - -Clear cache - - -### deploy:clear_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L32) - - - -Remove files that can be used to compromise Magento - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento.php#L46) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:cache:clear](/docs/recipe/magento.md#deploycacheclear) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/magento2.md b/docs/recipe/magento2.md deleted file mode 100644 index aaea6bf9e..000000000 --- a/docs/recipe/magento2.md +++ /dev/null @@ -1,266 +0,0 @@ - - - - -# magento2 - -[Source](/recipe/magento2.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### static_content_locales -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L20) - -By default setup:static-content:deploy uses `en_US`. -To change that, simply put `set('static_content_locales', 'en_US de_DE');` -in you deployer script. - -```php title="Default value" -'en_US' -``` - - -### magento_themes -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L26) - -You can also set the themes to run against. By default it'll deploy -all themes - `add('magento_themes', ['Magento/luma', 'Magento/backend']);` - -```php title="Default value" -[ - -] -``` - - -### static_content_jobs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L34) - -Also set the number of conccurent jobs to run. The default is 1 -Update using: `set('static_content_jobs', '1');` - -```php title="Default value" -'1' -``` - - -### content_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L36) - - - - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L40) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - 'app/etc/env.php', - 'var/.maintenance.ip', -] -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L44) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - 'var/composer_home', - 'var/log', - 'var/export', - 'var/report', - 'var/import', - 'var/import_history', - 'var/session', - 'var/importexport', - 'var/backups', - 'var/tmp', - 'pub/sitemap', - 'pub/media' -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L58) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -[ - 'var', - 'pub/static', - 'pub/media', - 'generated' -] -``` - - -### clear_paths -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L64) - -Overrides [clear_paths](/docs/recipe/deploy/clear_paths.md#clear_paths) from `recipe/deploy/clear_paths.php`. - - - -```php title="Default value" -[ - 'generated/*', - 'pub/static/_cache/*', - 'var/generation/*', - 'var/cache/*', - 'var/page_cache/*', - 'var/view_preprocessed/*' -] -``` - - -### magento_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L73) - - - - - -### maintenance_mode_status_active -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L80) - - - - - -### enable_zerodowntime -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L87) - -Deploy without setting maintenance mode if possible - -```php title="Default value" -true -``` - - - -## Tasks - -### magento:compile -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L91) - -Compiles magento di. - -Tasks - - -### magento:deploy:assets -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L98) - -Deploys assets. - - - - -### magento:sync:content_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L111) - -Syncs content version. - - - - -### magento:maintenance:enable -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L121) - -Enables maintenance mode. - - - - -### magento:maintenance:disable -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L126) - -Disables maintenance mode. - - - - -### magento:config:import -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L131) - -Config Import. - - - - -### magento:upgrade:db -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L166) - -Upgrades magento database. - - - - -### magento:cache:flush -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L193) - -Flushes Magento Cache. - - - - -### deploy:magento -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L198) - -Magento2 deployment operations. - - - - -This task is group task which contains next tasks: -* [magento:build](/docs/recipe/magento2.md#magentobuild) -* [magento:config:import](/docs/recipe/magento2.md#magentoconfigimport) -* [magento:upgrade:db](/docs/recipe/magento2.md#magentoupgradedb) -* [magento:cache:flush](/docs/recipe/magento2.md#magentocacheflush) - - -### magento:build -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L206) - -Magento2 build operations. - - - - -This task is group task which contains next tasks: -* [magento:compile](/docs/recipe/magento2.md#magentocompile) -* [magento:deploy:assets](/docs/recipe/magento2.md#magentodeployassets) - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/magento2.php#L212) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:clear_paths](/docs/recipe/deploy/clear_paths.md#deployclear_paths) -* [deploy:magento](/docs/recipe/magento2.md#deploymagento) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/pimcore.md b/docs/recipe/pimcore.md deleted file mode 100644 index 1e1f90977..000000000 --- a/docs/recipe/pimcore.md +++ /dev/null @@ -1,51 +0,0 @@ - - - - -# pimcore - -[Source](/recipe/pimcore.php) - -* Requires - * [symfony](/docs/recipe/symfony.md) - - -## Tasks - -### pimcore:rebuild-classes -[Source](https://github.com/deployphp/deployer/blob/master/recipe/pimcore.php#L15) - -Rebuilds Pimcore Classes. - - - - -### pimcore:custom-layouts-rebuild -[Source](https://github.com/deployphp/deployer/blob/master/recipe/pimcore.php#L20) - -Creates Custom Layouts. - - - - -### pimcore:cache_clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/pimcore.php#L25) - -Removes cache. - - - - -### pimcore:deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/pimcore.php#L29) - - - - - - -This task is group task which contains next tasks: -* [pimcore:rebuild-classes](/docs/recipe/pimcore.md#pimcorerebuild-classes) -* [pimcore:custom-layouts-rebuild](/docs/recipe/pimcore.md#pimcorecustom-layouts-rebuild) - - diff --git a/docs/recipe/prestashop.md b/docs/recipe/prestashop.md deleted file mode 100644 index 3437b77c8..000000000 --- a/docs/recipe/prestashop.md +++ /dev/null @@ -1,90 +0,0 @@ - - - - -# prestashop - -[Source](/recipe/prestashop.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/prestashop.php#L8) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - 'config/settings.inc.php', - '.htaccess', -] -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/prestashop.php#L12) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - 'img', - 'log', - 'download', - 'upload', - 'translations', - 'mails', - 'themes/default-bootstrap/lang', - 'themes/default-bootstrap/mails', - 'themes/default-bootstrap/pdf/lang', -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/prestashop.php#L23) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -[ - 'img', - 'log', - 'cache', - 'download', - 'upload', - 'translations', - 'mails', - 'themes/default-bootstrap/lang', - 'themes/default-bootstrap/mails', - 'themes/default-bootstrap/pdf/lang', - 'themes/default-bootstrap/cache', -] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/prestashop.php#L38) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/provision.md b/docs/recipe/provision.md deleted file mode 100644 index 68d50f6ca..000000000 --- a/docs/recipe/provision.md +++ /dev/null @@ -1,150 +0,0 @@ - - - - -# provision - -[Source](/recipe/provision.php) - -* Requires - * [databases](/docs/recipe/provision/databases.md) - * [nodejs](/docs/recipe/provision/nodejs.md) - * [php](/docs/recipe/provision/php.md) - * [website](/docs/recipe/provision/website.md) - -## Configuration -### lsb_release -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L15) - -Name of lsb_release like: focal, bionic, etc. -As only Ubuntu 20.04 LTS is supported for provision should be the `focal`. - - - -### sudo_password -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L216) - - - - - -### ssh_copy_id -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L222) - -Specify which key to copy to server. -Set to `false` to disable copy of key. - -```php title="Default value" -'~/.ssh/id_rsa.pub' -``` - - - -## Tasks - -### provision -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L20) - -Provision the server. - - - - -This task is group task which contains next tasks: -* [provision:check](/docs/recipe/provision.md#provisioncheck) -* [provision:configure](/docs/recipe/provision.md#provisionconfigure) -* [provision:update](/docs/recipe/provision.md#provisionupdate) -* [provision:upgrade](/docs/recipe/provision.md#provisionupgrade) -* [provision:install](/docs/recipe/provision.md#provisioninstall) -* [provision:ssh](/docs/recipe/provision.md#provisionssh) -* [provision:firewall](/docs/recipe/provision.md#provisionfirewall) -* [provision:deployer](/docs/recipe/provision.md#provisiondeployer) -* [provision:server](/docs/recipe/provision.md#provisionserver) -* [provision:php](/docs/recipe/provision/php.md#provisionphp) -* [provision:databases](/docs/recipe/provision/databases.md#provisiondatabases) -* [provision:composer](/docs/recipe/provision/php.md#provisioncomposer) -* [provision:npm](/docs/recipe/provision/nodejs.md#provisionnpm) -* [provision:website](/docs/recipe/provision/website.md#provisionwebsite) -* [provision:verify](/docs/recipe/provision.md#provisionverify) - - -### provision:check -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L39) - -Checks pre-required state. - - - - -### provision:configure -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L59) - -Collects required params. - - - - -### provision:update -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L82) - -Adds repositories and update. - - - - -### provision:upgrade -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L104) - -Upgrades all packages. - - - - -### provision:install -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L111) - -Installs packages. - - - - -### provision:server -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L145) - -Configures a server. - - - - -### provision:ssh -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L206) - -Configures the ssh. - - - - -### provision:deployer -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L225) - -Setups a deployer user. - - - - -### provision:firewall -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L272) - -Setups a firewall. - - - - -### provision:verify -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision.php#L280) - -Verifies what provision was successful. - - - - diff --git a/docs/recipe/provision/databases.md b/docs/recipe/provision/databases.md deleted file mode 100644 index f1cd0391b..000000000 --- a/docs/recipe/provision/databases.md +++ /dev/null @@ -1,73 +0,0 @@ - - - - -# databases - -[Source](/recipe/provision/databases.php) - - -## Configuration -### db_type -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L4) - - - - - -### db_name -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L14) - - - - - -### db_user -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L18) - - - - - -### db_password -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L22) - - - - - - -## Tasks - -### provision:databases -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L27) - -Provision databases. - - - - -### provision:mysql -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L37) - -Provision MySQL. - - - - -### provision:mariadb -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L48) - -Provision MariaDB. - - - - -### provision:postgresql -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/databases.php#L59) - -Provision PostgreSQL. - - - - diff --git a/docs/recipe/provision/nodejs.md b/docs/recipe/provision/nodejs.md deleted file mode 100644 index 1b93833e0..000000000 --- a/docs/recipe/provision/nodejs.md +++ /dev/null @@ -1,31 +0,0 @@ - - - - -# nodejs - -[Source](/recipe/provision/nodejs.php) - - -## Configuration -### nodejs_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/nodejs.php#L5) - -Node.js version from https://github.com/nodesource/distributions. - -```php title="Default value" -'node_16.x' -``` - - - -## Tasks - -### provision:npm -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/nodejs.php#L8) - -Installs npm packages. - - - - diff --git a/docs/recipe/provision/php.md b/docs/recipe/provision/php.md deleted file mode 100644 index a196f8799..000000000 --- a/docs/recipe/provision/php.md +++ /dev/null @@ -1,44 +0,0 @@ - - - - -# php - -[Source](/recipe/provision/php.php) - - -## Configuration -### php_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/php.php#L4) - - - - - - -## Tasks - -### provision:php -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/php.php#L9) - -Installs PHP packages. - - - - -### logs:php-fpm -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/php.php#L60) - -Shows php-fpm logs. - - - - -### provision:composer -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/php.php#L65) - -Installs Composer. - - - - diff --git a/docs/recipe/provision/website.md b/docs/recipe/provision/website.md deleted file mode 100644 index c453f6f66..000000000 --- a/docs/recipe/provision/website.md +++ /dev/null @@ -1,51 +0,0 @@ - - - - -# website - -[Source](/recipe/provision/website.php) - - -## Configuration -### domain -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/website.php#L4) - - - - - -### public_path -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/website.php#L8) - - - - - - -## Tasks - -### provision:website -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/website.php#L13) - -Provision website. - - - - -### logs:caddy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/website.php#L82) - -Shows caddy logs. - - - - -### logs:caddy:syslog -[Source](https://github.com/deployphp/deployer/blob/master/recipe/provision/website.php#L87) - -Shows caddy syslog. - - - - diff --git a/docs/recipe/shopware.md b/docs/recipe/shopware.md deleted file mode 100644 index 38beeac8d..000000000 --- a/docs/recipe/shopware.md +++ /dev/null @@ -1,212 +0,0 @@ - - - - -# shopware - -[Source](/recipe/shopware.php) - -* Requires - * [common](/docs/recipe/common.md) - - -## Usage - -Add {{repository}} to your _deploy.php_ file: - -```php -set('repository', 'git@github.com:shopware/production.git'); -``` - -:::note -Please remember that the installation must be modified so that it can be -[build without database](https://developer.shopware.com/docs/guides/hosting/installation-updates/deployments/build-w-o-db#compiling-the-storefront-without-database). -::: - - -## Configuration -### default_timeout -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L23) - -Overrides [default_timeout](/docs/recipe/common.md#default_timeout) from `recipe/common.php`. - - - - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L26) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -These files are shared among all releases. - -```php title="Default value" -[ - '.env', - 'install.lock', - 'public/.htaccess', - 'public/.user.ini', -] -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L34) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -These directories are shared among all releases. - -```php title="Default value" -[ - 'config/jwt', - 'files', - 'var/log', - 'public/media', - 'public/thumbnail', - 'public/sitemap', -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L45) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -These directories are made writable (the definition of "writable" requires attention). -Please note that the files in `config/jwt/*` receive special attention in the `sw:writable:jwt` task. - -```php title="Default value" -[ - 'config/jwt', - 'custom/plugins', - 'files', - 'public/bundles', - 'public/css', - 'public/fonts', - 'public/js', - 'public/media', - 'public/sitemap', - 'public/theme', - 'public/thumbnail', - 'var', -] -``` - - - -## Tasks - -### sw:cache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L61) - - - -This task remotely executes the `cache:clear` console command on the target server. - - -### sw:cache:warmup -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L67) - - - -This task remotely executes the cache warmup console commands on the target server, so that the first user, who -visits the website, doesn't have to wait for the cache to be built up. - - -### sw:database:migrate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L73) - - - -This task remotely executes the `database:migrate` console command on the target server. - - -### sw:plugin:refresh -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L77) - - - - - - -### sw:plugin:update:all -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L113) - - - - - - -### sw:writable:jwt -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L123) - - - - - - -### sw:deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L130) - - - -Grouped SW deploy tasks. - - -This task is group task which contains next tasks: -* [sw:database:migrate](/docs/recipe/shopware.md#swdatabasemigrate) -* [sw:plugin:refresh](/docs/recipe/shopware.md#swpluginrefresh) -* [sw:cache:clear](/docs/recipe/shopware.md#swcacheclear) -* [sw:plugin:update:all](/docs/recipe/shopware.md#swpluginupdateall) -* [sw:cache:clear](/docs/recipe/shopware.md#swcacheclear) - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L139) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [sw:deploy](/docs/recipe/shopware.md#swdeploy) -* [deploy:clear_paths](/docs/recipe/deploy/clear_paths.md#deployclear_paths) -* [sw:cache:warmup](/docs/recipe/shopware.md#swcachewarmup) -* [sw:writable:jwt](/docs/recipe/shopware.md#swwritablejwt) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - -### sw-build-without-db:get-remote-config -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L149) - - - - - - -### sw-build-without-db:build -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L175) - - - - - - -### sw-build-without-db -[Source](https://github.com/deployphp/deployer/blob/master/recipe/shopware.php#L179) - - - - - - -This task is group task which contains next tasks: -* [sw-build-without-db:get-remote-config](/docs/recipe/shopware.md#sw-build-without-dbget-remote-config) -* [sw-build-without-db:build](/docs/recipe/shopware.md#sw-build-without-dbbuild) - - diff --git a/docs/recipe/silverstripe.md b/docs/recipe/silverstripe.md deleted file mode 100644 index ba9ae3b3c..000000000 --- a/docs/recipe/silverstripe.md +++ /dev/null @@ -1,88 +0,0 @@ - - - - -# silverstripe - -[Source](/recipe/silverstripe.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_assets -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L12) - - - - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L21) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Silverstripe shared dirs - -```php title="Default value" -[ - '{{shared_assets}}' -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L26) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Silverstripe writable dirs - -```php title="Default value" -[ - '{{shared_assets}}' -] -``` - - -### silverstripe_cli_script -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L31) - -Silverstripe cli script - - - - -## Tasks - -### silverstripe:build -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L47) - -Runs /dev/build. - -Helper tasks - - -### silverstripe:buildflush -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L52) - -Runs /dev/build?flush=all. - - - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/silverstripe.php#L60) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [silverstripe:buildflush](/docs/recipe/silverstripe.md#silverstripebuildflush) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/statamic.md b/docs/recipe/statamic.md deleted file mode 100644 index 769ae3de9..000000000 --- a/docs/recipe/statamic.md +++ /dev/null @@ -1,176 +0,0 @@ - - - - -# statamic - -[Source](/recipe/statamic.php) - -* Requires - * [laravel](/docs/recipe/laravel.md) - -## Configuration -### statamic_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L15) - - - - - - -## Tasks - -### statamic:addons:discover -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L26) - -Rebuilds the cached addon package manifest. - - - - -### statamic:assets:generate-presets -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L33) - -Generates asset preset manipulations. - - - - -### statamic:assets:meta -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L36) - -Generates asset metadata files. - - - - -### statamic:git:commit -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L43) - -Git add and commit tracked content. - - - - -### statamic:glide:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L50) - -Clears the Glide image cache. - - - - -### statamic:responsive:generate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L57) - -Generates responsive images. - - - - -### statamic:responsive:regenerate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L60) - -Regenerate responsive images. - - - - -### statamic:search:insert -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L67) - -Inserts an item into its search indexes. - - - - -### statamic:search:update -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L70) - -Update a search index. - - - - -### statamic:stache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L77) - -Clears the "Stache" cache. - - - - -### statamic:stache:doctor -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L80) - -Diagnose any problems with the Stache. - - - - -### statamic:stache:refresh -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L83) - -Clears and rebuild the "Stache" cache. - - - - -### statamic:stache:warm -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L86) - -Builds the "Stache" cache. - - - - -### statamic:static:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L93) - -Clears the static page cache. - - - - -### statamic:static:warm -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L96) - -Warms the static cache by visiting all URLs. - - - - -### statamic:support:details -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L103) - -Outputs details helpful for support requests. - - - - -### statamic:updates:run -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L110) - -Runs update scripts from specific version. - - - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/statamic.php#L118) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [artisan:storage:link](/docs/recipe/laravel.md#artisanstoragelink) -* [artisan:cache:clear](/docs/recipe/laravel.md#artisancacheclear) -* [statamic:stache:clear](/docs/recipe/statamic.md#statamicstacheclear) -* [statamic:stache:warm](/docs/recipe/statamic.md#statamicstachewarm) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/sulu.md b/docs/recipe/sulu.md deleted file mode 100644 index 1b9b75970..000000000 --- a/docs/recipe/sulu.md +++ /dev/null @@ -1,46 +0,0 @@ - - - - -# sulu - -[Source](/recipe/sulu.php) - -* Requires - * [symfony](/docs/recipe/symfony.md) - -## Configuration -### bin/websiteconsole -[Source](https://github.com/deployphp/deployer/blob/master/recipe/sulu.php#L12) - - - - - - -## Tasks - -### phpcr:migrate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/sulu.php#L17) - -Migrates PHPCR. - - - - -### deploy:website:cache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/sulu.php#L22) - -Clears cache. - - - - -### deploy:website:cache:warmup -[Source](https://github.com/deployphp/deployer/blob/master/recipe/sulu.php#L27) - -Warmups cache. - - - - diff --git a/docs/recipe/symfony.md b/docs/recipe/symfony.md deleted file mode 100644 index db34c525c..000000000 --- a/docs/recipe/symfony.md +++ /dev/null @@ -1,137 +0,0 @@ - - - - -# symfony - -[Source](/recipe/symfony.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### symfony_version -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L8) - - - - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L14) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - 'var/log', -] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L18) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -[ - '.env.local' -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L22) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -[ - 'var', - 'var/cache', - 'var/log', - 'var/sessions', -] -``` - - -### migrations_config -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L29) - - - - - -### doctrine_schema_validate_config -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L31) - - - - - -### bin/console -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L33) - - - -```php title="Default value" -'{{bin/php}} {{release_or_current_path}}/bin/console' -``` - - -### console_options -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L35) - - - - - - -## Tasks - -### database:migrate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L40) - -Migrates database. - - - - -### doctrine:schema:validate -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L50) - -Validate the Doctrine mapping files. - - - - -### deploy:cache:clear -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L55) - -Clears cache. - - - - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/symfony.php#L64) - -Deploys project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:cache:clear](/docs/recipe/symfony.md#deploycacheclear) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/typo3.md b/docs/recipe/typo3.md deleted file mode 100644 index 8c85e5e51..000000000 --- a/docs/recipe/typo3.md +++ /dev/null @@ -1,86 +0,0 @@ - - - - -# typo3 - -[Source](/recipe/typo3.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### typo3_webroot -[Source](https://github.com/deployphp/deployer/blob/master/recipe/typo3.php#L11) - -DocumentRoot / WebRoot for the TYPO3 installation - -```php title="Default value" -'Web' -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/typo3.php#L26) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Shared directories - -```php title="Default value" -[ - '{{typo3_webroot}}/fileadmin', - '{{typo3_webroot}}/typo3temp', - '{{typo3_webroot}}/uploads' -] -``` - - -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/typo3.php#L35) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - -Shared files - -```php title="Default value" -[ - '{{typo3_webroot}}/.htaccess' -] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/typo3.php#L42) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Writeable directories - -```php title="Default value" -[ - '{{typo3_webroot}}/fileadmin', - '{{typo3_webroot}}/typo3temp', - '{{typo3_webroot}}/typo3conf', - '{{typo3_webroot}}/uploads' -] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/typo3.php#L17) - -Deploys your project. - -Main TYPO3 task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/wordpress.md b/docs/recipe/wordpress.md deleted file mode 100644 index 4b28a589d..000000000 --- a/docs/recipe/wordpress.md +++ /dev/null @@ -1,64 +0,0 @@ - - - - -# wordpress - -[Source](/recipe/wordpress.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_files -[Source](https://github.com/deployphp/deployer/blob/master/recipe/wordpress.php#L8) - -Overrides [shared_files](/docs/recipe/deploy/shared.md#shared_files) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['wp-config.php'] -``` - - -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/wordpress.php#L9) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - - - -```php title="Default value" -['wp-content/uploads'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/wordpress.php#L10) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - - - -```php title="Default value" -['wp-content/uploads'] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/wordpress.php#L13) - -Deploys your project. - - - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/yii.md b/docs/recipe/yii.md deleted file mode 100644 index fba2df59c..000000000 --- a/docs/recipe/yii.md +++ /dev/null @@ -1,53 +0,0 @@ - - - - -# yii - -[Source](/recipe/yii.php) - -* Requires - * [common](/docs/recipe/common.md) - -## Configuration -### shared_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/yii.php#L9) - -Overrides [shared_dirs](/docs/recipe/deploy/shared.md#shared_dirs) from `recipe/deploy/shared.php`. - -Yii shared dirs - -```php title="Default value" -['runtime'] -``` - - -### writable_dirs -[Source](https://github.com/deployphp/deployer/blob/master/recipe/yii.php#L12) - -Overrides [writable_dirs](/docs/recipe/deploy/writable.md#writable_dirs) from `recipe/deploy/writable.php`. - -Yii writable dirs - -```php title="Default value" -['runtime'] -``` - - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/yii.php#L18) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/recipe/zend_framework.md b/docs/recipe/zend_framework.md deleted file mode 100644 index e3391befc..000000000 --- a/docs/recipe/zend_framework.md +++ /dev/null @@ -1,28 +0,0 @@ - - - - -# zend_framework - -[Source](/recipe/zend_framework.php) - -* Requires - * [common](/docs/recipe/common.md) - - -## Tasks - -### deploy -[Source](https://github.com/deployphp/deployer/blob/master/recipe/zend_framework.php#L12) - -Deploys your project. - -Main task - - -This task is group task which contains next tasks: -* [deploy:prepare](/docs/recipe/common.md#deployprepare) -* [deploy:vendors](/docs/recipe/deploy/vendors.md#deployvendors) -* [deploy:publish](/docs/recipe/common.md#deploypublish) - - diff --git a/docs/sidebar.js b/docs/sidebar.js deleted file mode 100644 index 6c9281922..000000000 --- a/docs/sidebar.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = [ - 'installation', - 'getting-started', - 'basics', - { - type: 'category', - label: 'Main Concepts', - items: [ - 'hosts', - 'tasks', - ], - }, - 'ci-cd', - 'yaml', - 'cli', - 'api', - { - type: 'category', - label: 'Other', - items: [ - 'avoid-php-fpm-reloading', - 'UPGRADE', - 'KNOWN_BUGS', - ], - }, -] diff --git a/docs/tasks.md b/docs/tasks.md deleted file mode 100644 index 9657178e9..000000000 --- a/docs/tasks.md +++ /dev/null @@ -1,135 +0,0 @@ -# Tasks - -Define a tasks by using the [task](api.md#task) function. Also, you can give a description -for a task with the [desc](api.md#desc) function called before _task_: - -```php -desc('My task'); -task('my_task', function () { - .... -}); -``` - -To get the task or override task config call the _task_ function without second argument: - -```php -task('my_task')->disable(); -``` - - -## Task config - -### desc() - -Sets task's description. - -```php -task('deploy', function () { - // ... -})->desc('Task description'); -``` - -Same as using [desc()](api.md#desc) func helper: - -```php -desc('Task description'); -task('deploy', function () { - // ... -}); -``` - -### once() - -Sets the task to run only on one of selected hosts. - -### oncePerNode() - -Sets the task to run only on **one node** of selected hosts. - -Node determined by [hostname](hosts.md#hostname). For example a few different -hosts can be deploying to one physical machine (uniq hostname). - -```php -host('foo')->setHostname('example.com'); -host('bar')->setHostname('example.com'); -host('pro')->setHostname('another.com'); - -task('apt:update', function () { - // This task will be executed twise, only on "foo" and "pro" hosts. - run('apt-get update'); -})->oncePerNode(); -``` - -### hidden() - -Hides task from CLI usage page. - -### addBefore() - -Adds before hook to the task. - -### addAfter() - -Adds after hook to the task. - -### limit() - -Limits number of hosts the task will be executed in parallel. - -Default is unlimited (runs the task on all host in parallel). - -### select() - -Sets task's host selector. - -### addSelector() - -Adds task's selector. - -### verbose() - -Makes task always verbose. As if `-v` option persists. - -### disable() - -Disables the task. Task will not be executed. - -### enable() - -Enables the task. - - -## Task grouping - -You can combine tasks in groups: - -```php -task('deploy', [ - 'deploy:prepare', - 'deploy:update_code', - 'deploy:vendors', - 'deploy:symlink', - 'cleanup' -]); -``` - -## Task hooks - -You can define tasks to be run before or after specific tasks. - -```php -task('deploy:done', function () { - write('Deploy done!'); -}); - -after('deploy', 'deploy:done'); -``` - -After the `deploy` task executed, `deploy:done` will be triggered. - -:::note -You can see which hooks is enabled via **dep tree** command. -``` -dep tree deploy -``` -::: diff --git a/docs/yaml.md b/docs/yaml.md deleted file mode 100644 index dfaba6ffd..000000000 --- a/docs/yaml.md +++ /dev/null @@ -1,31 +0,0 @@ -# YAML - -Deployer supports recipes written in YAML. For validating structure, Deployer uses -JSON Schema declared in [schema.json](https://github.com/deployphp/deployer/blob/master/src/schema.json). - -Here is an example of YAML recipe: - -```yaml -import: - - recipe/laravel.php - -config: - repository: 'git@github.com:example/example.com.git' - remote_user: deployer - -hosts: - example.com: - deploy_path: '~/example' - -tasks: - build: - - cd: '{{release_path}}' - - run: 'npm run build' - -after: - deploy:failed: deploy:unlock -``` - -YAML recipes can include recipes written in PHP. For example, some tasks maybe written in PHP and imported in YAML. - -Also, other way around is possible: import YAML recipe from PHP. Use [import()](api.md#import) function for that. diff --git a/recipe/cakephp.php b/recipe/cakephp.php deleted file mode 100644 index 451d1a995..000000000 --- a/recipe/cakephp.php +++ /dev/null @@ -1,48 +0,0 @@ -desc('Initialization'); - -/** - * Run migrations - */ -task('deploy:run_migrations', function () { - run('{{bin/php}} {{release_or_current_path}}/bin/cake.php migrations migrate --no-lock'); - run('{{bin/php}} {{release_or_current_path}}/bin/cake.php schema_cache build'); -})->desc('Run migrations'); - -/** - * Main task - */ -task('deploy', [ - 'deploy:prepare', - 'deploy:vendors', - 'deploy:init', - 'deploy:run_migrations', - 'deploy:publish', -])->desc('Deploy your project'); diff --git a/recipe/codeigniter.php b/recipe/codeigniter.php deleted file mode 100644 index 086271152..000000000 --- a/recipe/codeigniter.php +++ /dev/null @@ -1,22 +0,0 @@ - 'something', - * ]); - * ``` - * - * It is possible to override it per `run()` call. - * - * ```php - * run('echo $KEY', env: ['KEY' => 'over']); - * ``` - */ -set('env', []); - -/** - * Path to `.env` file which will be used as environment variables for each command per `run()`. - * - * ```php - * set('dotenv', '{{current_path}}/.env'); - * ``` - */ -set('dotenv', false); - -/** - * The deploy path. - * - * For example can be set for a bunch of host once as: - * ```php - * set('deploy_path', '~/{{alias}}'); - * ``` - */ -set('deploy_path', function () { - throw new ConfigurationException('Please, specify `deploy_path`.'); -}); - -/** - * Return current release path. Default to {{deploy_path}}/`current`. - * ```php - * set('current_path', '/var/public_html'); - * ``` - */ -set('current_path', '{{deploy_path}}/current'); - -// Path to the `php` bin. -set('bin/php', function () { - if (currentHost()->hasOwn('php_version')) { - return '/usr/bin/php{{php_version}}'; - } - return which('php'); -}); - -// Path to the `git` bin. -set('bin/git', function () { - return which('git'); -}); - -// Should {{bin/symlink}} use `--relative` option or not. Will detect -// automatically. -set('use_relative_symlink', function () { - return commandSupportsOption('ln', '--relative'); -}); - -// Path to the `ln` bin. With predefined options `-nfs`. -set('bin/symlink', function () { - return get('use_relative_symlink') ? 'ln -nfs --relative' : 'ln -nfs'; -}); - -// Path to a file which will store temp script with sudo password. -// Defaults to `.dep/sudo_pass`. This script is only temporary and will be deleted after -// sudo command executed. -set('sudo_askpass', function () { - if (test('[ -d {{deploy_path}}/.dep ]')) { - return '{{deploy_path}}/.dep/sudo_pass'; - } else { - return '/tmp/dep_sudo_pass'; - } -}); - -desc('Prepares a new release'); -task('deploy:prepare', [ - 'deploy:info', - 'deploy:setup', - 'deploy:lock', - 'deploy:release', - 'deploy:update_code', - 'deploy:shared', - 'deploy:writable', -]); - -desc('Publishes the release'); -task('deploy:publish', [ - 'deploy:symlink', - 'deploy:unlock', - 'deploy:cleanup', - 'deploy:success', -]); - -/** - * Prints success message - */ -task('deploy:success', function () { - info('successfully deployed!'); -}) - ->hidden(); - - -/** - * Hook on deploy failure. - */ -task('deploy:failed', function () { -}) - ->hidden(); - -fail('deploy', 'deploy:failed'); - -/** - * Follows latest application logs. - */ -desc('Shows application logs'); -task('logs:app', function () { - if (!has('log_files')) { - warning("Please, specify \"log_files\" option."); - return; - } - cd('{{current_path}}'); - run('tail -f {{log_files}}'); -})->verbose(); diff --git a/recipe/composer.php b/recipe/composer.php deleted file mode 100644 index 4021b3c60..000000000 --- a/recipe/composer.php +++ /dev/null @@ -1,13 +0,0 @@ - contao-manager/login.lock'); -}); - -desc('Enable maintenance mode'); -task('contao:maintenance:enable', function () { - // Enable maintenance mode in both the current and release build, so that the maintenance mode will be enabled - // for the current installation before the symlink changes and the new installation after the symlink changed. - foreach (array_unique([parse('{{current_path}}'), parse('{{release_or_current_path}}')]) as $path) { - // The current path might not be present during first deploy. - if (!test("[ -d $path ]")) { - continue; - } - - cd($path); - run('{{bin/console}} contao:maintenance-mode enable {{console_options}}'); - } -}); - -desc('Disable maintenance mode'); -task('contao:maintenance:disable', function () { - foreach (array_unique([parse('{{current_path}}'), parse('{{release_or_current_path}}')]) as $path) { - if (!test("[ -d $path ]")) { - continue; - } - - cd($path); - run('{{bin/console}} contao:maintenance-mode disable {{console_options}}'); - } -}); - -desc('Deploy the project'); -task('deploy', [ - 'deploy:prepare', - 'deploy:vendors', - 'contao:maintenance:enable', - 'contao:migrate', - 'contao:maintenance:disable', - 'deploy:publish', -]); diff --git a/recipe/deploy/check_remote.php b/recipe/deploy/check_remote.php deleted file mode 100644 index 350680b6a..000000000 --- a/recipe/deploy/check_remote.php +++ /dev/null @@ -1,49 +0,0 @@ -getOption('revision'); - - if (!$targetRevision) { - $ref = 'HEAD'; - $opt = ''; - if ($tag = input()->getOption('tag')) { - $ref = $tag; - $opt = '--tags'; - } elseif ($branch = get('branch')) { - $ref = $branch; - $opt = '--heads'; - } - $remoteLs = runLocally("git ls-remote $opt $repository $ref"); - if (strstr($remoteLs, "\n")) { - throw new Exception("Could not determine target revision. '$ref' matched multiple commits."); - } - if (!$remoteLs) { - throw new Exception("Could not resolve a revision from '$ref'."); - } - $targetRevision = substr($remoteLs, 0, strpos($remoteLs, "\t")); - } - - // Compare commit hashes. We use strpos to support short versions. - $targetRevision = trim($targetRevision); - $lastDeployedRevision = run('cat {{current_path}}/REVISION'); - if ($targetRevision && strpos($lastDeployedRevision, $targetRevision) === 0) { - throw new GracefulShutdownException("Already up-to-date."); - } - - info("deployed different version"); -}); diff --git a/recipe/deploy/cleanup.php b/recipe/deploy/cleanup.php deleted file mode 100644 index dfc6fe0cc..000000000 --- a/recipe/deploy/cleanup.php +++ /dev/null @@ -1,20 +0,0 @@ - 0) { - foreach (array_slice($releases, $keep) as $release) { - run("$sudo rm -rf {{deploy_path}}/releases/$release"); - } - } -}); diff --git a/recipe/deploy/clear_paths.php b/recipe/deploy/clear_paths.php deleted file mode 100644 index 938f3da5f..000000000 --- a/recipe/deploy/clear_paths.php +++ /dev/null @@ -1,24 +0,0 @@ -{{target}}"); -}); diff --git a/recipe/deploy/lock.php b/recipe/deploy/lock.php deleted file mode 100644 index f436ab728..000000000 --- a/recipe/deploy/lock.php +++ /dev/null @@ -1,32 +0,0 @@ - {{deploy_path}}/.dep/deploy.lock"); - if ($locked === '+locked') { - $lockedUser = run("cat {{deploy_path}}/.dep/deploy.lock"); - throw new GracefulShutdownException( - "Deploy locked by $lockedUser.\n" . - "Execute \"deploy:unlock\" task to unlock." - ); - } -}); - -desc('Unlocks deploy'); -task('deploy:unlock', function () { - run("rm -f {{deploy_path}}/.dep/deploy.lock");//always success -}); - -desc('Checks if deploy is locked'); -task('deploy:is_locked', function () { - $locked = test("[ -f {{deploy_path}}/.dep/deploy.lock ]"); - if ($locked) { - $lockedUser = run("cat {{deploy_path}}/.dep/deploy.lock"); - throw new GracefulShutdownException("Deploy is locked by $lockedUser."); - } - info('Deploy is unlocked.'); -}); diff --git a/recipe/deploy/push.php b/recipe/deploy/push.php deleted file mode 100644 index 1c51a90f5..000000000 --- a/recipe/deploy/push.php +++ /dev/null @@ -1,24 +0,0 @@ - false, 'options' => ['--relative']] - ); - - // Mark this release as dirty. - run("echo '{{user}}' > {{current_path}}/DIRTY_RELEASE"); -}); diff --git a/recipe/deploy/release.php b/recipe/deploy/release.php deleted file mode 100644 index ed09bbd00..000000000 --- a/recipe/deploy/release.php +++ /dev/null @@ -1,194 +0,0 @@ -= 0; --$i) { - $release = $releasesLog[$i]['release_name']; - if (in_array($release, $ll, true)) { - $releases[] = $release; - } - } - return $releases; -}); - -// Return release path. -set('release_path', function () { - $releaseExists = test('[ -h {{deploy_path}}/release ]'); - if ($releaseExists) { - $link = run("readlink {{deploy_path}}/release"); - return substr($link, 0, 1) === '/' ? $link : get('deploy_path') . '/' . $link; - } else { - throw new Exception(parse('The "release_path" ({{deploy_path}}/release) does not exist.')); - } -}); - -// Current release revision. Usually a git hash. -set('release_revision', function () { - return run('cat {{release_path}}/REVISION'); -}); - -// Return the release path during a deployment -// but fallback to the current path otherwise. -set('release_or_current_path', function () { - $releaseExists = test('[ -h {{deploy_path}}/release ]'); - return $releaseExists ? get('release_path') : get('current_path'); -}); - -// Clean up unfinished releases and prepare next release -desc('Prepares release'); -task('deploy:release', function () { - cd('{{deploy_path}}'); - - // Clean up if there is unfinished release. - if (test('[ -h release ]')) { - run('rm -rf "$(readlink release)"'); // Delete release. - run('rm release'); // Delete symlink. - } - - // We need to get releases_list at same point as release_name, - // as standard release_name's implementation depends on it and, - // if user overrides it, we need to get releases_list manually. - $releasesList = get('releases_list'); - $releaseName = get('release_name'); - $releasePath = "releases/$releaseName"; - - // Check what there is no such release path. - if (test("[ -d $releasePath ]")) { - throw new Exception("Release name \"$releaseName\" already exists.\nRelease name can be overridden via:\n dep deploy -o release_name=$releaseName"); - } - - // Save release_name. - if (is_numeric($releaseName) && is_integer(intval($releaseName))) { - run("echo $releaseName > .dep/latest_release"); - } - - // Metainfo. - $timestamp = timestamp(); - $metainfo = [ - 'created_at' => $timestamp, - 'release_name' => $releaseName, - 'user' => get('user'), - 'target' => get('target'), - ]; - - // Save metainfo about release. - $json = json_encode($metainfo); - run("echo '$json' >> .dep/releases_log"); - - // Make new release. - run("mkdir -p $releasePath"); - run("{{bin/symlink}} $releasePath {{deploy_path}}/release"); - - // Add to releases list. - array_unshift($releasesList, $releaseName); - set('releases_list', $releasesList); - - // Set previous_release. - if (isset($releasesList[1])) { - set('previous_release', "{{deploy_path}}/releases/{$releasesList[1]}"); - } -}); - -desc('Shows releases list'); -/* - * Example output: - * ``` - * +---------------------+------example.org ------------+--------+-----------+ - * | Date (UTC) | Release | Author | Target | Commit | - * +---------------------+-------------+----------------+--------+-----------+ - * | 2021-11-06 20:51:45 | 1 | Anton Medvedev | HEAD | 34d24192e | - * | 2021-11-06 21:00:50 | 2 (bad) | Anton Medvedev | HEAD | 392948a40 | - * | 2021-11-06 23:19:20 | 3 | Anton Medvedev | HEAD | a4057a36c | - * | 2021-11-06 23:24:30 | 4 (current) | Anton Medvedev | HEAD | s3wa45ca6 | - * +---------------------+-------------+----------------+--------+-----------+ - * ``` - */ -task('releases', function () { - cd('{{deploy_path}}'); - - $releasesLog = get('releases_log'); - $currentRelease = basename(run('readlink {{current_path}}')); - $releasesList = get('releases_list'); - - $table = []; - $tz = !empty(getenv('TIMEZONE')) ? getenv('TIMEZONE') : date_default_timezone_get(); - - foreach ($releasesLog as &$metainfo) { - $date = \DateTime::createFromFormat(\DateTimeInterface::ISO8601, $metainfo['created_at']); - $date->setTimezone(new \DateTimeZone($tz)); - $status = $release = $metainfo['release_name']; - if (in_array($release, $releasesList, true)) { - if (test("[ -f releases/$release/BAD_RELEASE ]")) { - $status = "$release (bad)"; - } else if (test("[ -f releases/$release/DIRTY_RELEASE ]")) { - $status = "$release (dirty)"; - } else { - $status = "$release"; - } - } - if ($release === $currentRelease) { - $status .= ' (current)'; - } - try { - $revision = run("cat releases/$release/REVISION"); - } catch (\Throwable $e) { - $revision = 'unknown'; - } - $table[] = [ - $date->format("Y-m-d H:i:s"), - $status, - $metainfo['user'], - $metainfo['target'], - $revision, - ]; - } - - (new Table(output())) - ->setHeaderTitle(currentHost()->getAlias()) - ->setHeaders(["Date ($tz)", 'Release', 'Author', 'Target', 'Commit']) - ->setRows($table) - ->render(); -}); diff --git a/recipe/deploy/rollback.php b/recipe/deploy/rollback.php deleted file mode 100644 index b851e0a4f..000000000 --- a/recipe/deploy/rollback.php +++ /dev/null @@ -1,90 +0,0 @@ -$currentRelease."); - - if (!test("[ -d releases/$candidate ]")) { - throw new \RuntimeException(parse("Release \"$candidate\" not found in \"{{deploy_path}}/releases\".")); - } - if (test("[ -f releases/$candidate/BAD_RELEASE ]")) { - writeln("Candidate $candidate marked as bad release."); - if (!askConfirmation("Continue rollback to $candidate?")) { - writeln('Rollback aborted.'); - return; - } - } - writeln("Rolling back to $candidate release."); - - // Symlink to old release. - run("{{bin/symlink}} releases/$candidate {{current_path}}"); - - // Mark release as bad. - $timestamp = timestamp(); - run("echo '$timestamp,{{user}}' > releases/$currentRelease/BAD_RELEASE"); - - writeln("rollback to release $candidate was successful"); -}); diff --git a/recipe/deploy/setup.php b/recipe/deploy/setup.php deleted file mode 100644 index 84f1839c7..000000000 --- a/recipe/deploy/setup.php +++ /dev/null @@ -1,20 +0,0 @@ -getVerbosity() === OutputInterface::VERBOSITY_DEBUG ? 'v' : ''; - - foreach (get('shared_dirs') as $dir) { - // Make sure all path without tailing slash. - $dir = trim($dir, '/'); - - // Check if shared dir does not exist. - if (!test("[ -d $sharedPath/$dir ]")) { - // Create shared dir if it does not exist. - run("mkdir -p $sharedPath/$dir"); - // If release contains shared dir, copy that dir from release to shared. - if (test("[ -d $(echo {{release_path}}/$dir) ]")) { - run("cp -r$copyVerbosity {{release_path}}/$dir $sharedPath/" . dirname($dir)); - } - } - - // Remove from source. - run("rm -rf {{release_path}}/$dir"); - - // Create path to shared dir in release dir if it does not exist. - // Symlink will not create the path and will fail otherwise. - run("mkdir -p `dirname {{release_path}}/$dir`"); - - // Symlink shared dir to release dir - run("{{bin/symlink}} $sharedPath/$dir {{release_path}}/$dir"); - } - - foreach (get('shared_files') as $file) { - $dirname = dirname(parse($file)); - - // Create dir of shared file if not existing - if (!test("[ -d $sharedPath/$dirname ]")) { - run("mkdir -p $sharedPath/$dirname"); - } - - // Check if shared file does not exist in shared. - // and file exist in release - if (!test("[ -f $sharedPath/$file ]") && test("[ -f {{release_path}}/$file ]")) { - // Copy file in shared dir if not present - run("cp -r$copyVerbosity {{release_path}}/$file $sharedPath/$file"); - } - - // Remove from source. - run("if [ -f $(echo {{release_path}}/$file) ]; then rm -rf {{release_path}}/$file; fi"); - - // Ensure dir is available in release - run("if [ ! -d $(echo {{release_path}}/$dirname) ]; then mkdir -p {{release_path}}/$dirname;fi"); - - // Touch shared - run("[ -f $sharedPath/$file ] || touch $sharedPath/$file"); - - // Symlink shared dir to release dir - run("{{bin/symlink}} $sharedPath/$file {{release_path}}/$file"); - } -}); diff --git a/recipe/deploy/symlink.php b/recipe/deploy/symlink.php deleted file mode 100644 index e59bc8d18..000000000 --- a/recipe/deploy/symlink.php +++ /dev/null @@ -1,20 +0,0 @@ -hasOption('branch') && !empty(input()->getOption('branch'))) { - $target = input()->getOption('branch'); - } - if (input()->hasOption('tag') && !empty(input()->getOption('tag'))) { - $target = input()->getOption('tag'); - } - if (input()->hasOption('revision') && !empty(input()->getOption('revision'))) { - $target = input()->getOption('revision'); - } - - if (empty($target)) { - $target = "HEAD"; - } - return $target; -}); - -// Sets deploy:update_code strategy. -// Can be one of: -// - archive -// - clone (if you need `.git` dir in your {{release_path}}) -set('update_code_strategy', 'archive'); - -// Sets environment variable _GIT_SSH_COMMAND_ for `git clone` command. -// If `StrictHostKeyChecking` flag is set to `accept-new` then ssh will -// automatically add new host keys to the user known hosts files, but -// will not permit connections to hosts with changed host keys. -set('git_ssh_command', 'ssh -o StrictHostKeyChecking=accept-new'); - -/** - * Specifies a sub directory within the repository to deploy. - * Works only when [`update_code_strategy`](#update_code_strategy) is set to `archive` (default). - * - * Example: - * - set value to `src` if you want to deploy the folder that lives at `/src/api`. - * - set value to `src/api` if you want to deploy the folder that lives at `/src/api`. - * - * Note: do not use a leading `/`! - */ -set('sub_directory', false); - -/** - * Update code at {{release_path}} on host. - */ -desc('Updates code'); -task('deploy:update_code', function () { - $git = get('bin/git'); - $repository = get('repository'); - $target = get('target'); - - $targetWithDir = $target; - if (!empty(get('sub_directory'))) { - $targetWithDir .= ':{{sub_directory}}'; - } - - $bare = parse('{{deploy_path}}/.dep/repo'); - $env = [ - 'GIT_TERMINAL_PROMPT' => '0', - 'GIT_SSH_COMMAND' => get('git_ssh_command') - ]; - - start: - // Clone the repository to a bare repo. - run("[ -d $bare ] || mkdir -p $bare"); - run("[ -f $bare/HEAD ] || $git clone --mirror $repository $bare 2>&1", ['env' => $env]); - - cd($bare); - - // If remote url changed, drop `.dep/repo` and reinstall. - if (run("$git config --get remote.origin.url") !== $repository) { - cd('{{deploy_path}}'); - run("rm -rf $bare"); - goto start; - } - - run("$git remote update 2>&1", ['env' => $env]); - - // Copy to release_path. - if (get('update_code_strategy') === 'archive') { - run("$git archive $targetWithDir | tar -x -f - -C {{release_path}} 2>&1"); - } else if (get('update_code_strategy') === 'clone') { - cd('{{release_path}}'); - run("$git clone -l $bare ."); - run("$git checkout --force $target"); - } else { - throw new ConfigurationException(parse("Unknown `update_code_strategy` option: {{update_code_strategy}}.")); - } - - // Save git revision in REVISION file. - $rev = escapeshellarg(run("$git rev-list $target -1")); - run("echo $rev > {{release_path}}/REVISION"); -}); diff --git a/recipe/deploy/vendors.php b/recipe/deploy/vendors.php deleted file mode 100644 index b7c8f9a06..000000000 --- a/recipe/deploy/vendors.php +++ /dev/null @@ -1,32 +0,0 @@ -&1'); -}); diff --git a/recipe/deploy/writable.php b/recipe/deploy/writable.php deleted file mode 100644 index 07bcc28b2..000000000 --- a/recipe/deploy/writable.php +++ /dev/null @@ -1,134 +0,0 @@ -&1; true"), '+a') !== false) { - // Try OS-X specific setting of access-rights - - run("$sudo chmod +a \"$httpUser allow delete,write,append,file_inherit,directory_inherit\" $dirs"); - run("$sudo chmod +a \"$remoteUser allow delete,write,append,file_inherit,directory_inherit\" $dirs"); - } elseif (commandExist('setfacl')) { - $setFaclUsers = "-m u:\"$httpUser\":rwX"; - // Check if remote user exists, before adding it to setfacl - $remoteUserExists = test("id -u $remoteUser &>/dev/null 2>&1 || exit 0"); - if ($remoteUserExists === true) { - $setFaclUsers .= " -m u:$remoteUser:rwX"; - } - if (empty($sudo)) { - // When running without sudo, exception may be thrown - // if executing setfacl on files created by http user (in directory that has been setfacl before). - // These directories/files should be skipped. - // Now, we will check each directory for ACL and only setfacl for which has not been set before. - $writeableDirs = get('writable_dirs'); - foreach ($writeableDirs as $dir) { - // Check if ACL has been set or not - $hasfacl = run("getfacl -p $dir | grep \"^user:$httpUser:.*w\" | wc -l"); - // Set ACL for directory if it has not been set before - if (!$hasfacl) { - run("setfacl -L $recursive $setFaclUsers $dir"); - run("setfacl -dL $recursive $setFaclUsers $dir"); - } - } - } else { - run("$sudo setfacl -L $recursive $setFaclUsers $dirs"); - run("$sudo setfacl -dL $recursive $setFaclUsers $dirs"); - } - } else { - $alias = currentHost()->getAlias(); - throw new \RuntimeException("Can't set writable dirs with ACL.\nInstall ACL with next command:\ndep run 'sudo apt-get install acl' -- $alias"); - } - } else { - throw new \RuntimeException("Unknown writable_mode `$mode`."); - } -}); diff --git a/recipe/drupal7.php b/recipe/drupal7.php deleted file mode 100644 index aea108ef8..000000000 --- a/recipe/drupal7.php +++ /dev/null @@ -1,79 +0,0 @@ - $value) { - $keys = []; - for ($i = $iterator->getDepth(); $i > 0; $i --) { - $keys[] = $iterator->getSubIterator($i - 1)->key(); - } - $keys[] = $key; - - $replacements['{{' . implode('.', $keys) . '}}'] = $value; - } - - //Create settings from template - $settings = file_get_contents($template); - - $settings = strtr($settings, $replacements); - - writeln('settings.php created successfully'); - - $tmpFilename = tempnam(sys_get_temp_dir(), 'tmp_settings_'); - file_put_contents($tmpFilename, $settings); - - upload($tmpFilename, '{{deploy_path}}/shared/sites/{{drupal_site}}/settings.php'); - - unlink($tmpFilename); - } -}); - -//Upload Drupal 7 files folder -task('drupal:upload_files', function () { - if (askConfirmation('Are you sure?')) { - upload('sites/{{drupal_site}}/files', '{{deploy_path}}/shared/sites/{{drupal_site}}/files'); - } -}); diff --git a/recipe/drupal8.php b/recipe/drupal8.php deleted file mode 100644 index 77c4190ec..000000000 --- a/recipe/drupal8.php +++ /dev/null @@ -1,31 +0,0 @@ - #.#: The minimum Laravel version required (included). - * - 'max' => #.#: The maximum Laravel version required (included). - * - 'skipIfNoEnv': Skip and warn the user if `.env` file is inexistant or empty. - * - 'failIfNoEnv': Fail the command if `.env` file is inexistant or empty. - * - 'showOutput': Show the output of the command if given. - * - * @param string $command The artisan command (with cli options if any). - * @param array $options The options that define the behaviour of the command. - * @return callable A function that can be used as a task. - */ -function artisan($command, $options = []) -{ - return function () use ($command, $options) { - - // Ensure the artisan command is available on the current version. - $versionTooEarly = array_key_exists('min', $options) - && laravel_version_compare($options['min'], '<'); - - $versionTooLate = array_key_exists('max', $options) - && laravel_version_compare($options['max'], '>'); - - if ($versionTooEarly || $versionTooLate) { - return; - } - - // Ensure we warn or fail when a command relies on the ".env" file. - if (in_array('failIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) { - throw new \Exception('Your .env file is empty! Cannot proceed.'); - } - - if (in_array('skipIfNoEnv', $options) && !test('[ -s {{release_or_current_path}}/.env ]')) { - warning("Your .env file is empty! Skipping..."); - return; - } - - $artisan = '{{release_or_current_path}}/artisan'; - - // Run the artisan command. - $output = run("{{bin/php}} $artisan $command"); - - // Output the results when appropriate. - if (in_array('showOutput', $options)) { - writeln("$output"); - } - }; -} - -function laravel_version_compare($version, $comparator) -{ - return version_compare(get('laravel_version'), $version, $comparator); -} - -/* - * Maintenance mode. - */ - -desc('Puts the application into maintenance / demo mode'); -task('artisan:down', artisan('down', ['showOutput'])); - -desc('Brings the application out of maintenance mode'); -task('artisan:up', artisan('up', ['showOutput'])); - -/* - * Generate keys. - */ - -desc('Sets the application key'); -task('artisan:key:generate', artisan('key:generate')); - -desc('Creates the encryption keys for API authentication'); -task('artisan:passport:keys', artisan('passport:keys')); - -/* - * Database and migrations. - */ - -desc('Seeds the database with records'); -task('artisan:db:seed', artisan('db:seed --force', ['showOutput'])); - -desc('Runs the database migrations'); -task('artisan:migrate', artisan('migrate --force', ['skipIfNoEnv'])); - -desc('Drops all tables and re-run all migrations'); -task('artisan:migrate:fresh', artisan('migrate:fresh --force')); - -desc('Rollbacks the last database migration'); -task('artisan:migrate:rollback', artisan('migrate:rollback --force', ['showOutput'])); - -desc('Shows the status of each migration'); -task('artisan:migrate:status', artisan('migrate:status', ['showOutput'])); - -/* - * Cache and optimizations. - */ - -desc('Flushes the application cache'); -task('artisan:cache:clear', artisan('cache:clear')); - -desc('Creates a cache file for faster configuration loading'); -task('artisan:config:cache', artisan('config:cache')); - -desc('Removes the configuration cache file'); -task('artisan:config:clear', artisan('config:clear')); - -desc('Discovers and cache the application\'s events and listeners'); -task('artisan:event:cache', artisan('event:cache', ['min' => '5.8.9'])); - -desc('Clears all cached events and listeners'); -task('artisan:event:clear', artisan('event:clear', ['min' => '5.8.9'])); - -desc('Lists the application\'s events and listeners'); -task('artisan:event:list', artisan('event:list', ['showOutput', 'min' => '5.8.9'])); - -desc('Cache the framework bootstrap files'); -task('artisan:optimize', artisan('optimize')); - -desc('Removes the cached bootstrap files'); -task('artisan:optimize:clear', artisan('optimize:clear')); - -desc('Creates a route cache file for faster route registration'); -task('artisan:route:cache', artisan('route:cache')); - -desc('Removes the route cache file'); -task('artisan:route:clear', artisan('route:clear')); - -desc('Lists all registered routes'); -task('artisan:route:list', artisan('route:list', ['showOutput'])); - -desc('Creates the symbolic links configured for the application'); -task('artisan:storage:link', artisan('storage:link', ['min' => 5.3])); - -desc('Compiles all of the application\'s Blade templates'); -task('artisan:view:cache', artisan('view:cache', ['min' => 5.6])); - -desc('Clears all compiled view files'); -task('artisan:view:clear', artisan('view:clear')); - -/** - * Queue and Horizon. - */ - -desc('Lists all of the failed queue jobs'); -task('artisan:queue:failed', artisan('queue:failed', ['showOutput'])); - -desc('Flushes all of the failed queue jobs'); -task('artisan:queue:flush', artisan('queue:flush')); - -desc('Restarts queue worker daemons after their current job'); -task('artisan:queue:restart', artisan('queue:restart')); - -desc('Starts a master supervisor in the foreground'); -task('artisan:horizon', artisan('horizon')); - -desc('Deletes all of the jobs from the specified queue'); -task('artisan:horizon:clear', artisan('horizon:clear --force')); - -desc('Instructs the master supervisor to continue processing jobs'); -task('artisan:horizon:continue', artisan('horizon:continue')); - -desc('Lists all of the deployed machines'); -task('artisan:horizon:list', artisan('horizon:list', ['showOutput'])); - -desc('Pauses the master supervisor'); -task('artisan:horizon:pause', artisan('horizon:pause')); - -desc('Terminates any rogue Horizon processes'); -task('artisan:horizon:purge', artisan('horizon:purge')); - -desc('Gets the current status of Horizon'); -task('artisan:horizon:status', artisan('horizon:status', ['showOutput'])); - -desc('Terminates the master supervisor so it can be restarted'); -task('artisan:horizon:terminate', artisan('horizon:terminate')); - -/* - * Telescope. - */ - -desc('Clears all entries from Telescope'); -task('artisan:telescope:clear', artisan('telescope:clear')); - -desc('Prunes stale entries from the Telescope database'); -task('artisan:telescope:prune', artisan('telescope:prune')); - -/** - * Main deploy task. - */ -desc('Deploys your project'); -task('deploy', [ - 'deploy:prepare', - 'deploy:vendors', - 'artisan:storage:link', - 'artisan:config:cache', - 'artisan:route:cache', - 'artisan:view:cache', - 'artisan:event:cache', - 'artisan:migrate', - 'deploy:publish', -]); diff --git a/recipe/magento.php b/recipe/magento.php deleted file mode 100644 index d07221998..000000000 --- a/recipe/magento.php +++ /dev/null @@ -1,50 +0,0 @@ -cleanCache();\""); -}); - -/** - * Remove files that can be used to compromise Magento - */ -task('deploy:clear_version', function () { - run("rm -f {{release_or_current_path}}/LICENSE.html"); - run("rm -f {{release_or_current_path}}/LICENSE.txt"); - run("rm -f {{release_or_current_path}}/LICENSE_AFL.txt"); - run("rm -f {{release_or_current_path}}/RELEASE_NOTES.txt"); -})->hidden(); - -after('deploy:update_code', 'deploy:clear_version'); - - -/** - * Main task - */ -desc('Deploys your project'); -task('deploy', [ - 'deploy:prepare', - 'deploy:cache:clear', - 'deploy:publish', -]); diff --git a/recipe/magento2.php b/recipe/magento2.php deleted file mode 100644 index fc705f0b8..000000000 --- a/recipe/magento2.php +++ /dev/null @@ -1,220 +0,0 @@ - 0) { - foreach (get('magento_themes') as $theme) { - $themesToCompile .= ' -t ' . $theme; - } - } - - run("{{bin/php}} {{release_or_current_path}}/bin/magento setup:static-content:deploy --content-version={{content_version}} {{static_content_locales}} $themesToCompile -j {{static_content_jobs}}"); -}); - -desc('Syncs content version'); -task('magento:sync:content_version', function () { - $timestamp = time(); - on(select('all'), function (Host $host) use ($timestamp) { - $host->set('content_version', $timestamp); - }); -})->once(); - -before('magento:deploy:assets', 'magento:sync:content_version'); - -desc('Enables maintenance mode'); -task('magento:maintenance:enable', function () { - run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/bin/magento maintenance:enable; fi"); -}); - -desc('Disables maintenance mode'); -task('magento:maintenance:disable', function () { - run("if [ -d $(echo {{current_path}}) ]; then {{bin/php}} {{current_path}}/bin/magento maintenance:disable; fi"); -}); - -desc('Config Import'); -task('magento:config:import', function () { - $configImportNeeded = false; - - if(version_compare(get('magento_version'), '2.2.0', '<')) { - //app:config:import command does not exist in 2.0.x and 2.1.x branches - $configImportNeeded = false; - } elseif(version_compare(get('magento_version'), '2.2.4', '<')) { - //app:config:status command does not exist until 2.2.4, so proceed with config:import in every deploy - $configImportNeeded = true; - } else { - try { - run('{{bin/php}} {{release_or_current_path}}/bin/magento app:config:status'); - } catch (RunException $e) { - if ($e->getExitCode() == CONFIG_IMPORT_NEEDED_EXIT_CODE) { - $configImportNeeded = true; - } else { - throw $e; - } - } - } - - if ($configImportNeeded) { - if (get('enable_zerodowntime') && !get('maintenance_mode_status_active')) { - invoke('magento:maintenance:enable'); - } - - run('{{bin/php}} {{release_or_current_path}}/bin/magento app:config:import --no-interaction'); - - if (get('enable_zerodowntime') && !get('maintenance_mode_status_active')) { - invoke('magento:maintenance:disable'); - } - } -}); - -desc('Upgrades magento database'); -task('magento:upgrade:db', function () { - $databaseUpgradeNeeded = false; - - try { - run('{{bin/php}} {{release_or_current_path}}/bin/magento setup:db:status'); - } catch (RunException $e) { - if ($e->getExitCode() == DB_UPDATE_NEEDED_EXIT_CODE) { - $databaseUpgradeNeeded = true; - } else { - throw $e; - } - } - - if ($databaseUpgradeNeeded) { - if (get('enable_zerodowntime') && !get('maintenance_mode_status_active')) { - invoke('magento:maintenance:enable'); - } - - run("{{bin/php}} {{release_or_current_path}}/bin/magento setup:upgrade --keep-generated --no-interaction"); - - if (get('enable_zerodowntime') && !get('maintenance_mode_status_active')) { - invoke('magento:maintenance:disable'); - } - } -}); - -desc('Flushes Magento Cache'); -task('magento:cache:flush', function () { - run("{{bin/php}} {{release_or_current_path}}/bin/magento cache:flush"); -}); - -desc('Magento2 deployment operations'); -task('deploy:magento', [ - 'magento:build', - 'magento:config:import', - 'magento:upgrade:db', - 'magento:cache:flush', -]); - -desc('Magento2 build operations'); -task('magento:build', [ - 'magento:compile', - 'magento:deploy:assets', -]); - -desc('Deploys your project'); -task('deploy', [ - 'deploy:prepare', - 'deploy:vendors', - 'deploy:clear_paths', - 'deploy:magento', - 'deploy:publish', -]); - -after('deploy:failed', 'magento:maintenance:disable'); diff --git a/recipe/pimcore.php b/recipe/pimcore.php deleted file mode 100644 index 3d4c5cc0d..000000000 --- a/recipe/pimcore.php +++ /dev/null @@ -1,35 +0,0 @@ - $name, 'VERSION_ID' => $version] = parse_ini_string($release); - if ($name !== 'Ubuntu' || $version !== '20.04') { - warning('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - warning('!! !!'); - warning('!! Only Ubuntu 20.04 LTS supported! !!'); - warning('!! !!'); - warning('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); - } -})->oncePerNode(); - -desc('Collects required params'); -task('provision:configure', function () { - $params = [ - 'sudo_password', - 'domain', - 'public_path', - 'php_version', - 'db_type', - 'db_user', - 'db_name', - 'db_password', - ]; - $code = "\n\n host('{{alias}}')"; - foreach ($params as $name) { - $code .= "\n ->set('$name', '…')"; - } - $code .= ";\n\n"; - writeln($code); - foreach ($params as $name) { - get($name); - } -}); - -desc('Adds repositories and update'); -task('provision:update', function () { - // PHP - run('apt-add-repository ppa:ondrej/php -y', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive']]); - - // Caddy - run("curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' > /etc/apt/trusted.gpg.d/caddy-stable.asc"); - run("curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list"); - - // Nodejs - $keyring = '/usr/share/keyrings/nodesource.gpg'; - run("curl -fsSL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee '$keyring' >/dev/null"); - run("gpg --no-default-keyring --keyring '$keyring' --list-keys"); - run("echo 'deb [signed-by=$keyring] https://deb.nodesource.com/{{nodejs_version}} {{lsb_release}} main' | sudo tee /etc/apt/sources.list.d/nodesource.list"); - run("echo 'deb-src [signed-by=$keyring] https://deb.nodesource.com/{{nodejs_version}} {{lsb_release}} main' | sudo tee -a /etc/apt/sources.list.d/nodesource.list"); - - // Update - run('apt-get update', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive']]); -}) - ->oncePerNode() - ->verbose(); - -desc('Upgrades all packages'); -task('provision:upgrade', function () { - run('apt-get upgrade -y', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive'], 'timeout' => 900]); -}) - ->oncePerNode() - ->verbose(); - -desc('Installs packages'); -task('provision:install', function () { - $packages = [ - 'acl', - 'apt-transport-https', - 'build-essential', - 'caddy', - 'curl', - 'debian-archive-keyring', - 'debian-keyring', - 'fail2ban', - 'gcc', - 'git', - 'libmcrypt4', - 'libpcre3-dev', - 'libsqlite3-dev', - 'make', - 'ncdu', - 'nodejs', - 'pkg-config', - 'python', - 'redis', - 'sendmail', - 'sqlite3', - 'ufw', - 'unzip', - 'uuid-runtime', - 'whois', - ]; - run('apt-get install -y ' . implode(' ', $packages), ['env' => ['DEBIAN_FRONTEND' => 'noninteractive'], 'timeout' => 900]); -}) - ->verbose() - ->oncePerNode(); - -desc('Configures a server'); -task('provision:server', function () { - run('usermod -a -G www-data caddy'); - $html = <<<'HTML' - - - - - - 404 Not Found - - - -
- - Deployer - - - - - - - -

Not Found

-

The requested URL was not found on this server.

-
- - -HTML; - run("mkdir -p /var/dep/html"); - run("echo $'$html' > /var/dep/html/404.html"); -})->oncePerNode(); - -desc('Configures the ssh'); -task('provision:ssh', function () { - run("sed -i 's/PasswordAuthentication .*/PasswordAuthentication no/' /etc/ssh/sshd_config"); - run('ssh-keygen -A'); - run('service ssh restart'); - if (test('[ ! -d /root/.ssh ]')) { - run('mkdir -p /root/.ssh'); - run('touch /root/.ssh/authorized_keys'); - } -})->oncePerNode(); - -set('sudo_password', function () { - return askHiddenResponse(' Password for sudo: '); -}); - -// Specify which key to copy to server. -// Set to `false` to disable copy of key. -set('ssh_copy_id', '~/.ssh/id_rsa.pub'); - -desc('Setups a deployer user'); -task('provision:deployer', function () { - if (test('id deployer >/dev/null 2>&1')) { - // TODO: Check what created deployer user configured correctly. - // TODO: Update sudo_password of deployer user. - // TODO: Copy ssh_copy_id to deployer ssh dir. - info('deployer user already exist'); - } else { - run('useradd deployer'); - run('mkdir -p /home/deployer/.ssh'); - run('mkdir -p /home/deployer/.deployer'); - run('adduser deployer sudo'); - - run('chsh -s /bin/bash deployer'); - run('cp /root/.profile /home/deployer/.profile'); - run('cp /root/.bashrc /home/deployer/.bashrc'); - - // Make color prompt. - run("sed -i 's/#force_color_prompt=yes/force_color_prompt=yes/' /home/deployer/.bashrc"); - - $password = run("mkpasswd -m sha-512 '%secret%'", ['secret' => get('sudo_password')]); - run("usermod --password '%secret%' deployer", ['secret' => $password]); - - if (!empty(get('ssh_copy_id'))) { - $file = parse_home_dir(get('ssh_copy_id')); - if (!file_exists($file)) { - info('Configure path to your public key.'); - writeln(""); - writeln(" set('ssh_copy_id', '~/.ssh/id_rsa.pub');"); - writeln(""); - $file = ask(' Specify path to your public ssh key: ', '~/.ssh/id_rsa.pub'); - } - run('echo "$KEY" >> /root/.ssh/authorized_keys', ['env' => ['KEY' => file_get_contents(parse_home_dir($file))]]); - } - run('cp /root/.ssh/authorized_keys /home/deployer/.ssh/authorized_keys'); - run('ssh-keygen -f /home/deployer/.ssh/id_rsa -t rsa -N ""'); - - run('chown -R deployer:deployer /home/deployer'); - run('chmod -R 755 /home/deployer'); - run('chmod 700 /home/deployer/.ssh/id_rsa'); - - run('usermod -a -G www-data deployer'); - run('usermod -a -G caddy deployer'); - run('groups deployer'); - } -})->oncePerNode(); - -desc('Setups a firewall'); -task('provision:firewall', function () { - run('ufw allow 22'); - run('ufw allow 80'); - run('ufw allow 443'); - run('ufw --force enable'); -})->oncePerNode(); - -desc('Verifies what provision was successful'); -task('provision:verify', function () { - fetch('{{domain}}', 'get', [], null, $info, true); - if ($info['http_code'] === 404) { - info("provisioned successfully!"); - } -}); diff --git a/recipe/provision/databases.php b/recipe/provision/databases.php deleted file mode 100644 index 7b7d026f6..000000000 --- a/recipe/provision/databases.php +++ /dev/null @@ -1,63 +0,0 @@ -limit(1); - -desc('Provision MySQL'); -task('provision:mysql', function () { - run('apt-get install -y mysql-server', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive'], 'timeout' => 900]); - run("mysql --user=\"root\" -e \"CREATE USER IF NOT EXISTS '{{db_user}}'@'0.0.0.0' IDENTIFIED BY '%secret%';\"", ['secret' => get('db_password')]); - run("mysql --user=\"root\" -e \"CREATE USER IF NOT EXISTS '{{db_user}}'@'%' IDENTIFIED BY '%secret%';\"", ['secret' => get('db_password')]); - run("mysql --user=\"root\" -e \"GRANT ALL PRIVILEGES ON *.* TO '{{db_user}}'@'0.0.0.0' WITH GRANT OPTION;\""); - run("mysql --user=\"root\" -e \"GRANT ALL PRIVILEGES ON *.* TO '{{db_user}}'@'%' WITH GRANT OPTION;\""); - run("mysql --user=\"root\" -e \"FLUSH PRIVILEGES;\""); - run("mysql --user=\"root\" -e \"CREATE DATABASE IF NOT EXISTS {{db_name}} character set UTF8mb4 collate utf8mb4_bin;\""); -}); - -desc('Provision MariaDB'); -task('provision:mariadb', function () { - run('apt-get install -y mariadb-server', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive'], 'timeout' => 900]); - run("mysql --user=\"root\" -e \"CREATE USER IF NOT EXISTS '{{db_user}}'@'0.0.0.0' IDENTIFIED BY '%secret%';\"", ['secret' => get('db_password')]); - run("mysql --user=\"root\" -e \"CREATE USER IF NOT EXISTS '{{db_user}}'@'%' IDENTIFIED BY '%secret%';\"", ['secret' => get('db_password')]); - run("mysql --user=\"root\" -e \"GRANT ALL PRIVILEGES ON *.* TO '{{db_user}}'@'0.0.0.0' WITH GRANT OPTION;\""); - run("mysql --user=\"root\" -e \"GRANT ALL PRIVILEGES ON *.* TO '{{db_user}}'@'%' WITH GRANT OPTION;\""); - run("mysql --user=\"root\" -e \"FLUSH PRIVILEGES;\""); - run("mysql --user=\"root\" -e \"CREATE DATABASE IF NOT EXISTS {{db_name}} character set UTF8mb4 collate utf8mb4_bin;\""); -}); - -desc('Provision PostgreSQL'); -task('provision:postgresql', function () { - run('apt-get install -y postgresql postgresql-contrib', ['env' => ['DEBIAN_FRONTEND' => 'noninteractive'], 'timeout' => 900]); - run('sudo -u postgres createuser deployer'); - run('sudo -u postgres createdb deployer'); -}); diff --git a/recipe/provision/nodejs.php b/recipe/provision/nodejs.php deleted file mode 100644 index 4a33c115d..000000000 --- a/recipe/provision/nodejs.php +++ /dev/null @@ -1,12 +0,0 @@ -oncePerNode(); diff --git a/recipe/provision/php.php b/recipe/provision/php.php deleted file mode 100644 index d107e284a..000000000 --- a/recipe/provision/php.php +++ /dev/null @@ -1,69 +0,0 @@ - ['DEBIAN_FRONTEND' => 'noninteractive']]); - - // Configure PHP-CLI - run("sudo sed -i 's/error_reporting = .*/error_reporting = E_ALL/' /etc/php/$version/cli/php.ini"); - run("sudo sed -i 's/display_errors = .*/display_errors = On/' /etc/php/$version/cli/php.ini"); - run("sudo sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/$version/cli/php.ini"); - run("sudo sed -i 's/;date.timezone.*/date.timezone = UTC/' /etc/php/$version/cli/php.ini"); - - // Configure PHP-FPM - run("sed -i 's/error_reporting = .*/error_reporting = E_ALL/' /etc/php/$version/fpm/php.ini"); - run("sed -i 's/display_errors = .*/display_errors = On/' /etc/php/$version/fpm/php.ini"); - run("sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/$version/fpm/php.ini"); - run("sed -i 's/;date.timezone.*/date.timezone = UTC/' /etc/php/$version/fpm/php.ini"); - run("sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/$version/fpm/php.ini"); - - // Configure FPM Pool - run("sed -i 's/;request_terminate_timeout = .*/request_terminate_timeout = 60/' /etc/php/$version/fpm/pool.d/www.conf"); - run("sed -i 's/;catch_workers_output = .*/catch_workers_output = yes/' /etc/php/$version/fpm/pool.d/www.conf"); - run("sed -i 's/;php_flag\[display_errors\] = .*/php_flag[display_errors] = yes/' /etc/php/$version/fpm/pool.d/www.conf"); - run("sed -i 's/;php_admin_value\[error_log\] = .*/php_admin_value[error_log] = \/var\/log\/fpm-php.www.log/' /etc/php/$version/fpm/pool.d/www.conf"); - run("sed -i 's/;php_admin_flag\[log_errors\] = .*/php_admin_flag[log_errors] = on/' /etc/php/$version/fpm/pool.d/www.conf"); - - // Configure PHP sessions directory - run('chmod 733 /var/lib/php/sessions'); - run('chmod +t /var/lib/php/sessions'); -}) - ->verbose() - ->limit(1); - -desc('Shows php-fpm logs'); -task('logs:php-fpm', function () { - run('tail -f /var/log/fpm-php.www.log'); -})->verbose(); - -desc('Installs Composer'); -task('provision:composer', function () { - run('curl -sS https://getcomposer.org/installer | php'); - run('mv composer.phar /usr/local/bin/composer'); -})->oncePerNode(); - diff --git a/recipe/provision/website.php b/recipe/provision/website.php deleted file mode 100644 index 380b77786..000000000 --- a/recipe/provision/website.php +++ /dev/null @@ -1,90 +0,0 @@ - Caddyfile.new"); - $diff = run('diff -U5 --color=always Caddyfile Caddyfile.new', ['no_throw' => true]); - if (empty($diff)) { - run('rm Caddyfile.new'); - } else { - info('Found Caddyfile changes'); - writeln("\n" . $diff); - $answer = askChoice(' Which Caddyfile to save? ', ['old', 'new'], 0); - if ($answer === 'old') { - run('rm Caddyfile.new'); - } else { - run('mv Caddyfile.new Caddyfile'); - } - } - } else { - run("echo $'$caddyfile' > Caddyfile"); - } - - set('remote_user', 'root'); - if (!test("grep -q 'import $deployPath/Caddyfile' /etc/caddy/Caddyfile")) { - run("echo 'import $deployPath/Caddyfile' >> /etc/caddy/Caddyfile"); - } - run('service caddy reload'); - - info("Website $domain configured!"); -})->limit(1); - -desc('Shows caddy logs'); -task('logs:caddy', function () { - run('tail -f {{deploy_path}}/log/access.log'); -})->verbose(); - -desc('Shows caddy syslog'); -task('logs:caddy:syslog', function () { - run('sudo journalctl -u caddy -f'); -})->verbose(); - diff --git a/recipe/shopware.php b/recipe/shopware.php deleted file mode 100644 index 46f3a0ee8..000000000 --- a/recipe/shopware.php +++ /dev/null @@ -1,184 +0,0 @@ -Running plugin update for " . $plugin['Plugin'] . "\n"); - run("cd {{release_path}} && bin/console plugin:update " . $plugin['Plugin']); - } - } -}); - -task('sw:writable:jwt', static function () { - run('cd {{release_path}} && chmod -R 660 config/jwt/*'); -}); - -/** - * Grouped SW deploy tasks. - */ -task('sw:deploy', [ - 'sw:database:migrate', - 'sw:plugin:refresh', - 'sw:cache:clear', - 'sw:plugin:update:all', - 'sw:cache:clear', -]); - -desc('Deploys your project'); -task('deploy', [ - 'deploy:prepare', - 'sw:deploy', - 'deploy:clear_paths', - 'sw:cache:warmup', - 'sw:writable:jwt', - 'deploy:publish', -]); - - -task('sw-build-without-db:get-remote-config', static function () { - if (!test('[ -d {{current_path}} ]')) { - return; - } - within('{{deploy_path}}/current', function () { - run('./bin/console bundle:dump'); - download('{{deploy_path}}/current/var/plugins.json', './var/'); - - run('./bin/console theme:dump'); - download('{{deploy_path}}/current/files/theme-config', './files/'); - - // Temporary workaround to remove absolute file paths in Shopware <6.4.6.0 - // See: - // - https://github.com/shopware/platform/commit/01c8ff86c7d8d3bee1888a26c24c9dc9b4529cbc - // - https://issues.shopware.com/issues/NEXT-17720 - // - https://github.com/deployphp/deployer/issues/2754 - $deployPath = get('deploy_path'); - if (substr($deployPath, -1, 1) !== '/') { - $deployPath .= '/'; - } - $deployPath .= 'releases/[0-9a-zA-Z]*/'; - $escapedDeployPath = str_replace('/', '\\\\/', $deployPath); - runLocally("sed -iE 's#${escapedDeployPath}##g' files/theme-config/* || true"); - }); -}); - -task('sw-build-without-db:build', static function () { - runLocally('CI=1 SHOPWARE_SKIP_BUNDLE_DUMP=1 ./bin/build.sh'); -}); - -task('sw-build-without-db', [ - 'sw-build-without-db:get-remote-config', - 'sw-build-without-db:build', -]); - -before('deploy:update_code', 'sw-build-without-db'); diff --git a/recipe/silverstripe.php b/recipe/silverstripe.php deleted file mode 100644 index edde919c1..000000000 --- a/recipe/silverstripe.php +++ /dev/null @@ -1,65 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Collection; - -use Countable; -use IteratorAggregate; - -class Collection implements Countable, IteratorAggregate -{ - /** - * @var array - */ - protected $values = []; - - public function all(): array - { - return $this->values; - } - - /** - * @return mixed - */ - public function get(string $name) - { - if ($this->has($name)) { - return $this->values[$name]; - } else { - $this->throwNotFound($name); - } - } - - public function has(string $name): bool - { - return array_key_exists($name, $this->values); - } - - /** - * @param mixed $object - */ - public function set(string $name, $object) - { - $this->values[$name] = $object; - } - - public function remove(string $name): void - { - if ($this->has($name)) { - unset($this->values[$name]); - } else { - $this->throwNotFound($name); - } - } - - public function count(): int - { - return count($this->values); - } - - public function select(callable $callback): array - { - $values = []; - - foreach ($this->values as $key => $value) { - if ($callback($value, $key)) { - $values[$key] = $value; - } - } - - return $values; - } - - /** - * @return \ArrayIterator|\Traversable - */ - #[\ReturnTypeWillChange] - public function getIterator() - { - return new \ArrayIterator($this->values); - } - - protected function throwNotFound(string $name): void - { - throw new \InvalidArgumentException("Element \"$name\" not found in collection."); - } -} diff --git a/src/Command/BlackjackCommand.php b/src/Command/BlackjackCommand.php deleted file mode 100644 index 52317c53a..000000000 --- a/src/Command/BlackjackCommand.php +++ /dev/null @@ -1,392 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Output\OutputInterface as Output; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Style\SymfonyStyle; -use function Deployer\Support\array_flatten; - -class BlackjackCommand extends Command -{ - use CommandCommon; - - /** - * @var Input - */ - private $input; - - /** - * @var Output - */ - private $output; - - public function __construct() - { - parent::__construct('blackjack'); - $this->setDescription('Play blackjack'); - } - - protected function execute(Input $input, Output $output): int - { - $this->input = $input; - $this->output = $output; - $this->telemetry(); - $io = new SymfonyStyle($this->input, $this->output); - - if (getenv('COLORTERM') === 'truecolor') { - $this->print("\x1b[38;2;255;95;109m╭\x1b[39m\x1b[38;2;255;95;107m─\x1b[39m\x1b[38;2;255;96;106m─\x1b[39m\x1b[38;2;255;96;104m─\x1b[39m\x1b[38;2;255;96;103m─\x1b[39m\x1b[38;2;255;97;101m─\x1b[39m\x1b[38;2;255;97;100m─\x1b[39m\x1b[38;2;255;97;99m─\x1b[39m\x1b[38;2;255;98;97m─\x1b[39m\x1b[38;2;255;100;98m─\x1b[39m\x1b[38;2;255;102;98m─\x1b[39m\x1b[38;2;255;104;98m─\x1b[39m\x1b[38;2;255;106;99m─\x1b[39m\x1b[38;2;255;108;99m─\x1b[39m\x1b[38;2;255;110;99m─\x1b[39m\x1b[38;2;255;112;100m─\x1b[39m\x1b[38;2;255;114;100m─\x1b[39m\x1b[38;2;255;116;100m─\x1b[39m\x1b[38;2;255;118;100m─\x1b[39m\x1b[38;2;255;120;101m─\x1b[39m\x1b[38;2;255;122;101m─\x1b[39m\x1b[38;2;255;124;101m─\x1b[39m\x1b[38;2;255;126;102m╮\x1b[39m"); - $this->print("\x1b[38;2;255;128;102m│\x1b[39m \x1b[38;2;255;130;102m│\x1b[39m"); - $this->print("\x1b[38;2;255;132;103m│\x1b[39m \x1b[38;2;255;134;103mW\x1b[39m\x1b[38;2;255;136;103me\x1b[39m\x1b[38;2;255;138;104ml\x1b[39m\x1b[38;2;255;140;104mc\x1b[39m\x1b[38;2;255;142;104mo\x1b[39m\x1b[38;2;255;144;104mm\x1b[39m\x1b[38;2;255;146;105me\x1b[39m\x1b[38;2;255;148;105m!\x1b[39m \x1b[38;2;255;150;105m│\x1b[39m"); - $this->print("\x1b[38;2;255;152;106m│\x1b[39m \x1b[38;2;255;153;106m│\x1b[39m"); - $this->print("\x1b[38;2;255;155;106m╰\x1b[39m\x1b[38;2;255;157;107m─\x1b[39m\x1b[38;2;255;159;107m─\x1b[39m\x1b[38;2;255;161;107m─\x1b[39m\x1b[38;2;255;163;108m─\x1b[39m\x1b[38;2;255;165;108m─\x1b[39m\x1b[38;2;255;166;108m─\x1b[39m\x1b[38;2;255;168;108m─\x1b[39m\x1b[38;2;255;170;109m─\x1b[39m\x1b[38;2;255;172;109m─\x1b[39m\x1b[38;2;255;174;109m─\x1b[39m\x1b[38;2;255;176;110m─\x1b[39m\x1b[38;2;255;177;110m─\x1b[39m\x1b[38;2;255;179;110m─\x1b[39m\x1b[38;2;255;181;111m─\x1b[39m\x1b[38;2;255;183;111m─\x1b[39m\x1b[38;2;255;185;111m─\x1b[39m\x1b[38;2;255;186;111m─\x1b[39m\x1b[38;2;255;188;112m─\x1b[39m\x1b[38;2;255;190;112m─\x1b[39m\x1b[38;2;255;192;112m─\x1b[39m\x1b[38;2;255;193;113m─\x1b[39m\x1b[38;2;255;195;113m╯\x1b[0m"); - } else { - $this->print("╭─────────────────────╮"); - $this->print("│ │"); - $this->print("│ Welcome! │"); - $this->print("│ │"); - $this->print("╰─────────────────────╯"); - } - - $money = 100; - - if (md5(strval(getenv('MONEY'))) === '5a7c2f336d0cc43b68951e75cdffe333') { - $money += 25; - $this->print('You got an extra $25.'); - } else if (md5(strval(getenv('MONEY'))) === '530029252abcbda4a2a2069036ccc7fc') { - $money += 100; - $this->print('You got an extra $100.'); - } else if (md5(strval(getenv('MONEY'))) === '1aa827a06ecbfa5d6fa7c62ad245f3a3') { - $money = 100000; - } - - $hasWatch = true; - $orderWhiskey = false; - $whiskeyLevel = 0; - - $deck = $this->newDeck(); - $graveyard = []; - $dealersHand = []; - $playersHand = []; - shuffle($deck); - $deal = function () use (&$deck, &$graveyard) { - if (count($deck) == 0) { - shuffle($graveyard); - $deck = $graveyard; - $graveyard = []; - } - return array_pop($deck); - }; - - start: - $this->print("You have $$money."); - if ($money > 0) { - $bet = (int)$io->ask('Your bet', '5'); - if ($bet <= 0) goto start; - if ($bet > $money) goto start; - } else if ($hasWatch) { - $answer = $io->askQuestion(new ChoiceQuestion('?', ['leave', '- Here, take my watch! [$25]'], 0)); - if ($answer == 'leave') { - goto leave; - } else { - $hasWatch = false; - $money = 25; - $bet = 25; - } - } else { - goto leave; - } - - $graveyard = array_merge($graveyard, $dealersHand); - $dealersHand = []; - $dealersHand[] = $deal(); - $this->print("Dealers hand:"); - $this->printHand($dealersHand); - - $graveyard = array_merge($graveyard, $playersHand); - $playersHand = []; - $playersHand[] = $deal(); - $playersHand[] = $deal(); - $this->print("Your hand:"); - $this->printHand($playersHand, 2); - - while (true) { - $question = new ChoiceQuestion('Your turn', ['hit', 'stand'], 0); - $answer = $io->askQuestion($question); - - if ($answer === 'hit') { - $playersHand[] = $deal(); - usleep(200000); - } - - if ($answer === 'stand') { - break; - } - - $this->printHand($playersHand); - $handValue = self::handValue($playersHand); - - if ($handValue > 21) { - $this->print("You got $handValue."); - $this->print("Bust!"); - $this->print("-$$bet"); - $money -= $bet; - goto nextRound; - } - } - - $this->printHand($dealersHand); - $this->print("Dealer: " . self::handValue($dealersHand)); - sleep(1); - - while (self::handValue($dealersHand) <= 17) { - $dealersHand[] = $deal(); - $this->printHand($dealersHand); - $this->print("Dealer: " . self::handValue($dealersHand)); - sleep(1); - } - - $d = self::handValue($dealersHand); - $p = self::handValue($playersHand); - $this->print("You got $p and dealer $d."); - - if ($d > 21 || $p > $d) { - $this->print("You won!"); - $this->print("+$$bet"); - $money += $bet; - } else if ($p < $d) { - $this->print("You lose!"); - $this->print("-$$bet"); - $money -= $bet; - } else { - $this->print("Push!"); - } - - nextRound: - $choices = ['continue', 'leave']; - if ($orderWhiskey) { - $orderWhiskey = false; - $whiskeyLevel = 4; - $this->print(); - $this->print('The waitress brought whiskey and says:'); - $this->print(' - Your whiskey, sir.'); - if ($money >= 5) { - array_push($choices, 'tip the waitress [$5]'); - } - } else if ($money >= 5) { - array_push($choices, 'order whiskey [$5]'); - } - - if ($whiskeyLevel > 0) { - $this->printWhiskey($whiskeyLevel); - $whiskeyLevel--; - } - $answer = $io->askQuestion(new ChoiceQuestion('?', $choices, 0)); - - if ($answer == 'leave') { - goto leave; - } else if ($money >= 5 && $answer == 'order whiskey [$5]') { - $orderWhiskey = true; - $this->print('You say:'); - $this->print(' - Whiskey, please.'); - $money -= 5; - } else if ($money >= 5 && $answer == 'tip the waitress [$5]') { - $this->print('The waitress says:'); - $this->print(' - Thank you, sir!'); - $money -= 5; - } - $this->print(); - $this->print("=====> Next round <====="); - goto start; - - leave: - if ($money >= 5) { - $answer = $io->ask('Leave a $5 tip to the dealer?', 'yes'); - if ($answer === 'yes') { - $this->print("You can leave a tip here:"); - $this->print(); - $this->print("- https://github.com/sponsors/antonmedv"); - $this->print("- https://paypal.me/antonmedv"); - $this->print(); - } - } - $this->print('Thanks for playing, Come again!'); - return 0; - } - - private function newDeck(): array - { - $deck = []; - foreach (['♠', '♣', '♥', '♦'] as $suit) { - for ($i = 2; $i <= 10; $i++) { - $deck[] = [strval($i), $suit]; - } - $deck[] = ['J', $suit]; - $deck[] = ['Q', $suit]; - $deck[] = ['K', $suit]; - $deck[] = ['A', $suit]; - } - return $deck; - } - - public static function handValue(array $hand): int - { - $aces = 0; - $value = 0; - foreach ($hand as list($rank)) { - switch ($rank) { - case '2': - $value += 2; - break; - case '3': - $value += 3; - break; - case '4': - $value += 4; - break; - case '5': - $value += 5; - break; - case '6': - $value += 6; - break; - case '7': - $value += 7; - break; - case '8': - $value += 8; - break; - case '9': - $value += 9; - break; - case '10': - case 'J': - case 'Q': - case 'K': - $value += 10; - break; - case 'A': - $aces++; - break; - } - } - $variants = [$value]; - while ($aces-- > 0) { - $variants = array_flatten(array_map(function ($v) { - return [$v + 1, $v + 11]; - }, $variants)); - } - $sum = $variants[0]; - for ($i = 1; $i < count($variants); $i++) { - if ($variants[$i] <= 21) { - $sum = $variants[$i]; - } else { - break; - } - } - return $sum; - } - - private function print(string $text = "") - { - $this->output->writeln(" $text"); - } - - private function printHand(array $hand, int $offset = 1) - { - $cards = []; - for ($i = 0; $i < count($hand) - $offset; $i++) { - list($rank) = $hand[$i]; - $cards[] = [ - "┌───", - "│" . str_pad($rank, 3), - "│ ", - "│ ", - "│ ", - "│ ", - "└───", - ]; - } - - for (; $i < count($hand); $i++) { - list($rank, $suit) = $hand[$i]; - $cards[] = [ - "┌───────┐", - "│" . str_pad($rank, 7) . "│", - "│ │", - "│ " . $suit . " │", - "│ │", - "│" . str_pad($rank, 7, " ", STR_PAD_LEFT) . "│", - "└───────┘", - ]; - } - - for ($i = 0; $i < 7; $i++) { - $this->output->write(" "); - foreach ($cards as $lines) { - $this->output->write($lines[$i]); - } - $this->output->write("\n"); - } - } - - private function printWhiskey(int $whiskeyLevel) - { - if ($whiskeyLevel == 4) { - echo << - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Support\Reporter; - -trait CommandCommon -{ - /** - * Collecting anonymous stat helps Deployer team improve developer experience. - * If you are not comfortable with this, you will always be able to disable this - * by setting DO_NOT_TRACK environment variable to `1`. - * @codeCoverageIgnore - */ - protected function telemetry(array $data = []): void - { - if (getenv('DO_NOT_TRACK') === 'true') { - return; - } - try { - Reporter::report(array_merge([ - 'command_name' => $this->getName(), - 'deployer_version' => DEPLOYER_VERSION, - 'deployer_phar' => Deployer::isPharArchive(), - 'php_version' => phpversion(), - 'os' => defined('PHP_OS_FAMILY') ? PHP_OS_FAMILY : (stristr(PHP_OS, 'DAR') ? 'OSX' : (stristr(PHP_OS, 'WIN') ? 'WIN' : (stristr(PHP_OS, 'LINUX') ? 'LINUX' : PHP_OS))), - ], $data)); - } catch (\Throwable $e) { - return; - } - } - -} diff --git a/src/Command/ConfigCommand.php b/src/Command/ConfigCommand.php deleted file mode 100644 index 8aee286ff..000000000 --- a/src/Command/ConfigCommand.php +++ /dev/null @@ -1,77 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Exception\WillAskUser; -use Deployer\Task\Context; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\NullOutput; -use Symfony\Component\Console\Output\OutputInterface as Output; -use Symfony\Component\Yaml\Yaml; - -class ConfigCommand extends SelectCommand -{ - public function __construct(Deployer $deployer) - { - parent::__construct('config', $deployer); - $this->setDescription('Get all configuration options for hosts'); - } - - protected function configure() - { - parent::configure(); - $this->addOption('format', null, InputOption::VALUE_OPTIONAL, 'The output format (json, yaml)', 'yaml'); - $this->getDefinition()->getArgument('selector')->setDefault(['all']); - } - - protected function execute(Input $input, Output $output): int - { - $this->deployer->input = $input; - $this->deployer->output = new NullOutput(); - $hosts = $this->selectHosts($input, $output); - $data = []; - $keys = $this->deployer->config->keys(); - define('DEPLOYER_NO_ASK', true); - foreach ($hosts as $host) { - Context::push(new Context($host)); - $values = []; - foreach ($keys as $key) { - try { - $values[$key] = $host->get($key); - } catch (WillAskUser $exception) { - $values[$key] = ['ask' => $exception->getMessage()]; - } catch (\Throwable $exception) { - $values[$key] = ['error' => $exception->getMessage()]; - } - } - foreach ($host->config()->persist() as $k => $v) { - $values[$k] = $v; - } - ksort($values); - $data[$host->getAlias()] = $values; - Context::pop(); - } - $format = $input->getOption('format'); - switch ($format) { - case 'json': - $output->writeln(json_encode($data, JSON_PRETTY_PRINT)); - break; - - case 'yaml': - $output->write(Yaml::dump($data)); - break; - - default: - throw new \Exception("Unknown format: $format."); - } - return 0; - } -} diff --git a/src/Command/CustomOption.php b/src/Command/CustomOption.php deleted file mode 100644 index f51af8d77..000000000 --- a/src/Command/CustomOption.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Host\Host; - -trait CustomOption -{ - /** - * @param Host[] $hosts - * @param string[] $options - */ - protected function applyOverrides(array $hosts, array $options) - { - $override = []; - foreach ($options as $option) { - list($name, $value) = explode('=', $option); - $value = $this->castValueToPhpType(trim($value)); - $override[trim($name)] = $value; - } - - foreach ($hosts as $host) { - foreach ($override as $key => $value) { - $host->set($key, $value); - } - } - } - - /** - * @param mixed $value - * @return bool|mixed - */ - protected function castValueToPhpType($value) - { - switch ($value) { - case 'true': - return true; - case 'false': - return false; - default: - return $value; - } - } -} diff --git a/src/Command/InitCommand.php b/src/Command/InitCommand.php deleted file mode 100644 index 6d98e5bb9..000000000 --- a/src/Command/InitCommand.php +++ /dev/null @@ -1,258 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\Process\Exception\RuntimeException; -use Symfony\Component\Process\PhpProcess; -use Symfony\Component\Process\Process; - -class InitCommand extends Command -{ - use CommandCommon; - - protected function configure() - { - $this - ->setName('init') - ->setDescription('Initialize deployer in your project') - ->addOption('path', 'p', InputOption::VALUE_OPTIONAL, 'Recipe path'); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - if (getenv('COLORTERM') === 'truecolor') { - $output->write(<<write(<<getOption('path'); - - $language = $io->choice('Select recipe language', ['php', 'yaml'], 'php'); - if (empty($recipePath)) { - $recipePath = "deploy.$language"; - } - - // Avoid accidentally override of existing file. - if (file_exists($recipePath)) { - $io->warning("$recipePath already exists"); - if (!$io->confirm("Do you want to override the existing file?", false)) { - $io->block('👍🏻'); - exit(1); - } - } - - // Template - $template = $io->choice('Select project template', $this->recipes(), 'common'); - - // Repo - $default = ''; - try { - $process = Process::fromShellCommandline('git remote get-url origin'); - $default = $process->mustRun()->getOutput(); - $default = trim($default); - } catch (RuntimeException $e) { - } - $repository = $io->ask('Repository', $default); - - // Guess host - if (preg_match('/github.com:(?[A-Za-z0-9_.\-]+)\//', $repository, $m)) { - $org = $m['org']; - $tempHostFile = tempnam(sys_get_temp_dir(), 'temp-host-file'); - $php = new PhpProcess(<<blog, PHP_URL_HOST); -file_put_contents('$tempHostFile', \$host); -EOF - ); - $php->start(); - } - - // Project - $default = ''; - try { - $process = Process::fromShellCommandline('basename "$PWD"'); - $default = $process->mustRun()->getOutput(); - $default = trim($default); - } catch (RuntimeException $e) { - } - $project = $io->ask('Project name', $default); - - // Hosts - $host = null; - if (isset($tempHostFile)) { - $host = file_get_contents($tempHostFile); - } - $hostsString = $io->ask('Hosts (comma separated)', $host); - if ($hostsString !== null) { - $hosts = explode(',', $hostsString); - } else { - $hosts = []; - } - - file_put_contents($recipePath, $this->$language($template, $project, $repository, $hosts)); - - $this->telemetry(); - $output->writeln(sprintf( - 'Successfully created %s', - $recipePath - )); - return 0; - } - - private function php(string $template, string $project, string $repository, array $hosts): string - { - $h = ""; - foreach ($hosts as $host) { - $h .= "host('{$host}')\n" . - " ->set('remote_user', 'deployer')\n" . - " ->set('deploy_path', '~/{$project}');\n"; - } - - return <<getAdditionalConfigs($template); - - return <<isDot()) { - continue; - } - if ($fileinfo->isDir()) { - continue; - } - - $recipe = pathinfo($fileinfo->getFilename(), PATHINFO_FILENAME); - - if ($recipe === 'README') { - continue; - } - - $recipes[] = $recipe; - } - - sort($recipes); - return $recipes; - } -} diff --git a/src/Command/MainCommand.php b/src/Command/MainCommand.php deleted file mode 100644 index 567ba6ed6..000000000 --- a/src/Command/MainCommand.php +++ /dev/null @@ -1,234 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Configuration\Configuration; -use Deployer\Deployer; -use Deployer\Exception\Exception; -use Deployer\Exception\GracefulShutdownException; -use Deployer\Executor\Planner; -use Deployer\Utility\Httpie; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Input\InputOption as Option; -use Symfony\Component\Console\Output\OutputInterface as Output; -use function Deployer\Support\find_config_line; -use function Deployer\warning; - -class MainCommand extends SelectCommand -{ - use CustomOption; - use CommandCommon; - - public function __construct(string $name, ?string $description, Deployer $deployer) - { - parent::__construct($name, $deployer); - if ($description) { - $this->setDescription($description); - } - } - - protected function configure() - { - parent::configure(); - - // Add global options defined with `option()` func. - $this->getDefinition()->addOptions($this->deployer->inputDefinition->getOptions()); - - $this->addOption( - 'option', - 'o', - Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, - 'Set configuration option' - ); - $this->addOption( - 'limit', - 'l', - Option::VALUE_REQUIRED, - 'How many tasks to run in parallel?' - ); - $this->addOption( - 'no-hooks', - null, - Option::VALUE_NONE, - 'Run tasks without after/before hooks' - ); - $this->addOption( - 'plan', - null, - Option::VALUE_NONE, - 'Show execution plan' - ); - $this->addOption( - 'start-from', - null, - Option::VALUE_REQUIRED, - 'Start execution from this task' - ); - $this->addOption( - 'log', - null, - Option::VALUE_REQUIRED, - 'Write log to a file' - ); - $this->addOption( - 'profile', - null, - Option::VALUE_REQUIRED, - 'Write profile to a file' - ); - } - - protected function execute(Input $input, Output $output): int - { - $this->deployer->input = $input; - $this->deployer->output = $output; - $this->deployer['log'] = $input->getOption('log'); - $this->telemetry([ - 'project_hash' => empty($this->deployer->config['repository']) ? null : sha1($this->deployer->config['repository']), - 'hosts_count' => $this->deployer->hosts->count(), - 'recipes' => $this->deployer->config->get('recipes', []), - ]); - - $hosts = $this->selectHosts($input, $output); - $this->applyOverrides($hosts, $input->getOption('option')); - - // Save selected_hosts for selectedHosts() func. - $hostsAliases = []; - foreach ($hosts as $host) { - $hostsAliases[] = $host->getAlias(); - } - // Save selected_hosts per each host, and not globally. Otherwise it will - // not be accessible for workers. - foreach ($hosts as $host) { - $host->set('selected_hosts', $hostsAliases); - } - - $plan = $input->getOption('plan') ? new Planner($output, $hosts) : null; - - $this->deployer->scriptManager->setHooksEnabled(!$input->getOption('no-hooks')); - $startFrom = $input->getOption('start-from'); - if ($startFrom && !$this->deployer->tasks->has($startFrom)) { - throw new Exception("Task $startFrom does not exist."); - } - $skippedTasks = []; - $tasks = $this->deployer->scriptManager->getTasks($this->getName(), $startFrom, $skippedTasks); - - if (empty($tasks)) { - throw new Exception('No task will be executed, because the selected hosts do not meet the conditions of the tasks'); - } - - if (!$plan) { - $this->checkUpdates(); - $this->validateConfig(); - $this->deployer->server->start(); - - if (!empty($skippedTasks)) { - foreach ($skippedTasks as $taskName) { - $output->writeln("skip $taskName"); - } - } - } - $exitCode = $this->deployer->master->run($tasks, $hosts, $plan); - - if ($plan) { - $plan->render(); - return 0; - } - - if ($exitCode === 0) { - $this->showBanner(); - return 0; - } - if ($exitCode === GracefulShutdownException::EXIT_CODE) { - return 1; - } - - // Check if we have tasks to execute on failure. - if ($this->deployer['fail']->has($this->getName())) { - $taskName = $this->deployer['fail']->get($this->getName()); - $tasks = $this->deployer->scriptManager->getTasks($taskName); - $this->deployer->master->run($tasks, $hosts); - } - - return $exitCode; - } - - private function checkUpdates() - { - try { - fwrite(STDERR, Httpie::get('https://deployer.org/check-updates/' . DEPLOYER_VERSION)->send()); - } catch (\Throwable $e) { - // Meh - } - } - - private function showBanner() - { - try { - $withColors = getenv('COLORTERM') === 'truecolor' ? '_with_colors' : ''; - fwrite(STDERR, Httpie::get("https://deployer.org/banners/" . $this->getName() . $withColors)->send()); - } catch (\Throwable $e) { - // Meh - } - } - - private function validateConfig(): void - { - if (!defined('DEPLOYER_DEPLOY_FILE')) { - return; - } - $validate = function (Configuration $configA, Configuration $configB): void { - $keysA = array_keys($configA->ownValues()); - $keysB = array_keys($configB->ownValues()); - for ($i = 0; $i < count($keysA); $i++) { - for ($j = $i + 1; $j < count($keysB); $j++) { - $a = $keysA[$i]; - $b = $keysB[$j]; - if (levenshtein($a, $b) == 1) { - $source = file_get_contents(DEPLOYER_DEPLOY_FILE); - $code = ''; - foreach (find_config_line($source, $a) as list($n, $line)) { - $code .= " $n: " . str_replace($a, "$a", $line) . "\n"; - } - foreach (find_config_line($source, $b) as list($n, $line)) { - $code .= " $n: " . str_replace($b, "$b", $line) . "\n"; - } - if (!empty($code)) { - warning(<<$a" or "$b"? - - $code - AAA - ); - } - } - } - } - }; - - $validate($this->deployer->config, $this->deployer->config); - foreach ($this->deployer->hosts as $host) { - $validate($host->config(), $this->deployer->config); - } - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - parent::complete($input, $suggestions); - if ($input->mustSuggestOptionValuesFor('start-from')) { - $taskNames = []; - foreach ($this->deployer->scriptManager->getTasks($this->getName()) as $task) { - $taskNames[] = $task->getName(); - } - $suggestions->suggestValues($taskNames); - } - } -} diff --git a/src/Command/RunCommand.php b/src/Command/RunCommand.php deleted file mode 100644 index 8b60f68c4..000000000 --- a/src/Command/RunCommand.php +++ /dev/null @@ -1,88 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Task\Context; -use Deployer\Task\Task; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Input\InputOption as Option; -use Symfony\Component\Console\Output\OutputInterface as Output; -use function Deployer\cd; -use function Deployer\get; -use function Deployer\has; -use function Deployer\run; -use function Deployer\test; - -class RunCommand extends SelectCommand -{ - use CustomOption; - - public function __construct(Deployer $deployer) - { - parent::__construct('run', $deployer); - $this->setDescription('Run any arbitrary command on hosts'); - } - - protected function configure() - { - $this->addArgument( - 'command-to-run', - InputArgument::REQUIRED, - 'Command to run on a remote host' - ); - parent::configure(); - $this->addOption( - 'option', - 'o', - Option::VALUE_REQUIRED | Option::VALUE_IS_ARRAY, - 'Set configuration option' - ); - $this->addOption( - 'timeout', - 't', - Option::VALUE_REQUIRED, - 'Command timeout in seconds' - ); - } - - protected function execute(Input $input, Output $output): int - { - $this->deployer->input = $input; - $this->deployer->output = $output; - - $command = $input->getArgument('command-to-run') ?? ''; - $hosts = $this->selectHosts($input, $output); - $this->applyOverrides($hosts, $input->getOption('option')); - - $task = new Task($command, function () use ($input, $command) { - if (has('current_path')) { - $path = get('current_path'); - if (test("[ -d $path ]")) { - cd($path); - } - } - run($command, [ - 'real_time_output' => true, - 'timeout' => intval($input->getOption('timeout')), - ]); - }); - - foreach ($hosts as $host) { - try { - $task->run(new Context($host)); - } catch (\Throwable $exception) { - $this->deployer->messenger->renderException($exception, $host); - } - } - - return 0; - } -} diff --git a/src/Command/SelectCommand.php b/src/Command/SelectCommand.php deleted file mode 100644 index 34c2ff31e..000000000 --- a/src/Command/SelectCommand.php +++ /dev/null @@ -1,120 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Exception\ConfigurationException; -use Deployer\Exception\Exception; -use Deployer\Host\Host; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Output\OutputInterface as Output; -use Symfony\Component\Console\Question\ChoiceQuestion; - -abstract class SelectCommand extends Command -{ - /** - * @var Deployer - */ - protected $deployer; - - public function __construct(string $name, Deployer $deployer) - { - $this->deployer = $deployer; - parent::__construct($name); - } - - protected function configure() - { - $this->addArgument('selector', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'Host selector'); - } - - /** - * @return Host[] - */ - protected function selectHosts(Input $input, Output $output): array - { - $output->getFormatter()->setStyle('success', new OutputFormatterStyle('green')); - if (!$output->isDecorated() && !defined('NO_ANSI')) { - define('NO_ANSI', 'true'); - } - $selector = $input->getArgument('selector'); - $selectExpression = is_array($selector) ? implode(',', $selector) : $selector; - - if (empty($selectExpression)) { - if (count($this->deployer->hosts) === 0) { - throw new ConfigurationException("No host configured.\nSpecify at least one host: `localhost();`."); - } else if (count($this->deployer->hosts) === 1) { - $hosts = $this->deployer->hosts->all(); - } else if ($input->isInteractive()) { - $hostsAliases = []; - foreach ($this->deployer->hosts as $host) { - $hostsAliases[] = $host->getAlias(); - } - /** @var QuestionHelper $helper */ - $helper = $this->getHelper('question'); - $question = new ChoiceQuestion( - 'Select hosts: (comma separated)', - $hostsAliases - ); - $question->setMultiselect(true); - $question->setErrorMessage('There is no "%s" host.'); - $answer = $helper->ask($input, $output, $question); - $answer = array_unique($answer); - $hosts = $this->deployer->hosts->select(function (Host $host) use ($answer) { - return in_array($host->getAlias(), $answer, true); - }); - } - } else { - $hosts = $this->deployer->selector->select($selectExpression); - } - - if (empty($hosts)) { - $message = 'No host selected.'; - if (!empty($selectExpression)) { - $message .= " Please, check your selector:\n\n $selectExpression"; - } - throw new Exception($message); - } - - return $hosts; - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - parent::complete($input, $suggestions); - if ($input->mustSuggestArgumentValuesFor('selector')) { - $selectors = ['all']; - $configs = []; - foreach ($this->deployer->hosts as $host) { - $configs[$host->getAlias()] = $host->config()->persist(); - } - foreach ($configs as $alias => $c) { - $selectors[] = $alias; - foreach ($c['labels'] ?? [] as $label => $value) { - $selectors[] = "$label=$value"; - } - } - $selectors = array_unique($selectors); - $suggestions->suggestValues($selectors); - } - if ($input->mustSuggestOptionValuesFor('option')) { - $values = []; - foreach ($this->deployer->config->keys() as $key) { - $values[] = $key . '='; - } - $suggestions->suggestValues($values); - } - } -} diff --git a/src/Command/SshCommand.php b/src/Command/SshCommand.php deleted file mode 100644 index df324c384..000000000 --- a/src/Command/SshCommand.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Component\Ssh\Client; -use Deployer\Deployer; -use Deployer\Host\Localhost; -use Deployer\Task\Context; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; - -/** - * @codeCoverageIgnore - */ -class SshCommand extends Command -{ - use CommandCommon; - - /** - * @var Deployer - */ - private $deployer; - - public function __construct(Deployer $deployer) - { - parent::__construct('ssh'); - $this->setDescription('Connect to host through ssh'); - $this->deployer = $deployer; - } - - protected function configure() - { - $this->addArgument( - 'hostname', - InputArgument::OPTIONAL, - 'Hostname' - ); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $this->telemetry(); - $hostname = $input->getArgument('hostname'); - if (!empty($hostname)) { - $host = $this->deployer->hosts->get($hostname); - } else { - $hostsAliases = []; - foreach ($this->deployer->hosts as $host) { - if ($host instanceof Localhost) { - continue; - } - $hostsAliases[] = $host->getAlias(); - } - - if (count($hostsAliases) === 0) { - $output->writeln('No remote hosts.'); - return 2; // Because there are no hosts. - } - - if (count($hostsAliases) === 1) { - $host = current($this->deployer->hosts->all()); - } else { - $helper = $this->getHelper('question'); - $question = new ChoiceQuestion( - 'Select host:', - $hostsAliases - ); - $question->setErrorMessage('There is no "%s" host.'); - - $hostname = $helper->ask($input, $output, $question); - $host = $this->deployer->hosts->get($hostname); - } - } - - $shell_path = 'exec $SHELL -l'; - if ($host->has('shell_path')) { - $shell_path = 'exec ' . $host->get('shell_path') . ' -l'; - } - - Context::push(new Context($host)); - $host->setSshMultiplexing(false); - $options = $host->connectionOptionsString(); - $deployPath = $host->get('deploy_path', '~'); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - passthru("ssh -t $options {$host->connectionString()} \"cd $deployPath/current 2>/dev/null || cd $deployPath; $shell_path\""); - } else { - passthru("ssh -t $options {$host->connectionString()} 'cd $deployPath/current 2>/dev/null || cd $deployPath; $shell_path'"); - } - return 0; - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - parent::complete($input, $suggestions); - if ($input->mustSuggestArgumentValuesFor('hostname')) { - $suggestions->suggestValues(array_keys($this->deployer->hosts->all())); - } - } -} diff --git a/src/Command/TreeCommand.php b/src/Command/TreeCommand.php deleted file mode 100644 index 3357dd889..000000000 --- a/src/Command/TreeCommand.php +++ /dev/null @@ -1,178 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Task\GroupTask; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Completion\CompletionInput; -use Symfony\Component\Console\Completion\CompletionSuggestions; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface as Input; -use Symfony\Component\Console\Output\OutputInterface as Output; - -class TreeCommand extends Command -{ - /** - * @var Output - */ - protected $output; - /** - * @var Deployer - */ - private $deployer; - /** - * @var array - */ - private $tree; - /** - * @var int - */ - private $depth = 0; - /** - * @var array - */ - private $openGroupDepths = []; - - public function __construct(Deployer $deployer) - { - parent::__construct('tree'); - $this->setDescription('Display the task-tree for a given task'); - $this->deployer = $deployer; - $this->tree = []; - } - - protected function configure() - { - $this->addArgument( - 'task', - InputArgument::REQUIRED, - 'Task to display the tree for' - ); - } - - protected function execute(Input $input, Output $output): int - { - $this->output = $output; - - $rootTaskName = $input->getArgument('task'); - - $this->buildTree($rootTaskName); - $this->outputTree($rootTaskName); - return 0; - } - - private function buildTree(string $taskName) - { - $this->createTreeFromTaskName($taskName, '', true); - } - - private function createTreeFromTaskName(string $taskName, string $postfix = '', bool $isLast = false) - { - $task = $this->deployer->tasks->get($taskName); - - if (!$task->isEnabled()) { - if (empty($postfix)) { - $postfix = ' // disabled'; - } else { - $postfix .= '; disabled'; - } - } - - if ($task->getBefore()) { - $beforePostfix = sprintf(" // before %s", $task->getName()); - - foreach ($task->getBefore() as $beforeTask) { - $this->createTreeFromTaskName($beforeTask, $beforePostfix); - } - } - - if ($task instanceof GroupTask) { - $isLast = $isLast && empty($task->getAfter()); - - $this->addTaskToTree($task->getName() . $postfix, $isLast); - - if (!$isLast) { - $this->openGroupDepths[] = $this->depth; - } - - $this->depth++; - - $taskGroup = $task->getGroup(); - foreach ($taskGroup as $subtask) { - $isLastSubtask = $subtask === end($taskGroup); - $this->createTreeFromTaskName($subtask, '', $isLastSubtask); - } - - if (!$isLast) { - array_pop($this->openGroupDepths); - } - - $this->depth--; - } else { - $this->addTaskToTree($task->getName() . $postfix, $isLast); - } - - if ($task->getAfter()) { - $afterPostfix = sprintf(" // after %s", $task->getName()); - - foreach ($task->getAfter() as $afterTask) { - $this->createTreeFromTaskName($afterTask, $afterPostfix); - } - } - } - - private function addTaskToTree(string $taskName, bool $isLast = false) - { - $this->tree[] = [ - 'taskName' => $taskName, - 'depth' => $this->depth, - 'isLast' => $isLast, - 'openDepths' => $this->openGroupDepths - ]; - } - - private function outputTree(string $taskName) - { - $this->output->writeln("The task-tree for $taskName:"); - - /** - * @var int number of spaces for each depth increase - */ - $REPEAT_COUNT = 4; - - foreach ($this->tree as $treeItem) { - $depth = $treeItem['depth']; - - $startSymbol = $treeItem['isLast'] || $treeItem === end($this->tree) ? '└' : '├'; - - $prefix = ''; - - for ($i = 0; $i < $depth; $i++) { - if (in_array($i, $treeItem['openDepths'])) { - $prefix .= '│' . str_repeat(' ', $REPEAT_COUNT - 1); - } else { - $prefix .= str_repeat(' ', $REPEAT_COUNT); - } - } - - $prefix .= $startSymbol . '──'; - - $this->output->writeln(sprintf('%s %s', $prefix, $treeItem['taskName'])); - } - } - - public function complete(CompletionInput $input, CompletionSuggestions $suggestions): void - { - parent::complete($input, $suggestions); - if ($input->mustSuggestArgumentValuesFor('task')) { - $suggestions->suggestValues(array_keys($this->deployer->tasks->all())); - } - } -} diff --git a/src/Command/WorkerCommand.php b/src/Command/WorkerCommand.php deleted file mode 100644 index b62954ba2..000000000 --- a/src/Command/WorkerCommand.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Command; - -use Deployer\Deployer; -use Deployer\Executor\Worker; -use Deployer\Host\Localhost; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption as Option; -use Symfony\Component\Console\Output\OutputInterface; -use function Deployer\localhost; - -class WorkerCommand extends MainCommand -{ - public function __construct(Deployer $deployer) - { - parent::__construct('worker', null, $deployer); - $this->setHidden(true); - } - - protected function configure() - { - parent::configure(); - $this->addOption('task', null, Option::VALUE_REQUIRED); - $this->addOption('host', null, Option::VALUE_REQUIRED); - $this->addOption('port', null, Option::VALUE_REQUIRED); - $this->addOption('decorated', null, Option::VALUE_NONE); - } - - protected function execute(InputInterface $input, OutputInterface $output): int - { - $this->deployer->input = $input; - $this->deployer->output = $output; - $this->deployer['log'] = $input->getOption('log'); - $output->setDecorated($input->getOption('decorated')); - if (!$output->isDecorated() && !defined('NO_ANSI')) { - define('NO_ANSI', 'true'); - } - $this->deployer->config->set('master_url', 'http://localhost:' . $input->getOption('port')); - - $task = $this->deployer->tasks->get($input->getOption('task')); - $host = $this->deployer->hosts->get($input->getOption('host')); - $host->config()->load(); - - $worker = new Worker($this->deployer); - $exitCode = $worker->execute($task, $host); - - $host->config()->save(); - return $exitCode; - } -} diff --git a/src/Component/PharUpdate/Console/Command.php b/src/Component/PharUpdate/Console/Command.php deleted file mode 100644 index f63f4e6cd..000000000 --- a/src/Component/PharUpdate/Console/Command.php +++ /dev/null @@ -1,132 +0,0 @@ - - */ -class Command extends Base -{ - /** - * Disable the ability to upgrade? - * - * @var boolean - */ - private $disableUpgrade = false; - - /** - * The manifest file URI. - * - * @var string - */ - private $manifestUri; - - /** - * The running file (the Phar that will be updated). - * - * @var string - */ - private $runningFile; - - /** - * @param string $name The command name. - * @param boolean $disable Disable upgrading? - */ - public function __construct(string $name, bool $disable = false) - { - $this->disableUpgrade = $disable; - - parent::__construct($name); - } - - /** - * Sets the manifest URI. - * - * @param string $uri The URI. - */ - public function setManifestUri(string $uri) - { - $this->manifestUri = $uri; - } - - /** - * Sets the running file (the Phar that will be updated). - * - * @param string $file The file name or path. - */ - public function setRunningFile(string $file): void - { - $this->runningFile = $file; - } - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->setDescription('Updates the application.'); - $this->addOption( - 'pre', - 'p', - InputOption::VALUE_NONE, - 'Allow pre-release updates.' - ); - $this->addOption( - 'redo', - 'r', - InputOption::VALUE_NONE, - 'Redownload update if already using current version.' - ); - - if (false === $this->disableUpgrade) { - $this->addOption( - 'upgrade', - 'u', - InputOption::VALUE_NONE, - 'Upgrade to next major release, if available.' - ); - } - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->manifestUri) { - throw new LogicException( - 'No manifest URI has been configured.' - ); - } - - $output->writeln('Looking for updates...'); - - /** @var Helper */ - $pharUpdate = $this->getHelper('phar-update'); - /** @var Manager $manager */ - $manager = $pharUpdate->getManager($this->manifestUri); - $manager->setRunningFile($this->runningFile); - - if ($manager->update( - $this->getApplication()->getVersion(), - $this->disableUpgrade ?: (false === $input->getOption('upgrade')), - $input->getOption('pre') - )) { - $output->writeln('Update successful!'); - } else { - $output->writeln('Already up-to-date.'); - } - - // Force exit to prevent warnings - die(0); - } -} diff --git a/src/Component/PharUpdate/Console/Helper.php b/src/Component/PharUpdate/Console/Helper.php deleted file mode 100644 index 3e66dc7fa..000000000 --- a/src/Component/PharUpdate/Console/Helper.php +++ /dev/null @@ -1,32 +0,0 @@ - - */ -class Helper extends Base -{ - /** - * Returns the update manager. - * - * @param string $uri The manifest file URI. - * - * @return Manager The update manager. - */ - public function getManager(string $uri): Manager - { - return new Manager(Manifest::loadFile($uri)); - } - - public function getName(): string - { - return 'phar-update'; - } -} diff --git a/src/Component/PharUpdate/Exception/Exception.php b/src/Component/PharUpdate/Exception/Exception.php deleted file mode 100644 index fce54bc20..000000000 --- a/src/Component/PharUpdate/Exception/Exception.php +++ /dev/null @@ -1,35 +0,0 @@ - - */ -class Exception extends \Exception implements ExceptionInterface -{ - /** - * Creates a new exception using a format and values. - * - * @param mixed $value,... The value(s). - */ - public static function create(string $format, $value = null): self - { - if (0 < func_num_args()) { - $format = vsprintf($format, array_slice(func_get_args(), 1)); - } - - return new static($format); - } - - /** - * Creates an exception for the last error message. - */ - public static function lastError(): self - { - $error = error_get_last(); - - return new static($error['message']); - } -} diff --git a/src/Component/PharUpdate/Exception/ExceptionInterface.php b/src/Component/PharUpdate/Exception/ExceptionInterface.php deleted file mode 100644 index 813798ac7..000000000 --- a/src/Component/PharUpdate/Exception/ExceptionInterface.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ -interface ExceptionInterface -{ -} diff --git a/src/Component/PharUpdate/Exception/FileException.php b/src/Component/PharUpdate/Exception/FileException.php deleted file mode 100644 index 92585250c..000000000 --- a/src/Component/PharUpdate/Exception/FileException.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ -class FileException extends Exception -{ -} diff --git a/src/Component/PharUpdate/Exception/InvalidArgumentException.php b/src/Component/PharUpdate/Exception/InvalidArgumentException.php deleted file mode 100644 index 7690c5687..000000000 --- a/src/Component/PharUpdate/Exception/InvalidArgumentException.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ -class InvalidArgumentException extends Exception -{ -} diff --git a/src/Component/PharUpdate/Exception/LogicException.php b/src/Component/PharUpdate/Exception/LogicException.php deleted file mode 100644 index 1273dcf4a..000000000 --- a/src/Component/PharUpdate/Exception/LogicException.php +++ /dev/null @@ -1,12 +0,0 @@ - - */ -class LogicException extends Exception -{ -} diff --git a/src/Component/PharUpdate/Manager.php b/src/Component/PharUpdate/Manager.php deleted file mode 100644 index f7bd52cc9..000000000 --- a/src/Component/PharUpdate/Manager.php +++ /dev/null @@ -1,112 +0,0 @@ - - */ -class Manager -{ - /** - * The update manifest. - * - * @var Manifest - */ - private $manifest; - - /** - * The running file (the Phar that will be updated). - * - * @var string - */ - private $runningFile; - - /** - * Sets the update manifest. - * - * @param Manifest $manifest The manifest. - */ - public function __construct(Manifest $manifest) - { - $this->manifest = $manifest; - } - - /** - * Returns the manifest. - * - * @return Manifest The manifest. - */ - public function getManifest(): Manifest - { - return $this->manifest; - } - - /** - * Returns the running file (the Phar that will be updated). - * - * @return string The file. - */ - public function getRunningFile(): string - { - if (null === $this->runningFile) { - $this->runningFile = realpath($_SERVER['argv'][0]); - } - - return $this->runningFile; - } - - /** - * Sets the running file (the Phar that will be updated). - * - * @param string $file The file name or path. - * - * @throws Exception\Exception - * @throws InvalidArgumentException If the file path is invalid. - */ - public function setRunningFile(string $file): void - { - if (false === is_file($file)) { - throw InvalidArgumentException::create( - 'The file "%s" is not a file or it does not exist.', - $file - ); - } - - $this->runningFile = $file; - } - - /** - * Updates the running Phar if any is available. - * - * @param string|Version $version The current version. - * @param boolean $major Lock to current major version? - * @param boolean $pre Allow pre-releases? - * - * @return boolean TRUE if an update was performed, FALSE if none available. - */ - public function update($version, bool $major = false, bool $pre = false): bool - { - if (false === ($version instanceof Version)) { - $version = Parser::toVersion($version); - } - - if (null !== ($update = $this->manifest->findRecent( - $version, - $major, - $pre - ))) { - $update->getFile(); - $update->copyTo($this->getRunningFile()); - - return true; - } - - return false; - } -} diff --git a/src/Component/PharUpdate/Manifest.php b/src/Component/PharUpdate/Manifest.php deleted file mode 100644 index a9fa5f767..000000000 --- a/src/Component/PharUpdate/Manifest.php +++ /dev/null @@ -1,131 +0,0 @@ - - */ -class Manifest -{ - /** - * The list of updates in the manifest. - * - * @var Update[] - */ - private $updates; - - /** - * Sets the list of updates from the manifest. - * - * @param Update[] $updates The updates. - */ - public function __construct(array $updates = array()) - { - $this->updates = $updates; - } - - /** - * Finds the most recent update and returns it. - * - * @param Version $version The current version. - * @param boolean $major Lock to major version? - * @param boolean $pre Allow pre-releases? - */ - public function findRecent(Version $version, bool $major = false, bool $pre = false):? Update - { - /** @var Update|null */ - $current = null; - $major = $major ? $version->getMajor() : null; - - foreach ($this->updates as $update) { - if ($major && ($major !== $update->getVersion()->getMajor())) { - continue; - } - - if ((false === $pre) - && !$update->getVersion()->isStable()) { - continue; - } - - $test = $current ? $current->getVersion() : $version; - - if (false === $update->isNewer($test)) { - continue; - } - - $current = $update; - } - - return $current; - } - - /** - * Returns the list of updates in the manifest. - * - * @return Update[] The updates. - */ - public function getUpdates(): array - { - return $this->updates; - } - - /** - * Loads the manifest from a JSON encoded string. - * - * @param string $json The JSON encoded string. - */ - public static function load(string $json): self - { - return self::create(json_decode($json)); - } - - /** - * Loads the manifest from a JSON encoded file. - * - * @param string $file The JSON encoded file. - */ - public static function loadFile(string $file): self - { - return self::create(json_decode(file_get_contents($file))); - } - - /** - * Validates the data, processes it, and returns a new instance of Manifest. - * - * @param array $decoded The decoded JSON data. - * - * @return static The new instance. - */ - private static function create(array $decoded): self - { - $updates = array(); - - foreach ($decoded as $update) { - $updates[] = new Update( - $update->name, - $update->sha1, - $update->url, - Parser::toVersion($update->version), - isset($update->publicKey) ? $update->publicKey : null - ); - } - - usort( - $updates, - function (Update $a, Update $b) { - return Comparator::isGreaterThan( - $a->getVersion(), - $b->getVersion() - ) ? 1 : 0; - } - ); - - return new static($updates); - } -} diff --git a/src/Component/PharUpdate/Update.php b/src/Component/PharUpdate/Update.php deleted file mode 100644 index 7d897a30a..000000000 --- a/src/Component/PharUpdate/Update.php +++ /dev/null @@ -1,272 +0,0 @@ - - */ -class Update -{ - /** - * The temporary file path. - * - * @var string|null - */ - private $file; - - /** - * The name of the update file. - * - * @var string - */ - private $name; - - /** - * The URL where the public key can be downloaded from. - * - * @var string - */ - private $publicKey; - - /** - * The SHA1 file checksum. - * - * @var string - */ - private $sha1; - - /** - * The URL where the update can be downloaded from. - * - * @var string - */ - private $url; - - /** - * The version of the update. - * - * @var Version - */ - private $version; - - /** - * Sets the update information. - * - * @param string $name The name of the update file. - * @param string $sha1 The SHA1 file checksum. - * @param string $url The URL where the update can be downloaded from. - * @param Version $version The version of the update. - * @param string $key The URL where the public key can be downloaded - * from. - */ - public function __construct( - string $name, - string $sha1, - string $url, - Version $version, - string $key = null - ) { - $this->name = $name; - $this->publicKey = $key; - $this->sha1 = $sha1; - $this->url = $url; - $this->version = $version; - } - - /** - * Copies the update file to the destination. - * - * @param string $file The target file. - * - * @throws Exception\Exception - * @throws FileException If the file could not be replaced. - */ - public function copyTo(string $file): void - { - if (null === $this->file) { - throw LogicException::create( - 'The update file has not been downloaded.' - ); - } - - $mode = 0755; - - if (file_exists($file)) { - $mode = fileperms($file) & 511; - } - - if (false === @copy($this->file, $file)) { - throw FileException::lastError(); - } - - if (false === @chmod($file, $mode)) { - throw FileException::lastError(); - } - - $key = $file . '.pubkey'; - - if (file_exists($this->file . '.pubkey')) { - if (false === @copy($this->file . '.pubkey', $key)) { - throw FileException::lastError(); - } - } elseif (file_exists($key)) { - if (false === @unlink($key)) { - throw FileException::lastError(); - } - } - } - - /** - * Cleans up by deleting the temporary update file. - * - * @throws FileException If the file could not be deleted. - */ - public function deleteFile(): void - { - if ($this->file) { - if (file_exists($this->file)) { - if (false === @unlink($this->file)) { - throw FileException::lastError(); - } - } - - if (file_exists($this->file . '.pubkey')) { - if (false === @unlink($this->file . '.pubkey')) { - throw FileException::lastError(); - } - } - - $dir = dirname($this->file); - - if (file_exists($dir)) { - if (false === @rmdir($dir)) { - throw FileException::lastError(); - } - } - - $this->file = null; - } - } - - /** - * Downloads the update file to a temporary location. - * - * @return string The temporary file path. - * - * @throws Exception\Exception - * @throws FileException If the SHA1 checksum differs. - * @throws UnexpectedValueException If the Phar is corrupt. - */ - public function getFile():? string - { - if (null === $this->file) { - unlink($this->file = tempnam(sys_get_temp_dir(), 'upd')); - mkdir($this->file); - - $this->file .= DIRECTORY_SEPARATOR . $this->name; - - $in = new SplFileObject($this->url, 'rb', false); - $out = new SplFileObject($this->file, 'wb', false); - - while (false === $in->eof()) { - $out->fwrite($in->fgets()); - } - - unset($in, $out); - - if ($this->publicKey) { - $in = new SplFileObject($this->publicKey, 'r', false); - $out = new SplFileObject($this->file . '.pubkey', 'w', false); - - while (false === $in->eof()) { - $out->fwrite($in->fgets()); - } - - unset($in, $out); - } - - if ($this->sha1 !== ($sha1 = sha1_file($this->file))) { - $this->deleteFile(); - - throw FileException::create( - 'Mismatch of the SHA1 checksum (%s) of the downloaded file (%s).', - $this->sha1, - $sha1 - ); - } - - // double check - try { - new Phar($this->file); - } catch (UnexpectedValueException $exception) { - $this->deleteFile(); - - throw $exception; - } - } - - return $this->file; - } - - /** - * Returns name of the update file. - */ - public function getName(): string - { - return $this->name; - } - - /** - * Returns the URL where the public key can be downloaded from. - */ - public function getPublicKey(): string - { - return $this->publicKey; - } - - /** - * Returns the SHA1 file checksum. - */ - public function getSha1(): string - { - return $this->sha1; - } - - /** - * Returns the URL where the update can be downloaded from. - */ - public function getUrl(): string - { - return $this->url; - } - - /** - * Returns the version of the update. - */ - public function getVersion(): Version - { - return $this->version; - } - - /** - * Checks if this update is newer than the version given. - * - * @param Version $version The current version. - * - * @return boolean TRUE if the update is newer, FALSE if not. - */ - public function isNewer(Version $version): bool - { - return Comparator::isGreaterThan($this->version, $version); - } -} diff --git a/src/Component/PharUpdate/Version/Builder.php b/src/Component/PharUpdate/Version/Builder.php deleted file mode 100644 index 71451619e..000000000 --- a/src/Component/PharUpdate/Version/Builder.php +++ /dev/null @@ -1,278 +0,0 @@ - - */ -class Builder extends Version -{ - /** - * Removes the build metadata identifiers. - */ - public function clearBuild(): void - { - $this->build = array(); - } - - /** - * Removes the pre-release version identifiers. - */ - public function clearPreRelease(): void - { - $this->preRelease = array(); - } - - /** - * Creates a new Version builder. - * - * @return Builder The Version builder. - */ - public static function create(): Builder - { - return new Builder(); - } - - /** - * Returns a readonly Version instance. - * - * @return Version The readonly Version instance. - */ - public function getVersion(): Version - { - return new Version( - $this->major, - $this->minor, - $this->patch, - $this->preRelease, - $this->build - ); - } - - /** - * Imports the version components. - * - * @param array $components The components. - * - * @return Builder The Version builder. - */ - public function importComponents(array $components): self - { - if (isset($components[Parser::BUILD])) { - $this->build = $components[Parser::BUILD]; - } else { - $this->build = array(); - } - - if (isset($components[Parser::MAJOR])) { - $this->major = $components[Parser::MAJOR]; - } else { - $this->major = 0; - } - - if (isset($components[Parser::MINOR])) { - $this->minor = $components[Parser::MINOR]; - } else { - $this->minor = 0; - } - - if (isset($components[Parser::PATCH])) { - $this->patch = $components[Parser::PATCH]; - } else { - $this->patch = 0; - } - - if (isset($components[Parser::PRE_RELEASE])) { - $this->preRelease = $components[Parser::PRE_RELEASE]; - } else { - $this->preRelease = array(); - } - - return $this; - } - - /** - * Imports the version string representation. - * - * @param string $version The string representation. - * - * @return Builder The Version builder. - */ - public function importString(string $version): self - { - return $this->importComponents(Parser::toComponents($version)); - } - - /** - * Imports an existing Version instance. - * - * @param Version $version A Version instance. - * - * @return Builder The Version builder. - */ - public function importVersion(Version $version): self - { - return $this - ->setMajor($version->getMajor()) - ->setMinor($version->getMinor()) - ->setPatch($version->getPatch()) - ->setPreRelease($version->getPreRelease()) - ->setBuild($version->getBuild()); - } - - /** - * Increments the major version number and resets the minor and patch - * version numbers to zero. - * - * @param int $amount Increment by what amount? - * - * @return Builder The Version builder. - */ - public function incrementMajor(int $amount = 1): self - { - $this->major += $amount; - $this->minor = 0; - $this->patch = 0; - - return $this; - } - - /** - * Increments the minor version number and resets the patch version number - * to zero. - * - * @param int $amount Increment by what amount? - * - * @return Builder The Version builder. - */ - public function incrementMinor(int $amount = 1): self - { - $this->minor += $amount; - $this->patch = 0; - - return $this; - } - - /** - * Increments the patch version number. - * - * @param int $amount Increment by what amount? - * - * @return Builder The Version builder. - */ - public function incrementPatch(int $amount = 1): self - { - $this->patch += $amount; - - return $this; - } - - /** - * Sets the build metadata identifiers. - * - * @param array $identifiers The build metadata identifiers. - * - * @return Builder The Version builder. - * - * @throws InvalidIdentifierException If an identifier is invalid. - */ - public function setBuild(array $identifiers): self - { - foreach ($identifiers as $identifier) { - if (!Validator::isIdentifier($identifier)) { - throw new InvalidIdentifierException($identifier); - } - } - - $this->build = $identifiers; - - return $this; - } - - /** - * Sets the major version number. - * - * @param int $number The major version number. - * - * @return Builder The Version builder. - * - * @throws InvalidNumberException If the number is invalid. - */ - public function setMajor(int $number): self - { - if (!Validator::isNumber($number)) { - throw new InvalidNumberException($number); - } - - $this->major = intval($number); - - return $this; - } - - /** - * Sets the minor version number. - * - * @param int $number The minor version number. - * - * @return Builder The Version builder. - * - * @throws InvalidNumberException If the number is invalid. - */ - public function setMinor(int $number): self - { - if (!Validator::isNumber($number)) { - throw new InvalidNumberException($number); - } - - $this->minor = intval($number); - - return $this; - } - - /** - * Sets the patch version number. - * - * @param int $number The patch version number. - * - * @return Builder The Version builder. - * - * @throws InvalidNumberException If the number is invalid. - */ - public function setPatch(int $number): self - { - if (!Validator::isNumber($number)) { - throw new InvalidNumberException($number); - } - - $this->patch = intval($number); - - return $this; - } - - /** - * Sets the pre-release version identifiers. - * - * @param array $identifiers The pre-release version identifiers. - * - * @return Builder The Version builder. - * - * @throws InvalidIdentifierException If an identifier is invalid. - */ - public function setPreRelease(array $identifiers): self - { - foreach ($identifiers as $identifier) { - if (!Validator::isIdentifier($identifier)) { - throw new InvalidIdentifierException($identifier); - } - } - - $this->preRelease = $identifiers; - - return $this; - } -} diff --git a/src/Component/PharUpdate/Version/Comparator.php b/src/Component/PharUpdate/Version/Comparator.php deleted file mode 100644 index 0cbcd4237..000000000 --- a/src/Component/PharUpdate/Version/Comparator.php +++ /dev/null @@ -1,174 +0,0 @@ - - */ -class Comparator -{ - /** - * The version is equal to another. - */ - const EQUAL_TO = 0; - - /** - * The version is greater than another. - */ - const GREATER_THAN = 1; - - /** - * The version is less than another. - */ - const LESS_THAN = -1; - - /** - * Compares one version with another. - * - * @param Version $left The left version to compare. - * @param Version $right The right version to compare. - * - * @return integer Returns Comparator::EQUAL_TO if the two versions are - * equal. If the left version is less than the right - * version, Comparator::LESS_THAN is returned. If the left - * version is greater than the right version, - * Comparator::GREATER_THAN is returned. - */ - public static function compareTo(Version $left, Version $right) - { - switch (true) { - case ($left->getMajor() < $right->getMajor()): - return self::LESS_THAN; - case ($left->getMajor() > $right->getMajor()): - return self::GREATER_THAN; - case ($left->getMinor() > $right->getMinor()): - return self::GREATER_THAN; - case ($left->getMinor() < $right->getMinor()): - return self::LESS_THAN; - case ($left->getPatch() > $right->getPatch()): - return self::GREATER_THAN; - case ($left->getPatch() < $right->getPatch()): - return self::LESS_THAN; - // @codeCoverageIgnoreStart - } - // @codeCoverageIgnoreEnd - - return self::compareIdentifiers( - $left->getPreRelease(), - $right->getPreRelease() - ); - } - - /** - * Checks if the left version is equal to the right. - * - * @param Version $left The left version to compare. - * @param Version $right The right version to compare. - * - * @return boolean TRUE if the left version is equal to the right, FALSE - * if not. - */ - public static function isEqualTo(Version $left, Version $right) - { - return (self::EQUAL_TO === self::compareTo($left, $right)); - } - - /** - * Checks if the left version is greater than the right. - * - * @param Version $left The left version to compare. - * @param Version $right The right version to compare. - * - * @return boolean TRUE if the left version is greater than the right, - * FALSE if not. - */ - public static function isGreaterThan(Version $left, Version $right) - { - return (self::GREATER_THAN === self::compareTo($left, $right)); - } - - /** - * Checks if the left version is less than the right. - * - * @param Version $left The left version to compare. - * @param Version $right The right version to compare. - * - * @return boolean TRUE if the left version is less than the right, - * FALSE if not. - */ - public static function isLessThan(Version $left, Version $right) - { - return (self::LESS_THAN === self::compareTo($left, $right)); - } - - /** - * Compares the identifier components of the left and right versions. - * - * @param array $left The left identifiers. - * @param array $right The right identifiers. - * - * @return integer Returns Comparator::EQUAL_TO if the two identifiers are - * equal. If the left identifiers is less than the right - * identifiers, Comparator::LESS_THAN is returned. If the - * left identifiers is greater than the right identifiers, - * Comparator::GREATER_THAN is returned. - */ - public static function compareIdentifiers(array $left, array $right) - { - if ($left && empty($right)) { - return self::LESS_THAN; - } elseif (empty($left) && $right) { - return self::GREATER_THAN; - } - - $l = $left; - $r = $right; - $x = self::GREATER_THAN; - $y = self::LESS_THAN; - - if (count($l) < count($r)) { - $l = $right; - $r = $left; - $x = self::LESS_THAN; - $y = self::GREATER_THAN; - } - - foreach (array_keys($l) as $i) { - if (!isset($r[$i])) { - return $x; - } - - if ($l[$i] === $r[$i]) { - continue; - } - - if (true === ($li = (false != preg_match('/^\d+$/', $l[$i])))) { - $l[$i] = intval($l[$i]); - } - - if (true === ($ri = (false != preg_match('/^\d+$/', $r[$i])))) { - $r[$i] = intval($r[$i]); - } - - if ($li && $ri) { - return ($l[$i] > $r[$i]) ? $x : $y; - } elseif (!$li && $ri) { - return $x; - } elseif ($li && !$ri) { - return $y; - } - - $result = strcmp($l[$i], $r[$i]); - - if ($result > 0) { - return $x; - } elseif ($result < 0) { - return $y; - } - } - - return self::EQUAL_TO; - } -} diff --git a/src/Component/PharUpdate/Version/Dumper.php b/src/Component/PharUpdate/Version/Dumper.php deleted file mode 100644 index 4791328ec..000000000 --- a/src/Component/PharUpdate/Version/Dumper.php +++ /dev/null @@ -1,52 +0,0 @@ - - */ -class Dumper -{ - /** - * Returns the components of a Version instance. - * - * @param Version $version A version. - * - * @return array The components. - */ - public static function toComponents(Version $version) - { - return array( - Parser::MAJOR => $version->getMajor(), - Parser::MINOR => $version->getMinor(), - Parser::PATCH => $version->getPatch(), - Parser::PRE_RELEASE => $version->getPreRelease(), - Parser::BUILD => $version->getBuild() - ); - } - - /** - * Returns the string representation of a Version instance. - * - * @param Version $version A version. - * - * @return string The string representation. - */ - public static function toString(Version $version) - { - return sprintf( - '%d.%d.%d%s%s', - $version->getMajor(), - $version->getMinor(), - $version->getPatch(), - $version->getPreRelease() - ? '-' . join('.', $version->getPreRelease()) - : '', - $version->getBuild() - ? '+' . join('.', $version->getBuild()) - : '' - ); - } -} diff --git a/src/Component/PharUpdate/Version/Exception/InvalidIdentifierException.php b/src/Component/PharUpdate/Version/Exception/InvalidIdentifierException.php deleted file mode 100644 index 39b9f09c6..000000000 --- a/src/Component/PharUpdate/Version/Exception/InvalidIdentifierException.php +++ /dev/null @@ -1,45 +0,0 @@ - - */ -class InvalidIdentifierException extends VersionException -{ - /** - * The invalid identifier. - * - * @var string - */ - private $identifier; - - /** - * Sets the invalid identifier. - * - * @param string $identifier The invalid identifier. - */ - public function __construct(string $identifier) - { - parent::__construct( - sprintf( - 'The identifier "%s" is invalid.', - $identifier - ) - ); - - $this->identifier = $identifier; - } - - /** - * Returns the invalid identifier. - * - * @return string The invalid identifier. - */ - public function getIdentifier(): string - { - return $this->identifier; - } -} diff --git a/src/Component/PharUpdate/Version/Exception/InvalidNumberException.php b/src/Component/PharUpdate/Version/Exception/InvalidNumberException.php deleted file mode 100644 index afa7af07e..000000000 --- a/src/Component/PharUpdate/Version/Exception/InvalidNumberException.php +++ /dev/null @@ -1,45 +0,0 @@ - - */ -class InvalidNumberException extends VersionException -{ - /** - * The invalid version number. - * - * @var mixed - */ - private $number; - - /** - * Sets the invalid version number. - * - * @param mixed $number The invalid version number. - */ - public function __construct($number) - { - parent::__construct( - sprintf( - 'The version number "%s" is invalid.', - $number - ) - ); - - $this->number = $number; - } - - /** - * Returns the invalid version number. - * - * @return mixed The invalid version number. - */ - public function getNumber() - { - return $this->number; - } -} diff --git a/src/Component/PharUpdate/Version/Exception/InvalidStringRepresentationException.php b/src/Component/PharUpdate/Version/Exception/InvalidStringRepresentationException.php deleted file mode 100644 index 6839e187f..000000000 --- a/src/Component/PharUpdate/Version/Exception/InvalidStringRepresentationException.php +++ /dev/null @@ -1,45 +0,0 @@ - - */ -class InvalidStringRepresentationException extends VersionException -{ - /** - * The invalid string representation. - * - * @var string - */ - private $version; - - /** - * Sets the invalid string representation. - * - * @param string $version The string representation. - */ - public function __construct(string $version) - { - parent::__construct( - sprintf( - 'The version string representation "%s" is invalid.', - $version - ) - ); - - $this->version = $version; - } - - /** - * Returns the invalid string representation. - * - * @return string The invalid string representation. - */ - public function getVersion(): string - { - return $this->version; - } -} diff --git a/src/Component/PharUpdate/Version/Exception/VersionException.php b/src/Component/PharUpdate/Version/Exception/VersionException.php deleted file mode 100644 index 457023427..000000000 --- a/src/Component/PharUpdate/Version/Exception/VersionException.php +++ /dev/null @@ -1,14 +0,0 @@ - - */ -class VersionException extends Exception -{ -} diff --git a/src/Component/PharUpdate/Version/Parser.php b/src/Component/PharUpdate/Version/Parser.php deleted file mode 100644 index e33939597..000000000 --- a/src/Component/PharUpdate/Version/Parser.php +++ /dev/null @@ -1,115 +0,0 @@ - - */ -class Parser -{ - /** - * The build metadata component. - */ - const BUILD = 'build'; - - /** - * The major version number component. - */ - const MAJOR = 'major'; - - /** - * The minor version number component. - */ - const MINOR = 'minor'; - - /** - * The patch version number component. - */ - const PATCH = 'patch'; - - /** - * The pre-release version number component. - */ - const PRE_RELEASE = 'pre'; - - /** - * Returns a Version builder for the string representation. - * - * @param string $version The string representation. - * - * @return Builder A Version builder. - */ - public static function toBuilder(string $version): Builder - { - return Builder::create()->importComponents( - self::toComponents($version) - ); - } - - /** - * Returns the components of the string representation. - * - * @param string $version The string representation. - * - * @return array The components of the version. - * - * @throws InvalidStringRepresentationException If the string representation - * is invalid. - */ - public static function toComponents(string $version): array - { - if (!Validator::isVersion($version)) { - throw new InvalidStringRepresentationException($version); - } - - if (false !== strpos($version, '+')) { - list($version, $build) = explode('+', $version); - - $build = explode('.', $build); - } - - if (false !== strpos($version, '-')) { - list($version, $pre) = explode('-', $version); - - $pre = explode('.', $pre); - } - - list( - $major, - $minor, - $patch - ) = explode('.', $version); - - return array( - self::MAJOR => intval($major), - self::MINOR => intval($minor), - self::PATCH => intval($patch), - self::PRE_RELEASE => isset($pre) ? $pre : array(), - self::BUILD => isset($build) ? $build : array(), - ); - } - - /** - * Returns a Version instance for the string representation. - * - * @param string $version The string representation. - * - * @return Version A Version instance. - */ - public static function toVersion(string $version): Version - { - $components = self::toComponents($version); - - return new Version( - $components['major'], - $components['minor'], - $components['patch'], - $components['pre'], - $components['build'] - ); - } -} diff --git a/src/Component/PharUpdate/Version/Validator.php b/src/Component/PharUpdate/Version/Validator.php deleted file mode 100644 index 6fcf9965a..000000000 --- a/src/Component/PharUpdate/Version/Validator.php +++ /dev/null @@ -1,57 +0,0 @@ - - */ -class Validator -{ - /** - * The regular expression for a valid identifier. - */ - const IDENTIFIER_REGEX = '/^[0-9A-Za-z\-]+$/'; - - /** - * The regular expression for a valid semantic version number. - */ - const VERSION_REGEX = '/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/'; - - /** - * Checks if a identifier is valid. - * - * @param string $identifier A identifier. - * - * @return boolean TRUE if the identifier is valid, FALSE If not. - */ - public static function isIdentifier(string $identifier): bool - { - return (true == preg_match(self::IDENTIFIER_REGEX, $identifier)); - } - - /** - * Checks if a number is a valid version number. - * - * @param integer $number A number. - * - * @return boolean TRUE if the number is valid, FALSE If not. - */ - public static function isNumber(int $number): bool - { - return (true == preg_match('/^(0|[1-9]\d*)$/', (string)$number)); - } - - /** - * Checks if the string representation of a version number is valid. - * - * @param string $version The string representation. - * - * @return boolean TRUE if the string representation is valid, FALSE if not. - */ - public static function isVersion(string $version): bool - { - return (true == preg_match(self::VERSION_REGEX, $version)); - } -} diff --git a/src/Component/PharUpdate/Version/Version.php b/src/Component/PharUpdate/Version/Version.php deleted file mode 100644 index 737e7d533..000000000 --- a/src/Component/PharUpdate/Version/Version.php +++ /dev/null @@ -1,139 +0,0 @@ - - */ -class Version -{ - /** - * The build metadata identifiers. - * - * @var array - */ - protected $build; - - /** - * The major version number. - * - * @var integer - */ - protected $major; - - /** - * The minor version number. - * - * @var integer - */ - protected $minor; - - /** - * The patch version number. - * - * @var integer - */ - protected $patch; - - /** - * The pre-release version identifiers. - * - * @var array - */ - protected $preRelease; - - /** - * Sets the version information. - * - * @param int $major The major version number. - * @param int $minor The minor version number. - * @param int $patch The patch version number. - * @param array $pre The pre-release version identifiers. - * @param array $build The build metadata identifiers. - */ - public function __construct( - int $major = 0, - int $minor = 0, - int $patch = 0, - array $pre = array(), - array $build = array() - ) { - $this->build = $build; - $this->major = $major; - $this->minor = $minor; - $this->patch = $patch; - $this->preRelease = $pre; - } - - /** - * Returns the build metadata identifiers. - * - * @return array The build metadata identifiers. - */ - public function getBuild(): array - { - return $this->build; - } - - /** - * Returns the major version number. - * - * @return int The major version number. - */ - public function getMajor(): int - { - return $this->major; - } - - /** - * Returns the minor version number. - * - * @return int The minor version number. - */ - public function getMinor(): int - { - return $this->minor; - } - - /** - * Returns the patch version number. - * - * @return int The patch version number. - */ - public function getPatch(): int - { - return $this->patch; - } - - /** - * Returns the pre-release version identifiers. - * - * @return array The pre-release version identifiers. - */ - public function getPreRelease(): array - { - return $this->preRelease; - } - - /** - * Checks if the version number is stable. - * - * @return boolean TRUE if it is stable, FALSE if not. - */ - public function isStable(): bool - { - return empty($this->preRelease) && $this->major !== 0; - } - - /** - * Returns string representation. - * - * @return string The string representation. - */ - public function __toString(): string - { - return Dumper::toString($this); - } -} diff --git a/src/Component/Pimple/Container.php b/src/Component/Pimple/Container.php deleted file mode 100644 index b4daffde2..000000000 --- a/src/Component/Pimple/Container.php +++ /dev/null @@ -1,287 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Pimple; - -use Deployer\Component\Pimple\Exception\ExpectedInvokableException; -use Deployer\Component\Pimple\Exception\FrozenServiceException; -use Deployer\Component\Pimple\Exception\InvalidServiceIdentifierException; -use Deployer\Component\Pimple\Exception\UnknownIdentifierException; - -/** - * Container main class. - * - * @author Fabien Potencier - */ -class Container implements \ArrayAccess -{ - /** - * @var array - */ - private $values = []; - /** - * @var \SplObjectStorage - */ - private $factories; - /** - * @var \SplObjectStorage - */ - private $protected; - /** - * @var array - */ - private $frozen = []; - /** - * @var array - */ - private $raw = []; - /** - * @var array - */ - private $keys = []; - - /** - * Instantiates the container. - * - * Objects and parameters can be passed as argument to the constructor. - * - * @param array $values The parameters or objects - */ - public function __construct(array $values = []) - { - $this->factories = new \SplObjectStorage(); - $this->protected = new \SplObjectStorage(); - - foreach ($values as $key => $value) { - $this->offsetSet($key, $value); - } - } - - /** - * Sets a parameter or an object. - * - * Objects must be defined as Closures. - * - * Allowing any PHP callable leads to difficult to debug problems - * as function names (strings) are callable (creating a function with - * the same name as an existing parameter would break your container). - * - * @param string $id The unique identifier for the parameter or object - * @param mixed $value The value of the parameter or a closure to define an object - * - * @throws FrozenServiceException Prevent override of a frozen service - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetSet($id, $value) - { - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($id); - } - - $this->values[$id] = $value; - $this->keys[$id] = true; - } - - /** - * Gets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or an object - * - * @throws UnknownIdentifierException If the identifier is not defined - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetGet($id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($id); - } - - if ( - isset($this->raw[$id]) - || !\is_object($this->values[$id]) - || isset($this->protected[$this->values[$id]]) - || !\method_exists($this->values[$id], '__invoke') - ) { - return $this->values[$id]; - } - - if (isset($this->factories[$this->values[$id]])) { - return $this->values[$id]($this); - } - - $raw = $this->values[$id]; - $val = $this->values[$id] = $raw($this); - $this->raw[$id] = $raw; - - $this->frozen[$id] = true; - - return $val; - } - - /** - * Checks if a parameter or an object is set. - * - * @param string $id The unique identifier for the parameter or object - * - * @return bool - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetExists($id) - { - return isset($this->keys[$id]); - } - - /** - * Unsets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetUnset($id) - { - if (isset($this->keys[$id])) { - if (\is_object($this->values[$id])) { - unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); - } - - unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]); - } - } - - /** - * Marks a callable as being a factory service. - * - * @param callable $callable A service definition to be used as a factory - * - * @return callable The passed callable - * - * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function factory(callable $callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.'); - } - - $this->factories->attach($callable); - - return $callable; - } - - /** - * Protects a callable from being interpreted as a service. - * - * This is useful when you want to store a callable as a parameter. - * - * @param callable $callable A callable to protect from being evaluated - * - * @return callable The passed callable - * - * @throws ExpectedInvokableException Service definition has to be a closure or an invokable object - */ - public function protect(callable $callable) - { - if (!\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('Callable is not a Closure or invokable object.'); - } - - $this->protected->attach($callable); - - return $callable; - } - - /** - * Gets a parameter or the closure defining an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or the closure defining an object - * - * @throws UnknownIdentifierException If the identifier is not defined - */ - public function raw(string $id) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($id); - } - - if (isset($this->raw[$id])) { - return $this->raw[$id]; - } - - return $this->values[$id]; - } - - /** - * Extends an object definition. - * - * Useful when you want to extend an existing object definition, - * without necessarily loading that object. - * - * @param string $id The unique identifier for the object - * @param callable $callable A service definition to extend the original - * - * @return callable The wrapped callable - * - * @throws UnknownIdentifierException If the identifier is not defined - * @throws FrozenServiceException If the service is frozen - * @throws InvalidServiceIdentifierException If the identifier belongs to a parameter - * @throws ExpectedInvokableException If the extension callable is not a closure or an invokable object - */ - public function extend(string $id, callable $callable) - { - if (!isset($this->keys[$id])) { - throw new UnknownIdentifierException($id); - } - - if (isset($this->frozen[$id])) { - throw new FrozenServiceException($id); - } - - if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) { - throw new InvalidServiceIdentifierException($id); - } - - if (isset($this->protected[$this->values[$id]])) { - @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), E_USER_DEPRECATED); - } - - if (!\is_object($callable) || !\method_exists($callable, '__invoke')) { - throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.'); - } - - $factory = $this->values[$id]; - - $extended = function ($c) use ($callable, $factory) { - return $callable($factory($c), $c); - }; - - if (isset($this->factories[$factory])) { - $this->factories->detach($factory); - $this->factories->attach($extended); - } - - return $this[$id] = $extended; - } - - /** - * Returns all defined value names. - * - * @return array An array of value names - */ - public function keys() - { - return \array_keys($this->values); - } -} diff --git a/src/Component/Pimple/Exception/ExpectedInvokableException.php b/src/Component/Pimple/Exception/ExpectedInvokableException.php deleted file mode 100644 index cd72204bb..000000000 --- a/src/Component/Pimple/Exception/ExpectedInvokableException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Pimple\Exception; - -use Psr\Container\ContainerExceptionInterface; - -/** - * A closure or invokable object was expected. - * - * @author Pascal Luna - */ -class ExpectedInvokableException extends \InvalidArgumentException implements ContainerExceptionInterface -{ -} diff --git a/src/Component/Pimple/Exception/FrozenServiceException.php b/src/Component/Pimple/Exception/FrozenServiceException.php deleted file mode 100644 index 8721fa1b1..000000000 --- a/src/Component/Pimple/Exception/FrozenServiceException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Pimple\Exception; - -use Psr\Container\ContainerExceptionInterface; - -/** - * An attempt to modify a frozen service was made. - * - * @author Pascal Luna - */ -class FrozenServiceException extends \RuntimeException implements ContainerExceptionInterface -{ - /** - * @param string $id Identifier of the frozen service - */ - public function __construct(string $id) - { - parent::__construct(\sprintf('Cannot override frozen service "%s".', $id)); - } -} diff --git a/src/Component/Pimple/Exception/InvalidServiceIdentifierException.php b/src/Component/Pimple/Exception/InvalidServiceIdentifierException.php deleted file mode 100644 index 481a8cb3e..000000000 --- a/src/Component/Pimple/Exception/InvalidServiceIdentifierException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Pimple\Exception; - -use Psr\Container\NotFoundExceptionInterface; - -/** - * An attempt to perform an operation that requires a service identifier was made. - * - * @author Pascal Luna - */ -class InvalidServiceIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface -{ - /** - * @param string $id The invalid identifier - */ - public function __construct(string $id) - { - parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id)); - } -} diff --git a/src/Component/Pimple/Exception/UnknownIdentifierException.php b/src/Component/Pimple/Exception/UnknownIdentifierException.php deleted file mode 100644 index 1d9858c48..000000000 --- a/src/Component/Pimple/Exception/UnknownIdentifierException.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Pimple\Exception; - -use Psr\Container\NotFoundExceptionInterface; - -/** - * The identifier of a valid service or parameter was expected. - * - * @author Pascal Luna - */ -class UnknownIdentifierException extends \InvalidArgumentException implements NotFoundExceptionInterface -{ - /** - * @param string $id The unknown identifier - */ - public function __construct(string $id) - { - parent::__construct(\sprintf('Identifier "%s" is not defined.', $id)); - } -} diff --git a/src/Component/ProcessRunner/Printer.php b/src/Component/ProcessRunner/Printer.php deleted file mode 100644 index a1f9422a1..000000000 --- a/src/Component/ProcessRunner/Printer.php +++ /dev/null @@ -1,74 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\ProcessRunner; - -use Deployer\Host\Host; -use Symfony\Component\Console\Output\OutputInterface; - -class Printer -{ - /** - * @var OutputInterface - */ - private $output; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - } - - public function command(Host $host, string $type, string $command): void - { - // -v for run command - if ($this->output->isVerbose()) { - $this->output->writeln("[$host] $type $command"); - } - } - - /** - * Returns a callable for use with the symfony Process->run($callable) method. - * - * @return callable A function expecting a int $type (e.g. Process::OUT or Process::ERR) and string $buffer parameters. - */ - public function callback(Host $host, bool $forceOutput): callable - { - return function ($type, $buffer) use ($forceOutput, $host) { - if ($this->output->isVerbose() || $forceOutput) { - $this->printBuffer($type, $host, $buffer); - } - }; - } - - /** - * @param string $type Process::OUT or Process::ERR - */ - public function printBuffer(string $type, Host $host, string $buffer): void - { - foreach (explode("\n", rtrim($buffer)) as $line) { - $this->writeln($type, $host, $line); - } - } - - public function writeln(string $type, Host $host, string $line): void - { - $line = self::filterOutput($line); - - // Omit empty lines - if (empty($line)) { - return; - } - - $this->output->writeln("[$host] $line"); - } - - public static function filterOutput(string $output): string - { - return preg_replace('/\[exit_code:(.*?)]/', '', $output); - } -} diff --git a/src/Component/ProcessRunner/ProcessRunner.php b/src/Component/ProcessRunner/ProcessRunner.php deleted file mode 100644 index cbd78cdb3..000000000 --- a/src/Component/ProcessRunner/ProcessRunner.php +++ /dev/null @@ -1,90 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\ProcessRunner; - -use Deployer\Exception\RunException; -use Deployer\Exception\TimeoutException; -use Deployer\Host\Host; -use Deployer\Logger\Logger; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Exception\ProcessTimedOutException; -use Symfony\Component\Process\Process; - -class ProcessRunner -{ - /** - * @var Printer - */ - private $pop; - /** - * @var Logger - */ - private $logger; - - public function __construct(Printer $pop, Logger $logger) - { - $this->pop = $pop; - $this->logger = $logger; - } - - /** - * Runs a command, consider deployer global configs (timeout,...) - * - * @throws RunException - */ - public function run(Host $host, string $command, array $config = []): string - { - $defaults = [ - 'timeout' => $host->get('default_timeout', 300), - 'idle_timeout' => null, - 'cwd' => getenv('DEPLOYER_ROOT') !== false ? getenv('DEPLOYER_ROOT') : (defined('DEPLOYER_DEPLOY_FILE') ? dirname(DEPLOYER_DEPLOY_FILE) : null), - 'real_time_output' => false, - 'shell' => 'bash -s', - ]; - $config = array_merge($defaults, $config); - - $this->pop->command($host, 'run', $command); - - $terminalOutput = $this->pop->callback($host, $config['real_time_output']); - $callback = function ($type, $buffer) use ($host, $terminalOutput) { - $this->logger->printBuffer($host, $type, $buffer); - $terminalOutput($type, $buffer); - }; - - $command = str_replace('%secret%', $config['secret'] ?? '', $command); - $command = str_replace('%sudo_pass%', $config['sudo_pass'] ?? '', $command); - - $process = Process::fromShellCommandline($config['shell']) - ->setInput($command) - ->setTimeout($config['timeout']) - ->setIdleTimeout($config['idle_timeout']); - - if ($config['cwd'] !== null) { - $process->setWorkingDirectory($config['cwd']); - } - - try { - $process->mustRun($callback); - return $process->getOutput(); - } catch (ProcessFailedException $exception) { - throw new RunException( - $host, - $command, - $process->getExitCode(), - $process->getOutput(), - $process->getErrorOutput() - ); - } catch (ProcessTimedOutException $exception) { // @phpstan-ignore-line can be thrown but is absent from the phpdoc - throw new TimeoutException( - $command, - $exception->getExceededTimeout() - ); - } - } -} diff --git a/src/Component/Ssh/Client.php b/src/Component/Ssh/Client.php deleted file mode 100644 index 277c2ad5e..000000000 --- a/src/Component/Ssh/Client.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Ssh; - -use Deployer\Component\ProcessRunner\Printer; -use Deployer\Exception\Exception; -use Deployer\Exception\RunException; -use Deployer\Exception\TimeoutException; -use Deployer\Host\Host; -use Deployer\Logger\Logger; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Process\Exception\ProcessTimedOutException; -use Symfony\Component\Process\Process; -use function Deployer\Support\parse_home_dir; - -class Client -{ - /** - * @var OutputInterface - */ - private $output; - - /** - * @var Printer - */ - private $pop; - - /** - * @var Logger - */ - private $logger; - - public function __construct(OutputInterface $output, Printer $pop, Logger $logger) - { - $this->output = $output; - $this->pop = $pop; - $this->logger = $logger; - } - - /** - * @throws RunException|TimeoutException|Exception - */ - public function run(Host $host, string $command, array $config = []): string - { - $defaults = [ - 'timeout' => $host->get('default_timeout', 300), - 'idle_timeout' => null, - 'real_time_output' => false, - 'no_throw' => false, - ]; - $config = array_merge($defaults, $config); - - $shellId = bin2hex(random_bytes(10)); - $shellCommand = $host->getShell(); - if ($host->has('become')) { - $shellCommand = "sudo -H -u {$host->get('become')} " . $shellCommand; - } - - $ssh = array_merge(['ssh'], $host->connectionOptionsArray(), [$host->connectionString(), ": $shellId; $shellCommand"]); - - // -vvv for ssh command - if ($this->output->isDebug()) { - $sshString = $ssh[0]; - for ($i = 1; $i < count($ssh); $i++) { - $sshString .= ' ' . escapeshellarg((string)$ssh[$i]); - } - $this->output->writeln("[$host] $sshString"); - } - - $this->pop->command($host, 'run', $command); - $this->logger->log("[{$host->getAlias()}] run $command"); - - $command = str_replace('%secret%', strval($config['secret'] ?? ''), $command); - $command = str_replace('%sudo_pass%', strval($config['sudo_pass'] ?? ''), $command); - - $process = new Process($ssh); - $process - ->setInput("( $command ); printf '[exit_code:%s]' $?;") - ->setTimeout($config['timeout']) - ->setIdleTimeout($config['idle_timeout']); - - $callback = function ($type, $buffer) use ($config, $host) { - $this->logger->printBuffer($host, $type, $buffer); - $this->pop->callback($host, boolval($config['real_time_output']))($type, $buffer); - }; - - try { - $process->run($callback); - } catch (ProcessTimedOutException $exception) { - // Let's try to kill all processes started by this command. - $pid = $this->run($host, "ps x | grep $shellId | grep -v grep | awk '{print \$1}'"); - // Minus before pid means all processes in this group. - $this->run($host, "kill -9 -$pid"); - throw new TimeoutException( - $command, - $exception->getExceededTimeout() - ); - } - - $output = $this->pop->filterOutput($process->getOutput()); - $exitCode = $this->parseExitStatus($process); - - if ($exitCode !== 0 && !$config['no_throw']) { - throw new RunException( - $host, - $command, - $exitCode, - $output, - $process->getErrorOutput() - ); - } - - return $output; - } - - private function parseExitStatus(Process $process): int - { - preg_match('/\[exit_code:(\d*)]/', $process->getOutput(), $match); - return (int)($match[1] ?? -1); - } -} diff --git a/src/Component/Ssh/IOArguments.php b/src/Component/Ssh/IOArguments.php deleted file mode 100644 index 90df28422..000000000 --- a/src/Component/Ssh/IOArguments.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Component\Ssh; - -use Deployer\Exception\Exception; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -class IOArguments -{ - public static function collect(InputInterface $input, OutputInterface $output): array - { - $arguments = []; - foreach ($input->getOptions() as $name => $value) { - if (!$input->getOption($name)) { - continue; - } - if ($name === 'file') { - $arguments[] = "--file"; - $arguments[] = ltrim($value, '='); - continue; - } - if (in_array($name, ['verbose'], true)) { - continue; - } - if (!is_array($value)) { - $value = [$value]; - } - foreach ($value as $v) { - if (is_bool($v)) { - $arguments[] = "--$name"; - continue; - } - - $arguments[] = "--$name"; - $arguments[] = $v; - } - } - - if ($output->isDecorated()) { - $arguments[] = '--decorated'; - } - $verbosity = self::verbosity($output->getVerbosity()); - if (!empty($verbosity)) { - $arguments[] = $verbosity; - } - return $arguments; - } - - private static function verbosity(int $verbosity): string - { - switch ($verbosity) { - case OutputInterface::VERBOSITY_QUIET: - return '-q'; - case OutputInterface::VERBOSITY_NORMAL: - return ''; - case OutputInterface::VERBOSITY_VERBOSE: - return '-v'; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - return '-vv'; - case OutputInterface::VERBOSITY_DEBUG: - return '-vvv'; - default: - throw new Exception('Unknown verbosity level: ' . $verbosity); - } - } -} diff --git a/src/Configuration/Configuration.php b/src/Configuration/Configuration.php deleted file mode 100644 index 0765d8069..000000000 --- a/src/Configuration/Configuration.php +++ /dev/null @@ -1,241 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Configuration; - -use Deployer\Exception\ConfigurationException; -use Deployer\Utility\Httpie; -use function Deployer\Support\array_merge_alternate; -use function Deployer\Support\is_closure; -use function Deployer\Support\normalize_line_endings; - -class Configuration implements \ArrayAccess -{ - /** - * @var Configuration|null - */ - private $parent; - - /** - * @var array - */ - private $values = []; - - public function __construct(Configuration $parent = null) - { - $this->parent = $parent; - } - - public function update(array $values): void - { - $this->values = array_merge($this->values, $values); - } - - public function bind(Configuration $parent): void - { - $this->parent = $parent; - } - - /** - * @param mixed $value - */ - public function set(string $name, $value): void - { - $this->values[$name] = $value; - } - - public function has(string $name): bool - { - $ok = array_key_exists($name, $this->values); - if ($ok) { - return true; - } - if ($this->parent) { - return $this->parent->has($name); - } - return false; - } - - public function hasOwn(string $name): bool - { - return array_key_exists($name, $this->values); - } - - public function add(string $name, array $array): void - { - if ($this->has($name)) { - $config = $this->get($name); - if (!is_array($config)) { - throw new ConfigurationException("Config option \"$name\" isn't array."); - } - $this->set($name, array_merge_alternate($config, $array)); - } else { - $this->set($name, $array); - } - } - - /** - * @param mixed|null $default - * @return mixed|null - */ - public function get(string $name, $default = null) - { - if (array_key_exists($name, $this->values)) { - if (is_closure($this->values[$name])) { - return $this->values[$name] = $this->parse(call_user_func($this->values[$name])); - } else { - return $this->parse($this->values[$name]); - } - } - - if ($this->parent) { - $rawValue = $this->parent->fetch($name); - if ($rawValue !== null) { - if (is_closure($rawValue)) { - return $this->values[$name] = $this->parse(call_user_func($rawValue)); - } else { - return $this->values[$name]= $this->parse($rawValue); - } - } - } - - if (func_num_args() >= 2) { - return $this->parse($default); - } - - throw new ConfigurationException("Config option \"$name\" does not exist."); - } - - /** - * @return mixed|null - */ - public function fetch(string $name) - { - if (array_key_exists($name, $this->values)) { - return $this->values[$name]; - } - if ($this->parent) { - return $this->parent->fetch($name); - } - return null; - } - - /** - * @param string|mixed $value - * @return string|mixed - */ - public function parse($value) - { - if (is_string($value)) { - $normalizedValue = normalize_line_endings($value); - return preg_replace_callback('/\{\{\s*([\w\.\/-]+)\s*\}\}/', [$this, 'parseCallback'], $normalizedValue); - } - - return $value; - } - - public function ownValues(): array - { - return $this->values; - } - - public function keys(): array - { - return array_keys($this->values); - } - - /** - * @param array $matches - * @return mixed|null - */ - private function parseCallback(array $matches) - { - return isset($matches[1]) ? $this->get($matches[1]) : null; - } - - /** - * @param mixed $offset - * @return bool - */ - #[\ReturnTypeWillChange] - public function offsetExists($offset) - { - return $this->has($offset); - } - - /** - * @param string $offset - * @return mixed|null - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetGet($offset) - { - return $this->get($offset); - } - - /** - * @param string $offset - * @param mixed $value - * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint - */ - #[\ReturnTypeWillChange] - public function offsetSet($offset, $value): void - { - $this->set($offset, $value); - } - - /** - * @param mixed $offset - */ - #[\ReturnTypeWillChange] - public function offsetUnset($offset): void - { - unset($this->values[$offset]); - } - - public function load(): void - { - if (!$this->has('master_url')) { - return; - } - - $values = Httpie::get($this->get('master_url') . '/load') - ->jsonBody([ - 'host' => $this->get('alias'), - ]) - ->getJson(); - $this->update($values); - } - - public function save(): void - { - if (!$this->has('master_url')) { - return; - } - - Httpie::get($this->get('master_url') . '/save') - ->jsonBody([ - 'host' => $this->get('alias'), - 'config' => $this->persist(), - ]) - ->getJson(); - } - - public function persist(): array - { - $values = []; - foreach ($this->values as $key => $value) { - if (is_closure($value)) { - continue; - } - $values[$key] = $value; - } - return $values; - } -} diff --git a/src/Deployer.php b/src/Deployer.php deleted file mode 100755 index be8c9fc10..000000000 --- a/src/Deployer.php +++ /dev/null @@ -1,380 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer; - -use Deployer\Collection\Collection; -use Deployer\Command\BlackjackCommand; -use Deployer\Command\ConfigCommand; -use Deployer\Command\InitCommand; -use Deployer\Command\MainCommand; -use Deployer\Command\RunCommand; -use Deployer\Command\SshCommand; -use Deployer\Command\TreeCommand; -use Deployer\Command\WorkerCommand; -use Deployer\Component\PharUpdate\Console\Command as PharUpdateCommand; -use Deployer\Component\PharUpdate\Console\Helper as PharUpdateHelper; -use Deployer\Component\Pimple\Container; -use Deployer\Component\ProcessRunner\Printer; -use Deployer\Component\ProcessRunner\ProcessRunner; -use Deployer\Component\Ssh\Client; -use Deployer\Configuration\Configuration; -use Deployer\Executor\Master; -use Deployer\Executor\Messenger; -use Deployer\Executor\Server; -use Deployer\Host\Host; -use Deployer\Host\HostCollection; -use Deployer\Host\Localhost; -use Deployer\Importer\Importer; -use Deployer\Logger\Handler\FileHandler; -use Deployer\Logger\Handler\NullHandler; -use Deployer\Logger\Logger; -use Deployer\Selector\Selector; -use Deployer\Task; -use Deployer\Task\ScriptManager; -use Deployer\Task\TaskCollection; -use Deployer\Utility\Httpie; -use Deployer\Utility\Rsync; -use Symfony\Component\Console; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Throwable; - -/** - * Deployer class represents DI container for configuring - * - * @property Application $console - * @property InputInterface $input - * @property OutputInterface $output - * @property Task\TaskCollection|Task\Task[] $tasks - * @property HostCollection|Host[] $hosts - * @property Configuration $config - * @property Rsync $rsync - * @property Client $sshClient - * @property ProcessRunner $processRunner - * @property Task\ScriptManager $scriptManager - * @property Selector $selector - * @property Server $server - * @property Master $master - * @property Messenger $messenger - * @property Messenger $logger - * @property Printer $pop - * @property Collection $fail - * @property InputDefinition $inputDefinition - * @property Importer $importer - */ -class Deployer extends Container -{ - /** - * Global instance of deployer. It's can be accessed only after constructor call. - * @var Deployer - */ - private static $instance; - - public function __construct(Application $console) - { - parent::__construct(); - - /****************************** - * Console * - ******************************/ - - $console->getDefinition()->addOption( - new InputOption('file', 'f', InputOption::VALUE_REQUIRED, 'Recipe file path') - ); - - $this['console'] = function () use ($console) { - return $console; - }; - $this['input'] = function () { - throw new \RuntimeException('Uninitialized "input" in Deployer container.'); - }; - $this['output'] = function () { - throw new \RuntimeException('Uninitialized "output" in Deployer container.'); - }; - $this['inputDefinition'] = function () { - return new InputDefinition(); - }; - $this['questionHelper'] = function () { - return $this->getHelper('question'); - }; - - /****************************** - * Config * - ******************************/ - - $this['config'] = function () { - return new Configuration(); - }; - // -l act as if it had been invoked as a login shell (i.e. source ~/.profile file) - // -s commands are read from the standard input (no arguments should remain after this option) - $this->config['shell'] = function () { - if (currentHost() instanceof Localhost) { - return 'bash -s'; // Non-login shell for localhost. - } - return 'bash -ls'; - }; - $this->config['forward_agent'] = true; - $this->config['ssh_multiplexing'] = true; - - /****************************** - * Core * - ******************************/ - - $this['pop'] = function ($c) { - return new Printer($c['output']); - }; - $this['sshClient'] = function ($c) { - return new Client($c['output'], $c['pop'], $c['logger']); - }; - $this['rsync'] = function ($c) { - return new Rsync($c['pop'], $c['output']); - }; - $this['processRunner'] = function ($c) { - return new ProcessRunner($c['pop'], $c['logger']); - }; - $this['tasks'] = function () { - return new TaskCollection(); - }; - $this['hosts'] = function () { - return new HostCollection(); - }; - $this['scriptManager'] = function ($c) { - return new ScriptManager($c['tasks']); - }; - $this['selector'] = function ($c) { - return new Selector($c['hosts']); - }; - $this['fail'] = function () { - return new Collection(); - }; - $this['messenger'] = function ($c) { - return new Messenger($c['input'], $c['output'], $c['logger']); - }; - $this['server'] = function ($c) { - return new Server( - $c['output'], - $this, - ); - }; - $this['master'] = function ($c) { - return new Master( - $c['input'], - $c['output'], - $c['server'], - $c['messenger'], - ); - }; - $this['importer'] = function () { - return new Importer(); - }; - - /****************************** - * Logger * - ******************************/ - - $this['log_handler'] = function () { - return !empty($this['log']) - ? new FileHandler($this['log']) - : new NullHandler(); - }; - $this['logger'] = function () { - return new Logger($this['log_handler']); - }; - - self::$instance = $this; - } - - public static function get(): self - { - return self::$instance; - } - - /** - * Init console application - */ - public function init() - { - $this->addTaskCommands(); - $this->getConsole()->add(new BlackjackCommand()); - $this->getConsole()->add(new ConfigCommand($this)); - $this->getConsole()->add(new WorkerCommand($this)); - $this->getConsole()->add(new InitCommand()); - $this->getConsole()->add(new TreeCommand($this)); - $this->getConsole()->add(new SshCommand($this)); - $this->getConsole()->add(new RunCommand($this)); - if (self::isPharArchive()) { - $selfUpdate = new PharUpdateCommand('self-update'); - $selfUpdate->setDescription('Updates deployer.phar to the latest version'); - $selfUpdate->setManifestUri('https://deployer.org/manifest.json'); - $selfUpdate->setRunningFile(DEPLOYER_BIN); - $this->getConsole()->add($selfUpdate); - $this->getConsole()->getHelperSet()->set(new PharUpdateHelper()); - } - } - - /** - * Transform tasks to console commands. - */ - public function addTaskCommands() - { - foreach ($this->tasks as $name => $task) { - $command = new MainCommand($name, $task->getDescription(), $this); - $command->setHidden($task->isHidden()); - - $this->getConsole()->add($command); - } - } - - /** - * @return mixed - * @throws \InvalidArgumentException - */ - public function __get(string $name) - { - if (isset($this[$name])) { - return $this[$name]; - } else { - throw new \InvalidArgumentException("Property \"$name\" does not exist."); - } - } - - /** - * @param mixed $value - */ - public function __set(string $name, $value) - { - $this[$name] = $value; - } - - public function getConsole(): Application - { - return $this['console']; - } - - public function getHelper(string $name): Console\Helper\HelperInterface - { - return $this->getConsole()->getHelperSet()->get($name); - } - - /** - * Run Deployer - */ - public static function run(string $version, ?string $deployFile) - { - if (str_contains($version, 'master')) { - // Get version from composer.lock - $lockFile = __DIR__ . '/../../../../composer.lock'; - if (file_exists($lockFile)) { - $content = file_get_contents($lockFile); - $json = json_decode($content); - foreach ($json->packages as $package) { - if ($package->name === 'deployer/deployer') { - $version = $package->version; - } - } - } - } - - // Version must be without "v" prefix. - // Incorrect: v7.0.0 - // Correct: 7.0.0 - // But deployphp/deployer uses tags with "v", and it gets passed to - // the composer.json file. Let's manually remove it from the version. - if (preg_match("/^v/", $version)) { - $version = substr($version, 1); - } - - if (!defined('DEPLOYER_VERSION')) { - define('DEPLOYER_VERSION', $version); - } - - $input = new ArgvInput(); - $output = new ConsoleOutput(); - - try { - // Init Deployer - $console = new Application('Deployer', $version); - $deployer = new self($console); - - // Import recipe file - if (is_readable($deployFile ?? '')) { - $deployer->importer->import($deployFile); - } - - // Run Deployer - $deployer->init(); - $console->run($input, $output); - - } catch (Throwable $exception) { - if (str_contains("$input", "-vvv")) { - $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); - } - self::printException($output, $exception); - - exit(1); - } - } - - public static function printException(OutputInterface $output, Throwable $exception) - { - $class = get_class($exception); - $file = basename($exception->getFile()); - $output->writeln([ - " {$class} in {$file} on line {$exception->getLine()}:", - "", - implode("\n", array_map(function ($line) { - return " " . $line; - }, explode("\n", $exception->getMessage()))), - "", - ]); - if ($output->isDebug()) { - $output->writeln($exception->getTraceAsString()); - } - - if ($exception->getPrevious()) { - self::printException($output, $exception->getPrevious()); - } - } - - public static function isWorker(): bool - { - return Deployer::get()->config->has('master_url'); - } - - /** - * @param mixed ...$arguments - * @return array|bool|string - * @throws \Exception - */ - public static function proxyCallToMaster(Host $host, string $func, ...$arguments) - { - // As request to master will stop master permanently, - // wait a little bit in order for periodic timer of - // master gather worker outputs and print it to user. - usleep(100000); // Sleep 100ms. - return Httpie::get(get('master_url') . '/proxy') - ->setopt(CURLOPT_TIMEOUT, 0) // no timeout - ->jsonBody([ - 'host' => $host->getAlias(), - 'func' => $func, - 'arguments' => $arguments, - ]) - ->getJson(); - } - - public static function isPharArchive(): bool - { - return 'phar:' === substr(__FILE__, 0, 5); - } -} diff --git a/src/Documentation/ApiGen.php b/src/Documentation/ApiGen.php deleted file mode 100644 index ff69d16e5..000000000 --- a/src/Documentation/ApiGen.php +++ /dev/null @@ -1,111 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Documentation; - -class ApiGen -{ - /** - * @var array - */ - private $fns = []; - - public function parse(string $source): void - { - $comment = ''; - $params = ''; - - $source = str_replace("\r\n", "\n", $source); - - $state = 'root'; - foreach (explode("\n", $source) as $lineNumber => $line) { - switch ($state) { - case 'root': - if (str_starts_with($line, '/**')) { - $state = 'comment'; - break; - } - if (str_starts_with($line, 'function')) { - $signature = preg_replace('/^function\s+/', '', $line); - $funcName = preg_replace('/\(.+$/', '', $signature); - $this->fns[] = [ - 'comment' => $comment, - 'params' => $params, - 'funcName' => $funcName, - 'signature' => $signature, - ]; - $comment = ''; - $params = ''; - break; - } - break; - - case 'comment': - if (str_ends_with($line, '*/')) { - $state = 'root'; - break; - } - if (preg_match('/^\s\*\s@param\s(?.+?)\$(?.+?)\s(?.+)$/', $line, $matches)) { - if (empty($params)) { - $params = "| Argument | Type | Comment |\n|---|---|---|\n"; - } - $type = implode(' or ', array_map(function ($t) { - $t = trim($t, ' '); - return "`$t`"; - }, explode('|', $matches['type']))); - $params .= "| `\${$matches['name']}` | $type | {$matches['comment']} |\n"; - break; - } - if (str_starts_with($line, ' * @')) { - break; - } - $comment .= preg_replace('/^\s\*\s?/', '', $line) . "\n"; - break; - } - } - } - - public function markdown(): string - { - $output = << - - - -# API Reference - - -MD; - - foreach ($this->fns as $fn) { - [ - 'comment' => $comment, - 'params' => $params, - 'funcName' => $funcName, - 'signature' => $signature, - ] = $fn; - - if (!empty($params)) { - $params = "\n$params"; - } - - $output .= << - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Documentation; - - -class DocConfig -{ - /** - * @var string - */ - public $name; - /** - * @var string - */ - public $defaultValue; - /** - * @var string - */ - public $comment; - /** - * @var string - */ - public $recipePath; - /** - * @var int - */ - public $lineNumber; -} diff --git a/src/Documentation/DocGen.php b/src/Documentation/DocGen.php deleted file mode 100644 index 00ad078fc..000000000 --- a/src/Documentation/DocGen.php +++ /dev/null @@ -1,259 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Documentation; - -use RecursiveDirectoryIterator; -use RecursiveIteratorIterator; -use RecursiveRegexIterator; -use RegexIterator; - -class DocGen -{ - /** - * @var string - */ - public $root; - /** - * @var DocRecipe[] - */ - public $recipes = []; - - public function __construct(string $root) - { - $this->root = str_replace(DIRECTORY_SEPARATOR, '/', realpath($root)); - } - - public function parse(string $source): void - { - $directory = new RecursiveDirectoryIterator($source); - $iterator = new RegexIterator(new RecursiveIteratorIterator($directory), '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH); - foreach ($iterator as [$path]) { - $realPath = str_replace(DIRECTORY_SEPARATOR, '/', realpath($path)); - $recipePath = str_replace($this->root . '/', '', $realPath); - $recipeName = preg_replace('/\.php$/i', '', basename($recipePath)); - $recipe = new DocRecipe($recipeName, $recipePath); - $recipe->parse(file_get_contents($path)); - $this->recipes[$recipePath] = $recipe; - } - } - - public function gen(string $destination): ?string - { - foreach ($this->recipes as $recipe) { - // $find will try to return DocConfig for a given config $name. - $findConfig = function (string $name) use ($recipe): ?DocConfig { - if (array_key_exists($name, $recipe->config)) { - return $recipe->config[$name]; - } - foreach ($recipe->require as $r) { - if (array_key_exists($r, $this->recipes)) { - if (array_key_exists($name, $this->recipes[$r]->config)) { - return $this->recipes[$r]->config[$name]; - } - } - } - foreach ($this->recipes as $r) { - if (array_key_exists($name, $r->config)) { - return $r->config[$name]; - } - } - return null; - }; - $findConfigOverride = function (DocRecipe $recipe, string $name) use (&$findConfigOverride): ?DocConfig { - foreach ($recipe->require as $r) { - if (array_key_exists($r, $this->recipes)) { - if (array_key_exists($name, $this->recipes[$r]->config)) { - return $this->recipes[$r]->config[$name]; - } - } - } - foreach ($recipe->require as $r) { - if (array_key_exists($r, $this->recipes)) { - return $findConfigOverride($this->recipes[$r], $name); - } - } - return null; - }; - // Replace all {{name}} with link to correct config declaration. - $replaceLinks = function (string $comment) use ($findConfig): string { - $output = ''; - $code = false; - foreach (explode("\n", $comment) as $i => $line) { - if (str_starts_with($line, '```') || str_starts_with($line, '~~~')) { - $code = !$code; - } - if ($code) { - $output .= $line; - $output .= "\n"; - continue; - } - $output .= preg_replace_callback('#(\{\{(?[\w_:\-/]+)\}\})#', function ($m) use ($findConfig) { - $name = $m['name']; - $config = $findConfig($name); - if ($config !== null) { - $md = php_to_md($config->recipePath); - $anchor = anchor($name); - return "[$name](/docs/$md#$anchor)"; - } - return "{{" . $name . "}}"; - }, $line); - $output .= "\n"; - } - return $output; - }; - $findTask = function (string $name) use ($recipe): ?DocTask { - if (array_key_exists($name, $recipe->tasks)) { - return $recipe->tasks[$name]; - } - foreach ($recipe->require as $r) { - if (array_key_exists($r, $this->recipes)) { - if (array_key_exists($name, $this->recipes[$r]->tasks)) { - return $this->recipes[$r]->tasks[$name]; - } - } - } - foreach ($this->recipes as $r) { - if (array_key_exists($name, $r->tasks)) { - return $r->tasks[$name]; - } - } - return null; - }; - - - $filePath = "$destination/" . php_to_md($recipe->recipePath); - - $intro = ''; - $config = ''; - $tasks = ''; - if (count($recipe->require) > 0) { - $intro .= "* Requires\n"; - foreach ($recipe->require as $r) { - $md = php_to_md($r); - $basename = basename($r, '.php'); - $intro .= " * [{$basename}](/docs/{$md})\n"; - } - } - if (!empty($recipe->comment)) { - $intro .= "\n$recipe->comment\n"; - } - if (count($recipe->config) > 0) { - $config .= "## Configuration\n"; - foreach ($recipe->config as $c) { - $anchor = anchor($c->name); - $config .= "### {$c->name}\n"; - $config .= "[Source](https://github.com/deployphp/deployer/blob/master/{$c->recipePath}#L{$c->lineNumber})\n\n"; - $o = $findConfigOverride($recipe, $c->name); - if ($o !== null) { - $md = php_to_md($o->recipePath); - $anchor = anchor($c->name); - $config .= "Overrides [{$c->name}](/docs/$md#$anchor) from `$o->recipePath`.\n\n"; - } - $config .= $replaceLinks($c->comment); - $config .= "\n"; - if ( - !empty($c->defaultValue) - && $c->defaultValue !== "''" - && $c->defaultValue !== '[]' - ) { - $config .= "```php title=\"Default value\"\n"; - $config .= $c->defaultValue; - $config .= "\n"; - $config .= "```\n"; - } - $config .= "\n\n"; - } - } - if (count($recipe->tasks) > 0) { - $tasks .= "## Tasks\n\n"; - foreach ($recipe->tasks as $t) { - $anchor = anchor($t->name); - $tasks .= "### {$t->name}\n"; - $tasks .= "[Source](https://github.com/deployphp/deployer/blob/master/{$t->recipePath}#L{$t->lineNumber})\n\n"; - $tasks .= add_tailing_dot($t->desc) . "\n\n"; - $tasks .= $replaceLinks($t->comment); - if (is_array($t->group)) { - $tasks .= "\n\n"; - $tasks .= "This task is group task which contains next tasks:\n"; - foreach ($t->group as $taskName) { - $t = $findTask($taskName); - if ($t !== null) { - $md = php_to_md($t->recipePath); - $anchor = anchor($t->name); - $tasks .= "* [$taskName](/docs/$md#$anchor)\n"; - } else { - $tasks .= "* `$taskName`\n"; - } - } - } - $tasks .= "\n\n"; - } - } - - $output = << - - - -# $recipe->recipeName - -[Source](/$recipe->recipePath) - -$intro -$config -$tasks -MD; - - if (!file_exists(dirname($filePath))) { - mkdir(dirname($filePath), 0755, true); - } - $output = remove_text_emoji($output); - file_put_contents($filePath, $output); - } - return null; - } -} - -function trim_comment(string $line): string -{ - return preg_replace('#^(/\*\*?\s?|\s\*\s?|//\s?)#', '', $line); -} - -function indent(string $text): string -{ - return implode("\n", array_map(function ($line) { - return " " . $line; - }, explode("\n", $text))); -} - -function php_to_md(string $file): string -{ - return preg_replace('#\.php$#', '.md', $file); -} - -function anchor(string $s): string -{ - return strtolower(str_replace(':', '', $s)); -} - -function remove_text_emoji(string $text): string -{ - return preg_replace('/:(bowtie|smile|laughing|blush|smiley|relaxed|smirk|heart_eyes|kissing_heart|kissing_closed_eyes|flushed|relieved|satisfied|grin|wink|stuck_out_tongue_winking_eye|stuck_out_tongue_closed_eyes|grinning|kissing|kissing_smiling_eyes|stuck_out_tongue|sleeping|worried|frowning|anguished|open_mouth|grimacing|confused|hushed|expressionless|unamused|sweat_smile|sweat|disappointed_relieved|weary|pensive|disappointed|confounded|fearful|cold_sweat|persevere|cry|sob|joy|astonished|scream|neckbeard|tired_face|angry|rage|triumph|sleepy|yum|mask|sunglasses|dizzy_face|imp|smiling_imp|neutral_face|no_mouth|innocent|alien|yellow_heart|blue_heart|purple_heart|heart|green_heart|broken_heart|heartbeat|heartpulse|two_hearts|revolving_hearts|cupid|sparkling_heart|sparkles|star|star2|dizzy|boom|collision|anger|exclamation|question|grey_exclamation|grey_question|zzz|dash|sweat_drops|notes|musical_note|fire|hankey|poop|shit|\+1|thumbsup|\-1|thumbsdown|ok_hand|punch|facepunch|fist|v|wave|hand|raised_hand|open_hands|point_up|point_down|point_left|point_right|raised_hands|pray|point_up_2|clap|muscle|metal|fu|walking|runner|running|couple|family|two_men_holding_hands|two_women_holding_hands|dancer|dancers|ok_woman|no_good|information_desk_person|raising_hand|bride_with_veil|person_with_pouting_face|person_frowning|bow|couplekiss|couple_with_heart|massage|haircut|nail_care|boy|girl|woman|man|baby|older_woman|older_man|person_with_blond_hair|man_with_gua_pi_mao|man_with_turban|construction_worker|cop|angel|princess|smiley_cat|smile_cat|heart_eyes_cat|kissing_cat|smirk_cat|scream_cat|crying_cat_face|joy_cat|pouting_cat|japanese_ogre|japanese_goblin|see_no_evil|hear_no_evil|speak_no_evil|guardsman|skull|feet|lips|kiss|droplet|ear|eyes|nose|tongue|love_letter|bust_in_silhouette|busts_in_silhouette|speech_balloon|thought_balloon|feelsgood|finnadie|goberserk|godmode|hurtrealbad|rage1|rage2|rage3|rage4|suspect|trollface|sunny|umbrella|cloud|snowflake|snowman|zap|cyclone|foggy|ocean|cat|dog|mouse|hamster|rabbit|wolf|frog|tiger|koala|bear|pig|pig_nose|cow|boar|monkey_face|monkey|horse|racehorse|camel|sheep|elephant|panda_face|snake|bird|baby_chick|hatched_chick|hatching_chick|chicken|penguin|turtle|bug|honeybee|ant|beetle|snail|octopus|tropical_fish|fish|whale|whale2|dolphin|cow2|ram|rat|water_buffalo|tiger2|rabbit2|dragon|goat|rooster|dog2|pig2|mouse2|ox|dragon_face|blowfish|crocodile|dromedary_camel|leopard|cat2|poodle|paw_prints|bouquet|cherry_blossom|tulip|four_leaf_clover|rose|sunflower|hibiscus|maple_leaf|leaves|fallen_leaf|herb|mushroom|cactus|palm_tree|evergreen_tree|deciduous_tree|chestnut|seedling|blossom|ear_of_rice|shell|globe_with_meridians|sun_with_face|full_moon_with_face|new_moon_with_face|new_moon|waxing_crescent_moon|first_quarter_moon|waxing_gibbous_moon|full_moon|waning_gibbous_moon|last_quarter_moon|waning_crescent_moon|last_quarter_moon_with_face|first_quarter_moon_with_face|moon|earth_africa|earth_americas|earth_asia|volcano|milky_way|partly_sunny|octocat|squirrel|bamboo|gift_heart|dolls|school_satchel|mortar_board|flags|fireworks|sparkler|wind_chime|rice_scene|jack_o_lantern|ghost|santa|christmas_tree|gift|bell|no_bell|tanabata_tree|tada|confetti_ball|balloon|crystal_ball|cd|dvd|floppy_disk|camera|video_camera|movie_camera|computer|tv|iphone|phone|telephone|telephone_receiver|pager|fax|minidisc|vhs|sound|speaker|mute|loudspeaker|mega|hourglass|hourglass_flowing_sand|alarm_clock|watch|radio|satellite|loop|mag|mag_right|unlock|lock|lock_with_ink_pen|closed_lock_with_key|key|bulb|flashlight|high_brightness|low_brightness|electric_plug|battery|calling|email|mailbox|postbox|bath|bathtub|shower|toilet|wrench|nut_and_bolt|hammer|seat|moneybag|yen|dollar|pound|euro|credit_card|money_with_wings|e-mail|inbox_tray|outbox_tray|envelope|incoming_envelope|postal_horn|mailbox_closed|mailbox_with_mail|mailbox_with_no_mail|door|smoking|bomb|gun|hocho|pill|syringe|page_facing_up|page_with_curl|bookmark_tabs|bar_chart|chart_with_upwards_trend|chart_with_downwards_trend|scroll|clipboard|calendar|date|card_index|file_folder|open_file_folder|scissors|pushpin|paperclip|black_nib|pencil2|straight_ruler|triangular_ruler|closed_book|green_book|blue_book|orange_book|notebook|notebook_with_decorative_cover|ledger|books|bookmark|name_badge|microscope|telescope|newspaper|football|basketball|soccer|baseball|tennis|8ball|rugby_football|bowling|golf|mountain_bicyclist|bicyclist|horse_racing|snowboarder|swimmer|surfer|ski|spades|hearts|clubs|diamonds|gem|ring|trophy|musical_score|musical_keyboard|violin|space_invader|video_game|black_joker|flower_playing_cards|game_die|dart|mahjong|clapper|memo|pencil|book|art|microphone|headphones|trumpet|saxophone|guitar|shoe|sandal|high_heel|lipstick|boot|shirt|tshirt|necktie|womans_clothes|dress|running_shirt_with_sash|jeans|kimono|bikini|ribbon|tophat|crown|womans_hat|mans_shoe|closed_umbrella|briefcase|handbag|pouch|purse|eyeglasses|fishing_pole_and_fish|coffee|tea|sake|baby_bottle|beer|beers|cocktail|tropical_drink|wine_glass|fork_and_knife|pizza|hamburger|fries|poultry_leg|meat_on_bone|spaghetti|curry|fried_shrimp|bento|sushi|fish_cake|rice_ball|rice_cracker|rice|ramen|stew|oden|dango|egg|bread|doughnut|custard|icecream|ice_cream|shaved_ice|birthday|cake|cookie|chocolate_bar|candy|lollipop|honey_pot|apple|green_apple|tangerine|lemon|cherries|grapes|watermelon|strawberry|peach|melon|banana|pear|pineapple|sweet_potato|eggplant|tomato|corn|house|house_with_garden|school|office|post_office|hospital|bank|convenience_store|love_hotel|hotel|wedding|church|department_store|european_post_office|city_sunrise|city_sunset|japanese_castle|european_castle|tent|factory|tokyo_tower|japan|mount_fuji|sunrise_over_mountains|sunrise|stars|statue_of_liberty|bridge_at_night|carousel_horse|rainbow|ferris_wheel|fountain|roller_coaster|ship|speedboat|boat|sailboat|rowboat|anchor|rocket|airplane|helicopter|steam_locomotive|tram|mountain_railway|bike|aerial_tramway|suspension_railway|mountain_cableway|tractor|blue_car|oncoming_automobile|car|red_car|taxi|oncoming_taxi|articulated_lorry|bus|oncoming_bus|rotating_light|police_car|oncoming_police_car|fire_engine|ambulance|minibus|truck|train|station|train2|bullettrain_front|bullettrain_side|light_rail|monorail|railway_car|trolleybus|ticket|fuelpump|vertical_traffic_light|traffic_light|warning|construction|beginner|atm|slot_machine|busstop|barber|hotsprings|checkered_flag|crossed_flags|izakaya_lantern|moyai|circus_tent|performing_arts|round_pushpin|triangular_flag_on_post|jp|kr|cn|us|fr|es|it|ru|gb|uk|de|one|two|three|four|five|six|seven|eight|nine|keycap_ten|1234|zero|hash|symbols|arrow_backward|arrow_down|arrow_forward|arrow_left|capital_abcd|abcd|abc|arrow_lower_left|arrow_lower_right|arrow_right|arrow_up|arrow_upper_left|arrow_upper_right|arrow_double_down|arrow_double_up|arrow_down_small|arrow_heading_down|arrow_heading_up|leftwards_arrow_with_hook|arrow_right_hook|left_right_arrow|arrow_up_down|arrow_up_small|arrows_clockwise|arrows_counterclockwise|rewind|fast_forward|information_source|ok|twisted_rightwards_arrows|repeat|repeat_one|new|top|up|cool|free|ng|cinema|koko|signal_strength|u5272|u5408|u55b6|u6307|u6708|u6709|u6e80|u7121|u7533|u7a7a|u7981|sa|restroom|mens|womens|baby_symbol|no_smoking|parking|wheelchair|metro|baggage_claim|accept|wc|potable_water|put_litter_in_its_place|secret|congratulations|m|passport_control|left_luggage|customs|ideograph_advantage|cl|sos|id|no_entry_sign|underage|no_mobile_phones|do_not_litter|non-potable_water|no_bicycles|no_pedestrians|children_crossing|no_entry|eight_spoked_asterisk|eight_pointed_black_star|heart_decoration|vs|vibration_mode|mobile_phone_off|chart|currency_exchange|aries|taurus|gemini|cancer|leo|virgo|libra|scorpius|sagittarius|capricorn|aquarius|pisces|ophiuchus|six_pointed_star|negative_squared_cross_mark|a|b|ab|o2|diamond_shape_with_a_dot_inside|recycle|end|on|soon|clock1|clock130|clock10|clock1030|clock11|clock1130|clock12|clock1230|clock2|clock230|clock3|clock330|clock4|clock430|clock5|clock530|clock6|clock630|clock7|clock730|clock8|clock830|clock9|clock930|heavy_dollar_sign|copyright|registered|tm|x|heavy_exclamation_mark|bangbang|interrobang|o|heavy_multiplication_x|heavy_plus_sign|heavy_minus_sign|heavy_division_sign|white_flower|100|heavy_check_mark|ballot_box_with_check|radio_button|link|curly_loop|wavy_dash|part_alternation_mark|trident|black_square|white_square|white_check_mark|black_square_button|white_square_button|black_circle|white_circle|red_circle|large_blue_circle|large_blue_diamond|large_orange_diamond|small_blue_diamond|small_orange_diamond|small_red_triangle|small_red_triangle_down|shipit):/i', ':​\1:', $text); -} - -function add_tailing_dot(string $sentence): string -{ - if (empty($sentence)) { - return $sentence; - } - if (str_ends_with($sentence, '.')) { - return $sentence; - } - return $sentence . '.'; -} diff --git a/src/Documentation/DocRecipe.php b/src/Documentation/DocRecipe.php deleted file mode 100644 index 7a0022bf3..000000000 --- a/src/Documentation/DocRecipe.php +++ /dev/null @@ -1,162 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Documentation; - -class DocRecipe -{ - /** - * @var string - */ - public $recipeName; - /** - * @var string - */ - public $recipePath; - /** - * @var string - */ - public $comment; - /** - * @var string[] - */ - public $require = []; - /** - * @var DocConfig[] - */ - public $config = []; - /** - * @var DocTask[] - */ - public $tasks = []; - - public function __construct(string $recipeName, string $recipePath) - { - $this->recipeName = $recipeName; - $this->recipePath = $recipePath; - } - - /** - * @return bool|int - */ - public function parse(string $content) - { - $comment = ''; - $desc = ''; - $currentTask = null; - - $content = str_replace("\r\n", "\n", $content); - - $state = 'root'; - $lines = explode("\n", $content); - - for ($i = 0; $i < count($lines); $i++) { - $line = $lines[$i]; - $m = []; - $match = function ($regexp) use ($line, &$m) { - return preg_match("#$regexp#", $line, $m); - }; - switch ($state) { - case 'root': - if ($match('^/\*\*?')) { - $state = 'comment'; - $comment .= trim_comment($line) . "\n"; - break; - } - if ($match('^//')) { - $comment .= trim_comment($line) . "\n"; - break; - } - if ($match('^require.+?[\'"](?.+?)[\'"]')) { - $this->require[] = dirname($this->recipePath) . $m['recipe']; - break; - } - if ($match('^set\([\'"](?[\w_:\-/]+?)[\'"]')) { - $set = new DocConfig(); - $set->name = $m['config_name']; - $set->comment = trim($comment); - $comment = ''; - $set->recipePath = $this->recipePath; - $set->lineNumber = $i + 1; - if (preg_match('#^set\(.+?,\s(?.+?)\);$#', $line, $m)) { - $set->defaultValue = $m['value']; - } - if (preg_match('#^set\(.+?,\s\[$#', $line, $m)) { - $multiLineArray = "[\n"; - $line = $lines[++$i]; - while (!preg_match('/^]/', $line)) { - $multiLineArray .= $line . "\n"; - $line = $lines[++$i]; - } - $multiLineArray .= "]"; - $set->defaultValue = $multiLineArray; - } - $this->config[$set->name] = $set; - break; - } - if ($match('^desc\([\'"](?.+?)[\'"]\);$')) { - $desc = $m['desc']; - break; - } - if ($match('^task\([\'"](?[\w_:-]+?)[\'"],\s\[$')) { - $task = new DocTask(); - $task->name = $m['task_name']; - $task->desc = $desc; - $task->comment = trim($comment); - $comment = ''; - $task->group = []; - $task->recipePath = $this->recipePath; - $task->lineNumber = $i + 1; - $this->tasks[$task->name] = $task; - $state = 'group_task'; - $currentTask = $task; - break; - } - if ($match('^task\([\'"](?[\w_:-]+?)[\'"]')) { - $task = new DocTask(); - $task->name = $m['task_name']; - $task->desc = $desc; - $task->comment = trim($comment); - $comment = ''; - $task->recipePath = $this->recipePath; - $task->lineNumber = $i + 1; - $this->tasks[$task->name] = $task; - break; - } - if ($match('^<\?php')) { - break; - } - if ($match('^namespace Deployer;$')) { - $this->comment = $comment; - break; - } - - $desc = ''; - $comment = ''; - break; - - case 'comment': - if ($match('\*/\s*$')) { - $state = 'root'; - break; - } - $comment .= trim_comment($line) . "\n"; - break; - - case 'group_task': - if ($match('^\s+\'(?[\w_:-]+?)\',$')) { - $currentTask->group[] = $m['task_name']; - break; - } - $state = 'root'; - break; - } - } - return false; - } -} diff --git a/src/Documentation/DocTask.php b/src/Documentation/DocTask.php deleted file mode 100644 index 94ed034c2..000000000 --- a/src/Documentation/DocTask.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Documentation; - -class DocTask -{ - /** - * @var string - */ - public $name; - /** - * @var string - */ - public $desc; - /** - * @var string - */ - public $comment; - /** - * @var array - */ - public $group; - /** - * @var string - */ - public $recipePath; - /** - * @var int - */ - public $lineNumber; -} diff --git a/src/Exception/ConfigurationException.php b/src/Exception/ConfigurationException.php deleted file mode 100644 index 46eb86188..000000000 --- a/src/Exception/ConfigurationException.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -class ConfigurationException extends \RuntimeException -{ -} diff --git a/src/Exception/Exception.php b/src/Exception/Exception.php deleted file mode 100644 index 1da52a902..000000000 --- a/src/Exception/Exception.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -use Throwable; - -class Exception extends \Exception -{ - /** - * @var string - */ - private static $taskSourceLocation = ''; - /** - * @var string - */ - private $taskFilename = ''; - /** - * @var int|mixed - */ - private $taskLineNumber = 0; - - public function __construct(string $message = "", int $code = 0, Throwable $previous = null) - { - if (function_exists('debug_backtrace')) { - $trace = debug_backtrace(); - foreach ($trace as $t) { - if (!empty($t['file']) && $t['file'] === self::$taskSourceLocation) { - $this->taskFilename = basename($t['file']); - $this->taskLineNumber = $t['line']; - break; - } - } - } - parent::__construct($message, $code, $previous); - } - - public static function setTaskSourceLocation(string $filepath): void - { - self::$taskSourceLocation = $filepath; - } - - public function getTaskFilename(): string - { - return $this->taskFilename; - } - - public function getTaskLineNumber(): int - { - return $this->taskLineNumber; - } - - public function setTaskFilename(string $taskFilename): void - { - $this->taskFilename = $taskFilename; - } - - public function setTaskLineNumber(int $taskLineNumber): void - { - $this->taskLineNumber = $taskLineNumber; - } -} - diff --git a/src/Exception/GracefulShutdownException.php b/src/Exception/GracefulShutdownException.php deleted file mode 100644 index 6b25735db..000000000 --- a/src/Exception/GracefulShutdownException.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -/** - * Then this exception thrown, it will not trigger "fail" callback. - * - * fail('deploy', 'deploy:failed'); - * - * task('deploy', function () { - * throw new GracefulShutdownException(...); - * }); - * - * In example above task `deploy:failed` will not be called. - */ -class GracefulShutdownException extends Exception -{ - const EXIT_CODE = 42; -} diff --git a/src/Exception/HttpieException.php b/src/Exception/HttpieException.php deleted file mode 100644 index 793a7ae76..000000000 --- a/src/Exception/HttpieException.php +++ /dev/null @@ -1,13 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -class HttpieException extends \RuntimeException -{ -} diff --git a/src/Exception/RunException.php b/src/Exception/RunException.php deleted file mode 100644 index 1d5d835ec..000000000 --- a/src/Exception/RunException.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -use Deployer\Host\Host; -use Symfony\Component\Process\Process; - -class RunException extends Exception -{ - /** - * @var Host - */ - private $host; - /** - * @var string - */ - private $command; - /** - * @var int - */ - private $exitCode; - /** - * @var string - */ - private $output; - /** - * @var string - */ - private $errorOutput; - - public function __construct( - Host $host, - string $command, - int $exitCode, - string $output, - string $errorOutput - ) { - $this->host = $host; - $this->command = $command; - $this->exitCode = $exitCode; - $this->output = $output; - $this->errorOutput = $errorOutput; - - $message = sprintf('The command "%s" failed.', $command); - parent::__construct($message, $exitCode); - } - - public function getHost(): Host - { - return $this->host; - } - - public function getCommand(): string - { - return $this->command; - } - - public function getExitCode(): int - { - return $this->exitCode; - } - - public function getExitCodeText(): string - { - return Process::$exitCodes[$this->exitCode] ?? 'Unknown error'; - } - - public function getOutput(): string - { - return $this->output; - } - - public function getErrorOutput(): string - { - return $this->errorOutput; - } -} diff --git a/src/Exception/TimeoutException.php b/src/Exception/TimeoutException.php deleted file mode 100644 index 38592b581..000000000 --- a/src/Exception/TimeoutException.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -class TimeoutException extends Exception -{ - public function __construct( - string $command, - ?float $timeout - ) { - $message = sprintf('The command "%s" exceeded the timeout of %s seconds.', $command, $timeout); - parent::__construct($message, 1); - } -} diff --git a/src/Exception/WillAskUser.php b/src/Exception/WillAskUser.php deleted file mode 100644 index 241c55da4..000000000 --- a/src/Exception/WillAskUser.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Exception; - -class WillAskUser extends Exception -{ - public function __construct(string $message) { - parent::__construct($message); - } -} diff --git a/src/Executor/Master.php b/src/Executor/Master.php deleted file mode 100644 index c4967f824..000000000 --- a/src/Executor/Master.php +++ /dev/null @@ -1,285 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Executor; - -use Deployer\Component\Ssh\Client; -use Deployer\Component\Ssh\IOArguments; -use Deployer\Deployer; -use Deployer\Host\Host; -use Deployer\Host\Localhost; -use Deployer\Selector\Selector; -use Deployer\Task\Task; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Process\PhpExecutableFinder; -use Symfony\Component\Process\Process; - -const FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏']; - -function spinner(string $message = ''): string -{ - $frame = FRAMES[(int) ((new \DateTime)->format('u') / 1e5) % count(FRAMES)]; - return " $frame $message\r"; -} - -class Master -{ - /** - * @var InputInterface - */ - private $input; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var Server - */ - private $server; - - /** - * @var Messenger - */ - private $messenger; - - /** - * @var false|string - */ - private $phpBin; - - public function __construct( - InputInterface $input, - OutputInterface $output, - Server $server, - Messenger $messenger - ) - { - $this->input = $input; - $this->output = $output; - $this->server = $server; - $this->messenger = $messenger; - $this->phpBin = (new PhpExecutableFinder())->find(); - } - - /** - * @param Task[] $tasks - * @param Host[] $hosts - */ - public function run(array $tasks, array $hosts, ?Planner $plan = null): int - { - $globalLimit = (int)$this->input->getOption('limit') ?: count($hosts); - - foreach ($tasks as $task) { - if (!$plan) { - $this->messenger->startTask($task); - } - - $plannedHosts = $hosts; - - $limit = min($globalLimit, $task->getLimit() ?? $globalLimit); - - if ($task->isOnce()) { - $plannedHosts = []; - foreach ($hosts as $currentHost) { - if (Selector::apply($task->getSelector(), $currentHost)) { - $plannedHosts[] = $currentHost; - break; - } - } - } else if ($task->isOncePerNode()) { - $plannedHosts = []; - foreach ($hosts as $currentHost) { - if (Selector::apply($task->getSelector(), $currentHost)) { - $nodeLabel = $currentHost->getHostname(); - $labels = $currentHost->config()->get('labels', []); - if (is_array($labels) && array_key_exists('node', $labels)) { - $nodeLabel = $labels['node']; - } - if (array_key_exists($nodeLabel, $plannedHosts)) { - continue; - } - $plannedHosts[$nodeLabel] = $currentHost; - } - } - } - - if ($limit === 1 || count($plannedHosts) === 1) { - foreach ($plannedHosts as $currentHost) { - if (!Selector::apply($task->getSelector(), $currentHost)) { - if ($plan) { - $plan->commit([], $task); - } - continue; - } - - if ($plan) { - $plan->commit([$currentHost], $task); - continue; - } - - $exitCode = $this->runTask($task, [$currentHost]); - if ($exitCode !== 0) { - return $exitCode; - } - } - } else { - foreach (array_chunk($plannedHosts, $limit) as $chunk) { - $selectedHosts = []; - foreach ($chunk as $currentHost) { - if (Selector::apply($task->getSelector(), $currentHost)) { - $selectedHosts[] = $currentHost; - } - } - - if ($plan) { - $plan->commit($selectedHosts, $task); - continue; - } - - $exitCode = $this->runTask($task, $selectedHosts); - if ($exitCode !== 0) { - return $exitCode; - } - } - } - - if (!$plan) { - $this->messenger->endTask($task); - } - } - - return 0; - } - - /** - * @param Host[] $hosts - */ - private function runTask(Task $task, array $hosts): int - { - if (getenv('DEPLOYER_LOCAL_WORKER') === 'true') { - // This allows to code coverage all recipe, - // as well as speedup tests by not spawning - // lots of processes. Also there is a few tests - // what runs with workers for tests subprocess - // communications. - foreach ($hosts as $host) { - $worker = new Worker(Deployer::get()); - $exitCode = $worker->execute($task, $host); - if ($exitCode !== 0) { - return $exitCode; - } - } - return 0; - } - - $callback = function (string $output) { - $output = preg_replace('/\n$/', '', $output); - if (strlen($output) !== 0) { - $this->output->writeln($output); - } - }; - - /** @var Process[] $processes */ - $processes = []; - - $this->server->loop->futureTick(function () use (&$processes, $hosts, $task) { - foreach ($hosts as $host) { - $processes[] = $this->createProcess($host, $task); - } - - foreach ($processes as $process) { - $process->start(); - } - }); - - $this->server->loop->addPeriodicTimer(0.03, function ($timer) use (&$processes, $callback) { - $this->gatherOutput($processes, $callback); - if ($this->output->isDecorated() && !getenv('CI')) { - $this->output->write(spinner()); - } - if ($this->allFinished($processes)) { - $this->server->loop->stop(); - $this->server->loop->cancelTimer($timer); - } - }); - - $this->server->loop->run(); - - if ($this->output->isDecorated() && !getenv('CI')) { - $this->output->write(" \r"); // clear spinner - } - $this->gatherOutput($processes, $callback); - - return $this->cumulativeExitCode($processes); - } - - protected function createProcess(Host $host, Task $task): Process - { - $command = [ - $this->phpBin, DEPLOYER_BIN, - 'worker', '--port', $this->server->getPort(), - '--task', $task, - '--host', $host->getAlias(), - ]; - $command = array_merge($command, IOArguments::collect($this->input, $this->output)); - if ($task->isVerbose() && $this->output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL) { - $command[] = '-v'; - } - if ($this->output->isDebug()) { - $this->output->writeln("[$host] " . join(' ', $command)); - } - return new Process($command); - } - - /** - * @param Process[] $processes - */ - protected function allFinished(array $processes): bool - { - foreach ($processes as $process) { - if (!$process->isTerminated()) { - return false; - } - } - return true; - } - - /** - * @param Process[] $processes - */ - protected function gatherOutput(array $processes, callable $callback): void - { - foreach ($processes as $process) { - $output = $process->getIncrementalOutput(); - if (strlen($output) !== 0) { - $callback($output); - } - - $errorOutput = $process->getIncrementalErrorOutput(); - if (strlen($errorOutput) !== 0) { - $callback($errorOutput); - } - } - } - - /** - * @param Process[] $processes - */ - protected function cumulativeExitCode(array $processes): int - { - foreach ($processes as $process) { - if ($process->getExitCode() > 0) { - return $process->getExitCode(); - } - } - return 0; - } -} diff --git a/src/Executor/Messenger.php b/src/Executor/Messenger.php deleted file mode 100644 index c6751da90..000000000 --- a/src/Executor/Messenger.php +++ /dev/null @@ -1,158 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Executor; - -use Deployer\Exception\Exception; -use Deployer\Exception\RunException; -use Deployer\Host\Host; -use Deployer\Logger\Logger; -use Deployer\Task\Task; -use Symfony\Component\Console\Input\Input; -use Symfony\Component\Console\Output\Output; -use Throwable; - -class Messenger -{ - /** - * @var Input - */ - private $input; - - /** - * @var Output - */ - private $output; - - /** - * @var Logger - */ - private $logger; - - /** - * @var int|double - */ - private $startTime; - - public function __construct(Input $input, Output $output, Logger $logger) - { - $this->input = $input; - $this->output = $output; - $this->logger = $logger; - } - - public function startTask(Task $task): void - { - $this->startTime = round(microtime(true) * 1000); - if (getenv('GITHUB_WORKFLOW')) { - $this->output->writeln("::group::task {$task->getName()}"); - } else if (getenv('GITLAB_CI')) { - $this->output->writeln("\e[0Ksection_start:{$this->startTime}:{$this->startTime}[collapsed=true]\r\e[0K{$task->getName()}"); - } else { - $this->output->writeln("task {$task->getName()}"); - } - $this->logger->log("task {$task->getName()}"); - } - - /* - * Print task was ok. - */ - public function endTask(Task $task): void - { - if (empty($this->startTime)) { - $this->startTime = round(microtime(true) * 1000); - } - - $endTime = round(microtime(true) * 1000); - $millis = $endTime - $this->startTime; - $seconds = floor($millis / 1000); - $millis = $millis - $seconds * 1000; - $taskTime = ($seconds > 0 ? "{$seconds}s " : "") . "{$millis}ms"; - - if (getenv('GITHUB_WORKFLOW')) { - $this->output->writeln("::endgroup::"); - } else if (getenv('GITLAB_CI')) { - $this->output->writeln("\e[0Ksection_end:{$taskTime}:{$this->startTime}\r\e[0K"); - } else if ($this->output->isVeryVerbose()) { - $this->output->writeln("done {$task->getName()} $taskTime"); - } - $this->logger->log("done {$task->getName()} $taskTime"); - - if (!empty($this->input->getOption('profile'))) { - $line = sprintf("%s\t%s\n", $task->getName(), $taskTime); - file_put_contents($this->input->getOption('profile'), $line, FILE_APPEND); - } - } - - public function endOnHost(Host $host): void - { - if ($this->output->isVeryVerbose()) { - $this->output->writeln("done on $host"); - } - } - - public function renderException(Throwable $exception, Host $host): void - { - if ($exception instanceof RunException) { - - $message = ""; - $message .= "[$host] error in {$exception->getTaskFilename()} on line {$exception->getTaskLineNumber()}:\n"; - if ($this->output->getVerbosity() === Output::VERBOSITY_NORMAL) { - $message .= "[$host] run {$exception->getCommand()}\n"; - foreach (explode("\n", $exception->getErrorOutput()) as $line) { - $line = trim($line); - if ($line !== "") { - $message .= "[$host] err $line\n"; - } - } - foreach (explode("\n", $exception->getOutput()) as $line) { - $line = trim($line); - if ($line !== "") { - $message .= "[$host] $line\n"; - } - } - } - $message .= "[$host] exit code {$exception->getExitCode()} ({$exception->getExitCodeText()})\n"; - $this->output->write($message); - - } else { - $message = ""; - $class = get_class($exception); - $file = basename($exception->getFile()); - $line = $exception->getLine(); - if ($exception instanceof Exception) { - $file = $exception->getTaskFilename(); - $line = $exception->getTaskLineNumber(); - } - $message .= "[$host] $class in $file on line $line:\n"; - $message .= "[$host]\n"; - foreach (explode("\n", $exception->getMessage()) as $line) { - $line = trim($line); - if ($line !== "") { - $message .= "[$host] $line\n"; - } - } - $message .= "[$host]\n"; - if ($this->output->isDebug()) { - foreach (explode("\n", $exception->getTraceAsString()) as $line) { - $line = trim($line); - if ($line !== "") { - $message .= "[$host] $line\n"; - } - } - } - $this->output->write($message); - } - - $this->logger->log($exception->__toString()); - - if ($exception->getPrevious()) { - $this->renderException($exception->getPrevious(), $host); - } - } -} diff --git a/src/Executor/Planner.php b/src/Executor/Planner.php deleted file mode 100644 index 15b1bfb0f..000000000 --- a/src/Executor/Planner.php +++ /dev/null @@ -1,68 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Executor; - -use Deployer\Host\Host; -use Deployer\Task\Task; -use Symfony\Component\Console\Helper\Table; -use Symfony\Component\Console\Output\OutputInterface; - -class Planner -{ - /** - * @var Table - */ - private $table; - /** - * @var array - */ - private $template; - - /** - * Planner constructor. - * - * @param Host[] $hosts - */ - public function __construct(OutputInterface $output, array $hosts) - { - $headers = []; - $this->template = []; - foreach ($hosts as $host) { - $headers[] = $host->getTag(); - $this->template[] = $host->getAlias(); - } - $this->table = new Table($output); - $this->table->setHeaders($headers); - $this->table->setStyle('box'); - } - - /** - * @param Host[] $hosts - */ - public function commit(array $hosts, Task $task): void - { - $row = []; - foreach ($this->template as $alias) { - $on = "-"; - foreach ($hosts as $host) { - if ($alias === $host->getAlias()) { - $on = $task->getName(); - break; - } - } - $row[] = $on; - } - $this->table->addRow($row); - } - - public function render() - { - $this->table->render(); - } -} diff --git a/src/Executor/Server.php b/src/Executor/Server.php deleted file mode 100644 index 81d022bc8..000000000 --- a/src/Executor/Server.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Executor; - -use Deployer\Deployer; -use Deployer\Exception\Exception; -use Deployer\Task\Context; -use Psr\Http\Message\ServerRequestInterface; -use React; -use React\EventLoop\Loop; -use React\Http\HttpServer; -use React\Http\Message\Response; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Throwable; - -class Server -{ - /** - * @var OutputInterface - */ - private $output; - - /** - * @var Deployer - */ - private $deployer; - - /** - * @var React\EventLoop\LoopInterface - */ - public $loop; - - /** - * @var int - */ - private $port; - - public function __construct( - OutputInterface $output, - Deployer $deployer - ) - { - $this->output = $output; - $this->deployer = $deployer; - } - - public function start() - { - $this->loop = Loop::get(); - $server = new HttpServer( - $this->loop, - new React\Http\Middleware\StreamingRequestMiddleware(), - new React\Http\Middleware\RequestBodyBufferMiddleware(16 * 1024 * 1024), // 16 MiB - function (ServerRequestInterface $request) { - try { - return $this->router($request); - } catch (Throwable $exception) { - Deployer::printException($this->output, $exception); - return new React\Http\Message\Response(500, ['Content-Type' => 'text/plain'], 'Master error: ' . $exception->getMessage()); - } - } - ); - $socket = new React\Socket\Server(0, $this->loop); - $server->listen($socket); - $address = $socket->getAddress(); - $this->port = parse_url($address, PHP_URL_PORT); - } - - private function router(ServerRequestInterface $request): Response - { - $path = $request->getUri()->getPath(); - switch ($path) { - case '/load': - ['host' => $host] = json_decode((string)$request->getBody(), true); - - $host = $this->deployer->hosts->get($host); - $config = json_encode($host->config()->persist()); - - return new Response(200, ['Content-Type' => 'application/json'], $config); - - case '/save': - ['host' => $host, 'config' => $config] = json_decode((string)$request->getBody(), true); - - $host = $this->deployer->hosts->get($host); - $host->config()->update($config); - - return new Response(200, ['Content-Type' => 'application/json'], 'true'); - - case '/proxy': - ['host' => $host, 'func' => $func, 'arguments' => $arguments] = json_decode((string)$request->getBody(), true); - - Context::push(new Context($this->deployer->hosts->get($host))); - $answer = call_user_func($func, ...$arguments); - Context::pop(); - - return new Response(200, ['Content-Type' => 'application/json'], json_encode($answer)); - - default: - throw new Exception('Server path not found: ' . $request->getUri()->getPath()); - } - } - - public function getPort(): int - { - return $this->port; - } -} diff --git a/src/Executor/Worker.php b/src/Executor/Worker.php deleted file mode 100644 index 2aea644ff..000000000 --- a/src/Executor/Worker.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Executor; - -use Deployer\Deployer; -use Deployer\Exception\Exception; -use Deployer\Exception\GracefulShutdownException; -use Deployer\Exception\RunException; -use Deployer\Host\Host; -use Deployer\Task\Context; -use Deployer\Task\Task; -use Throwable; - -class Worker -{ - /** - * @var Deployer - */ - private $deployer; - - public function __construct(Deployer $deployer) - { - $this->deployer = $deployer; - } - - public function execute(Task $task, Host $host): int - { - try { - Exception::setTaskSourceLocation($task->getSourceLocation()); - - $context = new Context($host); - $task->run($context); - - if ($task->getName() !== 'connect') { - $this->deployer->messenger->endOnHost($host); - } - return 0; - } catch (Throwable $e) { - $this->deployer->messenger->renderException($e, $host); - if ($e instanceof GracefulShutdownException) { - return GracefulShutdownException::EXIT_CODE; - } - if ($e instanceof RunException) { - return $e->getExitCode(); - } - return 255; - } - } -} diff --git a/src/Host/Host.php b/src/Host/Host.php deleted file mode 100644 index 125c3adcb..000000000 --- a/src/Host/Host.php +++ /dev/null @@ -1,305 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Host; - -use Deployer\Configuration\Configuration; -use Deployer\Deployer; -use Deployer\Exception\ConfigurationException; -use Deployer\Exception\Exception; -use Deployer\Task\Context; -use function Deployer\Support\colorize_host; -use function Deployer\Support\parse_home_dir; - -class Host -{ - /** - * @var Configuration $config - */ - private $config; - - public function __construct(string $hostname) - { - $parent = null; - if (Deployer::get()) { - $parent = Deployer::get()->config; - } - $this->config = new Configuration($parent); - $this->set('#alias', $hostname); - $this->set('hostname', preg_replace('/\/.+$/', '', $hostname)); - } - - public function __toString(): string - { - return $this->getTag(); - } - - public function config(): Configuration - { - return $this->config; - } - - /** - * @param mixed $value - */ - public function set(string $name, $value): self - { - if ($name === 'alias') { - throw new ConfigurationException("Can not update alias of the host.\nThis will change only host own alias,\nbut not the key it is stored in HostCollection."); - } - if ($name === '#alias') { - $name = 'alias'; - } - $this->config->set($name, $value); - return $this; - } - - public function add(string $name, array $value): self - { - $this->config->add($name, $value); - return $this; - } - - public function has(string $name): bool - { - return $this->config->has($name); - } - - public function hasOwn(string $name): bool - { - return $this->config->hasOwn($name); - } - - /** - * @param mixed|null $default - * @return mixed|null - */ - public function get(string $name, $default = null) - { - return $this->config->get($name, $default); - } - - public function getAlias(): ?string - { - return $this->config->get('alias', null); - } - - public function setTag(string $tag): self - { - $this->config->set('tag', $tag); - return $this; - } - - public function getTag(): ?string - { - return $this->config->get('tag', colorize_host($this->getAlias())); - } - - public function setHostname(string $hostname): self - { - $this->config->set('hostname', $hostname); - return $this; - } - - public function getHostname(): ?string - { - return $this->config->get('hostname', null); - } - - public function setRemoteUser(string $user): self - { - $this->config->set('remote_user', $user); - return $this; - } - - public function getRemoteUser(): ?string - { - return $this->config->get('remote_user', null); - } - - /** - * @param string|int|null $port - * @return $this - */ - public function setPort($port): self - { - $this->config->set('port', $port); - return $this; - } - - /** - * @return string|int|null - */ - public function getPort() - { - return $this->config->get('port', null); - } - - public function setConfigFile(string $file): self - { - $this->config->set('config_file', $file); - return $this; - } - - public function getConfigFile(): ?string - { - return $this->config->get('config_file', null); - } - - public function setIdentityFile(string $file): self - { - $this->config->set('identity_file', $file); - return $this; - } - - public function getIdentityFile(): ?string - { - return $this->config->get('identity_file', null); - } - - public function setForwardAgent(bool $on): self - { - $this->config->set('forward_agent', $on); - return $this; - } - - public function getForwardAgent(): ?bool - { - return $this->config->get('forward_agent', null); - } - - public function setSshMultiplexing(bool $on): self - { - $this->config->set('ssh_multiplexing', $on); - return $this; - } - - public function getSshMultiplexing(): ?bool - { - return $this->config->get('ssh_multiplexing', null); - } - - public function setShell(string $command): self - { - $this->config->set('shell', $command); - return $this; - } - - public function getShell(): ?string - { - return $this->config->get('shell', null); - } - - public function setDeployPath(string $path): self - { - $this->config->set('deploy_path', $path); - return $this; - } - - public function getDeployPath(): ?string - { - return $this->config->get('deploy_path', null); - } - - public function setLabels(array $labels): self - { - $this->config->set('labels', $labels); - return $this; - } - - public function getLabels(): ?array - { - return $this->config->get('labels', null); - } - - public function setSshArguments(array $args): self - { - $this->config->set('ssh_arguments', $args); - return $this; - } - - public function getSshArguments(): ?array - { - return $this->config->get('ssh_arguments', null); - } - - public function setSshControlPath(string $path): self - { - $this->config->set('ssh_control_path', $path); - return $this; - } - - public function getSshControlPath(): string - { - return $this->config->get('ssh_control_path', $this->generateControlPath()); - } - - private function generateControlPath(): string - { - $C = $this->getHostname(); - if ($this->has('remote_user')) { - $C = $this->getRemoteUser() . '@' . $C; - } - if ($this->has('port')) { - $C .= ':' . $this->getPort(); - } - - // In case of CI environment, lets use shared memory. - if (getenv('CI') && is_writable('/dev/shm')) { - return "/dev/shm/$C"; - } - - return "~/.ssh/$C"; - } - - public function connectionString(): string - { - if ($this->get('remote_user', '') !== '') { - return $this->get('remote_user') . '@' . $this->get('hostname'); - } - return $this->get('hostname'); - } - - public function connectionOptionsString(): string - { - return implode(' ', array_map('escapeshellarg', $this->connectionOptionsArray())); - } - - /** - * @return string[] - */ - public function connectionOptionsArray(): array - { - $options = []; - if ($this->has('ssh_arguments')) { - foreach ($this->getSshArguments() as $arg) { - $options = array_merge($options, explode(' ', $arg)); - } - } - if ($this->has('port')) { - $options = array_merge($options, ['-p', $this->getPort()]); - } - if ($this->has('config_file')) { - $options = array_merge($options, ['-F', parse_home_dir($this->getConfigFile())]); - } - if ($this->has('identity_file')) { - $options = array_merge($options, ['-i', parse_home_dir($this->getIdentityFile())]); - } - if ($this->has('forward_agent') && $this->getForwardAgent()) { - $options = array_merge($options, ['-A']); - } - if ($this->has('ssh_multiplexing') && $this->getSshMultiplexing()) { - $options = array_merge($options, [ - '-o', 'ControlMaster=auto', - '-o', 'ControlPersist=60', - '-o', 'ControlPath=' . $this->getSshControlPath(), - ]); - } - return $options; - } -} diff --git a/src/Host/HostCollection.php b/src/Host/HostCollection.php deleted file mode 100644 index 26c512c08..000000000 --- a/src/Host/HostCollection.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Host; - -use Deployer\Collection\Collection; - -/** - * @method Host get($name) - * @method Host[] getIterator() - */ -class HostCollection extends Collection -{ - protected function throwNotFound(string $name): void - { - throw new \InvalidArgumentException("Host \"$name\" not found."); - } -} diff --git a/src/Host/Localhost.php b/src/Host/Localhost.php deleted file mode 100644 index 2da827cc3..000000000 --- a/src/Host/Localhost.php +++ /dev/null @@ -1,17 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Host; - -class Localhost extends Host -{ - public function __construct(string $hostname = 'localhost') - { - parent::__construct($hostname); - } -} diff --git a/src/Host/Range.php b/src/Host/Range.php deleted file mode 100644 index a51c931b6..000000000 --- a/src/Host/Range.php +++ /dev/null @@ -1,42 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Host; - -class Range -{ - const PATTERN = '/\[(.+?)\]/'; - - public static function expand(array $hostnames): array - { - $expanded = []; - foreach ($hostnames as $hostname) { - if (preg_match(self::PATTERN, $hostname, $matches)) { - [$start, $end] = explode(':', $matches[1]); - $zeroBased = (bool) preg_match('/^0[1-9]/', $start); - - foreach (range($start, $end) as $i) { - $expanded[] = preg_replace(self::PATTERN, self::format((string) $i, $zeroBased), $hostname); - } - } else { - $expanded[] = $hostname; - } - } - - return $expanded; - } - - private static function format(string $i, bool $zeroBased): string - { - if ($zeroBased) { - return strlen($i) === 1 ? "0$i" : $i; - } else { - return $i; - } - } -} diff --git a/src/Importer/Importer.php b/src/Importer/Importer.php deleted file mode 100644 index 47c72b0c7..000000000 --- a/src/Importer/Importer.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Importer; - -use Deployer\Deployer; -use Deployer\Exception\ConfigurationException; -use Deployer\Exception\Exception; -use JsonSchema\Constraints\Constraint; -use JsonSchema\Constraints\Factory; -use JsonSchema\SchemaStorage; -use JsonSchema\Validator; -use Symfony\Component\Yaml\Yaml; -use function array_filter; -use function array_keys; -use function Deployer\after; -use function Deployer\before; -use function Deployer\cd; -use function Deployer\download; -use function Deployer\host; -use function Deployer\localhost; -use function Deployer\run; -use function Deployer\runLocally; -use function Deployer\set; -use function Deployer\Support\find_line_number; -use function Deployer\task; -use function Deployer\upload; -use function substr; -use const ARRAY_FILTER_USE_KEY; - -class Importer -{ - /** - * @var string - */ - private static $recipeFilename; - /** - * @var string - */ - private static $recipeSource; - - /** - * @param string|string[] $paths - */ - public static function import($paths) - { - if (!is_array($paths)) { - $paths = [$paths]; - } - foreach ($paths as $path) { - if (preg_match('/\.php$/i', $path)) { - // Prevent variable leak into deploy.php file - call_user_func(function () use ($path) { - // Reorder autoload stack - $originStack = spl_autoload_functions(); - - require $path; - - $newStack = spl_autoload_functions(); - if ($originStack[0] !== $newStack[0]) { - foreach (array_reverse($originStack) as $loader) { - spl_autoload_unregister($loader); - spl_autoload_register($loader, true, true); - } - } - }); - } else if (preg_match('/\.ya?ml$/i', $path)) { - self::$recipeFilename = basename($path); - self::$recipeSource = file_get_contents($path); - $root = array_filter(Yaml::parse(self::$recipeSource), static function (string $key) { - return substr($key, 0, 1) !== '.'; - }, ARRAY_FILTER_USE_KEY); - - $schema = 'file://' . __DIR__ . '/../schema.json'; - if (Deployer::isPharArchive()) { - $schema = __DIR__ . '/../schema.json'; - } - $yamlSchema = json_decode(file_get_contents($schema)); - $schemaStorage = new SchemaStorage(); - $schemaStorage->addSchema('file://schema', $yamlSchema); - $validator = new Validator(new Factory($schemaStorage)); - $validator->validate($root, $yamlSchema, Constraint::CHECK_MODE_TYPE_CAST); - if (!$validator->isValid()) { - $msg = "YAML " . self::$recipeFilename . " does not validate. Violations:\n"; - foreach ($validator->getErrors() as $error) { - $msg .= "[{$error['property']}] {$error['message']}\n"; - } - throw new ConfigurationException($msg); - } - - foreach (array_keys($root) as $key) { - static::$key($root[$key]); - } - } else { - throw new Exception("Unknown file format: $path\nOnly .php and .yaml supported."); - } - } - } - - protected static function hosts(array $hosts) - { - foreach ($hosts as $alias => $config) { - if ($config['local'] ?? false) { - $host = localhost($alias); - } else { - $host = host($alias); - } - if (is_array($config)) { - foreach ($config as $key => $value) { - $host->set($key, $value); - } - } - } - } - - protected static function config(array $config) - { - foreach ($config as $key => $value) { - set($key, $value); - } - } - - protected static function tasks(array $tasks) - { - $buildTask = function ($name, $steps) { - $body = function () { - }; - $task = task($name, $body); - - foreach ($steps as $step) { - $buildStep = function ($step) use (&$body, $task) { - extract($step); - - if (isset($cd)) { - $prev = $body; - $body = function () use ($cd, $prev) { - $prev(); - cd($cd); - }; - } - - if (isset($run)) { - $has = 'run'; - $prev = $body; - $body = function () use ($run, $prev) { - $prev(); - try { - run($run); - } catch (Exception $e) { - $e->setTaskFilename(self::$recipeFilename); - $e->setTaskLineNumber(find_line_number(self::$recipeSource, $run)); - throw $e; - } - }; - } - - if (isset($run_locally)) { - if (isset($has)) { - throw new ConfigurationException("Task step can not have both $has and run_locally."); - } - $has = 'run_locally'; - $prev = $body; - $body = function () use ($run_locally, $prev) { - $prev(); - try { - runLocally($run_locally); - } catch (Exception $e) { - $e->setTaskFilename(self::$recipeFilename); - $e->setTaskLineNumber(find_line_number(self::$recipeSource, $run_locally)); - throw $e; - } - }; - } - - if (isset($upload)) { - if (isset($has)) { - throw new ConfigurationException("Task step can not have both $has and upload."); - } - $has = 'upload'; - $prev = $body; - $body = function () use ($upload, $prev) { - $prev(); - upload($upload['src'], $upload['dest']); - }; - } - - if (isset($download)) { - if (isset($has)) { - throw new ConfigurationException("Task step can not have both $has and downlaod."); - } - $has = 'downlaod'; - $prev = $body; - $body = function () use ($download, $prev) { - $prev(); - download($download['src'], $download['dest']); - }; - } - - $methods = [ - 'desc', - 'once', - 'hidden', - 'limit', - 'select', - ]; - foreach ($methods as $method) { - if (isset($$method)) { - $task->$method($$method); - } - } - }; - - $buildStep($step); - $task->setCallback($body); - } - }; - - foreach ($tasks as $name => $config) { - foreach ($config as $key => $value) { - if (!is_int($key) || !is_string($value)) { - goto not_a_group_task; - } - } - - // Create a group task. - task($name, $config); - continue; - - not_a_group_task: - $buildTask($name, $config); - } - } - - protected static function after(array $after) - { - foreach ($after as $key => $value) { - if (is_array($value)) { - foreach (array_reverse($value) as $v) { - after($key, $v); - } - } else { - after($key, $value); - } - } - } - - protected static function before(array $before) - { - foreach ($before as $key => $value) { - if (is_array($value)) { - foreach (array_reverse($value) as $v) { - before($key, $v); - } - } else { - before($key, $value); - } - } - } -} diff --git a/src/Logger/Handler/FileHandler.php b/src/Logger/Handler/FileHandler.php deleted file mode 100644 index ca8c0b031..000000000 --- a/src/Logger/Handler/FileHandler.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Logger\Handler; - -class FileHandler implements HandlerInterface -{ - /** - * @var string - */ - private $filePath; - - public function __construct(string $filePath) - { - $this->filePath = $filePath; - } - - public function log(string $message): void - { - file_put_contents($this->filePath, $message, FILE_APPEND); - } -} diff --git a/src/Logger/Handler/HandlerInterface.php b/src/Logger/Handler/HandlerInterface.php deleted file mode 100644 index f0ab20271..000000000 --- a/src/Logger/Handler/HandlerInterface.php +++ /dev/null @@ -1,14 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Logger\Handler; - -interface HandlerInterface -{ - public function log(string $message): void; -} diff --git a/src/Logger/Handler/NullHandler.php b/src/Logger/Handler/NullHandler.php deleted file mode 100644 index 3a1df24de..000000000 --- a/src/Logger/Handler/NullHandler.php +++ /dev/null @@ -1,16 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Logger\Handler; - -class NullHandler implements HandlerInterface -{ - public function log(string $message): void - { - } -} diff --git a/src/Logger/Logger.php b/src/Logger/Logger.php deleted file mode 100644 index f2eb3b00a..000000000 --- a/src/Logger/Logger.php +++ /dev/null @@ -1,57 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Logger; - -use Deployer\Component\ProcessRunner\Printer; -use Deployer\Host\Host; -use Deployer\Logger\Handler\HandlerInterface; - -class Logger -{ - /** - * @var HandlerInterface - */ - private $handler; - - public function __construct(HandlerInterface $handler) - { - $this->handler = $handler; - } - - public function log(string $message): void - { - $this->handler->log("$message\n"); - } - - public function callback(Host $host): \Closure - { - return function ($type, $buffer) use ($host) { - $this->printBuffer($host, $type, $buffer); - }; - } - - public function printBuffer(Host $host, string $type, string $buffer): void - { - foreach (explode("\n", rtrim($buffer)) as $line) { - $this->writeln($host, $type, $line); - } - } - - public function writeln(Host $host, string $type, string $line): void - { - $line = Printer::filterOutput($line); - - // Omit empty lines - if (empty($line)) { - return; - } - - $this->log("[{$host->getAlias()}] $line"); - } -} diff --git a/src/Selector/Selector.php b/src/Selector/Selector.php deleted file mode 100644 index c9be60472..000000000 --- a/src/Selector/Selector.php +++ /dev/null @@ -1,114 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Selector; - -use Deployer\Host\Host; -use Deployer\Host\HostCollection; -use function Deployer\Support\array_all; - -class Selector -{ - /** - * @var HostCollection - */ - private $hosts; - - public function __construct(HostCollection $hosts) - { - $this->hosts = $hosts; - } - - /** - * @return Host[] - */ - public function select(string $selectExpression) - { - $conditions = self::parse($selectExpression); - - $hosts = []; - foreach ($this->hosts as $host) { - if (self::apply($conditions, $host)) { - $hosts[] = $host; - } - } - - return $hosts; - } - - public static function apply(?array $conditions, Host $host): bool - { - if (empty($conditions)) { - return true; - } - - $labels = $host->get('labels', []); - $labels['alias'] = $host->getAlias(); - $labels['true'] = 'true'; - $isTrue = function ($value) { - return $value; - }; - - foreach ($conditions as $hmm) { - $ok = []; - foreach ($hmm as list($op, $var, $value)) { - $ok[] = self::compare($op, $labels[$var] ?? null, $value); - } - if (count($ok) > 0 && array_all($ok, $isTrue)) { - return true; - } - } - return false; - } - - /** - * @param string|string[] $a - */ - private static function compare(string $op, $a, ?string $b): bool - { - $matchFunction = function($a, ?string $b) { - foreach ((array)$a as $item) { - if ($item === $b) { - return true; - } - } - - return false; - }; - - if ($op === '=') { - return $matchFunction($a, $b); - } - if ($op === '!=') { - return !$matchFunction($a, $b); - } - return false; - } - - public static function parse(string $expression): array - { - $all = []; - foreach (explode(',', $expression) as $sub) { - $conditions = []; - foreach (explode('&', $sub) as $part) { - $part = trim($part); - if ($part === 'all') { - $conditions[] = ['=', 'true', 'true']; - continue; - } - if (preg_match('/(?.+?)(?!?=)(?.+)/', $part, $match)) { - $conditions[] = [$match['op'], trim($match['var']), trim($match['value'])]; - } else { - $conditions[] = ['=', 'alias', trim($part)]; - } - } - $all[] = $conditions; - } - return $all; - } -} diff --git a/src/Support/ObjectProxy.php b/src/Support/ObjectProxy.php deleted file mode 100644 index 3c8f348e7..000000000 --- a/src/Support/ObjectProxy.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Support; - -class ObjectProxy -{ - /** - * @var array - */ - private $objects; - - public function __construct(array $objects) - { - $this->objects = $objects; - } - - public function __call(string $name, array $arguments): self - { - foreach ($this->objects as $object) { - $object->$name(...$arguments); - } - return $this; - } -} diff --git a/src/Support/Reporter.php b/src/Support/Reporter.php deleted file mode 100644 index 05e4bfa9b..000000000 --- a/src/Support/Reporter.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Support; - -use Deployer\Utility\Httpie; -use Symfony\Component\Process\PhpProcess; - -/** - * @codeCoverageIgnore - */ -class Reporter -{ - public static function report(array $stats): void - { - $version = DEPLOYER_VERSION; - $body = json_encode($stats); - $length = strlen($body); - $php = new PhpProcess(<<start(); - } -} diff --git a/src/Support/helpers.php b/src/Support/helpers.php deleted file mode 100644 index cea17111c..000000000 --- a/src/Support/helpers.php +++ /dev/null @@ -1,254 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Support; - -/** - * Flatten array - * - * @param array $array - * @return array - */ -function array_flatten(array $array) -{ - $flatten = []; - array_walk_recursive($array, function ($value) use (&$flatten) { - $flatten[] = $value; - }); - return $flatten; -} - -/** - * Recursively merge two config arrays with a specific behavior: - * - * 1. scalar values are overridden - * 2. array values are extended uniquely if all keys are numeric - * 3. all other array values are merged - * - * @param array $original - * @param array $override - * @return array - * @see http://stackoverflow.com/a/36366886/6812729 - */ -function array_merge_alternate(array $original, array $override) -{ - foreach ($override as $key => $value) { - if (isset($original[$key])) { - if (!is_array($original[$key])) { - if (is_numeric($key)) { - // Append scalar value - $original[] = $value; - } else { - // Override scalar value - $original[$key] = $value; - } - } elseif (array_keys($original[$key]) === range(0, count($original[$key]) - 1)) { - // Uniquely append to array with numeric keys - $original[$key] = array_unique(array_merge($original[$key], $value)); - } else { - // Merge all other arrays - $original[$key] = array_merge_alternate($original[$key], $value); - } - } else { - // Simply add new key/value - $original[$key] = $value; - } - } - - return $original; -} - -/** - * Determines if the given string contains the given value. - */ -function str_contains(string $haystack, string $needle): bool -{ - return strpos($haystack, $needle) !== false; -} - -/** - * Checks if string stars with given prefix. - */ -function starts_with(string $string, string $startString): bool -{ - $len = strlen($startString); - return (substr($string, 0, $len) === $startString); -} - -/** - * This function used for create environment string. - */ -function env_stringify(array $array): string -{ - return implode(' ', array_map( - function ($key, $value) { - return sprintf("%s=%s", $key, escapeshellarg((string)$value)); - }, - array_keys($array), - $array - )); -} - -/** - * Check if var is closure. - * @param mixed $var - */ -function is_closure($var): bool -{ - return is_object($var) && ($var instanceof \Closure); -} - -/** - * Check if all elements satisfy predicate. - */ -function array_all(array $array, callable $predicate): bool -{ - foreach ($array as $key => $value) { - if (!$predicate($value, $key)) { - return false; - } - } - return true; -} - -/** - * Cleanup CRLF new line endings. - */ -function normalize_line_endings(string $string): string -{ - return str_replace(["\r\n", "\r"], "\n", $string); -} - -/** - * Expand leading tilde (~) symbol in given path. - */ -function parse_home_dir(string $path): string -{ - if ('~' === $path || 0 === strpos($path, '~/')) { - if (isset($_SERVER['HOME'])) { - $home = $_SERVER['HOME']; - } elseif (isset($_SERVER['HOMEDRIVE'], $_SERVER['HOMEPATH'])) { - $home = $_SERVER['HOMEDRIVE'] . $_SERVER['HOMEPATH']; - } else { - return $path; - } - - return $home . substr($path, 1); - } - - return $path; -} - -function find_line_number(string $source, string $string): int -{ - $string = explode(PHP_EOL, $string)[0]; - $before = strstr($source, $string, true); - if (false !== $before) { - return count(explode(PHP_EOL, $before)); - } - return 1; -} - -function find_config_line(string $source, string $name): \Generator -{ - foreach (explode(PHP_EOL, $source) as $n => $line) { - if (preg_match("/\(['\"]{$name}['\"]/", $line)) { - yield [$n + 1, $line]; - } - if (preg_match("/\s{$name}:/", $line)) { - yield [$n + 1, $line]; - } - } -} - -function colorize_host(string $alias): string -{ - if (defined('NO_ANSI')) { - return $alias; - } - - if (in_array($alias, ['localhost', 'local'], true)) { - return $alias; - } - - if (getenv('COLORTERM') === 'truecolor') { - $hsv = function ($h, $s, $v) { - $r = $g = $b = $i = $f = $p = $q = $t = 0; - $i = floor($h * 6); - $f = $h * 6 - $i; - $p = $v * (1 - $s); - $q = $v * (1 - $f * $s); - $t = $v * (1 - (1 - $f) * $s); - switch ($i % 6) { - case 0: - $r = $v; - $g = $t; - $b = $p; - break; - case 1: - $r = $q; - $g = $v; - $b = $p; - break; - case 2: - $r = $p; - $g = $v; - $b = $t; - break; - case 3: - $r = $p; - $g = $q; - $b = $v; - break; - case 4: - $r = $t; - $g = $p; - $b = $v; - break; - case 5: - $r = $v; - $g = $p; - $b = $q; - break; - } - $r = round($r * 255); - $g = round($g * 255); - $b = round($b * 255); - return "\x1b[38;2;{$r};{$g};{$b}m"; - }; - $total = 100; - $colors = []; - for ($i = 0; $i < $total; $i++) { - $colors[] = $hsv($i / $total, .5, .9); - } - if ($alias === 'prod' || $alias === 'production') { - return "$colors[99]$alias\x1b[0m"; - } - if ($alias === 'beta') { - return "$colors[14]$alias\x1b[0m"; - } - $tag = $colors[abs(crc32($alias)) % count($colors)]; - return "$tag$alias\x1b[0m"; - } - - $colors = [ - 'fg=cyan;options=bold', - 'fg=green;options=bold', - 'fg=yellow;options=bold', - 'fg=cyan', - 'fg=blue', - 'fg=yellow', - 'fg=magenta', - 'fg=blue;options=bold', - 'fg=green', - 'fg=magenta;options=bold', - 'fg=red;options=bold', - ]; - $tag = $colors[abs(crc32($alias)) % count($colors)]; - return "<$tag>$alias"; -} diff --git a/src/Support/update_manifest.php b/src/Support/update_manifest.php deleted file mode 100644 index 43035979c..000000000 --- a/src/Support/update_manifest.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer; - -task('update_manifest', function () { - $version = get('version'); - $manifestPath = '~/deployer.org/artifacts/manifest.json'; - $manifest = json_decode(run("cat $manifestPath"), true); - - $newPharManifest = [ - 'name' => 'deployer.phar', - 'sha1' => get('sha1'), - 'url' => "https://github.com/deployphp/deployer/releases/download/v$version/deployer.phar", - 'version' => $version, - ]; - - // Check if this version already in manifest.json. - $alreadyExistVersion = null; - foreach ($manifest as $i => $m) { - if ($m['version'] === $version) { - $alreadyExistVersion = $i; - } - } - - // Save or update. - if (empty($alreadyExistVersion)) { - $manifest[] = $newPharManifest; - } else { - $manifest[$alreadyExistVersion] = $newPharManifest; - } - - // Write manifest to manifest.json. - $content = json_encode($manifest, JSON_PRETTY_PRINT); - run("echo '$content' > $manifestPath"); -}); diff --git a/src/Task/Context.php b/src/Task/Context.php deleted file mode 100644 index c0f0f8d88..000000000 --- a/src/Task/Context.php +++ /dev/null @@ -1,85 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Task; - -use Deployer\Configuration\Configuration; -use Deployer\Exception\Exception; -use Deployer\Host\Host; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -class Context -{ - /** - * @var Host - */ - private $host; - - /** - * @var Context[] - */ - private static $contexts = []; - - public function __construct(Host $host) - { - $this->host = $host; - } - - public static function push(Context $context): void - { - self::$contexts[] = $context; - } - - public static function has(): bool - { - return !empty(self::$contexts); - } - - /** - * @return Context|false - * @throws Exception - */ - public static function get() - { - if (empty(self::$contexts)) { - throw new Exception("Context was requested but was not available."); - } - return end(self::$contexts); - } - - public static function pop(): ?Context - { - return array_pop(self::$contexts); - } - - /** - * Throws a Exception when not called within a task-context and therefore no Context is available. - * - * This method provides a useful error to the end-user to make him/her aware - * to use a function in the required task-context. - * - * @throws Exception - */ - public static function required(string $callerName): void - { - if (empty(self::$contexts)) { - throw new Exception("'$callerName' can only be used within a task."); - } - } - - public function getConfig(): Configuration - { - return $this->host->config(); - } - - public function getHost(): Host - { - return $this->host; - } -} diff --git a/src/Task/GroupTask.php b/src/Task/GroupTask.php deleted file mode 100644 index a43a77eb2..000000000 --- a/src/Task/GroupTask.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Task; - -use function Deployer\invoke; - -class GroupTask extends Task -{ - /** - * List of tasks. - * - * @var string[] - */ - private $group; - - /** - * @param string[] $group - */ - public function __construct(string $name, array $group) - { - parent::__construct($name); - $this->group = $group; - } - - public function run(Context $context): void - { - foreach ($this->group as $item) { - invoke($item); - } - } - - /** - * List of dependent tasks names - * - * @return string[] - */ - public function getGroup(): array - { - return $this->group; - } - - public function setGroup(array $group): void - { - $this->group = $group; - } -} diff --git a/src/Task/ScriptManager.php b/src/Task/ScriptManager.php deleted file mode 100644 index 7757624ea..000000000 --- a/src/Task/ScriptManager.php +++ /dev/null @@ -1,123 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Task; - -use Deployer\Exception\Exception; -use function Deployer\Support\array_flatten; - -class ScriptManager -{ - /** - * @var TaskCollection - */ - private $tasks; - /** - * @var bool - */ - private $hooksEnabled = true; - /** - * @var array - */ - private $visitedTasks = []; - - public function __construct(TaskCollection $tasks) - { - $this->tasks = $tasks; - } - - /** - * Return tasks to run. - * - * @return Task[] - */ - public function getTasks(string $name, ?string $startFrom = null, array &$skipped = []): array - { - $tasks = []; - $this->visitedTasks = []; - $allTasks = $this->doGetTasks($name); - - if ($startFrom === null) { - $tasks = $allTasks; - } else { - $skip = true; - foreach ($allTasks as $task) { - if ($skip) { - if ($task->getName() === $startFrom) { - $skip = false; - } else { - $skipped[] = $task->getName(); - continue; - } - } - $tasks[] = $task; - } - if (count($tasks) === 0) { - throw new Exception('All tasks skipped via --start-from option. Nothing to run.'); - } - } - - $enabledTasks = []; - foreach ($tasks as $task) { - if ($task->isEnabled()) { - $enabledTasks[] = $task; - } - } - - return $enabledTasks; - } - - /** - * @return Task[] - */ - public function doGetTasks(string $name): array - { - if (array_key_exists($name, $this->visitedTasks)) { - if ($this->visitedTasks[$name] >= 100) { - throw new Exception("Looks like a circular dependency with \"$name\" task."); - } - $this->visitedTasks[$name]++; - } else { - $this->visitedTasks[$name] = 1; - } - - $tasks = []; - $task = $this->tasks->get($name); - if ($this->hooksEnabled) { - $tasks = array_merge(array_map([$this, 'doGetTasks'], $task->getBefore()), $tasks); - } - if ($task instanceof GroupTask) { - foreach ($task->getGroup() as $taskName) { - $subTasks = $this->doGetTasks($taskName); - foreach ($subTasks as $subTask) { - $subTask->addSelector($task->getSelector()); - if ($task->isOnce()) { - $subTask->once(); - } - $tasks[] = $subTask; - } - } - } else { - $tasks[] = $task; - } - if ($this->hooksEnabled) { - $tasks = array_merge($tasks, array_map([$this, 'doGetTasks'], $task->getAfter())); - } - return array_flatten($tasks); - } - - public function getHooksEnabled(): bool - { - return $this->hooksEnabled; - } - - public function setHooksEnabled(bool $hooksEnabled): void - { - $this->hooksEnabled = $hooksEnabled; - } -} diff --git a/src/Task/Task.php b/src/Task/Task.php deleted file mode 100644 index 0dab358ee..000000000 --- a/src/Task/Task.php +++ /dev/null @@ -1,273 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Task; - -use Deployer\Selector\Selector; - -class Task -{ - /** - * @var string - */ - private $name; - /** - * @var callable|null - */ - private $callback; - /** - * @var string - */ - private $description; - /** - * @var string - */ - private $sourceLocation = ''; - /** - * @var array - */ - private $before = []; - /** - * @var array - */ - private $after = []; - /** - * @var bool - */ - private $hidden = false; - /** - * @var bool - */ - private $once = false; - /** - * @var bool - */ - private $oncePerNode = false; - /** - * @var int|null - */ - private $limit = null; - /** - * @var array|null - */ - private $selector = null; - /** - * @var bool - */ - private $verbose = false; - /** - * @var bool - */ - private $enabled = true; - - /** - * @param callable():void $callback - */ - public function __construct(string $name, callable $callback = null) - { - $this->name = $name; - $this->callback = $callback; - } - - /** - * @param callable():void $callback - */ - public function setCallback(callable $callback): void - { - $this->callback = $callback; - } - - public function run(Context $context): void - { - Context::push($context); - - try { - call_user_func($this->callback); // call task - } finally { - if ($context->getConfig() !== null) { - $context->getConfig()->set('working_path', null); - } - - Context::pop(); - } - } - - public function getName(): string - { - return $this->name; - } - - public function __toString(): string - { - return $this->getName(); - } - - public function getDescription(): ?string - { - return $this->description; - } - - public function desc(string $description): self - { - $this->description = $description; - return $this; - } - - public function getSourceLocation(): string - { - return $this->sourceLocation; - } - - public function setSourceLocation(string $path): void - { - $this->sourceLocation = $path; - } - - public function saveSourceLocation(): void - { - if (function_exists('debug_backtrace')) { - $trace = debug_backtrace(); - $this->sourceLocation = $trace[1]['file']; - } - } - - /** - * Mark this task to run only once on one of hosts. - */ - public function once(bool $once = true): self - { - $this->once = $once; - return $this; - } - - public function isOnce(): bool - { - return $this->once; - } - - /** - * Mark task to only run once per node. - * Node is a group of hosts with same hostname or with same node label. - */ - public function oncePerNode(bool $once = true): self - { - $this->oncePerNode = $once; - return $this; - } - - public function isOncePerNode(): bool - { - return $this->oncePerNode; - } - - /** - * Mark task as hidden and not accessible from CLI. - */ - public function hidden(bool $hidden = true): self - { - $this->hidden = $hidden; - return $this; - } - - public function isHidden(): bool - { - return $this->hidden; - } - - /** - * Make $task being run before this task. - */ - public function addBefore(string $task): self - { - array_unshift($this->before, $task); - return $this; - } - - /** - * Make $task being run after this task - */ - public function addAfter(string $task): self - { - array_push($this->after, $task); - return $this; - } - - public function getBefore(): array - { - return $this->before; - } - - public function getAfter(): array - { - return $this->after; - } - - public function getLimit(): ?int - { - return $this->limit; - } - - public function limit(?int $limit): self - { - $this->limit = $limit; - return $this; - } - - public function select(string $selector): self - { - $this->selector = Selector::parse($selector); - return $this; - } - - /** - * @return array - */ - public function getSelector(): ?array - { - return $this->selector; - } - - public function addSelector(?array $newSelector): void - { - if ($newSelector !== null) { - if ($this->selector === null) { - $this->selector = $newSelector; - } else { - $this->selector = array_merge($this->selector, $newSelector); - } - } - } - - public function isVerbose(): bool - { - return $this->verbose; - } - - public function verbose(bool $verbose = true): self - { - $this->verbose = $verbose; - return $this; - } - - public function isEnabled(): bool - { - return $this->enabled; - } - - public function disable(): self - { - $this->enabled = false; - return $this; - } - - public function enable(): self - { - $this->enabled = true; - return $this; - } -} diff --git a/src/Task/TaskCollection.php b/src/Task/TaskCollection.php deleted file mode 100644 index eb3c3e0b0..000000000 --- a/src/Task/TaskCollection.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Task; - -use Deployer\Collection\Collection; - -/** - * @method Task get($name) - * @method Task[] getIterator() - */ -class TaskCollection extends Collection -{ - protected function throwNotFound(string $name): void - { - throw new \InvalidArgumentException("Task `$name` not found."); - } - - public function add(Task $task): void - { - $this->set($task->getName(), $task); - } -} diff --git a/src/Utility/Httpie.php b/src/Utility/Httpie.php deleted file mode 100644 index 3549e5558..000000000 --- a/src/Utility/Httpie.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Utility; - -use Deployer\Exception\HttpieException; - -class Httpie -{ - /** - * @var string - */ - private $method = 'GET'; - /** - * @var string - */ - private $url = ''; - /** - * @var array - */ - private $headers = []; - /** - * @var string - */ - private $body = ''; - /** - * @var array - */ - private $curlopts = []; - /** - * @var bool - */ - private $nothrow = false; - - public function __construct() - { - if (!extension_loaded('curl')) { - throw new \Exception( - "Please, install curl extension.\n" . - "https://goo.gl/yTAeZh" - ); - } - } - - public static function get(string $url): Httpie - { - $http = new self; - $http->method = 'GET'; - $http->url = $url; - return $http; - } - - public static function post(string $url): Httpie - { - $http = new self; - $http->method = 'POST'; - $http->url = $url; - return $http; - } - - public static function patch(string $url): Httpie - { - $http = new self; - $http->method = 'PATCH'; - $http->url = $url; - return $http; - } - - public function query(array $params): Httpie - { - $http = clone $this; - $http->url .= '?' . http_build_query($params); - return $http; - } - - public function header(string $header, string $value): Httpie - { - $http = clone $this; - $http->headers[$header] = $value; - return $http; - } - - public function body(string $body): Httpie - { - $http = clone $this; - $http->body = $body; - $http->headers = array_merge($http->headers, [ - 'Content-Type' => 'application/json', - 'Content-Length' => strlen($http->body), - ]); - return $http; - } - - public function jsonBody(array $data): Httpie - { - $http = clone $this; - $http->body = json_encode($data, JSON_PRETTY_PRINT); - $http->headers = array_merge($http->headers, [ - 'Content-Type' => 'application/json', - 'Content-Length' => strlen($http->body), - ]); - return $http; - } - - public function formBody(array $data): Httpie - { - $http = clone $this; - $http->body = http_build_query($data); - $http->headers = array_merge($this->headers, [ - 'Content-type' => 'application/x-www-form-urlencoded', - 'Content-Length' => strlen($http->body), - ]); - return $http; - } - - /** - * @param mixed $value - */ - public function setopt(int $key, $value): Httpie - { - $http = clone $this; - $http->curlopts[$key] = $value; - return $http; - } - - public function nothrow(bool $on = true): Httpie - { - $http = clone $this; - $http->nothrow = $on; - return $http; - } - - public function send(?array &$info = null): string - { - $ch = curl_init($this->url); - curl_setopt($ch, CURLOPT_USERAGENT, 'Deployer ' . DEPLOYER_VERSION); - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $this->method); - $headers = []; - foreach ($this->headers as $key => $value) { - $headers[] = "$key: $value"; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); - curl_setopt($ch, CURLOPT_POSTFIELDS, $this->body); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); - curl_setopt($ch, CURLOPT_MAXREDIRS, 10); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($ch, CURLOPT_TIMEOUT, 5); - foreach ($this->curlopts as $key => $value) { - curl_setopt($ch, $key, $value); - } - $result = curl_exec($ch); - $info = curl_getinfo($ch); - if ($result === false) { - if ($this->nothrow) { - $result = ''; - } else { - $error = curl_error($ch); - $errno = curl_errno($ch); - curl_close($ch); - throw new HttpieException($error, $errno); - } - } - curl_close($ch); - return $result; - } - - /** - * @return mixed - */ - public function getJson() - { - $result = $this->send(); - $response = json_decode($result, true); - if (json_last_error() !== JSON_ERROR_NONE) { - throw new HttpieException('JSON Error: ' . json_last_error_msg()); - } - return $response; - } -} diff --git a/src/Utility/Rsync.php b/src/Utility/Rsync.php deleted file mode 100644 index 0e17dda5b..000000000 --- a/src/Utility/Rsync.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer\Utility; - -use Deployer\Component\ProcessRunner\Printer; -use Deployer\Component\Ssh\Client; -use Deployer\Exception\RunException; -use Deployer\Host\Host; -use Symfony\Component\Console\Helper\ProgressBar; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Process\Exception\ProcessFailedException; -use Symfony\Component\Process\Process; -use function Deployer\writeln; - -class Rsync -{ - /** - * @var Printer - */ - private $pop; - /** - * @var OutputInterface - */ - private $output; - - public function __construct(Printer $pop, OutputInterface $output) - { - $this->pop = $pop; - $this->output = $output; - } - - /** - * Start rsync process. - * - * @param string|string[] $source - * @phpstan-param array{flags?: string, options?: array, timeout?: int|null, progress_bar?: bool, display_stats?: bool} $config - * @throws RunException - */ - public function call(Host $host, $source, string $destination, array $config = []): void - { - $defaults = [ - 'timeout' => null, - 'options' => [], - 'flags' => '-azP', - 'progress_bar' => true, - 'display_stats' => false - ]; - $config = array_merge($defaults, $config); - - $options = $config['options'] ?? []; - $flags = $config['flags']; - $displayStats = $config['display_stats'] || in_array('--stats', $options, true); - - if ($displayStats && !in_array('--stats', $options, true)) { - $options[] = '--stats'; - } - - $connectionOptions = $host->connectionOptionsString(); - if ($connectionOptions !== '') { - $options = array_merge($options, ['-e', "ssh $connectionOptions"]); - } - if ($host->has("become")) { - $options = array_merge($options, ['--rsync-path', "sudo -H -u {$host->get('become')} rsync"]); - } - if (!is_array($source)) { - $source = [$source]; - } - $command = array_merge(['rsync', $flags], $options, $source, [$destination]); - - $commandString = $command[0]; - for ($i = 1; $i < count($command); $i++) { - $commandString .= ' ' . escapeshellarg($command[$i]); - } - if ($this->output->isVerbose()) { - $this->output->writeln("[$host] $commandString"); - } - - $progressBar = null; - if ($this->output->getVerbosity() === OutputInterface::VERBOSITY_NORMAL && $config['progress_bar']) { - $progressBar = new ProgressBar($this->output); - $progressBar->setBarCharacter(''); - $progressBar->setProgressCharacter('>'); - $progressBar->setEmptyBarCharacter('-'); - } - - $fullOutput = ''; - - $callback = function ($type, $buffer) use ($host, $progressBar, &$fullOutput) { - $fullOutput .= $buffer; - if ($progressBar) { - foreach (explode("\n", $buffer) as $line) { - if (preg_match('/(to-chk|to-check)=(\d+?)\/(\d+)/', $line, $match)) { - $max = intval($match[3]); - $step = $max - intval($match[2]); - $progressBar->setMaxSteps($max); - $progressBar->setFormat("[$host] %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%"); - $progressBar->setProgress($step); - } - } - return; - } - if ($this->output->isVerbose()) { - $this->pop->printBuffer($type, $host, $buffer); - } - }; - - $process = new Process($command); - $process->setTimeout($config['timeout']); - try { - $process->mustRun($callback); - - if ($displayStats) { - $stats = []; - - $statsStarted = false; - foreach (explode("\n", $fullOutput) as $line) { - if (strpos($line, 'Number of files') === 0) { - $statsStarted = true; - } - - if ($statsStarted) { - if (empty($line)) { - break; - } - $stats[] = $line; - } - } - - writeln("Rsync operation stats\n" . '' . implode("\n", $stats) . ''); - } - - } catch (ProcessFailedException $exception) { - throw new RunException( - $host, - $commandString, - $process->getExitCode(), - $process->getOutput(), - $process->getErrorOutput() - ); - } finally { - if ($progressBar) { - $progressBar->clear(); - } - } - } -} diff --git a/src/functions.php b/src/functions.php deleted file mode 100644 index 03fd7794a..000000000 --- a/src/functions.php +++ /dev/null @@ -1,951 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Deployer; - -use Deployer\Exception\Exception; -use Deployer\Exception\GracefulShutdownException; -use Deployer\Exception\RunException; -use Deployer\Exception\TimeoutException; -use Deployer\Exception\WillAskUser; -use Deployer\Host\Host; -use Deployer\Host\Localhost; -use Deployer\Host\Range; -use Deployer\Importer\Importer; -use Deployer\Support\ObjectProxy; -use Deployer\Task\Context; -use Deployer\Task\GroupTask; -use Deployer\Task\Task; -use Deployer\Utility\Httpie; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Question\ChoiceQuestion; -use Symfony\Component\Console\Question\ConfirmationQuestion; -use Symfony\Component\Console\Question\Question; -use function Deployer\Support\array_merge_alternate; -use function Deployer\Support\env_stringify; -use function Deployer\Support\is_closure; -use function Deployer\Support\str_contains; - -/** - * Defines a host or hosts. - * ```php - * host('example.org'); - * host('prod.example.org', 'staging.example.org'); - * ``` - * - * Inside task can be used to get `Host` instance of an alias. - * ```php - * task('test', function () { - * $port = host('example.org')->get('port'); - * }); - * ``` - * - * @return Host|ObjectProxy - */ -function host(string ...$hostname) -{ - $deployer = Deployer::get(); - if (count($hostname) === 1 && $deployer->hosts->has($hostname[0])) { - return $deployer->hosts->get($hostname[0]); - } - $aliases = Range::expand($hostname); - - foreach ($aliases as $alias) { - if ($deployer->hosts->has($alias)) { - $host = $deployer->hosts->get($alias); - throw new \InvalidArgumentException("Host \"$host\" already exists."); - } - } - - if (count($aliases) === 1) { - $host = new Host($aliases[0]); - $deployer->hosts->set($aliases[0], $host); - return $host; - } else { - $hosts = array_map(function ($hostname) use ($deployer): Host { - $host = new Host($hostname); - $deployer->hosts->set($hostname, $host); - return $host; - }, $aliases); - return new ObjectProxy($hosts); - } -} - -/** - * @return Localhost|ObjectProxy - */ -function localhost(string ...$hostnames) -{ - $deployer = Deployer::get(); - $hostnames = Range::expand($hostnames); - - if (count($hostnames) <= 1) { - $host = count($hostnames) === 1 ? new Localhost($hostnames[0]) : new Localhost(); - $deployer->hosts->set($host->getAlias(), $host); - return $host; - } else { - $hosts = array_map(function ($hostname) use ($deployer): Localhost { - $host = new Localhost($hostname); - $deployer->hosts->set($host->getAlias(), $host); - return $host; - }, $hostnames); - return new ObjectProxy($hosts); - } -} - -/** - * Returns current host. - */ -function currentHost(): Host -{ - return Context::get()->getHost(); -} - -/** - * Returns hosts based on provided selector. - * - * ```php - * on(select('stage=prod, role=db'), function (Host $host) { - * ... - * }); - * ``` - * - * @return Host[] - */ -function select(string $selector): array -{ - return Deployer::get()->selector->select($selector); -} - -/** - * Returns array of hosts selected by user via CLI. - * - * @return Host[] - */ -function selectedHosts(): array -{ - $hosts = []; - foreach (get('selected_hosts', []) as $alias) { - $hosts[] = Deployer::get()->hosts->get($alias); - } - return $hosts; -} - -/** - * Import other php or yaml recipes. - * - * ```php - * import('recipe/common.php'); - * ``` - * - * ```php - * import(__DIR__ . '/config/hosts.yaml'); - * ``` - * - * @throws Exception - */ -function import(string $file): void -{ - Importer::import($file); -} - -/** - * Set task description. - */ -function desc(?string $title = null): ?string -{ - static $store = null; - - if ($title === null) { - return $store; - } else { - return $store = $title; - } -} - -/** - * Define a new task and save to tasks list. - * - * Alternatively get a defined task. - * - * @param string $name Name of current task. - * @param callable():void|array|null $body Callable task, array of other tasks names or nothing to get a defined tasks - */ -function task(string $name, $body = null): Task -{ - $deployer = Deployer::get(); - - if (empty($body)) { - return $deployer->tasks->get($name); - } - - if (is_callable($body)) { - $task = new Task($name, $body); - } elseif (is_array($body)) { - $task = new GroupTask($name, $body); - } else { - throw new \InvalidArgumentException('Task body should be a function or an array.'); - } - - if ($deployer->tasks->has($name)) { - // If task already exists, try to replace. - $existingTask = $deployer->tasks->get($name); - if (get_class($existingTask) !== get_class($task)) { - // There is no "up" or "down"casting in PHP. - throw new \Exception('Tried to replace Task \'' . $name . '\' with a GroupTask or vice-versa. This is not supported. If you are sure you want to do that, remove the old task `Deployer::get()->tasks->remove()` and then re-add the task.'); - } - if ($existingTask instanceof GroupTask) { - $existingTask->setGroup($body); - } elseif ($existingTask instanceof Task) { - $existingTask->setCallback($body); - } - $task = $existingTask; - } else { - // If task does not exist, add it to the Collection. - $deployer->tasks->set($name, $task); - } - - $task->saveSourceLocation(); - - if (!empty(desc())) { - $task->desc(desc()); - desc(''); // Clear title. - } - - return $task; -} - -/** - * Call that task before specified task runs. - * - * @param string $task The task before $that should be run. - * @param string|callable():void $do The task to be run. - * - * @return Task|null - */ -function before(string $task, $do) -{ - if (is_closure($do)) { - $newTask = task("before:$task", $do); - before($task, "before:$task"); - return $newTask; - } - task($task)->addBefore($do); - - return null; -} - -/** - * Call that task after specified task runs. - * - * @param string $task The task after $that should be run. - * @param string|callable():void $do The task to be run. - * - * @return Task|null - */ -function after(string $task, $do) -{ - if (is_closure($do)) { - $newTask = task("after:$task", $do); - after($task, "after:$task"); - return $newTask; - } - task($task)->addAfter($do); - - return null; -} - -/** - * Setup which task run on failure of $task. - * When called multiple times for a task, previous fail() definitions will be overridden. - * - * @param string $task The task which need to fail so $that should be run. - * @param string|callable():void $do The task to be run. - * - * @return Task|null - */ -function fail(string $task, $do) -{ - if (is_callable($do)) { - $newTask = task("fail:$task", $do); - fail($task, "fail:$task"); - return $newTask; - } - $deployer = Deployer::get(); - $deployer->fail->set($task, $do); - - return null; -} - -/** - * Add users options. - * - * @param string $name The option name - * @param string|array|null $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param int|null $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param string|string[]|int|bool|null $default The default value (must be null for self::VALUE_NONE) - */ -function option(string $name, $shortcut = null, ?int $mode = null, string $description = '', $default = null): void -{ - Deployer::get()->inputDefinition->addOption( - new InputOption($name, $shortcut, $mode, $description, $default) - ); -} - -/** - * Change the current working directory. - */ -function cd(string $path): void -{ - set('working_path', parse($path)); -} - -/** - * Execute a callback within a specific directory and revert back to the initial working directory. - * - * @return mixed|null Return value of the $callback function or null if callback doesn't return anything - */ -function within(string $path, callable $callback) -{ - $lastWorkingPath = get('working_path', ''); - try { - set('working_path', parse($path)); - return $callback(); - } finally { - set('working_path', $lastWorkingPath); - } - - return null; -} - -/** - * Executes given command on remote host. - * - * Examples: - * - * ```php - * run('echo hello world'); - * run('cd {{deploy_path}} && git status'); - * run('password %secret%', secret: getenv('CI_SECRET')); - * run('curl medv.io', timeout: 5); - * ``` - * - * ```php - * $path = run('readlink {{deploy_path}}/current'); - * run("echo $path"); - * ``` - * - * @param string $command Command to run on remote host. - * @param array|null $options Array of options will override passed named arguments. - * @param int|null $timeout Sets the process timeout (max. runtime). The timeout in seconds (default: 300 sec; see {{default_timeout}}, `null` to disable). - * @param int|null $idle_timeout Sets the process idle timeout (max. time since last output) in seconds. - * @param string|null $secret Placeholder `%secret%` can be used in command. Placeholder will be replaced with this value and will not appear in any logs. - * @param array|null $env Array of environment variables: `run('echo $KEY', env: ['key' => 'value']);` - * @param bool|null $real_time_output Print command output in real-time. - * @param bool|null $no_throw Don't throw an exception of non-zero exit code. - * - * @throws Exception|RunException|TimeoutException - */ -function run(string $command, ?array $options = [], ?int $timeout = null, ?int $idle_timeout = null, ?string $secret = null, ?array $env = null, ?bool $real_time_output = false, ?bool $no_throw = false): string -{ - $namedArguments = []; - foreach (['timeout', 'idle_timeout', 'secret', 'env', 'real_time_output', 'no_throw'] as $arg) { - if ($$arg !== null) { - $namedArguments[$arg] = $$arg; - } - } - $options = array_merge($namedArguments, $options); - $run = function ($command, $options = []): string { - $host = currentHost(); - - $command = parse($command); - $workingPath = get('working_path', ''); - - if (!empty($workingPath)) { - $command = "cd $workingPath && ($command)"; - } - - $env = array_merge_alternate(get('env', []), $options['env'] ?? []); - if (!empty($env)) { - $env = env_stringify($env); - $command = "export $env; $command"; - } - - $dotenv = get('dotenv', false); - if (!empty($dotenv)) { - $command = ". $dotenv; $command"; - } - - if ($host instanceof Localhost) { - $process = Deployer::get()->processRunner; - $output = $process->run($host, $command, $options); - } else { - $client = Deployer::get()->sshClient; - $output = $client->run($host, $command, $options); - } - - return rtrim($output); - }; - - if (preg_match('/^sudo\b/', $command)) { - try { - return $run($command, $options); - } catch (RunException $exception) { - $askpass = get('sudo_askpass', '/tmp/dep_sudo_pass'); - $password = get('sudo_pass', false); - if ($password === false) { - writeln("run $command"); - $password = askHiddenResponse(" [sudo] password for {{remote_user}}: "); - } - $run("echo -e '#!/bin/sh\necho \"\$PASSWORD\"' > $askpass"); - $run("chmod a+x $askpass"); - $command = preg_replace('/^sudo\b/', 'sudo -A', $command); - $output = $run(" SUDO_ASKPASS=$askpass PASSWORD=%sudo_pass% $command", array_merge($options, ['sudo_pass' => escapeshellarg($password)])); - $run("rm $askpass"); - return $output; - } - } else { - return $run($command, $options); - } -} - - -/** - * Execute commands on a local machine. - * - * Examples: - * - * ```php - * $user = runLocally('git config user.name'); - * runLocally("echo $user"); - * ``` - * - * @param string $command Command to run on localhost. - * @param array|null $options Array of options will override passed named arguments. - * @param int|null $timeout Sets the process timeout (max. runtime). The timeout in seconds (default: 300 sec, `null` to disable). - * @param int|null $idle_timeout Sets the process idle timeout (max. time since last output) in seconds. - * @param string|null $secret Placeholder `%secret%` can be used in command. Placeholder will be replaced with this value and will not appear in any logs. - * @param array|null $env Array of environment variables: `runLocally('echo $KEY', env: ['key' => 'value']);` - * @param string|null $shell Shell to run in. Default is `bash -s`. - * - * @throws RunException - */ -function runLocally(string $command, ?array $options = [], ?int $timeout = null, ?int $idle_timeout = null, ?string $secret = null, ?array $env = null, ?string $shell = null): string -{ - $namedArguments = []; - foreach (['timeout', 'idle_timeout', 'secret', 'env', 'shell'] as $arg) { - if ($$arg !== null) { - $namedArguments[$arg] = $$arg; - } - } - $options = array_merge($namedArguments, $options); - - $process = Deployer::get()->processRunner; - $command = parse($command); - - $env = array_merge_alternate(get('env', []), $options['env'] ?? []); - if (!empty($env)) { - $env = env_stringify($env); - $command = "export $env; $command"; - } - - $output = $process->run(new Localhost(), $command, $options); - - return rtrim($output); -} - -/** - * Run test command. - * Example: - * - * ```php - * if (test('[ -d {{release_path}} ]')) { - * ... - * } - * ``` - * - */ -function test(string $command): bool -{ - $true = '+' . array_rand(array_flip(['accurate', 'appropriate', 'correct', 'legitimate', 'precise', 'right', 'true', 'yes', 'indeed'])); - return run("if $command; then echo $true; fi") === $true; -} - -/** - * Run test command locally. - * Example: - * - * testLocally('[ -d {{local_release_path}} ]') - * - */ -function testLocally(string $command): bool -{ - return runLocally("if $command; then echo +true; fi") === '+true'; -} - -/** - * Iterate other hosts, allowing to call run a func in callback. - * - * ```php - * on(select('stage=prod, role=db'), function ($host) { - * ... - * }); - * ``` - * - * ```php - * on(host('example.org'), function ($host) { - * ... - * }); - * ``` - * - * ```php - * on(Deployer::get()->hosts, function ($host) { - * ... - * }); - * ``` - * - * @param Host|Host[] $hosts - */ -function on($hosts, callable $callback): void -{ - if (!is_array($hosts) && !($hosts instanceof \Traversable)) { - $hosts = [$hosts]; - } - - foreach ($hosts as $host) { - if ($host instanceof Host) { - $host->config()->load(); - Context::push(new Context($host)); - try { - $callback($host); - $host->config()->save(); - } catch (GracefulShutdownException $e) { - Deployer::get()->messenger->renderException($e, $host); - } finally { - Context::pop(); - } - } else { - throw new \InvalidArgumentException("Function on can iterate only on Host instances."); - } - } -} - -/** - * Runs a task. - * ```php - * invoke('deploy:symlink'); - * ``` - * - * @throws Exception - */ -function invoke(string $taskName): void -{ - $task = Deployer::get()->tasks->get($taskName); - Deployer::get()->messenger->startTask($task); - $task->run(Context::get()); - Deployer::get()->messenger->endTask($task); -} - -/** - * Upload file or directory to host. - * - * > You may have noticed that there is a trailing slash (/) at the end of the first argument in the above command, this is necessary to mean “the contents of build“. - * > - * > The alternative, without the trailing slash, would place build, including the directory, within public. This would create a hierarchy that looks like: {{release_path}}/public/build - * - * The `$config` array supports the following keys: - * - * - `flags` for overriding the default `-azP` passed to the `rsync` command - * - `options` with additional flags passed directly to the `rsync` command - * - `timeout` for `Process::fromShellCommandline()` (`null` by default) - * - `progress_bar` to display upload/download progress - * - `display_stats' to display rsync set of statistics - * - * @param string|string[] $source - * @param array $config - * @phpstan-param array{flags?: string, options?: array, timeout?: int|null, progress_bar?: bool, display_stats?: bool} $config - * - * @throws RunException - */ -function upload($source, string $destination, array $config = []): void -{ - $rsync = Deployer::get()->rsync; - $host = currentHost(); - $source = is_array($source) ? array_map('Deployer\parse', $source) : parse($source); - $destination = parse($destination); - - if ($host instanceof Localhost) { - $rsync->call($host, $source, $destination, $config); - } else { - $rsync->call($host, $source, "{$host->connectionString()}:$destination", $config); - } -} - -/** - * Download file or directory from host - * - * @param array $config - * - * @throws RunException - */ -function download(string $source, string $destination, array $config = []): void -{ - $rsync = Deployer::get()->rsync; - $host = currentHost(); - $source = parse($source); - $destination = parse($destination); - - if ($host instanceof Localhost) { - $rsync->call($host, $source, $destination, $config); - } else { - $rsync->call($host, "{$host->connectionString()}:$source", $destination, $config); - } -} - -/** - * Writes an info message. - */ -function info(string $message): void -{ - writeln("info " . parse($message)); -} - -/** - * Writes an warning message. - */ -function warning(string $message): void -{ - $message = "warning $message"; - - if (Context::has()) { - writeln($message); - } else { - Deployer::get()->output->writeln($message); - } -} - -/** - * Writes a message to the output and adds a newline at the end. - */ -function writeln(string $message, int $options = 0): void -{ - $host = currentHost(); - output()->writeln("[$host] " . parse($message), $options); -} - -/** - * Parse set values. - */ -function parse(string $value): string -{ - return Context::get()->getConfig()->parse($value); -} - -/** - * Setup configuration option. - * @param mixed $value - * @throws Exception - */ -function set(string $name, $value): void -{ - if (!Context::has()) { - Deployer::get()->config->set($name, $value); - } else { - Context::get()->getConfig()->set($name, $value); - } -} - -/** - * Merge new config params to existing config array. - * - * @param array $array - */ -function add(string $name, array $array): void -{ - if (!Context::has()) { - Deployer::get()->config->add($name, $array); - } else { - Context::get()->getConfig()->add($name, $array); - } -} - -/** - * Get configuration value. - * - * @param mixed|null $default - * - * @return mixed - */ -function get(string $name, $default = null) -{ - if (!Context::has()) { - return Deployer::get()->config->get($name, $default); - } else { - return Context::get()->getConfig()->get($name, $default); - } -} - -/** - * Check if there is such configuration option. - */ -function has(string $name): bool -{ - if (!Context::has()) { - return Deployer::get()->config->has($name); - } else { - return Context::get()->getConfig()->has($name); - } -} - -function ask(string $message, ?string $default = null, ?array $autocomplete = null): ?string -{ - if (defined('DEPLOYER_NO_ASK')) { - throw new WillAskUser($message); - } - Context::required(__FUNCTION__); - - if (output()->isQuiet()) { - return $default; - } - - if (Deployer::isWorker()) { - return Deployer::proxyCallToMaster(currentHost(), __FUNCTION__, ...func_get_args()); - } - - /** @var QuestionHelper */ - $helper = Deployer::get()->getHelper('question'); - - $tag = currentHost()->getTag(); - $message = parse($message); - $message = "[$tag] $message " . (($default === null) ? "" : "(default: $default) "); - - $question = new Question($message, $default); - if (!empty($autocomplete)) { - $question->setAutocompleterValues($autocomplete); - } - - return $helper->ask(input(), output(), $question); -} - -/** - * @param mixed $default - * @return mixed - * @throws Exception - */ -function askChoice(string $message, array $availableChoices, $default = null, bool $multiselect = false) -{ - if (defined('DEPLOYER_NO_ASK')) { - throw new WillAskUser($message); - } - Context::required(__FUNCTION__); - - if (empty($availableChoices)) { - throw new \InvalidArgumentException('Available choices should not be empty'); - } - - if ($default !== null && !array_key_exists($default, $availableChoices)) { - throw new \InvalidArgumentException('Default choice is not available'); - } - - if (output()->isQuiet()) { - if ($default === null) { - $default = key($availableChoices); - } - return [$default => $availableChoices[$default]]; - } - - if (Deployer::isWorker()) { - return Deployer::proxyCallToMaster(currentHost(), __FUNCTION__, ...func_get_args()); - } - - /** @var QuestionHelper */ - $helper = Deployer::get()->getHelper('question'); - - $tag = currentHost()->getTag(); - $message = parse($message); - $message = "[$tag] $message " . (($default === null) ? "" : "(default: $default) "); - - $question = new ChoiceQuestion($message, $availableChoices, $default); - $question->setMultiselect($multiselect); - - return $helper->ask(input(), output(), $question); -} - -function askConfirmation(string $message, bool $default = false): bool -{ - if (defined('DEPLOYER_NO_ASK')) { - throw new WillAskUser($message); - } - Context::required(__FUNCTION__); - - if (output()->isQuiet()) { - return $default; - } - - if (Deployer::isWorker()) { - return Deployer::proxyCallToMaster(currentHost(), __FUNCTION__, ...func_get_args()); - } - - /** @var QuestionHelper */ - $helper = Deployer::get()->getHelper('question'); - - $yesOrNo = $default ? 'Y/n' : 'y/N'; - $tag = currentHost()->getTag(); - $message = parse($message); - $message = "[$tag] $message [$yesOrNo] "; - - $question = new ConfirmationQuestion($message, $default); - - return $helper->ask(input(), output(), $question); -} - -function askHiddenResponse(string $message): string -{ - if (defined('DEPLOYER_NO_ASK')) { - throw new WillAskUser($message); - } - Context::required(__FUNCTION__); - - if (output()->isQuiet()) { - return ''; - } - - if (Deployer::isWorker()) { - return (string)Deployer::proxyCallToMaster(currentHost(), __FUNCTION__, ...func_get_args()); - } - - /** @var QuestionHelper */ - $helper = Deployer::get()->getHelper('question'); - - $tag = currentHost()->getTag(); - $message = parse($message); - $message = "[$tag] $message "; - - $question = new Question($message); - $question->setHidden(true); - $question->setHiddenFallback(false); - - return (string)$helper->ask(input(), output(), $question); -} - -function input(): InputInterface -{ - return Deployer::get()->input; -} - -function output(): OutputInterface -{ - return Deployer::get()->output; -} - -/** - * Check if command exists - * - * @throws RunException - */ -function commandExist(string $command): bool -{ - return test("hash $command 2>/dev/null"); -} - -/** - * @throws RunException - */ -function commandSupportsOption(string $command, string $option): bool -{ - $man = run("(man $command 2>&1 || $command -h 2>&1 || $command --help 2>&1) | grep -- $option || true"); - if (empty($man)) { - return false; - } - return str_contains($man, $option); -} - -/** - * @throws RunException - */ -function which(string $name): string -{ - $nameEscaped = escapeshellarg($name); - - // Try `command`, should cover all Bourne-like shells - // Try `which`, should cover most other cases - // Fallback to `type` command, if the rest fails - $path = run("command -v $nameEscaped || which $nameEscaped || type -p $nameEscaped"); - if (empty($path)) { - throw new \RuntimeException("Can't locate [$nameEscaped] - neither of [command|which|type] commands are available"); - } - - // Deal with issue when `type -p` outputs something like `type -ap` in some implementations - return trim(str_replace("$name is", "", $path)); - -} - -/** - * Returns remote environments variables as an array. - * ```php - * $remotePath = remoteEnv()['PATH']; - * run('echo $PATH', env: ['PATH' => "/home/user/bin:$remotePath"]); - * ``` - */ -function remoteEnv(): array -{ - $vars = []; - $data = run('env'); - foreach (explode("\n", $data) as $line) { - list($name, $value) = explode('=', $line, 2); - $vars[$name] = $value; - } - return $vars; -} - -/** - * Creates a new exception. - */ -function error(string $message): Exception -{ - return new Exception(parse($message)); -} - -/** - * Returns current timestamp in UTC timezone in ISO8601 format. - */ -function timestamp(): string -{ - return (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTime::ISO8601); -} - -/** - * Example usage: - * ```php - * $result = fetch('{{domain}}', info: $info); - * var_dump($info['http_code'], $result); - * ``` - */ -function fetch(string $url, string $method = 'get', array $headers = [], ?string $body = null, ?array &$info = null, bool $nothrow = false): string -{ - $url = parse($url); - if (strtolower($method) === 'get') { - $http = Httpie::get($url); - } elseif (strtolower($method) === 'post') { - $http = Httpie::post($url); - } else { - throw new \InvalidArgumentException("Unknown method \"$method\"."); - } - $http = $http->nothrow($nothrow); - foreach ($headers as $key => $value) { - $http = $http->header($key, $value); - } - if ($body !== null) { - $http = $http->body($body); - } - return $http->send($info); -} diff --git a/src/schema.json b/src/schema.json deleted file mode 100644 index 6e2ba78f6..000000000 --- a/src/schema.json +++ /dev/null @@ -1,130 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://deployer.org/schema.json#", - "type": "object", - "additionalProperties": false, - "properties": { - "version": { - "type": "string" - }, - "import": { - "oneOf": [ - { - "type": "string" - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - }, - "config": { - "type": "object" - }, - "hosts": { - "type": "object", - "patternProperties": { - "^": { - "oneOf": [ - { - "type": "object", - "properties": { - "local": { - "type": "boolean" - } - } - }, - { - "type": "null" - } - ] - } - } - }, - "tasks": { - "type": "object", - "patternProperties": { - "^": { - "oneOf": [ - { - "type": "array", - "items": { - "type": "object", - "properties": { - "cd": { - "type": "string" - }, - "run": { - "type": "string" - }, - "run_locally": { - "type": "string" - }, - "upload": { - "type": "object", - "required": [ - "src", - "dest" - ], - "properties": { - "src": { - "type": "string" - }, - "dest": { - "type": "string" - } - } - }, - "download": { - "type": "object", - "required": [ - "src", - "dest" - ], - "properties": { - "src": { - "type": "string" - }, - "dest": { - "type": "string" - } - } - }, - "desc": { - "type": "string" - }, - "once": { - "type": "boolean" - }, - "hidden": { - "type": "boolean" - }, - "limit": { - "type": "number" - }, - "select": { - "type": "string" - } - } - } - }, - { - "type": "array", - "items": { - "type": "string" - } - } - ] - } - } - }, - "before": { - "type": "object" - }, - "after": { - "type": "object" - } - } -}

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%0Djv6aLJBezM zo|`yFY-FlgU^zmT%Nd^#TH`rPFk(fb535!5`9{IatjcePq{U>#s+WWwM7d0@Kj)t= zNmm)Q0-t`)f`x)>N{5&(t1!G;n5MijP*$+9o3r`PR|&F9f|bK(tk5w5vMv)3JT@k? zEUW-qpqvuj%2@2crO=p1#FY_HG{{mmPOv@WJ$pb8`KB>6+}kEBx!`3IJ5$OkSsIo$ z8%HP(K0^}Fd4WV7D^rZAps3D7Xtcw_1F?V{C_?Sq5I)p?x;~Q< zL8Td39c66h;Su;|9FC8VUGcz?G0(QCy1kROJ}TXgML#&Im%RWc#Ohu>V=gAXYwoB| z$`&8f*wX5if9;noCG+gU^BEU0=3Gx?_)-lX^a5sWuRy8`QRPfuzMSdhTo1w4B2rh9 zI7@p08B@B*NwW~bxVR8 zZ;=bwx~uIz;CI@rRHL;=$J@6sBcSg3Q(&p>aPx>s|4>nq} zTwON(aEWhKCMxbYopY#+);FwByOzgNCavB)&@9^BdwZiUwdvdsMM=pN^C|jE_17ZZ zhw_9#nnp{-H`s<=<*Z+x2VmQr)cW?JtsYNfrke7w3x`QPbXsf3ZH^s=!8NsEBB_@O z!+BG>hS-%Am%Rf-t8u!uYwqFnbh+7eD%>i!V-@hjz5XAOv=?Lwh7c+Kr(h4Ed|XBK z>$th`t|DhU?W+;nNXdLI4->Di?ovTdZCA&XO}hEhy6(sA3a9o}aDZv;gQ-n;b3ABl z_vjXt;v0EIiWlm;`rW)bbn4-uBe~TTeeu>Qs)etcE2%P#uj^ht=as5iv?&6oosmTW z9u9Q5R+#@nkL#h^st)%m+I1sdlU}AP)#T`5PWP?ozfYF_)Ni!+uF*bLcHS0J@Z-mT zSSRB{u3xB-W#$S6w0uNip*E*rEXQL^655Ikv$(k~5t?y&-7AD*5keT#>(t`qYoYP1 z@_um-vI33L$c-^v<6+$x03^$C`j9dm#{SOppSO2Ud-uO@znGMkt8DGsFb+Eb_?5&) zDzdyh@vHlffwOQqX{h5~llX; zLn$H7F&C|Nb|or}gfts>Y5U(hl6P(DkctJZ=IgyTGn=o`#HLx_HE;(n#%AcPLy$YF z#1ML5gK(I9A7~Pr{-Fk3NpOk3(YNrZT8jivfswSu1e?BEw)vE^(!qb3;~zt+<@(V% z&>>FA4u(Nd2hM7wEWp%<m;Hf^d}_(foPH}~y^{QlJSKXt`W>NE1J8_plkD(+(T6j-!2W6e z0?k@&bK5o&{;pqvbdr*6E#*GTu@g_~w3$hLIXmgyjI8lcBqZ@l5h_6@@tpJDZvg@% zUP;P!+A1F+6N`O)b{7lk#moJ6KbbuLVS;`@AGR4q>nz6z{@=%Cg~%FJTa2!5cWYAI z!n5S}c!Os^%;>`;LT}<#h70tbRJceoT%s3i{^S*H_RJEpI~DYANXgl)>pVvZ+25Ag zW?P}SNKu|8xS$}oSd(%WR~ade&_2g8Jo}X4&wSszx3AAHuFe@Nu4T22EA%<0D9vb9 zW~;iwDf*mMTUY@LD5=W?gP@da{CqMg;vJ@7L~GIYYqHyu0v8p0D=5kF_1j`!SI3h{ zP5Y?Mza)6iv;_K3ah|1T<)+>NMZ0i3n!`J?$r5EBM1#BQ3~^n4!t1Qa*b*x7zQh!` zP!uDId3?BZFmktR{8(TV3tcF8E#Yjb4BAHu5uA%Z*ym~52{=Io_}UN~E+i@Yv;@-P zFko&Cj`XMV`Q`b)KEAy?|0z0hZvQ7&D-70zz}{dj88px5^WVjHdR_QDfv+ z%cLs|SY{PK5g1kHsU8FE( zpKJ|uY@zkB3`XO6lU|j(Sb}7}`BHs9G|Kg;gGL8n6HCix5iI5-Dg5?l0Iuivj^yqsa?1f0Ptd$BN`G-Z}DhRCl zLT7Z+YQ@Dz7^i7Z#Oz?4r73F>10MXdgQ8jSa#U1URxyvDCnqNgt(i<+rYaqhb{m|@ zXSuf99r=^V?eJICwj`e^(mOu-_ZG97n~<^u@3ifkox(QRCtQqmSExI?)6?Oui~{&W z6V8iv&-8SIs|#rCVYG})$8a-vE7vUvDKw~}T89CLfY5`V$k-VHefNxhhvFQfklrHv z1x{^r27TWpG*XUN9@lH+BRO;t-r{$GgE)@*bYxo(wHm_SDOE`=PEjW&HS~tHvu_ zUCp?^==bY3E=6rNcJ;Z$Rb3Xm;_HQCb=#yToTcIGo=|><@zi}bX%(Bhj1?HZ>x0$J zB{Rv%WK?oR^i3v>sFc3xs;QYRE_siFxLY)0)9Kzr+t2a@ec-9h zm2`{c*es!;=@^L?%fJD!faXQLTR{ggRrl(g6{EA6S7V>9g9itQ==J+w-ru~v_;B;< z*?%B@*9m86h4wHr+eZ56_Fk%8Xdp(8j^#L_iai`%FGMD?G-By^x6Vmi-SM?M=FQWw zdcpu6*SP~mPn+cN&eZ0-)puSOyoNg@e=bxC-DOs~u3K!gEVUgu?rNJ?#t zNXp0KBWa#6;p<~Wa_HnF^&AsQmx_aZp57K@Pcv^%SKQN6xUK}3kkvkcKqw_^m_qF< zew<_V#~k`#(`jkr%f?PuD;oQ?hIU;JE{n6%vMF*O{XwbvrxEh zl6)dG+_ty*zjK9C`HHclkUIf`iuq zc}=e7T$7Y%jKFtJl_4@EX3ogvdYMYGhP8M>XKWvYQ9g>t7O7NAYPb}8B+nRywH0UgR`1it z4`&ybXK2czG;?amJ=G-P+9-Zk7?zNGZsza{M4)A%Vg`;9i})Z21YI%>K~xdle2~jr z3MLFZ2`w{r^HJo5ISPV84@sRp#4JaYAits+Pu{Cpu>^_ghokSc@P~b?=|fd)+TJTg z*A^C0ELTi}84X#3WZ_z_=x(=aEOQ=Lh zj!#IKN_lukRk&v#-I{-&Oz@$U!spxZk@s*)3p0lz?@Ee;AkL`P^$6Jm=p>rhx8Q4l zpmW7n)G#svPC^9@QyQ{ke<|*OIY1~8W6sEQ8bf-GDq<7aMAUWmoYCJ|$_2OLqh#|8 zDFIrJty$;R<_noLIoTKixi$<7g(|4a;b9#@%|7M`K95epRu(_6$=6dZ=1g&u$oSDO z9&`pbW9FPIZAz*|O|Z~9jK*^kwNV2%9BeGy2>4d8aZM9HJOxE3^Xe73;d+WqC1!qc zjH}@UDt}z2;QH6wrV;!={DzBy9c}&c7;L>NW(p-dl#OIf%1dBXemr+`sy~<6aE%r@ z*T9N9DKj#XB3oM#EOAOR&01V=3h=Yz*0@}$vEYdkEL{4#QvU)o&Y`NK#kec0qZLwb zF_=_a!df7H1Po2o6yw{MvFiW|+M4&}cLcZbRja_{?!KS+RW64*DwAm0rai=Fs2TJ6rR z?Oe18_Qi@prHI@1c*@~Stqxo}l9clhRWlrrv<3+y?UFw}_r1B&>Z$kcY!32vIyLgr z?YJ%SD9j42pzZ(U5)v((g!k9Fjv4lCVvJl6EDh0AnASHi3ea zjjeMpYh>&CwmPf#qc9{duw4L?MZE8G#&k?`b|n`KcZo5A4aaS;jxwzk%iJC$Lnt7M zK^$1G9wc48(^Zz5_ePe%HDBf#OvMotX3q_b(CH`+zOYzIP;Au=VgjRNIKzx_>9?OF(G`nhP2XZd7`T_mc>%*;zX5 zKIdav?})()TtK@;P2%)cHUob@zpy)5q0rj@ z6kNd`W0By0B1^7y>lp9gN4;x3J@BuGXHcU|KB~7!F`#$BW^_RFIh1;WQ_j!eq&afh zNC`X?+rWiKeI+ezoXu^MUdvh1*EN&3<>-FYb<^x7x(}xlOvUaB$5z4cUg~G?-rKY@ zKRMz0FO>P>2^Ib4_3%{17IJN~V?`W;8Zez-nsvi;;X=xGyxcVlCVZ*tH~+r<0RPQ$ z=SI(N;3intW8WY-E@(oo+>q{6ajBuP|RjJ*EC%%2I!L2WtKA=Xa0N`E!n! z&0+b>U1Qt8(}zhbhz8e?X;nl!^nS-#;!yI|CZ+p-K02^7WhdS8ouN;!-X`NmijCF%vRp(?Zgite9NDFCc;7MIKQg6f2HL2M1}m zqymI+5`B5iml;oKD&bQqctXEirdc7+4-N{k3F^&VL^I^_%cmlhY)Re1Icigh`zoK` zDr_XDSxyD)7a%Oih-;u1md?p6=SwBr>vxwV%;&`t!K{Y=B|zP0<_rGy^yV>1K_`wt zFgQ0bzphD4XJL`Zp~CvLH@SNA>9;qZuKR%ewtw>#h~(iKEesOIWM*ul@!p0>K^=AF z4-s%YrG($oJZEtXww|sDz01I2OeW|PLZBc`B=AM8MW8X67m?)o4uUk?H zHT-)4LR&FG8`erh@}`7CRFx=llJu=I#(L|N><1o>Sh&cp0b?ZvY09z5xz1GXQg== z7IFbb-zRWi3QEaB%Is`3TCG+m^Rzetg^vWE$yJ!sQNpItXc?wOn2Z*3nM_g$y3s46 zsN<`3D#N=I{KbckXEdGXyvP(%o+d1%Suqu()6-}Fc=q?dJ$p8qLLvai7NfgqJc$-z z_T;HT_ZJz?Cr_SEPM@j>j}r8cGVtgfNEZvDz8!o&K+nr^b{k4cdXj&GoO51ZgtP~g zAc)m!F$HIUe3eG%5M(lOwhnX{^_2C%iy@^AHJN|X8B3Xh@5SY34Kq-9H6tnv%zpj< z#S79509?DiG5p})XhbmCW!iU2Z&lvxpcHo#v0yWZDa16Wpy*+GJigHKTjG`9K?h*9 zv$LwW6;TFSW%ou$Ie1Wnnb)aFQ2ANmwo1~JTCz9Us2apzSE&^L9+B@aS-PM(lQEC( z&Elww1!cydMNut(PfrRozGu>A^kpa61Rk^2w@}N z$Wdh+lCq$FY~KkT$UPAfsu(fBn!u?P$+Rs}Vg4OY=NiwR>?8M< z{p-^kyLh;h%B~ zZU&nS&?p{QC>}J=P@}dt9bbeImUq8lWfQcVN2zXvrGZwHu0cax2$4X2OF2=M=b*LI za1+LH%>@kYq0k@>oY~i_|oy z;kW%Fc{^K;IMkZ0f7%e02_WAi(N}nRNS=S%%=6l>)M1%%tcm~{K3HA$$L&)axAo1b ztCQ`xX#qr~Y~azWF4&6HQ?d;W!cJ{=+NDnaRI@Pf;M#9h#Yd{aw zp@kNgkgvCKDS{@0W;pViFCj$Y_d2s-V78B)K##aAF69A9a^3qz*RENF&l5GO3h=jq z>h@KbtKK2fR7`@aVXG*`dyskgY^m2#aD>}c1Efc)*;A}H57@@ZtqOJ%)+mvWIpvRS z27RDPmL(N92F2X&%9M7Ff*?4;y2XezBrS&!3IIzO5A`8o%PiqB4f;pq2w4r+! zQr+R8eHF*8W=0+Ie@;8oXvOStD@;l3Dh|(FXKO2Bk+kCXC-o2&0^Ui5zYN;77jVey zHG8!H>$GO22>z3e>8Ynp4ZE)$t7W6NX71Scp3cJ!JNL8y76;H2cIg7^hgX&5)bRV6 zD;xW!8Ypc!snv@7`C{qD(oTFf$X63j3#4&DsZ&aeMUI(s)^_Omoj+i9>X@C1YF^aP z50)N>yYSF4OF;~~>Jf-%6F0Q)+RIqa6ErO@SWI`2ZxYZ6f z-Ne}~{_zK?=na=WYV#HYwx?E`c09H>H`Rz}!-S&km*dX3t&Mh=P)7bl|5LD>#{R1K zVeXo1oMMOY_9WVpLEHD$!prde!FX0jHE-=uzpvV;yf)#E%LkW#P$bh}DSEq2D(c&P zn>)_i4cB>%TUSV5Z?Q*my<=;bz|4_X=1uz(RH-zK7Onv{myMxNBfN`_dl}s^tKQmo zvD4Mm;EhwnQyH>Ul-Et;z6!xZ6RTA|uJwS>Kk>ys#KzL5(HrKre~@!7XN0Lo1l2lb zs9q>Q!pZfk1bR#JHL!tGlo`G*0DnKSZz7D-qcu-_6h2@kTQLEt*Stv3vxjIA<|JT_ zesjb>gv^($OL)wK__RcZ->ADPQ8y*}fsUY%Gcdt=E=722^}Dqve>&{mwAdZ?dl9nNqGqh*fie)~faFKg8Fa#|mpz1j)zq%5yzhZDu=R&=#rE&R~Rt=0>Q#UJ`!nrYtOeT`+2eR!(!G*c@+GUspZeP%SECTOy0G81r z=zsq`IKKXUeDiob2u>ak?%l{4{wol#b*%Cf1eB^LCeKh2g_(Wxr+<99!xc-tIXT?c zoVW_7O>>87c~^ZjtS8IrSjlX0_ZP%zNw@**{lR|$y;yB;+cpsX?q9(cT`dQ(gBI&B zByn0Vb%y{!(j{quVHpfsrfi~mn@A-!>iqZJk)lM=vXr#LgaDDrdwuSBchvFQbd~mc z2YWrTM{ZVJkbsAb!2gtHk|Y6OHG9Q6E<3PF^omr7LcTaUn_6yvi; z-X|nZAT~al1z`bF5)|>%>WRlj%Mlq4*DMSNBb`0)hZGAI&^(l6&Q|n}0~;ig<`Sbq z!-4vr=5q)=coz#vK2Od+O=lOE7gI7OuK)u}Ima1BSCs2|?Dz9is8NFPsfZ8?Hs;4Brny0t3&jGGhbxc?4{BaH|aop`ySSw`2J7>kUf{BhNl$ixz~3q@;l(6!M5;MVqh52H^r8rK(2fn8ah*Xh~%fBB0*v z7{b~ixx~t%3%&+@PltfUTWSi==SdQ7P-PG%RN6ooRJ9uOqeugDeibDa6~V&b@US}m zgF;=YRj#t+9xGOJttDrH?Fv=^u1OI$9z)?vAra>xYs#}AkA1~En<;;@+?QSv5|vu} zRv^bk(7@{gOS57)tjvMEet*9LLz8Onbj8Jo2L#p40O?GM88$Gl(Aysl`-6c+t3rr- zAWP(PU^Aqz2S+8D99zJ2#o_6hP}W}Nzn**w1hj@&244Tt zDm2f363?;PAOebSgrQLWG#`o=IGGMliW6)#E^E^YvD3yZq5>YPp;?>t64cPkObiNo zE+*>K49LruG^kIjuFjvy}@>zSqseGhL*hf7qHzu9(cTSlAj(`k48u zY^a%{HGLe9VryqyGI?Ey^4#`Sh;owm2}a@}Xg9FSwhNHZVOMq1T5QT-I&nhgL~Dnc zI0%*O#U-T}L@6Z1V6?PEzTZ(E(@LQ!3@e{!C&g{O;NZBJJ(8hYJn zw2ell1^);fHWcQL^)xuPoNR`qNs($dUgOS7yRd!_Hj;ipU`#!r;eP^=xdeU}L{+T2 zA*ybhE=1+d4?~2v9)!ugsXhv$CUi{acq%$Yx9diwx&^zalshe`Y%8`J)1h*&+XU<8 z>)KFlJuWm)y}Y%e*wC5U?l(>aY;Xow>waMGt_FY8{&qI*`gb(1f2t=_Fcj)l{R*l+ z8RY`+Yt~n=nki^O+ttP$oto|=)rh;pczi7M{`%XQoy!sTnRT@>vf77u7mbMnK~Vdm zP|PsJ#oVkvZkR8JPUA+?yjAN&_I&oX0^m>|DP6(I3{6xV5dd+O6fN zlTTh~*}H7lyTg-mz|%)byHub0%!9+e#a7L%4y!ZF?qDzD?{L@iqKUbl;ud#pqlMkv z$7-y0+iGTW$G;kT)7aD^rkWla#5kh`J|?psdjA5YR&8(FHW2=`D zqqIii0tSM#b5az;QUtV2SwtmLBdNH?od3Qf^%m*NjhTXoB^2;CBT|EiK*tnrHfbdI2Is;bWJO2lZ2bN37(S5&qa3~nO?k+ugtN%b zd{o7nQ7F>$(*Ki?He8e^34|isNVbYK5Wa+jg_JAYm`6gUL^HvMkR_Dh+ykR)yY6as zF}=Q-nou@N9TN>}qF~9CmTZx0x`Z{;F3+-PYtKJh$GQmU|sx}v)ak!FHZ zuJIpNBB6IPp5=P%dAT~|HT@aV%w&oF4q6Tl3d3K?sJ=Q;)MxO3T&-a=H7oE;K=d?HUszLO2d5m*Voy6 zdI&6=QcQ#YVNJmNX)H zqW5N1C|QM;Fn%5|?Tu!V?~G;)r=VyO zou1ZkVy}vs3c(j=-@pJS(EQT$r|t~5T?mnEO({_#h~5$@$)+f)0=iDW`bKW&6#Qr} zVOtjno@|cG&FVdMEXCT8tNUQUw-`C<;A8ZL3%eUzmT^v+e2Q`&+O_xhmRd3owO@i{ z8#y#BD!UMXscBe&=s*>~U@+X3Teub#6!bTPMc`Xlf*>ej9yhGJb_Xp?#+7KViEqmz}};c03CiaMZaz)O>~X=Q{ES69>81zp2*_d?Qnz&H1>Ik5~VFW3=(z zxn+OQJckWqSzY5qHjFNu9fz^utEj##p!O@w%d8&v4(^=lTykZV-Z_h-Ho>IzEc<(q zE-R|9F@oRja2cV2#gkb{JO?atvqRh^{WoWlF8h)+XRcmsPb1YR%oXchT^K?{kT)Q3 z7rADN9xRTjdAWICeJ#~7boN_wN6nr;-J32HLV}`0eo#oUy$mnyLN(O0AaQ}HZj6@# zF)>nh7=_(sv_qkudmaimR2TGg)N!xO7iw;ge7diKLNplJ z#RK}+L7k>J939z}@G1!ELi$C`t;HW)5N`AeGs2gRTMD&aU@jczb<(7Vao$Gj8xS9eU^+qUi`t}9qS8j}_Trgma(NQ~LICv$vJEog0V z5GYXSz@ygesu1@{by$TD)7(+vex5(2&lM*ROZ1DfcHct3c70s#qCJ^n<0355eDwYY zZIQuh!!Qhn?|up$c4*6J9-w9GC@pl1G3a2IUL0FV%pBR+&O#V__sMR%!I%$mEKB-7 z{a)Yu&I?g31T5gSGZ7kN5qS49BybI+4&gZUjiZTU>RqSTgZM$jgvVCo^EhS8*sZ+L>}hMCcG10@ViE{>fWtcIF#duHspoQ3NNl$9}JJcDWUNIHU}44->l zB+fmrCT`@AIyUCbF@AtYSdY?bVuw%s&)Gwx$%Xy3zFrMDa0vs z8@)BMT#8jXN9yPa1!d7yh#wTjyIXF|bF$It1IM5=EPEst0?y86RQ6r`#MLE!uhe`` z3!Px}Uz@Ft6J=DX9qQ~GD$Nz3rzZm52EgUdG|KEAvC49SlZpY)!y^>Fw3;jhu~!@g0YYYacHd8jw&x~S_~ z)lPtOsCd6Swz~~xyQHgO*X6|m3URR+f*1&{F1b-BGVve?-bJ` z@f91-D+Su@((lYG4f~tmJ{`C_DuFu{Yme%H=tPROg6H}J{zE*aoz5880v zu0rG=qi*b&Ai*2ss`cX-tdXMe1S;eq_ZNb{b!2A;EK}^j8|?VLiygihRDFC&pjZ}n zyGI5|KwAE<_})mHRTy7Pg7WK+Nnolrj}#8wgeg0M@XFhbix|%H!<_Fnay5)v zjTu*^qoLW*dPU2=)T#|jlIcS73SIqJo}8cUS50r*I1s(-SIi+m?I2BlK(lSOZ2}l5 z+Mp@AmtJUTBymHL0*A6=Z1%tJ@I$ua$REjW)642$OB6Zt=FL2EbpEcb+blaf&fpln z)smo;3W5JyVI7zfT#azEXiB3OJeJ>z3Qu{mpFhgSa3!V^HC!8qI+tkSybL236xW>Q zrg@v@Ul|+Bm7P+Mn|5JkRXY&603~zO#Ex}oY$KdB`UF~qg2!eO=V9Ha$%o6&H<#X2 zKNzTe?=dggebTz->2*`9cM|M;M#AjKiMT5jaEF=2y!8EPWs2$&FG75i8 zblbT%S=Q06S(kS?wjL$Vp9v+4-)+@3JY)Id&A}GFcG}4X*H&^q0$~BmL_4&l2hA~g z8suuAVT!z0j(fTQ!L&-h1ac*akorVjh|bka{-Mb_%T_)fV#xl=fUkhhU&rtjU1xPf zR!U2p&qM{3)-++M)W37i_kvhf6;QSL80gF0R*%HdUX3q^zkz7nrDp3)q(64W%QnPCr z?GcBN);>yF2(ZtYuvRSKC~!w%#y4J`9+@I#%x!>^3~#0)7utu-zroUY!^_kd1^sno zv|3#Iae^;=3we$CEypa>n#~iSTiLQR!;&nGQfAITy$9sIhc~%I35;I99s|ir3$>*# zz4x63Sqr-E9e)XCM~RA)2z?#$Z%_(FxT|J+>O4#lxQbwRs_6d`J)}g3uEDY$(fB_o z+~nIA!9C~TzEnoI2qo-ua8zI^JQ2xv{}}Vn01|b)g=y21=8tUC>0*~k1_OO*<1XtvRR2D^Xe8Gp@452x8Yr{ z>dka)YYk&smgb|kg7-@OiZgY`&FrD!jUrKS2cUaWJO1b%c=8Mi};? zhpS&USlSZoNdkC4yT|bd#r1Z;O#k$!PH;{=8Niuu4avd7;|YiVp{W^`Prsf1Qt`yS zcdv9(AM#i@>BY~HO)~xr(WE2gK*>Ca?umj~U;C0l(qNF!kV>>NER=sEj>A$gq4)tG zJJSY*rufk-*w75$Jr{ta$;!%5b%)%qdg7H&>6T6HR_51j$KGTOGdue``v=ulVQo`p-6$G>={M=dykal%0`i8*jB6p z3>l~6y?6JHN4`JJ7MbUTuRVATw+p5rVVnZKGolR01k8fMbe$$rtkD)fkU4Fmv-S7m zCVU_fqXMp_p(18f!TZEn&UCS+9n18j^#3503zy`aLoBnkV)KOoB4)r@Ooc{Zkw}#i z!=z|I#wkJDlF^l0cQF}_FQ;Q0%CR&HVqiry%$PQcMY*9fSTVD}FPMRrxr!+Q%^c&< z^8`t$#w0cw-Hl|LNkN6de?m)6??#hj&&%~wE?2q9a#Ox0!cdi9%wtCpDaZ{Lz!5RTx(m#)EV2lW;~mxgz>7Pp;yE& zVh>&D8=6Ule7r9n;FBq~B!{=iHa zaT$eO+NFolJ3``!yzP;0r`LH)I!CkUh`j0b;!b=RA9j1)C@kAVhp|*N)GEe5X^Jwp zjed2}I|wd%-I77L#WO}s1LNsvcs)M9KOf!>VF14uuJ|Am+}}H@Dvyo7vk$6nYr2JBHo^DorVLJskC@P=DecF{Ef{TZ0@To$t~dEuESZub z#VzSK`w*c-J5Y+6TnR`B$9?=_Fn~G5@wD_CA1Ak;KL2_@9NkW?E~ky=7I>{Kij;6N z0aXfjXs(%MwHFm(q9_eAB?CiAdd5+GZ8mME zXhIbZR2r_NdPulj1!V{60O5inR8YFV($p9v7!VOSz5$LojSaZnV>=Q$Pu~tsOl_}R z(Spk0ChPzN&gvG9WdnPhi5*KUd1*i$mXgiBFFBWUzv18-ts0VpXcci=F4$k{fzw_I zOYdh9Bq#|#OOev|$7xam{$o{UG|K0IA%7lS9OY-J;yizxCJydzDN-FC8^$(HMbE6W z8rlDZeHg-2;{9bwcuqB>IUZpV1yluZUbFVMEK76@hVVxDH9C|h{eJ!6Z|&c=982W!zPs;^cbC_fS)5HKXD=t{CAy87LJ>v*$_b+qy^idYx617~B_e%OtiKV` zii`3jK}2Mal5Jy+FyEkr5y}-D%p)OFteM~olqD3yvj;|ZcHf8h*Y7@kd1pjfEp?1F z+F^w@Olis1xuzSmV>*U6fIx{{5()=xtj1@P3CAf_0Ky}>yB29CIOQ7t;z}g+?ysCG zbNt0*lB>Rj@4ge7nU#0%`2$Ya=1Ok!6jt~b7o#P75L-rqec%vlvClMggXY%(1!6%dK0c(m*zIo)e$5?BcW?D5K$858KQVfikd2%e=V;v=^WmI9XG9T`X;^v3A8;$j0*xjc}gm##3&nldvDOxg5xmrg#mM zY1JeJQ7mDcR%q-3>jd)wTSGYD6d9WFEo%FC^FbI<AswCC@_Pl51&lZrfaK2S+ zw=ccf3e-;JUW8k!ORmqF017D$9Agx#`=MXGHn$F`{F{?Mpz%mc?qUi$%Zeb7P9O_G zTEfI+8=wl^S?ZG*=tvBEPJ1SGx$v-vqP0DBen!PTYe7pnX8RI$jDO`&d&woM1v z<9m@Psw*f4N012snW9P5&iXK4oCNq$5QMRs$YcYJx9cp0OrKnePJpT$kf8VL*v=>sx*SnjRbSBhS78%$LVxl<;&+ulWG2vJt^ID5XVCEd0!Rk zcyBE#zY25xxhos==7PU!V(ItnXfBqO!6;7N)M|qvZVqE8?#oVt{8UD1;B%ZSHR`xU z_o^ko;Xr@?ZY%*c6Cg!VQEb=g)&Y&dJ5wKxx}dH?iC^t$dwx720UC$0x%1j{parGh zep&rJn@;EG+?FG~R5-=}<8#sw0otr{S=!fDwD6=Y{oFCN!cyYLS-Gg0bc*MdNtwD* zN)W#RtYsyvQYyD}=Kj8?kIJuD6bszX;H2~R7lCV&b+*A zs9^mL?aNAwx^EY*(U=d|pouTgzmD#?JyE=R(`2NNIxlP9n@vmv`BS~I%&prWVB@k! zl>^Svr8&lUwf9Qs=^8uI!LbNRA-CavI~Y-BuP=fa&vNJnpdKmue>>19%GN@8T%}ku zQz1gS+h=3CE|qV$?rQqEVz%9~rB(OH(_Z2Rg-~&CzIb7mqhFTGO2+?G54Cz91$rHL zVOoM<<2CxVJ2Jb#%%&eZ&Fwooj548^W)IZWS3`kX z?q7xj#N*ieUy{L$YQ|7LbXz~^>*LeT6jaSFeTV`kQ|=*> z2$f4}S~v5nbHXvRr^-Ss&jX$CRHmBL4S` zcu+nKjM>kv=D@o!O(un=#1KDdyj`bYi%k=Y}b=}>Aj=A@IMD9fkM6fe4hLRwOHG3 z+c*$?*H=sfx0bWs7=3l>q(L@a6ljZX6LcSvG@xbLA|i=elCong^6xvmNTx2n1l{T- zE;-l3!x{sR}r+`LE%rRT|$2ls|d`}7$BSMEFItrqMNC}t5Tp2ddC)ArsC>Mf% z1HdmAY)KS_p7kzI>#J#zC?;t_BLx$flSI;nL@p2kz1fE|=r=a05L|qwQX)IF$aj(y z6pmiYBTXe{@j)e{WiZhn=8P;ODd^M77SJmpK_+hS0mXsHNBu{W01rhp)QJ#e4OMDj z)Dz@{<}XVH34&mi%YTqeuJ8oVwVdVxU9l+i*Db{ zA<8xMpj$ePp#YXCGU?8hd*Jv`%+& z^<}XgL@yUwSv#%uEwrlIQLl{kMU1FYFr5oh*Sd5ju3N#<6qRN|H!Yo*=%((1&J&z2 zVxG*9W#MZq+;cbc)U5s#N>^U5t+4VN@D{`xJ-Vjyi?3oiC-^*Un;K)SN=#X9Cg63G zj$&#=n%T8;_JkWXY0ITFqD)>$$)k;!TkxAr6M!nsuxIVj*+9=N5PI$34{cZrX;^t} z_I*7R)Jkq+-;jKS6CsTr4fBwfRF64&Fvf0~636P6mKis2MqNDM@EyfrfAr(_$MF8Q z@O(TpKL*FWQGW=Ia093^)3Iw6M4~Gk{cXmTZIf~+ks_IzhfP>2{JbHc{JcS>I<8Xw zvSJK<$`gD6g#BS>_zk z+k2O6hWFaNQE(6>>69%BUdR)$4=@??BAMy&51+33F{EE)CwLE7>Mq3*V3jz+l`6(V zZ<>`yoXm{;ASn@8H!Q|O=&FuBGOxCkIA6#-L*bP^I_vF#v-4gYw{EF}RwgNP)wLfc zvE79mHIu{r)^fJZn^ilQGL?Iq=46v5ymCoz8zj5x4j5FkWH%(*I3F zG&dMgY*|g}L(q>$tl$Q6E)eKhGHpTS zU<-tY?K)R-OR?;Ut#C}qEEccNMQ`d|$wLTB|H%j|?uhJa+!l006Bt$L3<+rI8K+Ss*%}QE(N6SurPigAC@sB7qXa&Fuh2O7Q>TijeUGI^ zLpcT*Y|*4r!OxJ@NO8d`ThMs_D@Ph-f*AvZn)5JlgADjW)k_0SAo?8vol^5>W)TKf zS9mGS2K7Cz@P(MVYtPmlVnfSgYjC2-6$~1(5YCLWY-3gdGf(c}B(4nVUYCVZg1!e! z%vmKYbh|V$=GnL=8f~R%ca9^FAUP8TKj77y11_oBJ*f>Tk`}k|d`G9krbf(m;5br6}k+3$^8=-hmkB~UO(pLZ+g_cQ&j5|Ds z_>r5r^FUkLPwL==l+(TYU9|TZa&FDc8GQ<|Yo3sHxSD(O#x<8wlbM_zaPt2KOsCT~ z-~5vl93Ssv|CME^9S&=h(Bk#=qZYfyM!V<_omAUy+CUI}_g9P}Bp`y&zCsF#Qc^{& zNEF)SA&siV9^+M)U287{RON&E9sRM+uI*r)HmSM~ES~F`nKOGl$+J9)28R(G!sm<| zNV!0uJ7?O0O2K9b^X)2Ca!a!KJ6qxr8GHLq+=X+t;3(lrS(GtH4aaGaoS4GrC|0X+ zX@9PC2$wn`AXfQS^JQj%$pi$CQ5s4tQ>9nTawU6^3uGi)b9@MXpDxa(v-#AA3Mg&H zEIcp+2{%^rg|nEz1GgDzr~;#$j*${20r4P;BwL}OBAzPxdZt#nk|-_xlST;~MUgWv z=)Gh`h^u?_iur}ioh^PZq(z-l_Sbwao%K$|Rr8`Tg+87zXEW;M2mR~kQgMxN#U(Na z$AVhA*_;&Dk#FWWR2~av49vM)3M_%2<~cPzbQ*9&(@PALs^~`qbaKtt%p$bbsEs#! z2kkGjkF(3$S$ni^L4eeB!!4Ou?XaQMPD)Bm%9IJ?3-Rhuj6YP6M(ebMmY-WG927C! zf>07;WE_whv^NEsjvqM%t)4C1Yi)gU_!r>K^fZ9ZJ_Vu0{Wk@cw2VDya1B~22ueMHc$a8r!9DyP~-a>)U*KeKWnjYcsuEx9{)X-2W9IOOgWEOC`L=lsRF`oqyJv zUfASrjc)tH-dlBltll=}-y#A8>ee&A!U713CZ2_A<}P27Kd`6T3ZHy3fw$FWJVw6( zy;p5h<2Dff?q9KG!r8eCgm8Tu-ml@VrKMK}=%<8XguKR@vn7ut6EZFTy(`%PCoq`? z2>ud#wJ*=JlH+H0_KUO#g6{hO-otq+3?w2$px=UN3n~GdBAku$M9DGP_&0Wq>*VbG zBi@ED>`I`76J=3yff{xaZ#ghk%sN;3UhV%yX`e1BvkbT@##&sb7MP476C9ILXi$!n0Gv#K;_6=S*aizI1~`NJj0*m@&{VwNX0wCjhz%EpC`aXenQ7d)g?Z zw|S#4?Jg=$`^Iw6Sh4?Cx?We#wM)0kQ(jTeX)7dm&4$ZMP6Vwkxs7JHO#pQ2Jg^Hc zYuo3kpt`H&n!dJI`I65R?1sZ6N1becAEIH5)CG*A@a+8X=xf-9eHi*%*n&hAD5H?h z=~lPvW5N!E`a{@mSGn&VH$kH|fpr_Nja0E8JXVWiDTeyzh|L zsg{iW7?W3pe)x9K&sE>oX~KU2@?Rg2FCF-aGQvGJp?APPXf=8PiS5<+H^+mrzz68P z1tY_5@Se{C&^_dzR+a~hJ{MN$=VSYMiP%yR|R=I!XCCLqXE8M^MdL6SkFYbyQQ;NmOZT_)LO2875BU9$0KCSEj zkI^TWU~yW@U_~0wgpYWDRo($f57)xmaE&NmxSf@pTb%jE@6V-Pv9LnF5`#0J0Y z%A!!3W|{^CkwD}n{qFAWtQ)+02g6CxOT49_$dGQ!Cp7Uo31NO>U%H<-2movxHnrn_L@ArptUELMst^FtyPGE)aS#ra5qi* zyBV;vTLY0j)kDh*aPfxS| zYC4{7ZS8%xMZP1$am+~+CzQbNshaDU096k-JnC>`lFaK za-Isxf|zDxKawM_x!SWEq?1Fv{%x8`aM3JDNRUqFS$s1V#AhK%;(#&^2eT;6CccPM z=8Al?7KRNE5e(WJAiKQ6(g53L@gfSOcJemm_lKWVUVFoDR=`0H<92827 z_qMi}KcO6m$SJx!PAAipQ6}IM<7q-KKZT5<7tmfmEP^EdvgJM@CT z&L~G});ewIkC6GRuRW$ovd;RC6!h8`=~9GF7;skof5L#b5opb_JxUzrtNOO?=Fi(T z%;L#}hHqw3L^CzEY^RaW&;7r@iZb@ATd9JvkuHUpxZ} z}w>UKH>dV721=a_}*Jtx5gVoT;vIYHKP;$wgTR>5ynJE1id;!g+x2*OWB{a{Q( zkKB(btdQE7QR2hDC{2>|K4v#082g~Rppz^Wy9HMikOSgMK4{Q@nMCzxoOChb-nQaINu}j@BKiKR^`|-L9=S`ta0<)F_BT?@?`* zR*gS0I{*m)V+jOl4rvCm)+eJR4Q^#30_LY#l<#?s-h4tZ`m>u)ewO)jvaPps$Y*E{ zOQayZSYU=BFry1cH(!HEs&yd)up8#6k2OV`=b>r99 zF$3#~MVJPU3#BGvkxt?4&IcB$aVH1TwvCB_>}MO9XiG<=FX(s zRWuJXh%JE88%Urz1eS5mxlYGh5j4dmUJlPX;?c7ZtUI;bV_9py9^)`DxvML)Vb_Yzz16pu zT>Di)ASA+=d62?6V<0Vdm6=}QSiyY7`dkk!-Y<>cXd8H`*EX_F&|b)B4R0B*%Yoa| zAzA(J>_;~TA&vZ5B3_R2kB6A)DMQvlS^nCD&zl7SAhIsb&e;!uiv!4x67WihDkS=p z;UK0GGD-My>}Zyy+1j}E27|MKM(=(Mii7Au_P$}{?){9RLs}QTpN|HoC#UbK{F_ru zx;Km?r0sNV1W(U~J&m1()Dz+?&yAU^keRG@W0r+L*CylS^zE4@<7?<<06tTO$TiVA zKKgNZa(3FLpHDW3qQH`p37BK*hctssSbxvp*4ToxN}**z%I%cg@y;Qq;=O|88juZ3 z1_0c(jwmMKA{Js2kq_6ynyxbktD#s5f|fQzjpc6T8^iq*rf#F_j6x40(#R(XdB z6<%C#>3mPdZi_$3ylT5WjM;z`=sny$DZv6o8ghTmm8-Tx^MutLkn6ic>B;tZ(aG9*8?g6F&8s6!{DLI#5Fz)1A*p`H7W>wxcY@C_2Qo?GeOvev;DR z<8+pUsMes|60WI{cv$?BVNJ=8)C9QebQYmo;v1NQLAbmp=SwilGMPhGS3TBDz3R;h zKX!rOt~L-re14nXhE1Wjs2=I$G_NWJ;5QHxsgZFg4OGq5Ow9n(x@79@u62q5Z{Ll~ ztn`yVnM2&-Jp10F?`!6U!*A=SY=%Ye<1nPGfl-@eNa;pa;)6ck${BvEyb9EtOarG> zjj>RurXpiIj>xg5_nt;|+5{c)NveSioj|C0?o~~sN)fs;94Ai>4hjUTH(+(I&WjaM z5>H)oMAeNH=jm-1X6TB%dX>*Nx|JpTEj`1PI9nrk6FfFgM<0cs348~Dn}Uy}>Sryf znf2C$GiF(suv6SS_=AKWPLT6F4T@P3g#uKRWVA&DPQf-I2&J}K7At2`}ve+ zj(m&)j!|~!I>X-J!}a;#?A_q#gHuaPw#%wUMQ<_{bNF&RhI}Hx0;}_%fBzGb3at4g zvIB*WA+XE0IJtma&R+caFV7c)HKbW!tBFc&PZf)QX)HoNyKP3|kBb~h?e(`V_1BzI zVo9Ofh3hb+Rr&2|i4LFW)pD1NwC0mXEUl2vw@b`iMMdT@h2$^F(n-790R1_8GsYmPao`lyRy=v8NV#q%m{)T>ez9)s@+Ddw{N1yWd>0Z<>iR z2BK)&Kqb<=Clt?}Qu*~uuzDUp`*C>wcOx!VE$O&*7h{8CZ}yatHc%51DhC%H}l^;`)%fH>OMmZ z?OVTG6viYatAljLL{nB}h%&3y%6g*GY{J&7DO$6q4{FbE2hy^!x`vJ}FB;sBV-Ul{ zzXb_kM_C%dB^vJP8A{&2^W(%WURHwyD$qh!K<3fImlE0XRZHkJ6hsIiHF-;!?nw~3 zkEudoa|))*pj}lEspefpV@;{i#wvt0HzJZ(G{gE}O78Q@p=6fo?N+9bUT=4+1XFRW>H_g+ zZ%?x%-zwWhrSE3IwEkP&i08@{_z8u?0Vc>O@!73fk8S4K!bTMRe(^|9O-jj*=IXU{ zW||9%n^n7CAU@S6&@4U4dm0wT-y)osi&y}HN_;LP>7bO%5d@^(EejIKz^2!0XWRc=R+g-2x_GPk<~B^wtd>MrkL9jysxQkKB_>o@Rpyao+W2 z;s-^SLs;TV8J2PFOg|(UH)6gb-Y-Kxt!ZFdtEp1MLCIXd4m$%e(T(v+R>Jwh+Gd}J zF?}6Xy~7aI({;H{VN?@Hk-5iLO-SHcA^T&fJ!eN2- zZ}*4FWnM^Og4wR5FK-DpyQ6QK?P(tBn)XQgC`EzDJoHgdL;RJb9@a|GGU~?sxku$P z1g}exly$+@ehQGZ>KEZ^2{3~|QCnQ$U1 zJinYl6oZw5Zv$FZdP)D3^!?3}s7@uG_66yiuOK%Z5i9WzVdaT=Sue?CkR~$1Q{GJ)-@c$`QH_dC*5<;GS4Rinr zptc>>BO^2N-)I~vU)z48S<+M6a8Iy8L#x+d74~yxgrc}7!U8e|N8ErI3hu_?JNL_$ zhM~sJ@yBc+?}Gy4*D#LNzOD%ZZ`wi9UxVrmL4}&;jhxxydo`*B#$I<&$Q^Dj8qaoP zc3pgc@~len{_M>?yEB}2;*}m^9|s)vTf;^b3S{uH#2eu8<8^`TE9eg|CqbI;8B!!p z1|7uP9OJC4W`Tfj-;WWJIo``3vwi1$%E0H33@!}W^Bhpi1X*sZ(`l70o3{#L#Nx>5 zoegxdAACTTPH8EdbBD*+Jm3;dnyh=-y7>N_R5CYmop0n@9=D19kjHWpxWNW;5QW_p z58wihXoavc_hYRq^m=UpwcCGk7#dJ53D-!m0yus$p%I_@AG`+_Be+Q3m#e%f|LwRe z@WYg5Uv|dQidg&`>?C5TB_7{=X@WJf_)ik;L**W`N_p$Qk&Dlaj$OigY(9U>N}uXT z3a`N|%&J1sxD$0$kby|EfC}FCi&kc#l;6BHA)M9a=FP$M$sm|c10j_Ew=@8UZ3Z}0 zT`c%x4&4Fo$Sy))h8uWMty%GzeA*}iWXc;Rj-B}9d4Mj~6D5*&S4vXs3tFFKYhbo4sPaiL0ff-D9S=B?#GE`rM5OQt`&1+U(W$f=m7U|kF~Up0 zzZM&zEVmTcsZ(|rwQH0EC?Os?u}d3WR*^J#Pt(W6+$NDpOa4Uhr&=s4DiuGST+_3! z^~`@O!EBAWUf`@Sl;NfBIB?CRP?8Stc!b;SRU5j!_9?UT-XmanyP^yBIGd<1i0#;t z3dDw6AYZ;xre$a@y+jQt;ym5Q|K!zg6D3y`pfb2_;UnyB(Ezm4;Nc9>*^7+Chi8rv z&xy_Hha#B$?^;Lu(lR@4(QTqG-F3y(HM8=4oZ%|OJ=GwQ;Bv&#bz1h<{YLy`Au#sv zr*g{2zALnmrm2JaWl6!Xs~wbTecTniUu=aZ(d0o50?_GEqk~Td?#`Z!YW7c^SJ*Jo z9NY4)+Aix^zU%}(S3{|@iZ9{bK3_LYgrvooK>CqCxMH*|Y(M6clulu2)N@tho0CEnrQ%RH zYY>``mhwNMjPt8(AL@|_xpOylO+l3Kwr`Bq4Yd}+XCf>4)yYJ@vLpNJfAZZs+lVDh zfu6h-`l-WOC?+8DlgcT%efHXC@ErHutsRPz9bptHup14x+XFCSnNcoGsAsLZWR)B- z`;Vl1tBO$XsKRD`26{V{5J_0aN`7iZJRietjZZTtA`FZh%A}*_iY-4;FY$wK2hQF2 zXUzi1q8(ekzbIF%c30Robp#ccw=egQL!5+V`gELRC#3o5{%*Zc7?%z9f{FeW_}7PK z04Tv+QFO2t(3uFa?Cjlw`No%38$bB;%Aa)op4rqN$6418Lb7OwyCF3+9-N~cHJ#j>V zU+J_65}=B9Q&$+O@GTG=$a%ITIos4956k{~Tz9!nO22a9OJY`8R{NH+SAaCjhg`iI zj~0;xe6HnHYNHi9_1_T%y?BMIk<;A*AQ0lk>W0$!9c?9UlT|fm6=zZWJpgKZfpMif z(M}4gU^eldb}@dB{jG8I^0fY056G2p;P=K_Xrq7}fmdwm;wE#G72Lb3=^x*i4p0oCdIFF=cEY=!`cnZ_1#=5-z~pAhE{-|3>*8!r&cayI#w$~L5y+Z}U2j<#We zDmrNMp=Oea@-dmVSHloGn08Ag1;S3O(JhpF$k*=(Rot;P4Hvpt`=`0a=(ejru?}2peeTd4@Lg-LGsOnx^_Ja3lTBPxQb zH$ZUT17Ft*+`R$1haMkeInD0f>y*cgjfl=g{dE1F8E6SDg_Li< zBKW-q#mp|`F2bIk0h9=4*;$Txn8`fWhm0d`^-}-8zAghotJ#54(WHslZMKE!=$5aQ zX_D6bGVgk^}!B` z?Y{*ygZ`H)p!Mc9%HiB|SJo{gNE0F|Ck>;LROFvh zbg^7+he>u)qE;^*FwSUFe-Vb52R`bllknmif^eIgnW4fO39}r{-MypZbaza-*V0=b ztO3S7n%L-nxfwa2V%ijEfZTAfq`0+RzM?%j!_7A7;G*fFGc#~tHzdT9eK>_ZUU!Ci zpRU|dF{@Zd1kByv83-|(uIJk?J;{`DHL$cY(a4r{+_?>yKj~dSRl%a1RvgATHE_WI=Xo9a@cC6ho66l1lm z^G9@@-*#P67$fPTQ9ylZSs0195O%F-m_@;sKYxB`+z~32+a^^E=tAv}H><>ySI}}C zT}ytCrfxMy^ZfbUXVT2hAH9lz=~JT3M`Q+&%m)y3kwdkqJ!IuF$PFAA6r82jj?=Q+%?(B|3i$xJ@3)M3@L{mts15#uye#3>&8rjQpfA~UsG@VO z@%6_jmQM!ow+G&QAv-AQ?}CXY2J-6bgTu#YigQR{c4QSZP*_I(Y^@31{u1UNpQc{6 zKidNJCoT1L0dMf=8R_s&)hv;7K?(m|zBlJ>UQBwe5=bj?p5AP7RbJug2U9^9qt^9z zqLV;%f2OgU=XgI^lox0%6ahzz>m1O5uU_H_g`_#zS(i2|;~#;MLR3w26J!tj)X+>U z8Mk0m3X4N1?;4_e8kXJ7Lb$UELA>Wfq_&^SqQ1qs8cQ}))d#l{t<#iICDKJ~(<}6U zonO{Mf8d6w3tzKPBC82iR)(LJDmw!DIM1VMVLybPQA@8RqckVvjrx()O^<^X1{ao{r z{zoq$Se=j^3yMlMUjd z#CPvRN>H^OXX>^i!hd(A8a5!85ibIc=~kMjb=sc@s9MB+z*AXzMDGd zGaMM7cb7)M)-V75e98G;q#{CrJcOT)tL5!YQh(8>7XNtce%ahDr)yiJ#^ViU z-J}-OuHtFvqN}IvV$%oH(Z)T8raA_aQd85T>qEst=b8N_Ya-%81yi)ot>}3rLc3+* z>(%`08pi$RO3uYbJFZ*ei~A~znA`Q{XC2iy$!`3MDZh34k%3Z<5mJ8BbQkOGCAMz%uhDkeRg`FfV6UezVr{#vkUb8o*gtB%$r$g|)l6|Bj_nM5+_i>0 z6B@-0dc-fbU-A_!pZlvh2U>*u;Td z-<8OiDJ)8}zynhLUmMdPYvI0!0g;c}V7H-U_400IS5tqBk%OMOu_*G1W;?-Zw)0`g29wviHyk{a2PDj~%LR zw}3O=LJ^>iwIr?KQcxhOYf2O}ZM}nuk00CHPs>jaH@4G&2i>ZRKlKUg`7GN<>Q@I~ zl9OB+vs+fqGiGYYDyYZmRohEPcXxL;7hf)WW9%qA9@a;FW&%Zbq1cwXJ+ql*!bLh{ z?9U}Kw#84J#TqcEaTG-VwZzF4FVerIzT~lP9TJvQJ2`L8*7BG`UOjXqrIz1Vu9ArY6-GNDE2hv7Ols^ll%hHxE+wah0BypO z`0Ha%I4FqGnc*gvTNiKZMcC5!qbDaUS&1SVn`joH6C(^w69z!S z9zz{dZlp!mPsm9pmvnd!R0c88o3=#v5mh)I-%=n)(0tcBhR|u+v%?+#3H(#%jxiw? z#L&M~Hkb&%&9O~Luse5zN0VOE&PnhIs_&zyoWEDdi} zJTU>mHALn44|O*`gaGfOl>>|wP&>qeoPbzj@U_zKc z0e5abDYy(hpu57B(7`D4{>m~CEz!H#bHTfRA9~`53CCA4u&1H!zy1iNZLPG0E2js`q;ja0-T|b0K(B6+^Oc;MS`KLH-zJy z9{VO`Oq=gyku=G!CfN#C3Vij{fAMjEbs@zpLlLj-+OiRJY+?9ms{31JX#;(z*p;4( zJN(%sY}E|i9Y z=w^>`MmO>*9Mgu4Ecet&z*$p5{JnQt88DM~4``k`BgcHQhR+E;8ja`o@_5&2FsJND}UL6NpNWBH0Y zwWxx!24i5rLAZLPO#c%cd|NBu?jGE1UwV4bWU3(kKJI?(^pQ<@K0SNjI}Gq|1?Fd8 z+>Sy3OmSRv9HSmP109~M#A)NS!}=ssL}hHxJ_ya%+{w+tF`wua(ghhcoRgH zlz)lhy~EzJd?T^eWWjyEX{m@f%Ny2zr$t@?^r~a0Q1q>)sds>QwB}?+pg}~#$ckm{ ziowb^?nWes>{PawjA}d}@PlTzS9BX7hARK7YZuDTCG`?Kg~+l-@I~%4%qta`Lvtg6 ze{Hk+VAj^0NjW@bo!8<*{hWajL%2w`$ybEbV=vgl;pfw*!nK>_C#kBRqM^_DPS5M7 z*FR709l#m~pu9jbC4|6AHb^}ah}+tyHk5#Yaj)iF_}|FeRYjB(t(S4+dSY1X3h=VW zd?PAD5{yQwLe|@DjHaD!rQ|QUa#J6TkN5^ySgB?5gq2W1PsrF}=SGmVY1Q;g9l;Vr?bB@@Dw-3)d*p-@> zt>TJP4@DI(AOvIdG79Jjg<4}h(0-R!$2_E%X;7o!UkDUJV0?e0rjJ6cIvqFM`p_#f z!QFbbieW4M`DlqsIrR?g%wndpBf@5od|&K1U5>ogVS^^6JNnr$dSl;J$eJFHooepa zTJ#Q|#;}~@OoyAd_LIzyr|f3C3GaAma5_N7s93&y9@zUa89>^bZ`>JzkOt}BjSmcI zWX2DmdNy()b|RV4%csBr_@PbebRs58*uW{Li}cC7P#Maxu{4Fm$2*ddl+1Eh=c7I( z)$Na!fC+Ridt0)C5x8WA_u)SCS)uIv0Ow*2588w~8RDlI!ZVFXYjD@EMICbGl!RDN z0Z_I@G_{odsCdQ!O#u`)!pJ=%fq5Q?j_l4DwhQE|m zm=MVI0R=BGU*xt-6%L`d2%ye8njcfv*0mel#+PZrBithh?}0SirZ(n#d}_C|tM3tZ z_&|!o@10%5kh>xD)l>$S}fTR@EBeq=Gi&pw!V~~299QTa<)Ae zV>%P6t#d%bv|wD!!uOup<7n3G{>Z2RWNT4jY*8Q{*^_m5fyU!4&(Kz?bPzbK$yh)D zO>|CoZz}}5hb1WWq5Im8R|)V#ji`^&%YFq132Wc4Y8a&2@HU5@E9C<(G=!8^Huwnr z&%0ae=BWy5m=K$z2drvw!!{z*D~$R4Qy;|O3R^y9(6aFe zH>BDJn)HrRI(&J#OJJOfBolFkNeXlDOq{wC3aLQ}e>|}z=v&U*F&P6SZ7vL&JRdX9 z^CC5UE%5d-HhJd-cy%0*hbT-NDWpATVKHgBFpab(2Zbp6LE&^5I=w11sWMehy-<+4 z|CB44OZTL-fv9oUhnhd{M|~J2GMzOr)}!KnH?DN;8+S|K z3QjI2OqzJC$e>KkF&9_9nU*or6*wMh=Oe3ls441BqJsvx;CD8~2|8Lc;!eg=IBRxlA; zT1-(6RhDt)uBpgdAuHITwB)UvCV5I($nJfv!GJ6fd{hg3*rcZ%)XKmRz4kPoC-;=M zoxSPUM0!11L2vRo1URIq#5>km&M$7P0zaaIu^2gMmMDd`?!GAc`Q#RTxLaD&{QBW& z{_r{E_|R;S%!rw_+Ij`yUYuzb#WvzzV`ko5tnVH(r`EO_CiQdTcr_m&rm`~4E7NeL zH>Hdg^~@%s<@FoHd%547dp(h~3f_?VkXamUX7UJ97;SEH>c=mYaKXWMGu-;1iI2Mn zZBPqx8K_q_prudcSe>oK>iA@7@ugg=0ZJk}s6x7q)T3;tnT?whg`H8HbY$*bW&FKOu?2MyV>EKnK;cbcG{j<3+@p0D z$7o`7BWpK=PKF2F*5c(9%(11j;^f2C{}Qpv*6re(Rm7P>ZAT|YOo(hJG8Z@arD6wz9-jbjgY`0GUz(u| zjQm4`xfx;I6R#UViH|Yw zNS*{y=nu{Kq`t`(=ZNi~oiSzd!ax~Io2V(EBUVWQ8>-pl-=qBFp*q{`)i=AF2w1%0FE$}_N| z|JnhaQyd~%f9&NXw5D^9Y*esbx9{p-Bs_72wW6qQk*I#*pq)+mc$5LP#Y&wi{yCr| z)p1L$G;A@f|DFzSLp^?}k%q0qfS)OO8N%9a3|KWXhXJjBq#euje)jjj5^|7ZQr69C1ob#KT}U?x~61S>QvFe?D-Ywq=dz-shK+RU+8KtB_1-XLBFqi z!q;FR41{kkW5+7V%u-U6)BL5=V9mC05R0RpgG%GseF)p*WnFLPgAT`0%iK>C^t!S% zy~CL_`kunmlCkz(5EK7skZTBXVKW{TDIO!!vQ8)C;gI@n=)gYY0@!M~*(V6t{$ym) z$va3k%B!C<+wo4Rtv+orodZ(noKRJ8+Fg=4*a~`k$*|En-&uM3vKmMcDq==RCg7{1 z+ed_Oqw6{Yl@`KqOh?k`BDsXh|3N+pZkh(|li!B|J>%gluZSp@xL{UBb^F2@s}jxj z#pgK3s^52DRWFZ-m*B?t8{u$twvdv75xl}-+jSB#6hh#_8?n;V{oqXl(`GXRjNom3 za7JN)HqWER(il}}DDQ$-nsW;L-9d0!{96y&>~|Yg?8iaNC4R9$M&8G(+WFvXQ$0@- z#iUl0KBHXpF<((3anr~QT~lMHFYD>sDsJ%@9F4898{N84UhyV_DL39@z`)6+Us`?q zt-{$w+o3+F{*7c2cVwK`20y>LD1SkIvdT=0zL_1nd4}Qv2#L2tV9ip@c?c26C0`<$ zjJBz*bzjP-a`x|fYP+Qm_Eo{*0^mowq&8&x3 zDAlFV0(KN|KV!ArR>=lpRC`jET>A@Mb78BOe#iP6nYgtNVSPZXy1bNuKy$b#R6Dv* z@zPps<@B3l3x;qe$LJqdU=jpl2$zyJbQigHj=+lLo64%fgDvA+YX{EMT1+XaTV&B}4O*DE;QRcs@Q3 zfx0yYB(KtH@B&kQv8n_FfN{;Ck#D6}XKF-l{Q2J968%*+y)izgFa12!u1(Ss+>hJE zFSc@i2MetqpKm_zr#ujaMc(hLLOSqQxeQ03@t-VTRBzuJw+)dCsVuiI1y7McH=<{O zkwiWTtZEYAUpboPI+@lW)_78bFqedwv+7dIaZRT+pxQ!@IS$&)-|y|;pk|`cg$o|V zQ5o@t*&_?2HDRQJ_`kGl(0|36vY~ zFp?tg(F`8qsHXW1+?q?fhto@rScMEi#gM_hpSGiTiH~iXwKdZA+&5ym)&nbVLQAf` zj|O8`CE-NijHvJaeRt#nrj3TXqK%+W$C?XrkpVIT=t)pp)Gs7m8!KOdpeSzujI zJCIz*j?|js*B)_}`Hmb7~I;!75lY!~Jd@fL- z&VaW#svj$S>XwPz*FvOGF4H7t6PK!ARyZgu?@15eo0r^aFNeg14Fr+MV~dn%FR!Ij zYKc!)@6=hcHl=2CDKXd4?oU#6oz^F-L!H-|HOq%D6TW}HQ$ABtgn)IwEQ&3=>hpb} z*#8Cg21%=jtZY*^rg*rFZ1>1=nht-W^s zd@Plqb_1aru%}EQ+fJ}@w1ivirngyT#y~m5*wS5dX!86HjexE}tYbaWIL5OMr5y}1 zhmG#xZYA8ndV+OESRS@M2|jVShjDjvj&e@m9!TC4J~ci$K6@T+9#Y=m-W(@y z@qj_pUfXLmR!KO?u>O9lzhdsW?TPfm?>X(E_SXcy1P0#v;Al)fXI6DL)-7titDY$o?T`@}HH_Pj zg@0W;x0y z^Q(cl^PI1O#o+}Ea;tZi%fz)<=m?z+IXvbTf2P;$8VIk@5dV^idv>RsT;qI1%iI&b zbQY}ObOx*SBUP%2|LJifWC~?E4eUSiYDW3QF*-CsTEHR4{EBtlRcJI!9B|1aBZ(Ae z)z%m*Be!xFG$bhb5fi{ zR+!W|c{zl_K+Z5s@a3V<@fN3d#wb=wxsoy@4`1nC@NblG<9wlX7NYqhqKwru`q$1j z6XTO=B=Zt4Z;Js1U&0un+I}Qv#D**}tQVQSx@%yj%%!hVVz;$BN6mH4AJHmTcEIU4{cmL%{T3uPv+P@YQ1DBtaQ9A+92Q$iRLP zapWI!1FUHMatX97zZLMObKkqp*%a4DS7;@{MIMjD5Lk0eKA`PAaE}7?uzA|o-aNs7 z;ADl2BiJ}lm|K^4B+@aY-iptM+Rk?nt3i_&NF zoviz(owx>0#vhTqH7EwjhNxU-jr!XD#6(U_8lCX8_C)>M6K0x`RWj|uJ$xW8E2Z$a zz9hf)Ty_|^N3u9a_)51A^syK8O9IrHu z=lwu^x1Ann1#?C0i?LsUwMzUeveRC14Lqu--cVxu>}OURpWH2vvo_Fv{zy1`+*lm! zflNom2jubmxc+i_aanE{d%Rd13Rx>W%G`(lDM_&?XUJvw)HK?ppz!ln-e(sa9qyaQ^+76ZxaTt}GTm{O_8_K~>uhW^yHi zd-78){q6bYY^C@Oo#`(8rSrZ@vG71NA<9G=5R6MDf%FdaXZ+&SE4`wSGtGB4{g4@P zBs|DuC3t+Vm83SZ?_Y)L-cChmZg29`=x@ZSbg~JVW>t+U(6?#Uy!S7IAOR@=r(;Yz z^bxcCDcd|@Tn-#W5vH`bG|G;sr{SZkT7at52Ii(t@EfolfI^1Xivw}wXzR4lomio?8XTtc@K8((^vWEB-$WG1#cr$-CqZU(}1ez<-y zr7Coh?qGp3ucnPb$s$`b%uG@XEC_$cmG2GtI%{Te_p)!J4w*yv6>Wic(B($THGoxAZsED1LvE!(BX_vY`bxO&R(9d4;^izh zc%esjzQ`VBRW<4Z>szX>)`_Tr#aZI7t7NB}v2fWgCeN^HBE4VErlm8C^&;y$?CeR- zein4te>N4R;w7aKS%W^r84}n3jkd^52T=8?fKQaPH$D=&ys1~&Qug6}v-0?1CjCaZ z7<0*2&-J;X+f=vCpr15%W9{2iMjVYVqm5cU96pxc=avE#I1r-fkylkDtt1Q2qAA+9 z%&iV}ZoDyeX%y!v7Ct83&yof6H@L7{aG}ha>5N4<_BK1Qh0DT+k%;k^3nvq6v%9CR zx7P(89--DTy~bJ}?v&_?8Fn)dJ40{t>j|i-(;1S+qQw< zuFJN66&~w-S?&?Cuq|7A6RX#4QDfaKEtB4I2xtw|7-H_w%5u1%0%Vjx_b&$A6Up61 zW7?$ZIlPBz;mZ!HOUyz|!=oLujV*tnN5(=bgJpht>fR0%AJj}UVE|;9qeVn&Ui*2g)d7lSL;H@une9>{$b(? z3;N5=Kq_x*m7xDv&TtR%#M#8vfNgz1N{M$d8$>vbV^W{~IUYce` zlYy#Im!miX`OZIG1|xaEPAuNNtJxE5Cep_*PI4w|j){HX-YDaI)#AY07J3kpu!{dU zvnn=E8Ft2W_I(jyVebUoz%c6+O7}wW7UlDT+;D7^tH;tr6{r+GhgVgpUyLB;7fmW) zLHuStNRtGwTI;5xs(^o=@nus;U$0AVksfeb;4W-rE@a8`3;F+M1_pH58!k;FUhfr_ z?xGs+Mz$cd&2i&r8>gWlvlH9tJ$~wzubVCo{xmWWao5CnrW>WX;0oPI4Yh7~EhBa> zHI*E@R6tlwqrKaAdq9d!JzFOeQxLX+KBEp@ilUg(Fcue(ex1}al7Jbi>ZueEZns%3 zZV$rhE&C6Jd#*#&1eW-hG}rMG##T;*%=}Apn4{axFXvfpz=Vm1peTQWu5@3|h@}VfK>E+V;QAAEU5;62Smceu%O|hITxoO_7Rsw$9q>L40hky~}Q6s}lvqPG+wdUz7M%^$A7I z@gk;%;In65{5lSaw3wq2ptF5+e)xvz_fw3VJqTUUESm~ zCArBlT(}2HFN`5?rUK)nU&uCBK?qWS6t*eb>80uSgrtj;v!A9;1jZ?pVz%_8*t^cq zi=;m4Aw@S}-93ra4jWf~Tv#aGYOG+Z7KWnwqf2G{YXm;HbJ<``(bCeaeYxZxpHX^7 zJdu9@g5;%Qen0+S&(`zn6z;Slqx-3}eZb0k5%_GhCjz~FgWfqy@_BlNC2Cj=7 z5x_fK1n3cel9iq-_hlKFy1RIec-~_-l*ZU-yE#BLSfJCzZI}NE{V5&~QEqr*^qbB@ z+1cL5Tk%@stn9H~@v4~obm?MJkw7JO#hYyQ4o_45gLTo$8WWBtk+kr+E=oxITNyZ zc*G||#pQ-Ffztwzs)c>+)O4J1rT*bt>u75?Xrn|(HF1&YDK7b)7wR{=-s*mIfL(Gp zGfRjwOU~Fs!Wh)*KQQ1_hF{;rO`y#L1Rmq4sO8V z7|wB0>mis6qte{J;m_<>`rD|bmE0wO!6h3FczDu>z)$qZtfPjUDc+?oX;Ys-$szOB z8y~IMwW~Ia%RO#vwJQOd09lMYrT;6NDsf9KB(4*(xAPJ(O1N~ZMGj%=)2JlMYK#nj>>*% zE5W0(F1n-ZP}L|Aeb*W-eJr($>@BzworT`tgnMG89I1PKb{CO~3L+7~BTU3kJqJWul4}+|GI3=bQ zSKsc2x0Rak3Lz{D#Evc?PquCVsQ%nFkbm2ehTb;nN;TWlQ<0_UbCa{PBC2xvOSLc# z7lg1|aEk*#07D}lCu-4TmAvPsmVIP@HqVaYdMK2l!uwYj(a19^O1Kt0ujr`tJYOk6 z%Yl(EYx?8hhtvBb#o(Xmo3QSL=URa=8wmVeK3(IJWTRg0rfXS7-JK0moGj0KiDWbWCi{aB(C4fxSr;RYMm=h^LR<$?hmE`7!qY>1d!yC&s5AT)<+%y41k zwdHHX-Wp6=K;_aS-ibe4`ONLaTHhGv_tn?gSoHhzSCRGO1JF0m7anW`?k<8tVBBld z)euXi$JBBM9nQ8znrf{&@K&O#T6TQHt2t}fECcN{R2#Z2d&W*s73-{ zVbVFGf;+Bay+sM;%7-n2$kqC=gCkv!ACQ9!v zC_cc}I*@H?z2;H8lG3Abd`2v#o2MNxOnh5F|3Hgo1GTp5Iy}{Chb-v;uI=Z@)`DHx zLpJ^c_~iE$j=iTlcGgfyulCVMcH_r4c90NY9XzykPuJwR%4HKqKFvw@eP|A~#{hXp62b$0v)b!#gqqD`4j~D?TmIOo2{Ef zV@xnRxc}SkApI9ju7Nv*`{&K51?Y&+?R*jK#Nj)CgN>b&n|1378VjZ82|D@U0xioy z6Y74+>+bpVE8{@+s)sPa+*pa3^#1{DK$E`~M~kyyySuw$-ZkE?pn)o#wA8w7+T(z# zHK^eSEm{^vpw&$vK44p#CU!Ocx)*0iGPqXRX53?_gLeZxfG7B){^CI?Cb%sIQ{~{?z5t`*@=RNl66Z^(^aQ^txgu7{cd7&K}1uSjV1}4qf zDQou%ED^9GXY#r&3}_H-8ZtW%W62&n;JbxD|t97%8o(i~j9x z954!IwK|ztooozWuH#9ceTd@)ODeZw4%Ld=qy)CI%nDLYpq7gx4^f!wx;`H)(~{G0 zFxQ^?q1~Dd)nUI@bu~)MXcZ8Mocnzrve!8=p`(_Q`wBk)>>nmaA{R?k|G#E!U zAOJn~qNFaYfa#zCS8C;PID{@?+A7#w@fS-qwGmD6H>lc|;-%pA?mn&6j1xu3`o@6z~*av9x=ReZqLRZ=y7r zM1mJD7GRaKG(z4=1`2oSayJYZEg!P{HXHchCp}Dh7IOCvo(uVI%w-*_Ko1^~#4Jb> zoB`qxyvtX5zo?};FL6u-xl03`i>Z&Wfezb!=66tCuBj`V4p)zI7~*CA2|9rHxhYjq z?Ig7@Wzt))2C->L_hpx~<`F0~*KxN#PqW&!S*_Qv6+ZXM2nl+EI^xCJ4eP4cef!05 z`1ak|;oIZ=qkeD{x^hoUzZ@3{r?+081JpClOY2F%F!kuX!alN`=)wqp;;vY8xe;F9 zygxm|wM#)S$a#RY$l)&oYlw914#%nw(f5?t3r)+XSlfoEXJLUjv+Yj*wmiCDzp;yk z_rl4@+99>!VhnFUW=1Kj`z%6FRjC!~ed8&5aLG0k3?nIt14iWCs=IgP1jw={1;zDq zhLvUEc`{6W9W>#ZD}A;ZdsGwy`?^Q{y~{i4tM>6%IUF9GoV-18WtTY}sqkZYZnq0H z!VdxYsf$1J^V#3uCO2(#R|o{Z4tq~4%fLEzWfB1>hpxd@;ufj&&>Op^4Hl%X2ZA=u z#~-@oq5v&v+TFO2@lfnyf37N;mTy@iV znWLYUA=^hy0ayWp?lx$l#L;Ar0T(kT4xP~k(*Fm7R;sXvnp;tsXrN|{w&IB<(1VUa zRoP%{MwDAkARB#&uckf}@)ZWeglxjtBMUfDWc#v4pM}>%vrt;wPWkDxwoAWU5)AeML*{ba(2# zSm9=`+f@;#gcx9=w1=|4+8lP8ScM@|6>dP0F=aoF!kRWB$r)6`ri9uVGvW*UI~^}Q zJ-VO{)o^tCfZ^=cYC&JCalJp8l&sVNu!!4D^Y>JQd`lO|ScT1U-IsOa!Sz7e+vwg9 z^XN5ipow^jsCg5KwiYp@1W?)y9{2&Frb=e+|?r9^BYJARK!LC!Sk!Rn| zVsz8v8s^4jtYf-hWs+*Wq_86uj~0K7$IB)LewF9V;V)64!!gPi(USI@8|UQg5QV06 z`n9GM4BK%x{c)~r6aSB+kT9*s%E=0CQG?EKJRmcsEgIDASTseCU!;5wY6@bG_eM@q z?hDuZK}JC z))^2DRE{bPFY4J0G;AF|*Z?DQ7-C!C%iyCpSR;t6*u|Dma)uX#lN^B)c^QCKD4^1_ zOGGo^<4S>7%K?3L60-z>N9$1mq^55|k*3eJ7^DPMids}aG8q@@#tDn@>-i{1dKLb|K2_uYeUzfn8&>yqHycEh-BX;DDc;h;BSgnXz zSAGMk5)|;HsMAgssDnlY3~ZgJgRR0j221C*-BYE6!V(gC0s zezJ)2M3l%wiIGMr40J*=udK?xf+@f=2L@1(sy#4TbGGu<#)nOfpHP8c1@yX|;OBLy zDO*;jHVaT58|N{of?1MV<%W%+^o)>SuGXfAaqz8udy}TNAGe-kaC@8m1)@#Du!a)v$!S6~_IE~(U| z*Zu18by#J>@;Opm8XzYjd37h$K~Pz-({@5Yy%llC!7Vw8LcUIJ;>_MxoaC`!0mwd9 z3H~|kjT!S1=5-j?t`g3C%U|@ikNiv#KcA4sH*spuH!0D-U85&#_VSD8&X<}PgIIFFuBTW9zKkObB2MT? zok3|!jLBm2Wm+YRlnam2Jez=9Q|!&Wxxn(kc6ktpyFX|YC;8xRri5IgM!m1WA}A!rkqlD6(=>G) zz4t2BQoqRNmr(92v#m7a5kNtFU8ng~l4z-X?niWt~;Ys=qNE5hMBT$1Xp=@gq#Ua9x_RdT(|m(6w=Zo;cRET%+H zY9t<+*kP`VK`snyt9*fx&Uj23BMLg_e;ZzYHw2NTH#Is7faU1dWnRVb94hdVLn+tz zNP4{iuWW=5+AEHlxh`U8@%O)V2GsSS^O=Ws7{hi|B+`|;7W!S0Cw%>QD8^6+Ky>pH zf!gzIsO6Q^7gWOodq&QhqBZYEVChf^D+)`uQkz^TVr7Q~0=R|ClU~PcVizJiBolF#J+7scmcATz6n?a)N8QT%ze%N$av2B=wio!aZ88X?3 z#8NzD(2S#R%fW^@3)9uNZ?HgP8@FpQYMb}=S@>n6j>n$=M>@}}=J+jyWa4J2oH49K! z27Am@hk{x^agwfDogd=6(nSx9b=dU!>na9*onWkI+pH11(4+F{1IC>EZp?-rl6n^& z-0;(Qrusl!0n`Urc(*b82Ob-dk2L>k94y*@LR|RAw#f%)%PHlY#cGBH3Ap3vZr-7~5 zLh`9@(ksD3fbD=|MO$C0ojC*$fK(CBbKw0mvhNze;q+|TGS;z^bE$?XAha_=;Kk0Q72AATD_Gml0r-0y>2$u5PT5<{KMfb4OCX^%ThrPn|BI! zDC*{TK9T8D?6qRRP4$H9Mnl`baBR|p<}X({LGiQ9$k0gLM1I9z|1Rbs*jTX^F_9f@rVI9y@8E9ahX}PB#!wbWYL7-QQJoi*NsV(t>TwgLv zZm}O=Sc3r!Z73&Ei~J3ctWP^?wUh{8W^nm#Ygd8Nb~rKC#(5@AF5DMh(6`+t_!n;Rw%l%0QHDxZcMXTS@SgHrbHl|w1$!&MNha~6 z=Q=`g*nF!A4Np>TRGNBfL1cD|8OMzs`XPkzD)-8Y?IGOOskzVt*}j_g>~$V2?JRCe zw_^(brgH#IN>kvtUfpL>nG8ZZvcfu z(WRH{ed%2rz*8z{P)dWQT|k47cHO-)Z5j(^#CiV6br*AEojn46>}ALvpn1Jmt9(|C zl=v^Al&=i0KY;o?F!s}6yM6aXUX}^w7BF4QrC_cRMVvq>9+VPbe{yr&&;NjTR?aTD zDalp9Cv{QZQB=C6f87Y?9Uuv`YrC5%sks+0O!y|@%;@nmP@~z_7Jm1VzE<99&ZV@b z7MlY;7hf*<9<~mtZ-q$Fh=s>`M6sRF&q@;!&i>;)5?9OE)9KV&7!H3qIQjAI>EYR5 zM?b$mJUFu)_3E5+W17Lb95ceo?ZeJ1lL{%7q#j%D+_5kmf(jiiVpYZ4A+5sGyDVRn zNomKUizo;5Hnadr4TwLX4Qr-E@xlNvEeYY05>f@iARZ^vvgO{=MZ_97X zOGbGes4ZC1M2aXi>e&MEJY)x^HlVkIP7iIOjvJ#!opD~{7-KYo);Wk$pLzeeZc%a3 z#9ifvOK{_Pl;zpo91N9<#~Xh5X|&QVKoKueK+FgaXnwEG&d(oT$|M|soGuc=BEk@{5f$Vm;MEWn{w}Yqlktn! z^u9wc(FWJkAe(ni=}p|>;CWX8z7<;ww=En(d#l_r?1;|MPoDHs-=?TZ5JRYZiE67&ZW3*{-c?Zb(ys8L&|qyqeS$45?e z`w{|M>`%SM7V)#ajU(IQSA#J=FTQV1rWn6QOju8_K(4EqU&X?jNA$kF40->L*q`cH z)zBn)eJ*F9n{zYW=vvB&W|R)<2aUFb#DWi{B88-t=eC|^?w`VK<){cWTI`~>35$s& zul(LZ_;wC6_H9WhhQGL5dli*2Do9eiyh>8ebYXF3+Yyo{e{lqLy83x9>^G^8dy}?8 zu?1@qlr4y+z`yZ}7my>y5v&lB5Qxb?O40>jFNbXnoXeT|1duj`#tMtkE1On;Qm=Ww zGMiR&^N<{{V5e)T!Y}$_!mkIDc66^R3e|nwSazn11B~uJy zFUZ_J_j2Bj)E+1WAt=^?Qov1kYDkm2Xy)Rtg_LF1a#&BGR#aSh?*<;HWw;PUce<4%LmpZ#8 z`Ocl|4@#2i6B#^hOT zI`eniKC}Ej-Et!+xP`q&=ZVbKDKb1~;gN{8-*&~?1~gIVPVH~+@yOyA!ROzT5wXYDG!3V#GZTf?%JAXa~~Sk2ZBClb4XFPBjFykN@_Sa?~M zGcwnkPs1A>9RG4&lXhgF+SQ*JbxsdXpzIpeTHIJ6_6&X5O)|!l5*ybJ;&J?|70Thq5t-jwipV#%!8__JyIo)f! zB>qLw0(PFn@O;6D%ExqLptWOI5)wZ&$R_06BP~4;*zx{R zX!Q8m-e$)+n**rjHDzTVPexVz&}Es-m*|^h?_R%?)(uFnS#*=+MX*uMbJYC8Q&NSE zh;s>_bI)DE4T_cfp*yM`2Z&aF>Ss`z->gmSe&OZe+bhVpHKCnrV(xH+@-8~H3w%OS zOUFj8TBNn?$3^osht?4qyqgIq2>~QD7NXpNN(sXWy3EzNnK;9Af;|7$cpR6syUD$0 z!V$Ku++(UI&t)}gxO7y;$dcA@N04=im5Iu)b&nOlxC*92cU9FVL|*PJzwJ{-*fa$x zO_vN3XVcKZ6u!%{%IC>%u`j*64;eo8D3p^G{LwmXTEAK$cu~+gEbPVGH*fZjUwTgq ziVHQw@J?s>GM(UUZYwXHY)i5nl`Zax^nh(RJUKXfe{wu}@%H7x=;h(*{*OloFT>8{ zHdhs`f5nMDk>Qf``lyhXoY*4@T%J?ImUD-vQ?2oOAA`68&}*hUYI*Ou)bJjV zLapxbc>nAm9I#izZT%`CU;c&Q6*4VzF{{iAa%+Jg&>WWP$%9$90iE0Myf$BRvR3N? z2p!gA-}Z)4McNhPTvWIc5>kWVQbXU|aIc#+yf6see&L_Fy7bK`YVXvpb1mG-!O!mx zPYzy!=r_-pfK1@|!Q+l|<(q0;d$Np+2>a%{;gIfd7#+VoK7iM#f~V0P&(kljuds43 z4n+E-T%Q4vA<+|GWxi>s?n$??KIn*zMA=x2nV5d^#;N3FV2aJRD7%yQ4z%b)`~5mw zH=l0s-%Vp@huIhu!jjA88|Au##VKPUhHOX3`eF`dwPZ}+(?inJMW=ei6ZQkWr7+HR zqc*M}ZG&b?yW+_Q-l8+wj_cE&uCJeipZ3pCFhYq}c>$cFixc7YJX8C5J+^;*dMIYx z;rEoS?%KN_*MbzH@&nO9qP?E%*CjuJX3qGsJ;PC_QpnL!lBOcl=3zEs>2Fx`cvKS$ zl8F&QyyqMt_FCt5#CUDWjSI@8^XP@RN5*;layehTP*;hlmzS-fVq8h3vOn`@_Xbqp zo~kB5g>S4fxU?=*=g%tciWhP(03}f2(ri)gU6G?@6E5(xpu>8JFg2<(EAq?;z`;Br znn*#RB(^HZPvoGbM4H^MnBINCEd#ZqQs#-qKKbT1(_~Kf zZFmnh;%G5Ish+Q=&$f1a`Ap|VL2cjjPWEJjLv|q!bi;7tE`KTx>R`#085@mTE&-PO z@Le>=+ZsUQPSbd7ZEa9u9=`RElp?`zl37K`f=u*bp7m0Tx^!F1BICdvnLU|ZdIUX@ zYstj`=;|>LM~WwjcVc6w*G(g1rQ9+aekV}qKar)&ky{8xRtxQS+d8LGmo=)Ox?Yn) zb>~U@#Ji=~y>fXKI2KkLET0t5A10q2%M+MHO(DCyBw&a`ht~C|PE)QI3qR(8#f5-{ zII75-4*G=~dt#4v4Mh9>i2ls51ZcI7T_0L#JPoaRV%btUREPPwvvO9&N!FFP>NBG= zKfI{+Q{zORLi08#lb=2@dFnwtM`+rIWmFG+O(XXN^sb_Ty_GoO^B&TlCaC{YQQzV` z>3WOVgG+%(XZ;58XCcqV6gHt!3V2UwTCk9O#Jd{lWv`AWUTG_g9lx*Ueo41d%*w$x zO%#$~V#=LBumOwdI}?eP@BTxX7nR$?#p&CVv(fSX+540IBlb!Bes#3})9A(i>48VC zntAv<*{K@tR+1XFg{f8V4 zc$LD|)g5#^o<*px%8fyx6XWvJ=iuZyGb}64#q+ZaN>S#WMw1CSx$q`CnaPD~n>~GB zPrkgKA*(F&xzRht%}nwo1p(09td?P9S&YF18c?`>NrMyMAvONaXptWkxLVR&t z=6(|wzP>wHl#Y9eSEeJ|ch*s!1h9_lZ06HxNtZ7hXJ|#VJ7Jx2W_CN zd3%Yy>Ve{cNNzmvwmdPaypKnQ6r&@hp-lMJu}j_^KcPw*Ctx*@0kQ(?6fsF<5b5cJ zTnUQ>p8KBgJu@E3g|P7IO8|2iqj3mwK&?r5_voY%$6!d~AUF?p`7qX2Cw&v+7E~V? zP&u=vKzoF=3X$o}F(LbVs(z42UlD+dK@<4jN`t*Zb6xuh4$1jKK?STs+j z^)^>n#Paq&QD*?-98f21cWa#neRZ4k0$sgXJo9{04)%pa5=(sU1mzI=^OvW zme?WVV1LHX;hxO}N_bKZB^PMmI*VWWw({w4Ro>S2_sYa@nJ)_9O0SJr<_?%#Kp{9v zONnKsOv#*3@)C4`jJ~}JTt&ap@Gc!s(-10F>2l^^#Vjm@bwUm>Q$Z@orPG zl&m=3Z-%B6k~yqhso}9BbnKXr78rE|!&xL#Gskn{a=xbKz(8wiPwYw4`9AY5r*7UG zCOKNJV1%#AFsI;pDO^7*=+&E!M0Xph&nP?fykOQsLqSZJ{7!(bSWmcu3K8xeA07td z?^Q{mIJL5{Rvst;bB^(x6k|zpXe`W;G=o&>ntC1kLHcc?;T!U(3&IjK#H-{T7>2l3 zeF$Evg~%Gq80(TWsePqV7 zylX$FwnRW~L)Z*Pe~g>s1@|<`yg#S+7^Gfy<9hTQYWB zA_F@Pt?AqGs77wb<-K-yyf%WZ9DiOVf0DnoSnE&QND%+-zhcUTvt6Z0c(s%OEk*Q- z#FeU``w}9ww%3k@U-GU4QLq2|&92vupDAs17RdI@&g(a`GwU3`OBRWyjbCc;5^fhh z1J@5I;5{KJhu8(apm4Ja-8fny&3+&r9pPfJ-mp#hNGzX5@FnInvVEGuu`4O>SuQiO zcJLK0Adw53lUrQFr!`Nij( z3!zGS$rpsfBVpk9jHkYpaq7UM&lkwS2w0q@Hbp~@^mwdk5eX^7Aj*jD&f_qNBN}mh zidY=bsitLY1OM*g$)<_$@9r{MlE8P)QZEZ}Mah^7JY~S|NyZl#^m9QPYpx#=#3mq& z!Fe3SsrF3+ypq&k5-x&?7>D!gtLv{fZ~`;Q6qjxVm>eBWPGK@!Q&Z|l+D?V$rIbdJ zx?7>HXb{AYlDs#ps?De*?pKH*7D2>`q#so1_KM_+Uss5a3!mpI-c+a#bx9U*Nq?Ku z=LlRo)(>AV|N3-$-xac#l2t2WOBU6uuD}(mJATFNgCXa3qM>+wpeS}HHj3ARs2hs2 zf6gwi&OTgS++TmWy}bV1tbjPkW1i`Zauq%3Sya63?#?T=v&f+-v*VODg!bz~`}0~k z_|ZdS{Xu>G!Ms*~OEl87@TM;DrYeD<+LQzhiNm_Y;k+BC0d^1Sr7^}fturj#9i5C= z?pY?FEVX4Arj2bXvIP(B?S3lulw#RnKO{O>y}y7%zN= znJ^d)+@qsbQO=a)+-%B6xA3L-dRmL_mM~Jv`U8n0Ik}?8zyO)& zh+eTZsuiH?@Z#j8UAN7QmpW#1=vdwarCa^Fbf2ZZxzp?F*R@_t<%WuH7|9pqovD@8 zB7g~;p#OI^dcloSL2E;(9O`;iPcy^CcG$X`?Cs6AS-4dx?5QaCwf>FCRt3?QZpr@b zgs-(oxc1)uc8(hw_d7NILRuSo%f#km=9#HoEBU{YTeVP6ubN5%Y}&eR8O6v@JC(r8aYj&JxYT=mc!%Sbp=&lD0qA0t* zQ6V;%Di}D$uZ-6w{D}wugUYGYt1mfhudvEpTChsqc#J0#3JcB?b~GM)_(`8x;v;#? zX&N$4B8Q~TSPHYTX#No50I2?Y0K|$jE|0o-4zSN8Nu2U}mlAx*&Zm(_@e6%v=n}%) zi?4s{y|tAiV-^F5?WVdyhNl{$l z?y0+lS;dErj-O99xm$`cig?@*bWuWDjRwYWFzLf)vME+W8L&_VX5ED2W7sv}-;&`~ z7(0TY=&7P_MxyTVPaq(Rx-ilxe7u28XrR}lI&Y<~$= z49HYkU&790f}RbQ1ytX){{XF%-EP}342AFg6kL&^PSGU~kgm&6v_OHb7|`8yMWD!Z zEL4^Zk#6D@dG}Gu&ysY_&8C|K6e)h^kiPiRR85u*&oVfJAC(~}jYW{(Mg<060#^tR zU0r(DNlZVh84e^l=I6Q(H)?9o!FSK-w7~!uWr~bxRWs1OzFgi6}TWdl4rVD0P zF(_AnH5wgBV^{i6D>mMpLt{}%?8V?b)!p4*UEe=k$EOk{SBhb-2ns_S%(P`JU~agQ z8&N>M4H~6Uk%)&`=2VR&BDRWtUirH54js!sN8VzL)IxOURe@oYWi1`czFuf-BJHN` z-t&!bU9r6wMR$|@uRx|2O+u7X!KNP2l5sOAm1Z9d60jE=h?Qfbc$-aN)h}bajrn8M zawUd-QwviIBBODYYKh_u>J%K%PH;S{m9d*~3^Q#Nk&G{P?e;`NqO3(G!QREKV+_KH z*=q)JnqXccVQ;9FJhi9;q6%vQ|wkK0fVa!>ucDAv2qHTTjx6*2TkBmv$=K zAxq)$P34PZcY=czSUWK3)Fl_<0XDrYzqezmCN;42BD@mq$@5 zMS0vj8DB4gAGQz3ZE*565psUW@|a4V`u~nGlh==7m=f|2$07PV>G5zC{2ZKoc<=3X zPBMPSWq!KOfRm4O0)-csooB#>e3XOJ^EJ|1=8n`fpA|?K=kj;5QFiF&rY8SC&fUj_ z%ioz?+ONqocJ#)%ZTDsN8?{s4Z`v>re$QWVt5};<{7|2vj0u5MsY9sjZJUsBF2rhL zN45h+761FrCS=eIUZ(ja@!jY1_kDLBd@0f*2zvJc+{5=&7)V5hK;MFC3n~GdA}n@! zqU4TZ{FSY-OJIi&c?46o5-4G=EJ`j=!yxgIkvW{{a+MD&{8VXQE-AANxGHv9tWyh2 z#*hh)($K{+Q95Tv$QF*uw@2fVXPLb(qar-VN=SG z0;5XJkuHio<6aO*mZKpNwW6P6l^05)wDc#9%Fsn}V)U$7jJh8LB{7&A?edlhi6?(g z(xOhNT;HQE*POg@ES#oe^_j9$Rm!+d^j#0UN$z4pq&<$>p;ZnH=8Kok!vlq@tB)-h zvC^hw>x)_m3FDMyWXC|eU6=daXq_{W9ox_gIK>Rq8qVZ`$jS4Zs5`_-qE;Hb2SBUP zV#6##t0vU{826{Yv4WJjj92Ftai-B?BuZs4OeGaAA!e) z4QH@g-s8C~4zzEW^F9(XMJ;Ts`2MPPXJ&5n!wa1Kpf25`XtJoU-v_?|jZ(o* zBQXrU=PP{RP%6}ZKr5(JwGtAl5O8BTWHO#fM8+N^8A^rt_jN*t)gnR3B@_GEe$Q`~ zSH10(noku>;la8Hjq?a{_c|ot29ia%KXeV#L1N}vw>T4U#!t*SY<1<3;Fc4TaTs9P zl*lT6)XWTbmq+}TLuuCx-h<)(5L{~$XsW?GgA`>jH5@vf9Mc8#9<{_?9PUfq&GmY- zyWiwig=Mlj!CptGT};7ML&6&NE?LQlg2+QKD1++4c&-%b4x@5WMyM_TseZZ)n1e? zLw?Ond9B(`J3nrCt{f!{O_ukci0d(|-W13w{qvbZ21L-Zqk^9u<70XiFb#pmc3-o} z2Hr>bPRbECFLysw;;~pyCg-5VG|8q>3uoDua}oZ9+}fgfj^LVq1OZ>g>i8YcirN1- z)#`X^>e%Z8_V{#4#V-F-6KV9W{sP5WTT|OO6n@XI&@#=$DFH$s_Q4@gD9~kEmTsY) z*-6-pVk@zxj+Bw)K(^(-?~#0oW6MrpJJUP_$2vOK?_4B~PUgY9(KvYBK(EnVKqZ>c zkRbRw$3h`KK`J2Vb~&4HwuE=yH#{Z#K&CGx3Mf{r6aeDpw704rdDh! zTr|En5Par>F0j%rWKyBao6py$cekjI24+=%T1nWX8i9Oa61LByC#QpXuNO%md{B)h^$(D7YPBdtXvK- zn-T+0NRKM2FLNJWSoAe^KsNW$1c#C&wi|@&51@R31;Rq$<&n;PHtiq}hanz^nkYilY@Ap%E+Bpt}OQvSR&nKYM zj52aYq`EYVPP>=wd8%SxP`V_iY}BB&*Xp3waHzk3=&ys;y;YKBvvJjEVSYL#;RPqW zLC0w5@rbE1X;D!X2>yT=bi%5BPBysyWnNUWJ#58!l;@)aN)mI1`i_Ew7%9PuZ6+a+W@FxYxQz_AJiIQfd@Zu_# z^HNe2_iHmw5_KKZIVWjiB^xX9Az9UCWM#KV17plQ#LF7BwSlqXD~03y+MuuA=xoqb zLo)A4;#Y%kePnT3=>(C}3x|SWe~A)a8_;I+k1f2WCqSvIShhsphN)HGSydPSc+%7K z`zv;xE9Xud?QXz!O%5a&>!a=qVt(o`F!M+u>hs}^Z_f!hOWceesk zFM!h})NUCRN{Bf#6$)Qrf=RQo7IzcFe49G+D^a+8#VL3*x00gwK~P0P(5qFZDb29< zh`djGQPOZHx^|)|U4SL}z*-7OjJ{-`Gee~g5@JT+2I)h+EkJiGj54f z8kzn|$BlT~E)xNzUrncj% zo7C(=oF%khFUV%^?ZS9)fHq;nO_8OqbKz0vA=Fg1e89^!UY@>Xt>G3wUAUFbu9@i2 zN$x7oEnm#_o~ucPI-7Q$Uz~k;|9>pV-3huCmwM~A_+)~kP`y}Ydb8@5u1)jFn*(94 z#^0nVZ2GVu3(6yzPI$VH>Pl`sI2M7tDhAu19=96pZG)7vGkolx4<8TD25&y>6mr(O zA=4)36GULz+Co~$tlMkzy8e9OqDjcHvQJWiN6dF-)DzqsPxT?T4Y4}xcDwd!QtXX2 z-N}t_p6rqbYp!Tzle4*nUe#({f^(NFb=5T^D&5lztZV5JxLLmMDsgDv7ix89UHv3v zKSlY{;BOO{+|0jNVEi8?*Nywfor%4MWPKiWwzxeeV5lq;ha+ndgwmVypNn zGr+_Wa-N{jlvt!vt(oCc457%8k?n!w#>IX8a&`Uf_S!bV} zZZi6X7-(6l1S!$dRXh#?!PcmWM8jxyCD(-%C=5LbEpwcG#=Jl^4T4g?=62)CG^l3Z zOH-7ld7oM}y_^V*8Iqi7QdP+ZzC;a~OQXR^s2Bs4rb%2~t9!{xlaXTos_;0dQZy+m zCV-C=xYSU+22TOd=&>I$5MT#!LyVmmSNu64wvLQ^UMR&=rQ*0H-6<$_vC z9TqOqbGxl@qACCe9(M?}!Dns_+H9%8XAs(f2xEs`Rc^03e?iVBjl$C-eSUYO=ci+O zfFm6aJ;Jb)tFicG@zmix2Y(lY*_TBwlY4g}NYNch=(w=8FaI}Fifx-j+D$@@MGfC5 zZtSSLp?0wUEAS@^5;X~XIu2nWWe$U!sg)HqWx2+_raXn{&5Y|`uJ{%!jyq2FYH6Lp zUGp-ZHcnnq=bO{yp27QR$HGMw+KC_%$dU}&tXA@-Q3nbjklxvwOi(ARz^K>bm&xzu z6j{%X7v%y%puqvUP3VuF!ktO!ky^9INMoK(CL6vqS(_71poRTNcpu`S3ySw^)X}pE zyQ2pFQdl4}QRr&1@pA&}=|-uzQ2ixalXx&HqGQvA}L9qpY z!KFJx6@}Nc?j^TZoP7)%sDB|zKAmp6O>v~%o(OkWf^)CU`wQ|Xldp@MzAMq&nRwfY zKe$tVDmt*tV0Wv~Ca?=&#UDs$Qeb7W|Jby~XNY!oDlvBo6MknglxfNz?S>tVMmr03 zK;M+Yeonu-FgGaGQ*R(D7^3}h272M=u=k+!yXMK(zrUt`g{R8}@rhch?}v4v@yOS9 zs3T98Tx3X_cqxc7E5ds2Pm6yDjQ6 zV|%@$t2NTtp3Phgjdu4zQX1@LwVEq7*-Nq|_3jK1>{A}{kN`FktJv)EXpuDR=_Xlq>eQ)I=X`bQ6t%NI9Zy$QHa=V-ACi-CT#!+m zPy*l6FfU0qBITHp*Yn9JOXqNJco|;MbtsJGyTcy&JRHO{C0}JFO@}ef$W%Ne=REJ?^Po6ht2VqB6ijYtv?X<9(T=_t!5VHsy>K&A-|;oenDuUWn4 z&kmoyeEk$jF)qt-Sd#0oAW>YDc|4evG$Pk=Iff_DgCd*dLkbN=jN^@!l{B2t0y?33 zbat3crddkU5`Lvcme8{=X)>kx_R7kvXe##fW=N;V=Gn9KDoo<&AitPRpoDs`-I~Jj zEG^>+ZC&$oCZdw&XRl`EbXKbC_7#7Thtp{|NT@~OSqlG*KthX1@p|&|H60@3{ASCl z{7Y*Pw2-OES9x|7N3rm`cO&@G`uPe;ww&8b=|_ych5!fih$# zg3F1xdi>GAthBK*Ov0idCn%(q->eY$O!N3EEO8#BMM+*i{p#TO;N;bD|K!zIWS4Ai zFDlf3^6KQ|)e9*5u(|AuXGc)zQF9?h>?2pXC$El=o*wsK{p{rRv!kaz_C%>?FGV5X z%P93=Ov8xgCvlljv;Koo1}Y+-ut!Yk@be*;8sU|Tb#ZsYMY@1iPtSc6^6c7I9UqCh zCRxyjUuS6guJ4>$}e~gH_I<)lL1T^ zu=GP#*rF_peRdV*V4X{MgDE5OYQ)aDQq){J+P%7hJZQeg6ZUCt9vV|n9 z&fV2`&lz2xn0{7(kP2D~DTz^VN@-z3#&|fMgN1+Vb8GLriOg!oL*(A(o!?J4)s2sc=tH`YnejcDZUfbgj zfxJ1!_yIH8y;sm=w6!I;>uL4zV>|>J{5nqKk`G(Ax2?**U9p>nfn&wGorsRYSyFaH z@wYYMzNTdXZiY2PpfolC{kCQr7m5(5l8tQUNLB0d0fHF<&_f?4F$%V*?o1FywNu8< zISz%GF>YCW;g$s%%n1^xX@5@3S)O`lsat3l%|iRVNeBtY1q@-=C99s@is-AWtdo2> z2HQ_kfU-Wo*ezf#rsb&H;Tm%PgW^6S@iZ&B@M*N(34~Od^_PJpK5n%^0$?9bv@v?4 zOB>bzq8=Mz0{A1;wKj&SAEwH7+au4Wn`_W(Q>5!0Tsd7?Tf6cyr+^!;s9sOA9eUG^ zii}H$;VcI`S2hZ$l@{03w`=!B=Sy^{#h3~A@_%&b4l7651yz*}>lt{Co4`F^MgMgd zd#YDEzteH%@)$8$@J4N+J{yTbxRAuD2Hgw@V0zvjCwGx#1Au1lRco4L*{n+qvfSU7 zg(|&l);j3j1Z?AEHsP2Ck)Tgj@1QFT$T)O`-C+$jDh$U#b%kLymsF01{<3%kgRbwZ z%SD#~G{I@nqLUgP#1H5!1t3nkf&u~cd=R4m$nKsLo#m4%w4)23*9v4Er*~RTe&J0! zeK~-Y>k!t-EGQGFJS-yt^f-pz0hWX%JJ6-z1!=_T7gIWnM==ZLU<=o<+9d;+p%}D) zyP!K6nE;B5r!XB8aEwKO^wgXqBN5Mt2)B?Ry_^EnrGVnEz>WU!L6#W3S+%zqK5!uz z0~52^s$wwRp0d>-+l7%DTL~(larQjBh=(qGLCX^TMyQ5TU)3Py$kJp^irI9UHS!X zrF7y;9u<&tUIYnhlfDWbu!4QSfiu9Ps{FR8BXlw?=haj4qaTrbXK~SImDT;z%{n;M z!xZwj8F=>qohluZ!$r459ed#ig)Lp5zg#{8zp zyXNT}V7Lsdc~PQ?4^uuhbo45Fq58MpX*36_TjnI=1GUuf97GYWf004(IOv)f0u0!e zMNZdv$fT&Ayt`vT&z4q0+|qIAL+%R2`v=6{bEupHuStq=HcKKgCbAiH_RRbZsrM7;~n^av{J&Q69aOPGXqQFqd_Jnc*x6OA0bP%%FGO zW~bqvzXk){W%Xq#pTSz^o+==fRcbJp(y=+F>>YVD7AWuT%VlPXmu}rO{0OVY)^%E- z{Z82Yyo%>9!=|mV#`>tXnZ2sM(gQK zI00b2W!=Wl>YDknuN&^K>U7?aXRn{UB6Nt@7UuJLme0+J;MNqjMmX&zhrAe~Qv%-ZH7ptFhmgA+@b-8{L@ z$YET@w7_zQ<1okYk(V%)mTK~2%gnEtzK;oF*W*UY^DUO=J0wOb}X6;3n2D*$1P ze}L;}OJ%l9=8tT`iumb+_*}!tRy(e?nvkK>} zhQ*wHSLhEfJPi_>6jXMJ*8)M?T|2~OJ}gl5LTnia%jIGkrm(2p+a-^hxZ2ntFSBeK zpnm5p2L;xe%rxI`;H-5waa*jdOwBvhm9t5yrW|fgXnsL0%?v=p#LPGkbdTP=td)r7 zrMbJRmP9Ky2cqI&7AFxKmD&o*MP85OE1Cd-Fz@(Q z?Xr&tZS-5T2J&9Swaw5<{g+=uZB-L$=2$v7grluTG-hh17Z$GRY})lLJXsP3H$0qc zAClJ=23);iqKJMhjp|n&c+diYB2~mffrj*0@Eaq#YUABV5DSR0NE2?^y2~Xep1Go3 zo7}_?ahYE^8!HLPyBMHwwz@yJ%PXIh|54#AbK- z6mlj?sxX`7Ml`aDv&syuk%#ENl*G_Y2|;?pooL_4y(vx@+Ged6BTO%L4k&Gb~UfBVoc-P)tdVxn4olZ>-T6+scDO)aP15i%!Fd&AH)ZFIX#5tIRLs}8A#1-i52L_w1(WPn=7?;wO&21VD^wzEB z*Bw=Kd9F5c)Ubw^6Yn~YOPW->EFPGl!EP~mygQ!~0$$O)jA1RWGRJHH*ofUk5>f+v zGgI<0OwFL09r$aHpi~{1LD^O$E`BOki^f;_r-$cgedX0h=L>~c%Dnw0Q1g3;^)7dIk5K8wld!-h z&zP%}ejO0{nmkj2pDNNLsaJ7ax1(pi#O^x)Z?QgzeQ{qYgmqgAKt(P}<<6Wm~1!xhu&eBc^|K^vVKN%pbWX@HL`xkNz34U15Aji9I!(HU@&(3ICf5hL^{ za{-w-A=R8`f56I*w~~pav9!+DxYg1dinhITgJ0IxSRSv>m()Bb($gm;APJBYhP5g= zS@-=2e!-H5(KCISbcv46ipZica2h^iWc1J;XwV43*|VCS z#l_2vSBsv^PeN4Kd()g=^nvf;xZBzI!=3Kg_39h^XZQ5%Iyhh5-tT?b+go4VIoqfn z!T;?3{@#O)PSst#EwL$Jw&%1DLmipadZ*+prCVQIsbn)gg}b_$_iZUYC|U2vWjXD$ z9kKqeW;CC7-R%SGuUH~ffuq}jE_b%=1(&-&ot@4)wzb~b`=Hp_*z43Qy{+%tun1C_ zvlWL>Kxh)H`#Yp5s3?9n8T$0v~ z^N!eC7vjRqQ1n18@1Ap0N^i9oINfxfU|6_wyYwb$t6fXU*y*|9D_z^^jT`aS#sXr1 z@TOYD7=u!isI?id%W;dS`<6&yX!$AMh57VE3-^gZWt_JT0&0$Mma^mpmM2|5jlzfN z59nOPW5vaeTGjE)0SwFXN4|6(xsetp$xDEHRgOX+iP{_8fb))-ngg3_%hGa;0PdGcLBjeCmng+KA-*;l^E%llL{i7xB zG@fNRXW9Sn5W^I32cxWu8t|EKv0PF_aSs%K9;6Yfrvk0b^ubC=@h!B-QZo0H`(bk3 zXP)8yS$f~=Z2ZYn^%fq`Vi-=@UTZv=CRs$gNIQ^;JkYgMYuc%7<_@oWl7}&-KtBnG zmjyf-cL3+o8=aUK09V9VO14RrR2m(R83>jGa@rBX>?n;j74DpEl#B9?#@VqcXx-#i z_t5;#eUD!~O96M>ci?IHspcAQ3g;O9VishN|8C5nlatM{ITWYVD-yJa!R$BuTriZtUA8wNOjT} zgDr9f*5Qig1&ew8roj(MXe4KbCsS)4(xLV+#a%i@HnAApe`%>^x|6;&sk z^%iBxzP~QHC@(SG3jmzsV9Azx6OM+0B}x?NNuZ(_yax87UuN>8lru@QF?rOLOKl~R z_IkB=k3q#A1wd&!!`q0l4x)&ibwaRbrxUqm2eu-?pT-Ip?9FAH<5^YB&B-GU1|iRa z2z7+Lhl#%=4q-tE8pdu3pHe%k#STXm-lJ;G3nv53Y9L>PshP9e(q0XuDNZx&Ht;Hv zX@yqJ?1G^PEZu94JKe(o3#faT%cvXP>|)#{8~lWo(S8Iuf&;vMP>*eIsPU1l5R^?;ZqNU6s~? zwaXSI^4Y%36p&kl758ZQMKOo_Vl8O1Lx%$nNXV0y7NTd+WfqRHo{KP$4?oUQ=0;^Z z&UH@h7Ffa|%<>X7yu8L&9fAfIFcZQ=91HA9t97Gxcn=Z6G0Ekj#0{Mlwy%-e?u=l6FJF8SR!=5!oSK3E*HTEi!9Fm_BQp&MN_%LX%ps zw(m?QnAK1-0IjjRZ%r_X1v=g%tbK3e2fC~6rCp|o<3>ge_3{pWhwx+El)Y7gy~l&i z-I|@P4l~tjwNsI>%`Pe~xl-?I@he zqAnpQZD7@%D&fl!Gw7O#0i)0kw7}Z1gRslZSl@(Y@3pIM?G5I7&Z1|2Ivknywh3n_ zquS8Z_I7%W!{tuImxNZUlzC5_TTU+5Jlc}4f%XV)DBn8VAiMfR=*rbb6puz~ zTQnfjXbS#?)l^qLv$@QaSupZyTf9)?Zoap9(Jr`gG}>@)u9rvoPpmjczUc%DPjYI0 z`GFofc8%q`zlNY`7p(!0NsWzLK`_70HsZ08WeCcQk{^}@=HHHB&G^o>Xe>04;4#>W zj3X*qYgHtLREY){5kYiV8m$HZ-r~fdzTuirzKD$c=o!~W!#Z*i8)v+`3p&6$!JKD| zGhCA3SdEit=E%Pd2)|(%7X}`};Z+G8pA4N%BTukae88X_<7gk1xwz zR4mXqVbNN3)!>*DfEM8hH+^_|KZfkfjEJN0{EtwOC@jN8zFMB8w>70w^x zJG^$sBW85jc<+Y4yMycoU*%(W)IrqKsqer3qt@N}{_Ed5*)`sP0HuD1dBop;{U`kE zU-{Rc@~?m5Uw^^B{+)k)&ADB_Y?3%6`3aY|RCrwHg&Mm#cya7e&4j<;<(fLl0)yWsFAHhN9ERSc(R z@M-YN&b55iZrw&=uqx_R<5-ZOfK)H3Thv6wJrdmCbHa0`<}UGVP^*?0QHbLKFk{$e zi`OCziJp4AL*K8DXWgw%SMMKnu@wy z(kn@|X?JfQEt;!0Ijzu5n+*FnC6prFDeYaq@{2#D**+crLGz}`@OL!37i*j5E7`+f zCFwDoZ_nDBecIiQ4&*ud35`%qYXUJ4z2{fVq2LFiceSk`N(*f%=&cr+&Ca^PY!Z@e zw@dNAcQ$^|V{=LJ=DnGDZ~o{?C&XkZUwt>0jx1oWZ>OKGE$L;d6AGsIBUkzRu32c+WOS4sI>-ZUF+4MjDRKwtt6SigH2(5 zg;7~E0;dTX`%=^--OKZG^|o1ct;uc^v$~b0xwBx@gsnbt254sqcgG#2lji(3rAne*hlZNg*)rI zN`QO#_#7nBS(@bN+2nNkSJvx|Zlb{~QBUF|egVZ*O>f&c5WVYHOxr9X6=`zWUe<~0 zAWgRcw(X)Z&_iq(v^ID8^!a&023=Hd5S_)Vv$KzF~g-egStdUduxu5&hMYQo7<1~ zw>FeRX$ofGk!e_QZ4_TN23PRNO+hEbK+8s@NQqVs@kJB~R-q;m9i!QetZFGx82Tl& zEOGW8%No@viW+^)jCLvl9@fzh%x}M?SX)-JJF#XZUtO!bsmP)`7}+W~nOX$*Xh31D zP?MDg1{z&G3U{i(NLV6JR!^A`Q3oYdXTlm&km5g6p$V@@^vY$N-5FHONOhg(3Ug-g z(yA=-GmmiWL`_Sk^%mx%5u*PhppS^cWX%*XrPyW|)<(5fwc=~?fs;V_3LfU8-J>+f zAL6>zGNJxul@Iwa?}J>6Hfyh?ckxM^CG{e;s7P&9V6jN4ghn-~iCe!NIEiy=S=o=e z7g<_B+*wh3o>0MQxf%!GWXr>TC$?W-jj6)H?+j*KFSwu$=bXSB5cb;q<)bB|F2YmP z{@sh;#%x8n6I6}NHh-6+6~4pgG7K4cY@W`8_kA_a(R`%q6en|X^t(MKo(>gVHdtpm_4&emam5cuEdF22V~W23=CFb5?bTA4!0M-7K& z&rlT&LYkn=QTEgYN7>sxcotZbQmxUj6&ySeH0BQ>j5S?(VY2vi+T(owhkiZ)dwzQ6 zfh2qT$IG?14u{GxS=lk1GW)t{F8bF4UZ4MYR2?e0e;;DMb`$HsZ6hi39MvMEwA4@i zpuR}k$Al=JQf9k+KpOEYD@2?)DSD_@iN)f>?ezVpw~IwG+PXt6`5s6=MUV8M?T_F> z6JMsB?LN1@D8%_tlX?w?r@t(3-pl(tblmNwA7~gfm`xR1Q_rzwx#vCIBKzWD)()=e zrp7P4EN==Xa-1JhBD}TVN#PUQ+cmqkFIZ=}dkeZT^c4LMwO37V+c*%t`&Y~c31p>e zjJ+nYn{L)Y7YLFdPEWB>P|`>yRwlJ1Ro6)U-*-q^{*vs(XsU}T&X9a>=4pn${FIOL zR;zQ`f>U@Ja}5d45a>5&%79G3j1dO2Ng~CJ=AwUDif80({o9cbH!S2R;6WM`5l01= ziJQ67<(jidPI?Rf8>!rONs(m`$$X}GIyS&W3>lA5XgXLVQcalQQUs7^$Y}06$EjO) z`_Fa%ZqT<|Ih1D13{07Zm}{eWSQw09%FUQ8#6ZhJMMww54soZ|5^RE+NGur*ujM3{ z0)?TG&@#i}7tC^07d9piw0+kg3zHYdaFIfcVUex_h3S|gpb8R5sU3w`f%bPo`VofNVKigTX*%Y{*2Q1XTc`lo=eOQuIl5Az}2TH09*}>yx*dckT~MWB>87p0EXbYxmZI&J$>t z>-{zF%EGlq({4!ivqz=H8~NLdHjX;$!V#tBqUKSESGL_;GOywKV-GMQ^9Ep*%Dhr# zQ~~ND^LC4BE#iKi-)>wKexpdxTl_X&H((m|O<_)j3fo6c=F87xDE2_#^F6FX4=UlU zk(j&ke3%&C7W0F}P;UDxVtAWMx5VK3z(I1z4^n~y^&6D11NW=7u~`PS!d#)*RX+zt z=K8&hrlw8zH>|Q^>LRii54xi@wy^%7p@k{NGji$nYL;mLOj15y74+>(_4;jpD8D zV@tKI5UwQWpReomWqadg?Xb}~(LEaw+nU#IInRwq7gwdxXy=9G<%)|jDsEyK&G&vK zg!_*EB(%3RzQE|YtK_$&x-EOviSyR~)mLqE8aELB&aYTABpexn`x(Ec4w-l+jXj2@ z(+L?y+zC*7=q{2DOcVe2?n*krVIWT0FJThjNm^;&o@cdpdXdlaTJ88n4PL-tCNxY$ z$^oA_QwFjLm>GxuYCg&23g_a#*_3xsnB=3l1#j3`a0$1W;W8Fn!Rf@#Txz$c6KC^t zFaIV}_P9xrrVwZON{Q*r0Fw!%BIZ(~VmZmwoEeeHHsmR1IJXddY4^RmzUsa2_vk2V zrI|4UOQsZ=tE*Rg~^LBbfar&xSHVcCr{h_#9g;4i@Dar-hIq-icC54hG7(vF#WCl z{&_;__W9=EC!N<2r%Yq&Rkjcb*D$lQ8cYVNkihTJQpr*hpiNwtNVsH$nPGOn2Mw1K zfoIvoIJH$%NSRDDxMA%}4e)0Tr{4>>E2Ku~JTj`|1xmR~1TvcgQ;My=dKJ)!=ZRg1 zR}wL&4U-58M0+WKzTnw*Q%M3eeNIrd|JAgZV{G-7mYAg}8>jrMB#1X?I7ZIEE4Y1o z3t{Nvxtwvy7u=FUS<>lj&dVde@yjfDfGrRNq!Ka-{lV*--v?wozV+_z{87jDnHOVZ z8In)NgchKuJNk{_?^k|%EVOBW3rJ&pW z(7XHfrhh&7bA)g94-R{+ZW(!Ns!KNg!~~)v3y%@MN0#fz%XPbUw$<7Yrk|OqYzY!8 z#_(M>6>(rk)Z77gCS_(|%xyZbkeIay<=YX65<_AZCn++n0|T|9Es~;Bw}Qw##XlDU z^XRdD>;YNtG+QUZ#)n$PHy`kTLB!hblCte*x$&%gdwD+Prbmf#JEPr78?L_MskD{q zq}}KO(&xC%j-zJ6$HjCMq{)Y>6BFdF^V8@#=F zJsP#43b{65d`2!j295C+@6R#$=9pwfKmPIwE-ox#9{Jhum?1);vtF^&aI!P5n=u8R zYEBv->3K?`)~fyPszNNc2n)Z|+Sa;1U)OTMQjxs!Sy}Tjq|Zx)0_(4zgvz8#V7F3$ z^(-sWq>|6&j0iXp3iHfUKKHEUf-0-soHJ?*GW$Npiw6nptFXg@k4hb~@n1YPRR|nN z?nbpct#a{0xez^0b1Ak|!XSVG%U+&inv}uVq$6j@XvXv`DwES{mz?D~W;ySBSovkE z_sWIoosb+gA2PkPLg?3o<{fr!6nL+9saSsHXQTCX;SFf7x9llD!BV<@g0Q=A9+j9M ziY>Ny8kyVbKK-reHa?-u%(AnyfY%2OMCU@?LHD~r&^V)OxwS}pw%xS3>x2KV8ep+tKd-oGr1>ObA-kpxzK6GcG0*j+K?Z%@1Cf z?F~b|qhY{G3d30sz0Yva%$RD)2x5g*pc zr~n!7m<2O@9m|T{CGqizIC7&c6!~1>+DP#{MX2C~g%?zFIHZT&x{o?vE``M6DNK^Z z4+m+1ka*ALc+nrWqUqDnEHysV{sqNcc~jd+7XP15(NLb1yfHS(?8%iOKz67~CRt#2 zYYS5@A-Ay#S<wz;DT(vqu}p5~6^XJbNt2jn3?|NIdAW$HB+mw8By%Zzj8 z=>TE}s~odE!~h8bl&EQhFOWEm7yv?q4)Z!0Jvx-VmQsM63G5{C(WyJq2%48K)l=Kob zEMaHBuKtNtfH*Pfv8s9`2c#;OphGs$+cqH-jSoFjI}NJRc4nLsgVg5hmy z%1c@;%Zx0N2SBb%*$M!W-2Dd>mK%{d1q zkabfw%Ns!6#y}!=7n=Sj#Wo<8rITLHUkqw(k)C3?&&L*e!k=VDLfITh0a<1-g~;Of z*}m2he^kc<_1pI0Ev-(=GA~8Xu)kM#c-k-~-4w)cA11oW!oEF+R6`HL1|R-}&Z1>n z9dSj34P&h{iHUUX+5nCG?ssTM_z`)M1j3x6gG-#GO0!<<$D|#5=&8y_YX~6=#RZ@3 zpHZ5CspO?Qp(~MT4n`f;8u!V=qJb06(E+13*z`eTWMLo8ocPB3%_!O1=uq%V@J^2) zt}Tj+g*v4J(mDDQiK8l>lh7N`Nsp>u9W_c#Gg|4kIEzw7`xd#VFT^o&Z~&@?Cg}}i zUSDcQc-BsRg5>z25!k6aB`|Yt-Q2WJ8u$xFcM8~{<_Rjo_rnB8$6$-d|+9=>ikNEmx ztX~`3GcY$sMb<1;fjB><+6B*PXxPYtd(?NJ zyR^o8P&)luLS|9<{j=#{L79th?{~@g;_~F|m&V|FkW1u{C%~Ejs6QYknjL8$%VR01 zP@mLvDPyp2-^iw}b$nI{)b8#)VrVBvt0+m)XgmN7nl(*DpHw3>VLx+)_#xMY?Ro;C z$8)7%9RYqeK53HIkf&(QQ4sTqW-LS$%RT?7~GPg)3Uv5y;6mwUVFE5@upNOoS~;@n~Vac^dXI zSR#8PQWzZFbUKChu;{65acUDu7RHbWrT{6zL=MRg(9S>Y zS`aBy1qT#+8LsftbkdTQK#-$Ci-gBtB~dsj2ATu-GP+ zCRWIvZT!p6?Z&WDnYJ@`M-DDWAIAW36HF&2$bHz_f6&mmXE~SQ(S}VLH3-KVWB!>r zREusb^d+q(N`D4&5{Rr|^xdlrIn|Zo;hMaE?~$w}T}!X@p-A&74TC}8l?MLIa=-?R zK6Sr{k=`9SI3&H57s*%az{HAU!^(v{HO*D;?ivTG8C?k$S2lAVHob=C`j5aAD<3U* zK4#^_WnO_sAakr8O3&TCClg#y#&dDoWK>rdd|qLf3MDzwX%wyX~qWo-seo>9%0G!BeOP=|6{+j92fjuAkFy7gOe2 zJ)DZsK`_y6o2C&RuCDdmei1$VE16bv_yE5uz z5v2Pp;F#iWd|7qmzDys5H%IBxttAx@T9Ky%WNuQ@f<{#s5Cn{x@NKySr+^<14- z&)PkGtS9Bz)K}2s0dn)eSc~ui?F9uh=T$D>hwVdHP=&!vZ7T%sa!PX{{|NAGjG(;s zLz=^4K#mXmv4Ga@s-Wxz2NaH;?U zV|`v-q5!ZYyr%(p{50o}2%=)s0pd1v>(^7bqL4FfW51wpQgbw&l6i7FPjM$0aH^sY zxKZ(#QrD9}K=p1U!T`gXIkXIec?t-Q*5%u?41=3AithppJ9F^Gpl{J|j%-IY&-Ev0 z4RQ)MXONVb`miBOwyf0*;J3qd`;*kIOoDq@UA`Cp?F`7$_^dIfIsFcycc8D3YBgZCf?fd4hVwSnioaRP)9kLfi4)r zs_5RAaZAJ_$a5Z5@^C+=Vhc*{c*J5|i#1H%4%C)cqI5RwDzwB{l?#KQE{C9u)nkkg z&4SIpzVk}jF;)P3<<_1m#;a>B%}Q)*{Pxd(-jZ|!NhsS7V4mVw!tp%9jRCd!XURj@ zlnzkb(0C9|+KMyV+r6Zv$|rz%`*4x3=qEa>LP)|I*hLS+V;SN0TliIELt?kWHjjEh z1G7aI#g;dqdVO4O`arL*NYur4D~BGiH$JZk{6?Q=f`CK0FPHESwzC%BU=?5Uf_qLH zu?ihu7zW8_;!F+&V1~sKWp;(Zw%>|pFtx5)vouAIj=6~aZsT?Bu2~R7lWf^q(QfyW zHwPAPSi=C`c1fG_2!=x4hTljr{GikOY{|DauW??24S-?olONyt*c3KcZE48AHO{&W zQuWfQ#8RkG+~zup6TT7(SL)ZGafKbP{j$LyFw|4bjvz+?XIMl@hEWf_mEi)F0K}FU z@AzZi*JUKlLve%*1q11;Bp12KVV+;ImnHxP~PUIwVI20f}!>k0Ka18cGk=TlQ0 zbs>q@Nxk(^^#f52PZd5Eu-c28h{Ro*C!aU;HpyhDTV{8di1GnRNQbvWa&;6h=n1`E zyt^M-G<@L_(F9shcj6sI&QKP4GGn(+dJXZ!2r z`A0oEi&pe&&JwjvVmAbp{0n`{sg?{#y;F{w!DIVLl%|icK;Xt#p9}KLU8`0asz>X3=KL##Kesv40<4vBYLVT6ljfRIavH2@bkCXa~ zJ@^0dtf6~et#uc|Ok+618nfbzew(FpOBs(vRy;mAJ3l?X{Br*9$;Ii{qw^#9)!A|a zZ-p@@6KFe`41>{dI69Z2XQP`W8wu_>O+#oLxCK(7GJe|#i?cj9as!A+0eI!aiU8m4 z3K}KQO(q}DKAqwQ>CS-s(Hr`D)uK4%#Ii@mw+t{)PNqqTTT&h}?E&!GRfzl!)L1^q z6!MS_x({G5Xc1dmAX~U+_CSa5i+%7)0L_7}%=e@eF3gAGM=AJkR!@6FEeL!eSXO}~ zYd#S!Gl(*Gp`ZJfW6)MQVIA?&5065~f6>{|^*535$8DlERcg|jGe7cNt$y{vJ%;E| z)YQ0bgb0IwWL#lYj^0iUBrr0N1i!B4wt^cs|*FV`uLcT+oYgY3u?P(PVZ&LiK zqW_aIMPuxa{*`#-K_cg5K;5w0{5^*1hADYojPh-oNL+qs2~EuwuYQT+sCh5$UM6XZ zcZPVWOS|%fVM0XA5U}g}XcwB}R zkqly4E~aZDS>5aw{N$N9=3F50itD@XOo=lGxM>dQp|+)4vt@5|eU2V#a&*g(dz0GP zcQwMdZ_UH@wr!c_84qy`#2b*B)BoaFNfW|Fr%r(NA9`2T+;-a0xUl1#Vt?robN>PH zdKC9Gj5UUL;h+Y^4&8bEa{#@|vmalIV;m*eeBDukmc-b)%wR!gZ5K6I+t(snhHY)% zI@MUo32;4OVB3M@F=1f4kFBeY)|p7ND=&r!XL$h&UPGF&peciXd(3dDDqvOl@Lfdd zBfN&DO_wMPg|8x}xdCfUqy^V^hh#LRs}UMQpx>Iq+g3~FiB4TJ$})-Q+ZMp^qy{57 ztY7iO8?5CCq;e3>0Pe;8%O>zJ0KSNyGr+3oZ@mC>@f$y1>PK&HD6Rk?IJ&pJjMJOn zME-GEU(>}EImiSS)#6JcL!9^utJ`!+yA`ycTd*4wCg#}jRN6cHOv8`W`rl()| za8FylNa@)md2+SO3-~ZbXGLW_g}M-Mfu)vM+@>LCqc7^phYg(g=oqhN`I{k2ba&|0FOLzN~rJh|J+2cT-=oJ;oc)DlKuhNdf8$}0-I!YB$A zerz_-Q8?xrIQkqKntDTX5GKdR_d%dMUKJP4V$&mfZ04y+G`=eTOn^AM*1Yg0)}pCv z1}Mf3B@Yaa)+li+E8rd4bbX9a$=8kg-;zMb$xFmkP(A(`5RfrOXSKBt5{7V*f_undN+XiF&tq|UkM}lenK^!n>BCi#8MeA-;>y9n< zVowO=Go%X=Z_+`lmN;oHa*h1~lw*BYT%^S~&_EDx9p%NpFjY$fF$dSB{6SF61|*tJ39Qy@ zyR83U3cS#Vk|rU|RTjQ8K6(vw*gc=k!1ad)%a}e3mTO|blIDYHWLt{L_FwfA&m-4z>_MUFxM~#hQRI1bI6R{T+rulsSV|8 z>A@haheD#KjsF3qRZ(x+Iuw4-uQ*rgmQZo&d)swo9kghyMUdUAilE2@C$Z|-k?oYC zssDW^CS(bP?qPW#*#3OZ`M&enx%`}`x#OIjI&cbp$~44`Q^0pllmQuoNh!=WSuDi{ z=b|T)&>n(Iyccy~NS2HWm`FoK#HfPH*v?$*?VesFv#Sa}l*)#S3(g^u`9`rMH9*7) zIE$#zm{`P8WyCNkx{z~9aPFDWwcR%!-3;z$gEEw@(xk+|nrK)tZ4_G;hOS`EOo}VW zK+8f!6cep%#b=HqNJcf1s2K$}GRvi)!r(ulC8xn1p$V$a0T3hMW7!-t7K zdbpnm_i5H1I_L6hCW+H(q?KuSQ2OYRQw+k%GIUZEc4R8>+_+x2dWfyf}uTG0M)0&!^ z-@NL{q5~g4!aqSxHl#0jJ?OWWmyMLv^|4Je=8yXN>&>s9(z91{`d@LLE->2PZ z(wp**h|z9l?Szb~gzj~^TidA$^?KNb2{jK}oYy(u#@lnAqNY${FLx`Zz5UAP6mF@} zyRO5UqNI3J$K~gMB=${T2r7XhC0$r1y=vcX`*oG9yyZnQUsUsF$4d7}QdfVt?5#rh z6~W8LYxTS$)D)oG0@R7T6YSEyWg0mGCPJIX0(Wj}T*20230b%v zCGc-#$0-RHBwbN*z3~@euz_du&-Rk;z+zl)&4=W|p1Cw2mtjhSxl3bmxL{AdOE}EV zJoJym`in4T=oXphk$D(xVt2Vpi5)n^bLTWjfN-z~W8Y5QFc^`@qc%LdbLpDFy?%9e z{`UGDQ86ylm7S8coe;-O(%7A4DRs!&O;_*+BuK(6o>L&?FphV(wgTIy2?&u(bbA*1 zQ5eu5h2MfC^yuvm)Qf0*u(g#XP0P-*I0<1{^Q!avIgL=5+t=aJo#%hH!M)4UD9iuk zf4vG)8ZUtP#{pl{Ia1^gJAyuv;0=v^H?X|}bR^+Plw8K)GNws#YR4ps!#mfZ30X1i zCL|5fXpv`c@Eu!6LPk|O*LQZ7uE1fsI#>>Hwu-^{{{R*fa_CX|nL6JsecScq%H6F6 za!cl(4OA62w|?Cs@DpV-a7XZ)AW6x^yQ?=RH`5=_uTI}xpOXn0+|hUzCUkJnwD^Mt zv6;4my*xjC|2?jE=qy_{EPRXqyvCIQ28#zv`P$gMvr}s19Dv@O{H*Xl4MN|(msDyX zKN!JtVcKypnF?SgSvwRLumIy?=5Qsz-pr1Favccz3Hj#l2bFhcD?8SnQa?&Jr~DP7 z-`05PNtcuhj`RgQNofyVj2CdM3)9P(Ipqq95lR71T@Q$_yai$c3InpT`y(YBya3{*Ux-{`bvnkN8AO;g3m#? z4u%3|S4|6xEMVE4Os6b>;%uH;TK1MU9Tj9i-6OK_LOX4AqkXbVzWJ6D=BW{XfF(aemxS|5-EP*=#k3+a|b+#`qe%BhIOahHNTfGX#}w5mblwFHeyK{lV2G_!r= zCNBX#2JdsMq0Z*+F7CSa3~Hw$M%F9XUWHWC2>rU`yXXohHeI^)pg)8uqPWrZ3{7{M6Ynmn?5!5box(Yo9N|HSO@i%z4bnif?SZxZe<-n}O_9+x9 z4gr0I@INnHlTDamNrdW*p-zI5n9zGDYTaO|64J4W^nt}MECi{LBzuPin93o0VY$KF z%N$&b<+MXR*LRWYIqq|w`+p zBcM6vE(YdtEI7d@HH*cH6S?--d}pS7`ArqMMHo6TFcEoY!p%&7sV*5D1{*3pi2 z@l{oRThKJ>6T?KY&i_V*rhw=g4JSzw&Rr-cFeXxZpYj2V%{1aPZBD2?2H+;L*T?Y; zRvRo0%C;YRG+YwX0Fc0n859Cx;B6$H90JN30EnPC(zZo?Ts6;)4JWnI4&)nMD0zi%W=(qmT>Y+m_mqW2aI=ZVqjRi2W|uu0on?eXMagFP6sJs7wPo zSMg$?7xA(b6+3s$V~ zq0r7%OO7={5H#XJKHV7;3-c72OeThI;27(kbVw{{psa6473f{E|Lw5AS`1u@_9t7?^b|i}x{PyW;Fa5K$pfh*~tk^%7iB z--c}@SpK;rP(5V3WTj?_66T3KblA)zaetvT8Bm!X0vT(6BvyBD_0F*=X>?#3Cyw?U zs?|KPV%c8LyO>b2RUKF^&;#4XI;6rmqX0!hIa~*mK@m9WJhjy_=gQ*Fl4=v%PU2Px zb(2}8)h5iPGAQmWj5b~FButf1H(^v-ZNl&(($WfkvkaoP(uXkOZFv&jUaVisVqKpN z)s$p_|2MW7^l&Aw)AMnX8}RXITMc!U?;Z@!I%cT?@zls%89tF`xEC$>{v)#oLjbW+ zDXMiA>PCH*7|bU8rMctkFiI5g%{tE<>)a+YNlej)&;kgTwH*aX7or3cNZ09Mf+^~ zWTS4Dq}^mX$Fc?itQ_qS{PUJQSD%f^-cX%-LyS^;z9PjM=x<2xGu@EM5$WC8URIgs zZ(Qm*+8S*JEEu(&J3J|9p6_GNoUE++*(*w$l${_yHvT;=&v3wUkJ@*XfFW0Qu#_|E zx*WqyqZ_orjLoy^@*$k^LOVn&6>UYD!aC4=YSD0JQndhsKzzTD=;Z57bi(ayG!prl zE56=X;;hkNDB(Yi8kas+AexZgC~vni3poK z;qd~_A$FP_hNkZ%Hft7!o^q5~BZYbZQ!MUUwiJpo9`Y3h-&bD=eIBW8h1s3BulI@; zm+?X<=z?Kocn%@==-^ccSKY6)`x+WRNPeXfbxij6u%&?iD-nZ-ywLf&p#xY%%cxp^ zS0$tZ&a*hK05*e^!dBBqC3H*GHQ#=RMB}VjGA^e9NEqzI^^P5D`tCdqSrWm+Z>81J zZWH7Pc6Z53EW2X5v}4C(@wy-(^Kf>0kkt7FYsO6tVKrMA`bDFmfti~X@Sl452s@{% z%6ZsU1DSi&I+{!YZ2M!{j+m)OY#52>p=k)YAGU%rLy9-C9IH6VZ@+1FIhwQ;Ozk=> zSXTrvjR$2qmz&QQRq;HKv98@45%XbsK6TPPnBSrskJqe67CptVlsv}duXQ>0f|UX0 zJ)}8>$^xSPn4)X`(g$^#%P4`sBYaZQ03^(3dWtrj#-jsa{5xTW<<|b*USEjW)phH4 zv&!H{Q82%2k%(zI)UUupu4itnWYP7AV0F3 zWp28u-dIFqKH!kGAU&mtY?Fu07gh3oTuxFl*K_bP zlQpch$`$niE~)l7thZ2YrPdM>nw><#e_28onTIODL&!CR1C}YgNJv6FZcrQyk5}+2 ztzA8j$$~&}19ApkSYdWVnXJNfl~;RdyFs(_%%O^oJH%*h<-k=%qZZ2AZUymercI?{VBA^KS&UTeM8l;i|F-_$i0zV!!9bgI;b_U`GW+gK9 z?c@=tOeJD>mY&W@g@G1?rAe0A;@ZVUn_pQPWwKK!|Fw94YrF)S)uq1Hz!0d&wyTqGzIUeP#(L}d4`pbQ-kx3my zM_qS&v29i-as#D*JSP3&$Fc$}H3fkei^&M&4A)yP1rFI9_QINmJ;H zi9A`X(%5aJQP1*&@s0VZrX{}375o{f7*me?!NGymb6HDF;NQcV1am-Myy&@&rdMw} zLgokK-h^kNm-&IU-ypmO#{}XvOlKIR^**Wtc-U%EDmCrZ?*5=!a0vGktPK0HRL+oI)wl^hQbNpni0h{=sWn6KJ%7qVTV|n?Y zeFHQ$KIUJm96XknCo=S*fvXQsVU2yb^94NdkC?`WhbAr@y09}Z{Q^4T8>q4AsZQy^ z&FuB189K;codT3wU9yfCDKUOxBQC1l)8KJVB*wfS78wW z3nS%@O*OIgWROfSI;Sy>C^j_;ta5-nDiblFW0|nT$YF_*mMuE}&`K9Tz~N-Fgnc`& zM?AJ`HxwkbrHCYBI5Dr==X0&?Od8>LOgc4OGZ-n78+V^tcNdJ5VID?h7o(mXCDf^N zGm|w0eyL7gK(GsS#dRDhkaF2>*vv>QuMIth72bkMV#OW2Iwwk3akyp&DCJLRt-*W# zJ&E!uDZfG>m}2K>NDiO+;=`&yJ6LkX=Pndl(np!fpvqh*FtV+@;WisU+=!gu+ zU_@@OZ?2}7CoiY3&o6G;6lC9j0cQsHY9=F2vc79MJ8%Lix@fJX%B!W#4k zI||H*FVHn(I>qNJm2OM%1Dt&UkqBG}3umt;8O+<0m?&L}gP*79U% zYAIq&0xSSp)@1bWU4U1KQmr&DA0!am%h|JwU5w7sD0Q6vi32C_C1MIf79-Gq>PrnG z1RWvF)=4P%n)ZT6e~G6gY~;P53zz-_Lk_n>BM%r#7=?D{T;)2afk-BW{H2iAT$sf% z1R`Bawv06Rd;u{FkSlV`Lm?AiGr@b1#^}@D6T_9&yS}=Z{xO>xQx>I;d<`pK!Gb9* z*+Zsr0V}2>`a%&Xk;wqb(ZV9`I}Y~~R1`!N(fmRrso=;pt+)~~&Oc(Dq8vI-rv6Rr z(!$gz=btj2X1aPGzMzFHf>O#g;~93{9?8-vv|gtooKYTikm)U$n;L|oa~nk9X-UdE zP6N{gxM>>W@wkd@uqD%Evc@(t{bce+jrw*mu&79=8GiXZNc10f_O0iN8|qF<`#eBu zi~A1Lk01hXjjGQ@w}1wBBdX+tj+2F3uJ0?zy*jC9;F7Wn18});Um=#Qo&s;*Lc1Ik z##H`ZcTbFgRadQA%grjUk?=~Vu1|bUW9rbJ+jHv>_r*km0ew>;y04w$S4!gl$V8Q( zl7xFWJ8Ljy`(I;nTB>enc+#EPYjG=4XOiz_knZM`j=`W2Z53S+ z(iWRk3n~ShF?e{*Qzc)~MxV)?_0ie+hctpq^2C{hdu5rVoM|{tz2(eQF@37? zQSE=Jw1-PeA%LplRr7gffye{|r%W15EK{X(V!4usPzXlQw&3i=$K6~{E`B^*I4EDG z&4`5;Vj$thYW`GOmcR?Q8J=JVMwOZ}OqBSFkAgswoEdDQ?PxYpd7&he7I)Gp!Dd%X z6ig3;pfn%3-IcZ|ZT-2Hmgy96hdZKv5q)0fh&!7Iv^1Zu$DyIxeIC&U@@hA9WA<}6 zBc;u77E>i0_m`STV{nMaX}#-fe{wd@2^Y--kAjp-f`b#p7^pCVw*YVznlFfDu%|p7 z!>%!@(|3%t?xJJNFsbmBdUN@NvOu*+>hu6{Op$!6OKQUn-kZ#a(6-y;g%gmdH+RyZ zyeXkRk9^9i9k=$JgnFY27JWLctvR$wI&H2wv{~AgTMwS%6>@CG><=o~gl+MIfwxD| zT19J^HBSiIk`wMNh>ix}E`pqIg!#}_rJc%8Pv5m7@xHaCgcW-Yhi!r9KX32jo9pja zkMVdq9sh>E?@lLox3}Z?;o^Qg9Y5Ypqv5WidLzT^Lo!h$z!MOl|uab2u&5Ay^(uPrYybkjGHhe!m#KNP=zeo zXlS|my99=Q|8IB(%b*#AKJAusx2St7-I(Cy1c!`>gROpRr0qNR{r6*O;at8iz&ZDi z;5>U@!1Mke0nWIIE7EETKZX3Z-*=vU+-%29SV~G^KSinphfkNZaix~+s&H$$Qzt?7 zyW_p%a-p7CR~;MgR9#Kj6<1Wn3~Tsh@DJ@;TW=dh6n^)w7z9=9Vkb_THVH}7G&d5I zmMXE}fuL%=JGMtz?=HLJq=r^Pec}i{>}_`THtV<# z2rMh{&Yt=9TxPyGJ99SfI0L6vTex0B*HLFcJk%p5M)2R!T#D=-q63Uh#>1X%jiF6H z)B1QGgqeI@Z=ijxOR$9=*c4kj!7ke9@s=&m?=!F4!_7c`-*!1%Z)BQCx1F&|`U8qI z%Rna4vE{*ot)A@;HA-x&i5wGa&~{Gn1@CusxU+ZvWRF2{E$Kj`=tA?5K|Jb`?ucRo zT@X5eJ79rlk6azYgAA_mLakzMs5!`Pt+J{CN3v@?!GmJ{_<z8RR3KKhQvL%V`{E}HVn8N23Ko0y2(xpHQm%a&)58f*;4zYhT!A47KallS3?cZRsCE^3D!Iu7*-FKk1L+V8O$Sdk5iqa8xsoXs3d{$+ z!p>VRrX$xvZ?M%OXk73$8FgVnf_2K$nMaX_>4TV_>TI!r=ZTcn;Qf3`V;|B(_16*t z!cF#}1J}Ml7OZSZ_OH)%fbB(-&~W5YWZ4vTF~UQKj_2nZ>k-(KTJ)0}(%MWisi?$y zEGydXgFQ)k_w8AD*LPN-d;3ZE%Dxm;O<0$wHy;%-|093I#TIz7t{W^z*bJ{OpFg{N z{&|(}PZi}~9pIOt5sT>XWcz+R-j)#O50vq_eD)OG^_O&^@%b0AKfbG|#V@n=$JBs7 z#zuUB*4EaR7F#!0TZ`@13O9R~oI{3%AUVUvSoR6zH^4@BO<;RSr-xLB3KZ-`Tzw7T zuK=agzeQk*yOw5_rTL=2z!RG5YUAu||AWNaQu#XB%#zRbXQp)ia#{$UFZ^NQ${KDc z6!>-Tkv4Qp{8si7o40Iaf0t%E5vPQ^@rst#)j4$?+7)D94cPMBzhgaJt+a}@XSnZ4VYWAoxD@R-7Hx_9pJHHxa|2<$w@9AzdIu5p}L1LdcDm;fqkZH6k$<+ zQ#Zuw*bXw;wScu)0qY(ykcc&eYXNGh0uQX}-z{ z$T<gpSY2JUGilV-f$ z#OFp>(+9pl>P?dI&L>+YvCh)W(0IaoLpx=_F$%jPmH}C_0R&}^=gSyp*H==6k9mik z)@4q`Ij4ru)|@d;?EA^J>R!3B!xe+eG52sN?ke1XA3q?-YnyXTH5>FlCus zz$|5A5pNX=ilkU5D3PIptcspV;w#fs)k8_1Q}Cy{utZ#{n=F1AhJR4)SC(C=3SdX7 zo`^|9x*^Z0(4chnMXKvGJ9O%1D)NJDX9-87OehEmt9zJbJfhN+L@=V(f=Gx(Ey+&P z#6Zz5^#H_%m3v>%T*dXeU#K&~5F|=}>?sHu zWhIm09{dafwk_0O)#Dc)w~V`_x~)W)X#!HgF127J3@Z*oQuhMqixp0Yjvai}A~IIk zR);hws&dP$96Ke}L!R=~L$N0MAS#AC+S~6mrP?^*di&kZ!G}#m-4Sl&m!0L6E!XFQ zJ4v(A-XjO=tiYP>ZrY$^QX5GbQI|$}y;@N27aBXwa8iyGIKONpg>fpaMDvvuw8{WG zkSjr1J}ZpqJor=vX`cDjYFJX*gcRUU!QwiVjH1?{pGwFwoU<>NwkkR&RT4WB=cKi% z;GC=~T{Y)Csr>_;lEF^HFbsz8c?usmY!g}^fB}=H4JM%pF^;=rsoO-fPL-rg6Y%ah z=_oKEhR7wUWB>mAHPeP3=H!?^ zP(xVAtwDl&8<3Pi2a_U2roO8gD_dV3@)y=6xuUHqP`24SQ|bVca;S_#^4ypT>uMQ{ zrE_R1lpK3DxJz|+%h`Ojo=2%f8MF+rlOA&8gEQMUU=BMIG~e(9-nLF5H_8)nCIrbE zJrB`Ow3*quv4j-(MBY}oxy7nMcM&~F(B1cv0=gnrvT$TEeL(UsIwg6iTOYvG3|_P5 zhfh=42Fj}LWO+M9OE&hrl; z6)lg&T|-tK^d~se{qYir|K5=OIpVnaAIC@e)M02HLErQ>_W2dI{0jR6(L++~pp+y_ zM#&1|8|dEkNtXDis6556V!_z{O}qn*QcZ8$FbuuxSMbn78*IrBXxgPHS}emb4CsJe zdXZ&1CMHvYM9&L~{P$9F`UMolbg%`IkB^T}>o2j7#;g_w7VxX53>|p{{YRSwLI=_# z-0g=h@Lpr?kKN%?i%b2fJA+%>5HkD>g6s$rth*Z7QV1)vIg6Pp|>@VR|ao@MsH$U!fN~=1h^j2W98CuGcs2K%Ym`Hlf zsDd2E)QbANUHR4%8K0G0>p82Zhuv6bs&A0bLW!qvj_&Hg=R=!@q+rBEdIUPu8~-mJ>ED zX4>&)H(2sdmaL3zbZ^!PIB#=)#WQyX{HLzA`AGCKS$=OM^I$+vO!^dDapHtZk!ma9 zs;`^{JZy-2OeAe^hhuOxW5-4xg1!%SReMIMM5k}pb?kgrF*9p9C&l&8mo*0$&-5jA zFbDGpomE?I+b|IP*D1Dv3rm6H{Ku)|qD{~geW7WA0*(>T(#m2YkpfBCF^Zh02kFJS zqNs-*J59?UiQ*1-IhbzbGgDR%| zN6$yU*HX08e*k`D>MoM2{{w%+d-GqwA6fc*-1&Wod3l%Dmtx6M9=%qJBBO|A;cq*9 zE=*n+_vp||iftturc7&KQKTWUw+9)TL`GmFM7G#Df}G!CXf!DdmP~P3kkqZzbS>uz zD+s0FJu-20p_usnOVaLFJd*-WLn#ak&Ez)L<%eOc##U5S@|KfIKS2DVpn|HY_tOI! zw&-$DGAaUgC}%oz5y$qKE52j~p%*ow8eYM4MikifVouf}M~Sec6K-y(PBKFg8b7cR zRpxT^N>?7J zW6gJABm4H?ZFBwBX@E2$oDP7;po=`0ih9P-1=jJemyD-uP8~*CkrGbfNxgdLbaMh_ z(-Dh-?M>1u)Ga~TXxeziRyT%7J%PC-Q8Q|78cB){W7atWbukLtDr903C082uxd&DW z_1-f5f-mXKWhc=JY1;E`Dr!qHwL$zXk3p|0ZvbbGvR?HZ5F3iEY3j%+<@iWz?V^po z$xtoOpKe@nzb2*+uf`CwRO4VXpgNFUt_0dF&jwA7z)V`Z2-T=V#g=tgTI@rd z8MH)M#3ag)sAfi+|GwjkWLmZot=oX=gC+Cso_jx%XXmSE)#-SL9XNy!5z8TDF$H|D zNG2c+K|~a;*GZW2HLm%8k|lMKS@Ju6AKs7!qa1!s1?4`Y8JvY`50%ft+>2Q+J9G$2%7L4FR@Iqy$Iy0 z0tQgz_=03H$Avo+Fn(46Ss|wRzCh?|KYyak-?~ytD%)ot~*R&)2=u8$b`uk*_O?RT{v-licYa zNY5<$PJa-0)i2+^DEbX;mqYbvn`?D-;8P^o+);RYbZen#Eesudfo*G2d*NlpXzz zmx#svPYWb37P$E}6-Xg>={6fdInWeBtNE^=>zNTB43Th+w>kt1XN zCg|E^WA39Vdr-PDg$<$9N7fH4p@>NRydEXP-xbKA&xtwuf3xM*%@DW8GZ^8PCgs?*fh`4JlIaWLPI3pA5BZl*nNkyWQs0nLd01%uh}H!OqWY5A>J^G38^ zdn>h9&1zfgdsI;XKkZTT;GndHEz!npt<7zu#hv4Kyuqi1cuoB@(>IEyD|T6i_;&!` z?oCDWSpIz71x0`FfY~vqPEKvMtsSKQBFtTu8$=As#F9LkS`_<0XS3iG-tg2f2cBn4 zhBMc7r)D;Y>bwJB9YSnW{pnbTm0oWzE{So&3DzYtda${Y?a`smx*1)?7$fJvn+=bT zXE!&0B)5l&cYrmtIsESEY;@X=-=2Cfcx8I;JAVUhP+w2NFc5#=r?>|nHlpyZh!_Hq z#26zyE+M76ZH-;KTyGF!`0n0{5GD3y>)r2f$4_nDCdp`!zyQ{@2~Zk~Am3IIgD-(= zgw>%by*tQEf2s%_G9XUv^ zy|OerI~-rOvvzrM{E>)GQpO_LQ9ntKmZKkKI13j;b;y`e?WevD`~0P8jBP_$ZvxCNYn zn#3lDVUua}wt0W-X6S`eRm(O3LyJFQxpRC6L#`EV*;9MDIyE=eY8VzO%dnZ0T>FDe z0xvyENr(qW)Wro1j%??k<~R(sGvmItXZ^EHKoa<;()6j~=x;RYiplsLsP()q(d8I- z(fa^|{>Rsuttf)QWYUo=zpUPx>qu+k3njymHj0vu?Kc0`=evU+RsP5Hp6%Hyl~!$U z+cpsX?q6{Qf=VtNtJ_DX?&5iF8z6}TJ6l)GgGx)3L{ugPlCtBq`R_YYlwvE^+UbKW z@#VR@=bk(A%`Zh(^m@Uo9=wA4j44Q1P67W5A~lEvbVgyh-z0+XaV+{mQaZ%NX1yQv z;T>5s%Hd9E$|FW4yh-fHrK@ECFyQLfN1PlVhM z%>*AnkyC=dAvon4-?$PvUCm2fl=`CAE7gB3n>|FdFmA4{_?F}>p2)P^;EHDA z;yVcMY@nJ-XR`Ue;`o!Gmlq~6mbs;tlx(VXu#-$vWf>9Gh!#K~Wm`;yvMcKh{jM-w zBllsRGq+<597#Qd^%GH0?t7?*Q4lB{<4SJ;-p=dyFC4-|!RNz0pCKX~Oqc}KQJEgV zUX*s6ko|ZVlc-l7BCHl&Nv!tGI3*l*i*@%$t z%95@`7Sn{3xo+duW*h4|lVYc!t7=Vb9Q7&{HYPV|+94PCjd>%v%b^1dDy5Wb>|of~ zcw|As(DE+JNc(4XU6|}1ch8h;8pJ)ycmxmrMg)a>V5IFw0{6-9?PUH;4U(K&j|IX(5l+w zlwz@wx*V{DGp$;z4?R=j?s@DruV<#YpTBim$F1tDqqWi)V?0khw*5b1*r8@bO+_x` zvMdTAwSU?LR4_U?8Xcv%$?V_&d2o;$hxPcZjl8G2YUec_T9YV4w@}*lBs*fTmjAG= zY)N$~dAqlq7AR)90`=QcaVSSDcRBv`l5y+<3=fOw@z|ckHXIph8 zx(Jy2QVazvC_>?3zN7YF7d+ns3N-p+ouYipq~Nw@Tb?awLa|gLIs$tEQh3|>Gp6e@ z{eZW=9KY_Qh%gJIQB9cTq~4!tT`0Vcq=hos-$TT<-Ia7*a7YUcM1)d0hdAIX$I=`MT zyuWRat~_%M8X5PW7CdXrE_S=+WIY&r-UsaM(z89XhP_lDt zcD0yI@8^q87|7jZF~L`B!dtDp4nTiZ6B^P7yvZxyQ>0+wt`c#$)jz#{9lDHp{UZqT zynG3l-5Xk^{CxXKawoUTtLgmqgf(+s;=~bec%`3hO0%b9!-J`-=UjK3aE_PC;}Cm- z*87f*^w|3swO4IZ+c*&Z?q9Jt)44jG0N)dm043Zo!vTd*=H_~nQEWNZ)RA0E4$Tz) z`>mwdR-8DbE%89&NUPmvpM8;ZJV@iz^Nv1v@Bv0KlMu0l0)D3?Qy?NxF@^iZEE0Ty zW5HK4rH3f2<^7-q7i7XHhg+d24;anhI5HzA(yloS#H_!RzYv*G7v)I;fk+n_o5l(V z4Z?3g5UC3H@@Dt29?#&&%aDu?quJ(QLV( z{N4T4g_j&ZA_Ujf@i2s)Y4?MKNDK>dC(HsnKxGkyQA{%m1pgy8r;yM&O{9+8oMsat znOby~lK989wWNdJAX3dT#uSx>;Mn1eqPXk%@D;R>Ntj4@3XK)+)` zgs6CRK}aY0)JUQz!89-fHKA`gqY8z-X;jXfo<1SDijj+5^X|wa6HE>gEO`UVI&3RVx}JiiN!-^n9S;#>s;UXREl*7t7zE> zf{$ra)Zgdf-Pz6k<>((wW-b-cs2Q&VZ`I6CglI5r%!f1(8PO&47*n)@wJD$&1S}MZ zr7mkan{w9rS#eU(Tn#V-981qPqG(IkNk}7-C#tTuaOKESo=>npVB6qOOPOcda{6 z27?AH-MRwTj$;%RaBO`we15BW{Xt(+bzZpWSKcnyysV|_j}yi*_DqE$c-hK2YOXNs zz*z%Xn|=L#cvBZ%-F8M*p7AvZZ$e5%cP+zSBVeDwVzN@aBN+$%l|^sD&F7*Rd{d^T zv+YtuM(|B?qC&8phFX{ZJ?=m04Xnvvy(fHnxEzk4*X!*CiuIrF3dX(-;dpOo7C(<@ z@37AGA!JuT=fksyzxIRV3596F{ddLg+XhoN_NXSy&F$u4bo($`?j{ZOWOTWjaKFUO zuF&-c^}S}n_CMUR5{74&a)14K7gz-TA54x>e?}&WW2Dt`#EiGa3~K(j{PAD4MJ_$G z%q&vc00Ev?NAFG_>qEC!rPQ4>MH=G_eOcdp@ zac0}J$>r`ku9cGvYw&LUShEs9M_Io}%GHKkkEJcRjiJL`ijp9PDiZ+jeZ`NuB8itk zBdkMHpVUvFFIKhVb1ht*wMA~aL2twUXB2EB2($V?&3r*9brm=(p%Mc**=-N{}b z4_7)_c_mCUygvr|Hc)o80*dyZPfJE>-3e>nSZ#09Iu!oiUty$)q^PWXxSu)( zW2NX;0y?dOD|ClOnmUUwshw*(D-)OhejnR;aY9ojZA6H*j(yH~p7Y{!`ut^{=7Yib z$$&f|7b#ODVHqX(n@3U;kr16yvb^0Sg5P2-{u*7=Lu@wt!+1#EL@P!)ITM=lm{Ccd zCwApTxig2c*t{tBzY)@kONuNbvB+;FyG}KU_?l!ard&ZWPlVh=nh8E4c}63w-7vbf z=ibhzv-iuH5oN8^X{5hE)o{}SjpGPGLUurhr+C&KPKBy&w*gCfg|*NYDqmL`0hou60yTYtIp_z(dpzo8uDgB2O& zIlK``QQ+K{rIs|>I19d5Z7TtudPSS(z!^f035Nq(Aj091Zv+0(e+zaKWk$CalU^yl z9bqDJ%EJH=I2n(XUSnr4BEdEoTJi2U)@M@Q{*C2Q5ZyCLz83_@^RaSqTou4k2^NUX=aFmV=6vjyh#;~J) zB}DcgHyONB{hG!?MkW#eN-4A;;{~Y}3DQrYfG84L2{!5rEuLN%c)|E}S6N?fIRg%o z>P5McGz-ikLZ&-SFv8?>m2@4smD;g$PO(BcLY3myDdg(P@*|5_hlYHQ;$xy{mP{r! zl~?Z<=kH#<9a)-uHW0tCW7Lbt2jliSqg)VKvm%LTn@oIj4osnY`obiF6YN4X9F9CI zN1h!cPtULnG4rsbBX${Pd(<;-bZY=)^-{Z$^2pyn9pCykg zuRKkGM^keT8SG`%SFW%f?oF_AQ#hPdrLcxdLoD<4#m=xS}VMG;qE+kr*EsRDhLCR#WDv=hIG}rW2 zC8_Q>N_I@@wed=Hjj^ebHDp|NOWUq4ozgz0lPE*eVXJdhOU?_5U4W-4jlZfE)NeE{EG{23CXM;&JHnO-P18nNv8c-1l*MT!Y%QoVod$ql z20{yB2P2HLaf+@I$mCOu0b&i|ima&KQgkSFfElb7PhLdQC_d*QBA* z3-Z{ZLOb8OkS{ASSM(buS7m3ItHMmD!H~Qp^|vrkSeTF?7_|f-&p}EUES49a&St@| z{r2+g&$Fw=vRVA>^$aaXJ%XdmHx^E9bk0razOL5!5tm&WAHz1QbBIpFc7@!6?+g6$4KM{#BqfN zHrgU+47flq1`3K=T1=#+K(68%f#1`I^kZF0isK;Ni=^eu?#xj0Pi@sE$!way6n<1T zfUz}#JX_@%oB^&7HiyPII!I4HsU2nlj`)ebgq12R6098~X^S4_rtjoo;AGl0ixIza zz8`10x(4mqgSWeiK~V{{)kr}WlX1RLY#m)eTceWRv&DVSyZ?H({JvSnQN2p86vJKx zC~aVGi;l5`z2!n1UhynRNHrM5#L3b2&NZzgB$hV{uEy;{$8E*N#|e&L2&Pjm-E(ze?9C1o+$;gC5IaCg5)gsSGfD zCNBv{wcb7}Mo5bu47YG`A=~3ouOQYGmQBkR1B{>;nMdwC1+W|-$`BLT2!Cbe0|sI` zv>Us#VQp7P=5iIJW7uGjbv3!{&jw+!(s8h;N@J$ii$TE68{)iuE_scky23EctL5bzLz zzGJ2g$N8;Z#33@W4LOcdzpLh19h%#}O<-O-Ym)J)FrXmI8&LJE3KW53R(+i8*wf zM6ZHfq%sYv+@bv46!Z}g$Du82nsJboj&&QK}JzC;jdi7?mgU0WV})qb@3b z!V)u}D!#PpHD^LHr^5N=09|q7QthcoLL0biv`<@|X7|U>+g`KLg=5&=KU@X7ZneMH zuL$>XZzV3fYY=e%(>mZZdUx;3O89x>w0B9kz0aicZ(ys}z3Fu)Dt8wI%Q5Zxy^XUR zaC22}UK8X~PL%f6UYl^QxIqmJXu34*2N;<)Sf&-<&S3@mgf@#sU?*1epUG1(mxg&G zchy`W)h*buJ75jmM@2(#eKakn z%~xX>930HH?m4&4PhPILHr=%#5uQ~9BioirS=X(sB4rtlAz-1#tu)Uvw`16;zP7{Z z2}YIFlTremOcsE`|5yG0FWMK1=?1=_Qynzf={iK^O3lrFdsS7-mPrzMuJQk7+|RlSt*oK*dG{s47SO^?$s5WV|X%z;B&q4o|HR9d>Ll@K76<6b7tq_Gm)(RfTL zh+oA|;EyqJHv3W7TpT^Wd4BKN+xJ5|7_(U!Si#rUC1_kvpzDAv5F3z|;BfX$3}?k` zheui~dE_tb60Wgw6yQq~3f2+BwkgOiO*3m7{kwbqb>t$~J(?=VZNU4B4zIsJf}Kfjr5 z=U`hSQ@8H8+Z{c+elCAw9(}%$hra6ts;dj!{4}6n>0Xhzf{mPp!Oq=K?`>t z*)d7x@Q?Piy(#OED}4j{G{O}8NU|TrrkTZ3FXVr;^qh9-=~XfG@^D!f%Qtf?hY6YA zz%TO`jaS=l+c*$?_gBmo-d66qcH74|Zd0Vqwu@{NAYJsKDFRxeEFuyqkW^fw&8O|t z{@4z0vP54JJ;V_`oa>o0w=L2{SUkaumXC(#vtclbha?k~Zt96wNzQ(ik zmMrN6g^hfYj^KipGC0iC62+yEo zDdh?c^IXV^XeRg=>XH&XyJK`^@11`-{qXtfgHdI@)CJM7A__95v}B7$(+pNj7x)cE zphP26iiR@l@pLfYq@oIgXd}8l6;&-b|Fj-HU{G1@!Iv#<&-sIv<(^;uPV_?U!(KgJGfCCe?{oKL#QtS;Ny-!x%BG zVR%R7LMW!!V^|1L!Z4$$kQh-mhJ6TvVIIy#)&ZAP>k5&W&ZDE9E_97`?R3=5T20p9 zn}(}`N&s2KXjk-~CqcPO;Y|vW}#8Of(9F z!&Yu7!!)zAH1YCL8EuLkkUlrn0%-`D%e`v>snI=wPdRX8p0VK)ZV3fb$gp?3ElYMA zQ-%cXO`07cf{iSX;f241iF`d8&0so(znfCCx?KD0E!ObbrVw3{wi=YAg{`R( z0Fq_MxeKaS6m#koZ#)EABCYj3YP00Mv9GhfNYBp>X+&XnHNcCxS3MhSwMizvN~YTc z)S`A|b?PkqgE%Np8)<|+6@+w-AtxBaUff<_udR%3Wf2wQ*G?m1^M#{Fx#77B!M0An z%oyWK7<$=*xD&y062xQ3g)~}#Zg;Z1T=LEJUW~E1CDlG#$><22qmexaP+(PE;>=B+ zJsU@r+?&M{W;hQC;$XxGw%|fY6yuoXIBtZgMQK8RI8UxGKVIH^xHun&3xG?5E%0e* z!k@bU=z#Ud98${403J-ldxi}~*5{Njb&>QHO=AkQH@>nAC9$R79>J?aV8`Jz@45D% za0ss3A-l8u6VqH!ta>KW`+lY+?r*7CpW0-HmWd!4#up;mIJt}E9z|wbo!RPdRd@P$ zgRb2?KqW4U0UR4@c}$;o&G>5_oOOC*KdH2?;~b`)KHC!Px%m*Yywf<=m}WRcmA2~B zMk-`roJ+X(y7`rvspaOrr<{pf<132WUIrDpMFjhcsU)isntDYfu4|1+1~3f;(_zms zlE&wD+@dn%briC$tHAK)#A-vt=t7ESSxn%fHdjbl;@Yvf5q?KRnsKOzNrXYS;k5{S zO!e&8<#yy>|afG+I@rdh{C`H zq{6ut0Nd2S-6C?3I}}2P>pXdK{o~c*+wa-CC*$3rM$^1w)rM#mozPOL#D(UdRcGzx zUr)A`cEaB=6WvONivpD@CWTQngyWvr8a{!ZHU0`ibThwwZ4G7jGxO+ZWd~7slhmZ! z)3n`s+8NjW97!;1XayZcv#E(&W5~~femmri@r~>EgZ}}&Roze9Fc5#wUvUq82#C>l z$`~6IsS=|=3(_Pcne^j4;m@LZN=mp2ppJIl`oLuL}=>c4cM52aUL#R`U7EbdJId@IX zacau5RsNN+;keu@1*xePR?Z3np)*i2MeP_^=f;+Tq|rxEDHI%gkvI=^*Q1N!&16^~ z63P+khawa&adlF1*j|b5rojoTld07&|j}Zcs-Z8Kr1OT>2ek9H`PAj(cy{G zX+1OGur)K@Wo`%SAe_=L37~z*3~0jxq-P;L<0mUJ!fHqy$9TquVhqVW-JVw|K!%pHQB!WUF~pT!n*hdzfYKRJ0E-hUfU zM$;e9cMqfC^!<9JyYmuh7b;o*0j5gV$iqE1FW@Zx7uF>vezs?nIVYjgagSe)j$iNY z2*OaBs@`^d-?ZduV%wP;r>AtB>Th_{Iy*$xy{{h)qFe{3f=3Z>ok10>_| z%sFR{(>+bX#Bo}O4jjTH6b1qjA<%!qv;`G_4G|vJaiHXyV*HUUut~{TzRMeM#pVJf z+$oEa3)IjJ@<`tlXPR8aCuRPX(s{WcjUwPGS!=NfEimarBsfY#jb)&8%&bt-gCs&m zv8BLOer`0p7~DP#vQjxp8!`(kX22K5YB5hO`mhoswL4X?lBDbLah?p2qGFs>IM9f&Y1s*bOsuA^BYD1F!$J?uZ zdyUs{i8?jr?G?Izs9e16`*{GXIkg;4bqq|jh-37Nwq;X%q9OYRidW~^0a}R`OJ)&j zF?$-JT-dO)8=vPTpa=Cj5z4pHInA4FAbBPf%x0W4u{!0}71C~%^58TNEK$#u5q3>w z3`Rk_{c~`CK7JTZe$Q^l_cv!F59UfmQ1g*1%`zkOAYhR}55AHYYC#pFWJ#uMX=jNAA|GA78a0S1|Cxux+X89A{; z*feXxcV*$gZ`M81=Vmau9$(I8-j+6vMrVWM#o0X4y`}E$_O__+`gvOld0PT()v9He z=jh~}c5iRCWxL#***b(lOkB}GIqd98YqY7B1_V(hC}bVmEYqt~{URsVK`zQ@>r;;e zXnE*<98j$+oM9|r7XbFy?3*xKW&5hiSLB}iLWZb?^%Z~FMXBk#$1}HWfcokeWujYf zBI(c=`es)CB&S3|;vSJ5n9bhi+!os0jn(-NHrzWuy}Q1f4aTESJ@Qc$lg@SL(5N(easC38R9$b{Fcf{yuegnL3%)M}HaY8rb36d7|vtQkA99X>Si z-*@ALHi2wa^8kr`e9k@h!}nkEERUkmAc6t>%A|u-Dg^q^x%FUD@EOAFxJ`{d(wg|q zH+VGD59hvrn?AkFo=U0^rO&vBJ$JB{&Re-EJg#9ceMURvz?s4d zB%yVPcoapNZ_$y7S4WGf+2%&0_VlKmQMj1NjpphnZc5JMIEqq9-yjrs4%(a1p9tv5 zt=w^s&~st;EBR4q9ZX=pr1Jq%tjHl5*P^rrNg_zj+d_C22Si0xJ~9QiI3p80kd$Nn zTxhQn?v7d{m5%GjapPE!xdt&3!Fc=%J4MxRXIM5EL(8Q0XFEd>Tq(X%mj>g{urqSq z5&eyH4n6CYRk(dSw+KYmblJuD|gZ* z=aAVI>6L7d{%@r7B}H;YG;Xn+8VQa*LfhJGxM@0Pucep=$|3ZtJoJ}!W!v?1o(8B< zR_SI%o*PT!!Ki90V^mkw{?&Aq_;t5g^o7-sQkUVl%YRi3op5XU@q%p#c*qrvChHIB zLuy&pm-T6s%fcn+SjsN{xN;3Bd%u;S(O^(v2JlEdj+R2H7e<{EQRTTg58Z9w6Q&@{ z1Qy}tz20vWn(jN~B7=9109|uE36qD*DZHGbjJp>+l%Wv(W->X4b_<`{E!*aK>#;LK z$E9(K{sN^|TTkOS6n@XII1h}HpqB1)DP7P|w3SdhJ1`@ymJxCjr}dK9k?jE0sQ-PB z?c6D}vzv$3w{!o_XHS05H@WAHPCYn<`wdf&u#^J+=R|4{3Fr-lyKR;TzQwiZiLB`v z9yaHLD1;lbVwA%dp(&3Tl`u){%B6BLXOYOJ<@p;St-7R0Q;0;qm2ADyKzIx(izruU zm?uJJL^Ht$kf)U3+B2gsR_=EGdA7Kl8CBLxy&)Q2h=Q0YE!nEjG=>+ZH@JflC{f6W zqM_J&Jn}qFGO93$I--ZqBFhD*T;qr^Lu)hZ4TDfok?Ih8FvZsCxa4bJ^u$#s$8-YGCDd*l#5Ad@-o9`5UUNXL+lId7PyK-@4|8t23 zBZKy&;E{0*z2*s97m@~{J>s;P@5D4iJu}~Ms;FLIF9g0xfgirzy`~A{%xDh&?(CY6 zV?TCa5cqXx`GfA(c)a{_KVL4cZU^AsV>X)}G$TJ8yszGsKky}aLA4xNW6<6hkH25t zew#fmmW!EDEhp2uC=V1O>O%*bK-Ck=A-4UyVtid=_Q3~ICSLVz{@7dQnlu96fV0-L4-|$b zg2`m!&z3j7XL2wxd_DbC3Z0pXewvKzVy6Pi_E@ER?4jtr$Y&-oJK5RQ3I`y4S+_X-EXC=sWH;JiEs=8*JN321*b1D}~F~dw+z?wRESJYLfB0!Erl{O_bThTaf;R0mA zIhEl-KTvh$0M@vJfCdlecC_>U7hlm=8sU8%bngZ@VP-yn9+|_5tIQj2+t`~6E^IgT zFSH;$@1Gn_%dVk8sdC^5ayZ4*wyx7496*=(Du#fIY3Zhw>G4Oe=?r&0YNY!2#0G$GCoTWQDu>8Vtbav56&ZG+89 zHVL!If8Qg?Ho_M|x@yLi3fPv8zH`6Ox!5c>wc6R|8v2Z8OTv&(Rv5wO#-R}keH1M* zn(o$q80_Gg``uaKHZ11rb=N@G&Ya)?-G&hkT!Ja;_~OYICik@6aNSGRUx!qX^W)VD zx#4C<$zmBHC-BgUxHw>NaNvh@?L;IDnrO4a4m{fu{4Dm}3+$#f)f*=(D6LN-#7>C zgmPU|Mjpv64>Sk@(|5cR;qCgj!HC}rLr9RGNyg$i#6Ad#fh(xlpn?E^#%`nw9?Bqf z(ZiD=woAnd5uBlQ3^?Z?am+u!46(2`5D1tu%IJo)$+3u6G~8es?IbWB_Q4H2h{Ale zPZlx7x{)2x;9<4ZE5lO)@)z`=%^@&psM|wj5y~`$TAmUe3TX(arm0H7kf!)n%UNV5 zG6kxMwjuFyk`b`8JASo#pi1fZx+XNHHIc^PpAr&G^IQMs&ax-gZ+F9qbp>4e&0m7*n%1|PUPJ-F%l)LkriyQw+_`85Qu}Vu1)X1UXMrjHkZqdH5-mc z_LX&c_b<(8qQ~pu&CHtE!0_;@KeO!1@%YB-kKXkf{DNIbC?ADy0_#zZhluW!yCfLF zIgkr@;CWs`f#@J$&nGY3&@KmPPOoLYuRe-MJQcVIX#ZDC=(u4WiTF1ZGwreshR0|W+XDu{et z8{~0kwg+||gc0Px%_gK=A$t8MR!0l6#c*1^*M;-yh~odogkldOMH8i93S21mvkDh_ z3dB$Xs6)s;9ZXt(60y zIErb2{{D}D=J|L#T;7nnFW0CD);URVZGMuw@+uPMxuoGU3ZRL2oWwyy);KFNbrBcp zt(MqaN1?1}ltkLjAC?0v&(6nq4!$D#KS-cY=;A__Fdv1S8QC=NA_d#xmFNz-An8pe z5~ikS@8tt&V`4=U{ZKkHj*CcQZ?Y^~cdFWS@m`np{bl#{$DEe0`#HpC-kgKlI_fy>xY3^(s52!sD~&Wb1H=(Kt~CM9;>r;C_d);G~s zUWXJ)Gs$GGT;dmGw^UpLIq&s!1AXdtOAdked#@7Y^+Sq(wZtKH;Fk?2#-KHhpkfid z6%?>_*KwB^T8Pf9f7z=WyoM0{HKB6ABzmy@GVIWLQ97!2TD{~(GF~FJQvH=lB-^^i zbb%FKudpvlM{YLfCun_65+BKss1(X1#?2`gQB8Ape{0#}TTwcW`d_Wgi;k#&1}%@`Nug3pelqb>Lh2(NVhfFDe1Ynq{s>$Qh53#1$1a^>TpU_%8Zr!I?jwK* z$JM3BQ9a9|f>p~`DLq(0`$sJxC!%8JNv}iU?fv6VmzeaqVuUXTrocJLY~&$a{ipAg zK30`q`Snzy0)A!5A&Y8TXN67;a8)Lr(;*j#Y=Gso#4NA|k0tsFm~R!fnW^l@(ugE| zZfO-17exMLXuYN>1RxFI#o5L2!i*_Ji%QRyVc!|=*C&FlW~ z=5AssBG@lJSU9~K46NxiH?@&N@BO5+v|lQn;20*#t;-Ldl4;&h%;-v+?R4I!XfSDa z)vd3u=#$Imp|(dB1ll+CZ9$BuG~)?@vUXfd(@B&)a>VQiFEBl5)Du5h8dx61aT`;cvz(xc zE$ERk;YIq})1ldw2ua8{`3b5tV_y@xZ+h}|^I>C{(JFJ_L>_$gDIQ#@CSNFVe^iN@ zs(uK4S6O>-RSHr^eXRT!59y@`ljXcTw>oNX|ybTiJ zzuZKiC#JI<(k^<)At9 z2M1bdaj9RJQ@F*JN#Mz662lZ>)7Q*4%{?pQ$II{fTOaGVesT_s4~NKu&4AK@V?&Y@ zSb85v%1%&^A<9j6?*oicT>=WO*w6(m1JLkiSY z#_OgL94V=YqoUVqKL#%(S#OfOqmmhw(M2((vc8v0u`f+ZO{djoh=eAy43Iq}9t7Qw zD_fkh)ylj0`7wBo1Wzo46KtFcet+NAuqsL~D=j_(?CKzF9euMnVmE&q&{HXuvxH~L zQRXwJt@*_!@9;WwQ99)Kuqx%2Fkmi%5H{Fi_>$!81bMU`~rPZ zu#r?=@mZJHs=er3vEAw~C|ocEMW`Dr-)N>p-T!G=)#_-*U#K5&GWRKyH_y6^f6W)2 zS8Z?NI1v7xU*Y3eC0S9}&y>VazYyMweM7to2 z@{aG4OK%-hMy^vynIBV52BBK{EVNG7Pq)KD{xaptT$m>b@zZS2<7gv^#{!bXK4k(N zvoPgbPsSWD6$|5p& zRQI3t&!1hE3>B5an0dhA#1lgKJZxmaA40!FMFfHr_tuj|;L11@ijO=M5?Jn&c0fZf zPvjh^NzRCUfNh`tSYu3eTo@rJA_^6r3hQO~U{2f1*HCOwgUnY?3qk5MSWMb6{&dJu zj*_-G+_-(ROXEP9*J0unhs4n~PKMiD$U?iM?46h7R6t8`Y=zi%T|*f!)5XcKxY24( z8!P-|7*Q~rWhsaJEYXT^T=%rH@@(nvMk0;aSr|t-r;ghI-^LzQZsi$iua=XWyUESH zeSLKe|7Vx>!@*74*Mh|!uAymRr*TXp2C9Z_PQ4`a!e0I*?l<13(^$l639W zaI2|+v2kDu&aXX;01dmZ^VdiUCU~VXqjCQOSc8;EN=c7OzlV#fgM)6+Yd;yA{j9(( zxXR@Vd`ap9yb4n>j$-*fC_^K#uGlC~O0CS_ucbvbQqjxfhBCT??ge414Z|lu`#*v9 zsDJQUjm9@TKtuF`K#$WTW)O%}MxnFe*+8YY^>43>h`HZVF#1Pb^^oE{nf6}#to)7l z5dS+Up*b-sfkCpHm`X2?3*Euiwc1Ym$*93+lWVByqN0Tb zXI7)zs7=UV+4Ra@*CDm>-S021Z>Nj-Xx1V2ZB>zSpOuJP=&t2jb ztNCI+L6BaYG{>yc1=dG~gVQ%UF#S$_n5<6yXj09d#&LkOQ?&pCCuXwQvR~`MRqytA zw6h=XKRvicH#Nr;jFWmIUd|*vcO-;AMu}M(Ii}-I1<`PU7pF4k&{=5`_WR4P7Z;P| z(i~KWF!bJ^5d&0{J}@253sVtHL!m~Wi(^_hN!LnJ=?{LBvPQ&c6iCr7U7{%*@x{)EL$eb>J=2IZ}@v|g3FSD!+PdHDx z7I9qCuXdnjT{HcW$C4(@5g7*pg^oR-s5~6g@{FaD-})e09cZVqzbPxHij1uH)%(zk z!RZ{t)HBgnw%jiC38*Ta;0}pF0p3a+8@#mCdObI;`$PIn=TM8&@p1Z;iBX|C@Lsgy zG)o|B&b|HgL@pLzzKrJM)qM12LY|+&Ij%x^ETRA4!b6ALHyB-Q;V8@C?5NtQjf=EtH&FDPsu=>e))+7DPj zw(TDES2?Oxx%NZqsd>FW9XSxURZl7EQS61vm89Ej6~x?ep)^Iff+{pTKv7~p{ZUC) zMqgB;Omlx@3N#PK3RI?Fp#Tzt*X-hj3b=y7BRft)Bxq&ip_~oo_b0RU6b4U*JZDao z%PN03)HB#v>4(EXRgf8@l97z$a;#NH|k4%G}PS_BJ09xt`SeH&VIdvZ^Q`k>y75Rc?Ta6bha& zq0zC(q*_zMrRYIfFp7JRoIN?a+u6tI{BCNGa#5O`8hD}_Qm&2S%gV46p18?Tf*EL8 zsf3}U)I~gqB0<+oV-jsf-#*H9DFqV---MP0vpZ{y=pu?LeL@f8vw;S$Gf`IN;&&|X zs?~~V`=(FXUo)L3UK**sU6mzP&Xud##n)2@{Kblrso)&Hamvgk=YOx%s#>G$7ffct zFqL8Lf5B$)u5=cau@?R>aD%9Ju(R3KUA0Il3%bz`PdN$z@dgxD{1H){c&!HCm$WiD zirm7&e8I4j6^*Z_)0Y0VTkJK>eBrV$PwhP!k=kW8Ai<~KLQklHen}gaG z<47#jvq~hkKp3~k_^MKj#7@OKu}{ZNLVv za~v7cwUz3|ucg;4DtJ@xQ?{n64 z18U_uh~9BO9xkNoDFjUf5=}3Z4ToQ^Zof<)K2QJtGW$Heu02Ty9q@KQ%(Lmi^BPV6 z)0T%20_!xkA)w@45h(ifmizf)KDDl8;~DkabPuKZ{b23efhXN-kLwW9^?8TdW&uh@ zqfvLdxamf=0wYVjle1<3Y{}0?1Gm`**3QncxfxnC?VV(~-nIJ-IbNIk%qaRtR*+Bu zw9su8+L`16Bra6l5e>@?RGN#GQyJN_5ipZ}-^)jXW(TCN^V@+mc4O@EZdBNjI!out z%IqCTA1N>BvS=}>+snyPlW7YW9JVDBEb>kZwhg&(Z!dlb%W8>Sz8z}pQ%xGAA(MtK zj!b#esByq6frH;=7xv5&yjsaFjYEgqbr1G<7dpP1`!Vtih#d$RkH>of$AQ}6bo|DO znc%`BaespBlM)|@7awMtIKF5dyabe&yL%5E*a6^ZgZ%hsCo+59ErON(uPmP3$H9yM&RwPn)*s z2R~e(qqmEA2#=Dd2T;%?w63(Nt((5#4OKCX--)jpxDS!E?N;5s!=FOr2y}wpy5oYt zkstv8gsev zR7-Ye#s9uU{{xLw+fLg+5PkPo3{oU)1j&0sLJA@k5<*qOBNEzd#`X$(*WFzcqLzQ} z%-Rldp#eYGdzs6bIcI!+QRP(>jZPvsf%{xJNL7JA-%3~yCIz1(EVpH9^p?)#lgMyL z#%v$U1QueYP{R-7QA>pu&eL!*ca6_bnsV0KFN_W0(z+->nrdrRmU|F-4TX}Z9VOPO zv8C|J=u@Z)6m<5ia1;D)Z?3NIme(9Ap!B)$un`W{%6Y3+wZ}DVl+WpgDsZN@5-HI- zARa}L79~0=Vpq|_l_@KuQF~fxXA0z#k`PUzsCI|!u3scpjPv2vWJ>O~lmGbL8u=7n z3n9I++fVIov`3o~*n^f!iiHo0g4SXA1>+@_qRMI2IuQGTo=f4B1daqL3SV1diWrkk zLtMxDT-2Vt;X9f%wYY^#8+gy!{cy$mc~%NlbnK5JZ-w%}D8#D3d)`IABcO+}!~9uT z=oS4(vq;F1O)9INg+~}LI0D?dg)bpuM+c%qI&9DTzG?D_EHb89xBNzr}T z#K-prP;+yF);ka#6I)Y5SvyY?;=G{Nuu(f>qrjQ$xE>xSlU>f&s0TT8^=LYU0guSp zj6J^&@mr$~nk`XS6zeUap(!Q04(0r}G0H9Lsxp?QHGbEhfny`4g!1=2fHhPKxMa*3OIcjFm1!II=`CaF}9d>1!*xfplO8Tvaqp)w|YW$Xn%n+f@=R)k|G zt@l;;urNuJsApi2RG=F{eppRw;BDRBzrGujpBVn9E=Z@Hm6p)(o44V=PZIiMfNT>d zPCgik1G4J1WEW%dX&>H-ZQifZU)?-wZyPz1-~B6?z*)&z#mXMAhl6GukH=AN1bAbg zo#e2HvqGzzl8CgrbgUt-a(!?xe0jiL zvJXok*<7TY!N2RMC|N#d<&v|T?P{K9TX+_KjTZbE2IKgCe8k>GGr==Win4WK3M@qKOG!wWY@T}^%{^SOn=%nwA9$$o=FS7dkQ{DIRbaS zPO|l;eA3LD&0@hNev`ZAj~`;brs?+EBrAC_2e$1$caq&jsYuR>#byN~?2G*&T;vN8 z?>+A~p00VJ|GD8ixkRi~|2H^3V#-@S7n#@xFK5!;Ty*AK?nV6NrodbYqGmv z(Td_Ul3?9nf)QCCsi8Ec{7bYcm+)?1a~>Wjcv_tgem`LF84j7`oGr_8El0y)nI`Mw zyjTn`-d+u(nH(<5RXXGkqC}gN$M`4BTW@AyOMp}+OLp_|{Cs?K!%o=ipXzVlolP!2 zUXS7JUmD&{-hVo~n7oCz{{rL_O2`8I0F8H1!O&4;i$5}SK_9@UBzzui($X-5p^MNH zh6;WGyok}W$P%nQW`}ypdl>n|MS%FY5G33E)_Pk_&`YihaTk@G9Y(Gn^4?^Gp!WzC zh`E#>M45)Kz+6F1B(U!Dm*7?6sJr)KDUt-V<%G?nRE7YTV2kjo*Q-IZv^2fO;PAF> zL9xj4f`3BSLKKgSA}?eM0;pucBe~7;wG@q1ZX|@Z#y88#tJK6@@N!dRuEc$bD(%$b zoNuz2=w5L2Ax4Y(M>JO15PlAoah>RSqY?eBSI3W-v;OVXZ&%Y#p%AW%vA)N;$UP&Q&H6ore%W2aCYbL$_C*r}54|2rWiu2=b9SvfrW4v{%fnk4619weyI z%5$~k@yOxQ7oEInr~4CRuTsKTg34Ar$|MsdTWuh2%s2$D60%Q>BXhCX6vil7wP3j{ z@_Whr#Dx9l55!mnpeQA7NusKqn1vP zlJt)P9VB{*@dO++kDffUPbw7-{Zgn_PL$ve>l7SpzxPLPpy0Ucnzeg9XXO(X6-Bh2 z%B7f>eFLkuh(jv~9O1uJB(ikN zAYFwpPRS-(24w=;JdQgpqB*|TY4Z4X9h7>NH}#$GUP9Gvi2lHOB4#A* zzG)Y(EnU3v6ss)WR?qD>tcXR=$7d zrL^h;l?bdFs-4NcEDo&+m>c9Bb_RHwSQVhV6GK-MgbuJ;`@tvz%@2`xly5KeUB&Gt zpr(;^63&-A{wmr1k^>!u7soJ!Wzj5!Y6K|Bate<$U{e%Oe!|;3QRErc&LM4=ci<;P z!W9F`oW-~fvE%`vZK>&_v8CJ{EyZ0ujxt!%z$-Qx7Dpfs^e$OqP}P`#D@#awYmUh< zd6wthj1_XMh;8F(&8N6rG_F(zXf?S!TjSZa!<^&ymSx5dJjV2|YZ1>QuRy9fNfN~e z6?j=hF=jh)gdK%#zCk{tyVjbDS($+lNfse$F)%>44~`+%&?6yG4oKH|lwhW%vJ%K( z05=1HD|{guDMSXeA|_f&(x@M~8O3H>lc8A**m;^u;0q4JDKPaMa}EQrP1*wZ@)|XY zgC1@HVZiGinFTlk+SmhuNcJE~LgG<*9?)+2=(AT~vki@bCm}>^idfutX@lXK-!y{S z7yllxpv%J!b9xYJEfGQKp-)G@_jiy1CB1oNq`W38YwT75jA4=@^xAU<#0f4%3MUw~{w-Fqx-zaH%s91dwAcvQCjp;NUb=$H5pFLZdA1 zI82D7a#XO^25b#5j1%O5J$ z>rLi~vo40Z&qT`+6uHU&0+tCVXk3DrjP;r6q3=X52rgGU0qwbKZlE#|khR>*UMchM z@Vg%zh1}(0Zv*#=VnR%mxaW~bA>{nJ#jv0Z8xW48G{rH${{sJfZLJu-HR?s^gw<0^ zbZ3SDImmbVJ8bF#!6M677?#H0X*X+>(_UY*kP@7#xm(yXI0nKBv3K#&}lR(%c{QB zD#prmjqHr9nwlohssi2ZoHt>AYxHCaN-s;<@5QN@g1$}l%xQ^JdyU-=BLA1h3H_$^ zn_w6?y|+5FvZa zuu(2jz5w@wq244!a|tG8p+n^Eh&_<17Tc3+s<~uj3wHX67qeW7a$E1} z?N9@18G|*T2eCM_tMU1T4%=8asUk1R7Tk{G=(TaIEB0DbuKMQLpYb+APO9vzp&@DP zTBlict8Rb~PVz(8ur;0#l{bexDr5Odlysm#B|2_dY?4(!*b4CA7$kz~L@hWe*?qoA z6N+lYBB!Ya1mAOjmSjDsDx$9ts5U{m>f*PCLKD6YT=m<2A{_A!%sD;C?M z8;P+V_g37IT`JPpQS(4)NG4iV{q?pTCf!kxg8l+ieWJ=}`g%OveT|@VV|`Kxz-%_qMAB*io7$e70FkagLAW zKE`TNKRL}n(1nOS5bTuo0gWS%jU%(OUr&P15~v+yby@}8%AxzW=_xzy4}Hc(=R19V zyg1fb6jl0K0gt*n&l(Qz2ghw}j@NjY#>4Gs#O`vDbSC*Xrezpr^5kU-9dNtahLgE^ zUDeJIbCUsXWtoEBSwWWtP8#2o<=1j$wYP?;Hu-kiN@r*G!ISdfdbvQx)KVI>9UyAT z>i5gvP44eg73S#VScqKH$OVhK)qSX%n`zh}eW%w`Py!3`x8n-(ff_be+0CIDlNj1| znL>O`QeO1Koof)}@825In0gZLlL^=x(sYeXNNW$>nr0H|v37{@-q{m&-+=dRC_zvw zA@L7LZJ;Vh!#dJ^izA%`30)QqYI8(?!+NXU-FG%$ZF{Ra)nnf6(Tp|6E47xMT}`O^ zlS@hxaKwxnXH}BXVx-vFW{0XgEEWc7yqb5>JEu{0qt55azTL&G-Y%-QN4sG~NfN*c zHvwJLYS4Z6Wf|I%EjJKi{OtbAS2Myip`FCqDgncqVRmhF?nBCci*yC-C{qUv&|qyM zUNviMsHiu_l#SBlKf->tbFPk^?Yjb{G_G-)H+#g`*0|^h*FmZ=G&ZaZC)Z6pGAly*l)k7qxn{ zr5E6>^lYB_2Q<&<&Y$;O?1lRnhn7?cfLx+RSV_lGs)(sa+M19wS1U@Z^}`#B%TC z;()e*6gQQ79We7gJoi1Q__61CM=yuy+oa7t(J0XJ18>1-E>tnJi5m71+9;+y!ZYFIsf5-uy2mu$Sgclj{fyc9BKzCEI5~cF5f9UfR zHh;0>+N`Z&r!hOiL8m&(>Mk?e%W`hQj7Fc%E-e0~SKicvpbC({pI-!Olw?u~RCUASR^yzt?%$OCs)N=bkgh-c!#gULHfA3 zz8m#4DSCTb`-pQ6Niy!|=p51HhjcuNQdvr)kv=?61OJ#6G|+*8mWr<&tG|e^8a(}D zD!wactI;x-2x{T3yEjSuAnFR)qd2JcF#I!1D2O&nc3i6RljDYKRDRZ2T}f)aOrrWx z`c|81q&fXFdw#+SQjeV%`HDuQLVD++TuTc-^>B1Az~cc_?1Evh-rT$X*W=fZu|(># z>K#D?;;+Yl*`*WuriI6Z;Y-z%dpT@7(`~K*>KTtz3HN+%<0<5d)e2)U8F+M`X|Z(D zB%~&3$2o6}cr%99?A=&tccHp#{5_j5?yZhmTyBlPZsa~pY8OQJm4IuMPax5`8rRvq zaPFpb3Zr%>twSPoujEIH0&fOb86fnIiwx!t!*{UzG5GJtXCh$tt%iM&(+(fvR1=!m zkx8T292$q(xjz_211Wpd;vSWol7H+qG>i=Y0nhMHP_i zkM?R?`^$H<^PJO$^rIAvKSX%=2oL%6RE4lE0HKHK=Z^L(sP<|qeZ(bg7DNa%?KC_? zcP`7QDCHE9=&PX~`|5&F^qjCAOjoORISln{9m>1V_a}OUD5WC|xV6IcFMxDc^pElj z#LHc7K`q<46Bn6Fu=aN8Y}+YmYJ;|fp5S6z^#QSFd3BiS;9YOlcu zvg2NEXRD`ai>tbI{P-O%x@3ytC-& zUh#k@g|$e1dC|=rbLF1(O-S#J|6>vxX;SRq%DOqacS^f%F(nML0_k9C&M14JoIB9w z450lPhkbmRWjeV-@3#)>Dy;8vaOpU`s`BIXW*(A(-mHZ>Gy{J`23IC(U(8}xqmy--;Q1$ z4lCBTs&E?#_3c_B#q8E=Z(6Uer&{6CVFM>eOHE0Z?iRkO4T<21NFxV1WW?)Cw zi0C8;3Oy$GF3%CPLwYhHYDY4#l3w#hb=CVjr(6*(g^glqBgR1_PFzL^MDu3TY z!Uf+aJWuIH7*Gi&cuMC}VXRX5=V>7m9aS!9VOB_&Th3&LGyJE5d;B}iFAQ5fN_AiJ zY7rnzigZFLO+L~en`#0Hd`C*gnpFMZ-+;+F zua}wBg=*nkQ)Z;v%*lBzTHzsQ1ieD!P?e$BXJ(oH$6F2N7Ey!_OVqrzk9+y9L>1QX z21H6oVFPYJWG8(|KSDqKR^(}T5_l@4g1<4A*sZ@SrKHkf zbW9#3kB2jqf~klQM(A{hg;BRQkL{uly*5s}*Eu5sH@IOmJRxB(MI8A=1q0k`anHp? z5_$65DJ|#I!{Pgm+VnoPb5fc;KAu+G9eJ~bgiVXgR(12Y2HU#!98Lu~qO^-uHTNu$ z?CR@9qrenOY}5Aqdr_13a<;rx~Of|HbybA z^00xhcV0Ef22Ue0({1N~)!2AzF#2{nK;7|RA3P%bh^xWHF8W^LB_L!p%j}HUJt+nR zs3A-C0azO-^}OBAhp-bTxATW*)F{R^s1&@_*&e@Pc@mTYD%JH#uz!9>Y`11#CeOa< zxM?4j>K!)rNqZkr+OdW(dRLnR)=wwHkhue}Z&2G^;Vde7X1 zoCWLDVK{8zm%39Ps+2V$F(MXDz>)9_3Ljmgs5%j|J~X_~ft zEo|?wrC1uMG@nTUXTudKu2MWKEw%DgI@bI<#G~m*>#K2RqwANIdr%TBl&VvKH>$_g z{d}NGc(uDss7vI2q0oicspdUAZdScwv|pX}>XRt+3X9p!imOSBKN|VWutC`^pS(Id z^U~N>CDB&lv!mo0)E$k}`y9|HyKXf0WuT3z8X1zVKN8e6P}Lt2?R+d~jQgXVge?~2 zACCDlDP6ULuFBJir7KJwDl8Vs2G$>l^b-b#*YwfN>Q{dk_yS`ut2eoP{)h|Rd zvoq(MIcsz9HVG5Q>2@6Gz*Wc;1T3O}e-k1#hyZj*VZ4X~!50|wzLOc<#bQ(MdTlr% zH;i)lEHvdFqY@4R8|ka;%&sTmqrCn^NZT$*qX;~aEF_zS8VL6xVjkrR2lGJ4m}n;W zHY5=x7@ISCYtNkxj|UgyfoWw?>X2x-B?^3|v}8A_ras&<9byI#mB04#-^EH({$4S+5mB%6yrmEX1*kuPn=>?+mBBD@EE&|1NbD8&55S4zK8TaoTWsvY3-X3dJH&4_CR>!~HhgNI5IA0rHg;Fnj zL{fliXX}1=ve3Ie;~|wy`@(y8RwqS`b#q*$QY9l);_pajWvloub6XFg_htVz6I!vc zCXS7S8nBwHS)xp3)ZT}=V16@1bHmL*tXqpvBMY(|pJ84hPfqCD^`rlK>yhvum>}i9 z%`Oqa03$IM{DEo(DrCodYZ=~aF?_*h1ZofImQ1`!BRiv z)?b8cy*>Z--A0lmT9o_O^oL#sZ}w}zz0KX$)!_1cc=7IRIynDw_U>wQ*=pDNo9D#~a5strr=yGU=xi|kI=CDU zM;EO&+~0%CxNgJhk|TJv_wwc5UbE#&@*5TM<_&{`|4a*17D;bT_Flife$(q!dYRB< zVk?Sl7TRotB&kj%uX$?cC|hH;zrqv`&M(DM&2HN;48Hp*c-SEghWOrQTd<-53JmQ4 zY(SI0fE2?Hy(ltm3zJDfqLLa#-hH%^=1}ys0v#_RDT?2Zz5EvXP}TDa=J3$F1g-N3 zdIl2(xCQAEHsjDTjoPz+Oos~{p5|xv0@h~hkl-f^l64qi*_O^K9p5Z04_{C7YmQ}I zo4p6iVT`Wp1q?OdokdCtOfAR3h-3N;!K2aM&f&hi`*C}HbGNyfRuz`g8-cw^(6}Vg zZL?qldndi#sDi{fT2!E>Fs`eL%z#NnoE1G@^AMPjL^De4@o`=71>;qvwiMnglciVg z50ld0*%16^Q?>V5LYDLDjf|7Yg9;oJJHcD` zx1?FCWUJ>2Gzyt1=J337)MIqgusxibbvZ-cs+H<6*~vpNA^34NxkDX%5`2=2OE{Kg z{{~6XRb>3Q2je@Liw&gOBXp)bH=yq)y6MCYKijLv1?wjsB35#i1h=W7`~H* zdW!#_#eJBvGXpN=hhnFhiP4NN*y$s{GreE>q52E8Rm*PMFc7@!EA|k;au7T1*|Fmy zumKlE8`K4Qh=YKkR~8$I6iCXBQRI92A^ou~DZeCJN^+%yApoXi+uMAC* z)8#51Y~sgC`*Km9B*0a+)?yJ`U~&$L;3y3N%Sh>zS)t?wWC=1_TMAtHyf2fR(bwt7 zmGUfY%q*;!fw?eNi^tsJ99F`{v_l;jm1~X!H1~`zgFvzr4K=arXm+F0Oi7fM{z;<} zoQ*xcMcoU6+%!dwo;hZY>1-mGED`fhdXc9TvD@fXDoCptw`Mj)y`+X`-_f9*NCJz9 zRL`A*7i!3I8?Q-t!H?f!gH`8LtEW(*_QHEM6tzw$l zwJ)&U$sg&+$qAA>q2S?xx}rnOxeXg}4{JdmBw4BLD;7Pt@64TkXHbee%(}h?Nsc-N z6SjNRGTKSCU4IFxN_i#8YhK|{U>7_R8JTKImH^Y5txdaImaEeK2IO=jg{0KP-F+R4 z+uXzy!obH8xW6x+R5Nf!iLVLnYc_JbyLS?s;(Tius%+0M(keY>xHF$dn`_zZziN(+ zwOSddyNU2KrYTjRTedJH5m#Cxx5=8^U}$nQ>!h+b$y8%W5kcsE5tejow+~|6x9R-I z!FyM3l-(9}V9@Vx)vu}NJ^0{yD8rvDO9L1gk0C6wG%isaEN5N-T~$J(*?T7B9G{^- za1`h?aXvl8#E~sHb_OiVl6BZ>wYSXoX$PCt3a4(wtl((e^HF8^;bOzB-3yKiZG}F> z?vek+`{>cU!gN#Jw`~j2YlL)sS|R>K`@F)qqu*f78r+ z?oFe)7iez^xT6vDUyNH0-i(kLCuwX220HMucIXWc>ohh6KQx~wQvXsfmom3rY~oN;Vz zVn_A_N`KzHV<%=MN~zi$0NFG1{md8U53O#CVm2vY0-v=BpiGUx->vWjP626z?Ws}D zp7=~YiwdV)9P7vO4%T9C(84E2Xr)09bCpgOq3@YW*Ss0(*UqPLs;g^|u045EX#!zO zsEtG$7}zT38$rg|duVGEe0DH+OnvV+%hiYNDvnAlNehCb2vC|p-t0TV5{`y6->`z< zIxmrd%EWk96jn4CSj1V;Zt0rVS+vBzY;ZO1)(M}`zmB$K-u)5N<4+X_FioDETEKPG zc9dONh>kShKJhIHOUA-eSNf9(+8tny2lUf#NQqI6zF`KlJxbhw|T@3z~syKK6Z(N+jZZ*%#0?_3R|bNd~OzQFjRkrDdE z^+MTV-e2wkwlr`kLPpJv3y;)!3lZWbAroHsTp^G|3a}i4K&Kl2s%{&r#xW7Lf>GT0 z{iUa=uDOO5h5fKgexI!8fs?owNyxX_|B%J2pv;D39;Q-7y_h1k1jN)PYa z*vT)hcg?>ux@pX14{7g?0d^aE5Va{EebqJm?ySB_OeA7h?7+bU`-(Uv%2+IKYOb!W z?26`|WX!@4IS`U_Q^p>0DWH`(WCDN8V~_H~@}JO6TK%fW51G{f%EW#azW}{cOK;mS z48HqU@Q_0ibn$)7ngCq`6d1YzDTW<-QEWOECX|(`3v^xx~g*y3T}7au4@59B{*9k1qG&xePhHjT|n#5Xl!F~o9e#Z zUfr*Z^;iZb=`NQp_GR(A9doF@i7%vU8}MVleTFYYdNbOEr2cB^UcX zm>(*;mAa~CQxWZigR#R|w2Ia+P%DBqbMzVdP^vnh#^q5uPe4llG6nZ%fUi-OQNZws z9$TT%Z`7xpXA52v%5xCbcB*%~W1Hi|^x3dQXu2Rr;^qUFztA~|GxO;x*$lJU>-`rX zoxu~GJct^dZ%}Q*NrP6*?sQ`+;{u)!Y{OS9*z1gy!~cO7P@VxJ8Vt(gUhy|<%lCaR z8HlwZ{g9rC|K8|}f6q$)_kEn+KKl!$lh2ORFc8M?d5Sr3=vJtG01A{{ZKc&B7O8OC zi|b4h3ukQE}=!Mv(m1AbFSaHP~@6qEokS5 zVA_sBQ4Q8;q$pr&T<8@WM=!x!RI+z8cq)DG?{02C>~FJFamk%xIH?G=i5$!!G1hQ0 z+{uYd5M2ry1ymQu>#8EvW0WE0i5_oU?;Rnryis%(A9sb%7+&RACg0;0L>_WFB=1d@ z5wlQZW5`fD9>yu0txDX<@xAD>A~po~sSbmRojbw?j~G_pkhg8GjGas9=m{{=%*gNm7!C3yH5ycJ^wB{)PF5_38P*cM; zAg3UZGR9whDA69~d9#=p_)+}?bx}=k+b|5h>sRp5LsA6E?hV!qMFSKVwqYHxOAl3K z+7>2@f=Jg3hW+08yESkNKYGv5`hcMSWU~OZAU(qKd1xt~ zwdQ`=4!7D|`d4lZM|<)Z;Ts7?=P|>+t(61MGh0W)$4mc_a)oQh5WrD7XW#V#HZ~Bv z!^pZgwv-1ep5g{lK&!Pkk5ird{Pghn<@vEdRhH6Qfypv7o+bO!DA>T{rPmi#z%*uu zx~Qp)cg93JAghQ)(aQr3i6TbPTVx9Oa;*CW^Ifs!%6l#;J^i)?Kxry+9RV68jWW~W zF(t~vFi}=A*{0-UcXjMwN9lF)JB6b9m~CWM`}XbSw$1hB&<)myt9Lu|zV~NAw5Nby z>(YhV)6#*zHHwDee+}l30XvT=KfV1WyNm;^{W3M{4N0NcGrN4dl zmgK}2#n98{fjE}-{nNgP$ypxdz25ksM-Iq!6bll@2_x{GQ!Yss5*aaawONN*x`B88 zXS!k|*o^yK-y;|FHfAaLm`RrUG2>(ssyDBNrWyI!dS>=tWL&WeizFd_mT!2xiX@?F zK$6&JsQ|%gnDI50ah48Ao-hjU?qYVY=-$73d;XuRb7ZBolo6HWo(dAgLh|^wkSrkg zv5a5^ED%}2eFlO8rSZ7eOX->kFk)-b;%&Chvy`P0o>Gw|Y;mFFOU6%oy+U;DJb&<6 zj+!psrFS%mgExFttYOD?;S@bvny$GLKcND=46g7sACeU^FJ$S|*R+rkto{M3lBP0F z$sa|)H&jH~9htB@#z$Y6e7#!JI4QlmrMk=#bms-9sSpsCNobx%T&>i}#yzdg2c^MI z$9N5{M@t0xFQ<7IiX%52rlfFWIf7T}= zXMRlKJVcZWz&}~VcMv$q9uN|Wt|WiWnJjop5bWv7yd76v28fYW&oL#?)dXMyFl{># zUVyTk%o@+7yTz(5+e>%nmpedZKZ1NIjOpL=cYI$xbKFgfw;jO zqfG&yEEbN}0!sq=PRRl&;HhSH)9)Olt!vEe`%ripp8n#f51T7dXj6=~B#cT!q0~BT zsO430+l;2#vM*fk(pUm?<1Y}hdNLznnI~ESgStZ3&5Uz}r)ry0=F4rmc*8l}U>WLT z?#9zur$KmNn)I2lA)uNg58J;oD0;d|37B8%kovc=zv9y~96adWcooqHNNwWKHKL0D2 zKnHg+x&_dFM$`Na)p}X7aU~Czq1NyACE`*CwS8D_wu0GKDE6tV*4@1+>MLZNi1Ank zng7@cIZ*KT5*kg+{UEM>R+U)nG--<79`w2fzr=nWpfbJcICY-)3l(h&AEQYaLP1)_RZ6VrZCO07@&HE1ODTg?eF>*;=7@Hjj{ucy_N&z`oAa z70{lgGIX6k(}0C>3Yb(Do{;|EM1O>(N3-s(9^J0_dC%xNfFvA;qe{*; zC3#w-8e}<3uj%TNt=I#u&FSHnrF(Xw`#$LS4qlOO1fNIVL6s0%Ucp+F^G}MTwz1$G zF!dh5^PZ(E7|UvUsfH7Lys@kZRt!k5J*b3;y`SH@;oSEgL zWu>&0F+CzLrkc&mm#V=dmH5up!XY_cHU;AcdKQ@fs*^<{;P@Gj2@L`@AS-Q(oXAZ5 zO!23rtGdbt4$vQ(;{XF*vU#h6WztM>3&5?M3P zCue81vteKK*0-SWm6HXos4G|$&LQyaF%De>)8~qrx8U$wxRan07#~Se8IEz zmC8=8(#GnsXJExlEqq9z=<}uFs8PSMT zy@Tj6q&pKOAOEtFjcZS`vbzZD3Pr2J#tyNBF zR6%v|GF`s%rtp0V-|p$Rfx3G!tlH%cYu$&--_I}isf5|U-Y%5cVejbHRXkPYwAM^D zN8gAj4yD=MECFS?)b|?OuCRRFECT2$CtR7zS#Gi&b!Cwn4#5((;#rXfZd(Kth`rg! zx&1Lgc#rhg1Vx;Mj%oM0WEDJVUC@2S&P?CTJ?fh|XSnN98ZsLi{~P4G$aTMJnVJH` zGqh_07;rm8;DS0Hg7!6a#lg-MSlE8-mnc6qAyLd4dEkmQyTs)&Lo5~ihmRjxpXr2J(> zSEm;J{L)gwIxbEfgCo`8{m?|C`zAdvbtc@}6$d%96@92+#%9+uCEWC!<8b9mhTuYl1B ziAMVYH%LG#ra<TWi8F z6n@XIIQUY9nbww8yuc6cz{H$;Z%Z%xbfqU8j84wm%xo z$S)xVKV5B*DOn&ew#;{o0fiv!oWpJpGsv6s5rf%TW}T6@Qj32Mnq1a4j!Qm?$8k0m zY02YpAts~bAd+;HWIPkubXuWZU+8_`;t%CnZExGQ7XI#Eak2%8+&S?!>|%g>le^S) zwqRME+3qcdW>9H~vN_9?MpAKtHT&)Nkd$P-+G&g80{7}eV$tV~htGMV|M{V#_M zcQ8loKA0B>QPe5YXtLRoNkB;w)RMy6cPaVJXm}0CPPxPl{q8K4ishi+kEs`)qH9h$ zRef~K3U&4kPq(MVsU=Ymi|CH|D3WksTu~8d52^^>g>0TGz)ymR2W>`inJG!b0Av!! zkx(cBc(R^T0TC`fNJZBt5^Z1s^KeVvigI6qL*pn6d$9Ubd#+pBn%*nm{}qomT-&gT z#0oY{E#c;;8~DfRcWASSl7)T${;Q1phmi3V?B6%i_B#RNBm^%cQo`t7YOPZmJqOz z0*0_BSd5uPhq4b^=^u$yAR~-CC5s~7Fz!bi2@ww;U`a6W*cuPTuS&{v^-u`-k&!9r zp9vF~A#}hx8y1G>8Wuu?DM@S?`lzUB8<-fEo6Y8QL->LOi3!cWIflx*pCy!&c@(Ys zh>UMt^RBbt=~Au3FI`EMLZ`S%>=Hafj8o>JJAF&&YRX*eA)ax-76=A?EH)nx&5~2_ zsXp%8msgX~a5kR&=1xa97n2M82nT0paD01vTs`Sj?8$lRfJ;12jCSc1H4Fxqql?+= z$;iEYIc+|{L+!Ye^E`*7cIHrXQbh&sl% z{=JqZ1x1YV=DpjqC=$7DBbfHZ%=jf3J z&u-mscY!uphDOTDmNjwa(C3{pLbDw2M+iurLK)X_fT52-^`bR(4P8WF z+T|3*tqD(XXAiKVGzQH7-paIFW$q%(@&DSSDp+92z-R{#8!&3XQBH@b&HcA_?f8{@ z^%Bm{;QO!fX+e2b=(i52V&!oUEZ=A>e=b~>+m-(oFyBnBW}{CYbnTmefx|n(}6SPEKZXY^rBpr*cCDi+tvN2K%vx{JiFS1Y6F~$}xZQ3xup) zY#2G4T1FfI6k%Lu*6eRH-&)ERAb(g}x?_ji3B+kH(~ZN5Ep1z-eK@cKhm(%?ySjqX zxRR==b5-)jK`C(*?-1Um%&p0zkr?5Z7JQi+-q0$fM%kXdYA-t`&w>YCcgYPuvsqRa7ZT!qiqP?v`2-B@5!n!dF(y&~P3TB>wUs!(OX4Fe z1d7pUYF(CZ{lMeUaWpn+vt* z0SMya4ynm{?vorRUm#i)34scM;sX(_b5SU|a$SA88*+`ef{hKF23h@hnvX6Mr2{L| zmPE z{^?U8mk#6q^O&pNF;_vS3lf~=HKjBI7f@#^RDrHM%hhkqOIpkL%rCfXeX;mFGKTcv z$ZD!(&D|q#hQ`7zsA-)_3rD#|glF2GX{9YQa$|UG>GM0U8bsTyGFMf=sJmRM!)4U=S2PaubkxMumf^IxcS!rTxIF|$$v;BuO#Dm257zT#fu(#fles; zLT=?=zWjnFSdbVIMFyonX9xfa=6aq8eSm%-4#A z;w+JZq*EmFEMr^(E~5EjLO5b@xE7Ku_5@s=Op^#?iEapu1qw*U(sY1s{#5$vH)VqV zZzx+)b^D6(8?;K~99_P-MF04^gFY67ASc}n-sh8H#1`RX#mFQHK~zv60EWG3LUD?s z6bpgQZso`2g}!5vrDOqm6-YgwJBfQ=dkB6RPnK8`w39Cn{ex-U+}>NMEG%k=LUMu^ z+8G2oLYQ;B4*E490Ew?OU^mQ)Cz5Of;yI-Woz;0rW}t=!XZmytXNLWY1k6d5`c=eNW z&Q=Isq0uimeoN$>#iuw;&u$}KWY(QF{sHVIgJTV*PygQn`IJ0fesfHRyxnA$W%Fv(R4lR zTXK%-abjWX=UiWhI1w!85P0T1Z1t`gv2ok*ElZ`aVV7`UfsZ+X_=#C`xA86<#~+GV z46OGL&`xUg-R9lkUql9$iAp4Y4nX?83!y(6UT(PGBu&3*O@*FLs>R_6I?3t%Jg}h+!})hoNQ=MxZ#1&W z^L~^{!0&Ve80_ejxWv!{?L<)1RA*FIi|Hh62Jc22pedww(m(W~1KK%TG7f75MOjO# zt%?S4Gy$aGIq2)m9vJL_qcSkJ)U7d6B*uWi$BKf*+ItP@`_vK-`i@AIXXgl(JQO-c zB~GZYCk?w7f&wU}5lO9z9OWw9UFjWFHJO5DO1?%LCp0M>272R;Dh>%mN*v8gooGrG z@RFjCn9IQ9#y}7JGh5vmT@o&TOBt3|1fF7X&E6&{WHR$qx(m0grf zGmRJ(J;|*v0g%N>^c~zAI!fQWw|nVRy|UF?9CMXk>;cv~{Qq>jLgU`CO^>C-M@MKM z{fu6sgD#XG>TuP7*Z&s7o3r7zKE!DBvw?0FmE)==q33MJ@{>%>RxzpA${RbLDt$SE z1f7jn`?R7vp9+#^iI%7~b3W)42tH7Cv+C+EIl8!8M1IKr36)V)HV#wjtOIS&w!Y56aXI(@Rakj|hI;dx|6&C-@h1yPJ8Hp1M}j3z0AUIZ9QQa~YU@hRsF zXiJ{VW~x=LU(D1UD`*mQl5i}%d;jU={CZdiK28&QqxYN#VF-RGhI;clWPBD98ZKWB zZ$rJ4naf4`w`d3<16J}4G)?hLIl`zau5U!$d)Ms#?OUrywdSzK6-Jy|5<>(=6@69B zXWD2^z#nevjeH|NsK_hQ_rNmpm&UeEJzIlYPhoyRwd+%_qJGCoxD%za6HyvdyLVmo z#sWN-NKbv|4*V6muQsvpn zuP47;oOOEKqy46K(WejR*PRzte5~5#c5Bcj+ClsGiq2ixsrgick%339skHAMnEN!K z8e%+2N%3U@BY)0xDZB14?Vm~NIlOg~VCQ5dDwer$W40)hV@=Ueq;*L~IG1dJp)&)r zYh5;k_FPpUfHL8n!PL&l9-&$&_f9edXwlp>2KEc6`#OmgSAJKd^RVGgC)-BftcBYU zY7O8*gauv$gX&W*qRcfuCGV45B1IR8Im^=+WK7Z&I-(`JA$5}qC6}e86HtsIMk$G! z0$CPH%}hWONClOCQeBqveDyE@BAf$}$~`N^#Dt(|PN1GaM@CY%0<854uN(JhQ?<@3*If0K1m{~)&jYrCEk&%{y1i=prsZM3y;3dk z?e93%AEk}Hg3;xh%klZU>+#!@f1?n++~41?ZWjUQyxeNmwtlrSKk%SmsfC~#w+e1w zqnCX>F;u}`AC+8f_`ZKm0XT_I_$*f`ul&N_@Rgqm($EKTFx6^+mRjZo3@$1Oz!Bt7 zImZ<3el0G)+cn7xjvU8#yC}op)ba2q@0#}B*J|GAXapCt%Dx)hqoUfo-d*p%eUrg% z+b|4U#~M*!*}p>4bL0} z)wCKL$`f8$1HKj>q%crhT|yJIS9DJitqVa(RWOo;j*QrATPp`r3+KSqHc*Z=dVm6f zzFmSc9y>$H!xwOfz{UOGSjAN<<2;J;V)VK>QN-xvK`(h$DS8?|cprS|kXwxnW`8rF z({}10Ji_96>^cTRp_QDghy7ks555c1FIQ2KlKCt=^|ZN8c&@-;KQmmeE~D%EvnmWE1eI~ox(a3?IoIgQyf+&zxGR7B_ z!AHK)$aW=m{4_*8npk}K(e#?AB^8azX*TL1Xr@5S%dcG8fdNRj6hezJU)C&j)jWEOP>p0RQ;j#&08hBsh50JG=pk zOl&tZ#Rm=n?E8I-zx_Q~B)wiFmZ%cpB3z+x_3iipBYhUf$ziXTDulPf`w8_T_D)0? zj-OmibPz{}=AD79{Cz7F+S>-L+v~u+zkQ$TR3iWVXNu`s$R$eqYXK%ncrp7GT|LpU z6mvrBjrR9@un#xyFp=mAjot@1j^GZT^g$TRkcr*FjHL0v+(1aAhlImu*NZ>_QC6TA z2sd{n#^w0r42TFuigf(oEVNG4tI;SyHyo0+h7sx!+3KFe80BdF0Ta~=p&^m+L*Nl% z5kU}Xls?;4$57!x|D=#B7N+_*&AJD>2s2y_GRMEC$cyFb?t}9e-~R2Bal+8xYq?@kSjsl5Ld|t1 zud1qLFrSkr1<52lF$+=At;hUCbEJVVpP)eWxO;jXE+a{i0m>f^bnznAy_71U~+^4TjT_D zjx#g{o=3rNlw-uDApE!>HWWgF$q_N7*`gu(%FhR5y zxVaOaN9Dd^`MZ_;O%W zy}27d>7q0;doE6V&q3BF*(r>KiSJR*4_Gxf6iNZ1on_?DOgNG=k<3Vih3`-E+SL0` z59p$L3U3PQ5G{V_#zY-{Iz73%n2b*@&fiU@m*cCc{SQa*?Mrh}IcDfY1`i}Y>|ogl zYR~;<@vptrT<^KVaBb^)XRM$aZ>$&Aps|}Q76~h)6f39S0C|*DR5rjcnX@ciH&EIP zCR3AYO*Mi!*}bKldD@oFLZ!2iI)R@?F1KTtPK~={>T0KNAgpKkqN?D$xXnSQrY0+A z&p2wzO>!FH<6ggCLE%d;Wc YRw4X?45{+Yk^B9B7qw*H-Kt4F1so$1H}b=FS89_ zpL)gL9ZtrB*F_YO=C^f8oeE+G-H0v1VX+(IMh9LcvND|Ju+f2(c`HY-cRx}&4yg#` z{;9xQ^ITU0yo0KRn$!Y12m93R^LlkE%HK}jT$*vPbB`;M+Mz`6=ecuOixTn-YA2JZ z7Wg-e{Gk;i63N6-wiVmpwK7%-;bN8r+Wm#ieF)I=P0A=I&~I{BBSOfpdp!^5!pGM81|g>lNxx_UA8Gr`O{@ z&7qaDzsaLrR@>U85|{AcM?x!ifnFM7hHJ=G!E9N}_-v}emnehS3*4_DKh0-f zSA17QE{2wl`7I{>47+PKY!5>;j>Hk2XCjqLvnj$W$Tt?{i^q7En0)GT7p2Lzip_Fb zbk;Z5&cX8FwdpGb(xy|U0$7h4=EK^r{0DGJ$bPnm{Th0K_GhaU$REQb#K4-Px)n)#$mo54h zj^4u0u)Eu$@5X7QbMk#SIy!=v&3LHh<#raSVA*Wl9?iC?FJk#LYMpcQ5yGCaDVVw3 zRxJ6r2zZfJ2V0XLt;E-XJ&)Ca{ZP#LBuK%1c5!hzy*NJ^*Ht!o+K}wyM|iQ0PoT!j zMAJdPDOiQy$CBas#rfN_i<5uUnSKJKMpf=Ty;2`RZuV-bQ5zG6A zSiQBG&HF5;nY@Ec;cbILX(F;QD$Ed3tK8;u0$=+u$yzZ8uuYv8eE5WJ${dCnSPuOr z5mGFnv(siUc9)hfbxKidEq|+4y}r{H$Ct8zn-_T*Zyt{9%Z>w8Z3{PmR$KiN=dqmZ z!RtBd(`-tj_}T~l0P^b9nuTM3oySh>_DMiKX7T3KtfYCnt%W2u{1L^v(}zM*K;A_SC@$n#FVAVs7bo3r8bA=SBOYR8Z$rnc%~m$6jmIM=;2%QSVQ0gc8d&D7{=){I5}=$iA*T`?r52S?tRas^Hus8e9CrQ<$^XOQu&WLm zQ8tgad^L9=mGGRCyf*1L+w@(R#C(3L>#L~Cqn z*XCS{XovkzLKM+K${)oL)Pg@ob!%^XQdd*suppOIjxMdjV{Kpj``lWPeRlf4F9ywZ za;6)QmHb^tOHLDxGS~aPJFSeSk;Ovyg>^Vz;>}{7sM)BVxQUzhXOs$0Z z)cY^ZSZ#0HHW2>qU%>)KA$N}54;uzFYqlcw&7PTFpmK3KMN_Z;ux!#mPH{hY4T!GO^%$draaE`f&XW|jj}=bWd+cz4&}X>?VLz?G`!spC_!C0)UU5NJ=r))>dp01? z$SX!};gdRo{FW@JgouEKAqnD4&_LTWdVyRhDoZKeyLPO(CP;sY+ zP(F*5gk(u%mZn@N^d&6YE{?dGn+BxBU z!}yNr=sPYpWEZP7xp;FyewciZqZK?`+222YS9t#-0f^34C+qUuQkKzV3T(RId^3Su zGte;B)GT7P$Z%+C!o_OJC3^AP5QbAQqJEBxF_@{&*?=v^@S0-T+Q6+9FO=QimXPR3ZwR()K=D@GIfhO#ID(TyOj zO%DRDZwu0whjlkqpq)pWEfQQ7%Z!Bz*D9IML(ZfUS*U`Mv9K!A*HGc&I65(_<0WCR zb6V11o{c92XYOgJ!_Q8-Gxv4UVehCZ92#U6=J(y1(kQwtl@bi4xsP!T#8@#Hh*tI+ zxWhOBmZg!ib{y&}Ug8@mK?QDPH5FcK*N>x74NPAGkPTL)bYGzjLz*PIRAE4ew*qD1 z&fWM<6E2a>u94ShvQ_(KeeRAtOgly;URa^te?RCqb1kKxFhT^FZ>3P!rAkuFbf8gFzGb2Jun z?H!bc<09!ApZA9(`JpO0-(HjTiuS)3<%i3&tJz*vw$tgBrBAbfEjHBl;(t85Prl)j z@4>(tr(J+#2g?l%~k&1FuLy1-iPPMf;c((g7V zOYAu?I&P#xOMM@EfU**PvBfD3YAdW=iH!BQKpER82dj~>HY@eifd``kq(0_iS{?k+ z3GM?FjhS>$TGLr3il&r>kT{A8PWhv!qBiiZ)c=b~s4L8TmZzK|FK+_c z70Qn4+L}MEI(g(Yk^H{aE?FKe5!7heU$3fdbkM&C=-hE5`%x75-M6nRWUOzq?@lk6 zyjE&$?sn@qF_NsC`K0!ZP3esM>N8wZd4Xqh#3^*EYvq$ZkXX*Psk#fiS~J{H`CBIS zp&?Bnsv(pov4%P0_?E5CVX3b8YhJgndTXolJ$+i5)tk^hyQ;8etTocJ|8oMwT zNYTb`3|)G$)kmw+4x?VQ_UYIzyhB1Z?RxKen9n2VIRoPn#~!;ot59(=(btk=y5X8M z>kpxlbeC~wwzrqo=cX8(3l9znW;wRghk_ON)3e@7k}u(AL2Bkq|OENS+L zAGkj?_8pD9rDV!s+iUNpw*Jq_wR3KFj(x^{N0r|2i`1&)rg_n`*J>oB`)_IQt*VC- zYNz9iIkoN&p!FNG+HSG>YMczZgS2V6AN&K&SX*z?NECk0uQ*8EHmO3(zJ@Inx>*Sc z1WL>D0H{pt<9JkO#ycLTRJ;A}d(LKNSty@%-A~MkLoVvfM zkt<;lGApbM;6N&RQvs6IUQi)nu65GIlUbdn7{VDuBFSp3r42K*xlx((1{oLUz)89N zAw~sCyG4*0WN61A2?v>wZ-V|~Ml#)M%|sEy)XLDQv4gFF@Fp2l+gqSo)AgxeA;oWY2Kq z2#UnwM@BHrFo`CUg9=dpqNApcQH_ruZ%2#$>6+$#uzqc;ID-R+$5|VI;pl0_b$SXf za;ul@24xP_Os+hR7LcGM3sa*PMl8pWs|2ZVL_%`HJ9gd>c%TiGDUDxKf<;pCozzvh zP;v}0V+I!<2x6IpEIc5gn2jN$Ow}tiVu3DCTrQDGzdm{L3+*DpOR26%L__v@phLXy ze6JQt8@y!0)-(qc@ELivF1Pgt`}z1;loQ5yC4-ycI*!8;8Hq4F^vvzJR5Go}>+z^# zTNV0Y86Ce;F&JD>PeXH^#kmdjt-3C4*fhr3JBHFGe)IC$<`FEvYjtE@G%5dX@yJkP z)Jw)aGI~i3G!m98)ffujkW`6$5mU&&2AHze(Mi+cg7BqAN5 zw8Mhqtm8gPJ>X8~1}HDV$n0jLPfBk{yK%0x4Eyv;PLxIiEU<02(2m~L1<%J9 z;fm?P&ooMl`l5tS_(jnx&5b$I0JSobJW6<+3Nnql+L9Yj(cOrOUp8D$1@%JO$_N;? zx8Q4Sb1xP1gx&F4cOV4kE-)EDI+VeFh&Q>u1Nk0;x*~AF z(<`9>q;wPFqqAih9hf#TfdfaoZ`lV<;~q%W8Ma!`2c^0Y&(#IVWe{VSCp#;jFBk4q zNqEsV-5|Gr$oRfly#>A6O|BPsHTr%7cq>EqH0gcjkqbV|uRl!qyV#sgKYVfaSL6=Z zD4}V{I0^qbpj1AWPIB+E_2k~5Jq|YAjJu~be+x_v(tRh-xDkdS;pzb`Mf?Edijlex zcnyv{@q3836T)1zKcD5wO7{Vg%2yc9Raj~+Ws%)voWCi#sLkfNr!O#kY3_x`ny}01 z>iWIyhD;}zJg}4E-?4U+r6M za~ro2{_bCa#+pjbLA?TDe%%Q92>8;~;94sH}u6!=dG|9T_FN|eUyiB`E- z%v1?qJ8zYo3+)8_&6ju={xb|hqwKGZSHjPvhhK1SVHQV)x>kiadwGt7GgCU9D+_{U z&_dKsPE`~nUKr=$k`kG8$_Y0!b&-q8nz0-gOZvvol$h!1Oj#D5CWacpT}oWAw(!t5 z2Q%+0ck=l0RQp*y9%g3#*rM^kppSW0592ugm<)Ls1?v)Qvp(5N&|{)4=vzq(D}#o7 z@#^9d?I*>xEOZ|2W|cFw&4O)QT~)?<7X@WAm0js_ipGY?S)u)!rNwv|ZE7l^=T)KR zu=vtzQzqk`2?t`p0NuxuT3>&|s^vLYeQqpiQwjsCkR+V*R0l$7(j=2bAzqKHnwx6{ zpv&2`2Zy6K2M_rwYRAtz4CXL4iX%(o6i9W2a1{%XjEG`Q6YgZ0S+f8UV)X1?rYbbbNazVcWvbz^trb{SDlM!-pvU!4 zI~lpX`bl{-(^zI#Vp5kG-rWEJ@dyTx8S2%{J3(d;1){Fqb>p>)T7?N4E0(6Fd80eX z=Anz3&Sp{GOycaC2RQ-I13m9D5rj^kjfZU^R{7eN2>eyO_V0frBI-@ zbASesOHU!K&fp&9x)wQ~kbxJn^l|B&BN5lqYKjzuVqM~WJ#!o2_2k`PvayEANjuiw zO1tFeqvU32Ru~7mfWfX5t@cSrsnKYJIUs!6LxdiE2KZ<>|p{q z6u(3%_@lC!5%h%^ihbdv&QIX)5Zn(WCjqB%%=_kFP^qKjg#tVluwJj#JBjWi9zJ>U z<{*4Y6czCzqO28d@(^Sa?hrWSJUp@w{OX;`YBHCxked*? zak%6BH?Iq?s}xrq0GB{$zrYsorb2|4e#M2+l3v5F5M8Dg9U+Fq|xg9T5m4iZpv^;^$=2kic89B_@_e1Ua@7KP0!_5;<=bGSd?rz{06w za&of1zTu|F^tYyB=-;Z-9oY(kx1xuPGt_d8?;WOw(=0(vzM5@`zP*O#3JX9jJV&j)Dl4ACkY# z<&w0Fk~w5Xfk7As5?SzU$BJTUkQpL0q$eN~WeJh36%e#zJm9=EcnoE~#3tgC$Lze* zQvZxGz%|0j_UI|CXze@(jY3TzN0vwe_nn}WUCJU#9@h{ytZULD46C!*021rI>qZLn ziV+Wd>y&?sPk+l28jm2d9wm~C%Z+eU4_ zO%Y*BsS{_{9}Y+aQn7^61aO)sA-KmI@WGUpy+BL|!DI=pR^ckm?QpQNFf=b!BGGIwZ!$odcY+{0~TG!GqsE`{sEMo82t` z>5cMdOqTD?k+)Ff-#{IbtV4F-`eLxU$;M_){gf3Ob}jy7c)V)yja5rpflqh^=$;?S zPfpu6wHD)jXBw>U{-wem*#00Wxn=E$&^G&sxlzoCR0*Ds9sLd@A+l;J4aA zpuyG6vf9dQiBWj03bPoBXPb+Ri?6Ly{N^BClS?TN8;$mKzHxVy5D z$a96^x`1Hkd!HX=)n$RGHP}#Ez)fg0D2Bufj(fl$(EGR7K~YvJhoS~^omta)@Bm1- zXR<#EaKz`^$Xe~% zDiw+c!G*PVqB4*LFg3@?9Nt_sN|dv_0|@vMpsOB~dNU4%CNE(dH0jz{v>d(WcNE>oBkx*U_wkZlcB83}lNJf5CJ8GN4 zr6Y)1cnwrY3F*6;E;xcUzA7negUbQ*5DTz$soNYfB_SPE0OW(cqqLlG%3+BTzBN;e zy#TU9#E@hFktrHah1=n`TSBCnC&RG)EUwr1N5xH2cnBaFo>QCJu@ssASUZo#aN>Zj z{8-PcCRM~vs4RmjA#y|nf=V2Tum>B9{8BtUc1^>TpAiL8CShe+1(@zaS|WL$9=kz{ zI0Xc8QNAiY>DNkm8&??U0p)?t@uCgro{pb3AwvD)SAm$V-=kG)H^ zU{$3g1X*;w`z>?4`V|86SlEPS-X2!jx*eV!Krt+Zyqm zDx(0BLrkR=K2w}@R8gc-BEj(^swheT!_(6qi?2bWvvzT{nvx?_1q1QNy|SnLfK&_j ziOJeL-|z5ZxC5F_h&#lWm~ZuP{AyvC3lC0TV8Oh#Ka#Ojm;29BI9;}bERt<{y_(#Tn% zvMa#_XVVGdkuGv$vmHlMC|(Qazt^I0m96Yp9Dcr2U%dh0t{VyD9lH_A&p|tSa=W}M zljEh5Fm3qpIRJ9J0F#wdU*sTh5XX+>#JzilOp7qv?6Tdrx+t-tXbQ-*S+QwVuZ_;P zu4S91^**g<9WR=AwQ*07j(&M6)S!Zi1!@ykdJ`iu8^;7{4!#RTJmv5d4T9&%cIh?| zKPzjZ!=y4FX+=sUR{d1#P&49rMx;;W&x!QBH}&iPD{Vrt!xCbgttihF{I z3yU*|?t`#*+pG#6!VPy4Z?S5h0^~w2Tbr^JxDCK_!@*Z(g$6hQ(M8r25PSvEV1eM^ zQ)<#(5f6vJF$V?U5}2t1+9nbH^TdcJKt03L0LygR4#z^oxT*QGb=7+sJ>%Ye+FOgs zdd2W}a{qRnnWtM4>E>fzx1$|5CaBibw;!?E`IP|(f{-{c{f3NOPiH>$e4$vt5VQ$d zfT>AcFd*?DIDEF8jcg5ZpM^W50&Z4&!d$$DM~a$S*1#2VxRI*?VAt9iJHl}z=JWZe zFKK-EQ{8Nh`@`J7M)KQqgye!2<>2D{%k!@<+kHR)n%Ltd>-GN68Oyz({1Cm`KW&K! ztTb{d48W_c1kn9esoxzD;HyGd+u$jMb-jP@WnRJzm#=CZR} zS`%)umJA>gqkqc$1zkq!zxoD7bWBK6z0Z%eV52aiBN~IkNnn;aTm|^KZVzm(ook&u zj+Y-j!uOF*#914*B^xch2SfRh>Wy%8o7Ej4#1h&(*rW1PC&DOvKPS9CqxkiiF8GHj zVy>5@5m`5e_^yO_T({rUY^YURuN%3I<=fkPlc9IcGL6&iMKj-gpx0q3Yt^+jwL`em zvW0+}-Ur&n<@r2j$LrhA-{_-f<#GiC;n->OmOyM>q0w!~kt$z<#fJyQu9jb!`)79JN~V*N7>!63ycj0vj^ zh}0#t!9?^m6K&o%8yoM<9Ef%v5@(7ejRAIpY+WAQxC7JPw!KoSYIK6(_)5n1g=@%C zT0e1K^6muo3UYU{{+uy&my=vk$fjLNwap-&l?H1)MxNH;gW*(n*9y-eb>WssTr@pT zWdZIRG@H^bO9BV;HLWd^;8sJq-G0i{kh-H_kCx+_##;0`3`aO-b}ThY!`0TFrw=Rx zij-K8wRKVNG$m22rcLb|-LS#fI=qfC7hNI{D~2IJGO5-}jpGZCt=Bm*MiA}h-hKpY z(+~?F=*{6sIvW|Q?}UbyujcledWUn=o*QgY*6We;raCwrRVsgT@DM*7BB4z~Wetu1 zmdVHl_frA~U z74)!p^&2{AP4L?IW;3BGyv7Wcrec}eYq-<7Q`D;a!d9Vtv)HI#s-=k%u2`K?I!J39 z)!ksz_VlRTqf(t8kwE?yEZ0dC!DhR@z{q{kr<)H_^dF#L=%_t{Qkjz0JU0ea~ro2{;pqvIG%`fC{nSL>5OeT zR&BY~j2)|zTDJ`|BzT7t&$*<@q7FyufzZaqq&$g`0g?9hmyTHI{ zlShyC*dun#=EiEl^O+Hui0oiEXA5pb%mnUa8EhTHLR@>fObr9lhS{ZHKXx|$G+0`@ zGEXOy^?E%9dB;-NNzP@#vx$(Cq>zzKl^nZ`2W}%S93uJfGvhL5sXIi;Y{Sxgm5Cg< z;q>!*nMO;tR{Gj7RamAHTDnlTY@OOAJ9~T9;J6Z`e-n^|E$qATx9~`-;)+PHzkE%M zynXx6_v4aQF1SR_xMfnYR2s{(%&`T(YVmWCYS0~Sw75P?7nZmp2S2uNX&xrNBoI;i#^G8UTlER~8!EVV!u zT!S-1_5!~m^Uj&s!0wzya8#wp+CxTq%2PbTDk7Ql+cYn7mZU%^7ADf^3It`c$QN*` zB1z_NUe7L0E-z01b24Xxpix-962P0ZBNnMVClC7O@bR}pr)oG6xFkoJe;DM$Ig%R8 zb8veBYTo7e6*mwd!(OjI_2zuTbO9bAL7dc>0uNjY$(F!D<_=MXfj{zYLSvr zp*1iMOe4F2+?s<~fErll+R-fx5>iqG)A7s-Ex{LW1d^&*vKc>3a{@8vGZ6$mNpzav zshYeAAEJ3Us4=JpoW<$2T;WAe<&Da2L?tDv9x2A^7w{wo3gj#iYql(8j8WnRXRsIK z7UbWu;#PP}EvD&#JgD^@S{&^h)xqVryUoYRf2yB_78Y^fSTNm++@s zJ#^X`j*#Zv9EGSiYz`rFu!_KV^U62MFhV_&Gx8grW_$sz1yVp9rMCxJdM#R*K*5Aj z>cIgCeoSSo)(#j>EfOp}+{ZFvj{yhOgm7dmgp?R8uG2+fOI$fkyjXSia&T7C5by^-8BV+zR$E zX_t(RU#%|!8xMim_`)Od5qOB^o58SW%{$B<683Lhwbqc!?;}Nv?x*GPr}dOT7WO1y z>9%n6+nLI?{qDfa1dSDo41&F^J!do0xGu1wr4`ON_<4u{dhnv9TR28SQfn3IL6F)$ zr**&F)!{v>f@ssg(oEcfmds$EewjJ;_lNAOukKkhgRow48!h*@oZ^+#I2fpYv5hP@ z8yR`xriZBi#Y^b&s(Fh^0%OoCoIHJk2$ewK5=j;|0*+MhI&jGP&DTQ&u>=dn1xL^) zyduGTVuD5oaWA?q4*)`gj#zEchc(mUXWAp>06am|B>lYS{_XW0K$!C~hz1WGLX6nM z%zJsqpRUCQlr?~uA2PqZrX>{O3&_aA23cw$`Xg@sY1o!w+d?#RIAF{AG8U^Hf$`nt z|5%0opP_&{vfQnK?#g>q(8QzPtphD`btAfN@Eb)hBuc%LX-7L6v|Q%h`Az|P?D&UC z&^1l32z>_GQHC<{KcsYe!!vL~Y&8);x~NX&L=BdEw~bsfsl!+U*AHI6sRKu>zDNtm z3(}u*AJ=C>rz%dPKY@D>WPcX(5r+;ga}3bGWp(3sZ%L-%e7C=1;f|xK{5#l=EWN4P zi&<{E&m6ur^d-X`K-S4OM@PQ+Xu}h=L}aXKe@`^nKdJhkL~v?o9{6uiw1eSz(3T zR_KP_|A@e&#`2n4+d*^LmPFhMK`hi7)nILLK!e^jP&K+D`v8AtKU49&#Bqm^I3Z;L z>8IDYGH~><#`TfiUU{P0DRy9P5QoEh$}QN2`N!N& zIBM@&<0x7pdWNBLYWL~BG*Y?PwF*MZ;zY)22*>21gKSp_cXyCM{5BzBO0Mzqip$WzJF;og zwWO&70ydM}=lFYoxdDYvqhEPM41cwOv9D()TVfeNi+h0VV_DD@rl8wiEX+V?aSL^d zE79hHn&%`ob4Jz@w!EbeZxj^xxd|C_awn2?4-mrps zrSL-nYtgMyi)>CZcrL=(q_-&@O<1REEE^-o_CrfmBHavf=RTbEkDQ9ynB6pPnGFQsdi$2O2VG*IS~dgStJ1I_Qi@}|WgCjhrEr_Ef@ zE@z!^qgrou1QM3s(q3*N$u_+l2PtIXiCJrfj2DmDJANbI;v# z=XdXmS&<})&CwQ&BU~fnZZxP+xeKj}<0R=G93*f6KR;n%kTZwbFSwZ@q@T%BoBI^F zWYz-S3F|B{`T^I95Cnn1ExQM&p%DBxIC7hyb-*enB%4SC^pQYPC=l~P;+(e339UL5 z)W+Q$8%SB zyT*!wFvT%?Eu7Od^_7deZWop`7l$u`f4^PQQ6$vs@ep%w|G0%sXhh;U82{+?rs$Rc zo>dF$W+p7m(am%QOp+KD47$=NN>w$Zn${&0qerST6N;bZg>~vL<$bpXU!om6%W}jbPhIk8~U{n)}qX*88opmB@c2o zHZ>bdY=ZUbr^qIp*A4KHv|Ic{c%C#1TjXFwMQk^dSn_M-LG60Nb%v+9Lc^wbHdWf- z&@tm08>S2++edF<-&Vy7idszfj`(9ocMoa7XKSR z=KEBL4Y|V5k0%tSRt$D_U_^q9zkWEsydM7;To2DKzd^s>hok4z40ZQ+NYwNQa&18A z+vlqOH1QROp`)>z4^blD@c4Jj4pbKB=pp$FrX-?d!0_I5PoCfAE-wnJY;d)zY8$Yk>GpwT^tQ?>S`<&k525e zyL1-aauzq1&!Y)SXSEgvy${Bhzo$BtXg>a#Vv5To$x`+=6F5ualfhRE^qCft-I7|T z_u@qdUcki%Oe6+OV|WGcIo#l#-m&rAzq(|E{4M> zh*%6axgyy>t_YngZ=`ji-t~I7kshUk-9SuwlQ(kqz3dU_nIpezjOr27kVr9&!pv~Q zHOiskLyOWf{gX`2O(f-7q!q?PP-&6~sYw@jIvJn@L5p*xak8Tl3?d4WwiJw!hYCDQ zL>zZv{I`M8uWZfi6+%H_2p-R2Cgd1q6hEAPJcS>uZ$c_fLP8COLfZA8fHVn=I2vO- z-)Q5#NU0Q6@2zhE5HMm%f}A!#2TkOG5`q_z{i+aQ1EVdnO7A)fuYP>{_Vvp*RxT{b zhgZ9=cVBi5t#EPEztjDxNu`@B?>och)L`NhCj=)8O-#McFrqAmAZAJdDSR^CjSfVU zB*qD4jRN!is35ZQPY38pWHdF%ZN;`!Doew9dRN}+vO-ktjijiu7qAaZN;dcWn#fE> z8rR6kl=Fz+)>f6R*Sbr!sN#yjOe!73ly1Y62c}EF^>rW!JDCRB^Q}aNg?XYOc+V~^ zj@NicY$a+=#dmN;5b{-p1kct#<|cC5JD8S%TpK1T3=KwOeiS{ zg6$j{^E`CQk6W4wWaq$E$iDSk#^^a3xmb)TJ#*AbDeqvYf;KsDipGB9~lp0 zl!f?1J3A~4sfC7Tnn0R(Tgv|LQi2j0$WgX2MlhlFa^H*eyYQ%Q`H3hFK&=v9i4^6kooBr*I~PtF&2DApH_);NNM0wI8no#Zr)o9(nW-=v z?_SNKDqd8MsJ#vQf>r4jrn;G{wY|Yg?;PBsKFp1KeqqE7yhwxG{LTRl9GcOlTN+LG2R7%lKBI#g>ew)e2Ccjw;M z9Vw?MBN0Zylk%%Qy=dU8X4m=zd1^vDmMACw;^TjbCpSgy-||*bY<=C)@5FwQsVr@Z zZEdbiy|qVHFbdJZXwzP|7@NJNlTG`Co#R|8txNrEO7`-*%!)y(I%DTJPrMnH?Hr+2$=nJ zK)Gj{zJum$6vei?yJAZ)X_T`zO`v|vZw+I1YYL>id()NdujA{JBtfi^$FPxM@0Mxw=b!GPU#QFkD)K|XMWy(T8ic8CULgjm6#WiD zM|l9)55XDaRx-m&2{g-s797D;aBWbc3J=(ZvJRd@FyUIG38tpt`tGsiU$=iZVc3J$ zF@oz0>Y#fvNR)7yHkhNHXpHVpT7||cd6s*GVqI%GW@>)!&lgMKw%p-u>g5y8Wrkl) zWpXG>s*x&ITv43}jI!9Pw3Qx7>n6{p8lDO~^~-cC>&oE}*(M4=21ytuwV6Ra#3Qw5}C@t>LE9|Lho+XFa!%7uxGx8Ln5` z%D8nuk=jyEhNK*l)`_Kl@>V5ydWG(n&a?AE-f&rVu4VgHHmu)@7AvGHPWYcpIF1=xsv5?v!+)^b zrSv!09SV9BkJ?>?X=c`TDvF3Cp%c3SXhU#+mP>wI5^DFS`2vMf!EW0y488j+c<3Ps zvZlK>P1~X9AwX9QMX+581hP!c!eq&i4 z%Q(UlGVY)6cc}e?G41n4HfWbc(YX)a*4m>LR7#-5Y*xSwHZ=kvJEnjet&w|aG{~k^ z*ibEtsW29f38-{mEgf*hoC8;zPE}yEdW8~!dZ<7KxMoVd&cPvO9Q5owvg*7iyZs*$ zuLl-N7KM;Hv>GKN_Ry=#i~kltL1Q@&U)PV@_2cIL>HC)lSi!~lMTpO2M8LFG?wCh7 zi&{ITmdDqeW+)l|m0h=JrKu$ES)!#OW^floZO1)1C$;pFDftH-c(PkaRFwlGVitSu z%ZBRPmRZ(-P=FgeL#Vh{|OWVK7!I z>?MXdqr{l_n%anj^szl>MUtpfMO3VHmPBSX(ZZjLkKD0PzqOMjS`oa>4r=b^s)D=chJib z`&Nv{vtZ4q>!ffJ|8trzSpps%U*#*8fRgDZ!QE-Phe;E;aX-76BCp6fDmsB zs$AznJX|}nokBJE?>nbS+N4Pb)1>98jnALI`|kW*KAvZ376gjT&}NJyTqENyx|pMK z-?h%78!y9ilZeEk8_g>3tTd5!KON=4O+FMSxV_^);7`6xpt>sFK{s3(p zr85R+@-{XldMWPGYqVPCUO`g12*{^Wa7c2+3tcA@t|?!Wa~BSZh$V0T93K-NCM0l5 zP$N@gEoC19n=>KVlqfO_I)SUpD|mnO?yyGKbySJb*#;Tn990x1_$aKi;eKj7?0%W$ zb2r~Sizz=Z@djOkE;p(=(__&wy$sGFS{@jB^#)YYw>bI$ClJj9H+r?QmChZymvT8j zsmZM6uoa!faoB3kWz)2e+ZDbIBAdyHp8iDcCMmONSO%ZA>#=OSAGGVXkZ5^TTR~O( zHN!?{lyX65&SW@%!~Ue!v8ql@n6$VxXKF{s=nB3p@lt1DExNFoU7s4a+coFjNaVkj zJy)CbysE=at^e3@Uxl%qw-uGmO=*gjOaq}5-f6JjP#3^B*`yWf4ir8*2osMrAb-Rf zNF)&MGzvFZJEp6uEB~pUi222^mEM{pWp-;djL2WGZ%dCD!d}cWx9Gcm5!bnD2|s}G zcnoj0!aBk4U!||r@PNg5!bjw}^Fsu*iP8KwRd-tk*tni`RH6;d<`mkP-q4HgK3mP9 z4Z@^I9Zv(d$QR?GS3}a6r?z)OLeXL6pf093g(~gpt+6Lj>gL5)`k`@(7jDG?&Ppe0 zlkv}#lDTh6wx&o$`Ceqe)S@b5!O7Rs;7rfygojj6LR8PpXn$EKf@+%^LmwkG>kW!K z4G(HwXn1<+cGVqf#eRMLtZ}h>savH{rY;Nh(>q z*erNSOxUXunP$!2UZ>F)5_f6$>Ooe2qIIEkjIg>Kfb_0|!Cx8ws>sb>&%tx>8XwYf$96TVm=u!H+@({dXLvw6Q4__!N6)XJ^Op)pc99 zgh;wX-BO0|fRvf?PBlxeF(-rxsx{nD$xsMtcq8vES|lF?+-enHQG<|ZLzTf96fmcv zD-6)ruEb%JC#UEUI~AP4+)CC-LRE3OY8IGg9`41v#pjSFrsn!$yls&U&~7O-R>^#K zwjsOEu+a54%3>bFGex;fv;KT@*dIziLYlB`5L1DNte%uySIzVVnF+b@`3WcG5>4IA zDtzbK=zwqzBU7Us{e{@?M%jOo5GbEb?II|tQgmIlR@dLb`q9oI@SBq(R{*D{a0x|G zeCx(e4kg<=8fLuxJ9Z&&=~1lnM!EjnSzq8fu$<+vSOL-s5#dIyBmKC?#kk)L6Y%o`qlVRxmXEb+-n^ZCx7hWbeY-PsgdLi+ z@^C&O%ir*?l786E=%8&h(2>VCeEL0OL%smTR8ec&Fc5y%uegUk$RSO~o<=)&h0?)b zuu=9H2#S2EHDt+1a?@<&zfZE|R5nh?V59eB?xgSg?$h}`eyYow5XCCAHRA}6$hcd6 zH@XrQZwR@X%?QlkuE5$LXATQ^zxc3t2VdE*T|5TDLQ-d{09)!t7NE3)H9}+C^sdqd z7as14aLKG4VpO%n3YD|)@ZwMvSj5s7<qyxNUM+d6S+H5^cFlB^gedQu|R{aF{;-YJEz&@ZL1-ro~Kmv z6goTEOraINbu+Dof6!Rk_DNNB2{JeXAw0uUo46d*IvNWrpf(|!K7Q5|Z?_G1e1iJiD z8olja3tu?aLH=0EB(cIR^n(%2p$Wt>zK8zA|K%gEU#BOcpMpL41I<-Ui`y^|z3W%Z zA+T~tvZbd&nzW^CVNY9@wonM{YUN3+qDV%PlU+*wdnJFZ>^LEm9;%aV&3p6a%}9R# zAY=fZJ z@THJzAtk0Y8ia*c*u)1SJQ}oG?vN&rAe42;(wXPKCR{RW2Pn3=#4Rdk%Y-Uzw{Dfs zzxI+R@R=!&QnDwB{Y~p?dF+d9wgAKpSl3f zl+q5k!63QQkkyevd*L!*zQFQz2H$NT(l|bbTai_H|PqZs$vGq zbmnCk()t#$)7X?G_RWiTJOjG=7TR1@flXgehzhgNm{50%MxY_~c2xc)`?;Q`TH*iM z)8V1@{DpMTCFr(oPP!+#hD1mC)K$|LQbVW9(xpo+)&88AeQ3v!bA4Bi2lxanlY91J zhkJErE}@?;%M;u()|XsT-rV#A-{ptr6-1NdC|8rEPT6IRl}7haYjt`@&`^v?E6qzT$;{7-Pp!x-E-BVf4@yl;E{O>! z%FoR#PK_x_EzZv=OI6p@RH)`s0D_{_!qUv5RE79>7tf&hcs+G}m+4c*soJhoMM?pS!B6<%7rZve-Rg-NT3I z`UXMNitUI%E!(z6%(Pv1HZt2L1ZTUm-rRDbE%f@& z`xgPy#n@@*V|OuDpsbmF^C2H41jVE92>z^Ns~Y7lo!mH3g1>}6p;QwuFCEb)!dS0J zVSIn*;=+TpY@S7{^rr>YwS2hd!D9n8MmUcV&0_?!-WwlI#sDsQ0KttD7&vTo&{SO( zJscB+W1-}+ASDc&8dp9lDhVY4&74RHUwz^c{4qSp*{HEm@c@5+Spg~_|%W;|p@Y z#GK5?XpzDqij6oQ7TMU;RGl?4?MaNW(YDw@d+1>**A~$iIToZ59>&caCzd56 zFXKr|rQp3Ur@W`Fy>newP~N=SHBi-D6~m}INx9UD%81|K!WsaiS(D{quP?Lj!~O)L zY)f}CpJFfCkMQK!ho;5K&@mF5Pb^nBCpHzcnNvBcjb7!XtL=issj;(;;lkH2#OwSL zq&c1pJ}Zk{**rR%?B8*@n^5Y{l&Nx@Yu3p7_vB-0b-vyXE)ewsaLy0C&)0inS!|IwQ*Nc{By_L-L6@pyF3&N zY_DSfQSENxjnQo-#Snw8Ojlz9h;CM8MT)CeRV%jE-`OHFQUV7>K7Ch0V@&>Bk>idm zDFXx;`tqo7IBk0mpRd!c%t?-?3F0Y|W!oD4IdqqtP3*D_(Gh?W&z)yom+yg+r-LRd z3PYxzXe|B=_(DDIzCKlgQVfcr-r0ew=QbVYMLGiVx84A|y zuF4#yBMRt6SHFsNU52DB?&1AO4}2UY@Kzdb=X%mqD+z3Mc5le1iS9od;U&2>K58-} zy<|@`2#ogGSUZ~8F=n!2&oQSbWmH$K9x9aq_sG5Oc^skM?0pGWYYjeW8FoH`OttiozG?`uC+eJ5W=e*6!vV0U#zOmhUOV7Fa8Fq63c$un@4ZwJuTjR z^EOTo(@A-KVqwp}piq~TJ3XVK)VzAagl6)mL7J0$*VlHOdvAp1D2dNpXdXV>chfUP;?X7*)Q<&_X5OLUb~2oXxf z@rN~~cK9rWDx`DpMY*K3z%;@mD%OVHFAA&n0(fDh)Il88#Ja?BBEALqs;oXqMp#*t z&XDKqy7j)$3LH!JM^;nE3KpFyP8jsyO^3blw52l`Mxe<*CWR)0cv5q{!f$}j+?uo8 z7r2?RwPlfOOOv>v-w3gQ5T1Lvqq-ZsxpOpHNfKqe0$VHo%g%~(?H=EHy|0UiI)vYg zlLz#}*!d)hvtT`L1IBfP@Zi>4h>!kxf}~73Ww@E~Rnj7H7~YBN|JcIQ|BepGQAZgp zjSMNy{R~u%_yLVoO^?$s5WVMD%mInEs=5MhEQsZTv?tJtBZs=lBr)sQmOmOQ;J-6= z;>1lWx>cn#nem%9Z{DOIKIv8$g=8IC%}RtPWTpG@&8UuBye|qa9hy2s#%GV|LGil) z`rK_c@d_LGZkV*SGMxnmdPsk5;mCwXIGliKElylE6s^519aj>Z0@q@eU3*b;Av%;U z;VJ_Lf8uZ;qV0&M^G1e368m%^nIT0Z6f+1)hm%aK-!E9ucmGPsFR9d?KPNG%7rzNo*=#(v7Nfc4rzG-ZVjfJ>r8@j@O*v zX%sdm&%lx?1x^%U)wjeVRO2oO?U{6T9X!ir6`*i}U;69OkqXx=>Ii!1ZXDy_qhV&@ zz_>5e8d3mFLR=VyoPIXDElI@7c3^FxWFc)E(qge;YOz)VjEmA5)l0x%B}R_|Pi2SD zMPHw%MmqM4ccElOk?WKA1+u_teK@KuTv z88Rw!LyO5hqYC*9VX)CbxpubV+uaf}_~Q!ZcsL zu9G|kRi^$QMq6L}e+==vc-8(Oc$xhz1Ro??XDz}<2rRddM^j%{gHtm@aD89=E&c(s zu`kFd;Nr?l%uOvWNK8&u2ue*%E{O>!%FoR#PK|M`NKP#%$;{8Q=Hg1uNh~f_@JY=} zFUf$5E2LJGq~@g*E5x8la8+~FasdEEj6Dv*FbsuvpTZ+#pa&=ttZayxC8UlTi6)lg zOci&hB#rR$GLjW37JNK5S7ILlIA73bq7|!?FM72qS?k; zBxcl^kQ)M%ukS>jL})tg-9EWW-RyMw!&^R7tUZ`x~h}krdLhYJVb0iJ-_iYEQaJxD96%DkrFAQowpm zr7%`IYIEu#$cCp~uma&YFPh$Vk?o_Cc$d8>fmE- zk(4FFV>U3v_b5B&{h+*)bk@l?>!cb3CZHo5!d@}7Jl&Fd18qwPo$MGI)^xO?VaH+i zN#|mDOo_2uA4SoG@HASd#YnufR>j5h$&PS`=P#kRb@?&zHQdwM8Pw~5nID(fFWKN1 zUvLSE22Y9cpV#A(de>Y^z#nqCnNC}rDLj^_G*bV|Dq%7IKEDlj_vSY;V4PA?TVMu~ zA|gsKTj_WS-eTAwcn%@FucgL$kE@6#HPq~{PfnaFeRIs+9Mz+}mpqnUO^@Ma&N?a= z>am#L_6dX7|2^K_MY_e=om7l+6rx(%GQ zwO7QJaoAxJl$bXp!SyhwrA{OTnoh6c2O-Dl(K&TJQ^aWLp?ob1t*S zE`ey=Q0Gs2_YM!jQfJ$)>K;SvM*~!;t_6J0c@})K#_`s9>yMMt6h+}DFa27kyU$-x z2dH(#H^5AI`g;>kFUwMRER@Z83uoO@V$?t92BD_u4b4|94Kk}$(bvZJ;kdaqU39$8 zezlTkunlri5$j=M?1cuKZJAWg$K>P55^FyYCpx~K3o%orms0AJ4J=ST_z{VIglAkL zQ*HAs(&Cu?U_to#%_75VCe(~}Fhg^AAi?nk9;w7{W<(uzvxkV~mh{He)Zrb~wwvA) z6?dd<)Fw%Rs;+l~yhP7aKm^HGE!{2#(&%UFQFvJ-Y|AUPS$D zJeo|I@&0Hws!D`pDC`7d!c&K2{?;hJvPO57>kWm;$#GA1lOfciv{gYATorC(NDp; z6o-(4W?pAt4HJKRg7{aDD8phWSK7xG>M(Xf!Jpm`&Ya=Xfa3fFDfPWRq9dh0totqT zIl@}MyX^|J#LcXOxWR6{yszoZz(vk!bSo+8FxKO%=|0iOrn$m8R%nF2i1c?on!9Hc z7TUgh@cDYtE_s@-IeLb9Jb%%5$7;aAYH}(y%_`-+dTJBTY{Qv({3eSr!MYIY!ZT*_ zc!>|7wkc`0Xw(SKH-FM}51ahn`bs+UwXft5ZU)cL?{`1!zJu<;XWOQsoc_^Ub-p&4 z%Jm#_O8E2QFV!2{a@)A|U0;FBI4jAaZ0D&RJ9c)PCKJzWc2hT-K3Ex>79k4_MXCho z%XIzkJ?G#;kOUTzp%yYHR}7>G%dp*|lH|@*^NCt^ z{;IZVB}IsC#bmXf(K~+>`;^oSeJ6c4B7sni@07;Z$fvK>yq|1%6mA)mA@)Ux2Ny`D zF{9|#;wyx+BZ&ebEh6O0q0+QjW)_%wlG0s31sD#MQUPj;9R7M88%RM!PpI}2Lm!MN zX%0#>BfHSg1Be{BWBhIBoI<8M&Xq^sz?+<~6hS1}+rE_p2H-SSODjI;^8ts!WiYA2 zAOv=9zyNpF*`dfL;WEp|{M&_%CnyCx{wInT=5*$p$D?VtVW#&mXnE3f@;E;>H!pLD zwM{Hig!VNnR=mHKa`1_nPRQAce{x>cpI9QP#4YnyfbfZCUv61`ubq2jud#n4mDiZ} zv$xo3Gm7F5R{n5^LC#qghB&#Dn;wWeldVCZ9gSby~3KeFkGzfB~C@ z#UDo|SBOE1sO5)kUPfJl@{uqVZLV0$WI7d!7yOpGdyu_1SI#(ZRRFM9Rv>_>=?P@d z^nZEd=yGDt9lM|=FK&?bAxFCbm?3CSHlV9EWeAz-$Zs^SNWh_=*25|ghA~}$3=bXX zkYxNr9GZlR01&pycg!MFt4LS^OZaX>;xNxZAioO2N_uqrkE?v$nA4R%RwKg_Ty&j~ zZ^PBZ@1waFYbY(}Vsb^synI$C- zOrlYi+4QsX z&`dDso`Kf8wIC2OVmVyRg7gw|dm)7hJ3!}l;j@ZKR4AYHE7b@qVi%T6mB?hr)~>5Z zk8}SG^%X12D*8&hxXe8WgbT!qyu{;}Ht{sy%j#~eH@t-t9`lM<8-TH`RUE&>-Hkkl zk3r6S3o5LeMyqdspkQn?RIs2pZIp*l#8~lSOGzWv;^rX6HxI1~@PjzVtHV37Z1eb~ zN9Juj4+56Myi<@%attjzD<|ejS9K=ABUPJI`WFqxOxx zq6a-vHd7W`^l+?jfkYW^XabUe4hmj&GH(CHRN+62KpIM?owvXbjh%`MpU=ke! zh`#2)^@kY@qWE^)Zt`4=7*v)Yhz}t)Iq@SAC!b(ZKrfk3GFKJX6VO(i8E4wL2b&}J8|O+GIzEEakU(hO~ze>ewSL_>c$nkMY= z0`L4qjU8Y`WCVQz{UMHv3srM6d6eSM6fmXd297C1d@*&%9CV%9#*2_!A^o?KMWOjg zB-@a7LWwE)GSp)W)U=H$brCK5sS6oAhO<3(nJ^BvX+_Fcf#z~%u@q>F7-$f3ZG1J@ zO0x+VkI=7gTC{l1gkHK<#DimO6qu{{pM{?mm=yWcs4qcO<5mGe7ztI_bR{clgY&A9LhPikOn9LaoiWxq)-`%$g~a>@tlYVWaOj!2BqK z0CHCqaF%n#ot4VRDayoLDW_Jq>D41fD7>yJPcC0yTjjSTSg`8_SrRjR1K2zOMe0=e zI8_2CW^|3#Sb&pq(oA*i=C%JVkn8p{S-~UO&5>nzjwmYHX}!6j;d+iLQM&n)C75u|RoPj6II`Dz0bx33 znxjs;43a65TnSW?Jo!diGTtq74jn65!#YV+ZoJam<<-H zhBMLDT6QmXL0e--(-DdD8cWE?F8foE;t+^wB=Fs3Tnf@y6Cr#ChX3*H1jJ79z1l{V z)tq(qu-u5rKll2~Unzl4o^JJ3*1BodzaK!rL|ZwEH=$%CgL=%8X5|}Pl)Q)$O))>=m$yy-q<_Vmn%cY&=Rp>q4U#^4cex=3N4N^fCq zQ)}k(R;pJ*fE6e;`WWVS))LbI*YM)G#4hn5T$^2II>bQl)wnAZom(oHhmz>aRZS4T zdN4YQ8CdUush43JX`h4r^0#YvN@#?3W`*3Lbj zfjR37U!|=a&f?)Wu`6R=76oX9JUU^8?%(<+YnOK_9WfTF6L(0tzcF&eW3+*toWQq2 z+7D%+D7wI=@MHbgkSt(_)WkaI+pgZ!#C>iV{km;nP0sJ+c{DQiaFrjw_xh&62SwIp z*?EOK?$k?}OFy6H2=rACs{4wQU26s!P}+68=4=<6Ff>NDMry~3pJKOCK+}TU#7Itd z?c(K!c_@fUc)pLCq?9+UG?~+;o5UYDzXi;AuLyI z2gG7X-VZ34DB)_ZBb&RS_TzBdsmq3(1}w2jxv#q+go(S#i2F)Yu2;E0{10=iUXrCp z<0tdmm#Ci`c)iE(m&sfE(~u7oo!&sXB#YZC%4{#N-uL%nAH9n(pNa(-@awtKd^?OK zZ3t$9*?m*(n?;?OS1#rg0S*tT3c8!qa1+qI&s_z@DlQ-Ek0|hAg|UnmSsd+7zxTnf z$D1rEouW2s=!`O_1&lGD>6R{~5PMK`C%7Se($dv!?l+`S zm01~B1n~!ESy*6U&+=z*JsNY6ot*f5m&|OU*QEC!EjM|R1IrOxpC|!R0%%wUZZqEQ zKJKb(5R#p*ukV*RB|YEvcJD6F{$EGCZ+(ExnG1n4!ovx3w^ti6HT23c`{v2LuWJJ8OSUJMsj>6irl;L*FtD z)b-vcRSFRlYKevW7WNNl<7bPkoJvlh!*;wU8pA22A!8pu3?a*KH4HKjpv_SO)-XFq z+7G!Z|J^~kpU;Tqy>(kCk-kBr|MOQ|>Qh9X(Ik!xL1Lpay=xtB*^u*x{D zP~Yc&eQVOzEHNrxj!+DYyt?HlhkhUke=w2ck1w714280k9FYuX-L|W-;q;Lzxe%}t z8b)gb-ANM#CjuEy!Y-j(h(J$U=$5f2$> zP3zmCo&4>k?~mkY;I0&|C>01cE`OJn@skmX;5I1f)wfhh8S4`HdG;u+kreAA$VZ5E z_EQA#wC@Ye{SGm&h97RdNG^<@|NCAd0^YD(Uwx{a0JJ(sL!Wq(Q+5@d22w0vZ50wF z7JmS7k{fC{frsX}rZ%Gv4foPaL$4!cp$nx3E+Hx^k}QRl&p?MCSiYrOJo~)6oetSu zf9c(eC07dAb=8q!B&|mB2QsabjtDUmRdinyk8A`1HZ)qAD{K5TB$BrIf=_ogPx31( zNZr!AtV}ONYE=wDov%_PnJT5?xNEW%H; zl|A54)XLxVmV=B9CK3an8S*fiQw+;8Ahq(ho-b`*!%6`?; zd3v4T^EFt(9LH~tn!9&?XcwBlgYc$a#|B425}Loa=wPW zLK&;@9LJ+(7FvzbZ&YWJl0h@a-{QN@nSiIJ>=H;RCXOXm+Bw2yKSN%_sB?gF_zFes zS-XGZ=V!21|0fiwr5)tN{MPa*=iJBSb1ljM3jzC<;%>Ur z?O}WJeQJYx%Ac{wKhoKnj>Z}^7c?F#^IzMOwDo43EkfLT%Mey zfb|+CKUv~CEIa7p7(O+Z$rL%<-gY8`o+G?~S_pME(z{wONy9U`ZoIwA;{E4S zb-BC1*Xdng1?(b2c*Ks7z8HYhvB*_K&{T9oWh(P>&kSC%K7uh67Xd2Os#a2QQZjcZ zVrsr4c@ZPeASEtBKbHK{e0;tumkLpB@w?W=QylWmzI%16G~_#vhUtjsYFu_>(6HOX zifO;UMUBAHB$^|!Mk@JPwiNW{b)TFeoEuZ6C^?G+tjEv^>~R*4ykWHJ=`#Eu4*T+Y zGISaQ>UW*3)q%9aDE7)}fJjw5$BcjE=O-1#r+ay=+|Rg)-z@@|kOy#)Z+=OMS5>V! z*!IoR@{DbsthJXCSv#5*boXDjgFKE7+s=h6$kt7xRg>8-stUL;T<-K0!~LJv=~dyU z#3O@*LDem9L*se@XA&a{QVeBeYx8<$PRlmV>k{t?a)tyrI7tj*M~6-sn0-z z0JaH-toy0)<-D0iV)A$OPrCE^W%$}zL)%P08dWyok9WrmJ<9mo$KQZyps%y~cfgXA zBPWHZv>CIT(m zIaN7&T&!L6puE25GrKIxw+CJHKMKXE{nhT9PwwlxqN;V`x&P*l`~>FB^`r{0tCP$5 zKVpfu@1j-)H(I&|lN0AWsV(-fABBe(Tmf6j7K1tjh;<-uSu>>fnvhVNoBn_-sIgg9 zor4f;&dx?}jO^C}{qEnwNOC^jWS5}*aZ2r6raCJs5X)CWVQ3IVXEXP>1X6Zt+bOup z1=9oOYHAHg8Rz~Z6#ecjyX!Ko_`vg}lhk8dQU`{SLZ?gp zy-tOuDr$>tWD_p*_)vhLPq-r+qq1UZ;9VZx+R7av2(W~YV(TZ?a?d5@Py_JpD-%1s zqJwLfnSQ}I*nc|CotQ~3g}wKIhA6mduxy6nK^+l62GOW$?YPDlJB8wfY&T~`XLTbs z^JKvzhgkm$y!=0J;E-d#Z{zjH{{>{QW``RTpArl0Vw}gL~@><4z;8S#V4Dn zu9~ivSdM^qvyXv{SCdV#Jx~+P_x{mL?&yK{NjSk)sG8b#$WVk37n)sD54^Q80p-SzO>Qf!IxEKY>Xhpv-B}|d7 zvY+g7E0WZ*R4gG`U?4F~5lB0aRH0ay_(3&h3m`Kp9-XIj9x=+aG{M)afijE4EZwip za%@3d(pmMVhmf*`Cg#RPeG5kT!9|lZS=WVDLbZxoVXk7pPUw`41v8f%k0)HK${@!* zQ%jmoGH_>8B)_+8VP=4g<-DI8>$k(1&n~m@lzKRgv`VM_w;rCjgyM7(;3QB;%U-Ep zo=pVfat{Idgc@HB3*8V=+aFr3EdDJs*QHMEmu`w9?Y9mx9A2&$&FVE=m)l_)ntfGb%aCsi*w2uTOJ8gVxmC4Ri?X!8d>rC6HGez$TQ z7M~%;RPs-J|D*zoRbf|0ClEYN;jN{53BZ9XgcgDk9)LX}sa$YFud6J?00f_J9@4lR z8%hJdiGpS?pa}u8n|wJs8bKNxjIj2w{%{`y@zaB?Tyl`NojV73Ma9KG;s%8v3Y7C+ ziYjmagY4ar(fr_LzPOz2?4OS>o6DF7=*1oU)^P>Eap3r9K5$t6!5hn=KDb%UO`!e! zLJ(f8t|@ADNMRO9r|NGs;3h^h$*9)h#?n*I6{#4?WpgMpl(7~^(nkYrm}Bz$%^Q7{SUt%YKMLc8+OJG=Zz z!-g+0j2mmML!VumzCYI^IP*dB@=b+;m<@DX(T9}_sm|Tjkmrg{eR>NIAdIjPRO=C& zO3${}+(;C!tuopF3^xkRL!lDrl^N=b2sS@JdK&lasx3)JzEsRM@lzTLWV8-bX2@p9 zWLj*zIGqF8>nU0E9#M8}*S+0rF5#nf|JbiXCBrMPle||VNqqq9N~~LInEDu|Ds8k0 zG_cLd71cH0TC^btTWLyb)rtU0U@Un=jB~^tgaSt&PA1y%DZ-JEXtADw0?<-e!NQC( z#bS>OBsPpFf=gBj>M3HrUoa)Eqv#M>H8QUg`r2i7QmyHqAP?qaf z5Zzy{QA#XP8?q6GWdV~c?|D_G<#Rf`V;E|}L^I0d2Vj*7-}5}+0xE$gu_Bf34O4-= z;_VD8LPpjDVDiwH2 z<7to|Ny@3;s(sdhzv?FK(b-*`o!m6D<2@a(VL4vonbloDR^w?IFxH?bpkMff#r0J* zCz^qpuANc1(P5Z@ziD*}ATJH>1a1>IpFCoI8f$K_oQHsq{Bbh}0AM(av~-qku2T>x zH)5_P8e1>5W(CbYJva_N#8jXl1YyK!Vqll2dMJ@VkljOe+5z942!%YbQU3}xPq`ZJwV0zKK1x~$OKlWx=Pi|&7 z(k@uLL!fApx`>>6Jk7Vc<|yU{Xmc=GWyoz}CQ3#kvU@J`Pxc8+D53(86Q6w>kbUS> z!L)19x)x%TqD{+UaHswu-pP4zofxvf&-;UIpp<^o{B(L1=ef%;bzA)e76EcJHz!p& zkCC@Ih(6M1uk(|;3G)XQiSi94nHw*$Q?DL8W><`t%NdBEF6K=#XkMICljF-7cfHSzwivA6F0dGsA-j~H zR<2nVScX0p{u)SBMD8dUj(KoA`V5T8zi5=aQ=gl*ltV7VH#suU&ffP3E~0y$X)hhG zkH$47QPHN#L<_^}K^gJmZ{DB8HxX`j4s$K{hhJ?!XA+OjqV^gJ?QX2}4|Mmkm($}$ zT<^}bH2Q{0aV?R5k;kaai^^7 zZN|4c0j=R0rJniTI+w~cq(R5uuvK-PQguUksHS+Uvj$hQj=qg`5Ig(PCPjUt^>$s% zN0My{i#x;n&L&z&itTgpl=II&ixRFCL|1WBiSB=C`Y)GMzn1hy&1$2$;x$(m-R*Hy9hH3 zi+eh?8^oba#VEV<>CoYH=v}$cBicCk9gq_Tyke{yte2^=F-#Hb6lhJZy2Fy*W8&=e zE5R2pqF+2A0Djrx4q*SrOW{mrmn=Rc^yKcZDQr{aeO1*SuCp$|eL{PX!#T?5C^+v$ z=HZ8{39ogxk#Wi0Dx?p~RsEtHcmlpeeCmUC;Y})vWec9VO;=q&>->{e0p&xp(wa84 z5tSN8C(e*yKH7jlr|J_|5a~{t;uT3neOxqvCYBy;;*mqsy@tWeSrgG768qK3p>WbB zB;Cv&-fsB>uzK$wEJ9idp{5rj($z>P2y{<&G*|V zs68ziRCxM=7uy7iK7rv;V~1lQ7ew~pCAU&~CJ+Zegd)G6F?>A4C;=#f7;M30v9@Nj z$fw?y$$N%fk^nt86C72f?ETOO`nX9>f2h>t>ChJp_EqW+`Y){SHe}im#;Ln9i8Uiy zQVFxWyBEitsggbizOM^ki76t@WB@A4bJKqg5oLL_C6wPZ^ELx)#pxAPNB-{Re zeLqQ=0Ud!o9TT!F!**2XC!~=s1rNfH zJK(~mKR(4a@C*QMb?yRFK6LjzsHOeGQZ1Fwh%m6oakEMk*Gs2{q(Y~NnZ0U>O`fz}C7c;a%?nX%Z`G&&S?fx9WCrzt&_37y=c`+)Y z;pvc>Ldt7$t;OIj8pf2nEbOmYr6_%dDneQ*RXW}#l$90Iz_FMVeji)ep-R0=NcxTdK-sbQ$DaAfh`!yyq5sYPrlX`{o==9-pY<6>!eCtCeDIED5v5Ke zpD@Elo~n1~eOG72_;c4n43> zS9PHc#ExBR7B-(@^cEva4$T~9(n_OXAc=D}w4e`%()mx+-|7VqQpB0f(s83`jmT6n zG23x=tTiS@1`E+QkVcAgca_1h-7ec#+yKSlWg1W1YZy6Q5z61ZRDk7qKl(xu5O@V; zt~v+>JjWcfoeLfz`7f8ofk5}grIn{_%BY$XfPF;Dmrn!L`E4_y+>z)~4Nn*t+NgZ* z%YxmsWiq)=(Q5WhRPl8)wZUc36CNsqk$V=XOumRb(Ud-EY`1xRi7q|FbZWfcvS<12 zdre3+Y_kKdjyJeaqJQ6@;CyfBh>0B>5~jzdku!RIdK)~>O3J7f3c1J7$17>V&plGZ z+v&Yl_xdFr;g`1&q$aM%0W?yJJ=#lU@KZ3tlh3?lYl5#zXs*7~_$^}v(N606BFqYM z!)wc7yPw9_bN&y=J2H#NJ+&w$-5yy+ebF`U6SiH2*Hmca>EqXJku9ay-zYHkGDQXY zT(@CF8k%!=cPVeW(-@D=>D_zEf)&m>&VjiOL6x+NyptsYfmv3yK~+To?&QFO+4N)c z*Scd$)*3m*$3ACozsaL^-qz1@B@M4AysP3tYIgk_0Brbs`bF^{QOExQi>o}K^Wtt;|svZ!{ut2LG)gU!iGM1 z_G4wP2kr8T$pO}xm&tg3{z}_PCk2~G&vAqQSoimW($;E40i}aY$54z`r+Z6F$rL&C z)z1LoRBDUed!1$7%Sy-4(_ljsZfeQ1*|h_HC8o&9eF}J;yl6-_ql# z=va?n1_3IS=SHJW-PWB)D(r#^ToCfE=jSxMl1ZQ;mMm}(4 ztzhm&VMz(aNfAWQ`1*tDubU4zx^6N1^d=lIOSe#@^IOgChpdRtM>Xym@PP1?{zWd7 z%c$M5tk21XHZ~j>Oe7g?3nlS@hH1G^Pc^kXhtuA!#@*rCoW^6SlJK#5S|JKbi&Rck zX!vhz`p-pm+E$dy+}NVVk`5D$mdq>$>GOEKi@esdB2?oWhlRza`Q^@7l?T@T()>Dk zrQ5i|=$jpvoJ*b#-;{-@5d~9O=rsPnHK~=uMdV4^RzQ1&!DX3hnx33nQReToZ#+dv z7&5`4eX@y3bA_z&U)_bT0Ynl)K2M$D*_Ni1(Z2BR8tKnDt3tOE|NMvP{ zj4G|=E0_+Ei0CH@Ts0N%|b z$@Opa13m1pZ|!t{;B3;G);0b2#F%>;yQOb@w5du=5O#b}j68T@(}0dadO4ddFH^pkZW z1k2^q`11zt{{5=_t%-npW{u2YKM_7(0xH|PhUkV_5+q)emQ-Y$*}GIpv3z?N zWz`5lsRiiaL~OHaPfJ+{YC; zRu+ERq3Tc*i4v~@#D5OGEqYg{czAu-z)+NMqtYYU_BL~WYJy7Bmax0fM}&;jj?4v7 zcn79c$sVJYxK}OTmfS?3vW{uAZ=e^(wx+on^s*C3xvc7PyrvJ>Xm3l3{_XcNFgan5 zl&-5}yZ<#$Ogr6A5$X)y!GvKmlg-$g14osM2ntZK_v1-_RT_B1;K=7(JDB6iMr6k^ z-pK-8R42ZqNo?4%ci+|J-D+dqLl&L*)E*B8L4V^9ERuhpqqLSMAO|%)_FLhx%_+t% zykj>LZd?*KFkA#BEi*6AVuF=>+StE(-OFSZJMIO3#7&HJoajOg8Kxnub6_u7U*Rls zJiyouwG5PLF60NNT>xs*50YPr+^Dibw78(H2dGb2-J^X^BsD*MJ%wtrTX?@a z$V&fMuy(k~KSQ@$|8wrwAbP*hl8x=bLF61Z^C-+~gd=@L`|7gw?ru_x`x$OWa_1iV z`uwkb%A^H!2g^l!XJw|;&j9vT(bmH+qG_w6GuV0I{F=(eACHbsk34Ngy2!crd%fzw z3`ste6GZqzHZ|z0s?7)Dn<(;p;^3RjT4Jh44Toa;%c-s~)?80uwMO^1*HZx;e zy=$ZU^JmlFq4Oc^=M`$xXnMINerBMkQwPyUnqs6~%hzTl_Urs$T_v z8b#HMe3-YM%u;?_v0^IW^suB)r%L6&v&_Fga2)w*K&Abk3_2aDmH{qgiG>%c@y`2= z3mqntNI~Pp^1&peEpfpSs$oeno+0y(&o20od$|VcTz9rB{H{+WZCjiaJhNd(CdJo%|I>h z%#0k}x}eO_BrBo+VbVBI-OB5r*+_gkqY-aYbn1p3Q+Jc}95(8i2`XYy98j9H2#6bZ zHN#T1Hoe*n*k8A*w9S!pF!uvGq(g?V#=-7QF)F4!P(i{ddI#QrkLuUm+U}b7#Pb+I zS+6C3{o}BT!0ukA#Q4w{LHdzf9aynd;XD35lz*q9RRq%s)F3%P5i1*^pjchzPhJLE zFqJ~?K(-)gi^~Wbf$kH?NO0_1-c{xhjlAWCHQfz21kw&f)a|wXqdWWs3XC^mdl|b7 zD9u$OOPsI{R4xjrj{BY7tca_`Zv}$IY3^1ZwEbQMIULJpApLtn=UZ$Wrm?iiuJk$R zVSF2DGSF5TtMt-?I*{JtB%$PoDt{=AGe(WspQIx1_`&6HQH?97kOmB_6n1mOD&MfH zu0$<^G5{FFh5gWb{=LI^-G|8+H_I!HD}TKr&h3o?vHVV7-PE^;az zPZEg(*@`%!4>dHQubZ1MT1Mi>Ba)X+5e78=yadR!ka5}j zLi*UXA^)pe;wP-bf%^1vvzv~8X!-V0uRCfB(=Y+Z4?ruq4)QiKfc-vbo1F@ZWi~ zN~#jsA)L09d&wO7(_DaVZ>_hl)D$j59+QV!4~kwOMa?Zk<;_cis6Q6Zt#?w2`aojc z^8AIQ`KWG^qtuIa@6$@1=gf|wL;kNUSl!%{(Bacz2a;Qh3EM#6C=Z{^Y~3X~*L}Dx z#Qq%Hz@Xg0>)&H}2CI)Mz%xm5?KH8SJtACD479vM)sXv1d_qDhS&Rj=735L0sDz&u zL2^NrP@jOm5m!qkw{BBOp*E37D$Ogh$fhl|>xa`CH;KAbi_69Qc8A3EVQb6a^7>Y&N{EHg%PcU8=X;Wk41$<) z?e$R*mZt1rX+c2?#%N9{h7&_muN!6-Md8QrnXgjqVPfmIx%(cH4Pn1osrGLXE9OV3 z$=^ZJ-sa|t5L@VWa(OMqb&n0XOR?ASu)rt#4FDLmO?l?Swvu50J9MXK$O7rUXD7?m zl0D$$py-^sZZBs6k?A<@1aX-n0mwT~1!vdh0g{F@&peo1_LIb^&o}mBzci1F4s|kq`Yq`O55u&9 zGuE^vPs0yR?M6fzV#B360rkrez5E|O>a~TrXg*#Rz#QDdW{f}Ts-3)#cV=|uei$(b zwR>*^!%dTA#SbHtfj1UPp~2#pF-CK`-?CEA{}v`WJF1(J+K?g-4#u$-QL$L0nX|3F zU*uBN~N% z+;#PUuLvRmWFTH;28wWb-0j>D&9$aB1cwmH^*pzRmU`89da)>Wpd)}W(KmcOdEfD} zRR4ExwuAInAO8)|En7<*8?VKp0EVNO(mx7vqc;i-2^opwm$h!E|8#d05G&kEBw&gW zMs&8EM7zL0Tqv>AfdkW^&LD#fRD=PO-1uWVVG-b>tbf}S^6t*2Q z_hjw#(1hCy^f=dSnj=rn!kAAdqOudW)uQsC9}QBc+!WDJCWzVK9-5FjnG-NUo68+v zPN`4Y*d)P!V*z-J7vKga*cxX1)?wD}7(SozVH`jG4jQT@r|p;!Khezji?qJF$P6MT zyOd6k9Y9miLp}|(&tzQAb<`wkwB%6rWZ!XzW5YK0gJI1C08_Hc-YfoTtEOEeNChFa zGGVi@RH#)Wj#6f^DVe59CkPOED(&ZE4kzH+Mk1fjDrM&^=6z}#r7^j{Vs|aE%)Wa~ z7JE&f7BGgwk&a7CX~9OFp?7=wjdeL*jW1S>>%Qr71q=Qh(Zey#k4#C`fzYJTw=KaF zs+={o)s#kC^N`gS+7|5PjH`kd(Ys=oE~BD&XZ=IyMcj1~H1I~(X=cF%zdBgM5VN8p z+K9@fMkdM5N3QP&=;M2fWORp&AWYgu&c6zr$4|;Acq0rLD0K<;*I|up=KinIyFMd*Lr>=oI7mbJ${XBc`S& zKe&QoDJaK~QSL}i$1mRiSbi=oAo@Z?u5_m4Ez3cZj4EH#t8Ao(K5|T_d#!0kH$82< z)P~$1sBD+W@{v6n^#SRHfHxUET%j#Cof>ckZ7tGz5xjhHP`$#2*mq>=Ffh0f*KIhvpq!|Bt;!)TNb(=*bpeeKe)`?YKZ#Gz-wX~uS}`S9GbmMUsVjc_`m z^V4TE2eUI!KYHCgUERrKkhH_tM#$YWW>o-h>BiRjK@1kC3)IQapa+uQAd&g;K{bW& z4F+sZ&6RH;##TzaZsf`t^ap&5-60Qj8YTADTR3*A-J3!MGP{0qH6N{b3)B%5Cb2|N zy@a3L!ed#{?X8KM(Mjyw?8P7osYfT>+NIJWqy>E8(=`oW@cH}|a~DcGUvpIl*`m>n zYhXt!ZImW5yuFFpwUog`%d)1WO}q!zdnC1LylU%Q>=Qg|M%l|7$IOm>?!4-_gv+EO zn-W<*k7>drnT5+H|D$A?TPR|I&8QXKTi@HSDW3?tM>X|3w<=1~6!(69Q6i&M2@OX| zMiovg!tWYu4!Xve=qKvl-337iFBeAvSf=;vEm&QG3D8Yd8SmEm0cswj9}F?!dn#SJ zd8X;=iLFnuqkk0F->#*mb756H((t_>i-y21veG!(VBk$?UH~%Vvn-Bz zJYvoWilV9TKf)XEr zJ{80vXMc$NPSItNol8z@#8th!Bx3#DLP|GG*cA;4JGBiSrWp|(Rat3t#Yj`wmHZ?Dg@9?~+co?e=0H+DjWMwJ z;9nPrn_iuN z;ci^EZ|}PsQ4?!PskjyAE`r>+N8^>XJzUWf=4f|lXp0x?LG0;z7m_7i7}YP{7oW1-#s=R~XX9#+Cu&>9?6Em(0)R*OJF2+~z~3V9GIc(y(y(U6XftU;pPk ztkm7KfEIPl3daLlh~i%UkePvaN5Gnsw=)ruk`6cpvUr9>pHkpWvH>q%9J}-+yqgn3 z`%tjE?Id#cjw#Y?@8@B-zhhUX0Pj|jn{6R@26pDT@x=uH+xubi4)LEkinRwe4?qs6lP`xqaV zi{sPMWvl}%E%c{=IpLQFr4`IBH+#oLj{@!O)OAbAt*=O4Cpy;V3(1f2VxOwhKk80z zr*m=cg*=r}>YuCY(sWcrg!AP=_1aC1VHI6PIZNYB$;Z4%cbuh~MQ@+@!Ms%yPX+bLRF?05hVYQcGZd3;yxhmBmZ z`Ha)E=vJ@d4j%eV*vd+&tVk}nh1!hBzBkHjVJ=GjxdO$jjtSIFy6U|=d_R48Q+36o z93RNjRn9V%x?-_I1n=R+jY?YpW%CR(lM;O}}FEysnq zlYKb?7Mb2s*}IJ=9G*gD7DqBdt4h!T+1=cZbdF)WVY-)Z!62K;PS3~dyRbE`O2RMS z6K_3+Sv#-N1kd|Yt{hF=Vt%oX%$Yx*VZwX#e(GLw?%hz>gq$WDmMl?g`A9on0Pf9D zm9Uefbz~mV^7n{B?CmAV%Bv(jeE(*@)@r-^BlhBNa@R7O9r)RGt{LsIm5k3S+fLls z=u45Iv=n45r^0sNr<$#Ab|x*`z)*Cse4e=4+UoG+5kPkjD=1TkxIJ$W8n3uUvK+42 z@t|P+DdCQov#FHcC2X2DQt09evCW-eY$v!@d)GA}q-UWo)T`@COVHS}D<3KUk{lt< zYEriT8T@EN3wAFX96cOXqM-iK1RY&cn-!&o>T7K&_P^^>+hW1kz=hsJK6RsYWnVUL ze-V4Q@29;``g-6SPe$So;+LbCfT#ZI%R}-n?_Af1yYm5D$zDH@xr;9H^X1>tEY}7S zoNLVGDrf{8gD^=^L({Q>%>D(uXxO@u-3$i9k~Q7_2M!PS00{z+fPVkkmQxks9}f){Q_ zUmdW&j#qGQBG1X{pCqym_ozm}mrd}r{Gb}Y0bKtFc;BQiM@fxRn@MWR&OxG>rMmW9 zl#?AqsLs6Dl@&w%_w%opo1d@yt&1AD4EB0r(=okbfX>5X9>Mmi0xs^)^``b`tP5`G zK8X+^PQ|Oo@&m>{5o-24YmR+&===C+PWXQV@x=LJfD3J%%=9$pvJ$1wE2b?mSIqN? zn$94=dEy{;u>4Zzlc}p`0VI3@Vlf$nG!mS(u5U~{lP5hp*@uc?DZwG|P<`h?Ivg!H zJ{g6t#{Ej?+meMmhm%7a(`PL$I5}X=6gu92o3z78!4LE}@e2&Sul_kYs(59*UP(Fo zu+skw4H9<&Op)UQ%kd2lAWZW}R+#!WpkU%K*Uu?+duDA;bl{@vT<+yxj`< zaQbD1<)opC8=dZnKdG{{#zepcXm)|d^m~21^2r%KAlXfTR|_7;HTe{29@z^vy_&}5 zfaHX=UHhyi5^XZ=Soc<{Ys49tg(GR^|1B%t)a}U*2%sf`_ZOz*x$_A01)xx&dN<=A zMx9A4Dl!)!zoks-(=0DK8J z^VRW>P@v}u<990 z7*STbSs}nPXlXIuB8|xg9YRIW5WzRu8_RQ>J)h(A!n?aqb(%%42oYcn$n-#eF!AdV zZ1M^BM)H6W;h7jZVFx(I8H$SETiZbU6rTT^G?$24_X2I!$GF{2Ya28<(1$tSO6099 zna~Cx(j#5Tb35bjYg85?1G(&J9^KeJhawjby3CglWOjN~4!0QRwnC%j&~mZbkG^C?W8ujv3ixsC3tV_O zU9ZN%99vvjON8Lp_*aj7sDBSNLqdV5)dBb=lIRAJo62QuZl|H`3oa}R|c_#YXD?J+xcnk zK9p6Jl|K}zS->4KD0*cGudQn<0A;EWcc+&gnLJ{KCWYJ05b)P2LXm*|J1#TXH7RZk z0?UOjAF#Yv3|q|&JwptC@OC`Ul^bRA?b6~$xU$X5Rsa)%A0l35je{Vzs}Auzf?i3T zH8~2=9|3l>Wt*0&PmgoE7O%`;la4$%WaWS9m_)Do#*z1NPR;br5*B)Yx;MS;^@HRT z))uupgTLfs3g+P|8##${?`9by* z7om(CtkcUB5ovKAmGFbdgEUG^YA0$Opt6PEB`CpFuZ<&=gKv)BB!{U=!UcBF4%qJI z^m+NdJ4A>h0AucCwQ`9M)t@$ATquz#gHzu21&R(Vd}2i4CLN0TAHwdTNf0300&v;3 zZQHhO+qP}nwr$%syVzyhH63s9b`$dta+5bBGEaU-KHmUr-1~-B*p#m&Li4Z0NArC| z)M1z0RiI7NYBxafaaY>pYeb3c?u(sJA!kBS;&-se-Y5mgzBi%47356)oRb!)$!-05 zWJ1Y}&JU95tONVhBIEF>^?|kO;4%uhaFC4!OCie)u2NVVXKhMj>>sS)DkVEUm{s;4Gj*?goKI( z;xI3$zL;f5yb{3{UW|W3glRiYI*Ee7M8rfEJ-gOaq23e9cVzq#=%D5lLMpM+E3@JM zwRc7TX;ILtTMJu?TwIz9z0|0z{?q{^sb;FCo4U+akh(49SAO-C)Ms5+4V{?hl(9*r z$lA0wMaNdT)?%d24-|Re0uzOc}`?vk{3Ee(nVEh`BGJ zAnFly(M{G$l}tuYZfEf+r%b?P_3uM!bw(v;UI??l|BG^1kLUV4Dmn)pN%}o2O9~^T zLcFsNu3(;|@|T6t%#K4grWqpX`1T?8Sr11tq)8WFOwkZ0kOfW0+L93n^#lPp&1tCN zRy>{V{<8ZqAboQRMGWsYGJDMfStfnEuUdZ+?9fR9&;s7>QhDXFL&qeo6IA;Zlcz}; zb$4T`o#P~;#iGXrQ=bH+jCh5n0l&XCH3}o9~jPTyr&4BdpS=oTrP`o=%1?O(puMU?ou>M zbxvI{DeCl8Aqk3?fTM{yLdJgsZXuCvw5y)qk(iw=JwNYU)PAKR1WeU>b^@J%D@Jf1 z9ura8u4Hd7*SXF?)lB2z+Oo+@j|vzZ68tQ9 zpl6!TWb@xgI@xyC4$}kafycjbQ&n$5E5QD>Ndm9YiC|yJwK!`@yM9o-7im|c9Lp>b znU0T`tfxObpdsv<%ClQwsM=}h7nO(B3``P3WLdFa^Owb(Y#|ool>0khxkX)6=f3A^*OG0LH>-BDj8*aw zh`qa<-V26W;N1781)?0d3EWK<$%0+sonr#A=anJU#KJ%rhnte7(Q0EUzcr9O9ZNa`m9h*Y2RBGX3p$1qoz+0g zM4m*xMgSat_NMa?qBH~h>+iL9|BSLMZ1%{RLO+%TGn!-NE|Ae(c>919(hORnl=Erx zz=W4g>we;44-g(M2+cA!`TUH_1mqA`!h^&1w~qyjfO$1nT`alqc!65xHeyV@ym(2J zg~XtsxWG1aexD|0nL-Q}a8^4vW3(2NJmfhQN94v2REJGnS>2QyFvb-SM9@+LdXXw&?$b#ce#hwec^ z$1{0=(XA3k2eYSZ&l5j$6l>m)Sn!l+hFQ;Ej4`j*lOQ$D$ZpUfX)B1WziPz6Dg1`R z)(tfdWQ?J}4PVbmi^ap*s-wTGrw=R^1~fW*LZ#fnP^3bW09gU#Fm(>;w#N_Yj3f-U zWc{EB)-9}eIaEG^xM#3w@^uz2O33Dtucr+Fa)jS%IB0IR|bJog+R;BcC-?^T@r4dPd zwRKk*30w}9gjYWEthmQjX0a^VngG)ch5#7Y*pKK4B<|?ZI7$gV#q3sczy8;C-tVFi z-tegbz>k~#<*$EFF^|R`UotALpP+P!FQ|}S0)m<%#Ruq>v*Xi)Iv93)kDPLw4)g;}zVKqW76>X)WPKZ>L< z) zJ5+vb2xfXo`UdaYB|XM$N3GeITk2|AK5Tfyt^SKQtH^7!b8H~RyOT8)OfbC=HZICLRH4sq6E3< zIG|52e23ki>2JMIuK+5>5}V^x3}ko~mbgq)RB&@xtWZXr_^`BZY68Z=e($?4P8Km7 zTS0-Nkl4=h&LadM+$RGL9J^e9%%?4%Ux?j)qp0L!;* zP`k=h?^a0_XL%ic7&?e)OBh)x+>#*#?5mz9%XsBmV8`{b$yf6q36V3xKZGVVX((-Q z1IL7Tv?M~2yd-_GB3k9?+@N0hPBv+9T^L-Ss( zVi@~!4;EQTYf{!LdXwpR3kxH53pY0PiOtzN-NUNF=Sh1e5dcw*pki|5A{e03H&po<|8&d* z(ix*a60*DJ5hABA2kZ6yziTSj+#lA1P;=Qh=L1GQ&Y$mx+Vu~*bINj8gzfcL;*wK?_Q3NZ|x6Il-pW*Pr91pqA)Zvq@*3=v!k0COqKE4 zsB2Ex)|-r0UxBy>nYf4IF!B!-NgAnp5#drXp(XbMEFfiW)`uEb&X<@mb=5XupJ^yAQTN z!5P`x6hPrrPMH5REY!A-;@>o!^YXe5gnod^MK)|7;5c^sm@qf%z12n3c&W$c5&BU@}B+CeYv7# zTaQ~Vd;-WuyMpt5(3r+h9CB7R?$-=Q)spZo;d1d-`I` zr|hlrCsOw`P8ZshZmvX&y))PY6P#Z{n%iYM`?a+=s!LYxyXrQ-BJ_cG;e(6VapF~_ z;!Mbbv=VXWsnNKSrENr}ItPY|UGX)v9RlL_<>l?{tvv77t6?O}jtcJ!HZm>eY41tD z-&@o7R}g~VXNlkMd#SfL*m3tgXuq!8+816+|8zgSh({(xs)`Y&|MQ;%i0qap|B)yK z?m~lh%N=Y%m-MDuhU&YDu`kMUYIb*0LCZ6gJx(q&g0=fHG zv+!|$d%Dh!uD&;ho_}D@!Rht*f$J-LHq(oLcs#k7*bQvI;qLU+b(AK*Gfur~bzZ1a z>qtxAwwxYwa^1stkTn{>^;Ru+yjagsYzExuws)f3*s&(dd&7J4jbE#w?Y!NA`Y$gm zpd>HC*=ADinANH-#~j&wFT*yuF==OB6_-Xt2#Jhf0I1Nk_3VGk*`d%Ak%WH{9y0Wo z`xV>IFPZ)!7#Pu9<cbfDNMU z2$ibdvLZXp0pqw;;U~-?iL?!PAi-z{sN&oPl9}aaq*6z%Nhbb6%`#R)s1+rN)p%>@sTJ-QB#h-Xtr#`Vl~6^B+5lYCBs}#cR%JkDy~N+URayZ^le$I(kwH>WtHsm< zV?{}2l%~;GNY(ZGSWr!RF(Hrr+Ho`%`+>)KcG?bqx_4?xu@Z@)&T>%y1+ zL>2ioN0X`>7^t3;!Fc9lD21Ig2F1iu)=?Xf&xXE=EyI8LNGFXA4}NgwAW=CJTFe@r z!a?$uGE>s*Z#^JVYElB@FUGt{mML3N1ck=9Q+s%NU-paifv_1ZXlpb!3F;asmBh;K zSQ$2zO_i~RG8-}ey(09x)%Sh4!mO;-Sbg^Dh}%ebzhIA(y!EV?7bCvqkiF&;>+Bbx zLe(w2Y6S-B_OWFh9OYJYp z*`4~XYt-x1DCHv$&Q*yisnL2-X`$MveSHUM4zWWs(w-vuQlkb_;fzg>u#xNv8W%ym zz8tUT#l7KzYps{jGE>dA+d`RdV>XxxW{7{=QZ+D0R#os8Pjnmz%V!kqN9A<#GJx^SrwxqMk1kMIB1GQXyNt6qn? zx&&GQ{QG;e{h2-gz2r_gtE2yP8$@~0!0?A7cYLy|&=hD?SG$*#(Jj$^z2C><^Lv@S zx-8217DAs${%0Qh8O+>fC`i1U8SORU_cBE%u&uJW+uH#VveSO_bUuVPW z>mksC?}~ly?i0ELvDMn4QW5*{>ifICej;=QR+rdla&?rk7+8TCl^(eC>Zn5G+iXkA_}!xwV!+avk?lGDO@08P z9RCVDw560l zoLgio+4#053ukoaIUf%8ZY8?*V2{wz(KgH>;*k+9a5l%8xkvW9bv^7X8agEzO~+RV zZmKHVFT`|>Z3?c|Mhq(|^!h@1+S~zGeP=MrZ=#t6eG`4qsC+#{?@Rd_ zKbIxSS{=9a9%^iL+i~o61>>x-b49nq1zcao2yxBBq%PNOCaVyPA=H6meTBPc2VSVW zmR6(H9_4!Zx42QZ0;lHm;trsfh=J{slc^ET)qTFRgfj%XePo3CTYE)XozQ=-BV4Gn zSBt!DHz+akwx4X-sH)QlQG|A2QB>w$O87BMLrBt^R0qzWz-#aF%=Z97yqz0}R8N+0 zqtGpH6RkWgM(VaXf)X)QL!GHdC)Z_-IAS_2tsX^)3?^mG2hNfxDIH3l7yxJEN~tRi zI^t4k6bc+5Pdh9b$rttYa&z;(SKR6IsWD*9um1FQ?I%7CP7g+}&jS-&4AbVr&*|~B z_YV$MSoQjCfj7hUhaXh)>@V-ANa@uH?tfF{%bm>7M4b~PZX(PYJ&5wjpv9DvcP70N zahqtNtHA5$u|<+ImEIPpQ8{d5bF+Weeo)(#g4WF?1+LnP+QKZ!`*rvAcE3M(Iz8rn z$;`>?_j$zDC)D;$U7S&0FhDYLW7StXai-{c!b#uI;^8VY?w+ z9cT}vs~sQYw=4Fp?{wIISMQSZ;qc&m!LR<4ez4j9Px_$-(qJO}Zu#bp+ZXLE_AL^)#FC|FQ1X!pCK8Qgfq) zCiPQma_IMUs7-oaE-s#Tu^Iqh_I{)%O728G1|@2*1b3pn-Du|K=BuHYUt--m2E{$v(VH~g#r(6 z`GGNXtqjqOYSLD}psV2y-j&!d9onmNWD4^0!0P)k{$MH0%Xvl|H7wifeM_+tW7A%Ac?NO;rrT%fxSP=~ zP1F8Y9n%`-kKly~(c~9ls)+Sg$tb6>${?uJ;9{{}(Z(+4^LGA`-d=BMIW>sX1L*4x zw|xqv!bVSJoZ9|ZlPnC0y}(i9Gh`N5^*R$2a|6t-TaCH#EN9_nBWliVV1^9=XgU+? zCAC3Ge9WL9#W?|Lh84ZN=>nxG7;6|IO$0^6d~(3p+sQgY%0M`&vqbj10D0v>Ze5pl ze}%P1^GvGSmTHq*1^WSHTev{ZCcH6lgs;!b|L264#sX`U4p4*;!L?KleJKc~#}eyI z5uhN9bLFp?3|d#>wHwu%lQyPiQ=$Zh6crB0kU`3RUaXzqF@;g%MbJs%D78(I0>z4W^wLc=GVD^I1@y8BR07sNNETKltC7PNw0+j_j zKyjLGnjyf%QPjA2VtwfDvUK&oyuJoZVY`}ic+$h;>FV|I_^Dx^Danu!hO?nj&NDDm zH&_?~=^@R7;0p&poS71GLPoOGslh0PQ;8$quHTL%_d%sAwQRY(2?4-`?)^S*93;ie zvrBUOLCk?6`!;gkbikAx7Gy?V+kcB~Wx11n^%tg&Syaf!PGFij7|jW*0%>w$$;D%o zvz2CnFspgwGOe)_)=aqgvD;BNi3lrn3+4Bpk^x93_LTHvz>P+yS3|TRSXy_n&S~2; z0K37Uk;fPwWV8gFE4p1vp|8De$!OEf52q5cN0RP48L{hTLA#c>3iqV%g>T6DMUs^^ z1Gn6?BwDiU>|{Y3r};wU!UrrzdXV>VhBSr5B1y&B*8-W$Ghj173nVk<{j+evOSZm{;?_2?XvFnm8J}GXBl?@w#_9o|sAW|F8((j6#JBW9-CthC z@KxPYNZ80i`rClL$1+fJL@lF!;%GslhTiuluhreD=pzza|G~iv1B9QREBlM^412Io z__HY?p+G;-!7eXAK7s4tGDM+uGMN=%ih8+wqnUU&S+*K?c7-FT35tajegmErEr_eg zwTd2<+X$6hl6H>;{1LvS7J5e=RTp}Q*F&2gfC%|YW4gu3(_@;U|HrT(h~%-yv0zG+ z$G}9=;JOeLn%$I?8jmoq;{G92n{K3$BN(-O-af^9+!ecOH`C*H`SVv#um2nGnKsg1 zj)`rZT|E>7>bo8!!^)Oc3X$3P3bzX^iDb2R0Yb^V#!4tJahosMN7a*LFVj~#cSJ8U zyL4xk07^O*Ey}b}9$aqKdKu^g)M6jN+7Aq=?a@)!D(+ZFDHAOG8B0jFWv`1cQ+UyqYoXfPzHTxF~QF;PtkCc8}X%*_Ix4BS?wh zlHQfwq@1PXM9XiiZo-XqJXr_Bg3(dB08F2y)TUJ`gX=1{QhV#%-I5+*U)Ug+%eab( z#$3NVttPE^QM405kd#ca#SDxO34&o3K@%BFMYGGRc}5H@i|cru#Q|%s!;I35U>sod zl1QqFC;~VYQA&iZUuxHlA(RM(5g@f#DoxO5h2XE>+*@JB=SSGfBPrGOK2S&TePlX7 z%c5$WVB#TJvOK_}p{{fmk=m8S;#82ezi|tC5pRRT!rZ5KuDX3azs}FUc7&{U3n@g< zuPl>3c-**W44C$Q@8o-F<@0%}!-5FMUBcc`MYDM$w2X{dZ5TlrzjhQ1y?7aSP*{FB zPzJ7!%7|I5m^<%Jgd1od85qTDfG>eFV*%wCNMZ20Z-e+`yxm*}b&fTL0w<%(iMy=q zSbp5K;=rl|>BL9EIrDKSOGAPMh$CJLOzB>4?!A64|C?a0;ivP~K!S8*J_>AT2tsqeAnT13K`I9>VFZD=L;Vl9cxd9$YoCGx8j1e0eH8YQ#j-T z?N$RD8b9A;#P)Wm0deH99h;wC65+)~_E^jFt%8z8ZQ(ZMY0?ptjj_8}6ptcHYa2}l zCK@Dwd>%VhHV=20N*;WKUXhEqsKeU+Qb1HU(4Z0y^S+RlmTTW+@*6UPOAmNaE`yj0 z@$^5)04{=$I{R8A=%;B{=oru>`5P5gT)GvhB;s@3)2ET?rq0VbwA@4L@iT`uso8pj z(l-DNXChbc)`JVWn!n###;D}8gNfYkb{usho~X~4GIuJ zx~PnT1mPIyB8{P%)O*=wLWu|Meswa9kXp(+X!M%hh$Nu=ac)O2z7ny5m;6R&@qdVi z>QBXc<6d|2g6t1S_HGIRCBXSypriAV@2yIqdVD0R&GY>M7bcJ4P&GhhWO6YAK^K63 zIz+ETkAYNyME!OY1uTO06zPUO<#-$zC|cl%yR(<1{l{L!r%n+DXb4;4`QCo>^? zA}#^VO7dFdTbX;5HQi_@cim|$^A8gx2{wRJ3VQ(UANmVim1?s^HZqNf@2@tQDWXzU zAt;!MjN6N4E}$A0s3kP2a%7JB8X_-+3&u{j6fDn#q4~GK$qL&KJ!Wx zU{@JdI5>?M5_}O_c&2qAe8U@YT)#a8xup@YPJV98Qe9R#j7)%tH|S$1I>8yQZ#cZ# z#bf{lu2s+61w~{othuLP0zi!XtfKbua>(O+ z2!=wds{#fNiV z@x~?C4mYpvgW|sqCi#PpcD&B!S+mXiSVrkmX|;OY_7(iNu&QKCXFg(dI8VZ^P$53* zodt~E0*JVGtTP49#I$>0+%_sFg%`71B2ao5X|O0taod3s=5C=4ZNHuJ>H7WKVl-ps zGI@w-{RqtcZJc;Itl34&N?~++dREt3w7u*?>}20h!C3Z|&T{!07o1 zp`5$Ud!iQZ&X@CWUxzr;w*MR@g#T*ZEO-+Z*@vuG(8g*Kdrhf#hV6Y@%%80`DI-2%)mM9f&6wTX zc6xnHr;VHCt=&`CYA7Usb`d_(bD3Mcl@{O_LZTm7c0zkK5xana2yHf;Ya`~}E{G)J zgO`TzBn@q^eeNVz1bPQak;x~F5bnJfSi`oBt8_ebMhSr2oRnwzRIe99ImJ3cET>Z} zgt%E;U9G}eX)!uX$*}tDr5aD%bwLn=->Roa(UZJc4am<}oI$T1pdl=e8iGC#w-%KA zWQU_6y=ZhBmj(=9RmRbyJpNFwA^jC;53_@M;BMWYkfQi`!9xsVqXY2zIgQqnA65sj z9-yE%eW#A=DT99wOZOOUNzp|;>1I(B%#U^7FWV${!MGQPY$jJQh9{l-AOl2Ev5Gd- zfa14bi(d@_tux)8qCEn=zv{GK!As+jG{6ElvSyx*Uv)dR>wyjMb<$0a$pwEUFif~! zP3vcY7;(4)p@Msi&|>q6-P3ousrp>(l1xnfb=-4>N~hRjp-_0+J$H5qJxb4~`*r&o zfOmcz!o{N@6Kjz5o4dRntSU(VJml5me4iHA5iClW`dr{$@E3f|_Bk-Y*D0{dmVh9pR&j8iC~Y=4zK`WnmkLL01JxfINF@FJ_s= z>HAY2t=rddZ*Su!fHJ!)dUh7xES%)skj7NxVPw&Ox4jY238yqQwP`pLC&nRR&1N9N z^VsRd1$3$hdwV_tQsrAHaT$-PR<`Z-Czc1{6u$T>pgu-#%qv31-Kkq$MaJ-n&*CeI z<97DN;O#D^{MOqSTS3@%-8x3?3c$^P?pfsDOr^l-!FYtX5GH~jakC$Kz&@GrXu7wb z#OGS}{rb0x@!x#PTYX+pnX%^k&eBtxC#&a1IFt(C?b!40nxi;h0PDU>dBX z9V5*9Yh;oQwbWHDr$`(HA0MBR%b!0j;cSv1)rze)@pqt`dVBt>NSeLUNlDQE#D62H zLH60|V|k#HX5HE=DC&+QS}Fro(2oEGhS`D?SzCYJdvlZq1zB=f7WA&h?P#FXmml7l z?leg?<+mVSwKE7G1T0g@79KH|kM84-!*c=w|1`--zu_WFR{IdF7$jHnQ640UZfF_X zx3fxw@-sc%R8M`*SijJ=?Q)JgY4@%&tEV`0b=;{6@MGCX~s!l zB-xfV*mR>l50eW!`niZbrny8vLRIlK64)KjNI6a!5S}@@k6lrGA!<71(pBP1)mfe= zG$AaJm|Xn~n;O;!E-meWvVPW2+$!*rm{>!`BzTv_N~E0_6VY0VSVXbCh+4fdGi(TO zy#|c({^}8-({4emiGI(=6umK{PzVh2^#^HuC*X7k!)&Iqe^EYp}LIlp#I zafjJ5)s}X@^Tsr3#@}SdBEJ14LW>+~uf=+A-x{Z5c~zp~P6twja$ktg$Cs|?{LLJI z7twSA({OL(?05}jti+2FF1Nz67Jip>Aypbviqqn>FH~o3GH3o2cOV!-F{=b|y7Eo* zI3BJZUcUa3D-EbNdw?8o56jlNuO8ya{sjZC8s%8MI?^%RiIkS|42Jhpq%?mB?r`rQ zuK;iUHK?JQH7j-68$YH`{l~+v{44altFT0088D5=h)4qQhCUmdC1&BY)t? zu0#0E#pIUkcSFQMj^FEfJ&}F55#D>LR%O9;vZonB#me^AI}IuG?$*l1#jV|ku+s{8 zPA`P_(2u7x8e5qNW%URnNvCYu0|^O3dWvlO^X>sn7L+gjEHS7v2uLRYQ_r5F9mp_u z=8KFQGimPY;Y{`H^_OVa>~4@zAw-5(0a%mcp!c-KH;qgO;z~4|o2sDCo&p5R69{Q@ zzzEnSL))nos2$@kts9w{{dEnJUq|83IV-GTIj{>K< zzkr4peY#qx%BP zq8a^WQ2k!Ly#aBMfpri%ORZu{s|y>ZMKJdoqIWiG4ZCE8RPFbuD-1_u$h^K@iC`^aQ8^ZCKu)^REo6->0 zgqnq@5{C^|OA>pg-6lt4Qqu8?75Xp~!zfE(shkVPU;?4o6f-=sJE&9y(;SkRG;&i)2&coWo z4!)xLc3F=#8wn#)XIW9IUy+xQN+j^Bg>SLI(g6yevJRO_*Hvo;5EKq<6ueDk{oYD> z(bT>xzpBorqa*BP8{6ux<+9=AJrg^g%lNO^(bb3e*n{-O>#Eiqd`)Xkel1>E!|N^K z=5&$_-^$S&!CU?6?JEBNqR{CmrDSJX|C@zAUdBOI$wEupDxs^aT$m*d2oa?OEzKOQ zgnD?S%M*Nfg!+WC@@zsUl2m~8XND%Kprbe$yS96l3x+|B3Ntk9Wr5n+{k=;-Ifc7-Hl8n z(URRNUl50un8Nm+TC3Ej^CTW7Ck=0=U-rC=do*BZEhW4e&CHWzZOgq| zFG#iNvrmLWU9xl7?rd&bj6xfA#0d+OOzatW-O;ZzN3b+*SHRcwyDHg@EZQM4cIHt_ z8gg2a8D$5bEn92P4(}OQR6;Nl>WB^vW}%;$yzttSF*$re4Vlau+y6CfyyBdVCGRLp zPNlP~UP~eh5Pe_-zl-PDG)`G0&lPHNEYS1)9d~TGcU80`Rjd&1H>{d2Y zaU%y>cEwGJ@s-EeGUjefB5|7uTFcp*sMZHZ#-5ud$~vnKdD zX$+z{n^6Zh*=m@j(ZcmuxhNomBq(Y^A`+$XoL}o8yb6UJ;%NB0=9a1>MWYcBj8fFv zWEan7d$_*{>6dO{;Os8`6G_TXGNnz!y8GhWmA)gEX_2EIGsd zLYVKZwXSuy+&QmJsk>J`VZ(IlkKH2KU?_r;~F24JR774#E3}E8j zL1hE0&#H)9$eY3#CdOPGc*=?_f z=USQDAcQ)^cV*xes~5eyX1|t`B6MFPp3F?99q-DTu8BLRCGv5W+pA937cgaciXHTE z?}`!looy4Q1k7=z`{;f^XVrJ@|222}&+9uTSJCD&ee^XAhP(uXAOOks$ZYjINx{}3 zZ^}uBzVti)NTiiGt_3DcC>!O^zjp8W{(a7NQYDKtv0fpaM&u)&p1melt?3-wrWYgB zo=+}Wf>_5+=@7HDyUy;^`*%?^yZgtx(=dp>Zl!%nO6PZ`k)|PLgaVTr5P&4wd>c zdzsRq64p0yfM)XFkh0?<(qrG34|XanycXWSRN`2-iZGD$BNdRZd<(-2kv#8Zx~)4Y zTIdLX)?hMZ->nNa$X70s#3qAnA3|ye6p<8H=|F2?ch;nM8=DmCfCt$bb{l;}mAnwL zQ5a6kMrG)T*YNqJ+R@VgX)}ppd40EOSmCZGhGMoDx?noX@qAki-shyD&fJ#m=$?iK zs;b&4S==tWsd%mOB@;EBa71oC^!jPh@_yR5&C&e`-Pa;NT(?F*pM^C~Hw$I51-V|{ z$dKzPE~iDl2&X6Hh5Dqcu^B>{*06x7Y>3yaG`h5iGd1^mXk-vEjQ>hL_mMw1`V%Fj zObIzScN0l|{!ecvN+`IGlU-eLN*;71Fow9bQ3I!29|!?$0jAFz%=#v!O&wT;;IC1<1J|;Nsjr-zad?&xfDU!CDYAcAbk?Zq-9G;uR<_ zC03$Vwne0kW@JW(oSv$$Y{!_Vb^f$`u3WtU_HBUw0|215-0%sS}bcp%`MQx(@s-3$8L2hj=Lvi>8cw?c6oK3rEUazSj4Uq|CY{+Mza&| z7Q5)9`Mh2K^1o%FPd)bZS3Bt1+(|{i=ln2{QsuIR9x=YdUTa<2ZHuA(+?Hp6iHU$V z?a+Qy*X^1iqi2h1p-09VAc7;x#*ws!7&zbfyue9&co<#Td^2~JTgdm#Rdtg*f=R+rwCh7O7g2Fc!_x36|xp~bx=iTe* z9;R~5B9(gFQ-%MQF+4|rt)95=H0|XsKRKn}iR0*%>il-v9d{Ec<`Tcc<@0VE&u>6? z)N?>@j?{1)PJ1HFZZb(KyNzzP$do%w8g~?*$jovklf;Y`LT##Y<~|s~6e(<(FbQ_- zTkXMcnHi!uQtm~?{OU&OP$R*_&&1Gi(6=rOOkm*U3{-hC&^}6#5}5<;$Uk6i$Ae&` zP;;8}7t(y`gpZDQ%%Ba@H*Ab&h!dR%vL>vVwtqmkuxjN5t3uZb=N|+l=(!Dzq=Yhr zUB#c6{#2VZ2!L>$+|ipk%=#7-sYuX`bJwIY=h3cIX)$Gf03ky{4XE}kH66J&LH|I< zrA)#hYNnf(ju}Ty82n2N8u98970inx3 zWR2VRmk2=ooKDyG-IWXO9{-K-RGOI0 zix?JGvWlZ*I}KPwN_#F`*=o$(M<7!_-0BRPJkIwyo|JUJ^9b1s*(4fuBm@QC8m?1| zlJ;+*(2{O7Zp`i3qaOkadqEkscZJH;$oF9GlO`Bj^Qp=(;lJQ8_RQ1`JXZje@P?5I z2BXMNM_@)!t(l=zajj{-g|3?-GM^o?W5L#CYd!%n!@c2z&onq|jPE44U*RRw4fEbt zhOG@;R)dZ3fH*%whOnnxvaT!EUdQRhkqtS9?PGX=mqW5tg$P5TJ5gr8U5bDK19n02 zv3otU-UD!*0ShK}o<>7iNT=5{27e;ng#aaX6@tUGa}^A~CVp9|QPI60T3_D{G3_O7 zpu%WO1!>Od51^lFxAvKl2y2}6LlB;4*2l5lYbci|L?lrU%>3=cdNSP530_;Q0*P2L zt%d*%?zdv)*f}`URmPIl#es=szdBv}cD=N`%85l<%o?m1vff}%NOImsPn9mm*gjp; zTyur}^6Ad1L})R<;9(yPh@_x`-m(X(JWK8-NK5E6y{ui`}}8Vh6-DeI6A4GGKE?jedh+cluF7|W5X&s zyIZ*>bF*xu1xN7?hOK%%GNcy)>SF6n?NNv(_6HTJ-Th!T4$ew%sFB@3;lrF+PhyMy z?tq1oWCyIChar<}P}{+hqzMmte^IAluyZ*k515sDAY!8gX}24`crFPWPd=cfgmhfi z74i$Pz8w1$v}66 zD_)fcs3sY+ieJ@D+CMT-bH=$60e4~%j|Gcc(NN5AGgA7@(5~jQA+4jlfq&Kad>Uet zN2VOy2=H$y9dThYa3+8=;QB@8R(w-ZY`mq3?w#B5&UPDhP+uHGPpvzY*CLkp%FKP* zy~+cgjWPq--c5N}#fnBw z@8*rJ&2qcqp9#e&wACv^DK)XuB}I7AQnIPx^59UwCfx_CIhM?r*(6IkFV)?`Ukf26 z@seuxPIwBi3|%kmudAKCw`{D+7TbJbsJdI%r-Zd@HF{0yNL}uN-Cd`6j$NX??gt;^ z;#Os(J;86-s(e}x#3U`d$NE-#cPpK%MDm0m2UGc8-Z9&^XW$pA1_A%_qSXc2@T)5o z8qg71RVt&y45&na9w2r{81{3ngyF&6?(`g4iDEt|E;34%5nKxF2fb&`2#P{V?hkCM zXp`F6#AmvbgD#xQEwOlF|9G;~@9@Y-&ic(pD7*EGr#=Nnx=-Xj`FG-EA0c1j$?>ax z?9u*p$k)?91->5gaL_+3HU7bgv*>7M`-%SE%%Hbi3$09h{toug7NW#m(ZuZXi)03V%EI^xjC37HC$a8)uXe$IKS|G)d~GhZR1TqZhM>d$uj8A;e7U$2+Vb^0) zw<9e@`2=nQe!vbO^v=K?o!CMkU#UVj$3?B(C?A`r~=M|P*#0X zP)`(G8z8vZ7!RURo^wFFhlo<38aX;3joou%=z!?Q_FwT^JQl5ub~n~?3&?73SY3Qb z|5g-5lEZ=b3tr`G-9li8v8y^X+2Wt!4(hLzX)RD6SHbr0_zvHmyR>cI=^8g14(m6M z2;05Q6G|(PervN)!O0O@_ZuoQ_7ThmSfXlmeAedq#{@EE+sn9{qguz{8yaz|1-hEx z8F}mPCkom{hK3E$5=5D5><0!=4e1E+08gDy!O1=3EN@?rpAe!)d!quZ@4wjV98VcA zfKSnbi9vqCNNF=@L=nY;?{e#@Ge3$K;P5WqK~jkC8oHC>Xun-EA9T-DYQ;{~w7%ccd06##$zvDr{u#}+S-)ka)gMS7Heg!C`(1+Wz+u7aa_2n%(MXx5Em5(=5 z0K(^us5Z_V5y*~dV9Fzjmur}-Oz=*L`e&o3*iDr|oePl<|l4nCx35R2Zg}~d)upXn~ z67xADZ_L`rGd;}$^zY-Km-aFM^LqBrU}gVyUA+4kn6l?TYef238FtzoP{rVkt>ZP}PyKu9%!V^h z<6zi$n?hFE7;y2@kooYtir~jfo$gtk(ylbb=CmcFz`P*LFDFlF&UA2WbmU^9f;L#GpA9P_x(;sS*`U0Yf%cwLHw=YraKzgDKO}0%iQeA?QqA zp9behkAgw{Z!*JJ-luj6C0IP_iftPa1SyM@Fa|(cfQD2qJyT+5hLQRb)SL$gRBTny zkxh3R<<`8DHEBfGIX!^@np!X*q4=7y?~8_{E}DgAZSva!zr(1mYY+h={s+wbz6Q{M z?kKR8Jd?MfuQr7tG6hF z#?y^qw181jt}3kPJ!MpF(IZt$#K;3Kw$QYR4ID0`z|kh+jHe;ts#0cwI%9N@i=6Af zgAw}j1??y2nl$#P&c#HhQr{53d-~3nS6E1LSI>sLQ-}9`Ip3Zy*Zfm-^xFML(+8sd z0Fo@)`-BRtiY3bOOTNL3&d@<5G!=7f()K)4bQCSmYolw`mxVZMae`ou-U!x!pYn56S^~^XF*T<$-#udCE8k$ra z1;yC2>^~Gk@PA*iZTqi`lSh=_=$f}8O=gA{t%LS{h3q+SPZqkhh6aYvjqYu03=Z0E z?wgCa)hqYQgr4~^rkrv60ENn;SPKERP>!InfvOL80=Cu0SPvb94eYCMc<7$7zS~+8 zb36T%eFJX~mAyd5J%oPX_^Ku{4pC3>bkR1_{o8%Nl}Up-F#QnKzvlS`7vz5>j#%O`ed;rE0TOrGUxpV zv+k>F>~-7BjdiJ1C5QTHtTWxY%(}kZy>sV+{H3+(6nvB4ea%ERbSuayi~hX1LJxF9 zxOd0YzaEg6rBwYEU%+bkFja~jTjux+0%th zEO_crVoIJU7Y;S&OtOfjzX2;@891TY#bcU8=()%u2~-q@5zB<+MI`+SZ>TYbh;U9` zYU}8-B>2IwWgB?-Z1e#K8lntBoxY3{@&03J7KE&T3;}>s+&VIY)u7v98X|3H+OaF~ zy=Nt;PQjM)4gEx)Ns-D5!?$B^#g#KI0mrXA*ic#NFM#0(=<@OsHN27-peuwinxNj~ z)#dGbMpSSi8P%@M>fn9I?-@4jIw30S<^ABBS|1cXA{?bmP#geqb%6#JDP-KBG;Uot zbS2*?Je6_Q&mq*=^J@WhN*Ifz4xTX~aq|zpHGqoe2P2)?VO#Z9Q2zdU1I2_ZRjkWw zF4i3AD<%@;(!CPJbltDj7hv6THy zd7Z8(CfSCDe^U4)g8B#fA-cI@as}FCNpTpJ7Z2Dz-5~6%y{|8_;U#(A?FYCD5 zyboPJI03SlFV|4R6ZA$)IfZWtzu^XsVI~Rebf-h^RR=jg{}$TB_a9D1OJv-F>E}R& zhkhc^>-Eg+KrsCH%S!Sj+nm(>^>(`a!zoP|p~aS>-nfS}{^QG`M2G0HP!$TVANA&o z_0RKPR%p0h&3r_x=TqPfJS!F%Z7zSIl9dyJfX{URQ-GD0r&i zX`!U)lntgyOePhP{&%x|ZMwZUhme{1=6l>d*w!+p`5L|D0%3++Q1e1$o2inhsbVbn z3SNADN8aF`?Lp%Hm=qbtqUvKh zq~LVQl@F7bXTrrX``?zg*m5THoePSd$lr?yN2`@-V44IZk2X1emx(kkiF+ zc5$4>ABs3>dUXhm^Z&Wc>{d7MtqM80eoQqj108-oh3vNS659K<^n zzn4N5vKp~%vgMV^&RgbAJ9F=#mb77>R>_g-MJ9t@$Dmh497zPsv6C2IL|V@luR;SzNGH zoFqVWnOzFx$)@mz7+2FkRFShunUZ*Y(3mu8e$7%L#*!5o@L~&4Uw|$d5=82tr7ZF? zD!>M)C2@y=N&x)3n9)Eq7@A`#*hkIkQ*c+3U3>aL7pZ2W-(VaO6IVC|%!gCR-ol-u zo^;KO7!6UBd3vag7ltA3R`_;r25ZQUK$R71T-m^C8@!jf_AFQ>J{8(gv~yX1VfT#C z>F5k_lt10?bB{n=^ndloj^HT)FdV#&k7V6|HHVF7!Sc-qhM>0lvq z{J;18;O>Ki{T_V9k(#aY3N1@)s3~2g5FnDwV5fqvE0nz52U#@Zivl+Qxb!^B1sjWk z$BFE_CdkTSnmHy=OLl7;n67MePIUqbg@FaX6bNiATj0Lo2@AcT z^*Jp83GOBEECkrdAz~usV#W&=!8E{#vVxKYkp!3!7y=p20xy#VPhqD4^dNepPz4I0 z_IscGD=Ucq$Cs1z$l0bSw2R-iUzXyI2IFLCW=dC?kONuIqHLF4|3d; zVEO?`)5CFh@kh6BjX-SJ*_(GC-u}e?@$MY;A*5wxn!uW{byjvj09nEh_|8@w^a3dW z(~>xfi)5|jMv7`;gX+fa$Br8CCWm3Mgx!t{Iw9m;HwKg7%Q+)qhSRpK*#cH!qq(;r3s#Ciju^e)Sy+++3VAPhfnsN>~$2n6T99s zy$qUC9r(`-lw7}N>6mOgqrkGlz+!Y3R~%R7Q_$}Z^mjRUwBOS}L^FCc1Cfsm+6F~0 z*G%u@1}7g;)~NEX1*U>hCo4LQ@&cHf8^Q9;1+ZI#L$#z*?TOL~lQj+SmX#eX_}GYK zo{b<=-OS>2J~kITl{Q|qhbx`^*vt$aKHnmwO3=u(0GMl%loyo9QnIEZ6FGlRN0+V^ z2~yW(4EvEuo(f}riA#j!p6vY%V1o>W$QE%al)ACh86dEN%4m#fAzxRJ4DXY8l=FP8 z!4s*~@$)jxR$yU>9{SA~!>{p%cM2LZ_@Q#~UF`!35F4^*S*!RoUIfY@F%w!f6R8~s(;*63sQUXi@9lfnURFYM zLtS6Qxm!3G>J)rk+{9nXTthM}+dp`6LU{#*gW;TC4Q2cv!JeG3!2p(cu>ga?Vm*HN zi>4t`4jW)d!^gbfLjd|QT4|q11A#bQl*KTmWs=bFKeaXbl@0ISY~ z_P&?7Q??2*RpEznML>fYh~sP{B z!t6_ho~GT9taq6XI-1HHpkt9?sS|UBUrJm`96CA;=v}^bzz0^QRd)@MI&GvB6Nhf9jg`8G8<0=^I368!p9F!zD_Vs zH1P>wIPybs#8SbS?yy+*1R=uxy@Q8gEtJ_Vi>H^(m5ynPLsBeo0hdCBD#vvJ?PNv} zsIk@N5eU`*`4ym7^h#OM26W>(OiQ!E?l1>Dnpy@@sSC23&FjGu`DP&c)4qO-_^2UN zcJ21lm6giABUD9urQ*&I8&w%VmYwk>m6VjsIur0=0cC838hQ;fy?JdW>MW^UfdCBT zyDEFMe*kWwC#lv}?v{UQl(W1|)t5amCy(o=uV&Ufb(c z={^jqY+y_ptiwmu^a)|`ez)@G%tB&zJMfJ*U#uBgHpwc!B{InKW z<^HJ}%yi1??Y^6Izk{j?*FOE))d(Qh=&{TQ}yBt#Ku-fFu#Afm{EP*l46HnyN?t5EGz9`1r924@wqs&vU1^_kF2EQ009 z<~s8>#(6;vQl5~3RN&2=z3H_iJfE&Cjjgw-`ww+)44<)AVAm;(nX=`6|51PM&^^*{I&pZwPp0znCv2IRWQjq% z5z9COObu(N!%q69${cLZ^Z5w!mAHt7%ApyZGg}(Suo7U5hem+Ry0(+EtW3sc`RUjM zNTP;FYOphj@%%+`ujBx)k;}=L6&tjq8z1|6Ry7%{ z_btkQL(m54KhXj(wCbGzrwve31D$VcuDY${^(g%q>u{(a4CptVlCzT+|2#hVa58-P z;pd-UpAOHC|NR;e_VJ@f4<0|ogzE7__DlS7r@lZxE_u#s7dAZVi#%R}udsWveygKS z>J_{%)Ulm=6hT?Cf>r4>x)C@=Ji4sBpmB58EZ|lzcDd8_=CPD!?s|`Z8f7Rthf-|& zffV+vKukgHuM#TKJXxc-)-Z;odpX11uXssAofuTQQuKtKi8}XPk5O=CPC}f6kOutm zorKOq$-Y=~fA$Ve?ZtvODg?aC@pa48kDpk-->=QEW3hmeBAFZ>8X+ z5YdWEV$2aY=IpXgEQe;TJKZk(p;@ZBo$!2hMVZ;fak}J5JbsZ+OH5Q>Uqylr?1PSe zvypPp=I^xFqzcYQYyulVRKqZDLXZdoQmVV@9Ltqe4VI!zg;h?qRs-Jp(^G;a6GN0 z-`0U>Q3;~vtC@%{tBVkL*jB6&@$p%ehH&ax(g7lebTmtZ2{08Ya%gqC4=-{Fx_>aj za*Pa(X&EF`NH|ndXCL+1g zRd*!YP+VVtymMP9cVdleMvZ~Bv{tWkEh7#ntnbpR`VDATjc$zrFAUf|y@qe^8AeU0 z0kXW~8G{~msd^5G;zl&UhrMT*mR1B*NYRsP7I0kB$==WKK9Q_l{qhfjG%l(9U0(^( zdA3=JjS9{T|7$LLDJ~5+rqLRO=^8ZU>TZ&5&YBf9w{~eOAL7DG?43%asRmFNh1{&a z62s*G+ln7^@l*O2(ePjlmgKsNXo|$QzKo_V|5X>#JQp!tLG{<|E~j~fzW$P$!@B9B znw7Jmu2)ssx44X^XkJ&`ox7c6YFIYi*lgUkPN&#&bvjE8(HJ2P<Ta{R0)yvKoR(2Ia{NeLX<@#dblr z5>B~u|qkHA*n_ZK{PFd?T61bIbge zA>M^RJ4UDF&jAK}<#glNYPY4^;BnurajNT0#hiB;21>ZzeoMK4Er{lB6JNseVM%zR z8u&*{|GUS-Lntt@A8?+%TtfxxbL+AJJ8;tZXhSEU6vWs!yNE=b1RIP7?TmcI-D*Os z)4=YU1%7^`<-5u1)mltGL8iMsbtkQQRX0W#-0n1OQl9p_ko4+nRETl%{>3PT2+%tNeiYbnlf_2 zXsYLLw65kyJj-&nrjpGjlUgxytfV_(O3_O;KY^D-sn}tunOwr_vvImpCa;-1VSm<4 z=^k+)@KBiVmm=GoYRPCZMsZBx*~@ylWO7J!EJeW;8+p`xk4kT7eqq2>vMfBaLcmm- z(M8Vep8=Q2&f~`u@|gU_3$7Jei8U!`xgjOH(PTwSaG_Krr6pM~!fsevYnG8zlxYp3 zN}X?hfY*`3;gaYTSEOkDPT((IUW+T1C4_6T=6O!i6-%!OM`A|Gx>ztt#FA93%y@Z; zj9RJi`hw-45t7mzegn}tDoTI^pO!@NqRKZ;jO7_u~u=%z7dtZzU(GtEK@^u6Z1$~02xh?AvhEs)Ibzj9Tia~JjiqbD6%>OS%sj< z;xSWb=()-Q0W~JSmyiy$ujH74J~kDH(4eX!&rnmRF|u0%Ya3sqvsJ}7T@AhXfIY}h zGF2B~Q{&yYz+)-UX-Lg(D1?;}1$eZe>_f{T68%E7Agok1JS_z&gfs#)C`0ykeRLXU zIz$qx380uga|&EsTwpDM-=-_bRk9Bzt;6KSAGQ)iNQIvsg|9d+?Z6aQHT+Q&Cl9}F zvhh`$WR8gnxa{qEKGOj0@yr?H%sK^5IhFY)8Ou(w)R05QiM)iYE*89`nhQt~u2&dX zOd`dY&Ewd_MYt43)M%k;9;B3Ggph*pxENcO z-$2A5WMpRtK)D+fP-k9PNFJ7UPduWh@b=#B(;wZJmHCt$@t05xWSG+*E#sI<)sgXW z*gJw$BuZ3(JIzyyjl(52_JuUBGiI@X#@`1Am(O=1!nXrg2TTP{bxrfO>Nd4Wl=;Th z$`txLs3J;Vn<*rO1a<;ANRtGj#%{Cm5lc7!1Mn*X;1_ws>V}YLW*f5SyBKtnAnNhQ zK>h_5yL+4iG&_?e6j>OAa;g-0P|3;P6BJrWehnE!rY2!#-Dgdc-zU4h6Wgr!36+v= zBGA?xo0$(kpm0ScEg&7WV@;0e4KM0~&_dMk6w)xjN?V|<53(N|pN8G9Fjh3pdyNU{ zm_n~nOk?ri+fA@7w~S0%UYaRSkSUH44X^cz0~hS)SS^GZBLex?STD$$0(a1p=O&Lq zP6pqNT07Po^&;mfS=ME0dfU5qU=fTab*dw)Uu@{Cr%i~lS8g9z-S<0Azn$E{)6Nyq z__9EzPV>at*cS*WT+yo9z^JEJ&w5j>nXUSD3?}F`+mf!e+B({@gTu(#&|u?v$EY}v zjh`n^y5tTh%}2{k?*-!}=@uw-5h@uqR>rdq@huc?ovuhUe+?sYWgIqTeH{YFyW;!@ zqBrU>Gy34<3M}pt^A^u>-?3uQy)ROcu~!0O11sI(WeKo4)l}*MZxagiF?lVefWh&7 z4Q|gl1fta*=I7%#$KfW* zTHBG@0T1I1$<^Pg+`7_M@Ze(**W!UgdQoW1P&@`p_7{ZR?L4iV*#q8bw#=~&&#y*q zYf8`uuB`MKQB!7cqXE$(uML71Y-wu~I0^YY_}e;sNRX4f6Rk$(FCpRhSYAGA+OFdZdNoNENuxc1yF@SP)Z@HYv#F`zD96~ z-hfP8Kbue*Hv4VC+djBtrWJ+(HE6N&LZpn|QS|WwYMXty8So4nP)TV~5eBu*jFTDF z)b$0lt*x4PmyzeJn^#lC|1w1kc^QRI;XxmPjb%7-46bpkIb&}CtdaN-5{su0@_07D zsbp1-O~Nc)ejIBob3-joq0;#XJzr|S)HV}wS9}A6Fd8Vsgagg!-d9D#yhIg};bZhy z=jq*W1!o4C0bo@ev&ZAbjVO&d{ z?uN`ovAHmd+BP0d-zDg*_bi1Ti71O6Sw0D}9>JnZcvnQQh^7ny)|Ll|Ql|jR>3SY=?UviQO6CHT}(E3`B93^Y9NL(sl%qCG#sgeX|s#-goPt-8*RP}QwY zR6|ELcKf}l%$kkLop66amI>IhV5M>wWW8A>&>exAwU?Nl!q2yl`eRBl7-$~fYJRFYt?QYOQM&o2Vh!r2Uko(pBS_dBt)~5_UacAcW*H(_> z0j$xzJ+}XE5~v;aNlWLH=@Z_&Fm_ZP@*de9!&)>bM((vi0rEa@m1wNY+yVJfhY#oE z+k^!27$)AoB+LiY^c%{`UdNx`l12 zhg@@`5Dv7MyxZHoZTeupdq?o$1NknTU;2);P8yw&rb{l(jE1>@y*y;&-*AmSI6N~$ zPDp*;8Fma`Q#(wCwf?`I`~$^SZExa65dO}u7$vA@QUYAmPnRaur9G)9HBv8V^U(UN>HB7f}i&$V6}p;8~~43i2nkJ0LIRvBQz$L zhaxgLzcxDgz|HVs*eOB3>X_*Jhv4Lh_fCW#uV9v%Qv2HWAl~!gU!4?EWgPD1upfO0 z?TL@)5yi=iKAaLe8BN$7Gve!FG8w)mdw6_RbTW-IQzKA)&-BSLgTb3{bRM7iCOpy{ z#um9pB<^ws9$Mmi$&HW6Xf&qJ^vmbpZoiE3?6lE6uXWGsp<$;>V}Ym(Aww^uay3(a z&N9hGAhO&IiARVb@@8fs6&e=E)ybIs$nQdGQ5CJ?X5zZQY=1~1pI?nmOKXV);{dyM z{E6dE6)UBUQq9C|ya6$CR#RmqoZWSjI6`oN#QuRC4dC}e$y9o^ zqciBGT$OY#^bLkD@6#1Y86oa_&<{8>*jCPAo)0%42Ccs z1KmJdh|byzN44(lX#Y{5gc-hE}+hs}&{69g^Wvlqx3M?DYn)1+K+L(s0pu zu=>2M_?%u7JYek*(&T9QT$qVk)NjdQ0?(8tE#^ z1$B1IrQg0uy)jRiys=4%WHo+gZlEi;0%+D!B}vZf>6vEDe`p=pIkBsuNIaw!rBl zDvJD$zbe#bEDU84v=0vO$8vg8Wf>|=Z)CbXc0LyTr{Q^cG*PnPnqFcQvLZb3Po{K} zvU!gFHh6uMalvv(a;7!Z?Cgs@iPvhQKM~MXD!yh0p`-b4yypcs1Yr*bXJ_s&oWbXk zDOLa%=2;uX#o}31c^;&|EjLS4z=REg4c!4ffPy`N@)TfB9KdGmP~X3}fce&-23bRM z$oUE#3V0@`gAs;fZ6w%cmQtG;@tZlYjM@#8yGd7{4wy)h@kOPW^~eRp-z2rsESYho zuUTGs+|vnE9klo3qtJG!kLl=vjv*C+v;DpH*9iVqUPU@S#o_o3IS@XUtJN+)r zks7LoIjoS2wOnC*eEOhM+pSN$4NF%0MR%MHuba5@5mjTyBMwS%WNeTPb`h4Ujc7s! z16Z=M+(OCB@(T2dm$sn}ooiSLxe?ZCq#G8c*+NYIqXU-HxKhl#UJ1QJIh+!g@caxP zJX=nZGLfLn;Ek!@*NoUHEOXlsH;bNv2YV%{9S9APBe!GZrweKMVXA4~tRyXPNAyHu zwhCX==)ev8q+REC+agrRmf$23xPfq&#@%i&kZsR>_EKmnC2B9kJILd1bxjL)6;spaSx zuJ9rqcrq%xr#1A7AU0@a@tq1p7qblYyf7 z5?>sSm+L_|Uk5)*j!jS76&Y9B>`c*hoV$mPc%#wB;7`)B(e&SgX_kr<@^uDAXqNv= z^cRg(+iu!G5PkPo%mWfO!tw`D(x{c9L@H90Hg8C1YY(vMvUc}^p$-4u*$c*8qI6#@ z?VfYy%*~%ZH|r)zB-@~FSc&k0tTgjSW19JlSCzn)DV!vU)di@tR;o9rAe~6!VSqv+?i{e`^KdehLRl>Bam<`G$i>Km7s z4!_nUD^31`IKwRZaz}7&AoW_A6T=-@uZS@jjzfqn_SPM~j98dXr!ZtqLm4rbO|i?{ zw#}Ed+T>OVlqIQD!>ni69fig!84^lkp&M7v2O_?9ye^Tx)x*0!x>glFe#H#?ugD!Q zn)oQ}xyBKD-sHF%U6*fV_d&xiJ6#k(1;Qe^6{&$K#r6a`AXIbffiO0Ttj6M zh=IG3{uF$R;0ko2YDj5pX&4)87F!AgOjdBZl4OZ=76P{zm&MN?Rf8tR`$&8Bx}STq z3(`;1;5a**OZQ_*v#}TG57)7}9k%6W?U$|cl!y<-J|zDD#anrE+sLv1U!P*kRYGvX zL-M9-Q*&bQHKNnMCeXid*SU)#QUx(d06Gb99s@QjDHtAXhR_6a1z|D^DpIzoC0K zNz9`^$s}!!VlQKea<@XKox& zn9?3~6Nf9W_@KTtxp0H2^nLfym-!wn1~VT9!o$-LpAge*afyJNLM>&0GemJX1uftZ;B1*c@L@c@0lK7;K8(b{p9A0f zD)CwIcb%m$IER=}|LM0y4`CP^{bL7Se(=c-(X?r^H7|u50 zaU*7O?xw!#gB)OyE9nCBYUwI^+6<<(0`0Zu`{Gd|F)w%uzseb0QcK~A#K^5ML0?>h z1r;DKRD~=ty|Uu6U?6jsM5tF__=}zmw4uLsMELl3xJy*zGY$mp<3M&u8p&Tf zNKB9R0wAl>I2dZZKRi4j8o{??*0DGP_Sd3hkj}9Wc+kz4=+tA0IL`R{e- zxNyup{FsZw;obP%`19TU^gf5vC>h3h5u zaV;J|!YTwyO}tga;bYYmn=lnqH_!|tMTK~VY{T3|KIu;u35?1X08;5=AADjE<8V;l zAfch(@gE&6SO~dDK^!pvmLL~JXJxa}!qoA{OI`>~#~O*rgZU|9MnBcKFsFUer~ih3 zIQhd#yQ}f00~C=k1A^wDcdm7#X_wLB&RF6uMVde@zRbNCG$fy0RMFoY{Uzx%8Yw0Y zTk-{rFdhgTjKiHhq5aK7O5Tc7rh$(}jW+N#2-iq&jZqgav~enQ_OAH_;W1o64mxA2 zPLn z(PJ3j=P5*05QK_DUxa8mD3#PCBzA&QlbxWPVEi-%bPc8(uula5yRcCL5*_7DQ{Rod z>^;1m{c@thl-fsD5|#*g%jN!ghzL!NQ>ItRb?ii^FZ*z99L3RT3jw0e30u zW_x2@F2GU(Vdf*rHP;WCxS8YM89|xi0a0|l^ngvd!nl_LYQ_Er+0AUikhBXXJ3e9I zr2REp>&#UyhFn~8-w?=P{)^GK1@JYNRuIuoFoU}ih5DLRRvLjCz!EacsXv%fLl3Jn zJGwPsb4VY3Z<;&V{e4z_I5o3(%kwZbHbeY)bK$(2c*(tC%qc(6u}0$u)0#C!-^pe0 z$_Tk~+WJlf=g17(oi`c9Z%5hJV+36Y#=tg&ciY~ryO{-_l~?wr zJe0jC%M^Glq38|WaXLlvE@l<?i0&!f9>l_n*!wkbI6pGRX5NPE!k6h@cSMt>{V zeut@bA{YlqW`IIAPA8BqSm>@(V~xTFW9yNsgtI2EF2GQI1l<#u^q_`$$}prav!Uit zp4*ab&LB_riFT(VyF5TQF;;Y^Mx*bF9Zp?`q~;zO(M=qxa2oo51++kSV=HT)_D|a4 zx4(riCnr73XT2cBUI*Np0FbK?G8-&_Y*GwcAH6_2?Gg2bVCfZCM7FgrI4!i3!D;_g zz%=OEG|eQQ1o(fe9)ZC<<+Gfos+yo0+|4y+BXJR%bJ{B2l$p%>4QDwCrw+|vN(GU> zh*Id{<#hwsP26&@qUP zkj`!C^EVhQxja%Ygj5rB@(7lqS|o`Ba8`_B=n!8vtva~*;uY`OzVrWJ~ti9 zX7a?PE6SNujX^apcBe)&9!(z=pngo1z9yD=IVgjB`&<=ik?75jAZzMl#|X1(bjsbE zgI)2MDnmnL=fwf~n*_3un~FH_y$OtmPAHmWb$ z2FjP}Z0k6R<&zht30h|A`!z!d_=$pz5msLC&wq-V`IVKVN57HMPv%&eRnr z-F%wb<-gRe{=+VnyVDDjev6we8UHcnO$R6bcAP8ihuUH#+J#GI547~zz6n~bI@|e* zcr+(dm=>(D`%j61X{CRaGBTUiCbbJ8_Y>}1QFFVd$nF&9Y?B;CTl9HRwqER<1Trj1 z`IDQ#B+)W--{FOX_Y8rBW>Bhd^Y(XQe>e@0p+Gqx`!3`Rm7byEFjFYvTVDH>Z%n2Q*S{<{} zXr{8-nfZFvp@mmifwE4e33rLC^i*#H=B-H@{E4nQW$#FETa4Q|k?s_TCvFvpIi$;Z zD=byv%2m9bmQQBJmS(GT9ct3&;(9Oum!C4!>zUT)d_;?lsHHcj8aOQ`)#wHZ_cNR} zKi{q@tC`c%qg~OaE)`VFgVRD|Sx7&Tg$k|GN-@(@^968YZzjT2m6y;|nUzKM9!khe zV5Dc>lLT~zfPJ_KkzQ4RF!AN5KlkR|^9&oOu!5Pp>EY=_(dxFu-3{)6$W#1+)Aqu7 z4+h}RpFfQcRRyuo6^j+pgr8k86Q9KYiVs6?n1FQqfRI4;Q0?%_evNLJ!Vb-}Ot}3h zgN0h|Fy`awG7a!h*O{2RJ|1w6afJ|RpUtNtZ#?Uxa3WPS=$6~!VT;*VoDNaix`jRIf>lYJJ|3p7(C-e4KqRy@A{bp8JF&zGb3C@iPm zH_Ee+961gkhhuZLI``ykDCjs8xH}d_5PUsV780EeFoRYe zpVQR#1WV!|2sPCzQk%LJmwCf{21}3{?zHum7|?UAanm!U*%}Clc;)>-U2Llzg&(lK3rb?e1CI$ zJ-)uU{&-hocBdz&!nuR>OqbO1(8*KM$&oh2lT10kLy<;{7&xwjOrS_7Z?KQz$?V89 z9;BjE4q(D-Cg?&bw}e$^2_qdhmSt+@bSHEIkW#?U`ru$C98(B}Uj;LXYWXA#$yc@xy`0c{S#$7c;^ zS$i2SuHAT+7@(W+DJydbdX`4MeAa+wPl)-cbC*u>RM|ZBJGIGbMqH(^1d>67mf(`m z_Lzv1^Mi1ov+|eZ^PInMvX^&%u_=x%3_d5A4e6bGL6j|Cr}a53H$IigNF;Bq#zvTAF&j@#|q zzjn)tm zrOaYC4Hca>6Yj-OmV z#e@Gv#pN{kK0QNUYxn8QqWWi=GH^9y-szzlF1Lx?M%WLdckfLvpi7Ma{DGx!Rt;5K z11?pNHc9!+ceIw8qX?btuL&UeE0D$LMh;-?zuIb70<@IHU({ zdfx4JQ)tdkazJh$^z4K3c8@)bX?w?%_!w%6xbU{rRV>G;hSy$tXi}hYB&I8 zToiYD$ zzYZ|^?b$c_Td0#nsWcKA+aaigBqw**T5Cb+4kAQbH}Qqjh!}0RH)1>Oxwxb`P7AxHGdLZ7Iop+dSMldQiu(v(9U#1q z{>@(cAJ!4CR9^pyjo646wODO$+c*;b?q9)XjkQ!bFLxi)#<$%hiv&oMVB;QeNQ#7( z#x^f9sS~NBzHR>d&hSOnn-dgwYZO&P4(H|J!&UhZ*9EQ%wGtY_v)5pdIe|G81*G-48aS0r3Ph>f+G2hL%m2z#eD; z6c0>P^8!t=xhh!BwH9*049eX;w0G&@YxI-1Bf?nB)a>6Fk7h=Z1zK5>{%lQ(ZXY&i z>N3hX@wdWLZgsofM(WaN#Q+X z95&&$Hj`#W~l4M8-wo=+;YX;v05ex%W1?=E)Z_qizWj|CE7xe(KTe} zGheego)Q#8{$a*=#PAzB^Flp|6ztAD^CESWMt0hlppP3d6PYmU;P)@Wp9uCZRkEA2 zt1lNP?DA@g8;8DIztG^P>+>-Zgt)IuyU}FQd2e@9l?FW!cow8GB7t{Sw+3Lp7V23; zf$#eRhl@jL@W+7R&mK(rp??Uh0mhkx=V~{#6=vKRo-83HvxL+FdV4~+QWbp%yY za(V^mS4uu(qQIvQ6vHCloiWn2)3mj-*HT8ntPp?8XUaLIu6@qdI4=P$B&9aEMMNP4 zA_*)EdNdeJ01LfmH6~nkl&!cdt%I3(bTfx7UmhMFsBrkVVP%6IS=8?Ob7sVgg0G`^ z%!UM3{Gn3d;XMi~eF3_2dvti{VEPT2N5?a=%f~gl8&&98%hz9WUhoxblo{thOQM_G zzsoYqYG$eh1(>ps2xT_+WBc}*m$OVHOdBM4!sew+3?;ah`#r9Vd#tx`MOR{L#4(nB z-VK7BT#4w9O~&ql$>a1gaNZW;iP$%!?DApIJ_xs>s#50?Ly|_2v_Ch!Aa9I2rPXv$ z)rVFE)BQbqiYci~Ow`uY4t+?p+?~)Ag5x8o#kPrKn-9U~cAaEHUnSeS-EJMiz{gH) z8ne@H3FH*iSl`iN7rB6`bW%#8!LvR3<9L4LrnJUdl&Eci8h1e9^~$95X7pL`|D@n#j}O6s{sx{TNam z`vjKvpbJ?yh*VLVVPo;D7>7yp6)Py3ruY6FAJqKV9O0p3kwyVu zR5xPCAS|Lw*5tMeTI0UqC2B}FK6W%=!zZ4hNPCBZ`dcgb6|IO>o~aZff@oYV>-Wu@ zbu=RMH@SLu;wQHqyy_^|r@s`!b`9REaWeyA8a66X**|d#lWG*#bKNlYmpR{>gu7i- z<=|*|ZxvEI8QaZ_ni2HSH^~&rg}rm+r0oqOxWfq@sw{)F%}KHoxh|>1lDdMbRzxFT z3O0*JaSh`xxVsbUNqzTU8qv3;$p(h63f#j0Ks2-?A@qP(hZ13ew$R4l*ZqL$a9^ug zXHlnm(o#1x-kOqZK5DzX;YG*!%%&pWMzs*d6ALa!IIFH`VhdO5W1@U(2W;x>Bd;wl zqqEabCnNU#I|^CFlOy)G16y?5`$zWo11zv8;0+(KfWYD5&Gggs%gz1e)&23+<@EG& z`j*`E{`1wz`ETc^C+(1%VIMSO*c5>~B(G7Kdd7spoIVv27Ry8W>9hj zaqumUw;h=uDa!5OtF_G{-G>q8FOQP1np6mQo?`S*6g_ubjwy)##WHhH3ox4hznDxp-VhPWeubX zw5{#15(bMkj&Q@-8caXQcPHdryKZy?YbQnPS2P;cS zyejRTbpA$3nsb5mh|M73Wv%vExU5?#(kXPY*}7A>wn5M-U=<1a@Y`V0E@OxRyah%; za2)E#D~u&vR_X~Z=)0k${L|cpZQ=btai#B|1zifLUG(uDpabxigDcYpv;o+^61}!d zy?&gWN^-cP>c?RSdNa;-Bv5-49<9_o}4hwgKIXrVA&1J&e^|m#>G)0 zST@76NIiW1yamtUQa($9_zKQ~j57`aaFIpHHB8d!9ej(#9NO?AX*>#*wf|w5q zeg0l5A-}{?@)hQY8Q&QWMVcaA#KdfnX4k{HSj59@7XJ9^$G<+B_{G-C*FSI;iYQI` zuLj$LZ9F<`%_5WtVH|J{CnbUs^Q`sn7T`y^ggz+fCdk0;yYERJ#|7O`{=dwkn?Nw= z6!@WcUF^{6HD?#W?Lic?i|99IpO2CVI1_@L)JDp2lq_>GMy|YF(3GSfQglg@3ShSp zx-v@0KkyU08vJGOH%K!$JpA>f2RsD?B44n=eN#3I5ER(n+S-CS%h;gCw=|*pUbzB2 zftfK#m>4dCBoE>tONLQ0O9x?^%%bZ&3&<4%B>Djj8KC}ssehmJZ$#sWNPa~M*ppg4 z8kGcHfRDy8yJ7Le@F+YcxhMePFb}dRgy|GR9uwg8OYjVg{67Pl!ic^!Vm(G573nci zB37?oK7drdjMHE`CctJGaU3JAj#AB{nqbA?Li~u{vml?Az%yA{eMD^;XC9 zBWPDTo3(+>W|Y`y=^YVrtVLMZ&`ZCuEPcQ)?u7fS1QaGzZcY~cqdV7 zddU_`ai_hsN&%LgU?Gcvs`IiYI6!qAP?V`r-;S@D@VaIp>iWACX*2^*l5gzo!3;}3^EF1289A>1rk3X( zTItil6|4Kl$Tw2{cPUa!CZ|FscL%I{1%P!?E)T5Capa|LiYB+v*~RWCi9U-c-q}I6 z)Js04@9qTS4mCB_D-6siu;QXH4EDiW>86CMm`U!JL{>g(HrK;i zjxC~62U?+u>s`|bVCu-h{P$=pI}#{GIUWDKXOL>n5K9bL|4dk*S?L_+coCq}Q^ z?{{HP$-UgZ>Vc<9jc*t&seOM}6Q>C>BwONEgcJ|9Hg@&Y-n#0i_PSm{-BEh6Dqxxg zPEha7+HQuCM4?l<68$yFvBzXq^u#QoY(*gPuhjt^zTps}>mVD-rEP+gkh*^HiG z3Wx~j&+;627l)^xk3ZmhkOuoJQC#3;S_nfVy+S3@tvo$|_9z=AZC(7gIl_VkNgZ!2 zc&H_3K^D$omd0`VO|2TGRv6$RqseD-2MPOzlMM6g#|tBIk``0~X_`{3)G^CMh8uy} zWBUEJ$*oX!b58-h2`_fd_jJ~QgtDH(T=Sgd<(mv-iIz;7@Sx8mW5HMRpq7P&*=kuz z6Gndtx#v)(M@h~KLbmBd%0KEs1lh%kFB26 zP=}%;H{-pks*P$#q=uXDQcn)jd?VsGGkT>SmsP2sMjVgG8MJ%VP^jG|(QUxW9xSS7 zG^{b~MF&~BP^LX3um@dYV~s6}cf%~PPARId|0BgpR+e&=jE$yYM{_aNYtKqLX<*NO zT(Y)bHTh4r>Z{AGD<8*>HLr2jkOQwRlOoD^st;bkFwobScZS_gxvQr*`A^DCiB5UE zGQK`W6yLa&zI39NQfh``Q^omVmJZ+kSAl0uE5?KV8)^c&Zdh%KmVYa&RM6fF)ZOAys4H~_>n6M1@YE2O2`c|pQ+uXFLvrWf9_r|r^ zxms>Lj%u;ABB3z^43Aj6h~k}Wq-?5Y;I8jTa)Qi$Joar; zzipLn(djRaX5r`|E)yQpNsQ4z#zMVWtgi>ONMm@hxTzehHtk1M-rw83XaYX^YNS9Vv-Q6i=Lh0If0E7myg z*B4~zLsQ#b(zep2kzQhljc@67Nk+HKS6)9-t{0@-6{U$HTUX1htSlBVLSZUoGDxa_JkwXJ6qQWY)k5IEHm*tT<_l3R1XX=#bXiu{35Q2vTV z!H$|>?T8ln0*c=>K>nsdKi{hXgG~*!i(FG$U#|Hvqv>AbK`j;UUsNV$D*p;`TXaQm zrQZ!uoG^KD`^?FgZpXY%L_g{7LQVGwvlBYe=B5pM#%`iC=kHgVR9d+TwoUI`iZq2U zuk`X+CmOM2>J^lZ*M`xG-3Xmoov7!5>pr2>T`Qi%$1>&0hwtBEV-)eRQg;od%U<1P z`^Y*F?jK{f&2oK#Z;mYthk9_;e|ZbnyH|H@JxkqpI;9bzhKF_1uI}|fzi-{Q{sYZd z+iu%95PjEIObVlx(ztP-7TDD3Z4GQtbWy}x>_c4`v^27bN|ZoSano)8eTS6n)y0&O zq5-Ox#G08iXRf54zsR?_=Lwdg%2|kTjV#p5Kef)6SJ{Q<6$;_KlI5Fss1)1aa-k)% z^h#)yF&UBC`RS<#r|{9f6D;`z?-$pT-ykh5V4X#`z|%az6oqD*X95bv#RixFE+#3a znY@K{5yvPA$$-7&6&U?E_rioJ1+T3FMz0%q3R;Z3e?6clm;8olgi(nLGZ>FAnvy(I z+_IU$v?U6YOkqTVm?g>tX{0t#^ANwBNtS}r(!?>^bGO3t5~^4yJcPIqq4lv^g_$7z zBGi7RA6Uhbu6ag!%hlxaK)6yXseShxusT~<7JeI!$KY3xWjH}iXda2Wkm8V+nwJ_I zh4|T@1{ePeDzi$yLH#D9+*2j|pqHv8(P7yRy3VGOb?a0U9x6qt#a{mrY8Gx?1S)pj zI7N{py||Qt1^?QOteK~Z=L?Gmzr&JxAwl6c;_pwO#w59amGxF;I}o^o<#i!6PjUVw z#M~hI;}3$Z69k=Ea5!W-i=iT{>~xKTqdn3Lac|ul1ZMF-rVb=7XFrl9t`^j?CM=hq zlSaOJ!EE=BvN%?#&tSCMqM$`dycYBM+tp(J_d}J#IEMYu3{+v1C1wCRRcMmhbD!1O zx5#w|u8O_p7mzmMal|(tu7?nx+!J#C*B`?qk9P??ak+Arm0GAF5rA4~S)! z-o0N-LbP+9_4piKh1PS0HM9(mSI}5qI@Wimt1Eryx}O}sha4eum(l8u)xdR`438bc z106~cb(_>R1!R1-x9Z=zja&II(|Er^-raY~dsJaC`S0jkBVwBQqtAFtKFy`yb?dbn zvr>n?515qf)(_|tq5kFZ-TM!nR84Q&Fbuu>S1>`)*hN2fPS$S27GMQ-+B)no4~1$o zjWAjABsohknIb<82DJ{Q5T^BHx^}X;80-TMJc@Q26~i@{zX7fsri~&gb9~rW#{d)Oej~y4J?^3 zPD*dB9tF=}S;@?DCE?*AQyhSzd_MTIs%MZyS#HQl7-ur%mLpTVQS)S>s~` zHQGu`7zMs?UuS1W2^=B}Qk9I__JpMk7JLSAG@7b-38--z&WM*7_slj-Xozjl6eg;4 z5r#Uc7CGrr%Po-E%mase2sjPGa7JF_lhXJS;?^xB2gW`5zD0H?ef~UcG)vgmOM(4# zO58$f+U&FwH5O`(AB6bA4Xq2*=16y1lKW-jc1>65`$>x@ZWKF3a0VFN+`x2ttU)W) z)-1Q&+>_>*t#A{kv{?koz?Z-kj8mP;F@4lb%|Q#{a29v3EYnYQoGvyQ`nG@x_VjaI z&(Vg!j(zZad9Tb!=6xg8A?f&y)5U9(9QKR5q|sojw##y>ao%NbRdcBHF8U9>TI*Na zI2QlTUm-f2+JQizv*&aM1{hk>Dd#}LCSkwCX)v~ucyMg5CG*%R|NGvnhvSDF($3jU zXWGP)uI}S^Uy^@2P3FnQM&vFiOI(kVK6O3reC9lHF5;t&jf_#!eV`Ft(1<(ujdvFT z=QKSMW7jN|v#%&)?u-iLkTh&4|r(JRgx#NIvS z&c`^4sKYA05BLen%(^(4(G{OD|Wp$nTSwSE>0g-TLF zpE!+tMvAuH_-li}CrN_`ms7H}aGwUje<(R7za0Gf4iqd#v%4_x$TW*2!*dWXq_)98 zWDDhLiB*y^ezxwi=@b|^CYE)ye7f9gi-X>GPt=3L6h3#k9xpt`O?FS>$hLf!yH=ZQ zO(U3=GiYz&^A?(s*l*SLZSoeTwdLw|zI|Kn(kk$apH7FkNdo#J-aL!$NjxP;6Oo{# z0VR+yj_=7d2HnCBm{NuYD^b*1*aLZx)KPg9DD^E2LQ?SSu+K+{XZ=6At+tUFp^e%|%b6!1R5c};{r(edN8|Jg?_^8-| zcrN$m#Lm$S4C=2&A2debeDpgVYPr|{0pmyvz`-wRG~;uSVE?F&Y-R1;lex>Jk!)+2 zx)B4Rce~&lJ{Z<&3{NHc5@RKf2n9!J+~}huuq!F7xr+@+yR{?-5Rl|9gNW8iuGElV ztU@2Wd*8$dxa}PB+B0}2pC6WL4$KqxQT!N*97hRVB>cH9h^&`TPY_nSIOhW_9*C#5 zDU=sHF&FnS;B#DND{?h_qr%PX$51P!j{yv8rW0@)tcf7(_%sXv#gO>1#wu%(K$`xD zxt#jv6c7Q$&uZa5hB2epDY&tyDwK$_!l}z?u)^lCM3c!7_3h-MOXQ#WdNVnrUBQoG z`$m-+5zkrA)306aT3vK&B$E-@ZQ4Yob7`MnNsm1K-tQI+} z#lGgKSc-@$zvVGe3$9AZR<$4#NGJ$^FtDr@rIFl5r9QRCa{Vi+`d*JlHwhLC>IYEp zLu-STtL}lSLaZ57l#TNY68Y7LRhs3YUsXfJOaALcjVL)qhld|%bRdTVie;K6Te|Mh zwXS@OJgXk7TA;*H_*|iNs)?l{U(43>CJmaVg_x)7vt%A4<`y}h#ph}K$cS?hJ-A`u zpQW=5o9{e{=M$F=op{hOc44K0Mk}LTlcZf`y4sy#r{ntp(saYNP@~6DpYD|I&N4Uk zMTeu68A5_8uDzq4n=Okx$yQ4In6k*?*!?Cn1)O>CFTqFwwW<&w%t4n$DxkwnF|0`Z z7tn!7+;kww&n643dTi^bulDJ03(DuQe=_Fwpac@q&dvsPjR6%7DmQarg-KqnjERk~Hu>x!~qfffff4=e-*L3umm;D6z1W$v3@ z4!{AD32>P}#aQe?P6V_|%P-A7k43>#ZVa~6VgpWKBkE#%mV?P<%0N~56_t@39UY9v zqcPT2^5?s8{j5iN$n9s~>9(SQdIFc6t1=Yh1D-4KIE){$@Y8#?#1soBo68iXfC5*= z;g<$|d!PkQg>mD%KcVPILUGuP9%#;#oHRklC`dDXpan-f3SaNuX2gNLkc%*(7Oa2p-~~HGwNRuL zF$XCWLIJe>${7S{-QtzCTK2n|l9W3cbT3?R+%BsfO9V@FIfl7pk64Em{B2l*EziNb z_j~*B=fJG0Vo4z@DsA50^$^nbpj1^zchWPqYvxB_tCGfL;L`!S-^Hja^75^sNVacF zd8AO5YXxP9>)hOXQe#zcG_(G(_vK6X1MEd8t`W+Y&rN48<{^urL<}RdQ)K_DLYu3=qEWKk}?*)eIt&_wPHl(*q=?&d#x0! zR7RvC$<@tZC~i;8q7kK{#vaaW#fpAk@%AE^?pPdVoJuADOES~37>3PM;cV*|% zzCudJobQbITPZ=K6iN~ru`Hz(K`KB|o$C@;H~ot`Zw3s%23*C%!o8QPcPoFOgeq=(9PAVhEq^4AEme0b3K$0>ITtvQ@#zZsBm5lHL{8 zHXWy}1#~sC(h{cA3)5MchRI4$G$bfDNuUAjcdvTG?&R$Jye~=_^&6WcR40qG6sjVf zp7e1}rF9o$Y#wJJh!sA%&kPTH#LTv?D|E<;A@`D-D0qSf9j~HQ24uv(IUlsjX`ynE z(0H7wCaT+u3N$N3s<%4jYM`JFQ4^FYYw)Z?0yStPAp>Yr*&wYl==Py&U0Ox`&aEOg z{99JROMDTyUN;3EvEXY8_d!Bn09%QG=f^8^7uywdWkfi(YN(?QO1W3IW~FT0EHnk* zS%}n&zLEtB+LIQj(_Lx7g0}1HSD3GGG>tK!)M40_4a-$SyOy^qPh^u;=>V*@k!XJM zQXMV`+0+$?Lm_BHgIQEbwP-^yJ76t};h(6K0qx}humIHpBYA|~Zr%y8ifaDU+IyL_L}hYERn8K%mGIG6FRd3^#lU%ND@%776?fJ+GjT78z6ZCHma z#i?=c1Z<)%Eo3Qb;!X5l-(TmhsxJkWl*swZDS27(!N5-?V+{%&o2r zqb&H|N8YBtBGNv2#5d^>o%AUQ125nZC}#m=(e+|goN;|yFP*xn08n-MLcXI&?x4l; z-Bg@3r8?-io)@RSIAM;fcgz@yYA+r%z83a(-d&KVu7%UQrYL5lC9vkni(q39v=%mc zn6DI-U8<$U&NxJ-QRk-t|_O6v|>I+k7}X*Dt%R5dwcm)Gc+t zdfc3h>#xMrw5(s?lJC|ilH%?`4VZiL3Rq-1)M|;uYrr$S21(@;g4zzLe*R-78_sp! zg_6C=CSvgqTV$ypbvvz9tFPBzHvS8>R#9)-Fc5yvuW%(qLPys@y?{L-Z#i_$w59paw{fiJ~;;`?f-AW|$OYL_Rc@H2Vz=Q_7`=41IITwN1>e zmJ7~Ol9wWNNb`9rg*K{8O>%&$=Q6A|K|E1%K5%FiXZ!1!CDSKk=ZP*M{b1Pxc(&mx zby3zU2*P~Hs9y)y*#{18my@v+Nt{tbv??z;X;&Bk(>wM3L<+!!W`Dj$hM*96Kay)9M5l~rDk#U%aENQ@Q zwqKh;yBMI9RQqZ;Qz%EL05yPDpbBo#@ByyOLW&1TiEM{h9Z0;*F&-Ry^_Rac}%iQOWWCEgBrmio5Z0|nZADm^{lRuly*`2e3e|Hd@FC7|@4 znq3((UEkSfX(}+K5)G!If2VW>EnB492lGCiI0|&RdI_j@>Sn|WNDe&Oq?dsxC28({~AMuem%^IU^1hxHOfYCG0+GWj~6PJX^NX9a6!ANW_7qP{8rFU1-W@P24l zg|DAC&5|DW%{#MvgBrb(_%z`3^%nJyLDcs8q<0Tb2c{t}vUl;le?Ttk2Z@|H%idNv zcJ5|QJ94(|AIt@UeTD>NA)iW`Wd%05ho|k_sU}&3Kp;?tD&2aj#A$EgYkVb8E&+7q?Y_ z7dcI8s2(k#lNG}pB3?2Dm3COm&a>ZG@g<{7og^8EO1Y1L+^f;zfAC**P${Wul*kLJ z!+t$eWHSi=p&DVpnY)Vj>Bda4sG6f99~BhEl*hd9eHK?mkULfSUL)T4x9fg-A95dN zsqnKI@;qM(Qb~Q?tns&#yVqHJ(2X8`#$e7zp6rjJ+${smEOQhOYO`vE2ha{qJsnII%~=64Gk5 zwu)koUMTqh0v~E`BIqG~an$-?BExHrHyKcAA zdG)!k?z?8=k_lQFw2o+gafz^=oFGNBrSe6T=fAO&%gtZXOqJLjyw}Gc$tAjy0%eL) zF=l#E$-|+TXknHM27|)!*VcosiWk+WM4#OzZ(yr$5`M(kR@c7L+GWToQG<1lA2GW- z3U6ZhrkI-}reDn0v-KCfm0xe#Fc84s^C@l;5}~4HZ1H~?C`?ce0Zt4K~NZk z-V`NfDDBWa*4wEW4DXkr1%dDygMtNPl8B7Wj9~Z3lCr4_U>RptUaZFv{;10OtFlPu%+gO85Lxi5?o~OIB!8})Qjrot z=c)jcszSt6r^1I5G40uGtP09*fLNxpQTdVQjB4&>m|GWuiS-sTCgZ!J>=}Je?QdSuXq-nN7FtT7SO-pii#(lu@}Gkx;I^ zP9R~zxQ6%AVk~$BNg*T4=_0vV(888iC?W2n(H2_5n})ly!w)5{>&1`TVL79Qe#Yr^ z;Oq5uf0rROaFP9&WzKU9Yi1l8)V{V2OlvlWhRU6Vp@R5>u(j#VZII(*PxLvr7l4In zt19A?>UfQvMe%iemKskWTq|triEzd5F3%oUuGj1+9jgoMJ`*E#QrPrL%~p3)sxebj z{3OH|Zm9iGo3OPrjS1QT|5e*1Z`X`zwNmR(B+Z!X`)$0tJFDovXwd7B&E`v)ZkD68 zjwcHtUP`nm#50~vwVHv%84S-@e1$eu@j30M-a~}GQ8r5X4}MT3`*6bzt<3vf(_Zb0 zmtkoM-iHm9BnI8I%uXnmY3TFmr9d%bxlCqDsE0vQ<2~HR90XSaU4UfSe zy;k3E+cpq>*I#i3gjx=q=4HTuX6d$c23l+_g1W;V<{_b_lf{K1HIlOHZTa7KB&9@_ zEhiZY`@yhzci$bq`^E3RuZk*)BrDNWEJgT)EVc7@)>iZP>O6{SgD_p8#1f^QyI*!% za%)kad)bxILHh$5!RudL}w=_ z5uCv9{!B9Q2V82NEfE%I*N75&CXj1Y!qx24>9@dS1_Pl5H6O#(yDReGoO~|0fmASK zfPPSr8E^@*UpRJH+?lN(Y?RmtTNG?A{PK?mnuIK@qRw*{hXZn2uVBVYE|?aZNjUXU55`G= zOVz+>{HsP|gP1I~BgHlfA&6=sKw8MS#?*?wcEjFBWs#1V4S~3;I$}cF8d{YkYnK+O zNQwB`s2U92Q)Co*P26lCW!lrn78EUA5Yaok>1FW7L%H{e3awZJ+gogj^y2qXQ4ssv5K*cmG2YVv8X<`id_ca_h#l$G3 z57pE(nOgiwMe$9~1u^xntf_W3ADLS?5gneO}Ns<7KI(L5A0%#ufFl=8zqyGi+VHxrZw9nUOa(OK_w{gCnp+@ zcd$FwR1*WnQ<6MltF_WY)?Rkl-q*>FeK>6`@1ng);HITM>C>yx)>^`g#$Qv6FJJZo z=pr0+RWX`eJ6^WI8l8hUG=S^!F`!oIa74VqWMDBtoYClPIE7eM&caY31(L^o_ipXI ze(e#P1T+Ax>9|vT4Ygk5V1%CZovZR3lC7+aJHiM2hmyJ5sr&oULj5<~7LEH|Invx~ z>u$F+HI{0HKML^+H#96!n@19{L_4GQ94f(1CvU;f+@p!Tl(Ykehm2K}Sz1Ix;G@xV zG2O07iy=HW6Q7G{QHUKpTWGZgiEEf&vg`xWV`*ZpwMPE`qQlH=lRelUN+|WwD zJv3B03+?H!w7YMUSmn7v*H`NTW$H%zY&!k(rcSaIB zM+4g}%-!vmidWyq)RSEL_eCBk2klzja@#f*zSmQrT~A1*k|jGCduqpOo77WhYEL}2vlly>)xZ=a zv7rc+0Bx&{pJ^XrUu+NlNc@nJlHHxzi{*tafd>cY9DL^w(3>Ati&dwS<0WA$oDg(F zaKgtIoUg|3>1n4^GJ>vIp+>F5};qB$em=sp&yM{<+q z^LHfY1JPw{<5)K`nLGkE#3gI=N^Q!$p~489CHNro9icLmNFFaeP| ze|8W&t0H~CoS;2M@+m1!-N6jh1&(5DFhB_fj!*mqEkN0Qo-PS3If~Ofoy-Z3qbZr; zGUF3QlTUWUr3k2_NRtLj2M(I4K1)0Fs(E=FFaK?Pe=sj8AmPrC=ct@wim8>?n+&DlU zyq8>j0uU)(mdo4p55eN#==k{f@ZjiFh;(p-uF|(KdieLl*XVxD3Dc9y`z%e+tjy&m zqsauMhn32N$G38a%})1_gJreXN)d$&@$B(M%K9TU1D118ViAbB;wC$K0U zz~c%Rc!_XP;5FDt`UR_A7KE2Yju^>iNPT7~Cyyuv>2aQr9(qjqLf~ylr|E1h>_(na z#>EFiq`3_mO(EugP^-qS5TVw!n}AkHMsuPxtredE2yn7Mv0;KRLwh3Zp|cU%d%zh0 z*5WCibcW(pL06>U>xmSe#r9e~#h~lY(>N?3UcstJyBU&e2&Q?NWhiB6o22F#Z-rEZ66cC|d(x~H8`!Tu;Om)b5O91blaK%&smg#Q_&Dr9_s78N=< zMb{VC5kt*c0mUXKsBPDyXAn^{ih0-I&b;_WLl^ykyf-JvB%p7bm-@Er=xAb94dfu4 zmhtK;qgw9z1(37T){6Aw5I>1_g^SOPhb&(3hFO z@P31azTzf&TG2z*p?0LPqV3*2ovwu|X;0~ozzg5Pm`yJim4qfs(-~?hUeSveifMn8 zGD8yw8w6g8xp84vaXp*naRh0bk*J4);4G(GUcCc$DyxmoLbEwy^+$NM%GP&^-ofdv z5O}t&jR;hRq5dLDeZfKvDYA8w8!ETDlh6aIlr#CSX66w<61j)Ev69HI_8w?zrZm@V zj*8)Omac87y3P|$$Or39r`o4AK_gPktJZuTI-{rz#y4dy=2i`09PD|d)2mFRQzRtB zGcYrX(0&~O_TeidP{U7I}xIrO52>NF|X5dZ0qlc<^GTIn6z0KYrOmBmKDa5M$uBe>^ZxN~!3Ozv*i9?H^ z3XpVFAun>h92psZvJN}~Co#NbR`(;6w&d77M6=`ZhX>F+qmP>dveFXCYDJ0$rHTy4 z@{5SY@~8z7;6kPhX@M)UK#h7%)C(3IgXPm4+Q;bj!@FP4?MjGldU_JI zkh+GDK4GSUhhkoWAJQr0AMmG3b2YMn5KW|yu7H^2T*glk`pMG@tdR0-jixCRVSH+@ z`D2#mpX8keI~fc(r5W2#37_rLVm?^#Wi}{g$?@T($L9(I|CJ0g}&Ws-uRdQZgRdgux~8GL{dz*UABN17k{c=NsvLKXQL`dFkVCsyrMAI-s= zxZCq^qde*oGMeL6c3v?nT1D2U${bo@yFoL;SV(G!l4|K8`Z~HniO|)x1er#g&)BxyCTw+%ZID-V_OBgkSvwim(NUBYzKr;`@@z)C{kGD?y`* zW4&qYO4L4VE7{nCU&e6sBPe02FS$%@KIQr%ME(+^Xm7a7^QLL?)(sNOxlwfgp z%W-2Bc;uCG&-@Aj7jtpFsUlF<$Ey;^l8__|iu7f6HCX==Kynj51Aq_yPROYdio#P{ zLGAY3UV3Tjj1;?zySwXw3{=2F+T&Wo=dWNC5#zeDrEy4{LLqny?J=YI^`gMxF^js4 zXqMRx4Xq+q>r~)qkU;XfgYSfEf*llX5_OXlJN%kJ(q3O&PtHGF8hAZ-{spaAZExE) z5dQ98aS4oCZj;n2_9-wQD+pwxIXz3gil_`y+^0L+ceMd^RC7P7oZblHu z;_>eI+;cDV%b$vQ(d!AeKvl2=;T^I>$JbgH@lAf#>y-*&e1`%TD0FO|^mxIwMtNq} zD*5+XB3s1tC1ukLtFJeLq-LblBl%JD%=7wp$#qb{_#weU^IVWy&!0Z+!BhBTMFh(} z!xbiZiV6-tNG8+_<1#>|H~S3rN{MGCw&NwPYJ)S9K2NxmRkr0cH|l~!=i^&GU>h_xRpZLe1v z=*#n7k};*=vhuJxgamxhC{hJYyn!!@%!WZh0O;O7J)lpL3#H-m-J74`91dd{i^H?V z!mk&9OfIiKzWrr#J-)aazni?j`EyK?Ka5`dNYEO=Lh?JN5&B7%n=_xojAaVX+KXHi zrFPy;%Nb!$8wLYs#RlO${~Kv>qXkdskI07amdyMSz5e(+Us|>Hq z(r|dzv75pi*gU3{9ebtBWoWlu>)vmJyS2Z1yV|+*1I*P5*2qP$$|g9d?bQr=^2BkV zsiD(U!6@yvthANYGM#!Ps&cVQ(MqV>BVJ$>C{@s>BBX0fp`Y7=rHDxt$V1n>DTJq| zR%0E2TES}TutB~WS}W1%p#^>GsC))dD=Ndr;zs|5GRrOAx6<2PTo(&UJPhVc?c4S` zQk`3oa+|jj7x^7tWZ4_8s5qijPL!x6Y)Y%CtUh4YspSRdpc9>Xv5{Yq!23;GiUuDA zJ`|Xk`b2pRXsUNB2bbULu(h_f1bqz9xWdpW4CpBX>nMDm0DwS$zeA?7MSWBH0*=%~ zIiV72q#Dt_pYsgYM6Bfw&JCqp#G5g38h|TmO&7W1#>q>W&4`9EbpU$RHg!aupJ|?) zo|*>Pq+!#lqw2hFH$JNtx#w_g{R1`6%PbWG4O4_EzrCe*nlQ876{e3Gl~;o?%9TRh z_V&}tS#Q(+JPbM1h(rfp?bHGD+H=!*X^zQCMFUbbf+!R5#wiAH0-YY6z@R#0i}uaW z()-q}JR9llDA)d0@zr^j-=mBodZrm`7^`whk8aFIM{Rcayd%XAzp<<|<40{Iz>YPs zDk*B3XT;ruT`cKWO@SPzGLg}s7ty|>m8}3?Ew8MCPovL!0cCl--tEsYpOrWxC>K#| z|F0K@M{qbg3^>^~b>3;pHAhK%7YUf(o%H7gLnMg!-1$ahmv! zq-htyXYj(8G~VjGo&kKYJ6?2>C49J!qgGdq-RCn!!KKgf>XmaPaT|p_NM$FSS$-gX(bTR$!z181WM?T=1lj!m!b?DM;oIP*VaH6j75OD5NaI3Eq5r}QU|B|) z&uGGv_7{}@wFGrDbemo#F-MJ?=jLqT6?5tU{v^ImnWmRRctyDSfzoq?8J9}K3j&Nu zMwbJrD3j5ady^)FoV_fV7ExUpf&|(%$)!0~ZNwf&U488kT za6r&FLEGG$wcD@-Sb-geePD-WC={D%gvpX2$z6k?|9#Yl6FYX|4aIVbMUi}be578! zDmP`4NLHXJS%&ZlS!S2-tu2?gYMvyOL0CMX!~&&Vx_@?2aBES|y)E4TY&EiCNgp{| z2@IdNl5VXjXwS{BmW!U_Z<^cQ0Lg4RO<)S&{h4Iq2Yl4ZVrC66xaWimjCX>yRs~SZ ziV3lWOen+UJusPrl5~)BlQEqe;N;3>rV3}ynPv24ELCtxiCnHP8%{S25XzivAumO+ z3QCQR39uW4O6I7=)VT5O zhe z`v*P`{ljVP`IPh$%uP*eddQ$gTWJX|V!kM;v$F#L%?Kw`dD(Tc@HM2Z43ma&4`W~c zQ>TYJJ(EuG7*8?#NrW`vRq=lzHs-O5vCe;*MqXliWDmnAM`NQ9V5CatVJK}-#^kUv zx8<*{e8i}l7@&5YG$tnM!QW^h>_GG^MH-t_4HDU5vPmVhg;=+HZ=cO*DX9_!r`;pn z%2_MDe?t7aF`aNb?hD%MAG|B-f7=EFq5f^Whl2g}o*4)C{3l& zJ(zLtJBsy|B01{a`?}+P|M2#zA&f^y4Fki|TV!*BjwuM~t*r^@AuKTUMu?g$vkO=U zqt|l()Yp$!XAbsqNk>jkor!4SX)Dg(e@>T%R!sG*PHZepaB-!VB4Y(by3hV6%n9GfuwRl zk$>-SNX3*)%54xoSsc!pGk5;;x^3E`kaWvTODjhHXSA}bkJh%UOSLG9&M>mPVUlf` zv@7?|F1OrTrWYvl_di?B=ynAk8@d+Ee_l$sRRd_^=2y!_;`p29HVIIiotzZpgnY*{ zNyQIxMM2#VO0GGuA_i3ml^e3|>Y8Z~2|<`+Y{+fH1tYCf*#M4%`qFSiDnX4Q@W%;= zRY5mawGFkTp=}FBlpNbbUJd??h*0tx?A=mZHKbNx zS>8K1RRf|498Sq63AwQi>$L%0Gt+I^<^^)~w84emU+xZ(7{hb{r{!HMc*U)_2e*~s z@){8xj6EvExqb5%w{7g@V%PSM!S#cCx2Mh_J=0v?te5dOnnm-vA z`tUu!52+zL$uea;8pcQGZX9Q-!0pY{w2Bepc@e25=l#f~h*31YC%Gi%*HC%HCRAS> z^kGpa$@JSOMqq6S3ayKR!28W-&B_AI}$+?kjghVm@NhbGe9`49a zi0q5wG1Ge(SfPHU?~g-R(&~o272;oR;6Vv*;Bs%Z@77XoBkf)_CB6YC;@?hHcNE6c zbN`%7Rrge$Qqv46J=raMF_o+3UB$34;Tif=|AzTIPPXo0=SJg^B_4BwzJG$tax>LK z(>_L}KJ1kPJ~{(OlU;gf=H`dq)57rn&@h<{#IV8tDirA~J`}$JomSs((?AS<&tKt9 z)tZc!?RljG1eKUH2?>~ZplG@#ZhO+@67DWt3+n%l?~=6n*}Xd~DUyy}n{>hkhewR!Xki0L_1+MYPYEj8KUkmn#SpDKRuWDZwou z86Hd`Tyjaci=8_=|B#RaX~y>`S7v<cKuMD+$U4;0q42xc_yihQ$ zAxCg&W0W%lxFzsNL$xr#<5akMY3Qkl_s0YJrHXHuK^WwzOzMZBNGw59STdopAvB6f zy+oxj%Htxv>xNFuwz-Vz=LFe8@DP@n%n5vaBsR%)78<`N&@!}91ubx3c?R}3FjUX+ zZBgrKJ)4Tc0l?}sV`~A8ZxiVcZ9ff1z?5P;-^oWXTr(L7{Afi%&~j5Xr`q&b&q(r| zu~LcZGk3CQ09*lE0QqTYy6-Lx*JVNcCfy26rX-vd4vQ|ixM)UDg*fReWpoi+ZW?HX z(n%nNI*Xr0Dz#3>#8dQprV$Jxx~T=NFi28sp{c2Io`a@;JL_(49AZ&}0-!VvDm_@R z>oiVA=y-4C%9r5R3KLX>NBm>k>|5=Bxb}20vHx}y{@V(6(3ZW|?oWkrvcdO4+;dH% z3zcqEf(HF@`q|;vmHhDr`U87KyJ#qRXiutFFsCd8%ECB++t!R|@^*CvpC#=Gn_a$T zXyb6n*A%8P*62DE+FFGrvPa!1aqA& z=rIp;1lObXFdIW(qCsbwU5hw3XVWPRhs{j;X`429n{?Ub<*(1poaO##`aDi4z<(%A zi}nNO#ZGXH(=6_f*AD9Ld=7oyAv=x~+tg)8|KHZwzp(k;2Jq*zZHR7)zyNy&Uy)&b zn_$Q8sHOUXh-B0`kIqgGq(WFtO5zh76Z3};61ORRbkS6zIsw{moo){I-d~lJO^@0z z5Qgvm6;mnF21-SHX4&>qse9OJMUMobAqo{K~fudSSNz6MRe&$W? zKj-_LF^L(O98-b?VQQ0a*5=8hnlV-wf@h>j3U$K4&I0*wh8S@=HKZw7Ap zj?3j@57^~fuIlZnzvh}B&=N#lpYFK*1UYKVf)t_rJYBI7JcV5$Q_Gcv^*VL4vARfY zTpD0>3Sia-NkR8HYw$7swY&_smELA-^u0Y;DEV-3ra4r=P#>Y12H8C-KHcNT*E1)M2E{ zs3QlLQpSUym=JW#4mUOu!N`R_UKt+rB$bIci(GaUO2$3deW+I62wq&t8J!kZNZhzIVQrdoS62sd$2?a&Bi#OqIdL7adJLHubPu&L6IoG_gHc+>0d zyd!qXa%Kbjt~vpk#DQhaX0rw;Xvg!%jfjt}SaAG*=biP3Z@=AvZ@AFtG*zIV(y8Go zvx)Cah#wM}@Q{FTEOggcFxq=52YUq$%wx$wYUU0cAH^i{;9y_W)xS^a#qdOKr5_Nx zBzSU6j(s^vMhz#LT838(r*;fOI|Prc}UoOK`_3A&HXav^HflM7F3T(@01H z^rulsF8lo(BGhgeav69$hse06et;2$F`{HcLJn9&Qj~56Jfesoi}uWIn?T5T{=7jh zA`T|Pg$}FhMSt4eC7mB^2qstg)c)>1xsD_(O+wdRJ>G$cgRph+WV<8+mQ>azuRHzW zMd$YV+*UEl9O>V)V38W`h$!8JGzb>PY?;BR^g$V;#1FusqRhe+z04O9qu&ofW$;A@ zP!R->E7%w;2z7x3XTK&sKpMz~kfhKfiQ|aNh7P0=g}ugWgeHmV^<4x)Jh#A_%Ose@ z*pDuVGoc}zim?D1_7aGQ42VtyV`Q*~#A~q$Ypo5>2Zb0;GGt6cD-Vx(?=Eq-jel$) ztSAJ<&o(&&$t5ZVob0C`GmV+)bXAI)`fUpl2vD=xY~rSLxcSD790|Ba6hdXgt8XL7 z5hz^9Y)L6E{%5O+V@u0)PSRTP2MP?*eRb1B&b0QVUDU-v06peh(LLan9#01>I zNx+^=P9j&^mNUdQg&zcc=$;0+)}YP7y7J06emdvqJuk{T%Pk-CFHfbOLv&Rxm~17| z+xfnd-+Q-0R%tOEcv722X*8J8g~-%Kmw~A;iY~z?hcX&MG%-{(jbk3g+(&n{^Rn1W zaucXAAo+WMZn$L((2}BOlyE0?YYcddb{676E(Yjr|6=ERQoRj*9I7?Qm8=LdW+CGU zMQ{XSF~l1zml5oAb@tHo^g(ezF%!*YO5aEaRgE9uJD41v2mvdqy7I^(O2`aQ8);)b zM2YLGdJA1JrxOs&Nra51TB<_08u=mLAw2}?DGmKN2~cOK5N!bvA=6ki`UM~u&P4ul z5`nJoeH2#bMr}xe=eq!zjs%tH{2`S==%Z{E4_T%KTjwjDI5OfTfs;p_7e#yCXQ7JP zJ8E+taln>6D4m+|(NzdR>$|9IPO!MvHf%JlSl3p@!*`C*h#E?(&k4i#r{}|N`!Bcc zUjMQ1IEg8z)6`K`qUuCj2`bsZGh>!|#>pt~9pw-3@RHC`Sto~XYMI7({1`%rG)Sz9 z|K#z)6sRvjhFYEEf%LbHhY||;bFXv#%zW}(%l;ywu==rr=F)7Qf<9Q~?iJPZwgaF9 zwWx~3LXACw<~TjnC|E60F41$nxCU)Jyy>?4{lCKF>bg%p>9O1EcJJ);rhN|IuFg8= z?e&S?kEgxMb}yX(D!q31=l1Y#?QUmy(LFuuUv;kY2i8b~Z02M0tH?eY+@SEw$hlO~ zEcH;4h6;vUF*Ec_$msnuKM2T(Jw%6`h6`eAbjkb_96EvG-ISw>%oI>NPo^{zdO9R< zi7Kr%H4l~eG=M5{z3s_cNGBW9rhuXD+0VKOM@*py)Ae7F)`1Q2|!FaE3bg~~!J zpj=^CTxh6#ps=Xi{jW-jsXqs`ZlOy(Qc;i-6{ms>9*R;jn?MkzQLn@OIpv5_k2=0s zj%?u+X!m5Wo_EqExUar4R2={|K-KJ4D{JYdQX|J?P?m)T4`!R_K;sn*CF z*sH~Ace|bL@Vax|uGMlj#E)hlE1d_OXVt3ssoaLDSEVjb3TrgVE9islg@;xk!&e8X zCk<6sM^q~XHiuI&R{F0T5ZqA|1Lr{$n5@+5YkaH=y|N??Fp|}_`1$>X^ja~71++4g zE@qytqnEeJ&s$7qbgP>y?U*G~ul4luE~K>e{5Hv&O24k6HS>+vhROdyL9;}H6&F?= zlLPWlr{oKCN%9`~(k{tTNJZu|w@OOk0ij-<^%Ta3jtw=a{^lD~{G#pY{v`jXjczShlGb^B4%{89IjR(`soY3VIrAZ5*ee_uaC#?O|j zil~AKYW_$s-^c=alf2-wWjuWCXA7jt8W81xE!O_-J{*pJ0=HM#-?o=OU?^~*q-tut z*7f6)etf(;D&fKePrl7oz@_2|hUf!7RQgnSCtH{bwLuJ794PmLXY0-+ajiRuS{XS} zmfDR1_ZoW^D!MrEy!v*>e|tZI%|?{&Qog0$~`mm!C0OfUKVcI#l!R4(zH7d@99@nW^Hj{(PR9q{wzLxi?S?%wnZc$%XM`6hLLt#|=LN=D+;%^)O z26are$THsX_ZLO0BL)J(QTS4bq|ve<7FCCam+zHC3a??Db>{f-m{ZHT3WwA z&fk6a-FN3tpX;Jd5-lopwU7u)6q44rMD_XyIw$rxOA_z+!fR3$-W(;?q>P@$=)&1& z;PsMujCS~46WSd!a{6RAOkfDB0%3E>e@Zz~Z$LQ^8aBO%^Z7`Y!a1Nq5ZtS>gdBl2 zY=I0|{EL!86~X`id2|G|HI-tGYR5Uq;mQz#Lwi8WU*xUkGN6qfIWHxv0Y`$o18KGx zxKg1Xs8D(jxhME=Jc6xknjSDSD7PTuX2zOk}2n}X8RWk(HXD+0P{E|$MttrpPH z_4^CVlVqo~D4{X-Vh(^uLcMhtvrqmfz^AtAAlTBYj-O{8<32Bygq_zi(%jv#MUJeO zlwRz|Ir}|aRn1Dk9JDV>4g{s=ui7Ge%MCP{mjg&IF}%~x=tW_LYf;%?b}IV#Twl}CTjJV&-`4ONZ!Iipnoj#Z zcWt&F_RP!LDaCqWXGhnk{h0S>*%XOC@dbx7gs;s@QRKkuE!y%SypI!u$-@$lTXdK7 zrQOJj>9>H%t9uiz?HMZ~U?^-fX%}BT%yTygf6I$FqI=XBwrQPC{28QyKs{ z2O6l^C#BNaXONOEVbbYj63Cep-tz1#h+7cn@NWiEog@mx0u4-d2rB_})h6{#u$o9E zoD)9#kS!J4Gt#uJGNrIS4N!TilVP*7H1bXxG?CbgP zHTmA0&F@#e2rNml<7dAg9S-rQmUOOdKrSAZTkC6w z>xcyrfjb3BxD~}?{ny;z_)fG3iL`mmal z;)fLif{HO>ivH+^1QAWprA|}?WRW35iqrF#1R%|)1GmSW1w;JKxhGaoEPt*Xz8&^{ zbTD#~3U*5skOQieVDk*iMW%!bK{vfVHUm$_=HrYCx{?!rYr$f$8&!2rB;fpp!R~#G zPi$Ijq*TbfC7K=6tn>$ymug)i5eF9hp`Qa=UH4?D=T;V6m=Za%j2iv?thVuc{bV98 zpT3=+w%Ioccx$~3oHP4%dG)TreuV8FgmgIEL++zI$W0h_+!Q}+&*Wf^i7!05_C@q! zv*Cvq0cj=mVJVA{3a)s-W8$_Rke-IDlpd4=pj~03pi4gNg)SOENo2ZfVTI z_hOmpqxA7EfYh96omO)vntfAET+xYeHpZ5=*&N#(p7A6wYS-7gQz(%Is@EwZvveDj z3&@o6$>1!jTO5pvys65Rbi0+cJfXOJI6AEEc!?;?nf*TbQIRvnM~Nhh<4Lj37Nj?0 z^4g}nXPoz|iq()3Sd;1;q%0 z`DS@mFl%7*Fes>#cmKTTc@CdUZK}3&%>DxmrH3O%KM!*W%C@3YmO!t2%rR$)8lFP3 zR8bXSK`r#6c+A%zdd)U21WhC|YWNYSl@K}DMfy!KsBREt$qj_vdSun;{36@jdU7tk z1^Kax{-m8JVqk6VsFJzNbYTh%cv1BF=GPa!*X#Rd%4z8AcDE4B%)O`2oRb^mhAWq5 zb0p(2`JBay;W$9-4NUT0g5)3xS2)M%eBNGg?aF3X2f#d$184AjERq>)<1 zW3dQc9ld(_OoC}~!-*6@;EoNIeZ-D`2pROFd-*M`%r zJ2=p^p5h?M6R>V3-kz6F&wn*M6l{a}rKD#I$_kNNkyfobphkUvnEuRZtvm|ow>0L+ zuJCW1gWI5%vvMm^->k!$RTuZi?2YQau}48aD`xT*+|}W|1$V{fK}Z$dA7$xGqtrGY z1@3+ETGRrre1Ced$=-qfQxvxH5Ec}Bw7Z__e#{IqGqu0Ifz7pfr0S!fNHqbwh-Cn_oi7)$qerBh=({iO}c}8vl9G)0BOnRzxC@6zUP=f z4D~#lRO%OTCbq6(y{J7RNF0-lNNv>CnfphV^UR4B!A*5=T4g|vsv+o)84TS_;90OU z!BOMDhet&_z#%t;K)di&{VAZ(GF-b?@32wNCh<~xZQ`sYMfq!sI#xet&#%t^?Ol6w z+c=W{-=6}LajmG79`@YK?42`7HV@AxTTbGNovXWwQzj%r7RMB+B}mJ<%~ai|xes=q zCcllLP~xnPToVwB$ncJoQZS-bskZ<_hEeYLd03hqZ6p}XDIjgT*$2D?T0kf zZ>Yij3wU{uB=Zyer~OT}QQO;-*9o-913rqx^CVavWvSq^rcy^D4n*4Y<~ZfCga=^~ zmtP;I$t;w@{A}#PQ8GRk*~yC}j>R}j(&j?cC)-W+XQkxp_<~1a@GL#cXTbRW@Slr<`FxdhLVjVE+vCs)H5CjOiq(L3gS-2MuLgU47m*$hf*09jKXsf zEm@Y}>lsha;iak^#*DK`p5>`vsfYxZVgT(8w^Sp~(_|qSNDSrFS7nj!lx3 zN#G2$ioH5MK7^N~Y!Vq;CV8r!Le&fCvZjdAITvCMg;G8~XUT-kHH|PH!`K$Yl!nWJ zu4*XwzK_#I|Fu0*y#pR%u_)`3?zY!`RH|8_RT{sHp9}bRk+6iu8b?x(za&;?35*F3 zE_ghK;mUCu?yc)WctcIZSMl~Zxc3FjoIr7Di^d3qcF~8mdsdD zU5YFN6_U(*`Su8PD2Z|$%^o{GIAU|2f{le%WshayOeA?GdxkDdip!?#*9&~%u z(wN6Ehv!i^4l|gwbJP}Ynhrs3s1Z1#*;E)}AN@L;{wHq=Vv>8q;aQkX^U(nGeVC&B zKx>AQtk?IJm(bMfu2wTwcy>gp#?a$w%9oz0g`Z9k%MN?|1ZMvae;(|>f4iNYQy?49 zsX)Chy&i>ekR_VLzx^=S{rO)9yFg`cr&BK5tq_gmDxx6%aI!p|3z1T>36G@cttxhk zp0gTB0QS==C6NUy zEYJfpnn_mWz|5kzLgSQSCz8=`(Axp~Pp!20k~1G0^%;1y+=^x@U|NH(Nzwq@S9GwM zkAax*JW?&K)>rCLAIp7@|8xhAK&Ux(^y=M*gO}{>yJO_-EQBg7k0SsvII}v?35j+F zXW4=Sf6$ZCOr!oAs;Y8>7^?o^FCmB*&%MK?ham);liHSn%NW;hn=*+ z2O6nRy)2xIu0B*QIv)Y|fB<6h=Ir#;T4t}o*gMvp2qrj2!N$4b`~2B4KaX`!*q{EyylrQcplXBsu)bo!RPB~Hz|S`E@K_al~-rg7t zNhW>;IFE#t=z68j8>dn3j(wtg@OurgB6YIBgdzXBe{4YMMj*2P1lilp)2ItPO-1b4 ziRi5l!PvIJtaenD6T0B(X^_w6o(FRd&`H-8qy{lk@(TaNe(x3Y-z$vAc9pCcPZQSJ zPtzpbV;wet5=2jT(CfmZ!&ir=`|l14+N(U-kpO!e$%K6@2@YIah&EST^4UBRpS;0f zsDGEko!!2A-G_Gjy2bz`+ikJRN&pN+OfNpXKhXY5m<9)xDg+Zi0j3bK0W!01Qvo(B zX4Qc3m)f{IS!rR-i1&0urXA2@1yH(G!>SwBs;_(fhA*G%U=kSgIv~MLk14{2Tp z+YWff3!rr?Gl$v>1huzv7Tu|7L?ijPqjzstPof{qB*J0rBdd*5h;S7k#%U5@C{9fP zBAX?#!b*r60Z)x)VFrryh9=gG;oz(ZAg~CiyQ3l(q&bB*CBm90E-YDJkKEn zgl>#^1Vg|BKy?iM9#7H6`KI3oB0kHeeq~BCWfTy8pz(uH^en+@#_WzjpJ|wxuk_s? z=+GBob1t#01;^4D9=E#Zw=8q{5ZZ#45EBOR7eR+2?vo3jz^Lt`P~p)Y8&C82Tm(J@ z4g}h#{6bVfJ4GzGjAf{;6^M}pu8J|4tWj2C%n5YWg5EJ8r~GWH{wgi{DA)pHa|{80 z>g^78%66ekL54?ED|UgN^`C%g_8v?{6eSE4J_;Um8>~Q!qL=)N*KxVmLGx}0Mnbi| zLh)SZ+4iwc^$K3Kl~&c;mV5BIMXMAeH|?OSl5FtMJ*yU-&b7QX8tR(6b_Zsi*M7DC z?Bx}`Hnww%Xw&tNuM|^v0%+b@Fla~QhS4A@$F$-|*_b}h`XI!$5&gYmxOWUI9YcN}Pu`4M$ZtQK{P3mG4{>3+~)}_I}Ma@=vd41*P=_t%no-Un?vASOrY@P~m6{!Hv$SGA0 zQ_bxBFqR(t*=VW#3l1Y6B^N~!jwz*Fto-DCub=ew6A%b0fOgv|1Hz{*P9F-xFBbD? zFJ0}2|JVIvzm1J&iscB#F9xT6A$sVX%gGKZLqn$$IgF|HC;`ckGbtTefg0AiHe(qy zRj>2z@c8w+w?}#azey``o1jaE|79}4+5y;koGfD6nvavXFJ|*>Y0b{BppBSrh7X;J zq&n1H+U^PCag+y?-s5&~kL?(St8hs7(bX`}sGRr~lvIH5&_#UMoFPc-L4xu-eOxm2 zd+_rEOaNrYr%=eRf!rF#ye7Cb^ePzh>fq84YQmV`D7dut!C46Z!+@q%Mb>Nr#o%m! zsT@OGMIF+fDrRTipx3{i(`W2i5QI9>&()6W00OGv2!NiBmGrN%)ZII=W_2}mFr&Y1 zBz{vMVi9K3chmu?(@#5g?icx*-EJG)sC4Lt&<0tnRE!09WLYssN`wqM4)&Xk@(Gv} z11{`qZ2kWWW?}n$Jk>r6SksLtE34QyIyLK)X2;vjn6JY-z(hP;M6f7hIAk zpkp9uo@OGj?gTmoR_Yv&6>tgDXauHs0me%mEtr8{0z=z+5a4wT_IHL(H_K^{LZX}K z;E;|)hKaRdAb0_@ig5-%mL|Y<5BL$Ol|6Y@YF4=pX_q5Lf}O)mDp+-sY)go&lzEaFEm3j0WA>IAdWH6 z6SA?ED-$j$rv%2fz!}6vKrF$~EqEG8B@`-|DQCw%k_!Z|24kcqIre@{Ry>ufBo`~C zK_&5cykv1c8v(<~q+2KpYIGrZ#AO>EB(b)rF`4T|5wkI)O+fikxgekuk!H&8mvc#L zZC4!2W>hvg7gfU!w*UPnn39U)+$lqqZPJzs!}uXQuiiSntHYB@69Pkk&W2HgZRv`U z!$v(BM~M_27nrrQ{_*9zxBH(uYg@Vt>)NgGdy^RoUP@IqhRi5V+1Qh>s#`j6TlQhU zm@D?sRUk4RM#V`Tv&v31=ZRFu(ZE#p$GpK$+y{L30Ux^$_}2Ki`^fLxjr`U|T(=VZ zWodr%vEPd+kIyuYo$!TD6A|{v=7nd{<{?R6d4a z*_?YFVEjZF9i682t@aEzQUr*&v;xATz!xI@LS|INe+_O>TZoxd^hHeUSf8MU4MQJ9 z&{Y+DI_?8e1$jFaefYZSsXBCfsww#9{4nzj?Voq#y7RZ|SSCH+2!WZg0YGGat-~N( zFUT91u26lO0KgIIY^ho!Fz5Jzy6$I}@&RHN&SrT=B2`C7!TSy%{>(~J)P@>7nnDk1 zuA{m?1bu(lM&2A%MR}CZN2}AE&MeVjBWO7}gj(=fPrPkiv1%Emh$buTU3pjxk*XEL z^MK|ZolB(gs~$_V1?Z?>=>#1Upx`wcO6}W;^mkX1_=WAPsJzp7fNz~OcBpkUH8RYG zba4W&yVl-LlZA0%L7381Q%gvAJ{i!-qCT)qmerW-!on8xVD2kY*PM^PQswuCp7+!0 zU7`XwHv|nMeEXX^g}IoDs#~y~Hso+23|z7ZKnx8g&fn3d4M{qneM0ep1>}V^FxNIm zhc7nV1zanSofUZTR?bBZhbp$gsK_uTg3=le2_AwchAV0LoRt^r@beXDD|6Y>PhA~IVW-sq^ATOLsCY2M zpaGo%B=h+^Ni$g@X6ej1Xbj~{2~Z$_O0>u34+cYDUBKvi4EP_k1ynwdc&hF^K}$(_ zAn*5&j^U3kW|S~oqme4NhhgRlSdDoSmbOwn6hN18cpqUXhZlO{wN#jlO*g7oA#Qy8 zsOwjrqmAg`w)x(0$mcNC)SfkMonQRRuv2p|U*CEUvf2aXm+00O*)gu^ zfB*Y`uIASDU4d2`NoQzosBMkn>OnL)CgaG^Q$W*HzNSYe$*sEs^x1fvq_`^)Eh}2C zHixUT2D_!(+o0zp6w0I$s19>HSfP@es_5M&3hH}s4L!T3zBU&@UHAs=`EB>T`DP!V zrkj!f|}af(^{e=w$_7DG1F4jRh8z=I7(unoK~>` zK&Z_0vbd13vUgx-oGn?|#=wv9in?&)CPO17FccrsuwcRM-FGKpe5(9vt+v8oBBTJ%Fi8sk1F6Yx!Y?n2qTvAtuyMx^#oi}sR zoSRu$OvCZi8U$RigCZ9p262HHBOfC^KBp|vKH66>)uS*9v!${E`ifHBw!L>+-^@I~ zV^t6*O?%iEyg`=kT8Ahw6>4LKtGl7yQ^aE$00-_?``rSqS}vwVK~#ELqj)pNw`wl( z(7nFh>pThq8ryhQ!l`<97FsT@6P0MN)naQgtJ!2?`*fM0eV ze2Gh0>j0|bTkUw$j&<3pR*G9YifYnRSN(%=Rp~daHnQDB>Nm~eTO+r&%VyVjwbC*8 z+E*8thm0`Zz;bDNIwP9DysW>o+GmjFy?owpD$;_M)a@;5iZTc6WaG5sKrF zf5Nh+D^0zSmua!GT^xXNjdff4z0!QYo9BzceU_YOqbg3hY&=z@rZX?VQzbc(<#855 z@R8BCr%?7YPAoS@HP^6EY6Yg>q@py@CK;`AR0-p^*W}Rz>S2P4MOa~s*K|v}0;Dz8 zP}A&?iNqiqH`Q1K@n~tXBIB4s9!i^ej^m#STxg;1#j%S#uT_3R@vR&7TM7JHqN)u% z3$tjmORd?XRaS9n!&!^x2*k1yB^BXueQ?)8q>70vH~M9ZyCp(uVYkK(+jLF$qxu#Qblm#4 zt_GJ?yMEj{>gsz%AoNI3btNX?@<@NZh_uPu9X>nvU+OJ*JXpvoLy~w^?7|=cthLkD0j>In$ES9Yg8!Llfcb}S_0eN)x*UropHKiB|zeh!`oitkGzVi{eV$*fHyka zbDf(eRDL{-tyy~hu4TC!ER~4qi>4L=k0sh^IT8q1%lofRJvuq|7}v59qtJeArAd7# zym3uKt;E;QS~niAt}W0z#|SH5sOdSU@7Rj0e@E*v^moyYBHwuVN9DX#&rob!io%bD zM89wSA8k=hPXaLzz4uo6^P-#ThJ(e1M}h zX8V#qf_RYQ7znhnEY^LX^oG*q(jyY@8EYRtq50Bsrlw`3nTw`nwL|s+e6x+%bT3+;%~sAD zJs4T&imBJbw?aC3zu!dk@nDWWa-H2|SC|mtI1|>fkTwTCpTKQ8Z(<`2jV83!v=MTK z|5yCV*r}cR0fkgeZ`(!?z4KSh!GI;hmJZFSY105off#5|qgHM{a7_-yjmceNcPUi} z^56SrsU>MeO$Y)K_v6jHH*e;*Kf1chGNW4dohq3AVO4~uM_asbc$;PGo12VoXj?Po z8*2;~!Mb}B*i|^4llJ6r(;Baz8>Y%S>YUx{QkxwqLpmLmEkR-*)N`YKEeCvXtXlb3 z4A>e#x8(bxCgn+yv947OZ8s0=`-j<~6`+Q^kO1C*{92{w@k*|=;Swv@#SyT3Q9DLb zSPOEg_t*}#v;D5NeGt6J{@T-C`9NG)fAoRd6z!A6YOQxQySs+>+#sVC+}Q+AiShVB%u2W`=NJ6upXRkH5_xOHJrpcN>lYsrJKgn0pDZ5SJp^i`2})0 zRFZxw5L>M1Sc;g?4CR0RE4ITG^s>m#32nv)r7$)m7-Y0Mqmk#ijFHpVRgomTdzY$l zy|WhOS)pNmee>p*>*d`$#4?L?N1m!TL%hX&2t8e3HHN_AlD^JCVx`ve?5DJ0mvQ`X zIluMo_HrVlI&{U(S$8=Y+Mtn9VpCWu``8Y{rB{K{$MWq=yfZn)=7TMOnq2Ye^W&DD zXG39_ZNt=|gF2#kD#&OnP}k?FjxtIb$?pKcPovKVc#5R8;hz<4hBI+yr&XEbW8eff z*asjoA{&rQJ{pBu(S4xDkAHvu>jP#RW2^6Cr%yv@0`s8(2Ybnd$FWT;^cY0L%{0@#q-isgA;(eza`VDO-nh4&wGn9y)2DhH-lzu0#3e9HE zKkDF1W9cW2J2?~YE1UiQoQwPG_}lg9f?{&|nPA_t{{XF6ZExE)5dQ98aVd;QLfyFS z1{6rk}HxH?Z9YDkSQh4BGryAMSH%q2py)T$y)KIWO zmP@fzrMi}2*RFIX%I_zNHI9~wEu2SD8on=2V{`B)Xlg9A;~ao@Ivjcdj7B4v6Rv4c zk>g|`6^ijp7+Xp>*^}sKVxkbB5lrww(`ll3s#l%N9?rC;sI+6a_jI^KaJ`3M|5UpY z(MnpExhsC{fTH^Q+CQyX=HFbwqm1R-H#n**yOi3rsH&(*lz=?W75&S?BIpJtmtsvg zi_X;|u_1i%cSvIkp5L(5`-QEkfIn|9;f3>Yf#3;vFMw%asVwj>F0a0v{~maQhLA}_ zF^_2Edw194-!48+Q&L3t159dLa0+kV*7$>VkMyn4)_q2?)t)CXcJ3d%3SYk#>wDpU zRtg;sK|it>K3&}bm+~=*VdzX>5y9ew6BpnJh85vn5UwbRwl?SuVL}5DaCuY1?c)SZ zH`Cald!5z+9CgKX23e_Zp{HLszQZ4J3Ug^-o~*@Fc6!Av*^3C7M8bK+6PY45Sn~ME z{?|jK$a+5)Hn3uCqy=DWt$&8oap@uil#_6@Eo+7XR;x?)w(csJONb?+SP=(6_SMRrG|@Q`9ocf>J>=t(7&% zykIdOR3MxbbpZM_^NOoU9X8r!BfL+s2xw#bD55aAO@v`9S_nJD?p%d^UXulN#Zb}3 zRMD7Y2lKt**Szgnos5M0uki3PxIg~zU`@0W!U(sHA6^bUO#1#C{M$#27u5Wb%JhT1 zvfMb_9_wo2zS`Yx&zDzME^k4$GGcl&PNUOwGc&MR7@OKS<;OBY&7VVlkR<4cx_n_m zk+sCqy&!640Z?>K6-5{|%(jriz{CQpoE?FrPB5quY6$HH0vTjo+KgJiuHTZEz@Bzk3yF=EF~Kq4(y6mEXKfp;fArrE@~ ze(H>m){SFytwQuJ7eXp}XRrnwcTXc|CIjlFir&Vm)<3zn^M`DIIu+W2L%w&!T*q z>M+IOx9#z9A)@D`Ngn8fEC5tMtG@*fU9}(8nown~=m=%>On3y@ycCu`AjZ&D+^iIC$a2Ki5$?dmF}PVPOtg_J+$LIz0Z6n~ZS3HpY;`X$ zf9@Vw)ni7v+%yhzSzHcEqjU`YZvb}&;h`>_>DY!o-e<&%aVjtHrt{|Y5AE|=TWmG6457jvwnd|Y%n*pFi1y4FJ_mINL_UO8O6q}cBV8z= zR<_`56f@Kf3NsuND%}rzfbDbdUShcL?Eo7emI=CrNV=wo0o#m|OfFi3!v|6~o2!U& z0U@z@Lm-xEn}={4+V2y^Y|}on^rz_u4j1~3>rjodxJsl>_d9B1WvEZ3?Gx0?clj&G zKds5dNNDaYK{RNTC&cLFyQTjS4EZF>SyXf-28(TQk=-e%Ywl{yXO+ z&78D@sH)QQy*$rzckb&Wz0^q}$%d-b-6tGONTbGwsV% zI%eh=cMy3_ZkcqaO6ekeJ$_`;|aw`fY{ToM6P5NqKh(Rw{uvtuHJJyB9J>XZS# z(t@opr-jzoW=;MifR8r(mN*9cq5{(~(M?d#ZW?-sqO$vI!70qWq>d{Ivl#|jXFPR- z4w1SD9D?*hp5m~j4mao_{%V2ktQf9)O>)yiWw zJU{42UEsQDWvj>>((!1NW|h2i946M+H+W&1)KMKgVc5%9`C!v=OAevH7t3beh#FVd zEfmK_piFhZ_tfH4tXTRZ>sJkrmpfg%IUgR|1PtN#(f=P=)ZPGauL;57+v|c|D(iMY zHOzSypTA5@^QIw-m0V8-o z?MX34P!4c!A{)1X@7_7o>-X3Koy^%q4Wc8WTZh zsx=CrP8RCSl51mXks@%T7%C6WGsF~vCkBng$~d8k<9w?dP*K=+4LUgZ1Uuzeq~JbS zqYc}GP>RG(AS|5OXVz9&V&@PBi-)Hn1jUUo85bE<1-?E3#b$@CuvW=3sH!52Ifp1x zD_9>SlE!Qrq>05XTKM*JK0O*;tyYq6{_5#-Sa;xX_a^A)AClLC%sJ74VC3{u7CkM? za;vDM(gy@VGf zf!pjlSAl$M^2qP53{LKkpM$>jTG_@&o__k+?*vFB`KK(j%@M+laWHML*rLmA&zEz@ zNOfM%;!h!V1DS2!M(8Cnv$r>A6?u8(p<7@%BlsE=sTLxWOjWS&UT*tc@f~Z+*LG>0 zHw^0JbeG|BDZ9&*vS}e6|DS8vk-U15)8qVynA~Te1bH@f^>n>G*B+(hrTC|&(-3;g z_w5Kdk-MS3%FwmkzR|$!5 zibDFguZ{eG{%|m;UAN>dit_D`byeU^{4v)a?SgL6!DN4b0Q+#Hm!PyXrP7xmbOxsO zmxg~xqcuvej0WYvVr9`G0c3Eo1fSEIYT+h~5y?rEdnalUe{>d)*%p|4*4YcCN!=_{tU4K9SyQ3)3LPxS zKA$5LM$!iJYq2yQ`8e_EU?dAg>caeF9L&klVq|xXjhtw`K-7Saja4ouFL;wItSMVk zUl_;Ql%>(dazX^tQ7uV@juNIgAg50|=oJ?rNHCVllZP3PoGgk0WFef}MnU5AHQFn* z>ula}VQIxu>m`cH>@dtKPYnparKbbK8_C?*ex*BSr2Oyg%4mhycNb;V|zf)ZX{OW>mF`{ z^6?oAVM@DqA6=qzMXTll?*x= zup_MiZ#=Q(J|U7EL!Z!K__I%?*w3sZGYTq>x)quA$+SG}^_FCwN zeFsv^od(%QaXca-fYTOE@&p zk`KuYiWV}K@>QE_4b;AZ@m`e(qo$pd=9gruX`FE;Phw-wac)s_| zchdvH@u{ORCuQ2&jieGj zPpB34PP7)nOZGt=40NWhR7SNH$OdkdmC>;tQ_zX3DwGs~R9B%?3nfFL&agsmVG+*g zjV1!#3hgRmJvV)Cq$xJp4e`Lk5|h@9L>Gel;hG~^6n72o-Eb|mUyq^r$s}x+V%dUn zXK{wR2rE&j4>50M|8!35sftdMr^`_#ti$)UEk-TQBxJ*z)8qHgU%ft~;2WO58-7tf z5$czu(vv0(A2+eKvuaQiS%Lo^B@=&+fDuv$o-V+yHdE zIK%gs;Br$JSsPgt84G?h>?o#G35m2bS;c`S?Or+@fRs`+n1pwwhO#caA}v?%RB}5` zFQ-&K!vi2E6IX#fLJbxuV!stI4T}8|leCRLX_qahM-# z8`*FvpWgrGcH^LIF7x=8Arq(_9z>>exN|nm}oUEZpVU zEvRKCH{R{Z(f&GH&U^U;-zMstpw^|b0_e=Kt)S5 zYtDF)GNGA5Gi9O0A_D?l;>oPWv?4bECH*#vCpSzknJf`5kwpOs*`t|}%&ZYfTMbMU z+VCQQLxdy5U)Sg?Juql*RivP@EdkczfV#-cc?UUXKw+6NVc14w8B5lHx>1hstaaMj zhKL0NfnSQA99UyJORZHMEL&_DPgBy3z}9L&G;L6pjd{-gA-Xq(@x8D z#+Fs#jEVxppIVugx$Jp&FlN8IcrpL(!O2Dm1JQI1S!UC$U~kF}+4;Nk>(jFj&KCOo z{pVlw^UmEtA8T(f02t4-qsXvys7P{&*-OE2k+ng3qw!o%y1hT*3O+lUBpKJ5g`q=Q z7${QB{Qkg1US_s!=z$Up1Aa;+Zn+5}q%luiDZY)!M_TczE5E z^&vV{*B#f;RU~!2VR55nqCj%xj4xzmI{SocMTHz`J`QjJ7Sll54^mUP?&|5)8=U{X z73`p&P{rLrTgmS7u6trDdO(?9-hOK6GB2tuo4fR3?6HTZG^vnIm7#FE2ePmnX*tz^ zjm`@@gLq=cHI5nzv)6MgEV*^NY?_FQErfYfwfC zE|{uy?r4+YxG3x@xdzT@8sA0g8p~v{!mCnA3_T@v+sh)}YXgIB%@D5AZeVoBsb9Dy zYHQnp*0_lEMyrFk42>DkAl%aI^l7#-&K9`rWOC)v2pM9R9N%6?yLR{R!Zkx*a5E7| zuTl!yFv56YOID_Cf`q!P6qVwrBWF!|npIFEC2@HjO_{geNwlu0tcb31)H0U)c3WvY zZZ@VMQCLwlL~H<3Za7k=0V97sL@)eQJ~D;6hMMA`IBS^$;TxIA3`fTrgT?LO*J4%R zFhlNcI68vDEhCz2At0K?SJ0L3yUWY-cxG#?R+f?Fo<`}m**cY><`i0_xG(@_Q-8h)glu~7qaVXsu+xPVxk?U%?8?M;|pDEHPlfh zE2xDYoV3{w_C-%1t3mo|Izb#lQU591dyRy`7{#7S54C4uU~z|hHyJl~gl29Bwo)@T zb+fbM*ffp@j`>h_OWT2RYM(U#cZ03=BbZ9r-M}5ko@LfFHdsx#iks)c6V=0 zVxO?hENaUt7|Bsgjo@+B@=okcy8^horxKL)XY6(6^Ot+s+Fu)bgsXAu=zF0E0y_fw zHchb)J_P7Rsy%QovZdSrl*qhSLw4^pJ6IgN^iV@Qo&;h(Soa3i2OHsJZQF4mcQ*-t z?eGg-ukvxnp5&MRGWV|?Ym9r6XZ8(k;8;&XE!3}8_QuXd+){VZx8F0OhelM-j-w-I zpuY%VoLv8G-WSKxkp&Hty?DW{5{V04G%S^voxBbj^Ns|1ohzcTel_@;F`9PnIlEKb zRua2B*E6ABAP0+G&`hmTzuyG$Z$7S6?`!Oylb^qY<0k0b+>Q%61zKSM*KMUPS`ZLaRkJbvG10!!b!J7L`lnBNn5@J|u--RZ@zd8@}uiZ_< z1N`Rx)lWbDw=q7^y`Vq2sKY!yvaT!KzsG|7`N~>&t%0j#?Hf89A$9zv$CLJ@Xy;!E z7=8D4<^A~-(&U@z@aoZQc&O_?iVlzJ`j5z~Yj9U>Q)AEVBDZ5gIF9vJJ$ImG*4^YE z-B??1+sGAu*RME*g(d0Ol9HEQ$c>%U>%|J|CV?*nipZ7531<=#+{=WVn_Teh#u&fJOTH%QVg=-s@WbR3Z zPw+9CeaF@ue=t?oKxwF^8cSeV-Rd5a)Go_}<%hKaM8&@9lKr1xLT*_)n9`e*@tFhG;7}VuyvMwT!)@K$);9cE=@# z0rG;}gW0ugB;7x=GEHHa;VXKBeDY|Js1m}I$#NWQ@#F<&FTVr6P1 z-T1Lmg`AGZ>qN!n?FiFnEXaKr-Lcl_koN7-pJ3E*h!zKzzka?x{~11gz9QS!2_Atm zOS#mk>7f#mvWn7l%g{d5gg+E%5+*8rH2OPKbGXM1?d1EQ9ZRW63GP0_QY5V%ObGS} zyB#*xtz9RL2%6wkTU0El%;vKU?M!o;^^#QGp~Y?bbArNGYTbiz2~I%_rti z2kfHERI=d>kR3p7slfrQSdvQcS&D&)9x15gHm<@^V3Eg$p2}PFE3C@Ql5B240HLxVD6_8j@D zMa3}qLGygQ@el9cV@OiTgPK>G_;Xp_BA7**9B2tOtZ#!RtUHLv#*{9!xwj0zUE>x@ zXhwpL*N)4+8jzd1MBu1#M;KQ53$lKRx{^A$Ed&x%2)Emez3X7q9MKAE*O6CYVLgeNu@D@u;E?;2*OX|OZ_Xz@;iPoE zsi(5@awC{jB7F{R>T#*Bc^6c()F%?bZaVh$SUM!GIy|mqG@B#4gAv*2owcen8xM~$ zp5CtGKsQtj=ATxNYve?G1I>ZHhVCRVJv=<-*w(dx4LcZsdJ+duXvKxdMMI(ajj$1iE*M(S0d1k#P0s?MEG*NP zkle0kp~5tOStq-x0aRXl>Gj`XGyewa&7~SM?D_7WEOjZ>Y{VZ}hbc z*k-A^`wfO~?dgO8^}BTa_J_Hd5Ef?dqIncAzdCIZW$CL^6V?u=T{zfd{F$x}z$!s_ z6OS*ye(@wWkwP~~I5A3`n?~((z1jp*7XtDLkEXCA79bBske8}iyShN>F4tccSWXL^ z0F>Y2#GzFYH|i^|BKEz}{uK5cv1^d8p4Ga;thAox2qJm9nojjE-$J)}zji;i(*@J1hacL5U$FUU<;AoClQBDjw6$6 zmuX@mT`NG7LvjQ&1?ya!CGv6|S91uNcbDbc%*xcUWb{^H8`rFSP=}^W^sK_}u{2z+ z7!%z2%7nJL&ktt9Mx-j5Ln3PU!sny)$bLt~m#*(R{ru_E#n~^{muEjO1A0L*aU;eG zqZ2(vZ15q>i${^HV}(`jzWHGQ?$PEB0IPje)E49aYsVd!2%vCR^1F)Z=q+-+U(2h>>lp5-)RINeKhx@W8r z9Nl9)OKfF(+eH<9-%c%xzJ#nNd!KDAAZ1Dr>U0j zAT`BX`+D%}3cYapf|hBwYK4%a?hs!2XCvyORBTIb9*k~XhRJ%8dMGq1RI ze#LM0WgES+;MT?tu~xPnknmn9e#AR|l{_G(W&;N1wKch~C>3r{TM9VRAU1C? zmr2!sY2!6!!3P7L3G8vQTcE|H*Ubiq0mn9cc_^A9;z&mp*Agj^)Jz9O{(H|kBqfbJ zanrpiK%x=J@7%s~VZQyLt=id4%LZI4a}YNmbN}Ji;;sUb-GbeWRx_cTun2CnQ|lT;X{>0i*{DM42O+gkX)7<5I%1=wD4+#hfX;Ua^RI9OjWt5~V<$?fEbex!N08_lfH2)wwo$31 zrljLSK1ebGjoAs~(GAlLrkofv=-7bN4p*fYJJX5VcUSip{}g`LLWR3~=!q}r8_0ry zCE1=^@cRyYMlkLB2RK!LLwA%)Gg(9lThzu^roiY=yrqM+Bc z**Z20J!y&j^pb=1Xp{gt>sC>rA%J0lz6*Mo_`_-zmc>@pwOE4y7G9u8OeAC$@f8gj z!Bt4UHGoclfOK2e%2iOD2(^S|I#MeFjwcEy-_v_e91RB-;`ap2TIZD!$NQ!oi>0`Jcm470)y32cP9CSV(Sqbv`5uASi0RBBV zCm&$G_$z_9G#*02`&gv3@sxkkW0f6wFS3*36*>3_&^m$K^}tDs0ZXX+%y5h#Wa-(X zD*Wz!^P@vD9H0QMoy~@^+R_}vg&jLJ{p>zo1*Hiq~GbN1jvFcZu; zh`qdt2InQ)laAy_QwrajlLjp21d`dXMV)@sW{XjXk@l*Az8@yM6e5TPrY~1WXXBt) zAPc;B|I^P{K*^m*lH9CM)vI6eTSnGrzIJ=4HCp~Hmc!D#*s1DmYHg7Ie7Mp5otfy(no7~h> z|D2b7_Q^EatR?z8F_Oek=Q0`@xs}?pjN0U=Dj}cnY9n_Ek)}CksDY9OwR!}Wu=?*X z_=v6fPPEcG_}JNco{pX{Y42|?K3-ql+8H$O|Z(qXtA0v5whz#jTGyw0@2{}M4 z6{;lujgn!`#V!PP9cHYjU6zi^8YhNgm(n0=a>oC*9X9ZMsNMT6o7SOgiLr5`K0>wf zKm&7AlH5RJHsHqDi84%QX`ZH@LknCCFN|rKGQR527Eiy1VLPBrD)e%%5x~fkQ523T zJJQ;#4KQ}-6bUZ)WvcRYru>|#p(Kz9L8(NmN{0p?ld1(P*;{UhiZz%W`D1M!Fpyr= z7*t1arF!Tr$1yFV_!6N9&BT?a;k`Pr<%B;!k%UQwex}(RBW$UVC8&dz1cfF73M;u1 z^ZYE<1n9bE6pi6FF^$W#k|yL5(PRqP0S8U}aIb5sA0~A!5=J5?ZGZwtvJlCMf5P{>W-@!gfUA~h}KDL>`Xz^4Ewd*a|TSzX?c`_LT{x=quZFn zLMmXP*+eWMiCKgz9yEkf2p-bTDM$es?gw+Z#?O!%deQ-+5#Ve#BNp*#CpCM*0SJEI z;4-M}bsfSQ`o6E%iO-T`KzNR~pJU~yW6puasodfWnZ1^Z!<=gt#icRFDXweHF2~=O zKGnbZy+tHgoYPnt3P=MN^AzfFuhZP#=ARzmFHzAQ(;RlzEHy%D48}$w&7lbA31a^M z7U(j{!%Q&Yrr$2SR~)CNz-j@qQGlFs3@)UaDKx9X!?+Q9%LpB?5wweP*aH1(g__70 zS5lx5Mk17JdTFVlLS^$gs)^{gSk16i%YYM!Gn7zh)XwJ!zB#r9)P@i@%r10i-~O-m zO3Y2?N{38R&cGH`?U&P@f#X7po!ugQf&HcrKYQ@%ptiaVZ$e<|L$EERZes!coZpQ!uP@Kw zb!iX&cV5?`4DRUc;>*do=kz-O0VZ7}_}q2IpWgp5x|-UlXx$M6jUgDq+qaGNUd{1d zI}EnLAYI2qGiU3mE$>rX3f(TXP2+aBQbKme5Ue>EjIS<7Cm*Nd(dC!X<@DFHix2SB z9z8!BUyUwW3v;`2VNFBR$6Tu}$6D*a!C@)ATyZVeDcVLaMmY`d+adOS_V4~GW7t@r72r->c7|n%}^%3qEUie zk*W`;r(Zti-lce^kO`ep#6ki#otPs>&0UB}8+XIy8~FbFBIahm=_E~|3Q0-}%)=B@ zeTps7LrNzFv@<#f$-xN;poaNV1~0&ntz7kE#>jT_AIX)*+Num@$`QnR z)5Uo1HQ%xsTxL*GAZ`j7L!WKfw32L`1)YFOWcy7DpkeprxQ98x1 zGE*UMZrYKE;yP2p^tFw(Gyh)iFs%Q3_#Zb<2D|Mw)xzz z%y)N+u0Y2m*8q180qSv6g~Kehse^_zbI4waO6X<{c*dhR)(0$korB#@=Xg^(yLZU( zI_Wy5@HzSU3v<-lP*2;$S@JeOuJ8^R^XiW4RzB4;`eljWk@01Pgt6Qv@o&!3m(-r8 zQZ*%5*scFV?>0Y9;`rQn#Z}s>J$S8#W4c2ty1{KZKXSfE7>MJ<`8@gF*Ax>Qiew4#xRMuJ5vA{xif8zrBhs6^c+q1o*!5bl1;i5x^s-=n$hBrt zvlJ#aTt@jw1S2pE3E%UTfG<2{aubJQ10F~m&6TDKUkk>gfblR?51Q>%#!|)nMDSEF zox;zJj8@DyYEngd40h1ezd_XJ5yNE2wV#`IEbwT@?j_h)%XVucrZazy_5jT|goIM@ zn6m5hkCV%fFe&^j5$yWi6$87W@_EQUNAl4zVeJ-ieU1W=5Ik$8f)V}ZA_$QdxQGDV za`s{^S8I{H48>N23{c^LAY)5qOaVB>bdhJ(P;CXquypWkBX|UIDPRQyyM`jPzQ}k zZz&^KQA6QE)8%c`T<^~wgHN2uEi&xbS&k{=Ny2x7A=D4bPz~V+po35WHi;^ccyJkE zMRLi-VuAg`ek;v`byRel$*eGfE=&EIMIwU9G3EEL%;|$-D#q1-11z!lL-4I%} zn2Fph)Hv1=bVTZOs;J?cKrDF{8c(-_b(+TdWHMRFbe-LeeYKe+h$ygULJ_@0xo7y_ za9ja|+}S3<-ha5p+*T4)SQdps(>~!r5E|FgZAs!W4y7;CaA)Grts3PP7{;~rcul~X zRs7Nhzg^gxJkHg`EfLULA)Kxg+~sDM5o9QXpKR$}Jo<%(y z%Pcax&wO4meBiLoHlk6rOvr-iU(}x_Oh53r)&lkwPN6E7Y*6~k(S(Ap*2b4FPAN=n z6zutPHke@s^C;WQ!Mh#|*^g89Ey~ZNo}1_?^x<&mM2w$fig}u6X05WbJm(WLb6Qoh zFyztHW=r76dO7=7uafeS6P?u=V$dd5c9aJL86F*1h*pQDkrr`-+D<1u2HwSE3`Gh> z-mmtVK5gCow$9Wqm)9G%CI&R%aSSDsm#=9+8Z(Ym>J}B%QK4AC_K%!!m5jX9k3BYh z#eha)RGSKQ*Hi}QD`&1c8AP3WsoV&arCrl&$ZJ;vXuqOfs14g$|kw7-k=iFb5pjlB)V$Hgu$?`Dad}`inkyklbYl7Vkjog*3;8)bU*oil& zRyGCG14wXGrd$uGi>8i!!=K#heshQR%FgCc7o1Wgr~7a#yLzY9cFWX9jq;ve+M?UR zfM!JhJE|PxJpf2rTxcDDI`@#yH3*+<&_{LYuiD*ea2Pfd-dFT!^Ay}jvTo?wr&>2R z^jzEAD46!m?dfIsyUcTt_-f{%?*9q%Y#O!T4qzUg9}lOV75^LDvla~G_&Qi?kev;z zBlW^w-G!UH13~>tXl)ISvqaXfe8(F0o{hkr5-a(%g5eAe( zfFA7d!^|KcNv+|O+(g8Bx^3K<5&@Ueh|SDH%||%bNG)cGz?X~x zU8O!{5%RUXLN(UWd#{|QW4`4wAI^WfxSktP58K47G6Y@XyYH%}-*$j(s@>oegJ#`NbB54Q=OyxnUO*!r z-m*8D3=;dTOv&;M#R6ewiqSl&wzm?EFV9YW06h5%BZV_Eu1DymQ7<5j z#p0b-?#po^Vu62F$YHR=02<#%>LIG|+R~bQ-FQaQYm%88zWg%4Cd1 zwy$O(bP@TXg7etr$L&A!H5K#+9Q{Ye@ohBWcstekBPksHAXQw3SS4v|$leWA2ap6} zy>%mPy<+Bx%JzpA^Bz%w7d;;WF3RnJ7Qn$cE5ZkaKoM|Y{UH&6+yRSg#12iL3hNN> zB)AWNGZz3WeP|SoQpW)7DLr6Y$?>9Sy2aA969}Dx0jfRhDuDvN;lmPcZ}=y~er~yM z?b@CZ!gVRwm9>a3h3+3&@`)M9Yca>IryUMFomGdR?|RgDjL23q6LP%(Q$+JdL z7Oqe>);%b9N8vs9(DND8C{#*rYKn_8OZY>UgixMvXEj0Wd#|l9(=*&+;A=*4)nu^#7}y?h|U>LsLRMDqi#06 zirq(+z3=sMUJRW@eEKE!SUCN{IHwQny)k*ocpN^lwEW{!l(BRMMD>-ECl+O&<2ae( zj}1$%gLw;?i!`1G+%_~lrIE|Rklu$(4QUj5qgStb3*ax}hLm&i zGfk4^WXV3#FyyCk6frjo;^<=@gdR(KfA$D`1QqwN8 zBTJT%N5&G8#7Pq1!iapjAk_0xup^0QB=cFZp8PjwIU{+L1tEzerl#iwGoHIHV;*cv zaePTYNHU{AxJUlO$RdFM7BtAnoBjPcC-*E{FcuZWK?_2&jLnmbqqqr6$>mR{dy06$ zCFA-+x>U{;F9R;cWUcM{0443Bd6zI zzfMlCKb?QQJGs7|e7U&3JDYqy`IQ`z{k=DE5QZ7gSV))T_mkhjn(-|JI`a<>c!8^DjdG zO7H!5O7SGW4+EF%fUe2=+K5syPV2);c4IV8gZh9U^US)@1O7Bk>C%z1!bgSiczpfq z#pLb;hmMZHnL^HnZHwSzEE?G5RFTI^wgao0V7-nj|1AQeWlhAsWhc_JMarnpCN#}> zeJDsEv?0pyRO&MrOnJ&$W|ey8;2$8Md9svelQfOfpXfXYm+$S9hb`j=b!xLbl3ssz zC%h}o-OQ=wPw7fSa$2~LHdDIPkTg6m>}bc1li8q35vhnE}D_S2<*G5dsxMp_W@$UIX8OOCzOSuznu{v= zULONYiJZC*TXqZ#O*#s+S(=6@o1MNT4wc*Zh!06ZGk+}6h7VAptg?l_IFSC_I1fGH zMQVC5L{9@Z$`Pw&zJXvG+%%Ue!@_zZM>0ytUw@GoQXjiRskp}_O~+X^BL&nw2cxA6 zus!hvLQB%v1rab5g!BrnNyN(i7(z-W&V&k726j-GOenxf5DCCLXEefv4W2t5o3S(% zh(%AQXKL87_uRitv**9FI*%Hq;Ve;QW*!czjD{exA04(^XUwRT&Kmt8UpsPZcZu40rCfEUa>^ zgI+eh%!NBnzPT(xa!x~!{%P&@(I9fuzPtiv(i+#Un= z#tm@uCd&T_s$9^+4-FS|$*WW;Y6K-=07w^%Sal6BuST*Nz(tCs5ka)E)TzmBFo73} z;*vYEV&F2YOSmV3s0sepKwl%Nm4BUtVNt}?%|d`y73%0;dJIp?03r+ll{Nq~+LfScN`Qv@RyDS(Sen=(2{?mhA;HhS zeR!t{&dh4jbciZ`3n=W<$O{n~-^X}!;W6=IY>{Su8ZR(&uFh|ykS}{m!K{vG-vaBa3FaNNn#!p z&?2NDxXfsTKF}a)X|ZUK;^wwU%z%3(mkO>RT+>W8Ws&E!QqmUg1d+$Sq27;dxpv2< z8qo@cZX}N;&eb}E2ILhRs-DE!LeS38M5;|xV`4>BA~m^MaHze8)rAj|4qcV!siJo> zcX!P-b6E}WaFdih+@&lD0k1gy(Qi&2=-&KBZg&SaFF)L3{l=G~BN%#lyF2O+Nq^@J z{4^_!1rtsI2!W3~Li7F@ASz}#(MaxGKIg^5)27vbPubj_-Ntgcq31N8GcSPP2VwaKM@S!=oyua#{}?5%O{wrnGo{C{e_ z3f0rtW9>^i)cx`=qviqJhpOJ{;gNir9DmRIqGWI$L3GGC(tu`(EfH&qM^q2*MPjbH z-vu0Y;v;FI9u=K=@Ze{7ttu%DN@nVevFNSs=sHsu&)EtH$T8W+wp{(uqtV8@tsJt$ z>ayu4J-E@=Xp>ogzR}uaoQ1RTxb4B#)+O8GsbNzRSeLlE^vJjFkJo$SE4_$63rN~g zmkA@~gI4)UHy*=4;W*;0YN)?&380_{SasK~y|k5oI>_L;h`2~fhU|FTgQ>LaN5pxC z4IWSSg2lCtKE;7YTmb&+v1FlTfvUl6i4^^5w_G=an53>x+Oa3T<2N6ZO=l54)mWuB zsMdUG#Ol=zVnv~BG&ME%YSpXpYK~eNgI1l4HP6w=Ahne~>oR5ME?_M=8K}cXx!KKW z$$E9P@w_N+APFN#T29szCyM=}pX&syr)pW(1+d8Z4#%aI%QlzY8ef8M=!WXT-RM4o ztzygfmIBd~#Gd5>HmNTt39DvI)?$?_wy`O0%)o0M?fz%jAf?C5Dk6GZyu8)9;$#Ti*sw&*k=4g>lq(dom(?O^Tl$bHm#=JOnXn#w)S9F z-Op{@LZ(>_?a#Z#m(Wlgywu~{ZiC>ex9a^5byQ7H+%OQm=U2>OrA^QR<+|HKCAtUH zR#dRPMMB1z5EsXe`~j6J{(Hx<6E@k!hirEI=DqpM=c}&ivP`iSZO1sm9Ww69d(EHG zZL-YU!L)rr<$h@0mEp1Z@a9H2G&ND}Lw*_E3XA1Vv}iuO=%3oV?O%?a6IxLKwNOj~ zm&{s7*VkGpU8y&PExHjjM|mIMN5lE@w; zX+_Pebsx%l{e&(rBKGZgo=G%ccq8UP8g$+$h;2*4`8@LRHBzi*F|YOmEXdrT%0op~ zU{TiVb;DF8(M0cQtmh{uF_sg!Hb@<_z`#1@C;@|iFlLYlz%|T~xzol4TxWDgRy2mH zOM`FO6M~?G8O^1x36UZ^OB#dJj=}{R-bfNBC5bjD180k_(G@risH`^#AwwEp-T$Fi zrQN{xsJ-f;Jx0(-F-5b%g0VrsVGF>SFf*0L-kp$K`ig)9k--`b2H&G(f|7opCc5Cy zz(NWJt(ON$e(jiHE#Zt%PY`N9-lVQ`CMA26nC$11%}Mnbr)bi|<5M(Z^Kx8$SYQ!K z4bgGWDI8Ig9mh1OXY)_T+#?*<82t(gU!lD7D)e}S=Lg_$mTA5FCTLi~SzizOS@t7R zL0COj(^|(%JiVm7O0ncc541?duPo%--ObPKx7**lV!1jhS5`=$JFN2M{q6Pl?e1ap zSQc;v<=hHuxVZRqKvirernE8BA}sJ7^fqkPTlOElS#59II1>JzUol+-D+zU-w7cC8 z&ZcS4^<9lilOXnXai|M{k!YJ6S=5qJ+~C^(elsLxy*f<~x91P3ObzFKo|$ofJ~j<@w3ML7~f|$sJGgb1Ab0{W;nDW}4<)Es<5705x!Ca9>A_N@EP*ItTEjfb#xhNLluHF-lO>#ZXxJU@ z!grPa9baYA> z(u^q#!YM59LG!RsiB;mHA^(Y^`|<^z2(8g%d+^cI(HaBkeHuV{vX(lpf6t`C?*ZLy zUxFv6R!y&Mg5r6hQgG?FQ2Y;aPs+Ej*q4QVg8_ZKe+bNQ`0aWMKa^g;f4m<+Xb_eS z_><|yhd1YeH|X47#2ho2$G$ha9RG7N4=pJwdj^Zf5scu)i^lyR==Zmv6k6m;Z2Y#v zypNx}mfv45P<|d}Ihu!8ABg#1?66pJ4XMm2Q*$O#U|`)x%ER>P|Ln%2BOu5rt88V| z7N(AD-Ah%uyj|Z70iHI9>A~r%R_*S{f|G_|Qz*#FdQ-y^T@HU1T-~GiO(s)31-T?I zRyrWLt^lSP2-wM)-22LW?bME2?@LBN|Vtk*Ex?%Jd;WfKo`*(P!y{( zdYkI18z@c~A<`8H^k+xWmIk~Qcxe(Dc`G!B;~&Zah6JQOs>)M#lb}8cb`1pxw8lR4 zA!nOm%SY}CC3)l8z+R#XNWC1^g+c<6qqt#T7%3FCrb+jnK$iK4FsKv6z}~bpsX4ot zhE5fepP1RaTV7tqxeARilf-QWn)Ou6WoP<1U$N*OuHIe2ukdpC3y4)J6_)#sFQ!k7 zLHe^0bevfFb_fJk9%u2e%^m{=WQgYKuH@IeYZ4K&=!R3q**M0CJeUu=dPcHAn={+# zLb{h)v-F;zslZ3#WUAVzK9;BuTk)y6Im@xA8g!=dBJ1$O$pH(lctgV$YYf|rMb?`l zClMLT*N7-63n3c=Omn1IqM*Wxq1>rJSMiO+X|Xv8HJUCpw^9Ar4lA`HIkaGbOkOYS zV`w`@7$pMjX-3zHY=-TSE0xOb8M1309yh-(X7lUGoA=@Pd^)+9hvUnOi^+HnU)nF; z%>H#TE?>7;IF(&$h7o?txnHJg(A(oE@6C*1rVZzS@0d5*i$D*uIqaw6$Dr3o4U-By z9@#_dC491b&CJxxXoSZG8GP&7pj#&P#Un?FEfcwEdeKg;D*olvU+n-D8|MVFx^#s5 z*WZoyKIVj$$sHe1c953>(`kLfc~JUyU_8+26-4vw6^rBFmB3t_sDAZ4d*!m_oYk{xh1q-v*;F4K;9xSi(48dIQHD+9vys-aqeRf^Bnc6 zIUaqwL>pqj0OI&yQ2+tPE88~M^3%f(yJp_DsukBXgR_CWGthrv7nn>L!1JSYEpIM z7iB(#{Ik%x_T6wBB1|H#h1PO!uhC8}?)?RhU-mATLNXJ8D@GdsZpbmX#PB0iPiXxd{$O89&eBW6AxpJ%EoF>x!T{d0$jJI#q_N!E$$m#mv$;m)QC(A#`^CLp zERAcbayMa_T%La;_R@sjJeY(^m^Q!fJY<*?6^wA=MAdO3dI2~0I3~Gf<|>2&diwnN za~OBfZZG!*25M!8J>NUBEc`|MGys42G&u4GPU(-H3zu03A5}JPU)g+o{)skmAHgjE z^A*?d8MX!93vIjz$kv%)^y&fdMab!`4C#W+)rj9eS8Hq%)XHTp`*ENU!DH zA0%jax}N;~x7p-v^Jj_L3$zS__ZYu;-2k6?dz|nc;7>DoFZp6=D)SqddH8)ZTKW0w zXSKQm)9#c&pP%o5jrB`il+cpsX?q6{!j7h?rcxwl2i0fpj zXDq?eB#6^~iCTe?&$d=s)JV#W(dNJJC`uOf;8@61GN} zvJl}GS*ZLO4?m$A^?I2sr=}ZB)FtPsuYZm9u3RJv#e!7XA~%AsBUwznVe_}BR(w8T zaXfttF;x*y%-Th=VR1A+6U%H(S{tkH5`0WCR5*Xn;tZ|T-Xcm^3}MWqgc*jJzzI(h zlH~%TbsD2qCt)|aGqd-l2Q*R6aze^h_UzpJCRRc8x8k$GM5e$4gYMH-H6;C3-ETm5o(s^zu`8fC}r}ekP)( zH_-yz1HTjv@G+7~x{fhBkU3NXOxQz=L2fK}JkQ#%hd`By1PUDb0{_;hX*d0DIJ%A% zkc2CcS(e1OF7!Kk0kk1K&8x(Ab7t4eT z+*wovp>)nCS5hu>=Lg^%4~LEibtM_M@o-=6e_vc8YfOFTGT~Gd+-UUXKj6DUvHU-D<@?~wm z=XJ-^LUj%17W~o9qdgfms%cDeMuXzIt+mv|uXdWr;oWCFY#K;`KmulnZV3=V6#Z0* zmHT&iqE?u=yZkFziN4#kM3Ww9{&mX$3~WD*@&Wu%8mvEeel@W{so`cxv0E?SO>Tx4 zH&C5LsTPKabDY<4Z-hRD6lb?=vwz*4z&{e zbIy$ZzB=SOZy1HC;@vq%nX`wEUZex7t5ju8QLsoGmr=3=0~E?1Ndyz3(=g+y*9;{k zD@p&8MS{XIn_Uj?E@x1pl;=jt+8!b-s>rMADuGGp>-rDl6XMG}wB|vn_gmg5u?5A!a5+>6>mnCBJ1WV;6SLVissy{Kp%vu&CqN|#*e>#}lv!J=3r^8|7L?Fh=kBTMF`@%hQ$iNoiBc$+0ETH`Y; zs)u6%j>2n`X=(SI{wIetdRAnoT(M7hY$S7A4^ODvzeOpjm{Ha5JjRloQ0;TQmQ)h} zHp|*K6+=)*4KH7=iib!X^uZ<&lVHCKmD0BF+9;*9~@ZrZDgG?7{#^<&`I$EUkx5ilU1nse6YEmej%R6R#g( z?Jx(?_j5bT1GQW&4<`mH-`cB3zLz@5>xaBe)Jfpey##q}bd3c>Ri4wnOM5)+UF}|J z&$ef}?`fLM_rb3O)1ZLa^CizPdEe^!o@^8r#iB?I>m6PGt&@sX*>nRDZ?qMr_bxfK zsF|IlSgaMrvaO=w$zb2vLGx6rFDx6yz1^W6Ii8-CFaft-72n6UdOTMPLk-?|Upb_= z#^n0y>g>(+?cMZ`t`|o++Aj}lWBvVMEzm3E=bv76D(xyYPi?lUuF!bW)x}zElkSI_ z@Z6nPzSf_5{{q!nZExH*68`RA!J-RDn_GJW+?T>`oV2ci1V|bqPJ1}S!7eRvS3Gk? zRieDvYYp_*+z-27a?g+y^|D&K1^VUm!LUira5(eKGei2@mqk__9p!u@s)8qieGoh` zH`hA36XxvbsICONycfCHh}_)JZ{~6%jS=OUopa0W_*<=u8~Sm0=1mU46}E9pzUS#X zVKSXwaHTH4B%&}<=Wgz&Tzn}+Vnq5gSGDNO9?hRUJ7Uk+$4s#0wMgnxT#NEvluMQ< zUR6wP3T5rBm~m@pHtfA*JWrXdScxO+ypp#{kiL~JSyAeHnaX_4IIFB`_VMjCi!rwm zrP{H(TyJy6D|UVTc8VpW`2^CW;EiFa78R>ByWO#E$&12iT7FE5#zdJ{hUakfHj_!l zwp_wYyS3sHCVnyYY!_GaH&-mtc@7`o*p)RJ$H`fNW567YSlcp8R2jb$Rtub-b;KIe zmdho@8NW@O&Flrs#kLpin_y-9&GYBar)N(r@47zr>t-ykm6|bLmV6hJ0{Z52W>iIH z(fODz+=((#ivRxpA6hkayTMFv@IP=;K^t=fRU(#%ha zfh7|JLDIRECL?`et_?{qCavI<{n|KEB$;NBbA0z4t5RY z)TIw&n+1u|Up!f?{@s$be>~0*#j}lWRo%Si#+j=+NjytAXN~RdN0L{ZDUyAf2_3#2T?LWioO? zN;JXK=3uWXIApLWjE|%P=H^E$nRDfj-E{>6rwAa3b*odi2n;tuRPhz1yyx)Q#3ZO# zy%7O-?tHcBO?U=F4YIUGb%?%a?4lH$sHs;qJarOeK{F*RA+{%+Qeb2bMx#GEB=6NV zTK}?w;?(_xMJ3p0vYHC%FSP{4uzRj#%07{X0oi|^HA2ozz>VzO=*qBLUI8?g8#a8$ zl-74R@&=s&omR;^LKlE8Ep#Jzx2~)o8kJXe9BpoL9tSh+5 zDh6;_J(Q-_UY(=KN;nv$(aZB;37`tEI3>A}8*wsBnw2B6CTZ`)j#$#?G@RhufC4;H zWF@bJqqB_P3u43yU8h_@Cge>(;QuF@AKB{#QFxZU3(Rj62{r*&6-z*=#Qn(vlAM!3 z?3PFhU^BW=URbqAREJ`cY`Gh_qasRVYpG7({)_Bm{{%2e9ZiDvY11XKY#q{rS~Ox) zU8c0Z4#oJB_qyHbbDSAdRHyU#8tAWYPmtsDlJEuq&#gtrwC-#AG41EH-Og8g_T&4H zbhfpG2%N0Y0X3vtQQhnI7P!DEnMi|-w)Qt#o$!bohVl3=y{F+6;%Ku@*$=p|p*=+_ zrS#TT05HtR^$zt`9JQN` z^>2hkq8s7p+t<*PjpP&3pp#JDhPN^Z;)ZUr$P)C_oybu}g>g`Zu(bd&(H56ksq1xS zJ%~&swc$=vQNqd`tAHzlV+-Nr4uP22vSFFJQ4{2Crd)JxUpAe(X7xNCn%H#>PeXxC z8Q1=I`xKj3p{46OWAv_Oi3XUfo-(YPIgM85BF{-3U++8F_tGvole#i`bLh1Jgtvbw zb=@7p(kR>riv}55Dmv{bdb+oy{VP((K?iP1``uh4^U7j=*fjqZf@T}$!Qz)aZgjLb zSYm5d=%B+S0ccwtcnPw6sKlBlJNEkZ&+pi`?C&Svu(Y;>senepZdDhBE?bp!hX~e& zQ6=*`){x+KyFCH%o#evIH$1Ponu~nibTn0^Xf|A*2HEIU&fV3ZzE#w`HW$dn0;`dg zbz8De>m%F#nhfX;D>ZaLrA->4URB`0kVBxNN3z1WS zUf8xrN7HFXo<8e&+jrcIdq0jY!#&7yhj+B=BVCV$Hq7?zaT}hO(`b4|Pd=}xA-~XY z0XXB$I>!Y!81Qfue#OeBQrXNe%&ya$S&GEI^nk%`(dFC`dOP#DqCzBS3%>i?i(Z@L zzrFS+3e(fG)}{&N;PE-)g&4FK#LiTEMfAFHXSI5bzSo;K8j z%cWn#?G&xu6NOoizA^QlkcgvVt8a({J9vCfH$Ej=g6xU6dq3KY`>gu98xncnKI#91%9T7efXIfsU$X|BuMPMwXx+Rxu0 zCl{qaq9h`YuqoIlVlx&QMMQ+dHak6jwt}ui`^V~>#jki&3-+lukE>~xJgUc*lsz^6 z$X#uIVNcoo8R$6F)AKZIQteidt?sSNzUKBG zqR^=&CmT9>puENyY^H+b>X!+4L=x|DmE_UU)3uRWdw>d|raOU{6hA0xwH zKm)-ZvwK#wN(SM7m>t@3kAP=gU(6a8jap)5eR;e2Q0Mg8(n5Z3J$+FJ<@8SpW?##F z7*6mP{Wky&gb!IS!l!Pr-L?O`J{#Suv+@F+hNq+M*DdLz{(Y+81feGr@S)pBxPgbG z{{f{|ZByGu5dQ98v6*^enHt;VOIs);EuquSWSUM*K6EgH4{426U0W&aCV0hmniMjeY0oF z)LPU>Ec5Do{z0jH>OQth{*ZKWPG-Ey*(%1|rb?2b(cWGM_TXKDxyD#nOyFSn({KzE zM3{L#6V!L8XOK!`Q6#KyNL-iF;ixlDrN|)8gfZZc0aq4fVxaBG&q}q5VCQoO z=*e|@M_iz5SWG(uj%#{Hw+ zm3s$oei)AF=iu1+p09K0*f$d_UR!4O^yE?n& z`U}GK9KuV(wHsCl-xDNN*7o|f;ua0nBq;7%YO-0QufMpwdc+yzLep4reP$QJLQL1n zsI)k zfYOPx?{S=&iv;JQ$h@V?Xkl$`4o9P#)GmtaVXT%T?V?D{HDX5lPVYMo(XbH^HV2d6 zKYse~9{&7z?tHsR=?WAwLvrdt6+I$h3i_b$a4*O|VuGtYOXJj1&oloL)nDEahIa4& z)|egx26xdAnNd&iJU{&lLUn{xhon*d=obtRzY|#aQD(M@3Yo4**6-I`s;8%NobloKWNmiQ^Vsl{h?4_lceWg?^$fR3 zXU*XErNsuH%6v$}pd}>_w@cZ{nz)kIGt@Qlf?grWVYc<;T{l;TPN!5l^evQ5k48jCQ7>u+I&S}WZkRK2J}mxVj?D4_xce|ZCk5ZU(Z zrE&O6l4#ndQG0-Dw1t+;AG*xRR#p235_?j{&PaGR3wAv(iTc;xNY*TMKPY zDKtu!LNN(kGHcs=uD5rCs2ho)6boIjvmyDN0IkM|HIc(Ww(iB4pG#7;^oj>jFq=_5 z))~)Twqs??f)bRMGH-JuYghxf687X`gNVq>0s=u%JfO?+af^L^`O=Mr*`Q%=wa+b< zkX59p(KZ5xkQSp+nnPKZuw>F=-h;Pt0*r*Do;(UzIE}G!2YUvj#K`UEM8D-e8^XIB z-ju!UeR_k=8wHz&sto=J;uStZ^;%zLI|N~+9|iR++}}>&sMAN!^az9n5qTh+Oh13W zy2;bw0YSAuY6o0o>D`y>Pm^!62qm?bQ0;`Efb;X6{5vzl#Wlr4dLzSSw2p7UfP?E?mrCNAH5fhyH{*35uD!kP1yRw!Q8X8 zfcAeBOuP7fxkIx?Qxp_#8$XMc<%fR9gMYGdqbsyF%?p)v-37AFlwp5rdPKeKlZ&>j z5@;T==k9@jR?9VJz07Xjo|8Y#SZz-mIS~GyUol0f*_4z7`lf@1UInR&juJ$2l}=5y za(10$5652F-avF9-LJVHcE9At_P!?#?cJA)AS7OUUY?nGX3X1n@jPxcI9X5?lYqiC zC4n9fMQ}s)aifu_Y^lGbTwe$gkImaT*HljNz;S8Il@yCe(eW9bQYmSeK1;Zc7PNmC z&{#);yVYMgy^Cp}Y51A2r2MqedG@RU&tNo<6aM*d&C4Hf?PnJ88<=YytD{cm#quTF7joA5>1sF}<@=&3 zcxljDrJ$E$n;O@H@o;qAfB(rpz5eZLH1I$5M;`}gKC1VJ{p-*D>r&7&$zyca$4A5S z!KHtGhMvFa9(KF%^eNOIo%G;U_jR{hw_@Fr`z@v{5BzRw4%~0ucJO`M4m0O0qJaqM zsX(mAjGoW9khEg!L;mdnC`0D?w}75rocAwB{~JJ^IgbMRUE2;b=Y9~-hI`-0aFmk? zqu#0DoVt}=Wtp|kWs>Sd^2~iLW>{)oy0`7v?|7S{^u)R%BvJRQt`VJ#iD^REv=Zzi zZaY@6sbr*JtbQzO9dT3bG2&pQ;*TV^*=A+?NWr;o`T2vZNoHkum?{-5DTG9miqyau%b3||sfbasMELVo`vFo)DdRR2~~_v79;#dr%I)fh_Z(U1UsNVeQPOwv)c0Z4sRnx6|-l z;>yW%T=5_qf1aOUS>gB@y0NV!wXCe1hz9s4l^JQ>+OnOk%^+s8S7Ay?N5*NHXUGd~ zHuhSG!klt%1G*V$E|99%0ch14RbD$ZA8h-UpTX2qC;)Xr1K+ePn%-0tCzJNAf`<;RYxoEcSOD#deiN2#Z2#*16?wLYg?#fDfD z#tQvoEPLNR^5-~7GAc{?uN4X8}GAs%1SnBo1wBT|x;w=KtMw6X>CDsqVG#6vdAl1Y1^;GaW{aAdAg5Nf;wDj@j7(yFOzR65IfhGfa4n_unZ3 zh=b;vJ$pB?7b4^syw3?YPRzw^U0xEK*}zUAC<>hsM*dMi;?Tv!Qh*`vO5Ni$xr@!<^esQGPf_FI4*O%c44!SSbgth85 zwCN(0qFGp20(1)j{CB)ulpi;G`#la#=M>FdVBy+Pxs8_NO&q(FT&>+$9vc4u#aZi4 z8%Y-a&r?)1Xu6vioQpJ?H3JDth!!mYgvrcGn6-=UGH%hgsp^JUn@IaK^I-EN`<<%l zcHc~bc4pT`B5C^xsbbh&5-N&Cuy2Z=xhDTaRSCUwt?i~*475wVpsZI!lP?;xe#pjJ{Svm zFXW8*5m$ zY%bFnOiX+Vm0p~Opbv!dWtiou+<`O_IGfGLHF(-o+8b<-CE}ssph>B%``X*JOqTtZ z1)PQz#$iYZ{Yxd(fQ31G2&0GzcoOTgm3lKK$YEH{7sOdDXcH5a^8_)fd_wBa4lAOS zS4QiM*xpYQ*ICJR25ep=`jNRklGx^o)?@!7N%Rr^B4y5b#6u8%%4>=m|2k}^&bhsR zEAk5wr@1%?0>nwV9w^TLc0N5iJJ~IzHaH$+m3*Z;l@0~lSOZd51=gR%`z+EJSm}*@U=scv)7CV#z zqzb^Zh*w5=q!1Er`QC^XbBlgRw~=4wzex5ORKYv#RwN0lo~?s*gj42q;h z&eA!PJh>ICN|7&Q`ao4{c5FxwMCl51Xb&nMo;nci-F1V$Gm-tq6*D;PF{i%LP|IW z2@!-QonpR()8!KI&QOD_yO(JpnOY(M)D44Sm9)e<4{r;}iM^3;6b4aQjfp|=TcN9i zp9Z3nM~vSPnu!a>6)1{Yx7t2N#df~E&A8+-k|O`Ca!LB?<}eTN4HqXxe1lk9l(5iG#t)@;p#>tSS45E! zWLgb`;c*)b^l>a{4M3(o zxktyRKOdZU&Y;6H2?Tn%2wZ1;cKG+B%c&uCJobi78n4)hy?WK)_v*%1kDCu2l?B{JVgS#P8Ab9Wl=O7`P`}PNKV!*p6%`JHRZIOiK_O2 zVoj+D(3t5B&UX}h;8FwA=J`&W&uFtsFmJ@(1G8wjD8sadmJjU4BX*=qQcz?)<2HM} z%d%9_)V`!rO$9V@Y>6MStG`^2*k5_jKVg)fGBppd(GOF2a*FXwyR#9{I<|+CD~;(1 zHgI>gydgnb^ItjEWanA~eYdk&l47$^DMU;ooe)t2KH%`8%S7(2alO)9`T_Kvoohg# zPYv|#GSUO~RUAxxq2dDITfE@g8JQnetsQ1Mk7+xj5nk&e;u>SUZf=-`Z-IP_WFlSJQy!+-+jBiQs3Yt3Z9_SoVCG!8xXC^enJv0KAj?+0=Abr;Yc?+>cTvIve+g zxLW~E&o1e)Sp)1#gz?88*TsEO7U-!)wsIY#;gs~J*c*|pmt_DT+CihQW(nti3=ao& z(puS9DZd#FC>vut3@y?k3iPP7;P*5oWrB_xWgDHFZb%KW)+CMfJ9T*|o_BOExf6!t zA(eOAT&4xalF(cl=#XPze83}SXh5(U*-+|gB?pBFhrhGw!QtW2`Q_o+>8U!1s}k)Il0^Okj3ocR#)xd+cE$=+vTmhQJb0m^1+>PGZdT zK_jZY+sRV-=L7lO*@uJUuY%Y@&R!l&wARx?MkN-pPjziGFtZs9nVz3rTzY!MsNW}O zESDJp#N0&K4$f((gGqw!yn}5JfUS13=^p0huQp3k^nW+Z7syIZ1p-MyC?!FGL{zCY7jcS>&eYyE=SOeZS0d*I*fq}iwQ->deyUnE)$-0rL#b*-aAc{`3RYIy( zcNuQg?(o;$t8{&7+Cbax+MgKqZm-KTs3WNzdI~e1nqRc*@K;6tMU1z2|Da!Toe}75R4}J=ogH z62VUHg%m3x(-D13PgX&i3U#30ndSQVSro-1`e*Z-QwhO2wlPai8LnFP~Nuz92y_w^of!Qzkyka(Z6>*I^T=>_v6DTPn_Cw)khg2`k;pyAtg zqW55jOp1pZbfdyN_vP-(UGKmOS`~j^0#cIXFg}3I`94XH1u1(7!jK8zjQ5k$f(a7@ zCtjyZk}O_mw`7uXi3k=rkUx{-Vo{02aFZiDuOjI>rCz7U=9$!AnOk$OLoM4b1wHmp zQcEAFdX4G_HhTJWQeuc|#epij-h8k@6rc^59JZxyI_^ zc?UpvH`tm7l7}{9iyUD9M#x#hss&a}=;kg!7oS)K_dEsgE1u|ztUU~MDb^naSSKkj z4%r+YqYm`~U03vZ&W@G9(gf+%DuqOcp4ps7H8EtIf_0@@1eGvc1n`4#6F;jt-{5+Q z0{B_WXjTo%m%M7XA?L@Mo(HxJ9eUt$qDCB$=` z)-K&ZW@65>FlA}fj!+o+JX}UlZ82q&z5PG+ck$oeq?c0A$8J zvtY7It?T!Or4p0v-1)<@1ET#DjpvczRb2rPa$)S$kkS`hEJ3|GO2=Xq-4kH=dU}y7 z&CN-dD#{j1t!N%7s4UaM3eIR_dQT~ms?1L#)nk#KlspXAxyo1xU(oXD+N4?P$HT#3 z!V-Up=JEybboTzd-`{)jl2T_#Iqy7*+gwBNz-1*dDJwM)_b+k`3{pS;a&^sw^us8r z;EU`}-ep`BSwB^rj7q+QH#fuK-t8y(QTC-@E>9`af#EYf^c{3iDij0<-9#33%jKFy zG@&f~$RQTYQCqoMD?t61TqRysG6G7A2Lfuci8(z{AA^C>k!+-1Y?cX%%PK%I5+8!u zpP3DL8~Hr=cpM9^651Qx#o{>4(t7Ix5_9U#%uOeDXnNs5ecasv}v$LERfE3cRTY7kyT%B}X(xC&`kM+i^#Z=;;_u ze*;nJvwu{k91@H+olx#)MJS2PQgmx$leW3Zr#tO*>n_tYPSDpEI2vTrK8VzSCUlB? z9B7MnXx$&^AFp2nL~qBgemei<>__(Y{F;0-Wtqv4ssa&pU__GPpK9wC@8dA=gA}wx z+n;MS!W}R)<8fXLt8y$RvG9ZWn%&s>N&S#0sEJcjI{NVN(1&wVDnau?AGgFB()^o7Ssk5Paz1eD@yH&;U+XNvh1 zMhk}>zGC~kyS>`WBpNFLh^grH3XFSEUlPRkFUI#Th$9v&@&(?fRXM*$ZD~UH<*+Y| z1n_~%32CBBTg>Nl-X+GU`4a`ibebm{OF@@(f1z_81J+5ktz2+3zcP6zqX*gag)KP^ zXlq2JAV838EG7+^(t70nE}fE8!KMddXQ;9 zjU_sFSn=7mHWsU%8t;LbyX8>LDQ8Jvnz~v;2s#?)37SM!j~&mAA*?5>RXi|f(rgO2 z%Ik&kxFE7FLDOR$U{I}zW9AE<)^)5A5*pkmXP5fmbmt&jHv~a;Bla z4Z+icV%^8OfyRKm`CAr=-DM<2!{C~6BbX6KiN)4I6+51`Pu~MuZHWHY!c3 zOYdq0-a$=_HZh`2g{9IPN4MWwDBrD1e=Jd90$6^6O*$7gp(&&uwM2@G)4=udg^hL3 z9D%5Vmb};c@XYS@;RAaH{*Ls{Z8x&cZLjc#v{e5#-gzY36k^W~O)9kTHq@BL-)K|E zaa(vgcB%I8t30>xKj$l3Xzt1B+h32)Jg3(Z9wGAsDQ2#7b$%zQSA{M zvi<#X|<@ zzXzDD@vUW;W(gKqubuqn#payOzZDsb^qpdy-(f_%wSe|)p&zvB06Yhko!<^xK$?7} zdX3m1CAw9Qf@GYZIO-dF%~Vk$&6L!Ww7WdZTg*mb!iX_lAwB6C5(mxRzcc(W&~&hI zA!jdx1L=p^3<2n*h@`{eQ(t21$N383oz;TJTtm(+C-s*3~!NVo${odetdFnhuv%R?%!aa16_J_ zTX78bqWD6bE@Y%cSGa6AtK7;ed^DkAy7=kNrJUvFq`W(U9&7DHj482+d*LKIyV7aY z$jgJ4RQuj4JZs(nzPBgAo+@b+E zwRSK_^heXkTCLWwez(uCsN2TUwCfFrR};SNe+*aAECVGX^6jp!S`Y+X3ZFAeW z5&o`UvFCA*QfliZjxULGj*~i`iD#0Y$1j%;ryCtaLLzFAU;$8y+RK0ME@4!c#k@Z}uV) z)^h#Et$A_x{F74InEty=ae0Pdb&(sZIZMVL@=Wrt*W9RFhulBhB6eqm-17K~7M4vV ze^kE|^gn9`bq3F#b>JD?#vD*SXA(k{raZJlr63Ztjyz@V=S*ohuU0D*)b|j=Kq#3p zU}BZa2vjOpFy(;eL?B2!Wm2vVz;M0|2xW}rEb14C?{>(!wGt113_5<>wJ7kfmZy<{ zdWP2Sn60S)?g0L|fY9GFxGc7SnPhWV#@xn;V#!bZ$KWm%Um;Qn6Db(S5a`~0xarkG zSU{DCHLKl&f&0wzsT3jX=Y)3(GbRnC=1JD@G}Noi`5ZHY(dOuUO1Y-^dt-N+^H~{- zDRTLluBsG)r^&?{+9*U~w$2UBZLU*OLj7T-IT;N8029U-W5<=kHUwYmnKH?sW~dZq zq}2beFs)s_C>-60*&3m(Y>E=`54Bh@%VA%nS#HaRUUHVF-qFbftw*&ywB3DORN4VF zDjW7C{_Ht@Pa|i@0Ioh>!O!rrf7CyME=!~8!Snv;xCbVm&A2u&(<(tiO>>u6jp5^J z*6l$e=CQ5gO(pUSmcqs`8V>&g=T~=_J~ro+?3reBqBln5_R|e!C{#K!{kr}a4py(g zDp)Fg4@|2ZjdCnO0x-E`E5{d;CnBBW0>@ueHW($u<6^-Z<~aKSnW0jQ0>ZL|5)l~7 zB!`GuhUs?3cuCXuZ36$@r)r7(RCTzzO)-IeE;xECnVuKcgmIqU8;9mLurcm7k1_j5T&x={l(UgjF6IqDzcDI?3=0AqvZUT- zwV2N_V-ZBT3qZ=PbK`RGOX)NyT?a}S@=K`Pco!&h4CO+~8`^8AN)8~;=9)$1DEdaW zVxdw-6U=bLqefQWNs-<|Y;8t0h?bi^9%Fqpg?`ZYGZCG>e0lVGSgGxYk~4i?B=>JV zk*6?5f=+(DxW2jk zyRSyCpEpRcvfR^2$q2V6f65%X^RKaa$$fV)GH1bIVF3k$8aRVgSrJlSLwaaLP8gL| zhUAoX1!WKSfE&E&!xg3#iJxZ?b+#3DtGZE}=CCZ20)3#`MM{^kn{r=36i=)yqI!9( zNJfWg3+o1t>XLwSY)|>Lk6aySnnI9&1AjgagfTfcgVFGKO+*)Tno#(;Pw43;)rd~R z(W~7w9POszX!xR6=ixqO`|z#n`M6igm#}RN>sAU*sp|aA$JF;*kG2)o861w_1kzl} zrZnxoeT=IgHhvqgz9nF1j+X^~ufpHrv`;U3U4hqRXv#b}LCP(ej@;yAy7gckc$5RI z8qHSSfT}JyfB+kk`_Nix`VvZIIDN@P<~}2hBT}$435Rc0+O4!ac(GIQlvGLU+x8<` z7@T$^3SqZ>2KzCkwOw8Q5#Ta6PX%7fKM0&racy8W!3voNaWIQ{@)%Gl^sq&ktL~0_ z0_;cJ*djHsuQET$off(3Jt;PBg9508c-SP@fKdf$_M{!^@(%(dVZ9iYe^oNO!dFQ@ z4C$t}t~t zBO(-(Xh^j30gd`_gP`tEcEEHP71_s)-8@WdiHdmZa5M_?=JV9G{P*Y9r&M&HZ}~%fmRusas+X+dJ9wuXh%BPm9VuT;;8c4f{kU>13=bu>nqA zjZHqqs8=yMz!9+L0u`JDZdQ%>Or$*O24s6}Y7KgBx%HHs8@(P5+aaRAbsnILdt#V+ zo7)ea1#jGiF~oLxP8TM;TVJ~V+`z0QsEAelwuCdMySx|3yn5kROEyI>=esiDuRD+3 zS6>_-|J1gF?lL)Txi=o}f%ny+x%|5oo@97YDwevQE}le~%_)BLHgeVAaS+foqkQz+ z@OSrgZ~S$LJ8p}9o#X#SbPM%>_>bWTpkHmi>(~ur9^RAX)yv2fF0U3pRTZ&}MHnMX zLz&~m1xYTgz>~)pk8v+eQU&IpIUPGw&8TOX_1uvuq7t zM_g3f)I$0?Q75p4nphiz68sjlLtG;_u3~hy>JxYm7lYqVw#&HP{|Zm2fX#+mwy4cl zk7p2AX#%`^1vbnAXTjDae(QYe{0FsJYjfMU75(mCfl>Rx@<^2B*D7k$*0tlQXJW5w zYdhN}85<%Y2{lQu0BBjeoBzJ&0;EV$jP2c-Y9@(90vGpj&V3+%{%f|#c6L&p2$S(p zuv@`H`}sUIpRZIT;y>-|3;=ULjKB8wcGw=9ETmy!%#C4MWLg-JTEjRqGM&c)&rBX$ ze8;y?>4?b`FYz=}sSym~4WA1LB3YM~ai+|=qul(N+ zJvPlPixhUsG>r3z6#Lg$w$W1Xj`p_Th4YbZwwPQ47x#~(cfa3KC*?i znHdiTR;kzoQrKCb^n9?eNj%WAaJYYX{0AdKD^=P*3WmX<+iHYh?Hc3tU}q*%9v7aw zbxQ2~yuFv79wJnQ*?KKxV)YWPr9v=?J8@L zd@f)w0%RA0rNSFshxB@MoFiNeM9k=_di(j1@d;%5As1RAX&<({LZ-t@W*LamK#vmr`RZ z6VbP-AIm4fb^+Ngu?7HBX=HwWNYrVoY_q_rT#nk0pR3d^%6% zOorr}skDs8OTIEJ2eobGq_=SBU^p7CIW+oBTTe#ss;wtPKSzdEue2l9#@m6JARrlE z#flfnfn++DdXWvkwJlFLvXaOI`AwxR#6`9tjs)zKGM&yrST)1jJel@Naqgg4PBqsn z5I&B<_7&wo@k}|^_ysPP!sGabqYwo)6%MRAlHj!?I3|i#I{2lFpZPx^t>hd{J3dlBg8%XE>B=Hk!0JWUgUcUL$@2IO*6IPD0%B3M zBZnFfcTxv{=UE1RapEOgsT?TB z;-G+ifNrJ50DMhU2~y~>Dv?V}>^Ufh3y25-a3<1FISrwHs%()VBett%R@4NZ-kn`u z4t|(i^he~2jJC^AbOZM3_Tr2Uk4}!h?7r3+U{SXcY4Z787-*A|U)iHr^2 zbJ)fW!GsX{9IpwiEsQf6m7-0yX~tj@TTJO_1FecfbLBTM^s6Hqlqg%Vyw#pPOa zpD)ovKEn-&lVR0ymAG9bOI1-+ieEg$OAE$gBAs;Iv(Y zw*=QqSZaaL-PPo#1uS>B|Ei(o4nP6Dwvp0v7@}8&L$_Zz+BbVM_I8NXkyUNqf|x(Q zGd{+5IydZtO`Hcl$%}!0+!Tt~l^WbD3_$ZX`j1N!t_vt500B}b1!yD2W;|={R zZ179JZrur><3DW;3eC9{B`kgv>5QD{@%}2hNe0w97*UqTw~jO>7u1x|e*BJ+oKV>H zDzk1%Sfjd94|8a}&SglQn8Gt7@<{a^Q?bTk{Iz(5hVH*kEbu3PZ@e(zzEByl;-{2y|a^swV(p zhPpZhcPz+3^M|h?n-$BAFK#%OrkvTy{ycq5)iQM{0Ty56?lQ7y#f>YOh{~3sZf`1< zexL6^NOIzabb&E~Yvab6jeekJWtM4$Y~;qBvLHF%k+#KnkJ3wpowL86u_=bs$6%d7 zD@m>t(cQ?arHB@F-%x?7u-Cm)!}jUhVtadjIywDzJh!LKw*~fF@!SOV+XDOTcs5#q zR|5NLJS%Z81eT<(?~_olWI65COreXMC$VYkOW~|tE&t;G`Sj%%mvM>}n|EYnOv`<- ztF&d98y|Pa+*nCfcKhS*jNi7>U8BBHsEu3oY?$k9YcqP5r|wdb-QT+#VEQkKU1wF# ztK2K}>AAytUXpL>{8hf!10nDK#np8Bye}``8w*?|C>HoT^u_}JUj=?aahu!}VPm!y zL6@41_YRT8dmm8x@pb3x&ab6dT~pgg7JcVebY-cE%>Xtb1QM2=xNNiIngAZz$<9f*EtG}f}t=wP8T01*iY=?~(p=N%>wPs2rN@x)q&3MdYYUVPG=j<if3Nzc6YTjCyWzfc)okB^-U8~-uvPde<39h{a|FGpB@ zRax#{b}ssm991NvD*}2`Ss#u)+Mo(`@jI)r7{YH z%CRiKt2f6_1CUa)xnDgZyBdy>e!f(60HN&xU)Z#H!DgX|0%j!BM#2vyTJrmFnJ$?Q z|0kXeXG~N9D>!i$@wv{yTIDzrBBFRujp9hea0VO7DD+qCT%m;Tq`F~^(eS*<7Cc~_ zA#9<~4IGX|W&?h=2>k`bnoWg>bFhHQ)@dR%Gk#0Xp5ZL1rV6EVi2G0*`a)?+P-O?a zFM#9$3Ao`#asNiBO;`fyuS0YEs(rGq-$Sb23``4w?1^UY-sQFNn2YFWXYB3U%tghz zx%`95=BQd~T~|;?#}8iWe&~!wlfk9y3kAW|uzS_(Pk#H@_Xx3lT9plQ;lU|uwcy2D zp-@4#@l~})$k~UTUT<*u?`-6iPu*1lje*RM#U0`T_v5{s5KvI4$IOu@aiL}k)+HPr zj#=Wtwu>6vF#QQY)jH9dLvSU8~mH4v71)DHN|r#oJ(af8%1R28pjvt+0N}f zv({&XqR~99Xzcwf44~y2*IdLxVXHwf)M93sJ9q`P*?v#K6TDtdSp!VUlmV=rjwbE1_n}4%2CG zjQd)bR_@Km@+$WMWtIZ{lS}Yc^rB5k4|)}TgiC^DMVxgBFgA_m^(Hl8sEpBg`7IA4>b&^MhQAEi@lP~+?iL%Wm3P=V@;9CC z;||oKI+F(C)-2B1EXgu}cw+2$d2!cu zjc1pJg-nDCsiA%K3iEnNrX>mz1>^9+fCj>NKBqxv@|4Jt^32e?wrz=fzD(ff>B{*7 zW(XQ^v>P20Rz=bWzotw9`27m~B%M~Gnl~Xtw1#`mg`qNEOMG04yAp>)P7UTUit%CN zQsFIPQR!U8mQiX$;fytMy@}=6y76+8WiOlMs?O{!Bw~A)weM$mn#Gzf=`YQMUa2To zYn$@?>0%buX@VM~dj%3_$&K%ZNO{r^dRgir(d3;jW--!JVB{zQz`t;|a>)|vEU3s; z-&D3mVZ@K+3Jd`VMgkzi_`me}jNfcb*OWdlY_~uPy(o2z-5k#LDN5UgOe1@>Lut6o z&0ATexsJngM>*G>F06uqO! zxm(U?Jk{=FN1N4uWG_0APJ|!g!t3I86UG4*rehb4*L2$EF54U~yAtg4wVr(su`HeV4y;Z-q3Y3|Iv&M$U4ho)H4*im5zzdqTW>}d%Z!t4w5wL3_#Mwf ziaGixr&Q==s(O8WO+R&J-?rB@3%l6&8@Y%c;)9M+7FX$cN%YGAiLOO2cgy0n!S45m z$L0A?4Mm0Zn92LNwYn~6t!`oKBX4IH^?0b|eK6>W3=H2m+mO;*ooITk&z>E+tSRAb@QyqRUYNZl0^$KDOYg_LU};`(7RGmB7V(&ss6@>m3NuzJk%-?o5C*Qqg~g)akxJHMeIU-} zd6MM!B3m&2K1^2$XGxylN>;AufH$XSch7EsLtKD~V0FQ63RDl6d7KxE8+(|Wn;Wz| zeB0#jc~mM`dB8G$&n~0YrB%g=x#fG`kLka?Z@=+^eM6(#xphdg`*;yQNQT_U-$c(E zG2<_LdzZhQolIZC$GLX&>gC17^z==D+k>q`kR$WwWfm!sXUsS2*k-D~1nlpY4~Pe{ zEtzlcZ5_hF?|C6vDA}g|?yScTkCr*}P)&QxV`IB&>o5*g2*1yMI-8!neYJ1*e84Xs zM$B6kB2#lMJ*v+r;evxf6PdFsYml%0w0rHFA2P5Cf0HY&U53nCDLu}?1F~E(f$LLn zb8sgmQl6J;#3XqWyBA5q?$Eswam$l661)##DR>)30Fgx3%+nc!9x3i#s3nlPxzx0* zDQ}1b?b!RcFEsZy4BYD{WN+>E!N{)uX8e>)+tS>-%$x+=_Fdd1b~AD#p~R32S-}$# z&OpmLc#%#OxRtu%oHUy82;HI($(k+0JC53Nw4AMhnnIoC3lV+HPWU}j5RO1BlFv;?vVZ%K%n zB@(xsuizIGG3<603`vKIMOq>Q0YN;YMt3K0Uh*&oC||=eunE#g#A2x!WH!7wCo|?5 z=m60j>E%%r%BIHt^^bpo-r*Ry26Yp%BrFynS5~Go_yZ}UHhLrVAVmm-RXg9v8m+Dmj2nJ4HUpx3cZnp&zf)&Ayikt4DdaelP$?E+CVmSIm|?V_M^#=BvS=NFuRvs@EqNB9C#rjHY_9HeO$bWgTP(%K z>?c41s0I>##}l;X3OphMi2!EGByP!K%fgEardhoQJVGi&8dy~DD(`5oL?6>wO38=K zp?GC7g5Zdjh|${{TE%^qtaF%T_F7dDZ$Pnw0u|y81I;n|e)C2`6?Ws&$`s^{i?J!< z=_(b}_<6!!+=T^uj=@?Mz*b+~Ztm404(zpc`qg#+W)po73t>@&Yd;vE1LZp`8=^w; zKSbko_+F%Cs#6TYf?^6=W9!*?cf9j?+rQuazCZrZrO!yi5QI<1PoM4#LCK`u>0_32fNhXGtus`s z8~24!{D*Q57z2zwZ@=gES%oljFbQvyfOHZMQ^33Z1VAzunL202okz3D`%JptG0SNMK@JN87a3i7_lBgSdNrQqESuf7yLk> z>`#EiDwjUDkO!0%jwfpZ2@+cp3x ztPC+>CsY*901pv;Amb;wG@wx|KJ8LgukANrg^6>793AAr&x>9-OPrwyZzexg3eeDGg*hVdj z{GPJVeTXpOM|FweZ8U!RD$TZc`1ST&7X(xP4V z@Uq|34i;9Zi|4F)1@!#wHx6IJ%!Gpui|2b3Eqi+lAlO~2%PCXK>tSclDqUZhRqou> zt~C<316WVoXv)Sm=|?+0H%+?@w5wSgb&C94-+%!FqPX!i~X z!r+HrQ)-2$U3zHG*Al4UQ2JzS(wu4+{BMw*eTt-W08vn09YKx#`0?s_G@63KfqsHC z9NG*q<356j2T==(kN5Pr7EGJ#DF$tWrmh~Yc?~APKuEgkn_ySvdzm+~>ItfI;1b8( zNH1F3rb9 ze_;=J)`(3mF3(S1zMdYvIz4%FIX!y&=FQ2`CHuX7m!N3A|D7p|o~8w}O_k95*wL09av*dg?Z^ ztyuy;X&8qSMB4@lrTZ-$t1+znNF?9!8Cga+D&E!_<#E$xDn9`yu^g=3M#gAe!%i$z zPpM;*zUPpMu>PA$@f-I#h}LFVudSIHl~<+Y$3af3u%Y*6z}4+~kH(zSvV0i`zY6<4bX3Z9>F!v)#B35Fvxy`YOwb3s!GD*D+7=?!7A8GSr% z#Al=a2$jup&gIz5WlTw8$286pxqzmgJ`otP$C}Zo%EUd8UGNmVQct-OfpgY*RU4Sy zShB-1PJ?E*ZdiBAZ#*?^Yt{x$^_Cgc5ZWqE0sDPu}Q&6n$7DD)`i`XM_=7d^r zr-1E2RXQfZ;4+lpmONuR5CBvg<*du=p}Ge}j;klztsOlwvV$IEcX*kMQqcsqI;*tG zPPZo&W(@pbW7%|0zprU@z^jUnq3mbv-A>j}a!>JAJ5n&r`m(Gh^H7cjH$AE|g3f=> z*%5k$MHtW&rjt3;zi^un1`S?jF)xxeJ(R~(wyksCxQ|5-L|-UqJUVL!Qizsbq*#(o zwMzOk2q~|^_DSEyrtVr=t7wo&4hhtJt{uNhN0W=UucjAokN$FUNk671=jU(FAE1aO zK}`~mgR1p4vz~n)7{@+%K+Nih;LXsn#=fV|GCje%>-^-$cNZte9yWQCo*U5W?dU z1z${4e1hY9+ob6Oe-eKkFn|1Yux-?z7gwHXlxZZB_SZm;4|JQm+9~Mmqw2k*PxlMk zXs1`ZdiH@|APzbw42BB#iogyL@C7~(rk_COX|q>sO4#;h}W>v?wH)U9TCwX@TW zHS07Tu4bx5uA|?jFx;pY=b6OkdG}nuh-DUkt=&yzQ2isv1}E$jd}nk7Azfz9NU43? zo~rNBkYtxVtTFuD5FyPXyVGC)^~ z&B{vEFjEhu&0jMX_DPiXxCI&(h3{5QszwLW!$9Gz=O*OG?U66o;T~V=iMY6frV?M~ zGUI;hIpi{ku8Oz8rll`8icecqDh@>MV^RHOHPGiuT4vR=+sYEB$M|X#6ix&H^^K1> zuhSIj^}3TK{HrgisLwzTXs;8-{|hy`BZddX>uu;C+A!*L#ICaT2abVJM(>>Y)rQVm zqe6E^P)p~?_&|bgJ=ERQuPe1~!XDy>EyII}-La;jG}629sdDF0P!Ha?HAa6|{@`3s zmqSD4{V?7Q7DL@9d&4!6bKXyw#QoRmxBuq>Db!cwB7;)4$G@6Vb-RAI-iauBtsbAV z9qPf%fM8W{Le!z+|LCKuYM5r9O3+o~^4|xZY3QbMjq+(y8%gau+{GkUhKWzLP zJ;*T%fG`XIz&)?XKNMW_0g7Xn5F-}aw3rkW@$YWlc>Pe13ZRt5DzV@q#2!YqFgH2x z4q%T;2|1A&t}#n#K3y!;V^NgLMK{Cn7d-I72d!4!Z`(EyfA?Q;#f(J`{IM3;FvN|Q zqUl3{CEL0_>>)tFP$!EkMQI}CG+6z=??{mrEy-yg#s^C#@8fs(yF2RjFI8SmCW;lP zE5;E%AmirlTIst#8mynzlS!k)?pwxlY=7S?gLOs<>*(BS-IOWHyBpM+ZI2FruggMc z3{Ntg3B@FE$+QM*RH*H{&&V57)*y;XVu8wN2zv*YlYb{bYju9^o^TG=n6XA0`1tWx z$Vgk^mKm`_s41#aY1EM1{&oG^&71ePfQBz;ORpL%TnTHP@c50DdvelktzN=UKM-WQ zS=D0448jyWu=VjaxA_UO&4UyivPN+uN(J}#&Sc$ilMLeOEY9IL$=>M9*=(b?Yie?# z7n`6(AbXf1A!oo!czE_`KMwLAOMK$!hpGEBa4b@5%AGAXws>F(XBTJm8#c{THQaPu zN6-$SB8*4KnF*)Sb{y|<27K0?RD~*~iaLb6*lf`xgnZVSs?jvHqH=izUzW)s3(1s< zr<6OK1HJu?+|0mMbJ7Mgw@H|L+w+*Z?}O`k8^J6}T#Srzl%qckI(Tt;396Cul)os`L1#TGxSyQDTTvgBbphA6e}XK_ zPfcYZsL}wFHL~={hcc=kd`A@#lD62i#qP`e6eVGG)c64heTo7rj-uyCh=Q|04JfFQ zBTX>svkhoMiXZ|hkA%_1PIE+YnmH*jmHIHBb!KUM5g=2r{A=j!3hkrY_L(1I_7RdD zBfDCijdL5;368`1raEcujO~s%KNbuWcg-EO+kwTl-=mHi%afO~YD2G4vDwx*7T8A$ z`y&MR{b3XLbX%kSY2s1X8Fu%fQAQN_?lZ^AT1?JtZ8<%6FUGStMa^sRfXU2`X~>y| z2Si(Ailda6p7p8h23ISSoH!rE9OCudM;G^1#cEbSznc!nz8vUse*U8FUtzW)2QAvW z#HjN$O3GdP*+BE3+DJcQO&<$7FB?g1B_$;VsA53VB{!QpQglK4NFN3}CL6R(#db_c z_8>7fekFza1i3MlzF4hHSxUVWXtHHlZ&$e~POXl`skpKKGOT>7HTY}f+F5sT-+YK zy2(o>GFjnS6g)z-gw8w+2llHXnxjc#P2$e2m?9-9akKtZMqs}_|mrGQe9@yZ~_Sb@&(MdH_=| z9ZLxY5`u3WnElZEK!>h_-W?@^^qIi*$91ui8v`?l0Cc35UD4Ys@K5PF~yh09jgwAtiW zF%9IX+PansGt;su!M7C?w7o22Q|^*jr|EZEMB|edOw2GEVlKf-q3W_Bu;~q)e>{Qx z!G?cca`X;Z3BO@s^%D_vV!1UxBNeFHx^KjdDECO|2P?0*Mi{Q2rODS?C6suSu=xgz_-snM0edI@ab~|zTfTL zazhgE4W~iK${;nElas(}^G?jUdt06u*ua0_pT-ZD@zgqUDj+aGJI6EBC;iF=Au!c# zdU6b#KNxQ@9B?e&<)*B-DULR<)1K zn!T)(_AqJdbEL{~E{QiV%rMRp%;-Br8x?j3YcE z<7W3+>fMhT)t^li)!OfVS7jkI`hSWYg=9JKoM{bTSf1}0|Ml>Syf&o*QB*k=D2)cc z_f;BHN8*Y8MnJ1l;+YwQ7+u0uu6YPGW_+%%3p>disgnq+mxPx$;ce zAS`oLWpFhVk_P343fEh6Mj7A_oV$ltj#c{{ucyf0&%n> zS1{^I3s|?zU62}as1ZyF4wu>B1dJe(<&yi-JIuruwVBQ6S}~0^(VTv5m@?3hMe9mf zO}F6-nIMF-;z2H^zjl(!JsU-z^V%6p*>o+>+K26H`JP)Fj+9gnw!K`sp%6s z?(~p2j0{$Ht2Bjo_wKYTagKR)y(gRjq{V&@w+s9;=DP;C0eTVU47@D%LejjTQgm?? zT}@W}zNE1AQ=lf9B7bu@>@nOu*3yUqdyB2HW2@i;tmsF7u8ed>eRHuFzBgerr-%BD z6HJA7F|fQsp4^}%e(tFJ@%`G@7+!C5apPv;YUuL9f$-9ssEPgog;d*a+b|4$_gC;C z4@r>A2c*k3tOZtJ!7gpz0?dj`HyUI~(mg6Q(7Z^|^k%#2rp{_oft;sUQ zDs+Z%gkQ+GUtcS?{u$677Fi~gM_b0bn=9engmCLy(}?lI>PnF5ek=GEQ1~rcD1$5s(GjlS_5c$? zeym}o3zX|s6DS9*zy;1}3)+(3ALKs4D9CS~I2tds%0ZL~jY77i2nS00gg{x$;PY8E zP%*Mph2YF%L`7@0O<-KpO^iS$ASiZjIi;9SU=uurq7d|vl@kS8EU3C2lcG2aGdp1| z&-2*Gb~nJbQ`2Rg`fyM$qv?{WQNv^we`Qd-PH1?6H5jDWBY5t6)}5c96L9259_W^% z*kN(%xMTKr5h^q6(5K6qiV5^im~wlxZnWsTzf9iFzv~{AA31+J-I57Oyn5X>wFnqD zgI8^;!=%kII+1)r`#p)HQ7d64v92EO?qP!mk2Cnv*wBB1YEQxR0w=IW+_lC?K~!W?c}LSMj@sSV z?+@RuflH*TV94MAL6P?4fsl`2P6x~5SgWYTlC-JnEq%sF68lE}Pm?Lj4;SURH~~m5 z(`7@=@V!=iGR(3H>Q@UI!0xJjd)AG_+dieWd(E!a7e-*R?nqnqB@$_oJ8WN&vq5XFzkVd<^=iU~Xg$iiA*x>;k@1rK1GQFdZ`(Ey{;pqf1B_Y@{L*1XfZB7mAZ<_s zYvCouhM_K8TB2+12g$0Z5z$su-;XVWWfk&xR z2Ehn#vh>FZ4Fuw;RK_4=F^N+M*9GC=UL*-13M@EiW-X5imo}oODN6|M)w|omLcb19 zXHOa^zzHtLFQWppz1BV}CirL??1O*;;r(S}{Kf1gRMq1P<5{7>DmSVEYs^e!?I$Kx^NN*xZb{~kDnSy)-{Mpi0PSN5t}*0NUV0ZR?k3t^D?_<1=%6;y zA!)XRu7{R~$E8gT2LhvFU=k+N?Tf)=`qw$II5y}G781oI!8u^`*4;+)%!J1>|vci?};S zfVDslLF|Adx8G4LCnPt0f74I}hHuedo>##T`<^q{U%gnU5b%4RwS9}(71;Ma^_kJ^ z6U1u6gsc{U&?Nm#z+So6c=A}eqlVnzQ4*9)lcXs>r|OT!(Yw+%A?T}bZc+9_Ex z{5-Q=V{0$+@xE)))g|!d;b{89i;qWlREa#Qih7?28uodYq*I!@H3s0-UUKBnQ)*nj zEU41wU!&=qXwnHiEMi3ujy+3KEEWm3o;g8}4~;Gnn`{2SV(c6nY#nG3FPkU1^p4}> z_bzO|Ics+zj{!gP+-TVD<9wUejwpZGp>cxrAHXr<)d{VEHUjQ)h3|s@0CiH!YQr!P zy!$Jbkb(>j^qjQGB{>vI>Fa0+j+Hzu7re~X^*Gb@_*2WU%$A*qV~uhTNUcmG zx0(l+`TPTk#aG-mil_J0`RCK$HGcY$vM^YfhRZmpMzUIlf#|fAWTW)6Wuwz7B%?6N zu#nin1xn_dlAMFEDaPP;qZ1iK@JHmH0>TX>lN?pvCh8Z3W9@~;|Ap3|9|9g>OlHQd zf~1^H)=zIuFCcfrxG~_P@4=BLN!ys&a*u{gY&k&MEGO zaf*Hcg;w8h+cpq>_g`_qj9CgCcTWSBEGde_+l;lTH@gpAGuX65*<2}7BPqLDk^g;n zq$JBf(&)t&$-DdRyStD2`E{`=dOgK*ZVQ%h_>;55J>Dz(_(#c2b=~WgwppDToeRsG zU)+0janXYdm~oZD{lg6YMH|5_=q)$E;KThCw1N5E^wnev))~%naE2*cXyZm`O4jp@ zu#iY*E$oDpz)Gic=0w7ztRUHFjR@R^L!yo0iQ9XC!f2-xEx~E92!hVNCa2TXR{BT31c04%kVVf5AiC&Woi+E z75{NCTr$Vet+l216**I?#IGUWmaVyshZNNVGMuo~)CIDHS~u*S(Dn;5OCW)zTc#59 zS$dD46;j0%luk&3;r9Hdf(Vq=DDci9(^Bdkh2dXVUPum7>(3U-!jrI^Ot(KSF+yq( zFP=8AG}H^&H6v}-%LdGHxuizIe|`RiCs;uPH=y_qdqZMKvE}n7fpL8x>X&KJybPi5 zlJ+gWuKl*&E^j@<5iQa~u6>6_eQMqzybFY0UClpE$BQ@kbk^?PzM0JylZTkhd&<=DUHY*}J^OGL8dViKbp>kbi=#v7h4a-~EJJ=1P-|RJ8 zL9{xW@TwQo{Q00=RcO{G%5mdsj$(xmip`cPe}d`yaQhGxUiyBwTw&3nmC(fkdlFBU ziHlAGo=N)@)p4NM#|cn9IaHw_pRe#`dPMOSHT)lJir9}q^nJgbm>T4; z$)SV43$4Bz5BB_i6X9g1gMz;pb_i#nem(I?kI2a5znlF!oBTB%#PAv(j~3wye)=JPF2r$70@kA%)Qp_szCP>o3AjWKz7a5( z6I;)CI9WYh>6qb1!=CqQuRBJoWwuy;f0g+cpq>_pi7I zFP2l=S+Tde%^ung=*zZd8HQmQ8d^HXTqsf_DLdMb|Gqntk|jAyH(;1yz?OLT-FJ5% zk9_@gwW}r*ElPBi$PunkGaAi}UjdoWomVDzw7O zJ*oyQI-~aJU}v0nu$Kb-4&jbgHEaaI;REKiHx|4B)ULJ&ju^o291^4hZ9LdoLvD0l zTZ`JOh5~V{pRA}H2u&c;d8zN<_I-l;pgr0xWpT^E_lOmEEAo3bGFzxn7yOr_NOTM) zbOA;aXXk|_t^zb35{<)-=rZwBYC>5QMbjd#;5(foP-oe(`gRliXQ>}!mk;x0C7_W+zCSnI6L$X6ct5lTh9R(>-XxG6qPbEuw z?24E-9IVZspoE7)ZntO`VF4dRS*egnNZzG_l|nb27aK+=>Pl!a1oZ&7v#HPxIMJ8% zL+Qf?bHP%g%)0(lUetQRk(PxcT%+^Q6XC$s`Hqdv0UA?>;+o`0AVf&ltSssJB1;-=<5~Lu0tc|^q zMc15>Ld#ltNlgSV%c${A$6INsSwQIVrC;95>B}UIuQ&awByt z$U*uYxl(XL0qk*KGemHDmBes+d&`4{{!KfhH(|5!>}WS|#s>W1g)8*7Iaz5}uPHrK z`zP01n;(nn+EU#sV~>W@pjNb0|M_C<_0{Uj{;PTW5dO^9DHHm+m~5#C3UVc!8{`0z z_fSb%a&R)3CVx&CuCj8^BI#iT)f?I$Ry5gsw4R%q;d{$*z21;)XxQjHwCB?& z61MZU&V6=51*SZT=fN?u;?I&{PZA(PIb&ys5@%r6Z1>wMk|!JmtZ(X1ZL=^%5Kv)j?!DQF*t zDVB$c+dmze0qitQ;bR5^8tZ}aix_vzTsr*9ZNh+!qIkQ zPl2SO!9VLAG(4=@v*t6|w9Q^##!jBJp(l(%<_uA_cY!C2`z0XTmr15aCauiRM(`uF zR_8w*{HV-Y&n8gClrd@5%67E<<{Hb*i-5}dVOC+gp82)hq|9i;Z z^W(9!q$V1jwbgW+$#*gyf1%@pOT<9$tG@SJL84MB8qzKrf}|rg+?w)Wc?#D@3&#)1 zJDw0jEcx8U=3l7f^9r%CBD{^#?X{JfLK$ly&K`Pmb7It(W+#u;Fa-#7z>(_WbJf6}i+134T&zt9t ztRxsmXxeYH*%$6r_|6s`Nxn!NpZM;3d5{Z*Akn>FqkpCqpD8aV7~C1g)rR{`Y;}14xmSye8@G%H$FW1Rn4{@AJMv ze|}M}%7cSK=Bg@Xti&57V>>-7s_8#!Wj4nL2X)mQ{az<3n|`mVN-ov$;N_*!R>wM< z{v|D>*__pRsmz0uE~TmZug~vQVZYP5oYFrJzqu%^G7B8HI|Xv{v{KVEwNS>W1V=x5 z{P;jT7FViB#Muv5;%BIos!Hg4WrP$zo?QxSWKosc*fD0(l z%S_}B*4;z>74vd!FfqB8MXVBt$3$pSC=ts-)Hco1U$Bx+?@pYgM#VPUjGa~rn`N0^ zr^QmJcQP+CB{Hq=aMIEp>*DhMPq)}1F*pVv?KWL%GfwqwbB^2FTjC2oJyP#fTw6>! z5rtZdACvNJbLw;dDh$3F^PkD{XF+uAWwa{~PZ`6I2I(O&OuFz9@o^+P%O;bzKV6>B zUgGJDz54Fu)z$3chlrL(ho?}X2p4q`+f)}K^z+0ck7*?S)9eGyK$w*Xn|Ft&IQUu_ zn6?s++~>}GdQ`m9A|Qk&A`s(d*5PR)t;F}sZ!c%(ufIEP*1V?=??)mi4G6Gs+7o;p zgewJGW|d~-uNR<@T{UL83H^sEYHRIubBKMB?fDI zcHT=DHoNnpXw=MpHvW<=JOJ<|fmb{L3$%hQ;T45ZSt{qCde7I{M|oXpN!UIZi;XbK z5@>pv#(gjyj{86)Y5Q<|L!v$j#oo#uh7aNU@fde-rYG75_(K$=&xJ*-0U)y46fuJf zN2+T0n52+XF>(OPEm9^1Fbhk3KGl?6s~XqIJ}rLi*y&Wo`CfwbcfVyP)8;(U}+NScw*m3QK06{|D{l!&*y zxA74iswZO?ok<~BKF5sCjum4}>gRGx7XjubmQKir@^gorYzuMw3R(4&=-FM^W9NR}eh7CzjlTm9w>*B3(5K>} zP0gcj;^gRofF4vFH7Xt7DeE}U1_~?hd@{C3AZ{P<_?j|{J))$rG%~*lSJsx*>zpY-FhZet2sLj(+b};cpuPS!R_qVU-#Fw@{ zn#~X~A-;}n*QG{ck0A2&I?Ey!g5897JKiXGJnTNC5WZ?q< z4m1`oL{KLsjS7^Xc-7l8I_}xzv$U!dQ0DEfgDPIZmx7y-Xhv4LvcXLxe*IMpCyCFn zC+!u`+i#|6q3o=*x(KJBVjlKIkg0Ei=zrM8u8dxDFrQu&_cBY9mu6X$YoEW1RY_C~ z1OG;JP;88`gm)D|v>#83HHW8tdo(bO2ilTdCNv!O(V@6QSiBJZ5#ap%S!Z9rnRf^0 z7B433EtAO-0(a-SXyenQ>vi|ca^c6%>bA|zT(9xafnDpw?UH!JUxxnq$S90g7P8x> zDMl)>>WzDWvc zru}B#sDGo04Vgi25Ij&eY?;$rPfxII%&C248t_+~ULgmia}|>F1Ym2Lsbu2%O~iC9 zGHI5Im-SkOV6?N#G*L)lDhY$D*RTG5{&sf${ng*DF8*~M5RayVK``m-FMBeg{d`6o zqn#0#3l;ma6H$nAEwVBfc+`$;-*f$jA`0aI^O5cnTv@fXqff;r@MT0ACG(jZnW218 z6pM#WgfO9uDYW|^YewSBfq`404|)9`W6B>3ZuF3!Jw)`eb1%apc47ue2m?XyoW3*? z?XkLpQ;fVFI?;uMSd@cg`2|bdPTu-v*XP-^%`(aZv}2}}EU!8GXkq@N&(f-eX+TCTQ!rUY*yO(5pyy=yu$<^x-LD z&@Nh|ZKc;j)HiIygvPX^=47L`@*A;6qh7DDO8}pMC>&FeLS%v$ab)vtFWaB516ofS z%1D=mHZHque3bWBDyhFu*|yQ{CWYEFDO|v$2uB6EzY6X}bN*2!MbX+S1UU2gtE zH3>Z~F7=nbAMg%f>@EbLC<0bNgO13AuINRas@6#ies4P&Yq?Inf)@YYR zjg-SvU`$0&<4ZK~iJZc@p{y=4`b9yyy0pE}6+LrumH(U3_x~4m2N>9RpUQ3MpF zr_=NCdHroK@`ybbF5U=4BsehQrt~zbGt0ZUpL%(lJvp0k`JFu-J<$N`52QyAPX1Y8 zYl4R|m9MZmOG{T}ZEp?UAN&`sR^M;iHV}UIUvUA1NCND%7zPw*8m~nXV13!Lw%E%& z1T=lJxzeIaQf`dZ|9g*=C`%Td^tbdS6=91?gW$#P6^`t#K7Q8|zOBQ8Ec!GGj>C z>izu_^4cm5Vp~bvVrdP8y-soR?*wR7TI`rbNU#;S9&T$gDA14_zg;h-;84^hw?dWh z_{ddhtggAuMjnnfr=1lf?~5x*<_iOf z|2cI|R%%@a^OQUT`C;;vRGRK6~h+$h$Ol>}ew(gynu(R!xr}V(hp` z2E_Ozwy0`*|HQF!Frp=TK1ZWG{e#r}37!@bP#W|E4L$qj244P;4%@a_e5gxHVRbQO zBW<_RyWc)G;{Xb(R|;2cif8i`8m`3>sok#VpkPAc>NQxUV9UxqwD{9$)bPvrc7mhr zywB*cUc3OdQ(^^cMk!b$d80^?%4J~bd{>fjQLceWH{+G5iJ4SV;BJEo%RgVmjDFoP z3k;;%q1;0ykXoMzz|{&b#_82vGO>{88A@$mp|<-h?J}EEcU$d8K%_)^HaBSBdA16g z8yQ^-r>yXT-h`jvv-ukBpRU0g0>uL9yhEeM^tx`YG^PC&38zOQGz)<(8ax{#?a-0{2Qjs~S zzfuBh(!ZnAaO|R|(Kw>-=QM*uC)aQE#ce~C|I&5K>)t^6`_gxoYmEif<G7V@K zaU}NyZ83ci2M)>kuf5Ah(mH9Op3a&*554zU(D$%mISqlwFf}x^JE)R zAMFz6D`;r5@gpWAPkiarOwYNyn%Rg}Ut8{}=#SECG%PAo1np(jm9Z)LYmJSuDU~4A$bBsAY80S~~kzLk& zklkBDb*f~Ca?hiqD!ax?M@MjQ4vw;b`cQ=eVTK6jfEE5g!AZyhfmnnBEO92AS~u8( zL1X@v9d1lZ-CmDpB_{_10QV;W2h&{+(}%8Dz^dIz3z##)gOQ)-sOB8z`k-djQ66+q z;~1(RhQmDHz1!u)-7J5t=9V~8>F+H|^-_Jl>W~#N)1@~buQ#seExqd+hsJ4v1Juqm z;s+=!S6SA%X(Zorf?w)aO}baE_to__)A8)?-g7_Jz9L*T@F}KY!pZmRUySGOrIs%u z)_32ikT5vVM0X-IK#Sie%lUY=_z$ow*PGe=%bh!S7i)KN2_T7P=_n(?_apG!>HX>w z%^ul7qx+W{1G2+OC_k2d&t6z`tW}RLgAV%9lucRwd+C>MGJ0;D=`&6ZLuayBnI5QH zqE@4S_D2B`KBrsabm6dL`!@+1>f6z5sU<+%?euDzH2TtMvB~Fys*RaA5-!U9!5$Xo z91a4w7DS}Ou0JxJ{+H7NcDpeP)-WucR9r8!OKpDnFFk?_bF$RxjsyiXfQBp8Fd_7n zAgtyIRbEhHkz+=)>U;XUhqj4S9oi0`Y|bb>5XvMB&{mBf2urur?tVf;Xmvorq>~%h zt#-5jHO9HIW`tF2T`YCWP}RSjjMw9C=Yn_^$KmGH&imZHbHm+^*~jV{p52YFrWXb2mE!Q@n66jw*1P1G4pC26TC?8>aRtml_LCGLP@ z6TS(oFF8+R+JGORieTjWdlkYNxcgc zY3tot-(J*3{aW%CzwWvDRPP8WnDVo!T2H0iZ7ig3KL%6&DJ5Z0u%n|`JLMwy2t#u* zH&yY47!+%#Tu~okFfwW&cIp`Z*TJhjDfKBN2sB3-g%R*Lmhz?w+2oMXR)Cs6{_I)$ zW_?!^H08-FUqB4eUWyP=1ADmz;WRjYgx{LHn%V%K}i8y4^ZyPrdz3W#DPy?0>S-BKF*r`*aaZmw`E6BbCb&#dFl$SM^+>%^7LXiL7 z8Gfv^QY0j3g7%Pwpq0qs@Xh1QJU)NXRLx+ZSuI?{xPZA}+~2*_?rtueQIEo&4+c_u zVV7|_4o>sP;KKm$d3JIV-f)sl9QaDWy?hiJj!IKAse!fuZ-9Z5`d$f`&K`dRR+d&c z2SdMV1QeGA{M`z>8cmYN?6@cj0-OFF*#zbEBK;a3TLON2eEvKo6I#=3W{N z!z0;@;6rvmkKmPo#xa~nx*yoRn84J76B=h2yu7}N!DnZLYd?=G)7r4c35!es(rhS-Mw&+wz=gH4{ zf8jb@HW`}`9!6Kn-6U$WHz&QrcZAH5?Uhhd-qMOsP>i zY&>h{1uMS>%~F?=GmjK74Z>Puvo~%^F^yWxyp-AFCvuTq3-ib!z`=8c}pNu!{{bsbAY?p z&Uy@{*pZP?CfzVg!NL+U&oma98nVgU2S$H??LP-u? z-_A6pU@-cb`$+V|X1?@$BsO&Ft#kL^Jt8rZb)&G-hPV-aqN_vV^slhv^JVaV`r7dS&)OQ~B_^~|*>OS0#lwEy&gBnPUF$o|P{Y*J22%Ph%s4i#(BDJO?<*Aaq>dR_G zwV>v&{RB{xQjnV(#?%vAxi#h4Ul#Tr`Y|k8514ROZ#-^WiYCx&bb#N>fl&DH3W*c% z8Rn-5tmRGPC1j^Cd-qh7jdABK+HY4vvd3q=B-mEQ`H*jGtLvMhb65O&efj#T2&q@h zZs*VCaFeD(H^7~nWqF_hwysN3Y{NXXj6~U7B~l=%IL6lheMjm=z5Hmi4qK-Hkt`nX zj(6XEJlbC$#*4Vu<0PUgCLV3&faiZD_7$+fkAyEp>P*liO?~fkfwg2#;y~9H|mXv6!fWXPiOOP4%fN`Y> zM_dL%f?iOVV`#XQ@hn=h`MH`S1tNf(gT1fz9s|<@g{nLeMU?y02Q45rUJ!VjV(l%6 z>)$cn)($1UnM`tB3Q-nPu(d&@@rL+5dZzZ^JaC*z9WggeP!B{xQXD261gFN;Tw$qc z3|e7mBvqj@gzV~ zxDqfZHW4t6D+~(vjY1)FeV8!KG8>uly;^j?iHRf;q_O)`X=(IAKMR1Fmk#Ao9Xi1u zp{eeW)+`)WFa-S&KNcdA>O^vwHL0q2D5e&Z^g@cIg4sF0AtCdRlK6y(}PfRlAjsaxA!=?4w(l* z!ab|mv&AvY0zHP7=)e?s5{4r?Kdmlv^=VebINsL_rXD@_F((q$H8^XS38dD_x4G5S z&f&zGpG@Xd4@aXB7I|mAseeh{Ol298Iy`wZX*^kIAi;~E=`Q+)B zri5d`6;?LlH`SK#5F-QhHb!Te4p-^o3%x9W;k{vIIVl5npi!=zy1LV+}AIACGSAyr^G z8aB#-qP2zbJ$#{!o_=Jb5dk-MsBm+S`pE8*T9 zw>9q6QH{NM9ay#OHq}?e%~gm@CMLXRQbezaUVIx0?;QeTI2t#m)Z&v}E^@Jaw6}oa z>>}YB+xU_}`m|mQSewj73=E{wq+(q$jY<$I!fXaM^VDxE4V?ZHGJ+&3F;r)Xr z*jV7-LFvtmPbSXC`yZ6-MtK)gx(d2=FYcFHMNMvt-r7Ar|4TQ-Iz`k8-tE9zB2p&@ zgD+=JWp}b()&XYsGH1r4=Z>p&VRPBASdg_uW;i&t%g)-XCDRKmO()7~;9#hRBMX;( zcu^J;l0WW6*aRlAdH%vxWL`v;Z}PGZS;Vy6#^cZg2p=ND18Rkxa-?9WD24BjelB|Q z(O%v5OM$sS#X*AjGEHX~OmNTg5~)mbnBoJ|O9)%>?Tgo|?u3cj?a1SHsjV`(Hx@x7$xFn&i#%8o($g-$Q=Fwp=xMJPTYkHEC%~ zpQA;Lf7;tyECkutRJI1wCE2YUiBT65 zb!kroWr=1f&6=@!J_BR<0u_#l$p9S1@1J2)*%l4EVxO;DrG1EBP@Njkf@(Q-)GA*y$Oj<}1Os{PpXDJ!ZoUR#utLu9oTR8wpPT7G%koZhE< zkE<`7@RbStujZz+67D!RZ9ikS6shAubFh*Zo0|{I`LGPn@2jJ-JAUt3F)V#8VN^Kfv+lZ1`=zP0fk z_hR8!+kQ&9xYz&drq|I83j_aHjMFKPfeALkNZ0hd`$O(sWaKj@I>=uUDQQX5+0{}rJV_;zLfOz;D_oQKv@%a~u&Zdw^ z5kzBH_nBmQlbne7HgRH+(+Mt95oP0;&pYbxEFFe{2P1@mx@e#bVM~qHR&-iFde$@P z4`E$Sf@JGR_0hx~=(hKB(qIIwIr-rsL}?hd3%ux2N`dLPLYD0_>N{F_j3Z8R(s zg56)EHBz3m(g?%*V{0SY+~`1(4iTx`*d6Hg+ik?(<{o6z%#{iz$|$yu0-u~H@NI3v z!*oE+T6%Z}-Mf*MkRes8mC+p?!HYIh_u9(ide$y}wafR5x=63u<)4eXu$o}K?xH^N z%&1-J)@!@f|0HUo{KGLy=5z2Je(x7-wzFg6iiIJ3LYtGrCVBHH7AQ|Z#xNeVk5+>t z=h@Fq#hOfC59@GWc-|o#2FPTGJuDuV7*5H$xQKIKPXkr z&k7$~td;O%QF6-#N<#CP6+{z!%Ydl4G(f1Q%cTI+yuKQIT5kiMFthlI(4}$`i$LBt zp=T1--wnM?^+)07`vJKu7AH;aC;pZI=DM$l;FFdK&Kg0@s7n+G?vz+56tsatHbi9X z1`?e4Z&bU@KII}!^T~|^pFcyX3MtGTu-jOWC`DVuq@(TJP@Pc8O;S-Iy-L}UOVfc} zRej{{P@Lj+_iIMh!j;6PB1Nq$S~cgQx*uob*2XqUU?6ID>OQE{sDD;!l|ENGSDb|i zzNYuVarSZ>$O*1Hl*9R;V;Il_lhpGt3IKCOflxUFdI=2*L4qTxGJPkYmD7wCQcL)? zD^Xazn%0zVpMDijSzxUh%05k8mhhdFfjIDjr$M!g?l zRSE|O@Vr;GgK9p+smhJJ@Za!gEGKTvo51M1!RS}q%IQS82v6Wk$cuvQurd{{^Sc@M zBv;EO+t3wR&Eo5aAFlp)ae95MfFVQc0Z4rq@NH zU;T2`B-!P~k8aU&E9d~JzGH(NWwN+Mgu&uDJYO&irS;EbGxnn6)gbYa8PvtX30Gkq*n8B@<&VS9Tx7qF| z@e{K6V8zf}A7Rqs0ujgB3t10?s6XL%Ef*h(#!jhX>8~=QJ2 zCR_w8BnRRn!O=MMCIzK6oRtGXT12lRl4rbN|Kp@N z-LQ>9j!4C55^H|CK46-iuTyTysS-*JFVjHLxM0=T$i9#lG6UvNEHj*hIG@*L6QrhCG(NQb5+u4CM`WVHx+4Y!&_Qdbak&{-P(WM!P zXY5m&U(C>%(>@(6vAI%~deOd0`813pt>8*R+A24vPHJq!Cjp!)nI|!gPKR7TJc8l9 zgX=S8)cqXVScN3;H$vY9<=$a!Dvna0?lUMZHoeC=bcI!{aUbcW@0f_S~+GtBih*}GX^4+Dn4_oTI zFEv?4fxrYMZ(};1O6Yv*B~V(@r(0G3fL3o;ony@~6G$~rjIc|)CVVbE-O=*8`rZ}2 zH7&AnaidD9s!v#z*CVT2Vfj#h=&=qC;CuLNHHRL>u`V$zj}D7z+MZyR^Aro@HN*8? zo0T}D>9A>@DzwnHNZL|s2)n8|^TxX;kJq#ux7SlH=n8E<8_sonp!*urpS{1lf+2_Q z*4}ey?P*_*qwv11E-$MBWWrQ-L#mMWLNN;CbUbl}op#*DBl3*Yxh#KRK2eCMqnCw8 zE{iHdBVp;##Z^yPij-`Q`m*+a)mU3^+cp$__pdlDjLI_F*g^M{>#`(8hb^g>7)6ID zFldRkiRdnRDQo4un!KO)mhlk&}kjF=-;UesGeBx0N5}U#eCAPFK zd|{1vAOkya4?CSm-zwFB-H=l+N&U&fy(bjEz*g6$F^;1}%k z&2bbG^aA+J_yN~KTk#n`a6uKF0)}4`L<+% z4>E{%>J?>~dU?FFYF&p&0>@w&sOkFP-Z6CLf{70&3rZZy$EnPftiwvgUlA2bkqt~X zCAPr1rd5=ni7%cgZ;6fMBH&Ce+o2tYDZPnn=BP?cqQ%5gUpha~teia(Ni(|^Eb%() zVjMj54BvPU*(sTmKV5g`lDR+u!{_1faC5kq^p1{T--Lf4Z)Ogsunz|?G`9nPQosxs zgf>Q2v%LtZxmOV=?Uq39v<22x^`im~4`DC>@xVfee9SQpe5X8sDU(eocDM6cOxYd&dD+-v{vxW0*=?r z0Eg$Yn^^2J}6blkw7u z^7vj=oF@sn4dcaJo)Df4H>5j3X|m&fk?H|z_egj;otz=nE^Xq8$(+EL!J;VDY=Uo! zB*7mXjQ<>6PR^jUA*Z!er8-E+uQu%iDsiw-3K1=Z*X?yi;rxWOqE?uOW%BGc*Yr5VU z7<)Q58~3G%io>L;Y)?#GUsw_&I@i>R0Jw!>Ta6mhA)86}7^+s0yvtfrtx;zqOz)*wi4KYtp%n(y<^ z4HzfxT&2o|*TCo0E2_cr89p8<$DHgpOqlhF`!XtdEofC%w5g|N*^1(;GuB!^J%dof z@d($4{nP#ZeWPCoF{C0UcI{W?Cub1%dT_OzL;6gug-EC5}{_*nE z>bmISSadnPWTp@ML$iWE)n2NtR7|Q#y@BU=zY4To{Ps6f5=_`jy5(DzZ&zVRht5dk z%5uwLEq-%xHa-J}b%2WkoFx__Xe>wBCec0S08NM``-2}mrF94>7ZtnSg?WRoYnLme zG^R#jmkQff)}=iA*ZO~ed{vVBsjIsDv~)9rB-5vokrAz z&Lf6VJZrM$TWk2X)V>%pI?^BtlRZIsBM=FiODB*Z7x)W9%Ex|)9!9By5j9-`fhjtt zK;J{ssjx|iyg3E32v2l(n?QCmsnm?MCdYEe$yF) z-s#aB3!7=}4Jxj?n9Dsd_Kc1B_18l7%S?UYrSmVdu`kFd;Nr?l%uOvWNK8&u2ue*% zE{So;E4Jq1O3Tbk%uz_rNh~e~iYMn6rTFESxaF7TrMOlkrxuiC=I1G-R+OaXr4%c~ zz=gP~xoWup#aC-@6Gs&N?q4ya1lwtdp{=SaX$m2aVl@d?5`-canelq;9kHHS&CKS} zivQkoXZGc_fv9|_C5XMA`#SfYGuOYr$datnQG6k6#$&-Q1dm;Gq-=Dk)lAO!I-T6& zaju+Ph~v9hWKL>@$Ahh{4%>o3W`q^WS;m=l+{u_F+T!C(rh?rjGEUfnXVyRUftb^5 zII^%N2d}Hc@L&W(xGB?$E%2P#d+Wr)Tksn#rwrNUJWcOeBAt_J&Rinc(fK8tX+z#( zVH}r=#d@)TlPcy;5$%k;D((0rz2AnhEb`24a2sny_DDrB6lLxyG}31qsg8L{{x;|l z!je1x5XJ1UcT!FDt!0vM2mu5WC0;BMMr<=~t8-J0dU39*h}=mPr}JcublSrr@rfdq)%2_ojHgz!6V#*4eZK_!igGVfL6nrTk<@W& z>BKsN^S+50Hx>;Yh&%s`K+BAd1q`jOi$Y&egArMZahHBHJ+C{g&w}fqR5@^oA3( zvpL2s@QA(hZUV!+L7;u=$&HyJ#``%3ixxaB-PP3<>Q4FxOUQ<_HW$>JT2ArT*BEXb z++V4_MfEgJr9(tmx)bh5kw{-uzL-FA^sE%b9X6yY4Op0`+-x_&DZLe?XceSb+=)1+ z=o5ibghwmYIwLY02Q8-yA^<8KWovS!0P9X$ZZaBr_9DnlG2%V#uO6QE1NIQyrhEap zJWcnhQ7a8!kuj0Zs%I`S#P0S=5RfexPBKloPr@Xi!d`XZdHwG{MEJ<`1S3lPeMQrS z;(8^2Df_k*dg6ue_lpy4-WAqV(e7?rS=SQqG4SjT5bH8^iCL z#33EySowP%Sc}Ee0oKU8h!jEELaR?J@#9pg)eDl8v}#c0$NuQOc#FMd1DTcijBO%k zt`}UijujF?zMniPj|*<%B-FTFMDF`dXf1V@XKpyU`IY^x72X}O-p85v?b+_`^UYL0 z`^fhHVBx{@kNp)FlnD^dG&DqJn6}++BPeBuM70fls84Nn``^f|M#JW`VF$x!RGDtW zL9d2#G;@0ijNLeMP$W2bSWNr=0}()G>!Pgxw5nU==ONUoe^4$H2p#!_?l<2VKAmFs z{Dv0E?7vbe{Fu;Yn0b&^l_^d{{E1DZ;#hP|`D5ANva~x4NA+*pBAb{t!(ve~;m2xy zCs(a)b*FXz(2*~-tEg~=xy>st!1}+^dz(FdzRgA#$A6A5N2kN9@%fwa@!9C=y3Kp) zFdX#)eEszjuw?R`OnIiwmN%CyV~L%~HU6UsoLJ}SLdAQGQMh(35LRLpaTcy4h$ zL?Vxh)L5n>ZpN^$AY-`|Q6X7AYQW&b(h9@a#Ku4IsIZ*E#jvD)azh3P!8U_38rGWv(Saj3Oj~*k>^}ldFgX= z8@QCpwHHi^7+gW}{DN0Ui8i^wJ(FCgHHYqGoe!~8ls+SOh(R6}&=KQftt2vuxZi*P zhb-q8LSwBM9#N%&Ktqb4h7q1@&TWw^36Bu5pNeP`!%nsM%T_%Scbsd1@eInc8oETvQpmZ{@?uP+QrXa| z8+JZ&W`siL{&*lZTEU>rd$3)WS=>$y!}NQ&GVmlv2vJ!RStU$J0|V+D*OKn6hh0%B zzIKr|5vk#Fg<)A82G^Xp5urncyhP$6QbDG}W{r8m3TY9+$Pw`HRy5%F%e3gX<$S}j z6$yL=)pl|$LY*?XVc}+uW>h0sPAw>mDR@P^4hQ^nsd6Gt1j4IZD$)fJNfP?Blb(aOPL}>^dajcFdX`@0dR-+(Mfy%9G>qC^$0( z);Kd{Q%VCZ%Q=hLLONJt&C8eklQ6bhoM?~W(7Rw4SnH*aiZt4Z+)f92HLm=%2U4gY z0hnZPRnHaA5xwF;9k`{QS4pApHPwJu1n7O&a~0d$>D6^hsB+_SCl?gj`=$?C(hw0i z=A=4CSJaPUSg+M{KQ7?m$J`PN{8z%$iDpB3ZjlVuDprjtmP>A|*@R7_o%f9~mt`I? zxxz82s<*1y9U}-;W)m^P$MBXOsattsp~z@@ScxSGx#Y+SbhM^Od0ush_HF+1&Hfe1 z#2R8L>>BJ^B&u!4PXp~JoXKIySGd6y)+Ej;q?|c@X;bC3g6z7_Tp5%@Ke`>SbRrCz z9Tv#=MiK9juQJJ*i@z=BB-H-a=bDg3DwKJCHaJmKFznob|zmHN>+%$`H};_-QNq9EY0 z2{MgmBC-+mr#O_|3HZakdsG*i;ApJ6+aK1JwPSJ#ij0hk1=^KHj}Qs;P)oCgeTe4; z(vCgLES{=M`1*ZHARj*8oP|00fLo(!d#8>)eW!XaJJ$|Tfy5g3Q?E8&#QLTjiQB`K zzX8?fEC1@7j90<^zdm8Pjk z+Sgfx2&Wj6kx*lcq9UzV++99PVe?KLw>ubWj+$tMrTFLq>l~rlLsRf}(;d2bd8Q<* zf^A-+t10OEyY&C@65W~z0ssRRUr>?ah0a%^7wEDK28Zts4u)9clK%5?sSBVsz*ENP z@vlD3bQ&FAI~w4e^$}LqW@b8>81wWA%2qm2cCyCn?|5a?fcuTI-?%SVIdp4&U82p3 zOL<0BUbFI(0PI4a0)fN*`TX_akNZCXYB}_f3XdJW$DHNS>UEB7-h)X(gkh)i<6rtP zt#G_fMhCmkW+$I_M!gTi!O3aN9wy`IhtE$&UxtI-*~u68#YFs5P3;m2l8KGN?%YZi zJo?*BH`TE4W$Q1qu`kFd;Nr?l%uOvWNK8&u2ue*%E{So;E4Jq1O3Tbk%uz_rNh~f_ za7s)GPAw`+Epn|$PAw?O%+FIuttd&&ODR@}feUd}bJcPI09BB|Zo)7SMDPBJ6$-K= z(c}(=UfM%Bv{I?K0E*mXLrjA=^%^Qv@$Yp4l;V@Uo;Nf0{XCm#Tj`+&E)>sd|e(ub|Jtb8yx!WaFqo=MQpqoo$g>uTiezQ}$6D z#V@^9U2oeq6n)pPxJBJcF1#czFkpb|EJc?9Ew&<92JE2?3|givHWDe2R2*YSe)}#z ztZ#W4R!lFpqs_NST6!WfbtYAX0-!K&KQwDZy{zl;#8< z$9H5)PcYu3TnT9-k}}I67R6q&ZK{Fr4P-2)TwyJq2$>Vj1fM~XQG(Cz8Qs~uUq61h z{Csn1O4)^VN;K?O1gKg6^!K)!zD_atMR_i|h2lisp*se&aCDak&X*7^1qe3`Wn8T^@2l*4I>ohd1x4z}e57O{#b zsv(gg2Lj4@VM7yAX4+TlqQ=l)TmV8yNT%oj0CXA255y;SW&f@U(Ww+W1!IcAE~VV3 z8sBoE4MJP7jjUXwCDExowt1^nEI7uMv5s8&)W$hc%*7IjUNE(C#STH!MufR6KHzBR zF^Ez4J579B^AgRnrWM2xWjR!O4645qRb)(?v?b7oB16MR;mdI5iO%3{BX44a`r-WG z6HKYnzntAJT70Y*R(Ev2q7S&mR5YK}(LHXya@SD)@rIg>c-?#%)ho|$Thtl^#|_Y2 z=%y)Q6)&kSC9k|c=)FqfL4f@=y1Gw_?#4O1!AV9*oI+G-a*CQ@k$kA`4DdDf6gQ78 z+3T*|Titfzv&e-nTG2+mh8bPK*RLTA;l*+}yh6p*#5hi=oG)mAwvq83c2gl!ad)z`y1;dC}+*e%sVtC?#$%BN#R%sXnnXIZZnbC@oc z($YoDJjw8B9>Ve*thK_YGk5c3ZeG3p(cQg5Tm3&g>Q?`29;Y7p-16`@XO@R&fpm`W zID)b>%2DnsKm5jg)tQmcTeLf0`pZ7c(?e7AAJnrg?0m^bRBRq7j-fTDs5ac8MS8Q) zeAt!{XM$5lWYKyz@Nwwy>~#aPzK`ZjHt&_2xnmkgJEX&xXvz~{d1HEebp~hD)Q#}( z0C%<0;yA*3bk$x)tiuznraOl1HzM!Gj&t}yT2nI}o_VJ0aKWsr`gGUhbJ%LF10bHW zMmODul*V`F9QR+3pj}6F zl*By05$s~6NR%ZcWiibp@XD54tRuyEHX(URBe-|P=(VQ%?dag})yW~U(i^K)q{ww7 zNy4NO?7UDkA=gZ;;0XvNc_Cs78zowT+16GTt*Hc|Tp{1T6Kr>DtB{SGho54aqZIFt zva2X%iMjuhCMX+(L8Bp1Qc3db$?I3d z;^f`&k+c|j8Wm~uJo_d)l6H8c9i9SqNJLXx6BO zemS>3ZxQ%tiSPrPUPXdLLPR&@Wt1b3-yQ!(l!!8!YAi~-a;E?0f-4#$*hbD8q?{Wr zp;?Zb%m^wa<#D7T&*0?NPh?JGBDDf!wLZB0uu>|QPj+UrkD$qIvtY`_#VirgQf-Hi zPXGPG*?49iJa}>&kog`7tg8VTI)i=cve-7{qwlA9GtfJZ!7%-**axqa+O27p(p(~aYX(o3 zLHN1#Bcn(D!iCseGZ@m`EkFMVl&5F*QME!+ghFJ4NozND6)8$a<`@SN{Hc`UImv#K zNQj)3X^7$)RgQ74jQfFIY71$Tw#9eOd&KXScL8W!qOk2r4TmuJaGj}xGrLB% z*rKgkhYd^Zwv20!;@Pav7+4~vS5Su8!hxJak%JCMH0(O2!NQ8f;Hs-gQ!Pbwfz=TK z{bI-jyn+{-qFmSAknKy_2eUjJwwp>7-| znllr!G$-CL`vr;znq^>~ROC=1b&PJpu4OU$Sa%q1WPJm3CQQ)n#J+tpi@fWYz8;W&%a$L zJ*P~cC(?L?$oyH-MsAfk(xkb0h1E+K5on0LP{t4AKK>+3+FWXsfhf2QS)%! zP@@ZGK5aPOAY&qe&cHc>^wjEM4$_U~6?ID^g$fXHhho%N^ZpK|YI9u`pP5N{W)#I_ zmQChp0+v(mSo&WGmN$AHiYn{Xos?(yN-5Q4`c%8Oo1vqo4LTY;*_ol6Z0d;}?Zf@( z=f$;fF0LAeX@66chp6AXVtt;pq%d0zbEa5|bKrK8A}}I(DEc(7(IeRPB~D|iVo9nY zCrD6{4J3Fl4Wp{uEC4OM#YI?7WEWljgTS$>2H5Q8pxM7dhN-i@b?bGU|D=4BU^%9;HNg+52 z&&r13dM0K1BXUGNSseW!yz>P$Rl=qEmNm&SE}$jp8IFQaJR|}OCCb)h49s2|D|W~{ zK?$YU$etclOif}`(!IZNW0m}mJ;$l#+80)eSTQI|8B{iI_IkA@t@!IrJb6_)tIOUd zQVEIp4YinwCh`H!90ui8YUhhnM_sXh@y+T{am2v+=D{Cs4Grq#Sq~cE>{;gbZeCs< zZ}%3@)xr)Kn>vK-73M)k7lpQ=xT&fEg>Jv`v1NH3^he>RxJ;j|ybpsj_{__?KKCdU za8BM3Jsq)YiBkG@ApnM*`Ts_Sd5v1wNHXzCTH!907H}r@=HY>Vb2*-zgg-wJ*VRj z0Ox|cdH0@)bbPCAlyEEdkm+BL*{S;IYn^{MDjK^VX&e^ndEOoKeG5#?2KPf(-T+-= zp5o(wEhKgPdX3`XmJuBKFyp^Ro?-PMsK`a5k&#qZD@2VNxs%!BRj@S|{hX*$AI1Ui z(?v7K%fS<)m-aZc95)nam*Z~KsMJbh!&qkE!qF}jbY2>VE}7~sVuyK)kRTPd`j!wr zh}BRyI^BTD(yeoDt@w3|*14#U4Jxm&WY`tN5tSX|Aje;3Ni+%?XvpXz;w3(=deST# zuTas)DKE7NqWtwW%%+vo3N72#a5~71M+L!|Ik#7zA7Z&4xa}h*^l3{!YvfGd;YHnA zQ0l)#&UeDEx_QG&v9+?#TFxtWp#jt+tJTp6V#aBP#oO{E_T(p!&bYCXX_1s3T z&}pOXbi5_;)dgVeuErijPJGh|WGAo-m3`+ql&0SD4n}!rD!6sb2`9qC{}h&ZY|%w{ zWO?|*p|`^uqI6&VRjylmAG_z1aQUujLc4n7zHAY}J8s=mXZgADOHcOn3m%0#YZ&AG zs6>crB<6AT@};fzxi*YGkghy$c3zVCc_f!<=i07lI_~K);2ygBV^xk@iuJ%>v-)cc zSXFQFo!S`gxjUIdEo8s+1Zmgs_T$98zPE@iQ+BFHpQi?%5%u47%NK-?VxQ~)18mnb zwfD|16hnevff4`#VRLa<+fL)^PRunD#|=2p4{lkm3Jc@|WL96_>(_QQ_P)>p%)ii> zeT~JCtgMip5Cg#7;PsHtbDbs@^{j8&-RW?;6nxDap3~tSR@f9iFZyfhK>JkYWq&Y| zCl+(Ghz~Y7gTZ6EZJ^xRuMPOJX;T{iB!>)P2V_UcE1;IRkgNB_4qA%Hh-^DVP$`>0 z>=)RV43(9@%hc$msmhgowu!{1T6AByUV*mD>NkVZ%Q@`;H4~T{a@A{UpFxf?Ja!90 zs4@D<>RNP(cH2+6sFnuEp+WQs7QfI4$f3)bf%afBAinchJ=w?-fzyst-uBp_ z=!9AjlJ2qD&oi3bbJ7f-WYUTv)>b`Fj11+xr3ur#>jW z!6h4^!&MnU&~{Y&v>QN1 zzy5yW&jsISHu5FBbB%Xd6?<;CAk`{1fA@amvUBtpc?ppaTbrJdT(9%ARVPkUw1B)+ zRH%%zpd9E|;x8}gG;g=L*$6?$A4Mwo5e;Xe&2o;@#~#CYrh@X;;q&0`l`+NtgbK`L zS-?;MWfFNaNlv>*;)t$);Arimt#YSo6?cg!8e`cf+cm3~qNha@qTm+it1~Hh4phlE zfOv#PKjnb(dG*ZfE3l-C&?WV(luY(BGb6$nHLIhc8@Z#i6{ARwmkBu)MH%J_vO|)r z=j9ijNzmapt4qg!+(I>o+``3sl{9+qV8qBX#&>n{P_jP@6TBQ9o2vbXs- z-$AI?%Q7at41fR2T*ir4|Zv&_cud2QEOpJWk}6#tMlp{O7Z3kGA*< zAqvewNLk`aGUPCUTEYR^b|9s71;Rm!1o6whPJ0ig-k_hX6gNc(dfmF&a@f|Tlfh7t z3I;vq(b`2nB#V=WnxCE~2AtGF3Yd7#{hr5YsXSP=vAPYnh*?*0y=q<+pL9=8F2QPP+#O4(1IB8sj~c;BN1Oy52vN|{ z)UekCe7u{vw{L523^;yK0DK(o&Gw31;p@ILQ!YGtM&lRoDC&2Z$ zR(i5g#7QJL+eZSCPyf?)PeM^^EU9>Wd-)ZgkuIV@V$OmC_^N?oZlG)WB@EzItc?$> zHb;nF+uNqKV~_hK+f5*Xh<{6l0+}PTF0g^FGNVa*T~FD|<7)j{V1VugB}U1{ZjIr; zP;@v?6GtT7KGn~QwWwaeK;yE&Rx-|-FpT+$!yBSOzg(Myq#`eF5ug#bnN8lA&36Qk z3@?0gtcoo8U@g*@tdg|&!$#u?@`Z$5@ZyfUe?qKRJ#nm25$N;UAze8TyzagoKpLTg zbwuO;z#xFz2Qg8Gr_#kGo_-_C!;7YK;BfWfjoq=Ph?!+WOZ7u?*zVScrfZ^Z8@x96 zG}~6V@WBcTG2_a|hnQqAu**PxwZJf73qSt~>iZSD`SlH!$dOW(6!GO_kH~Vy7m{9} z$JK_b=J)BBf~k#FHd|;_pxkNJn=Oh@omP{S5`3mfbiK2BAPa59+lH=V7 z?AeyhzmaO2{A?_IAd!71b>izZ#`ec(F$pht*+QBUjJ0q!bTWcOgVG~rwu7}k`r99# zb&+T}$|rUTIC3#VK^$6^l^O8U`;>IY_Q!79{>AvPOw5HlUCTdnRWi4Eu|LJ4>FtvR z2LCabjv`YktrJUKQ57?tVcX7npH<4+j;~kmoW_t-V9bU7uyQ0p*nju8)9ml#>9BD^ z#OmU1T~66fZSbOPworrXIt|cwOd;c2#5<&$w8bIMJFR5k4$WkSZ1GA*7Z1HpOJUmj zzY-u)Xo*|h6S;yN2cLavW@T-1Uyy0q9U>9-%)`nzCb@hwTWy032)b~Y%xG=*mHQC!QxWVIxWXp)TG;6 z5O`vVu2@wKr|=|9hP2;pHzvShf+Uh5+`_apt$jYN+o^4QC>Dtz2CD&S_X&@)lJE%U zZ3j|XdT_bR$?6Dkf9ls^mlT%SQgM@Q7~NPV8)7*ibV%+4nrY80|%!Gx-~ zgS0dC+X`~638yD@(!bgLM3tNxnm=UJD@Yep{Lz|r>p;^mQq4$$%tYcX(UH9Kv}?X0ETRfL-3$Fx4JKjjk37gMGa zhay2l($ICIan&r|+gcEAm4iu6II9+eCq^Wx+_hChDWBHQK{mmvn4Y#8$w6&6=0RlD zsUyAC#^<4W%whwNeGsyn>RLpdtVc_IVrFtN5`10oWeJ%t2WCuVphVn=& z(IYb2vwIyBFVub>k%)|@8%#z#0ezU)GbU~Ehq0BBl4dU`GZT_o!8xB5VZob-G(jP# zq0c-Wov{&0ff3{b#HJQAB)Kp_<{UHf_&3KL1K2}OEK9Z)8V#rois1x=b<*#?y64R_am6?1`;nY&z*G| zS)11PDbHVVOZe|7jePERlp;2a){h2~r(H{MCVnZ!Vj5{spQ9V++F@(7y>!To-}z_R zgylaRm8G{uX5Vf}+c@81h9^6i^5RIJ640#^{>n)3`t@@yoVO9>PPT8k9Jmx(C;FYx ztUbq^b(HL=I^A=@G^Z;|0bX6-e>Bgcmw$; z$jAW;!gkHno&*Hh7Hq`tU?Yg4&=;`NZLZQWk9k{j=|B?x>?m^pA~dH@Y^n9Rb}9K= zZL!!!fr@&QVwh$njPJCBF+R*CS#Ko6iARn0vz|c#K!33pb-5Q5Oj{ie2;!>psz_k4 zB# zYDhGo%|y`))6fD5U{$dS+Oiuj7CXOkd1&my!F>pDO`HFAY#cHAWQBA{{F~PT?Ratd zq|nQ~n65YyJsM~Nn4jhRHIBw)jE|EdZ1K-eD^^JJ4o!66!3=-8_22K6l%Qj-9|3@? zKcG?k{H6|z1I7&`9()R08#(7^RA#I!ItFkyHDW?;4z)zhRz`mfPjzmK`_utbu&{sfB^50wo)b%6V{B3vZB@svz-P50$3N5iIeTspqzcu>mq z%bM;N6xo;qZkTkOkBKk7&ru>&A_x+G#_y8+T2x9Kad%Jw5$Th0$6c{&t-rk^FM+u> zcYUeQ{}}mx?Qwx~q(=YY!|+#48U&8fIMqIdbi5D)4M2x!NS4&ah?6c=MAVb?Gr{1! z&n`k4r7zNvM&dP&GDMYWJMuZoi%+s<41JITIrIMhbNX1SWA|eGFuCaxws610{+RY~P)^`2jGoa&6xmZ~RcO1xM{!TTbQxs)(InVmyUr)o$Q})V>15l&h!tcHD4y$3+ZdcYt^qX3@ark&sMj=$u-)0=m08vIKO9>BPB~{5 zBP=afxJLEhA?H=9b8K&hV3KLqIidHrwX?W>2eRD`UkSodeLj{nQwC5Ev0PFxOf@LG zm8^k&3#X6QQN2mofV5Ty>qx>E5=47PF@#`)95vj?1O%i&*?FI2pit;B$PNIn^FWLv zd*cyt`nw2o#ogMNn9_n@#K5I~^c?`dy?2nPM%B&lD3qgbXP!919tJOSJ8RVB#rM8T zj(%Izs~Abke0Mv=DC%6+8=k$rj;h~tO(hqvTZwe) zH`a(Rv=58jjRcfB#x|~y{Hy&Ti?18`3)C*vVQXkg`t+j+mnqdD$;IsBwGB%bDDhoC zt5HF07p@KKPcF}OVzy#0t;u?kU;|0;gf1ykF$>3|a?-uIMd0(OX+I3d&wG*5e4&c| z`hGudW^Z_`pgVpHx+Q9lG-qF<$_-W94CJ2PUn7g?!Zcvh>0MfLd@M9y`;K&BRMemh zZ?oufveiiX)c$*Js+ScK)?FtwUzF67qb2c#1}_g~jXWcwb?cLhWm<=sC(Kqzwo3eLiaAg<&J**tOFL5*-{ z+o1p*+(W|TeamZaYs;-g$&yozAq?Z3XrV?ht`jhbXsI7n7t==&J)|nN`tKBFYt%cz z8u&1x!w#Dv-;3O>0d`GomLrHSGPM?@IYZ|L<^+2|k((R0;i}wS`x^e-I5}w5GE`8k zOxxJeWJbMjXGKyh&+ud{4^$;xzdUJ~Ry3d^Si2a)oHeEI+j2zKndVU?_m1mUI-@KdRFkcJ$cpEbe^H>TTjWfqC<(i7*IX|c7a z{Z}T6qa41_Yh>v6OZxBLoPCatNw?+H29H<5t)gU*m;*H^i`ztCH_i{w;_e0Z;slu= zGa-gN^9|8ZH7kqo{`##CHE{$g%OeX;+QOQXq#EA2UnJp=eye6j)8)bZm2-K%E)Q0m zWy=7r^P5NXx}l(7RF6_bHqM5eph%kM9GO5=ql-e^s!RKcn`U<_4YHnnfLQ{J)MgF{ z%ULKT4r2eL2PVS>L?KNZikV3aESKMakbyfIH}c#U!A4gJsKq5D&Mhy7Q=V=AH!7{!8rVy`e< zg(9M<_*FgL*`r38da{nvu_x!WIlVria&X_J1hFf5I?h49N4Yn!2VQAzGER^eAPpBi z;5O!|8`;e7FU->gc(vZx8KZiOI5K~yBtaMvN3K00IWg)H@^ z6XPabsrNcFV-$JeCO`OnoxbCQ*-X2b>H?2@(RjoH*_hEo4g^8^jAR^}0z|E?-ebu- zY~F?%WQwUjP>ENP_@Q$Hfg^)PQ;J$>Zp)*~vJSuCi8FJ0PFN zmx;Cjk}J#8dN#xAxj$ORmH-%cE=#4NU74)=lM6H`ZLL9SI% zfSZ6ufx2nlZHZ;nRe$2(pZq&jn~;gG!8}gtO?{*D4hK&IA$dw_HaV;x4IU=V6_g3K zaWmHJxc++bbYDTRQl@VS2Zx~oRYmd5jsd2zuGhg%O3~nHE|`UCnKsE1$63%DP2D{x zuL;38x59hSs8dD8>Oog-KNe1>&q8W%KRH`|Z!^&z+d_yEbo_Q--T z!VbIfha5vUBm6=Zc1ac}0}+v?A-iQoZzqZL(WV~kOq`Hs)Oh=PdFSOxk^kk2(+k%P zrhrSz)S^{}eS}2Iz-J{(j^SQF)=AHG-*UJ-PPm+dd5k%C=veItADYA?>X6m+DQQ%L zl78SEM#{u`spWp!m0J2~&jWW}$!8q^i=p^XpnB-U_S6<0^7HdH<>ayv>P@}^M3SM7 zv*0)ScXzL?D(LwaT>@3N66!XVE&kmQhsV$|XS%dE^A3dXE`rP7ng1Mc_mAxU|6}pltw0q*uUUZ` zB2GN(Jg7`-eutvuMGTY@~)5C`E zGs{2x(B=vRD}fL&Fx)8Bue4-bnyUOy7K$;a=7msg@)hhvdm;<@Z^FL=tBM*B*GmAd z6R)4G1%clnTg51%u76#!$R#}`9#nA@4l2M-s*vtHxiPCYKZjg( z3J3rZ%*GNSgv-m>$uC;bl0#W)=G_xlQ|ZyXN@N*g2>Zo$h_E|Ht?!JuqDaF^4KG2a zEb9QniMX^GVPVldGNALk;AW*vt@;-l2Hjp;`Nc=ov99jTvs|8Z%CH>0U9^swZ0}F8 z&}WGE`E<&irh8ZSl7JqV6IsA6#0#Pv=E@`OjmV3kMLnB7<+qjpwB(!)YAe$;ipVG2 zD~sL{j?G^=sh2VWMI(3JypR5j4ny5JypF zB2$InvZBc|ldDr6&M8pke}#Hi%VoSlx$~-I2B{wJe2-6?P)!<2=G#C@=#Pjc!Z`Un zZ1+@7R5*>gmIrmFpRO57-s}+<>qGFUXKdsGd*#3E!#gA2$ppp_%sM(@bY6^3(0>X0 zRM0moUt6s+Abwu;?D2tiBw2rICd43Vr7nQnQZ)HEcS`labZtH;EK~^NBO==Lzvm1y8(FsI>d{(UthN;4$y(e$!mkWLt zvu!>_G|^J&b!lXFB*kS=5g_HHlG3hNC^40_WDP7461B35$h_JZpovD8I4JKJlx2Xx zG0l%#!b)$2hglIPHxK)xv56gRauf=i~* znosHo!1585l&;w*i7s$iu5m~nihbR_mC7Z(A4c;pbNEw3xH@Z&r9BX97;g#!yAW=w zyhZhBF}5Vt$|#QeP3+LeuM}$=uzv2#cyF{B{ORt4Z1NqJb8t+Q&G$roXJ5yCxU$3# zH8T96H4H4Zq*}u-;;4UZ&0n}l@O^?ObU3`P=5`vQ54tIXnN2r+BT$d<)W@vy|6-`1 zYFQbC*3F)YG}+XwH8NAlqjVqcG|1o$I(+wu;HYqi9T3oFK`aAU?y0l&{JN( zj)LRbngDT2Gw)7LO{Q->&%qj+ZzPg6-SPN)p8uGjv6O_S>Ro$mSrz~-Nqogstfc)t zhwXV_!d1P%vmRVIO`*5m{P3^DSl=Y}TCt!+PR0LVXj(9_M9>?|D_<5(a`BDne;BGl z6GHWap)y>C#?MCXWFu|d7-#8h1*3j_q=+X)KS}I7DM_pYce3=AY5V_9UH=20lYvBD z_F(k7hMBfO*)2`wjX(K0o$72z>G#j!96eNo7)?7F>jJ`h;dsP=v%x9_o_+`Hv>ZCu z1(+^0`}7fKSNb+zIO0KX|CgS%4vi3d4}LckFR)O*YMY@>pTbI#ENoH(n7rNCmjPc4 z)e42`z|b@+y$*@vGdiPv{m2gm^0d#E5>Xq!|4Yv$CGviRxh09k4d}X6wQ#c|k;U?0 z-*Db?dK&LEog0bo_0j4$_08X`0_6Dz%5#Y~(mh9R_Xd1G{~rhShH82SMs`|!N+#Oj zf2WTdkM_nVsU>J7K`8yBJo|(Hhi&Tex9dOX9eL*Yf!;ZYUlBlfibxEzk~B1A4%n6d zL2s98xEnbJVjY7Y1G12{SXa$ok+|Z^;JgkSr9j*WVLY22U}VoHUK67 z`jk%X&VD(@z^OxR4+2yM&Twl=i3v%*Wu#=M4u52*^{Y`9x9x!=SNFC5t(u@Y(5pY# zC^^$KggbvQOR0GwQkz^IC()k7;>Rd@VLwJe)upXbxRW1|lvE1Z3-%maG|GV-6 zGRzsvkr~0E`)E!PqS=gP&-%RvU!fKzuM^ zJ96yU&K`v#cf!WMorX z-*s8&WPz%+-tkBpm;DP29nm}@r9EDPR$`Sg@lrqgSG_hO6i)$>v6xiL zG()t`$TP-nmXeeSOOc170sjFvED=uSM0shTdDkE5!VkEuE{ zUzE+TwPv_4Z+1V{*fS>M#ZW?lpXL47E>@7#zPb#RN;~RDq@F{NMXDozWn;jdNMtaY#VO(wfTPy{<}d*9v+1cGgz#5`)Fxze%{+a5uW!HtaazW;-_-w_00bs>m7 z2j}JEuHC(6TK>xY1AVlh8+C@$k^_fF_TMRyyW>bRXT=A|}{)?>n%v|~t*AWhGlJPrX%1{1!PmV`=*xys!( zjMh489fDNwZaF~mBfYp>eg#GyLkhYmj}cC?_kbk4>=YVOBEebe4lKd?{ue_?9m*XR z@4!(3^>Dm(du?u_WPq7|ITO59HNdylERFm1ye7^;Li0C%bgk6 zRqT*^_Ff0jUF_7|`$6$|yJlJi-7~gU-jz7BLW*(C0u5S&WKu1`sB-_GAH?eZhRqs< z^ke((g0YJ2)+HFmMrA%Y=JGmIsuvY7UzamF%E%B!Pu(ta{Z(_(1VP%8P^{qWbu_5@ z#^>zyG)wDKv?wiB$9+$k2m)JZTG?#=T}8BIppTjfl1S+>YmHz^I_2K8N%DPMsN0ND zG4^R}Do*sJLVhMP^#Vh;6&rnrG*5I1(**Adzno-A!Iy_IRjSx!9|66a4Ee)ODf5Q1 zSKY|TUG~EQr-=eheF2nzV0`{~B8%65OJHVlJN9?_a(QDyx9YO!%ypK}dGi@9#GxycJB~(IDjz|lzGRo-(aI3?=cpss38d23 z6LMI%&k45aqo{2Ng$QE0Ik|}rZd?oF0**dZrLqd&VfLUy^lgo=pWDD4RX+ZY?<)a8 z{DEWECtyM8#|S*{c+9m0zAj&2$!hD4KZH)7V>RoNjPR$EgfPCbRL%JGrD_x_5>mjV zyC_I}UU)Dt$1e)4#JAQrkk5KLarpxAam5EBEcJ_=Ol6)u`GV`_@})lQ9ld` z6RQ1T?&FRdOxjt?m@B>5_}m?Q*vTH1Y7DyH3jSCf93bn7P!y#Mo#Kv2bzQvP~TrYq^MQ=$q!zTl~Gs4|X#t0MY zm|jD%ydJYJcK4_RFRl2esUS?I2h;Bl3}|F_Lv=yi_0M`~#Wg(jD)5@)x`v-`9Gva1pzT3Y4>|8#E#61@!%UIrOT_hep>X z<6zOGg_^y=hOKlMrsb&*BwsF#G`VNozS2n*#{#*mhXGWFdmr|{_`5aywXO$l?mw;h z@IH5aaHmU+>_F9KW1D2bKflAY-jw$f@%z&AP8V&)RRbITi|HX#RQ(Yk6*e(_B3 z97Cle!1U2>{A+JuEB=JFCJ-q_JfE;h;t ziD`(MZJz&$1l8)k%~5a}r!7ufXU1oiz5iuo<+bF`+{%r0e6H_X`u0<%ar9xhGf{<`$D=i5=Kr&?cM}4rx`vSp+lO7Kf>2F zx=3$YO*G+eg!GE6wz{<6&jKAVsN$i<4D{tmjL?<*uBW{Phu+P3d@4>z{7u3KKOiHD zS0z50Vta*_9rKmp=iT;rq!;?^);f@GM!Y~}z0t+lD^PM*kTYB68st%7zHu~%()C9wWfz6rT)D~ocLOEJDoq?}+rZ^U~dD61@` zh{plROkaKrU~#p^EP~(s%uN zQ-4Q>3?Wen2>oqyptLax8;A?=`e z?cM7jMkWv-x@+97Y-MLZ%uu{(WYkVFxHNVI76tA9Za)i`NCB0KwO&H_gQYj~|NLt9BiyQb+NNS!%V z+v&0o60-OY4IX&3HnCu#GPFf6Dr7Q7Lo2b6x{OEJqG>s5WqO}$Sv&r7-SMAZR5JE! z*;DxJ$H&LzOvq@3d)~)(DORQ6SpTYd(U)A5Az!k1RHQ`DtiZdJ;WZF_->Bpx!qfi9 zfHtz84-?;Ile_mzioA_lZX)-@YNco-A)e|&)x!Lc8?5Wc6~{H{)`MMzJ%+>o}vWK7DHzeSj^Oywz0+Y&y>wCqN8 z7%DQI0=K3gVMz*8GmC*&SWbEnTj&RxxA$lt-P`0Nh1z&((Lia7ePQbm!QSx)?TO>7 zt7#KNYg8wIG&3$Gkg|ku;lwz{dIG{$VH`3$RyDwP!2;CPXTSSdd|~~KE?0n_ec%Hg zkaRu1czKWqjv;|5aEH^wfsNYs2ywkG#W}YA0u_KVe(NH4(M^9^mS*LdsGD}1#dD2e z?VqB$1=AlSL|*S~j8Ny)c`MQ;3FQ;Aq(w%V3wC&MKfRrQ zTQ5k99L*w*@R|#klcpnxtfC3$?Y0FdS|PDlxi~(8XK73l$}^SY`jCo`?$i|+_sVRZ z21vy6Z=Uw_ynN_y%D*V%7Yoe6``XFB0J*laF%=ME-lY0K)NH3z@HskO&hYA zQ=%c{fsbRAY7kqg7;#t5)&25KA~Sx|9F~scX=in_Z>k5wm zM7mTskI{|DWV$u(72jn$g8qcBR|T_U_tvg9%>W%&T%o}dwcqG?y$+1QiV0a4xpC}T z2iuQ}o`6AbKIjl*P$521eKBoD2{D>>OvRxQU)}snTAu2plKgJ9Ng31=+9ft_%BWa_ zf1n2l{E2YaYtean*@GmeKJy53touzzcGeG?aoof;?{<8TsMO^y#fCu+g# zoP?NcaxjM~W5~lS_P^oDcnq!o1<^mS;?iPH`v23Cy(|R~=qbox@*`m)T3TG3d$1B( zHwTFe|5m{yNhUYkCIwODxQD&7j^j5S>x5A|NQfbPb-v{t&hNInJAY^hI(zUblI6<4 z&B@IH(!f+b>agQG2YXw0vZ^QfO^hxi{z$kM#gJR1#1u$EO%jlktj9oG5vuTD3Tz1E6#L=?4CXR1&03X zWe715&JpPzoZBrU(c4F8X&tLXeL^E(faKhy659ad`_6-hNKQQpQxtrnd>Z z+KlS5=8>L{i_K?$e*x#?s3faFj(JXLt2yU`t~xV^nMf#_mXa95VF+CE#{F>-vIN_i zaP7X}=X~Y!1_p+S(ulP6m%h@ZS8pmFd)GhK)LJ)QR=JtcFIQ1>rC5^I78eR>1*M4! zx(SXh9@f-c5rij0oJ^oKU>G<>B(rJ_V@Wdb@SDqmQYjA!m&`NuE z5-gbd-TMQ5s4~?4hv0{CX(T>SX+RtcZn`S!1Y|9PnT6!hUf$l9isNA^7OMqOTRq$P z@Fc`-b#2Qr?1>*=rFY&_okh>ri^u1a>HJn(bqWsdCwZT_26Its=aH)`onrCdUEC)& zUq`fOGW&!&oFHe)vUZC@giR*7>1$WWM$9E{Q8)oUAzDw%!yuVUIRZU_N-)1ijPe(y z99GA9o1XKY^A@?c?84{ED-Ax_k{t$~1ZuZ7+G-!qb1PdL4EJxEw=RqxRnO!cn3d-W z_M=Y8NsO=WJGRw+s4kO`v?Iy1^GPg1DgQ}XQg^TiGccbWK#Na6NzYhw=~T|A11Y=w zaJd0>k(T;Z0PV;xrFm~hv|B!>jS4`H3b&F z$dhp2!})nhbZK|hevWx+M@|5H<)Tc26Q#bat;jI(%X=J*P2flc9kitLqrPzpH!@YR z5Lp$CV|g-LvAtp?p$Ztx%2L9$(8l87>g(T3r(7yj*LHhna+>0KF5=YY{iLg+iFy!u z)nzgRR7sFP2UJRh2Cy=nxO?VmMA{<9Cz43Z^;I4<*^aRG){g~y1E)POb5#8fL7imY z(!6YIVa+I^lKy%yv4+0nKR>10Qqmaf04_8u^wghA$1>;YR9F$9y=wxn3@{lQ95_AR ziKc1j;8DY*6UPpmr=bN&fE@9vMTe<5gN7%d3>(XPs$sLtAqlmA%?H~1TD{mcO!5H} zNp@g>K@<|q*VgwOnH9SWq#HbxZpo8=1C8v0hk@cY9-jcL&| zO?>{?;oT5MBOy4Hmg#ZxIlp1g8;~0_aIE_Bi*R>T@bM(pK?#tW z0&qPCM9g1qb%QV!g^S2DNn`@YM_Dt@oT4nQ4@w5Qt8F}4G@5$hJb#x18 zg_LVhEmCO6zl0`8hsZX!CS*&0>Z5aoaufrv*`jS@wx%APUEdi1CDBI7h+tYogrnx{A>kBUk#K?cbK!}s$&eLLcNQ5A3uMvM9*o#%4b7bUk>#6-zD}w6 zkZ2fQM72m$tUIMv-Gr1;wSyJvN;MTRAXI+lU?^90O^IW(tVdhMchF1ed3C=NL@@QS zehoU0aR5|zc=OURQ|OL8>U(jmbWnyA$puXW*s!7kx{uP0y+c@NK#{nq2PCL$_6m~3 zq4){0TpC3EVt%Cp6)i)3v=IV_BN{_66EYEQ4!3(85h=0E!{RA4!k|!JKwzrnQsT{` z<)9M7Tc#>Otp|%hkr)dTMimG_ViP>vrH^7bD;L}Iq50$VxrgmayJ%-7M9XQqU@;*uj53Q)JL^xc;uQld;c_{RUY%h1R0TZ zaCO#f{#Y+tW{xltPT1yHvrj^y!9RaSjjdBBNumE*<}gIL`KKgyAI}*A!a-|8I=1N5 z#WQIp8?xrX&`v`vM1bSH-0L)@;(APSjhJqC+s=U#*nJGvXE748$%L-23){ zLA>L$?;_LAqh4pCxJKj>Sf%{wr6)h9wg|g%`~2l7lDundY4QOc+aUU2D0SndtY9^! z>Z_B#fBUe!`p|lF|8cCr@$SUc>GdyXn-5elh_p+YsG)jHRF3`5gl=|e{u!2Kg#*bN zeS4hoYuBJo*{@vjOS^|k=^3|ee}yB#gho2_DLQQ*wfB~>r75uT?wQnkJLCd>*$u@D z)Jvulb=CC#P(v;9^}9f=pCz(~9PK8d^!Qs@WZn(Tpv%RokKw4LBc4SeWf8fiTwS53 z*-aCx=R_jp+-YPpZmnVIC8da-Gz-9m{!BId4E{3Gyh(SE!7h>9lUmnxzZm4qF*o(N zN|Eba=_oZ z#Inn@nuJrza;$%V+Rk^(f#Nk;!JPhupHL-kq%O}rMO(I}I4-s55>FMXxsWN$`WCIUm(HB~xgDmL2fW|1yp<>s zI-B(x&E}9X6DI^Z->&-l_6aQv^FWASX#DY6mQus1)M^rPhoV*}5sly9P2Ef`7yqc$ zU}|d%?(oW<_w{pnjEI#0ehESRJ>M*7gr3o6!ipW~vK^MDsP?6t%%>KFRC^+M*~>wB zYi9NnlZPV+Uxy#lQrmM8WO^1OL$8B#h0R+^Umt03!Bq3REb`sv0bx`9e;czqedQE? zX-3ldjQ1*O0M(j$$`Z1f<=oiez@#K3y+8tbB~Nyb5N}35Y8hagG;%!Uc>8_mKv_ep zn?a=E*`Ll?o?Ay9VM_{j(xj2*(uf~&_446j;xSNfB92RNBP4yZc)oqaieazVj*}tj zNG1-^LOEN|T-emXtB6A^B+`Mj=nnDvBAk`^EM%B(H5Bb^ZHcPP9OvL`NgC=g^+L<) z1%%0xvw|g~h&oEFp-8_;J;;QBVc_6`WM+&w2$99xN$4}PfUuQH4qA>)94#62BP-UW zHUUQrA>lT7{ye~-c$R^&A=v#p>teV7LRIZw5sWi?ghcF-{+Xd_m`0TMakx9uF@!XD ze7_Ne)E~F~FkjFL@gzV~chd->IS7UXLWdvY$i3(;p<>jM zV(5~)%-gnh_CisQ@Mr}E@E~x>z+4{HA>Z#KOBZhPy)N)W$Kqg+^F~oIUZ?5@@@EKk zE_3mpryM{}E;V4{Hh07fB#C9&a*DzGBIrgZAh&arMmw69YR3`1HWO*E`H} zSv~~%VsOdfc=q8o7T+5Sn7W;`#KJfB{dzi$(_?N7P^ub!RcAc>B?%!L*VuQJMu%YK zNoQ#)9PXJj2^ zEYuYVs#7S;c4&h=-$CYdcai2^11eQx!tM`4E+4o5_dg&8HO(>LS1Q#!e!9^J`QXp) zuC<8n?oj>+^Bl9f<$f5;+vUi;w|MQ1JzXG+y{Y|>{**Z^1itMjM2yJvKxt}YZ$#9z zg=%eXso_ z(l8PF!SbsW3`!9_B(MDEoXW0>7mrT2e%Wm7L7|4{+l@VtE`+ZII~uc)z`NM5gglOk zVWibJZv{Y_s6RuoX89PMJ6X&Z#KU1A1ibrv*APf1@2yrJm0~{l4Afq3j#Ik zh9rXXGJGD`Q}*|s1wWz3TyqVpN|7WSN@qAguf@R47JbrYJ zSEhGmW>+Tlk@-9`%%3x#Hg+#7p9Dy~mK_^_FVC4@9m|)LU3-UV&Ts6sUYR*yZ8PBtyz0-+c*;c-=Bglys^BeI$dD@ zO6oo~=fmZ8uPvHv7l$?oXo<49l_ecXIWd}it@{G^#cqZViF(COuR?)T6ldl)!+CN1 z;#ILOMx)~&N90Fxx#p52JY@v_7E~ybCq%6o`G?H2i)hU@6qchebj4<{A4&d}3%w&L z)09Mcu@ii?R)l6TNqNLF3B0l-7aOX0o`s}H8HKeiXE&PexAU{b+lvLV(t_2RDsn?5 ziMdpQFH6N@a>Lacz5pnhmm*>yDAov$N282xm;_Kh$j@ha2Go>iN}i5JrEGj$WQwcZ zXIy!o!xkn^J6moeRv_Td=h>E~Jboiq<%VUd`d~Vhmff1;P zhxVMJ)vehXx!e`3Mol~gLZT5+#Uz-Ou#_PXLRaur!e6rDTb2<84D6Y_rlnfLxqQf% z49*aA`tN@-Fl%E<=?R)4X?rCBi( z@b-G;Qyq_@luFsg&u$gVV(IBI`Z^-;XqE8+d0Q$76@u>W@TjxZrz@=mxyeNgui%P+ z#ww3SWkSFL9Jd4ql$Oo0{#%qwa5o|q?2O3Rav*cVKQMdYnc#V^n3$0HOELj-y7#c& zl9ih!?l4=3ef2gh^BlZ5vpk4<^>*aTKjFk3i;UQJZ->SO8{7`_?rkt8sZiM02Fx@? z1{F+r^#x>_z5a~fLUMfU8xtbi?1A&8=?&dUqD09c!f++a70DQjA^3RaOzsY*67t;r z=K&#?)w}dDYHmRhB%JC z1V>{dbZ*g&rAcD$-OB-FTu{g|)lP2zJJsyJRyvQhi_Sq0$y8t&K6{C)Q}T*57RZTa zaat2|`4O!H^x7)km$u6~?eXCW3AnsAA2fjJ)PrPTL3(`l(xnOvNBPF=*Cq%J@URjT zR$xM-`m_df4_QVsE7kb!!(z3yf6ro;@QlSBk(PafQZQADtSz(6zP4A7f=xL-{-)__ zE^}-5wi>wW$sP+2Sotl~pFfOAgEo%#;X;C&6Uox#F6JCORTe*-pVlZ&uRT%PHNr0iUr&13q6R(}YIwzJvS?7E$aRFwiVw z(9;K<0B`V;yuJ5|a#4{sm&pd<~}dwg}Ayrg4EKkm%gQpv#l`W@_(~Rc?xTk}$|# z5n#m&sE+b+3OCS2hUq_>DAPBDT6T&R#@)kWmhuh91`^6dO;aTWCu3Y~9H<{g7jQPi zSemq2y+QJ~Dz@m%&A{WY>FPHigsWHB3im@$5_S ze$!!7x>Ggub(z~nq(bUCxK>iveO|T4^?Bs(jy$oQx?}(8r>jmDwa}dp)$+p{R;Ss~ z0e~i3SXXep`?bW;N8l;+>?eX zSzp{VY(Vy#a%%&P=4oy3r(su)#c*J^XNn=$-GyKiJ;i`hkw=`OOEk05jGQNUA;d@% z`3-J%%$b{<3<~ z)Xnm=f3u4;6WqpW6P|+mx6Cq~P8$pkxpFYU6Rv%b*7LDy`k?!?hzSMV7V)~=-ge&g z^ZR=EhVQk9VXeMh4fx^EsBs|AVhVqZYt}7vuVWq`Z*r;9osQfHXSC=PJWJt5Z(H4_ z6B{o5i4;$M@H%eBPMD*=orN2)?c-v*66pH$ndokE3RhnF&bHL%()<8cGpGAzIsOc$ zU(7hl8P2r3T{&$7)@4`++(%YVIJT(sv!-lTH~ zyRMl=dhf8q&CVJQEkwyv&N&zb2T)YvV>F+xb5VitT# zmMqFQOg=PyvW|1<##y@P7&#vM2TIAEE_nM2O2;4j+HmW`aAFfgJo%Ok?=#V@{1BJc z9R0r2&>Bt$oP~{jSIfa_?#G|@sr+0Y$p7Zk zh8wD92JTIHhS4r$qzoe#RG zHl&90dGF1Tr*F!<41(TK07o#+g@IHQ2(*?=TTm(39O08u@|x#3V`S!cEWm`tD$9HpULGF5uUtWdH8Wr2)rbAk6h?#stf{Ovk+seECZGYj|3 zKq8FQVp>^D;9l6AP6(7ymF7r=5|5x41d`3r5U3`|n~{0tm6JX4?eN$kl;4D@4L98e#}o;0(!wWprw2g-py*fsX?s_&($zfDx=Iy6kV=ngJ#$}T}cI(TA)>Mg(S%7 z)S0?vSJU4xYew|~UNB?!`QR^$GBFKa!9xJ_c?sNi1P?BmNOYhfGqg%Zja;9!M7@oC<`oDJqz4zWSZu@wBnBW> zqsVMM7DR+b#B8GIJY2&7*AFH+QX9U@1XCd~X=reG2;qS+)Tpq=dpywivl1GU2p%8d z;Hf!kAatKbTWQ(f*p{1J%PvYJZW&s)+n|bQ&elG3C6MtPw)H(p8vK^q>=*OK@qSw8 z*x&KJkO-Z8UCU-s8jl;`7rYK*hpd2@hN0AlJ@Yy=*+@u+?7i z36pZvSczOHj|^s6W<-UKNp(p+-;?2Np^bMpS=P9d!-etM@1DcX7vd1KH$i|_0fbI6 zJcQ#FqqptOMdKB>{FRo-@-X6`--bDtaO=>LlZxgAQBiUsT}~xc?;}mU$LXLSv43R1 zD^dt+3>JN3jRO%yElZR^2DFx}Yh(7I^ArohTCr<4XYpA#OCAAF#>k*O6zCTbVf2<8 z?o||d?%D$2DT%!irOt&X+b_x15LK!OgA-PlD>Hao`6TCGG=xb^E|=}h?WYN@8`Q$9 zUQqCkDd4yU>=MVmeKk%V<`eyS{G8cl?@!idX=#n@XPg$(cQCB9c|=oqHM}U&2@$f` zzQ@-Tf$SIzj$`pzgfs&@(c!wbqmC{~61an)&*aeiq}$!ya5&kIF!D&z7iPkLja)m> z=_)vw0u=wHhCDEwd(E9oqVj4R+ILG)#reKt$TfeMWhBoEdei}-p zUzl)rD2&_my>TAp;sx?Qemuw0eQI7=+B$gd-c&CV>(K1+t#ct=Q8SKg^d_}6*%Ln) z;)+%D(Feb>zqMK2QX4lEzV}losf)d-!S{fH)X-_#kT8K}rV~<+?3HbmwdC$<0Z&37 zt1r+O>ycJkX|=M~K)M%TucV{zeCJp4;qh|5Y_KiaCq`sEp_7guq6zLeOuu z7+#PJK)E2Vhn&G`Oqs|ITCF^*44yGT#p+tVx!^E`qz94!%>Y5~$A6NEup*Ent%q)L zLSrmQ209|HrXoCp!3_SR8NDS8WojeM&m!Hfy zpCzz_CVLaUIC7W$nC6V5i0}N{#$<}~L`W)fg63eXF#)ad za+y#PYjJ(`9|Qx;nQMqh6cr6-3ZwCkbF6zY)(=tVm^7O%FD;#R^V-HBK-*g z(UY6*PMZLGgoz$%7uk*cvHvmdPh2B2U>t`R<`*AR5%;8^g_phD$AUWHEtv2!r!s$*jCyvWP~WlNTI>w zp|64L;S2*T-)gjBWbW41(*g+44y3v=`S`XrGR}&1E)dOc84nJ5F2t&vYp@!qA8OlJ zXj8P+jOK+!TcoSf5j*`(4|Tqie}0gE{+55f?>KaB@?EGm1VgF{I52{21ssqWxkrN| zLyzwp?U*EVL8Tf41XvDy&l%1+hpJLe+e7cjgk%{89bk9k{}~j)8-o7mqaNbmWa%A+ zRV$vO8G)pnraY}kw!kGB5^A}F57BryILDG_U9D5EvSKh8pear=0*fW;3{QznH9TV)8 z7TZIW*PUFtMW?E04Zg{YaeO8T@9IeCTsdf8b}GAcUdj%LGUfAfk75KqY4_CMl?xT0 zqo__C#IB$$CkGyZVUwHimu9C*vMR9a4F43a+B6D@Q!HtteEKYtGOa7)P^qeJS+2ST zPFs7A_Ys5k?m83kP_`r8$fh6K16oG~i}FjjY=y}5z0iItKNjV&RHc&6oc7{l*}`qg z`?fEFP8cuH^`%y)B*U!Kk50qV(@n1QL=??cfOPZyTz{RWe1Yn@s|$9=Y!x*k(}pll ztsPXBQ<>irK z!rkE`3S@J`*a~T6yT4GwSTAvvx_wUBIli}M>DJm<+eHLw+m`vFZH;Z)EhsMoYz70!{O37b2O~HOpfHMMT zI(dS|O!a-$h}1LJgrhYZc$5+9`;xMrk)x~~kYv+|o*AtEo5RJbBG!aYskgejQ3D2; z9ERBD&<$!)qO(CMkKA^-TbL-To;BzcPXtd_;2@AD1$m>7*FS+?o!q!f$G5X&lV+ph zI;TvCt4(yRP2w-?`o`1!v7_TYaujlXz&}V1e0vFAt6 zZ4SJ^aVkzIbRb)nVc=YBpgSrrk7Y(z$3rVHQpFgOg^)YxI=zcBc^A2Y_7l8}isN-5 z>emQEUMRkvTq2qy5l$s3CAZSLHh-!P-`*f|ee)U)N!=RTKx_^}d3g>8Z|g8+=)oF; zXw5dzjwNFZ#yG89^wOz?uT3%K;9@>zeF{_3)?5ac;kx7cS|CuRtx7oIxYRDF?WQHD zrU+hV#CFx6N}-=4^z~~&_~?eLM&zDmBC9xvkrRO>U3WU?G1Tn=%1AQZ-yi;bHvDyT z{{HlAboKki*=YFs^6FJTd~1sWIGo!-)$@4a8i97%NJuAi@0^K(?HYr#8*^ zJyW%>Wwp6lEy+;*k`wJ78TT1NZgFGau+Bsc)%MNpc@F+3@8^JR$jgQwAVxK?4LhmE zwtDodjN6OC>T6Zm8@bwCU_8U>pnHa4@%`frTbch23>&7Tit34mWgIQ!Ei{}=*jmH7 zJB1AEjyr~}yk2M6DpyUN!$a#otyE2K+b|5h`&Y0)5F|m1cGqUH%%$K2h#{kZ?ZR49@M zawU9`qvgF)=r`0Uua5Nd$s~X$Q1-SM+?saUbGf2b$b~Opz@`R4TTt4S#ESpXpvAN# z4E(geUy503os?_mA$?Zn=%}yF9MruJ+uv`ROXGlo6W>NGss|cfoK_hqHqPK(orG=l z8=a6r3&JoAh41+lJq%IsA1H_n5xsbr$6d0TvFg^ACKZSH->rvP|~WS z)nc4gh7Z-5v`n)rwvlEj?5BDi0`}v?J~&T7`YjFVbCnHnq_;@k$(K2uClnl+vAG!* z{<}i%qWyT!1D=(V-%G#&Ue?`G>- zs#|rVK1ANSzYwymjcge#CB`3pwkGBc7JKyxsI*GewmI)%k%d z9N&Q9xAKTf-n8fx=fjsKrjuXTwNo6sH$@)X%8Y#qoyqyx!IxMJh{0G_QD5Dg2TirJ zyd&?k(lvPM1G{+}@eQ?DTTdf56n@XIa3!<}h+W>p0!71Yn--Fagq12lkuz};mx&$O zo&d|z-`-=-)sAN-?W!Z8A>(uT&eg~Me6d+=I-QfF4mv`U6_sc~V}jtl!9pRvKx#$M zZ<4cdv?6N^pQ9(dB%gp@vwY#gP%M%-MiJk<3c6e=gxMU$G$KrbEVkfcjTPnW7;R#L z;oFvyXTx_r2*Tkw)S`@HwZaNLV~OTeDnVz7B6IXi)e2Ssl;nws2q>Bx1Sg#i!)qb| zR2Aeyz!`93%9K3qbP{PThA$D>XfzK4w#6}>Uy5b2CQKCzr!GtS8Y?cq^ybw8Q$#EP z&kot0p!)BYfL&xugpZ(DtQYfDL&l)&REI4M0*>JKD*`_w@Hto>({I{KxfdV?R8jra zgdufZ6k{oK-p*SG!D9sK=Lr40#R6HTWh*D*OI~yL0q^(2+uPCY^lB8`-Gsx*^y}sI z;OcTR7!7Om8dP;^%JjIwo5F;Y8lJBC-9=~TsOv8+_&<(87?@Ok?H-pBqGJ7r#PHc) zu-qtOWJvt%I!uksCgNV!gw4rj2{pC!75VME` z7}PYDG;ED{ZTH3;w$lwA7H@~Q8=u3WJIC%*wmaLDWCoiq?8VGf6Pixb8c!ls*0q1P za&UwB40iM~9D5+&;n}|_r*TAY1?$NPl0@llwWV`tR$#}1E)h4|vn(~}q2S{=kOqdJ zSE|h8Rv~l1+Tbtxh`~%!wNuC5)#NzI@meOta&gb2Jrn%ClUidiIKOvc^ZtCf* zsCd_K6~8hkp^s?JiA0QRKN3mAmLT#1V->U-w21LiHYShHscmsQG?Lz2uT}X=VRb$T z8J@u;STa?y`W#_pMU6FhKF_Vm$Xl^~KPyDnLA|2#f50lpns3R!h5O+Q{oRK57f+(J zgGHn4tvFf|b&Tl3RJtDEHCmMjhG6WZf}j~yYb>8!p&8N6_~ux?EORc`oi-KMdO%Pi zIm?JD1p3L8x}GYF`n_xsHMHnMYYybLc{^mAwRXF4jI=S?({TlhN37j|n&mpvd$ZtT zINlMeBk~iK&^7XgSB%H^u2&xq-B7i&KqB-!(Wz-ilRy6mr@`fTa%id1&xL8x<-C8* zxg@S#)u-<;=wU6YdSZ`+YA~!euhK$Hr$=<4&$%^A<{(#7aryDCDG$?5pSdy6!g@yC zaVFXgHEhlylL=INdW1BainKGqtW49DUM9v3x>^bTY@Azn5bt&G*c0Q=ta_I1qED$i zEXUV@qY~i_%n>l=!IbBuE1RZ6Uj4~rXL#%$r-G++y@`oNTiW+u49r$Cw9U5Vxl=v3 z-5c^pv$JXur~VYI%d$WaJ^W((vLGFV&3%Htq*>A}u|l9#e)4Y|MN$^j!!mOVTH_g6 z>lPgznvE`8N^17l6sgAJ!CI64o&bJ#&x(z;k!l@eTHv_Tb1ZA`gHE_?_T5(aBURx* z^ERekfY!mM9pGMEdfx^U_Hsdrqp^)fF=u2y%}uk9P9Af+;#|SFX_F>#+vXis?rB;! z+3J-})9l|0&@QrVai?x zb=*Dd{z{v+xg^E)uG{3Aw!oq-0$QSMZDr9X%1MoGUh7`qUhHN_N}~87%kH+g6VS#M z$(iAN&yarnbU9z{?LGWqkNiO1%u_*GGi3p-KOkLu6z07?Bdn+ z1%i@@%Q-E{9Tg-_MOmcNRmoy$pFX_gT(J78&!|Gj2{XSWCqWT1t>$lE+-Nt&~`p_Le9Yu-Pjt8xzff6b>1WCei#^Y0uO zn32bV6=4mu1lmK|T z%1UxevlSzA(1a;tIibsCma9ky7%9vREje)f>Kk(*sK^Ey} zuog{@T-h~2kz~zqwB8y=ubs~{gtXJX+MKZM%wu4NW!W~=$Q$jxt-OlwGgj8_eK-Px z5U0{bD721c=~WV_Ik7`jA!S!K+@h%+ZH|vqaj6ZxrUuumm8h!`69V}v=6sdKpw)MD zjjoY^#|Dii;G21*HZR7ljr4f{mEZ&;RGTmYj*<~}3l12lKKt9n**|W6y*$6TdGp)V z#m(92^_yK#L8QrfNx)-(-PQC48eb?s99n3FZEg;-SZn%}N`%v&|wSWw3cM2Hbve36=h2xzBT)>3B=nW#g zK_ij@)ro)qW1*r>?VM=gBn15f2Lx+3Y=At{CWocqnZVtU3KR@2RuEX1nEcA(L}!7J znBK80>lCYk=}6YHfKAg42G^6Cyslyk)Dpu+Gi;cTS`hDjiBT~`y0a_iN8?e=fro-oL&eO&8CWf31nc^|OuQ*eswcEtkqGi1TUvD%VNdcZAb%j^bTkZ8CJlVR`Nl)%c!873@GH4 zIWi3Jw_g8>E*LBaKR9f|3@z-dq=B5edOS+jBB{TkZBVk^qln58npzvknL?64R#ili zT?MRYDhkF#d`g$_bpcg5rZ_SJ2`}VaH8vNlob$Nqf(Zf1sdREtxuV&aRG2EYfQhV5 zi2%dIuV7p0lHE%Ru&F!XpeeM&UWkgWd>5VRF6p)=B2ER(GJb~)E7_tQ_AEzH&2{Mk z(UnrUjcg0-O1&DIZ68HG(0pBY2*L4w5M_LZO;g+WjHyRY@H4`<>9LoDnA5;&Qi9e} zrM@|rG%>ZGJ1px9nhMDwmEleqc3&IL89Befy@;>!a_DknL{3hK9&8xr&t)ywQFYSJ zE!^@LU_ndR9N0ZMtY|y5v$GB9AFE~95Y{8V^XLlL_zr3kl4D0k3Wx%I%{~$>(Kn#K zs=Y;3B*d*o;Q^pIuv69VAn0F}OhMgrEv393D5CCe0bM9?{PTTeZTK%N@nW`wK*;h4 z8zU4L3*NcYhZyr^!m(p&ZIyKA23S`|Or*YQz}TYE2T*N2h#s=aZH`+s=g|qMP7kKX zDm0nJzqbeAum1HIe1Wv|+Baj$c}AL~@-olXHX0R^qSklq4^n(lz2|J1IVhArr3 zEXh^Eqfco}D#IP-3f2(^U}V8#nGEnGu?jsCr~kx8W`(x2G?o}s&!eAyX^J;I__Q>z ztv7Nr`zMO<)=*QAnOijSUw3wuD)(KGR|}8|iE#Hl&D( zCTi+s^3*SMoa1XEeD{`IutvNxP^{ zAo=CRTDs9Qo+s&Sh>7Fzv2hM@dUf^kx0~~e=cjL9zPaA!cofKUDT6mqd=x3TmU?2# znwt>chq}vGK-}w#f4+V3`r^Ey@==%Gnx_k(nLQ4Q?A%~bmnl#{=o2LH<;Dq-ItMil zEHK7ZCB_kGIS2@QAocnd3b$`!LK0*UtqSx2RRKy)o-{?>IbxBA8s3b-o#yAb@-El# zoz57B)+4Fp-OzhN4HOCRRAN*ND>U^FlK zhC3e;o8;P%U8JE>5sgQPbe6aMRWrh2(L~%AhdDB+7Wsd~9ft z1{zPHMDy$D*@cqM{!9Bc1;s1@vd1bY=Hs1kM|J%h+buFRyHNF3vYYMH~gI{??A=F#%*Wd3bf;?eS z3c?e|g%lM~*sg)`aSH+oM1~Uu&Koth>6^+G-Mv$-L0#7dj9t_p!CtrSb#A&%v0p*o zrYriKrWrPGx$1eNMd<#hz-Fl2p3@HPD^xVAE}<2b8Hu*os7wJRgybA2F*(}8Yzqr zbo16C;gTGoE*CIzDb*%PSr)tZ1U6Z^t<`wS@RuG|FNPtmn`Yo+abNerK2uC{E$<;! z^Ba2)^?xvzHBaXLjI7lI@7w0C{)5N%fn)y!w((=_b5(F-P_fGR}Szio-CY7O+0l|C=uAek=*O%X4@>T8pe$>biM zUGk5Hyshqu`(1d4BlKOWhj)P+0t4OCEc691+4O8UtPKi)Kv(P-Gv>?X8o=mk~*;U-raAGUrt1VzKKr?6|2*6a}byz1ky#%FTU zf0Iuin;Sr@!}I&S{{q!m+in{-5PjEIObx+WIf~tPS*}~x22vD3V5fPB1B2QfX&LR3 zTaqhTNcCI&f&N&B+>5xYmE@#(ser^XIh@Ox;hCW?f6C&l*Sk3D!5O@dxrP}}5a?&d zlmR&d6C?blrFaNqOc^bQ3pU4dlD9|hq;e9oJV_vw*;?^=Y=DUf5+0(^q)W`CN}1tO zj37&p(b|&Z%ANcD&CTuGhg+-488$I9uwoh_u8rc;++YMNZerRYr?kvfh-4^o9$fT# zf~Ba*Dc{M*8!6~C$#Nk zgpTm!Je28`f9w~P3kmNOM3!(| zeO&nVa|U0oxrkA56UlH>E?&5wSw5wlQmTd13lw6w2u}M1M~)-t7cs*G1Qo*wJbz)92;aq0?Kq;M}-?4`h0_hLnpp22)*c@fieMYcxS==k--3GlbJqDv4asp7Ui0 zm(U@#wPQbhTTrjBSQOnVB~{>D9KnD}Kp~_#C3A|DPdd-jJhfM00Oz}UX>9=9edEH_ zw5x~#sj5WiyITvkD=@k0aB(=UUEK7#P+`x_vY@_J zK_9!$*pEV!D?$9Dp71%7ij2_3Gm6ZNcMfburPHmw%}xx3zlAG>XF=&9dH=)Y1@RoL z8b<$!z@j`O`Y32KN#u%%y>Iu>&TLESQJd(-5qc$6b(V&h$F+Z1Vl7;53E74!=DtPV z% zxp1y7hht)0YKW;^5*;uxPb{}7oKeRS^ctX1Ia5fZxP6SQiP5NYB24r7ZqZktGYA>I z6(X3@JRgQUqQlgwXu!}`cYo>dTDhK9Qsx%MUB>#gy8l#JZPwENiK1-Eif+BYHBAEa zRHCl6XtTz#WE`cPkNw4`BUhp;b`OJ}>-*K}(Cu)j_hj@o+D23L-a+e%4)#V>sd@p^ z9MJGWe7=e}UW8W5cs)xU6m|!;!&XsiZXoA&0{`f~F6`G&_DwIOsoRo$qT8O}wbDpp zA>-yVV6Eg0IJpDBo@fhcN2gIf@+B+Cwb!B(l#FH??e^sneZfhEJ{BV=r=y6%uo*0X!BUhU<+yh`mGDh_6GttW~Z3yoB3 zssS4}Rswf)3kUVF_QRxB++999=DvYs_dbM*|2MsV0nJw1ZrexD$Qu;;=~B@Tl)k3u~MUvHL~o+yD7TWgDrCo$-_g^nAx9Y zRz}hEB!Uz8m~jm$&k^XmWXga{!DI+8wG#k0#dA18MOJqXFNNV|{iU+JlLSF^Rtex0 zKzL(|1*$d#1kuK@VmVKkK}|J+a8O`NI@DA(EcprrXqU(y1EU%oqlB z#c)oFRxj);Qsa4MXpIWB2)NG$~(3A?ZbLd6f5wLm&)x@68S(02TCDq6YF^1u5OQVvp z71F%;5Y<#!thQ|klU@Sy+2%AH15=8vM?;Sp!uh<=rQB=nCG{^uLr;+`E#F zrLJoS?|qymQ*YBo_H2=2im~*2JZ+v4;R))yw7y|6nhk|Pdf`+n*yo5p(}M$>p=^~{G%Z0`thV; zZ4933fcqdmK&kkOuFdTwvX-X4K|dmV{r1Q9y>LJ{gSS6|iI~DZDO{hko+vq!O zQPE1oFc5stSM0+*XgTZ$oT4HpR7By<`+&6FHo-Iro3usLe|Hml-XZ2CVRmO{c5;2| zl^3Ec1QhV5bbwA91irnb2(E*u5T1gw`$pj)8E)QXk5}BED36YEM>iS+jq@L*dlf<2 z7L0Dt2A*X*M}v&o*)@2BlCeqSoO#dH!}evrO{21KR5HRW1GG9s()Adzg;__%6*d*z zNDZ=3n;n!wSUF%|Q|Bf(X`yWIZn1k-%rtEyQkPf<(mM>!Oi0xc6rTe4kiW3C>@4F+ZcPVkuPCx)hTMc zxWGj7%8kzw#pCGeG7?P2;WeFwtR#_NXoy}4j(_J`ss%bfSAsKrq34HGN@C6@Di(CX z2wx>3TQM-FdT@f;=irUrU5~)yqn+gB^y2vZ^zA>>v-6LiPTn8CpHANWef;m+>E-ze zIV6te9MNz*8YLpW<^c;lsbNPB5I`V!ub8h`K>BHgUfW@2TkXt1O3+A!pttTI!%k-* z_sKkseDoQaPBm?j`pVT8@F_bbx3WqGfTJ`FhgBIvrY>UMS_v&MAa}W7UoE-xj%wgl zWv|C1V(SVow5SatS60zo1~9KO`Hk_*Xm{7Z?UFZwsZ>PmUa*%&tQY1CXu^0JX$irRS^4|do|M_FlFNQc`(c}(MG?{gU^Y}sWlFB2FQ?7=c;3fGCkb(7Ezn?311B=PzW%6!kLtF613# zpI~zmusM&wpKGp`AnV6M00Tr@Q8g&*l8lk1Qi+6~zJS~5Y|oEZqpvV&EU*`g#puK2 zdZm@K)=L!4>@OE8ku*`oH|x1c;1nv!I?x{@5uNH zryeAi2Tp~`hz8 zjo7-oxf$S0(7(#KO(VDFtIMd1aaLu`K>@Gr;*UuIJ6-8hz}<>t!bTmT%?66z!lQH|Si+K%VGT1tyFvZRmwVArO<=R$9v2++znV<#r!a z=?<_C`w9H+m<`zk$r-e-Rr&GIqP1=wEoKxMnpu-yf<~jUHiNFUsF+<~>#2z~BWlWXp zxQ)TFBim_Lp#Obm$7#}}tq{#i65n@s-+kv?d~uZ}SrnZeMQ{Ya5^i9^1p~ZiL|af3 zunB{EqvVh#EG4*1pUIS+BHp>&D(w-ITnL~lTWCH_ED#xk;FL*&vE)SQlvu9h31os1 zT$^z=_kKU_u5TWOH!hS5XRFMVz* zh%xYU{KTj&V*yXG#FR;EV3ptm9%c9<}+d$bc$u< zzXs;Ajm(tcPFv{1=O&(LO%^SWm{@{nZ|wG(K4Yas%Y{qKK?HxnZuDV7gkhDRzZV*7 zl9m;P5`r%0hbBW z+{TJ7cjl(K*4U=*mV{NsD~a5tna#BZJcuvf5)X;t5zYI+h|Dlh=Obp%o+UD{I++Ddz zRvBs$=85~&Vg~|_o0~MVn5ET#FeIJ&WlWWI8w$H_ax+q)qTtgC<}P2&sNhwUc(O{; zh`Nl{UhxdU2u+~u^_1CCO8m{HRa(HqLnqTJW7;kr@N@wE%WB~_5joq$tWiV*|MrHX zWK{H`VcQg}-Gp_Y^Onal+WfX`kJm!CZJ+1bo_#A003D7BeSF`xq;}ype$q7oJq8XB z;h+-EuQm0m^QiBvcIB<;SB_d(8{yf-l!k9b$)!fi=s#UiQE!_t5Ps)ZTqPu%gpjo9 z9_lp8rmfwyr>SMqn!qO4m<9<9vO&|7^51703N-g{Hph40_xbL2R~;+I5wzf{qKw0L zRf~{+l9_oeLjQ`pDtT_ zCzI^qD2S4|x5N8ae3&odu1a>eyLj#rX;q`LoXzYBGYI8BV3N~16E8sF3$1yW6&y0{ zg9^rb+#CF3MI|jj)zaYI?mWjxUN=%e^hWk7nmq6SF6~)0&w0i)jn-w5HiFezDLNzk zUY5n9CC0sgXPdeSnaEPW7nS5Me+pW&BUU_539(c2jkmgNs*1~@-3QkKx$?XTjfvi? zakv?Nw9asK6Yc1eNbFFy1JB_y9^r10FGq{ClxUCO zVms+t>#p(ZI)(rcK{^k$4>4%k`D#Vpvl_4WrPMIZtKVLg3Qr&40}7D`TdkJTTyd>~ zo)*O-fo~)uDrkNnLu^Y?IMmJ*`cVw)C1l)Nr;aC1{P!aa&ZZTNv+zOizayuBb?NVu@&qF zSSDJTJz~FuzrX*0+ap|m+5#W(I2%)>j*a^^-!ADbZlm_A@W+-&@Kpv@D0 zqr-XHNj-5VK7-$6GE2OKvQv3*U$TIo3~0P6gcEQHU&71}PM6>#Qk}!Nyn+hdC^g;? zzF0=W!RCC99oMJWVC5Sso1bb&n?IujlhVyM)T@&mA@~e_Fy{$!T%TgeP}`$7PZ-aw zJ15?f5nrTuhw??hex-)_=g_^)rq!0Pdz#rzn$qWBefT~}oyPvz1KW?))i=77Z*|cp zp;gm}MO7r!>tFQy2klmEZ`(Ey{;pqfeE}pJiL|yDP&iAvEcMo4Z4+b(u%Q`jTB0n@ zGO3c(9K$fM|FHeS{gNFi$(C$6O@i!O^Cjl#?w;dw&z8_nadVvGD1t;LxeHd2G154}>{{8FkW}B>i z54zp5(x}^Q#FdPg$bT$7aQfEtAj?$(Q>qjhQ-y{`5ccn8K7@U+KLGE}X=rK!g(UE? zVeZq()y4a>^UJ~c#o4dFt>qEsGW8R3bK@%-q-Iicv8dUX%Z*g@Mi-fEyGpN$IqbzWOHqWY3k((uQ|NLzD5YTNLWq$h zJWMdVA-}s=;4q+qm&>lRUB1f05cAitOUnvwRsEW|w-#+PdlebysndcK6PD(Z){sie z1CUIl9r;SlSB4?SIgQPf!HjUD)`G@4j!HTQG7`Cl5gjwm4Nusjg0v|`XM$s;6Q)oi zoZ5hgj8!{)fxIRM%#PXtuZ36xlUP$(;r7Y|E%>WPWgWMbQ80I3>>{cSy6mBW#-?`z zhZEFmMnYQlj>-cERk}J|Uul*yJ->d3)ZY=bQ6bZ>h{y5JXlZ_w63 zyBjDJce$|KHSy&bmk%~s$Aw@TcJFoOZe6Rs%}mNKE~@Pm^)+=%igF^X>?5i|&;4k3 zHoo90m6?Z{sEN0=FWQ>TV(^}{@ruqQRkTw%u4R8<&r4@ld`(+-$?&`iypky#ZuHm) z#&-CP>A%s(V3e~o8hp;FoP)PYd@LoYpUt0JRRV`c&|YI_uNh(K-*&g=O_J=7PN&(Abp{@Jc8slk|48tVdetFeQAD{{RJ=oqFZ}ZFRYO3wCFo$B}Kja33Pw-QsO*r|qaa$hZ>nTFUnk^Zn)g zNP@0+>wgpV`a@)wsw{;Zkm+P z78+VYXbBXuVOO!owi>VGNOBU>2Ko>E!+uFecJ}7ozExoGjL)2zIWyLqw^dQG_=xT8 z!MU1Je|%Qa2+)P8plcW%&beU&Of-z3;V*JTP?l?^EEWY)k1KEfAI2|5D-woVda%IXq2 zJ?5y~09=8q!Lf(^}(qy$tyi^cI@Ph#zR~Y^1 zMTW_TrvzIeLw;GJusDF^Wt<2>k1T*n7^;if82MtKqphrKquH6-psS4nQ>)K9p-pT; zo=XR%&S9wF6%2=&Hgn-lf&-z(a9{)Y3C_TT2NMqT1pi2E@Il)DkhNGP@V$im!p}yc z-CUN{et5Xwg>Y+}yDE_xgyBBPd7i=v)3CkT7J z^!USRVGM_p(~hIHqQNF)Dclmat!Y1IeahQm>tEL*Z%ER`d$+UWaiy&bgMutOj$>+V zw7g>yJ&zw=ldmGHy;^MC2^X)#x1;Y?t03AaZ+KduNa0lethhu+s{ zn(&&h4b*qk>Uq-#`^zPyd3)=bmV|X~O;=2~FbbKbs66T~l~&ts<2Dd|*H_Fs#!6n; z(Mz9_rVGPS5Tm=B)EA(r8#uHyw%Ev`N>a(XL4f{4|FB=uAtmc#yV#aUfP|bG&YW{* zsP8{!apw3RoU^kt7^h0JB;o1CafVR@TEI@^5|$BWiP)W!>C$l?A0Lg6#NTr+5!_Iu zTJn`2CL)j436p3H-AiNW*tjE+uK6aHOmmSs&Hx^3+ei5O&%c04$#(FO-y&SjJ5RU}*%n zWjs0G$1hKgVh``fU_3UMA|;3sP>MQ6=zQM6FbqYW>JDUVgHiFSqLoXtO!>HiUj$jMWh*BS^RHo;f1BzkQFA#Zj^M_2zs`!K!+Phq_&?aX$D?%C@L7Mk!uf zQKGzboCsCuxg%4)YSubpVT^9?(lOyYw~+BgttYn+>pTsu(!3tLIu^WcAwjqzp0($; z%oh(7&06_BJhOyHL|duZ0vOZ~Ba2WfYetoM?{J&xoma+PxDENb4?S})l&f31(%p+{ z(=7Mr!7$hHU{1b+QsM)WxC>W5!0Eu1|HGyI^9?Xjcq$*OQOX3~zlX!KvK9Vso;EdT zC09l2pY*UT(JrUV>vSQFY;-Ke3#9l0zfP!S_!fh&AzFERohcE*phU)YFO3u%8GJJW z%vPsYMlJ)r{M-&gSsJ>8YaiyYm5JOw1ok= zV;n9@^G+T6tCe;W+1gNfZXnY1qLpY)mp zv-#x9Y%=^Zy&+HX(lW=XB^}F33p$$jdkXL?hQ_RUZd6npN|_3K+9dFs0t%!g zb(2)+4Y#*|EG6U7&3U3PYzn=-xK5!;LQr^^m_(h+)H;{4EDyWpof$_|RHgg!<#9_@ zG&-ZOZIwi0l%}kGZ?-$7QF4(hFowV*SWB@j20GkS9{|<021?U|^nDVFh;nZ9h}QzG zW6eLB$K&ets6pR4m2t0cSw7_CU84XR3us_g2c7*ba@>0$VKdOWLU$<#eNs z=F{2T=SlF>JebZ*$GF$Qr(hPir#tNaZaTXe2cNE|W|zz@nV4EKTOP+(?w4EShxB!^ zqmPSp;~sVDem%5ydUa040rBugzyAR3R?TkXHW0q^DF#RZ*+w=_kE=9WwCSO_6vYAy z6vze^Em1ZTnN%sNsbL7%cjz1TNjgJOe~#qcpvS}q%NDu(LC` zRfXkQCe?5)TkgB0Bg6uz~_>} z7Rx{ALv+2@V}4fJOb|P&vHJr$t@k9)Ga0+A&apr#FEd*JRz5l$dTUh`J@YC4w&c>) z%EMqMih^&%iR{RXa$6k^Wg$#et^B@F%?^jP;VRx%6;U`GEH@irtLj8*MH$B!)YJL* z%Rk`XfEBwu!xnAx3R%PIm{i{hk^99lA`Xj=#G>(>mRU{6IUCYRxy(uXVet(>&6Y?o^g}*h%xEulWP-po07!g zi7QL#)w)BiW_#dkU0PU+jZ}(y0~@w(6!L+yB*Ffb1>i6e&LC_@!%L(+PN0t6Z8r#& zOcAhJccFP|g=r#(-oYq?cJW)7)I0ss@V-Arqxi3v{W&TgV`Joq+1;6wloShgzilhqV~Jd4a%+XuVs>WEwyti^?>O@JGQZ z7ETeE%-N;;j3qNrqsPYIk7EbobJ#S!e1G{q7z=)K{6^jUjgF_yDV8r9oBw;*u|yQ{ zEcnfxJEG{_KWNqR;&C=2_>r!ZDa>e-;QIQy?#+>XoHyvMkKI`W6?2d8);ih4HQcqJ zz-0p0A3C2sb_q7PzV|#iblovy@Oq_(zrS}s@2^-} zx@R_CU4x3b^4tZ@+C4n4bZghtbt*uk&anWrcAJd)Z_U2uznvgs0r+1Wn{hNiXXhh; z$OydQQ(<2Yo_j`r2GL? z&j?8A{=PjSv)+;Ss^vDAjNdN1;n;tZ-<$k~^6M^bQ~GNluS0*+N*Z2@jukkm+redI z{wBZIA;13sja1ui6EP5d_g9Rl&~Bq-!y`(OP{c(PiHlm`1**hd&o&lbd$GMKt0)rx zz=!Y={0U#e%wCeTP(-9C%6R6?nKQ?J^tf78VmcB>M{sIGl*VX#CB$qt%Viz4v*M|P z(a5?u8i7aSqyj3L6jhnQxhoOsfSyji)EHub+|@=wA+-VLfyyXSRt6)2wh&h+D(`X( z0bJ4JQNv6K?v7H8Dc=_Qs`dztt343QKgi%YsgGYJOFx6jtPQQ0Mq`}K<`$dnmJ4q7q2-q(+P+U8U=Uy1_NNoE?{}+D zsFj1zkTuFYnjv@Jx@WiDQd^eneUMiu#CeoH!ev7eR7U4IqG`INvp3rL^4fc}aZrrM zW(vdK&N7_%hv=D@n~2`hTGoU+=0!tE?x34M4rvAjUB!DNS6#X_@-%yAuiW)s;8lBN zy3uF~Qpt`%Dz)p*X|wKp2~md6AY*%oB%~`kqjf$jX{5k|AMlq2v0Xxmape>k{TU&+ zY-h%RF->mGn2aGI&m_kuqODGo4xZyT32{p6R~StN`zKT~$K72!5n?)pc^zFza^>{A zG{iJwe#mmOxzv{Lz;>J6MW?83&T>L}3>yLT@fd4w*+pq`fB+K@_bRV#EYeTOeU;r; zpQxVHUc8#Wd~>$=@a*jT^v&x&bozQ9IzG9_<80}BlSc2de)>C%&!s|P$kXJkl_s?E z4{ybQL0P=Q^tO(F8}V9tO9G|IoFBRUbGZZk_|G@+f}6Ecu}1%Wl?Dxd1MOOSZ`(K$ z|6iYio3<;vb?l$_wZoUnQNV?t-&A`QNCcQrpTjjY5FPCgP5x&R_&D3Gk+5!sa}Ukt?o&FwAgCmdi|_dnUOi z2V|Brr7$EUqAB`~a4SQAVUqAvGs%<@20@8fra_JoWMpvFBkYpNC7DQ?MsotZ6`z1# z<`m+h6%kiyDcdSKQ2E4Ok&b(^nSw!^Q~1aw>t|AYV3F>FE4qY&2{F}lLP589GWIFQ zj*=*WYNG`c$N3FwS}sQ10zRb3XLAr^{W+x(11FkX-V^DR&vHp!HZ#Jm=^{&*&0$LV zEWIRC4mVKCq0r_#CV{`QXTn*8Q88__1`Ftdfka?rgM7u++!PX!bV6HRVUL^z1b)J~ zP&y<#FUX9cm`=ENxchGZ&G_~E3R8|TY z&!+s^FoBy&%g!SHzO%Zr+aphV-*ri!gqz_C7nM&7E`|G!PlxZ{?jF1wAD_N_dGHtX zT*KZ;!`AUSb0>9EK`(`NmL}g~aWLw-Ub9IqY=vBqfByX+gi1-5P(gZLuRU9h2IY++ zu&hXbyYT1NZwZYek*C@xun%2>a?foeFqKN-8(>p3r*g(h95N0pxR^?)WI!h&=2r2% zEmbV}OLJ{BM?EXh137gWZAoN#AXw2z1KtsH8?bf?%>tT4!56!}W7ABbn(^2xD7j)> z#$fl-D8VQW4c6VJ%_#$bB_C)!4(_l;I=FpSkeX%aFoo8Yi+TlWr;M3d1iYKhOwR*X zD*?11zgNfLDVIuV_!~Su;k@byp3v+5KA>2+A583`3){LZzX{nHkFTF4w}) z<0f~CM8X>}OPFnCuIU%b8hJ5yDd?sME^$_f`P4)aI7qSZnjdr%&~(Bgic^9!Y=fuR zfYk;W%)xsD%$3Fy(cC{mg(1G7-kj1r6 zw&Q&-`_>Kwe;(AE%8qL$L0i|@+1P#ahE(4-f(AJ5^cPDEx(z*!NkKInpHTHtdDyjO zOT$LoEVv+h<`(8#ZG!X`nars#I${fPdE+80DV}%&AZf44(aI`#svx4U82}K)xaex) z@t_rx-wlmsI4j35Yw5PxVgy)#DuZbXG6o5ld>&wO+9~PW{&^l$`-)4Ltc4uFz#$Sr zW4E#BSi&u5KxaH29vqFw-R|ZKr0R5^lfeK|(C#!ab;*ZZnW+<;QDvH&KMjE!(_>JX z(?oeX)b=z%0Gtoq6pQBA!OZVT*rJ!-NE||Y@)k)3mCdz~OS`oCjw@$e{|LYHe1c22 z7E2*#gB5n>=l6;5zd8~AJ`ny-4}<|$LZ?}YwuQYgO{!BeEN@p8H7>9bgj^~}m{d=# zmt4hl&sOakIfdFtoJFHCd6UC+gpcUuH0;`Sfp@u0QC*%s%%o}+2!dm`2B zTHEe-{wkj?&-V<|!+GYeVBO&HV_-^tluYL`CHB6#gC`VMitJzG0T1}(yu316l&%7w z+f|)zV14$`_G_|JiwE=%EE+@LV;YdT1!r}v8#!X-sCb&?x&sXuxbDiCIZm?$#!SOP zVm>9EZ=!@MHD=dbY1IkaO$YRG5yl^5tC>sAk6=&+94?LRY;4=(H~r$!Bmn4PjxPyx zYZzvuk05`0P|%QVo=(M!8OU@em774fJur7k$qHs+49lLKUSX3~aoBK9`s`T**=u&1 z9qWu<-Gg^FrKqNjV~#sAUhI)n{m`&>_61YdUTwz4gVjsQ6FPzMMx@CSw@EmbKT-rx znoE(Q9crUTIE-*2W}Sw%m4Tjxs<6=JLYMsdYiScaMVu(p#7rQg8%fOkaWhFdecViD z2Z`HRA;}l#RB?Dvri8t*wUSu%iOjmJn#jV&24)MPq#VU?2Sa*|u`9$a43bp?Q%F@j z#or2u%JC;K$g3wleFivkC1kwH-X(>l9Tn)~%r{-_#13;_9=YkRq;`<&7C{#Y zYM?qa#drW-u7K5T?05c6jnM&a1UZ=w3sEq?jiE0k&~Q3uVIOm%haUt#2Kcdw5<<9g z`W1X&mMgh56j&J+M<&jd;JS~z6mq>2!{Nkv0V^fi=jGQnlAmDuEDGbH(Yl(s$5*FaO%!Wu2^ ztU&frd-tf*RzN@cTF9%p=#d?MGr{pqi$>B%jWc+-QGj33fZQ2Dv5SSet+c-*6c&Lm zRc?)-uO6O*78>55OSi-bxVMY9tzPRv&m%G?OL1IJh&JHmvO-?p4B1dA#(Jq0UEKQ&2?5KnN}z~uM3%1y5)e+;T&Mg#MA2*Q|yJZ8U2Up^f;Sh;Tm^_re65L3hD~yD4!SD*OxWR?%+M zIuL#LSBzAoWGmW;*QFG}MY>c%2qF4_0ByX`_@lqtpc`37%*SpJSyo zritHA?n2_@r&5uqmdPY=*mVChfmxloIYcOv_EFAJgO_`R`OqZFwNlsO!x z;o9Zoa8M4#tG=6waxd%%{&fd%_9W&P)S|zPyTPyoRRQn1Rusd{$6Ms9 zRkXie=Mm9dl}pbv6f$78B_UjNEhpTPO&NeIG{6ZiPFJhmpkA*}GP?+GW^Dqi)m(E~ zH0!mi@rfa=WNp#Jb&cfkVJonW`Ix>atag-F*!fW^PX^(iNNtF!zP+Maanbe~Bh|3; z`>Kuz%Mj%3dF~3!*jeRT1}?cIN8xR3o!>5j&s9$_$683~s%hWVmv(^`%x#xYW1VRm z5{H1>cggkQUUw{$Ylxe~NvTnmSA=?_It>I@)VBw}l7%nZZKZwGRps!STV*)RnB>;v z9WO9EBMYCP)uvfHt=?lnJG4V5 zTjHvh#n6fA1Xk8PU`H+WT0-r>Q9HXNUU(uWunr=@oFRc731@N_^+y`mX~yJn|2mP| zw&p%x+?l`57kuDqQKBi*0NxC1_mc=S)1qi* zgr6vZ2d9vb?(Msch*0?%Ej#oGE~T>U=-eD5H*2VvNF-`js! zq%h45-iXH9-|dl|4*uUOH+g0JqFiT|&GFxEmYwnZpES#NomSg!<2Dd|=T}T~0VTnX zfdbtEPU6L4Tc8VUitMEiMG_>mL|a58Q4uLSMmGQ6;Z2t1BrR$LvB)``%bDSk&)(O0 zO(qFBJUoO?mC~#zM71R3?(WW7CXn&Eked^;A`O3NMZ+Sur+IYO+T zkFr{bW!o?jumZMj9oGG=IP4)&P%^A{C7(^vI(25l;A3?==W(b;dP&IaHA#lAC%ok-H zlw2vc+{+^Q&9=Mbl{Oye(~&9anF5lKJRKoX*)ukWDNrpoO{qm&TvyRi!wb$7zhpX( z6PMy@pCN-b9a76$=)SRd03C?FgJBI1VnGMNXv*9;b0>#u?ENk5%PwfjP zPbqc&DyhX{GY*>`v+8m(m`S-Av%03_Chm>@w|2Qiw@CS4hG9a!i7Mr=!C6zeY>N!J zEH>Z*z*k%J#TW3AKrVpw$n`XthK%fexN{p*$JQNartX7dY&d`9X={QvVwr1T+8*Ln zcJdncbB?!)N7Va8D7Jv^M4`SuNG8M(t7?W7xl!TGDIv&sx4iz28C|0YX#S{At?4qa zKa>ykXE8VX{yJZOxcG9pUG5<-+=N<~f5u28<0_5lpN2ib)jof0E?eDW&E#%4iUuW( zV9{1iSE3l6h;6V~K=e~u;E>$%N1?Qe=zqzb#>NBqkIoyp#!I+{>#uF4Mah4EH2Q|X z=->=x$)q*Av=;_7&5AByD*#!&$12Yz0Rv}7@@7Vx3RbLGBPWO(Gt8$D^RtPyLgx}M ztl=;y;MUIpa$quhc2yoZ9e{IK?%q2y$6FqRGS||Buc%iHdb3k(|K@iN-PUc5d(?-v zSaW+2>Qk5{2j%i?l3x@MssNWvI}+@6j4QAq|L(+$x6mD0_{l^dfS) zb*vIR8>~~Hv>(XVg$@n|;&-g@Z(r<=ReaD(VUHj56ykTNex%Xvt|6u4z}&7V9w53R z2m3whJHw#UUVA@=hTFI6HZ8BQFX?MfW6^BnwYUGe!n$Lxs;o7ywoxa3KeT>3nl{th zk~d2p?UpeLsKK<}y5fQne*EY{4re*Y`pugto95dPOVHbpj;nw16gYbuwhBqb7V?-;}0<-5at$Om2>P^W&aI!^!DZqv6nWt2jROLid7-g9wms^jx{mZV1OKN!2mjVN@24}K`Rz{8j!L!cCFx&hFKO$p-|=kD zlt^#uc3udTN5)StnQn|<+S^{K;43Yp;!zi(pKq{`XZ-gM)mPne+e8$;-={d8G9xKC z64wq*fp!MU02e^GNiy+TIxg=QpTPQYF~?T&|I(Asj-OVO33v6=C>?(Lw$_z`KqokU5GMa>__~y5gH*E zt2?oRkRi%hP)sSS8I+>JDPyzQ%q6K?-6&VmYBA4xBMu#%I2>bN76n*t-ufhivBAU~ zOQkW6!ux1KwmKVAsjMhBQF6j~X;F8escG^YjoAn8WjjhGr_hVNI!@GRbUHrZ=hQhR zOR;D)w?awAj$zhoU9EAxRO;;v{`~!qtri>9?@&W4g+^BsI67)eR2&^K0B0QtXya(d zoQtgM-B3o9S{U^GZ*hGeUAV#Io#?Ev6^7XC62TuqmB8z|61mT3LR~0%Q(2E_C~(PF zc%iXY?g7Z#Tu2XvQmYlrZf=~=I0u{C+u2wu-kD2eBsS+Ngmy+xpyt<@TUgVKgLlkj z0l1=W3=uAn$RQ*R$!a?w;su52dNdl0b4Ib0jm*7boWKpCfacpan&{>a0FiSY!HZLf zzEw*JuN9@x$$T_Hcum4DhJLh|OPAisp)!K39!}IWB~hLN2_iexm_* ztX~QPm5}HaK9uynp8Nd=*Dcq}rUInN8S!tG8azL0kvtek*exIG{qJuiILertQd9FB z;dQ$JP8g#Z?~fN}R#d`nF21305J=K2gP%M4*IIe9&1vomw}>5s9I4p|hj)4NiG#xn zN69!E_Ceq}iEC~tJxPctyI6mE;r`2_lWoq`8W&eYqdU3a$Z%NI2u+693N9oei5b~n(X2K!>R$B^n1ZY?0WF(4cy%YEzkVA zyH@k|ct5*h$H&4~ZqtwD=gbL}|jfZgLL7PVHcZc%s`#ci=;iwyU$6u-w~7wBR< zi{y}cO%!f3=pGNjsU2Oy-QywnP@nzr^+h{mq$}Kh6KypQ85kF z3qjDZ^xNO%={~38-KDvY3!;Sh*<$RIqvVyrq{9x}39P+kf!T9aY>3w9Jt*?|cwRhE z&&i-O*IeeyL8(1&L&EaeV>Sr3p`QGEkpBHPkRqas&O^^V*1rf}DVJL~YEz5q-?@Kx zPxn3;!tSL+(=?4HyU5_mLr28>tGGMo$zAo!{&d;z8~+=Y|8z>**~TMnPm<%)Yop{> z)YjNHmtGhmU7WbBCh{rR22-VRI%x(c_b}-bL{eFi9w&Dp3GMualBw8M4LV~mhjkzS7`D5n;jRV! zwCjdLn9TxoGMg~~aJlJW&`u|p$tc7p)HNjhGh=ds=b_>4;9xq z0#F&$k{5VQ(9R4Xa5I9?u5%2{>qI>QAV@Kfl^$q8sZ}a+dWzUqdWd5$Y&JsDrapgp zi7L2|3sS|>zeX3cDCKs9(Bi>5Ixj;JH^(J_j8u2aT;<2p$+e`eAA{tb9M`AQMspcw zb-e~US+m*cWVzm=t?Sur1jbZxOr-bayXp^5@4a;i@F{mPPxeG^_>xik*5)#rx_)7ftXy-yW+FIjee3;-M43MrkAiMTX{PwMJ zBjA>&k2r3~bQN-Oz+Ap)pV9qE3>fbo3$Az3Q09x{xrb?*^Ys}*c-sOqkbb{~y&RZH)# zP&5DdW}}iLtl&)-H1QjS)$^;Ie&X)FkL-ju6x~gR74IHchy7`6EAb0jkM?HL&b@={ zU3Tl*J>4qMNq?w9H#tQukXR8_~y^Z+>~5T%5|UdifH1>949=f@wqk4}!U{*sp^52LBwS2A?|#NLC=7Xu8kSPc>6@DwoM+m|1&JD* zDrUG88kmS+kWCVA-_c zS6HNrKc>sxYBUZ1Gfx)n%$QVnI~@{EXYH77Cv?*$_nqVKhPR_ZaCLFoi4mhS7KW&G zVB{Rd$#L)eynlBW+~0oa-<;YQw^5{z#hFO+Vg#SQX@5=UGE1L>V5AWiOwA*?6t-Rq z(qU8lKl1R7nqk3=p}+O}cgUF4W{F_ebmEGgjRww{2A8Ba2WTVUMDGr(-y_!}@*45K(^1S72}yxYHL5~z2YSm`ZB!K? z3MpoZ#tOLQmQmg|-c@YL4wg(93$@@Na-FPzO=MSPpZ5A0j%nKx8Migf(2@@Y< zuF$PW@)<0*-+$ryvG{;Q;Whq^l#iZSY*3YsyUxHq0M*^U0a6tHx!zs7>~roKu5u2o zjwcw+a%#D|Xg^d$Q8cpE&yOR+6K+-?FNu6O(k-!8=rS9X=ftLNw?92wdF?OF*LrK)@_Nx zTPbTl3QeX&&a1G=zu#smffJ~)(S$bm?_6LfKK&wbq-`HzW4fo*&4RPxEwM^UPah=H zMYnXjHU$mqu6cAyy5DOl8g2{baZLXyZQFrRS^6SMB|RMI-IXLn6QJdSD9?6Q!spn9 zd`IqIk%Qa2d%Gdej(;5Whd%{_-mrIlcUqZuS<$H?2XUi1w;%t&F5Ux8e`g0Y+fOc2 zrZfhmy&F!I(L)$q4ua9}hv4q~vVYxgzTChiMX{q^CH`lhNB%D_x1HyuS*g3ay3`M` zc;wk#Q9ktY*DtgELC4HMUK`6#xs=-@`N&k3YM(cGmy}()DNr1pN)ckC{4wKEghd0@ z&5|Qex94Im=!sW9Ut47TMbFt28Z75+-;8P6SvEhfmA}W8QIo(@;tNmUlO6CH3H%GS zS!-|G$QAvrUomxpr7Vb|y9M@x61zy_1P!oFg2X|wNDPZ6MFm|}v(e}*%OzVkQn9j9?2@yj zDwmDqDZ9y4#ukwjN%TeKMXol{C%Gw;8T2fsEai1kZMX;|yKM48g?Y(@rn9q*=RzyW zSB;2OUX`q>=|i$ua26M`V%J=3Seh@FT<}s&nc#8C5|EcoQEXsIQQgc&+S*d8xG3^+ zH5$E2Q>H4msT#p9j0t4V#b~rxENFv*|K8+SBf#=X0fHU}?=M{9h&&$Q7fWRrUnJ*Dx{B6nr4~VBxtQwQ=~e9 z5bC*YVr^=XKFd*ao`y|LD@F+I7#%!8)}ceH3~_3j-AyH~@GxUDBvUOaJgnuu5Pcv<9}dz7 zqV(Y~-JyDMY6CTS^Kht6S(5SOie1Ju=%E+rN7<|yN=k;_0lZ6Hz#^Id0cnz=KF!|T zLZynyJGAn?nD>Hy%Ivo=UefmQjCz<5d@%4-lb9wk*`Sn4iSdsq5tkCNOjD-j;Mb_> z`O-e7x}KpP(#Xo!wc6~NmidC`R4e|(k5g`H- zT^EC|SG{%Lp%g?c0y!FtyAIy70FkWrm_V=d(l&)h+i^Ltg9hpAxF8#-VR6&aO-6Z3 zdHu_4O>%Az829zAt|W9dfc%R%xwtre_vzvSaP&yDY%mS(?yNZ%l)2k&FsPnX>2&@( zbK%0g=56&P7h@ILmtnK&I&;XYcu0zhMoXPAxt=3+qtW38wnex6LZADLZxvxq`dtsAG0nA}rcM!j7fF@!1+}l= z=qzW63oErWZ^_*>`k(|~=P7DLT5*&0F-=7@+RVBw&0Ra|cJ|IHvSFZ=7gcp7F$G@{ z+{9!dr?14|FoXZU4hNb!3LyqpzB}s7t>^m`+tPMeQOwdx$UPLfSz~Oyax>FmcmmfZ z{Ig)+|;l*KSQ7BoSWz2+a&;kt#+PN|n1#gltc z!*tuHn!WHhznHd_g%)0uAo3mi&8ft|&Pg<){E>BxDdp5&A-oukC}Z8@x7TP>2)j~! z`z*6>uL}}>;j{b`k@4+U3Q~%Z0r3nrLP@FkElA#Y!G`n2|8GQc647|&x)ZLbi580iz;JIlF?3k@Ov}}Ywcaor5zIGT4 z&V8P@Gz;&t87~farM}JrcMuo?1v(v?$K8rJ47vwr>aL2}alpdRzQXqzL(;}Iml-dL zSgcxoc0*hJKZ@M=FM4_z_pLuRxb-7E-%^16vK(}Z#o%zK3O=mM~zcW6h z>!pWwpw+ou=nuhFBg%o=7o+U}eH;EyK;KFBVRadH?(+=M_i}E)`vCgwiiEy>@LcGr zFzDM?dwu6r+=qV8`d##g#1{QMgbw{a@qW`C`mLYtL%*+XFZ!O^UG!~zdo=b&&V$~n zI`=q+!1rsX&-syyQyd<4d2KEAxgQ7;XBx$b`R@6-FF!jzfRoLebyYG=1;Qp;gQ_0Ne&y0NvxyAJ$ zXXXHjKz6^*{uJBu&Uc+-h~@xFCg0uJ!=vrQ*7E1QLz`ji9Zt5}$hPkTtB_(wL1KLH zm4zvLKITbQxn&O7`GFTa7!}6{=3Efob-AS{k@GFXaL~toyLB&I+vwi7QqsLK;k4bl z#UpPk(Sa*TjAI7s*>odv#S7T=l5Sq%kCXS6xu~KK^0NKK>Sg2@T3sG`1}=Rj3Qr7# z1Js@Xmq|)`5}Ye}EQ*b1 zm@$YB5bTBnAan76w9Rp#pjRd5`tn?50*61G;}JYu2UM%akV<~TzI|#+8f)J;o^e1Y z9j8OqJjs_h&f1F`eFr!Td`~`4rSd`2!|nqpLBL1JXrPb#Q5p(alt^@l61+gyt1U+E zATFv(_2uc5t}o4QaM0u|WagrWq$>AAkoir9IMMsoxs+5F!oHSuzRDEi^b1XG?%qfN z9q%^!u9wWwH`O}R`f615zd+J2RC{sJmtM!rp7G{$LI{Ute9*zrd74~oSm_!fMp#x$ z)*c!M)$3Pt@M9YbISZiPUnBUl_j|Wvva@wN-{T7^!2bp9R?BkRHWc0SD{kdX zC~0IpEV~&imeVv{)SFJHO;(Oaf=EzA3;`?%R#r8d=|A)j`z5`2P^45Tj+<4c(ZVKy z`#8Aw+yh>{%F-<8wS$urxDmM~oHH>Gf-3^4qRF_CYMteyUN7e)y6;AE(UYXmY0vzT ziv2-fJ&!n}LQhyc9t?&rhUdfc!SLIQ?%CPJ<%{7(|Exbef1XD&qhls80LDLE(pf6y zedGFyE#^SD9yeacF=z?Dnmi3iDVwLbdfsoqlEpe5HwMGY2IMNLFlC(RM5;yCf;*-0 zoLYn!vq$21qUFTF&cxih=2ZVTZx}pu;Hi$^ojq9Jvxf%suCIFJItYHDzZFbTum+%L z#4-v@z)BVhrZLU9Ty?P}Q%D%6qac`0r=~;7`-PDdTCth$2X2KgjZF}k`k9)76yV}i z-ZP4LX)|=|VFyC%J`z&1WEHl22;{&UDH1j>6wyqIAUK7owVe2dP2ul9|MK9=W`f^? zLh%l?+a7A%ZU+D+E&$fO8SVr!7|ME@_qtOWogK`oRL(Ph18~ z3Vr}XLKw$B)G+v!PsC97{|E+SM&l}fjZu3_zK7j6TytmnGl9+I0}w<1{V;c+bK>NUL4dqJXv=R=XPl;3V|8* zBe}JdRaTN{s>-AzA7DTEcKuU8I1W8EvuECZV$XtYVrcgQK~NPk5>aq0rs`!7;FND) z-@nt0GrfBMBZ?-YxZCT&n@R_>V#ZmX;$sJvDHRBrqr0vN;Z`*(&BLpebL=c&syL{T z#oHow8>i*+y)Bh6Q}P3ibltNmHK{ap`Ps!WrP%l! zeu}+F22aqxa^y?>OJ%N2UA+Q+u6lir^3;5lHfs>G$0%_8Hs9!H_qG% zBRD53d+z5sY02$YH+8ORRp9a_2x6K?&G09CePc6hG!sXY{Jyy>W{0S6kbg5j^zq}y zst(+qgoWb2okJmK>u{xC+jWV3U=79pVTBp|^aw)!-@v3Z)eRoLyeRCuJR%QmB%#w|NduL!-TcU5>TX z%~e3|7)#TXQVjm|!XQMMR?dihVziWdZU_~v3B`!>y;g-Nz2Q!1#n=+k5w~;t4pj<& z9)1JQGPD-@2%S1YfY;(QBh!ZiDmUbe3*dY09SjN=;azYqT_9lqqf!8iE{>kCL<@*^ zZR;(XuG@_Sp>#;wc5k@Ks;)~(%)D(KHzm5Rn@6+tz)x}x9B>Xh0k4I7D z{GcaO{k({2=QQou-Dl|I#t8ng9?TnNWVNcb4d5!Q>?%pZg}*xfM?xa4lj~$?ZxYR> z2Uxif(gA zENnH*`Y|qvZHJh!)Q*?aDKiS&J6wi4|Q3yc)>n= zfO}~yuPPxojQxUtG(scf!emP4pfM9Qf{?IRjfPc@b*1(n$#?~Ys4!t{wOTn}I#@=T zl2(g#99%fv=-O#9_G6wysniyf1n=o!zs5pooJC$9Eg=dH5~-{x_R%~zA>yBuEX1bK z+zKTbyCN>Hn`R}K5~~&b`}aR^8|#bRt|)fVNnS$}k5IX3ltsl~sn zchCz&*3-cbjo}*vi@Unw7MHN&dYh{!38txQr7h-5sz$+^$|ekek{mSXD-n|Fvg>`N zhVCH4gizYHF{rz4u>fI0E$ISbt+~ufShcPHuj^LC4{6(4t~Y4AF7+YC3796!h;o!c zkc^;T2Yf1pMJhaI+tkSu_&fpO5ivid8A26JRqbD*6mEYG zB4(1)Ow~L?xb;n?uNk9pc>a8R;AZxsUvwnVOb7-lTfL5Vxw1lW6OOwRIe&cohF;lyk*CGz)CT`o4h17K;S-((7Vk(|( zX*YJ19E;-sIcyAbj5gXbBfL|(U;7XD7xkL(=>}@94K>&0H%T;K_Thf>DIDRBcgmT( z7hEjgA|0=oGf6MBXHFNN=x%5~j2s*?_6dJC zJXxQBxMrKFuyYr{Df>A}l3JM))nS(A^Q)WRjgp^LzMl=gN#-bK^HHkAXjqOWn?(<3 zta%;;m(5WIiKX+&A$@0!oQaTs(mcLWouKnyZjZYCf_{&B^NoJHd9QYLqhyAzz@er; z_rFTe48Lz)Ry8~}|5II0IKzi9cOuVGegix_G+~AcA%!VlOJ?+_y+5gQZuL@G9iF|( zw1)F@(z-xXO{Db|?Hp@!+cxsMe+As}lv2jF((Cl*#;()4iQD+jO+9hanU1Q_P$DGp zOpz)_@3)Hw34q{BmRskh`OsR#zOcL4T`U29{mp8z+8aFEBhSdYMaW1>r{Ri{ zS(1`XlHQU{m@UZV&GnCd?9XXRuELCxl^@fHOzz3~_2n_34)$VyN!iMuQu2zfqU4^Y zr+a&AR{Z?+;=`1#vM`B@zfMhv_gNT)+5NAtvuqVoz-Kh;c_CXZ1@CdPiD~K`5^uBF z9HmK;dHvH8P>@W=d<@_QcYZnm;DJYu$=pe;4-YMn>X)-ZZ6tMqedMKNMWvyuZ4VW9wB=ITp}}R*gxT zppc2rXa#1)DEQJ108BGC(eo(unVX_LG?KRX8Ff=1%Gs|<1+FhQH0T-%HzVD5TL@(Bpd~_ND`uxrOz^&ep@CtUHB=? zPYODlspmnMhH*eYhyniRG0cmsVGa2K4UQMtGE%^dh4xGV*70b(OaeJO^$Y)_Akfsn z*oElBnqScI9ZeaSL_ow~o;#Y)WFD4g5he4nKb=y>Y??Si(=^eUDPOqBk`y#rTJc~x z&KwrJGayK3Wrde8nxe#Ft&VaFv&?!FOrnrw`7wv;C1rIfMvjq_-ck zalDSAo&+D-%YW1-fBZqpU{)L$^%Y-EIlfD7sUc@DITA`g;*$j#>Vb8rk1gaCp{zk# z1=J)fhiflF5%snqT>%MJI|9O86(Qniy&e?IHfs1-xad3omNKGN7m;gjK0n~wuS5BnMt^Y3VYws0XTZRehc z-psOem9SogsKh(*`nF=Ya)Qb0gd5R~iM8FymtQ{rr*~@Lek3#kC+kkoB4f@ZceSA; z)50QO!-Y;P7(;xx)VOk#ybbo5{BpF9@X!*Mm9=9-==6Z%aJ9Rj%9Fy~}aVDOP+MFrN3kbHNO|B6-0hFu^%UoMgnG@=cFc)TK0Ar?FAF9Rw^!Rv_dG_jluU zS|iGkHxKlfbQ#Z*@&vWzVpKg68aLEJioz!Zsi6$e!WZywWNws&pt5{GWkPaxmd_-A zhM5+-EXBYoNwFffeM^%pr);Lx2}pTc;a`Rg6)D4J*&Qbp+2DH&o zqiNOUqShB^)sDh$!`0>N;sd89ivRY|rh%OLQ`p3hfLd@*C?d0c-QS%>Rlb5MD3Bw9 z(yRbRr)967k{^J=MBI=O*+_flzJLa}MJ@*QT!^OAhFUgpIINx~ZIf$YdLyUCBnnJN zWy!7Vg50W9qWMzcp=*Ze8CRwE%+t+jE2#iQ$kPTmF_pr_wYuHpkIhUce>ZK_`{cCe z6!Z$C*YaWSUrip>K+qPe2+pgmQMTsIxfw*+dzt3~XAj^NZz!`QV32Zp7WULegMBUM}eLR>6oeSLl@gEm$*GE|Gg>L&NddPgDQCX_AK~ z_11fcoJ@-yL=|kC2qcuT{qDhqzik`>6MeT1qk!;t$IAOs5f6l=_{clDTtzq}O?9U- zklxK{wF}8xLZ!_}b&X$SeN!0B`M30*heGhiH8m^#vQR?=$8r`D+z=5 zacC(-P_$BU%jjE{?@32s;dia;;U6ftr5{Dfh6d#N^)F^{5XA=#2<_yTj+dfx3 z2A>7mL>+t~pr#D`p7Ag`TP+p&HnyngUE)5cA;@iL9_6s4<|PTh^MIdagBl+jV7urqqYAwiUgh z1~BwsDOUFWwO)sgQrZ7EPk$iZ%!g%B1*DF4)B?=_N*)tw2^`PE_ybtX1wOL65XxKh z>B-YVim7Oy*Fp%7z#0JjqqOyD)cerX8`=TSYU$~xQE1eqLsI^Dcj9q!+lW`K%iZfx z_n57OMc;8q${!nImOu)D_-@$@P7j|{?%9>os(6i3oFdAZnlDkV(=gsH^{f!HKKZmb zo>GcPB-*J}PU z`c(+^@`p=@D1fu8SvNA+>iR9^es62-@e|?sIno-yd|TC}oo{Skg$oiq#;%B2iY>~k zhSEZS1KVOh*&y|4j`AbSxDsBd!}U%;lWnMR?xc>IscUf(g{$J`l1vY=YJ#e@S25N} zVy+YWg$#GR_k2BX-4rW&{dH@ifG>8r?cj|Y4{G-9U%cnOa%OFq9i2Es6GPXP3I3wF zu%zCOs^*6EQaf&#ksicKFIRTN^6~X!))9Y-*hY(~TIQxD_CCIilTDoO;7UoROP|#c z^C|aPakfU2Rpf-$Z@CD+M^jhpaDYd92<^3N%H zEY`kuf2IMZqZWnfD_$95Z-2Um)EZ|>-FUL(fxYQ28P;tAXJ@|+PSFMDrZ^WDEZZJ? zR`)R-0m!CDKdd4MlRb}M*lVI>Ixkp?6SA)dY4egpCYJ`^u^Uu2IqXwu&+J#V+VUuX z4$X;|Zo{}ITbuW3j@~iIN6!DUi;Y~M9EZ&Z5{Q?;O!Q5bzp*LBD z@r%C-uhLyXoO#z+n_h!gY6}13rW!A4I;TCuM299(>$UODE99p2+iCT34E<7cxYYe$ z(?Gvf+5G=mv{;TkGu~dI4sk`*u=y#C6`zNWi zvmosi)a^@B#w(ciTH1z*tt!4Ia@Q^ggo7o`7D>SOWBds}F}T-a0f<0Vcjps73R$}7 zDcQVFBjcVin=Yt2dw4P!m^U*Uu56l*`1MEqt+geN{I28(kHFf+gZiLezg)@`P!L-d zx%!If9F}fP9}@dccG>n)|KcSszh$HG6gilP&w`$u;JD7QZzSxa7f=i?ze|Gq-YTVF z4r&X@O=}}ToKIF+@8$cqS3h098{gbqjeov)d-?q@*B2LW55+0;);O6Jcwr_e7o+(H3B=6{_*JpBlq^lpUh5|9YMicysaYvNc-+axsC-Hs?*KBoo?LH$S;RfP^s9g z$snpzJ2fm_`V`4QMC17)Q)ZR~|tdu_c3Y?md^R7%c_Tm$P4yiPC!b08 z8BOYE^FNhVT~p&W6n*!vxCCb9Fd>0$=>w239d@_fHpA|eGVM$z1B$K0ZXC&#WY`Ro z|K2OxvMtBVQu0D{zs@~6x;IzXX_R`SWA6_Z#3_TNkU+yQ<|_!K;F>PrAF)tF&-<() zh*+>zxlfp-NgPnk6fCx&BL;!kY$y*QrBZ`f=4Ti>gqw)+l}Tt$6y^xCgu!#1B#@;c zrYORTYD2ga@EkD?TajTw3}yT2jV+>2Xc2&?8BLNcNVXAAg|kRP5S$I+UNLyIjhwJY zJS|`_`NX6NFQa0OEgl}ijo{08l}V~&!9DK;j?3r^L&Gtgz|S10lyqx)R9a$V3Y*bU z#a9w@riyI$imsUFJw84fmL>Z)izNdRpreczBil0?$))GfrDoD6Axjgny--;YFr~-< z{YwaH%LCFko?+;dCNT7xd4PZ980;qq;pHXBq-0z_q*O<{9lU#oXN#DRuq1v(E@MS` zbt@M#<1m@PC}d9~p5YC>pS(LG18d!I5)q9?@C(ym${1F$ zgr}JHiK$frMU2ag2ZmVi`|y(El}u-nxB|AB$-BXBLcoDFDzETHmTm`=kXH!1C+G}zgJLIW=Q97k zD+(Q%_zzT57=xj=D{ZfTS^G|ne$bhHLv}+3{?}i>K79N#9n`686G!Fs{)vQ`klDP* zgD;fPAOgRUkg7U;6Y>%2r-X-ZOR?X?q7Ex@Sz==KkT>qzAg6irXQUnTjMZ@^4SR5B zHph$vYqllxIU=xU4ug1)(7s3~l`EG!d?n8C+LuiJkh&yuWGu*lA#>G~k9}m7eheLf z$T&i)g8DEX!)cR}XBlgjaKCpebd=9P0md8WNKj6iYV_qbdJV=q#DuCfuK~*L^Y#ij z{7I}?>rpgS)zy@t()LqJrlP8*;wri0+-$7%kNjC3F$Y9vH!6Icc2T$WxUyF z8~B?sZCR3tXBX7%$G=*rTx74Hdvi_6Lbu?j&wqCobiRI1819X>8Qs;dzg!YCI9UQ2 z=}l@!`h&usCIsfK)sWBrjN{LPb(g<=`MdUetX{93;O+N_L*Op|A<~fjjBN0wXjbrr zpJBrkiA;7HLb~ld-yqJY)AG#N`n9P1x-MG;upkmZdd9KFJ%k=HtM&V|bZ^kTFdLP- zlaloPv#k4YyK(#}jty<_zyxB5F*SNGUV;qUK1;0lEEkC*Tc8{pPzA-Tg89;7Q;TV?be z3YWm8%Cy;9xCkilP)JeqW+=FY4Wfd;7}Eqk7t#X#Jc?Fj10C@cGKpoHj42V!PNrz~ zoD|KZ4OZGpr%mJY+PbPrNj9$1K!60$%e*qUl@`IG z*-3#mIV?`K+M%&jv^^Qxgl^Mw@>@cu=*a=6R*2ddRE|;v`BLQxT=|q19l85Lv{JxP zkL9dTqG}Opq$`6>Re)5MNckvAj$sZM$zQ&oPRwr4oUc zEp%OW!j*P1Ylha51Wx4wBmzP2lWF*+o4Bv`jRJ%b$G zfYl!%Hks`sx{h8`i;)cxjvIPDa_q;Hji5)nW9NR>*^@j5D^>U)Y-6|*#eej}?jf0- z^blN)JXpf zU0p6oJp~oCvdhIHG%M*pZ9;Ds-7HOpyz{d=tJQ^0o49S@*kWlKV;X^9^#2EKQo)Mb zFc7`#D~4TIJ0Xeh*@aTJm)_fRtVoks#2RU(QBxE0?;XY7LZJZ@Yy9Tv&3p6qB@R(_ zYxVpL-zl>mM@MI+zFG?$UHqzv*|r)dMaaPZP)M9l;i84aU_zyqeM z%eZ^c|IGS~fA#1SV``gO>b^v)84o5{Y&Osc`QFXbHLFD+tUE>8V~*M&e0%g^dR0o) zw9TSanoosHl?v?&ZVKd=kV_)C4$cg1<*uA}c~sYlD$LN=X^iW^1n)K39sC$v{yc%a zX6N0gQ}wuF7jc`)fWHk!2FFbXkD9oGjtC`-2aZ17kpt2%mjZbt7RF)*(77@&W`;Ow zK857-25Ll(N+?+Z>~1- zXM-#aXfUJbtqjXN5Ki+7$t_40$vDhAWigw!S=KE-43H2m5@)Vfvd)+GpUnQ7LZSA_ zSh(F1%C#8}QS)%W!^?}*mi**s+|v@zAC*+WZk#X>z56RhN+npdS(@vnNmX?ZiPZLx zHoY{};=llIz$Uh-xYE%xC>zGjC1jZMwz41$B-^fQ4eGw%g740C4N2GCYcA8W?-S}i>N?AHfwu3XWPVPr zRqYSijGPYbp>tTODy2Q{qb~x6t%FjcsL+TqisqTEuEr+5lnA#sABF?motAgER#d|7?yj6H0$tRg4TA%7=!`*rqCN zS4U94JqOa~!+%+h(SCc59u*+u>v`=;*W3=LagDaX{=@#^e#s6mk|{@N;%+bdPzNyL;o%Ht=I~JB!^h>M^t$)GyLa!x zVJ;+1(A|EB=DW@_ia&H699PAnV^Vi=%Ij3`&C2|6h3x-j_VPB*B3he=Y(7~h- z(#&)QL0KzAS@0HwvVtG85uK*82iy1wATK1?bmC4mUqlm@v8x`8-SIJzvb@H}R4|^? zHZRpky;>^7tl)9WitPyaiG)O8kf_Kqmd8vt2pvIMj1hRj=HgBrIzA6o4C{|ddQK5p zg$2J_E6gTLEeD$pPFH#nXH>HI9I*bbJ!UCWb~lidVigEYVudKKx1~~49v5|3-D#20 zBzKpo4XS(w8-PhmCCg&0^KD~jKS5i8T1Lb?!@YH}QS#&xCvQw-mM)hUH_pZ-;{vI_ zynG>2v-*Rao~H~>PM!x)lxmlV9t@7UgQrhbB9@keBk;{AO;@c{G)@|!_I^A3QlT*6 zMyTUw$6qj1XlvV`0fvO%jopc~bu$SX&GO)W*HaV|C5;&DYsqAM$5T7B`Zat-#l;Zi zP_nmjY3Q{~(nQXO&rnYiw&S5H-$$n~X426EBc*6pL%(t+r#v_6sTVMs=8@LTwpo71 zd#7u%ZZsBl70f42P9%WSHysSFV95ylJBbLjd*4p#!29=lRDEz%pa(m2N|XSTHy?#m z5_AKs+U^S0fp;}dPIxhcoXuePa+=E|V+U^|rWxU{9j8o51v)|;!?Pnzi<#=0E2t(y zZw)q8=fi`+bNp{jv=qXm1G|raY;FIt`2hd6&`#7LqRr;`Sfr$()$~OQ+Uz8>vxXH` z$$T(%wq3Nj?|2{T-ZxG@)AEvXnt{M07xP-Dy4%ixIY`%Il+7iQToy^(qNl7-kY%x2NPT)D1Nj@&+D12BOYPVxjs-c7VFN8m7u?skqLWz-@^*vpssf z5_{td)Y4pzd~#3px?TLbC-57KZx;~25;X%8FQ^jjbZTa8Ji=#<>`4(L)m7T=2(klJ z$KQMX^7-KSRrvbk;N|fj`;PYotC38kNASCi$_{mMtdnZ_kJ@9R!L6xyO|J?oP zm`@4gyxn$xAdHpp`>GR{qkxrGoDD6=016-Yw*b3;3&a@j#&?M7uv&NlOA@>R8nt7+;=e( zkx%yY2_k?(Ts?j?w~Lx1QOX;VQ6D^5hI)_rRa0)>IG?Dw_5th$J+;q+H>3WG@KW{C zu%htdoU6iH<)oDpJ0TUzsuY%uO`YA^{^7@;er{1&SMA8&i~X>Fd>HQcU-h5#PYzC0 z*g98Y#KAZ;T_wR{v|ifP9yq9atyg>Cp!DM7E4W1$u3)!s1go9$K@rNZd0#(~uFU4@ zN&l;}+4A&TlCR0Lu&UcPG|W8auApFg!dLG5 z;vMaq_TE`W-TzJYmS$zjHu25-))W}L=pP=fqAIrP&CTsr#pQ}fTY<`Mp0EbF>l?Oa;SCkjK$YOTD7T# zoJ(XlF*hFO7SUdNg!nG}H08b2i+R=v{3c+#|@$@7Sfl6BiE> zrqV-7K4W!hV0L%Ms;X>^_xH1oQP=Yg(srfeeLz)6Z3J83Do@5fb1J8&VFLJq_TZKY14jDuSW*v_OJH+qRG4GVg|J6WL3{%( zkid-k%@kZW36R56`)xS1kE-h=L9Mg81f)%F32mh8gR;z^YGY0sf{obS@-8`Kj3zLB zYGCiR8P~4X3cI*4jsx2@x?%~!&(0OqX%N)9fBZN#yyRy2@g+4IN3zB-yleZsQt}ff zCeUc2u%9%FoYf+60~L+nE&%#bXlf-Ox6qZLvRVG_X>4Zq^t(dW4i%xCW83NBXyj9& z;)PAmhd@;!*I}8vP1% z-Sd6m{(SEW^$b3ApwJ6b2+z(|R-MHkmo?-YO))xLM|Nks4(^sW@$Q7Cs_gOYISnG; znq|WszIuKB;+L?)T=(#h6wH=N4{ha^rxa$$hpVTu9BQj8%<6JoWgLWFfTmc4t6JWoL~+ zQfndtYk=w1B}6n9qv4o-N^P)<%ik`3-4ZIC*OZ$0LRlTkUNp~lL3U^#`aRd2#GM=5 z62J42;(}D_W(Rr?uTWfau`AyB)T`~>i`%2l*Iz_zw+>q#uCA~2PyW;OsTT%+Crl<4 zB_2JLm(l3x?30$_xlEVQhtR5sA0{U#*JRanu|`hy9pBNJ6bVM{L&4J&MYN+DHaDif z0_p!8!F4gHkSq7{UMcrV`4viO`v=qiODo^LJHOgXs|EvKebj%kJ~m7zUx;^H$h|z zYs=}SsMAf6ZZ8D_Y|tWyqA0wyL`j4xlI3GJhT;F-8S1gxhg0_u8!%+f%r`UNJgA?3 zHjPR0EcsBD;5F=Zu&^n)k$S&G(I!c5Z*NJ*@_&M`9MVE7Z^bq*SkZ8=wIsdt9qA>> zt5VaRE(u0OEM|-pMGOfYNC{Hw9aIR* zCg#h1ix8ENXrM~4oR!hKn5G1k)h!)czDyFpPtOoNI__ubh?ibMn%^;-+o19xV#+9; zzl-X5j+vb>eEaO8AaDV;|Li}&Y*(wiEq%TN$2U$H*PK+NSAjGR|2NPh{U!s0zD zr(u@0+;dBXMQ?YaJyVh=rrr;2^ z)V%AMhTU;6+_u6wsxksmb5ge<-Zb<}LhAX)$P{+P9hZB;OGx*gZ?RLEp{RYsupZb* zo>P;1-WqM0-4ozLqqS@o#bily#+@hs!gs^Ko;08oJ3f@~G2I(xYe$?f7K9al7l!%f zYMGm`#S!Swf|XZ|_r|UB{BWRRD&+Zi9Ls`({MoUZC&?c|6&yZ%x(+ecn@`aj5{dlA z@Cw};A(7@NCn-HsaxPBb9$ce?EMd!mf8j;&9A`_^jR#hBByn&!dP41}%pF~2>{${i zevhn3&KzHl>nK{z(ypBA-kLHWxmXuyV%OTl6H2U`wzDmnDZ-SG-)SAR+9D_8BM60I zwq0G=R)^{I>2CKR-%fapod`$1Yi&!0PT8_X`oeZ8^usdE6Ug#}is1}H-hYi@a*HGP ze6lFICk=pwCCO0R-UF8C!R^FZPpivIeXpcuWgZ9p(Qaq<1vf*VjiRkk`82jFsJItk zHitu84LIDh?{ExI`7c;ha5(hdH`;EBU}<%2s8^52C;s8@bUvWa2Y1QrqA0(H0B_y^ zo=8}@k2k3Jh@j)~qTi;+_-nZjRzZ4xM0njDpOeyEZ0^PEU-v?|g8FeC`%qq2LCTvG zN*&*{cLyf%wv=4WrdD%!534Cp6Q37{spj#bPan8+dJjnudT*p+=Y1qNw4E0pLz&Kls>|q#93jh@mTPpRK)C7r zXer~c3Sl&z3vqLMCj?A@=aEythgT(WszJjDal+59g?g-lF5+4sNnyu;9zvgZbY#AV zs|t2Ii#1AzqLF^twtbD-6f1b(>E09{i$2iGI<(Y4JZc#`jL-xWXwz4^L;V=3HP)1& zYpNq$qAL=97qo*x54|3qd3xzqr`ZPD|C;dafZ8uM+;f&jV86i(A);z1{)qI|JExV)sZxzhQGpF-r>lilrJuBL5AX}`QD?N@DY+cpsXu3vFW z4M+}bt80g0NSd~3nqdLbBuF|8LmJq$L|dFCQ6s51Mv?vY9pCigrdfd%>z5gUW0Cjz z+}%U!#j7f-f_OK0@&rywsYsr)av21NX$p$NhSvh7DXnt8nV{q}2xhaHRuS~inh6SF z!b>ICJgzcU-f5X|U&{pA;t?+wY*`DU7%zcW`kzGOdF~&8pbb`n$|xj88Y&`4K@}A+ zGd5=+E1IwcqbU$nC{ag{4MYs%r6dKuFzQx%S`n4a;FbtR<~bcsjJL+7b+~K2lYDms z^IGXNAwk2|(MFpqV9itp1X7k5S%DrAkt8GKk^<=&9R^&$d;=CJj6CHEO0I0)9W`E3 zmpKN82t9!d9kext$c$YU6I$Lf!OMb{YSyl%MA6P;(uH>hXOlM*NNOQa3BwjNQ5>UY z(!f&*{s*qK8?7Bh#FBRXNJ`VrBSt5w=qw0Y@LM`Y5M~fnL`tAVr8Xe36UwEo(k;nr zI_#&2aBk=6s&(aXuUg5-z_}oGuG})_At@0_hJCO=ys>Kr7l-eE8NnpJrDe)RJjXRs zrtnvc*c27Vs5@IOoZ~xER5{gcQ%ka>O-m1KNC^ED+eg9yTn7MQrxYO^yo4~Nw>0OK zSr}=FULCB=Bre#}F2oZH+NQ{@xP{xwJ$w2+{ylyE^rz>~pFOktExJ|)S8w)%KvETj zEo$Ki!nl?q&Ur#|JAOJ#`zsvocN9=|D>>W_$O3ye3X`0YvaYl}BeQ2Cr`kji$AD0y zC1A>+PW&_`xGHX`2r@3w4}ua7F?xXU%UWu?`ny>&vDoowqsKtv^?KbG`dq-D$TW6z zpq_EA>gAFmEu`?Pt?ln_v_)N-p;bh#B+M!1LUn2e1Z>R0D;STB5|PM+O{DV%bO@us*-zg+$;?z zNY>UOj-5;dbNq}`Vz`b=$>uq2cw1vSrwBrg^TsWKUt>@O&Y#2)UQ+7?ouoXGlg3j_ z%Q(k;q>8=xBvVDM2@!VVphQlU6-g+(b!>`lsDbs5ACB)5YNGgXS(nX&Zq{A2;OGWP zj#bnY$t&Wf-hWMMmEkge4s&`(H}HmURvccesQO{Un0mb|2+K8tyfpIegsYJ>;ff-` zGPN1MC5p@mhV_D#3;tUA_0+9*)vJwQ%S-`I`j0)IWmx>*D9t;h_wY< zb2T=v0p0AF0d09`guPfM_8c6-M>E9=PbK?Hf9#+eLkD1H#ghQewHCO?W>YvpQMcSM zpu^7@DeF9Us)6~(77%qLzB{loT?2xuT9mM3q;|Yxn(K*1ZQZX?cn#wPeEcXVQl_Ma zfbQ=*CydP*Zo=V1rvFj#QMV7DX^(mgAJYkY&RSiS3BE>BT7w=h#R}SB9)(Aw#A^*K z7!JK{2)HmQH8fedhOlwrc-KfDo2Hb(ePE6i+dc2din@7qT;RLXTon9$VvrQ+8PWon zFJz=v*h|_g;Xre)CNjP2sVcHWJoKg=IL>y@yAB+uGpQ9dz1*~}J#g^Uo?B>|8mCPTO$g<4h$(*P)BQmd7q+IH2pIAQ-EN4_Qa>4SlSV^MFM02e~`4dZ( z9B`yU&@HkFf?ZFnzBVVJ7&9UIC>Yv52Qo?5ApC?QX10YX`38KH{2 zSu0h^`OKM!mvE&N7+20{nwE8;X0+lnv zLH74yfels1dk@xoN$iVwUJ173@3o}H%QOc`_hB6g;ZdxJApna2S34;QPK}%ryu-*U zFE40LDo~{3ZdnpuWV`}3;lI{p1!I|ZoMGKlkz8@LCUwDou9=eoXz69iGtj+Q<{X%4 z9awS6MOkcs`%nRl5|4mv%lh}<{te=qY%pvS^7R%TX!DV!pc{5oig%&x%mk~}l4VKo z4Y-NDr<*F*F-GKevn-44luYc^IZT^qA=}*1UZoi+K_GF(C3EX(6NF%u0F*#$zbrJ- z3fAbWp(DoSAK2LX9w?b$MamNL3d6=oxU6%+m*6=?S1WLsvnxaj#1bpe1D6nWS+krR z@w-kpWn7nHUg?xpR49-n1H)ui3aM?tXu1Y@s#0=QiY-h_^BUHGi#8*Z;2E00&D+#c zIYLrVG`j*>$)x2o(Th#Yj7dx)l;YXb$0tOtX`BSF)@(~s&op_nGyyDOm%Oay6EoXP zhItM=G@k}Y46PG2o(5NI4m!zoS?3uhp{!Vnd77bhm9;m{U2*}6D86Afx-NkjBgVQZ zqly|^Tg`Ww+ZhHYpzSg9r7Tmfp-3l$hn;{9A2TG+hFY6N;;FXmF4K7)mta@tOVy2xPx!WASOwbryc zPElkKu>j%Bz?TOHhS!BLvN3Ee^3j|juTQ@N7J%Ya$qSQfz6nj-uRNpgic`c?4?qbKK= zAmH;QDN5DktZ`v21XAdb1Nk9H>W#~1Q>D%&6Oj005*Pwv2uK9M3{gwgCB~4(M7fEX&if3wpEO-$qO#mcU=&o5tr+kcsgoh z1O0k^v$Rfu!Ls<&Wtt(>bD$2NyHbmB51BGvs_dYVTrjA6?2;Ln!CKxl4TUM?c>QU0 ze`+d_>*Y-4Mv!7Mg+7o0HPj6Wf9S;pfa38%ysL+VwW82OL^vgH0s_C#Fa04oen>)F zDq$d;8XDIE=y5YoKev=P9O|bFJ3)6-6@`;~x2I#dEHI5m>}H3~QciV~UE3C zr|EW7KRxDGz<$cKL+s124SA3A4P|l>#D{xQv|^uMig zjzDV#g@PQw1`8^@VAznoV_V(J0+Mo?^IvdVXSaN?J^o3S#c)Xk>eCMHyS2I{VNBdk zgpH)r=oEji+@ILR^xpi%D5$sql8-C?TI7gTj$gN~EFc0xeSmf_^HWI9LO(XT7^LU8 z6=va~zpSiaGJ>P&S>|)t%BmiEcZF*e=uquHTr-+sSN2$MbKUAwA}ayg!etbG&7gl4 z*5FJvHuK6Vk=N)Mv z{m1i{&wuzn>}`9zi12vfM)9yGYnqqEACxrBqHs*QzEGYdO7KmjRa@zIIG6hs71F$p z=!&UYl?_&HCc7mfB_7w=%_Uy!$B4t{Ho3FqK}vGMEcWG`;w>$)3WPs|DG zpAcQcaIt!a^=Ssy-kLCv1s2U zjK$&zk6p3XvFx3Ub9Xg8@kYab{7plHW!H!OpzEK9-ZART7TP;FuEr}G(BD+oGy>V$gzYvxK*4)fwmk`jFCW+Z% ze{7jnEj;TV=IWgjy$$#q^3^Bq9%qhd-*UVezI$1VEfv0{KGuobG^q~Lb1oGGH<(hX zEd;mRGYx8J!hQbW*}Vs}fPW1Bse7(RZ~V~5jQjXzS>CvPo6Shh@#_KmISlN5{qHS0 zZ^_N40g$)NCj9miM&6miezv(G_gNp$+z#|U)7$G8M)|0p{?4xp zA7l0Zu~PmA)mQ6o+cp&buctUme#kZ)t4%M%)UCsoZD@gQDAE)g5En5m9a)5BQYERT zMiHRzusva)WQQVUOOBGcKnk=00!xSI`kfo~{f}i{2GJ-ugp-_^OR1J{iU}_<2o4Y7 zxzL6c1s96|;QjR{jQt)JnDM;t0(}?xfvFC@Y=Air{7o)Rxdz)X~#USM5ek;7RRkqXG=B z%7V(Dl4FAcIOighujzpv4L1e89*l z)!az6zPhRpepXB*xjmZKPoDe|)mv1SoJ(y4)ucZ-#R8c|c)?8W6xQz-CB1u=lS(P; zQNxnB_btnL)C6N=JG!xEEjpgE0c1?2k+G^U@ux%c(&@^oqF8_N=p6LG)9Kq99#6Rw zczz>Yn0__D*hW8NdZ{}N?x%q-9;8XTX(_pB+a7_~7g|fODZM=v_*AqMG|A~xV7-53 zsX@>h@|MM^qaj$(qMOT#HXbgx5Y*BjGd~&Y#4#F}Cg&PxX<{u92cJGK`^`Jcdebpr z1G>Syk#cLe-g|@4OZFIUkZv5f&3;ywbX7`!uz_)O|Il62)u;p zDcxrH3V(f2K;S1L!iC^Z$*rlJ^-_XeuQj zY_18!Hred|M6RN@$C0(6qYx&r=#6JcCt=hq*w9(GnK+|c)gPX`<4$YSl3NFE4o<}< zuFt9H8-i1DeF9EJ-}tlgx6Qt(xP9=E!+!2v!@IpL_m8k|3x2^tws+qCL3Vf97ZskZ z+GkjlsB~axf3*`zL-xWKd8?B)9qdL>98(Ntu(;NH!(q*3|Bjx%sZgy4=iywY>kxi; zy3<&VmErhxTPjDE(j-0j`^b*Czlig!9z5e6aW~*P2CeghVXHIi-JGIM2H_cMvst9| z^9%;x^ktivS)p;*Fv4cGJBQsh?j{|r&9sM>&zSZd*!)Y* z(-g&RDEcdjyJOHNu;4ns5!rZq|G9I7?*ik`Ui^22^7g*g4|But^}~E8GvFG`{{eMX z+iu%N5PjdTm?|xJsU$kDN}VEcg4RJE3Il$!1$#{nsZEx<%wFIyO@RJG|FB=uy^ta$ z%LD{TbK5g#&MbfXz1wx9$jOTra4EE*oHNl7@}{c5Na&?ia93f+WxsZjcZA&E-}@AW zUo2AyNhyU$ks9{oo?EIG|WCeL{70+|X)1gw8hjZi zy-t?V=Y$bGJ7c;{F)FKYqc0}7dJOl(g!r2zp6gCYIwdPx`nY7fB-`v2*-P?T(*_B- zti8J7k&4h~l*ED39;7v(ZCRq$wdG!Rp0RjHi(Y?Y&$KqE(&7BgkmGR-*f&$%BpbFP zFNmNm>W-EO1IxI)ARB2IAtv`7p49!3fLwaxzb|Ja#xu2fLD1RB6jfCA}>*%3=mNygWNQ z%jOCDQEul}C)K0!TgOB|TaGZPQnbHoQ8kzz_OOIBI5TMGQp_APz67fw{fX(j5R(oC zGx+`;oYjkWFx`aqw6*O?`RGd=yMyVdJIa z!)nSko|@j2?=2@sIfZ!3c0bkGL;}MR=NNWC@R85;lI-uQ1lHi*N^PpF_~`lKy<_#+ z%WE%&fu6W+n@#6fKA!*n{MG9n(#o&>8~3h}ihUcmDtU`kp$aITXyin`)2VU0x-xx- zKAmP+b|Hk^D7n!5YmDj-JJqO z(OhyZkV8-uGEJ^5A~MPH5knC4?_J7P3a2?#0CnKb3}$3Zn!68!`N=OE0lo0vk3@XIh%sn*MkhUK=?y}up;=~+14C#kjXg9 z*aoUWgz=iwS|ZYUT6S>kYQMZ%*h>zsmRg*8WXC78eHlyoJ_>~`HAN! z5BP3Mwh4paXTRI*wM^J3r;)FLmuI);oRP22E}^QKl}C(TDulzY3|m#yH+!{*0-@W=5oXuM3_G?hq; z(8T`!i|CEg|KQ>7j_#ICPSee0Nq+#{F|>>9MaI zCf8{JIbm^`L8@df<~7OEJC~_iI2ymHXU6&cXy`z&*m3gj8;37bx*?nH-NM1*g(n2p+`IKSwG8MJZaH?D3PkZ1@|VQpn5 zqmim@Nn44^bCF^~v`4{elq5;iKXEWDAUgz_x;w^E!_$TJI1{O?$d}HU=N5Hq zFfnzSqA|A(H~V)Sa!$3A-LZGuq;t#eIO)TMs2U+tx(On46?+yE!hI>RLzwQ!Fol2q z`Wu@16>Y-88PvKQ!e9`@%?1O?fWrcKs-8`p4H+wJiGfN%9pILra^O`(Md+yysSt8r zmlme0RcC*_?#99Qwh7}!3MN#)#_&1C#YI(8*$rXA^>wChB$&FYl(v}dyP6B97hnob2P$^>>_p^h9n0 zw?Xr|+`}Q1Oov0*c_4?b{|7jPg5BV638bo2xe%QOuJN|sCDGb(17;ao`RM`|8Qz{LPgBf%EJ0KEw4 z9cacscrJKt_G34&+hhXLpu7j$Dz!y@^sMevh(^==+HnV#o9lSDP4;C`|@#{77UriZJCY3Ta-V>(ZKRkVFl>9+u%lP+Aq#nIY3-sdk;M-G}-reXL@(%(s)Y!4FIlpyys$`0ByC_7Kp^Wd-EOcm7dh`=h3RCRYu`>xi0X=tX z>|wg@w9@~h?{;?W5x715Bm~~=&W8!SGix3%@V}KT4F8^|(1K*PySUkIz;@c?AW&>3HfmdjB)842d4PM2d$oI#qh!aC?Ii8oB8n-J`jH|jDrXmI zkP;ufh;p!n3McQ2m_ge1rr_15j(NL*c zgb^T(N^(yH@k0e{o=Nb@eJBH*2?Y@>;~wBbJ{+S=ztu`;3?ijS`~%X6t$7c5yB>MvO$SOk-g5TzOoTXF>Vf%2y$t}~ftvKT%o8y4t?eNu(d2I_)x zMbYto4gY@mV$9hVS>h?7t-bd=ln|ko7KWD)k-5uqm@O(k* z>oMiw9hE>jDN9dxO4aP$EzL9&qR`ZAj={JEJDYjvLdi2v+64x^UaziuqsP%|awF8! zQNidAP=uTtNR6pnPR(wRsL6G!ZqZ0mE(upoLh#zN$HiP}bV@mmiAslL`IrymDe2_7 zu;mI;A!*{~+>~>=`nibcQe2!AvOU7|4l9bD?-3csfB=zzUU*C}iF*o$j=4y!V$$(J z$S^62hX%b_6n#6MIw$0gg?@c|d|1#dl0xy6RP|Ve!4^3m5N&RCx^R%59#3nN+M9aH za_QgStlG5cH_e3s1~s0F8#U8{MgmHvsS!w}ncD1G415W8X?De#UIT$8hE$CNxiVgSuFP}_3doZKt%^t3Nbq~U_tRqZcd zk{8d=;TZdDnv5B7PD-(@3F}tHqY3E9yWaXq1)e)-OpSB^+RkYea#O{Nb6nTj2dln) zr7>g61+=a$M6d%`d+L}bR3PMl11jwH96T07d#_Utt?ufggXKa78b{_c;(jDa!XC?Z$T`M;?btjy`7ylta6S6;{jb^A>zgm{KdbC6i$|qUP8&AW;9#R@ z^h8xKhCy{vcOXFGcp2b%=piuMI#ZqK;J<(VJ?ral)>Gn}bqyU)3k~B`uBr>W)*jER zuK9Y?DOgq|Sn+6_Q|}fh%HtA^$1WX%eV#2Az#XDmFne=!8bEsFrJ=jwVPjbg)IwX; zEWPiB#<~vmV5$K10%F4hHh(_Y?Mc!$&|w$fiNXYS$!^w2IV@**Iq(A8>f4gJUU2)U z2k>s4b9>^yx^O0aH9CEj`br@VTBMN=6)R)6d=8i^oE--#Ot!-aLLP*dJosx8G zlD{34tOvmt`Y=LeLPt&o{``zt#QB#+UyO=axq~l!yuUGQqt>|`1 z7b2Pp@K1gh$f)WcD#2G5-`l^k{3haU?TbB<>jt$+;UF`fROQ#r2zz#=(`d`C8$VRr z{y_&?nH5DI6ydjT?e%H3^r@D6TW36Nd|B%ooZ3s@^Cr?RE83>3G-E{a)sD)R>xeTU zu}QYeEH}@o(m7^(w9_A=Xve&<(cGfZtV1iBA> zNjAw+;%wLSb|n`AtSEwH;ra%~yHbn@SOj%>gfNXVsqs3wC)(z$%+qNAgHI*!O1oArp#kg@`>X7^91INK%7;`A^ed` z5fkY%GD^dcxFVXz!Pu9Ca*u?8%Xq>_z(*pUP#FkbCsD{KtW5(pQ+(Y{+vp7p6g3J$ z25VH38BK^6Ah7#XGLOsx>BCNtkVK@h%RrIG8o<-6R5+cmB%-i*!J<&iS$sQ`K^Vw6 zSdu1%W#hqR5u&)gk}?X|at?&xiX(87!=|-uHb+^b){ZY6j@ww1S6tR+R1YISjm2i27@+Pw0q2?o&`zj3QvsNUuw%|}| z>!FGnnFJ5eH)geBy$LCWAz>2w7(L*URKK%%{T+(dqBpuh zfp02Vd84FbD@CfXa7v&bdK0)+?^VUd_r;JB#y$N!%h?~Q*xKVQ3C%x%DzusfP_B=V zz$Z??1Gz{syn9#b)pi~VV5pP!(CV6f+ZhfFtM$d`*>$2V8hL`Z*oD#Wn%@k|`PHxn z9kaKOu=a3Zo7a}{%g`8rz#K_-ldqkSjiwq0BsQa9OzDsic&lKbF_ZJ$DfOQVc{i8~ z2S|IIQy!E%!zbZi*>?ZRXk8dqeJOJvv$3VR>=@mP!O~`R$o61`YCN=hw$W$@ zzCHLZ&2HEHt!uVhHpFIszU$WSmT}Rs0O`jc_X?@m>ltm^?pzz@5Muh%K1^Gw%i&$V zaGs6thMu)TvMt2bm?dc_7w3XKFc&$CIhda;wGS@>oR&!N4YU+=n!lyW*c4G_P=4~u z6zh1jLL;j%69!VZv9LIXr~kqNoRshtDY+<6^0Fmsj)dZsupI=emt5%uuV--Txv~=L z8*l}}aw8>Vy4)MFDjaZ?gA^Gmiy+ien>BYrt3H$xIpwwjcU9l_ zZ=a@*zos5)DI`*kJJ@jxx$wjm8;3dUge&NauweDZWJrT@98k|N2oztVEjcAWV=46> z&FrhTj%1KLYvGBj6$XC;pvbhc4t_p7KTn??A%Wg-ma@T{Ni>@ed(`1;%FTj^gLOnW zBUvi*!~tJR(!{tid=Ftk6RN>c3{|RXt%vvs>vE!=Ksp~E^JE0_tN_*`0BJqGq7H@+ zu>@8cT)mKeS-~vIWgIvB`)wQjtqO?GIf9QgBsIoS6{>trl!%=q2U#!fwXNxB9*r-0 z!#`;BM_QSe!WLS~2s(^X>##?BOJH0F-p9m%L6n9RW}ATC79she5Y7ss*T9 znu5}ZEq8cvdX1!7Q6_g}%K#w2Hny}j%qsoMr#iw0=dV(Ffm!eAuYA}Wyr zN!jt%?r+~6CE21R+p^N4Xd>x;eBbeS zz|yAj_Vr%zeG;Fj{))B?do=l{MJ56i+{xT!X)2Yu4`eJA|A);ZOYN|5N|i>*gv~<^ zGzPHFS`&=Q;NJm(Ka=xw`xAoxYDE=s7?ELM9}9_z{h2DhqK1{p+ z8I~;zj7=-CBtt}uYc#SNxqtjK1ei=1G9?01=X(2|FNj}Ky1H62IvQ+y&uGl4_AV-n+6BwcAet(+oGZWx>FIlu`^os1 z;RN1$j+w&F_kA%n^3KN6A6=0=sGh6B_zq>MGXmNg%u;y>6Cc+TGaExL`trk3%lKb z{@IKQBBUW%8e%qEGej--}OJX4V|5SwzK>5h>!0{Yd0mzW=+5gLZI1)@sP z&B0}=;Xo5l#t~8N-~i7LQpO!p_3{Pk4l8?gzl#rR@f0tp-r{J_{`iI^j|@Y$pjm9T z5{31h$iWS?Y;K^!U{O=+6}KJyvXU!>{^4MO!VM-O7LS)5>QU8^R~Au=@1Prr-1$IfZ(@5*u!wj%`}7`!cxhUOvKIRuqcsO`WyB^X;Y zeIio9(P_>9Vu>{DZ_U(}Jlu9vcjC$#n4=PMx61u^SD^G^?gD9&Z`Ov~!#6HWQ6TU- zSFaA%)v=THBPjY-y?fwL8Y5=4Iz+6BzYwYsI99$a%I;OFMA#{h@*BV#XeqXNg#AVL zaO4kjRKloO<$ifofzl_BTp*pu--d9H5ClwP< z3PByt=}~Bb(=8AYi{tGc2xO8_5uOkQR7dKiW>5YWMW56!0dyjpx5FQ)iMEVWc<4?y zvv$gWSrG$od+lZUdV} zDC&U920}1J4RajSqEt-jDv(-q_JA7Bpl{qYE4y32JDV#cu(NiqxXme@Yp;5nCS&5g z^5Ea$Z0}g4;>O~#JjR~wr=t}W!38T*U5z33KHP>SuV)zmN2p6N(#)n3lcM< z2@Y0uL~(|b0A95jJD|Wm==k33)*F$ZeDRFo%hl7z56#49FP^Mt0p$8^Glw!4f}QmF%l>`n*3U-%!3~npAgbnoTd@h%w*J=@YY>X)F|}lV`TBye$4Y>$ zmCC}qi+}PKKj!9f?4Pz)d{!H)UasHZh~N3omP&-HU0+8)Zky8!5?&>W56rfo-FlP>e}D6($8GHQJ6~MDQ0j(*mvH;#B|E;&@gnc@Xk;u1Q+%(x0+oH zmq?zpV7;T`z}vh$tl!?(Rch}%38ooGU0_`ew(FQIj*c6dxPlV9Y)FhO&4e>oD(IF< z(gHqG^6^CZ<2e?VHDtX~u!%gs0Y+Iz+C3|sY~(H(1UiQ&_x8} zY6_iXL+%>9MVYX{;J)x)H_O%beU+tZV=-ZpVJ{?6_vcu?Q0-w=aI%3$pP~>Ezj~CdItVNZ3xOf(?#YVElEosP9XppO`tULan`uNPr z4P%f@p&FMK(imeb=|5$_1EbRs{vh!qARQlw6Odfhy*t-(8)&~JUQ_RM*@tW3+`ugi zWON~(>G_m;aA|_OjT@vjdJ&qwL&vLwLZ3COQE{>x6`9=#95K{ce>zGl&MGHy62G-o z-*4J55Pr{Jabi3K#ESM>+OCLEsnXVmtO2Us#lV%|W zJNMmp_uct&^)XL#h%pjOV`!}Ak$tx79L@EI-Y5u$eF&o-jHOi)zF=Hpj3rz#x4+G3 zf5FvF0Dbzwozh@agk>QFL@Hlvo}?C-j6v`Sr9t3wsdUCHS8@QkKt^XJ$Cbx@zMo7V zzD=F0B^O9%%)*Kph`9@FQCN&&#cfJ&xB;UI9U&3LctMz95J;Ax$r&Af!d$2|>iI+o zfsx~*WC~)Ns6tw{5IFMNdyAS`rN>F4F=3XD1Jc46ctZluDAWw4HE;02AvE|I0Igxa z@1K;$ZOJq+t=YOh8Tx0gl_l4dO}AvCKm*q>dm?84vRIH>B%-XynGj*`a?eY};+95R zXbD{>$NQVg)yTiy1P7ti#uCMQ_IUX!i!;SKEP%V!VMN!;U1R9Fe+w49oVa60Zm3%{#*jrRG^v4x zRhN1Ru5W5!TTL(dmNKkt1|D-D{2u$v8Tj)1{itEL+0*i1H2mFAn2%lN+ky6L{-{}r z+Bkt4-TZDg|LPHs^o97&g_xvFCirw}j%+=K?e4C5B~AV&_t{eJ#^#Qr*;{|^cyC|P z-b>=(@mME?8|~BA2y^E%>`bd+5A%-qH1B{^mMTsZ)QHq_+YiGnq3xv}3lfuAH;_%jX4XH5-@TJ<-8STsHGH44_e2 zSz{KdHj1`%4j7lS(VY;}F=T24kB+>9chm>ecz}gW=ZA{V6XWj%jCsS0uYpR0qOlf~ z59iwKO9JUMSfkKI1mg-{SCWi(IRuN6wS&Q9d++V_Y5noJPNNEAku^zhlo7N^V7rD; z!_iR56%!%)rdG&C8Yg^bDuk02#voaI#$f#!>#y}mVMunIg)_zo8&jcgs4D=T2%V15 zDdHl4S7>&O&1sx!`?g!<9fLHAvbG_u1m^b8SH7w^Xxbu^#< zr@wjUF#GMiimUhrom6da+At9Qo?mgQI`JX~+E@BQC&si%+d8e?r!gVdxe#lKZP^YK zRsHWfCm}HdMz;tNl*ySBN)AA0 z$jG)5xGwWPeVop|+|4{xA~GZ!bFgL>V&REB6b@rp3zw2dSg@)v9H~%@L&_ONkz_eq z&B*u;b*46G=CenR+LxnV3L7{+DC^38Mzqy|QPJFgjN8urp{V_u6WjE&%Dq z<8UBb)IrO?&UijN%_TZNyKZmXu6!%2L01?Vs(T7-TG8})!I~XI+?m61&{^GzN8O&4 zW01RJJB@iyH^M2l^^GzfH=^1ff0X+PlL>Ub%U@Eh>6Y;$@0_Ag?ZgYE3U}=;Q{_wtB`deZ^}IPl{Ic z=nxV~2WpFRWI~)0pF1J#Ejc#u8N|K~sn^26-%)hXl^Yo2)%SMXHy>Zk{HkS#%4wld zXRZw2%L0TboIl!TZO5oTN zV&T}4?Lbk*zjtD`_E5_Q&zt4FH}delDk>1j6|)#SZzcB&zpK!Vt~!G#>USaL9eC8< zXm~}jL4g|>vL=2gDNdxhi=ayvo{R-wAmp`Dz)iKYa#eU>T7Z%qwL_3PH@0M68r_3R zAtP)faU1$xrsMQ&mNuhusgN+{Vapr{*$B&Oj{>&R7nG3>oT)8GA`+NTPd|z@E74Vq zzzJ5$?9hIuUmUB3E_ewt=LPD+1Uw}vv}Q|^BoRtduZ;(yT&>VTD`!%*fHS2s#@ETw zZF8DT+!leX-Gk%nwt-Q!X@8ee&)oV~XKKcQbQ_F7KFc7@!E4G0UNroG@S36Eqv<^@p%_X_Dfk9Dg zi?B=*BqiHu^Y2~C5BZ_QsUSe&k~=fIJG}m)a}62tf*FjhGlILZTWPez&&ePNdL4*) z0$-(55`JPj^QY;~OV{u34}ClB?s~}G zW~>|4F9*ii_ZEN8q z;2%v;O-n;D5WMGC%)vujq{VAnKZ;fm)QgB0p`^*SFPJ7FyRRQe|GWF1AckCaGLxCv z`E6+mJh^Bq4OnV$vXWCFzP=jHjG2rua6>GT-7jC?mfcsI5J@pBI9P@c zU9fd4#F%7v#KkK3KqclA)z9V8QR(coi*{tjM~HF3U++v6 zbQDUS@y9aX26{@n*2G#Qxemo@<#N&tt&@I7X^RWBV!NdwekHw3cbH^4{ZIen&3f9| zoXrnKkIhcQFc5_Aeu_P|6>7zq@>4+&NWcNEm5{L~WF^P8>`l@L@$PImfV7wSR{FGs>|!IpifyyJ*K+=|Lnj{y5~5Uj^yfTrbdTN}Idm5Wl;* zp`lRnYyZhV+3jAJ^aFYvU}xw2q0@X# zd~aZ-2VS^G1w>m`gPj zQJEDOZ3R!Wv2!ozVI*nwg(_6;i$iVXajlw-G0ApVvsL(vIr4<%^TZ+O^{OT!79EI^ zU}@$*f9&`V%(nrJ+@IC04w2k!6C#JpUQ&Q7EnjWG_1j130KoT@(90l>Jfja@|$d`<(wD*NlEq&Cl zf~?q|B!J}dW+sOV&E>0ngBzKcbwkxXhQRjn{NHp|XY~hdP+M!lFcg08uQ(5TXvHae z-P9>lnczg&>!8H+*ap%hB&QV_{`Z~K%Z4lz4*AmWc1EwRa!{bu!ebi9D@i#W9ft8! z_L3yS9;7mZnIUW71B(_5Y+)qgeOmK zP-bs^El63@2d7am)+#)7y!GmBvH4s?slC$3m>@Wa0ELRdb`4ULqS6 zIAG2&NsOp5IKki?owi5xUu#>IJl;8kM$d(~Xb7-m{R;-F<{&j13UGl|hS2X>C;3i* z&#>3)CI_3g!b41B$_q5?rt_*5gzylPZv|Cs)#1&KyYotnjHMyZr8UfNB&BDWUrN?7 z&X(~!#F~$j>obi1s>dHr|9fa#-n4lkL6n$1Lu*xWXAsqL*HFwvaRKR_W&bA7hvjO$ z$Y1k#AH2w~;!zVGh)a=!Uk<|QP^B{LXWX9Ra^w=2=!eu%DvAf7WF9Mj*558yvE=Nc!DS_*9XGE4eU@8GAI4X-ERH{wEoX~0tr9?)t zTHv<9JwGiUzWsRcRH=|iG3H>)EF{7Ywy7K@uoW(+jIdyJWjIo!1g{7a2Z3S*+LBT5 zGnP{C(5#+ymZ2dbmF-2Bx+t|mUP zfujzxQlsc%8_uNMF#bFAw$o(vPikCv0vaRj5k%9l5p@}Eo@18 zu-=rV|L&if>b8!+?>VlIu>Hls`%I_Vr_g!UvUYC=^0NlgMM1`M2=Nc?TY}+;T$_R+ zXc2bE27q-2SYA7De_?Kbqa4R^9x#h-7Dl-VLfcP|CAVYL6%&UxC+ zeef5JQ(bS`Fcf{yukZsB=|r3LVJ{TAqF`2}kgz0dtHy-f)c zL$oLl@%1_P=fLX1Nptq5!HuRlh1= z7&~%!YI)H-q;W=Fsx7YoW6Y8#W=P3hV~@3kl00#{#~W^lk+m)W3zcw%oWS!0JAhFP zgHuqIY(THGS}Cb5PEwm!;g#hTx6S(ATE*d}z08`!R*GgF%7c;ugk3MSEWnuca<5LG zts?EPcdl+IkD%EO<~t!Zv`wIp#*h?TRnXpVkKm)~M^u0qi<1|qk0_i1M7JoPY0Vna zbGPPVNRE=1E$c7WJv}UA9AiwTbQvWNG~IlmX*N&dn-|cdEE`1pG*WCpxc>Z8(pR7g z#10i4V>24R{g(9_;QTNq0(bHYvmM4ppeqPbc z(U(b4~Az@14rdoprPRRb?Eh=i|8=iH<>mQv3 zT}!h$jiwp)*J|C}V3tL0v-8=*lDa0htTNEaNNK)G<2;?j*~~GluDc1dB#M%+Q4&sa z^v{0~7L#u&oz7Dn;re~|LXtS9VV=(yG+E(BK6Ikrz}7ttrmpPSSnvyq7Jp7rRMNmX zf@b{3vzNE%HT;=Q;b-sJ`vY~6%WA_g5JmU;idke~hs37a=FyZkg+gDDZ6PS~I98D* zA<0fn$-j53xFG~843h3V&RltZXDbT@3dJ2JJ~%1DHgp#K;wGIjmX9G3DctK|G`wQb zVu3Bpd4FHkbkC$&G8oebPsTy05Xwd=5XN>+?yCS?7oem-?GdCdjjMT(Mo+*h`afO@I46 zN0PxdhGer$Vr=WYJUTjh&JoA|&88WNSeQ`Be5EB1^;j=6riT6YpwZ|(Cw|x_?}SbT z`OKmPi`ar3Q+$3qgXbi7Jin5Jj+t4%}gxFglf$Mp;FSN1O7InlFsZa(#l83TgmiX zu0?x|crHT3ZeNXKYs)Vxwi`bh1U@Y{NQPu|H88KN(hW_n$C8C}srZ8VR;xo+rv27} zCUe#%bBK-qEVt7p)^5@E=nAY`aqHo(ZNDAxTyD^~Th0GG_na)rjL8Xv`6h)RikMF< zLS`|#nQs{3IZq6(nZQ!O-rb-`yDMlXtpfZ74JdYhSWe+F1b zK#lm7Q)aGJTb!9> zF~8jaN~Km~6kFl6-)odc=E6Lbp|%oJ^FR)6{E}R$Hu-8EfRMkk3_A&R?dGcJt*7)2 zEB^{9l*kC#lY~H^8Y+xfaG8o36WSrIObrCac7Vsra@{_18s(5vN}OMufRzKeN#bGzPkR<}iVviR3y zc?ScZc6%cqFdY`aoe;+`N!47MJk3kxjNd{?!L=+04oZTP#{NXsrYFdx!JjPDR)joz zW||prC15#4$kLcxo>(jOxR7aB!f^edzk@bW#Y@c5h=;Je-MX3!Dy4M@c@w&c1qyL21;?gHU9VwGnK5?ap7I~7`CG0(`!`KR9urzOBPkgX9U zf~w40Uzt|Xs#!jfRQ@5lua*%}H7NqsE0ic%#fYKyetMPwP=NgXH`z0f zIrHJ$4)K2Wy!MucXnb*c{>SP0$op{i`PAF&aasrki$O(jP^miGOuj$=_y>r0Dh9s3 z`}X0%-kc56tu<0bQlDcc6vZ5CR0WJ{=+qt0+R*hKom8rxH3lzN>lSkn*#v`rBw*{6 zv&XJtC2;u$)Rxx(H#UTp-_qyT4`0WpXP?&THQICYYy}MWqb(V>AUFrB%7B~2!NyfF zyUP?jr&|oVn~?3vHoZHARS*g){hImPW048N*7@V16J~$;KPH%@I+azHsfmFx(Kf^* z4DFzYYC;3&OrY54aOyXEm;T7RY+n5^?(WQe4|l6ktY+Pkvm_!Tu>FGcozPX4kLukh z=i%sITE8m=GfWfctNubBP{P? z!;Ts6kdc?9P!iBHlyLii``2XE!|hI>2NVn6J30GwcK+@3{Ih2}6%Xy0`FW)y`cy3- zrwi@D6c-*Fgbj|6ND#PNS^-`-UShmtc=?VO4VS%gn{4FZfSSUVnF2{4R@!K5!i>OK zq{Ss`mHtcno)&Lb@d6B-?eO3c5*CayfYlP-~7GA^sM$cT|6xGa*`R z9^TBL37y_DXhNFR4+gM9uQ!JblKw6v-*+L|2J^8<_IDxKV($S+wghY!l7mMh*%q*1 z2h3eae%*y+TPjR;!F()|mygcaok+F>tOiN>_Y31!LiLM$xP4CcU%sqv+R0jCQZEs# zC4yQBN0rUX+kP-Qcs1A`{AkHLxJ>X8+|8PWda%B2=~UAMjQ95nWY#k5sR}=o;s;N4 zzTvpN0dn23)5eDvFE%*T+OR(^0rjG0&uMf>_a*$lE*_*x70@!iW%Ep?k%xU}_2t~~ zxVNR_Z{`4AzrM1XCNz7cKx}myFir2Z-2e3fmRp*d+;TcJP<|-GgMH@?>fO`)_bMyW zE`)sL5scKia@DY~UMp2Eo(#h!6@xUxFsUIN3nH&m8lOnUb_y)v0G!_Jl0X-gR{@;H zYVA~B&gcYAm9$3tUd;8DcB#Q>v2HkTc^|t-`2roIg*R6Exc8=so$LPreN%0V+CUKg zo?kJDka&p8eXSSUat>77xEhe~y2k!45a=H(s9tChmANZ^d zxD;VsW*G=w?2X){4!BAnlLD1RkZP?>&Yje%4@HKY-nJ5VRovI7$MIw~_Nmq~Lwe&5 zcHBZDJ+YV4VFEkpQnE-3R+mN~0VOz~7#0MI=V%K~kDsu}^d1dW;JAH_!m>!X!&T0e zT%&bipI9p4c|g>IzX8zcZqZo(62k^v6dtc3^`SC1!Bb8YVhI1S@;O;c{3Pe~S)!Jp9A9YQ>U zuq9NGbJ#z**p%N_E>&gKt#@WFO;%YusdI&W$JmD2T)qs1&W}ZsOxkjp!D@7tC3>ea z%@ek5n#V3Ebj~oEc6yw~yEZS6RWb&TDT-H+>w3h^KzL@5Cwr0)T=aHOH|J;`{~?|H zXlJNMhIQ{rbI3&s(P;>zs;;b<*hoJs#>YMQ` z0_{ny$C|$f#k_F)=vKnsIci(LV(EddR8hko05e*vTS2$-zmceA{nJQ?ZR^45n`01K zIaIB{QB?wO(fjaa_HDA7ejm^0zv%C2GCyuswF4+p4Plccgwgdz41)uG{{!V2ZExE) z^Lu^;7Z|f#xc2tdUD5@qi>J@ht%$n;L1GBBL|a^BQX?s6#_IpRBdHflCgrqA@f3K3 zAf|Y)ygMH6sGnYENrqw)rC5+aDnTO^s%=K(*^h%)Cnw_dlGL*Og88z ztlxiL!~2Nx^Aq#}{?J=4kV*(z=4px|o^1tPB?@5{qm)L3NrEU_aFM7Q$+UKNmz*u>Di=oAYTAq5!uYS`Y!)SC zjWr|C9#f{|-nbL(Eshiy+XEc?GXof2kpt)-IHfTLpoPq~>m_GfU<@W;gsHn5yiUzO zi?GaDq%}rZ2)qr!veo-NXltVjm>t4=m-_3s1OIK3K{l zoOU6IoOOV%G7 znV=i22!J5!Bh(Wlq8WJ$dr|MKS5IRzGusukYjer4!0Up~C;M|dN4*TIL^k>63&@+$zljkeAG; z%}h(o1X+cU=AtC%kMBm1VtZrS9~J~{3S*El`XI;#wkZOuQoMlt2kG%1GN$5?pLJYl zJ|;6BQ0tHlAuL3wtrAqG2?j_9OW;&=PxLk6A|?XiTyY(E+Q!kn6T8PDt5Y`92w*Xp zrC~`GmU3k=X%aC(e99B1#M)TZCp@Aii|`tIzk<_Hr$E9j?ku}yp0 zA3~A_%YpH`R)>f#R{CiupEHOFILC+xN^{8-zAt0GST?a79!INl(EJkzV?q;9LR4 z{)rao6K^tsECa4|2p9|xGD={x5bD9f=X0_kDi>u=4m9Qv{V+s74ot-LNBu+Xc0*^v zcI}m(G-o<2rLR{%8ISvDgu?L6yX!E7QGYxdjV;dTPbdK#(zNr+^JFri@X>oB5vTd?}9WTweNC^Df`3mo3G%m*%q%KefDIKfUvjWWoU3z}3f&v6`E znxM3%MbJT9>*->&DQl`ibX8*o`mLzbf~Gv@Ix0pl&x;}K0v)Xl6^5uT11FQq|4c7` z3E%(rW*UCH`7jMHFJ>Pdyv-4}FMvv;W`~#8as>-Iy}5XQg-*f6?hQKvSj>q;jO$a$ zYCS@KP@bBqSWfQPsXO`9hvlAL;Pj~wTtNOdS(NCPt|V&o9D$;@|5)VPekOQEgxdD! zyE&?6q3oAnd6@KS97}Sm zhjXXg#+yykhg|Dr)hjvuo!v92t8H&(+pvjE;&<#fmTr-$FLbvy(h&)%&D66b9-X$2 zhgNx1SOa{cNTi#zc0$$VxU_~rJ@eA8)9QdRU}G|f9QZjqN4>~6$5m++pxeGF`}=eB z`ZZc&u!_srhBpL$)glB|hWqsM(|3>_C|K8?#Ufma)vLEiWyF}p!w$-w%c)d)c@Aw! zaRwFWM?>dxU1$|6eORo;>%_+{qeJgU>ZQA=DzwZ?TdUq8r)m5VK)RNw&iJ0raUd7U zs!Seq1PdN-8|ZC}UDLuwG!W>YinV6aKHX~@8NtRxdgP2(qxlS=P0cO7sqDWuLWWkp zFG$GWaHK@4AoP^oHdu{AqS$+M7`31#+<-<#w7>Xt+0b?)Q9QIvj#bbG$ye={PZS%C zJE~yciEzvgB4^!(NOXQeeZX@RMU6!~#azJtIqjvy_6QsOfKY3IZe}~^J(UjU>Y#yh z{g|3YRbsN1-j-#-5je|`BMP*5T~S7UHP$x+yw~it>o>T~tYS~xVV23)++0?|bM7n4vE+Q)mm=!VK|uK) z6RG;HPN{spI2Oup5Z_=l7}YR;YCM!|zGg&}R(#HwD0$Z0>$s?Ao;fmlYoZb!o38|3 zmRe}kANt{(MWhR!&^RWn3nQg#s=5#$14F0e!I-<(TsI}*A zl-Y)PfIfXfdcs~+2L+|i`YW!u&L$xaSAyqRXg@x78@06)#$$8|sw;vpGE7XfJ8IxG z+TUXRO)>h`m$IC+oYmHC(rU-c7T(YNk@p4Wdv$qVU|#&U7zTXYKh0|%zaxB~mkOp@ zjyFMCwacrLFTWXV@^M@hefGtW{l;Hf)V}#mYT@68O$*JRZqyc|M_F}u@-NL;TW{Mo z6n^)wU^4@fGsi~vm^5j#EL%6M-LS0NgJlSeMB7|sQXnZiUhDt9L+WBtqHHH^fvE)? zk>~oI3lH_`b-GAVOrit};!7oHq(ZexiM)I{xajr9r^t^6=$a|c&^r>ZNK97f71r-> zmhe8J{Hlje;XnG33#1kV&9Wpx5l=UQ&KC+{7Ndklgh_%Zn{lzkigGqYX+kiptteR= zzF&X7xqW|kt3}OdLSPLmw8j#}R2z1mDH5YKRSVdm5=owkh=8J)jDTm{>oL3}GR3g? z14$FUAtJcpY)0pqFe<^HOx8AUA0v|L4V$c5zOczZD4I~U3EnD|Qj%}ZG8Spl9o1cy zrd+513xPM`l88A8aiWM|SRG`dGK>-~GjWiTX&e*!F9{RMNJv;r*<6B$5J@SK3?t4U=2@hC+mk{mFl)O8hCBB{KYg7TXIB+XWuo5P zx^-n~3|9HZ-qNfh^KJq)momuN{Jp=@%4 z?07WHkwlpWz~-p0E2;G22rwpwVXAF13wzyOU}@DR+ zb?pVp`k^!A1LvS7NI!z8OfUoqMRv4Xo2w3P2fsygcBLK3J#YyvcxE_}2l4oA&5nSi zkoXi#I#l8~ZiKo>fAixGcnzeT<4vIYkx6Hr2s!B-lB$VODeVPxJEPDq*jnQBqZWd% z5rZ?r-K71Kd>wJ~ih>iPFE~L|GEe26jZPZ+x3<~2v9dIFh@9QKv~ySjRS!HO5a=cx zEx83_Ghy~uuj#?4ACno*5>-(Y`LH9|Ti)|_c^3jZnyC)aakR}_YI$V($&9FI z(OE4!#ut}Gz#P6bp)Z-7cz-75JJ}a4(Vbu)(AiMA)8SBYTr{+;AdybxiK>w} zF!SUnd~%FF6{>ZTy|@I|+GhW;jY~FO(vdW$2WuOjE zb$rc?94N8#+VJ0+UaTD2D-n|PkgzJ7rN3wTY3D~V?Z8DeS`c|`!4>xxJ2Og5eOqQT zQwq^knpvPAn!KD2&}(Z{s_&d1lj=o|^Vtj}H$AC_$kK;zCcz(O>rc4i|4ozRW`Wt9 zOx+~je14O)z3xeCmpn7pqbYQp9f9nb?*O)&E3xBqwbQ@ zLH~^Gf403JSj_^rrCCm5pMyEWbpMqr;W+lYZ&ojA733|kgy4jkNW6}t*x9UiA6D`& zROjdOow52)OE4NCZ>+8I29|=etA8YC-}89mPg*mVx8PEF=<=$b)*c)qSbBq@MLunc z1=3$YvR^xC3L(WOn4>-@e3xcBsva0}LiTZF58(Z_zJ#Z;>4@>$1w-sgePc^v@^|yXme4w-W-N~l5Mwn{i z*!KPdg;m>b+CUI}=PO1CDK-MEzH&>_G*u(DO+?zhga|G67*@4+t=%;QHT-+W>kGC^ zQbcgP>p6So%$f1@GT9~&pdT@Xjy8(>W@Qcu>e&Z((&>18aC{f8g^>cjVX(shcQ9qy z{Z&l&BQED1=+hTIO9f_&5T;QCzDy2^Z?*=Q2q5A<3XQ-;C{@f1mtp`(gpAg99QQWv z>)p-m_s81|D&!H;8Z)qG8UmgXTc-vC*mJX`9j-ykRQX5;1vsJ@uhS7MMx8KP{Des) z52%(mGESsGVU`a{`l$6H6#^Aymg?GLU!*qnXJXeM4{<2Pp%#53g_aR6?^BbcrnuY* zgDRx+2#y5Q8XgqS);fPWKp(H)w^vH&YR43`qKZAwUK7Q4%pmlneTWe4YPu%rNKxTu zn!#%26A`0Q-#9I_GSanyIf3lc%fuSa^G%qY4#+l-=a2Da98=kxOcCg9>30BG3B-or z$Q-A;;z@T5JIRCA(Vhpx9ZS4_L^q{2PcHK-M9fhJW#0|TE$5nGcNvm`QS z6!t^VxkaF`)o@NJI=%9F7h*J98H@_Z$_C0ppKz~FqT@?~^dG6ps839;G&nfgjLK8S zxWRY%+F>#*@Y<9FJ-KlXvr4J0+L;T)B_A0gMxKfNWPc zrixuJ!rEEqhOH-deo~$pF&40#A5AH=p?6wMkp}-Vd0F;SzHq*i5`~+UqW2Pwbmzib zKH&>DtL!B=c1Hb6_u0D`zydOz;uf#Zs8NN?>7a#pL01M!5RJFUMesfgsjSQNMyNF ze7!NiL<%`iP-p}$GN}q?xD*p8b7Zu(<@oCC9zNeL{(N3osEp@GYs|na(~xo-*s3y^ z!Yel$l5h=LRw_Yql;Szr%tj-@3e+W|#XBr>xkL4GD~nPJ6z1iNk_l@4R0)BKGOKh) zZSf<)(nj?{^7iHOl+ssTpsdU(#owhi?r*UEAlK{mR?D7uMJC1WFwTxQzjDv0DCxlG z|FE|~r;i6wpGNR^sui(AYv@&Q^v?+Bnw_1wJMG!cmMPNV!jQCHo4I?b_?8)jaVg8o zqgHiAjvM8^TJ>tRA}SHXL}D|5I8LM>a#V>4y=&)Y;vpOJ$XVAR+iPqYG@X+sTy^5= zh-y14Z33{ux6v?us)hzeEG!Bl`UGq|JSEH2?>ek=xni~3DiK?E)-Z0vVM?)`eYegjn{UhL!fOpnl48cH+-R%S zuG%Z`5eINJuN_V2YcyftE#gK#fnPp;j3#|!p5_>L5d@8gfll(8IuW6w*oMK~;>*M1 z-;1aC>GAPv5W!DZSCFxs*m`|Z=K?~ChYL(Qvic#u|NO8Zm1~+L$_|O}n1Y3{u?-VY z$a0rJOc|6u2^Y;kQExEMoitc6y@9C?_8Q9$!`j_&yAv0v))=<+pEL@QCw-r=)4AW= z(C>LbBnT$$p7*U#6PGL)2(9H|IJVymf>>2q zM(qZ6vb4DUD54JO4jPU^vu*sFgV_W0z%K{pJ@jEDd*!!oVSKSD2Wo~`QLoZxBMd%h zOca_AL8lt^Qm};UYY6&?1a-M?v?fWj$~S)sNnbi%iMl+4AhR*3XIX z;U3sAa2fRqG@WZSpM|SUKc*V{9IW*}3r!g3deL2_N=!T*Qv|hs(`aKa_MMUi{$ZmQF=s^p0Ya+Ix6PN!94~ zRR5zW2d9mGSztDU8#;Pw!^D)Yg;Y4TTqYC&E37L;Pc*dXsK-{C4klp9?@o$jn9Aft zX@`fiBjr6^$2LY^$pq=Zn>JiOoxMLDyp8?^rB-ck+cpsX?q6{QjDiXhXZb4EafS`u zur^)Mbp5gn1}&drwK6G?RDz((f8X&<){Et=t-hG%y*zi%9glpqthNcvGepG*Ybp{{s_@GDlOd_;Boi`-RGpfI=Zw_N>IZMZ?wto1WGx1UhyLJBA3 ziW{ls-(dBgD~;b|5q>GQ^OKVaoWL~~{0=pkEkY)RAv+B+2QHv?rW$r!6gg@Gc~Rnw zjI7-iugz8}c!T$afZtImR2*J?v45|&{_m`im!x|>Attr9P|nZf>jda?0od;ZJ`#9Y z5CQ>5RPt(Lir}-L8%?h6xdNZu-~WWobN5@R;+}S48az?1J-8b*KH)xQuH^1Gsx8v4 z!EG>H24OwxMpLiLB7?jZnIYm~wIY_Or|Qfwt`vXV`&fY6U`gUEJxlhRnr)%aF86x- z)U5bvkl^b=Y6k9%VGAWIwnJSwHGi=RF3r zfSi{aYMHSIA^oVGjdUs0E3jKftXQnCOmn(qY>GAx!&OlOyOXs+!hOCSwq zja@Dk@@xyNS97jo(UVqq_A7Ey_8>1`Hp>@_rb`@PV1^}a_@wX4es%~HqQ-eg@-!KM zGDjUOED~{<3_MXdFGgZ0^o`-`6502MFg120E%qf?Hp?y=ksP_753^_`5koEXJA6RJ z9KsI-xbKbNdavG6^+&PM9y`(>!ihaJww@c60iu~&|9e;wjowJJB=ys&cR*tFoo*e= z;jQFxEHzh(owywSxcT!PpvdF~H(+mEaW^uUybz|Jbr?!VOgl+w!%aK4l7eAvZ8R2{TBRg?_{4=IAlT+;Ayweu_EE_~cMciy0YJ z9|rG;a)nCU7-vjrRR7}62D|t6^&s`H+g$FE?M{b?)H*~~oj)C*<GFpt#F;3`rqkD-{@zV=1W8A~sPoP|x{z`t9nP zlS%Pm z&eU|ietZ4pwl}E!13^t5S47-SWhLbg@#u9PXzaQWC7EDHE6`Z6KpKuFRq{c@Vq{iN zb(5E7Df~=a{Vtcy0bB$3#;-S0uQqbIdTQ!i@<~fe6PD2+wms!~Y)vEYQ17R!`o*IA z{g`@dFk11kYrW!a?XzC9ScEjd{1&mu4NN5ZU3}zp`qnoaL0m~IyX|Ue6`gZ_NiP1X zSyhbF330>3ldYG{8PC|=;uy86|~E`6#rGRXhXDjzPU}B20!xm;wDN>RGFB*8_m}z})5qxY2=D8p@ zOwmOK)*)T6jOiWG!bbvEUaXX!ZKxy*f%qu*YeV~=OSZvel6KlN6SE9;Ee*^MUKpDD-Gu;gm4@`x8DsfmXK4 zs;oC9{Ft;tGRs*Y*$iBP{&*;bDA4}_#-MNvz{1qenYe$el#X#(69$-lv892%om0I! z3-jqvb5UrnJ0cswl4i6)p&GQQE!bwb-)D^DJYhN!@xE5}LPLz`4)I{_Q?@MdsQ3ZR z81N0KSTZ{@qmCQ-j!&BB2#%VKLC2R(ph}a(4ce&MF;6F#(CO8dY74=X9*sU<-_LKK zA08iWYg*S?CbozQ`Vz3~RGB?B=v0EQ4@*KK>T$_mit7n2ZFweW;sYWqB{Y*jlN~9P z$#`5y(|%+FQd#=KfU9>@i)^2h$z;;p+}$8$=Rw-={K-&*=C&FZUxnFfm-7ZsAC6}h z&WW$s6h1dSOTvb-%tRjm_Mpqx{r^$c@B(q6Av(SxkTx^lJyJW;Nn6;3dJ7o(d4Y2w zU_Tf;b?Ws>VmWfy*6u(JDR>Y^LzJxW-m?G*`Z4)0h7Kj|0`E_^NDO4ypZ7w1vop?K zMqD=xYQ zYsI%>)p^~zxl>UyB)f;9aMI={i61kbimA_?D&iQFN{j4|@z8FB>Dm)8L7uf}E;=}* zrq|`@%KKXMjf25>SZ;QjD|0v`?}fzPf)}REL_k0rGx4@mnl!0OGGP$CsV*J+*1wIC zQA@)x5Xay1Degg7S8&7EZR${wi6}C+w}G7Pbq%&jxTMn}`|hSqD+3*RFCoeQ?)Sgs zW|t;6kWx}0Q)C^>#J#xMkUc*ePK8idk~NqR+>j}BO}x3*rO}F%+dSpSYm=fQf2gc3 z$Y)gcFYN;=+!9a!CzTml7qriHnQ2uYNIUFiL51-(!UAaF3Tqoi@Wn(DQX31pQ@oYV@o2<1R}&pg(R(k5`v00t3XSQl_ZhV% z{3taUdvT2W=;ti*q`>_hG%$WJPD4Y3zTjSb0X>dAivmFqMDzI-9eNum#^)!e;BkqG z*}~E6lx}moJwwm9DB^#=5yh~I_llY=V;jk%>DVwz*`&$8`5KYt(~nQ*lzXJe4QPYd zg)6N73VjR;&Go)zJ4DYJ_4d*rW(iuHNmV(j=#bz^j>Jl$19#$y?R4&oNs{O!19V)# z2fN~PZiCSe22t9<48}D3d&E`yjAIFl!cJWIni73KH`lMp_W{BsLw%xm<8JQm{sB#o zPiq1(5XJBL6m!%)C_UGdVvo*}39JRPh0{fed_s_U}9j7ZmHa$?Hy{H}oIp0I|%a-7LG#QAfLq zNcpG1Ck!l5iaAo{5tec}P_>gZW5!B6K?mj|{^j#UgWNf5f3nm{Uzl>CPpCpYt&VrO zPJeQd`L%VIuKiIfee)rQ$0WkpP-3NrBk@?#O&<(B_8;i(9<(BCmH^EMxiQo)YX zKn%U-D}1Q5NmZrn6et3`j{<0GIAJ$X)SZws!OkON54|~44X{W>tFkQNt9njZ9*P;XPNyG! zcBXh|ciRxg7{(yW8c~RVy z#F!|R>J+>-ktV-(L1w%hg6g6?(Hu!8nibp^x*;>mb9TKl$-p*EZZtFVP32SRYvZ;z zvsO&n5Pe($eQ`~77Xu#YzvdQUj}eu>KApu#xgDvKu?WfI*8jsvs{VdADY^S`_4J(m z1wD>E3&JoEhWGr68?{5l*{TH@Q$3+XM=nR4GPtVm!=@ryTmNAOhE>f zYphOL1TiS-5YW^Do&G}0zE8f5(AgU!4|(E7w8V!P&v2rrb#NqRVua#8%F_H~Zv7^8 z7s@&zZpVrL5!Ga=xB93rwOQM4+c*$?_g8R%>{m42(^vD7E7-r!kl_bmv%VIWXaS^7Z&<2MffHJ3Hp%O002RdgNc}InyA|$V#@aJh_ zehwKw0olVIL`_O!5cj_I2t3*pJ_qDBp+r&eO@v}erT~}Zp-P73cqMi^4+X)ahSjqA$&>{yc=J%tqwD83pkJ4!rk>HS%B|U+sKQDlttu; zE=dGTK2Q?#MV9g~rZJfcKHJ%{nehW%y3OCbJ3BJ;MG1|bWU;#inS@8%_*U}wll&?~ z>NYwzNnMYcbNVv<-Sf|@+GyIip-S5Rux!f3EW~PPS;3l|m2MD|1vs)rX0>#Y`**X zB>@JLjK|}ON-b^4;G;p3`bs_;MS=oZr_@=5`b$E4h;04W2UTHld?n7A40ysr+ycmYmaS>7M=}k z*}4Obqcy{BUK!6;Z-j#B7Iv4J2GAl)S@z@>{UJoYu9MO*lTZ}oVF^tpr3x!k)%JT` zTe01`gf_6LNf;rVG4MBsj-JqwGEPc85!j%$dobz&vBI$h@XlP{%889L`~rveVkV%z z;a^;IYm^>ua2<5E@l(t|&@cTfe6lDt8;;|RMfRp#S)8kTXjNLuBli+7s47HOt?}C) z$DX^&TTfZadJkM}e<7gLDQsqj%~^cs)@l|!^b#haCkRpGs=E!q-lgmTukEAB?t27B zEsQmNkd%R3$_ZGS;O`0M(*A(-Awp0i^~9Jx=}hydaIMzH2n6dbCIAx;uv+Q#Z=l=bh3Zl_OLu=^>(?e&B#7H8Ex_~Q zgz{H^ITxzl<#S1Vm)%tP3=q}4YH z{e_ReXK=U+j}9)~e0C^U?CR6ZZ-6k^D-SmKXMzsb7d|KZM!;UC9b`D$u5V+GPyZv6 zaIlY(>V#YGIl=F8zZ$WR&zf==8}CbUNX-VE$I<=3+eY_j_4=c6Sd;Why_ea?Pg zhp|4!`(dc(-}reUURBLyOPtn?;AXJ?t0pg=8_3=*p{(yNcA;#mn=3E8JCSaQZgqRo z4X*PV%nPHuKtd??J){rIrmGqq9Bim4zPg%}Smji}N8rlF`pD+gcWvXm>x&8@Xr`(O zeA~eX&hhw0Zm;hy3>w-5GazrzE^qWGoWZ(zV)7HJ1Wial8d`EQw*J46(TK^vb%PhT zz(7#vac+HV*Wm-4`yNbLQ;$?93jWMDqxy==n^bE0y4$dQ`6w%KpdZq2mN>fihwq z!UaZt_=;k39xkFVz(7r|=SJiok3#Y=AjDE`89N!ico-@DZ4|7S&!;z(KKL=l zNT4JP)6dc%qCRM~9B9Ec6A~q;If66@5CsT?Ghncavp}$1JfY|kP-9QoQq4mFpK-+l zxI`gPFgW_9f1b|cpIsgvQ|y65MUgU2C!F67&@vMAYQZh#e_C>X3JX+>cE-R%r~$rKUB|O|$|#0)1p;rJcyf!^iRPYB;zVniK*n5{ywTMIgx`)`#&+B<>lN zXrrl;dz;O^b) z3`~XO2`;S{vsc{Ah3jQ10s%g6Rg{e9FlDhON%GH_Pp5sa-`ACk!pvQ5Xnbgt^7~w> zT*$sTG)+47_(G#+iY|fLkV{)Y$KmBNQv|!O!-gZ%GzV#R>JL^PJz~1Cy8q+!0-0GY}jxbR4kzT)PI>aiHbo<&z8L< zX$1cm8#NF6~fVr!evn9x`77 z@biL&AY))rED5b`)^+r+7ZV#8{CRtMJs$l5J$Om%w*$^NQm`DP&!TOhZ-;}+(O@_p zy}SIKfM4wd4v`|;g?c@>xyc}3RAA;QCv|f0FM;&SpqasiO5{9OrxD^*f~KbLG6+hb zmqNGeEO{{VrM67(>P>S5j&i|ONl2VgN{9NJV%mg(9=56iO#qd;z z*)N-C1ygmIdJq^+tsI~4<)VLt3p;%~yaZ8&m-OY+d+8qGWzTfIXCz)Z5cBfs0?E8| zkML3xNT&lAUOd4!F>Mew!>bvk1#cwdGGDiHwyz#U6UV7^YWBj_gwC{J8qfxC3*N2J zI1VvH3fOJ7ifgP;tws5oW*X3HvuXS2-HWWlm3viwg5@pZ|JcJn#WBSj!Dx6p*gujM z{Bn7HGpK8IghQv+Ud=2J1BHHQGc)Ynvd2IojIt9$;BDrj{ywI`R> z`Y=)7rXEJ*;4#7$hp}%ZZpBpbqbgew%2UdEP4JJ^)Eb2!A!z=ILSY7Z_tz=ZA2>8g zTNz@}q?m3|BQWEfEjQ#{I}l}EjX_z}3X8{1&lco?1GH^<*br@59xzDPp;eKo8K!N= z-)o?@hX|_lIEUob0t&XLt5SOJuZc2%mg%oGFKJUNgxEONd9gFA2y<~6lr`dva+0JSdCDD z=mu!;D&V}B$}w8tPBisJr?Ch(pbWTEMwJ97JxDmt#&bQtKkt0JoBY)1Jg4RwrXf@Y zkx^6q>4AlYYV!~hd@mAw8wp+_!S^Gf;!iis7Jahp_w(GpR<(6T%0X|9>NbSwJ+!&I z@9w^Qm(hjHC1gkoqOhlpOq~OpV8OCw%eHOXwr$(CZQHhO+qT(d+w7|8d*{9R<~L;I zIT1T|tZlS1Gb2@mmp^)@I3gLTg%srw+Jr!@a#2cAx<4WNnSlI4#B9XiD_WYlfANx3 z#PVul4gS{;#Mfgk^?iQ;P2f6xy~F@>1s2akbxsj*S;2A!DcYS>St(P8qGLGAu|u#_ z0TH8@+dYfjZfIo02t2X0j&+AE_RhCI4Rn8rV4elU&z9&jW+1Eld}eV(e}fdTNl?zZ zsK7*eM#yCUSE+GJ3Q$}&71h9e2pJ3Z^qw(^LWwPyO%~n&b3)}QNKr#2#|zhtnW{tA zUR0L;If}PoaWH)YePGt%9eIl^*V0?q4sBb|TzA~cyg1i**U=i*B>8qyPjkN!HC~$@ z4#=xyGLtViWbMd4QrD@M{FyjQ>Ve;~)<+WItDmU9(DIMIz54co-xVJA>(x1Qu9B?$ zkih?Cxq?Zd9HIhBu816s26zz>T5~VNns#UIszn_1cX!)Rg9@#5wlp)}&1T2{#LAG2 zV3fu*l(IZX%s*=tVd;df3leM~rJ5iP;ZCt=6U*8+m(GAd@%qYP^iE}1=JXL#=0#ro zr4p)~%^!5zz5&>}Pf~b=^nsHBKnIofgc)VSwGnIt5R$BbA#GOJhjI#a950|9j5y(% zgve{y2f|B$h!p%C?kYC9a`Rwg>D(P)DMI0~yOP2A+cBm`38G_((g;-F3k9MNh~fNL z`)?63$xp>;+&nEn@!weaSzh-gbr_0?p7Q~iL3xv!RiIYzt0T{3G|kj*;@%~H*jx3@ zdxALQjMzCiW2Q(3Ll^I29na(va1(&Dk`ueo`-iRsN=v!SwD9aj+*+3U_8FIDPIVYB z7+8sFi*bRDuorAi!h4vh>s1=kmVdMwaG{5UMJ}EzSWvwbSAf_xuH?RI<2;z zqi91g$gxdBNBTXZY=swm!T;7gvnYlQ%Voc%dR9;aYbdu@4CMpU&hv%k`oAKBZvMm^%a{Lup_;kF!ewI$*EV86hgF9 zIyVZU>_?=a;&w*jF%|2X2*HlnRk9%Q_G&4mjQeTaIWRyN0@7t7<>6>Rjq-a)IHdzf z+W@68sSL27VkJ!);rNI{Cqsh3X)wdRRiID0H|b(CGPJH48k$80X3j9oKnP@82?Dz+!fQ^!eKrR^ zZA2oPnTT+J)f~cK3{mHiiHnEvB=}DIdz4yTVya~gn|-n@Zc2&F zKosYMR5g@7sd2vi-Q>C}bO~s7&D18R)QH5-T?FF2`4;=&jJ1uBTDP~^s_YFe`=<(e zdMYoLaLQVz_`7YJNf}I`&baE;PT$@_`wOqTp1)LaQ83!dlodI(rf8R~(bo!b5|s_{ z2ud$1aB2jej4wG+)DawtpUSGjKij9UZh-m4?sl)+PRhq8^!3JG(e~W8Jde1l>KD~6 z`!#+6T9f`un)>e}ks(E3tDv_jZ75oan>BmN5+9*zy93KbkZmq53Cm0OJRBhvY+&EB z$)uYT|L^?S?`EhJ$_(XP0_8&3@&-?4E0OO{?LS=%giew=22!kqsgo>Ecd|4oC?r!B z=@^_C|Alb(yshS5M1m-$&vw5@B><@5EjZiDKVfyNN%!5kj{Y6Gg2%Z&G{I> zIawkszeNgE2br01Xj8u(mn7RZW2$fV#;eV)7MjuME+3pN3P{I=fGD|nBL&fZdQA@5 z+BB53#S|P0GhKBnU9}TKsIv-Crvi}a2&;@cX?w?xvHDv+ZOp(mHW#fkB9?n|qN