From 1dd505978e36b6ca6ed8289aea7310361dd214fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=A4u=C3=9Fler?= Date: Fri, 1 Mar 2024 11:20:15 +0100 Subject: [PATCH] Initial commit --- .crowdin.yaml | 3 + .editorconfig | 47 + .gitattributes | 19 + .github/ISSUE_TEMPLATE/bug_report.yml | 76 + .github/ISSUE_TEMPLATE/config.yml | 1 + .github/ISSUE_TEMPLATE/feature_request.yml | 39 + .github/release.yml | 31 + .github/workflows/cgl.yaml | 58 + .github/workflows/release.yaml | 76 + .github/workflows/tests.yaml | 131 + .gitignore | 5 + .php-cs-fixer.php | 27 + CODE_OF_CONDUCT.md | 7 + CONTRIBUTING.md | 93 + Classes/Command/ListQueueCommand.php | 293 + .../Controller/MailqueueModuleController.php | 188 + Classes/Enums/MailState.php | 39 + Classes/Exception/Exception.php | 32 + Classes/Exception/FileDoesNotExist.php | 41 + Classes/Exception/FilePathIsNotConfigured.php | 41 + .../SerializedFailureMetadataIsInvalid.php | 41 + .../Exception/SerializedMessageIsInvalid.php | 41 + Classes/Extension.php | 82 + Classes/Mail/Iterator/FileIterator.php | 50 + Classes/Mail/Queue/MailQueue.php | 92 + Classes/Mail/Queue/MailQueueItem.php | 46 + .../Mail/Transport/QueueableFileTransport.php | 255 + .../Transport/QueueableMemoryTransport.php | 78 + Classes/Mail/Transport/QueueableTransport.php | 49 + Classes/Mail/TransportFailure.php | 75 + Classes/Traits/TranslatableTrait.php | 53 + .../ViewHelpers/DateIntervalViewHelper.php | 58 + .../Format/HumanDateViewHelper.php | 104 + Configuration/Backend/Modules.php | 40 + Configuration/Icons.php | 29 + Configuration/Services.yaml | 25 + .../Images/ScreenshotBackendModule.png | Bin 0 -> 103141 bytes .../Images/ScreenshotConsoleCommand.png | Bin 0 -> 186870 bytes LICENSE.md | 294 + README.md | 127 + Resources/Private/Language/locallang.xlf | 130 + .../Language/locallang_mod_mailqueue.xlf | 17 + Resources/Private/Layouts/Default.html | 8 + Resources/Private/Partials/Date.html | 9 + Resources/Private/Partials/List/Queue.html | 85 + .../Private/Partials/List/QueueItem.html | 95 + Resources/Private/Partials/Mail/Address.html | 16 + .../Modal/TransportFailureDetails.html | 40 + Resources/Private/Templates/List.html | 27 + Resources/Public/Icons/Extension.svg | 6 + Resources/Public/Icons/module.svg | 6 + Tests/Build/console-application.php | 41 + Tests/Functional/.gitkeep | 0 Tests/Unit/.gitkeep | 0 codecov.yml | 2 + composer.json | 107 + composer.lock | 9424 +++++++++++++++++ ext_emconf.php | 39 + ext_localconf.php | 24 + ext_tables.php | 24 + packaging_exclude.php | 55 + phpstan-baseline.neon | 6 + phpstan.neon | 14 + phpunit.functional.xml | 26 + phpunit.unit.xml | 26 + rector.php | 48 + renovate.json | 13 + 67 files changed, 13074 insertions(+) create mode 100644 .crowdin.yaml create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/release.yml create mode 100644 .github/workflows/cgl.yaml create mode 100644 .github/workflows/release.yaml create mode 100644 .github/workflows/tests.yaml create mode 100644 .gitignore create mode 100644 .php-cs-fixer.php create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Classes/Command/ListQueueCommand.php create mode 100644 Classes/Controller/MailqueueModuleController.php create mode 100644 Classes/Enums/MailState.php create mode 100644 Classes/Exception/Exception.php create mode 100644 Classes/Exception/FileDoesNotExist.php create mode 100644 Classes/Exception/FilePathIsNotConfigured.php create mode 100644 Classes/Exception/SerializedFailureMetadataIsInvalid.php create mode 100644 Classes/Exception/SerializedMessageIsInvalid.php create mode 100644 Classes/Extension.php create mode 100644 Classes/Mail/Iterator/FileIterator.php create mode 100644 Classes/Mail/Queue/MailQueue.php create mode 100644 Classes/Mail/Queue/MailQueueItem.php create mode 100644 Classes/Mail/Transport/QueueableFileTransport.php create mode 100644 Classes/Mail/Transport/QueueableMemoryTransport.php create mode 100644 Classes/Mail/Transport/QueueableTransport.php create mode 100644 Classes/Mail/TransportFailure.php create mode 100644 Classes/Traits/TranslatableTrait.php create mode 100644 Classes/ViewHelpers/DateIntervalViewHelper.php create mode 100644 Classes/ViewHelpers/Format/HumanDateViewHelper.php create mode 100644 Configuration/Backend/Modules.php create mode 100644 Configuration/Icons.php create mode 100644 Configuration/Services.yaml create mode 100644 Documentation/Images/ScreenshotBackendModule.png create mode 100644 Documentation/Images/ScreenshotConsoleCommand.png create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 Resources/Private/Language/locallang.xlf create mode 100644 Resources/Private/Language/locallang_mod_mailqueue.xlf create mode 100644 Resources/Private/Layouts/Default.html create mode 100644 Resources/Private/Partials/Date.html create mode 100644 Resources/Private/Partials/List/Queue.html create mode 100644 Resources/Private/Partials/List/QueueItem.html create mode 100644 Resources/Private/Partials/Mail/Address.html create mode 100644 Resources/Private/Partials/Modal/TransportFailureDetails.html create mode 100644 Resources/Private/Templates/List.html create mode 100644 Resources/Public/Icons/Extension.svg create mode 100644 Resources/Public/Icons/module.svg create mode 100644 Tests/Build/console-application.php create mode 100644 Tests/Functional/.gitkeep create mode 100644 Tests/Unit/.gitkeep create mode 100644 codecov.yml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 ext_emconf.php create mode 100644 ext_localconf.php create mode 100644 ext_tables.php create mode 100644 packaging_exclude.php create mode 100644 phpstan-baseline.neon create mode 100644 phpstan.neon create mode 100644 phpunit.functional.xml create mode 100644 phpunit.unit.xml create mode 100644 rector.php create mode 100644 renovate.json diff --git a/.crowdin.yaml b/.crowdin.yaml new file mode 100644 index 0000000..420e99a --- /dev/null +++ b/.crowdin.yaml @@ -0,0 +1,3 @@ +files: + - source: /Resources/Private/Language/ + translation: /%original_path%/%two_letters_code%.%original_file_name% diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..4bcbdab --- /dev/null +++ b/.editorconfig @@ -0,0 +1,47 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true + +# TS/JS-Files +[*.{ts,js}] +indent_size = 2 + +# JSON-Files +[*.json] +indent_style = tab + +# YAML-Files +[*.{yaml,yml}] +indent_size = 2 + +# NEON-Files +[*.neon] +indent_size = 2 +indent_style = tab + +# TypoScript +[*.{typoscript,tsconfig}] +indent_size = 2 + +# XLF-Files +[*.xlf] +indent_style = tab + +# SQL-Files +[*.sql] +indent_style = tab +indent_size = 2 + +# .htaccess +[{_.htaccess,.htaccess}] +indent_style = tab diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..86f94b3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,19 @@ +* text=auto +/.github export-ignore +/Tests export-ignore +/.crowdin.yaml export-ignore +/.editorconfig export-ignore +/.gitattributes export-ignore +/.gitignore export-ignore +/.php-cs-fixer.php export-ignore +/CODE_OF_CONDUCT.md export-ignore +/codecov.yml export-ignore +/composer.lock export-ignore +/CONTRIBUTING.md export-ignore +/packaging_exclude.php export-ignore +/phpstan.neon export-ignore +/phpstan-baseline.neon export-ignore +/phpunit.functional.xml export-ignore +/phpunit.unit.xml export-ignore +/rector.php export-ignore +/renovate.json export-ignore diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..6c85521 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,76 @@ +name: Bug report +description: Create a report to help improve the extension. +title: "[BUG]" +labels: + - bug +body: + - type: input + id: typo3-version + attributes: + label: TYPO3 version + description: What TYPO3 version are you using? + placeholder: 'e.g. 11.5.25' + validations: + required: true + - type: input + id: php-version + attributes: + label: PHP version + description: What PHP version are you using? + placeholder: 'e.g. 8.1.16' + validations: + required: true + - type: input + id: extension-version + attributes: + label: Extension version + description: What version of EXT:mailqueue are you using? + placeholder: 'e.g. 0.1.0' + validations: + required: true + - type: checkboxes + id: composer-mode + attributes: + label: Composer mode + description: Are you running TYPO3 in composer mode? + options: + - label: I'm running TYPO3 in composer mode. + - type: input + id: operating-system + attributes: + label: Operating system + description: What operating system are you using? + placeholder: 'e.g. macOS 13.2' + validations: + required: true + - type: textarea + attributes: + label: Current behavior + description: A clear and concise description of what the bug is. + - type: textarea + attributes: + label: Expected behavior + description: A clear and concise description of what you expected to happen. + - type: textarea + attributes: + label: Steps to reproduce + description: If possible, describe steps to reproduce the behavior. + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + - type: textarea + attributes: + label: Additional context + description: Add any other context about the problem here. + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: > + By submitting this issue, you agree to follow our + [Code of Conduct](https://github.com/CPS-IT/mailqueue/blob/main/CODE_OF_CONDUCT.md). + options: + - label: I agree to follow this project's Code of Conduct. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3ba13e0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..c85931d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,39 @@ +name: Feature request +description: Suggest an idea for this extension. +title: "[FEATURE]" +labels: + - enhancement +body: + - type: textarea + attributes: + label: Is your feature request related to a problem? + description: A clear and concise description of what the problem is. + placeholder: I'm always frustrated when [...] + validations: + required: true + - type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Describe alternatives you've considered + description: > + A clear and concise description of any alternative solutions or features + you've considered. + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + - type: checkboxes + id: terms + attributes: + label: Code of Conduct + description: > + By submitting this issue, you agree to follow our + [Code of Conduct](https://github.com/CPS-IT/mailqueue/blob/main/CODE_OF_CONDUCT.md). + options: + - label: I agree to follow this project's Code of Conduct. + required: true diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..0fd883d --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,31 @@ +changelog: + exclude: + labels: + - duplicate + - 'good first issue' + - 'help wanted' + - invalid + - question + - wontfix + categories: + - title: ⚡ Breaking + labels: + - breaking + - title: 🚀 Improved + labels: + - enhancement + - title: 🚑 Fixed + labels: + - bug + - title: 👷 Changed + labels: + - maintenance + - title: 📖 Documentation + labels: + - documentation + - title: ⚙️ Dependencies + labels: + - dependencies + - title: Other changes + labels: + - "*" diff --git a/.github/workflows/cgl.yaml b/.github/workflows/cgl.yaml new file mode 100644 index 0000000..19ce5e9 --- /dev/null +++ b/.github/workflows/cgl.yaml @@ -0,0 +1,58 @@ +name: CGL +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + cgl: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Prepare environment + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + tools: composer:v2, composer-require-checker, composer-unused + coverage: none + + # Validation + - name: Validate composer.json + run: composer validate + + # Install dependencies + - name: Install Composer dependencies + uses: ramsey/composer-install@v2 + with: + composer-options: --no-plugins + + # Check Composer dependencies + - name: Check dependencies + run: composer-require-checker check + - name: Re-install Composer dependencies + uses: ramsey/composer-install@v2 + - name: Check for unused dependencies + run: composer-unused + + # Linting + - name: Lint composer.json + run: composer lint:composer + - name: Lint Editorconfig + run: composer lint:editorconfig + - name: Lint PHP + run: composer lint:php + + # SCA + - name: SCA PHP + run: composer sca:php -- --error-format github + + # Migration + - name: Run Rector migration + run: composer migration:rector -- --dry-run diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..b084f9f --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,76 @@ +name: Release +on: + push: + tags: + - '*' + +jobs: + # Job: Create release + release: + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + outputs: + release-notes-url: ${{ steps.create-release.outputs.url }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Check if tag is valid + - name: Check tag + run: | + if ! [[ ${{ github.ref }} =~ ^refs/tags/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then + exit 1 + fi + + # Create release + - name: Create release + id: create-release + uses: softprops/action-gh-release@v1 + with: + token: ${{ secrets.RELEASE_TOKEN }} + generate_release_notes: true + + # Job: Publish on TER + ter-publish: + if: startsWith(github.ref, 'refs/tags/') + needs: [release] + runs-on: ubuntu-latest + env: + TYPO3_EXTENSION_KEY: mailqueue + TYPO3_API_TOKEN: ${{ secrets.TYPO3_API_TOKEN }} + TYPO3_EXCLUDE_FROM_PACKAGING: packaging_exclude.php + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Check if tag is valid + - name: Check tag + run: | + if ! [[ ${{ github.ref }} =~ ^refs/tags/[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$ ]]; then + exit 1 + fi + + # Prepare version + - id: get-version + run: echo "version=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT + - id: get-comment + run: echo "comment=See release notes at ${{ needs.release.outputs.release-notes-url }}" >> $GITHUB_OUTPUT + + # Prepare environment + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + extensions: intl, mbstring, json, zip, curl + tools: composer:v2, typo3/tailor + + - name: Reset files + run: git reset --hard HEAD && git clean -dfx + + # Release + - name: Publish to TER + run: | + php ~/.composer/vendor/bin/tailor set-version "${{ steps.get-version.outputs.version }}" + php ~/.composer/vendor/bin/tailor ter:publish --comment "${{ steps.get-comment.outputs.comment }}" "${{ steps.get-version.outputs.version }}" diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml new file mode 100644 index 0000000..c9a1eb2 --- /dev/null +++ b/.github/workflows/tests.yaml @@ -0,0 +1,131 @@ +name: Tests +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + tests: + name: Tests (PHP ${{ matrix.php-version }}, TYPO3 ${{ matrix.typo3-version }} & ${{ matrix.dependencies }} dependencies) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-version: ["8.1", "8.2", "8.3"] + typo3-version: ["11.5", "12.4"] + dependencies: ["highest", "lowest"] + env: + typo3DatabaseName: typo3 + typo3DatabaseHost: '127.0.0.1' + typo3DatabaseUsername: root + typo3DatabasePassword: root + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Prepare environment + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-version }} + tools: composer:v2 + coverage: none + + # Start MySQL service + - name: Start MySQL + run: sudo /etc/init.d/mysql start + + # Install dependencies + - name: Install Composer dependencies + uses: ramsey/composer-install@v2 + with: + dependency-versions: ${{ matrix.dependencies }} + composer-options: --with=typo3/cms-core:"^${{ matrix.typo3-version }}" + + # Run tests + - name: Run tests + run: composer test + + coverage: + name: Test coverage + runs-on: ubuntu-latest + env: + typo3DatabaseName: typo3 + typo3DatabaseHost: '127.0.0.1' + typo3DatabaseUsername: root + typo3DatabasePassword: root + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Prepare environment + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + tools: composer:v2 + coverage: pcov + + # Start MySQL service + - name: Start MySQL + run: sudo /etc/init.d/mysql start + + # Install dependencies + - name: Install Composer dependencies + uses: ramsey/composer-install@v2 + + # Run tests + - name: Run tests + run: composer test:coverage + + # Upload artifact + - name: Fix coverage path + working-directory: .Build/coverage + run: sed -i 's#/home/runner/work/mailqueue/mailqueue#${{ github.workspace }}#g' clover.xml + - name: Upload coverage artifact + uses: actions/upload-artifact@v4 + with: + name: coverage + path: .Build/coverage/clover.xml + retention-days: 7 + + coverage-report: + name: Report test coverage + runs-on: ubuntu-latest + needs: coverage + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Download artifact + - name: Download coverage artifact + id: download + uses: actions/download-artifact@v4 + with: + name: coverage + + # CodeClimate + - name: CodeClimate report + uses: paambaati/codeclimate-action@v5.0.0 + if: env.CC_TEST_REPORTER_ID + env: + CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} + with: + coverageLocations: | + ${{ steps.download.outputs.download-path }}/clover.xml:clover + + # codecov + - name: codecov report + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: | + ${{ steps.download.outputs.download-path }}/clover.xml + fail_ci_if_error: true + verbose: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1c8ac83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.Build +/config +/var +/.php-cs-fixer.cache +/.phpunit.result.cache diff --git a/.php-cs-fixer.php b/.php-cs-fixer.php new file mode 100644 index 0000000..03b24fd --- /dev/null +++ b/.php-cs-fixer.php @@ -0,0 +1,27 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +$config = \TYPO3\CodingStandards\CsFixerConfig::create(); +$config->getFinder()->in(__DIR__); + +return $config; diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..3538386 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,7 @@ +# Code of Conduct + +This project uses the +[TYPO3 Code of Conduct](https://typo3.org/community/values/code-of-conduct). + +When you contribute to this project or interact with community members, +you agree to adhere to this code of conduct. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..c541fd1 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,93 @@ +# Contributing + +Thanks for considering contributing to this extension! Since it is an open source +product, its successful further development depends largely on improving and +optimizing it together. + +The development of this extension follows the official +[TYPO3 coding standards](https://github.com/TYPO3/coding-standards). To ensure the +stability and cleanliness of the code, various code quality tools are used and most +components are covered with test cases. For continuous integration, we use GitHub Actions. + +## Preparation + +```bash +# Clone repository +git clone https://github.com/CPS-IT/mailqueue.git +cd mailqueue + +# Install dependencies +composer install +``` + +## Run linters + +```bash +# All linters +composer lint + +# Specific linters +composer lint:composer +composer lint:editorconfig +composer lint:php + +# Fix all CGL issues +composer fix + +# Fix specific CGL issues +composer fix:composer +composer fix:editorconfig +composer fix:php +``` + +## Run static code analysis + +```bash +# All static code analyzers +composer sca + +# Specific static code analyzers +composer sca:php +``` + +## Run tests + +```bash +# All tests +composer test + +# Specific tests +composer test:functional +composer test:unit + +# All tests with code coverage +composer test:coverage + +# Specific tests with code coverage +composer test:coverage:functional +composer test:coverage:unit + +# Merge code coverage of all test suites +composer test:coverage:merge +``` + +### Test reports + +Code coverage reports are written to `.Build/log/coverage`. You can open the +last merged HTML report like follows: + +```bash +open .Build/coverage/html/_merged/index.html +``` + +💡 Make sure to merge coverage reports as written above. + +## Submit a pull request + +Once you have finished your work, please **submit a pull request** and describe +what you've done. Ideally, your PR references an issue describing the problem +you're trying to solve. + +All described code quality tools are automatically executed on each pull request +for all currently supported PHP versions and TYPO3 versions. Take a look at the +appropriate [workflows](.github/workflows) to get a detailed overview. diff --git a/Classes/Command/ListQueueCommand.php b/Classes/Command/ListQueueCommand.php new file mode 100644 index 0000000..370d5e2 --- /dev/null +++ b/Classes/Command/ListQueueCommand.php @@ -0,0 +1,293 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Command; + +use CPSIT\Typo3Mailqueue\Enums; +use CPSIT\Typo3Mailqueue\Mail; +use Symfony\Component\Console; +use Symfony\Component\Mailer; +use Symfony\Component\Mime; +use TYPO3\CMS\Core; + +/** + * ListQueueCommand + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class ListQueueCommand extends Console\Command\Command +{ + private const WAIT_INTERVAL = 5; + + private Console\Style\SymfonyStyle $io; + + public function __construct( + private readonly Core\Mail\Mailer $mailer, + ) { + parent::__construct(); + } + + protected function configure(): void + { + $this->addOption( + 'strict', + 's', + Console\Input\InputOption::VALUE_NONE, + 'Exit with non-successful status code in case any mail transports are failing', + ); + $this->addOption( + 'watch', + 'w', + Console\Input\InputOption::VALUE_NONE, + sprintf( + 'Watch for changes within mail queue, e.g. if mails are sent (refreshes all %d seconds)', + self::WAIT_INTERVAL, + ), + ); + } + + protected function initialize(Console\Input\InputInterface $input, Console\Output\OutputInterface $output): void + { + $this->io = new Console\Style\SymfonyStyle($input, $output); + } + + protected function execute(Console\Input\InputInterface $input, Console\Output\OutputInterface $output): int + { + $strict = $input->getOption('strict'); + $watch = $input->getOption('watch'); + + $transport = $this->mailer->getTransport(); + $hasFailures = false; + + // Early return if unsupported mail transport is configured + if (!($transport instanceof Mail\Transport\QueueableTransport)) { + $this->io->error( + sprintf( + 'The configured mail transport "%s" is not supported. Please configure a mail spooler as mail transport.', + $transport::class, + ), + ); + + return self::INVALID; + } + + if ($watch) { + // Early return if --watch option is used on an unsupported output + if (!($output instanceof Console\Output\ConsoleOutput)) { + $this->io->error('The --watch option can only be used for console outputs.'); + + return self::FAILURE; + } + + $section = $output->section(); + + $this->io = new Console\Style\SymfonyStyle($input, $section); + + $this->watchForQueueUpdates($section, $transport); + } else { + $hasFailures = $this->decorateMailQueue($transport->getMailQueue()); + } + + if ($strict && $hasFailures) { + return self::FAILURE; + } + + return self::SUCCESS; + } + + private function watchForQueueUpdates( + Console\Output\ConsoleSectionOutput $section, + Mail\Transport\QueueableTransport $transport, + ): never { + while (true) { + $section->clear(); + + $this->decorateMailQueue($transport->getMailQueue()); + $this->io->writeln( + sprintf( + 'List is refreshed every %d seconds. Exit with Ctrl+C.', + self::WAIT_INTERVAL, + ), + ); + + sleep(self::WAIT_INTERVAL); + } + } + + private function decorateMailQueue(Mail\Queue\MailQueue $mailQueue): bool + { + $numberOfMailsInQueue = count($mailQueue); + + if ($numberOfMailsInQueue === 0) { + $this->io->success('No mails are currently in queue.'); + + return false; + } + + $this->io->section( + sprintf('Total mails in queue: %d', $numberOfMailsInQueue), + ); + + if ($this->io->isVerbose()) { + return $this->renderAsTable($mailQueue); + } + + return $this->renderAsList($mailQueue); + } + + private function renderAsTable(Mail\Queue\MailQueue $mailQueue): bool + { + $hasDate = false; + $hasFailures = false; + + $headers = ['State', 'Date', 'Subject', 'Recipient(s)', 'Sender']; + $rows = []; + + /** @var Mail\Queue\MailQueueItem $mailQueueItem */ + foreach ($mailQueue as $mailQueueItem) { + if ($mailQueueItem->date !== null) { + $hasDate = true; + } + + $rows[] = [ + $this->decorateState($mailQueueItem->state), + $mailQueueItem->date?->format('Y-m-d H:i:s') ?? 'Unknown', + $this->getMailSubject($mailQueueItem->message), + $this->getMailRecipients($mailQueueItem->message), + $mailQueueItem->message->getEnvelope()->getSender()->getAddress(), + ]; + + if ($mailQueueItem->state === Enums\MailState::Failed) { + $hasFailures = true; + } + } + + if (!$hasDate) { + unset($headers[1]); + + foreach (array_keys($rows) as $number) { + unset($rows[$number][1]); + } + } + + $this->io->createTable() + ->setStyle('default') + ->setHeaders($headers) + ->setRows($rows) + ->render() + ; + + $this->io->newLine(); + + return $hasFailures; + } + + private function renderAsList(Mail\Queue\MailQueue $mailQueue): bool + { + $hasFailures = false; + + /** @var Mail\Queue\MailQueueItem $mailQueueItem */ + foreach ($mailQueue as $mailQueueItem) { + if ($mailQueueItem->date !== null) { + $this->io->writeln( + sprintf( + '%s %s %s (to %s)', + $this->decorateState($mailQueueItem->state), + $mailQueueItem->date->format('Y-m-d H:i:s'), + $this->getMailSubject($mailQueueItem->message, 30), + $this->getMailRecipients($mailQueueItem->message), + ), + ); + } else { + $this->io->writeln( + sprintf( + '%s %s (to %s)', + $this->decorateState($mailQueueItem->state), + $this->getMailSubject($mailQueueItem->message, 50), + $this->getMailRecipients($mailQueueItem->message), + ), + ); + } + + if ($mailQueueItem->state === Enums\MailState::Failed) { + $hasFailures = true; + } + } + + $this->io->newLine(); + + return $hasFailures; + } + + private function decorateState(Enums\MailState $state): string + { + return match ($state) { + Enums\MailState::Failed => ' FAIL ', + Enums\MailState::Queued => ' WAIT ', + Enums\MailState::Sending => ' SEND ', + Enums\MailState::AlreadySent, Enums\MailState::Sent => ' SENT ', + }; + } + + private function getMailSubject(Mailer\SentMessage $message, int $crop = 0): ?string + { + $subject = null; + + if ($message->getMessage() instanceof Mime\Email) { + $subject = $message->getMessage()->getSubject(); + } + + if ($subject === null && $message->getOriginalMessage() instanceof Mime\Email) { + $subject = $message->getOriginalMessage()->getSubject(); + } + + if ($subject === null) { + return null; + } + + if ($crop > 0 && mb_strlen($subject) > $crop) { + return mb_substr($subject, 0, $crop) . '…'; + } + + return $subject; + } + + private function getMailRecipients(Mailer\SentMessage $message): string + { + $allRecipients = $message->getEnvelope()->getRecipients(); + + if ($allRecipients === []) { + return 'None'; + } + + $address = array_shift($allRecipients)->getAddress(); + $recipients = sprintf('%1$s', $address); + + if ($allRecipients !== []) { + $recipients .= sprintf(' +%d more', count($allRecipients)); + } + + return $recipients; + } +} diff --git a/Classes/Controller/MailqueueModuleController.php b/Classes/Controller/MailqueueModuleController.php new file mode 100644 index 0000000..a01d1c2 --- /dev/null +++ b/Classes/Controller/MailqueueModuleController.php @@ -0,0 +1,188 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Controller; + +use CPSIT\Typo3Mailqueue\Enums; +use CPSIT\Typo3Mailqueue\Mail; +use CPSIT\Typo3Mailqueue\Traits; +use Psr\Http\Message; +use Symfony\Component\Mailer; +use TYPO3\CMS\Backend; +use TYPO3\CMS\Core; +use TYPO3\CMS\Fluid; + +/** + * MailqueueModuleController + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class MailqueueModuleController +{ + use Traits\TranslatableTrait; + + private readonly Core\Information\Typo3Version $typo3Version; + + public function __construct( + private readonly Core\Imaging\IconFactory $iconFactory, + private readonly Backend\Template\ModuleTemplateFactory $moduleTemplateFactory, + private readonly Core\Mail\Mailer $mailer, + private readonly Backend\Routing\UriBuilder $uriBuilder, + ) { + $this->typo3Version = new Core\Information\Typo3Version(); + } + + public function __invoke(Message\ServerRequestInterface $request): Message\ResponseInterface + { + $template = $this->moduleTemplateFactory->create($request); + $transport = $this->mailer->getTransport(); + $sendId = $request->getQueryParams()['send'] ?? null; + $templateVariables = []; + + if ($transport instanceof Mail\Transport\QueueableTransport) { + $templateVariables = $this->resolveTemplateVariables($transport, $sendId); + } else { + $templateVariables['unsupportedTransport'] = $transport::class; + } + + // @todo Remove once support for TYPO3 v11 is dropped + $templateVariables['layout'] = $this->typo3Version->getMajorVersion() < 12 ? 'Default' : 'Module'; + + if (Core\Utility\ExtensionManagementUtility::isLoaded('lowlevel')) { + $this->addLinkToConfigurationModule($template); + } + + // @todo Remove once support for TYPO3 v11 is dropped + if ($this->typo3Version->getMajorVersion() < 12) { + return $this->renderLegacyTemplate($template, $templateVariables); + } + + return $template + ->assignMultiple($templateVariables) + ->renderResponse('List') + ; + } + + /** + * @return array{ + * failing: bool, + * longestPendingInterval: non-negative-int, + * sendResult: Enums\MailState|null, + * transport: Mail\Transport\QueueableTransport, + * } + */ + private function resolveTemplateVariables( + Mail\Transport\QueueableTransport $transport, + string $sendId = null, + ): array { + $failing = false; + $longestPendingInterval = 0; + $now = time(); + $sendResult = null; + + if (is_string($sendId)) { + $sendResult = $this->sendMail($transport, $sendId); + } + + foreach ($transport->getMailQueue() as $mailQueueItem) { + if ($mailQueueItem->date !== null) { + $longestPendingInterval = max($longestPendingInterval, $now - $mailQueueItem->date->getTimestamp()); + } + + if ($mailQueueItem->state === Enums\MailState::Failed) { + $failing = true; + } + } + + return [ + 'failing' => $failing, + 'longestPendingInterval' => $longestPendingInterval, + 'sendResult' => $sendResult, + 'transport' => $transport, + ]; + } + + private function sendMail(Mail\Transport\QueueableTransport $transport, string $queueItemId): Enums\MailState + { + $mailQueueItem = null; + + foreach ($transport->getMailQueue() as $item) { + if ($item->id === $queueItemId) { + $mailQueueItem = $item; + break; + } + } + + if ($mailQueueItem === null) { + return Enums\MailState::AlreadySent; + } + + try { + $transport->dequeue($mailQueueItem, $this->mailer->getRealTransport()); + } catch (Mailer\Exception\TransportExceptionInterface) { + return Enums\MailState::Failed; + } + + return Enums\MailState::Sent; + } + + private function addLinkToConfigurationModule(Backend\Template\ModuleTemplate $template): void + { + $buttonBar = $template->getDocHeaderComponent()->getButtonBar(); + + $button = $buttonBar->makeLinkButton(); + $button->setHref( + (string)$this->uriBuilder->buildUriFromRoute( + 'system_config', + ['node' => ['MAIL' => 1], 'tree' => 'confVars'], + ) + ); + $button->setIcon($this->iconFactory->getIcon('actions-cog', Core\Imaging\Icon::SIZE_SMALL)); + $button->setTitle(self::translate('button.config')); + $button->setShowLabelText(true); + + $buttonBar->addButton($button); + } + + /** + * @todo Remove once support for TYPO3 v11 is dropped + * + * @param array $templateVariables + */ + private function renderLegacyTemplate( + Backend\Template\ModuleTemplate $template, + array $templateVariables, + ): Core\Http\HtmlResponse { + $view = Core\Utility\GeneralUtility::makeInstance(Fluid\View\StandaloneView::class); + $view->setTemplateRootPaths(['EXT:mailqueue/Resources/Private/Templates/']); + $view->setPartialRootPaths(['EXT:mailqueue/Resources/Private/Partials/']); + $view->setLayoutRootPaths(['EXT:mailqueue/Resources/Private/Layouts/']); + $view->setTemplate('List'); + $view->assignMultiple($templateVariables); + + $template->setContent($view->render()); + + return new Core\Http\HtmlResponse($template->renderContent()); + } +} diff --git a/Classes/Enums/MailState.php b/Classes/Enums/MailState.php new file mode 100644 index 0000000..1eb22ef --- /dev/null +++ b/Classes/Enums/MailState.php @@ -0,0 +1,39 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Enums; + +/** + * MailState + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +enum MailState: string +{ + case AlreadySent = 'alreadySent'; + case Failed = 'failed'; + case Queued = 'queued'; + case Sending = 'sending'; + case Sent = 'sent'; +} diff --git a/Classes/Exception/Exception.php b/Classes/Exception/Exception.php new file mode 100644 index 0000000..9eb553d --- /dev/null +++ b/Classes/Exception/Exception.php @@ -0,0 +1,32 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Exception; + +/** + * Exception + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +abstract class Exception extends \Exception {} diff --git a/Classes/Exception/FileDoesNotExist.php b/Classes/Exception/FileDoesNotExist.php new file mode 100644 index 0000000..b350ef8 --- /dev/null +++ b/Classes/Exception/FileDoesNotExist.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Exception; + +/** + * FileDoesNotExist + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class FileDoesNotExist extends Exception +{ + public function __construct(string $file) + { + parent::__construct( + sprintf('The file "%s" does not exist.', $file), + 1709301996, + ); + } +} diff --git a/Classes/Exception/FilePathIsNotConfigured.php b/Classes/Exception/FilePathIsNotConfigured.php new file mode 100644 index 0000000..ab74ed5 --- /dev/null +++ b/Classes/Exception/FilePathIsNotConfigured.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Exception; + +/** + * FilePathIsNotConfigured + * + * @author Elias Häußler + * @license GPL-3.0-or-later + */ +final class FilePathIsNotConfigured extends Exception +{ + public function __construct() + { + parent::__construct( + 'File path for mail queue is not configured. Please configured it in $GLOBALS[\'MAIL\'][\'transport_spool_filepath\'].', + 1709300915, + ); + } +} diff --git a/Classes/Exception/SerializedFailureMetadataIsInvalid.php b/Classes/Exception/SerializedFailureMetadataIsInvalid.php new file mode 100644 index 0000000..22c16f8 --- /dev/null +++ b/Classes/Exception/SerializedFailureMetadataIsInvalid.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Exception; + +/** + * SerializedFailureMetadataIsInvalid + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class SerializedFailureMetadataIsInvalid extends Exception +{ + public function __construct(string $file) + { + parent::__construct( + sprintf('The file "%s" does not contain valid serialized transport failure metadata.', $file), + 1709302090, + ); + } +} diff --git a/Classes/Exception/SerializedMessageIsInvalid.php b/Classes/Exception/SerializedMessageIsInvalid.php new file mode 100644 index 0000000..3312363 --- /dev/null +++ b/Classes/Exception/SerializedMessageIsInvalid.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Exception; + +/** + * SerializedMessageIsInvalid + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class SerializedMessageIsInvalid extends Exception +{ + public function __construct(string $file) + { + parent::__construct( + sprintf('The file "%s" does not contain a valid serialized message.', $file), + 1709133596, + ); + } +} diff --git a/Classes/Extension.php b/Classes/Extension.php new file mode 100644 index 0000000..f29e858 --- /dev/null +++ b/Classes/Extension.php @@ -0,0 +1,82 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue; + +use TYPO3\CMS\Core; + +/** + * Extension + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class Extension +{ + public const KEY = 'mailqueue'; + + /** + * Register custom XClasses. + * + * FOR USE IN ext_localconf.php ONLY. + */ + public static function registerXClasses(): void + { + $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][Core\Mail\FileSpool::class] = [ + 'className' => Mail\Transport\QueueableFileTransport::class, + ]; + $GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][Core\Mail\MemorySpool::class] = [ + 'className' => Mail\Transport\QueueableMemoryTransport::class, + ]; + } + + /** + * Register custom backend modules. + * + * FOR USE IN ext_tables.php ONLY. + * + * @todo Remove once support for TYPO3 v11 is dropped + */ + public static function registerBackendModules(): void + { + // Backend module configuration in TYPO3 >= v12 is done in Configuration/Backend/Modules.php + if ((new Core\Information\Typo3Version())->getMajorVersion() >= 12) { + return; + } + + Core\Utility\ExtensionManagementUtility::addModule( + 'system', + 'mailqueue', + 'bottom', + null, + [ + 'routeTarget' => \CPSIT\Typo3Mailqueue\Controller\MailqueueModuleController::class, + 'access' => 'admin', + 'id' => 'system_mailqueue', + 'name' => 'system_mailqueue', + 'iconIdentifier' => 'tx-mailqueue-module', + 'labels' => 'LLL:EXT:mailqueue/Resources/Private/Language/locallang_mod_mailqueue.xlf', + ], + ); + } +} diff --git a/Classes/Mail/Iterator/FileIterator.php b/Classes/Mail/Iterator/FileIterator.php new file mode 100644 index 0000000..b5893d1 --- /dev/null +++ b/Classes/Mail/Iterator/FileIterator.php @@ -0,0 +1,50 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Iterator; + +use CPSIT\Typo3Mailqueue\Mail; +use FilterIterator; +use SplFileInfo; +use Traversable; + +/** + * FileIterator + * + * @author Elias Häußler + * @license GPL-2.0-or-later + * + * @template-extends FilterIterator> + */ +final class FileIterator extends FilterIterator +{ + public function accept(): bool + { + $file = $this->getInnerIterator()->current(); + $path = $file->getRealPath(); + + return str_ends_with($path, Mail\Transport\QueueableFileTransport::FILE_SUFFIX_QUEUED) + || str_ends_with($path, Mail\Transport\QueueableFileTransport::FILE_SUFFIX_SENDING) + ; + } +} diff --git a/Classes/Mail/Queue/MailQueue.php b/Classes/Mail/Queue/MailQueue.php new file mode 100644 index 0000000..8e42377 --- /dev/null +++ b/Classes/Mail/Queue/MailQueue.php @@ -0,0 +1,92 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Queue; + +use ArrayIterator; +use Countable; +use IteratorAggregate; +use Traversable; + +/** + * MailQueue + * + * @author Elias Häußler + * @license GPL-2.0-or-later + * + * @implements IteratorAggregate + */ +final class MailQueue implements Countable, IteratorAggregate +{ + /** + * @param callable(): Traversable $readQueueFn + */ + public function __construct( + private $readQueueFn, + ) {} + + /** + * @return list + */ + public function get(): array + { + return array_values(iterator_to_array($this)); + } + + public function count(): int + { + $queue = ($this->readQueueFn)(); + + if (is_countable($queue)) { + return count($queue); + } + + return count(iterator_to_array($queue)); + } + + /** + * @return ArrayIterator + */ + public function getIterator(): ArrayIterator + { + $iterator = ($this->readQueueFn)(); + $queue = iterator_to_array($iterator); + + usort($queue, self::orderQueueItems(...)); + + return new ArrayIterator($queue); + } + + private static function orderQueueItems(MailQueueItem $a, MailQueueItem $b): int + { + if ($a->date < $b->date) { + return -1; + } + + if ($a->date > $b->date) { + return 1; + } + + return 0; + } +} diff --git a/Classes/Mail/Queue/MailQueueItem.php b/Classes/Mail/Queue/MailQueueItem.php new file mode 100644 index 0000000..46e8c09 --- /dev/null +++ b/Classes/Mail/Queue/MailQueueItem.php @@ -0,0 +1,46 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Queue; + +use CPSIT\Typo3Mailqueue\Enums; +use CPSIT\Typo3Mailqueue\Mail; +use DateTimeInterface; +use Symfony\Component\Mailer; + +/** + * MailQueueItem + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class MailQueueItem +{ + public function __construct( + public readonly string $id, + public readonly Mailer\SentMessage $message, + public readonly Enums\MailState $state, + public readonly ?DateTimeInterface $date = null, + public readonly ?Mail\TransportFailure $failure = null, + ) {} +} diff --git a/Classes/Mail/Transport/QueueableFileTransport.php b/Classes/Mail/Transport/QueueableFileTransport.php new file mode 100644 index 0000000..549fb2a --- /dev/null +++ b/Classes/Mail/Transport/QueueableFileTransport.php @@ -0,0 +1,255 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Transport; + +use CPSIT\Typo3Mailqueue\Enums; +use CPSIT\Typo3Mailqueue\Exception; +use CPSIT\Typo3Mailqueue\Mail; +use DateTimeImmutable; +use DirectoryIterator; +use Generator; +use Psr\Log; +use SplFileInfo; +use Symfony\Component\Mailer; +use Symfony\Component\Mime; +use Symfony\Contracts\EventDispatcher; +use TYPO3\CMS\Core; + +/** + * QueueableFileTransport + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class QueueableFileTransport extends Core\Mail\FileSpool implements QueueableTransport +{ + public const FILE_SUFFIX_QUEUED = '.message'; + public const FILE_SUFFIX_SENDING = '.message.sending'; + public const FILE_SUFFIX_FAILURE_DATA = '.message.failure'; + + private readonly Core\Context\Context $context; + + public function __construct( + string $path, + ?EventDispatcher\EventDispatcherInterface $dispatcher = null, + ?Log\LoggerInterface $logger = null, + ) { + parent::__construct($path, $dispatcher, $logger); + $this->context = Core\Utility\GeneralUtility::makeInstance(Core\Context\Context::class); + } + + public function recover(int $timeout = 900): void + { + $iterator = new DirectoryIterator($this->path); + + // Remove failure metadata + foreach ($iterator as $file) { + $path = (string)$file->getRealPath(); + + if (str_ends_with($path, self::FILE_SUFFIX_FAILURE_DATA)) { + unlink($path); + } + } + + // Recover stuck transports + parent::recover($timeout); + } + + /** + * @throws Exception\SerializedMessageIsInvalid + * @throws Mailer\Exception\TransportExceptionInterface + */ + public function flushQueue(Mailer\Transport\TransportInterface $transport): int + { + $directoryIterator = new DirectoryIterator($this->path); + $execTime = $this->context->getPropertyFromAspect('date', 'timestamp'); + $time = time(); + $count = 0; + + foreach ($directoryIterator as $file) { + $path = (string)$file->getRealPath(); + + if (!str_ends_with($path, self::FILE_SUFFIX_QUEUED)) { + continue; + } + + $item = $this->restoreItem($file); + + if ($this->dequeue($item, $transport)) { + $count++; + } else { + // This message has just been caught by another process + continue; + } + + if ($this->getMessageLimit() && $count >= $this->getMessageLimit()) { + break; + } + + if ($this->getTimeLimit() && ($execTime - $time) >= $this->getTimeLimit()) { + break; + } + } + + return $count; + } + + public function enqueue(Mail\Queue\MailQueueItem $item): void + { + $this->send($item->message->getOriginalMessage(), $item->message->getEnvelope()); + } + + public function dequeue(Mail\Queue\MailQueueItem $item, Mailer\Transport\TransportInterface $transport): bool + { + $path = $this->path . DIRECTORY_SEPARATOR . $item->id; + $sendingPath = $this->getItemVariant($path, self::FILE_SUFFIX_SENDING); + $failurePath = $this->getItemVariant($path, self::FILE_SUFFIX_FAILURE_DATA); + + // We try a rename, it's an atomic operation, and avoid locking the file + if ($path !== $sendingPath && !rename($path, $sendingPath)) { + return false; + } + + try { + $transport->send($item->message->getMessage(), $item->message->getEnvelope()); + } catch (Mailer\Exception\TransportExceptionInterface $exception) { + $this->flagFailedTransport($sendingPath, $exception); + + throw $exception; + } + + // Remove message from queue + unlink($sendingPath); + + // Remove failure metadata + if (file_exists($failurePath)) { + unlink($failurePath); + } + + return true; + } + + public function getMailQueue(): Mail\Queue\MailQueue + { + return new Mail\Queue\MailQueue( + $this->initializeQueueFromFilePath(...), + ); + } + + private function flagFailedTransport(string $file, Mailer\Exception\TransportExceptionInterface $exception): void + { + $failure = Mail\TransportFailure::fromException($exception); + $failurePath = $this->getItemVariant($file, self::FILE_SUFFIX_FAILURE_DATA); + + file_put_contents($failurePath, serialize($failure)); + } + + /** + * @return Generator + */ + private function initializeQueueFromFilePath(): Generator + { + $iterator = new Mail\Iterator\FileIterator(new DirectoryIterator($this->path)); + + foreach ($iterator as $file) { + yield $this->restoreItem($file); + } + } + + /** + * @throws Exception\SerializedMessageIsInvalid + */ + private function restoreItem(SplFileInfo $file): Mail\Queue\MailQueueItem + { + $path = (string)$file->getRealPath(); + $lastChanged = $file->getMTime(); + + // Unserialize message + $message = unserialize((string)file_get_contents($path), [ + 'allowedClasses' => [ + Mime\RawMessage::class, + Mime\Message::class, + Mime\Email::class, + Mailer\DelayedEnvelope::class, + Mailer\Envelope::class, + ], + ]); + + if (!($message instanceof Mailer\SentMessage)) { + throw new Exception\SerializedMessageIsInvalid($path); + } + + // Define mail state + if (str_ends_with($path, self::FILE_SUFFIX_SENDING)) { + $state = Enums\MailState::Sending; + $failure = $this->findFailureMetadata($path); + } else { + $state = Enums\MailState::Queued; + $failure = null; + } + + // Enforce failure if failure metadata were found + if ($failure !== null) { + $state = Enums\MailState::Failed; + } + + // Add last modification date + if ($lastChanged !== false) { + $date = new DateTimeImmutable('@' . $lastChanged); + } else { + $date = null; + } + + return new Mail\Queue\MailQueueItem($file->getFilename(), $message, $state, $date, $failure); + } + + private function findFailureMetadata(string $file): ?Mail\TransportFailure + { + $failurePath = $this->getItemVariant($file, self::FILE_SUFFIX_FAILURE_DATA); + + try { + return Mail\TransportFailure::fromFile($failurePath); + } catch (Exception\FileDoesNotExist|Exception\SerializedFailureMetadataIsInvalid) { + return null; + } + } + + private function getItemVariant(string $file, string $suffix): string + { + $variants = array_diff( + [ + self::FILE_SUFFIX_FAILURE_DATA, + self::FILE_SUFFIX_QUEUED, + self::FILE_SUFFIX_SENDING, + ], + [$suffix], + ); + + return (string)preg_replace( + sprintf('/(%s)$/', implode('|', array_map('preg_quote', $variants))), + $suffix, + $file, + ); + } +} diff --git a/Classes/Mail/Transport/QueueableMemoryTransport.php b/Classes/Mail/Transport/QueueableMemoryTransport.php new file mode 100644 index 0000000..e415b15 --- /dev/null +++ b/Classes/Mail/Transport/QueueableMemoryTransport.php @@ -0,0 +1,78 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Transport; + +use CPSIT\Typo3Mailqueue\Enums; +use CPSIT\Typo3Mailqueue\Mail; +use Generator; +use Symfony\Component\Mailer; +use TYPO3\CMS\Core; + +/** + * QueueableMemoryTransport + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class QueueableMemoryTransport extends Core\Mail\MemorySpool implements QueueableTransport +{ + public function enqueue(Mail\Queue\MailQueueItem $item): void + { + $this->send($item->message->getOriginalMessage(), $item->message->getEnvelope()); + } + + public function dequeue(Mail\Queue\MailQueueItem $item, Mailer\Transport\TransportInterface $transport): bool + { + $transport->send($item->message->getMessage(), $item->message->getEnvelope()); + + $queueId = array_search($item->message, $this->queuedMessages, true); + + if ($queueId !== false) { + unset($this->queuedMessages[$queueId]); + } + + return true; + } + + public function getMailQueue(): Mail\Queue\MailQueue + { + return new Mail\Queue\MailQueue( + $this->initializeQueue(...), + ); + } + + /** + * @return Generator + */ + private function initializeQueue(): Generator + { + foreach ($this->queuedMessages as $key => $queuedMessage) { + yield new Mail\Queue\MailQueueItem( + $key, + $queuedMessage, + Enums\MailState::Queued, + ); + } + } +} diff --git a/Classes/Mail/Transport/QueueableTransport.php b/Classes/Mail/Transport/QueueableTransport.php new file mode 100644 index 0000000..17d1d1c --- /dev/null +++ b/Classes/Mail/Transport/QueueableTransport.php @@ -0,0 +1,49 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail\Transport; + +use CPSIT\Typo3Mailqueue\Mail; +use Symfony\Component\Mailer; +use TYPO3\CMS\Core; + +/** + * QueueableTransport + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +interface QueueableTransport extends Core\Mail\DelayedTransportInterface +{ + public function getMailQueue(): Mail\Queue\MailQueue; + + /** + * @throws Mailer\Exception\TransportExceptionInterface + */ + public function enqueue(Mail\Queue\MailQueueItem $item): void; + + /** + * @throws Mailer\Exception\TransportExceptionInterface + */ + public function dequeue(Mail\Queue\MailQueueItem $item, Mailer\Transport\TransportInterface $transport): bool; +} diff --git a/Classes/Mail/TransportFailure.php b/Classes/Mail/TransportFailure.php new file mode 100644 index 0000000..e8bf054 --- /dev/null +++ b/Classes/Mail/TransportFailure.php @@ -0,0 +1,75 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Mail; + +use CPSIT\Typo3Mailqueue\Exception; +use DateTimeImmutable; +use Symfony\Component\Mailer; + +/** + * TransportFailure + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class TransportFailure +{ + public function __construct( + public readonly string $exception, + public readonly string $message, + public readonly DateTimeImmutable $date, + ) {} + + public static function fromException(Mailer\Exception\TransportExceptionInterface $exception): self + { + return new self( + $exception::class, + $exception->getMessage(), + new DateTimeImmutable(), + ); + } + + /** + * @throws Exception\FileDoesNotExist + * @throws Exception\SerializedFailureMetadataIsInvalid + */ + public static function fromFile(string $file): self + { + if (!file_exists($file)) { + throw new Exception\FileDoesNotExist($file); + } + + $failure = unserialize((string)file_get_contents($file), [ + 'allowedClasses' => [ + DateTimeImmutable::class, + ], + ]); + + if (!($failure instanceof self)) { + throw new Exception\SerializedFailureMetadataIsInvalid($file); + } + + return $failure; + } +} diff --git a/Classes/Traits/TranslatableTrait.php b/Classes/Traits/TranslatableTrait.php new file mode 100644 index 0000000..95b8e61 --- /dev/null +++ b/Classes/Traits/TranslatableTrait.php @@ -0,0 +1,53 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\Traits; + +use TYPO3\CMS\Core; + +/** + * TranslatableTrait + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +trait TranslatableTrait +{ + private static ?Core\Localization\LanguageService $languageService = null; + + /** + * @param list $arguments + */ + protected static function translate(string $key, array $arguments = []): string + { + self::$languageService ??= Core\Utility\GeneralUtility::makeInstance(Core\Localization\LanguageServiceFactory::class) + ->createFromUserPreferences($GLOBALS['BE_USER']); + + return vsprintf( + self::$languageService->sL( + sprintf('LLL:EXT:mailqueue/Resources/Private/Language/locallang.xlf:%s', $key), + ), + $arguments, + ); + } +} diff --git a/Classes/ViewHelpers/DateIntervalViewHelper.php b/Classes/ViewHelpers/DateIntervalViewHelper.php new file mode 100644 index 0000000..8e36eb5 --- /dev/null +++ b/Classes/ViewHelpers/DateIntervalViewHelper.php @@ -0,0 +1,58 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\ViewHelpers; + +use Closure; +use DateTimeInterface; +use TYPO3Fluid\Fluid; + +/** + * DateIntervalViewHelper + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class DateIntervalViewHelper extends Fluid\Core\ViewHelper\AbstractViewHelper +{ + use Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic; + + public function initializeArguments(): void + { + $this->registerArgument('date', DateTimeInterface::class, 'The date for which to create an interval'); + } + + public static function renderStatic( + array $arguments, + Closure $renderChildrenClosure, + Fluid\Core\Rendering\RenderingContextInterface $renderingContext, + ): ?int { + $date = $renderChildrenClosure(); + + if (!($date instanceof DateTimeInterface)) { + return null; + } + + return time() - $date->getTimestamp(); + } +} diff --git a/Classes/ViewHelpers/Format/HumanDateViewHelper.php b/Classes/ViewHelpers/Format/HumanDateViewHelper.php new file mode 100644 index 0000000..d4f97da --- /dev/null +++ b/Classes/ViewHelpers/Format/HumanDateViewHelper.php @@ -0,0 +1,104 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +namespace CPSIT\Typo3Mailqueue\ViewHelpers\Format; + +use Closure; +use CPSIT\Typo3Mailqueue\Traits; +use DateInterval; +use DateTimeImmutable; +use DateTimeInterface; +use TYPO3Fluid\Fluid; + +/** + * HumanDateViewHelper + * + * @author Elias Häußler + * @license GPL-2.0-or-later + */ +final class HumanDateViewHelper extends Fluid\Core\ViewHelper\AbstractViewHelper +{ + use Fluid\Core\ViewHelper\Traits\CompileWithContentArgumentAndRenderStatic; + use Traits\TranslatableTrait; + + public function initializeArguments(): void + { + $this->registerArgument('date', DateTimeInterface::class, 'The date to format'); + } + + public static function renderStatic( + array $arguments, + Closure $renderChildrenClosure, + Fluid\Core\Rendering\RenderingContextInterface $renderingContext, + ): ?string { + $date = $renderChildrenClosure(); + + if (!($date instanceof DateTimeInterface)) { + return null; + } + + $now = new DateTimeImmutable(); + $delta = $now->getTimestamp() - $date->getTimestamp(); + $interval = $now->diff($date); + + return self::renderHumanDateInterval($date, $delta, $interval); + } + + private static function renderHumanDateInterval(DateTimeInterface $date, int $delta, DateInterval $interval): string + { + if ($delta <= 30) { + return self::translate('humanDate.now'); + } + if ($delta <= 60) { + return self::translate('humanDate.seconds'); + } + if ($delta <= 60 * 60) { + return self::formatInterval($interval->i, 'minute'); + } + if ($delta <= 60 * 60 * 24) { + return self::formatInterval($interval->h, 'hour'); + } + if ($delta <= 60 * 60 * 24 * 7) { + return self::formatInterval($interval->d, 'day'); + } + + return self::formatDate($date); + } + + private static function formatInterval(int $interval, string $unit): string + { + if ($interval !== 1) { + $unit .= 's'; + } + + return self::translate( + sprintf('humanDate.%s', $unit), + [$interval], + ); + } + + private static function formatDate(DateTimeInterface $date): string + { + return $date->format('Y-m-d H:i:s'); + } +} diff --git a/Configuration/Backend/Modules.php b/Configuration/Backend/Modules.php new file mode 100644 index 0000000..0d81bf4 --- /dev/null +++ b/Configuration/Backend/Modules.php @@ -0,0 +1,40 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +use CPSIT\Typo3Mailqueue\Controller; + +return [ + 'system_mailqueue' => [ + 'parent' => 'system', + 'position' => ['bottom'], + 'access' => 'admin', + 'workspaces' => 'live', + 'iconIdentifier' => 'tx-mailqueue-module', + 'labels' => 'LLL:EXT:mailqueue/Resources/Private/Language/locallang_mod_mailqueue.xlf', + 'routes' => [ + '_default' => [ + 'target' => Controller\MailqueueModuleController::class, + ], + ], + ], +]; diff --git a/Configuration/Icons.php b/Configuration/Icons.php new file mode 100644 index 0000000..ee2ef6b --- /dev/null +++ b/Configuration/Icons.php @@ -0,0 +1,29 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +return [ + 'tx-mailqueue-module' => [ + 'provider' => \TYPO3\CMS\Core\Imaging\IconProvider\SvgIconProvider::class, + 'source' => 'EXT:mailqueue/Resources/Public/Icons/module.svg', + ], +]; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml new file mode 100644 index 0000000..ea7cb99 --- /dev/null +++ b/Configuration/Services.yaml @@ -0,0 +1,25 @@ +services: + _defaults: + autowire: true + autoconfigure: true + public: false + + CPSIT\Typo3Mailqueue\: + resource: '../Classes/*' + exclude: + - '../Classes/Enums/*' + - '../Classes/Exception/*' + - '../Classes/Mail/*' + - '../Classes/Traits/*' + + CPSIT\Typo3Mailqueue\Controller\MailqueueModuleController: + # @todo Replace with #[AsController] attribute once support for TYPO3 v11 is dropped + tags: ['backend.controller'] + + CPSIT\Typo3Mailqueue\Command\ListQueueCommand: + # @todo Replace with #[AsCommand] attribute once support for TYPO3 v11 is dropped + tags: + - name: console.command + command: 'mailqueue:listqueue' + description: 'List all currently enqueued mails' + schedulable: false diff --git a/Documentation/Images/ScreenshotBackendModule.png b/Documentation/Images/ScreenshotBackendModule.png new file mode 100644 index 0000000000000000000000000000000000000000..f54ae8bd1d49b8cabbd6581a5ad683fd10259e95 GIT binary patch literal 103141 zcmZU)WmH>H*EI?Rf+e^Fhf*j`fQv!YjCGm&uWVsVP|G;>jmmm6E#tkTwQkq1Z@$KfHhNpqIp65XIpNyCMEDhFAlcvt5>&zM{N&1jqR2y*Zzkmzmyc%yh{ z;Gp5(bVZKd^2$@gA;ER)VK#E=()}!+;=Um0y(BpD!soaKJmP~L>yDHZ5?n|B9X>8s z8&CbiC7(jmmw(Y4&6S`v_$r%s7!4wK9g};NJXSP#b1~E0IdHyzKIe+;vlto>dXU%I z>q`6WDMq)LywgmyFZ+d4in4_N(06gCMRRvXbu6Gg(^Ul%RL9LDTV6$3U{Nv$=5MTa&HALZ6kopBY!5{( zjr-ug;`cAVjTWt7uuaJ+I-}UXbox6sU_vW=ZmzdB<~nmvdKp-@F-tR+@#*VHwAl9T z=43ayfhGgp%OrWG!x#Vu8Oio5HdezOnI2DR!PsW`-#o>g%SzudR9-Tunl55l8e@!e z*IYiz}qxL$rk8zbNv=;>yGQd1(fg0~?q0r$96E-`5530-3A z8ECZ(WU&|nEZye>w^)XesyY~Iw1z(KfPiGJAOnJF^ypXfLJ*5|5DfYO;H}Hx#7wiI zv=jK|%{O^}3(XWp7qoqaLE{b4UqgL0DH#6egEG4HZRX(+qxqH#39tE`NEgEPzqtuAC$Erv>#gELQTX9 z79dv7xNc=T!Z+cEw*5X-MFIU6+W-17E5)ElQ2d*kSq-V{98w5rQP7HLKEeqDY^G;l zcCF}d&^?&35qi;jLuqvt>6 zA1=?n5FVCnSwTANRfH8T6yF;4WyNH z9LU-crcMl;J%Hqk)#?#H%%oL)dK>$Jc+ToK2`YJNBeXUJ0&DMic{5JGb+&gOGKS#1 zZOoea%{y2to^uRbX=Qvp?~*<0%lHp>Cv@3SIp10l)aHzIPUw+KiqpuGRnho-!7j@s?|{ zOLp@JGok5_4Q3`8IoX_JKyj`KjW7O)1<+HqxQM%Pt<{VY9RhR$EcTb0u-B8|4*lDUwX> z`R!aNlCf^z=KhhYn*pv={^=(~4G1GI$0hWpWaFoYrCq;p^vd&r*nyPi7 zEM_{gW9(rvwq7;6;I2YyqY{nNpgM5!`k|5mHw$LeCegF2y%^QQ1hdJ1OZiib;gbV` zS{;ZT>pkK_5Gq@#VY`MN^3Uv|p{$;a11KNc?AzfOMzcR7aDaz9NOQa<+`Oh{wDqp} z@Py~ixkkj!&j3ws4?&VeQ)gr8m{eAFET%(D7HJ6k%ChW{QqAug>E%F&lS$Gq*g4iH z!^v7Db}P`05ae6u-da1^j=RbxVvfA}ZFXh2!BMc!H#5H?1-QN-?(FLH+=T0~GUOnVd^w_eA!@MFL9|ip4@^0JzcR3#ybEuGWNoI`hCkjyk{QLX8XDEFUgT!WjGVtnH5Zce2+7Nt z`jiv*Foy5Bcih32l5rv;N%(WG?r#QH2UO%0xmgocIvIXzQE)&_xcz7@spvY&F)r0V zCwdPx9DG7e21rIvo31^hragL|hu6*05cF4aB|qUR?#fxz5D{QtK)&eR|9X2m2#@vw zX0?kNH~T@=vQ=jSIOjC{gE6Z<5X<5;y^br`57I4i^9b%PRr`qP|JgbhuT^rEiyFLz z4|MQ=X&P=6xOb38%zL9XtV{!TzMi!Z)tZB&du@di{jPjnQb%J$sHwxMSng6r3Sv5$ zp~iVop9mTyW|L7<;NVuvA~tX>5oHDi`7_Wl?Vb*0BT(Y?e?c?*x^|amN3-MI^WWVOEmN{U~>Q_S( zP}@DWcmF)nGEnxZYn7b(@y*W1Rd@}+8+YPulI<;VHX!TRq$nF6E`%))${wy)5gU%Y zCLHy7QTgI4x^EPfVx`N_ho(sMqK&6q<^EZwmakKWCehMDo2t%8rd7dIg6U<3RagwF zlN!I69N)SeU!w(svXJmS(Eg~;!C9PqUubZxWV9_Yny3clm~tmNJ1eQUxs?^=9P7P2 zF1$g0W?F@#Tj`RyA7SY#3#Y(WQ~!jt?<3MKsfLW!wIqm!Z2vA}Hi*6nFO-!WEc7z1 z)vh@LvTRJ%BH_19&v=GU&}8uL=+LyiV#09i8}p#ndlyANuzI}cx%Zm4LJ?)0`h8e= zl`m4AZwIf)dRyj4Q9@6lVfW|oUKcV#p6cZP~IAhYhU z-cK!Mi;sw_du>D{J=+I?lQlH4A2X!9CUj3FEHXW*HLT{by;Gdw>cv&!-YY1S-@joN0 zCLH5f%a>UbeplNWfaAN^{8FKE9OJdL0q??QdUlt42d`9AOa7e7WPhjl^mb;FHR<&R?P;9u{W?%p^2 zp^%3hw?Bt8rkk^W(3eOd*-5dLS|a4~`==X_-`p!>9uwVT>fvq((G zpW+pk1hzHt6SmB+`%GX-*J=bR7g!g67t+6J5ZZ8|{M-GfeTs}AB>h#=_fh4()|`7U z*0jr*M4i`>`Gh9X%s1{g8H^Z|wsMIZRX@KU_y{AH?fbgJuO<{rX3hptLj3V^5E5Oj z<$Sic3ky8vlT>nhvpXC-iri|TH3G~n%FRP4ISQ)qpK%J4$YI-*dyKCi{&>zuCYzL*ESATmnh2?-PUKo4!W)HIZ1+p8uPESG=Te$}6M>bSHe9jxaZE{6g^}r4#xg3_cbrFNcM$9Q z4S>~PrOcE%Rx`G>PVDe`37?Ff;1a9!=!4k(*HVGzr))p4iODCVC9@>+1|tOTgQP`t zQ>Jzz#wxBDdojmz+|&zwOhYstnQfJ7G4ktJWYc8^W4?+6POis>DPU-|Iygoylf9qX5g)KsdQPB zDUoJHm;$*Ig1u1A0R|}2`5uQ|6q-%tQ`HFJ<17^vVlCnxl71Cn-W@C?2*dM;wND52 ze3s$8UdB1v;^OQlh~6kCI{u+D&{}pTL<@1~$vTzLUn1y}r2pO={@9N*Z?sMKmzYAP z*x28az^AMweJ^Gx(nTDa8CrY1sa+s7xCGj`su~huXNph4>WF=#k6r^#Xp>00eP!EN z0Z)~uH1-S9OdZg44S<6A{irBXkhOc?XTXwdV_R#-I=i}=_pM(~io1k8%~YQtcLy!m zopbkiVKXGJ*<(88fh(w!-xWEM=!=z`)`N@hr{7h=p=ov5aBk1d`DH}VsOj|mJbV3s z9~O33G1(v}N(N8t1PH}%@=`n0^`+K3Z0AVnY^DFg_ZqAE1I#yW>0|wn;mTzuBRXsL z@@1vRz|@_@u zHuNd>8l5v`ANu2$oBgZv=#4qxXv2-&S2&O-WBd+>)WoW}<(=GIv_NX3TMevwJ5VW; zHy%E8b*hKqRT&LOXzSe}L%XxYPG?K^W@)~B{u;C4D!&!M{-ziZ&tk6R?}(o0)x;+N z3{LPqEGTQG9jLyV2jsCt(H^&Jj#RLM#~>B~L$A%Q5LzQDUFE z1UEfsr?O;vy#@q4`F92SDtYoJL)%d&#yAfaMR;mY1t%-$XNc#(uM%wcRF(D~xERl+ z3_SJd&vAAAeV_i==5)$W^!wI(w#4#VnZWnk$2!D~sYb$# ziq}ImoxT!sl`i(1&#q~n6F@S-Y z3V$V)%IwnXMBZn!y+C{-%v~d))$RzyJmbA6*flYMBlM4R--+i6^;TO*6F@JqXRMHM zL3H|XQ9*FOTQof8c=jC6If-!i;De#v7~8LIG% zx!5NQ_u~`g;#o~iBfvE;82rZ^zwyQ@@`sONx)_ZV5s-}}j00NJc}K)aUHLbL`W8Y7 zT5QHs?G`(IBYqA(M@K(4mUMlB4`n?1nLu%F1^ig6H;f6fruD5Y*gr)@knmRx1$CLC zqjf33@86|A|I6>}5qjr7e}V2f(1P#u+7&WT&?J0g4o}7T`LWcMy;T(BB8%E`I5Ihs z<{4rw*RcNM`AXT^+YEN~%o+PHaqzztu?6(*hV$QqY|5N;f)_@#S5n5*Fy{70UzfFy zW7?KgYVD7=h!=XH;@{3+=HR4dcnoS$Aa+L=uWC8^AdpL^j{x$3snP>QoR6bb4;?v# zI{1y2kh2z%HS88QkJ_St2{aFZ^e#|MM6SPNzIyi3sJr%MTQ4ep*$p+5dmx%Yxn1#| zt%Yly}R zebzL5U#YLQ&?L~S)(8Xt@EL$kYBCcN4sz3TG5^6@{_ug=eRqy+%yN*sCs#OhtS&{H ziK{HJGx};j4p_lB$ZC}mx{A*>mhW!S3E}>Mrmyap{yB?V&rCM3JwgqmvufBy&c%__ z@GdOA%@RnN>405$V++cdeIwfA8FEY>l?vf*?yleE`-qiJ7VB8SyJ%zz!`8`PvLF~y zNu%vsOhF@sA97)1YRNh!QzclxKmag05Z+wpK9qZOHi^YatN+^5U(S}M`QfGWC;RcJS*O#R} zo4a|nwTALhM0X_WCkEvZD2@&~NZh_VrMudu6a6PLX}Iy*h->ZpRBh+j;mf}_?iWYu zPsLf7%iCZXI7OJQir_Mky4R7)>9{{ywDUzjnprsJ^UcsYu7SbIHScn%%;PM*c%9Y5 z%I|l2ciCpCEYii#`K>KOTav;>P8}@R79J+(}PL-HloAsO#}F84hcw2+`o`l<^_381BYN-ms99 ze6{VoCY=P1A>JSrV5sd}@ZISa#?h!eIS+PJ;-uFcHC7!nV;81q`ooPax!*Sf%2+g- z#aAd|N!9%?Rwd-54V9cN_0CRslOHM_*VFok-uSphyhK08>K zc=`U!hlZP^%yXxvlXLg^rz=UH`_?5yL>(9U5WXT`u3eY`9pK~0u2c=3l~Qm-53Z08 z%X3HSLFJ@do)gzrUb>9c;d6s(YpFhxwCA`;IAd3s#>R|V`X4RiGPJ@z{r3-CpP;?E z^bH6l|Du^`?J`%87=SE)Dt#W(g9f+C2kHe2GK!o7RENkik=)`>Uo_`zDG+b|2~h)D z!rK@{EHSSH8XW@K-P9Fu89&I(&+P$Wtg}A&20smfiYKkS2diCF*Y!Oz8?FHx4f_>9c|CqDt7Sg9C^9*H zImSL&Q>$eR0-T3YX{vicH7eZ9$mCzMc^bHeHRCbQuMh~4&Bak|xYdSxwO{2)C*(w{ zrc>|CINRF-WF=~}a{e*d56RP-|0hxFyJ}d~O^I2mdYM#edaYrYGrw{PMtY}=;PPVB z2fk~UbiR1~Ft;ZIdWrD&joY%1*4ag*IMBXVhix#$s$?6maGF#@g3)3OyYI;()!yo{ zOZpVj8;*h(^-Fp=gP-V3>pZXK7yR)n+3PpPN73XMN|+Lkpi-?|JrhZz(swN69P_4Z zv90FTks2ef;V)9lfb~LlJp6JaB2DbwzdUy?(<}B&ZR)^kaWmztd7gafJcFgO(-jw}qq8ntP7mATtY9F+{!6j2P4(F?D{YGX$A2Osj_Tvz(q z+nbJE6ntm6-_pNy|Joz-FE?1dK$&tPdSJyurqQcP2CJ+W=E&;_6UO?PL@k$cDgil3 z#C4Kt0ez6E1?udR<(BdM#J$i^WH?@fGLW7QpaxM*pCa%SSS=pG%~z&y-Z$uGXR6Rc zV-lblpkPMY(5A7nKYVw8LM7F``oJDOd13R^R&l-jL`c17AMDu*mrkT!BdL`(xllGQ z)ow#|&zu_@`h#0d#4t>3CMFa&t(>~gI!HCtnFo9fW(H8#RXEM~30mDNTuiGnPn>p_ z`4a@6klOdZ96K2e8MK>HLP%dhYPZmmzp;JeiqXdG{VcA#@SYh|7-m>3r$LPrHdFP5k&Wl?PHDBo!VE>IH_WXel&Ut>94TciHuhH)Q6*gu9i!u z*Kc8YWS;oSr^;`mFEq1cu9LjoBp|7IFf5TJ#+~D|I`+=6r6!*C6j7wo_2?hiJ!JbV8g7 zU=fyGOvHHtg#^OZCpKw%cL-K}n(d|Ok;iMJiDj(h6$--(HNW(T>VOb>1 zdaFc|a8`gGZMBqN&o=*9Q8JqKoXG@lX6m_!gn6l2c1-;was0{ z$LAvulFcU$x#`{4u>j0^^3Qr29DmYM=^C=gNeZ%lW+n%tyC8C zCCM;@*1uq2MGaV`9shg{Y~1f#wQ$jzmo|czYW0)s>zr+&4BE&;R7P0jBaP+oFN}p_ zD|=;~iY3wGcCMhw-2Hh-Es*`+qAAglHE#;0g%w66fjenh>hhOeUeX#2T&?$G#Zvc} zQS_IUOIL1^8+NHu_0Nu$-*6eLmZLdpF*Q-qW&ultzyu#7vlmU%2u1+^R|^nsRVbf{ zXZM^(r8%=s2M$1KxA&!v{)5vYHNTaZjhSZ)W_C1~72{W4xZ2Wpi1@}l^^E54>eprd| z91@sp zN~q=gqF7`uhHqtLRWk}4$0+w5gjGXr(A>$k%BYhlMA>YVT6{pE(pLcnQE2#H8TO-k zMc~0&rVx&WkK6TTghc{)4MJFkBZWsp_S;iDgEO)rD5`#4RVNyXF{QBpwr$eF#BN!- z@tS$Jw{N0xV>G4TD+MYpQ33$uuA%rMUn45r-{&#rlFoAD0zWC>h7~XB(cJse<{$k) z-~Qopyml0Q@HzclX5IC)0+46$vp%Ene1p^eqE9RlX04BAP2T>ehuO2|usC}jk{|vE z5p3%=gdO_`EHKEu{Bk$@hUt|0VxVOmy1rLN8tgLsh#bcwZt}JEW*Ik+^~Rh&J2oEC zHt0|mB0}O-@g(#GRudN>)x>nGPi6<0k7bsx^&Y+?UKH9d;)P`$C>B*_IsJzucUmwmm<%5$e)H?Y}J2HT8eSpvI3E)#HRh~ov9J)IruBt>s z6nfWi!lJHBYZ2@he4bK-hS+(1JcI2UyUin^eWv*lJ&A8h%?5a!m{Od8-=cf8m>Wb) z{@xbQaP2-SJ-E-4b53OMeNXs%GJ9VH;VX;~oVthtvl$`6tGVtvqaH;F!~4X4*LS** zZ+s3WbYb4Qd!m1~+BsPNOwf)yrySFtqd;|N zRvq8AP2B@B7e*Uf*s28wJ@#?q`EJLmRqPv5ZSe{>W?auiI7VFbEm6k}13w>9O4vGag( zOGJ&s!Sy4i<3X!*l`e|@IeM`%s4j5LG)WBzerL3)I|#E36D-#AA|Fk`!TVaFmRaj_ zr@-)>(If(PY+VxDEnFHj5$nwi=i!7|Eil>!W!FA&H@iYE%P$-T$b=jJVL|;LI&)}* z4P){~Uf@&n9~>xhjwn!v@4ISC12SYQn2IMaw5{mxs+N~3w>Jj;NLXFWiRwof7ZrlI z7#IW?-k)|vUeVP!%8#c7(zxK)BlnX8;s#OvXigrgmlvx5)*P=!-R5@Y$Qy59bw~PZ z&DBZbTbWu4E%W+M;HLPo*sD#woR{)Mq7;bfP`T-E?z;erhX`8> z$T+oU=g&es-6g;1tRce1*TDVV-_tpm?Kwu5mP0iJbQ3C%VDu zE&)2-KTnSDW$z-kW=^A=bOhAl< z2_i~h!Yj$I7%B=saYNoYz6xF-rd7wS2~O{11mpuYa=C(vE8}-()XiNUbBsw4cQFC6 z>Ut7M_oTd?DH$6lKyow8_+_%|Y8DT>Nbg{cQ6#Lys-CozM4i>86KU+3b`!MupH z3v#*_tvXhFaLq!Kh&IZunwG8kq+a$==2wXnCAEC25Fd#%zT^?6UD91%XE8Z)4CWH3 z^m)i;?0x0iEW@wb1>~*!pH3GA8qjRhefRB)D~rX1unD7{dUdMUZ=mB~AC)I7F}pwY zhg9XpO-g%&hIgrv@b7B~9pDJ}Qw_VhM5I$)t9mHX+F(Q z=`i*^wWs`8tb7q`#eglb#1Tuic|_7LpwPe!&f*rTi8>plvdIkGaEUGGoYDt>M!z>N zjevgm7#y+cl($%qo+wku9+t0>pAPHP^%dIs`gqHzbD8`El40LXk+?X%xjhPmrJ zNfF|%=voL;)-ZN-x~fm2d&zqfl}W_l7BT9U#aCYyOkv0a4Acfy%aLV04nQ%J#@X%X3bZH2R4zk5UrNhp<#@3xwV4oz zTq<^%JMyda2wYB`2GYyv|Ly#kUR?at>;aHH>pllp>3?1^4523LOErSor;HWr=gAQzogSFtEu=>H1*gCnyPu!rEGmRZS-T>flbNJTQR98FSr04 zCYQVG-xBM+v6wgGN-*2-nc8KJV3&BS57}Y5%boSY74;|y6F~&rYou684WYac|^{K)cIc)Hu-X*YOx4NJ{=bsEnt=>~)n)Yj4wG0rv~{CnWAj zP=+Vl=ha;BZ%o|H;yE-$oUPo)B6=c{Q@u(4QfAvPy~MZI_df5)xd1FucG%F$lbt(T zT66m@SvpZbe}Q)Z=l)v&-%&^j5Kvy2GL7H3H&XNbHcsYv_K|dzA%KP=r}#0j@Ds8Y z;t*l@#I5IRe$`VWj1F0Mf;OG;zXp1~N=1H{K1`zGFc?pt=;yiOy?c{zpN_4IJo;_0ey(_!*5UvcJ{Hx*(p5aUh^_e5nNWtj+I_*KGzG|R zz311yo7E+a4Y~bf_M~0vDq6pABgO-Hr{*C~ficNkqufC;ndTJmgk+qj` z1rbMb+TuvlAmQbE)TVyRK?-n+dU3Tx_fZ~(nfPQzsYkp=3{GndX!e1r(Iqc?UkFgR;*p+zw>2P-Eu-GADIXq61% z=}Pdj=Jf7J#W+*Lt|#4k{5^#L-KBdu8Y$0g#_r6}^1*S7EoyK#(YST;ifhSV{pw*Q-Dq+ z6pRpDl%c`amB{84&RT4JwwJRm{-mAVB)*Ltrunr`z1OD{XfP;j-CZ2&UxSjoN^3hc2OdID`Jo4526gwf#3Z3QM5LRQ_L)pF?gL!I%Mob=b8Q5w< znA~RRhvUN?=8R}kGp?(Xslt) z`I>EwUYMOM0Xi^(*LnkFziPi(>c{Gr39=k4$07gSRC(HpZ){A_uwS4T!4+;qoQ1d19b%He+Y(47vn==(0r*uF3ujBH;^zgRx}Av>Ksym7H0>N-w)1_=W|f` zx0AbHxz!r#&W%p7!cca~ym63>Y1q!gzxC>cICTJqI(hJ}${9YFgetNe&7D8qZ{2># zYn*A?YB16)xQK(5c_mGvBUs_p=9cXwf?YaI5+DBo>yf#(eX;OIMG+^E}! zD^q4xvg0)gT;@gZ6#Sf?d^t-Ol@%}Kvj8KKC-W!7LzjkAd>%qo!yjYoxc1x?`bB%aG~fD$LnbdC12IQiH!nVW zSvAOJ&E`<=PwVeCqc_-LjTJFs5w`H09u3XkgoKWe^EHpj=%oHd>mg40RBg7{3{@EE zLu=IjPokKHG(mtv$q~~Be49}tb=(ZL`t3}moW%(>{0d{~dX4N@4d{Jx%)s|RRNk)% zbc%qIpLtLB2E7|Ox*c$Iw`G{7dmUeD>BoPbHyd4;+Wswy)+n|vxR)ad`VY|KmnF9I z?5ORWfE%vT)PhA2b9$;a9&`AYAn^=^8 ze)y!2nto06B_Q#-RSzqd-T&kDN&pH^#0P6)XdWP&`2-8-Ji8&++rM8Qze$bc+b#oE zDKbExq8HKqB4ZfGLI%mm7d%!@hf_XTTKG#{Q9X3AZI-yTA>Rj7o2UDSfP;Lc z3L%Tw7?o`SrJ$5Af^)px)Vj-V#HL~+hZt(YKQlm<%(hZfot;n24_QYK6uMCR_c%fU z0D?@)$sJwv^>puOMpf;1QS9e@WU8XI6Uc#Ao*?At7n?El`cXoph%co9%3GNxrfN0*r-p1ai4|2Z1L(O z2k%{ZUa47jnTndRTqMy#5(AaH&{5KJ`K^NXzb}(C&#D;nxniQ$EBT)JX&3gWC+UV4 z8o$b!L+o-|Svu8ETu|?L+kY+3Fi7ce^gN|=jo=!bPn`4xF^lo)o2#jjmTB^3z`O!TR=~7 zb#tWYEhG9ljVkdU>fJlJAU!6zaERE<8Q#W&jk5eVOXZjTB2Qof$ zpBz4%TKl!#CYEZG$aT!m<~f;CsBg_yj{2tg?@3uG#7!+pQ*9q8&$Vpvj*+%3!Uk|1 zGs=xlqZAcV05d3wx})TRDjfM(1qi#;s-*|De#j-lQhrLocn8Bq8&3^JzF-B&W-M?Z zYF`c%i+8ci3p9SJi@n(|eDGy08`6-<-aT(n{(qMHlF6$(LUK`-+}C|5IvEOV304-# ziUPop8q?Su*HE-hPpKY$A(Hzp-pVU2!|6qJ$#86bnuWb+!$h#M-R579FU|o4Dd*T6;ZcOl%kVmKQwFw{7_5AL{MuY> zyV8YUocLB>+zEr6Yz}?-+ndCPA(aJBk_!4u92kfW0i|m zQ-86>@m3egJ!pYkhl+ISj_kZWG8p%?IGUdZP!Fj649gZn% zy6JM?GtOuS>5aqGgGcYD2EtK{AM8iv>;2$d+Y&}qq!S6|dlo}yQc#^{~{`aZ- z-rR%N{9gy{^k7x{J^D@CL1rme!`JBFq{@5dXp>pyNLU}nbdb11HB-z*U54)|QivW8eM=(@O+fSflZ<}BYF7kGKD&N1 zj2>&k-5Pe~90@))7Cn6`Vhqv{r<|QzD+PExE`ri)Hxj%6he|)qrV?l_I2Ae5Y;k74 z_Zxnc5I5t_TI4W_SVIdlD&w?K`h&E%R3RfVc?^L0%7Fe5r6O^U%=x!}_`y^CXYZ5z zix$Z%R*m)U=*&|Gx~j;%=aG@oU<=Fza(qi1L8k&LK9!@lo^}=o!GL;~N>hyS+|Aa6 zo4P?RTGe#wQF>Dq&I4aV_rg^{D ztzAt!SH6!~LZsvdFIG5;{s39|HPOp5Qrx8gD+N+26)5KY4T)n3!-YZ*?@MCNh#yF_ z&N{y}pWpOsO#Lu*l4jcD4esf2aV@nMiAmXjxJ>2uqvF>aYdW11<$vw#%QFpcIeQ&e zz>;hLxfM)RK><1jp~GF_w!N6fs{a#5 z1#+|u)ac6R0V$HF#M{U${wIVsuDIK8Zo3qHkZ>V=!d^rFz41TiZ@N*}bXivQf6I6z z9*hmtDESA)tWq1gl|5UY9jTqcC7tU3K1njU6*$_sRJ)!lbNnWf94zMG))}jl4t!5T z{|wB;s=@n1kpC${9XJax?`bE3Krtt=#1Da0J);*g*yo+vP=Mv|Gf0R`ULiAzlvZRr8UeyC6>;QFNwbAK?Q}1bV`)` zy|>d;dWMxa>FRUQASSdUOMj`ADkXvQOersoT`3MddO*=2DqsqGq+XZuCnna$0F>>n zq0a#6N9|z$LXJWMaLVlSgoYHCdOQFE^k@Y>9lBVEXpplp7)H;l+aVEJUIrLmqBAKF9dpQlDXA;u0iMNV^3NMw z-wgX>0+1Oy1u{STP_MmzmaUFEBh`AR;}fyDzn)b3z6-hp$n4s(s1}Wj5IDmr&P)f; zWui`q4N|c@2gnp4NO<&u$(O~?e9JcHd@&;&_1_MG#%pij$Nt;jH8Ybo(A&M7BUJ4; zA{nPgJC6?(f8V^kr1&aZz~BB!pc=jVZvDhDfBF)Sb(lzwbwGC)6kG*weyYb9+&&}O zV_Fwjiu^NqG?R~`aTVm&mb0jxSd@fA^5%}sL}#!4Ol=AU7EPd>pSrCu;k`F4mdk}= zZoWS~N;=KQ2KqC?UX7+6f~bX;?i{P7;(OBxfCjk4+ODa`(F-4H9aMrds1!{tQQ{nz zxwaCj#V)G+c)f|CLv0U5c5JeFPe~f82@I$1_iiyP#lo8b%0tHuH#+H{77`&A*CEF| zj)hWBodM%N8nK~U9F;V|hHq6H@{1%kxftoDKOWpTI_rNSq~0uSxTBI&I4KKQKqRGj z%cB^L?=xy(E2y~=`y5r3IpGl6+K>my^+iDaBQ_^>i1|Ufu*@;<0#fzFreFLTZ$70h zME$3@|5CG2i&=ASW1_ASfA9cJ2Os`d9*qE0FzUuZNNnTcNC3n&m-iyuGxabE29-~d zp(3Nak9vI7zFaa-?#Kbx-tN+vL}rhmPQCZd4&b$r5;pR$>D*rOHiBBTaTjcd4BfL zd$6cPcOLkxJJ@hJ%LAh=v)AMudj(bP+3n`6N!% z(N6eGL7X7FRl%Rz*;sxn?|5KD)XaSVPoUy&zn%A1rshAUjhztXJsy`7w$gbmIJ*bx z#QyJ*&_W`KhROL19MxggkzOV+v3ynX(XO~h!_F=Rkk)<-ejUu*D7^OVHVySN0l@z| z0W|dg%%)pOKA6+mD@P?p@e9-OTB6OJPTfJ#VC=$_n21ft0Ngf@1#;ZY{kD(?;!pWM zGyk6#(TMCw&;fFbFF?9IiA6TGPsbZwNJ7*|pT~KPQ&L)5b=J|Q)Uw*XSjE8jucb57 zqL+;2f4LUDhgWk_q}sp{>4(Bap(*+XYUS>!*by0ZZra|aNOD~pULMD10hEFoFe|H6 z6ZALH%>K2T7yozr{$~=>b2ts%iCD!E+>jb=3%(!|2fyEYb7-~^Yo$MaeRe8)(z<@R z%cQ4iz{dRV7rSv38Dp66*%L>OhVtIho2MJz2$~yEbm^K`^IbCixTU<{kU$o9%*{9x}!^t81U#pX*!<>ci<#m&P zN{y2YDL+9Jr4fTNFYp1YWl!m`kV(sILa;$iou>T{MXb7nGu^K<(0`j24Wob-T@C~{ z8&ds1RY6+7GGv1#=@N^iX=}4A>|%#mrEGN~7X4z?VOTWn>-w>AGCyjyI^$38{@2b> zU=V}g??Ad$UpVc>F^o?KYm`AbNs3y3b0gPgG?HC90yf9q(){oLmX?-h)EPcUaD8ml z{JO?Mj~jnB%1|?4cehG;Z=Q9-ZyT~=h03QVzyG-I$! zJ5k+Ys4h@boA3)XM}Ti|nJn`cWTot}JzM+s-%r9IMCqVp_5alZ%xOqT7(3Mtq!4`Z zKOgy3(??*1&sBrgzW?PN>g&Y;@qcdwWDsWuX1&J?U83Tj#~NcGjG;>Ya$Jyv1Y{y$ml&XT+j-0f_U#EYN_jd%G_f{eq}3$ z_fM9}N#{LJ``IAPokXE{!2R0B8|x#}r>9QGRn2?OKi-{ub6P>Baj#1JY1v*5y#GB! zVdi6Ty=;{rcrGb`@xPrnGB}folsf4HE-4OPT#>Xus0BVX7Pg#zeRcX_V`mF2@AFxZ z`(CWa2)l6AR3h<($3fov^FNghvns!;+yA&dbDI?1uc7lAHhG?@oA_Gn@Oje^{ku~y zm-gR6P1mcAa!mN2Gh1-~JBAiAB@QJ<%;Q!NXR=uKhi^0e6K$-13I;_3on;^z?^okg z?c;N`N|Ga1Ln2J9j}!l1PpM^W*0FI~U;arm56t*~$a?R1D*HcvTv7?4%tLmz=nyiF zy%SO4*v>h~4%w@ceeAs}v&cBg4B5xtd+%`U?cn^b?(g^W{oQr{)8o+}F4y&bzvlD# ze7*Qw?q^m+{OaH>?lK}y)j><0@5sAep01YNq~Ivo_SyEbMLyTPMFO3`ZyNm5M}7v# z0IkvfK69}eLA-#M(&e$?Gu4p81xVp-UW0m5CdYyuNUUql@Y)hP8qB*$p#UIu>bY z`2Y2*!|*K8%|>5*p9#WN>K~WBIK4F^ZvO7AHi|bvRzDyp+t3o3*N6U8l>%#CI;v(( zg=>v=bs=}B?lnige?EV(A+e~5GaE+$$!;=m=_A9_=+Kh3e+QMF-(ZhQQ2KHv7CVmiX zr^#jGjOWIEk?kM*DE36d7>3tiAWPE$Hx)As9S&bqI}fY3rNqchdBE;jQCgn6?sU+@qwO`KuHZ=C)oNp0<>7I zuG9Ot!}!<84T`g@M{+vwQTK9%@uuh`fzN&q=@g~+6&TaB7Cj)Ig`=A#pG6*PuCq*0 zMoM40yUxA6fntkzB$rH>ogE#<%5Bb>;m&H{GW;T(XnfoESfU&V7y8h0v6UqMX~#AO z$$(n#=mELVt47(6+SQ&K1z-Z{?MmKky^{MRSitt06HI(h z7pS!t-oHCK7}P8~T}dt8ll<q6sr7z-ec9^kJ zTT|0FxZ{et!~3o+RJvShmg^Fqr%iBYqZr@-rMwoyMNhmqGQIZ}E)H(J4~oEkD0clp z{%_y?uuYDJqxXEpgxM6GRZpS_l2(-F!?eod`x_!u&I2? z>2Z%rx8!~o=C~dQu?)OCEcPn}POS#H6a7CL|pA zg3Gp=zHf4_tsu)1BiHeOC*T%JOnz1b%)stDmB4M8Sryu-n2KI0>;vtGE%9HXZab^$ zX{J03sgI1Y{n|U!I zkkE3vduKRDsVL%q?j3y_Vk%D(hODT2mlQfUwJ9XCY)rt~1OtmYtEb9hd12X6(Y_NK zrJqG6tB#O&R3YWlt_H3%9;>AS-t)xBsT+s-rrFuG2Lq1{wb*newX1DaA^Alhu+^EO z`amnaL)Y|S@U>LH_rnZQbkM=OpI8T;BhDiI&e>A!tJmVTru=XhieJk(fb+=<4rkTb zLUr=PflL*!XWSTdsez%I=S%uY8Gww_I5T$oIAxJ)=U%RM%E}&YNR#Pv1T9LsEgwYu z@4Ln$q!bSo4lMl1^|oJdA&pLGL|sQYXUVzv>38=?J516EJyifTW@6|T7h-8$35*E3 z>qIDVzSA^rU$fZ?kN(Bl5=eS(f}I#0n|7P+hNDHMUl0DuW@Pd^2d7%3Sh=TGH;!h@ zDft+h1yG%MaV3P0NnWt#MkGm8r#weaZMGo2_Ca=$-m5M>|56w$ zZx&ktoZVGD)T)!R_=j{AZ`M;b&VC;wCukRug6QWcEkmlDpPVZzK!oBfzM<4HZk3nb zTJ}I&>lbYR#-B`TF0>sU327Y{whp4DhjnsYsu@1vL0D$`h-4K;$I&)ZN-J&KK4xKa z)9BDvb$rd4_UfHuJnomWG%PQ}lP6M$qNU^+rJ%Kc9G?^Pp6-)D#a%ePZOIh_w`rGg zAYvh>|LQp?329M$B26;!w8}#ObW+kXN+lFoTveo}$3_wT2K-BT+qoR z&9%(PT9b1g#YHP<9lU@JZuo@X$6Hj%S`1O*4=k=dqDysb1=SLP*o!OoI(R(>h^_r8 zA6!(Q?{$u^q&m!m%5hMtB)%I+kP{hH7urRJzSd$T8&q_UO8r>)Er$z18LJGsZ?uhZ ztwCO{HfA5)Yy30OHPOA54CKQG_9d0R)9M6q?S8lu%f6;{z8zl}x;aGEne1IywLb z1F(E9Rf6G#vlap02BR5oA`rJJWs_nDO^eE!)re)1+4Z9yiEUuHMF=t~PSRhHE~V&c z0OoUE25i4q+Ars(!34HyH6yhaxQ^C=D@C#~RH!kxm;vv0_Qah^F*Vb7fB9%L^G_~2XD|2K#wZ0t!`PNx4u^GD4@cyRZQ&(@F~)K9H1bWMEX zZ$JJ!u)JplqUqTWzF9Bf3R6@1n@Ig87eJ9+gUxCSdSMf(T56%~o$Mab7Pb4SFAl%H zv-Qc;ee%3@JB~o)7Hf{&z3DL^#*B%rrahCib%vgAI{0m@n#c^y(ZOc=FFyuU!rb@TIh{uzUwm4kc`Q)-5cfU9JUWAIIW|=M*@`Oc!_tO> zAC^9{EUQwy_QAuPcoT=(!;{U5SzieQ=Wb#DR*vQLIPZWl8MO~`E%~31{!S3&p>Nm% z3z55b!o@a1q43somzL0@@b%}1r;n60zltgmQRT?5mRfj}T0$A_&m{1|7c3biT0L#= zKt|2aO^6h1Cd{Ktm;*xfSe*nY+aUx>A^}KBDjp?u8Y+`q1jPbt&Z^femQk})Lsy*y zlrx+6degZ_jMMD~Nfp<9>BCsT``V4f+LSGdpLe)FqJbu$%`XS2muqqo^g}I!vOTSz z52Yl@Rp(!)_n`r6#r;swMgL+9{g|a58235mPHJK8(S%wech1En%f z{n?0T?g{QmXlbRf$1+vM+Q4&sW&+KrKX8o)PPc!N7&;s0V05NdkCcr{QN3G*5%J!k z0|J7x-G*h^`tZ|U#bgxevQAfwM-(p`nAh$B;($oIB)I$2r$#5peO+xbZSP?2R9jU0 zn7+-|7Oo9uDl=c8n5}e@SL<4glxEC{x>(n(=LrQ-EGm>*J=27IcMg?2o^rO$iPu@+ zqdp9nd9rr?S>Sn8avY0xkuBhKNCW#ScANyaPBx#`kwS;mDNsbDbMkz&jo=7C-bwAN zpm?TC!~XCi{&4n^6j0_Oi7Y83lzpNB>(yRSS|>J>r=i+2wn#P~t8`p+mwo9}n+6Nz zcHbk{LWA3S%X-u>-<2(^{sUhpQ@~?`%M_Q$J zFhU^Fx-xDoKdz2G(^#kHM#Sj_%qT)xEi*h;`uG>6{rX0F z3}~aG8fMWNvGIf|P-DoUCkgC$qc@j}{g9^Dv0Dwkqjs(Ewf&Mhv>^&C5^^A-jou>( z=T?OTF21+=)cX{jB6HjBpRD#jNDfIrKtck=_s@9%ccLcu--bQ#ym`_8oL^Bm7S^l+ zUp#}(;E=?f{9i;{aT&OxSJ3Q7D8`LWT9oO_pkGQ{2zdfYV`75;Jq>ttpBo{92wD{U zXah-gruLmb>4YcsM%LvqMoK6ch^(SD289y*@w{c!DWpQan=BIuXMeYx$|W zKiU&V)G}IjaK+eGhYUBi`G|J-jIex>RXS|^CBFG>aIBG7V9FAr;P$WIhzB64bIjyz zQB`G*lq3|oJCu2iagnN~=%s2{^Gm96={?huAE`fjk}92an-`S1efc`wGdT}GG&9yR z($|YoqT>2n%Kq%mO&_uWm_!u}^&IlpqCC{oSZkaz^$TxqE3&;5CQ_@VMZukli2fpv zaPESQy!U5ab9jEepsQ2`j5wX$*GHJ5mG<`ta=}g<>gQtnihO}6z9+)xmomznh1;;GUvu@cJ*R$(UVj3SyhiZn?EoOl>MD1JcaHu&AprW2L+7q%wSKlR3+lrEJKi{`yabrNW9 z6!-z6VKIXKkJ=7+&pseso&Qi@XK8!h9}X~a)iZ3AcO7hXff57;8`(SSNrsyPRg+&P zI1nj>fbK=|VPOC>bchZ{T$K-0{Li-<5j+p<0txA`wRVmb5CnF`4{JH-cvV0G)h*C_ zg<-4~z&%cT1g!pfM0n(cGH-+s>}4-nUnUQ62(S&eue(znCZ3$$`in{DIvpFAh4TYvcF~S!`XKVS7+)4i(x&ij- ztyYALaS)$;LxQ5#dCs0&gUn4x53LYKTd*({FLl!|^V(G~!UF=%c!3)2hK&;C^3_KQ zd5Q@njPkPC?g=7n?`)tn5_kQe75?IgEblAx`+wT83=uxNyv_<8(pKOti%?6^GLg0r zl%aE=cb+7~bQn|Ai{^=z621u6Ky@|Vflfo7cxwct-3Q<- zx)d5}|GsEQ5Njwpb=q#{YWZ=r5pj;N51HRcd! z8LHV^Eddm`NWJCNa~cs2b;rkX;?KfaI(=ig?X4%gw9!AK%w(_p_R@bvgQqkAwUFOnfZh#afOn0PzS)b5qXV$QpxZ+43wH%q>$uZ!2<*^#Otgbc{3IF=o`H9 zui_2w3iAhMQ%m&Ok0L#Goi2(d9l(xCVN2dzw8A}s%cbV5ou4qdTw{XO1xS_+lyULZ zKoVl2zde3}uo;Z_3Xt)$lW~hyet6wdTqx^HK1;OIS3d0h3ml_vqbjeG)daCO1(0v?#6mH+cU>HUOhjk!7|- z!%|ejK{lm5$(JA}TfHJYYQ;8{{sq5naK`Yx!Ae09buL5ze}a{@DH^tNbL-lluPE~~ z2u~L+o-1zL@6z&K*;MAJ`TBZj@{ss&miA^)Jts@^g@C3yf%Xx*Hfqd?Sj%@$#Kz@Hs zI5U7A9AS*1^#z5C%a$Jw5T{oT+wX$mQ~psnNCB?}QcUQV-w`be#r!R;GfO{6y(Jpf zEUpm0%pWQlhzv@Lwt=@t?TRCe9w5TIZ>HstIx=v02YZy@c&}O z+x{>h;Bb?~Hb=F4EM=93npPt1@+@4s=ri-61l|KmW?3bx^-|PJH(Q@Mf&X75=77@hNI}E5vutCGGP*p>*{L$hJtQ)rk1NCVk#a^=*rTVneMu(4s)qTp*e-9LaW zYZ#xl_ZDyQk49t9HFl9vL+4#D?c(3~*~O|f&Mb_-nk&^T5Tu>jwEySj;1Mb?leb4% zA>+U{Fdfap1KO_jP;=<5PI1dmkw@aNafapD;cA#{uMJ}o zJ03($e95PIBD=P={Oy<+}N&blo{E2I2L#e;E?8Je{^ zP;;syfF;TJ%{bWtV4bENY44wQdxe?&Es#J|QzA9xQ4gNp-tKaU2Z1{W`2!2xC69fc zpS`dvM$%Hu!xu!g@x8Y?k}UVgxwjRG&gEEQVdy)wDByI;p1uLdX0q~rCHm6eWFT*` zAHY$M0kAnb;?V-(5dhH%av^rhh&A#4xt0ILr?>NO-ZV$C1BvS_jn|@32T+IP2ec)v ziK(ErS#{-GgkqCWX|kP3Wj_obj&ASqAPjF(*g{9HhB9=*&K>9Jax_t%_SB%~ffN`S$^gbc|^?<5vUb-s`iz(CGohmHr z>B!CSwC*{He#}-SQg=9FfC0cnvjb7>BY>^oScbgr1xPt`S`vZp|Fi&%?sHdM0bsTy zUe~zl1e@mE(;naC2awYkKqX-A+y%a|?e863u=pE|vq*DP`ptlF`(@Qh9S%J^KZRN( z2h`~L0<`g6QX71qzY>9epiFzzwR%Bei^Ak;n7P~4BoX#J7=gT!z`S{WU(pHBxq=&BvjFZ}^z%2bZdqJ+#$&lot!H{=`I714mojGPndUMs z>v%x1gC6XgEA(bu-f@$VpYh4}&gZzRx5rx%cTdRI~kcI zb`Cz9hhKV<&G6z@8LW1~^hz7uN;M|DU=v(G_2wmAXQ55zq%3(d=YL8Akay;`u}?(I zfD5Q{4o&|pwD=Up4~q+i17tLUx3EOcQ5tL!cE6l<5&+7^U+5aOjF|ZO9OVf3gp^sl zmag?L66%$V-K<=UNK?(SEUH`}I=aMemwg}6591`dO;h@cvVyuG>SBpg+6?g2hn8LC z6V|*Uxbyuo09;DA02CK1xR`>KF9k*7_=$I<{?acrv(1^J8x<=rwXI!V$ zXC{SHAM;Hly*{N8O4kcVQc#G2!iJ7LUi?C`uzlgfR!nXTS)h&mE?kt5x4GqCM;owk z^Mnc1J;HYA)-@&=ds@Lqpt?sRH(k4f6zVap!Jvq-t)g`e_O*v2`1B^)k$M3b zq0Cbfx353`FJEK)BS`zq1mJtmv4CaQq5GRQ{|qyx2-YYe#M{FkXZb~XpI5}zvsIDC zIwtBxUQc?LTQWTuz7n-{6|C&y|KcMWnssrA1-b1@R1b zKP7=15?%m(Zy+*_rsfbN2ol#e-KyT;FM2o)FrL5)?5=U(uA6c*eLXLOHCeDHi;-0e z08MI1g-JcSKf;!m@C`Odcr^B-_*EkPwd4a~TK z3h3omQr<7Mst{4J&wmKJgTMgv)p@-U5h$n4#40C#Or8wVyglu{81B(v8F~u~2p!xp zdXq%semJa&YX^5;$;HuR@m|P{yRYypdtSS#@u~dfUHbocmqo@7MA(AwO}lkTQIg-! zq3zO9mVGb+l3^5m$K!xYf+doLH`Y@sejP%}quV5^0ALFrcpfZ}(f1(nu*edb8m-riIWz_3o69x-WJ7%0Dsv{3fQ{b1rF#CXjD) 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�(stz&U1l7b9h4b5|9EU41#PT=&N(c%7J+P1~HS1tIf8qzA>NjND zAI1MMI`A=^PRJ_WQ9+3p1yG=PiXu_Ql%QQzCd1Am#{wi(Bk`m%QI^t6J?va#d=(zT z!mL9hu8Z@RVaiq*mC)10*svd=$@mTg=I6=Ly8pFseW#%RYXvDU1J3z`#ZE_Ayz@wq zGH8+!(9Qyq2Z)W$lKB2n9`|K*m!UV-5}d2NPSF?7k6}^#`FM79;L{2emmdGF1N#O|{$<&zs}of`gPl4L?1iPlXYDlcU}qnc@DQ*QKaW@m2ZM-` z3ule=FyC`b%33bEDHFF^Gr;}7zRdqvZgu3k=LwQ9D7N4tY(^XwBXmYhjLC(&L@9%V z#N$L*^_O(Hfa#EF+zQ59TJJXUA7uKQgd42Zj+m~^M5qWbN{XVYvH(M~q08%I9zOA= z|79imTj1{YL;6<(b@q>a`itPg!u{?G7y2e2B}|hB_>L-)`t{=`e9dAM2M;ExS`D5( z04XPoh%;%s$cHw7S&*NK{#5x>;aH=Uq>-}p713}orDVL0Kb)GQ%krH`e7gbfdDzVs zPsrouu=N(b_Ro|i^v02d^(IQ2@!Eop;(lpB#VIggP;JsIfB7af?E31WiM>=uMntTP zB$LtY3O>IoC)y2jqObgdn)zP#TEf#PmA_q>jmGD5w^)+<+@N!Jci%5fw>PM~E1~W> zTHe@r@8Gyf>#8Zoqqr4BC|~H-9f{8NXMGiKJ}PMpY6tLXL#_s8VbHqB<@wNK<-v4z znXvA?y+ttJo8jPdw??Nc1Uh zVj68vEjM$2sM9NCwA0S2zd5lkrYH_sGZ3LGnq1JEBe+DS;TjWU`w7B`Lrc@)_;J`C zI6!*(_U-`<`R8`xHE=+L=>Z;FnMNx1!@KJ|6yjP+*6d|vg0gw7#niaNcdz?j8mki$ zp@5;7HeurDHo!6*1{sOz6`#wQk9Omuhxkx0lRZ{eYFbjR(`K6eMHNBsKO(hMX1X^! zTZ3VQ(b(1MB+A(4Y1&&$-dYJAoUl9D-P^%DC4Xyl1zw z^TR_R+Qj1aWL~Mx&}`PI^wIMP-P+rkG-w<9xY2&$7YT533W9vxxXj31wLIT`C&Cvr zya#`7P60w>z<^fu`y#!>zb`|dq3mkd?jzTi&vxq%M#}xs!2z$yYWR>3taghHTBMuX zX|VdQEN&lZ2RkmsO0((&#+c7u>L2!Prd|lK?jIR-w+>zO2OGoiiAl)og#}5LOC7eO zUe``;&wZ@hjJ+Q(UN#7@yQ;e2gkK83KB3%I*EhNKvjpAbOD(*Bxc)66|9h3Tc24^R zvgCTWGL_|q&64$}Y{{rN-)DbQxhlfhEP>nJmX>IbeoLF%PFNTM!QCG8cd6G(3ww%o zbX+??i1UMCM!KjGdtEUgv3bPNLjYb*Ol31%O%*J?4Ku@}==_4`VNVjCLSU1kUk)zQ zOGV_E)&CiN9l9v5M2a5M~un&CM!hlN23&0D+8MBd-uENO3jbmR`Z>FAj0cu*iR`~ zt85;rqmy+J0)3;vqo$#-r2rfiKb+;t=UUgP#_@NQqVZermLsE@exZRp8vYm_-dR;!_@<^S+audR8U zZ~SUDohzx3&cZ=meSOq*8X=ToE@BruJwyRwvs+7t?t{fMYG@*|t zv7NVe)%3;1#g%GwKGyeM`7VR%&2 z`$@hxh2!GI|IYF^W7Q%2GCUs#9(0$hRtm^Dw+>oD2b=*Tn(Bg|d8!G~)G9V8NU=x~ zak=dSH#}p59!oW_dwD{=GUaL1^l3@zAn0HvDrnw(bmE*{^Wma$E8@OZWsyiE&t1X~7VXAWg80+j{IiUDg!jl<-KXa(L_x0N2=^Nq|qC{LnsxKReHK{?;tc?TbBhK3_)FLv60# z*sK`NR4F*DM0a%?+Q~BvKOCK~n$2j2-%X#0_ar7|bDzkhHuE?gn+ORJXFw);`5snw zdp=8uOp5c|h9nf`{|6-_Vto{Oqt$8&OLW3g`9p%N^yN!}wGdDELQ7cKcVZZR z?3SNnKSLrky3bNi%kc;NT6Ts3i59Gf^2h{+8|_{Ehnm2P(EG-H}* z|4~6eArUTjN>Fv}ZQr*&pRU<2PJYufFx)#l%g#z>zCFDJNxkoUpTZZRN$`Jj?Pq1Ig z!?<7X4~$)xM+c3JhR<<$%X@}s)KBuyu6An;a<9$zGFZy<^U9p|>o8(6nYPz9C#oBn ze^0Wnu4@zuJyvXU;I_wvysj%B&YP{T!4sI%MX@wC=rl_o7Sv*Ce);4X?xTxYnPjK+f< z4wdB|O;Tps#pPuI`~6Km0jRgX)M8?>*=?@Vi@tnC=P72ze1%Y2098q;q0^tqMjD2E zw8$o-NZ9-DDS}c>(8T178j;3cmHvwiHdPjOv8-=H$l*chg7zYsF~|xPF0N#ZV->f` zz1>rdKe=Zb)8!pr^w_dd+QwE38||U?Qg)%szJL*K^&J#?Xtog(`V1bNGdoXlHCH6B z`;qoo(9tGmj=Iycy`0Q6{lNtS@a!4+rP^esO|ldSL6!nLd3j$gaZDDgwhw=@ts)K* zSns(q!(YCJ365Ds6KW!XRoUAQ_wWHM39Ym=44AQ5+1Ul8gHBEl%-)xKGb1xYp`oHm zmuejD*&R(6Rcq+-F2Az-@{*II0$(p5YMX4RX+bkb=weruWf$R|{q%8h7 z&4|#J&K5IIU-}R6TFqv3s+-_DMg{NB6wZ-enrKPb?83*U#j2@Ea43QM5$&67Zm0A2 zV!CWheDptmCX`A+Vh?uGwH%8fo-IM9e^A9H$k`M1PE9!%*xO@o+4qsPp#rs!P$aah zmed)(T{l-1Q7Tm{T^;WOcw7Pt@YuP%j!oSIO~2_v#LXRQ$Iz!RtHpekV?+&j!^(smJ>ZM_V_^1a1y{fXsDA=fP_IkJ0E1 ze;W&5Uxvh;Ey8mQG%c)nT!_C=HqzR`gB@nmaM7ArhbQ(Q09&7&4gs$>be@kmK_i)0 z7wuoBIHf8|xLr&I6m;6bTID=}_Uo6i!%+@gsUT&==0D?Cw&QWdTWuHYK0B6nyjhW{ zJ^mPy@?WptLeT$Xh*2)v)vUZ!pb!oT$xJhNcHnETAOZo0LRwUcr^|<=lt2PzAs~K@ zOEMUkEigpT>Wq+LJcYr>D_#flF;hj43v6Z-h{U$@RH7(t5^@d?Wz;Fby;miEl}qcC zOoWKe)ay2%w}xhK{_qO_$v891U%$~g$1l(B6CbnCA+$d|t)3er8ab0#zSO}$fP<=~ zr1U3axaQrTS27w@7xL{ru%s!gE-wY4<{)mP?@syTFIh|>Y1sxy1QUFWKme$3k;OD6 z3!N7-J_AF~Jb8zJ)Osz$KZgA#^35%sCfMHaTNDI}lVgmw_6{~{w6pz7a+Rk`8FAO& zm+M4)<)@1w1hy-hjnu&|5X4a+Qe`4wW^NxdJFWInTP?*^RnZ3clpHC^m{=HCgsZ)^ zUMroJJXj?js%`@|jkI?F-aBqjm0ZuJE0|_x=3e$_t3ZhpK%qop9oDsILJZTi^)zxO zGr>#HGgVOB8qH`N0VODreQpv}GLme!v*mWyY-3{surH9nq*}7CVX;D)KA1VQ)9l}K z-_LZTkdp%$Y6KWNjb5mO-)=1zFP{^+`ktm)#nk(3R#QTFB_7;rl|5%^L9& zJDoRrY$yLLO=2=;L6b`r>qhkP&b7!#?^J<<1rCY;sY%Hnj}*zrR@#fNB6Lt;sFb@i@OenzbF zm`x+3A|BTc`wjbEy)Ji9CQjOmhH=5ZKbo>w8>pT1WMqh#4J4KgG!a!($NHQDW>!{k zyXbP~_HOE<>9*Q^+A_%nJpbX&=uu&vh>lCWxT4=1V9y%-w-&$;jG($x zhpG%o1@%O|-=k*#x%>Ef4uJGXp+aZpH71k`J(zxld_P%fIF2tDzU7C53QbY9Hs=AH z|Ilk~CP!*Y8msOaptR4qc(IdBUTLTs0U2Bp_x$oh#`X1P#E>h|yxOKEgQ{zFm7VvR~m**Hi4*BXyM9q=TAj=+zsV3&s%?^}!Y)nxL2B<-)&T7Ust>YjX z*ad}m2pNMgSfI}vOHzWWUv2rdHC0tv7LF}G%CZzEIlBOmVDA-H{jjw_D1-vq0))}@ z8@u>S?=em9ZB~QrgoWqM3eXK$!i87lU97iln{a74>Y{@n@~%}YM{0tD`h+xg{#JyB zb#~$*GF;H9(70#UtS-4^BW8+-$r!l*AMCwTkfd$9rd_se+vu`wv&-(X(Pi5$A@5osJgoH&0>#^PAd_aL)yXBF%dx%n_|BYu9|B`@I-x`nfM_p6+KM-XGZ zy+n95o>!N$O;|lGXru^QZm(!OFLl6cCZ=XA68QoEmvK&M#$8%Q76hPQt9>)(<>kp6*2F!5;1uDhTF}zl#fj|ZW@rS;_Hl%BA@B0 zb>gBx(ure9$=TFqLsHs7Yp-D3A6_3UEc2P)Y#9~}@#4_*6&xjs803|Tk{dC2DGnk| z^V{6V>kJ~$waL^z4@sRQ@ zp&?E5lL{$2Y1hkL9#iRfOi9J+ zYx9(g7>+xrT0pARBqyg}Vsg5BSmEn|-cgS)FgJm)o5KaNN5O>x702wYA%KP8#QzeG z{oerxIZ!eGCvcDxA_vNPm3|Fy*!I@-&_ahgt=YMmm(JFvKJJ(LNKAHxS|$_{C@`Ez z7MG_Mtwr=Q7fBt^mmm`DV!DE6q~H1Odz-#Nr`l?M9M#c6w+JQF#rA{53By(`meHXT zDbe!o&U`RV5FH_<6tFG6E z6%&l?B@Y24l)&u&cs9tq!}ix9x`<|Ll4jDb1F+uMVlpCg8!zfEVR7|1D!fM4$kZMF zu?|}wucNyJXS(qA0D|cUiUVTG=M5k0?t0O&}1^UkEWvOv4eX zI-{TpkXv6r?N2D10?UWePjtNlTx=s5b3;30EM^!Sh2;uxfv_nExumcVv@}PFLQ0-aq=UJ01_5j&&kjJC#p#Em2G1dz1nu3GtTTtDHUyUg}L_ z+dsC0*}j!4X5XqSYn`2*`t!nculBjzc+##oIOiS_(CSYP|{P6*sa3>8i}tY z23G6Ra+zcm@ho}-S2+oLmb3y!hzM729Ra<(sj&G&H;DUpCUzncNzOO<_{e;)|ys%)nt@GmPEd@3U3!iDOl4aN7PZ*ENi zvV;gO)=_`a0Ejz~_`zZIR$b`KK4KT<<>dlXZ8$1YpS<3}!okG%IzS;&=yz#J4!)YY zR)jm#sAIm3vk42H&As;_bTmY)&KKHPe)pl`A8^w`g-T>SaJA^{^cU zVv0u-yuE5`Vk}h5`0bJATn(LkKWiLhke^;}vWnCt+1%P>G8JaJ9rZ7Bd{z?lqx8Fe zZq05aQ-Oji07}q^2n+~t7$gp_<5gO!^1Oz&lLscDL|{=K)r!X_`(i>0ImcS`Ph?s` ziMhJoWFsX7O|>tR<0Umv#||mf)zu*me=*_A4iFK}@!T^tAWiEhY3SbCf(C&vN|9e8B}>cgv6jV7%N8-WS5^sN@<3=q2=Sl*F0k(oCg;w z6CI_!VxiGda&b_G;|3txWM#BP^aN_!a7E;Odm0-oO z0`@a4{U&d~3%OBcWp%A+cpY_9O!rdU%jR{qvo4LNRV}9WRa0DyzxLuk>x*k^(cB|s zlq&lPO%CD=Dz@_It&KW@$ms2<__3F$NMoDFQ4}j=4K4C0mw?c!KSC`)&TR0Jt zBySpK)}uCvOHpWCq?k3-5;vE3Zy&yyWZM;oxmVI0UxM5a;M+ zJiJ_YLQ>ghVRh2lL5{X!n~#2G<}#dJDPcc82~Yffwk7^|-BQXX0*EfWJ%8^7ye%O1 zWf4nsfF9#XgG@=h=Z>y?x$47bw07i#K@$e&_hDwu57JmM8V4R@W_PQjbvdkHY~H+% zT4Sl-c=3YfTlW5Yz0k0+REHBFjb~8MpsAX2T)*S@T0!Nqd4ZdtJ@==xd3YS=dGb`0 z8RXO7+ttNnM7-_#tNFbNhp*KQGFCcNb_A<>sF{um5~jl=A}EMD_{=7P?@xw1A0ZHs zm{ujO6`CO6f$8=Sd`94bo}>-NxcV2NxopIL&_j)B(lL$za7uWFKNA0b)nd=XZjy|?K5+#)^ zQNzFKq&btC#}R&->o+2|Z2TUUbAVkOs@xD`ptL59KFb;DciYVedX&JG`XE6bT*g?K*w$TnMjPWzEo?Ol! z$m!)nXDvu!)FlC9xE397dC6W`s|aIGqDIGoLt6sAU9KRJJ@LM_RTf0fc(Z z{^~W9K%lgXU4s~dJ(p zV)NF=rlp35+Z76vKV0q|is*Z>IhKMOlj#emVbQkS}a6N=WImGRA0Z6q}b<5A;Q7-?xv$=Mh;a zxZmg%60u)5Si14(Ru}i!94o$piw98Q&@RpvHQOKZ+5GuKvnG!_D%?p`pNjKZ0lbxD zXk^m%s@9ZBsB|bOMZ4Ohs!}1XyD|?2_27_jrp9PFIMkxkpgzXF-+^(njOgN8&jW+^ zB#_+X4ZkDtaJ)CxWGDCrYrbbbsg2WJxvv6U&=i?!Yg(cvCf*eFn`vV8;(RvboBxuwRPl(i#;PkRS7v9f`JFjbQLBRqOH_$1QS9`% zNq#MxP37|gtV{w=^gRJwbyh}D@|(KV6o^mM!5r~G-K@*>#Y~grv@$_0N(moQlxcFz z02w~MGd9oLQg%5{9bswPI0bsxluu@5Vg(n82Bou*WV#lxkPLpf7D@Zl@941rP2-A8 zxmbt!Ib+Jn?EALS>iEt^G44zbla-uZ8_tAs4d$O&1~E&2Ct3g}d~P zdKv4DtS`~V!KL7QaWLVJuK*2OI4rnmM`yOkx!V-w9NWk3F1vg%0e3O7+8ZR*Q>MXb zGR3|lN}C*4*IN@2dZ`-dY>c(gMKx4Nz!U#X)kr)7&D#lBZ^l&6)=C~9O~k@o#B3&* z7Gi;=D5M zZaeMg;QSo*H}dgm!RJS)B!Y18Cq407jXVy){1~8heIRhudn}K&v9kl3)*L&O>9NHR7t(^KcZ-_xTMGLqQ>$;5%s=fqiSm zH1oXq%~pMhlDN8Joj9>m)k}#gLZ8Cyamc@@T*_&eCaGK>0+K7?SHciH5v2}txyl8W z?_YFK?{9x!WyD!4LmP=8p%Gn&V`_)y;OO<90?3;L6t7X1xXu3$A0+5P?hek^%qch) z;jlQ^U<4KbhNe7ukB7Ms1S26WJyzjPE~4-%H`33rg03iIn%0MT5QibXj!a;fU9_@F zs2225^mwysjyYu@#r1vyuENCrkEG4KI%K>A zAj0Q%){Elai+zq^#)j0TV;)C}^_Q1sRN@r<8`<=)h?70)lV3(OC}+R8J14n?7~L)b zhCLRC%-`m<*qD5%&;hS7lw7&XLQuz zofn#8jy2z+Zu!oJHY~BpaNnlXG2`ARD)&PSxhk&{wcGp5Xx_2KWl;9RL34 z_`~q|J&CKXa=1njw7Po`0eEvek1qH9uG{$iA#usUIz$<*I#G<7iCa8;2kgid>Lnxt z;dg=0+GsT=2sLWu+zjjPe4W_RFk4uPvwNS}PAP4ZB8qjgI?lC{wz&ye=F|aQF|2+_xji z*HWcnowBUbEkigE&)Hu0n}@L9e7e=Ol(o{}DF%hxc`wno`ab;v0^dafL2mk=3kqmQ z6mn>(=mM&Ha@`d3plh-isp!C1d;FM-5)MaaMk;J2cXI|!aPdk12^ykzECZb6{s|h| zeK3nARZ(VDUSQC6g704J_yFJ-@|FuMA!0iK`ZjHE6}iJ@ey}bjft~Z`!CTIA>(LHl zGclkKSN2i7JCB*$kkdu?s>%*BfeTWic51>QD*qMso6UJ?IJaWEL?Pa)_ z1|WgjXe z)~R?O9=8t#W?Ng^T0fsmzI#+2IY5+1-~pwq&u(|KvO6xj%XZP3Fa81=66gH{cvIJE z^w&acNtJd(fpWK(mscnpZhR}_Uzt|Iw^s<+HxXg1B?{2f@RXKIm27uKbzdB&`|vH+ zv3pmZ&q?I{$@D3j&Gm8>?)I-Axh_@{tZpB`Qh#$AnN=QDxnqA;!%76w*qb7VKiUo$ zI<>7vpC&M#uHJ6q@=5vMcfXvk*PDwSBX5^lIPDLOZE*wjpJStsh8AD!gJuWuIQz}b z$i;FRMa$BF>jS7mYSM(19P3FU%h|e_jHIgeYvglRtIn zJN7lVxZX6g5+!V~#<}V`#Jey|nCWesGJSta$+!DCC@J`4xOw0&{0xUDE@!gwk&#YaH@hEFBQTK>xQnp254Rvu ziP8zAZX7GG55g#j1Wo>Xh3xqREtJrvms)H%qCq*_PJLR3%ZtQzv2Jc|E5k|;z>Cr{ z6A_C$vXuIJE`ilL)OFE&mF_L9KP>=lBa1aq1^&m{ii)=|%G~qyrjtBiM4`Oa)>-9A z_LCTlszd~`^^|yS51+#{$c_i1A*sX?E*>5QZ%^S|AJB=335dsY^^J-1BaM-#OAah1 z1{Rib&sZNpUVsJS^&+z7?ZFp}sXC9S#_j2?T%(5FdXTm24NkLrk|w5-(A^UtOIWVd zYPLL@k2Ujxb`fj|dyTi>s&ub-*5&cv6U^oIuD58wKy*ECGTG~dKi5$BvbOC34zxpy z(tg|uh{T*38Ki1$@ZEvj)X~wXTyxH6;g}ni%Qz?-*V6b4Z?m21*B{Jfa-fMDREhnf zym$2Q@zFEw0ShktY<@t5AX}`WQla&1-;E8y=qCX`bsfYVy<|_Y~ zYrc+8ujTUl=k@y1ghCFl!`r12BBF=0#^$wYktx$swRfo1N_97ni?T)flG9koh)Rk4 za^4Jvq5R~%(cg`a3lx)kSok&z%}7_h%t;CnB|6z&86=3RAZjd_$yQw(|B8^)xy=2 zxSmN4(7noh(q*bEOb$4iewmhK&G4eo85V(vve6UAa^wZMK!(0MLGlUX^l4p{b@`bR z!Kf(cb$B$HbzzXVof5RLp~Xb7PPf0FLRLkX$mSab+S@yGdc04f`>Y5NOjo$dK|zAQ z>PmOXTC`<#g5)7F6(#H*7&5mTcA=I`qhnxf*poF$-Pyy`rX_iSl+I;}1Y$ey=!_UrIzI@A`HJeG~us>a`3ado5_=>bg97LeP=qcsru+ zs#*~euRUTI%g5&YoVbg4wj*~E;93-e!I-hr^+P|3ZFkw{M+btFnRh^k+2JL;lanKL z4x>OWv(vP2lpR0EU2@jNB$s}D?v~sz;^IuHfC9_~9YGzSuHCD7*gkDWOl4%z5@Qf_(Bv;W*Fhp{S&Z8TQq`n$Nze za)$`zscLjIguLj%XXCx0v?&xQ0}&cp_wxgV_*-t1ucD3)Pp@}E?Ur|%L;CQJb+=B?1OkGNg9D!hlV|4y9|~Wx^<3XQQ%1sEZ|Dx+ z&02&NE1gN6t&KL*3HGCvaYkKPDH(;WP76{rdYk69hHMQRJK1xUJT4-!Ug_)>7-)sz0Vs5G~cnlN`g@o+wfA1Xz3Vi(m z?H0VezG}T}nWB`(8)KciRq82+={}c zj6VvC5|AgV8*t{g@H08Alp4&c1_y(p0SuD}9p4oRJH6plhiO(}aD}X`UUfr52IO*p=iclamC||7M95udgW@_q`mpn9YT! z>*NR%#FWHNLsf?k53mi0iG`dT9~(cf4rE7Xhr`2%7OplOZ)yEqT>}saS!ZF~{zBB$ znBezoC;Ap^^_Lgl2}$9XOC1&fD4Ot6rd`ju9ZVYMr&^SMdt1A)vmXG)&}*=y&e5WX z@^#-oujyp|R5KKn{*4E)PnwzP5is4vb8LHDPo}HvFq)n=?&i%ds-|#*+v9x=FDB5E zw<>^|=WseiS$n)ao0=7)dV3E1_5mg6i)Lb@59XX#uIP4rX*n2<3DB(4YD!E*1W=x6 zTcu-btdvep*b#j81~nC#xD<8n?w;4H-7Z%b3PlhOZcjIrw+Dz;Fn9O%&u&+n+pSWp zk})2qJ++TVCkvR~tcV;CL|jbqtC>t!M~5Pi<2CgL6;L8|_XW(~*mbF1_{pYO|sU(3~MZ+k-4 zu3A5Tesp%~C?mpFgzi}vxRBTP|I)*I+n=auYi(VQGzZ#mJJFvT({aNLgOnr*{qbG$ z=WTzDMwJ#oN6G7SJks#P7vS-*yuoFU8phf`OP)xf)0)j6=t_e%pK=^1{SDAHRBCoR z&vD#eTly+QXQ-2ZyuaUAzOYrK&SdhTCgOB;uDvG?M`wPsSofOiukq^zpjHetMr&4O zQ+atvvOsxEeliiyNeMjHma(C6-}QZ7=ODjA`=)AdJdom8`kstWd+G3SSOS#KMt1~| zcBWP@H~7=}r#41f`Yz#>mTxMdbsSf=@Bw{4PP0ic6OsFSr}+1)N5z`B*>=B0B0qKm zm30!lWi~5ygUNOx0pEjItMmKChqZ;0**)KPWbN^q4HB9O&Z30*-C$&T!!;7XTpY63 zf|(ngUeG`tm>@l$h=1o}$Rbm_O{VMlO4a9arn}_W0vsw}COw4G{I3Z5(EmCnLL!#nZ10(jDP@R?UO<{ow zrfZ|_kEvp$Wn@1(5VCw2=(Md{9^ajAde@DV`g)cChqP6|Ur!xXou39@-B-HT#iu%H z$7);94O7(ss9^Bqx03hSTr=t7@ZkG0Q#mw2_DD2=RKH#;q8NMsw;DD9>tW|z#O+)- zezOWZ0oODzuTF3I97S%XhxsCRCw>4&>v1sU7S}`qJfU16--I-bb(OKS1NsZlNzaL8 zEMg*RHT=Md64_d-K6s+_^*K#;NGT3mC}jqfh_Yvhsd7-htx}LXrYo@nS zXVmVrC&-(x`z6skSOt!MbbOT)ueVo5O#?%e=Lfe=)iyO%+h(%owaV+0wFW48-_YAg zcja=s&=D~~-Nhn!f?!##d)j?(z{bJwd2!@6Lo!0+VY^heXY!l`{ln!U%7y3GkTwTZ zd=!FaJrjC`&6YrZ8G?8jyI^MURs9!OPm%Z~HpL1NeMM@cZ}qUJ6k>N zw(0rsxZMZu-K?yfp!fo^GGo@Ymbhq+iu$HG8d5k`PFBy7>AMA$Syo2vr}C|=XG<5~ zxY-8y2EuS|Pm?u1r<$xQFJ_8GzO3-u zPp=Wr$190kSGO&CxHB!VZq@7n33+7JcfgGL^IoZ{q;`w#Fgj59y*`Hx9WCRJ_WA>P z|5NF|)>mPeCpG~@+_%NGm(&Y&juIomI%?DQgqThlIiMZi3Gf(J`#pt2tq3o*&4(RuFx?mq<4y?^Ww7SYbz=` zw^M$MXE#o|>$**EHquz)L&*bI9-yRbp zA}eTFv_*}B98Ozy$S$^n>sCUPqJfx$d4zs1hVK+wz#;)yzc?LUx5tZu>t(Xiz|36l zJAVEH3fZf*4uNIuu-+gcB)?`!R1)^W5tOIPtGiy2R`^|B37?}CIe_&@er~%ERC;nZ z?fo5~|M|s+qRb%+dC}M;s=dw|*E+M#91y{l$$kCybY-*isW*yVZu1WxDov+LFCbNckfb`k31{XOQu zk5Z$T&;M({ps8qMxr6(exNW1~5^pi8(~yXxP&<~JeYc^&jGKq62w#B=$KP58l(5lL z?)O@0L?Y>=MmP!<6EaU+XhO&08SnZn2tYFB`wjw}$f;nW*T~<>$#2r5P;f{;-(8#j zM2N7J)EDsLNKW%1^NeaRGTf~9)?F04F-O!W!d)`p3)nfy?0b`Zc zM+H$QZ;iAtcOvNQWpanTOm!Fg4;H1C7@JLwCx$M&e=|!xo{q(3i_KD?p;xS5Nz=x)taR zF0B03wpTULz7@tJ(@W)YU}641A;i;Jd{xPf;^%nrntr}SVd!U*l$Bz=D?dIr8JV_e zE)*q`?ksllQNdiVUw=8J+G@fv-?bqlS=ql`QpMu)(5N6utm=B=c)z@7#+soo#J>nW>!_o*_{% z5~Ipn?$gul`fT~vOh332U~tCrAf!pTQuc0IGK-t*JnDcw*JF$q-YS|1L6h z$dlsJhh+X zEN;>F9y%TTL_lc4dmq?}|N23`vkIS>Mpeh0k(y=3t4?3IC~YQ=d_qUj2c^dn0c}5^ z87r`BOF<-|hG+VeWkV%@?A(+_+RsvEVx~U*m<`=?y&gN0?nJ$QE1m6DCYQ(lE)LD&Yp=@DIQvgnrI~u%O9UJL8P&%wh;J@an zAn>*ye;D|!m0}Y*V3832l~Zvg$*njr_5n3bAZdVdz!1~Sq0k=O&F#KdrvS3!ajgqOv@ad89lrfEM=(U=M{8;uOVPvJHdB+IP-yU&;Vm!{)luV0?(jWurFu5VC zH_+JYD?KzRN+K$H+Sq1o5+I{swj>Zbv z<9T<-*jcfHG3jW9DDI|OO6Ya#fMHdnr6XLJ&t1<$mSqYw|_?l3bk*-fEq z3jYB%Niz`FSP@A}#+(aRqGB&O>crRyXAP#JX`-&FGs=L>LNNps6#z;@lEe+t+Q*qK zXhEh^;cAn0nD#Rw_r2E$obEe1$mlRMPCr0x;!{*o0xF|>EYeOyl?>%Rq$?gwTh1UK zAw)?HpF`$S)F`Ix!uD+7%GthaUkDpyq9EzK9uz9EE41eiNl>m4JJl6W;1;3i79!at zb3o>T_XJp2SBk!mVk>990}S;JNiE8#YP>(x>W&6c(24xw;zAE-)MfIE#_xFv|Ey9_ zgUcjq;HicML&r<7^sBgTGA$UD;8-RPX3jI+q+tla54AxJ=WfSEiv(1;1~%6!CM06a zRttnR>RQQFdB#s!RuiOALgLWk#xS^lSV}RY*u4p0<1AXFDKs#UfnuGQ)ww2@Tc>_f zTx+rM#s9jywS|$=>A!)+F<*IsEt|p-3rI{(bi4cGj-)JA;!irmH%@#YC0u?p1PFSB?K{sz{);}LH#sdaKPYuQcoKr7mr z)JIkx>(4`3^ox6|E2_l*qlNw}S}67Z(L#UILT{M=TWF!07eQcgID%UtWeCq_qC!W7 zPFp*Bckm2djWk#&eX!0^pfbx-m|;zD_yiKg05jo0WEi|)tUb;&GqjALj!&DP;vKFV zOB>Zq-fxf;*8jCu=r!5p@`1hV^&zQRB{mX&8cdh9D5g->;s#)g#e0;IUSj^KHC2am z$FRQM%iWj85lS1M^3pN~1wF9Pp07u(f}>nS7B7T+DpkgYD;vd?qEFuv@?}l6UJ9sN z6OiJHUzC+6$xYI}n%&aStqg%cSq;aZX7Ra=@u*Nn>|hI>Awwefm;j^yK|w-^Ueapt zBRu%&JZewpoXz^?M4!-*1X(#~fe2>&z36~RN&-@Mc-qIMdS)w2%?26CBxSnWv^~`L+ILrCZDzwvy7el=j8KX`7^fCNe6Xj39 z2=tj6906sTG26!&QMA8%3uj;9wu^(2E)&a6+De`40}NSU(eM|%Y-l~(wRUr2K3!iC zK0@d0%Ej>%m!wzi8>hJ*lsgKgjeH`~(LUNQ3>K|!ni=nS%)Ll14P=VE^xB!TNjog~cY5lYlc70ajb9O@L@C-PCbfZ>3qbb=U1}`hs((qoc!i!NTKmR%SaIUd+$9EHJX<%SLWTtOGFe*S(-Xnm;hFkJeok&&8z>Ku~d<<1@AsLRO zTyrwS#v6TM|3((vj%HC5d_(p3uvAWHAQ6fKoe(&3PBds#hf9M)CuY>&Mi<*XsJ5 z27`tk=uM*u2=C0u{4pc7I^gbxA*hvkWO%7&*qqZwU~T00;uim+@_GN|;im^{#X|fr&fN||kt&)RrNLFh6@z>wjp7$w*``wz#`;~`}MFhC~#7Xtu_#5@J~;PrT(uJ8Q& ziA5n5n$n##MSs&|(M`WK6R33AI4wpSM$LhvsDqQZ;eXc?{SEPK9`Y$>Q?3J&N#OGf zamm}54remNm!!deFi9mqrdlyGlk<%%V=-k&?>DGH>nM}X$l3GRCT>v1W(7gq7bNvZ zevcd)_GZ$b#6^Sww0*-BG=UO~QFwLAO_k{kj9CG+)xX~g;Ek<6L8<&HOA|TXHPAWL zO{id;sgwa!5e?!Xm{zS}H3+?{s{4@tnfiOxZYnO>@1bY7f--(dp|t}!#Saxv%`sNT z%3UoYqG_vOj=;Z2uK#dtfJ(|bD~!+{8W+GyfieOSC(9*Ur`q7SD*+P>$bUnPkq)WT z~_}jN?oI5?8o%OJpxy%|3;WjWcusdKVJKcV0VoZ!f&RX{#H*}$YZ6-ML=+SG934aIc{ z{MHg5e*67@Qq37=Y?xJa(8#@mz-ngSjP!_RWU3gi;xzlQpC8zRUhO1yJN`oKRAYl6aVKOLlpn&7>Z*2pLGlg{x3L&vKpswB#H~o3X64{ zk8$2;ZEA2PESppu2eKMVTpIWYqi*R-RQZ#lblti6V~W=+yyHczdjNMJ^2TG{ytdy znfnAggD?`gH1hrw4VcPxadZR-tJ8Vj8kT5NwHm%t`|NxMZtQH0?XgR|UT!`J47Ikk z^?|(FJWeWHd~><}K#a*{dhvf-mp-ytU35<^|8kL45!{_*#9Vwd;`me$$Z58nijaP} zyS>F{u?Cndg6Or`p@%wnocn1>rnC6TIXSXQ)f$#ZQ-?oylEOJQ>-iugct2$|e{yc8 z++Oa3kBvcID$R{GT5dHT@IAG4c^Rb73-IP}YBYsg9_<(lO*j!~X0_cts zmBubWefno?j`wmE{mkYAB$>@$XogMmS(6XNf-&i5Zr3?bQ~@AkrSQq)lsGtuENEM_ zJs{vuOfFg-DG^m35ml)d42Gf-x3roEIym(_F&GMnzaok-)oEd>OyE~~de@kl-4!R? ztM4xTh{iadGW z90^BKw_X@IorEyvyV5EN${zt*DO&bN2^52j@1QnSrVcIjlZ%ri*Op0bRj8^*l-bRQ zmc!0w;xP;@gh`%Db)OV=bhucN~>87EkhHwRVCfD5iJ5=5t2w|`=ac}^9m@iR|E>Fwk*Ivmds2)%h zEd#^F!hr>A12?I7*IdbUZ}hp#{-{U(gXa@=tIfnKeddZcpB?ca@K(TiaKG~b1$}`+ zHc*HN-^**0cyuP;O4rl6+Jx)nCb!$?{3mEAKOI)fXDWJGSqlPTiv5Y7&y1F~md$$e z(_`SKC@C&`pGtCd{_-ysL*3Mno^XDfS308b6}?Y|>Fmmaf_}&*kVbq=%#I&V3~dJY zDOI*xvhgYe9$Qno$*E6Yj|7vsJ~~kZT>?kHI^R2cW}Awqv>LBx-QSj@SE|XEY6$tw zMoMh1D{fFR!;c-d-xP(UZAn$oVh;PKsl1J{}GY9Be)x8qSB`UQ}{4$v^Z6 zuq(9M|E$FDv{Y9xqNAg0vsY!lj9GuR1Ft03oEmvXoo1NhU6S-BgB6*N%A7T$?SV*( z$kAYvMmr+^grL?!!3(Jp5676FlwOBv6@vm(TiPXy9t=>mv{rImC3oQbK4x0vnobvq zs0<}xpFhkIfgc{dZnv0Tkcnyifg|``2r$QuO+${oa<$cUjwQ_hGy>0%VYRJ8tix#=+YJ0b> zqxjBq0q)4i(P_k&j&C)P*4CGTGZRw|uC9DO7dH|MlqAK^60D53 z|KnOZmJx!volm5+lSSp#vwl9MyK33R-}w{A!_v6E1G%@85}#h!+R%>&YeS zuI4cE+8YaVO1|SHUNG`*$&etIcG2m(7iS*q$A9cPTx&}J<2W7P?6%9#^wc~owanCq zKf5}JORE}|5^b`wb+BH&>g9MmA>X<@eI%T#eq49=s;R3l1D2bu&X<$BdwLvH_HJEM z!^HG>5>K%W)XumMXlN1|=G*J5zI1Et$&>yqxaCImK)%2eB{})Nc2=4*I0v}~rkjdR zm8`6=NIyzqbvZ9DlgH_)h57u|+)aGVPmiA&+M0S@j?|4lgWX*{64|^Vj50kwfx7^P z=<2RWc~s|j34^@N$&v1Xi(%|+IX#0L|I>8##Uxy@sON9z_Qh%uK#T<*9^S#ek?Yqd zEkfN*tJBUQy6$q*hlz6QI2sy;rl#h2^1J6*#3rX7L4c2WS(!oT;9_ls?zj{T!Z;mc zxqG^B5>cJ9aU@DuzNML72^mR0l_NqMwjLzthomp{*8q1d1w}IXi`nucMR75@7+0~& zZqgWZ3c8wd#@7suMzjBaA@%sSZL>FO@KaMd9Fy_Ia1 z7VKXhC8nf|hud{O$lo7VVKTl#7}i3>M`wJq@h^_$|J)Qg;_^Q0NCRzZuJ5}5B9_kt zYyjL|9K~|kOdo-6{8_II8YGoeaHghahsT@PoX^3CKc?lSq_%5gf)>2I-&t8Cf1~v} zoP{=wPmDX{Ld?oaw~srwx3-@gn$&rG)P{Y6>i0%7k+McB1r_Od-4ExM$Pz%ZOGuOi z1>J9N^CQFKY)iJOD+(%JyxiBRFE2|PIk`G;xgPG$5A8ss?_b$k{rK9b*@%dQad=k9 z;zU`iW#$}-_C;LB@DXr(7&mQY1{(7Z>)mdoMnz%BscDxnBKEQZ7>F3oEy`Lr#WeG| zafMFGlVyN&kmf-%Z?OEUt5nSKU2)kg`zPV??u>+md4<7+vjKFE#1F)a4OXXNPx%=6 zz>v6$#@=3!;9ziBULqo>g|*6RDr9tmr^mw<%1%2A3v@KRfbrig+e$Z^|H2*Rihswt z&rlPvS*zEpQfJh>nc5$^ce_}H@zB%+J4R};1!ycEA|5Y!NHG;tj{y>Oz_h!~daLcj z_>n@>rTKMU;=?bG&9}QH*H>52Qq_+=Pi2)9 zZ`o#p-Eg|SwbcB{ZsUAz_96Ow4C^M5GFE-|oc&39LxH$t*1cL(Z|(|ND|p|&Tj`+K zO8vmT5?pa&JcXzxpCMSR(RRt~B&Ld1gF!?x$21Kpwquh|4^s>CbxiE0Qtc%*AWvuD zm-Zg5nv^|kY;9o@KbapyKrvag390p6f;6&_Fu9zvRK-#U4g`t3+#*$(a5P0h-g+Z@ zgE+d%w6*l|DgtA8fu-86yE)`I+1DBMhzEUs4bdrFg=$$OOoDvJx8LShyAkGDn`j_* z%eLd@c*4%>qHT-b=lOk~M@Q&fZHMiMt%1E*v&pHUxMy^9BW$Bw-d%k5xRSEn;kRLM zh!mvJ+8xns^|PxZ6ARhUXY=7uG8Zp0mM-51!aSlD>>cu5u1Z{ohS!w|ZeS7q45&H^ z8P+u=n;wMZr(hiG98Ru*i9)_q?@hBJ2Xn5F5_0Qub2SuzjP?tmWFYx*;d}2t$BRfH z;+IxdnlK@R%N?PgDZ7jTBC|Z5tw!eC;*L$tVyqkLf0v>@>$DZX@ttu5Ef0i#!NJ;v zNt^(V=`3bHHbaGRiKeVJYTn`z-j6VI{bH<>2P;ys0xKfVo5(DHSmzf~>0kI6Ii3b$ z`9&5Zn9Wli9hPCtCiiSN+JUjasnvh-%PWuy+OJI8q=kCa%Z0*cK1KQdh-jt}w?L8- z#GUVyJx{y*IN%s0MXmukO0V9E#pABEIe%rVNCBqN?Q+Bx-PB@ITxMrq`_7h=(LVqT z5|J*If;vgr(# z0YpG!eSLrAHY_aCI+dad(Ng}xLg?paYK8|c69>mr%=myxs#aknK92_#4-YENU2oa^ zSa|8=r*}s_D?nOgA3^@m;$A+mCju$h=5h}~fziMUZHsi~?51)Ha1`YrVDwqoS?Oyj z2b}QbeG#V8w>zeLnFfi@`is>!Sn3oEg>0%h)cweV5#s!LbbNf3e0pQKURSQ@KJHjvX${XRvG`wcRUr zS;w~zzDI^(h?g^;FjY`slB4!i;|ht{#mY9N5cPP?Pr794Ib|4yHL=FSxE)5Og2eZuzQHDh&-SE*sR;=(u4yT9$eW zh7Ugh^9h3xOdc2&5(kt0zLmNr6}erVWDY@g9KaLV1rQ#{La>kGP*qQ~=ja&^L8Le^ zL4@(}tmj6w0l@`5z|&vY*jQJt9o7pEfO6Hu9d$(HFZ@c39HmXmX=to%FO{-wsIBkk z_5+j>s=xOn))C8xj05HyDCINQuQ$j!kpRA&XXjznWgI-bgwzr{V91strorC;eo|O# zqdiySX2g6m-{E>tIWX!^V`-uU^EGJd{~QAr@pAT3XR& zO?=kqb6kg~w z8YQ6V(&GtxiKP(^lSkhdd=0-_-}$5(>Z{mX!S>F z1}j#jms_p@^<6v&vLrYX2Zy+k!MDf;u_$#ea|2-^PW$CWy%finEby+599enaZ-N|c+}s24X`DJ5 z0X%TPWv6qeB_L2qfg-k-ms)6s1_)hVaa)@8;YbumPOCG}5loT2X`mF@fQu-N@oSMS zfBmc5ZIjKNs#m)B3L~M)2e(_Dcrd7RigZe5TK|u|U_Rkye$ebo+soBeEqKyQdj~2= zvcct~4CCTHg)Oq-E1@DcyeUd%wf#^ z3@#Gqt#<^Yw8H1Y0&QprVBN5u^4wF;n(7n&zEA3Ulq)e14Hndk)P&>m#__e^bMvU0 zC8VRd=p%sa(QU}ctH+-#KzH-mXh1u79Cy-j3Y2fuYI`P$);)euX*tg5AnY>)D~={+ie*$~H==cBQ5c__&(9&^=JU0)9@$ zpb2+`;B%1;3Jrk>1THsrZx#Vpi3wLSJn*+f`kOwQY2yBiKI&v1T?aL{&2d&5y7Mv1 z2!5LhmMcSLW+F>1E=hvalHD}A0rr|;QQX+dsk)eJmWPjoHISnVHMMbV=6D7V>9JoK zyb&YIFjTY|g>=-{!9%;qM?FIuV=;0UC7b%PA-Q7Pm4~GIa(@zC>ejZf8}xcp-_Y#g zcQ%25-@Z`JicbUqmmVtF=AbuKURlF5u)@pNskmA+>fNUe=FOMN_zrwmt&8Xs5#qhp zd<7OdUn=in(prqgB83MQ_WwS!~&LF^i+1++43qy@Sz)?lG2(fNK zT|1Eomm6F%^}8TQ2I2R%C$iyDV=_4;)Z=w=E5m|A508(9akJV0&CDYJd=wNEfjdGW z`uuJASScqW!t9MIL9#Sln>r8uI9VfIzNj!@#Cd2y^qfb0XSP_y@ck*G-*{NT^CG4N zSVW6TK22WM=4+cM$={lyz(1Oz8`RRBb8qSZXRT!n4CGOYG;EO{X7rn?1ofo~E?28= zi;?9065Y*S%dW)gW^Wi!S>JW2k^%5hf_^qcPds_1yBGuhUX&Z#{3VQ#4z7-_!qLP> zFux!zj`gpG1DcZI-dMCSP2uh-m@(5}jR3O#h zQC)AFOg8J)Y8?fL{a{h3u~|6RkkIsxLJ7ozz!*JO0|0%LprIj&nG6O2?u2(#b2~9s z_TdQa70ig%?e9(@G=k%gg>`RLfaV1v%JDiQatgGTGHE4s*V)%h6(s^wO};FH-^xl>i4 zIUXGx5pp9t0phdX%C;q=$F%56Av^(V*SO^2Z@r3oepfo>i)r*C1Mn?VP5CP1-=kY@ zBVoRL(HT&>9(;Tlx~kq7XC&fQUa51&6c7R#Ubzh7`D=ZpNXbe`=kP@+P(UUNvR`dN zZ_CT5C-0N!?Rvi=#(Mbz$YEy3(CaZ54i2iOqRRhH6W)J+q>&iNRDBrE!|bG1QGk*L zj+v)V+dqi+?}8b3C@8LOAExp3jG@qj@V18=jS+F{`Tiau20_Fj^2nCg`(z6vrLIAe z^#)!o(+y_WPq>ALQ*$RFK*8()@o?UR>z6QnELzPD$5QhMxo3?I<3xow`)^2h$9s#I zb@b)aa}7)kTB74aUJ3S;OK!cFu?O-(jf&MeI!UI88!%XK3tnzzl&~q zRk*t?I~!m7P}DY1jVv29RGNpDxn7TiS3LS_zDkpe2$PH6;qo5DVw&fDRQfd*o73SIlC_?$#BDo(RHADu z^GJ)P=!rpIo|2NXdz^*?unf%D5#@Cx`X_IM?-EEqdH~m{3^&En6c@)B%f-c3tdV%}^g_wke&|k@3uq{kj1c)=ebe}4Q`3n#CE}6t0weKxx z6ndRW3M&!L@VNoTBS29^OAD)chLAl6AktBK88gOf9K_U~M!gm7VY1D$B9&K2^IL~J zzB+ON{3s^%I&^3_dnjLQKtO|T@~(gVn1%#T*udR&FejjyLdti^&y~d+?(&FQ8fFuC z?F;{`Xb@+M9T*%L+Ou~?O!Gil7M3DLVk{P#yJn@1fD+0hr`jb~6GJ=Sp*)GKz*tLM zuqd#b>0db|#BnYREiWw^dNXZi>lHM^b!^&3iV^Xjq%LAtO*uCAY{vGNJ}SScNbSnF zIgQfZ&^%9XDE_1T1BB2CiF@ z(NS&$?>Wl9FY)nhfV_A0BHGVWk%0Y-cRQN^FB&*JIB5BX6JX8W_s36EGc&me{RcT> zjhtyGI7Z*=1AG`AAXsRey+C51W7_lFmNQ3$>d;-*LKVn*AIq^_taKZ$gr}v|Xom63 zjE?1Ekj4&*7Rcj?-7XzncrnAWIvXI?NOTl14Pd>ULpZ`gN(&m;L+fD>VTQ@1w+>j1 z5i>>);9D$F&d=aDQJfu3;?A3Uhk9yjpOxl%6JaJS6BFP%RRAnrPn$4B9zOi%B8{G9 zopZ{?_VVuTV4w{W2!yRZ=SM}q1qOgYAYNahwA%BC{l%OY9RALifqrJ3s2Iq1I(n>( zXxsz{v-QrnZPSZ{Cp-i4Wg@0$uXdp3d4Y61fb!x@KL7bXBEp9hO=Qd|z)%!+jz&OA zQ8vSUACk~sWo$OQx@!7(%$lC3NC{%uT0&zs(<5*@=zBtH+k%`BV-KtPRJ9^TM|n2D zEI*L^9+P|yRNEsG8#|SEo|_~Fg(|?|bz{U^Qr(vL^yD-$0~j2KEJ^3I(GGL^7}*W# z4~^+N_|nPed;)Z=s@mgmf8D!Fs^80pj;(~dTzv>9`6@C|)ga7MpAa~DHy6)4MnF## z+uivF^9;zBnVJ+87RXTUNd<*!5f50 z?r1K5WgNFZ{F*IfjQ0NAAdi&LV`@^5se=0M+Ahe46eR3Ege%t=P?Wu8zKLWzCLc6}8Yip&Vc?>UzCb z=*}SUOc3*Nrq1vH zmV;WEkV65A2m)tr6qqnkRv<7V@3KD&=cVS>>(~-0dT`nFk#4er)w)~i1Ap-LWu-vC z^Ce(mFDDGX=Q5z^o)y-Ggd3VPLhdIW;0DU?l(}jDD10>9c4{^kN0?2fEETHQ z(RrQ{7bLfY7Eg~?5<3J967Czq%6@WL1=&^)tL6&L3CaG{%t$f`?ut+;6?EDUya@D+-}(rso%xgXM6#BR zC8_jfjvWFsmXvbfgbBl4s!?Sv^mhN$%x+^kV=r_#iLvNZKkSIUs{#*2+@M9-?y66I zhsT4Ts@0ITOjsk)lnokj)=csT1x8X762vFU43+f99rQ(s_@!JW6aWw3B5)&mp3&ia zf)P(hk41UnpJ0Lqybr}oLh66LUfU73^BsaN(dl>!Hpq*px#;4HSpX*eCpItC_gEbH z5)i8&hUD-@O5os&hWl$4UcXF%mp@p475n=O(j9)>43qnhyRKD1nua@`yQvVj}7 zD{(!as*qiso$)>ayz!sZwI3elNHO!zJ*9{6pb98f6|)t=rZ~Tb6)`f-P^1m z15}$ZltF(L3dRHoH1L3+Q6q(k<6M#wDS+-1+*#le3K6og_8JtSMx z)yl7c2Pf$?eiQK<3pkL+YVq?0i~rkI)Vfa;9ZX0age6ts)*3cL_zriJ%y6 zi-uykXZXD=9Zy9n3&)p)%$g#@9<7U7W{5GF1O+W}R3X>Y@kA6llX=8?kz?$XqKi&xV6%~l ziiu^Sd7iKjgh%VJT0p=TT?izSekrjHeP`cddT@?&_+g)ghM#P+R6&r<%lp_gF|78=#ms zVQ@oM-*I6tBf_wY>E-1h8BY`q?Y)0PRwzSDsJe+u{Fjfur%JpT`vL*htDY(ijl576 zg)(O7rYSc*{^|59!7~Xm6A`s?B3D+`!P`K3QSKa@YXsJ!!T=PaO}sQoQM{3>l_oJV zS01N63bbV$4HL#c{=ffx_&W)Nz>iLEY#)OK24pDePDz||P}rtqy9|92g?hn#0>P5( zlH~8C%(QD%nGG{gNk3U=9hKN-5oc+9t|48@O>Q`8N3yrkNBNC89&k)y( z-$0N{BGU%oHUZyDoYkUKXm|E?6P2PVoCJ+yXGS4Eshu9a8imY#9>)sOL@JgtnAv#J4>qCmBNeAEg@|a#WFsDY3iL-W=PnP$@9uqk05>rg(MP2z`tY91 zyxG^d&I<@We>UmAB6xbec7F`5o5M43#zWh2S7)}kAFi)db+xomGkyfuN9t} zaG!AuE@vAqa|f1ONrdWO3Ap*b71JOg_syv*8p9%nO*_t0cR zwTNRd1iUun=VKSo`A~?M-A;(!vqpg#rOy^h0!V52C=y+Vk@%~O`prz)06DC z$phnhmz6kIEIuEX@rw!fw9h#}R+Mp42H1Q(*+s*FL9}y!eVlaL@`Vp{ADmCcf4w2N z&(-*R8r%SvO=)j*1_%`~KbR0ZP$}enF57b43q33?PqU`Y@%Y{-x7gZ!G#=K2VPS3o z!+{0kVGgKUS6f}2TjQ}`MfDnYGPBn?-8@n7TQLtOHowk1?OJn1!C`$jW1o_@ZXO~u+|5{#r)R<73}7w%0B;c?Za z!8TiOL)V5&w&hGvBX;eb>~Oih9en!oyyshUi0+o9Z9_r94Xm^H>i-}i-VG!sfyu$3 z*Ks>}YK)1Y&$;<{+HcvHKxBmgxQcf2KEak@dn@Ns8J>5SCNp6GStFNoh{s=xZo`ii zSt^vh<--c#rM^u~b}ky_fZg{0O-3j}SqToJN}NoQY<^F?xN8HTwaN+_$lq6&2fuiCH_P8&5W%Bi z;o+}le+VE=*JSG)eO{}40y6>)p<`k`p58QOXk{Z8Zk^1#?F>EeIGA+Jya3!q8_lNg zsgvj3IW0(g{1*1)VTNnN}ykpXSx{)qo*juU8@4f&}=?opR}A#q-(nx*D1OZP8o~AB^|`YsOE? zV|l=d*bUMKUW<*2+WgTmWL=Wk^3CPkY%Hk4lgO9TO-+C6bKQ%{@5O<+)5mX2!sFQk z@qokFcCAY66(PIDZqxljTlxKEHz>5zo#xElRE%7Ez0t<+YHM@ae6p-;!GqznK0Pao z?dp8Bt!-}P7Qn{S>?si1;pWvELd0E*?gXQLgg4ydbd~1%k9Ok;QEN5kR z6eyk24mqt>Yjg@0*j5!gkp=O^eVi%^$PViJuqrCd`oSw&xKtI{k;E?12UD;(F&;G; zEZB5C5Ah5Z?x4eWsN5mQJ`ue9DM|3vMR&#Vp9`b^z=Tx(158Ntzc8WyJWS|+6AhAf z{J)0=xvN)WqC~!`TUcm%h|T1_{=QZhp%J|E_5Hx*tU8=19F7iSMTm_R2}KB-=Csw_ zuFGj`wpp&1nm^*;;Fz7IL?l=ler}=#fCe*YSDC{UOwJQdb(Qu zHZ*MkqwTHjLV1GzwBoNnh3qLf8Qq?hsZAK}RWJdI{@a?H_BsiRMU1pBxn9Teu4WJ_ z1$@ptdREK%Qu}5I2(bu8k|>503MmT}Ow8qUqntmQIhon3sm7SAjcv{Lp+Yj0 z)>W%tG*>!OFiplEDu38%w>^(iml?~eXO`_CUz(W${6tBVcFsuuuaTj2o&QW^h}T6n zlgID{^2(d*L9a$sQweKqY+_`xjn)1dmT)R7J2A1-5Ffhq`Q^#nBz}h4e}4hdJS8n< zpC3LiBiT9S)Y-vhdUVw2;l&X79kSaW*HGLHrw~e}?dd2+Kp}${;ahC1JT&xiSCDv;pC#r78~@-KBYDJBP?RVHb|TDL}{* zgqOGol4F+{L{F!5hUXWD)k1IvF4w_eaIkwYOfV0ipB6hsu+n0F6#Y93FB<}$c-1l> z-~k2}Hr-uN5UJ#cmYxy`4e#Z}sGWlQ_S_r|6&F~_tX)^(PTLg&5@Nh4e@p|@5qqWY zT7zkqcC~)pPUc|L@zqK_`h8s;)C95ZW~cAP8T!S#n>a%r!=&LZGQD==TBE}z;3?!< ztXed;vtxY|e*FqcDleXIDcGaz({CzO9svo~a3d1c(6KNLxyeCMh%xii{M5Z2P<)`Z2d*BVmC-5Fhkj z9ZxwpxWJYZhR$tG0kcJp#!{yFY)67voqgjk)oY;&3NH_f0M(OIxb+6Xha>s>e`w_G)}s|lNz znnEw6FQNw%WwBW?3Ap>GQKK6g&pXb9OyJh$)ydGvaGw+fNSxg=f(x~UO0)>8S0tvV zs1}g^nxfmxUDf*@x^J&Q?A0hrn?mwllJ$#&c0bSCB==+gC4-(uOl>?y3FJ^iyWBFW zQMq3<=274*^B}H7M>Jr8nMV7y@88g&vVVmRLHs{QhoI50un8vW=!ua33mp0{a43+L zf95l897C^7wwpzmnIfi6Ls(Af-0YqhQg3} z2OupGz5Z;I9ec( zOhg9JrKvlX;EZDa@z)00!y!YnBnUSPDMOSvFGC`WI$6{! z5)X3|fX7qW6(<4~n4g(H6!t(li=;*Pj7@k*hUZ|hxfShg_l3NpNNyi=Jb?7W%0vpX zCB|aW+@3W-jIb!x>bNGM)4?Nn*dJFXBhmosJ`_q9Qe=L)Zm>gEAvGPO7 zqbx0c&?{y*T`1TxI1Z?NZxbjo1z3`QrO~urMOoFi1tK<5+AvEcdu=W4r)T$ptPU`0 zf0R7Ijh>!}S}nu;=h#GyjF&DPo8LWT+N|gETYR_7Jf8G zAb$yr>ROuW>&=qJVc-!DI)ziOXhP-VJ?bGpItHd6bL3TwZ%z*yPszKmbv)?d4j=CL|qnE&bTkQAWt@STyHq75gC!e={1E!NLbMMbsfzIh$jdh7>{F|Xr`#6J#_oi|# zUw+;FWiawK-PUKZfhjz(d-E7IS5&#11RaakL^5DO$sxbyb*5g56 znjRc#wpqu16A6vw!o>cb3^3!38m2G;p6M7okvCQfXYWlPxJt~fX~v`=jYPL|Kes? zo&Iy#%oy$d(vyYzPulF@=m1GXf9snb_!$#eUWrU;CJd1*48ouIp;B-F_x+zy=0OtS z^z>;{5lXT?Du}NL>CQNg8hYK{3GL4Vm)oPu&66q@hB$^ly=9+|H+pf95vbH?)NJ(; zrXx`wp;lkuoZCCv%+1Z&qrdeH=Kqy8GmA}u5%5ULQc1g$96CJB2M?L6CkkZuB11Eu z`oYV(;K0?u{xm0;X3v(;GmJL`*Rg~ z_7p#pS^^fbL%2qC&V^OCNOg*kE(G3JNW+H5(tAd8NZDNWai&ZG!_Ln69aMteUmi`e zIemPfb;w~!b`ATBDa0=#mZAk^IZ?uI9Xd*8%EO%vjq!3t7@OT_Gj1%6=3;hkFm_)P zQ^P5qi_W^nB57Re+p?oJCisYQ=Y+wPrt(T-EobUx1eu6j;HF*63@VVBY3>ozA(W8l z5P&8?^fFOfA>$G!ag#dv?2nG5Fim;4%~PdD5am{ad5}RxjI^wHJmLoz=rIWEhUq{D zFD^#c7;MfL@>+qG28=Y9%*?HmzA8cidPrHBl28U%syep;S<4uZVqPb~JRuFySOmxs z^YEM~%{q)!U@823Jo~453@%SQzTQ<;He0zoKSaU+wo9=`Mi2$k!)XqgH>H zkINt9HbBxL=!w(GykB&`WHJGr zY5XYR6y?q5)cofBnHD+1#iATR@s@j=De{#$u5B5WNKT z)Pjg5o0)mGJr>#B`BYU?z<2L@m(rZSqjW#GD@MJAQSeqhdhKrdCm|9j&cJ(_@9*OMHp7nZ>*0}AaCkqxOnXqE4Ssg9g zz&#r=IY`PX)-IM-uc(y1FX=(OF#oXc^at2 zJG8Pun*@`*qSaC%|KRMr5jI<)Dtr9I;(mR*Xhg&dzwHlTG-klJr(zx;cU?o9$uf|k z9S?=i1R8~o>*(WauEgRo)6?M0ki5gFp305tx@x0j`;CR!4&G#KSN7)wPHqb25 z{+?nafytQ{7@>qZ&y#K}Mm2S{y6ltVvDz|Tc`K#nGDT0T@ioNqAzNoh0||arOcoG? zhKe`rJG6%D7lMK1uCGBlf!C-9@~fSo<3&@4;dXMoi^~e<_C3Snr{I` zk5Y06Yu!ijA3%f2Q82kJrR24F#GOHFWZSrx0vy&oVKAYuZj-}BJ3bKtz#BLHkrV*j ztCoUpPf!VLkC(v#mN#*hPCO0wj(&D58bT~Cp$TgrPpQ32fH*=sY;O=G(*qL}h5%cE z`7+g^f(+ZMM~L}ZcP&X5C-}H^ZrAO@y$h15yMN>!67iGk%`~q@K_C;BXGwv`k1Ce} z;3=~D<0)#XZx&;ib=veaR6ne26X;0-&}9yMw~@79^(LCwt+#Mc$F2#fnE3fGaeS(- zmi?e0&YC!f0q7zTB7_nH9D*#VRf_vV1Ft#k^O38ot3?Xxp}Jz4GXfUPY1P1hYs57c zvrve<-V!oy(7K2|mha^^xTqw+%hp{m$Y#+1O}(xPEMX*$Kj(+-JOiC9HKPWtxB9Q8 z2gI@DfZL2*Uv9IFflBw9bDW1lm8P#<%*^bKnRHnNSmp0 zzflqOp!T>qFF-ewC9z&hGjokE@bh6;3zC@q?3?qlp$FH5qv#z4eP? z)fgi|$_rPJ!|}}*>$tjd*p3QkyNe5|W0w?F(^dCGc(Y{5cl-Jl4$A^@1k%v4&?=?H z%LIpycms*|0v{5;1SK&u!Gn;)6>)!*hFao1VN9YHM!b-N{PJr zZ;kR6_6aG@543goe8{tLYqsG-#63r7b2yP>cdUHtaDwD_3$AM8Te2?rv^oc)`LQYR z8cV+RExIv1>uq*nug*BTYpt~Vz|lXJv^&PW-=`7KU`jxK87R}$!wEqBD{$8CdhRN| z50RgDaD=Jf;R}mST&l}`M9U4AIIpEwhI+!p`lVDX399kv0DVKA)R23Z0uAsX(Q)gq)FH&SMt)?vzbR8GcfO%p+rm2$ZdTG&d|u)EuGEPp&+oJd3l>EVQ&MR{ocj7nvEun0 zpLzhC17+7I@t?xk^4Ezua6sX#pfGkH!rzOWiSTJ!G#A8aFJ-)6ygL#RtpGZ-`_&d( zIC_Hct%ra{W!n#z3l!btPvI;S;X#Yg&;D9LS?QZBB?2VBE`a?2TyInPjL{3G_^e;1 zrWk$*F4-Yj)(m<%FNlEe1 z^>~mKaCi^IcIw8{P-5};!KT(*Y*SLv6f$@~vD(Y(42~b^d13pDf*;2n$u7iKA8L%P_W%DR{}>^twG56{JMF53$BnFXuZio zi-c*OL^jF?qXc-ayPbr8p~;Ea&K2$!y*rvR+!YVWg>r%AZpu!3ojC6!fQHoCf3q05 z?eD$EI+;u8_d_6Hfh&bqhrcSaHVq!mK2^;k{EcLs6Ama`-v-;#KmRgLR zzM9tw+_BnWj6Eewb|drvdCuG8*Ik^%@r~?6Yo<~Lb$4iF>kBGxF?KC+2s54_ZFRhluOH2`Y7Jj&UaHh%%IdQ0;4J;MTyW zn`U3%zpHVAhJ%6}HC z%SxrnRNSNQshEpS1Dr`}Ee^laYt}@8Bef@!&b7Ipu1%ZC9sgtvoFPRZ@f`&r!6GLj zdMiCb_$fdx&S#>F~ z4|qz#7ag=zgGISPYhmGU)YVUCe;_7;*AJ;D$i;cgMI-@ib+>$RHO#(-acDe*V>QH6 z=geeiwZ(T_y|U+23K02-1MN%D6pc04sON#m&*J*SkJXt-a2Pb7oJevsEq>yq#Oyn# zy*%_%r-7Dm5zHydywM-M%%ns>M(o5nx`@?I?{sIByW*j9{_|J@>EQ%dOKH&*~g(8u=a@{H;H+AC(0KiBcUupY~CDOnEap zZ(nqtkh7kg9KN{Odi(;wH5Ebn`uZc?f&?R<$r_)Xteyo9D8VE|aY7960pLF?#&PtW zN^lllFYKwY-nV}KXFA-x&8~%b|v(WT@<1d;iTEf2zL){OO`P7}Jf`?pQ;79$#6&7%3 z5g1_!cFVAzllsy&bEkMVA`ggJk9|BbxsX#;(JL54{nsF4^20(4sXcS$ERein;BQDo zyrT6bWNKC-T2@-bR#57dk73#rImkHkD*YIT??V3{t?Cmp%=; zC33M&HbXj;r8&`dD$Gq|wg`DGOBC(N8C-ZjORfw$Y-!@;=|+F z-s&UDGicrUmEyIN*ksVs*)jJr{vB@NVwW+*#^Hm}90%6_iBoz6z-qAr4U&{aiK+pW zCjxl{YoZn=Nmtfq!2x~b(CkXG;qCgq)N|s_buIi%UlwXieuVmta`%ayXdcP=m@vio zvs%T2a4x~q5FPgCC)C&d9AMrz`**a}-|W}}a^BByg#rVx$Qu;)H`3&eYBleFa{=Js z8WxE5$#P4EEEHqR)s!b;RHQH~vmlcY3Kw+VGghkj(kMhLDhU@5juF?YaKob-=1W^b z>o+Wxsoisca|`WhO}} z!D^AK$iO%^By){5GeS7C1(Q?Ht>}tn=;cM?WmL!%^ej5gVLSoa>`BofiuH?hqXbRD z>jY`S?w5N_muv5+j#fWT3!q%ijFw84m34J?L6xj5^|+jy7M=w^K3ON+-#u*Luo*6| z2o-Tf)*9TQ7l(gz4jj`-9|>WbY|d7BYa)AL zW>YDXohX@Qvwn!jKzf?j+E3Qol|O8CHSZzxS5o}QX*hQ!1#_ila-4P*=U(D6Ww$JB zug0Ru>AX648M_L|w)>P0kygm^eh(~&ST{^xwrMEoDvwL!dg!c90Zgu|2*Vg7azQdM4{EXm? zvE5dC=hzJld;>@vPHqi1f`50oUB&!v*vC`?-ef&mN%h89$sIhmX;QYAi&iG-xUIN*0cy9Gf#;vO@_r}Z;gz_~4mm+UKyR9(bC;_m zC0h-`!vjmj#+UGU_-%}hqs%)6KAtX~X8WUoYtL}FP6PnR$#q3zv5ar4%Uy}E;-~Fq zdjLSVv02|mbG#sBfA)vr_-b>Zv#C~*Cf@aNn5EU^d|Hd|W~-+m!BO>fzH~d!uwTOG z;m{BLYHf-9HhuQ=YN&pKInvMBEiR7}CJGA{*qlsJTo4u5Tv zS{KpJR#=UD1Fn4eaEa^)iPHlMLX=;*S&lks$L#~XcHu6#xRoQSoKF`B0yMtjn3$Tfo-NL9wm;yoTzfE;Et0Q&d!d%gY>E~j zEX|d$IH|5r0zf`V&{Iz)u^}OYRdJ;c7Xqyn6^{0wm-16ns9V`9tf{N40IhF408z-GBXyjna^VQeIRXhYf&YZV5_$~rh9C3mh4tLFV8(- zi4jgPbQ#e~09&odK4)M|cxR)_wd__KzuGRl0AuCN*2hb2cWIA=T=#~(tq(t|B;~qX zp6Y_XK;C;Tt<71@H+QuV9#G({)j0OUXX zW$1Yqt*tA39d4uGf5SzQS+_IiwwD#1ou4hg4LWbOijp~?g%`oJo#U7kyK$f`j6SS< z*sJT%%h8}3H1RE$PEvS@l-L>)5(jrr7|s?j=q%KgSeB`TpNyidyRy|C4k>JBBD4C;$Itie5S#$n*z44I6r7FwhL*mU|YX)5u*E zgxroFkSmdBc1#WwHIQvjtZfY}G!{?|H^#PQ#E`N9jCLwbXU2wC>iY5YoOx5-mWM}_ zrFpU3S~dlN60Mmj*_mkyIh_tQ#(m7JQL=Pvt7`xq((3xELBV_*E3$kEhOXlzi@6@S^^BC)yA7#f-_eSS;J@~o#LohyKE%JZhc4hg~e10WPh4ZHD|uGJBnM;nih8g0co!>V!gSlAJcGc0eW7*{kXsU%8|S;vQJUnOx$)V zI{*+VwLkimoO}R(F3B~yJS;#O6f6&nSL(}E*;$46+Y)H9sHjr5G^)}|ULK=z88PZa z;2L}bij`#^OH6ZYkQ1=`IdA9j1PPy)f{i(70|rHasJ z?Y&e|2{Degs;d8v+wWtq*XL#MB5`mFP@WLJKEuss8`Pt!sHjNS&*m-yc)jh`oM>PH zk6R1yE?cMC#&irRA{Tj$xL2~+hxHm&CkkGtg3NXTEx8bzEGK9u(=pTtdLYEijC?2 zpC^eTkR#v_%|xIigX!2FZ*HB<1KXWR`cS++61DY~mrU+vR}*f>g$`6A>RT) z-e?;8tmhPDZmWmC33lZ z4`yaXAZci6v7<$dR6Ii3RrMS{HdYBX*Xo@aiaathNY|_Ac+SB1HEO6t;$GnMAFg)= z08*2^S&y-S`sh{c-}y5Tl6Py5=e|XtfM_#i9;pub%^CU7&e@(Py%bJQ^!>f5OgBKm z_kLYC4cKylTPxPhY6`@5YF%%(1ritfQ$U-aheFzDa>6~z&-pfQ*nh;gznxJ~9jSyP ziZT<*#yHPo=Jojme&jL+=?Wr>NChOglY*LCGwaoN&Auf^c;1C>th0B<&~-m9q6 z#Hp^bLZk-}RaaGA7yRx63Fd%VK$CPixxWYa?}|&dASNa!y9#fw0XGv)jfP_h#-^r% zLwW5hoE=GM0NGyKlZg>Y&@3aVcbl9u`==RTMF9905Ha{mHV`+MXLD2a&E`J6G)T;T zZG9~*HF?Ja@#J&ZG^$3I;wv@)+A~P_RfUsgQBUlqruz%KOc)74zpbs!tBiMUPUWxs zS%drR+gD$G_`<=#LE2PC{U0xsnqRw3dK-#io4@HJ(ysA=Ky`clCYaK9l8K6fzIk#@ zo8Cc$`~0-4Ae&&F1aX;S2^MB-tT(3H_zozXxfKC=L6BBn#z)pMaK5!!ppd~ z=Z%+vM7$hE2MW0J@p98pS3}mCbuf>mmi}wJ9qBg zaJz-xSa81qvTta;^ZWMwX@_BN&y&p$?nV zw8rweeH+%A?x2FQwy_#$d(m5UO024Y{Uzd7_q(B(#h>4zW@T-sJ|AJdOJrY*G;)D8 z?RxR|VU&Oy#nO?wiFq;H9-WuXbBAq!j=A?}0hKjN6)Z8o{b?EgpaRF=TwagSx)EPD zfxzpMS{mA$r|ulgUGPc6Pv*+&d>J?Z5Yf~QA&c`sTkFciJ)0hnLm0o;BbyV1vCGvZ zDxE2TGSQz5+R%_BT(q20v&AgTF`O*b3B+Z4d!@2`t}+v#vwMBY%C;MLb$aTPol~|V z231`aKLKiCw{w4c+k11i(gtfi_}0aNTbSpzoHRNb2R}l=Ng0N9duw)1qZmdE#IDD) zsS0GMY(Fx&$rnWeH<9mlHH%A&f!sIX&49~8j4aOlLf;%%=6|qC;7g7sWdb}Wk5LeFM9H1ajH`N zhfPI-g+T$4o+>#O9Jy+h6yWK~In2n9?N6xgO@n9;E{p)T`o4H0l5$UG5D;2^NSR-UyJ$nPDc1`p%J7Rad$-qSx3v90G+cQ6|#i54~Io z4+@I!H-(}k*(6rQ{_0sO`i49Su@EHl*r=%0=U4#}e>7eDln8P70;f%!TM%%j`CNKD z%uPOrC=pnOpd^COFw$9ORKp5cfwgzVU~{H=I+~(nnYw0hli!=1RXhfA_!qm(x7BD< z;Rv7CF7?(!G&62=i0rLw^A%&)y~RCUaDYTozwM#7IfpZD&B}Jrf&r{(4tyD`uc*2X z=yH*Isk(#rTwGi`f&N5<14_O5kUt>dpNOR?7b2iin^M^K26n)TnAn+3twH=FnKGhk zZIaCB0i%4Q0P8iB5I3NKHiIE zFzz~}4-;vc3`z?W2{cGwE;+E43E0_-?GCAl0{!3UJ8tKFlB)m4-a9y1_I`VsX|vL< zO4~LoZD&^6wr!)*s!fYlwms+jyM1p@+?a^z?wFpKn7IGIKIgpqyc=sh>-m6v zVer*AG|lnbe;-AL?uu@8?#b&%NnN&37IX@vtD*(^Fu_PEcrW3ema7eq(_C~mjEN_- z8@c`HAG?mSr`L@HS%HxdezyyWsjT~AyPC!%OjWpKzkj?pDylj1%c9G?O24#vmPf-B zsFIJbm6^^~nuMHEIL_CqB=Cjsg)33hPzf{)kd|%h(f<$2h@AfaD6ZUZGNP~LcBG#2vP(PZr(CZYA?T#P=XA{d0fFa;qbN@xVxW*hioij{4+v;4N@bx( zB@`jb?55?n@m*|GRoq>7aqv49NEOuo3*zHcuC!|lRujXZ8m|&%p$X|!Zb6?m{j22*@B8?nb+m&Y`w|o_zBueW{{{2fIJ1FW?#is5`3GmA28~_?A_f)p3Va z6Nn;J9%Iy@6d+{DKO>we7-oT!K7l)s%fZ6)qy@`)d*WFxdX)rVK2VqnqW9Bn}olUFWp`oxJjC z&wA5TR3k+4p7K@s#d*H_*Pp;@{cbBp+Tp{<{?p9a5ng-(ZL(8-ff3B`W$cE-#cA@) zRaYDV1j6HhS)#0v2uKvTL-!tpzY`Ew+D9f>M&5BUlS9UR1>KQsQ;* zAq;o8>H^II1#39AC!tV+_PiCpx_FO4%?PnJblWaiM!zIcnqS6ev@fN)!d|(#zJ9+? zj3}gRj1b24&1NMrk0*MSk+&w1Yi4@D-9|5s&}@j*l3VZUghLZ~Ol8o4_y<>Vx&zsI zPotGeb6-9mNrc7zs}@a4ir)0E{5TEKb=U>?tHlpE?4Zw zhX`Id*jw-#?vbAM{F8cK$yS~$JL_gbMaFo&#Q>3dY93O;^S#C3GQd8{-{dCkn{Zgm z48|O{q7=lb&Dy0w*0{aR`=!PsSq8fcTrwV;L;gHn5-XA}L4z=SvqYLP*Ry(F#W_;F zk%2_Jk>A;p9|{uQI$Ou@EgF*bD`RD+V3BCkpptXEklFPLIZqIb3zBI1}JwJQz-< z<7R?(7l}!y6SU^y03J-WSL!^O-hAGjNI^M;BXokwgDPL|4_6NnENawLOuKD>KZSrB ziKlZknO^@Q4~rh#QJsEi=opt=dZo%SkBr>RH8EzGMdT;R0(h3o-kZ(`g^n)=&*YH z;KB#)33d4gA@}{S#hC5;EHGJZvxTWv&ul&=x^IZ``W$jg1WIhqAZSHF&;)Z`GDu6s zwmQ%H7mn3aC;j&7Tu?S5B4S_F`j#&bmOYL-`Be8kE@5DzJ+1HFAls7<)TbgIHVTUW z3RW8QZCvE(6>_NRUg0cWpYVG%NV)q+6FoR}1EbF-$brt^*LRj|Lt5`%rO-ij9xMNeBVj9gAWytTc#}u&PY&;7W$9 zeNtIN7LwWK;P!^>$=pOgs3(b?2eeig!XkO0#IoOr8Ol?L{dEpQ3`rPhxg*2h#QX4X z6*M(o^UVZ-%kr=9a*uF~)AGdfU4R3L5l$k!xlyr438Df!Q-pZXOqIzH&(bKk+dVlp zh_Z<{l`N>x#ynlbnZ;>8szU)riK5SOoZ?BEPS30*`ZTce0E62$n(f!(^zHF5yojT5 z+Sti|`@#Qw$TUl?*|zQ^h@UNfO`-vfJ0v^`>~y4*`e}+oE5w=l$KI{VsqmPpM+H-F zQ!C#He?) z0^1rB7g}2;JI*5kJxJ&HD4)4%I8j3EO$nh=IyUUQK0k95TQAY9&*5&I_HIB+QUxj4 zNi(kN-K}!t|eVh(2S+!DbkmS-^6~GL(GG6HQ5S-wdio;a?K8eq+&3j5olzSBQf8 zMXLe-|osLDIsBQf{$~yOQu33`-zV{$#(gQ$NAO0Nz)y`W(m=Ge|rrI4yC^N zPxe|v13cltuMq7R4%r>L=Ircjw?>QBeF9n4M1{U&6W zNEiIL#VqpYQd&2P1xz$HI-SGHyYC!Q^);!Ohs&)mYRFdTt2QdP)kQes&71UeRCMD| zXokH6y0_sLRvyMe0lq&1KHUwx6=x=#j%tAII-#YhAr{6StePwaN?Hh(Zhxkbg#F>6 zu>w>3p1fz#GG{7BhQ^h83%=J6fY+Iw@nIHcGO3aYZyqHV zdj|u|_fCV(;iUQK`9{3rUzxYI9@l{R^c7+kQfXfeB856Yo!iu81lnM!$)&_z%vBgt zf7QD~8IELL!SV6yQnil9SqxTQxH@muN-e>a(3kH>bB^pE$>PYUNOn6d9;-pt%2<51 z%Mpt9?U+L`F)?NS^cIRojt&dwk3)jUx%Krd-3>x@HMain-&d}u^N3d_LuiU-Q}2#@ zuM0JC*c%OQejUi@_gH$9y>A_QekPQfp}`|?k3 zz-;rXMf+OPlUu2^UC?>Cy}c!5HP(2a>Em&=Rz?RJV&c?Af3>*_?Wl0=sBPFhXBvIp z-2_uNTSxR7Om*VpVum)Gcy~J+81BMKtFSTy??%>7*9CHNlP!a92dO!}TWHc??yBlJ zUGn1d$W8j`6Q9^;*Cd~Kp87@OhTu`KO9jfP!W8N{|Ba1Cy;1-;% zEP7B7lB`xgq$w4UiX8pyk~bRv){XJwnVp>@Npnd;>-1&Dk2JP4#rhhMahvqe&%@P>6?V?eyMIOs4hP3uh|C@g(^#ZcH?}iVlZJFUg46 zN)g0T_?S$*-#3+1-7OlyqumN+CH!Vc|CjKL6evU}er{%MQf?Uz(OKR+k;W9<^J@jW;& z`S5gce7eSdd2Gq~4^4Yy7!d{VKrU0TR+Gkv&aD4q!9&eayJl4!AAE?o)uc=O*8)N66?66zzDcRl@U zee*tnwwq#*v z+mzLOj(Xmskbz2YziBODu`4_}I@+kh%Ds4gCed!TR-<9J+1x!%mbR2jp4;T_T3PwB zyXt+vT;p2KcN_AJ|C9JZ!CvK%Xlk>@SMPfnsKMzA5V%rBwo^*TynGi-+AZPSs}G8Eoi3N?S5X;9QCn0qo78C=nc^<( z^Jq~Iv)A{ZdYH#kNf{fV0f7TmriA6E$27_ZB+~z)qNQculQ2)*-$B=B`oRQSI+Fyc ze2VE=V`}p!-o3h|g_LueC|CAo_e61HZ0^F|J0I{PUua|X(bW|?Rw8w&xI;t(yW^)$ z8aMD9^?uj)wuFEJ<{j;cbW$3~eL8Cugicsn+kBHJ@8Ej(xK@14;P?7b?3T;H!(;Va zF{LXn`FWDsxlnGfzvwyKz<@;f3ikZrqPJ6t zqe(%{L6N$f&gQc^-WtW!^>TXM>{!ooG-;?>A)Pw;_68lV`Mq^1w0on<%MQJ9JPBNn zh#&5hrR#;L5!k%X^N3RW4rU3lt11TKv^VJYOE-3G?>1p~w}jiRTk}`rHIFOQA3i57 z85wX#Mgw%q$Q&OgmSXxwTP*bb5>h>pkgF8~24s9z zgfI__kqJG&mk60&b^RFqcYb{C#;xU+jDo)rU_U_Nclf`pqI>E!TGNeIC&|Oy<1rR` zr9Qg%b>8@1%{DCoum9*+SX?}FvfEb(Q-x>&R8DvZ_4 z%Q;?#RBvdq6yNQ@z`;>f!u?!(tdgoBgP8WVw;vuQN~HqSbbXQsmR%k$`t|7dd%xTc z5UJO0F4_><&bO2$Ce8(b`<<`fR1n+A@XojC7)fyR5b>fsWtIaUzbeaT^q$kT|CC|ZZ=v(-L4%hB`O0us?Bz5U}8p@bcEIiJC~BjcfD#hzbe{o z*Irr5t#sNRK&l<>?Rot^*GDn7Qj^xvnGMjGC+X>NPApD)q6v1iR~qEM0D*zIx$(*o z6n{TEVD)krZB{Q{ZM>9bxxAyM$o>c|>t^#WJ~!3ZM^+NJ(4SP+B_%d41G5qoz{uGZcI*A8W;jcMklox<*C!*_gKj+@H;%`(6w5`j@i`I zp>tgJe*V;=#$l5CGZMerXf1zUPa$TIC zFZ}%EW6i;%P;V|=#r6feiEFanq4TB2p=y2}QzC7)7CSW!mo~){#ZFzRoUV6S5V-7F zh9^yvw9U~Pz`EL=Y;hW4cmlAtcm+X^z?rGH)zwqejMq6hH`V{8pO|W_HnrN@hbpje zIP=zaZgzU0ADK{iqnvEn-6p6!^dC&CWKt#}`6W9wJUVHhzPW6Tz*$_>5FmzSRszgX zQ^%q}a0U`g>$CjIKKV6BMB`~19ra54!J4@uHwA<0d-*J?hbjKxIRq5Ov> z1VnKmDb2XLu2+S{T#A#aUj(zph9@E}n{8+{GXHD;)RG^drI`up^msdX26PZ#z;Yww zpyeK0z;-|QY17kheJv98N1j7cc1lLFM}d5Iz?I+gNs%;`@2|;G3!#7?Wo4DlaNC@h zA0uQO()QW^B&Tspv-5R&GqcP^RHI?cRZIzH!6?rug_Bq>oK~p&3b>BLgado~6y$_8 ziX@E1wjX1ulShZl=w9#7sLfJv`#XDY*Dkn1dT}JX>IR8mbivVms*O8#f6EbuUSpFED1*QqUR|5C9DyMMZnl(sf z6xIZ|yRam(A;1Tst4=o0?b&8J7q#_l?kl~&A0i1Zm>p=Ph>Y2|Ia@@g=-RtH+-w%e z{DX<9M#I36Ixiy9$CM@8SS+UM-j8RriTzUD*(u^KYJ*bK^_cSWFt$RFSMVEG$EYws z8p{ueO-1hR?xwSJXR#b*BH}Fu5@BEjG4(f9sMBiK*V?R!Gh$6A9h4rYnNDa`0_$`m z`H;v>zROK*l9EJ3L>*eb8>`88N8|m4Kau6xzY29bUmx&Twd$X>zt^UMveLAlF*@Quock;wS#r@xC8B` zYj0-BmI=l{=4V+*hpj9m6q)F>8&_KlF7n0h6cb8t$N?YKNb-3hn;{O=)GdqDZ^~i{ z1AtEHZ8=rfNR>~6keWHY5L4kwl%X$1kJ;a92S}R}A!$OopSx0(?BpLtxE+bGrRE+n z4envI1D?hiz+9ch!$14K1N*Y|XO*m`RVr0xs_RF&+PA9IoHWK{xkW`i9DHqOg{In& z*VLYb+2k%@LO8_jY}k;{Cq~Q}ZAl}b(_^wAong3%t zX(E2Q7LQ|=DF~%txy)iIC~(;Xh%lwk&0d0J4MhKBjKNCMZ|8rw4&SLX=Ww>S!)O2S zbYsP2nYwv+kXF+%62yj?1;)`ZcutLpS&%fRftR^n5N$lH)r^cRfjBkP+djX(WHLtq z!*QR^M~5YXLaZfTGm=DAP2Xy?^;y{1AnhZ`ADTT&bu`Z7EzlzYZ0DImV^;y^j zj*v}k{JIbLp4+}xExg+5#N!L9!1?8}mQsJ~SWL5eg`QT7;fXaU8OfQtV+bN967$Dz zg!*u>&d>W0`=?xlshR77H|Jsv?JqE^Xo|VY#3^Yb%V^`O#^E-g+xQJcOC~EO!cn!1 z%%ong?%)weK?En(BTt}`e29)oPE1-xCB>|uHd#;MtNHIFm)rNkxiifOFOa>COxMtb z`#$Y+K5*buLoBnlg&4M(p~6GtjYLJri~*0O_&mfvDkM8-Y8gs$P;~+>*Yd{7N}-M6 z`Fk1WqTj&zIA9tfkM}uxBZ!ngm;+c4X_u*o$Lu~``F?sG>_%W6dWat;U--~(~u*PlOG_!jn>MmyDkOUKj|8T09NKo2S`!qmzd zS5^{5^9mQ|Horem1I(aP_q$(#0=&+8Bv7$nNdC=|-nIX7gNHwxGuD%Y*wV}_vpqoM zrpQ6`9b*j3NNer(3X3{*hErs3Jwh8%sivg=qYiqHA7*55k^S=+RjJO+UeF}UJeraI z%XbEtJH_;fi=l&sqU=zDg6p!oWH$}bAJEcCNw3@L?JLra^N1y=J!bmd+ABZ zSy}qKAY!wFYtoI6@M5;v!$%C4d;jn-F*>PYIsn@Y)9?W64BVW?#)V5YOA?A<4uVSF zd?N%+8Jx-VO@(FKOgQT4gc+F>7x2Xz4!}+?I`0Gvc+AG{AA8d9B7n_)2!1$hlJnU^ z>@JhzR_VmM+>i5$v{ndK};b3;tBIFHwBJeE^ z=&s0ck~%m|na!EHcuQjPXr?V0ei5qWs`l3W#`MP)v6yFuMEWRPt~D}_OJG~VYzc(|Ogfmfc)ljbY+Y_DwWXz5uTP`-F( zkC#`>4lToE6fwePrDjF|OXCi;;z7Z-6pew?hLH)PhOzy}inOKitpz$YK^Cvx!z+G# zG{rZ`!6(O6S=jd&K-?ICi%p(Fre}s#kKHyf0qvY_lGj#2)80I`%;QFB>(A!ELi^Cl z$#bxO2-;_W0S!)GfC9y~*io?^v(O8C>YgrENKKnzda(E36&0>%0$2qdZ@!@Z>a1uo zbh8~A>YX{+a3K0?_2k}Ui3Vc$-QOTwI+dZEOm+rWob>Pt3&b#)_YU@ncpJW5e-k0P znc9_-l=`L7c8w4W`swS&Jxs0z$MCtL@4H&N96=*c(xs>}4^gJPQebMn{8c>ZX|N1} zkgKl`GX(xaKz|4g_GUu+@9An2a&e2$$5>eoK&)?2mWf8fCgyncw;~spW^Jgx9B|Jv z0kufsFqlxLX!$<*eahy@1pI=x=1jlkl$&M+X~dLd<7H*U!4s_s`MrDQ`2(Y=GI6iE zuc8P(50A0*e8Cx$q#TN^4b9)isnnPNV50t*_>G+7(_LJav|W=W-&V*owek&5XSSJP zSuJMQ*Osn^dq4iP-D`B%UvB3y*sgTwh9^sIB84bx^Tar09V*x06@#MG7Y3-07m4`X zgz}zOD>}P64qlBU$y40qILVrYsAl{Ub1he|i6w$Sf5}AxYbVV2?br^Z{xeNZtr3e9 zTZ$&~EgrBsnsEsWLJiQT@A?Z&K?dqJ;d?oMpha4;2C3$e)OVXr$)RW*n?VygAafor z9NgeZ0RSZE_=kIEIoX!aj=)``N9hgfARCy#2ExR6yyB#EgF)|a`&4+byIJ@Xtz@<+ zg%!h_Tn`Q|Odv>Sff=>|}YgelJ%t?>^Z(dsQ%+Zp8Z@fzd5AN;0+Mp$L3 zB)%zYLte&ev$zX<9(Ut?48FVsCnx`T*qKUNs0SNW9uCUKKq}kzD?xO3ks?rd;eK_1E(RBCx`5 zX`+K@R7p7iDR85-Z8QbR_ZjG^(8PIH9;6;WXmJx$5x>Mprzs{|>MLXOy{~`n2)0iM zp2KmsOE{O~Ju)N|qOfQ$zgC7aJw3U>YinogiKy>rHW~fFy=bs~np^=dTQP8y2!8>g z%zgQnTZaRr}>w#5Z2?z@nFqi6HK zUcS&)N!*!pTfi&5^$Qf^+aq41%NvnF9_oQf5e%Ul zxV}IF8+xvF`HFrv&R=zNJp)U8R3a0)9wC!_jL94S4od`RreKK5X}g}>YpvgQoqR}5 zC|M6TdqfyI$j##VkDJmp9S+<#5Qx=Om*|1>IXLh53QI#@f8h8pb9&zM@cD6&Dj1{q zLiFq@#LdRZJnN0rqs!mzP7y@w&8FxFVl!aisw3+DlFMov3gX;=Ljp%Sa*k3Tfa9p* z`MTaFqM8;|hrPL@A^SaScNr4aGHT|hOaZZjA|MMgG|k;Ya5WJTsw za^L&n1pIvZOPQ{G!q*Jj9*$X@m!&tJd8K1g>LY`I(b77aWPp(wRAq8>a(XUCRU~9c z2zRh&ew5}o+YuEA^n8#6jwo>OpxU7y5p}#p70O4Kdjikc;aQxe5_y(lt_tscg4n)8 zxky>TWhwUe%XwDiUT zsKn$0Akl#Y<)W0%5cWY1+>k}TYctzjqrg!{)h9<~ zy(NB)2Gjfi9FO;o2}6kKH$hck&y({Tq$q&PzX@O30TAJ@ZVhkw}I^nt-Mbo zJ&_XH9_4od_lSj}0MIQa%kVm8cUnh^wJ-1gED#St{jfP|)LMNxjHd=fU zokL_IsXveND0o~?)?1;oWWGFcp)_KG#2--an3-;3R7#81v!!^s_A<-ThFcu^a80@!4Cf+)29Cf3|Fm6d%H%0$-tET?!ku zpLDV4$;+5n(?6aX)ei6kOf_Vnj4400jE`)}x2q+Fja2L6rqLR+F6!(|HRdz3 zY%Mxi9D-@gu~J7_9%G+89)Y)6s7Zu%Xg8$rrQf9mC0Nz0M!^UNZ^m=;T4r1>vra5Y z&1jJ|BKinn23w^23=$UAG9v#Roc?A1dk)HW{lQ47~aglz&p&YfYKU z41ZZDL`TiBq`+Ps-Sno5Wq)xZG!+^ex}$b!*Zl{+C7LGjNY4`yxmS`Cv)f@W(})oCiazzWjJ|1|F93HUYe{ zLF}b(Wfr%WBb4vJ693GEF?OlM7~AbjZI6<}vjPay^zdbX@`@s|MMtGh&UJ9_sO4s@ zS9;KVQbM!43G01+BIvL3+ipV451v4pkn)C;G6-~Ap7r~E{X8MO+CW%lOzSg1W#};o zF(AUv7>&oN8Ic^8Elx*DEkR7ZbSc6R@j+mgs*+*;ZZUEk^|pJ-6}GU3A`h7X4d~lZ zq-wZN!_4s*>a1^RW$-}CYSi?m!H&ZTMS=gN_iuR2wfs0pC+4EJF}CwMky+X|GhL0V z4;p6w)TC{Z6bIcGj;YaCn%RoAjx~g35H2eCcAg}gf!>(k*=c^YO88de%8(UH4z?5sF7h@)0;kScz&O!2jHan_vi_ z#lF|ut1w|tg&7@3i;bUIiz*Yy9S-|(nI=*@*GdX=$F?)XYWa}-cV-F5U>SofaO%Pt z#mAJZbyyFWBVB3GIJpBf*bwkvDOC5Kxrg+;U2(&_Nrya_4X2sy(|pPdOCA9jl$5Q+ zlwQVd2nVXy#CuYQLA#1eJEhD+%^^k#aA8A*9RGRMxxml4s>5@dD`y8K$_}i%Y-9rW zer!5=3`=~qbd18S7lLWo0C+S=q8xGSt$%B8R#h??ZL25{TO=e}XiD9VeNyVS zFp*a?{HJ5TeFt~<<*9M0!~7~6a8=}ru4yosX;s~vC`>ac zJJ4;h7}T#nUECJ>3s6nR$1+PP6(`n^IW~}~9@F|%L>~ry%KwjVFNo9QMRKnKMAXDt zP_VIsIXX8BdetSD->al5seh`{sNL^E(sWH)8qEqU_I^5mZho6k<;uY|9h@eaTj#ez z5FQ7`+NaYCXzVAp%TObm+@IG~NmEDnx& zNmk)tcURBq2E6GR+*PxekA~d5-i<=15V|Th`+Pks>8E04xs2a>HzE07Wm!INUZTxi`TU;)+{l!%H80U=5 zXUZG9U%r~+HHoxQ7Fmw*9X(PLL1KnDwR%}kZNm`$P5N%uKd*(e-Oay3iVkbfu^#h8 z3dn0Hh(ttt^b)CBUFXlQYSa)<3D3PMUB(}o~=Y@Hg! z2)D;bZ8ov)9WSmGkrjok=nK=f^hpyk+0Y@=P);+DP7?tm)~MS&F5i;_0mR3zFYZuK z&%4QYkRc)Zhggio3JLfx?jG|9NSx?7!`n>}V&)AdbDsBaAy122!{b~I)FZ)vIZ4Ml z_ey>c(++Pfojs2@X|9AmLGIX_YcMdAv5~M{giwUb2&+vIY4ZR5p`Q04gcTBxKsE6(joEB_(eAOWl*w|c1Nl6_} zyqI2`9^fkb**2M7fmW?GHhcDDWdCWuInodp7f%!3JRE-?70!&~ecW%kNz8U{EK=Bv zmW^@Cd(|7de?U&-vdU|R=DG3vI7mV~Q`<;pU|_fs5(yn3;_EOPVi&8EU3+vF>o1DJ zLYGTMvt8H-?dCcZAd)Y2981B*e_S8SGca)19(S-;W;K z)AM~fdE%=h^;dU!IC*mxty*$B|WSCn2f+n5lFZ<1E z_xHAwzpHBs$?N2fDv<_fHfQZB(oGrfb}zCBD554{bzlDC|B_$mQd&%dkiscdF$})3!>koLmy-RciqzVdw)9X* z5KqQB;nzG2`7+{6_#0A^hE7U3^bt7mR$+*|PTg){W0dN{KDoF;@aUL;)E3I|qtC*@ zir@nvZgywXAUv8G0ip_z&NVw%PRGY13A6Rr z)8F-o;^0#w&o3?jeSxuLS#-42)dYm+7YCr&6iKAwa&=$KOq{KUQ$7^N z>fG-&UPt0K*5!yekB(1-K5EsB5hPY(izkbnQ*CTCi

c1C5#r(9Th%7_du-cx*hi zengD;$M9HF9OldWBXS!lblKe=d#hzz<7W$If~vhO7y`61a$UH1G&_@Lt zYfbH35sMXDFzTwsN;ZSVgY8uCeyD!$!6Sm-82F!@4`c4%-#gkLz#0jN{EW|1CM*Yv zC$xc$9Lb3?$JMnV4xYEK3%;~1A0BA!`^#nIdZ+rY{$e)U*-D#s@x>Y)k56x|?5ABCk$wIybhK+EUWeOO;xmJB9KhmZ7>G_M1t|KI6^5qYV8y5p*Q!MC>bL)#^;X zsl>3%kIZXz`8^B2=@NNuJ z6C*CpHw>+<|I6)kIVtH`1004l~K*q`>7K6p)*bve3F+JN^S=QdASY+cPIdVXR0~oq1yE_uh z5hj4lFQqqU#?XI{bZ=^AhUoXOaz-^G@KN8a#TLD;h3xS-&?}+`((QL8hl|xn?cC@* z5;&>jWmpMX@(8Wn^oQq-CX0>aO!VMzUx~M&SU!`>jcJfWkKj{H&h>Czv(nP#WY)v) z3xpY-^lA0Fx!vU|CNL%4ar>-KT*zmT<11(pm^8#{Hv=as7$ewG4x?|o{v0USQkLUa#ASiT)k%6xD<%~h#H`Oy-C2BOoXP(GgOiTrrWhN!cw_21- zl04bGC!i}X|6J-NSg;#Zq|MDDj$<9~>WN;*D+c>T&cWe#L!z|j&sE^I{3F5nxPrx^ zAccRk>J;vDs_rz?^>HYDnuhTj5vy}upi$vUI;s8pw<1~5PPffg`Ms7f$OJTWSmnDz zI`RAInH_Q3sjck?G{VpER0h3w2goyA8$Yr|!2F-KA7Y_VACp>H7&3-k42gMOLESo&C+(`&^DdwNcQ};^oiElY2$d~YcZ-S>=r}l%T^;~3 z3;o69G9DbUiH+AZiJ7TZW@a_)w^w;D+W7muKXs=Jze{{VHwOA;UIFC$eiFrC}e_5Q&A7V#}ikl zu{xW5mpQZi%PwbIn~K>y*(~P9qkfgJj?nb78%=|>*=vbp9zBA~!p00(xR0(p$9Fx5 zF(LquwK%cXpBY%8;$YZX7=Q);(?7^Y^Sf%Wl6Z{uj^j~bz|J!WQw?IgFGsj<>4jCT@ ztlT$oQ7Yz|$x%-VG}1z$7PUVu$xP^{+^O}vLoArtn|?(_)Vi2<3y&?f`dGH&H8Dh_ zbTXRIQ#Cnq7^(Z#{Wr7-d-VSbEdu{vK#Oq7un2@kphy9kN#eyM?D7iRldS-gN3_c{hc(lb1re{P|pp#X{f+#Rz zxYGtREk=uXRYXAQDZj(&Q1;;S)?Phrv_GD&DypgdWJE&Cl#&A4sNmy>cvf4D@G>St zEOgobrrEgO39j>dPiD=e5Kiz2+gYF6Db74NobbBN+kboP@t~}yFZKYwN)XHi2z*(8 zdrqrzygaA+c71!#okL2-`0)Dh;#6X0X43i9>!;X647#UQCD(~Eh<(}CBmh>RABj;N zS5w0Hy~SgXJ6eQqxqKt8qPgp3QNu{Nzf3zWfL-RUzS^|mA~i=LPP7v)Ylz!- zt%)XuJ{!5z`ElHW(ZNzEAOBAl5VZNlCMFIJfgUf!Lf70%z@AE{3zB&>$pjpm{1@T( z1dlcO3JoFrnf_x6+(`E2UPPH)M7Ym(U1A79INGqJSO*!-FxA7K-%L)r9o!z11-F+~ zS0V7?b-s@zv>|_Ey0_C|`TlHU2FTwJEiExZr_ci*pBQc1IXki&r7e!S*l3_3Awk5f|8Zia^i4JWqT4oLVtyXIhbm)!>om`` zuHDt&>0#6af!4H;Y5jZS$=*dpM-1Vf^EHg5y4g}bK={`c=!YMV-(&jRISq+%ATn*j zZ`~aVt@Gg_j?dvAX~L*TiXL8X&o8e<}N?$%)bo{HaFt9=a4< z(2!e))sybM#e)LgK(1+24_3MIbt#o$D3Pl;?iPU?#_Z&uwHtVUz)Q{A-=ySJ7M&U2 zk{;Hof6c}Bw<2JHQ{q~lze}rG*y7VDfj;KuLl*XHWq1s7djDyvye4k`d5g_zqUxZg zk*G~S1#cBivT`&WU9z|hoa5^ni4v9GT){2$P*D=S7W;Ln2&ecsF#laVPlEmXRBL6) zEPRKy_E8oO%IwKQWj~+4!=@}xpZV(!-D7sZN{OF%dQ~HFGz(Ly=YV_R0$@9Sb`_N^ zU=ZY2ZBZ#+9#E0wvcFt5TVD_5LZUp!GLrOjws(`BbNcGKPI(%P5)`f<79rs|?a;=mez4ECNXsLTJM*2Tm86RyYhn+3tM@E%jb?g0wQ^Q@lI6KriO-z4d5KqEGO}2+o{!h>6-$P|sdryOg z{k@Ai9X&|Cw1VuK>FMK&f{1N3V66C{rRnu27w{D2xX94lG983XmV1qF2ja)z9bXJJje%#YXE6)I8d)#`*f0RgUrb0}_B%bLa z41l7SX?4v&^r=(@52oSwnRP(w>g#zGf1e26Ly4S=Yzdk(U=Z~|sk zJQn>>BN=REA{cm1f}1TIYeRWL$uN4Sfc!djr-kao-%83jD5blaKX4aJP`xEY8droH ze;E((+vbDHo5!TaqTsD{co*pHz+cc0EYd7NSy)4b3W)o@`~_crnk%z$%+*(Owo=2$IvT<3ir{_Db^B-M!k8k>EieA` z4YVq5E+$W|I9^9c1BkWcwxLD*K=3_lomZc;a#uoxES<5m?obEPu9ALTCe%|*l3k5L z&RK>JKa%tJv}M)x>i0G`UkLRp%j9L?<;KC@+0$)3>|&Kqw`vu_9~+q0wmW+eWhtrL zIEWhY@&@UzK{n+L=!ALxNt?z2zE>4V02d*}U$yo(tf%+Gk9RW<%{CPK^OP}sp;{UG zVx_?h9fM8iROPW02luhNtU(u>9R!>b8yj#V_>Uw>RM`72rK-*KB8bXX;mh%~#D1pM zL3tcbNt>k2)mR1SZrnG*8wR88F!l)~Ck@9!Gn>5_&#NhAbZU<0x(R8Z1MTgl3VQ z`9(P+{F0aXvrr3=U|Nf945t$Xy^bHq?N;bO?(xQp`Cv}6<$1>0Le0VvW2H>DliL?X zVLyl)=G+tJ?Iw_@+*vrYRG*8RGhYrtQV`CH#;T11q!cEo^?AT*zR+VRRtIJfHeErb z0H+d;;P(fgmup~;umI0>xK|HT4Sn2}!Z%F9ylqAzy{~(fzEtTJv1j2O_;9OlNtK}C z0YX#RiIFw-pw8_SHds&OZ2wN>vApD$q69p%Y47iz8+PpVs9Yg=<21Mf4Eht|k84K` zoB}Th&d-+YAV?|JuQIO9RTH^yZ7o?Oi!2&2hvEoY_v$E|-G~^gK>d#U&eVs&wb`aS z5`CCFpzT^k#i(|r>E43IDe3eK;$v41^kwVy0@V5?C!>8N>UE0_s?$7zq|*fZL?#W9jjw^FsuLP zJ@1?|XFklg`L?fIduQ)eYgMgURln!H4Y@6Tf0f@NQf*5B}b&tF=lYw1+)<@^NVyR%9quCJN{p#b#dj$0o07 ztfQ>XwzhorDHRP<&?J-@x@l(p^*gL?pc<`fYFD4cbF3# zClq^AElBzRnpjS=$BNBPmX?-wd8kUW8W%0M1niL5@9pKB{A;Y|mDncMLbYUG!JyvR z$g!qXQ;I4<_T}Z}I322dTwI1sK8xd6V7ZgWf81+Nfo;AnG9_gBD3A$Vngqbkj{uTX z%pt8V5L+ew>>m|A7!r|yQ>AYR-Xn$@xaNa$-KCIi4*5Asbd`~q7`S6sAg4oapoSY( zM0i0+68U1nogEYutncefQHLt~o2qeOPxKL;)JO@Tk7l(%Iz&_wgbSxsSpg5Wv%Pbl zWOPWG{}!B!em4!Md0PS;3v~|BAieVo3xUP|A8AITmn7C{A>!e38X6Ex7`YyM<<}0J zPyb7pLF#Pv3c%rS(hEI?W_(s)EpgLZ25YKLvQW{f4%c1b2n{cKazQxv=n#bAEdkDG-W_G46@+;)V$afT-#sbjyxcn4K+E$R@qlD zaIW1#D*;x>-?Sf~5?lPc?eFYNx-x^=j>ZB_a6(&+^%0S5goY{&p_4#k zoY_0vQ#&SG{d#hN!e#~B+glqDske~d?KsbIy4`8(b#@fonmnGz%zBWdDJuA*9>rk6 zi#~;+oPkISU%q5aW>)jh*1X#@5E%z-C1FjEVa$oo5j=m;nfx=6nD0?(P%VdmYXav zA=3~p44j&sp)g?wD_>3W8&2EMRtj(x593XkU7jgIl%#I=rnfM>GU$a@4PaG1`YPTSu;_d zMd<_Pd{^9{yE?Fw&@W=pk7Cc8KNf<+dIFFU3gP2=KD-2_V=$13>Y$A_JMBTt1Ns3wSg z7FLZ(4huWVBGzj>I*ntb*KEZT_p$|WixBa``rXAltyhpFl*ELczF$oDi{*~;V6qje zG3l4U7_1XpnVA;P2gcH7jCZli5*5q9ml3CfxXrxC) z)sqODkmdNFZ9)6X}rg4R*j15*FtpXMn(Wo?$K2%TWI)g7XaON*pcU~WeLk6MT z5$zA2#$lfL))om!MXv_93*u7T&bQA8hABA0s2V?Wmn&=*B>MzILKv*qGU(5=5tMKh z@?@RGRp;UuzH7NZn#vQcL{45YE<2?Ix7b0!uPUw2n}P=TEd6HiysJ8{5q0yJfy4F!>C?_iqtmk1lN9|MqM_L6UEPyXM#LE(u z6fI$SmX_Wog|Dzf$W?2s3G0ZC3a57Y|A$`m90byj<8H|a$shk>>m2Y}&5_nmv z4OUXuW(2TH^tk*;Eaz71!6G=|cXloTu-(>sL%#iGKE`^Zug#ST2v~TZTrAb&TyjRu z46vS#I#jh9UGGV^ga?RvFz2*53Xgu!zDJ>hY{gYjNZKhvXdc%R zFuKNFdA!9!Cuc;{{c(-XD_78!T%vm$3kw{(!w*1U6EM;C#q*f0fb#rt1?5KE|=V+C0NFv z|L+;1qhk{K|06R)LvCln|UPV#ZOWhjQO3@Fy#C@v6R>YLDy4d9UCQ>Co zFkXzn8)J^VxSPfRc5vKLbwb!K?3zXr>?vrj|l|Dhd6RJJ$7)(+i5S$0xN>#;?EfR znZRU!Y|b&W{|93!8T66cPtU7z)d>p(wN_7&erbdPtJdcx3VY!= zsA`jP!AkW9wNyVyDP5CJ?$Qc|{y1E^xzC!Qr(rc&jrgE%y~hdhicxI;zHj64J>vhk zj)YT9K(1oT(D*t~1;G9Np}@d{uS-^Xcdmp+$@K<<$1$}%q6;y}Ux=|NN;w#>(khIq z#v$cOiX$3b>r&M&scFsflyy?e9idtaG7>IWrP{Ojb`iN{73ynC+L5Tp!fnD3`#FEDPlB=+3sKD=OvQVP9*nKh#&>(6iJ+=>VIWX_aOT5gM8n zuH;AuU{jM!78(t9j_v$_n*OYP8n-uy#S>xf=J)9f=uhQ(uy5SGxCoMDRsXHFFQ@D= zQC(VkOlYgcqx4sjH-?CfNYY8wc0#}$+P%VRJ8oQB{h|l-WdxLjc(EJf zEw}><1ZJCCkS#Gj)sGiyXh93nSPhC~@HT|{FnBuRew;Yy? z9jR(^eITQbyxXA}>(SH7Fg`xg7N}CRXjL5ROfw_c^6G3VYGT2cjevCb7$YyKJ`{n3 zd<}(o-4DHykl>oh=~YtDfY22pp6LV8?{ezNuS1!90~^5ra4*En@tOUg;d|(7)137% zwka*C{@X()M(#d3qFHloetCTO7CX`s4et&BpPyi>B_-GNwVh!1Om})PP`YUzB+ybQ@BbEgKG2u{w%smns6~|C zTI!AHpC=~yJuM|IG#u*X)kCLE#l+qon+VH=;kS*UqT`=y1AAuVKJEev9w#T4GE5=@ z|GgMo1nMT(hc+=-i>)mkYsnCuHkT=tgOWv3`$%_c>Ts{QW{^c`nTe z`?QQvhmtOB9DV{^nal>u>_F_?Kj*u<>=&Wxd~O%(y)()vG)zqYDz7a!i#!KzJnn!i zwic22-K3PMh}&@Lo~_dsH%l(?>tv)wJOc-w`j}8e88rr zNRL(n5F6YKJ_QZ9XR(=b0qVdQz(r!z=J&rFX;$w2u~In`P!Z%v@28QG?Zd&THjvZp zE%@8ws?KVw#oFB&ty;YowWdP0c>Q1KO&RNh?Bf|WIgmon=kjzC|Mca>)BPOMf=}?{ z*D_<)Qj}a)Yn#_$Ql|1@Q)|4v+vDekH%sqdH>8%6t$JdUW0TKFIqS_L%?-EsD*eve zx0fPb*TTP#{$~E0SEj|LEK2|sX`|KN_lu{I<&QDrv6xYK?4%Ok8%wpc6kIk(D~hSr zsw5_T{m%=Vv`Xo)`{T#Xy{*NTl(e)O&E~g3sl2d7gl>=DU9|OoGiE9sLn02~a3xK- z+wYzVl_v5Q`wcLdZKPnLEXof_qUXxOP#co2QxSSFHizL%zCi73P1cTM|14LdZiVVS zfMl$^zDY}8&(L?Zu^}X|!BXC3y!-V~VWvNjlB)WViay=%YRK|5fZF#3CA9q5ey2lK zpi4^1uHz0|F{*YiW&%l&6j&$$(nMdswpp3lx*ly7XT4Pg^Ja&8yGB4lJ?nh$7BOwl z?g9hhW(iH&-8W*TqT@duNF5k3Du6eFvsJ>*24kS2paSK{Y%us2JXor#Mn{{$#7>8R zeg$u$)#Dea@b>H=jQg&_EzVx1y|F!g*@t?1yPo0>10TFnmMr%V=agxH!Xn547VPZQ za8sa{!b0uOTdg=~#@WIdNsYcu@WKB~<13ffjk3Tuo0XHp@wQ}MTT1bHKe27K#NuQv zaIl6AjqD2ws3!R=b!IDO=jJKldENg+)ENig_f5QHm%i>R zi=P-0;kvzz&XnSYcwj<6r~@&qEnGLVRtuJ?`ZzVjD_tSOjp%o)%E?+`&HbX&xH(FjCy=t_TuR^?9VxoxvVx9$Hq?k z0)^ZzpH&mNsEDk#YFH_9a*&B4{>rKTUikL<{8}*kv3^c2(A5=3B>22=gy;fi@%d|C zE~|y6SJzK~hmuji^=}KK0(;BaUcVaAWp0QdaDGObJI-6Gg?@G{7i%N$(m_Ly-W|_W z>)iNCjmeRsbCT{~>?I}UmLN^8qV}W;{Jm#ppn-vd<4N@}I-kk9hP2u$*{a!Tp{C3k zY<?=tfcK*Wi{_dp{E-x;vtf1#1@P2wp9uhrVY)}o&UOKA>aTAyl;k7jY`98U zZn1cr<$7C;f*;pud0d9r@K2p+S(z+{Tio*V1GTbtdNnyY-Rr-4!$<1F^F$bIlIdGw zBnZ0-!{nJNU@Bf`2a8|yzux)F2E(gbv|}%WpLeNtIXpE4_471NnjEHWr1|3Tv+B#r zbLOvdJsV}JHfm_5Vjit>cW7y9ryrSX0mvywr{Ke;HrF1;j*WJ&^aHapLQHcV$7>`t zXJKR6<&5$~)S41=6Vu~5dV3o>D1wFgwZ6jWMrAv_p2}!+DBeFdwsvVOo8&1FLSG8a ziTw!zqnqCFSdsfha-qV}5%*i(cIYZP*6;nAp62BJ z!obBvJUBWnZ*w85S@%0ZMNQ6=3$yDhq1(TNs!Fz11RiK0!0?8MjHeu|+Xg9x}rS8NNvVj@d*WcUgxqbHdcAhWU!;GQY_kddikwo1F3qg4V zVJCyaIxb+lbSQar!oFTBqJiCVoj?c(JE~*GCG2wI_Z{s?+<^d$(cp~#f}{}o;j>$a zU%uY^Q?asw7K0T`g~etX8N0uAJPbx&wRN^X{h2W<4GmoypO~P0n4NV%Fh{SpRKz5@ z8Oh-K+GA~hg+io=KU7)UU7XmyPltk>AdXbqkZ?Ueyi={&SlHI)aWu(%Jo#ca7}mTi zDKTt-0MOAfC(;;fHXczYA=yoN=y*#s8?h>ZmAD3rez9s|w`x13`O#76+BE%Ex5GCc zHrDdF!Q?5Sa`jrjcc|Djh7T+lh7!B(LNc{(taStggb@f3IPkWji0`zX*9FUMFh2y& z&zS{3k)gQ61_ww|+U#+_q&USRDKr?xk z$#t?CQ^gPo5G~EVz3E`|@(C<4au-pNaKPjvu434sx}A5pRa*k7+J7<=VZ@h93MTa69O-p=pUfdi*sg|YD(h<}Hy>=`mbWr0Ax38l-*+-z zN0g~fOQ}+pib{|MnE$xk+$b-feK(e$tF!3o>0w7m>&v?etD34zK6| zxrnx`6%U0FJ`?a1A`577g)FzV?cfcw5C6P-X8jqlhW}J>GV<+C>wS<4aJgN7V9X{~ zC%N6Dus**&6A6_d7>tC%JDdCGrf2I6#^W?Lm&_s$)fa>EA6nn*vuKwIhK~PrS~|2b~VaY??aJ4 z0UP43zsd7{pT@$r_d?S2b;Pe|?8XF<2+fO_N%(?-3s&UW<6nk{4j|KHKT*Z+5J^|{ zkT*HJFyPl?fgSA9seI6_$+aqFFfgzg>s;181c=kKvncFtY%G!{MTL<-mD1@aoA*B} zz|9i$=;%lf0S2L=2(YJXK;;ln5W92q60fxx{iYhp?(!W?1D_M|*c>q@k9qv!j&Q2I{j z4j0-%6v%{0eT=Fs9!88LNhL(EaxkC9nB@Q|y!*Bii%(Zskx_NgmJD!^t#r?*VfXaH z!a*SrUA;aiJI}60ZXysuO&62iRmt>iN>Zk@Zs${SN)(7#{iw*a&v9~|7ypw5P@N+M{U5iRDiWcQMuE=f_b)z!sY z%HnWGD0lplo2;pi^zet-p@uMy#3iWZ?@Ok%3X?MG2>XZGO20F|*|{e1w!f@VU+uH` z?WO4XLK$?2I>^$9L(XCuiav*3Yus+@>Rx$+w1Q?IN7TM`B+6wC(7a|f=-=R`fPD6K zd%IhwhAc(Tg7VqYFHN~#e&4n}#Ss}wlFxbY^?r0Yao~D}M#k-7_WXVn>LLT!-L^a3 zv3Y{)JDgsyq<@5CLE*ZfVp%yW2P} zhRPF#kYar_ik2d27BtIFA1(nw(7x-+mTnp5-P4hcxX6`!t^u_WCrQ?3Hh~#U8&h?q zFku+TBE#uDJP3?(keJ`chbDoc0aCYj{I*7Y1PaxWv*k&VIL`2{HE6N~(4T-P$${N= z!*6OJw&V{Ka(!K8CRYC7!LI)*4l*7P5U|-rkcdhB2esiJ6zT7axw$!q?YwA&7!L_; zPp(OvbWUEO)P&`jC&hl${cMovp$1F;nLtuh@?DB~7%!4!OBA!M3#=qMtj_^pcT2s@ zAatK2x0L|8OKHMCyIcP_Ej73OIGlGW-Q~U2nDe6Si!FgjeMEYuXUU?bPV`|(BmqZH zDH+prZ9a2_vtPiM;j~{N=x*)ERM}s#LQ~ILWHlWTTKmy$Dun1l|Bm<^P$_=-_N|IT zFeaUz37~MPreV#CTg|nLq56*YCsqw{=&=&Y%rDFq<*0NkX)3C!T^yYLZ1#ctRobK= zx%fq++!(J((S-shfj7*YPlaVE0tb^9;33h#U_pbJ1=>x+ZU#$^sZD8a6LCA=r9^+p zy<%gg{e>*ITEvSAF4nR70)HWbrQE9FBOI^E8MRU|yzKTv`xxpFvW^OCP${c4+}lrt zl!d^}ah{AcfTgVcfP=@LiRllOSa*X6CpNXTtPOg0TwCI-UGOWS;_1S^9e=mA#9oWd z!06J{`x2}@fCV4!H$)Rgz+pjjJiC`-EG_PsMyZE{g!4<<1UwWPu1pJcxcrG5M){db2-_0Yx*c_UGDj{du1)F)=e-ym@pg63oQJ~$fliZw zGw|}C%#yIQQY`~;>;7Qt))VQ`cH3&mUo!x?-n zgy!n}6=Zx%Dsm_uEz+f*aWn{Jj?h zN4kJp=AYQ@044gr#cmxm`UGr5`p07BRTF6~U+d*8oPOYFwb<-qqqLc?OkWE8Wy%op zUX7sUs?sMP9v`}j=_^lel;^R#!^M{UPh{zTh~4y5O1E5th%SlRa%H{k$5m?^Q*niF+Y2ZCus@C8|Ir^>j(~70@(=q<2|91M;g77Sd(b$$bj0A&1yt zMVCQ_`tl_gQg-QOLAFNB?GBeyM2|}?=AE>h1jFq`L+GycSIEC3f4>8VE_`&@oyeGg zCXlvqjFis;%SFG~JDYE^geT!SbzEte?CdBYKTqqBBCFPF-RiZUQJoPeZ_f(&<-Gqa zhnmyxQIGbSg7&w}nJzVxb9(ggN6Ia-YR^n)1`f3Y5vN)OS&ja}*-+oPhL z`~^8Gj1xTPXZRJ38g4fX&#vOyZm8x~cpE6cSRSq&2OJUxMCGgKA-o1v8OZp#+2D~w zQ7!->NQ{uK|>?HdoBy^6Bv4DrH`+sZRt z4%`nQay78dg`#`$2;K-~=YQNwg5w_0e-V!#k2$P{Y7x-t^lxne)>jw*R=o_>7ocP9 zO8LC06-a8sB36dCx1?3C8;at7fI|WpUE<^Thxb?H5n+Ls$&>LYxPyL@@zDN2OY!RY zIHKhv8`7Q4g$49#t-@uvv#4oMF^rtlj8&#YB676F(faS3aNJ zsAm5#G?^f>^mz=KL9H)IwLicjyDV69oxHEMs*1s&JlaPZ8xxK)NS`%b_fJ&CU9!)t zqjV0nye{pZL=_!Z!4$%{8g2qjFw(U>v>Z;Lc+Eqh?Wza*Y{k5tYkpsz=xiFL+_gN9 zB5r@X!nO0y*-X!g*Sr0ytBE6n@)|C0g#8=7gs#H8NmW4i{ z=eQwOyYO0qqi)|O^B=(##x~oj^5yK6&UViN`FR%W8-D-VTVYC1C%taDN;V|T3IEG^ zCCwk;XlG`vUOwi9i?gd-+Cohx)+0F87b%0|hYb$y{iyTxZe%Y1;0T*Y$P){bwp5Mh zh#nGQe!iS(3Dza!N6tcr1cR3IE!=c*V_mjOa+EbswKg)`eKbNXyk9_;Sv}$nyeFSK zv9PobumY2{VdPl-wGCB>iW&ppE|Chw=jp~!HQNn)=Cq|KS15BE=#^s=X{zXuoct;s zp}@1NZ|fzC_;Pe;KHKCr^&}Q9#A*J4wiqbi^WufIr$LcaM@}@RO}}h2#4woh}aJjfLhlhib?WYHOJTx?fmav7@`m(vkW~}c^2n~aC zG5A!f6%+=76$#tB4;A1IDA=CesV^a%*AoZDB>4l8F$!VB1m9hlL}Lz+{S1&(VQYIp zvIF57PU;fS#ll|~TlF?>@heX_=OYIL<7a6FzEYGe@EjDNrd1i6jc#llce_(3=c`bI z0W;lGv)MkOy+pqga=X@gxy;{KWp|pb(Himtaesm$X#Xyh%7b-*AupBhBX&ISXoj%d z7&k&Aml&*T(MUKUe<0Xuj;ec%k^Neq@V`hwScp=Z$4D-V}r;OE2c6^hnUB^>f9xj=hL@ z{1~N(YKXP_)}}?HIWGUz6H!JJ9xoR@hsKPx5ag^r1&Vc-Ub!f{IY{|TiBb#&) zb&G+jKq|$|=5tuOQn0S;LnY83b;GnYt7?DZ;r6)gip1sr>?%X(pS?yUIs$Sy=EJn^!cEE1W(t?YVX7H=5CHN4XyGzIhHuvLLd7WF=d* zhz#ed4joh2PfgUOd5R_As!>Z>op+JrO;o?1DooX=iH1Z;OCg`h(L>%DxeMPWV-ppckhP+~lj;|93@{Bc3$+ZfIv z$U%V@m({9VcFVCzAiO}WT!@m1)Phn>$3v@DIh|`nPJ*l-QA?ML_nc?lrvl0-+aqdF zdz&PAb5=}Ou#T&7lA=~-J+loSkzSKU&cGY(+=8U4&)9WSypW zOULy4#zMrR3+m9=3EBR&4^7pg2a@FyFJUbfa{mMIxN=U?7{YEDRrvW&IO2xG8W`4C zyT?s|hyaTAmn#OdK=bLpSo|=VaRehJU{(!=l!!)(kdP&Hj&e;~_YDEo$jH9zWMpVE z?Y*y7oV#CgWr_UHc-~;-$9oQ3&(*f?$*<$j3>+L-8kiFR^V;p%mHSuhSY=XliQ!*_ zn5?RU%1ivJ#TBTv9puSm+D@GaPd5?xd336aVz777w!oqlv^T-%4Z#=GST+NK*mOla za)X#YA!~?ha;pf#Y<}15+q0r+((Fw@tn;Ca#Na-#`tgA(ye^1k4`!w80VX7_qyezA z_lNxbOA(^EE@4QxgFsOLn<}$w(0UQ1*DjUukmdNfBlAkFLp;LD)EDQ-=cq}+02i@0t)~KlRL{<*Lkvi;PjZCG;*uWu7NBN#$ zZroChUGoc_v^7(=iqy0!8l?kd={UT0v4mYz5h8gCmazwPvV#_nz65I)xc}!-d?g0; zj#96;tFyqQU*g@7=vaLa1RM=|f8`XnQ#nDITm0C5JF zk#ljf4oE+!g4v>@!JCT00E)IIg`#;C+HHlLP@aBT9qc7cPBz+ETxNHTu?}U8SfT%= zN&dA>AEE%*8zU0KZn0UG;xul&onwkPimZAA3&AcrnL{S6?4oAhl!_C?a3JRKF{{92 z_7`pSu|V>Z(c%p10WSGkvruTzNHBT9TDa&{jXV$i435|DP57@4xYPLmv*rKm6r91- z=?|IL)BONlPYIrGkeO`l}1p6&QY< z{4=s&f4fFsnB8)LiFjS|^3q(Xtvm{kmz&n8+hB>tapdBT#f&_xbQO!0awjg^^+5k zh$#1&_UL@oy2}#IzWw3mroBRbgQvFQ%!~C6S@+DxeFc!6?#cG(`L_SQ=e{M$pwcsq z$^!)2oD-5Bn zu~OP)%(s52VDZhs;~R<|j=q)`?Vsl#dr3;apkDumKtS)N-VIYyl3)Sh>6ByyAc(XA z55Jw0UD0Ry!?S$atvYk|0sgAGHzV19cb4@B%}=S}$Th69(I{r+{@KoP_J0BakT82=Mcd&`y`Qkax%{Zfa?y>*(awx=f zhq+;ZmIDKQ;eNB7jk))l0^%mBG}W5xx4_8`)7#nmDcd(yP0Q0)Vm05FVaZir%gKx;Z;JF)=gev7I*pK6#CKPq}+P@GzIQ z#>Oqi$NP=;bH6BOXXjw3n2jpjyw$R^OYf^Z7RPblr>5jv?YZ(sCd|+C2vCuJww~;( z!zsJBJU@P00Hw5IGO@B^e{!8T=AF!GzfA*ib+L+D8^P^*8OUwp9rEd5+1bWrrqLyU2?N&`BtQDsMjpc8^jgpMqPV>q~ zyg>0jXf8MeBGT!Z*Z6pk3FRDauY+pdj61EC?4_jH(AC-@zos3V!{T7y4V8vcKNXKM z0-O1<9%tJe7fhi>R9^G@`aWC!ePRKQ!^5GzUYq+TCoDb(3%;*NIxUN2 zaW*Kv)>ney>a{u@PQaBc^oq6@V5f*!XxQNyy&TEs4l-Eaw|8)3Hl@A2)BUsu>AX^_ z&GFvI1Js1H>#^9Ky5G&@3E^Xx?oNZgUphNG>h^f;w_CSIa$2r~eOFBjTaS{@ah1XQ zAbSODaDf!LJ{P~UqctTYLRYMS>=KXX%nbgrHKca4rT60`E#qOw%KIDm?d^v-;8uIB z)I6E1+~4^%G4mH)x3k*xJTB)_uhDAlW`ESKo8zdzKmJ1Yxx1kdtzzB%#N%-M(7jZ? zrmV?>NweN#Z>TD)o6ja31)27PmWIm7Ya-gHQM@2=YN~h;w ziuNjWC7RoFuZ^-LD`R?RPnh*fSPi!gTdMSRRFIwYX53X72K*ZkGDRZ&j@o8L*$k%0 z8atb>rC5Z)^OdW0ILL}bJ=ut&MvM^_HdBGRabP23)pf1yPQo0?BZMQYCkWjeWI};< zjN9+<_Hg|{I}O{!b94S%2Hk|2lU%PIA1pC;V z;Fvhz^b$G@;y@zJBQiQ@Wb^ZNR6ZLh8*4QBR+0Q{2zb>fA8-_YQX-}e**0Ao*ykl> zs;Q|FVWC0HQdK>BtUNxHC#Pi7(WqE1w-rP;I`0u3-mE9NvdHADL?+7vt8q{+CpOMc=8Z7}$4I_0(Jg7kJeHG83O1ox#)DH;OhkY+p?DYF-Q* zJHx3@JllD;w|jc+%E`koe#C5)TqHiAQ*~9zf}O+pIO6|C~n0!5QF)ogMaTYVz@T5h@W!1 zU*r8wg-lJ0f#i?o+7IQOOa~Iv9U#>asIYf(Ocb2AAoL^lHWfQ>{*~eE$@M%^Mk_dM zuFYOTl8dgk>~o_ePok0$GykQo?i#o`VNK2mev)OE>y}RMk`C_Poi0%K>W^#jZF;Il zZ)ml5c2ZM))SKSb2JLh?Nrua}1}+R5s~Zj2XTs#gEeMgI1U??;`j2g_xZBUy5ULIFKniwpJQE;gJ1cHFmMhIE}ZUv z6`W`r`)@rf4-jtvZnc#w5pDol#AhFe_9gw*GIC+l({@E%cb&W`Guk?5rrU#+k1aSQ z135<`{qkb5&~swF`J959+V=Srn!xDP5xd8dKCLS2uar{TI3RK5=IgXbee*s`!7mM~ zz?n2GV8Ci2`!y)T5k{G*Xh>{z5M10ai^Qxc;>aoyCli?H&mC*yXqx>aIzdg*iS|<2 zRd8g2YueIi_btj=6c(FOu0kXBV|`6E?SQXisiCp8mS!CArZ~COf`|Tqtps0xbgVg4 z*Gs5g(ogdpSz?xz5g~MLI1(p}cj2Pv<6_Pe@Z8rK4KX&u%F?*McL2n)6^EyBk@Du$ zqcVpGPv3Y%;^QjP^Yl}Gr2OvTTv^cdy*a#lO?KlZoE*+GsBt6_vsA@T@V!;VEdwRg3;$VaIQSToVqWF znD2S9syKfNSR9g*B_6c#haZWbQS3r+f1HXZrfJ<^PV@k9CH7UI%S+2`>9^W_v)L~x z{Z7bCV?g8f`5{naXZOwM?(t@=$95uHGfx_G@AC4u=J_bG8a6iO-Zfy6sFqqd+9i13 z^Uwb?F;mL?X2xU(M3zX%>bM-=WXhqR)OF43QR69+=UT|732TdXpynVB>f)j;Q%9+w`5;f=ge7(y`{@hm`J@4;l;A8yK zAYy0;8YwBhIO@W=X+Wm7qpfW@-YR0eai+U!zx|BqUuH=#z5(T~5K_NZ zryURk*^I=*n@_#k{8?Ac=d!|x<{1JedrW%VKwV*HBD{r^^UsV`z@)^a-(vEc>+bTz zLA`n%i|76Q{l@BLsWNRUhXY(Hc3Y6)vq&nr1gL-2XxpVHsaqY9la|rE*Q#Knpg@2H zIe>DIqWw23*{p19WvPA z_24wA37i4jXGb}3q7FgdTL`GPc%eP|XIE_x)63En<+Cn@!s?7Cm}(_Q?wzU^+i0vk z2L>pGiE%ZO+G-|_DBG2m_m1Yuo)yS6C(jcSK^a6xd0Ty~K0 zC>~||#9?r=sEe9o=QiY-JZ>v0W0VluTdMHLlYs6rzyPO~LLJG46EL%;z)b zv*VlT@%Im3<%+FBo3E*gO=2#beK|Yde)65OTY#HFj=CuqS5%elt}^9~xbrMMO0dgY zLkDtk3Hh=kk@7khs-0CloRnSP-bQ8Xxc&31832AY?pb74xCvN9t?Aj0z&6C99PVJ_ zSqiEsD98jDO^bV2q+4nc8D3PwwZ=~c&9&l^dc=qYH^*|<-=&_zTT>GF*U?c3gDOrU zhV@yMGIu3&Ow;nBCQsWc;?To2f2NZo_1~M*6j0d;54hcO_oz`7VN-1Y0*+Rzqk($+#1-_+`Wb4yMc2udH%6 zC;WbsG)9jjzBC=I^IdA6b+D&>#9cy=E+&;lgaYCSJ%T->@wDI>j=u*s*Yb`Jk9s~v z_#(7WgFVYJOVwD6k=!3Dt^ySkj6#q1;ZG4@YV=$2?i5;EukPQY^7MT?yV~gr+3f~| z@#niP2no18Zprr&Bh&+(>{l)~TI}??txgLeok3IMh=FT0)L{777k9&&0SN+$_sYPuopJZ2V-md&3MS zC`MR(0k3iH3vR$ioo(EZHoCxtuxAQvw3| z?lR30SinVqiS(YtRVXBkEk=qX$x`{9fVThNhqo8!0Kn>q4GtE}P%hE2`uJSEw)SH- z0eTuFIy++A=G7J4#muA#TwYPh|1Tf!u)!|k3C@F=y>zy*@(sXhPQk?mCNcr9g|9*HW1|*4-&+z-xJihGB*5TU;8-7&CjKy^X6w9l)oR}tB%^>f_Z%(0WF!!9Ltn9TEuzayJNEXf1qZq5 zbCcnknyh?nJQLEwY6Gw7;kAeS%*~^VvnW>(+YMKZCKtkbQu(m)z0kXnn4IT1>PAPB z7Tb-t#{<|!Jj^8)=9zUcBtscsM^`4DL0D@e$^JNc6hPcMUJWS)$H1S$`VSdzLo@O4 z@=#uFiIFkY)I``Q60*g}^t@A9uEO9C95G{P_(&xp5F7; z8HKCUUE}xdQS-MU+U{3`J}>y+843|_`HTZ0*NDIC54!&^_TDP0j;~*^#oY<+?(Q21 z?gS4S+})jE3GPmChmE@v+}+)Sy9L|8-T&{L+oSJy?(69uJx0IrR4-K3UbWWz&Dqhu z^$6hr%|DH4`0P%V$s3}2&u8Af$3+kM9_0IYxx|QAftL^Mv8Gv`dA5<;xje@a98QxB zID7qjeloM`aE(sN>1TMGGl6`P>b8g0<$1;G0%z)eaLba+iOzr#qyb_4NX>vUP{O3w z0^SRTqjhs5^8Ee=t#q*lH2wRC{%PLQs&A8nzU)%YzrX~KqOm}n7v1Q05Enl`%WnIEHJ-Sh2KNPb03(6EB&_P$hDe6jK@hwiJ zhWQ(%n|jqBRD8ju^5m?f`gw?)Ml}Rq=br<8h8mVM`#n&ItkWLViHO5pJKm1$BhNac z1Bx^iE<_sji`ZsiS4k`z{%!7>ST<&i;X?Xmua*mpuR~ipTJzNaGHWz z-^QW}&9LA2l)E}u*4xqqV1gw{khuVvPQ|PLA{g}4J`@6q$kiiT)kA; zMu26}Jv5w!o*h5sz~=CulLrMJ$0@vYM;xCK8l-2p;}rsw4v+WQVp~trO-g~Pe5tF^8i>IC)zuJF$FK~-xCY3mbl(%yIrv?TGT2A+CRDK zmAqTmrC^e+h&e?qBm%!!#fh>6yo^K+YXkWU3(|>3XeGT3m*G_|mE@`YlVywMrK;R! z=K9Tz;I)f*()hqky*W{LV2^NzhsV{bXD?_K{3+9B{6@&2N$YP3 zqm-THKIWV`-D)HcO>QQKT{BWF;dfI2xTwaycY5r3FkACgcY0XlIq_g5iEl9 zBTSNqE~JP0R%Ie}BU4wj`GZAmSRqCnjk7I4UJ(3h?z4HRHisYAP-sx{z8yp@GcsA2 z+JbbgL>LU&eAF1}iVN}Z78eBSrn)XI@@ZJ+pYQ2hpM^J{Q%)^#H&etLpYHDe+$9eQ z$E&dBONzu)oF&lqyzW8$_S=>0bLmu(?GcmvQZXQC?V5-NLB3a|>$=@? zI+IneIegtg-%6rXej&Q$HWEo$8GS(YdJwHDYFn=@(Xhv*sMh#|)jt>}cJ{IfP=lT3 zp@j6fGRC&?Uw7p6tFaDarQj5e~93bpPoDf&popp(%Lg{L_bLe572AIE8izXG)p zE?-)o_#&-?4=_izd{2Mjp_P*6jq(^PX~=>SjN>5PyWXbUX6pQ*o+X}z2+%rIqNqZc zT01h~T_P^8mXI45KeFFpg(Bi=JUXxd68)#f)m7#d9_cEfAEN(^vJ5|)e(!$&!J(r3 znXA3N0Lq&^+{M_*h)}hnu`sMjKyQTa@%~=2B9&fIMQT>SD7>Hn3wxbr&QuZv$WE=K z;)QF07vZ+s-lC37l5?l@>iJ<$%Z|jPtr;x)hsg1ZUcH|%Zb@=l+KJ!N#S(H&E)ep- z@%LNrUEy%F@5LA9sFO|4o$v(ZhePjF07G3=(){?i!nqoF{fycM6C5ssRy4LN0|}V} z@f#c4V@iAhs!Fy-EFi$BdDX`4$3Cbr0 z;`x%-Oo#Oq`l{~!iRb_&;N1X_sTfSGR!oJ}_s`;lQ7N<;Qkk~C%*g2%%+qpmBB3Ka zZa#{>y)ZvY`)tU4^9+@(Qh1|wCVtecTDR8<_!|=bQLYvH>owOY~xCwot+lD)EIsNeUDAnY`D5G&koQ_E>{ zZbxENc?bX9nF+C9&k8E=fak+Aop93x z*}hmWYR4+=2FwO_3An!)J`+p;i2)1)HZ>!D6-vrN`KNk_D*kVM12mfIX#Q3(m!j&W zijuZ-mp{2Im6S6;Xs0J9N835K8Jd!MVNW?l+23Dn8^cDA!yu_vr$(9lV4U_Psa z)8fC}&$l6PB#Jx*32V@HzCby_F^&}Uiz}g!oT_j8*pE9_7OczCp}~I^2M=N-PK$NnO5bj*F+%2o_k%SI^L1(ausL4SnHyyVBVZVvHUhw9}`S#GkL2p|eJBU6@~ zE9U|buaSf_N@MwsmyXOZ`v&4BNrlpbt!?wEY0Swu?>pSjf*1}D#?yAPwsBj`k7p9n z{lZ$ni$mP3b|n7&{bm%Rcm7M@NVsmZS)GyS8kvbj3eH$W%qPW!w9r4QK8=C=FSjfE z=L(R?$qCMoIN(oXWkT*J%$?f)Ff}lS1bfuhV5y)GIjo$Hf}*dXUF$F@KO!IT=j-j( z=A-A?YN3oF{xfJkj=k6BQm7zqWL$EOC_+Wf)R+EY2QT-F4COx9vWw|mLMuA=_WGp_ zevT9zPqUOqATh~jngd|U!<=5MoUm@JT-$+8z5dd?SiNu~@tuMs%k;*qFFThkRnz{; z0!GU3ro}ah(dJAG71sB_Lu+32N<@`}2E)r^vT=eZ3)vKEXKEr8u@o1Zr5_PV!;SbE z3-7-29b*rU>|Vvs?q~*<&aBdS7>dxz8j3$PGk~9pCqXEv8C^e8nB~ti?)L=}bl~Im z;-DCRi#kWk!8-BH+ zP)bKMElQRf$BKR$Mdh;+pJGX%!ty`_LL`E+e3K4^$yD8`O9~ChQffv%NdtWQ=%|_~ z%=4T`8qD%VX_~aL;)-gk#mXL43Pf%H0?2`;5X9s7!=Gr7!;O*yXRe?)73GwKA1TOsq6E z1mN8r*+#Wund#56xC4ZG`nLP?{FZ-@DBGn$bEGG325I_wSuG~Aj0O@%&cUmK z$I5U(^ojOWMB1k6JM6Py%x7tX;f$~2m?)`?AAA@W<^F#C;v()CQ_%`iYMkdob@;Zm z&K(&nUs2}~I%E;{SCZIC*a?4`v_iSV$^U|2@=AdwLffx~7v0DjMz^|2^8jM0mJq=n(Y%5HM%@MfLyC$~+xZr0Zm5qj`aED9bd`j;d z;+gfBABUvLMQQ0xE3QLa26e29W-+D6rhhgD6MA(s8!06}qKIK1H zloJecasi*-J}V2bx-Kh&g@!1Ezn*|o#fmf0#vCPL z$IBsqJ^|#M^#*FRxf_aCcy74JLc%6k-%KTX{qSB0KAU~SO#TBd{ZDvIE26Y$#1Jr_ z32qd^cR?+p4#>gxH%+q$ith#>VaDmt%PB-S)asR;CLb7mX31zq!Nt<8w!E@et5`P` z%^u)2p=2s079agJ$f=wK?k)PiT%JKXuvPf!28;c+$Lkx5LME9s|i z$ySxsjFjKAqBywf`^-#?Hx~J-(Wo87lND7K$14g#oLx2jsP%n>)@_URp0a?asD zRL&$2!NbLyG78>gc6F}Kt*ljhi|1GGA!y7fQ$mp+Emo8lO>rnEy4M)>u5R+Oa+cjgXMI-^`$B8;^C`WEqGX#7?)^Gw(7K_Yeia+hJ%pbr)n7SM)Hn1d^6 zEhYYeWK%qjFGTbodS^UWMw{*V%EH1nBk{&OS`Uu%JG;9PxhB73yZ)n+Mn;xfaoU)D zS6*I?*Z(n7Jmu+0BIrOl_2+CcjYuhuiqbA!U@@6F3%0ReUPUUKUTA7a&ze`Ag~LADBW`IfASYEiMQ#hm&*Qmq`P<78T8wC z@nGodvFE)+ER3i~0@X3OP|)|Tvk=%TC8c8giiLI!%MQ&i$1mVAn&HH#h|_Vp2CgKq z^1&B4(5C3hh zVzc9M$anQ7s*KChuhU^N@<=A`g3pM33qJBCjBL8^wKF%s0>+^7^Iwsg?e(V2q$F2w z?`QDISCwwvK;o2b!6OlSQGa&!g+pEG_LTmkdRAs85x3EX#pKg~^jFVq-;bXW>X#j* z*~#1gpccR2?{g3;7Yg;Y0Zd$$Hzx^e`;uNCWGSjb-4$gEY@ZQ11vP+dW~wZoH~Z7x>~BhTW!$VZn7j0$MX479N-TomF76ZD1|0wlcZl+1djIIXn#s#r~ zOz9OydFKE0P%sbeV8kbtnE6KQB@3}t>7o(i83hR>RfZZS9NZEII7gMc(`x82Y_mLctn#SN<2y(=yi;8_w-z*h9W3)&v%yld!IH0^0vP_uvU+2ISP5Q z@Xdk)?mNJ-IhB7NRgue$%_ZK2HUoFv@xW=JMzuVkfEOnSA=I3Gk`F!>Ji(G{o zfoixmaAkF!L{88>V%r@f?Cx(l>S4Um2QmR319O_8HVOoMK{B?R5c3dkdBFL=uf#-7 zrqCil1er7>uDV(rB#-W#k=%y#8QR~!3_xph^8;fFF$nv<$T&}X!(4#eC@@$&#Uh5N zonMgdQkArZMF+lN!8@D(WWiZ?7U&9xwy(}d%`75-5zZgHco9SY_u1%GWcKdo^Rl$NI~R+9(E`m^B$Xj6$SZ zDQPLfGlkQ|^>fdL4T8rL1Z0Clyi^j02N`6%9ll<{V86ot#l`FE-&Q`_7%|10H+0JZ z-q3}Vy}g3_yCaNUU$;N==%^$S^PL5tIk3=3w%mxR$N`@fzr*v2TdTU*%AHbFwnyA2 zx(HCb)UDHrWUNJ~%nshf>r|ee^6Kw;b_RRIKaSJh)ipIwcQ1dXWD7i0A;PQu?fTfo zL!gQEzvOrlcuQKPH}t+?sG2VDH*CrAigcJ^Cw#0rK9)Yfc?ej)Z?I}AhTyP*D&3~4b~X21KOYOtp^_LP za;xfwi;Ih{ECs23wRvmYC68H9IX09cG@c!>7@P0u6FlTV)m>El=(BHy;v4S~(?DrjX;oMZ; z5aqB!f3Y$f*drRf6@q+XRqHg@_5Zp6IIm`FG2`H2;RFOah=pC~UzS!3`QDSShdums zULJfgrv4lrOl21SoGA9!-2;yYt@D7t^bx8K_jHe3*$gJ8Cdg?HB`jx)1qH!(YrV$> zV02WD$o~a0OxtH8#BnW>=Iqcv@l!P?YzXYs6ss=HM-ISc-%AlSO&DZaeA{biU`bO` z*cS>u6BUt%uH$T<8xlwkmbDARPsR!u!B`%7#Q*UQO*+*x;GL=F;!e&^L+?(Mz%QaZ zVrmaG{lEsF7NpQT$2v5fpIDtTGY*|K$i-o?q6)SV?58=DxJ zY~y#Dk*Mi@-U6!A{Wk3Dv(Bg3B_LpSL)zireE=S$jXCGS%?Np%)1TbmJWP*{7Q9r& zn7pF$=G(Dke1vxHr(VS+mo<8P)XmQG^QEzPpV&Wj1bmQc@$pgD zdA~l{Z8w`wRVo)FIeR`{S3c~cS42f2IX{67j!Q+>u1>N3HzG5C502*X{JHS>;K&6q zFjq49--{Q1yjHL_Xos)pHrxCd2hRsK1XETyWl!e0_VT$xE@d|UO2ogWv+})xc6*ujaKzHT}@41)1l!8i|@@I7mPDR zJduOMd*wI^cx+kQb^Dtmu#H7+s)}}JOZI7OdiB?t-kxr)6`J-@S?}-fUQM9Wuj7YP z89_zTj%29;b47CVU`GY>w`&{>ZM%Ki;$mhWmPG z9$n-~MA1Q7atZ!NGD5ouGW_A*OgvVynnX}g?~}uj$VT|f7; zHx%^yFxd?bsGX&g^IvKd1NvFb3E!WZK>jSpB~Y^zvNJy}beXw1Q~a`K8sT8G?YjTw z+ShGAE<6hFG4=#f&nn*nRxre%9=@YfajOg~77|L-(igyo#wYhP?Vbj?Kd5qU)$m?D zzHt(XAjXcm%#4Ghx&Na+Q7$7T(tm3B^zd8sfSV@Mmq>x^E5_zlTv`bn*0Hs^iquNY z{z=x4<0$~@ny5l=-KGYRk%^JNdA#&SU#aOkX3RXH=+5M%GFgm7_*7O|O1q6PfU&c) zlaek?{}Iv?10T8_3GH4YyU#`ZM=DpN1GxjVHQf{hEN?`Fi3)y;hbQ0v)e!w(4G~yF zv<~@yx`s%I4~>E)kXW<+L}9|P;Eu9j5RB-1Q<8XbaW{|E-yxElNr;Yr zv|JAV$%4k-=?0vo1_}1r;Vc?wg~%;(9dcFi0zz*b@xP*5q4dBmqYcDhC_+`QHC(Ak znVUBZ%@XJc6v+>tobD0hVx>1;VH82g2SPbRL(~1X2nmtD#g)3PJpO6t?0hmh=VruN zE4C!H{8GPkX{rdiM^t-zrad*Rql4%R>lydAq&t94UBwygaVnfn zxD``+j;phWa2aijKu5a?iRiiq2`-Dij9qwAem&TK%3(_9e?MwR9B#kP+b!%3)g&#& zGcn%K94N6eM?m=kmUzZ5HUC+E-s2$jwAv7?TOi*T_vs_MNq-Ddh*eS=^?i&FkE&pz z)YBM7*-v!rmRoDWcCCpqA%r$TaxEyprt_J%U{RG*T#4P;`!!#R=idU5%iaK;Cq3Q} zh&apFe1@*w66dG=Q~+fa#ZKWT;l=EIRbBlk9JmfKoiCpQ_%Wq*{fLkjO=tmgJc3LOhop?JB-tF&H~a`x@9;QH2OCHS?+G%T zE>MuleG_xbR-_QB%Hk)X(;atE(9n8s+RrXo7b2g1U3m-gJn58clgNnTzc?tNaeexh zw)8a*O#;Fu)$Iiq;wM8dg-E~$b1XZ1*jAT}W2Lqv0`^@Sx0@Pew8?c-;AjDuy6X=^ zcj0qfy~ciBYwj+jQlvUhi(~l6iqfW{gfJHs6?HI(9f?f(i?I3v19*D_H8eD2@LE$0 zycTizKUHjwz1&cS(k&7y+E9p_CSs z={AwI;xnA$6wNlDrUuVBcWBu0`)$NgA$g^;pG`Pt)P-Kan89 z6~*qZqTwj=P)diyLd}yS1rLJrXnC2g;5?dY{a4r27Wk6D20wul^VPF$-xLP8USO-=0M%Jp64&2@p9ivqoN!p18^_DSfapl(HLN51uyZ-L+tC*2sRUIjn7@jg(X}XJJ z)$cIn7$~!p39j0$YAF!%xeo_Bz+|)fNFOLEKLp>#>7>zmVUTD;ojzmSLVF0sCvKGJ zzZ!JGQ4XT+ktqkD(`IZhA?b+e+G{xCZ_O{DU_tlX0<8)p&6{MN0BWn1D)VTOGBdzklv{)Qn!42Bylb@Ab$Nb&jt~yMn9FP zq-akjFhD825{RG@9E?@UI)*nKJ-qy^!gy9+T%~Ge5Aq;fj_Q>h-i?l%OhP6$Dvkl`i8O0pM)w`lE|ofp;tUrjf^l^GmH zrk~`HmRKRHe6iN#EG8O{zE`$0^FtsW9)wYxbSeomKDmhMY~lo^wz9rDp8=6asd%^- zxm;kL37#jzicZ3!D3jt^Ng6K0+(H003rmymPzZx|hmJ5d#{Rvn zNVpFV$xu`%iQEiT6a~eH`wQalKA0JMze7!jFAQ$}k+dwOG)Jyaw31~|AMV1p_t)Ga zPUJS|@V}$m{Ce^SaMO+(8FmDES*uyWj$DYuBvQ|8-^L0eK)nMnlX?#9nSOiy`|V*P zDWd~1ycLJ?cJPPc8kR7$KWB;`JW6!1nx7(ZWd!fk;GmRZ%pJ0GvkWdzhAa&?0&f|) zo+1TMjalQPKjSMLMPEcDW3m2C#?@j`59i`srFxE^Gc;p5ep7>I4>6Otv+<)aj?0y4 zzJAV(QhDk@miq(hq7HM17cK};z|s-U#S>$XV3zLl#Bac1@ z_NzJz`sU}Moj+wY{%_C>J#L6egf2N^yxlTkV<7kHli_`UvG7_Us8wHO;k&-w1!(Rz z+KC9H2ocV6j=buY?O$ksC1vse`dqqxV>}z@A}3f+&pT1p*|$v}W6gu^`R+hE@U0R; zYEQ#mNqV>j{yGXnG=D<>1TJd(Wr-|3o{8W?Km6e;WMX2BhyOv32M1q**(5LMqn+6h z;^(TYtlVf5q03ap1b|0Tb<;F4>5%k^mQ^X8Pjnv`+WET^7J9LsDe24!RDwbGs-1+9 zHijLS$B6LTud-H1tr_l1zP;tlo^Idt*?r*R$pcNch5%HL#@J64ARd(|iFnUlAPhjM!4gm%R{G$n8 zk-4BA6If;)9F*{(2taxF8 z!e2?Vk>yeXerLq~E0es!|87{wNfSfLW;5~*;LK2}QR>vwsm3N$U)Cx*lb{?U$Gu_V z93X{ZJ~2L>XMK@z6^0gIHwB_8gU)tXvJ(NvDAJMG!v3$)+$t zsKH}kC#J_tP^IzH3DhKJHQvLjU;u+}P@Z`}b=m?RYtO!4T%~kh{NW$KJ136H-d~ss zswDiB=cazYkq%sGl24v(0&5C+*va|dI@aAueD!}lYOW&^RLnZV6R|BV)4o?qv|`|AZO(~jZZa<@ zV1VjvMrOmoG?TlZMFp($!mG>rNwN-$ss6WAIUB|cmb6@bn8@wSwI0EEZ`cBzRI#_Q zNhL9{9-ZK2v;Cpx)7|ZXg42{^)H|ne(=czAF`4@Y}SplUMOk+@uP;BB#U0X zHaqzRI!D78(!qcpn6FO!D9IKgNEHtegWndSI7| zr@^DoE{))slNPA5CvY*wazX2GAjFFUW`i=H-U&+v_%7RM2V0Mfp=DO|ouvSpR} z(vULUbsFUdYZ%S5A@Kz1m)zBDWaX0qh7w9=XtsJB-ls-afvr)g_}}aou z4nct_|HRPJ`A+Dg=eLyb>KgPnMrRT0Li|`)$z|pk?m&uJ`4m#& zS8^Q;TRZpF`*b=IE{DCW)!e9K!W#wOqIqw94|}lDp91KGnmvqYag`@RQ1qGo%z`d` zp?ylZ5?T5Wkv9qW$VY}2yl6$Vc4(!e+ZVL)Cm`K>eEs=UhRXOh+P_F(J!!m zw778H{35X9cD4ES2uxUdR;HP^VNN8&nJBF{h+>E>6FEYKdE<+1jf5KdeIk`3K(u0)J!=o@-{Xkvx2$m)C#-gTSKX&MY_SqsdJ8 ztd3puJ~bl_%i?>P7_T%89#b1TQ*mbBz(bN$3`_lpe0C)x%}8G)!b}8hp~=64HtAG7 zuKNq;+}NyY^yCm!`DR`*DMClli~JB=Op{M?^3a!owdoo>QOv+E5}4hHrF#;{%`1Ui zs+VckG3o>{vGA|`4@}e{iZRmG|9%uanHBpQ8Fr$miT~?@ zAoKsDT*9Yv;))K$irLo(hB_lK0QHN6Rc%&uAYx%Vy%>%eOR>z<$?;^I*HlQ4_;AXT zBPeaYiCm~IYSdd1bLABWVt2@|sF>;>b20uGXVGVM$fSPrZn}`H2#xAQ{tW0ks8Sk$jE}MR&_Lc*H3fQc4MF8{F`z2SO3#+Q`s)MTX+X$BxA;-+@tXUm-m_`jf=Q2?>+A3ge9p8% zg|e-T7f65p<<1kwJdk76a_0~Cv(V2E_hl3kp^M)ZyTAMh3#0Rod}BnnkD1Uj@WlLD6ha) zOd_KGO$}*PG$1#A2LfC_Yb}BqC@_&uc1ffNFud|H?(IlYCjd3o%DFe&F8-`G^m2R~ z%mP7&#p=YTc9?azeGlZ$*0_p z#=D-j!4)$6&BKnrgsig!N^y|3o_-5*7_UA?RbI=Y4i0b&dtOeAvk4)Jb?#XotbOr9 ze`!JP_6c}FQTwW?+x{N*)zJS2)5DOEYxn)tcQ59!xVU(JE1Q_?k!Xv%-JV0Uc?QjlDp+j&L_zj<7?=k9H6Y~(@i^V$y4@s_v0 zZoSeeX1Qz&Ulf5f!DCPggC77BQI+dxwj*Ef2BMErGG)CEpJ$%c+lL1tfS=jzR?%c8 zA5yQNpvMpsrBb#K1^sfDTB%32DqHMpcZN?xzontu3<#KF`pCZL-dT^v>^hYg3mO z?|&!P*E2Z{z+wULz#(5{&BSLfh)CMK1=+3SG(C*J_qRS415vq3xjvZ`n`{1fTQO4a zcag>55lnnew*kxCcdff>dsD_oe8Y^$1!#sf&GrE%mJjuq{t$dc%42GF9112IIWaCb zBgX3}WT5XTa#Pl{Y|(0KXFC?!PHcPnr_xbsL({{Qkj!>CgtrHI0i%y9#@OM*ml+SxbaFmR?2TK$_Z?+kTlsH&<_h8@;i2{szL?c{) z(8f2ApAb5kfU2eeCL!_8!HLf<*iaYaZYA3@JHRza(|$c8itee^!w;nPu5D?k!Xr#~ z0yQF{&@~}Gr1wWy>1Sp4^#`+lYqwxFGd+#3iSYFGT@O`#fLItCXOh3~{-yL={PYEE zxB4~YG}O7w?#0iU%xy961d|hB5m;6A7Jek-aWZGB@wJJ^~4 zSg0i(6VPevspj|i<78=RNqswaqvNV)Y%DV9JNS#aJ@&h)TJG;3ko%OB1?}!v$O8@5 z`x!OeZ~2bhbddXzkw`x7zAJO}e`_(>9!@s{4v-4@>kTB|z)qDKy#|xX(}Ub;@bE>T zgYg69PP^QEY90I|bbruqryD=8!Gi2+&2@F}Ig__K`{tn&%sOo|;J56RhK!DCd0wbF zS$2QUzOVyBUh6Iw7OVxRL_CA~DRue0#_Ic<=^@<_BHm*fzZcqF1$44ItIQ|QBe&s5UkE%)!NoEns zVe?+erlqARJFpT}tfQPP{q4ARu+sy_ah5A}-?!lBgHPcMJDs-DSA-|DdikM5D-YUO zi)ktcDF}avQBxCP&{V-gvJUF9PV1iZ(HPf`6^^A5eqvnn@otvqz9MHs>F@pYIEbQ& zP0>M^YVxr3etnHpL+puQ2Lb(zw+A^c`l&R#+xg8Wd*;ymnE>rk3TeH4V!SzLO|Alq zK)o!T+(u^s@cpkEL-#2;`q8NxeBb-;9H6yMa_Tq}JyamHIwRs|2i!s`iD~^-wQrSN zyRtS(e|EttB90Scl|l~Wp#|IHuI3OalR2I2YUY`3_`EM(&aPGamxsh@@zmgEngfP| zsXYl%&4vNd9h$NAHKBVwFoD}x9UBE|Xc%1KU}M80JC#CmJ#GB;C9|=yv0f37z;ChO zxnE1s#p>z}gaJC}wd|KWPgG}i3Ln;V)2 zQJ0!%pF+zTe_5+vvhcqFHpC0vZ!cU{RR$006-)MFPcP5=;M~1y5^aFCPQ?2D7-#ln zghQ9SI}LJxk=D#=gN3vVAFWL2#fxF{x*&gWZf4TO>FICBt7^}ZXbGj8q-jejzQCoJ zf`Y!}Kei*+!d!dBbYamw#s&tO?GJH=qo4eqUt#y`+@7w*B=&7$*J!c+@esYr+Nhs? zpRI3_?U?ftH`>`T?rQh!Bf3O=^nE1#E)(|_r=+!Kbd{d)>+{2#+%R^W|Lt>&EEq64 z&>0ZeA8)hT#=k27ScrLE&XF8-`0Qe~I!H-Mrly3ww_SM7>S2S6Y3%G)2h-y}uSc|o z$i}0^s=wWs>gWKI5i{eRo!llSWVPTejuE!U zKEJ_(>!PqQFxiTL_gBa69pr`T@59*v4uYPS%)bXMr?aJ3E*)}k`SljdaWF}}|85Yl zIXXrg*w{q6MS<^<)5NPD$;)*+=u68)bA0tNy zSF^<}rT`A6g@S`=uJ!et^YbI&yE6o+!0*E)Uow_~`&scAEzd26wNb^d`U54j(cXN~ zNsUgaqiiEB&CRMr&yO>>FK)Q6;~$XuJGmu;qe*pM6(>g|mAkq=6s(cPW_Isky3Kv} zy?89ke}Xrl(hgm|NwevhlYKf<{rpscZ%Ug^s%MURw!?k%%;@Svm#W*u7FRQ~lFb+E zuE<|vSsNiG1OEyN7N?W(RdmzU(@9O`*q};*5uvPfFfcIou|VUr;eQLH(l6qrK=hj> z=d7%4l_YQi)+fZ1>q%UJGfASqM%Gh~-TD%mn!ajC%KH0Ll*EyogB?WL;B4Bb3O=HL zqG>36^XXr9H6)&%UrLLpkq^gfI=2d>G6fpCMF}g#`iK6JA}kAD1)N_TaGB2$r9(G0 zG!36am@1LBI83?_S0&NKWZy2GIV$@|;3r@a$`G7b3#{tA!GC`K>pRb?-+q1PlB$G! zjV`ZX3RH&}mUC2QVPffbCltK{yB*EuCpWnS1%DjBB+Pz)6^TGL*7ZShE~?V~{xC*H zr-YBnVQHCGRAlN8Mh#I3^?$p47Rk+DF&*Bszc^PJI6OUU_I!*5pG74S4lHi=&YmnA zF5%$d8a-ZZcXt>U(#8`DABxoe-Q?p+WzL90hK?srmp%WI!_Rv%P&anQj7OOYMuT=6 za}xc&Iu*gRtm5b4g+@fmrz;jh00%rw%eUshQHN)!5X>0~Pfn@x(rCGTxQW~Mo@-)T0$W%6cPEj*V zUuCXiGP(8IVLD6+0(GTJpuBAf)y&*7m+bleBbiq82iPaszP-4MsC%kUSgO+7r8&q# zBNh_Uk=DbLr9b$U<Rn_5~^yzE>ZXT zc(K)HdGr^&Fbj63w_{{lPC1T@BN3jfQt)Lw691J}j8i@-Z)*B?-}R-D_rYon)5r7T zg^RNs(;=HKmPo3vx)n`|TlCj*yJ2%a@zcEWX9%)IMsSvk8q$;R@$M)YQc>Ycw#Xy6 zER@x<{fwZ)gvD;Rc)EaWJh5A?_sYeNBwy(ikd@IFxKk2y#*XeDupTQ?^ZtF}3>)g`{UHb*;2K3yVvKuIWQ5?Gf)f*ZEoq9`%Cqr znt>6CJTDw2!>Vo4zP8Qo25LpfH+41nlIj}OUcSq))oEyWne0{>-4_kt_NDPLdKCo; zZFFo*6qdrGZhlT38fwL!G;jJuee4n7G8dk?3TrL5>1rZEG6^?wS3eYD%ct7cDm}4fA|&;}Li!G;&ZkGF0aD5mvS7f#*;o2Z?Iyu>;*^-X) z26+7}O8TKL=ge{W82H|uEAo2J@HZuavlkwBbfU~7GF9;QUOrp|MP0U!f)O2E*^%uk zdBIGyMJby!o9p!~*Z&(-sg#ryGTwwv`yY5OLw3(4u!d-<(g2bzR1XHj@9hPZxJ#3F zi7pZA=7RnZo{`p=W5>&al1f6(M~o!OI7>~=`uZvM@pv)qvpty=8;VUcf*%k78<$1N z2&xsFd%kQ1#(SKvgmOV(9qF~$RhLzowb#EX1zGC?J*~5f!fgp0;NrO#R-V%;bt#Pp z>#*iDdW2uhaNfQq>iN;%3kwYn(gekmi^|I*o3cw(SwQH>q`cW=e=WiJ7%*aqizPbX z)~Yy+%KQ|nBP8E4rj;Uq)1V8(*Afis4w2egUCFDiIi$XTjJ~s)MaAXZ<6UokKFV1O z(vb4{7m200}QRi>gfwY_~M z^jp_{Y|c+yQA8DTR-^cV<;px!hOGj{9K_5S7DmQ4?L;U=IF92bmCbZdY`qvd-fMh# zMA6N~)f1x)XCrcQXakIAo8PP|NC@;7ysBu8sUekZ}5=m~5)1CZf!q-2cPgJAYU9_6xSLQK{IrZB%UA zHmhRWPQ|F$wrx~Wv7J;@u`9T%-tUV(eNO+-r@L?89=HF2J=S{mUSq8NJo7W>(C{Kg zI(&lN7aJrW6rIb&j!27`hA^;|pG>;B=Afp6gS z;27cU(E{?cPIzzdrw{(klBgscg(Dwh@jNSUP+JkUxg>nePBA#_;7XP^2Ti0Wx7|HF z2?05m9a*h?E!1+ER|H3+2i;D1oeu=M2?zUT-0(DEQxjCElvTEr7*PnRV zeyp}!R=y0q6`ecUUgY)63z(S!)6j_ynOezq*>?msSBYW*gGDB?GdZ+NrQS3n4UQ4R zo+x@{ROO3Vt`H1Yh;DcaByM64g^wv;f6kh4#~xXVR1hVY4+JFDUZxmPgs7_Z_rU-!ElK>17)Y+};5cM3;!<0bY)@EBUY$YeA;+)t{AzUwu5w0$*lA#H>-d znZ8Dmm(=5G$!_fKfVWST=d~xHdNohX@VZes__JRz(cN+LEdM;f1Q{?w@4y+N3jT!1 z?m*)%;&N=xGEa+ZD&n#$D#kf@6$KAlwFr+0{i9+{q}5BK;%v1Jkx+;CHz#EmU_&ox zvQYpH4*)49X3*;{O<@za!AnSsYhesmdmg9ci}JtO4)oYE?p9mQi>Er6s}`Yz!Q*k? z{xQFd*I@jVOZ0|(Ai|5D=Q+Hb(#;ukb#qEKXF4&DohC#>DO8Vpvq zTfIN}K}c?|_-;JR)@nIh30WREzZi}b7d|;L5x@@dW%rSJ(g@TkG^CD6Q7*js#zY~P z9}iRJ+EPifWK7#CH#uGv)fDx>(lBwVwN=yPHw??Lt##+cT93_q+7)BxEsh~o(Qfq0 z;Qak@5}ipfWH<;tm!;EDK5!aF(*2z>X_*37hok^^cAo{7&0%wVV1oB;rmuR#i&3A; z?dTGd!$F&IXq?O;X0R-|X_$-Q#;Q!s3?!J&Y8So9d6d!oxMYJp66qd^>znMidr*5{ zHoXirnraeWz`5H83o0d08q`}IR?DgINGwCy6oHVEU4?%=7!OfcTWa=c8Uh5}hy~N4 zvv^9!<#;yRFzYL<7<)!v`8>+XR)YmJ44w08fCL|SYGWm>OMj=li4m6`#= zF~$yj2qV$CRD3-Y5fl{v7j>!be#n_$Ik(yCnX{I=XnNLCCVdt+Vx=Df9@%yFkG3sa z_j*+?ki4}6GtFi z)kOeE(r%8sPPRHV(@i8t(hhATdNrx#;!re;)#B!6;E1XW3j_Cc7_N|^abt>@-DDjJ zI_C0|*t3J$1yium(d5?a_nf{uBndQCtFa3HQPP?69dDB*U6N(K|H?!e(5)9%b##4(oL zICKC3`KHQ+9Kf2^(dlH+1FAs$dilDWJdxr6@};+zxW|F_!$&-IEv4A)D>jgOQY{g% z@%m=+lgZjH<==s2PNLq0O(4)>dFa(w{+-qc(9FTXjDx*>BEqL)oo~Zr`@)V3BV&Rr z<-`PWLU)@{j6JS2$6P?P%q@`Ut|UwVe*SJpg0*+#2DOxMd~e86Geql*I;-#3FFZw= zTlZ7~AX;WS+!Ag&onxI!Ys5-a%W$}w(P9|{Yc>ebL}_V`Ia`Yl$GkA$cl{FuwBr*> z&_Q$nO;nxG#N&1NwcQ;4?l3ks_DGF21fB#f^A(DggO;gIk8VSPtftOtlJ~O-jMq$( zNE|^#0blw&MItociaMnD4rE+15$e=dj~mlk_4h<&MvTS|FOx<#_Q8d<>qSL{eFFUt`PVh}rQ1X5;vJkvUr^ZARYB~?XN!ns?d;+J5_ zE}1oY45Mw^=l_#p4&m zoS@jH^_5t!Z+Og9ZN()OeDRpEy@qvg0cDe4WcJfm7Hya~TZNqrPF}SZY7RH?Vr=m~ z+A{3e<*KKop3gNChTjIAc4^;{i8R^aD^fz^C~#!y-!I;=;D2>F6o-3Qw%1<~Dsg`Go^th>#uUxOnh-;@vJUoxTp5 zS^R9W#)$dCJ{$AM%xyF?umO4J!BrVfdS_1pJZq}T)+!K&lJkgg)O6#R-t#IZ9}!bE zbqx|ku^*l%j#g{mei9GlWVbkSTjnN-2~K_@h*CAazxZ^ucyg!11kc*)$7wVYKf^^5 zklRiSHV}Y{_fdV45MHr@luTB4*J}Ke0@4V&?PB|1R6BR=WR^Y zWadLJ@Rmo&0Me=scJt}Y@$3`KH+~=M(aWD#0iT@verOm>Nkk^>_934Iq}?9c^kNe! ziiJUQGdt&&biXgg3S#GJjZ(Nm3-lK|6DH&jA8u2I;obn^Aq|ZdE5aU`Naak)!kyc~ z^iM%AmnFXqah=*??3b}ph2$nP)b>9E_l_v>! z*x1CBnC6a#{;b#TJb-pnt~TK`d9m4KG8&JP<}K04>t>Ichy#}B<@yVY=ZsrdMG2+p z^AiiPf4$)TB+WSBbsgDV{RO{z~pX9sFWJf z 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 + +![Extension icon](Resources/Public/Icons/Extension.svg) + +# TYPO3 extension `mailqueue` + +[![Coverage](https://codecov.io/gh/CPS-IT/mailqueue/graph/badge.svg?token=kMi9CaL3gV)](https://codecov.io/gh/CPS-IT/mailqueue) +[![Maintainability](https://api.codeclimate.com/v1/badges/75952c5451dea0632fc0/maintainability)](https://codeclimate.com/github/CPS-IT/mailqueue/maintainability) +[![CGL](https://github.com/CPS-IT/mailqueue/actions/workflows/cgl.yaml/badge.svg)](https://github.com/CPS-IT/mailqueue/actions/workflows/cgl.yaml) +[![Release](https://github.com/CPS-IT/mailqueue/actions/workflows/release.yaml/badge.svg)](https://github.com/CPS-IT/mailqueue/actions/workflows/release.yaml) +[![License](http://poser.pugx.org/cpsit/typo3-mailqueue/license)](LICENSE.md)\ +[![Version](https://shields.io/endpoint?url=https://typo3-badges.dev/badge/mailqueue/version/shields)](https://extensions.typo3.org/extension/mailqueue) +[![Downloads](https://shields.io/endpoint?url=https://typo3-badges.dev/badge/mailqueue/downloads/shields)](https://extensions.typo3.org/extension/mailqueue) +[![Supported TYPO3 versions](https://shields.io/endpoint?url=https://typo3-badges.dev/badge/mailqueue/typo3/shields)](https://extensions.typo3.org/extension/mailqueue) +[![Extension stability](https://shields.io/endpoint?url=https://typo3-badges.dev/badge/mailqueue/stability/shields)](https://extensions.typo3.org/extension/mailqueue) + +📦 [Packagist](https://packagist.org/packages/cpsit/typo3-mailqueue) | +🐥 [TYPO3 extension repository](https://extensions.typo3.org/extension/mailqueue) | +💾 [Repository](https://github.com/CPS-IT/mailqueue) | +🐛 [Issue tracker](https://github.com/CPS-IT/mailqueue/issues) + + + +--- + +An extension for TYPO3 CMS that extends TYPO3's mail spooling functionality +with an extended queueable mail transport interface. In addition, it provides +an improved version of TYPO3's `FileSpooler`. In order to make mails in the +mail queue visible, the extension provides an (admin-only) backend module and +a console command. + +## 🚀 Features + +* Extended interface for queueable mail transports +* Improved queueable file transport with failure metadata +* Backend module to list mails in queue +* Console command to list mails in queue +* Compatible with TYPO3 11.5 LTS and 12.4 LTS + +## 🔥 Installation + +### Composer + +```bash +composer require cpsit/typo3-mailqueue +``` + +### TER + +Alternatively, you can download the extension via the +[TYPO3 extension repository (TER)][1]. + +## ⚡ Usage + +### Backend module + +> [!NOTE] +> Only administrators can see the backend module. + +![Screenshot backend module](Documentation/Images/ScreenshotBackendModule.png) + +The backend module lists all currently enqueued mails. In addition, for +supporting transports it may also show transport failure details. It can +be used to get a quick overview about the health state of the mail queue. +It also allows to send dequeue single mails by sending them with the +configured real transport. + +### Console command + +![Screenshot console command](Documentation/Images/ScreenshotConsoleCommand.png) + +The extension provides a console command to list enqueued mails: + +```bash +typo3 mailqueue:listqueue [-s|--strict] [-w|--watch] +``` + +With `--strict` (or `-s`) enabled, the command exits with a non-zero status +code in case any enqueued mail could not be delivered because of a failure. + +In addition, a watch mode can be enabled with `--watch` (or `-w`) which updates +the list output every five seconds. The watch mode can be exited with Ctrl+C. + +### Custom implementations + +The extension provides two custom implementations as XClasses for TYPO3's +native mail spoolers: + +| TYPO3 core implementation | Custom implementation (XClass) | +|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| `TYPO3\CMS\Core\Mail\FileSpool` | [`CPSIT\Typo3Mailqueue\Mail\Transport\QueueableFileTransport`](Classes/Mail/Transport/QueueableFileTransport.php) | +| `TYPO3\CMS\Core\Mail\MemorySpool` | [`CPSIT\Typo3Mailqueue\Mail\Transport\QueueableMemoryTransport`](Classes/Mail/Transport/QueueableMemoryTransport.php) | + +## 📂 Configuration + +Queueable mail transports are registered the "normal" way as described in the +[official documentation][2]. Add the following to your system configuration +(e.g. in `additional.php`/`AdditionalConfiguration.php`): + +```php +# Native mail transport +$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_spool_type'] = 'file'; +$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_spool_filepath'] = '/path/to/mailqueue'; + +# Custom mail transport +$GLOBALS['TYPO3_CONF_VARS']['MAIL']['transport_spool_type'] + = \Vendor\Extension\Mail\Transport\CustomQueueableTransport::class; +``` + +## 🧑‍💻 Contributing + +Please have a look at [`CONTRIBUTING.md`](CONTRIBUTING.md). + +## 💎 Credits + +The extension icon ("envelope-open") as well as the icon for the backend module are +modified versions of the original [`actions-envelope-open`][3] icon from TYPO3 core +which is originally licensed under [MIT License][4]. + +## ⭐ License + +This project is licensed under [GNU General Public License 2.0 (or later)](LICENSE.md). + +[1]: https://extensions.typo3.org/extension/mailqueue +[2]: https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Configuration/Typo3ConfVars/MAIL.html#transport-spool-type +[3]: https://typo3.github.io/TYPO3.Icons/icons/actions/actions-envelope-open.html +[4]: https://github.com/TYPO3/TYPO3.Icons/blob/main/LICENSE diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf new file mode 100644 index 0000000..ada91b2 --- /dev/null +++ b/Resources/Private/Language/locallang.xlf @@ -0,0 +1,130 @@ + + + +

+ + + Mail queue + + + Status + + + Mails + + + + Date + + + Subject + + + Recipient(s) + + + Sender + + + + Failed + + + Queued + + + Sending + + + Late + + + Unknown + + + + Unknown + + + + Unsupported mail transport + + + The configured mail transport "%s" is not supported. Please configure a mail spooler as mail transport. + + + Queue is empty + + + There are currently no mails enqueued for further transport. + + + At least one mail could not be sent. You may check your mail transport and verify if everything works as intended. + + + It seems like some mails were not sent for at least 30 minutes. Make sure to periodically flush the mail queue. + + + The mail queue seems to be healthy. Make sure to periodically flush it. + + + Total mails in queue: %d + + + The mail was already sent and is no longer enqueued. + + + The mail could not be sent. + + + The mail was successfully sent. + + + + Transport failure details + + + + now + + + a few seconds ago + + + %d minute ago + + + %d minutes ago + + + %d hour ago + + + %d hours ago + + + %d day ago + + + %d days ago + + + + Close + + + + View info + + + Send mail + + + Try again + + + View mail configuration + + + + diff --git a/Resources/Private/Language/locallang_mod_mailqueue.xlf b/Resources/Private/Language/locallang_mod_mailqueue.xlf new file mode 100644 index 0000000..ece411b --- /dev/null +++ b/Resources/Private/Language/locallang_mod_mailqueue.xlf @@ -0,0 +1,17 @@ + + + +
+ + + Mails + + + Lists all mails currently enqueued for further transport. + + + Mail queue + + + + diff --git a/Resources/Private/Layouts/Default.html b/Resources/Private/Layouts/Default.html new file mode 100644 index 0000000..b840b0e --- /dev/null +++ b/Resources/Private/Layouts/Default.html @@ -0,0 +1,8 @@ + + + + + + + diff --git a/Resources/Private/Partials/Date.html b/Resources/Private/Partials/Date.html new file mode 100644 index 0000000..4dee65c --- /dev/null +++ b/Resources/Private/Partials/Date.html @@ -0,0 +1,9 @@ + + + + + diff --git a/Resources/Private/Partials/List/Queue.html b/Resources/Private/Partials/List/Queue.html new file mode 100644 index 0000000..677f196 --- /dev/null +++ b/Resources/Private/Partials/List/Queue.html @@ -0,0 +1,85 @@ + + +{queue -> f:count() -> f:variable(name: 'count')} + + + + + + + + + + + + + + + + + +

{f:translate(key: 'header.status', extensionName: 'Mailqueue')}

+ + + + + + + + + + + +

{f:translate(key: 'header.mails', extensionName: 'Mailqueue')}

+ +
+
+
+
+ {f:translate(key: 'alert.queueItemCount.message', arguments: '{0: count}', extensionName: 'Mailqueue')} +
+
+
+
+ +
+ + + + + + + + + + + + + + + +
{f:translate(key: 'queue.table.header.date', extensionName: 'Mailqueue')}{f:translate(key: 'queue.table.header.subject', extensionName: 'Mailqueue')}{f:translate(key: 'queue.table.header.recipients', extensionName: 'Mailqueue')}{f:translate(key: 'queue.table.header.sender', extensionName: 'Mailqueue')}
+
+
+ + + +
+ + diff --git a/Resources/Private/Partials/List/QueueItem.html b/Resources/Private/Partials/List/QueueItem.html new file mode 100644 index 0000000..4e8f2b6 --- /dev/null +++ b/Resources/Private/Partials/List/QueueItem.html @@ -0,0 +1,95 @@ + + + + + + + {f:translate(key: 'queueItem.state.failed', extensionName: 'Mailqueue')} + + + + + + + + + {f:translate(key: 'queueItem.state.late', extensionName: 'Mailqueue')} + + + {f:translate(key: 'queueItem.state.queued', extensionName: 'Mailqueue')} + + + + + + + {f:translate(key: 'queueItem.state.late', extensionName: 'Mailqueue')} + + + {f:translate(key: 'queueItem.state.sending', extensionName: 'Mailqueue')} + + + + + {f:translate(key: 'queueItem.state.unknown', extensionName: 'Mailqueue')} + + + + + + + + + + + + {queueItem.message.message.subject} + + + {queueItem.message.originalMessage.subject} + + + {f:translate(key: 'queueItem.subject.unknown', extensionName: 'Mailqueue')} + + + + + +
+
+ + + + + +
+ + + + + + + +
+ + + + + + warning + danger + warning + + + + diff --git a/Resources/Private/Partials/Mail/Address.html b/Resources/Private/Partials/Mail/Address.html new file mode 100644 index 0000000..9bd0685 --- /dev/null +++ b/Resources/Private/Partials/Mail/Address.html @@ -0,0 +1,16 @@ + + + + + + + {address.name} <{address.address}> + + + {address.address} + + + + + diff --git a/Resources/Private/Partials/Modal/TransportFailureDetails.html b/Resources/Private/Partials/Modal/TransportFailureDetails.html new file mode 100644 index 0000000..43de6e4 --- /dev/null +++ b/Resources/Private/Partials/Modal/TransportFailureDetails.html @@ -0,0 +1,40 @@ + + + + + diff --git a/Resources/Private/Templates/List.html b/Resources/Private/Templates/List.html new file mode 100644 index 0000000..05cf9ca --- /dev/null +++ b/Resources/Private/Templates/List.html @@ -0,0 +1,27 @@ + + + + + +

{f:translate(key: 'header.list', extensionName: 'Mailqueue')}

+ + + + + + + + + +
+ + diff --git a/Resources/Public/Icons/Extension.svg b/Resources/Public/Icons/Extension.svg new file mode 100644 index 0000000..64961b9 --- /dev/null +++ b/Resources/Public/Icons/Extension.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/Resources/Public/Icons/module.svg b/Resources/Public/Icons/module.svg new file mode 100644 index 0000000..64961b9 --- /dev/null +++ b/Resources/Public/Icons/module.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/Tests/Build/console-application.php b/Tests/Build/console-application.php new file mode 100644 index 0000000..63a325c --- /dev/null +++ b/Tests/Build/console-application.php @@ -0,0 +1,41 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +use CPSIT\Typo3Mailqueue\Command; +use Symfony\Component\Console; +use Symfony\Component\Mailer; +use TYPO3\CMS\Core; + +require dirname(__DIR__, 2) . '/.Build/vendor/autoload.php'; + +$command = new Command\ListQueueCommand( + new Core\Mail\Mailer( + new Mailer\Transport\NullTransport(), + ), +); +$command->setName('mailqueue:listqueue'); + +$application = new Console\Application(); +$application->add($command); + +return $application; diff --git a/Tests/Functional/.gitkeep b/Tests/Functional/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Tests/Unit/.gitkeep b/Tests/Unit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..ba6f0b2 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,2 @@ +comment: + require_changes: true diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..4294d51 --- /dev/null +++ b/composer.json @@ -0,0 +1,107 @@ +{ + "name": "cpsit/typo3-mailqueue", + "description": "TYPO3 CMS extension to improve TYPO3's mail spooler with additional components", + "license": "GPL-2.0-or-later", + "type": "typo3-cms-extension", + "authors": [ + { + "name": "Elias Häußler", + "email": "e.haeussler@familie-redlich.de", + "homepage": "https://www.cps-it.de", + "role": "Developer" + } + ], + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "ext-mbstring": "*", + "psr/http-message": "^1.0 || ^2.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/mailer": "^5.4 || ^6.4 || ^7.0", + "symfony/mime": "^5.4 || ^6.4 || ^7.0", + "typo3/cms-backend": "^11.5 || ^12.4", + "typo3/cms-core": "^11.5 || ^12.4", + "typo3/cms-fluid": "^11.5 || ^12.4", + "typo3fluid/fluid": "^2.7" + }, + "require-dev": { + "armin/editorconfig-cli": "^1.8 || ^2.0", + "ergebnis/composer-normalize": "^2.42", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.10", + "phpstan/phpstan-phpunit": "^1.3", + "phpstan/phpstan-symfony": "^1.3", + "phpunit/phpcov": "^9.0 || ^10.0", + "saschaegerer/phpstan-typo3": "^1.10", + "ssch/typo3-rector": "^2.0", + "typo3/cms-lowlevel": "^11.5 || ^12.4", + "typo3/coding-standards": "^0.7.1", + "typo3/testing-framework": "^7.0.2 || ^8.0.1" + }, + "autoload": { + "psr-4": { + "CPSIT\\Typo3Mailqueue\\": "Classes/" + } + }, + "autoload-dev": { + "psr-4": { + "CPSIT\\Typo3Mailqueue\\Tests\\": "Tests/" + } + }, + "config": { + "allow-plugins": { + "ergebnis/composer-normalize": true, + "phpstan/extension-installer": true, + "typo3/class-alias-loader": true, + "typo3/cms-composer-installers": true + }, + "bin-dir": ".Build/bin", + "sort-packages": true, + "vendor-dir": ".Build/vendor" + }, + "extra": { + "typo3/cms": { + "extension-key": "mailqueue", + "web-dir": ".Build/web" + } + }, + "scripts": { + "fix": [ + "@fix:composer", + "@fix:editorconfig", + "@fix:php" + ], + "fix:composer": "@composer normalize", + "fix:editorconfig": "@lint:editorconfig --fix", + "fix:php": "php-cs-fixer fix", + "lint": [ + "@lint:composer", + "@lint:editorconfig", + "@lint:php" + ], + "lint:composer": "@fix:composer --dry-run", + "lint:editorconfig": "ec", + "lint:php": "@fix:php --dry-run", + "migration": [ + "@migration:rector" + ], + "migration:rector": "rector process -c rector.php", + "sca": [ + "@sca:php" + ], + "sca:php": "phpstan analyse -c phpstan.neon", + "test": [ + "@test:functional", + "@test:unit" + ], + "test:coverage": [ + "@test:coverage:functional", + "@test:coverage:unit", + "@test:coverage:merge" + ], + "test:coverage:functional": "phpunit -c phpunit.functional.xml", + "test:coverage:merge": "phpcov merge --html .Build/coverage/html/_merged --clover .Build/coverage/clover.xml --text php://stdout .Build/coverage/php", + "test:coverage:unit": "phpunit -c phpunit.unit.xml", + "test:functional": "@test:coverage:functional --no-coverage", + "test:unit": "@test:coverage:unit --no-coverage" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..f065301 --- /dev/null +++ b/composer.lock @@ -0,0 +1,9424 @@ +{ + "_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": "9fb3fda18a69a702edd9091fdcad3464", + "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, + { + "name": "christian-riesen/base32", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/base32.git", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.5.13 || ^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Base32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Riesen", + "email": "chris.riesen@gmail.com", + "homepage": "http://christianriesen.com", + "role": "Developer" + } + ], + "description": "Base32 encoder/decoder according to RFC 4648", + "homepage": "https://github.com/ChristianRiesen/base32", + "keywords": [ + "base32", + "decode", + "encode", + "rfc4648" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/base32/issues", + "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" + }, + "time": "2021-02-26T10:19:33+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6faf451159fb8ba4126b925ed2d78acfce0dc016", + "reference": "6faf451159fb8ba4126b925ed2d78acfce0dc016", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.5" + }, + "time": "2023-08-25T16:18:39+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "reference": "e157ef3f3124bbf6fe7ce0ffd109e8a8ef284e7f", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6", + "vimeo/psalm": "^4.10" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.1" + }, + "time": "2023-02-02T22:02:53+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/1ca8f21980e770095a31456042471a57bc4c68fb", + "reference": "1ca8f21980e770095a31456042471a57bc4c68fb", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^9", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.4 || ^6", + "symfony/var-exporter": "^4.4 || ^5.4 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.2.0" + }, + "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%2Fcache", + "type": "tidelift" + } + ], + "time": "2022-05-20T20:07:39+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.8.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "a19a1d05ca211f41089dffcc387733a6875196cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/a19a1d05ca211f41089dffcc387733a6875196cb", + "reference": "a19a1d05ca211f41089dffcc387733a6875196cb", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3|^1", + "doctrine/event-manager": "^1|^2", + "php": "^7.4 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "12.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.1", + "phpstan/phpstan": "1.10.57", + "phpstan/phpstan-strict-rules": "^1.5", + "phpunit/phpunit": "9.6.16", + "psalm/plugin-phpunit": "0.18.4", + "slevomat/coding-standard": "8.13.1", + "squizlabs/php_codesniffer": "3.8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/console": "^4.4|^5.4|^6.0|^7.0", + "vimeo/psalm": "4.30.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.8.2" + }, + "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%2Fdbal", + "type": "tidelift" + } + ], + "time": "2024-02-12T18:36:36+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/750671534e0241a7c50ea5b43f67e23eb5c96f32", + "reference": "750671534e0241a7c50ea5b43f67e23eb5c96f32", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.8.8", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^4.28" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/2.0.0" + }, + "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%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2022-10-12T20:59:15+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "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/2.0.0" + }, + "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-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.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%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "egulias/email-validator", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/ebaaf5be6c0286928352e054f2d5125608e5405e", + "reference": "ebaaf5be6c0286928352e054f2d5125608e5405e", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2.0 || ^3.0", + "php": ">=8.1", + "symfony/polyfill-intl-idn": "^1.26" + }, + "require-dev": { + "phpunit/phpunit": "^10.2", + "vimeo/psalm": "^5.12" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/4.0.2" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2023-10-06T06:47:41+00:00" + }, + { + "name": "enshrined/svg-sanitize", + "version": "0.15.4", + "source": { + "type": "git", + "url": "https://github.com/darylldoyle/svg-sanitizer.git", + "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/darylldoyle/svg-sanitizer/zipball/e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "reference": "e50b83a2f1f296ca61394fe88fbfe3e896a84cf4", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.5 || ^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "enshrined\\svgSanitize\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Daryll Doyle", + "email": "daryll@enshrined.co.uk" + } + ], + "description": "An SVG sanitizer for PHP", + "support": { + "issues": "https://github.com/darylldoyle/svg-sanitizer/issues", + "source": "https://github.com/darylldoyle/svg-sanitizer/tree/0.15.4" + }, + "time": "2022-02-21T09:13:59+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", + "shasum": "" + }, + "require": { + "php": "^7.4||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" + }, + "time": "2023-12-01T16:26:39+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "lolli42/finediff", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/lolli42/FineDiff.git", + "reference": "8d535de757062fed8412833f5eede7064595ca5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lolli42/FineDiff/zipball/8d535de757062fed8412833f5eede7064595ca5b", + "reference": "8d535de757062fed8412833f5eede7064595ca5b", + "shasum": "" + }, + "require": { + "php": ">=7.2.0", + "symfony/polyfill-mbstring": "^1.23" + }, + "replace": { + "cogpowered/finediff": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4", + "phpstan/phpstan": "^1.9.14", + "phpunit/phpunit": "^8.5.33 || ^9.6.11 || ^10.3.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "cogpowered\\FineDiff\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raymond Hill" + }, + { + "name": "Rob Crowe", + "email": "rob@cogpowered.com" + }, + { + "name": "Christian Kuhn", + "email": "lolli@schwarzbu.ch", + "role": "maintainer" + } + ], + "description": "PHP implementation of a Fine granularity Diff engine", + "homepage": "https://github.com/lolli42/FineDiff", + "keywords": [ + "diff", + "finediff", + "opcode", + "string", + "text" + ], + "support": { + "issues": "https://github.com/lolli42/FineDiff/issues", + "source": "https://github.com/lolli42/FineDiff/tree/1.0.3" + }, + "time": "2024-02-06T13:56:20+00:00" + }, + { + "name": "masterminds/html5", + "version": "2.8.1", + "source": { + "type": "git", + "url": "https://github.com/Masterminds/html5-php.git", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/f47dcf3c70c584de14f21143c55d9939631bc6cf", + "reference": "f47dcf3c70c584de14f21143c55d9939631bc6cf", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6 || ^7 || ^8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Masterminds\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matt Butcher", + "email": "technosophos@gmail.com" + }, + { + "name": "Matt Farina", + "email": "matt@mattfarina.com" + }, + { + "name": "Asmir Mustafic", + "email": "goetas@gmail.com" + } + ], + "description": "An HTML5 parser and serializer.", + "homepage": "http://masterminds.github.io/html5-php", + "keywords": [ + "HTML5", + "dom", + "html", + "parser", + "querypath", + "serializer", + "xml" + ], + "support": { + "issues": "https://github.com/Masterminds/html5-php/issues", + "source": "https://github.com/Masterminds/html5-php/tree/2.8.1" + }, + "time": "2023-05-10T11:58:31+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.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "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.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.26.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", + "reference": "231e3186624c03d7e7c890ec662b81e6b0405227", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "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.26.0" + }, + "time": "2024-02-23T16:05:55+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "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/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "e616d01114759c4c489f93b099585439f795fe35" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35", + "reference": "e616d01114759c4c489f93b099585439f795fe35", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0 || ^2.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": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/1.0.2" + }, + "time": "2023-04-10T20:10:41+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://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/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/http-server-handler", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-handler.git", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-handler/zipball/84c4fb66179be4caaf8e97bd239203245302e7d4", + "reference": "84c4fb66179be4caaf8e97bd239203245302e7d4", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side request handler", + "keywords": [ + "handler", + "http", + "http-interop", + "psr", + "psr-15", + "psr-7", + "request", + "response", + "server" + ], + "support": { + "source": "https://github.com/php-fig/http-server-handler/tree/1.0.2" + }, + "time": "2023-04-10T20:06:20+00:00" + }, + { + "name": "psr/http-server-middleware", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-server-middleware.git", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-server-middleware/zipball/c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "reference": "c1481f747daaa6a0782775cd6a8c26a1bf4a3829", + "shasum": "" + }, + "require": { + "php": ">=7.0", + "psr/http-message": "^1.0 || ^2.0", + "psr/http-server-handler": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP server-side middleware", + "keywords": [ + "http", + "http-interop", + "middleware", + "psr", + "psr-15", + "psr-7", + "request", + "response" + ], + "support": { + "issues": "https://github.com/php-fig/http-server-middleware/issues", + "source": "https://github.com/php-fig/http-server-middleware/tree/1.0.2" + }, + "time": "2023-04-11T06:14:47+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "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/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/cache", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "0ef36534694c572ff526d91c7181f3edede176e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/0ef36534694c572ff526d91c7181f3edede176e7", + "reference": "0ef36534694c572ff526d91c7181f3edede176e7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.3.6|^7.0" + }, + "conflict": { + "doctrine/dbal": "<2.13.1", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/var-dumper": "<5.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "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 extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v6.4.4" + }, + "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": "2024-02-22T20:27:10+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/1d74b127da04ffa87aa940abe15446fa89653778", + "reference": "1d74b127da04ffa87aa940abe15446fa89653778", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "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 caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.4.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": "2023-09-25T12:52:38+00:00" + }, + { + "name": "symfony/clock", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "f48770105c544001da00b8d745873a628e0de198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/f48770105c544001da00b8d745873a628e0de198", + "reference": "f48770105c544001da00b8d745873a628e0de198", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/polyfill-php83": "^1.28" + }, + "provide": { + "psr/clock-implementation": "1.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/now.php" + ], + "psr-4": { + "Symfony\\Component\\Clock\\": "" + }, + "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": "Decouples applications from the system clock", + "homepage": "https://symfony.com", + "keywords": [ + "clock", + "psr20", + "time" + ], + "support": { + "source": "https://github.com/symfony/clock/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/config", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "reference": "6ea4affc27f2086c9d16b92ab5429ce1e3c38047", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "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": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v6.4.4" + }, + "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": "2024-02-26T07:52:26+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0d9e4eb5ad413075624378f474c4167ea202de78", + "reference": "0d9e4eb5ad413075624378f474c4167ea202de78", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "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/v6.4.4" + }, + "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": "2024-02-22T20:27:10+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "6236e5e843cb763e9d0f74245678b994afea5363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/6236e5e843cb763e9d0f74245678b994afea5363", + "reference": "6236e5e843cb763e9d0f74245678b994afea5363", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "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": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.4" + }, + "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": "2024-02-22T20:27:10+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf", + "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-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/v3.4.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/doctrine-messenger", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/doctrine-messenger.git", + "reference": "0de4778d66169d65a4fa7fb5cb8742e6e924505b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/0de4778d66169d65a4fa7fb5cb8742e6e924505b", + "reference": "0de4778d66169d65a4fa7fb5cb8742e6e924505b", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.13|^3|^4", + "php": ">=8.1", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/persistence": "<1.3" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0" + }, + "type": "symfony-messenger-bridge", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\Bridge\\Doctrine\\": "" + }, + "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": "Symfony Doctrine Messenger Bridge", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/doctrine-messenger/tree/v6.4.4" + }, + "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": "2024-02-22T20:27:10+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "reference": "ae9d3a6f3003a6caf56acd7466d8d52378d44fef", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "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": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/a76aed96a42d2b521153fb382d418e30d18b59df", + "reference": "a76aed96a42d2b521153fb382d418e30d18b59df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "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 dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.4.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": "2023-05-23T14:45:45+00:00" + }, + { + "name": "symfony/expression-language", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/expression-language.git", + "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/expression-language/zipball/b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", + "reference": "b4a4ae33fbb33a99d23c5698faaecadb76ad0fe4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ExpressionLanguage\\": "" + }, + "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": "Provides an engine that can compile and evaluate expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/expression-language/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "reference": "7f3b1755eb49297a0827a7575d5d2b2fd11cc9fb", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "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": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/11d736e97f116ac375a81f96e662911a34cd50ce", + "reference": "11d736e97f116ac375a81f96e662911a34cd50ce", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "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": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.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": "2023-10-31T17:30:12+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "reference": "ebc713bc6e6f4b53f46539fc158be85dfcd77304", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.3" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "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": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.4" + }, + "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": "2024-02-08T15:01:18+00:00" + }, + { + "name": "symfony/mailer", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/mailer.git", + "reference": "791c5d31a8204cf3db0c66faab70282307f4376b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mailer/zipball/791c5d31a8204cf3db0c66faab70282307f4376b", + "reference": "791c5d31a8204cf3db0c66faab70282307f4376b", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10|^3|^4", + "php": ">=8.1", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<2.5", + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "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": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.4.4" + }, + "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": "2024-02-03T21:33:47+00:00" + }, + { + "name": "symfony/messenger", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/messenger.git", + "reference": "443b2644a3f43678adb5281a4e3fae6fbf2473c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/messenger/zipball/443b2644a3f43678adb5281a4e3fae6fbf2473c7", + "reference": "443b2644a3f43678adb5281a4e3fae6fbf2473c7", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/log": "^1|^2|^3", + "symfony/clock": "^6.3|^7.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/console": "<6.3", + "symfony/event-dispatcher": "<5.4", + "symfony/event-dispatcher-contracts": "<2.5", + "symfony/framework-bundle": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/serializer": "<5.4" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/console": "^6.3|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0", + "symfony/routing": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/validator": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Messenger\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Samuel Roze", + "email": "samuel.roze@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps applications send and receive messages to/from other applications or via message queues", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/messenger/tree/v6.4.4" + }, + "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": "2024-02-26T07:52:26+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/5017e0a9398c77090b7694be46f20eb796262a34", + "reference": "5017e0a9398c77090b7694be46f20eb796262a34", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.3.2" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.3.2|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "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": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.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": "2024-01-30T08:32:12+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v6.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/22301f0e7fdeaacc14318928612dee79be99860e", + "reference": "22301f0e7fdeaacc14318928612dee79be99860e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "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": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v6.4.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": "2023-08-08T10:16:24+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/ef4d7e442ca910c4764bce785146269b30cb5fc4", + "reference": "ef4d7e442ca910c4764bce785146269b30cb5fc4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "reference": "32a9da87d7b3245e09ac426c83d334ae9f06f80f", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a287ed7475f85bf6f61890146edbc932c0fff919", + "reference": "a287ed7475f85bf6f61890146edbc932c0fff919", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/bc45c394692b948b4d383a08d7753968bed9a83d", + "reference": "bc45c394692b948b4d383a08d7753968bed9a83d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "reference": "9773676c8a1bb1f8d4340a62efe641cf76eda7ec", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/861391a8da9a04cbad2d232ddd9e4893220d6e25", + "reference": "861391a8da9a04cbad2d232ddd9e4893220d6e25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + } + }, + "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.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "reference": "87b68208d5c1188808dd7839ee1e6c8ec3b02f1b", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "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.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/86fcae159633351e5fd145d1c47de6c528f8caff", + "reference": "86fcae159633351e5fd145d1c47de6c528f8caff", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-php80": "^1.14" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "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 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "reference": "3abdd21b0ceaa3000ee950097bc3cf9efc137853", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/property-access", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "c0664db266024013e31446dd690b6bfcf218ad93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/c0664db266024013e31446dd690b6bfcf218ad93", + "reference": "c0664db266024013e31446dd690b6bfcf218ad93", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/property-info": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "symfony/cache": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "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": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v6.4.4" + }, + "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": "2024-02-16T13:31:43+00:00" + }, + { + "name": "symfony/property-info", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "reference": "e96d740ab5ac39aa530c8eaa0720ea8169118e26", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<5.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/rate-limiter", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/rate-limiter.git", + "reference": "5b8689fd55becd6b376ec49a542773c98985a7df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/rate-limiter/zipball/5b8689fd55becd6b376ec49a542773c98985a7df", + "reference": "5b8689fd55becd6b376ec49a542773c98985a7df", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/options-resolver": "^5.4|^6.0|^7.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/lock": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\RateLimiter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Wouter de Jong", + "email": "wouter@wouterj.nl" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a Token Bucket implementation to rate limit input and output in your application", + "homepage": "https://symfony.com", + "keywords": [ + "limiter", + "rate-limiter" + ], + "support": { + "source": "https://github.com/symfony/rate-limiter/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/routing", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "reference": "3b2957ad54902f0f544df83e3d58b38d7e8e5842", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<6.2", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12|^2", + "psr/log": "^1|^2|^3", + "symfony/config": "^6.2|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "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": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v6.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": "2024-01-30T13:55:02+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/fe07cbc8d837f60caf7018068e350cc5163681a0", + "reference": "fe07cbc8d837f60caf7018068e350cc5163681a0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "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/v3.4.1" + }, + "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": "2023-12-26T14:02:43+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "reference": "4e465a95bdc32f49cf4c7f07f751b843bbd6dcd9", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.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/v6.4.4" + }, + "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": "2024-02-01T13:16:41+00:00" + }, + { + "name": "symfony/uid", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "reference": "1d31267211cc3a2fff32bcfc7c1818dac41b6fc0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "reference": "0bd342e24aef49fc82a21bd4eedd3e665d177e5b", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "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": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.4" + }, + "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": "2024-02-26T08:37:45+00:00" + }, + { + "name": "symfony/yaml", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/d75715985f0f94f978e3a8fa42533e10db921b90", + "reference": "d75715985f0f94f978e3a8fa42533e10db921b90", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0" + }, + "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/v6.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": "2024-01-23T14:51:35+00:00" + }, + { + "name": "typo3/class-alias-loader", + "version": "v1.1.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git", + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.7" + }, + "replace": { + "helhum/class-alias-loader": "*" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\ClassAliasLoader\\Plugin", + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\ClassAliasLoader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Helmut Hummel", + "email": "info@helhum.io" + } + ], + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "homepage": "http://github.com/TYPO3/class-alias-loader", + "keywords": [ + "alias", + "autoloader", + "classloader", + "composer" + ], + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.4" + }, + "time": "2022-08-07T14:48:42+00:00" + }, + { + "name": "typo3/cms-backend", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/backend.git", + "reference": "90c4ad8f78086ba93fe3d03b89a3ea09302c30c3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/backend/zipball/90c4ad8f78086ba93fe3d03b89a3ea09302c30c3", + "reference": "90c4ad8f78086ba93fe3d03b89a3ea09302c30c3", + "shasum": "" + }, + "require": { + "psr/event-dispatcher": "^1.0", + "typo3/cms-core": "12.4.11" + }, + "conflict": { + "typo3/cms": "*" + }, + "replace": { + "typo3/cms-about": "self.version", + "typo3/cms-context-help": "self.version", + "typo3/cms-cshmanual": "self.version", + "typo3/cms-func-wizards": "self.version", + "typo3/cms-recordlist": "self.version", + "typo3/cms-wizard-crpages": "self.version", + "typo3/cms-wizard-sortpages": "self.version" + }, + "suggest": { + "typo3/cms-install": "To generate url to install tool in environment toolbar" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Backend\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "backend" + }, + "typo3/class-alias-loader": { + "class-alias-maps": [ + "Migrations/Code/ClassAliasMap.php" + ] + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Backend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS backend", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/cms-cli", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/cms-cli.git", + "reference": "d8947732ff5a6dc52829e88cb1c761124475c0e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/cms-cli/zipball/d8947732ff5a6dc52829e88cb1c761124475c0e8", + "reference": "d8947732ff5a6dc52829e88cb1c761124475c0e8", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "bin": [ + "typo3" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "TYPO3 command line binary", + "homepage": "https://typo3.org", + "support": { + "issues": "https://github.com/TYPO3/cms-cli/issues", + "source": "https://github.com/TYPO3/cms-cli/tree/3.1.1" + }, + "time": "2023-08-15T10:14:53+00:00" + }, + { + "name": "typo3/cms-composer-installers", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/CmsComposerInstallers.git", + "reference": "71356484e6ccadf45acdde6489823c7af925b144" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/CmsComposerInstallers/zipball/71356484e6ccadf45acdde6489823c7af925b144", + "reference": "71356484e6ccadf45acdde6489823c7af925b144", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1.0", + "php": "^8.1" + }, + "replace": { + "lw/typo3cms-installers": "*", + "netresearch/composer-installers": "*" + }, + "require-dev": { + "composer/composer": "^2.1", + "friendsofphp/php-cs-fixer": "^2.18", + "overtrue/phplint": "^2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "composer-plugin", + "extra": { + "class": "TYPO3\\CMS\\Composer\\Installer\\Plugin", + "branch-alias": { + "dev-main": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Composer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "TYPO3 CMS Installers", + "homepage": "https://github.com/TYPO3/CmsComposerInstallers", + "keywords": [ + "cms", + "core", + "extension", + "installer", + "typo3" + ], + "support": { + "general": "https://typo3.org/support/", + "issues": "https://github.com/TYPO3/CmsComposerInstallers/issues", + "source": "https://github.com/TYPO3/CmsComposerInstallers/tree/v5.0.0" + }, + "time": "2022-09-30T14:36:05+00:00" + }, + { + "name": "typo3/cms-core", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/core.git", + "reference": "5d9f3b7770ec3500adad7b5db04c9402664cb9ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/core/zipball/5d9f3b7770ec3500adad7b5db04c9402664cb9ed", + "reference": "5d9f3b7770ec3500adad7b5db04c9402664cb9ed", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0.7", + "christian-riesen/base32": "^1.6", + "composer-runtime-api": "^2.1", + "doctrine/annotations": "^1.13.3 || ^2.0", + "doctrine/dbal": "^3.8.1", + "doctrine/event-manager": "^2.0", + "doctrine/lexer": "^2.0 || ^3.0", + "egulias/email-validator": "^4.0", + "enshrined/svg-sanitize": "^0.15.4", + "ext-dom": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-pcre": "*", + "ext-pdo": "*", + "ext-session": "*", + "ext-tokenizer": "*", + "ext-xml": "*", + "firebase/php-jwt": "^6.4.0", + "guzzlehttp/guzzle": "^7.7.0", + "guzzlehttp/psr7": "^2.5.0", + "lolli42/finediff": "^1.0.2", + "masterminds/html5": "^2.7.6", + "php": "^8.1", + "psr/container": "^2.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "psr/http-server-handler": "^1.0", + "psr/http-server-middleware": "^1.0", + "psr/log": "^2.0 || ^3.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/console": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/event-dispatcher-contracts": "^3.1", + "symfony/expression-language": "^6.4 || ^7.0", + "symfony/filesystem": "^6.4 || ^7.0", + "symfony/finder": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0", + "symfony/mailer": "^6.4 || ^7.0", + "symfony/messenger": "^6.4 || ^7.0", + "symfony/mime": "^6.4 || ^7.0", + "symfony/options-resolver": "^6.4 || ^7.0", + "symfony/rate-limiter": "^6.4 || ^7.0", + "symfony/routing": "^6.4 || ^7.0", + "symfony/uid": "^6.4 || ^7.0", + "symfony/yaml": "^6.4 || ^7.0", + "typo3/class-alias-loader": "^1.1.4", + "typo3/cms-cli": "^3.1", + "typo3/cms-composer-installers": "^5.0", + "typo3/html-sanitizer": "^2.1.4", + "typo3fluid/fluid": "^2.9.2" + }, + "conflict": { + "hoa/core": "*", + "typo3/cms": "*" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "replace": { + "typo3/cms-lang": "self.version", + "typo3/cms-saltedpasswords": "self.version", + "typo3/cms-sv": "self.version" + }, + "suggest": { + "ext-apcu": "Needed when non-default APCU based cache backends are used", + "ext-fileinfo": "Used for proper file type detection in the file abstraction layer", + "ext-gd": "GDlib/Freetype is required for building images with text (GIFBUILDER) and can also be used to scale images", + "ext-mysqli": "", + "ext-openssl": "OpenSSL is required for sending SMTP mails over an encrypted channel endpoint", + "ext-zip": "", + "ext-zlib": "TYPO3 uses zlib for amongst others output compression and un/packing t3x extension files" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Core\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "core" + } + }, + "autoload": { + "files": [ + "Resources/PHP/GlobalDebugFunctions.php" + ], + "psr-4": { + "TYPO3\\CMS\\Core\\": "Classes/" + }, + "classmap": [ + "Resources/PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Core", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/cms-extbase", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/extbase.git", + "reference": "7a6a784fbdc959bdddbd9bae18a4d42b41be6152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/extbase/zipball/7a6a784fbdc959bdddbd9bae18a4d42b41be6152", + "reference": "7a6a784fbdc959bdddbd9bae18a4d42b41be6152", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5 || ^2.0", + "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/type-resolver": "^1.7.1", + "symfony/dependency-injection": "^6.4 || ^7.0", + "symfony/property-access": "^6.4 || ^7.0", + "symfony/property-info": "^6.4 || ^7.0", + "typo3/cms-core": "12.4.11" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-scheduler": "Additional scheduler tasks" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Extbase\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "extbase" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Extbase\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Extbase - Extension framework to create TYPO3 frontend plugins and TYPO3 backend modules.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/cms-fluid", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/fluid.git", + "reference": "1507cac779b3d7dd49a84349b1d115206a7f25da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/fluid/zipball/1507cac779b3d7dd49a84349b1d115206a7f25da", + "reference": "1507cac779b3d7dd49a84349b1d115206a7f25da", + "shasum": "" + }, + "require": { + "symfony/dependency-injection": "^6.4 || ^7.0", + "typo3/cms-core": "12.4.11", + "typo3/cms-extbase": "12.4.11", + "typo3fluid/fluid": "^2.9.2" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Fluid\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "fluid" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Fluid\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Fluid Integration - Integration of the Fluid templating engine into TYPO3.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org/other/typo3/view-helper-reference/main/en-us/", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/html-sanitizer", + "version": "v2.1.4", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/html-sanitizer.git", + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/html-sanitizer/zipball/b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "reference": "b8f90717251d968c49dc77f8c1e5912e2fbe0dff", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "masterminds/html5": "^2.7.6", + "php": "^7.2 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\HtmlSanitizer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Hader", + "email": "oliver@typo3.org" + } + ], + "description": "HTML sanitizer aiming to provide XSS-safe markup based on explicitly allowed tags, attributes and values.", + "support": { + "issues": "https://github.com/TYPO3/html-sanitizer/issues", + "source": "https://github.com/TYPO3/html-sanitizer/tree/v2.1.4" + }, + "time": "2023-11-14T07:41:08+00:00" + }, + { + "name": "typo3fluid/fluid", + "version": "2.10.1", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/Fluid.git", + "reference": "567a16691beedbcbefa5c12f35c5e71661cfbf53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/Fluid/zipball/567a16691beedbcbefa5c12f35c5e71661cfbf53", + "reference": "567a16691beedbcbefa5c12f35c5e71661cfbf53", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.1" + }, + "require-dev": { + "ext-json": "*", + "friendsofphp/php-cs-fixer": "^3.37.1", + "phpstan/phpstan": "^1.10.14", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpunit/phpunit": "^10.2.6" + }, + "suggest": { + "ext-json": "PHP JSON is needed when using JSONVariableProvider: A relatively rare use case" + }, + "bin": [ + "bin/fluid" + ], + "type": "library", + "autoload": { + "psr-4": { + "TYPO3Fluid\\Fluid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "description": "The TYPO3 Fluid template rendering engine", + "homepage": "https://github.com/TYPO3/Fluid", + "support": { + "docs": "https://docs.typo3.org/other/typo3fluid/fluid/main/en-us/", + "issues": "https://github.com/TYPO3/Fluid/issues", + "source": "https://github.com/TYPO3/Fluid" + }, + "time": "2023-12-11T13:07:39+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "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.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "packages-dev": [ + { + "name": "armin/editorconfig-cli", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/a-r-m-i-n/editorconfig-cli.git", + "reference": "c15a733467c2540bd7d4bc054d05c64c80b0b39c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/a-r-m-i-n/editorconfig-cli/zipball/c15a733467c2540bd7d4bc054d05c64c80b0b39c", + "reference": "c15a733467c2540bd7d4bc054d05c64c80b0b39c", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "ext-json": "*", + "idiosyncratic/editorconfig": "^0.1.1", + "php": "^7.4 || ^8.0", + "symfony/console": "^4 || ^5 || ^6", + "symfony/finder": "^4.4 || ^5 || ^6", + "symfony/mime": "^4 || ^5 || ^6" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "3.4.0", + "jangregor/phpstan-prophecy": "1.0.0", + "phpstan/phpstan": "1.4.0", + "phpunit/phpunit": "^9.6.8 || ^10.1", + "seld/phar-utils": "^1.1" + }, + "bin": [ + "bin/ec" + ], + "type": "library", + "autoload": { + "psr-4": { + "Armin\\EditorconfigCli\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Armin Vieweg", + "email": "info@v.ieweg.de", + "homepage": "https://v.ieweg.de" + } + ], + "description": "EditorConfigCLI is a free CLI tool (written in PHP) to validate and auto-fix text files based on given .editorconfig declarations.", + "homepage": "https://github.com/a-r-m-i-n/editorconfig-cli", + "support": { + "issues": "https://github.com/a-r-m-i-n/editorconfig-cli/issues", + "source": "https://github.com/a-r-m-i-n/editorconfig-cli" + }, + "time": "2023-12-28T15:51:57+00:00" + }, + { + "name": "bnf/phpstan-psr-container", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/bnf/phpstan-psr-container.git", + "reference": "38242e71616aa677a0fdd08af8edc4a730a24f67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bnf/phpstan-psr-container/zipball/38242e71616aa677a0fdd08af8edc4a730a24f67", + "reference": "38242e71616aa677a0fdd08af8edc4a730a24f67", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0", + "phpstan/phpstan": "^1.0", + "psr/container": "^1.0|^2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Bnf\\PhpstanPsrContainer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Benjamin Franzke", + "email": "benjaminfranzke@gmail.com", + "homepage": "https://bnfr.net", + "role": "Developer" + } + ], + "description": "PHPStan dynamic return type extension for PSR-11 ContainerInterface", + "keywords": [ + "PHPStan", + "PSR-11", + "service-provider", + "static" + ], + "support": { + "issues": "https://github.com/bnf/phpstan-psr-container/issues", + "source": "https://github.com/bnf/phpstan-psr-container/tree/1.0.1" + }, + "time": "2022-04-26T04:03:19+00:00" + }, + { + "name": "composer/pcre", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.3", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.1.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-10-11T07:11:09+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/35e8d0af4486141bc745f23a29cc2091eb624a32", + "reference": "35e8d0af4486141bc745f23a29cc2091eb624a32", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-08-31T09:50:34+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "ced299686f41dce890debac69273b47ffe98a40c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", + "reference": "ced299686f41dce890debac69273b47ffe98a40c", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2022-02-25T21:32:43+00:00" + }, + { + "name": "ergebnis/composer-normalize", + "version": "2.42.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/composer-normalize.git", + "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/composer-normalize/zipball/02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", + "reference": "02cf2b69ad2a74c6f11a8c3f5f054b8f949df910", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0.0", + "ergebnis/json": "^1.2.0", + "ergebnis/json-normalizer": "^4.5.0", + "ergebnis/json-printer": "^3.5.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "localheinz/diff": "^1.1.1", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "composer/composer": "^2.6.6", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "symfony/filesystem": "^5.4.25", + "vimeo/psalm": "^5.20.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Ergebnis\\Composer\\Normalize\\NormalizePlugin", + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + }, + "plugin-optional": true + }, + "autoload": { + "psr-4": { + "Ergebnis\\Composer\\Normalize\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a composer plugin for normalizing composer.json.", + "homepage": "https://github.com/ergebnis/composer-normalize", + "keywords": [ + "composer", + "normalize", + "normalizer", + "plugin" + ], + "support": { + "issues": "https://github.com/ergebnis/composer-normalize/issues", + "security": "https://github.com/ergebnis/composer-normalize/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/composer-normalize" + }, + "time": "2024-01-30T11:54:02+00:00" + }, + { + "name": "ergebnis/json", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json.git", + "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json/zipball/a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "reference": "a457f25a5ba7ea11fc94f84d53678c5211abfce0", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a Json value object for representing a valid JSON string.", + "homepage": "https://github.com/ergebnis/json", + "keywords": [ + "json" + ], + "support": { + "issues": "https://github.com/ergebnis/json/issues", + "security": "https://github.com/ergebnis/json/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json" + }, + "time": "2024-01-29T15:09:24+00:00" + }, + { + "name": "ergebnis/json-normalizer", + "version": "4.5.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-normalizer.git", + "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-normalizer/zipball/f0ee9e70739f121b27fac8b743e4a52b23de2152", + "reference": "f0ee9e70739f121b27fac8b743e4a52b23de2152", + "shasum": "" + }, + "require": { + "ergebnis/json": "^1.2.0", + "ergebnis/json-pointer": "^3.4.0", + "ergebnis/json-printer": "^3.5.0", + "ergebnis/json-schema-validator": "^4.2.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "composer/semver": "^3.4.0", + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.4", + "vimeo/psalm": "^5.20.0" + }, + "suggest": { + "composer/semver": "If you want to use ComposerJsonNormalizer or VersionConstraintNormalizer" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Normalizer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides generic and vendor-specific normalizers for normalizing JSON documents.", + "homepage": "https://github.com/ergebnis/json-normalizer", + "keywords": [ + "json", + "normalizer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-normalizer/issues", + "security": "https://github.com/ergebnis/json-normalizer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-normalizer" + }, + "time": "2024-01-30T09:10:15+00:00" + }, + { + "name": "ergebnis/json-pointer", + "version": "3.4.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-pointer.git", + "reference": "b654757d873050622c2166f55ab25d04685261c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-pointer/zipball/b654757d873050622c2166f55ab25d04685261c5", + "reference": "b654757d873050622c2166f55ab25d04685261c5", + "shasum": "" + }, + "require": { + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Pointer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides an abstraction of a JSON pointer.", + "homepage": "https://github.com/ergebnis/json-pointer", + "keywords": [ + "RFC6901", + "json", + "pointer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-pointer/issues", + "security": "https://github.com/ergebnis/json-pointer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-pointer" + }, + "time": "2024-01-29T16:37:15+00:00" + }, + { + "name": "ergebnis/json-printer", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-printer.git", + "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-printer/zipball/549e16fe6de34b8c3aee7b421be12caa552f3ced", + "reference": "549e16fe6de34b8c3aee7b421be12caa552f3ced", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ergebnis\\Json\\Printer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a JSON printer, allowing for flexible indentation.", + "homepage": "https://github.com/ergebnis/json-printer", + "keywords": [ + "formatter", + "json", + "printer" + ], + "support": { + "issues": "https://github.com/ergebnis/json-printer/issues", + "security": "https://github.com/ergebnis/json-printer/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-printer" + }, + "time": "2024-01-29T15:33:37+00:00" + }, + { + "name": "ergebnis/json-schema-validator", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/ergebnis/json-schema-validator.git", + "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ergebnis/json-schema-validator/zipball/10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "reference": "10ed514fdc3f9b71f8a92c567afea21a2f6fa1ef", + "shasum": "" + }, + "require": { + "ergebnis/json": "^1.2.0", + "ergebnis/json-pointer": "^3.4.0", + "ext-json": "*", + "justinrainbow/json-schema": "^5.2.12", + "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "require-dev": { + "ergebnis/data-provider": "^3.2.0", + "ergebnis/license": "^2.4.0", + "ergebnis/php-cs-fixer-config": "^6.20.0", + "ergebnis/phpunit-slow-test-detector": "^2.9.0", + "fakerphp/faker": "^1.23.1", + "infection/infection": "~0.26.6", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "~0.18.4", + "rector/rector": "~0.19.2", + "vimeo/psalm": "^5.20.0" + }, + "type": "library", + "extra": { + "composer-normalize": { + "indent-size": 2, + "indent-style": "space" + } + }, + "autoload": { + "psr-4": { + "Ergebnis\\Json\\SchemaValidator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Andreas Möller", + "email": "am@localheinz.com", + "homepage": "https://localheinz.com" + } + ], + "description": "Provides a JSON schema validator, building on top of justinrainbow/json-schema.", + "homepage": "https://github.com/ergebnis/json-schema-validator", + "keywords": [ + "json", + "schema", + "validator" + ], + "support": { + "issues": "https://github.com/ergebnis/json-schema-validator/issues", + "security": "https://github.com/ergebnis/json-schema-validator/blob/main/.github/SECURITY.md", + "source": "https://github.com/ergebnis/json-schema-validator" + }, + "time": "2024-01-29T16:50:15+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.51.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/127fa74f010da99053e3f5b62672615b72dd6efd", + "reference": "127fa74f010da99053e3f5b62672615b72dd6efd", + "shasum": "" + }, + "require": { + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3 || ^2.0", + "justinrainbow/json-schema": "^5.2", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.11", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.4", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.4", + "phpunit/phpunit": "^9.6 || ^10.5.5 || ^11.0.2", + "symfony/var-dumper": "^5.4 || ^6.0 || ^7.0", + "symfony/yaml": "^5.4 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.51.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-02-28T19:50:06+00:00" + }, + { + "name": "idiosyncratic/editorconfig", + "version": "0.1.3", + "source": { + "type": "git", + "url": "https://github.com/idiosyncratic-code/editorconfig-php.git", + "reference": "3445fa4a1e00f95630d4edc729c2effb116db19b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/idiosyncratic-code/editorconfig-php/zipball/3445fa4a1e00f95630d4edc729c2effb116db19b", + "reference": "3445fa4a1e00f95630d4edc729c2effb116db19b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "idiosyncratic/coding-standard": "^2.0", + "php-parallel-lint/php-console-highlighter": "^0.5", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phploc/phploc": "^7.0", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^9.5", + "sebastian/phpcpd": "^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Idiosyncratic\\EditorConfig\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Jason Silkey", + "email": "jason@jasonsilkey.com" + } + ], + "description": "PHP implementation of EditorConfig", + "support": { + "issues": "https://github.com/idiosyncratic-code/editorconfig-php/issues", + "source": "https://github.com/idiosyncratic-code/editorconfig-php/tree/0.1.3" + }, + "time": "2021-06-02T16:24:34+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "v5.2.13", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793", + "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793", + "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/v5.2.13" + }, + "time": "2023-09-26T02:20:38+00:00" + }, + { + "name": "localheinz/diff", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/localheinz/diff.git", + "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/localheinz/diff/zipball/851bb20ea8358c86f677f5f111c4ab031b1c764c", + "reference": "851bb20ea8358c86f677f5f111c4ab031b1c764c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^7.5 || ^8.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "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": "Fork of sebastian/diff for use with ergebnis/composer-normalize", + "homepage": "https://github.com/localheinz/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "source": "https://github.com/localheinz/diff/tree/main" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-07-06T04:49:32+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", + "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.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2023-03-08T13:26:56+00:00" + }, + { + "name": "nette/utils", + "version": "v4.0.4", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "reference": "d3ad0aa3b9f934602cb3e3902ebccf10be34d218", + "shasum": "" + }, + "require": { + "php": ">=8.0 <8.4" + }, + "conflict": { + "nette/finder": "<3", + "nette/schema": "<1.2.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "dev-master", + "nette/tester": "^2.5", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.9" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v4.0.4" + }, + "time": "2024-01-17T16:50:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "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.18.0" + }, + "time": "2023-12-10T21:03:43+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": "phpstan/extension-installer", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/extension-installer.git", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/extension-installer/zipball/f45734bfb9984c6c56c4486b71230355f066a58a", + "reference": "f45734bfb9984c6c56c4486b71230355f066a58a", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.9.0" + }, + "require-dev": { + "composer/composer": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2.0", + "phpstan/phpstan-strict-rules": "^0.11 || ^0.12 || ^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPStan\\ExtensionInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPStan\\ExtensionInstaller\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Composer plugin for automatic installation of PHPStan extensions", + "support": { + "issues": "https://github.com/phpstan/extension-installer/issues", + "source": "https://github.com/phpstan/extension-installer/tree/1.3.1" + }, + "time": "2023-05-24T08:59:17+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.10.59", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "e607609388d3a6d418a50a49f7940e8086798281" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e607609388d3a6d418a50a49f7940e8086798281", + "reference": "e607609388d3a6d418a50a49f7940e8086798281", + "shasum": "" + }, + "require": { + "php": "^7.2|^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", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2024-02-20T13:59:13+00:00" + }, + { + "name": "phpstan/phpstan-phpunit", + "version": "1.3.16", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-phpunit.git", + "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/d5242a59d035e46774f2e634b374bc39ff62cb95", + "reference": "d5242a59d035e46774f2e634b374bc39ff62cb95", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10" + }, + "conflict": { + "phpunit/phpunit": "<7.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^9.5" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPUnit extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-phpunit/issues", + "source": "https://github.com/phpstan/phpstan-phpunit/tree/1.3.16" + }, + "time": "2024-02-23T09:51:20+00:00" + }, + { + "name": "phpstan/phpstan-symfony", + "version": "1.3.7", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan-symfony.git", + "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/ef7db637be9b85fa00278fc3477ac66abe8eb7d1", + "reference": "ef7db637be9b85fa00278fc3477ac66abe8eb7d1", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^1.10.36" + }, + "conflict": { + "symfony/framework-bundle": "<3.0" + }, + "require-dev": { + "nikic/php-parser": "^4.13.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/phpstan-phpunit": "^1.3.11", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^8.5.29 || ^9.5", + "psr/container": "1.0 || 1.1.1", + "symfony/config": "^5.4 || ^6.1", + "symfony/console": "^5.4 || ^6.1", + "symfony/dependency-injection": "^5.4 || ^6.1", + "symfony/form": "^5.4 || ^6.1", + "symfony/framework-bundle": "^5.4 || ^6.1", + "symfony/http-foundation": "^5.4 || ^6.1", + "symfony/messenger": "^5.4", + "symfony/polyfill-php80": "^1.24", + "symfony/serializer": "^5.4", + "symfony/service-contracts": "^2.2.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon", + "rules.neon" + ] + } + }, + "autoload": { + "psr-4": { + "PHPStan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukáš Unger", + "email": "looky.msc@gmail.com", + "homepage": "https://lookyman.net" + } + ], + "description": "Symfony Framework extensions and rules for PHPStan", + "support": { + "issues": "https://github.com/phpstan/phpstan-symfony/issues", + "source": "https://github.com/phpstan/phpstan-symfony/tree/1.3.7" + }, + "time": "2024-01-10T21:54:42+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "10.1.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/78c3b7625965c2513ee96569a4dbb62601784145", + "reference": "78c3b7625965c2513ee96569a4dbb62601784145", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-text-template": "^3.0", + "sebastian/code-unit-reverse-lookup": "^3.0", + "sebastian/complexity": "^3.0", + "sebastian/environment": "^6.0", + "sebastian/lines-of-code": "^2.0", + "sebastian/version": "^4.0", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.1" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.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": "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", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.11" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T15:38:30+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", + "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T06:24:48+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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": "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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:56:09+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-31T14:07:24+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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/6.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:57:52+00:00" + }, + { + "name": "phpunit/phpcov", + "version": "9.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpcov.git", + "reference": "05307478b8f4b2a50c508d6f4eca15704cf7c1fd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpcov/zipball/05307478b8f4b2a50c508d6f4eca15704cf7c1fd", + "reference": "05307478b8f4b2a50c508d6f4eca15704cf7c1fd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/phpunit": "^10.0", + "sebastian/cli-parser": "^2.0", + "sebastian/diff": "^5.0", + "sebastian/version": "^4.0" + }, + "bin": [ + "phpcov" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.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": "CLI frontend for php-code-coverage", + "homepage": "https://github.com/sebastianbergmann/phpcov", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcov/issues", + "source": "https://github.com/sebastianbergmann/phpcov/tree/9.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-12T14:47:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "10.5.11", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "reference": "0d968f6323deb3dbfeba5bfd4929b9415eb7a9a4", + "shasum": "" + }, + "require": { + "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": ">=8.1", + "phpunit/php-code-coverage": "^10.1.5", + "phpunit/php-file-iterator": "^4.0", + "phpunit/php-invoker": "^4.0", + "phpunit/php-text-template": "^3.0", + "phpunit/php-timer": "^6.0", + "sebastian/cli-parser": "^2.0", + "sebastian/code-unit": "^2.0", + "sebastian/comparator": "^5.0", + "sebastian/diff": "^5.0", + "sebastian/environment": "^6.0", + "sebastian/exporter": "^5.1", + "sebastian/global-state": "^6.0.1", + "sebastian/object-enumerator": "^5.0", + "sebastian/recursion-context": "^5.0", + "sebastian/type": "^4.0", + "sebastian/version": "^4.0" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "10.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", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.11" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-02-25T14:05:00+00:00" + }, + { + "name": "rector/rector", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "258b775511e62a7188f8ce114d44acaf244d9a7d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/258b775511e62a7188f8ce114d44acaf244d9a7d", + "reference": "258b775511e62a7188f8ce114d44acaf244d9a7d", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.10.57" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-02-16T07:53:23+00:00" + }, + { + "name": "saschaegerer/phpstan-typo3", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/sascha-egerer/phpstan-typo3.git", + "reference": "0cecc8fc6c4de39e42cc92a0676a66a5ae867312" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sascha-egerer/phpstan-typo3/zipball/0cecc8fc6c4de39e42cc92a0676a66a5ae867312", + "reference": "0cecc8fc6c4de39e42cc92a0676a66a5ae867312", + "shasum": "" + }, + "require": { + "bnf/phpstan-psr-container": "^1.0", + "composer/semver": "^3.3", + "nikic/php-parser": "^4.15.1", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^1.10.9", + "typo3/cms-core": "^10.4 || ^11.5 || ^12.4 || ^13.0", + "typo3/cms-extbase": "^10.4 || ^11.5 || ^12.4 || ^13.0" + }, + "require-dev": { + "consistence-community/coding-standard": "^3.11.1", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.2", + "phing/phing": "^2.17.4", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpstan/phpstan-strict-rules": "^1.5.1", + "phpunit/phpunit": "^9.6.16", + "slevomat/coding-standard": "^7.2.1", + "symfony/polyfill-php80": "^1.28.0" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "SaschaEgerer\\PhpstanTypo3\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "TYPO3 CMS class reflection extension for PHPStan", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/sascha-egerer/phpstan-typo3/issues", + "source": "https://github.com/sascha-egerer/phpstan-typo3/tree/1.10.0" + }, + "funding": [ + { + "url": "https://github.com/sascha-egerer", + "type": "github" + }, + { + "url": "https://liberapay.com/sascha.egerer", + "type": "liberapay" + } + ], + "time": "2024-01-30T12:31:53+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae", + "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:15+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", + "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:58:43+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:59:15+00:00" + }, + { + "name": "sebastian/comparator", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", + "reference": "2db5010a484d53ebf536087a70b4a5423c102372", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/diff": "^5.0", + "sebastian/exporter": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.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", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-08-14T13:18:12+00:00" + }, + { + "name": "sebastian/complexity", + "version": "3.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "68ff824baeae169ec9f2137158ee529584553799" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", + "reference": "68ff824baeae169ec9f2137158ee529584553799", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.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 for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:37:17+00:00" + }, + { + "name": "sebastian/diff", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "reference": "fbf413a49e54f6b9b17e12d900ac7f6101591b7f", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-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", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T10:55:06+00:00" + }, + { + "name": "sebastian/environment", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", + "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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 functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-04-11T05:39:26+00:00" + }, + { + "name": "sebastian/exporter", + "version": "5.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "reference": "64f51654862e0f5e318db7e9dcc2292c63cdbddc", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.1", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-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", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-09-24T13:22:09+00:00" + }, + { + "name": "sebastian/global-state", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.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", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-07-19T07:19:23+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", + "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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 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", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-21T08:38:20+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", + "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "sebastian/object-reflector": "^3.0", + "sebastian/recursion-context": "^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:08:32+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", + "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "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": "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/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:06:18+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", + "reference": "05909fb5bc7df4c52992396d0116aed689f93712", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.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": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:05:40+00:00" + }, + { + "name": "sebastian/type", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", + "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "phpunit/phpunit": "^10.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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/4.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T07:10:45+00:00" + }, + { + "name": "sebastian/version", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.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/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-07T11:34:05+00:00" + }, + { + "name": "ssch/typo3-rector", + "version": "v2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sabbelasichon/typo3-rector.git", + "reference": "bb3f8a1d567cd033a0ce4862b4d7eb51b2a4801d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabbelasichon/typo3-rector/zipball/bb3f8a1d567cd033a0ce4862b4d7eb51b2a4801d", + "reference": "bb3f8a1d567cd033a0ce4862b4d7eb51b2a4801d", + "shasum": "" + }, + "require": { + "nette/utils": "^3.2.10 || ^4.0.4", + "nikic/php-parser": "^4.18.0", + "php": "^7.4 || ^8.0", + "phpstan/phpstan": "^1.10.56", + "rector/rector": "^1.0", + "symfony/console": "^5.4 || ^6.4 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.4 || ^7.0", + "symfony/finder": "^5.4 || ^6.4 || ^7.0", + "symfony/polyfill-php80": "^1.28.0", + "symfony/polyfill-php81": "^1.28.0", + "symfony/string": "^5.4 || ^6.4 || ^7.0", + "symfony/yaml": "^5.4 || ^6.4 || ^7.0", + "webmozart/assert": "^1.11.0" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.28", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpstan/extension-installer": "^1.3.1", + "phpstan/phpstan-deprecation-rules": "^1.1", + "phpstan/phpstan-phpunit": "^1.3.15", + "phpunit/phpunit": "^9.6.16 || ^10.0", + "symfony/config": "^5.0 || ^6.0 || ^7.0", + "symfony/dependency-injection": "^5.4.34 || ^6.4.2 || ^7.0.2", + "symfony/http-kernel": "^5.4.34 || ^6.4.2 || ^7.0.2", + "symplify/easy-coding-standard": "^12.1.8" + }, + "suggest": { + "ssch/typo3-debug-dump-pass": "^0.0.1" + }, + "bin": [ + "bin/typo3-init" + ], + "type": "rector-extension", + "extra": { + "branch-alias": { + "dev-main": "2.0-dev" + }, + "rector": { + "includes": [ + "config/config.php" + ] + } + }, + "autoload": { + "psr-4": { + "Ssch\\TYPO3Rector\\": [ + "src", + "rules" + ], + "Ssch\\TYPO3Rector\\PHPStan\\": "utils/phpstan/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Sebastian Schreiber", + "email": "breakpoint@schreibersebastian.de" + }, + { + "name": "Henrik Elsner" + }, + { + "name": "Simon Schaufelberger" + } + ], + "description": "Instant fixes for your TYPO3 code by using Rector.", + "homepage": "https://packagist.org/packages/ssch/typo3-rector", + "keywords": [ + "dev" + ], + "support": { + "chat": "https://typo3.slack.com/archives/C019R5LAA6A", + "docs": "https://github.com/sabbelasichon/typo3-rector/tree/main/docs", + "issues": "https://github.com/sabbelasichon/typo3-rector/issues", + "source": "https://github.com/sabbelasichon/typo3-rector" + }, + "funding": [ + { + "url": "https://paypal.me/schreiberten", + "type": "custom" + }, + { + "url": "https://github.com/sabbelasichon", + "type": "github" + } + ], + "time": "2024-02-26T13:04:24+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.29.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d", + "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "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 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.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": "2024-01-29T20:11:03+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "710e27879e9be3395de2b98da3f52a946039f297" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/710e27879e9be3395de2b98da3f52a946039f297", + "reference": "710e27879e9be3395de2b98da3f52a946039f297", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "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/v6.4.4" + }, + "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": "2024-02-20T12:31:00+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/416596166641f1f728b0a64f5b9dd07cceb410c1", + "reference": "416596166641f1f728b0a64f5b9dd07cceb410c1", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "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": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.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": "2024-01-23T14:35:58+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "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.2" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2023-11-20T00:12:19+00:00" + }, + { + "name": "typo3/cms-frontend", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/frontend.git", + "reference": "defbe57b5f91c4b2f9602b44b257582b1d78ebd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/frontend/zipball/defbe57b5f91c4b2f9602b44b257582b1d78ebd0", + "reference": "defbe57b5f91c4b2f9602b44b257582b1d78ebd0", + "shasum": "" + }, + "require": { + "ext-libxml": "*", + "typo3/cms-core": "12.4.11" + }, + "conflict": { + "typo3/cms": "*" + }, + "suggest": { + "typo3/cms-adminpanel": "Provides additional information and functionality for backend users in the frontend." + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Frontend\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "frontend" + }, + "typo3/class-alias-loader": { + "class-alias-maps": [ + "Migrations/Code/ClassAliasMap.php" + ] + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Frontend\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Frontend", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/cms-install", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/install.git", + "reference": "251e30d160e3e679114699281b8debc986d09efe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/install/zipball/251e30d160e3e679114699281b8debc986d09efe", + "reference": "251e30d160e3e679114699281b8debc986d09efe", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^3.8.1", + "guzzlehttp/promises": "^1.5.2 || ^2.0", + "nikic/php-parser": "^4.15.4", + "symfony/finder": "^6.4 || ^7.0", + "symfony/http-foundation": "^6.4 || ^7.0", + "typo3/cms-core": "12.4.11", + "typo3/cms-extbase": "12.4.11", + "typo3/cms-fluid": "12.4.11" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "serviceProvider": "TYPO3\\CMS\\Install\\ServiceProvider", + "protected": true, + "partOfFactoryDefault": true, + "partOfMinimalUsableSystem": true + }, + "extension-key": "install" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Install\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Install Tool - The Install Tool is used for installation, upgrade, system administration and setup tasks.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/cms-lowlevel", + "version": "v12.4.11", + "source": { + "type": "git", + "url": "https://github.com/TYPO3-CMS/lowlevel.git", + "reference": "0841b6e0d2b81c27be86503553de8f038916f5de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3-CMS/lowlevel/zipball/0841b6e0d2b81c27be86503553de8f038916f5de", + "reference": "0841b6e0d2b81c27be86503553de8f038916f5de", + "shasum": "" + }, + "require": { + "typo3/cms-core": "12.4.11" + }, + "conflict": { + "typo3/cms": "*" + }, + "type": "typo3-cms-framework", + "extra": { + "branch-alias": { + "dev-main": "12.4.x-dev" + }, + "typo3/cms": { + "Package": { + "partOfFactoryDefault": true + }, + "extension-key": "lowlevel" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CMS\\Lowlevel\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 Core Team", + "email": "typo3cms@typo3.org", + "role": "Developer" + } + ], + "description": "TYPO3 CMS Lowlevel - Technical analysis of the system. This includes raw database search, checking relations, counting pages and records etc.", + "homepage": "https://typo3.org", + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://forge.typo3.org", + "source": "https://github.com/typo3/typo3" + }, + "time": "2024-02-13T09:54:21+00:00" + }, + { + "name": "typo3/coding-standards", + "version": "v0.7.1", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/coding-standards.git", + "reference": "b53fc46dc3fc997f98c96bc630d24c1e12028646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/coding-standards/zipball/b53fc46dc3fc997f98c96bc630d24c1e12028646", + "reference": "b53fc46dc3fc997f98c96bc630d24c1e12028646", + "shasum": "" + }, + "require": { + "ext-json": "*", + "friendsofphp/php-cs-fixer": "^3.11", + "php": "^8.0", + "symfony/console": "^4.4.30 || ^5.3.7 || ^6.0", + "symfony/filesystem": "^4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11.99.4", + "ergebnis/composer-normalize": "*", + "keradus/cli-executor": "^1.5", + "maglnet/composer-require-checker": "*", + "nikic/php-parser": "^4.13.1", + "overtrue/phplint": "^3.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-symfony": "^1.0", + "phpunit/phpunit": "^9.5.18", + "symfony/finder": ">=4.4", + "symfony/process": ">=4.4" + }, + "bin": [ + "t3-cs", + "typo3-coding-standards" + ], + "type": "coding-standards", + "extra": { + "branch-alias": { + "dev-main": "0.7.x-dev" + } + }, + "autoload": { + "psr-4": { + "TYPO3\\CodingStandards\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Benni Mack", + "email": "benni@typo3.org" + }, + { + "name": "Simon Gilli", + "email": "simon.gilli@typo3.org" + } + ], + "description": "A set of coding guidelines for any TYPO3-related project or extension", + "homepage": "https://typo3.org/", + "keywords": [ + "Code style", + "cms", + "editorconfig", + "php-cs-fixer", + "typo3" + ], + "support": { + "chat": "https://typo3.org/help", + "docs": "https://docs.typo3.org", + "issues": "https://github.com/TYPO3/coding-standards/issues", + "source": "https://github.com/TYPO3/coding-standards" + }, + "time": "2022-12-20T16:02:01+00:00" + }, + { + "name": "typo3/testing-framework", + "version": "8.0.9", + "source": { + "type": "git", + "url": "https://github.com/TYPO3/testing-framework.git", + "reference": "7f4a539b3ad90b935741fe4d260561de4595de0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/testing-framework/zipball/7f4a539b3ad90b935741fe4d260561de4595de0b", + "reference": "7f4a539b3ad90b935741fe4d260561de4595de0b", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^2.5.0", + "php": "^8.1", + "phpunit/phpunit": "^10.1", + "psr/container": "^1.1.0 || ^2.0.0", + "typo3/cms-backend": "12.*.*@dev || 13.*.*@dev", + "typo3/cms-core": "12.*.*@dev || 13.*.*@dev", + "typo3/cms-extbase": "12.*.*@dev || 13.*.*@dev", + "typo3/cms-fluid": "12.*.*@dev || 13.*.*@dev", + "typo3/cms-frontend": "12.*.*@dev || 13.*.*@dev", + "typo3/cms-install": "12.*.*@dev || 13.*.*@dev" + }, + "replace": { + "sbuerk/typo3-cmscomposerinstallers-testingframework-bridge": "*" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.37.1", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-phpunit": "^1.1.1", + "typo3/cms-workspaces": "12.*.*@dev || 13.*.*@dev" + }, + "type": "library", + "autoload": { + "psr-4": { + "TYPO3\\JsonResponse\\": "Resources/Core/Functional/Extensions/json_response/Classes/", + "TYPO3\\PrivateContainer\\": "Resources/Core/Functional/Extensions/private_container/Classes/", + "TYPO3\\TestingFramework\\": "Classes/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "TYPO3 CMS Core Team", + "homepage": "https://forge.typo3.org/projects/typo3cms-core", + "role": "Developer" + }, + { + "name": "The TYPO3 Community", + "homepage": "https://typo3.org/community/", + "role": "Contributor" + } + ], + "description": "The TYPO3 testing framework provides base classes for unit, functional and acceptance testing.", + "homepage": "https://typo3.org/", + "keywords": [ + "testing", + "tests", + "typo3" + ], + "support": { + "general": "https://typo3.org/support/", + "issues": "https://github.com/TYPO3/testing-framework/issues", + "source": "https://github.com/TYPO3/testing-framework/tree/8.0.9" + }, + "time": "2024-01-31T12:14:00+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "ext-mbstring": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/ext_emconf.php b/ext_emconf.php new file mode 100644 index 0000000..41b9cc4 --- /dev/null +++ b/ext_emconf.php @@ -0,0 +1,39 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** @noinspection PhpUndefinedVariableInspection */ +$EM_CONF[$_EXTKEY] = [ + 'title' => 'Mailqueue', + 'description' => 'Extension to improve TYPO3\'s mail spooler with additional components', + 'category' => 'be', + 'version' => '0.1.0', + 'state' => 'beta', + 'clearCacheOnLoad' => true, + 'author' => 'Elias Häußler', + 'author_email' => 'e.haeussler@familie-redlich.de', + 'author_company' => 'coding. powerful. systems. CPS GmbH', + 'constraints' => [ + 'depends' => [ + 'typo3' => '11.5.0-13.0.99', + 'php' => '8.1.0-8.3.99', + ], + ], +]; diff --git a/ext_localconf.php b/ext_localconf.php new file mode 100644 index 0000000..2116224 --- /dev/null +++ b/ext_localconf.php @@ -0,0 +1,24 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +\CPSIT\Typo3Mailqueue\Extension::registerXClasses(); diff --git a/ext_tables.php b/ext_tables.php new file mode 100644 index 0000000..8c255b8 --- /dev/null +++ b/ext_tables.php @@ -0,0 +1,24 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +\CPSIT\Typo3Mailqueue\Extension::registerBackendModules(); diff --git a/packaging_exclude.php b/packaging_exclude.php new file mode 100644 index 0000000..f2e5bcb --- /dev/null +++ b/packaging_exclude.php @@ -0,0 +1,55 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +return [ + 'directories' => [ + '.build', + '.git', + '.github', + 'bin', + 'build', + 'public', + 'tailor-version-upload', + 'tests', + 'vendor', + ], + 'files' => [ + 'DS_Store', + 'CODE_OF_CONDUCT.md', + 'codecov.yml', + 'composer.lock', + 'CONTRIBUTING.md', + 'crowdin.yaml', + 'editorconfig', + 'gitattributes', + 'gitignore', + 'packaging_exclude.php', + 'php-cs-fixer.php', + 'phpstan.neon', + 'phpstan-baseline.neon', + 'phpunit.functional.xml', + 'phpunit.unit.xml', + 'rector.php', + 'renovate.json', + ], +]; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon new file mode 100644 index 0000000..41cd111 --- /dev/null +++ b/phpstan-baseline.neon @@ -0,0 +1,6 @@ +parameters: + ignoreErrors: + - + message: "#^While loop condition is always true\\.$#" + count: 1 + path: Classes/Command/ListQueueCommand.php diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000..1f74bf1 --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,14 @@ +includes: + - .Build/vendor/phpstan/phpstan/conf/bleedingEdge.neon + - phpstan-baseline.neon +parameters: + level: max + paths: + - Classes + - Configuration + - Tests + featureToggles: + # Avoids errors with $GLOBALS['TYPO3_CONF_VARS'] access + explicitMixedForGlobalVariables: false + symfony: + consoleApplicationLoader: Tests/Build/console-application.php diff --git a/phpunit.functional.xml b/phpunit.functional.xml new file mode 100644 index 0000000..31c1a46 --- /dev/null +++ b/phpunit.functional.xml @@ -0,0 +1,26 @@ + + + + + Classes + + + + + + + + + + Tests/Functional + + + + + + diff --git a/phpunit.unit.xml b/phpunit.unit.xml new file mode 100644 index 0000000..ed45dc8 --- /dev/null +++ b/phpunit.unit.xml @@ -0,0 +1,26 @@ + + + + + Classes + + + + + + + + + + Tests/Unit + + + + + + diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..c98b631 --- /dev/null +++ b/rector.php @@ -0,0 +1,48 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +use Rector\Config\RectorConfig; +use Rector\Php74\Rector\LNumber\AddLiteralSeparatorToNumberRector; +use Rector\PostRector\Rector\NameImportingPostRector; +use Rector\Set\ValueObject\LevelSetList; +use Rector\ValueObject\PhpVersion; +use Ssch\TYPO3Rector\Set\Typo3LevelSetList; + +return static function (RectorConfig $rectorConfig): void { + $rectorConfig->paths([ + __DIR__ . '/Classes', + __DIR__ . '/Configuration', + ]); + + $rectorConfig->skip([ + AddLiteralSeparatorToNumberRector::class, + NameImportingPostRector::class, + ]); + + $rectorConfig->phpVersion(PhpVersion::PHP_81); + + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_81, + Typo3LevelSetList::UP_TO_TYPO3_11, + ]); +}; diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..2fcb363 --- /dev/null +++ b/renovate.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "local>CPS-IT/renovate-config", + "local>CPS-IT/renovate-config:typo3-extension" + ], + "assignees": [ + "eliashaeussler" + ], + "constraints": { + "php": "8.1.*" + } +}