From d36bce3e86a0978806e9baaad9dffeed8527ea13 Mon Sep 17 00:00:00 2001 From: AlexBa16 Date: Thu, 11 Jun 2026 21:44:19 +0200 Subject: [PATCH] init --- .dockerignore | 34 + .editorconfig | 22 + .env | 27 + .env.dev | 4 + .gitattributes | 17 + .gitignore | 10 + .idea/.gitignore | 10 + .idea/gym-tracker.iml | 70 + .idea/modules.xml | 8 + .idea/php.xml | 88 + .idea/vcs.xml | 6 + Dockerfile | 178 ++ LICENSE | 19 + README.md | 60 + bin/console | 21 + compose.override.yaml | 30 + compose.prod.yaml | 12 + compose.yaml | 41 + composer.json | 78 + composer.lock | 4723 ++++++++++++++++++++++++++++ config/bundles.php | 8 + config/packages/cache.yaml | 19 + config/packages/framework.yaml | 15 + config/packages/property_info.yaml | 3 + config/packages/routing.yaml | 10 + config/packages/security.yaml | 39 + config/packages/twig.yaml | 6 + config/preload.php | 5 + config/reference.php | 1176 +++++++ config/routes.yaml | 11 + config/routes/framework.yaml | 4 + config/routes/security.yaml | 3 + config/services.yaml | 23 + docs/agents.md | 162 + docs/alpine.md | 61 + docs/digitalocean-dns.png | Bin 0 -> 129432 bytes docs/digitalocean-droplet.png | Bin 0 -> 163083 bytes docs/existing-project.md | 81 + docs/extra-services.md | 25 + docs/makefile.md | 129 + docs/mysql.md | 107 + docs/options.md | 121 + docs/production.md | 140 + docs/tls.md | 88 + docs/troubleshooting.md | 53 + docs/updating.md | 19 + docs/xdebug.md | 98 + frankenphp/Caddyfile | 66 + frankenphp/conf.d/10-app.ini | 13 + frankenphp/conf.d/20-app.dev.ini | 5 + frankenphp/conf.d/20-app.prod.ini | 5 + frankenphp/docker-entrypoint.sh | 44 + public/index.php | 9 + src/Controller/.gitignore | 0 src/Kernel.php | 19 + symfony.lock | 116 + templates/base.html.twig | 23 + 57 files changed, 8164 insertions(+) create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .env create mode 100644 .env.dev create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/gym-tracker.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/vcs.xml create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100755 bin/console create mode 100644 compose.override.yaml create mode 100644 compose.prod.yaml create mode 100644 compose.yaml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 config/bundles.php create mode 100644 config/packages/cache.yaml create mode 100644 config/packages/framework.yaml create mode 100644 config/packages/property_info.yaml create mode 100644 config/packages/routing.yaml create mode 100644 config/packages/security.yaml create mode 100644 config/packages/twig.yaml create mode 100644 config/preload.php create mode 100644 config/reference.php create mode 100644 config/routes.yaml create mode 100644 config/routes/framework.yaml create mode 100644 config/routes/security.yaml create mode 100644 config/services.yaml create mode 100644 docs/agents.md create mode 100644 docs/alpine.md create mode 100644 docs/digitalocean-dns.png create mode 100644 docs/digitalocean-droplet.png create mode 100644 docs/existing-project.md create mode 100644 docs/extra-services.md create mode 100644 docs/makefile.md create mode 100644 docs/mysql.md create mode 100644 docs/options.md create mode 100644 docs/production.md create mode 100644 docs/tls.md create mode 100644 docs/troubleshooting.md create mode 100644 docs/updating.md create mode 100644 docs/xdebug.md create mode 100644 frankenphp/Caddyfile create mode 100644 frankenphp/conf.d/10-app.ini create mode 100644 frankenphp/conf.d/20-app.dev.ini create mode 100644 frankenphp/conf.d/20-app.prod.ini create mode 100755 frankenphp/docker-entrypoint.sh create mode 100644 public/index.php create mode 100644 src/Controller/.gitignore create mode 100644 src/Kernel.php create mode 100644 symfony.lock create mode 100644 templates/base.html.twig diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..dc5a875 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,34 @@ +**/*.log +**/*.md +**/*.php~ +**/*.dist.php +**/*.dist +**/*.cache +**/._* +**/.dockerignore +**/.DS_Store +**/.git/ +**/.gitattributes +**/.gitignore +**/.gitmodules +**/compose.*.yaml +**/compose.*.yml +**/compose.yaml +**/compose.yml +**/docker-compose.*.yaml +**/docker-compose.*.yml +**/docker-compose.yaml +**/docker-compose.yml +**/Dockerfile +**/Thumbs.db +.github/ +docs/ +public/bundles/ +tests/ +var/ +vendor/ +.editorconfig +.env.*.local +.env.local +.env.local.php +.env.test diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..130da9c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,22 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +charset = utf-8 +insert_final_newline = true +end_of_line = lf +indent_style = space +indent_size = 4 + +[**/{Dockerfile,Caddyfile,*.sh}] +indent_style = tab + +[{compose.*yaml,.devcontainer/compose.*yaml,.github/**/*.yaml}] +indent_size = 2 + +[**.md] +indent_size = unset +indent_style = unset diff --git a/.env b/.env new file mode 100644 index 0000000..9e19457 --- /dev/null +++ b/.env @@ -0,0 +1,27 @@ +# In all environments, the following files are loaded if they exist, +# the latter taking precedence over the former: +# +# * .env contains default values for the environment variables needed by the app +# * .env.local uncommitted file with local overrides +# * .env.$APP_ENV committed environment-specific defaults +# * .env.$APP_ENV.local uncommitted environment-specific overrides +# +# Real environment variables win over .env files. +# +# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES. +# https://symfony.com/doc/current/configuration/secrets.html +# +# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2). +# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration + +###> symfony/framework-bundle ### +APP_ENV=dev +APP_SECRET= +APP_SHARE_DIR=var/share +###< symfony/framework-bundle ### + +###> symfony/routing ### +# Configure how to generate URLs in non-HTTP contexts, such as CLI commands. +# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands +DEFAULT_URI=http://localhost +###< symfony/routing ### diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..9279e22 --- /dev/null +++ b/.env.dev @@ -0,0 +1,4 @@ + +###> symfony/framework-bundle ### +APP_SECRET=721f1c073aa9c56fd3c03089e7297bde +###< symfony/framework-bundle ### diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..642c91f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,17 @@ +* text=auto eol=lf + +*.conf text eol=lf +*.html text eol=lf +*.ini text eol=lf +*.js text eol=lf +*.json text eol=lf +*.md text eol=lf +*.php text eol=lf +*.sh text eol=lf +*.yaml text eol=lf +*.yml text eol=lf +bin/console text eol=lf +composer.lock text eol=lf merge=ours + +*.ico binary +*.png binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a67f91e --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..30cf57e --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/gym-tracker.iml b/.idea/gym-tracker.iml new file mode 100644 index 0000000..5fa94b4 --- /dev/null +++ b/.idea/gym-tracker.iml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..37267c0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..8cf92ef --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..392242b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,178 @@ +#syntax=docker/dockerfile:1 + +# Versions +FROM dunglas/frankenphp:1-php8.5 AS frankenphp_upstream + +# The different stages of this Dockerfile are meant to be built into separate images +# https://docs.docker.com/build/building/multi-stage/#stop-at-a-specific-build-stage +# https://docs.docker.com/reference/compose-file/build/#target + + +# Base FrankenPHP image +FROM frankenphp_upstream AS frankenphp_base + +SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] + +WORKDIR /app + +# persistent deps +# hadolint ignore=DL3008 +RUN <<-EOF + apt-get update + apt-get install -y --no-install-recommends \ + file \ + git + install-php-extensions \ + @composer \ + apcu \ + intl \ + opcache \ + zip + rm -rf /var/lib/apt/lists/* +EOF + +# https://getcomposer.org/doc/03-cli.md#composer-allow-superuser +ENV COMPOSER_ALLOW_SUPERUSER=1 + +ENV PHP_INI_SCAN_DIR=":$PHP_INI_DIR/app.conf.d" + +###> recipes ### +###< recipes ### + +COPY --link frankenphp/conf.d/10-app.ini $PHP_INI_DIR/app.conf.d/ +COPY --link --chmod=755 frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint +COPY --link frankenphp/Caddyfile /etc/frankenphp/Caddyfile + +ENTRYPOINT ["docker-entrypoint"] + +HEALTHCHECK --start-period=60s CMD php -r 'exit(false === @file_get_contents("http://localhost:2019/metrics", context: stream_context_create(["http" => ["timeout" => 5]])) ? 1 : 0);' +CMD [ "frankenphp", "run", "--config", "/etc/frankenphp/Caddyfile" ] + +# Dev FrankenPHP image +FROM frankenphp_base AS frankenphp_dev + +ENV APP_ENV=dev +ENV XDEBUG_MODE=off +ENV FRANKENPHP_WORKER_CONFIG=watch + +# dev dependencies +# hadolint ignore=DL3008 +RUN <<-EOF + mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini" + apt-get update + apt-get install -y --no-install-recommends \ + aggregate \ + curl \ + dnsmasq \ + dnsutils \ + iproute2 \ + ipset \ + iptables \ + jq \ + sudo + install-php-extensions xdebug + rm -rf /var/lib/apt/lists/* + useradd -m -s /bin/bash nonroot + echo "nonroot ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/nonroot + git config --system --add safe.directory /app +EOF + +COPY --link frankenphp/conf.d/20-app.dev.ini $PHP_INI_DIR/app.conf.d/ + +CMD [ "frankenphp", "run", "--config", "/etc/frankenphp/Caddyfile", "--watch" ] + +# Builder for the prod FrankenPHP image +FROM frankenphp_base AS frankenphp_prod_builder + +ENV APP_ENV=prod + +RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" + +COPY --link frankenphp/conf.d/20-app.prod.ini $PHP_INI_DIR/app.conf.d/ + +# prevent the reinstallation of vendors at every changes in the source code +COPY --link composer.* symfony.* ./ +RUN composer install --no-cache --prefer-dist --no-dev --no-autoloader --no-scripts --no-progress + +# copy sources +COPY --link --exclude=frankenphp/ . ./ + +RUN <<-EOF + mkdir -p var/cache var/log var/share + composer dump-autoload --classmap-authoritative --no-dev + composer dump-env prod + composer run-script --no-dev post-install-cmd + if [ -f importmap.php ]; then + php bin/console asset-map:compile + fi + chmod +x bin/console + chmod -R g=u var + sync +EOF + +# Collect shared libraries needed by FrankenPHP and PHP extensions +# hadolint ignore=DL3008,SC3054,DL4006 +RUN <<-'EOF' + apt-get update + apt-get install -y --no-install-recommends libtree + mkdir -p /tmp/libs + BINARIES=(frankenphp php file) + for target in $(printf '%s\n' "${BINARIES[@]}" | xargs -I{} which {}) \ + $(find "$(php -r 'echo ini_get("extension_dir");')" -maxdepth 2 -name "*.so"); do + libtree -pv "$target" 2>/dev/null | grep -oP '(?:── )\K/\S+(?= \[)' | while IFS= read -r lib; do + [ -f "$lib" ] && cp -n "$lib" /tmp/libs/ + done + done + rm -rf /var/lib/apt/lists/* +EOF + +# Prod FrankenPHP image +FROM debian:13-slim AS frankenphp_prod + +SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] + +ENV APP_ENV=prod +ENV PHP_INI_SCAN_DIR=":/usr/local/etc/php/app.conf.d" + +COPY --from=frankenphp_prod_builder /usr/local/bin/frankenphp /usr/local/bin/frankenphp +COPY --from=frankenphp_prod_builder /usr/local/bin/php /usr/local/bin/php +COPY --from=frankenphp_prod_builder /usr/local/bin/docker-php-entrypoint /usr/local/bin/docker-php-entrypoint +COPY --from=frankenphp_prod_builder /usr/local/lib/php/extensions /usr/local/lib/php/extensions +COPY --from=frankenphp_prod_builder /tmp/libs /usr/lib + +COPY --from=frankenphp_prod_builder /usr/local/etc/php/conf.d /usr/local/etc/php/conf.d +COPY --from=frankenphp_prod_builder /usr/local/etc/php/php.ini /usr/local/etc/php/php.ini +COPY --from=frankenphp_prod_builder /usr/local/etc/php/app.conf.d /usr/local/etc/php/app.conf.d + +COPY --from=frankenphp_prod_builder /etc/frankenphp/Caddyfile /etc/frankenphp/Caddyfile + +# CA certificates for TLS, file/libmagic for Symfony MIME type detection +COPY --from=frankenphp_prod_builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY --from=frankenphp_prod_builder /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf +COPY --from=frankenphp_prod_builder /usr/bin/file /usr/bin/file +COPY --from=frankenphp_prod_builder /usr/lib/file/magic.mgc /usr/lib/file/magic.mgc + +ENV OPENSSL_CONF=/etc/ssl/openssl.cnf XDG_CONFIG_HOME=/config XDG_DATA_HOME=/data + +RUN <<-EOF + mkdir -p /data/caddy /config/caddy + chown -R www-data:www-data /data /config + # Remove setuid/setgid bits + find / -perm /6000 -type f -exec chmod a-s {} + 2>/dev/null || true +EOF + +COPY --link --exclude=var --from=frankenphp_prod_builder /app /app +# Group 0 + g=u for arbitrary-UID runtimes (e.g. OpenShift). +COPY --chown=www-data:0 --from=frankenphp_prod_builder /app/var /app/var +RUN chmod g=u /app/var + +COPY --link --chmod=755 frankenphp/docker-entrypoint.sh /usr/local/bin/docker-entrypoint + +USER www-data + +WORKDIR /app + +ENTRYPOINT ["docker-entrypoint"] + +HEALTHCHECK --start-period=60s CMD php -r 'exit(false === @file_get_contents("http://localhost:2019/metrics", context: stream_context_create(["http" => ["timeout" => 5]])) ? 1 : 0);' +CMD [ "frankenphp", "run", "--config", "/etc/frankenphp/Caddyfile" ] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bc6b2a1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b42def4 --- /dev/null +++ b/README.md @@ -0,0 +1,60 @@ +# Symfony Docker + +A [Docker](https://www.docker.com/)-based installer and runtime for the [Symfony](https://symfony.com) web framework, +with [FrankenPHP](https://frankenphp.dev) and [Caddy](https://caddyserver.com/) inside! + +Specially tailored for coding agents: ships with a [Dev Container](https://containers.dev/) configuration +that lets [Claude Code](https://claude.ai/claude-code) (and other AI coding assistants) run in fully autonomous +mode inside a sandboxed environment. + +![CI](https://github.com/dunglas/symfony-docker/workflows/CI/badge.svg) + +## Getting Started + +1. If not already done, [install Docker Compose](https://docs.docker.com/compose/install/) (v2.10+) +2. Run `docker compose build --pull --no-cache` to build fresh images +3. Run `docker compose up --wait` to set up and start a fresh Symfony project +4. Open `https://localhost` in your favorite web browser and [accept the auto-generated TLS certificate](https://stackoverflow.com/a/15076602/1352334) +5. Run `docker compose down --remove-orphans` to stop the Docker containers. + +## Features + +- Production, development and CI ready +- Just 1 service by default +- Super-readable configuration +- Blazing-fast performance thanks to [the worker mode of FrankenPHP](https://frankenphp.dev/docs/worker/) +- [Installation of extra Docker Compose services](docs/extra-services.md) with Symfony Flex +- Automatic HTTPS (in dev and prod) +- HTTP/3 and [Early Hints](https://symfony.com/blog/new-in-symfony-6-3-early-hints) support +- Real-time messaging thanks to a built-in [Mercure hub](https://symfony.com/doc/current/mercure.html) +- [Vulcain](https://vulcain.rocks) support +- Native [XDebug](docs/xdebug.md) integration +- [Hot Reloading](https://frankenphp.dev/docs/hot-reload/) +- [Dev Container](https://containers.dev/) support, optimized for AI coding agents +- [AI coding agents](docs/agents.md) with sandboxing out of the box +- Rootless, slim production image + +**Enjoy!** + +## Docs + +1. [Options available](docs/options.md) +2. [Using Symfony Docker with an existing project](docs/existing-project.md) +3. [Support for extra services](docs/extra-services.md) +4. [Deploying in production](docs/production.md) +5. [Debugging with Xdebug](docs/xdebug.md) +6. [TLS Certificates](docs/tls.md) +7. [Using MySQL instead of PostgreSQL](docs/mysql.md) +8. [Using Alpine Linux instead of Debian](docs/alpine.md) +9. [Using a Makefile](docs/makefile.md) +10. [Updating the template](docs/updating.md) +11. [Troubleshooting](docs/troubleshooting.md) +12. [Using AI Coding Agents](docs/agents.md) + +## License + +Symfony Docker is available under the MIT License. + +## Credits + +Created by [Kévin Dunglas](https://dunglas.dev), co-maintained by [Maxime Helias](https://twitter.com/maxhelias) and sponsored by [Les-Tilleuls.coop](https://les-tilleuls.coop). diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..d8d530e --- /dev/null +++ b/bin/console @@ -0,0 +1,21 @@ +#!/usr/bin/env php + symfony/mercure-bundle ### +###< symfony/mercure-bundle ### diff --git a/compose.prod.yaml b/compose.prod.yaml new file mode 100644 index 0000000..a3e2163 --- /dev/null +++ b/compose.prod.yaml @@ -0,0 +1,12 @@ +--- +# Production environment override +services: + php: + image: ${IMAGES_PREFIX:-}app-php-prod + build: + context: . + target: frankenphp_prod + environment: + APP_SECRET: ${APP_SECRET} + MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} + MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET} diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..9333ef8 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,41 @@ +--- +services: + php: + restart: unless-stopped + environment: + SERVER_NAME: ${SERVER_NAME:-localhost}, php:80 + DEFAULT_URI: https://${SERVER_NAME:-localhost}:${HTTPS_PORT:-443} + MERCURE_PUBLISHER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} + MERCURE_SUBSCRIBER_JWT_KEY: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} + # Run "composer require symfony/orm-pack" to install and configure Doctrine ORM + DATABASE_URL: postgresql://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-!ChangeMe!}@database:5432/${POSTGRES_DB:-app}?serverVersion=${POSTGRES_VERSION:-15}&charset=${POSTGRES_CHARSET:-utf8} + # Run "composer require symfony/mercure-bundle" to install and configure the Mercure integration + MERCURE_URL: ${CADDY_MERCURE_URL:-http://php/.well-known/mercure} + MERCURE_PUBLIC_URL: ${CADDY_MERCURE_PUBLIC_URL:-https://${SERVER_NAME:-localhost}:${HTTPS_PORT:-443}/.well-known/mercure} + MERCURE_JWT_SECRET: ${CADDY_MERCURE_JWT_SECRET:-!ChangeThisMercureHubJWTSecretKey!} + volumes: + - caddy_data:/data + - caddy_config:/config + ports: + - name: http + target: 80 + published: ${HTTP_PORT:-80} + protocol: tcp + - name: https + target: 443 + published: ${HTTPS_PORT:-443} + protocol: tcp + - name: http3 + target: 443 + published: ${HTTP3_PORT:-443} + protocol: udp + +# Mercure is installed as a Caddy module, prevent the Flex recipe from installing another service +###> symfony/mercure-bundle ### +###< symfony/mercure-bundle ### + +volumes: + caddy_data: + caddy_config: +###> symfony/mercure-bundle ### +###< symfony/mercure-bundle ### diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..1a52d5e --- /dev/null +++ b/composer.json @@ -0,0 +1,78 @@ +{ + "name": "symfony/skeleton", + "type": "project", + "license": "MIT", + "description": "A minimal Symfony project recommended to create bare bones applications", + "minimum-stability": "stable", + "prefer-stable": true, + "require": { + "php": ">=8.5.7", + "ext-ctype": "*", + "ext-iconv": "*", + "doctrine/orm": "^3.6", + "symfony/console": "8.1.*", + "symfony/dotenv": "8.1.*", + "symfony/flex": "^2", + "symfony/framework-bundle": "8.1.*", + "symfony/runtime": "8.1.*", + "symfony/security-bundle": "8.1.*", + "symfony/twig-bundle": "8.1.*", + "symfony/yaml": "8.1.*" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "symfony/flex": true, + "symfony/runtime": true + }, + "bump-after-update": true, + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*", + "symfony/polyfill-php73": "*", + "symfony/polyfill-php74": "*", + "symfony/polyfill-php80": "*", + "symfony/polyfill-php81": "*", + "symfony/polyfill-php82": "*", + "symfony/polyfill-php83": "*", + "symfony/polyfill-php84": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "8.1.*", + "docker": true + } + }, + "require-dev": { + "symfony/maker-bundle": "^1.67" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..01633c6 --- /dev/null +++ b/composer.lock @@ -0,0 +1,4723 @@ +{ + "_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": "5600b54f06be887eb22e952974fb7c58", + "packages": [ + { + "name": "doctrine/collections", + "version": "2.6.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/collections.git", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/collections/zipball/7713da39d8e237f28411d6a616a3dce5e20d5de2", + "reference": "7713da39d8e237f28411d6a616a3dce5e20d5de2", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "php": "^8.1", + "symfony/polyfill-php84": "^1.30" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "ext-json": "*", + "phpstan/phpstan": "^2.1.30", + "phpstan/phpstan-phpunit": "^2.0.7", + "phpunit/phpunit": "^10.5.58 || ^11.5.42 || ^12.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Collections\\": "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" + } + ], + "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.", + "homepage": "https://www.doctrine-project.org/projects/collections.html", + "keywords": [ + "array", + "collections", + "iterators", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/collections/issues", + "source": "https://github.com/doctrine/collections/tree/2.6.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%2Fcollections", + "type": "tidelift" + } + ], + "time": "2026-01-15T10:01:58+00:00" + }, + { + "name": "doctrine/dbal", + "version": "4.4.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "61e730f1658814821a85f2402c945f3883407dec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/61e730f1658814821a85f2402c945f3883407dec", + "reference": "61e730f1658814821a85f2402c945f3883407dec", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1.5", + "php": "^8.2", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "14.0.0", + "fig/log-test": "^1", + "jetbrains/phpstorm-stubs": "2023.2", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "2.0.7", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "11.5.50", + "slevomat/coding-standard": "8.27.1", + "squizlabs/php_codesniffer": "4.0.1", + "symfony/cache": "^6.3.8|^7.0|^8.0", + "symfony/console": "^5.4|^6.3|^7.0|^8.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "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/4.4.3" + }, + "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": "2026-03-20T08:52:12+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "reference": "d4fe3e6fd9bb9e72557a19674f44d8ac7db4c6ca", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=14" + }, + "require-dev": { + "doctrine/coding-standard": "^9 || ^12 || ^14", + "phpstan/phpstan": "1.4.10 || 2.1.30", + "phpstan/phpstan-phpunit": "^1.0 || ^2", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12.4 || ^13.0", + "psr/log": "^1 || ^2 || ^3" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "src" + } + }, + "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.6" + }, + "time": "2026-02-07T07:09:04+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "reference": "dda33921b198841ca8dbad2eaa5d4d34769d18cf", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "conflict": { + "doctrine/common": "<2.9" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "phpdocumentor/guides-cli": "^1.4", + "phpstan/phpstan": "^2.1.32", + "phpunit/phpunit": "^10.5.58" + }, + "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.1.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%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2026-01-29T07:11:08+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "reference": "6d6c96277ea252fc1304627204c3d5e6e15faa3b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^12.0 || ^13.0", + "phpstan/phpstan": "^1.12 || ^2.0", + "phpstan/phpstan-phpunit": "^1.4 || ^2.0", + "phpstan/phpstan-strict-rules": "^1.6 || ^2.0", + "phpunit/phpunit": "^8.5 || ^12.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "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" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.1.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%2Finflector", + "type": "tidelift" + } + ], + "time": "2025-08-10T19:31:58+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/23da848e1a2308728fe5fdddabf4be17ff9720c7", + "reference": "23da848e1a2308728fe5fdddabf4be17ff9720c7", + "shasum": "" + }, + "require": { + "php": "^8.4" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5.58" + }, + "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.1.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": "2026-01-05T06:47:08+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": "doctrine/orm", + "version": "3.6.7", + "source": { + "type": "git", + "url": "https://github.com/doctrine/orm.git", + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/orm/zipball/bc217c0e19c3a9eadfa67697143b87c9ba01272c", + "reference": "bc217c0e19c3a9eadfa67697143b87c9ba01272c", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/collections": "^2.2", + "doctrine/dbal": "^3.8.2 || ^4", + "doctrine/deprecations": "^0.5.3 || ^1", + "doctrine/event-manager": "^1.2 || ^2", + "doctrine/inflector": "^1.4 || ^2.0", + "doctrine/instantiator": "^1.3 || ^2", + "doctrine/lexer": "^3", + "doctrine/persistence": "^3.3.1 || ^4", + "ext-ctype": "*", + "php": "^8.1", + "psr/cache": "^1 || ^2 || ^3", + "symfony/console": "^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/var-exporter": "^6.3.9 || ^7.0 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14.0", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "2.1.23", + "phpstan/phpstan-deprecation-rules": "^2", + "phpunit/phpunit": "^10.5.0 || ^11.5", + "psr/log": "^1 || ^2 || ^3", + "symfony/cache": "^5.4 || ^6.2 || ^7.0 || ^8.0" + }, + "suggest": { + "ext-dom": "Provides support for XSD validation for XML mapping files", + "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\ORM\\": "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": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "https://www.doctrine-project.org/projects/orm.html", + "keywords": [ + "database", + "orm" + ], + "support": { + "issues": "https://github.com/doctrine/orm/issues", + "source": "https://github.com/doctrine/orm/tree/3.6.7" + }, + "time": "2026-05-25T16:45:47+00:00" + }, + { + "name": "doctrine/persistence", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/persistence.git", + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/persistence/zipball/49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", + "reference": "49ab73e0d3e2ac8d1f5ecda3dd8acd5503781e8b", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1", + "doctrine/event-manager": "^1 || ^2", + "php": "^8.1", + "psr/cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "doctrine/coding-standard": "^14", + "phpstan/phpstan": "2.1.30", + "phpstan/phpstan-phpunit": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.58 || ^12", + "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0", + "symfony/finder": "^4.4 || ^5.4 || ^6.0 || ^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Persistence\\": "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 Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.", + "homepage": "https://www.doctrine-project.org/projects/persistence.html", + "keywords": [ + "mapper", + "object", + "odm", + "orm", + "persistence" + ], + "support": { + "issues": "https://github.com/doctrine/persistence/issues", + "source": "https://github.com/doctrine/persistence/tree/4.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%2Fpersistence", + "type": "tidelift" + } + ], + "time": "2026-04-26T12:12:52+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/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "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.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "symfony/cache", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "ba62e0ed9ea9bc26142844a891d4a3dfceb24aed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/ba62e0ed9ea9bc26142844a891d4a3dfceb24aed", + "reference": "ba62e0ed9ea9bc26142844a891d4a3dfceb24aed", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^3.6", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^8.1" + }, + "conflict": { + "ext-redis": "<6.1", + "ext-relay": "<0.12.1" + }, + "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": "^4.3", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "225e8a254166bd3442e370c6f50145465db63831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/225e8a254166bd3442e370c6f50145465db63831", + "reference": "225e8a254166bd3442e370c6f50145465db63831", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "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.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-05T15:33:14+00:00" + }, + { + "name": "symfony/clock", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/clock.git", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/clock/zipball/701ef4de9705d6c32292ebee5e8044094a09fbf6", + "reference": "701ef4de9705d6c32292ebee5e8044094a09fbf6", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/clock": "^1.0" + }, + "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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/config", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "429783a0c649696f2058ea5ab5315f082dba6de9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/429783a0c649696f2058ea5ab5315f082dba6de9", + "reference": "429783a0c649696f2058ea5ab5315f082dba6de9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/console", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/f5a856c6ecb56b3c21ed94a5b7bf940d857d110a", + "reference": "f5a856c6ecb56b3c21ed94a5b7bf940d857d110a", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.32", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^7.4.6|^8.0.6" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/event-dispatcher": "<8.1" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/messenger": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "b6ba1f45127106885de4b77558c5ecca8feb1e1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/b6ba1f45127106885de4b77558c5ecca8feb1e1b", + "reference": "b6ba1f45127106885de4b77558c5ecca8feb1e1b", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.6", + "symfony/var-exporter": "^8.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/50f59d1f3ca46d41ac911f97a78626b6756af35b", + "reference": "50f59d1f3ca46d41ac911f97a78626b6756af35b", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "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.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-04-13T15:52:40+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c", + "reference": "7ed4e3a11e3c98235c70ded047d7ddf9e6ae854c", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "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": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "reference": "d8aeb1abd3fef84795567850d3a567bdb5945ee5", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/polyfill-php85": "^1.32", + "symfony/var-dumper": "^7.4|^8.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "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 to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/f249ae3f680958b6f1f9dd76e5747cf0695b4102", + "reference": "f249ae3f680958b6f1f9dd76e5747cf0695b4102", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/security-http": "<7.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": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/error-handler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/ccba7060602b7fed0b03c85bf025257f76d9ef32", + "reference": "ccba7060602b7fed0b03c85bf025257f76d9ef32", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "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.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T13:30:16+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/99aec13b82b4967ec5088222c4a3ecca955949c2", + "reference": "99aec13b82b4967ec5088222c4a3ecca955949c2", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^7.4|^8.0" + }, + "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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/finder", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "58d2e767a66052c1487356f953445634a8194c64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/58d2e767a66052c1487356f953445634a8194c64", + "reference": "58d2e767a66052c1487356f953445634a8194c64", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/filesystem": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/flex", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/4a6d98eea3ebc7f68d82810cb682eedca2649e99", + "reference": "4a6d98eea3ebc7f68d82810cb682eedca2649e99", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1", + "php": ">=8.1" + }, + "conflict": { + "composer/semver": "<1.7.2", + "symfony/dotenv": "<5.4" + }, + "require-dev": { + "composer/composer": "^2.1", + "phpunit/phpunit": "^12.4", + "symfony/dotenv": "^6.4.41|^7.4.13|^8.0.13", + "symfony/filesystem": "^6.4|^7.4|^8.0", + "symfony/process": "^6.4|^7.4|^8.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Flex\\Flex" + }, + "autoload": { + "psr-4": { + "Symfony\\Flex\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "Composer plugin for Symfony", + "support": { + "issues": "https://github.com/symfony/flex/issues", + "source": "https://github.com/symfony/flex/tree/v2.11.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T17:25:22+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "6a0953f4fd8b51db6136c2628af99b7193e63256" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/6a0953f4fd8b51db6136c2628af99b7193e63256", + "reference": "6a0953f4fd8b51db6136c2628af99b7193e63256", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.4.1", + "symfony/cache": "^7.4|^8.0", + "symfony/config": "^7.4.4|^8.0.4", + "symfony/dependency-injection": "^8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^7.4|^8.0", + "symfony/event-dispatcher": "^8.1", + "symfony/filesystem": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^8.1", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php85": "^1.33", + "symfony/routing": "^7.4|^8.0", + "symfony/service-contracts": "^3.7", + "symfony/var-exporter": "^8.1" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/console": "<8.1", + "symfony/form": "<7.4", + "symfony/json-streamer": "<7.4", + "symfony/messenger": "<7.4.10|>=8.0,<8.0.10", + "symfony/mime": "<7.4.9|>=8.0,<8.0.9", + "symfony/security-csrf": "<7.4", + "symfony/serializer": "<7.4", + "symfony/translation": "<7.4", + "symfony/webhook": "<7.4", + "symfony/workflow": "<7.4" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^7.4|^8.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/console": "^8.1", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/dotenv": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/html-sanitizer": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/json-streamer": "^7.4|^8.0", + "symfony/lock": "^7.4|^8.0", + "symfony/mailer": "^7.4|^8.0", + "symfony/messenger": "^7.4.10|^8.0.10", + "symfony/mime": "^7.4.9|^8.0.9", + "symfony/notifier": "^7.4|^8.0", + "symfony/object-mapper": "^7.4.9|^8.0.9", + "symfony/polyfill-intl-icu": "^1.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0", + "symfony/scheduler": "^7.4|^8.0", + "symfony/security-bundle": "^7.4|^8.0", + "symfony/semaphore": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/twig-bundle": "^7.4|^8.0", + "symfony/type-info": "^7.4.1|^8.0.1", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/webhook": "^7.4|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "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 tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "af11474600f06718086c2cda4fa6fa8d0a672e7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/af11474600f06718086c2cda4fa6fa8d0a672e7e", + "reference": "af11474600f06718086c2cda4fa6fa8d0a672e7e", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "^1.1" + }, + "conflict": { + "doctrine/dbal": "<4.3" + }, + "require-dev": { + "doctrine/dbal": "^4.3", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/mime": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "cefeb37c82eed3e0c42fa25ba64cd3a908d90f39" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cefeb37c82eed3e0c42fa25ba64cd3a908d90f39", + "reference": "cefeb37c82eed3e0c42fa25ba64cd3a908d90f39", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/dependency-injection": "<8.1", + "symfony/flex": "<2.10", + "symfony/http-client-contracts": "<2.5", + "symfony/translation-contracts": "<2.5", + "symfony/var-dumper": "<8.1", + "symfony/web-profiler-bundle": "<8.1", + "twig/twig": "<3.21" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dependency-injection": "^8.1", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/var-dumper": "^8.1", + "symfony/var-exporter": "^7.4|^8.0", + "twig/twig": "^3.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "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 structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T08:46:08+00:00" + }, + { + "name": "symfony/password-hasher", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/password-hasher.git", + "reference": "6934d16beaa4677f2c4584229fff1b51099dd7af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/6934d16beaa4677f2c4584229fff1b51099dd7af", + "reference": "6934d16beaa4677f2c4584229fff1b51099dd7af", + "shasum": "" + }, + "require": { + "php": ">=8.4.1" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PasswordHasher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Robin Chalas", + "email": "robin.chalas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides password hashing utilities", + "homepage": "https://symfony.com", + "keywords": [ + "hashing", + "password" + ], + "support": { + "source": "https://github.com/symfony/password-hasher/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/polyfill-deepclone", + "version": "v1.39.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-deepclone.git", + "reference": "1b034bc050d84cc9c187de373f744912e1e35f1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-deepclone/zipball/1b034bc050d84cc9c187de373f744912e1e35f1f", + "reference": "1b034bc050d84cc9c187de373f744912e1e35f1f", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "provide": { + "ext-deepclone": "*" + }, + "suggest": { + "ext-deepclone": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\DeepClone\\": "" + }, + "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 the deepclone extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "deepclone", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-deepclone/tree/v1.39.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-06-10T20:07:50+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/e9247d281d694a5120554d9afaf54e070e88a603", + "reference": "e9247d281d694a5120554d9afaf54e070e88a603", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T05:58:03+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.38.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "reference": "2d446c214bdbe5b71bde5011b060a05fece3ae6b", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.38.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-25T13:48:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.38.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "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.38.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-27T06:59:30+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "reference": "ba2ba04f3352cfa2dcbbcb90aee13ed967f505b1", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "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.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T02:25:22+00:00" + }, + { + "name": "symfony/property-access", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "9261ef060f26cc7b728f67f141ba19b98a6209a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/9261ef060f26cc7b728f67f141ba19b98a6209a9", + "reference": "9261ef060f26cc7b728f67f141ba19b98a6209a9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/property-info": "^7.4.4|^8.0.4" + }, + "require-dev": { + "symfony/cache": "^7.4|^8.0", + "symfony/var-exporter": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/property-info", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "4721e8c56d0cd2378e0ef9a9899f810008b859f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/4721e8c56d0cd2378e0ef9a9899f810008b859f7", + "reference": "4721e8c56d0cd2378e0ef9a9899f810008b859f7", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/string": "^7.4|^8.0", + "symfony/type-info": "^7.4.7|^8.0.7" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "phpstan/phpdoc-parser": "^1.0|^2.0", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/routing", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "reference": "fe0bfec72c8a806109fb9c3a5f2b898fe0c76eb3", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/runtime", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "b7ea1abe04561e814b3134db0f56c287cedb35cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/b7ea1abe04561e814b3134db0f56c287cedb35cc", + "reference": "b7ea1abe04561e814b3134db0f56c287cedb35cc", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.4.1" + }, + "conflict": { + "symfony/error-handler": "<7.4" + }, + "require-dev": { + "composer/composer": "^2.6", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/dotenv": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Runtime\\": "", + "Symfony\\Runtime\\Symfony\\Component\\": "Internal/" + }, + "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": "Enables decoupling PHP applications from global state", + "homepage": "https://symfony.com", + "keywords": [ + "runtime" + ], + "support": { + "source": "https://github.com/symfony/runtime/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/security-bundle", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-bundle.git", + "reference": "0489a6247f729652db9b9ff408f69ac3bee3589e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-bundle/zipball/0489a6247f729652db9b9ff408f69ac3bee3589e", + "reference": "0489a6247f729652db9b9ff408f69ac3bee3589e", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.4.1", + "symfony/clock": "^7.4|^8.0", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/password-hasher": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/security-http": "^8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/asset": "^7.4|^8.0", + "symfony/browser-kit": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/css-selector": "^7.4|^8.0", + "symfony/dom-crawler": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/ldap": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0", + "symfony/twig-bundle": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0", + "web-token/jwt-library": "^3.3.2|^4.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\SecurityBundle\\": "" + }, + "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 tight integration of the Security component into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-bundle/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/security-core", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-core.git", + "reference": "a8239abe61dafdd0c01c0b4019138b2855717f97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-core/zipball/a8239abe61dafdd0c01c0b4019138b2855717f97", + "reference": "a8239abe61dafdd0c01c0b4019138b2855717f97", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/event-dispatcher-contracts": "^2.5|^3", + "symfony/password-hasher": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "psr/container": "^1.1|^2.0", + "psr/log": "^1|^2|^3", + "symfony/cache": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/event-dispatcher": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/ldap": "^7.4|^8.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/string": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Core\\": "" + }, + "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 Security Component - Core Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-core/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/security-csrf", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-csrf.git", + "reference": "c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-csrf/zipball/c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f", + "reference": "c865a8ee0d30b14545d7e5349b8e443f4fa9dc3f", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/security-core": "^7.4|^8.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Csrf\\": "" + }, + "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 Security Component - CSRF Library", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-csrf/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/security-http", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/security-http.git", + "reference": "e0e6c7b9e80eec37248b92359cbd6938c7086f4b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/security-http/zipball/e0e6c7b9e80eec37248b92359cbd6938c7086f4b", + "reference": "e0e6c7b9e80eec37248b92359cbd6938c7086f4b", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^8.1", + "symfony/polyfill-mbstring": "^1.0", + "symfony/property-access": "^7.4|^8.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/http-client-contracts": "<3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/cache": "^7.4|^8.0", + "symfony/clock": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/http-client-contracts": "^3.0", + "symfony/rate-limiter": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "web-token/jwt-library": "^3.3.2|^4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Security\\Http\\": "" + }, + "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 Security Component - HTTP Integration", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/security-http/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "reference": "d25d82433a80eba6aa0e6c24b61d7370d99e444a", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "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.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-28T09:44:51+00:00" + }, + { + "name": "symfony/string", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "reference": "afd5944f4005862d961efb85c8bbd5c523c4e3c9", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-intl-grapheme": "^1.33", + "symfony/polyfill-intl-normalizer": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.4|^8.0", + "symfony/http-client": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^7.4|^8.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.7.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/0ab302977a952b42fd51475c4ebac81f8da0a95d", + "reference": "0ab302977a952b42fd51475c4ebac81f8da0a95d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/contracts", + "name": "symfony/contracts" + }, + "branch-alias": { + "dev-main": "3.7-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + }, + "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 translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.7.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-01-05T13:30:16+00:00" + }, + { + "name": "symfony/twig-bridge", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bridge.git", + "reference": "25bb8c01edaab85e13142f6010df09b990388343" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/25bb8c01edaab85e13142f6010df09b990388343", + "reference": "25bb8c01edaab85e13142f6010df09b990388343", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/translation-contracts": "^2.5|^3", + "twig/twig": "^3.25" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2|>=7", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/form": "<7.4.4|>8.0,<8.0.4", + "symfony/mime": "<7.4.9|>8.0,<8.0.9" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", + "symfony/asset": "^7.4|^8.0", + "symfony/asset-mapper": "^7.4|^8.0", + "symfony/console": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/emoji": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/form": "^7.4.4|^8.0.4", + "symfony/html-sanitizer": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/intl": "^7.4|^8.0", + "symfony/mime": "^7.4.9|^8.0.9", + "symfony/polyfill-intl-icu": "^1.0", + "symfony/property-info": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/security-acl": "^2.8|^3.0", + "symfony/security-core": "^7.4|^8.0", + "symfony/security-csrf": "^7.4|^8.0", + "symfony/security-http": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/validator": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/workflow": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0", + "twig/cssinliner-extra": "^3", + "twig/inky-extra": "^3", + "twig/markdown-extra": "^3" + }, + "type": "symfony-bridge", + "autoload": { + "psr-4": { + "Symfony\\Bridge\\Twig\\": "" + }, + "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 integration for Twig with various Symfony components", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bridge/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/twig-bundle", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/twig-bundle.git", + "reference": "b7f4a471a07b8b52174d153e4db12f46954192ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/b7f4a471a07b8b52174d153e4db12f46954192ed", + "reference": "b7f4a471a07b8b52174d153e4db12f46954192ed", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "php": ">=8.4.1", + "symfony/config": "^7.4|^8.0", + "symfony/dependency-injection": "^7.4|^8.0", + "symfony/http-foundation": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/twig-bridge": "^7.4|^8.0" + }, + "require-dev": { + "symfony/asset": "^7.4|^8.0", + "symfony/expression-language": "^7.4|^8.0", + "symfony/finder": "^7.4|^8.0", + "symfony/form": "^7.4|^8.0", + "symfony/framework-bundle": "^7.4|^8.0", + "symfony/routing": "^7.4|^8.0", + "symfony/runtime": "^7.4|^8.0", + "symfony/stopwatch": "^7.4|^8.0", + "symfony/translation": "^7.4|^8.0", + "symfony/web-link": "^7.4|^8.0", + "symfony/yaml": "^7.4|^8.0" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\TwigBundle\\": "" + }, + "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 tight integration of Twig into the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/twig-bundle/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/type-info", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "reference": "9f24df8a79781b9b9f030fea7dfd2f3bd1e7e7e7", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.30" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.30|^2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e", + "reference": "c2c4df1d21477cc21c9f6dc1b14d07c3abc4963e", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "symfony/console": "<7.4", + "symfony/error-handler": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "symfony/http-kernel": "^7.4|^8.0", + "symfony/process": "^7.4|^8.0", + "symfony/uid": "^7.4|^8.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "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 mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "2dd18582c5f6c024db9fc0ff9c76d873af726f34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/2dd18582c5f6c024db9fc0ff9c76d873af726f34", + "reference": "2dd18582c5f6c024db9fc0ff9c76d873af726f34", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-deepclone": "^1.37" + }, + "require-dev": { + "symfony/property-access": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.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": "Provides tools to export, instantiate, hydrate, clone and lazy-load PHP objects", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "deep-clone", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "symfony/yaml", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/efb42bd2c6f4f3ccfd4683583449938b5fc146b0", + "reference": "efb42bd2c6f4f3ccfd4683583449938b5fc146b0", + "shasum": "" + }, + "require": { + "php": ">=8.4.1", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<7.4" + }, + "require-dev": { + "symfony/console": "^7.4|^8.0", + "yaml/yaml-test-suite": "*" + }, + "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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + }, + { + "name": "twig/twig", + "version": "v3.27.1", + "source": { + "type": "git", + "url": "https://github.com/twigphp/Twig.git", + "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae2071bffb38f04847fc0864d730c94b9cb8ab74", + "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74", + "shasum": "" + }, + "require": { + "php": ">=8.1.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-mbstring": "^1.3" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.0@stable", + "phpstan/phpstan": "^2.0@stable", + "psr/container": "^1.0|^2.0", + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], + "psr-4": { + "Twig\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com", + "homepage": "http://fabien.potencier.org", + "role": "Lead Developer" + }, + { + "name": "Twig Team", + "role": "Contributors" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com", + "role": "Project Founder" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "https://twig.symfony.com", + "keywords": [ + "templating" + ], + "support": { + "issues": "https://github.com/twigphp/Twig/issues", + "source": "https://github.com/twigphp/Twig/tree/v3.27.1" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/twig/twig", + "type": "tidelift" + } + ], + "time": "2026-05-30T17:09:26+00:00" + } + ], + "packages-dev": [ + { + "name": "nikic/php-parser", + "version": "v5.7.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-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/v5.7.0" + }, + "time": "2025-12-06T11:56:16+00:00" + }, + { + "name": "symfony/maker-bundle", + "version": "v1.67.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/maker-bundle.git", + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "reference": "6ce8b313845f16bcf385ee3cb31d8b24e30d5516", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2.1", + "doctrine/inflector": "^2.0", + "nikic/php-parser": "^5.0", + "php": ">=8.1", + "symfony/config": "^6.4|^7.0|^8.0", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/deprecation-contracts": "^2.2|^3", + "symfony/filesystem": "^6.4|^7.0|^8.0", + "symfony/finder": "^6.4|^7.0|^8.0", + "symfony/framework-bundle": "^6.4|^7.0|^8.0", + "symfony/http-kernel": "^6.4|^7.0|^8.0", + "symfony/process": "^6.4|^7.0|^8.0" + }, + "conflict": { + "doctrine/doctrine-bundle": "<2.10", + "doctrine/orm": "<2.15" + }, + "require-dev": { + "composer/semver": "^3.0", + "doctrine/doctrine-bundle": "^2.10|^3.0", + "doctrine/orm": "^2.15|^3", + "doctrine/persistence": "^3.1|^4.0", + "symfony/http-client": "^6.4|^7.0|^8.0", + "symfony/phpunit-bridge": "^6.4.1|^7.0|^8.0", + "symfony/security-core": "^6.4|^7.0|^8.0", + "symfony/security-http": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0", + "twig/twig": "^3.0|^4.x-dev" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Bundle\\MakerBundle\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.", + "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html", + "keywords": [ + "code generator", + "dev", + "generator", + "scaffold", + "scaffolding" + ], + "support": { + "issues": "https://github.com/symfony/maker-bundle/issues", + "source": "https://github.com/symfony/maker-bundle/tree/v1.67.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-03-18T13:39:06+00:00" + }, + { + "name": "symfony/process", + "version": "v8.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "reference": "c4a9e58f235a6bf7f97ffbfedae2687353ac79e5", + "shasum": "" + }, + "require": { + "php": ">=8.4.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/v8.1.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-29T05:06:50+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.5.7", + "ext-ctype": "*", + "ext-iconv": "*" + }, + "platform-dev": {}, + "plugin-api-version": "2.9.0" +} diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 0000000..0088077 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,8 @@ + ['all' => true], + Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], + Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], + Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true], +]; diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml new file mode 100644 index 0000000..6899b72 --- /dev/null +++ b/config/packages/cache.yaml @@ -0,0 +1,19 @@ +framework: + cache: + # Unique name of your app: used to compute stable namespaces for cache keys. + #prefix_seed: your_vendor_name/app_name + + # The "app" cache stores to the filesystem by default. + # The data in this cache should persist between deploys. + # Other options include: + + # Redis + #app: cache.adapter.redis + #default_redis_provider: redis://localhost + + # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) + #app: cache.adapter.apcu + + # Namespaced pools use the above "app" backend by default + #pools: + #my.dedicated.cache: null diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml new file mode 100644 index 0000000..7e1ee1f --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,15 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + + # Note that the session will be started ONLY if you read or write from it. + session: true + + #esi: true + #fragments: true + +when@test: + framework: + test: true + session: + storage_factory_id: session.storage.factory.mock_file diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml new file mode 100644 index 0000000..dd31b9d --- /dev/null +++ b/config/packages/property_info.yaml @@ -0,0 +1,3 @@ +framework: + property_info: + with_constructor_extractor: true diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 0000000..0f34f87 --- /dev/null +++ b/config/packages/routing.yaml @@ -0,0 +1,10 @@ +framework: + router: + # Configure how to generate URLs in non-HTTP contexts, such as CLI commands. + # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands + default_uri: '%env(DEFAULT_URI)%' + +when@prod: + framework: + router: + strict_requirements: null diff --git a/config/packages/security.yaml b/config/packages/security.yaml new file mode 100644 index 0000000..8964044 --- /dev/null +++ b/config/packages/security.yaml @@ -0,0 +1,39 @@ +security: + # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords + password_hashers: + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto' + + # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider + providers: + users_in_memory: { memory: null } + + firewalls: + dev: + # Ensure dev tools and static assets are always allowed + pattern: ^/(_profiler|_wdt|assets|build)/ + security: false + main: + lazy: true + provider: users_in_memory + + # Activate different ways to authenticate: + # https://symfony.com/doc/current/security.html#the-firewall + + # https://symfony.com/doc/current/security/impersonating_user.html + # switch_user: true + + # Note: Only the *first* matching rule is applied + access_control: + # - { path: ^/admin, roles: ROLE_ADMIN } + # - { path: ^/profile, roles: ROLE_USER } + +when@test: + security: + password_hashers: + # Password hashers are resource-intensive by design to ensure security. + # In tests, it's safe to reduce their cost to improve performance. + Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: + algorithm: auto + cost: 4 # Lowest possible value for bcrypt + time_cost: 3 # Lowest possible value for argon + memory_cost: 10 # Lowest possible value for argon diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml new file mode 100644 index 0000000..3f795d9 --- /dev/null +++ b/config/packages/twig.yaml @@ -0,0 +1,6 @@ +twig: + file_name_pattern: '*.twig' + +when@test: + twig: + strict_variables: true diff --git a/config/preload.php b/config/preload.php new file mode 100644 index 0000000..5ebcdb2 --- /dev/null +++ b/config/preload.php @@ -0,0 +1,5 @@ + [ + * 'App\\' => [ + * 'resource' => '../src/', + * ], + * ], + * ]); + * ``` + * + * @psalm-type ImportsConfig = list + * @psalm-type ParametersConfig = array|Param|null>|Param|null> + * @psalm-type ArgumentsType = list|array + * @psalm-type CallType = array|array{0:string, 1?:ArgumentsType, 2?:bool}|array{method:string, arguments?:ArgumentsType, returns_clone?:bool} + * @psalm-type TagsType = list>> // arrays inside the list must have only one element, with the tag name as the key + * @psalm-type CallbackType = string|array{0:string|ReferenceConfigurator,1:string}|\Closure|ReferenceConfigurator + * @psalm-type DeprecationType = array{package: string, version: string, message?: string} + * @psalm-type DefaultsType = array{ + * public?: bool, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * } + * @psalm-type InstanceofType = array{ + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type DefinitionType = array{ + * class?: string, + * file?: string, + * parent?: string, + * shared?: bool, + * synthetic?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * configurator?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * decorates?: string, + * decorates_tag?: string, + * decoration_inner_name?: string, + * decoration_priority?: int, + * decoration_on_invalid?: 'exception'|'ignore'|null, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * from_callable?: CallbackType, + * } + * @psalm-type AliasType = string|array{ + * alias: string, + * public?: bool, + * deprecated?: DeprecationType, + * } + * @psalm-type PrototypeType = array{ + * resource: string, + * namespace?: string, + * exclude?: string|list, + * parent?: string, + * shared?: bool, + * lazy?: bool|string, + * public?: bool, + * abstract?: bool, + * deprecated?: DeprecationType, + * factory?: CallbackType, + * arguments?: ArgumentsType, + * properties?: array, + * configurator?: CallbackType, + * calls?: list, + * tags?: TagsType, + * resource_tags?: TagsType, + * autowire?: bool, + * autoconfigure?: bool, + * bind?: array, + * constructor?: string, + * } + * @psalm-type StackType = array{ + * stack: list>, + * public?: bool, + * deprecated?: DeprecationType, + * decorates?: string, + * decorates_tag?: string, + * decoration_inner_name?: string, + * decoration_priority?: int, + * decoration_on_invalid?: 'exception'|'ignore'|null, + * } + * @psalm-type ServicesConfig = array{ + * _defaults?: DefaultsType, + * _instanceof?: InstanceofType, + * ... + * } + * @psalm-type ExtensionType = array + * @psalm-type FrameworkConfig = array{ + * secret?: scalar|Param|null, + * http_method_override?: bool|Param, // Set true to enable support for the '_method' request parameter to determine the intended HTTP method on POST requests. // Default: false + * allowed_http_method_override?: null|list, + * trust_x_sendfile_type_header?: scalar|Param|null, // Set true to enable support for xsendfile in binary file responses. // Default: "%env(bool:default::SYMFONY_TRUST_X_SENDFILE_TYPE_HEADER)%" + * ide?: scalar|Param|null, // Default: "%env(default::SYMFONY_IDE)%" + * test?: bool|Param, + * default_locale?: scalar|Param|null, // Default: "en" + * set_locale_from_accept_language?: bool|Param, // Whether to use the Accept-Language HTTP header to set the Request locale (only when the "_locale" request attribute is not passed). // Default: false + * set_content_language_from_locale?: bool|Param, // Whether to set the Content-Language HTTP header on the Response using the Request locale. // Default: false + * enabled_locales?: list, + * trusted_hosts?: string|list, + * trusted_proxies?: mixed, // Default: ["%env(default::SYMFONY_TRUSTED_PROXIES)%"] + * trusted_headers?: string|list, + * error_controller?: scalar|Param|null, // Default: "error_controller" + * handle_all_throwables?: bool|Param, // HttpKernel will handle all kinds of \Throwable. // Default: true + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * stateless_token_ids?: list, + * check_header?: scalar|Param|null, // Whether to check the CSRF token in a header in addition to a cookie when using stateless protection. // Default: false + * cookie_name?: scalar|Param|null, // The name of the cookie to use when using stateless protection. // Default: "csrf-token" + * }, + * form?: bool|array{ // Form configuration + * enabled?: bool|Param, // Default: false + * csrf_protection?: bool|array{ + * enabled?: scalar|Param|null, // Default: null + * token_id?: scalar|Param|null, // Default: null + * field_name?: scalar|Param|null, // Default: "_token" + * field_attr?: array, + * }, + * }, + * http_cache?: bool|array{ // HTTP cache configuration + * enabled?: bool|Param, // Default: false + * debug?: bool|Param, // Default: "%kernel.debug%" + * trace_level?: "none"|"short"|"full"|Param, + * trace_header?: scalar|Param|null, + * default_ttl?: int|Param, + * private_headers?: list, + * skip_response_headers?: list, + * allow_reload?: bool|Param, + * allow_revalidate?: bool|Param, + * stale_while_revalidate?: int|Param, + * stale_if_error?: int|Param, + * terminate_on_cache_hit?: bool|Param, // Deprecated: Setting the "framework.http_cache.terminate_on_cache_hit.terminate_on_cache_hit" configuration option is deprecated. It will be removed in version 9.0. + * }, + * esi?: bool|array{ // ESI configuration + * enabled?: bool|Param, // Default: false + * }, + * ssi?: bool|array{ // SSI configuration + * enabled?: bool|Param, // Default: false + * }, + * fragments?: bool|array{ // Fragments configuration + * enabled?: bool|Param, // Default: false + * hinclude_default_template?: scalar|Param|null, // Default: null + * path?: scalar|Param|null, // Default: "/_fragment" + * }, + * profiler?: bool|array{ // Profiler configuration + * enabled?: bool|Param, // Default: false + * collect?: bool|Param, // Default: true + * collect_parameter?: scalar|Param|null, // The name of the parameter to use to enable or disable collection on a per request basis. // Default: null + * only_exceptions?: bool|Param, // Default: false + * only_main_requests?: bool|Param, // Default: false + * dsn?: scalar|Param|null, // Default: "file:%kernel.cache_dir%/profiler" + * collect_serializer_data?: true|Param, // Deprecated: Setting the "framework.profiler.collect_serializer_data.collect_serializer_data" configuration option is deprecated. It will be removed in version 9.0. // Default: true + * }, + * workflows?: bool|array{ + * enabled?: bool|Param, // Default: false + * workflows?: array, + * definition_validators?: list, + * support_strategy?: scalar|Param|null, + * initial_marking?: \BackedEnum|string|list, + * events_to_dispatch?: null|list, + * places?: string|list, + * }>, + * transitions?: list, + * to?: \BackedEnum|string|list, + * weight?: int|Param, // Default: 1 + * metadata?: array, + * }>, + * metadata?: array, + * }>, + * }, + * router?: bool|array{ // Router configuration + * enabled?: bool|Param, // Default: false + * resource?: scalar|Param|null, + * type?: scalar|Param|null, + * default_uri?: scalar|Param|null, // The default URI used to generate URLs in a non-HTTP context. // Default: null + * http_port?: scalar|Param|null, // Default: 80 + * https_port?: scalar|Param|null, // Default: 443 + * strict_requirements?: scalar|Param|null, // set to true to throw an exception when a parameter does not match the requirements set to false to disable exceptions when a parameter does not match the requirements (and return null instead) set to null to disable parameter checks against requirements 'true' is the preferred configuration in development mode, while 'false' or 'null' might be preferred in production // Default: true + * utf8?: bool|Param, // Default: true + * }, + * session?: bool|array{ // Session configuration + * enabled?: bool|Param, // Default: false + * storage_factory_id?: scalar|Param|null, // Default: "session.storage.factory.native" + * handler_id?: scalar|Param|null, // Defaults to using the native session handler, or to the native *file* session handler if "save_path" is not null. + * name?: scalar|Param|null, + * cookie_lifetime?: scalar|Param|null, + * cookie_path?: scalar|Param|null, + * cookie_domain?: scalar|Param|null, + * cookie_secure?: true|false|"auto"|Param, // Default: "auto" + * cookie_httponly?: bool|Param, // Default: true + * cookie_samesite?: null|"lax"|"strict"|"none"|Param, // Default: "lax" + * use_cookies?: bool|Param, + * gc_divisor?: scalar|Param|null, + * gc_probability?: scalar|Param|null, + * gc_maxlifetime?: scalar|Param|null, + * save_path?: scalar|Param|null, // Defaults to "%kernel.cache_dir%/sessions" if the "handler_id" option is not null. + * metadata_update_threshold?: int|Param, // Seconds to wait between 2 session metadata updates. // Default: 0 + * }, + * request?: bool|array{ // Request configuration + * enabled?: bool|Param, // Default: false + * formats?: array>, + * }, + * assets?: bool|array{ // Assets configuration + * enabled?: bool|Param, // Default: false + * strict_mode?: bool|Param, // Throw an exception if an entry is missing from the manifest.json. // Default: false + * version_strategy?: scalar|Param|null, // Default: null + * version?: scalar|Param|null, // Default: null + * version_format?: scalar|Param|null, // Default: "%%s?%%s" + * json_manifest_path?: scalar|Param|null, // Default: null + * base_path?: scalar|Param|null, // Default: "" + * base_urls?: string|list, + * packages?: array, + * }>, + * }, + * asset_mapper?: bool|array{ // Asset Mapper configuration + * enabled?: bool|Param, // Default: false + * paths?: string|array, + * excluded_patterns?: list, + * exclude_dotfiles?: bool|Param, // If true, any files starting with "." will be excluded from the asset mapper. // Default: true + * server?: bool|Param, // If true, a "dev server" will return the assets from the public directory (true in "debug" mode only by default). // Default: true + * public_prefix?: scalar|Param|null, // The public path where the assets will be written to (and served from when "server" is true). // Default: "/assets/" + * missing_import_mode?: "strict"|"warn"|"ignore"|Param, // Behavior if an asset cannot be found when imported from JavaScript or CSS files - e.g. "import './non-existent.js'". "strict" means an exception is thrown, "warn" means a warning is logged, "ignore" means the import is left as-is. // Default: "warn" + * extensions?: array, + * importmap_path?: scalar|Param|null, // The path of the importmap.php file. // Default: "%kernel.project_dir%/importmap.php" + * importmap_polyfill?: scalar|Param|null, // The importmap name that will be used to load the polyfill. Set to false to disable. // Default: "es-module-shims" + * importmap_script_attributes?: array, + * vendor_dir?: scalar|Param|null, // The directory to store JavaScript vendors. // Default: "%kernel.project_dir%/assets/vendor" + * precompress?: bool|array{ // Precompress assets with Brotli, Zstandard and gzip. + * enabled?: bool|Param, // Default: false + * formats?: list, + * extensions?: list, + * }, + * }, + * translator?: bool|array{ // Translator configuration + * enabled?: bool|Param, // Default: false + * fallbacks?: string|list, + * logging?: bool|Param, // Default: false + * formatter?: scalar|Param|null, // Default: "translator.formatter.default" + * cache_dir?: scalar|Param|null, // Default: "%kernel.cache_dir%/translations" + * default_path?: scalar|Param|null, // The default path used to load translations. // Default: "%kernel.project_dir%/translations" + * paths?: list, + * pseudo_localization?: bool|array{ + * enabled?: bool|Param, // Default: false + * accents?: bool|Param, // Default: true + * expansion_factor?: float|Param, // Default: 1.0 + * brackets?: bool|Param, // Default: true + * parse_html?: bool|Param, // Default: false + * localizable_html_attributes?: list, + * }, + * providers?: array, + * locales?: list, + * }>, + * globals?: array, + * domain?: string|Param, + * }>, + * }, + * validation?: bool|array{ // Validation configuration + * enabled?: bool|Param, // Default: false + * enable_attributes?: bool|Param, // Default: true + * static_method?: string|list, + * translation_domain?: scalar|Param|null, // Default: "validators" + * email_validation_mode?: "html5"|"html5-allow-no-tld"|"strict"|Param, // Default: "html5" + * mapping?: array{ + * paths?: list, + * }, + * not_compromised_password?: bool|array{ + * enabled?: bool|Param, // When disabled, compromised passwords will be accepted as valid. // Default: true + * endpoint?: scalar|Param|null, // API endpoint for the NotCompromisedPassword Validator. // Default: null + * }, + * disable_translation?: bool|Param, // Default: false + * property_metadata_existence_check?: bool|Param, // When enabled, validateProperty() and validatePropertyValue() throw an exception if no metadata is found for the given property. // Default: false + * auto_mapping?: array, + * }>, + * }, + * serializer?: bool|array{ // Serializer configuration + * enabled?: bool|Param, // Default: false + * enable_attributes?: bool|Param, // Default: true + * name_converter?: scalar|Param|null, + * circular_reference_handler?: scalar|Param|null, + * max_depth_handler?: scalar|Param|null, + * mapping?: array{ + * paths?: list, + * }, + * default_context?: array, + * named_serializers?: array, + * include_built_in_normalizers?: bool|Param, // Whether to include the built-in normalizers // Default: true + * include_built_in_encoders?: bool|Param, // Whether to include the built-in encoders // Default: true + * }>, + * }, + * property_access?: bool|array{ // Property access configuration + * enabled?: bool|Param, // Default: true + * magic_call?: bool|Param, // Default: false + * magic_get?: bool|Param, // Default: true + * magic_set?: bool|Param, // Default: true + * throw_exception_on_invalid_index?: bool|Param, // Default: false + * throw_exception_on_invalid_property_path?: bool|Param, // Default: true + * }, + * type_info?: bool|array{ // Type info configuration + * enabled?: bool|Param, // Default: true + * aliases?: array, + * }, + * property_info?: bool|array{ // Property info configuration + * enabled?: bool|Param, // Default: true + * with_constructor_extractor?: bool|Param, // Registers the constructor extractor. // Default: true + * }, + * cache?: array{ // Cache configuration + * prefix_seed?: scalar|Param|null, // Used to namespace cache keys when using several apps with the same shared backend. // Default: "_%kernel.project_dir%.%kernel.container_class%" + * app?: scalar|Param|null, // App related cache pools configuration. // Default: "cache.adapter.filesystem" + * system?: scalar|Param|null, // System related cache pools configuration. // Default: "cache.adapter.system" + * directory?: scalar|Param|null, // Default: "%kernel.share_dir%/pools/app" + * default_psr6_provider?: scalar|Param|null, + * default_redis_provider?: scalar|Param|null, // Default: "redis://localhost" + * default_valkey_provider?: scalar|Param|null, // Default: "valkey://localhost" + * default_memcached_provider?: scalar|Param|null, // Default: "memcached://localhost" + * default_doctrine_dbal_provider?: scalar|Param|null, // Default: "database_connection" + * default_pdo_provider?: scalar|Param|null, // Default: null + * pools?: array, + * tags?: scalar|Param|null, // Default: null + * public?: bool|Param, // Default: false + * default_lifetime?: scalar|Param|null, // Default lifetime of the pool. + * provider?: scalar|Param|null, // Overwrite the setting from the default provider for this adapter. + * early_expiration_message_bus?: scalar|Param|null, + * clearer?: scalar|Param|null, + * marshaller?: scalar|Param|null, // The marshaller service to use for this pool. + * }>, + * }, + * php_errors?: array{ // PHP errors handling configuration + * log?: mixed, // Use the application logger instead of the PHP logger for logging PHP errors. // Default: true + * throw?: bool|Param, // Throw PHP errors as \ErrorException instances. // Default: true + * }, + * exceptions?: array, + * web_link?: bool|array{ // Web links configuration + * enabled?: bool|Param, // Default: false + * }, + * lock?: bool|string|array{ // Lock configuration + * enabled?: bool|Param, // Default: false + * resources?: string|array>, + * }, + * semaphore?: bool|string|array{ // Semaphore configuration + * enabled?: bool|Param, // Default: false + * resources?: string|array, + * }, + * messenger?: bool|array{ // Messenger configuration + * enabled?: bool|Param, // Default: false + * routing?: array>, + * serializer?: array{ + * default_serializer?: scalar|Param|null, // Service id to use as the default serializer for the transports. // Default: "messenger.transport.native_php_serializer" + * symfony_serializer?: array{ + * format?: scalar|Param|null, // Serialization format for the messenger.transport.symfony_serializer service (which is not the serializer used by default). // Default: "json" + * context?: array, + * }, + * }, + * transports?: array, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * retry_strategy?: string|array{ + * service?: scalar|Param|null, // Service id to override the retry strategy entirely. // Default: null + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: this delay = (delay * (multiple ^ retries)). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness to apply to the delay (between 0 and 1). // Default: 0.1 + * }, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use when processing messages. // Default: null + * }>, + * failure_transport?: scalar|Param|null, // Transport name to send failed messages to (after all retries have failed). // Default: null + * stop_worker_on_signals?: int|string|list, + * default_bus?: scalar|Param|null, // Default: null + * buses?: array, + * }>, + * }>, + * }, + * scheduler?: bool|array{ // Scheduler configuration + * enabled?: bool|Param, // Default: false + * }, + * disallow_search_engine_index?: bool|Param, // Enabled by default when debug is enabled. // Default: true + * http_client?: bool|array{ // HTTP Client configuration + * enabled?: bool|Param, // Default: false + * max_host_connections?: int|Param, // The maximum number of connections to a single host. + * default_options?: array{ + * headers?: array, + * vars?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...) + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400 + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }, + * mock_response_factory?: scalar|Param|null, // `true` to always return empty 200 responses, or the id of the service to use to generate mock responses - which should be either an invokable or an iterable. + * scoped_clients?: array, + * headers?: array, + * max_redirects?: int|Param, // The maximum number of redirects to follow. + * http_version?: scalar|Param|null, // The default HTTP version, typically 1.1 or 2.0, leave to null for the best version. + * resolve?: array, + * proxy?: scalar|Param|null, // The URL of the proxy to pass requests through or null for automatic detection. + * no_proxy?: scalar|Param|null, // A comma separated list of hosts that do not require a proxy to be reached. + * timeout?: float|Param, // The idle timeout, defaults to the "default_socket_timeout" ini parameter. + * max_duration?: float|Param, // The maximum execution time for the request+response as a whole. + * bindto?: scalar|Param|null, // A network interface name, IP address, a host name or a UNIX socket to bind to. + * verify_peer?: bool|Param, // Indicates if the peer should be verified in a TLS context. + * verify_host?: bool|Param, // Indicates if the host should exist as a certificate common name. + * cafile?: scalar|Param|null, // A certificate authority file. + * capath?: scalar|Param|null, // A directory that contains multiple certificate authority files. + * local_cert?: scalar|Param|null, // A PEM formatted certificate file. + * local_pk?: scalar|Param|null, // A private key file. + * passphrase?: scalar|Param|null, // The passphrase used to encrypt the "local_pk" file. + * ciphers?: scalar|Param|null, // A list of TLS ciphers separated by colons, commas or spaces (e.g. "RC3-SHA:TLS13-AES-128-GCM-SHA256"...). + * peer_fingerprint?: array{ // Associative array: hashing algorithm => hash(es). + * sha1?: mixed, + * pin-sha256?: mixed, + * md5?: mixed, + * }, + * crypto_method?: scalar|Param|null, // The minimum version of TLS to accept; must be one of STREAM_CRYPTO_METHOD_TLSv*_CLIENT constants. + * mock_response_factory?: scalar|Param|null, // `true` to always return empty 200 responses, `false` to disable mocking, or the id of the service to use to generate mock responses (invokable or iterable). + * extra?: array, + * rate_limiter?: scalar|Param|null, // Rate limiter name to use for throttling requests. // Default: null + * caching?: bool|array{ // Caching configuration. + * enabled?: bool|Param, // Default: false + * cache_pool?: string|Param, // The taggable cache pool to use for storing the responses. // Default: "cache.http_client" + * shared?: bool|Param, // Indicates whether the cache is shared (public) or private. // Default: true + * max_ttl?: int|Param, // The maximum TTL (in seconds) allowed for cached responses. // Default: 86400 + * }, + * retry_failed?: bool|array{ + * enabled?: bool|Param, // Default: false + * retry_strategy?: scalar|Param|null, // service id to override the retry strategy. // Default: null + * http_codes?: int|string|array, + * }>, + * max_retries?: int|Param, // Default: 3 + * delay?: int|Param, // Time in ms to delay (or the initial value when multiplier is used). // Default: 1000 + * multiplier?: float|Param, // If greater than 1, delay will grow exponentially for each retry: delay * (multiple ^ retries). // Default: 2 + * max_delay?: int|Param, // Max time in ms that a retry should ever be delayed (0 = infinite). // Default: 0 + * jitter?: float|Param, // Randomness in percent (between 0 and 1) to apply to the delay. // Default: 0.1 + * }, + * }>, + * }, + * mailer?: bool|array{ // Mailer configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * dsn?: scalar|Param|null, // Default: null + * transports?: array, + * envelope?: array{ // Mailer Envelope configuration + * sender?: scalar|Param|null, + * recipients?: string|list, + * allowed_recipients?: string|list, + * }, + * headers?: array, + * dkim_signer?: bool|array{ // DKIM signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Key content, or path to key (in PEM format with the `file://` prefix) // Default: "" + * domain?: scalar|Param|null, // Default: "" + * select?: scalar|Param|null, // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: "" + * options?: array, + * }, + * smime_signer?: bool|array{ // S/MIME signer configuration + * enabled?: bool|Param, // Default: false + * key?: scalar|Param|null, // Path to key (in PEM format) // Default: "" + * certificate?: scalar|Param|null, // Path to certificate (in PEM format without the `file://` prefix) // Default: "" + * passphrase?: scalar|Param|null, // The private key passphrase // Default: null + * extra_certificates?: scalar|Param|null, // Default: null + * sign_options?: int|Param, // Default: null + * }, + * smime_encrypter?: bool|array{ // S/MIME encrypter configuration + * enabled?: bool|Param, // Default: false + * repository?: scalar|Param|null, // S/MIME certificate repository service. This service shall implement the `Symfony\Component\Mailer\EventListener\SmimeCertificateRepositoryInterface`. // Default: "" + * cipher?: int|Param, // A set of algorithms used to encrypt the message // Default: null + * }, + * }, + * secrets?: bool|array{ + * enabled?: bool|Param, // Default: true + * vault_directory?: scalar|Param|null, // Default: "%kernel.project_dir%/config/secrets/%kernel.runtime_environment%" + * local_dotenv_file?: scalar|Param|null, // Default: "%kernel.project_dir%/.env.%kernel.environment%.local" + * decryption_env_var?: scalar|Param|null, // Default: "base64:default::SYMFONY_DECRYPTION_SECRET" + * }, + * notifier?: bool|array{ // Notifier configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. Defaults to the default bus if the Messenger component is installed. // Default: null + * chatter_transports?: array, + * texter_transports?: array, + * notification_on_failed_messages?: bool|Param, // Default: false + * channel_policy?: array>, + * admin_recipients?: list, + * }, + * rate_limiter?: bool|array{ // Rate limiter configuration + * enabled?: bool|Param, // Default: false + * limiters?: array, + * limit?: int|Param, // The maximum allowed hits in a fixed interval or burst. + * interval?: scalar|Param|null, // Configures the fixed interval if "policy" is set to "fixed_window" or "sliding_window". The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * rate?: array{ // Configures the fill rate if "policy" is set to "token_bucket". + * interval?: scalar|Param|null, // Configures the rate interval. The value must be a number followed by "second", "minute", "hour", "day", "week" or "month" (or their plural equivalent). + * amount?: int|Param, // Amount of tokens to add each interval. // Default: 1 + * }, + * anchor_at?: scalar|Param|null, // Aligns the "fixed_window" policy to a calendar (e.g. "2024-01-05 00:00:00 UTC" combined with `interval: 1 month` resets the counter on the 5th of each month). UTC if not specified. // Default: null + * }>, + * }, + * uid?: bool|array{ // Uid configuration + * enabled?: bool|Param, // Default: false + * default_uuid_version?: 7|6|4|1|Param, // Default: 7 + * name_based_uuid_version?: 5|3|Param, // Default: 5 + * name_based_uuid_namespace?: scalar|Param|null, + * time_based_uuid_version?: 7|6|1|Param, // Default: 7 + * time_based_uuid_node?: scalar|Param|null, + * uuid47_secret?: scalar|Param|null, // A high-entropy secret used by the "uuid47_transformer" service. Defaults to "kernel.secret". // Default: null + * }, + * html_sanitizer?: bool|array{ // HtmlSanitizer configuration + * enabled?: bool|Param, // Default: false + * sanitizers?: array, + * block_elements?: string|list, + * drop_elements?: string|list, + * allow_attributes?: array, + * drop_attributes?: array, + * force_attributes?: array>, + * force_https_urls?: bool|Param, // Transforms URLs using the HTTP scheme to use the HTTPS scheme instead. // Default: false + * allowed_link_schemes?: string|list, + * allowed_link_hosts?: null|string|list, + * allow_relative_links?: bool|Param, // Allows relative URLs to be used in links href attributes. // Default: false + * allowed_media_schemes?: string|list, + * allowed_media_hosts?: null|string|list, + * allow_relative_medias?: bool|Param, // Allows relative URLs to be used in media source attributes (img, audio, video, ...). // Default: false + * with_attribute_sanitizers?: string|list, + * without_attribute_sanitizers?: string|list, + * max_input_length?: int|Param, // The maximum length allowed for the sanitized input. // Default: 0 + * }>, + * }, + * webhook?: bool|array{ // Webhook configuration + * enabled?: bool|Param, // Default: false + * message_bus?: scalar|Param|null, // The message bus to use. // Default: "messenger.default_bus" + * event_header_name?: scalar|Param|null, // Default: "Webhook-Event" + * id_header_name?: scalar|Param|null, // Default: "Webhook-Id" + * signature_header_name?: scalar|Param|null, // Default: "Webhook-Signature" + * signing_algorithm?: scalar|Param|null, // Default: "sha256" + * routing?: array, + * }, + * remote-event?: bool|array{ // RemoteEvent configuration + * enabled?: bool|Param, // Default: false + * }, + * json_streamer?: bool|array{ // JSON streamer configuration + * enabled?: bool|Param, // Default: false + * default_options?: array{ + * include_null_properties?: bool|Param, // Encode the properties with null value // Default: false + * ... + * }, + * }, + * } + * @psalm-type SecurityConfig = array{ + * access_denied_url?: scalar|Param|null, // Default: null + * session_fixation_strategy?: "none"|"migrate"|"invalidate"|Param, // Default: "migrate" + * expose_security_errors?: \Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::None|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::AccountStatus|\Symfony\Component\Security\Http\Authentication\ExposeSecurityLevel::All|Param, // Default: "none" + * erase_credentials?: bool|Param, // Deprecated: Setting the "security.erase_credentials.erase_credentials" configuration option is deprecated. It will be removed in Symfony 9.0, as the "eraseCredentials()" method was removed in Symfony 8.0. // Default: true + * access_decision_manager?: array{ + * strategy?: "affirmative"|"consensus"|"unanimous"|"priority"|Param, + * service?: scalar|Param|null, + * strategy_service?: scalar|Param|null, + * allow_if_all_abstain?: bool|Param, // Default: false + * allow_if_equal_granted_denied?: bool|Param, // Default: true + * }, + * password_hashers?: array, + * hash_algorithm?: scalar|Param|null, // Name of hashing algorithm for PBKDF2 (i.e. sha256, sha512, etc..) See hash_algos() for a list of supported algorithms. // Default: "sha512" + * key_length?: scalar|Param|null, // Default: 40 + * ignore_case?: bool|Param, // Default: false + * encode_as_base64?: bool|Param, // Default: true + * iterations?: scalar|Param|null, // Default: 5000 + * cost?: int|Param, // Default: null + * memory_cost?: scalar|Param|null, // Default: null + * time_cost?: scalar|Param|null, // Default: null + * id?: scalar|Param|null, + * }>, + * providers?: array, + * }, + * memory?: array{ + * users?: array, + * }>, + * }, + * ldap?: array{ + * service?: scalar|Param|null, + * base_dn?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: null + * search_password?: scalar|Param|null, // Default: null + * extra_fields?: list, + * default_roles?: string|list, + * role_fetcher?: scalar|Param|null, // Default: null + * uid_key?: scalar|Param|null, // Default: "sAMAccountName" + * filter?: scalar|Param|null, // Default: "({uid_key}={user_identifier})" + * password_attribute?: scalar|Param|null, // Default: null + * }, + * }>, + * firewalls?: array, + * security?: bool|Param, // Default: true + * user_checker?: scalar|Param|null, // The UserChecker to use when authenticating users in this firewall. // Default: "security.user_checker" + * request_matcher?: scalar|Param|null, + * access_denied_url?: scalar|Param|null, + * access_denied_handler?: scalar|Param|null, + * entry_point?: scalar|Param|null, // An enabled authenticator name or a service id that implements "Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface". + * provider?: scalar|Param|null, + * stateless?: bool|Param, // Default: false + * lazy?: bool|Param, // Default: false + * context?: scalar|Param|null, + * logout?: array{ + * enable_csrf?: bool|Param|null, // Default: null + * csrf_token_id?: scalar|Param|null, // Default: "logout" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_manager?: scalar|Param|null, + * path?: scalar|Param|null, // Default: "/logout" + * target?: scalar|Param|null, // Default: "/" + * invalidate_session?: bool|Param, // Default: true + * clear_site_data?: string|list<"*"|"cache"|"cookies"|"storage"|"clientHints"|"executionContexts"|"prefetchCache"|"prerenderCache"|Param>, + * delete_cookies?: string|array, + * }, + * switch_user?: array{ + * provider?: scalar|Param|null, + * parameter?: scalar|Param|null, // Default: "_switch_user" + * role?: scalar|Param|null, // Default: "ROLE_ALLOWED_TO_SWITCH" + * target_route?: scalar|Param|null, // Default: null + * }, + * required_badges?: list, + * custom_authenticators?: list, + * login_throttling?: array{ + * limiter?: scalar|Param|null, // A service id implementing "Symfony\Component\HttpFoundation\RateLimiter\RequestRateLimiterInterface". + * max_attempts?: int|Param, // Default: 5 + * interval?: scalar|Param|null, // Default: "1 minute" + * lock_factory?: scalar|Param|null, // The service ID of the lock factory used by the login rate limiter (or null to disable locking). // Default: null + * cache_pool?: string|Param, // The cache pool to use for storing the limiter state // Default: "cache.rate_limiter" + * storage_service?: string|Param, // The service ID of a custom storage implementation, this precedes any configured "cache_pool" // Default: null + * }, + * x509?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN_Email" + * credentials?: scalar|Param|null, // Default: "SSL_CLIENT_S_DN" + * user_identifier?: scalar|Param|null, // Default: "emailAddress" + * }, + * remote_user?: array{ + * provider?: scalar|Param|null, + * user?: scalar|Param|null, // Default: "REMOTE_USER" + * }, + * login_link?: array{ + * check_route?: scalar|Param|null, // Route that will validate the login link - e.g. "app_login_link_verify". + * check_post_only?: scalar|Param|null, // If true, only HTTP POST requests to "check_route" will be handled by the authenticator. // Default: false + * signature_properties?: list, + * lifetime?: int|Param, // The lifetime of the login link in seconds. // Default: 600 + * max_uses?: int|Param, // Max number of times a login link can be used - null means unlimited within lifetime. // Default: null + * used_link_cache?: scalar|Param|null, // Cache service id used to expired links of max_uses is set. + * success_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface. + * failure_handler?: scalar|Param|null, // A service id that implements Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface. + * provider?: scalar|Param|null, // The user provider to load users from. + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * login_path?: scalar|Param|null, // Default: "/login" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * }, + * form_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_parameter?: scalar|Param|null, // Default: "_username" + * password_parameter?: scalar|Param|null, // Default: "_password" + * csrf_parameter?: scalar|Param|null, // Default: "_csrf_token" + * csrf_token_id?: scalar|Param|null, // Default: "authenticate" + * enable_csrf?: bool|Param, // Default: false + * post_only?: bool|Param, // Default: true + * form_only?: bool|Param, // Default: false + * always_use_default_target_path?: bool|Param, // Default: false + * default_target_path?: scalar|Param|null, // Default: "/" + * target_path_parameter?: scalar|Param|null, // Default: "_target_path" + * use_referer?: bool|Param, // Default: false + * failure_path?: scalar|Param|null, // Default: null + * failure_forward?: bool|Param, // Default: false + * failure_path_parameter?: scalar|Param|null, // Default: "_failure_path" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * json_login?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * }, + * json_login_ldap?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * check_path?: scalar|Param|null, // Default: "/login_check" + * use_forward?: bool|Param, // Default: false + * login_path?: scalar|Param|null, // Default: "/login" + * username_path?: scalar|Param|null, // Default: "username" + * password_path?: scalar|Param|null, // Default: "password" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * access_token?: array{ + * provider?: scalar|Param|null, + * remember_me?: bool|Param, // Default: true + * success_handler?: scalar|Param|null, + * failure_handler?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: null + * token_extractors?: string|list, + * token_handler?: string|array{ + * id?: scalar|Param|null, + * oidc_user_info?: string|array{ + * base_uri?: scalar|Param|null, // Base URI of the userinfo endpoint on the OIDC server, or the OIDC server URI to use the discovery (require "discovery" to be configured). + * discovery?: array{ // Enable the OIDC discovery. + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g. sub, email, etc.). // Default: "sub" + * client?: scalar|Param|null, // HttpClient service id to use to call the OIDC server. + * }, + * oidc?: array{ + * discovery?: array{ // Enable the OIDC discovery. + * base_uri?: string|list, + * cache?: array{ + * id?: scalar|Param|null, // Cache service id to use to cache the OIDC discovery configuration. + * }, + * enforce_key_usage_verification?: bool|Param, // When enabled (default), only keys explicitly designated for signature (via "use":"sig" or a "key_ops" entry containing "sign"/"verify") are accepted. When disabled, keys without any usage designation are also accepted; keys explicitly restricted to encryption are still rejected. // Default: true + * }, + * claim?: scalar|Param|null, // Claim which contains the user identifier (e.g.: sub, email..). // Default: "sub" + * audience?: scalar|Param|null, // Audience set in the token, for validation purpose. + * issuers?: list, + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to sign the token (must contain a list of valid public keys). + * encryption?: bool|array{ + * enabled?: bool|Param, // Default: false + * enforce?: bool|Param, // When enabled, the token shall be encrypted. // Default: false + * algorithms?: list, + * keyset?: scalar|Param|null, // JSON-encoded JWKSet used to decrypt the token (must contain a list of valid private keys). + * }, + * }, + * cas?: array{ + * validation_url?: scalar|Param|null, // CAS server validation URL + * prefix?: scalar|Param|null, // CAS prefix // Default: "cas" + * http_client?: scalar|Param|null, // HTTP Client service // Default: null + * }, + * oauth2?: scalar|Param|null, + * }, + * }, + * http_basic?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * }, + * http_basic_ldap?: array{ + * provider?: scalar|Param|null, + * realm?: scalar|Param|null, // Default: "Secured Area" + * service?: scalar|Param|null, // Default: "ldap" + * dn_string?: scalar|Param|null, // Default: "{user_identifier}" + * query_string?: scalar|Param|null, + * search_dn?: scalar|Param|null, // Default: "" + * search_password?: scalar|Param|null, // Default: "" + * }, + * remember_me?: array{ + * secret?: scalar|Param|null, // Default: "%kernel.secret%" + * service?: scalar|Param|null, + * user_providers?: string|list, + * catch_exceptions?: bool|Param, // Default: true + * signature_properties?: list, + * token_provider?: string|array{ + * service?: scalar|Param|null, // The service ID of a custom remember-me token provider. + * doctrine?: bool|array{ + * enabled?: bool|Param, // Default: false + * connection?: scalar|Param|null, // Default: null + * }, + * }, + * token_verifier?: scalar|Param|null, // The service ID of a custom rememberme token verifier. + * name?: scalar|Param|null, // Default: "REMEMBERME" + * lifetime?: int|Param, // Default: 31536000 + * path?: scalar|Param|null, // Default: "/" + * domain?: scalar|Param|null, // Default: null + * secure?: true|false|"auto"|Param, // Default: false + * httponly?: bool|Param, // Default: true + * samesite?: null|"lax"|"strict"|"none"|Param, // Default: null + * always_remember_me?: bool|Param, // Default: false + * remember_me_parameter?: scalar|Param|null, // Default: "_remember_me" + * }, + * }>, + * access_control?: list, + * attributes?: array, + * route?: scalar|Param|null, // Default: null + * methods?: string|list, + * allow_if?: scalar|Param|null, // Default: null + * roles?: string|list, + * }>, + * role_hierarchy?: array>, + * } + * @psalm-type TwigConfig = array{ + * form_themes?: list, + * globals?: array, + * autoescape_service?: scalar|Param|null, // Default: null + * autoescape_service_method?: scalar|Param|null, // Default: null + * cache?: scalar|Param|null, // Default: true + * charset?: scalar|Param|null, // Default: "%kernel.charset%" + * debug?: bool|Param, // Default: "%kernel.debug%" + * strict_variables?: bool|Param, // Default: "%kernel.debug%" + * auto_reload?: scalar|Param|null, + * optimizations?: int|Param, + * default_path?: scalar|Param|null, // The default path used to load templates. // Default: "%kernel.project_dir%/templates" + * file_name_pattern?: string|list, + * paths?: array, + * date?: array{ // The default format options used by the date filter. + * format?: scalar|Param|null, // Default: "F j, Y H:i" + * interval_format?: scalar|Param|null, // Default: "%d days" + * timezone?: scalar|Param|null, // The timezone used when formatting dates, when set to null, the timezone returned by date_default_timezone_get() is used. // Default: null + * }, + * number_format?: array{ // The default format options for the number_format filter. + * decimals?: int|Param, // Default: 0 + * decimal_point?: scalar|Param|null, // Default: "." + * thousands_separator?: scalar|Param|null, // Default: "," + * }, + * mailer?: array{ + * html_to_text_converter?: scalar|Param|null, // A service implementing the "Symfony\Component\Mime\HtmlToTextConverter\HtmlToTextConverterInterface". // Default: null + * }, + * } + * @psalm-type MakerConfig = array{ + * root_namespace?: scalar|Param|null, // Default: "App" + * generate_final_classes?: bool|Param, // Default: true + * generate_final_entities?: bool|Param, // Default: false + * } + * @psalm-type ConfigType = array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * "when@dev"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * maker?: MakerConfig, + * }, + * "when@prod"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * }, + * "when@test"?: array{ + * imports?: ImportsConfig, + * parameters?: ParametersConfig, + * services?: ServicesConfig, + * framework?: FrameworkConfig, + * security?: SecurityConfig, + * twig?: TwigConfig, + * }, + * ..., + * }> + * } + */ +final class App +{ + /** + * @param ConfigType $config + * + * @psalm-return ConfigType + */ + public static function config(array $config): array + { + /** @var ConfigType $config */ + $config = AppReference::config($config); + + return $config; + } +} + +namespace Symfony\Component\Routing\Loader\Configurator; + +/** + * This class provides array-shapes for configuring the routes of an application. + * + * Example: + * + * ```php + * // config/routes.php + * namespace Symfony\Component\Routing\Loader\Configurator; + * + * return Routes::config([ + * 'controllers' => [ + * 'resource' => 'routing.controllers', + * ], + * ]); + * ``` + * + * @psalm-type RouteConfig = array{ + * path: string|array, + * controller?: string, + * methods?: string|list, + * requirements?: array, + * defaults?: array, + * options?: array, + * host?: string|array, + * schemes?: string|list, + * condition?: string, + * locale?: string, + * format?: string, + * utf8?: bool, + * stateless?: bool, + * } + * @psalm-type ImportConfig = array{ + * resource: string, + * type?: string, + * exclude?: string|list, + * prefix?: string|array, + * name_prefix?: string, + * trailing_slash_on_root?: bool, + * controller?: string, + * methods?: string|list, + * requirements?: array, + * defaults?: array, + * options?: array, + * host?: string|array, + * schemes?: string|list, + * condition?: string, + * locale?: string, + * format?: string, + * utf8?: bool, + * stateless?: bool, + * } + * @psalm-type AliasConfig = array{ + * alias: string, + * deprecated?: array{package:string, version:string, message?:string}, + * } + * @psalm-type RoutesConfig = array{ + * "when@dev"?: array, + * "when@prod"?: array, + * "when@test"?: array, + * ... + * } + */ +final class Routes +{ + /** + * @param RoutesConfig $config + * + * @psalm-return RoutesConfig + */ + public static function config(array $config): array + { + return $config; + } +} diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 0000000..cef258c --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,11 @@ +# yaml-language-server: $schema=../vendor/symfony/routing/Loader/schema/routing.schema.json + +# This file is the entry point to configure the routes of your app. +# Methods with the #[Route] attribute are automatically imported. +# See also https://symfony.com/doc/current/routing.html + +# To list all registered routes, run the following command: +# bin/console debug:router + +controllers: + resource: routing.controllers diff --git a/config/routes/framework.yaml b/config/routes/framework.yaml new file mode 100644 index 0000000..bc1feac --- /dev/null +++ b/config/routes/framework.yaml @@ -0,0 +1,4 @@ +when@dev: + _errors: + resource: '@FrameworkBundle/Resources/config/routing/errors.php' + prefix: /_error diff --git a/config/routes/security.yaml b/config/routes/security.yaml new file mode 100644 index 0000000..f853be1 --- /dev/null +++ b/config/routes/security.yaml @@ -0,0 +1,3 @@ +_security_logout: + resource: security.route_loader.logout + type: service diff --git a/config/services.yaml b/config/services.yaml new file mode 100644 index 0000000..79b8ce2 --- /dev/null +++ b/config/services.yaml @@ -0,0 +1,23 @@ +# yaml-language-server: $schema=../vendor/symfony/dependency-injection/Loader/schema/services.schema.json + +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. +# See also https://symfony.com/doc/current/service_container/import.html + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration +parameters: + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/' + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones diff --git a/docs/agents.md b/docs/agents.md new file mode 100644 index 0000000..81276a0 --- /dev/null +++ b/docs/agents.md @@ -0,0 +1,162 @@ +# Using AI Coding Agents with Dev Containers + +This project ships with a [Dev Container](https://containers.dev/) configuration that enables +AI coding agents to run autonomously inside a sandboxed environment with network-level restrictions. + +[Claude Code](https://claude.ai/claude-code) is pre-installed and configured out of the box, +but the setup also works with other agents such as [OpenAI Codex CLI](https://github.com/openai/codex) +and [opencode](https://opencode.ai). + +This setup is ideal for letting AI agents work on your Symfony project autonomously +while ensuring they cannot reach arbitrary internet hosts. + +## Prerequisites + +- [Docker Desktop](https://www.docker.com/products/docker-desktop/) (or any Docker-compatible runtime) +- [Visual Studio Code](https://code.visualstudio.com/) with the [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension +- A valid subscription or API key for the agent you want to use + +## Quick Start + +1. Open the project in Visual Studio Code. +2. When prompted "Reopen in Container", click **Reopen in Container**. + Alternatively, open the Command Palette (`Ctrl+Shift+P` / `Cmd+Shift+P`) and run + **Dev Containers: Reopen in Container**. +3. Wait for the container to build and start. On each container start, the + `postStartCommand` configures the firewall automatically. +4. Claude Code is pre-installed and configured in YOLO mode — open the Claude Code + panel in Visual Studio Code or run `claude` in the integrated terminal to start using it. + +That's it. Claude Code will run without permission prompts, and the firewall ensures +network access is restricted to only the necessary services. + +## What Is YOLO Mode? + +YOLO mode (also known as "bypass permissions" mode) allows Claude Code to execute +commands, edit files, and perform actions without asking for confirmation at each step. +This dramatically speeds up autonomous coding workflows. + +The Dev Container configuration enables this via two Visual Studio Code settings: + +```json +{ + "claudeCode.allowDangerouslySkipPermissions": true, + "claudeCode.initialPermissionMode": "bypassPermissions" +} +``` + +## Network Sandboxing + +Running an AI agent with full autonomy requires guardrails. The Dev Container includes +a firewall script (`.devcontainer/init-firewall.sh`) that locks down outbound network +access using `iptables` and `ipset`. Only the following destinations are allowed: + +| Destination | Reason | +| ------------------------------------------------- | ------------------------------- | +| GitHub (`github.com`, `api.github.com`) | Git operations, API access | +| Anthropic (`anthropic.com`) | Claude Code backend | +| npm registry (`registry.npmjs.org`) | Node.js dependencies | +| Packagist (`packagist.org`, `repo.packagist.org`) | PHP/Composer dependencies | +| Visual Studio Code Marketplace | Extension downloads | +| Sentry, Statsig | Telemetry (used by Claude Code) | +| Host gateway IP | Communication with Docker host | + +All other outbound connections are **rejected**. The firewall uses +[dnsmasq](https://thekelleys.org.uk/dnsmasq/doc.html) to dynamically resolve +and whitelist IPs for allowed domains, handling CDN IP rotation gracefully. + +Inbound connections from the host gateway IP are allowed on all ports, +and ports 80, 443 (TCP), and 443 (UDP/HTTP3) are open to any source +so you can access your Symfony app from the host browser. + +## Customizing the Allowed Domains + +To allow additional domains (e.g., a private registry or API), edit +`.devcontainer/init-firewall.sh` and add them to the `ipset` line in the +dnsmasq configuration section: + +```bash +# Domains are '/'-separated, ending with the ipset name +ipset=/github.com/anthropic.com/your-domain.com/allowed-domains +``` + +Then rebuild the Dev Container for the changes to take effect. + +## Using Other Agents + +The Dev Container's network sandbox and project context (`.devcontainer/AGENTS.md`) work +with any AI coding agent. You just need to install the agent and whitelist the domains it +needs to reach. + +### OpenAI Codex CLI + +1. Add the OpenAI API domain to the firewall allowlist in `.devcontainer/init-firewall.sh` + (see [Customizing the Allowed Domains](#customizing-the-allowed-domains)): + + ```bash + ipset=/.../api.openai.com/allowed-domains + ``` + +2. Install and run Codex inside the container: + + ```console + npm install -g @openai/codex + export OPENAI_API_KEY=your-key + codex --full-auto + ``` + +### opencode + +1. Add the required API domain to the firewall allowlist (e.g., `api.anthropic.com`, + `api.openai.com`, or your provider's domain). + +2. Install and run opencode inside the container: + + ```console + curl -fsSL https://opencode.ai/install | bash + opencode + ``` + +### Other Agents + +For any other agent, follow the same pattern: + +1. Add the agent's API domain(s) to the firewall allowlist. +2. Install the agent inside the container. +3. Run it — the `.devcontainer/AGENTS.md` file provides project context + to agents that support the convention. + +## Using Without Visual Studio Code + +The Dev Container configuration works with any tool that supports the +[Dev Container specification](https://containers.dev/), including: + +- [Dev Container CLI](https://github.com/devcontainers/cli) (`devcontainer up`) +- [GitHub Codespaces](https://github.com/features/codespaces) +- JetBrains IDEs (with the Dev Containers plugin) + +To use Claude Code from the terminal inside the container: + +```console +claude +``` + +To start directly in YOLO mode from the CLI: + +```console +claude --dangerously-skip-permissions +``` + +## Troubleshooting + +### Firewall blocks a required domain + +If your agent or Composer/npm fails to reach a service, check the firewall +logs and add the domain to the dnsmasq allowlist as described above. + +### Container fails to start + +Ensure Docker is running and that you have allocated enough resources +(at least 2 GB of RAM for the container). The firewall setup requires +`NET_ADMIN` capability, which the Dev Container configures automatically +via Docker Compose. diff --git a/docs/alpine.md b/docs/alpine.md new file mode 100644 index 0000000..fea6271 --- /dev/null +++ b/docs/alpine.md @@ -0,0 +1,61 @@ +# Using Alpine Linux Instead of Debian + +By default, Symfony Docker uses Debian-based FrankenPHP Docker images. +This is the recommended solution. + +Alternatively, it's possible to use Alpine-based images, which are smaller but +are known to be slower, and have several known issues. + +To switch to Alpine-based images, apply the following changes to the `Dockerfile`: + + + +```diff +-FROM dunglas/frankenphp:1-php8.5 AS frankenphp_upstream ++FROM dunglas/frankenphp:1-php8.5-alpine AS frankenphp_upstream + +-SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] ++SHELL ["/bin/ash", "-euxo", "-c"] + +-# hadolint ignore=DL3008 +-RUN <<-EOF +- apt-get update +- apt-get install -y --no-install-recommends \ +- file \ +- git ++# hadolint ignore=DL3018 ++RUN <<-EOF ++ apk add --no-cache \ ++ file \ ++ git + install-php-extensions \ + +-# hadolint ignore=DL3008,SC3054,DL4006 +-RUN <<-'EOF' +- apt-get update +- apt-get install -y --no-install-recommends libtree ++# hadolint ignore=DL3018,SC3054,DL4006 ++RUN <<-'EOF' ++ apk add --no-cache libtree + mkdir -p /tmp/libs +- BINARIES=(frankenphp php file) +- for target in $(printf '%s\n' "${BINARIES[@]}" | xargs -I{} which {}) \ ++ BINARIES="frankenphp php file" ++ for target in $(printf '%s\n' $BINARIES | xargs -I{} which {}) \ + +- libtree -pv "$target" 2>/dev/null | grep -oP '(?:── )\K/\S+(?= \[)' | while IFS= read -r lib; do ++ libtree -pv "$target" 2>/dev/null | sed -n 's/.*── \(\/[^ ]*\) \[.*/\1/p' | while IFS= read -r lib; do + +- rm -rf /var/lib/apt/lists/* + +-FROM debian:13-slim AS frankenphp_prod ++FROM alpine:3 AS frankenphp_prod + +-SHELL ["/bin/bash", "-euxo", "pipefail", "-c"] ++SHELL ["/bin/ash", "-euxo", "-c"] + +-COPY --from=frankenphp_prod_builder /usr/lib/file/magic.mgc /usr/lib/file/magic.mgc ++COPY --from=frankenphp_prod_builder /usr/share/misc/magic.mgc /usr/share/misc/magic.mgc +``` + + diff --git a/docs/digitalocean-dns.png b/docs/digitalocean-dns.png new file mode 100644 index 0000000000000000000000000000000000000000..a084c370bc73fbde6ce5a71b751cbcb6dedc61ae GIT binary patch literal 129432 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 qux@lc<*9`Vga)cnN#$^EK0_i@(z*}sI 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 Pz@PkG6`4{g)8PLD`yHC| literal 0 HcmV?d00001 diff --git a/docs/digitalocean-droplet.png b/docs/digitalocean-droplet.png new file mode 100644 index 0000000000000000000000000000000000000000..be27e499047310ace23dd05879e864efc162e0dc GIT binary patch literal 163083 zcmeGEXIK+k+Xf7y!d5KchK;Cn0a1F9-V~%)fzU&hUZr=GvawMm^rF%eNa($Yibz)= z1VR@91p?9yp}cFn%kwKhrN@l9T}PGBZSdOWBslRIc7-- z2_F{_KWbDzYW62Ag~Q$YVEiigjt|FTcO|EUBAS_JqOn zlV4uZNZbpgurbusu-}3$Q}w$*?7G${?nQQPjiv=?U}n0`VUZdCEyQsyWMC$jh?R~d#*6=#hFf441XY# z_b`=GbU293@4|ZY6|&(==SlPP^P6nik)s#z57|<_iVTH+=-SV;-%GffnkgAY=bcE8 zV6}cAkt#iZq}h4IAJ{N>i)Ex-uZqL^UZv!l=E?4^_ylY2x3Vv{iX9);upVCf+(Tef zzHTyDemh#$`7Mvto2+B-huOr5=cgXVvQqs%udKvP+&XK0>ZDD*!Ur2`Hm+kfp%3X# zosO78h-GpR@2OilhW;7Vr?;`#K+|BEjyXA)bvs4xNGs)j-f-uzdL>N~Tj5Pt6AsPC z5yt0iiXyVUpDO4pPU7_&eja=KGS`!7noklBuHDdm5l?5Qs_-d!$1ac}a0asA|mL#J9Ez5ezdNh9slX|D~S%{ ztSkMockpuy5fi$XJg6$nZry42;>|HQMW3(0GH{;$9mlm#Z#60#W`!OHd@Eq3DZh2z zitKvnS5}t0C#=nM6seo_x1z}S6YguWlEtapd)}^WRw2i%KPTU(OeFi`Z0woj-P1RJ z|J+7Z@fgMaK4JGlm&)h+MdueEoJu&eRGil7nbvXI92z`j{3-EM z*-_)P(cT>LN|Kj-6b{bY@ehXgQn;TJom{^;L620lGp83PkE>_cdh`0=g@gb5O2oaM z%Gcl3NFE~JXPvGQ-uK^4E>)po9Y2)O>$B(!RaHt^X4%YpC>nZgdgVnh5JsI`PiQ_i~Po4b8dMy7wrQjZKeLts_aN2M7k$SpRDG@L$rqNTi_nEB3 zN2xEry5o5|iz4+Eo#%;(XjIXeX7ZL9*)J;RqoO{Xm$JE^cE#}FiBA!Nzsqx6e02L$ z!XF&xx^CZo_(%Gmy-MAQ^Y5kZis(hIC{nQ(C7e-}_F@Qp=)>-jFmUZpy*qBh7i*MN zo@*vYD?g|F5^#eyJ1XV*=7)|im#Z&NMvvqbebD%Fu9`OV(T+8leus~cNbm2qHmv=`H^HM##dAoJMmHszevm)P=zDtFiw1}^p z!F`Jf5IBsz$$s&7##2+|RMuzNo(ZPwsu#1mvNK-EdJtUl`7y^kO9@y;L*TV=GCnPN{z46XAmxR@y6miL^m}dP(y# z33){?Jx}jNrT%<=$QkXGYOhyk?DhO;8QW88h6qWVpn;O}WImM7MNu zSOB%_m>^mzI(peW_R?j<~CKjo$Qc6;N_nbY0L|=Q|UV3Q9-XHsYVP!RIxfx4b zRV_=LWnX;idYSmHV=8)4@2l4&V&U>9siB&W+clYynXlX;$NBslNshb3)xK3rSs7Ul zW?$yXoRl1=99RyMrknj)@836@>DzfexD?{aJVnpA)OrrMz>VSp9nEcy`S_&E4v5HEQCS%O;>=T?1Vvfs~ zw~P&qaYdFt|M0x>d9791%-b2?c4~!QMPWr}#URB=#iBoR&ay`-Me&_kp1J59kabzx zqu$~B*0+>X&bLF}Ha=8I+(}G&U-eAeavt=m=6;kJvRPx zbAeS0vWJ{osd&8_JvFD!kX#}I{mhxDGx!UQ{N_#H%r3R9*fe+tDiKqanw99onTX37 zmM1Sb@Vc9Qs<`_`?~~rg!OWihRDvljfFg zaCk*@eSu@oP??(9z`?uyGW*Qg+6_0$x+k^%s}ILN>dl$xR}DEXCYe?nnvS=)OrUw1 zBK^ciBuCt)@|uc51V(u#Nj8@F)=U!njyQ`IbFs9eZ~4;s16>nYJ^6yxIyTgcDxrdk z1JCcX3s-Xs6;-n0T;-kpsyEX5D>yr^cP=uqNZj#yxt9O^?m$VeetagE*tD$d!q#@m zXiBZf?+*RB=Olyo7?&p=ZMH7PTYPKv{C;KA<_%}O#&+3iSxlJ!(SdHJirInPKu@eu zGx|nNyt8~5_GqcZCPU@Yn&(x>spfKs(on>hy|Gl;TMwNOa zKg+qWjuUw&vEic!6-7gNo1<@@$CSl?Vwnu>4c^~SYkwvH-^>}zF_aMrHQbz-Cw^Q_ zSmhCT*ZL*sdf3>s{$9~SE)3&p$+XWigBh6;YJp=oF(;>ZgIvD(k)-SV`$C06siziO z){b;{KF-X=>GbL>%5jB8LQcAX_0Y*?Nemr$1ammfURTTC3lSB-`mQ^u92Pi@%eEwvKS{a@_+854c?)D z3E%}C^N;rvNq>@^1b@+hSHSb*|Js|<@A-*;ZJ&q$-;v$YS5#92@A|f0c6RRGjvhW? za|SNp14>U-6K^uI3!KpFn3^8PH*kKOlYz01v6iNkt%n=G^<57eJN^JSPv|^kG67Ox z)6LGunl-@9)!kbvK=#UyJ*2=k^s&Gd)*rk0xX4~H*3xBF^zgD{72_A=7rY{Onw6DR z#_O)Vl-_OSe;yA0lD*>SU75|R=!KlcCs`{sXs@qZm@{69wu z-w+o5--rIMul|1zg?Za~DSEhp-}I6DpZWUd!TYT7i>K)?&#DObWqmtTUdhz3w3qiDX1i!qWOAYs`(($C z|71hZp8P89%4HGU>j%Gfz|H40=U2Sge{pB4rZ# z+Vd-yZRy|6{^G^lEbo#1l`#SPJP^9dIx6~(|KS_9UpwNyRci1r4EK+d*=pV_cXnd?pxt5HnCF0{NfQ2@YSCh$v=nSsnD@@w2a zxs&czJJ#JVy=H#F)bWMU;mwuAUsxGd%@h`}cC_?reV%#9ddGZa4?mCigr{QQY&5+T zm)zLhXE3&uhQ*ww(ptQ;-H?_zpGRPinN;p>aMc?s>16V^OBKY0%v9eIlcJn0^%)qK z=csiI0uz3)oITgSJM;RC0I$e^jJHFM_^+6xt=SCh_m#%&5wo7(RT%F?>sy2o=kGky z7R4IOE3)kAjyV-&cV~I`kNIbZAMJ(<=*XJ!U$@;KFuCpR>)Lu|Y{ zLG8n|^CE`XRBY5L5*>K;SC-H_^s6)~zk@lJqidEVJPx^}7$`4iTbORo-O1>!X<{8s z7lh^?#XjrkHL7@pcfr8jn+UaN5s95qTa5*VU%5dH)dL}hm7tw52b8lJn7yy$8rnh~ zf6Rl+1H|7{AQA_wJHi_w}L>L~i;Uu77!x z{~ke_!^q#=EnhB3wcs9itAjVJRQ3c}JPKS$FXFA6@UrXTOy$+!t1(D-Z~WSwd$hl} z5hK6-<`dF7tx7w1!9#YULKP-&}@yLT2TMk9Igg;B%x)!mxPg6c=nk65u4NuLkC=a!yMK4g<_RBiBu=DX zVlDxueA*A#toQszkAMJp*TH@gDkCgpdbDnM9PN0_g~)98=Yp9^vh5LL3H+Rxq<**L zO6^RI^Ifi=tiV>a|8bq-b&TL-KOcuIvWf8i^Id+Hq0vFYf)~iRNDlLiNCq>YUBhh z&N4hSaOoil#2TOSnX%imD(EN1&#sMVunY4BrVBm!#2 zSb-t$66CeUJlYPr2f}u$k_7Kygb39`De)nn+2_4;N#>Ube#-=oQ&qcD!KusWCUlPI zXVLcRZ2zeSd}jhRski=fl14XM45OZV%l3$zMlv^J)m)r(ik8^eU4z+F@{Ty*%s2Wx z!m3Uaw(y?ZDD1lfQ;!`}kLu0U`nkA`ZA^HJxo0~CCtFb%yLDE4`2L(-pD2!TXF_hf zL4ane^6#{Gw_=Z-Q7s3Yc4ogm(V$y zIVpb)45o)e3pqP&t#f=>59j@qxx=a5R-+AB$9RK*o`VEI16djysg3vSC{{yROjw`n z!Pr1p?H*OU57Q%3C)Mgdc9sFQG8} zlyNmGRoqsqk90yl(ZZi_RHt}fa_2Z(dvr)jt?HLTt@+E$R-5P6jF`IAYZ0IR)K>&# zp8*q!Yd^_iPGOaS<3LpO%WU?x(nVzS#0`)v+R+B|z|Xg+bCaIlFtiNa=6)zV=mp%e z3Gp?3t1j%zWv8)_oF#Y+OW5~fQ=O|E+hrc1sM9aE&pfT!P58(Hf&D;i>7({%KTLD8eh|DqYI1^wWbhDt=GYOVa~Lotl|;6PH1oK z=x{B`N`FOJT5Qs1$ZO`o$sKsJQ8~|pLW5Wh-`YfF?sm>C@fURCdla>J(prr<_Z;Wj zl$7E(u?BN{zyX*~7EuOrKF9I!Vkh3Ew(ZYXf@m%7;M*b(Os+e%b*mufRyUf0fmVaJ z;;`0a8TF!36(vh<5oQfIFaEj9E9#=Py^DElYh->;i7w5l_Vh|k>`t@mW)!V0ujv%Hc~M7N(u@c1}#|#)(zF^Q&6scu>-g=sO2M6YgWpU+(cp3Hd?+6$EH10gW6}?KM^edR01wmNyGj~2G zUf~Sijk||$Gd@!JVaK(Cn_-3~1yHue={B7MqAIdu7C2A~$d}@tz%V8Y($hq3TyxNs z2dJYx%n_1H8skK&9aQIm5mp9&`}QY;d+}>sYPs)L4(ZKm65PL0PHbI0M}0iatHXFg=^n>8KpQI2ZJOLHx6|IKbHaIp-% zdC4K`&f)h?c`^DDv?9EK=S5kyQm?2wX^8y$U|hNEhHTevfvgwx!W2>kxiC*kB@{SY zzMJ%)hQla(T0SzDTpU5wSht#$fI(fXbYGp`ZQX5w6$?#wsIY`q=YJZBrnivzOoFeW zEX#RbG#D2|+sO_d3hyemMwVElUU+6APdA3=H}h!mg|U@e;COysaT&o?e|1@_ja@2Lxl0&l8o}_!UlGSo|gX zv=@w_TOVQfi*j%wTIa8JCXj*V^O#d!tQeB3b6J$FMRdeC?{q_f!bt77`}k(FSFAsn z7%%YhB`h{gAGn+NVqr}Sb}xb7!%4tegJAIBFE3({B=#4%3#z&xfh~0Dzg)CSdwHc> za;DqQ^-oozx~vqpMkt4DBuX>Ia2b(QH%2N1j@eoDJ=;>0&{Sz zfx8B0(}F7L{iNS`nItMG_i;GE*#b&%VUPIv3Ve7zJ;g_M2xm@o3rZ))Jo_ zHj!a#HCXTQet}ah=OL-S5@5G(51FRf6ZwToqvppN7Pa6$ywM5LC_~sY=l;ymwQ(?m z*VH{ZFbD6@O{=C*DC+N|T$>2l?1SCR6WPr57|bCgC{j7~a~~YPwyjWdKiQ7I@yp8~ z!)-ij(iUk`aN5ZG^XT+u&h8E1<8=af5p@}KPYbjC@Lua3^r>SGxh++$$BjU^3UH7j zTn^uOmg`d(+|pH1G-!n6t5JEaPPuY}=RT9qhg&dJbc?IE)UizaCk} zH4NpcN!$L`Cj7A+#u<>6TWW)}cF&lr%SCz=p>9g)dsZB8 z9mhM)v$YP~Xxr%!?6^8-d6d#%pSiAkVHt&41F@k%iUVb9G;wTnqCz zQYu|==-U<2LZBB^>x;*Pg<)^>x{#83UDxTVgQ5d6dbWd(u$ZtKa#x%HGEbdOmhknOyKp3t{Na6f<`duvXiGyqYb?+uwxL(NMX?RX2r9lcsQ4uxN7q zTWr5f`{O2lTFRwL36QJw12mrc}%;F+iqL<=S9&2Ts&mh zU>Ui=(n{2F4MU+;g7?VnaCy0QGu9>)1z2> zj++QiHCdV{XYHc}@wQ8PgeBm;d3i9+UM=d=I7T!42U$>OXWP||+B`wRY-HK#ka~pT zOZ+_!4OdHwlMnKfu#DclcQC>$F8DQ39@cY44J9ov{50CCD>PtLluVL!8UiiV6QGoV z6%<#~nBPrQk~+d3YbM9{%aK<4SM`49Lwv;BhD5-f4pMJgct8Ck#hHJ6`5^zaUqQDS z>G1MbWBIKY)V|RjG=mzM9ka@KS&Q(4ZCKBTYMxSznki$ya1SpQ$(8M+hwZPP(tiDC zLtNjzL*gQJNok7MLk<3hyWSN!YbvxW>e~$lh8n6UW~bQvJ79J(BUVPQ6H8V`&Pt08 z2w*2^&T5nklGcU|!g-?zkG!$4o%A*Dh|q0` z?=z7-P%WYp#QD>1h{fWMkh%OV&c8Vi_1It`blGg0+oiNZc}hD;s3Zao22LAlE;Ysx zn>YJ;N~CUNB%Z!Q`G=^A_d(0 zQJ`(#3v0Lt+GkA!X1@NL4Llt#N+_EAXU-!zz(n^z}34iP9HxG~n&3{m&&c178 zqesycM4_lW{u@76=HuH?MS=^o^!cbX4|PsN*Lo}uy^N$^8BnT=zWf+RuBt6fsP6yd zbk85ujy{E%9yEUvfors^iP$GiA5HB$z9%^qrWc-`gE|V?1Iz(44=TI4Q9gxSTYZ`$ zeFjihVI8k&8eG_DT%}|$mOL{C>N^Y2kU)EZ+9NsBy|H8?0Q8^!Tu~`sw&bAAqq9YB z7ud~#*&t!g9c{vq?PYC;dv>kF1)g~M!vNSUH|(odC_c}qd>QJdO&{*mNk6eqH|WX$ zNwD3^hJfpJ@HC9Sd{-nH)3U=Sb(_!|`61BsA-vrD&sHxkACE%ydfyFs`x0+FgA=ZOx|3I}-q; z5wCI3UQG}*9EjXo>@BOCYCQd7I9H(c`zKBU)AGH8ZConwHsv{`7AoVl!etbo*y~7o zZYW#XR_(x;x<0J01H;XOh6fL2rD$g-I4iomA7qoOUPlMJ{ujQ|$1U*+KAPgt_3LEv z_o>ZMzoWu<@3uqZ!ByP7Cw#Tn+V-#*DVA;N9i7l6ec1Cd3&Guu^-dN`ot+Tu;|c?U zbfz1fe#tTjW6V3GoP@iFC>0FwXfeQWomy14gFwCsgS~3B-$}cu1xB}I;!I!Sebd#@ z$e$L*ig8+HhmQRrCN;GvaGqLZYDb zserd;SPzZ@BWUE8^g*{u)&|d6*gar2wUL6hb=1ih)*T5Y&ZkPV6mY^7u5SmdHY_4% zjJ?yNaC!%h`Rky-DnkA_Y>u|XA{T@YrsPR0Rj}YU)eWdlXH=PCWo{71jh#G}gW?=s zeJxQ~!>7kQ-Mu0M6Y1h5(;!V1vHMz(y6PqSPp5oi1^pw32dzH;l;2mDbdw+5saTF= z*|+MFwTutJQA>VK2&!CkX}WBLvBI&(%LwNWS}NE&Ic3bpFtoI?6CT4&j#}12JsN=3 zOJ|yTb#bB`Mji38euf)={(JyGC|dPWH0iN9J<}4q-gZFnh+$kkeuh^!PG;kM(zmys zb0BP8&)xsbg))55H$V7J5D`$B9i-U}@+*PhwHE&t)RHJ&6qU@kSLndLM+SW3UoNZ-8vY=YrY?Ub-awgQ_zE&E>sZkN)U z8@~`)y{;{SZDrOKhC$+?Y}W3gVpHY2T$2;J38P* zyaYH)2AW6-=R7}1^>WLFK5brK=o($sQlk1T2%zYpl3vjrSZXc|8sm~%f0U%I+;{K8 zt&=e8#)W3kK&i}kv$m+44kJ0Yd@amGH>l!BjJr^SwZGYq=UoVJdMABg>)p);J$UZ{ z*`B8&{b^lna{%i=kB~Y9!tT^a0+2y6hF64Nq_VB?vDt{39Rk)3)$*;gmE;~YadL4YQnyLK-asLI;>CeH4;Duy;?XSJ7unHcQ zserjytbe)582_gJq&skg0#LVYF*xm;b;O^2ORgrhP|8E;FfTn-+MD`n6iN`dpN|R1 zq|AF$5nFS@_P&NH+HbeE(EPMPjgfyKbZMpA?)y;gp+PN3cG=kScR1CRN~$F^-rJI$@hK#V)Q+p$I z_FnJ5V1@b5K+P3w10Qh0^C0H&P?m9gPGVK}zI)^}J&MlQjur@ck>!VX%2uMSRO2kz z1xwftzzs;#Ygc9bfuBuY1Ne@j>CJ`u!MF-Zubh$#DUY4|gg^@)#+JtDQkyMkq7XzB zD3csg5MqbD(w13&%hrjX7*Smt^4iFp-nYluu#iSOk=z=D=Wz675oq#kEXp4>xCFMN z!|!Q6wZhq@!VPPIU52}D<*s>^4F&lCAGDTn1gsA+5V9aL-_3(r$(R-xMMV2e`r^D6 z(jENxEOj^n5am{{^Bd%sfAr$3rQPDd^oE2jm(`^}5nVMJ({aJ9)U|p2on4~Rh3k~h z7vvg2D;2f2M_kOE4!oLw#r*JBDu0kcFsyXn+Cf=iWga9>ag`_6I#X&_ztJ%9*E`u% z86TCUM~7lUc00U@B_Gl2b0pN@R-24#8$c^D8Q5phn(%>K8t|<>P%OFt`uJ$2L8Kso zG80kOc;Wlv?c+iR{akcUy(U_eU%QOER%u})(744neHy-bEc-JjVP72T=l>+FfQ}%) z6Ksqsl~bY)xN<|b+z>wi?jnHqtHT?R%qf}{Ux5Ogds`Ic>`N#XO}uHN@HCe+vDhg0m42mLp=2-RvCly( zEu6twi{nNh2opPHra03Hj-NXksoyUSwWG}=tBo~-s|`%l>ut^7K_woT(Om1uJDA($ zJe^s7PbsayM8fl=q8W|2pSFNXg#o)!qFTMyO7cUR#a0ih$ZaH6;w*v@23MCv2OIgz zRtJTJ>8h2b4J`uax!tuJxxEh%)5evyqeBQHEp>?9bwRclB`^oRp2MZ2K1zdKgk%(X&kySM)PrzfbLyx4f;Qt&~mfC+zlMYX>s4E-^#+C*#o z9f&Eu)hOe*pN6}D>{CyPRz{&rgD=13Khx%hxBxIU=lX65P#T(J@q7rh-k3xEx;jOZ z*IB3SlpQZh>+LfooKI6cyFhcmQtySc`MZPNX-n8Sb(bcCNiayOg2$>r!?X(5skksN z;oa-Rgj-9i8UzKdK1|6BwBur2^QNCdLGDLukFL<7GqYS9DH^(!$HGUsxrMAB@fc_C z(^+mI52dkinby$P6jJh)qogVjy^Cz2^h0dSL{g`a?`GKAP&8Hc(OZU8WO=@(oKLfj zyQKG#4<|>rKobFS+!~}qJBZa|lF5k?@a+gEwIDDl2H3X2C6O{F2M`sL9F$+jZ4|!HS4m%}z+*WpPiw`J|U}b9h#InfbzjelnPZ`&o=#}J9O*Xvm^r#;6 zC$zr3DBAm2gR?NBxJP6DNQL`2AIQ!)+bh;DmCPWldI)vX7R&%*OA5Vfww?nTwB5W_ zy~1*tWh0L|!D=&cZKIeEtotGAb26C?;)@~nW{xQ8wjtPpcp}DM)P|Zv{G!NazZhtPep#9t%itz4| zoF`=;K?wDoG7q-@z-sxw739n|-#6r0zm`^k^eV2KR(hv7-q!a^E&J3&n*(x2Pf1aZ z)OCNC@&9|!f8qi>;0LTKekxk>Q_UmfP*AHJ(w0VG!nRSc`NqV40m3b6`TcL`j=_|B z00JarI7Ix^^jQV3Q;;`ZEkL``vI=@Wh^o{EEEy!lClC{e8!xCsiycTEU~~(A7}rDg zxN9YNSUkAm#(e-F;1nu;TUY;2SNeZkQ}Y!-*utEu%0AC3cQgiRrj^R1B@03Y=#QiTR!*Vp_>KQ_&i`0yS|y!6<)@`* z!2m`%;W*S18UqD>&odo4NsE{tESrO!ag0MWW*z?=@!yNoe@{f-AAmK;ncQ*ee1Pw1 zkjtL1!?f%mxxHd{&R&4~e5?d*I>a`>(tpXxunOLRMw+`Q_IFl6Lkf3Lc6%+A6s1gq zlxH4*UHXt`mx{^Qc?!}Y6>N?WtPygr{SH(A@m~M$sQ<6 zcgVRe(krN#4tOsogJk>w75ZmG=y>LoUyYLHFTnWF=vlo2^LnC{%una%XNK~w2etRD zjLhEt!bJW!-*3F&o@UNi?f!c{{(9r@i~q0V^Y_UA_Xg+RX7jh%0KfRRxB0KZ;cq|x z-y`tfX7jh%{GHqU*9h{%IR1{X|8;!+PR#yJ%>J&V{<4GecZB^r!v4PyVILH}0_-IN zbmJ0o<4azA3M6Uh1z1d9e9K>Ifo6QKd_$h{`_WMW6cXD&z#vzjIs&wEk95$1>j9X` zLgo7_Pm%$afzbpCg1L|`h&1fA*0P%t!yHt+=K-h!*Qy5Og41o|B#}pz@wg!gz?$d= zAe#8+WYBB=xD+$b#!_uB0}#G>p!RU?J80{In#aw63{N1A@rZ6hqOu>1VtgRt7YCL(D@47hWAvtLV}b&?h|GJ ztjW0!)Jqx;M}TDKYXV?l>7l8oO*dPY#V39A10nV)AW^{&+V!W{6muwk2PnGh0$ZS%KSKT)Ch*UOh%urLx%X_4(Ss5bB4MuGBd?yA&YlBS{Mg{1NM}_dLQV z1)_F)pMuas;v1I359vGhu4h6Z0J-gO8`JrfmG(EaYn$vW#P@0EHX(M z(*y!d`m4qB=<9)2qK7*C`x`F+?Cij=@7|8^1`-E96QBtp@h?WUpOyjGza0R*2vQIC zN%r6tR)5lqeSm9yl?I`@z7PuyqOr*UqDWrrX<~a2m;oM0GPs9+#@c>Ig$V{a*U_y# z)$+#Ry$7hUOkwNJ;X9@os{k#M1f-odJ_xp$9_ka-(0y)Me6t*t=?*^OEip8RpLhn$ z&RQR8?7;55NQm|xVy8tV9c`cyCZG5#j1gIFP7!2Ik zz8+<-AqoM|W&+TIJ9W0<}M z@h=xY(4d)pu$}$w&Br~$h&`4mU|}_!UM`5W=ME@1sQybD&#Pq(h)dBAe9Z>HlzraA zR0XXcP+YhM(UE?L2cd@dA!w(kHm$V=zpo^&i?IC(QNNa}XthU93XT8kSpX6*AQ%F^ z3Go}ab)PxwQ-%~|!)gz}3h?1ey`Y-swmn+&3FT-51_q$>#)m*?a#pBJXRYmUxeZyH zzU@PTm7~mVm!rnt41YTgs7VI;S}?u#B3Zq!TxBkhP;N(M9xMw_6WdtPKYLj|p9SMK zY9l#9HhM@2ddf4MbTj9x3TEvqsVM?ucd|;*d26 zWY|`AUF88VnjsM=Z6rRgnd0{V7u;zcFbtHu5yD`Rrb6U@yNxccwG8<$lOt-YOfot# z)&HQS0ZRIICgdZL_7HgG7rJAb1#}xz-`|O+Kp3Dm5?YaeMjhXnJ=z~QN(R?jQe__8 z67oS{bQ{pJQvr!Ke*&;6V5Gikj*vGDQ@UQfKrwk_SPMo}7=$Ii+R2b-OU@7p*TE2p z`GH4{Ed(xR8%1BFxi7g?oQJfd34oAS=^n1n7_tKN116hak> z1F4kis2pvhND$=0IpQ11yzX z819E86);$W)jDd;pG7f>Pls#{^4uMpT7*Ks8y8{NE0p%rqdO5C%b2#Xz_s9MGx+jO z(6$e{9Y{=!vt6FD1bul?IjpAvTg>RzKf_n8+w#Tb(APW?4s1^Ihhoj^+)@RkK67(k z{<`3T{9_6r=dgm;1`EM}sI2ii#_3qcT# z-GrEMjD(x40;TziRFr{9Z%cCGns4jwwy|3cR-Hsj9e|KX^qM~MW?>~v)+T|}!rZV3 zB??Gqz13MpMdXVfo*40lg-3zrT&S3ceolQv84hYK}v) z9DVQX0l@Q+C`R)4ya^4QxwqDKXc&+QTS5%Uq?^XdwVB-(+p503=0`wki%prS&;*tTZcq6N!Ow`!7h2GE-uJIw%~8bYIBPPLLkJLXa-U`)uDO zZ#T^N+Qg>EGxGNsz%E73+pW$*Iz8Tsw>0p@%y8S!l9|DxM_0Q-bLaZ1kOy^nEo&A- zf#3mB-{-R9H&#$b%6IMC2CB5<*u%v)cn4%t#M&fx_ua}mA(<_Fc_LM)t9EEfSo=-v zqxI7FRkFKQNc4haB8k_KxNF)OzB_C|B=;)=J_Bk?RSc?%3+`DPP|$HcAglg9&?xYRi;LKUKiqjmu+ zjq~CTpafy6`u1lIfTu1;UNjoe3}8jfQ%TI+N0S*J1X|Em0%mpCupNR`*)%Hd2E@(Z zct9QU+_V%Y#1&ErQm9mNDm?q_V()=onA{Xed}i{FrqeR$XUfRw|R7Gh3WDQ_fETOOek1WYf|n(+MaggrzBTamM-JDGJvm!gXsjQ8|YpFpjHy zggLK)d0Q&*x2vl9@iIl3tLdbBq!n+Z7$?fVi>Cn-g5q#D0IIt}gCm?4x~x zI$*6?H(D&_I2gCNEi@&B=Y9@MTXaGDikyP4`GFJ>lY=9giSf_5SdvWDz9X5TvM zc@T&WRY-4$2|jQu=83=Rlj5yThL+vn)iRss9cQLpHc1S=N*WMB%F^8LIrQG=$_cPp zoRbNM1jW9E%i<>diWV@Xt(HKFjIT95PhDcp<<4D)oaL%W`AqIs{DfHAQvs!C+`pcz(8 z$dkld7Z`l(+IBJAyO?Ta6mgpPqE(XSn#MyUGx47EZ1U`D$L&f=XO6qDnCh#_TSwFROGaVCYq0E+mK9WBka+~WL?&6?qvVTzd=yfT zlb`Kb(C5vliz;(jzIsB}a0N{H8jfPq^9xmVQz{r-6g90vmtRn{lULTZs#0;t$;}p& z3Q}QSdaN{A6zClSa|({@VV-M-%1FkOD?m0fQia4tU7%gM+?TeNOV^h%ke)cwCGve$ z*|*1hTB4wGD(Yz>TE%;u9V8fw`<>#Wh;Qz%-%?J--Pl;^-gY*+@0=T)lh?3HKsxpj zxUA9~jE+aXiM6;@J)1J%K$sa(1p=T{y$0v{#1G!b)86pW=K{)6+cHVCB8RTQfp&0( z{xvdQ7S@z8`w1}b%u@~Kdc{;OOBTs^>L6_QFMxb~JmOgpDf2 zqbLd*-pd44vsTOfPxSC7Tn`QEmeoCZk5$epo5pjVe>S7RUGucibkuV^STuA5C@dbE zLQ12>8#HItcnTY93{1mAH#4VKLUNFfCasg7%9((7umhzKdPL(|5f!e0MjuaB8(!My ztLn)yTNYIPMtysKVHpHQ%Ga(S>4M*?+E190sdE*Vr-G7%)s-uqnciBetZr@mEn9<0 z7wop*uNMjfT{$2v8nsL|7si_7!wW>sgG+((0!|l-Hw0?05gpFV{SVoRbA6JW-_i`> zlqYVy5jDAr4a}gk6Bcm$UTI-U6jjO6VBU9e zA>7NYDkOBW(y^6+RKs0;uIf=M%Q=5pJkL4$mCMtcEV))j-0}rMmeRwBV1f4Ls5E@8 zmPp?XgptT8oZRjLaRfV@f#u1}#jS0w#Z0ge)+{$$(Wy*dp`2%Xhvr6aU|pO4_Tsh+ z_rs3jG3~0uQl=}J7Y81vyuy2t_J=2zuR@;)pGzVj} z{^6?FF2d!YKp?aPc|61S-7a(4?&4oPf8-Spr=WcVoY>Ci7PXYfGTRC?1S8M#f?7bz zg*>g+7fmapE>XbT!X1gtt+Ax_RLv}fw6B|yp~306K_5sz;6*ty;WMO_tuG5m^*vB> zP4Nd!x#OW=ma_@bBOi>%3oy9lxA9p8G%)Y{L9N#^ePjbr#*H@gB9!Zm=#<-lhti;s z&RE#z5ECmy_@J<&=A4ehOv{^h=4|wp)8GR>A4Mdf2Q+JEZ!+Pqx^IOUM<4lIYb#q1w2G!)50A+ zTT@(}ep(9y*KeB6Ih^L~LOj-bDM{wsgKtD#F*<(nXr1Ng&MHu3Iae6CcgKI< z_FM9`)WCq+&vAf{;HqzpKIE^)X&~~dn>0Cdp+s$YZX%a5^#;#kDY!(txmfX4-c+PV zgIr%CNn#w;=HIZm+56sKiXctviByr+)IVwEC6K={4tP+O0;bVw-fOt&XZ{4;&=SxC%=mA5=;Z7YMQEFFU$wAJ)%R zW<3D3g+UcdYsv?*jMKr@RYD$rm4!AdKzci@`?EBbFL<|gWnr~b&*9czZ2@^Z;etu3 zxtCfO^-|x>LC^92_;~QR65FD|H=aGM8S=~YE6_ti0NZ(GP_ib9o+e0YHi}j~WI0iH z06hHW&cS^-y>gyqj`yj8+HEXNv?I{7mzMjC5Fs>Vr7F^;$s;CCUD&gx*q((NrX+O) zx;jzwOiiPgc1q9Qn076Wu_Pe5Hhf$4TfR}+75QrpnZ8Z$$j{N}y40T04B+A0TuKz2 zfCSk(eiq}M%@Bn+`rQ(R{;_K>O6?`esFLl{f0%iS#zU@SDPiohx%S{E?vzGKQKr?5 zf6NBLCRkcgOH0%>n*`R|vY)VLSqla&c3?3ROY<8UEGx_BwFl#2c`^jfC#?J z16!uq`LZqBbC5)Ad1^aKWy>)$==vx_*GS}5601qhcnddEp+Y~9``~5eUrC-UoxOf!n5t4VBX@oQdJdgA(Y>)*hK%|Xn0iD`c z#XXz9@Ln_vNWxGi1h;u&8+a;>e*|hfh!BqYOv1X$PVjt7TT_RBt(+S1#6U^(d7cNQ z3#w_A=+|jPB13W;TgewJBViS$!3^{Uk57ODXg;_pR`&4X8<4kpyT zyCYzRCG=~}3m*3lsgDQl+_uSMU)ehUJkjFWfeg)r)0+@bcaz zr`cWb*rj|IL>M1huVW6hTTw`+0=$aI`JtKzNAig*3;LXP=3!}sn(PW040tjFA(3Vj zbR_AKZwBIDI+dg%H7LEX?6c3J==Cny-DpRbrm~FdYjL*cM@i90m;$*iN-WZ;BDL0K zdlWdZZb%{@h*jKk^HW(GQ)~GscD5BW zC}CK3Lit8skTS9&|Fxm)|HIyUMm4pqjlUL90To5CfPjjKfE1|$(nLi-Kp-KsP((VR z_bN?A1VkkC-a`q!g(4s#y@rG?Ql$3LA7CU|Su1PKHOo_f zkMhN7fK$m~k#>`Rk*i*QmjI*xY=Vv%Z*^BLO_rm{bTCe?Y6rrj8`uqn(p{9Q#jEPz zCI;asIN8}$D&@sBqTV|Z84d~noTi6ZrlE9;fN|I{t!K7G-Iu4P*l&?PXKwX zBe~qNCD<(Q7q*O{AURFeqny$;&|!uH`>R{*0TV*MhapdtDnmx?p57SbgxM*&!IsVF z_E8js#WcuG`jS{&XV;v|I>qzze~dWsC|%fr!)nCrHVfck4axP#iB}ay-^{j^8F2&<&XJ$eN`~;|vSM z;=fm=&55e?4lt!@6U_~du{tM6$-aDWSSJ^skRI8?iwr&62qU@LJ;D+eN(8~70u^0j z$Jo9Vg}d`B5GWibwWutfZKS%~Ztd9{<6l^&a%m3E0=i;qxBLm&wi5S^5*6re90z*) zW;Melz!^wTeq`1b!X{}F-N!&AsieapyMVqKlLfDCrwsT6wJ4INSqE#P#`!9o z+?=exSX$!~v+*D4dzN|ZIR#Y4S<-CNeC)Z{wcV-`+)}9)dfVj6fQQGr#v)c2y>Bi@ z(c^$ki_v83orr5Me!iR`)V-Q*VGzFUyqFrLs1agVwfT&j3%d13E}3*W<*Y6Y)yeM@ zu6~!};o7~c3xCLd^2X@%^9CYhlEs9ck%Jo`c}c89O3_3l%Is3d&@Pd>Ht=>JQsF!2 zO*BM9_O*@HQ*U@1x6O&P%nH85WOq@jBC~k?s$j4+UK-ycX2iGDLtxp`i#TBSOp3d{ z8s+eAgZDlofM8TGhh61;>bmIME>NQhvZPE{BJ-4N&)&j^)ikxSh3|u(ZkUQx3U^2&S# zF`+~C&3=23aF}Zpbj3dD*0PPJA)YJQSH9V=dQF3ZDgD?=F<;7==09OU4> zY_=7sjkL}*#h>r#-8HE;#AH6jW;@~b9xj~*X`0Y5)|*j)W|t#e>8nQ-(d39W!HaD| zBw7m*z!qrc+3P5LyxGC{9t|@PdTOiZK1}&+Zd@JJg>CXDP7~)eYLEXgD1}X*S7K0X znnb0Cr-Z?T3Da~Z8WNf;O2Fy=@sN%ynEfy;F7m)a3gS1)JtDV-S znfmW+0^{sN0h>~E{e?_G%oLC?5x&aD4N^ijt%*Vf?j;#2gXiwvJXn}gNtKtZbT zz*&b$%)s7x7TvD1F7`Qi{iG_7ML&mtLWV4R!&EE|tZ*Zd9voHIaJsPeD*A8V3HPw2 zRDH5vZb=4AeP2TW$6#)qBoQhHty%`IzF#h<1i)wrUI214JU+cbrA{K5et}!QW@DDz z000Q}JD!}nINw~joTamGI_+e$)KI!#$}HLE8>~#W3XFsIG7oSJWR9tUu(%!Zc z2ZTP<#H2dz`nYSbKB4@ycRYe< zQ2| zu2UkLN)(m;%yr8Q!pqVCbAsSVi+uFiA2FP+b;<*Fl0%*NyA2CZHJ>Em=0u46~ zq*SD;dszc%htot7FZM0F=RDZ0l=E{%sra66)VhG@Dm+Qd))rMKI{rTGmN8`IlxSez zl*Cz7Pi;|sL`e^(#f^G^#CC%HBipw3zV%RUQ%j~Xr0?gbP4zpY9Yt-3w=J_90#c{x)b0jHRbc+-YDdNkyVW$#nS}i9Cw^&KeK~VFzWB87%XaB*s}x z{lxAMCdZ#hORIm*xuRaZQ8a3x>k#l6Z#AaN+ZjjTBT? z%hX1D$VcZIW-!qV^Tb}zUGyO#nG4}o_Eu=Kde(lQqjNTYCMiIb@T}&&4e;DE?vz*( zjh3s%s_Q61m)Ml=j7`V12EQ~LY4JJR8kU%d`=6i#>&#m(f@5~O<+$KLoe>9gIy>lh zlT#R?WA%@Ck1UkBxArz?>W;Q3)uTa>`YBi4K}<~)#hB7X?q;bobL9|`T$pyAHbIb@ zWyLQv0Ehv@u)$qxFb2cSlLgL%hysCPV_KgxmuiK(tY_KT5eXhX=Y=!0vq5I- zHbc6-i73_G0bq!geWcbF;>u1y)Oia90jn7w8T8If#6Hi)}a^)y$J zO#!Q4M*ehzrw#Wo*cK7h__1Re07Zb?w>n@YyOC(F5Oo~X%Oi=P!pnDN!Ts*drFoA5 ze1VE(nv49gU64IFOD@A~hkJ-46Fqdu%YsEW5F;zF`GV+uA{J^t$3m5}Wpth7TJ%EL zr32Xq90)Dm0YVa>xA@ty^cCL1GN||$3Q-M>0%Cyh;VC)S9$!>X6h;W31&3TgS~r() zz{C>B=v~sLnxEtEuFgNtB>+79u0`b>OTT0PJ!d15N19~-8^beuKz##f#iv%2?Y;R- zG9xZa0-hPuc1ZblvIE9IrAiwa2?&l^&DvzwZ{I^QmPUs`3d}uzDAGg_S!~)H`~+d3 zL$g#aR?Mk}8P0|(>avJOr3tHu0xWIuNllaF&sNV0ZKO475g^+czQE4{JkARubL8eG zhY|0!$d2_gVO_dM3Ue=fW@8|RqQKaT_kP42gCg5jrr-X8g!FqJ?q}KeD6<_e*nIYy zm0%@WuvDbfQWbtf25y}OIAN z_5#rJn8inoZbL%fbEShE9c=T)uM?7 zuO9vZB`l1M;F>G7rXDjFwX_b1iV(j$wv2arLkuqEe&5KhFJkgDp&~IUIczPltx1X1 zu$`zjQDtdy4YCZ>?%^7S1AWhX7OAse) z05;8N|N7T5X%V`$-?2Hq+@>aSBVy)=Df-1@E&xc^xZQi{mW)A;aHq264e@U*zTF4b zr3Y>)xT2kA%60VQeIQa|;M#1Q?m+)qdP$V2`xG+2_hj#dxwE_qSyp_c+ON2K`iBe{ z9b~s(eHI953vq~ROHdj>r_#P~y?rC(hZIV6^7OpR?V(T2Qf+Kcw(m*$8|tQMi=oL_ zdl%+iNHI|@o38QX+LUBsx9O_Jo6Uvy>q!CS#a^mU|@-_}vxH%RH84AvX|@K9HFNQm6fbHryY}@a>%a2-yr%ty~}v zsHd0O?+5bKMnQd5TA0a+$ZKS2w=1J;&4PV-Y)8oa1*8wOnPd9UKVR7PPwmdLLwl(B z=4jrTa1MIJ%R)2Xgm*r-O<7es(LOFbtBd<8e5mb}vlG$%NU(PF!%z#^S$-*-4V!)K zwI$!pLXQ;J{E@yn4m|(;c$&-zWKAK{a8~B$$ePp*;6&r88MS4R%zsF?YHqg35=Or^ z^xa)Nf3a(4tMYe1iipoA^m*`MmlW(nE-60DM-_3?zV@Y}Dw9c#*s~fjyUnKzqcDAA z>B6De(L%Y9sT{`mNoP(U2m>T$-N>wiE`Bd>Lgln5oDT?11y&eS81B@8&_#kTa}?I) zjy*8k{_cols(L7Ag6VQ^lL#V5uF7c%&W9K zjZucPj0QOTxYN?d6lQGmfo!dpsB5*00+OX!nal7FzgLV~hq8SZ19;?9EFZ&dpE2i$ zJUsy?0$OqTX`j>|@sK%u;8WgaO$;(*?+od4=Jyc03H&LZaui?P;-i=(k@b|~mF&9x zK%=_!+N1y(bTnAxhpmsIH4rhCs`Vrh-M@e0kR4rf2Ky*1hcxnwHNG|+NR zaQ_gGpMm9Zpxg62z#q@3r^)R|s|}rHZ>>HlwvrR$BuY zCEg9ufr;bc`Jl$+gPjgQiF56TQ;DHu zaX=ViEPR+PklUoy>+tLH{3_y;J^F<%M9<1kI$6HPviL*E0lmWbuTrO4&Z_kH5j${= zVRz}l*){ZNVAQT@Q$+HJ*Vf77Bo`!({p~-mQxO#{lb@Yw5plPs=lYP!HM@}- zUk5u_)jp{9XP~*R1m))7xRR@OX+&Et)P$AAeFe>&(4C0Ajb}a$-6>yfX0Kunu1lmG z&A3y`iO4eOBhuF*K7Ok1gf^tDj5kIjUyyTA^mW#9Zphe5t+7@X#XKU}p;DtM-%D$@ z)NqlP%$T{Zyuk@|R9Ti-<59xw%w|pRI6y5R!YRjb)hjrZOtDlhR}#+jJgubyTAq&oPP(x#~baYPe(}^5kgD_!x_{hJhVj zIlsuLS4QtL=|?-ybAo=16Ire(u{jSp>iO>7oz@vOK(&Up?sd6pTz*l@<9E8gMYNCa z`P$ZauOPiFxdGZTKXi--vP0I5}|sJ$vpubp?Uz^WD~;toNhjXnTy$ z7z6f~AhZi|;qDMnaYQ?`sW(w*pXk`$Vd)a_59%6>n;eT z4Q>2URY3u)CwVG&rD}OdJs^4+Lj2H!N=B*f%_xdcBJ?#V(ic3QA4Zy-I*Gbob zJTuoO=@}2^hhKK@`s5a13Qv%l78Rv>Q#2XxBx$*KUs;?bYKbc2bN-GV?)|y1-yo&1 z(^*CxadAqOi1DhleST@`dmlqS^xSNv=}1b{R(YWW-J<^T$=ba>oBU^Moai70VMZ+H zV`R{9r#!)GxW`_U9C0@xE#Vp8vCkQd0Bu+xAM+spCxR41ZKcwazY*EFg0Y`7)ELM~ zt8t~S==R`I{r;>*pIYH844d`9geq>vF{&b_$-d$E0$==+^j>OsOmJDGFP@5P)s zVmS0JY6!aj+{bBLeu%FX8c=~UT5az8wr!SfRp#Kr(l2|ffy*tC*rb4y3_fG-!A-aB_&?igm~eB zcQ&FNvf#o2vKXd3A|Jp$JeThKp|N+vh;DR0V7%o@s&*_N>9r zg#YcfyNFj`U$(Jsga1hIIbXo4k_OTG21H2{sW)dcw<1~2-1zv=t0|OaFhwSm?R*(l zRkI)PU({E46)#96c$_FS>e#G<_oOS90@F;3tgP(I^Z0UGBO)l!90X^S^yO$aRyI=p zZb*RVm6Cj{HrMXDeeSh?Z7Rl(yngz~JS;h)EI%c#B_vo{>j-L0c2rFygvLdJIm z5T_rAoRFc4uxiE02vfb4{O@)PQ_jvB&%-E7t$GfS9d!Z4Z22@Vi#gcB1x{C+yH0DF zd-=auKD{6p!G6QW)K#}5nV02v&X`u`d~GftgBvIPe{=R7>Kk~h?-s{)FWB){XVP%R z7w2WsD^sTb%}(@;#_KW&fuPad@%mfQ?mrKtcuPFZG|TL~xbu5y?N3Kv+>yu&i2T!s zzkQn$0ptg2x(gLP|9KOCD~w*4e|i3I5B|jgR&ZPF4X1n;|Kix+$~PpKh?9SN@IMbo zyeGRbFPncnQRF|5{e9DFIj8>q;D3taA728YPuW~z=KOyi``c~?k3{Hi5B|l0e;&y{ zkL14|UjNLJe-^I4SVR82(EhV<{j-<+*Zbl>+xtJ;`+uyq8~B_lTW?!@&1XMyUVs){Bjlhll4L3rpibv6&H(AQCnxfQ>Gd zXDbR9V=Ga&mCY$i$#ki8KB_7uRG+vOX_#f-l2;pT(C?3#=p|S|7vp(qbCZ&8MGIQS z(NI%E`t?R0|4v1uBAb|+(nwc`y(c0f(sd_rXXisXv%~7viCufuejP(xxCAg`+n;%G z?T9EPLv!X(WPdix0MF4lq0!O4sIyL&kP2!~flT$aNAMlW-1GFpYS97++8;JTw~w6o z=cTjgv6n#$vL942fv>=&aJg`mpFD51;->v7`m~tp6=**pL@Xl^*I2uFh5v`vXMeF% zr{8Iz$NPV1VHq{!bs-a;j>auREp4^E2T|<&7h)z~yNQfS>hE;OBh+Ew`Y0fo| zy`P%`kU8@DUF2k_jlX*?vEakLdi{Ly=jVOo{yW!!3K->acINnzKKpeG zD7f&aQFFf;vR*C}7v@odH%}iiP#^Q6B?lkgq>lcrSLV+`ey19^2U@wPwIla+WNiG= zEQvy3m&eY({YY`-_Y(TSQe`S2^+fvUeEiciOUMM4cK(esRvt$z;N8-|T)p#wAND^w z?N9x*0SqNjMG1$ao&YaeVzckl(B1m;9saxbB`UyoWC_>4Y%u-%OPx-{Ms`H;{-$dr zc!`Z{J^gX<=!qYI)t^7PHYw{*w|DeyXA$u+_Qe+-Iq{ed9`aS0ZO1s`d+K6w15&k^l@|NiVhUbSg} z6AKx{gpZzBNCg_6{U)IOcipN&yt=G=d*HvXDd9pill(8ns{{tn5wl*6xkr2K1v_wZ z6#smw|C`QvW(2*0=;$dTR&WCz|u>nb6-BcC0;F!7P|>4Ov7oR(*Vk9?`^IcPX9 z9d|{*zwiG)Udgk7tN)r8I{G|*5$#RGPh;ku{Ap+(dFv%i9GATGB1bz=f&&bFEY*j$ z-%O7i?nFn_65e+5NF(@4z^M3kdD`vBXMdiYo#w=OHJF$@e&kDhBE*JUe4pVy((oh4 z|F{TW7`S@cr|HTg2U6m}XX|vfxmW*Vr2Tuy&fW!`6J$02=4iJSUk0<(jK|@~x^Sdl z{)vw1-;BA8P|y*=`T3WQc3`h07&`Qwc+%f=PPYniLI#Pz zj!q91;sQx--|qjXh8=y|rc9iW*9C-+o>)jU65o3psBom=|6a`g&nt<)xVnT3n544Z zW#LHVK%E~2;$Uxkb2{F0;AcZXj?~-pC7{qC9@P0UUl=S^?2deJ_Gl~r)Q5i>CcWA> zYC5yadb1H03j_m7(1kZ>z{<$1M{U>w=Ya!l-}_XPX9wi+5SSVF8%#IJTpH}~+I z!}05Q!`28rip%%7-P6{clm2?)mS_Pz6-GO*@v}MwE!WbT(V~5>RB>HcImh#yM)+BruQZ2%3F7q> zETB-z86f1kf+BhgAaEh4ONob2*SW)+M@W` z$KIeg9Y7|4M!c9il|`t9<-@(@dI5uGYE3`{TL5S*L|%(!_8K3a)JhivV#?=1tkbHP zc(QcxQjnHbeR%fNz_y@e%ZIy;59LnNX?FKt+`0NT)j740`NkK5;C zx=zPFIR3$>U?J}~^sVF_Pq=ydkn)RP)C%P(QUq%-xtQ3YNyzZFP00SHbSBLeQW!D}VG)*jRi*uHRg{qd8IY2pm zfF(AHKL#RqwizyWWHkWL@nZG?O=G0sgY8snep1p8K_j$wl{qN5weD!POa#@m#ktI8 zzF#Xc!?g?B&%Q$aNUdf~m=YvyF9EzMV(34IV7SZYK$dbjoiV zIuE+#JRdBQt|xilEsE#2w9cfr)vVrsSZMR0i$E!EQDu?_=i|d=P0@H%Rd>*_Vx#o|s3SBFYGP*KHKDo0c~z#D z(GYND5F{2EfciSp4Vxf0A#`KDzwqbu8<$l8VZwuQxj+5NRMqrIMF5J=9HhtRW?WTO zR{qJ+vIQ^zt~6DvYim`xXKDGq6Pbx`W>pJ?Ec8ipY3ClcovOa(@EPo{*ZC^`GV(}* z9xN8v;~Y&Gus-n^^9pOJkYK*9ZIR}f4_mC%-|*bmG!?0k)oYNX_apDJqjY#uui7{t zW{|$v$L+_QG%cI{94(a?T$L)9Ij`rbrwu#UwPkH#rz-l1u07*tV1Kmlj1_Urz2dFhz+Qa(-+l7u=}(JpRh<^DJZj}ELpt8@{1&D=ro13OJngun(Q9Tf?)U)`xCpgQdUD9Z(1P=eI5b8&SHlpr)0N`B=@ z{-5FTi`!7%J`hX|*|@d8oH(6jL}>sgGSdGOP;~ZLa3!F@S{<>FcbDMeZY@@Hc$W^-^*ym9jheLViu@st`hPUg5 zjU+SSd#}8zmXPNb2Keja?Bza`_{YPtZCOp;E8I3x!Y z0WJZBN?o9x!gezk`kA&?h8;&YPM8U&BWoe=z=Icu@RS@BMW>}O( z=BCrM|K<}=1Zp~-IES4ro6^A+6(*3ifTyOR>7Qr{ts1|ZQP!tn1{F43_XAZU+lt)M zqo$BrSO8w6FdMC|B0SuAJC%&;%LFVy2kUSStgA)^L@pME0Cb-?G(l>H5|O;p_rUaE za%##&KMw@_Mo;NL#}k;9(&eM4=n;Scx{T`od+ao= zizBGJKZhO$FM_H{Y#}Qr{!&EYAPP-AlxFTeaME0x0MtDin$vnQW17=yxbyj}@1C^C zF2o5+O(KR;84IO?iY-I+M%!8Q!^J7tCeEsHwd|lH4OBeYN}77!FBD#5Mozx3&n|UI zJEtbta;kzbUL17_Q`9>^r$f^pUW3G!7Rn)VDU8?cYCmjL7!4R!@gjN{R)P;L;Z`8X z<8bf_PkP~PoMw3_@0ft`CplVTKpi5+zVa9+gsZ~3@#E0aw5odSHC^ID?01;O6d z)rX%4;aG~`Ti(R?-ij{#(guYw%ig?Ivtdt@BCw>Q%5UU`AF)T)`z<^Euck^PCF-RU}I&HlD&i+03} zszJPdO^rW8_(XKomU_sp`DZ+#CT!qk>Gf&0#e@8V*~P2TMw-D2{_IlNJ{~2;I<%$r z4v%KVZKugC_kt?tiM|^$6$_p=S7d<5kDzcbd-rSA|6pe*=VM5@A;Z+{CMPA z%M>DLlxt+Y)8|-*jTk4qCWunA^JSl8B@=&FLlb_TDR0^!opqIqv zfl}VbEg3n2oj^Hxm*e>w^eLC=bU-|-_7-#f@Z{lI{Grp$7>#)bM->pK{3_X7Z6&Hs zwUNO!JEwBBd1Yi%yJz*I&5MLP+M#VfYJCvjKi*s!DGA`L_)cL+%vde~^4|bh91uDl z+o`1sr|8Uei8#4dj}|0HA&7qN6$7$k1g>6u9wa3Q*v-5kP~6`Nyn0^CgjFtZAB2t8 zVW1C*_ai!v%Ei1K{~o&ROsv=Y9b+KQ)@u)Pc!(xQgm5@2KL=#q-XH9sGPX*v0&WgA-P?9||C?{cTrYm_I(QNjYyX%ckkSGr% zup51X_*C{Xo0ndqt2P&CXK;c&48lU2T$b?;I@MJx9v5W$Cl7fRDx_LU{NFrNzzYsu z#^gb^BJ?uhCGABmZ%R=R`t&=sxxZ}X%-4NSM6bwQcuc{l+2J_A*25{35XLboycz3s zGoTAIjsGq}Zr(L&(1@Aciix<p<@&vbj>^}Qa zn3~KNurQ^yL@e-fw{SYN7(Uh1KZQAEjxJsApRnX^92jAWt4mKDs4ll%*J6QyJ!&yeg50pJ-Xa~^|dWtbvwmTCU z7dp2oFAu!D^7=gvvi&P9*%lFNA*p6iW41Q`HvXsO5~F_avbl(tY81GtK*d&>(gPuZ;G5nD_ob=4+>_KeByDo;}6Ha_Vtyl zuCECwf3az0da_wcG56IhswR1}qlBr19aFL_V4r_>DSl>K8#dW6#3+opFf`0$i)dpz zVdx)}iVJn`D7SoNWtn3Uv*!`JYwQJ*ORYl7rdzcJD~*s?M+o}lsNOEn!# zC(aaU0a>j0x+auWx%h6eeV=+`);(y86dqL9ehH{9=+bC!J@R+_5LZw@lHL0mDv95? z^Tr^^ldsZ!0dL<1`ZE5j|0QaWNAtjE7`;QS<3+@o@q2&PkayQ!#FOo~5(OC{wXz)A8Lh6#QQ~`RcVAEgBrpg=cTVJl`>?%a?WM_KgU08Rz0HO6 z%a4D`VC|efT@D&2NR(RcnDL>xfD!f(S^N}pfyZFGK#KluZpN&2EIUoUNbqqB6v zG)X3+;zV6t67RJgCp|^esm%QXyH3<8WYf=_#!x@*xlc2tazhR~LVb7rq%F$O0SkpW z(@fgksLH+H=LUVY29T?HKzJOA23F=-!P;EeiOPQ~O-Eiy1P~38>-CWU{g;>pDN3i1 zYIVS(_Z+5b`yFOV4D`-IvuNElU*woE!`h~qON-Pot8S0@ViNLH%3cO}wl0sqnKKxu zPbWEky6VcgqQ_FFQ5v>8aMJr>$#soq#g~4tY3~z0;9n^4;fuW~7VlYyeXI-1sH@F& z)FMUqXeFfO%`ZKAOR4i~Tglb1Kckkcn=7nDKqbLs`H3@DcpDSPcW*Fg^uECLo(KR` zBzy zY6_6W19PSDFtW6ic1f2V~` z`Y4d2xb?I)tT%guVGHd2Ulo(6LDBCZi#2jJFKQ1!tqd4rJ9Bx+gba*J{rDT;VZ8KK9 zRdmp6kHKrHIbDildM!agwAr^vVwF9~YcmjKV{b}8{%_yv8AEb`?VHJ9^BSh`>)pA* zKO}iG9B86gird>5Sd*O z(&HC%OD306P|s1X!a_s!PhYosjR5TZ15KJ>@=#GgNfR)~bN76D@3D3gwxeE4?^jJd zLm|k~BIGcy#)VH?n{(5k%@b%7SFF?xpL)+`$~u%vu8umDI>}a_Q>~xO{FJ8eQx#GL z!d(7%0hCBC0NZps9S*>}hbSsdo`d|{Ll-Z$4XB*$o9L-Twr?hj8LUqBpnA27KGlfA zn)G1PIsm<|BhA-Gamw!mN1T!g$#p8^Z|B92s(OyTJ~$1;Uipd%Um{#Hu3e9<%Ktq+|1{DO;h90xg6w%NKo z&)(HQ0~glnVU<{9OoMLQF&L;~@?KWs!%q@af-6R#T33Iyy4yZ)`N^u4HyH6ya~XEQ zVNg$wqbkCHUhBdbd+FH;k}C`=S)F$w>%F8o*)VT|hPvt1_+UGlq_i?}rG8HIhG%qH z>fX@mOSl$k8o~2!zGDrWKiS=18sZg+fu$*_HJxzY&m}38mB4S3knJMcF)fw zvidn})Jx9%I&+0YGeZTm3z zmXcR!D9glPDX$zNGy3qrt;?Fm1(Y%_;Qeql2C-XiK!N=U4;9B@?6`NEp~1Ut9L`rQ zP}=MB>N)InFtGXZ;q4Cx{TvpO4aQSHPNr4ym~)i!jo=E03lc0ApRhB_KVZjcYGcKx zuUK4buK#w5!39qETy4SH8?-owvV^Cms$2YOQikOrgszle2)$aGrIqj1-S6$M!8RVW zxeHL%aMs*6Z#9e z$G^Kb_$h)rr_%BvYomi!jroE2frnD7dvXmXn6cEhBxi9E$cEN($`$2=2~FmbuYUUD z9AtCBjKLr$%m$dyur}sUCE2i$UdW0}ZT0{k^jJ5~8}i%?dYkVz!;n!~Z7Ze)Igj`c zczh3>>vvhV3IHa5@Vvyi1?O%pBss zFd42R0Co5yrFHFz2-=pI`LE5bgl$uJFh*i|X+tIK+j=!pa(=YNvo*ImxXv-k2bFEV zx6J-c)RL`N~l&Q(a?M6RP^5tB;7;L&9UFdzRBlJp1K{4hOZV+Fa zdr@S1pd^!#lALoht_xc!w_VDde5f-{(wuw zFtcL@zk58IkbY(G9UYve>;}%jsNB^4?Ppk4&wcEs6^*Zl_1Har(i+H3Ik_>v!QS}y z3tMv(mE57)!R?VV(-RR@1@pbbFU92sxLo8lXg4L}5ln{Fa*nCu9v)SzUCb|%uzI+5BvN-mmA!fE)YE0;J`9?X9O zf-%kXlAt>S+L5OHTl`hb*_S-`_HA#w^s2?!X-cMYn^Z19;fuXhKDx0r@=`;#d(PAG z$raYCrE*2o$%h{65BMWB1MP!{NB7$wSdMC~v8Qm@CiW-dzK#qkShv_SV5Iu@H}(!M z7jBYugNrpA)*iJ)oK~|N#9UAkqZJ@7|h@P&P1tt%Z7(AXa>>xGxzq9aM!Hf zeY(c&n@T^}Dt-a`^a3c7w5F{(!=Zs?uW(YW(D9pozQX-}F*-ZH zYwv}zTrE4tMHI@sO8_yz2f%}amEpw`Nl5MW=x=i4X+m~D$K2&|4F(ptQm~761k~wJ zK3tX<>I|!iMSAys`slF>_Rva{+Ky1yYRo~23uJ@4&Au3btnQ>0z#iaJJ9UdHB1%Jd ziM1(sIT$n344%-)W}$`w!5~fl(mYDmpYT`v?git6Kl}n`L$A#%PbTgUU0D=wJ5%>~ zjD4PHlN2v4o;>Buv9w^E@#DdjPY;}N_zRx}Ak48oa4ZvaMM*_sDl~dft;7{VaatoO z(Ff5Ul+$OQo<+OqX(3Z=j2Ym_B)l+|sq)f%HNYW_^vg*aWALkp6Jt8y(H@Mw0-4iD zlv01)M0v-z!dG*PRU>;bAH{+tanmP_J&4L2Sd zLAK{)H_1A4GhDsEhQPs9j~&wE#A3wlsjY5PGJLk9@lMQ)$Ysc+?U^;Zz|v=+?{h>*XjaD zgR_T9go}r^891@+RD4ibGqY9mAm?GY365UFp-qXBqiScBIR}yI5H@VDNaksgwA+X6 zUV=e`d!~{2G91N%J&Xo@<7#yoW~NZ2*)JgI`qiOQTCmYI*XF({8>u$KFk4HL#vf-C zr+t3b^Ku;lf*7rGeRFP9pe1VtJIrzNxzvqVk^^hG$dO6!N=6JSogYyJ|FO?=<*H>< zAn+AGh24x{mP0zZn)X+C?C)T=?s8Qwd&}7#P9e}%y$O;&rj?dFf)Kx(PBNd3Q-a!#D+}da4y@bUd!_?GfpdvljRlduDZ2XcUK0_y=r&VZ!t81&P zY@{uF%opv&+R`6mE8H&mZQGgiLxoiE&6Z;zLaptCs?S=f$_5Ygevkc3OjHY$-y077 zwaoC>R$pS+P*1Qyr7q58vBi$#iW<~xu6hk~kk>r+IexmlX4%bo(xA0KYh-MUS5tiy z>-}EoV8!gxt!r-Tacwp&cXk#c12ol_I1L)lzO@5tpP!r@Vz5h+M+#eUM@K{GUV?tR z`U_J`9G&@Kj^>*x8_E8Xl{!&EV77T4-aTZ;Guc}|BdNo1?kgdt6wkpih0I+W^f8(q zcq)oI@SHg)(O6s&gV|60ats(YWll}AlEJlKD+$ValIA6o_5tsM@ZL;yphE?Q2;4 zs%==DYb*C8v9%Vta-y>MA<4{AdLyj*ZUOJ&8Ce&T{`wKliK}R5xeLe+%eJv#cxQ)u z?0E6a^zG}0WQx1-{VlmaOVacVOlOA|2XphKWlbRF5^zRNEJyWh|_i-g&5a zP=Ox-7HqMD#NMg4bKf3TpbxhZ*{%xq;}ZmQBD({B-^LCO6y12@Ffv?g#I~otbx=x0 z=b(P!*e0PXd9i`6tYc9-It&^`@%B{x;L3F`wf!>QsR;Tq8Vgr1T0gP|!{wX*KgXBCB&5m@RyQu5-@$w)g0MZ9JU=bP|Zh#wkE%#Pj4 zt+1}jSgO5zr*N1&qrnTUlq%WZaY|(%>S$b(c6))fWIu>5+)_pSoc9YH=Dnhb6o zEtB-F@-IYy$-p;d8oK>+i&TGBeB85;C8Ue=AKAg#lXi z7Sppl_G-B>H0tL^q{_OFpvE1`FRzb>At}}=lNJCf($ZI>F<|3hijZAsWb|A| zVpPhqKva$c;FPM`b)bPR^oS$wZfo+3;HaP+lss^>X2DoZ0CB7o5N`&EG127XGxku~ zC|)ClC!JZjwYlnrhW$VbS&W70Wu6nje{t207N-@#rzXUsluViwYV3b?H@y02-1OyD zU|@TCIm!yj=0}9rIRGVOcQ_A(290RDtvo@0ibleFD}x36wy5!gfW-5BjH?(}@dv?e z&XbbTT!pB7Tn>?D$OmBpLz)^&=-`j?5mi``raLCX5<7uN z6H4>kQ|-|WuX~F!PM0-VMgKQrHk5uosbH~xzHy}@#Tb?`4{cW5eGt!P0xkUbd@s-Ozsq((mZYb2osI0OYtU#g3d zx>2tyi2&+*Hqi@x9;&4^@8_2GJo0B13^09x>!;K=u}-%B&ACD#lH_-nqg)g7eSk%^ z!ePNw!%#U4)q4oaIdwk$a8=2~-COfVLAw6-M!NCM{Y*3_Q)%XJ)iu^3o|RC#CW@IARU~5 zPXN)KBBLGAik_IFzgx>l{tXVu#v_<6XE4BVz};m5s8wkM^=d$kq>5p60wn--YkB|L z{#NjZ{cZTwY0UW=j#07L%aBA;`D31qtiby(74TWxL_HukP_W2Xcs%w=?7=vq{KX~ z7xnjsYosYmv)}7*u-6i*AE~(K@$ugLi|FYwW>%W(bW5mgP>76Px}`DJ&eF^MGHn2a z%pucqFg6T!pJ8k+?m=4E#=I8N<$sRuD(z6$(PG|(EK8s5+|-dck(#g^yug|FZaZ@M z^d3;|bcYdP-bJ1?VM8d#j!>p$-dsBnwM$rhUSk;s4f<(LBmHKRrpZrZINd6582)P2 zC$yKSIGn3{7j=lMe4$HOb@j6xIGV&Tx7n1}D2sW;?Up4XY}={5n^T@&=(sa18KDc-i(=<|7)Q0lR0b;&RTEkq;8G`H*6v` zmDk*14V^WDb5&VG-DoNB$48=p`m#jv9x>&O&vN~-a4ULMX&J-5$61@3_jDoNs7yk3 z*)p?uRGih7Z^Bcz4FI7=Ja!S91-DmW541XX;pW5W_OO{p%J+vhT6sJ0pq|yNy}D#H zC|y(U%5c733piU#KnY6biflF=nC`RMo1|`#a(1QAoSF%3xDQ;ogiX8+IDbk8OxcNc z+)J^XV{`Hs=am~!O36=&<=Cd7T+t7#lW;Yl`b-<(TcTy%<@@kkr~BNH<#lQRW}1FQ zqIWgfame~@X%mR)upGuX5(I;t&%$KZ7C=y@!dy>!a3F)Iu%RYt1*jLsLMLRC0=wCc z&Q05Yb-`k(=CB$V<=sc*#=ht|MK7-bm~H1`6+wF`m4d6Xllt?TCVmc7qFt>sIB*@4 zb}wOcUsqaUZi9+{zC3bgFGd%p<}>{-JJbKLJr!yFU+leSSd&}RHmq#1fG8>*DT;!0 zK>?+U2wRHO&_fXs2@s?tbPxpGf`E#EbOC9hw@^Yyr3okKQ~wg)Ho2uDVd-_oLC{l0w}|C5)r2?ijaq3YQj& zWP+c(yHUBEyTi9uT5>E;HWdnqLGC#2Opzqxp%FIZ1`q0OhVcq3 z%#(>X>AL-pu!QwOHYoUM! z?~OLX60`;k)Sqpbf3oLPOCiz&AWZY5?Nlymm7P>U>e6z$<+2Ca_UIrITf^bt1hpBE zv6uNov2%mG_|7`EBTb{+UlsM`t2V2m(?~sIAQMgNVW38kYCFG&*NBW&rlXXilXHn8`O)FeZp?Aw}`fN?96038cOFB(0M zsChybQ3zPG^wqC&Yx0*SSM%{IPis%38ltGK3?Pe0BJH+2S^Sr zGY#p{cb%y-P%ciL)g@gGypYtjrtQ<%`6V~*dTuNm)?H=yt-gz`FOnXOA%DIBK?91z zU(C^Y6xt`fPk&bR3VJhk`s9!R7Cjwf=2>#!{isF&uD8gaJM7mEVON_tvv6igw{t8f z2uG#_B$8Y|rCUVyj-zd8$O(q$*6EHP3$o2adnj6|`<@wjFWl5$U#(Fz_4YUZ{7?n( z#dQzZArfVpIypbu&)v8#aE{tHB-W|29`2k~{~_kJ|I*G;%69!Bb&V}p;0&Ze~X zAA~<`iV^vk*QwQ5pyJ7gPKPFCRqh@icL{1DDR;PSIWrQJNVB8l_Za#+*7S@)Q)kx5 z=P$p$PYjpj&dZ-8+hRC@oZ8U7!;>R#cp@nNK;Hs1&nj3sPq{lma&S}Oh4NmnZwiu! z++<6UjlEXg{kQH4yLGRdb)~t-OXnc>+XYji)>;a(_^R0Br#xTvy*(LV-P_ia*zaJM zHT$WEN4A>|xV`I|x8R<%dIQ!WJTsGX<@2TZL7(mb>#P}@;#-fQhzNaU=ip2rKeKaB zN{4Q7J33HzBU_Qnl49feR~JXmi+Q?Tt{N_35+1ou!mIYCR5d*7`ZhlEBEw`P!xF#4 z+gmwJadc!k0LWOU@1l0@Rgz-33w1bw|81rt4Y;t~tz^~kJ_4GNfc~#c7t$K-YG&lsFHUN$9f7HL}rEhF;JC$U+Y(s0R9R43!nt zguYzyuKXAmHmCtWX4c-C4jVcE>X@B635f&1-#!(utnF>L8EjE@%)^>v)Fy=sn@dYe zO4a9igL~1L_!+^mOb{0W|65x0HQv)h0yVGqK{Z*gOTC(lbhM_~NH|B*^o-;nc$aeN zSB3<5b6KvoF=%=mln1sn;$;>|6QE6mPdPYcGVJ6fE$i4z&nj)yZxblX{UFyQHf{eo z{^pVSt%B{Z9{5?>!Hkhj(_o4FAsi}e<3njFu>jUrj(qPr%&~j6-4fN746`04?0(kh z#gG}zuLWw;r<2H#&{BtEEU1wZN!n64{rmJgTDj){ci(@W(gHreUQkU0+dB7*7KgIP zj;(wfy81BGib@qY0+y5`!(IB4`^hV6jg)N9-3datm1av3)cefyiBWZ6AM}`{wX42h!#afZpCo2EV zJHwrXcanQtYyD|}Hq{sBq!!y8r7vu*hsiG96+s6UlI5vtL36n24|g`xvy_$QvaHL+ z4=l;5GVwM+>wMbnxxMxENJbHnK%2zx^bbVo5}|3l+7f1p{b>x?V8cb75WpEvX2GGc;|Yg+7FjX zw+pTd>@C!tcAfIfJ@*kD;Dw^TF1k8j6EKXc$@Wc$UaS>#!!6j8o@gyC`m}3E+22$% zuf6J)k|{XrS8JMXCbS}99-Cf_4$+TAUtLQygou={gFHj&$4qdqBk;+YRsIZ=arZ%y zue~BeM@CaV8H>=q#m&y;UV&Cwk4LL>^X(ztt}{!dKr&?tJy@J%-;^ACM~;{pN(y3n zX)W@^!xJQOhU$|cIot|KjWT4t7hr*>=C(i>r%auBJ8(1`9z7ccV;r5HB@{Qm)k^>rf^O%*>vrzmP|+%&$oIkC?v*1C zY4eHeUn%)tjq``6HQqs~g1QKuq~%T1aI$JXgn>yl=nC3KejMc=CL=eTbTC9fm|1o5 zq;Kwu)Fn5L7!`NbOWCO8G3vsP2}3SxxGBca5H0l6qk64JAW>gPP<6ksxhR@L7&}SlYMU(0Pn{ zKHA0T;0+>w~!6-h5r{vJtITYSU|JtY1{0FmgA)6KQ5jyEjBJ3A97VPuVAFVZb_8WH zzT3s|_O`o@Q`{{+I`ldl?*{S6u}3#lua-btu|(}*jK(M3&n>g@npF0 zPcNNz(Vy!)+?&GekMql;E;1Z33ZuP}yz8NFt&Vm}^EhD?BFQa=sTxw$INj>({?v2+ zX)bk5LR`bc9L0%iaDxivovVuin9_y2PIJJIh<*U2@WL>e8%m+#<;>P(-h=k)S(&+Z z3%#k?W-Dih<5o+`aZ}z3!vzb%pC=eg7E5O~v;;!q3zSX!?OPnyUx%mD4Z#Nlt*DDG z%uN^_8KtH`cACM3#w3K*aumC5>nweRt0Au3Iy6j4jZ$$VVJs48x6RLu^GjqTyz;DS zsWb6=U;9Y3ofmpkNtFSIEaQ3s=oaOZB~Sw;i@X&5_OhaKq>SJZCI{7|vE6NV&||?d z>avM9Aq_C7NS5y~KRBQnp+udeS@Q8@Aq6O2@jFhh&Uut7EA?&CDG_jRX~S9Jygcq) z2Pw?j-N9?~=;{s`hi@fTwE}?a{HijOwv%$T5NR@%zq-b14%qMycIlck&71GM-~z1I zW5DU;fuOHBoh->8mJ)-E^bMy|`p`2e?m@2ou-#HfH%Jwm2I~aX5oQ6j{9VC@2NXk# zM+$F;u=lpBNX?cfnO&k@@jskfgSQ9@WRV(-vfQ0P{g!f3jaq#rimM|{Py5>Tc%^m} za3^Z30;{>j#TjK;GG@R(p+synUnqU6RAEgDQqE~&8~&ehKU;?}VWpibCrU*t6G#-Y z(g&Auo0--^w6J4EmEo`Yz6fltWv5?GO#bq@nJ+`&VR=SzQ^jn)GdgCZ#&~E)Q%@~W z4!;5@39=-_Jq~c4eejf4bOFCSO?wO3zI?AOmq_>A@|?R*SjrtVr4G8c9| zI(=QYXA^>L+%>FByO z?{W5!aDi9YB<Kzp-3)8Z-C#3yB7x;opl>$8JW8+Z^AW37f@X^mwEZ)qGG(cM6!O zIZSXZzuyTr>aD#QFWnHv_Ykped*kzAND;=-E`DGl%*jnFxBPLbQbDUs)RjP z*mC>K@Y=vx+7tFBsk-^5>j0 zBMOi_Dh0+I+vGsorpzo=<{)wxBeab>Pi>w5x^b3-hT5X(SNe(k+MPy!CFb@*~1 zx?SB1_3Em_LV;Y;9%Sm<@8mA)TQ9vm-r{l)4r~NXfFXGMtY-7b&KLAM)g7RNte6zm!qNuHW2bX`o}=b3#?H;|WKo)OlB# zQ8Zd1;}{El$ODa4G+2$LqtT(_aVhPpvC z)G^wvXuJDl7OXv^QX#{&PAOYd8*99Z5sjNUsokp-e|**5oi=E?*x*8v#sr&498*-H z7gvz`%=l1(r($MGlxw7CFJ$6z*+DhBY1g75{$)igXIiJ}u{Hg|o0rEIy`g<-Mh!}i zki3;vz1xxV0RuvAqg#1Bq$1r@krwGsK#ODKTKy=aNbnxgOA4wI2g%QXK7X3N^bk>) zvGiul21WKt=H>FhH2_GzDL6k|6EdLPn1P_nKR17!yq|7+LH_B^)ZCF617E%Yer(6m zuKGYf>Z!IfRLk;y?FqR$60r;mga}$EeL7tMnQd}CdezYjGay(! zY(|5S(DP6WEd^jLAY*|GvnRcwLT{}y9)_1Dk{P0&B}s#H_v-|I`CU7t5YF!XeZsMw z1?Npj`E*xi6u`Q2@j-Btv8g04QA!q^ze2Xv$Fdjl0*9?bHVq~qV;nI>pklZS>`EAp zguUzy_LJ0d{~+hC@n~u!fPXET%78)OuIx?6lCHXLaV=F9FB#s%v_-3Wv{kQQHY(bR z`n(2ZZt`;ZIsE(FpV#NVStL{u#3H!j(omqg^mC&$l0+&giNzN;w>a3%x5}p@&Ammj}!&y#EbX_CQt^B3S4}mHzM$G1TRJmz1 zC^|)hgmKr56Yi(=lHm3QhX8Dy*Mw@ulLGK3*wmk*TmV7M=4o+41>F?q^Gh9w-QnxV zDyiIhjzL1D#ueB8FFtufAt?h>T_^9@fl@lfPY=L0 zt#Ng#Jta)u#QxAU{~H(-zziN2Ihaqh#FRHeHIq@5-16TxCL5k>bK~z(qR)QWm>1?B zCx6N-cUgfuTrK@{|DhYacBc-XD|py>K0~;f%Rs*10pw}GgJBlR3p5W(2;a+KYc7}^ zR*?p@h4sx_V7(J(IuV&?qx69FT9bv%VHkX!J0K{1P(r%%|Wp z5B#fgP3sza^Ud)yN=hrc2L|#}&R%=?#;WHN4*yyBqLeEoE0FmQ4F)eW9DJYk`I;Cx z(dS8*kj}J}teNDN-5)nmEUBAq)UNohpXB<-oalyq zf8k%>KdLeY_dGl^^?>Mt44yYVg?WMIKYNqkCA5C@5^|t+n4D-JewW_#2+0~eVgFAN z{{BfMQ0mSMaqIoTvF3r{es%aLw?CZkrSEfE6-P$>#AJUUSM{WG(?2ij1$}?v{>0I} z1scRE#1yc9fmbKcU9I-TvwtUPY2&BhN2iaUBx<`xhXNm|Ix|J@-{KCM&&NfivR7XPeLYq0XGD`HZcmcT0O%3OBf2Re{p+F1pVpY5Q zKa%4BYe&@5{5;V+em6Q8-b0i6=zUr}G%R4nt1a--@jsOirknC-%%=6HS*SJsJR=XpQ3^ zfEVEah~rgO%dH>h^v|oWs=nbu7V2f@0gkj>`1*Fd@9w7O^}O7I528;)_V3Ah`M4K+ z{tbWsZuy?U{QB+<&jJ@;)bv@?oninVD)HEH>8)^g?Jc%lPz*v`=ivA|LCUe`L5tT^-ncTnGg>3_QB?v}Z28?P@Zb`@gi>S0$BzQIg1eL^(XfX}@jT+pPUf^Kwt z!osw{e$F2n&TqsQ&Icu1l<%tYWqSVIgb@jrE~08gD#Qkh&a?vH`g;@5Ia#AvSa{-) zLu0#`{unlx8PS07m++f#=k?}>r9n%LUxqHo=BD?-7EfkQ zOFckIp$$qbzvzmw5)G7iVjpBkBa*VFEA8wAN2Je zl`5|Bb!iOI%J@@*zqh^L9(fe332IU1+Ef3-HTz#ZR|5vYbQ<}$o|8zKSfyEkebJtD zIxhdi2!ApR@Ca!+V56U~RA}UY~&s`7Q1V`(J8%mHf!t z_(m?b)}d4HyeUp`BXQ+r{{9q_S~aL+vBYN#Z%6Kj+fMVOfra{kNRhr zq66SC;p~6awxk{$fB0HGQDyos~ru9ANZ*FP{W{~E6UH+;!aK(Y(UyOKR2p=D*_mV;#_1h_t+ueB@$ z6w)x74{Vg8UWAs~u}&jTe=R4J!~?!G%de}`9xns8LPJA)0r!JB00N`uEATCZ68@P_ z@sB}w^j6{Cdm)|W4H^HiBlFQf=~QnhsC2usqnJcRMb!hUFz<&Ox};@-=cRpYEI68> z!DD7(W!M_QI ze((rYkzCK0tNCo|gy8)>1j=J9sIV@-A%30`=B0EbMX)?KB5Md#JwE{L-~)7iD{_HP5$4>khfp`h2z4>qmQ?Se+Z1upVd^L>o>#ZBCIFg7Hcg$Q|ujp1DJHy_i zCeK8jmY~;7fO%tA-*%0%&_?_Q8lV4z<@l(IfroP1Si3b=Viv$ZvI<;xHz!!4uG=RE zp1s~yu`v>mx`>~{WDkJXQmb|HlBOdSq>pa=ux6I$;i3Zi^juYMCIDKu*5_HAo6r2i zh{x-Jmntab6T@95pgIyQajpCIIZ}rfX%M&;B`e&kwUi_?MFRd3!aVbt7Q(w|-iVFc+9t%s)%mBbffn){vCx2>g9H=2L0dFL|zryeT%!KK!1)``c^zAeDE)=B|!J`IRU1DV`cJ`Xn4j{@F8E5H+< z3I3IbJ8=ruIJc#$u@T4=V} z0O~SY0q@R=!BCJDS?I!E+~!3&--^#{;=_C-&_$l$;^fQ)C4+U$pok9-aI9qw{dIiM z(jLI*YR;=y@EZfOTP_N(QJo1z_Fl~ENemKgl#rzIY4?b^W_!0o_<@Xaw&}0uvSn|b zAduQw^%Ynoe~Hs3tZ1NFm97Rn2F0HWG7YZ-+tfciIP+x`1<&?$?oEyJ+;s5(Z1R0z z@zI_&m|7(i-PWD8S4tXok(#`=@ijz+i-~P@y3_ub2vJGu*8$oECu5z*BkCssNH${4 zYY-51F8zkT{wYO;1v8Z#b-w+bt6jsz@YgblhV+td#jAj*+?9S=&8rbUPmG=stD$0=1Lw}>7~oYp|S8}%817MQP%fC^MoJ~&f0%uxQvC4cKim)*acua_1x1H zY6I7{0&1wpbkl@TvbWA2j z1XQ_jR>k39ls^drS;;#XDG%MG>cV8nM65mL?X#kO!*Z8isN;Ycp#X(bXVhkq=UVH{ zlM+%MJz!P$!&}I@6<=-%I5Q>&YZOyD!tMDLhVGDwE4;;%~P9CwA0Mk+Am2Zp{L&Q#D@h z@|8A4wHsW89}^c|R;F4?Af}Ry!}K6qfailPk($yOus$jcN9l~cJEKxyJNf~_PzaoE z$?$2!$tiwdlMwn-YU_T6n;WCS16uFBt1oBj^IGfxN{+#|FY2^1^-7vPyKG;ioBZU2 z$W2klAgzl?1^3pRm$|l+7hZMeg(-Eogn3);p3W9x@ytoT6C*n3Htnx|YnV{(l&)TU z8+rq!_<=xW8goY&<~{{@)$NV&djxt)Yv6kqPuj(q!#oc^hQi`;ptv?DLnX7gfxRc; zHM?rJ_v6D9{z@|vYE72E96r8aD922#+P<`nha42x%L9BJ!0Mrtgr{kH>#IT>z#STt zGb=~~f~X7c(zd7;V9l%<5LK*^U(i6ny`?NBx>CeFspxYN^*Z4lQW_ z>x&~$Uh!|g&H6xfV#)gsnQ|I+%-jG*epZ0gup=|7J0V=gi0rqqi3xe-bpm59P;W*d zCEkUV`5~z`i6KyVHDLUjB6!U0{vvqKHdN;_8IPvvuBv zl5FXFh^}^MC_`&D6)%5^w*`$-?DfUlkT6CM(6~ZuXQe$cqs%PYq3w3^m@tS}C`vh1 zg#h2RO#!2Egn+4B63vTk5X;>4z1P9}wkz8>fW!`VkXxrCG+yr>!3IGS0q70OnG${1 zWyN3bZkv>6!`I#8fbyMrmcMfpkY@)RLIOWJfn?hR{!0!uf{>u6|04d`qceB>`q--&@hlEwj(e;XpF$&0jkNyckRu$<|}o0n@II>ZEs=M;lUDX z57!$2wc6-hII6U3r7Lk%ciucZ+H-dkIUZr|!k@_e_*^M4j%|nq_Qn5d{BBmGi`G%9RhK1f?kL^x!EpF-BtI?J=6v3VZ9(YPt9ouWNmP=a?W4J z`Pt-y9A-u-W(F|ejj+~(it7R)_$zcc^-HQ=Xq|y>i=la-kS|7+hu;8}W>GHO+GJvI zAFC0!AsP3S6A1gAJA@~FgU(quz2ek3KYACe#**^hRHL^`5OFotJDK`v^}08zb>2(G zeBi$9{GM97*bDPzWm;W*v@GFK4~U4S(CQNuM+B!8TpcNip9k#Pl0hw_$Z1}&Ku_OhQ)+djt_(@dh z6GctFvIQB}VPD$*+f)ZM=o+~hvK9^1a;6BdcSH7_Vh{<)>Itf|%6dI>GP%O5dG4~W zTG{F22S|Tm0viu|%(La>b>>cn2oin6_26lkT}P_g;AE;isB5NaDq8|n&^k{}FqMVR zB?5A>s*iwmiBV|KHNGpdBl4v-m1xL~oR2YL-K7pwr|J8FlTDp%Ss^Sd5FwcZK5F-S zJJlS7V8tC27`&(^GfTtEWgmJh-Zy9bpe0Hxcv`MNzX<-~M)gkQ)NHfE&UtE;k*8Ac z0Gl;+{~p-~PSsRCx>0Hb2a0B^Oz`fz-%`6a2#%?8JN{Rj3QcBec8%1J+_^#KO!~0E z7T0V-a7?IKaLzBzEZhuURkE^Num`DGpQwMdqxkw(I`9~h;FE;!)jv;t6R0<>9w2Y1 zc1^(~UUm$W=oJx&`D0|gP8Yr&EBui7DOjpLY3?f$I7!)n^s95g_zNS7CPM*bn!K-U z+3>D>Ax)B2d0B$$tC|ajw=aH*N2H(NB6B9Ns14ptVD7XFEhS%30JYRQ&@(Q}D4{&C z6uVrf;Mr&~9V+j|CvflTET#EY;~YgOY-@%-Bd+xIt3quc0nbmF$l1QR+(fOBkx=93 zoOHOxm9_h&9*b!1u7!Kv(CRGm&ZSsAFGWodqK_g4rj^g&7zF5WkykC$lfp*IoI~6- z6|F%8=Xr05;7F*FS7^%}w+AAo^BacjjD*obp{)lyAp?(5=_=HP7m{h-|GcNok4}Y> z*(>@4lJg<3#xASVV}~=!4usV)9@kEtkwV0Wr&7_<$|G)U0M8s%Dy(@OP{817Pf9)e zDCxX(&k`u!SA?Jn6^~lCzoFWfF;sfilHmt;&2<}s8y2eoaiJQoeA4O3dO%j4yl##H zVz7kwo!T|lzJ2>?TEOjWUv|W5$|to1bx>Rxf{hB?y4Z*QQVhfaGie-Jy)Ss*PgwR<%Z9(Gv|4a z!HoZqiI;IW)jyJjk2Y%uD4K*ILB+rPN{3x1y?L}rQc}_jlj-CI(9s~UY)z`<>q|u( z=*Y5qQem@1FRBlu6$Um}CVhoE&bO~jwQCp}=7`C6E_P_BWZGRXcU?yV4n8iy7(EJ< zMoJJ~G*nui?+8Y)Tg;~0=pVp^wT7JCRb@JgyzTW<-q{~EuhLGWGE6v8Tuv>4s5+>PQQRpqUjax3*b7GygL zCEd4V!{W_OFkHQ~BszGebC?i{$!7y5hc(b_LY`gu;-?o)-JE3a z|5S)-n#Q@33FaA~4-eJUvdx<#%>ao?@Nsfv!0SxoZm^r{*CHv0EAQa(gqT>{$h|W& zMDLUvpykR0tcfo~r*HpX=);6Jlu&gGBGzUQ4~72*%Q)~_t^$OS$eLpuvdPOus5A7h zYeI}uaUkoG1FT3&&Y^tJze~PQ<}Dvh94H_0Y0?4IjnJ_4RT9TQqs8@ojnK$Q@+`UTr}rk4pZe_JXVp%%(rmf@XMiV^KZgHY(pB|M1j2H-;;fGDN@nr~LeU7d_2 zU~_r_C8#A?+(v+m-Yy?|Az$HkKHwL^bJ)kFccu{d4#W7M(-nL?JO#ja4-}Le9y=@w zgXJhEo}3|5i9{2qwYmk-}!-rE>GS%g3}gmB3Fkv@hp zyl9whmfJZWnmuw`5b&Rzr;}`VgITCR84foQg1(?-zx2Wkks-HsSSMXj6 z@uL^|&z;Wjsrp{yZeUVp0quSPHMf@RRj{9PBXBOVWv|Nej^aRI^TPO*3=K$8JhRaA ze2ywB>!&a=Ky*UjmU_VK!Ze*4^;7+hV4i4fjDwA45urdo1_z=*Ta32mf~?mokO&j! zdZ?zSH;qnBqVX(i1MScluReHAprS+*_N$qJ<)A4T5>Vaf*xKfbL{QLOuHpmx>Uv8F z-4JhRM1Nca@SRjW<*tsPg}LFqy{n)s2XyKX)hKeD$;c1l)yb)1S9)zsU@}g7&*!Oj zscz_W)Q8`Vyywmt2^Ha5Uy{k?jA*xf{@d|CP6Ev$^c)iECdDFbZ3} zUKdaADOrzYB}!LiG^=eamH)@CIv0J)~OLQzTn2d^!Qn>j{X3ex=l^ zUD1VrUW!^z0DW=xKNg-t&I|}8(OFPTA7QT*38QadSzD452hIa7;yisP7nP8;Om$RE z=Yp2n>rv2frU*oGQm0@2CKTf*WYPAH(36Ug2!&5K7#xFVBms}B-Vc8qs4 zx`V3ok^v>)PDD>!?@?qLe0p~d5Ptdl+`r1B16sUT7F{eNxLUdQ-4oO5Lib`h5*leE%0UdGfYRKEnG=}OUBUD5r*4=b^L_uHx68@3=X zqF?AupsD~_W@bkyL;T$NPH4Iwl?J&T*CC9-;ax%t!u^!&&;Mf8B)QInd-*k0Es?;O zA1DK9lE{_Og^^l<3OClWw4VGFpA4rZw8Y%I)GpXpWMjh-S5$;0$`f-e+lu&K@&!9QmG(eo9=ob9R-V zn{joSUur|V6SNP}o}2{hN~jP{Yjr9eB>vz!>eal3S+v=j@`S*Cx;$&npgcjV3+!A} z=FLKbBYL!KE@qdnMKa#)TpZ(vCFOu}fI0J*rAHx0!;Hg?e)~E5+7DLHN0C*tI&1o^ zTB`g2KdLaBV6SGwY=K+6lTJ2GG7EHpa4>*5$4vT;a4HbcS*n#leaR}B_4zd6FhHau z=^3-MRkX5QxOVvfkkc}Z;i7dP+=8XV}&;(&L~Bs%{FW8oYs`cRGT(bHMv?C zR`i}mzjz=L<=S+aihd5HR+8nZ5fP|`2c@e`@6a@~v{*uu!uTt`^7;i2h7S)@{g(K{ z*nj@7H2i2rZgp0Fk3`4mgNJJP7C<_%hg#dETSk$*SGAa+rdl zrzh7`Ihg8yT`=EX)))c`hci*E%WUAB>|zdJM#k_WH$_S<+LPA^p#aE=kF$LIN7-7? zEYlif5iQyUfU^ZJ*%Z!SG#Vt{)f)m|8cJ=(8pUrKG6B+M(Ia|`ew$w zct9ua#`AmuazFk0=ccah6li80#IXGHq5sFQzC}B_ga+8R3}}ejhyVOSqS)vy8&E4I zq49sH*WX?{4|IR$4k+ef`1#O(Dw?2}UtL&o0vPbH0rN?A*xW(|X zNkpyDRhdY3?YFcT$9rQqI`aafL^-x}FU222?tr5Qcxrl1&L;xajGLC zO@cgAzfPv9iTzL$aopmSK{m<3IDdz?@RX^7bxXgUMzQ6}7$PsPMfDJ-W9KP+?NUb} zptHGec2oBfu?RCHzk%l{9H->ZrepNwDm*hPMjr_g#a`e=O}2L9=V<5M<2$IP84xB+ zB+yRV134#%-UxMD`e1hL6CV3o=r1QYKPnVGiw7s2m0{Z5JOv#PWqI0kqDbZq1L;bW zGoqZ?PYbiLs}?903pux+2FhVLRI{>EYnf@ezgKBT2VsCU38oaj>4 z=dL6sCAp`=T)qx6zx_b;&DS7lofiBtCpAg5G1W5&k=5(-K z74!2aT7Ig(kk;4@s^p{}W;U=oP4u1zL6CNk(vWBcK9Zh0<}>y|L1+4ftLt+HB9(nE zMi4g#;CZM!E_7=@yk~_HqQgc37NYwe^^s%c5z(qq5B`Ls<03jIk*1&mlPOi5#o+WX z_cqac9s;{jQfa5B#IIArK^ex#ZIUKGH+us{#1|z!chqOB3~;y2oxRdQ1a0AJ0_AR$3A77EDh6KI@m6s5^)Zj~5Q? zFdKs`6%=D|KE-k>TU~>(+tv!p7q8etIXVilG}cy?Onun3JD&oGbx0ZL5JAlo+2>5r z$B3Sv^M_vO1Rb6B+SerMHK1H(t?0&!l_Il8T(@@kt*0}5ZBwAxHzcsdW@jvi5^}|q zm*rMtvS_-Iajwv-e1=+9L%bUU_r>q5u($D6@>Seflx+Jp$PV&{ni~uR zcQ6u-#DMbm7dE)2mr9(UPiL3TvFzM#i^NB5R`yzFyHQ>F1Oey&v!$DIXlo1&TDvY# zeNN7{I^n%Ae0u$kV-PuR)WZI5m&(CxZv5QXp?6(Rug7{3DfrjOKW!L#FO{EYo=YzL zVZ$6cRJDn17^tEOjn(h7r*PlA>ALthEp%MF$)Ik%r}{*H{LLiWsS`S74khJ+7Jd>F z1!QY8aeJD2A9L@_KvQt}?n%SM$2P3pf0(}d!X0^cB3-J#_`B(AOiJ`CC9*EhW5Moo zrC&W(k=Ft$Zue{_$5^eS%sNse&;DfJ#hC%N3c)Ex*Nx`ep(KW|@|mz*2@NQ4g_C(vn}qgb8U%4R1CJ2s9|ZEpf&8j!L?ml{*A(_rX+LR0dH9bvtjSSH{pGJ0IY1%=R@TIh(8Zq4y*Yt3WzZS@ z2uF|5(z95h)ysD=`zw(0R|W87b)_`rw^=8GF|#G9Rhl|7(0~}q?pthiJ(?UH)Y++H zS+sm&ja|0PoJ3mj)%(xM%xV2@jh1lzF_|uh)NF_*^Ce+2%OGtUC+Kz+G#_&D#PeBK z`QGV%4jP!8Pv>I73KzMmh~=Of=!li_(x1`6`#bTci5}mf`bTsSe}pc|cVCMifo`PX zC)v)Z$d_GjV0Ojl*C(tEW|dP+7ioj?3%7*1b1G%Cn{U$}_Ibt3rb?g{TwK_RIw=?< z{&3&9rE9;;5V>h%)lLr3eCz5429r3QRglYS|j@xwo+Qg+~eo zL+`te02i{seTIu78&)-&GHZh^vexaq_e_3&Nf;OYIS+lvL)=8W3S$bwJb1qLhQ{za zT^Ns@?=BCS?Z`^A-}{>RdelbBnuT$9oOZ1l7snkqpJS`R=q%T&P)olb%0H@#yZ~1D zO;@oVJ#E1Nh<2cUktLjVZIBnXbdEo`Xr5+!?nKnAI3HB+w2)*MIdA%)UZK^jXkq3M zv;K$U0OaTYtT0-qRupXwUynr^XQ&+~I)h@R`XdnaxtpSTj7a-oslNxJ@1?3d3<}-} zKPbpM@@hjv@bF)D9Y|}i4Cu2$RBI4f!9zxEKa45Z^Vg?Si3qXMfy8+zUxrETOw)% z>t{4$o$6FUgKz65-XbNluIT8lz3XkDd?X!|%CuqQ*Fy%i35OS;b|iIkMejXJ;3J?LHm&{6AapixEXJZ5C%?z+9wye}`hr)Ih{J$!|1mAT7&5AgEO0%WNm zuYQw7S4IRT!`s{YZFuNM9|Cl2s1l%bqA+~!yYSMfWb|h_#*2WM)k1KygwpY%<;HLH z%S~2W-g&Rdw$A8P!ecXw?!;ObcvQ55%y|RsW7SLb{NBn}x=(0ArDl@1b80H~3i}zl zn)3Og%-428j#d30)t`=-?q2{vxjaxIaxs!;bhM1M7r;`&7tK;I(tDdX%giQiS`RZ? zeTfaPi;}BNxf25e+@$uEO_O5EJqn0!{!shRgci&@9*N6*JI!5=tUF8t;0V24k~U}} zF0-DELbuGmt^U!4xC{WlM}zs|xQ>`p9`}s9za(xn;ZHbrCC_U> z4Ku5$BN$HRMeqY~W{ zZJ=q-eFE6eKE^5y?5^u~tlHLbkR6W=FzHxO&D0O+&eZSTi9Maod_4O)3CL}f@Skzt zbDBt3*Dw2M6>@*G%eJ<0NJWd!Y*n26TQt;zuWWs;JzM7+(Eoz*T6v7P(+9~GM|@u{ zN7jeS!sq+-g#2oXzCt-p!ir5FUyYK04&; z2tgL1=O5E^TlEE-t<4yXX^k5wz{)*h3#}vP4LLZueuc+{UVl=>aYeglq6HBaw|hwh z(bt}!7F!65o^a6DGv;M9Yf+wY@pMU3j?lPIP7|sxF;U!?b2}C>lvgEe6zWzs9cTQC z4YJl)-Wx0#-12PKE}pNwwf9Q@%!Hmjqq(k_==^42jAcs%&z|UfrGSRQtk}eS;Pk+Q zS#fN!MeJ%{@~5t}eAxVZmHXG@^gXk-#k%ZgNYX>Unj5hfy)a8+|FUOwtVQ=siz(5H|O(9aQyP;@nY#(TO zc`xFGlLYAC_6>WemB#o60G(yOBJxxmYzYuo#|ne6k{e-!M&iA?_Q+BKh)^z=dA7@l z_r+T~(=T26Hi*ZvWFCWV%gt(sU09}fQU$GgE^DX;y>vb}5dGP_a4p{ZRj$8eD}d$j z&j9A&DS(wvh?*uq1Kh#TlZ|yU5~2hEW-1Sq5+Oosv&l{l0o07`FGXZX04`#kjq;7y zGWcz*Du>J~$_NS%4$Lb4^0NMIRmplqgPb#RlFt_@I}s`}a;7;%aa4iH8?Mclf2%Sa zyX#8TLm}VgkJ`NzOpATJXx3Edlu1_*G&39f((8dT^hT%o9_)~Xyt^flA#%P_MiS`!~oigd& zb#(`=6(YQ4(x_q_w>;loy;n~OYB=w61w2gYJb42U$>+VAXbPp@o^Mx*o#4)}2Ss4T z$IYW{KQJtszV0k+MNo_a^Wf z%shLgs0j1~7E_fa%Cm*JO&1jOduGe+s`%cb5~JXBZR)965g05uy7vmKXWGdYJ2|%2 z5!C?oe1K(db(z;Oc1QB*F+r3qW2E*V_m3E;+49c$Y4~U8*G1aS-doJG!;G$;b~PO# z)1UK!-3|4-b2)ualC-PH{>2zay>i*rl6P}%&c3`zZVJ12d+|~wn)FYGFBLK`OZqq6k=8o z-@N&G?1n4#waim~^ERfZ#jguAL>o2XlEW2o`4(ncG!tx?O#8r%j2$xT@U^E>6Owj8 zPvZGQ`^s2ME2UNp`^~U!Vi@xm_{0$isSEt>QwrDI4*zg1Lv`K>ySdwUV({}3+X7QY zjgI6^xZ-o~wWcvEi{oEJyFMKYQmf%rZEux&*~xD!13hA(jT_vXEYYuk+B>c64CZ)# zIE_<4s?FscxY!6%~v=>lNR2(ppJi#n}ZCG%~X_Uehz;p*JIwCtk8C>|oEkb!8 zyGktXPU3S-zJi|6G~@6iiR3|KG^y`774CWw@Qk3d?)!S#()x_3i~onJ^Nfb`joSS` zO@s)7AX-F1qKoJ)5hBt1Xro5&WkxsAI}yE&7M;<1ixLtw>gb)(#^_^|ah|;IIUmjk z%Lj{P@jQFq_ukj_yNEoushbVec1eib?dxYO7PGayGTn7 z+~T{`fA6;B>TtB_Py~V%k~qWf8e-=hr5fsbclxWS0o3K!#{l&$&ZrL zM-^0@(V$(13r=i<)5=icle2vw`LUsn)G zfLhvnoi(w`awuKM9oE$0w9@rSShGB+co?7F@TZJZBa8S?nXM9>b%u_^FON%feP*a{ zqFP%im#6Z)@Xz}3{l3KMAjg3Wo^wyAXA<}P;6>Bmqvn#;+k0NaUcH7C42#dF6XzL8 z21wvCbuXvu)ccrdbVc4C0`I&!;fv{rFA##l$4K6@>75dzYE&-2#h}v--rM9=-H+mq z>x-81j!99>S?_krWGqY+@UeNXmC&T2JCJ(UI}f2Rk24#Ia#dr`I#eD&UpAEfkHN~f zc1Un;T3HO8Ft4baBHvjA#Es38eDsV2ar^m1j6-6HmmfXe|3K3wxbt@ zFMf%()tuE!bK&&P```-A6WaV^pGh?cevP#7HBsSKsFc@DgDrB{H**h`X4F^Xm#|6& znCN7NVC#VGR}!&vdA}2}zDRtxgx+P)Dobx{ozkel@4mZ=r&PA)k#o)fvfh3Jjy&fz5RJj!=mVV8QHqoVM}>?8rOP}{EZc!pP&AIe4l zVhJ;agz5#@R<+NlqbAI9DAKsftxCI~^P)=*m@L1>-M*y(yPs_X=;SQW#e}OgTw{vzt@-<4itC2wZN4)yL-mV9eF^=(OS|&4)`<4ir>Rnd7033qZ+wMiLvJiovL|EVu8YuVD_s8eL=eX2$;k9RxDF)V)Xt z-pL9@OzM3pkrgsIX|Ns65ZN!&OV*=2)Psy)I_*tY?V}=C|5{c`5AGPUr+zOU3H~xw zSD>=iQFXLORky%;B0=G+m3gV3ssu@!x$!bgZIh}S+#IPmzpcN1mAz(%igar3a5zhI%143ri_aI0~$-V?En1dZ0t2TXy? z5c@*>OO1b~sd{LE^{E*}-I#$!6a)BvC&4;tL%XEEbAOY8dH&S!ND37xBT_fzYhxsMs6t=DV%D5TOae2 z-4|f2cv-cSiI_q7nl$;ISj+lCp?bv4*Nw9e^q(F(Mq;n-7i#5EV00L*eakMnanSYs z;QFSuyubRzH6D{2F{8?$Z^{F5v+zQmqMClLAkSUWU6xM71a|PH%9FXqaP#`AarKpP zRH5HsVSDeiYth_T^zW-Z!3;G z4WUM0lY7G(tI-*Y^cKU2^Ni=ybz`pvM_g8}@=%jh65&O4i*^L!74CSvQihsE;VFBq z;js6Z(f3D7&>L4zZr3YVB<)ATtVLo->YCD5KgZ$JU4abKgC#m-2 zH9-O3a5wFkfirAuqU{@@)|=lfv5hO#Bp^^dkTB=;0R=ep1n>2jCCUI6RqI;CYuth54l^|3duiCL0{y%a9@ndG0o(~O71v>NRNsd0uI^o zvaiANqRfeQH*IG-=zA^ym_`3`>4bziVu@lovMb(2>AjqE-X`s_G|w+}&M9tH37k}P zgR4|>6eZ%2M9B+4@VLXSftS&iM>OapHG700QAaAff89OA19A|;F<9zVx)sU>^emG> zCW;a|-FvleV4HtaKR`M?uP@UjS3&&oT0)!nfC#I~rxmuYAObBP0nJE|)2+$ae> zJ0@iW;Sc&oOMepaiO+GrUYQRU%%2>&h}jiN&;9VUnR{&JoWletgHFMeNybQZ)U|sA zMOOwY$mTwiQ9@<^ZAz)$?nsZ_Via@7tN_6h!)o^|zMlt<+9b}X$IpUNB zq6RjjsUX&k7%Eb^`mUum(>GjpxWZV@7oG7k?>UE(pY4vyaM1k& zhG$O_X zcqqX?0j)s!+*ALlOu&>x4aYRDJreqn%bV6^LgYD=DVA&udMw5_O2QNX{`{YX@#BTx ze=Ckl*@^BH)o~?yR8!<_-HS3!+W-{Y8!=bC+&`-&{x4JzS>4=Ow&9t> z$)$jjBQlSs6XI@sB^0$k`TqFTkNj`tQx!>6RO+YlWyZ+`NZc@hG?=#zEa&q&w%FyH z{P`QW8QA~<>mB+G!Eu!GNAmT78jD_IzJnIm>JrqaT?4a8Kur3d33Z3oYSUjt*iZ=~ zvt1gbr&smMIatN@Y0NDO5r({22 zs)|I2;}G6f8aR-u3^J*`^oC~*x)V6IRWY`Wys9g42YgX%S5fM=W}+XpzBk1zV**B7 zlJYz9?zWhs!_&l~Fid~Y`T^iSB3hP}yD@wkd&LbLe&Y0H3qd)3zeqHTiF-0<1t9zU znkV1MGO%akXH_eXekMzUcoE@#QM>txkML3cmFmC+4pt&)-BM9;=Du6s`Jb|^d5HaN zbZSA$YAy9@;+x{L z?ZMCpbo^^&+iqpQwT1K@O&f?D*Vpna8Dzu`(LQV8218LO%sTRV&xtQAhs%WntZTz+?@zc6&p%6NsXa zZlXl8W-@JxPe{Ag%FhXT`*P`hG5Cw$CQISvr$XY7iKUsw)9nueOqfPo@CCyD{D~Bg zI4f^?vl%9L5Pz(gY_o;y&-{AP$({V>i5dEMw$|Ee z7r5!kJ@@O@sc65gur>1`A`N!Vl)0*Unm_LcJ3{B3Fl*a3#R^9VX+iMr?OC?$+U$;(&vf%R&~LI7VzufYMmPjN54guOWoVYIZnn$LZ* zV-aJC;GVt$^WRObV?QQH-e}WC+BXxH`mT^_d#=@-ZeeVc`c59OWh_JKN*pXS0Z>md z$CCw_NuF#0M}W3r4;a>HiJ`CQi&P`9jH9xiXh(F-zbx_E(la0+8;8 zlAj8#zH#Mrl2rlV#lxF_YbdbAtLZ$t=pF4BYQmp72B##G!Ix*~HTwu)nls`H+wN^? zW<5&w$P%GoQ+AWmIH4^W;SByUA*y-svAC=1f>TwZ)j^HY<5aTnpWRES=m(@%FS&yo zk81YJ#j3PG(Ybm&hbr;msDF0mxqL(tWZD0|UWH-Xm|@usYm{GbMKhcJiMuS!Nb}-k zJH8UatCaTyKcN*FAx*p^|Hkmo1WLMfgTJ-ORAghS zQVq^f1^QL1%<~v3o!n22#h(|>OFB*Q4{bM_^u{V9C1HvBHNBowQ`W@2Fj9Jfj(+JG!2-0-F8ot+h6B8Arz`AM~uTOi{BBVcvx#+ZX}njA~gTRNg{(~i_5 zBDgowRL6O*lXCEg+IMOj)6CeGi)6n@+y0517Zf+EE~3u|uIp!P8QEGV3x1fIA~ z8qTBY(TMC375XdXi!CY{Fho0g?iv`t#szNvcT-nPS7}V$Q#_@D5-LfL7>kWZ(d;40BkQ8@JL8Q9 zrYQ+iC!g=oeT{rdY3KtiK^Hz#O@RS^?r0 zhu7UXFQzB|s6T*~i(jxy?N7q;cGU-Z7w#$_VR#ZB4ov(A;lW!MN)$|~l zSp6Eh+TEH@(?u)h{VvMq1zq&M&6;-m%;nhoZu*P80CMkoepHagAil5x+gVfq9n}?hSc#^hw-a3IF*=BWZcjdC>VoM*lX%pYAvCVYRc zqsxYkLC)4qzI&}pY>>MiJiHLJIsp=$AlaNEtPNcPdDrMVyy zm!XTq`H1+$MvMf^*0CeZyiSP_19Xf&8G^82-*p4(A=e8=iP!HrygPAYp1y;b1AFP1 z{)PPqQuKO48~ciF5O(pp-FpfPi_C(yS(dRGx*{(&mFRY>M!uN~_TlU_l4CIjMh*S@ z%HAUW!%G<*B+(hWzZ?y8*&K)ifI>*z8%I4={YW`E9u)I@n#xux$WsTB3Hx#3ep$+t zIa1-sj!zQbcLO({7}Y#V-{Q|(b$tic#w=7FEhS53UNWt9fLG=(U%Be}a5cy(bGYn^ zVZ{YqBpqXB%m3>22p1llspO7)FVWi@vz$-iQCJvBX&PRNGDWFC#8C9MuE57!^brT- z&rUhNM(o`d?e}9$wf}cq>4qiOs;f-2L52`N;i~VxFO^!^3v^zO6V*bFKfzSs&tAlj zxYs6Dc;;$v{5n@L4rA$(@v)2d{J8iRc^D?aN!(Wd!cg1(WdHmwU-mbtx#({&3|wnB znj1{#;KFuxU8wq9T9b(X7kjf)$$nkyUk#@;Iy}}6YgV$H9RFK$0r?dc# zstE38VD|oJpQp0UE?8>f^hd{*X}MmqT5$=-N5}Sm03#CP*KZ3W=M2>vSc!CsV@h@b z)`mkx>rsT5o{-K&e-!Wy8-SA)4e)5*;(FPMIO#ptp*>E;o&(u$u+y?sxr&fLpwN@nKUaMzi%3yuEt44)m%^=dW181fwVft2%_|f>u_|!! z8T6x1Li7Q$r&7Qm@Ofv^^7$9X^PP|e=~5z3ukt3(0ir26A-$8CZQo6g@olv%Bb$55 zLLXam5xRjwOKr|xC+@*?2B6$@#H=H*y>V_)KWZ>sHG;CjcaJRryvcs)=?Dmt6 zV0?W~3pt}L&hT8@pP&s%S)i!tHV*!HF<(})(WB_c{i1|oO`GV4x0!kBv1M6bc0~Kq zai;CdH3x)QwCP)kati!qU()nJvi!o6c5Q^`Mh!v?H5V;6B?v1uG7>XVyf6egOIEq` zCywlhP}{OT3diT(41@Bazs&OMdvI?kN{dp_W@lWL#AlJdIo5RkRmm+$bU!zu!I5eVbtvr%B5j7CT%a>D~pCwCQL)XJx=Z?!W`NfiF| zyN>|qvhC(eDaNcb7aQO1-FFG!x*5*HOddvbXt7^E>$}N&1#>!y;vaVUVB{sW*`d1etQH!)DN;>B2o&8#<}d5Dx&SAm)Gl+a%_=X zf#XuY9$v=awQ@E+kO5bxssn)+21rysBB$pfF1G;d-dThpSj4kUZy*i$;m6lz8-B_s z*DRyLfIa5zi|NEB<7CZU;g0O5-q&$Y7(ja4Z6zaPZB-=)f8Hx|D8e||g}^Y6wOL>v z+Qdr6**xkwqcLEAl$=UZ3gqmLUOI=2#MsBY01Vlv?NsT8qx>r~ZoOAZ+ zRVk?`fu)2%4=!i^6^Z~6;rGh@GiHnU9?`PF@w^Ki)(H8f6S6zo`}uwk=IP;viURsV zj(uMusx3dpck^yOw|8R?npJJUYdKf1UMnpp(-?eJp#rO%W`(Jl+-&97jkR}Pesv|; zmP9@ME?+XRE$Wo&t@Nq9<#nZ+mM5Th0SmWw?KEB!??w6MVr5%#Ek;d)_=}qPiHPeh z|L{QO!=$*K11*X6z&=ZUHW|0hJ1^^hHx*EEdR3e(Rs2-mg=d7q@H<4%%xd?zOv$dM zC#bt#0l&N}jNFXNQ<$@sy}zJm52Z+3wTojQF{BWd9UeSckM%;NqQoPgYo(0~D|ors z=3H33t(>&Xc&2tq%w_;%ntooV``bH?1L>nzYvK#;ry&8bUJ5oj4FM4o7`r8o3Yg)U!+$uYqP#6v?xuzLr^i=jF=z}BcZYC>&j6&kA9?N@z#|4%l({6ns@)W0fT@>jIPY}=1MnB z4RJ+owfyHle{u$=u#%LxnDcOD5sNYYpTTiLmxSp&KGOibauB!;F$SGVe+w4A=lDk1 zs{6kO{3VC#L5E@tMTDj_Czeq0hh#Zw1a}Sc$)L>V@900$#5?&R?mUhCKrfa9-TGS) zNFEml8zj^v4BQq^;OkBq28-W)Rv$>4nY~Bq_&(^UlOn~@jc}YVs*}!9Ww2F_tm{9j znw`ThALRrX7TQC>w{|-(u8P{^9mQM@k=FHc z8Vh+h*K{Ec{N$PUR=xaI!`TALOjh^FhYx}AOu+H4H;Yebwv0nurso9+gnD@9lL1C7 z;jjdj@J@n<-B-R%@#Ns+KiD>dJCb;b;bmHJvj0}{@2Hp=Ts{;&YW+!w?0i$m|of({4Ha`+vDpwW7#viA@{WUCJwUp{vcTq;m;W{Tclwx8}l0MoXlp@qU@5c2Q=-eBgq4Kgp++zMp)%6z4P1x3>~C-GBV9ZFRRE1ivNK*Q_wUxVtQWzq(!K;7 zB!IK?TO-(mwWso$NIOZqQ44pKZA-IFXcmB2a+YKTEP>Pelu}k3 zUMXC3b6MfVpXc5gEO~->KehvlHCeVduw7XeWpENaDaCA{*vX2 zKBqHF`}Dc88ni)K=I424ia8GKITEmnWT&IQWjhJyVRQ(Kq6WHRWO z%c1lgRfPtR2q0IBlNK%h=r&=#|6t3%NH*nm>*(|sy;{$~OY-A=UKJj5UdMhoiQTy0 zUZj0V^^0|V40@KEnH3DqMR+tMvS%P6jK_orql10i9QIan-$=^9pcVzYPK58X0~*iwAIKKb4MB3^*-C`*j>lQ$&m8`$@dtddzQ^d{ zqjwWFFBmvg@)ot1+A&gKQn0Z3oA!NU-w^uQ*>+34{fEXs?&!Mn#7w8gldi-~WPPl? zf7s`5xR{r%?Ucv{m@h)Ca!j%E_V1=WiOME)>8_&$;_WP+>tY-3)g*F|5%l%oLJeZk z^sBtT^uJvq6QoT?`CBGE9)a<)0~g;p(ood3jlSZ=4gS%1OJM%?@uz zksR*PUGwu#N0U+!o{mz-+VM@78}oHHN9j}iMGP#uZdF7z8Rdn>GGa5xNFA46Fv;d( zq3d?CetlQj?8uZ#Qt`vZ!}z^pj3366LJRbK(q^Z?|^N3Jt~^2X-AUS7A$P z{^k^=wptUaGS@e_+Z1^)F5}6nz^UlZK^tV8Eg}C^Mmy+bBf!cJP*xJ<$Q1kVDJb-Xv?1RoUYGUXP+HL)&I>GYLb zY&I5>0Z)P?%kuUJ^}B#hxhme(^|wjNZn_fsd0tUlbRdu5@PIJn;O?P{@cMhcxq1$n z9%>ZxeS)BmPVhgkh#6n{>`s<~o=peFQw*H%j&ok-Of_08Z*y{Vad%xd{#7yveb~tN zY=aI(7poq|O?z&pDzw-1yQ7yTWm)pM)Dq3RA9pgYXtI~-DcRx27gb|$K|w$sNPoWNgdwr9w|fgkknzA_pr$g;1TKTeKec(d+)Iv%|l(2_Q|BBqtz zCS!Q?2l*frd+=zd3~Q{QBp!ppr}@!AGYc*tCaAA>Id z?BvsTY!mo1M{7?$YqfILp|H**w%BRW(8s;++FIG2X8U0DdG6$}PL(|YT!E13^?e9* zXCF6+CHpw{jJ>CYxbu@(;_;f1rGbVx)}yzn9pQ61aj~!T4jo&6oIHUK(=R-eqmxQ{ zvA6STFYTbyanMC^9<*3ctZb&;D0@bbu1|-D%RyR4lW|?h#03$(WP1M;R$~w>;*Qa)nZAvl z!x4V@XgFou=N#2^^{mAYKksEE>^g-PVCCF9`atDS=a*00=Gupky;Jd9DMtVAqa--C zFU{CA1D3(ry&6U5%Gj7o;NUw-v`x;*VBeO&^~UIO%@|y~mje?@9R;C=V~_jc3D}z* z{XwDntX^%A!CG3bP5wF1@i`s;(D6+&-84R*VWRygTXbBki(lWMU8B7c?p=z>1~*xt9VI&MvB zv91-dJJ%uk=NMZGN~^(^2|y;%m&w<=mLuh>ZSCLW5+K2qk=NX&vgz|Mg_-cgc5>;{ zO6Su}G}gsemhDl+HW|UFRIfT=%k<4-XxC2u{V6D6Y5!^U<;-cpADe8#D(E#c!{t-F z>4$*ToC?P*BG*VNGFjb><>wjoz|lF+u|kMcBDrNcmUikem5v)U?=F+mGOZesrE`lL zK1K8(Tplje_SXvUSE}_=Pi!Pa7Az#Iqq+29+Hi`0fjLl2lEZ-Tggvpn~ke&uxSRJEx&;{<1zk(Xn83Dg77))HAk<#9!|7 zT~ku}r9;o}C!FE>sGe_8uz44Q%x$v|xR7Yeg`(Z3gQFj8P1}}(8(yEZ1c8GeACFxw zB38w9WrIaesw)qFqXgZVmJH8VD@b{6gxfmpJXZx)vgUkaj~J)8{jtBO?GIhEUV5d| z#mvtrj4mGQGz9~03rOpj=bvgGAD6&Y{N6_);gO%efwA5kNdiA{hW~AXmnk!Q?!TKV zV;@HG{w8O;ofAmz$mv!+TJ`(C$fa8-_mZ(3`97NjK4TRWLzV~fz3O{8lY~)|!K!23 zs7m4$g3M)yDQ^DD*HT?CEP>10BM;h$$L`;f-oL6hS0y^6hW}oTx^-Vhhn}e~>i4fy zx`SsErU~wB$uYOS@n)IULvX#mF6d=u|66Zb|6@LP3RJ9I5nZ45?dG5jl$BJ0`Hodn zeCJyZ|M?dy{tYPctMZ6TfI%v5+$HgtQPruh57O_|qx(>jS9LqRrMFSeWY;3$(pqOz z^j9EbZ+jjAM_?k~O~1hM+R_?MI&1YXMzxeC_hV0V`%99di)|WX6^e+sTgn8dxlzXf zavwPR^Gw_+pw3DzSx)%xS zHf4slDsS-i+)=Kpo1Q47Dxchw%t$b!eeWjoQTlO5` z8BZ&0f`)gG_?7k#=xjHoc!+v zt4Xp-o+W4L^(Yh`Kg;C2JAt=a>r)32waj8f(w7#~E~1-I`J{u_BOMw}x7?S?@;;R< zD<0XY4*uL(A1N1J9W-EYW!TL@F?G*9J;An)Sq-;x3su6__a`lo5Yb1_=3EAtLYwDa z)==kqnXUb&F1$j0cnUeqp3~XGeiIX9 zaI9d;F5_>{ndv>O2#?B&WI*4d)tf$}I0`xN0ZOk%yQ99kZvV?v05OP0OWCNldTyEB zwP)(^nr{VwDPPAsrVYW(cJ4S+GS4`O6(9m>xHB+;+Jw-4PUe&jhtzzIL2X;jdlY8} zKQ+T7u*&fwN2~N5fzUF+ZlS1-M^`?f8GPM7I9cwp)eme?`n%Zi>Z=iK+Mo&b=2>89 zwim}VE|esHGU4*i#LPcH!o`JG46=_8^5DJYfkUY)PtR>_tcl8=i-{rrh>!{ONC`#R-zVfOeST{u_KRh?i0~gv zKBO{YcIxIa4}uGnW|JUhb}u64EQ9Nn=$fex2d3E87unJg8rH+}ZD?OfY%Ba1a?!Edk{%>zq6P2 z4m05GgoUOyT8m{f0TkkHrp)xg$0I_OUCU(5zqY=y%H;D4{p^0IP0+pS(R6~hCYVz{fCAq3N+yGVhJ22ZxwLAH!0bcQQqN&lD`B zpWXWpEu~XH4t<#zilQ5lC$P?wPIVJ9Nyd2c4!O=%J%qW$kcBb7`!!~;^j;d11&a-l z*!TPcSiVfajmkcwwjc>=QA&BKyZ_2D&ZN0qfgVnQN7#IzFmM#p%82&O?liC!<9eWf zuxI3*+AQu1x}5$NUC}yaS3gtPFIY4ulrm1(GVd2JX(apZ3^dnbfeta-y$wS9T{L!5 zjP*QdVf1Y)UpvUSV>_5ss(q;oovHQ~Qkb3$p|8++c+RqwgIIf*^KQb?WW>*${QfXjfbg4$%0#q5Tf|?Ru=dJVDqWvFtGP>jJZ|^0ko5JfQ?$~vg%2O0yNxhA z`#|W4)iaA@WRv-~#^)tVI~z0KD;Y`P+-!n|Q}Q#*6;-|yp>b_<`UgHdvaHJ^t*W=ea&5`bbPLGp)$pP(z^b} zWV~bjf=QcIX35|Fnlxx2&GbX+O6KaKS^PbMESMu(Q6~HtUK32!kkPE5FUiwt+xFEc z!S+(d6ZgkGqur^O8Y(ivW7jb{o48q_En{5T&0sf;;~(^9s!h?lubDPLYQ+Hx4LZ9Y z#G#*|>F8Iz7_Pk7&})Z2m8E>H7vA6UZHZ9flSe@;-c~NXT-K8;vY$tJy6)gPm4(Dy zhugsu0kn*(nr9HKrfo}R}lBekAHR5 z8EHAuzMYqT08b=m%*;~}S*^PPcYdP7@nqk5%Ry1ymf{0^bH zo*CAd_5PGdVm9lS<@}uRY6e^VD?T1c{uS z91kIr*#uUu4BHuR;c03x?NCl2Q--m#UteRew0ABzVdz`hNSN z(i_nc@=t$nNdZAb%Om+J92Xvd5OxT#w9pOy*L$x6BQdzK0V|+_;^um|#t&mdISI77 zlIrg~CDjfaCmelO=q~AcTY`X{=9$YGAXC4)NPj;3?0&A8_~J9;0i>t?V7NY!OJ@OwFJfUloRGRPGFGcjQPFiPeqYrpm zm4Kts@Hmss9rm3mKwfIXbk>&B`Wp)(1CIf!?q~1VmTF;A!iSGsGl}(zzW+ZK!1)t_ z?41ht0bnN+N1Y408@>RZJ_U@zbd9D#Kc0&}xIHKxZHfCAOZm@2X{^zcPH0FhK!77R zf1{dpmik+ATBzof4=&=c+{%$f+&O$&amU}3K-(vW5^;7-Tf@R#DnwC6d_4(5yj|NX ztMh@5=1nD5lH`9X9JOa|SOdm9Z`&~`f4>-dxEJ7fYJjwiM!bSnih$jD_j?ZQ)Xz)} zO&c9&DS9<}S!X2aKt=9nWZSzKJ>zhMc130LC#LdtZ0nm4RA`&m>*UWuS%dWOxM!4A zhFyr5gCe;D(`7=pnQZ%(_%Z`zGcr!bzHl+;Hks&?}W^|=*s3$dz9|D)BB*| zA1Xb+f<&UyGRUxS?3@tclY_1JFT5WP0{hscGTu;tJnpN5*6G#z3K^ArMLFL@_DdQ3 zONrqjgD{^kUr|GZS)CL5k0xcwMMpQ^8-y@#W&7<(^BoPlb-fExSF8*_uBO-8RPU(B zJ6pLq+bOLecrKu`8qI-d3#AFY5ZH(;;kod<7-%=n=kJnCM($Y=*I<5l6?5p%7s9f} zlGxWpozSg5j4fk?Eo97(cPQ5`&M+KA#NdadrnXgJtPsxCMr{q zS*2b_`wB=JXr-tXBI7LJo23pbt~$8hmgZeOq>JrWv$uWFa@$Q}Ckv>;g<}6-6+Z1& zIn{pas&JV(3wz~gPO4@+Nr6L%EhAXg3kIO_nESO z`Z^{1MYEa90NTw=tbTxMq!9h=rswKTq3iYIT67jIe{yPRL8YK?g45;^+ta~B?52Sb z^X=Sulen)OmBbGkZ_XwydU|oPpINxeg(^DCWuN3Yc?O4R&$o*me`Xrw6AYT?=b5=@ zYvM1X4mY})HkGV2oHoABqe27Rut-l&mzq>#wyPDK4IIZlh=U%@%XioHN>q|Vz$K2p?(@$x>FiNyQJG^1WZ`CeVjA+>(2;j~Nr z$QCOH0j*_R6&o}K3e zuGfK0mU~p%J=OA`dRE79SsESof*<5ih-fDrL$;omch^Yrb`+On(I42qJcb5;bqlQc zzhzSz%Pmjz>yzkWn|sHEmEl$PjL%X2sk|^O7#HmeE1xPHv#XS@V}5&ZP~(c}8i*|s zDCHirxGpENB7WT&zFg@7?&wNQ_ufaK%nlAaSgKXj}O9^w^D>=9+ zS!RGVW)_RCAF-xbP2dP?0&7|DIk(2AvRQZYJ(5@>IG%KG`bK6;a-JySp2a1aP*W-a zRr^o$m}W2M!$|OB*UTn0hGYkDhu?L8ZpHeFyHBVX_*%IEz|9Qs?n-7g>87t#>RZb) zdAxWwLBFz*;lySAZ|fE0AHH+`!tGfg(ZhgqhT#?80`yl4vhC7}b|M)nw@;h=!%T|= zgpMHx!wtZL&QDmgOnRbbNKi=kVErLqpHiT!&qYR^-gyq5B`z7uk`X3mkK zf@ra7fdRT?P?1|i&(i=6vxE-~LpwjOoQ^!F_y-ZRfOZ+6Y)s61IA7t+%%saCNFBky zj!0AcvxI7f4c5#?_^dTiO z`JVV~V{u2K)2B3c!n;|=0bkGk-L;=~v-ATwH8UpPih#;#-9JMyPRU={wbxLC7=b9G ztIQKcrd*TTM#K3BkwzN^aBNj{q|aF$Bo@CEt3TLU&v&G<%R1fg7FaMxMK>08hQvBh zj7`jbb|Qfi(AN8--z~TX+PMB~Y6?**4g#-V!%04itOkVqRFYWA^BJ?K(H?qL7Rmhr}`NCM8@YE7@Ye0p%!Jr=tnU@qjZn34Swof~I z_51+H@Dvm_s%1OGQ&=R{)7Rv2Db9S~$;b5@BE0;VrP=$#`arE9vvz9d_T=0ljZdDN zcTK2shZVS+UL5ofyIKK^phyya(zO>HTIv42jrF_(;*Q&;zb)~2-&++-0pz5|grGdd zF2pN#*E2^OSZ(H#@Zpo!-=~VNM|&#`x)2rR0S>@AydG`!NJr22=NNRk!rke`03fH; zbuJDbi;9n~`$J9m(9H6$yIZ=qxnW=NDJGK^p#sN|50xt!4H@eg z4Z9fA$X-j}OkK&E(Q)x}ScM-e$V;PwObUvSA# zb>KYX6H1#-(s|}v5v#Hr8H8rA<^yG46AAH4q9(Z)d;O!=6Owsn9gWO{ z`u#jI2ExvLZdjf3E3#p?iNt9CXUV+zYz`zOPAqA2S*OoolMvpd zlp}1eYN^7|8hYtlCo&PEVGInK;;2pc;*$Rldv6^URoC_n3nC#PCEXw)AgOe>fFLR$ z-9vY`NVn3R0xIp$-5?All0$b5HS`eQ=Dx4%z2$n|=lkC8{rfqNISz)sXYaMvS?gSD zo#*d-j&l5{S*T-lt@WA^bb9=K;Gv$oRZVkz7QQQ?1W!r%_9ma$bEZi0tlGloizHW^ zkr8a1HRoH1bQ)F`<94n&mzhkE9)i?tPx)$k$89d7q$sbQ^M|7=dP8~-xnPm*8J^(l zP5D`%&?*F|%r~cHO9TL0Pz3tr@q8k!3pL%?k!Ajf9wvb`f19rC1YqHyi7^C4?$_i{ z1cqaV$SSd3&{#jz>--gd@7KeI_PO3m?m|svDAK?J&3%>(u1>5)&2IqWQ$A49+w9|T zFxJLdaN!3$df86TH>@CSKe21>`?0qhe$xCp1UiZ@*FrckBCeLI;Y}|%?Ypy;;ujyF z9&WdL+0Df*Ucd9BAC*@3s?uW5p(aY~Erlw*5trHZ2bP@VB|xJnNX49KDeznf zmvY(;x;iidWC!Vc%lxjk7d&B+6C6qFKqjo!8~_3)ZoMWMTJPeJrMj12>dW4lP*QlK z2Wjp5O1?eNF|-N-={dhInKC%9CZ)NLlSKuo-@=*?BR=7-(i0NSDleKFT$@=;C-vvV z;#;5(euoy7JXa0h>$iBeb{qprji9pSrq&)IE^V&>HdcGfMowslxt#a0v5)YrD6 ziwH?uOyrn-oif}FZ;5SQUEk-J2F0xQ8rIk2gT1DLXTD@=19S?W7&`yo4B=Q3GrdtHJ5@;p~9^zfrW!gZC7~3b;`CM|DMVV(Cl@c zasZ!Lip7Zt6W@o;5HTe|h|{hWr<-slX2eN*U6aySaq0g3vaft)%_G*h>az~c4(+9C z*8E))jH`XyeU6>BM{3fT4;VFZ$Ptjk^2J|;S3A(c_L(IQQ4ZWRYx!>9xVk85g9*9Q#wFL@V`_(YS7~$1KUzi3e!qoDrQgFK7znl=F3a#d6 z=cA)~G_ZMy?Kfy{%|%X;0tKD%s;y-YEcMXNR-4U34R*chnBLb9dVbOuU0rZ{TDDh; z@5*)H$h1B602A{&MNI8bo{iWt4}oLmOlGwn+%u?gjgW4~h&pZZWucgso&CRdC@X1S zXAnBZ$WNN~WS3+wi?eQBv?=#>{R(V%F7C*}f$m2X>Q0cjuSspV|Dv{pB=T-am<`}u zrKroF4Y#C0Hi~S_epJPsSP&#!ZGQKJ|2QTKy#m#R_kOA?MjR<_TMX-IkmRaEzhLex ziH)attSc}{57^|~=*nbM9OK;Rs%@0-Pr!H(a|FNs8Y&(b8k>9H|Byyv(jHi@6V&g!-BWZ(%O&hJ+ zPob!nlL^6Zlu|2BMeTMyY~Pgg{xl}W;1xQsWDWl*@+9wvB0=;BPDd#EcDi;}bl>;m z8vdL_#Rbgjvu7+=^eu=*GB_pErlO(qA>IX!6Ed~n$AkUOVk-~?A%^qMV!Vxs7jtEgHmbLu+0~XBff#1B!K04!QKVfxIu(A=SRk%_Jd%7yK${*Sv#Z z3b1X8MAi^4Y60N~>D8`<9iSXJRTax&&6l>yUhGC{-F5z)C0xZdo=y+j>?AMOg;xKP zw0NUWc`v|$5196!U@Wp8JdW+&C-KLP+_ued8Rzml>!6;tNj#x)Bgb=07%qbBfXX4K z1q-O}@-h`|y+lbLZ~UZca4(?WH^s$~GH8X`70rD|Gd);)5pvcTJ9(DIqFp&*08iwS>mGc@(&u1a{yF{q$qX~2dY zcj(H6{q1s9M~GI=7}{G$9=R)A49bVN2OW($*Q4I;rCxd#+)UFcdXwJ}W63#I?hjHD z{Ni9@LMLmU@LqTws^_;LU9c;GcX^qg*2Lv$(~L=`UkQW#Tgbz9d>vCEp?*UV%}E(b zq(#Eqd#F`-uW2jEM7`agZ1Ecshk2kaZbkq{>4#EBtAUzr;hHxjkp+)hT?2o&@B8*O zKMk<6_4;)oJEbXiZh^-CIW?<5r~mq%Zyn%a6lyf$^@JhvqVXKm-)FBD8cW_=D%H^Q zV5mh!Z;NdEg|7Cay8O(UYv!c#?H*EW z5PaG0QQmGf054}v=(IspG%#-;*8N2Fqm1^!+2Sg82q8SxXPHat{~?v!d4QYF19* z8ry2-%a8SfCe5Cf+1*?~m_D*~8*6|?{I)4yh~VyiSzSI890FmUlyWZ1)y$^Z`p~ws zOXHFc))$`4R`*fVT9ot`WP5!n#BA8NbxA({)o~RHD-Xk_-IKBIy-MA^88{I=>w&%U zKZ{*oeA;0JSz|5q8<&ASa9A5>8bF`JVJ&-aQK~euw}le8;sy9YhjdEfRq_qw}+09x$pgZ<=cajsPt}=vU?TI@BG+5ERomLdS&W zgrd~lUtFA^!YA2iy#W=verlx8;lnv9e72&^xo(l!4(?V3^lag z;B9&v{{G+_k=8G3OZ=JTG>#)WTp^y3A`i1;Lz3~4$ZW8x(*E@7FBw?OypAs$Q~t3? zT-1y!C3!oO2QSw-p_O~E5s04B1;FRhTd3O%XDvk+&Ran0Ay%mM(e>QSZ!n)zSWt5kfx^>CY-dMOpSbQHp0?chG#oE-_@V)Can>3^oBL+lEHFWGVrCzFy4q~^ zYI0TZ`)Kf*Q;+HfQ^tuqAN>q^I|YiMMM<*F6mwT|xB!iWwwf#vF_fYTSW((5BXs@HbIV2y*{0Z+r{fTpKIFLP zuCd=?TwfXF>kFV*q9WZ3CVq+P6AQr^LS~(N`(8tgIJR#xZoK8&k8RuBj(NPNp?Hj$qXOr#pwI zLrNF)&msz~`OySjvIKj04@+=Me~-rn>Hd~8$)F!5Y-ewI=D%PA)Q;TMF@#$Oxi0`% zyL^GZUz()TI&dgAw`fhIt`dG2pl9P{RbbNv0wugrT8I%GrR-Y~TNCe%qi8O*ntjfZ zOC(X;^F8&~S@m5`=f@wvdVAZcsZ!14R=>Qkajgt`s>0>c9vg?fN3}ABx ztY#fX%qp!L`1RRug((pFUYaAfLj=5SCCb}y0*}7|H)F9GW!iZqX$W`y7gL+GIOC`x zx*bqPeA_$C(ua@X)`<*Lymcb2`g4}ws95>MD^4E2mCBnsnoJW!-VJUs>Cz_N5ELq} zKYhTX)g(pP;#M_fYv6^WY|H7~@q+bLYM7}qMf*w-=BW+2cjJ13tkar{z`;NU(?m)> zaUb?cp$H5xeJ3|rKhUkYtW|86YEm`q@_!p-1Kan& z_ty6~fV8@kvLVNZ4a^8$vq5yppaG#4LY3*|S58qh!&7VVq!JsQgb0mf2fr=%xml6e zZsYj9SL>B{FF@r?G>3binXJWhW0UfWF&e7L-!oR(X>NL+IQ06kjXZBuo0+qFL zPw|mm(g}ig;&&Rx%>+fLSr1fnG$$CEgY+hX4!T)LPT_NX|1krX#=zQ0tgESdc1#^h3>oZG>in zVD81|>2(s(-s?OTpE_0(_Tu2O0-T*Wfn*BY(Kw4_i0*ctz4L*Vp1P1t>lmIa?RWC@ z#NizJBssQFzwlc8*Gr-K7D&<_W*ff9SA~3%Oe3@+NF&y4?@pQ0=C{<~gks6%>LuzXNhq4mbIXA5y+gF=Pr( z_mm5$^HVoY*Cd&s_+8O)km&a!g{O32fUa&~Sc}KJtJ=&sX9kYZV4rZc(?0;()K^aq zQ4Y16ggi1N?zyOfr91M34vBm{n=)6ue6kasn>&Aq2W&ACo7ℑGP@~vaKR|#boD* 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 literal 0 HcmV?d00001 diff --git a/docs/existing-project.md b/docs/existing-project.md new file mode 100644 index 0000000..0f764ab --- /dev/null +++ b/docs/existing-project.md @@ -0,0 +1,81 @@ +# Installing on an Existing Project + +It's also possible to use Symfony Docker with existing projects! + +First, [download this skeleton](https://github.com/dunglas/symfony-docker). + +If you cloned the Git repository, be sure to not copy the `.git` directory +to prevent conflicts with the `.git` directory already in your existing project. + +You can copy the contents of the repository using Git and tar. +This will not contain `.git` or any uncommitted changes. + +```console +git archive --format=tar HEAD | tar -xC my-existing-project/ +``` + +If you downloaded the skeleton as a ZIP you can just copy the extracted files: + +```console +cp -Rp symfony-docker/. my-existing-project/ +``` + +Enable the Docker support of Symfony Flex: + +```console +composer config --json extra.symfony.docker 'true' +``` + +The [worker mode of FrankenPHP](https://frankenphp.dev/docs/worker/) is enabled by default. +To use it with Symfony ≤ 7.3, install the FrankenPHP runtime: + +```console +composer require runtime/frankenphp-symfony +``` + +Then update worker configuration: + + + +```diff + worker { + file ./public/index.php ++ env APP_RUNTIME Runtime\FrankenPhpSymfony\Runtime + {$FRANKENPHP_WORKER_CONFIG} + } +``` + + + +> [!TIP] +> +> You can disable worker mode by removing the `worker` directive from the `frankenphp` +> global option in your `Caddyfile`. + +Re-execute the recipes to update the Docker-related files according to +the packages you use: + +```console +rm symfony.lock +composer recipes:install --force --verbose +``` + +Double-check the changes, revert the changes that you don't want to keep: + +```console +git diff +``` + +Build the Docker images: + +```console +docker compose build --pull --no-cache +``` + +Start the project! + +```console +docker compose up --wait +``` + +Browse `https://localhost`, your Docker configuration is ready! diff --git a/docs/extra-services.md b/docs/extra-services.md new file mode 100644 index 0000000..545d7bf --- /dev/null +++ b/docs/extra-services.md @@ -0,0 +1,25 @@ +# Support for Extra Services + +Symfony Docker is extensible. +When you install a compatible Composer package using Symfony Flex, +the recipe will automatically modify the `Dockerfile` and `compose.yaml` files +to fulfill the requirements of this package. + +The currently supported packages are: + +- `symfony/orm-pack`: install a PostgreSQL service +- `symfony/mercure-bundle`: use the Mercure.rocks module shipped with Caddy +- `symfony/panther`: install Chromium and its drivers +- `symfony/mailer`: install a Mailpit service +- `blackfireio/blackfire-symfony-meta`: install a Blackfire service + +> [!NOTE] +> +> If a recipe modifies the Dockerfile, the container needs to be rebuilt. + + + +> [!WARNING] +> +> We recommend that you use the `composer require` command inside the container +> in development mode so that recipes can be applied correctly. diff --git a/docs/makefile.md b/docs/makefile.md new file mode 100644 index 0000000..819a8d3 --- /dev/null +++ b/docs/makefile.md @@ -0,0 +1,129 @@ +# Makefile + +Here is a Makefile template. It provides some shortcuts for the most common tasks. +To use it, create a new `Makefile` file at the root of your project. Copy/paste +the content in the template section. To view all the available commands, run `make`. + +For example, in the [getting started section](/README.md#getting-started), the +`docker compose` commands could be replaced by: + +1. Run `make build` to build fresh images +2. Run `make up` (detached mode without logs) +3. Run `make down` to stop the Docker containers + +Of course, this template is basic for now. But, as your application is growing, +you will probably want to add some targets like running your tests as described +in [the Symfony book](https://symfony.com/doc/current/the-fast-track/en/17-tests.html#automating-your-workflow-with-a-makefile). +You can also find a more complete example in this [snippet](https://www.strangebuzz.com/en/snippets/the-perfect-makefile-for-symfony). + +If you want to run make from within the `php` container, in the [Dockerfile](/Dockerfile), +add: + + + +```diff + gettext \ + git \ ++ make \ +``` + + + +And rebuild the PHP image. + +> [!NOTE] +> +> If you are using Windows, you have to install [chocolatey.org](https://chocolatey.org/) +> or [Cygwin](http://cygwin.com) to use the `make` command. +> +> Check out this [StackOverflow question](https://stackoverflow.com/q/2532234/633864) +> for more explanations. + +## The Template + + + +```Makefile +# Executables (local) +DOCKER_COMP = docker compose + +# Docker containers +PHP_CONT = $(DOCKER_COMP) exec php + +# Executables +PHP = $(PHP_CONT) php +COMPOSER = $(PHP_CONT) composer +SYMFONY = $(PHP) bin/console + +# Misc +.DEFAULT_GOAL = help +.PHONY : help build up start down logs sh composer vendor sf cc test + +## —— 🎵 🐳 The Symfony Docker Makefile 🐳 🎵 —————————————————————————————————— +help: ## Outputs this help screen + @grep -E '(^[a-zA-Z0-9\./_-]+:.*?##.*$$)|(^##)' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}{printf "\033[32m%-30s\033[0m %s\n", $$1, $$2}' | sed -e 's/\[32m##/[33m/' + +## —— Docker 🐳 ———————————————————————————————————————————————————————————————— +build: ## Builds the Docker images + @$(DOCKER_COMP) build --pull --no-cache + +up: ## Start the docker hub in detached mode (no logs) + @$(DOCKER_COMP) up --detach + +start: build up ## Build and start the containers + +down: ## Stop the docker hub + @$(DOCKER_COMP) down --remove-orphans + +logs: ## Show live logs + @$(DOCKER_COMP) logs --tail=0 --follow + +sh: ## Connect to the FrankenPHP container + @$(PHP_CONT) sh + +bash: ## Connect to the FrankenPHP container via bash so up and down arrows go to previous commands + @$(PHP_CONT) bash + +test: ## Start tests with phpunit, pass the parameter "c=" to add options to phpunit, example: make test c="--group e2e --stop-on-failure" + @$(eval c ?=) + @$(DOCKER_COMP) exec -e APP_ENV=test php bin/phpunit $(c) + + +## —— Composer 🧙 —————————————————————————————————————————————————————————————— +composer: ## Run composer, pass the parameter "c=" to run a given command, example: make composer c='req symfony/orm-pack' + @$(eval c ?=) + @$(COMPOSER) $(c) + +vendor: ## Install vendors according to the current composer.lock file +vendor: c=install --prefer-dist --no-dev --no-progress --no-scripts --no-interaction +vendor: composer + +## —— Symfony 🎵 ——————————————————————————————————————————————————————————————— +sf: ## List all Symfony commands or pass the parameter "c=" to run a given command, example: make sf c=about + @$(eval c ?=) + @$(SYMFONY) $(c) + +cc: c=c:c ## Clear the cache +cc: sf +``` + + + +## Adding and Modifying Jobs + +Make sure to add this configuration to the [.editorconfig](/.editorconfig) file, +so that it forces your editor to use tabs instead of spaces. + +> [!NOTE] +> +> Makefiles are not compatible with spaces by default. + +```.editorconfig + +[Makefile] +indent_style = tab + +``` + +If you still want to use space, you can configure the prefix in the Makefile itself. +See [this answer on Stack Exchange](https://retrocomputing.stackexchange.com/a/20303). diff --git a/docs/mysql.md b/docs/mysql.md new file mode 100644 index 0000000..9a4beac --- /dev/null +++ b/docs/mysql.md @@ -0,0 +1,107 @@ +# Using MySQL + +The Docker configuration of this repository is extensible thanks to Flex recipes. +By default, the recipe installs PostgreSQL. + +If you prefer to work with MySQL, follow these steps: + +First, install the `symfony/orm-pack` package as described: + +```console +docker compose exec php composer req symfony/orm-pack +``` + +## Docker Configuration + +Change the database image to use MySQL instead of PostgreSQL in `compose.yaml`: + + + +```diff + ###> doctrine/doctrine-bundle ### +- image: postgres:${POSTGRES_VERSION:-16}-alpine ++ image: mysql:${MYSQL_VERSION:-8.0.32} + environment: +- POSTGRES_DB: ${POSTGRES_DB:-app} ++ MYSQL_DATABASE: ${MYSQL_DATABASE:-app} + # You should definitely change the password in production ++ MYSQL_RANDOM_ROOT_PASSWORD: "true" +- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-!ChangeMe!} ++ MYSQL_PASSWORD: ${MYSQL_PASSWORD:-!ChangeMe!} +- POSTGRES_USER: ${POSTGRES_USER:-app} ++ MYSQL_USER: ${MYSQL_USER:-app} + healthcheck: +- test: ["CMD", "pg_isready", "-d", "${POSTGRES_DB:-app}", "-U", "${POSTGRES_USER:-app}"] ++ test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"] + timeout: 5s + retries: 5 + start_period: 60s + volumes: +- - database_data:/var/lib/postgresql/data:rw ++ - database_data:/var/lib/mysql:rw + # You may use a bind-mounted host directory instead, so that it is harder to accidentally remove the volume and lose all your data! +- # - ./docker/db/data:/var/lib/postgresql/data:rw ++ # - ./docker/db/data:/var/lib/mysql:rw + ###< doctrine/doctrine-bundle ### +``` + + + +Depending on the database configuration, +modify the environment in the same file at `services.php.environment.DATABASE_URL`: + +```yaml +DATABASE_URL: mysql://${MYSQL_USER:-app}:${MYSQL_PASSWORD:-!ChangeMe!}@database:3306/${MYSQL_DATABASE:-app}?serverVersion=${MYSQL_VERSION:-8.0.32}&charset=${MYSQL_CHARSET:-utf8mb4} +``` + +Since we changed the port, we also have to define this in the `compose.override.yaml`: + +```diff + ###> doctrine/doctrine-bundle ### + database: + ports: +- - "5432" ++ - "3306" + ###< doctrine/doctrine-bundle ### +``` + +Last but not least, we need to install the MySQL driver in `Dockerfile`: + +```diff + ###> doctrine/doctrine-bundle ### +-RUN install-php-extensions pdo_pgsql ++RUN install-php-extensions pdo_mysql + ###< doctrine/doctrine-bundle ### +``` + +## Change Environment + +Change the database configuration in `.env`: + +```dotenv +DATABASE_URL=mysql://${MYSQL_USER:-app}:${MYSQL_PASSWORD:-!ChangeMe!}@database:3306/${MYSQL_DATABASE:-app}?serverVersion=${MYSQL_VERSION:-8.0.32}&charset=${MYSQL_CHARSET:-utf8mb4} +``` + +## Final steps + +Rebuild the Docker environment: + +```console +docker compose down --remove-orphans && docker compose build --pull --no-cache +``` + +Start the services: + +```console +docker compose up --wait +``` + +Test your setup: + + + +```console +docker compose exec php bin/console dbal:run-sql -q "SELECT 1" && echo "OK" || echo "Connection is not working" +``` + + diff --git a/docs/options.md b/docs/options.md new file mode 100644 index 0000000..c4a93a6 --- /dev/null +++ b/docs/options.md @@ -0,0 +1,121 @@ +# Docker Build Options + +You can customize the Docker build process using these environment variables. + +> [!NOTE] +> +> All Symfony-specific environment variables are used only if no `composer.json` +> file is found in the project directory. + +## Selecting a Specific Symfony Version + +Use the `SYMFONY_VERSION` environment variable to select a specific Symfony version. + +For instance, use the following command to install Symfony 6.4: + +On Linux: + +```console +SYMFONY_VERSION=6.4.* docker compose up --wait +``` + +On Windows: + +```console +set SYMFONY_VERSION=6.4.* && docker compose up --wait&set SYMFONY_VERSION= +``` + + + +> [!NOTE] +> +> If you're using Symfony 7.3 or earlier with FrankenPHP in worker mode, you also need to follow these steps +> +> ```console +> composer require runtime/frankenphp-symfony +> ``` +> +> Add `env APP_RUNTIME Runtime\FrankenPhpSymfony\Runtime` in the `frankenphp/Caddyfile` in the `worker` section. +> +> ```diff +> worker { +> file ./public/index.php +> + env APP_RUNTIME Runtime\FrankenPhpSymfony\Runtime +> {$FRANKENPHP_WORKER_CONFIG} +> } +> ``` + + + +## Installing Development Versions of Symfony + +To install a non-stable version of Symfony, +use the `STABILITY` environment variable during the build. + +The value must be [a valid Composer stability option](https://getcomposer.org/doc/04-schema.md#minimum-stability). + +For instance, use the following command to use the development branch of Symfony: + +On Linux: + +```console +STABILITY=dev docker compose up --wait +``` + +On Windows: + +```console +set STABILITY=dev && docker compose up --wait&set STABILITY= +``` + +## Using Custom HTTP Ports + +Use the environment variables `HTTP_PORT`, `HTTPS_PORT` and/or `HTTP3_PORT` +to adjust the ports to your needs, e.g. + +```console +HTTP_PORT=8000 HTTPS_PORT=4443 HTTP3_PORT=4443 docker compose up --wait +``` + +to access your application on [https://localhost:4443](https://localhost:4443). + +> [!NOTE] +> +> Let's Encrypt only supports the standard HTTP and HTTPS ports. +> Creating a Let's Encrypt certificate for another port will not work, +> you have to use the standard ports or to configure Caddy to use another provider. + +## `Caddyfile` Options + +You can also customize the `Caddyfile` by using the following environment variables +to inject options block, directive or configuration. + +> [!TIP] +> +> All the following environment variables can be defined in your `.env` file +> at the root of the project to keep them persistent at each startup. + + + +| Environment variable | Description | Default value | +| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | +| `CADDY_GLOBAL_OPTIONS` | the [global options block](https://caddyserver.com/docs/caddyfile/options#global-options), one per line | | +| `CADDY_EXTRA_CONFIG` | the [snippet](https://caddyserver.com/docs/caddyfile/concepts#snippets) or the [named-routes](https://caddyserver.com/docs/caddyfile/concepts#named-routes) options block, one per line | | +| `CADDY_SERVER_EXTRA_DIRECTIVES` | the [`Caddyfile` directives](https://caddyserver.com/docs/caddyfile/concepts#directives) | | +| `CADDY_SERVER_LOG_OPTIONS` | the [server log options block](https://caddyserver.com/docs/caddyfile/directives/log), one per line | | +| `SERVER_NAME` | the server name or address | `localhost` | +| `FRANKENPHP_CONFIG` | a list of extra [FrankenPHP global directives](https://frankenphp.dev/docs/config/#caddyfile-config), one per line | | +| `FRANKENPHP_WORKER_CONFIG` | a list of extra [FrankenPHP worker directives](https://frankenphp.dev/docs/config/#caddyfile-config), one per line | | +| `MERCURE_PUBLISHER_JWT_KEY` | the JWT key to use for publishers | | +| `MERCURE_PUBLISHER_JWT_ALG` | the JWT algorithm to use for publishers | `HS256` | +| `MERCURE_SUBSCRIBER_JWT_KEY` | the JWT key to use for subscribers | | +| `MERCURE_SUBSCRIBER_JWT_ALG` | the JWT algorithm to use for subscribers | `HS256` | +| `MERCURE_EXTRA_DIRECTIVES` | a list of extra [Mercure directives](https://mercure.rocks/docs/hub/config), one per line | | + + + +### Customizing the Server Name + +```console +SERVER_NAME="app.localhost" docker compose up --wait +``` diff --git a/docs/production.md b/docs/production.md new file mode 100644 index 0000000..d41ff0b --- /dev/null +++ b/docs/production.md @@ -0,0 +1,140 @@ +# Deploying in Production + +Symfony Docker provides Docker images and a Docker Compose definition optimized +for production usage. +In this tutorial, we will learn how to deploy our Symfony application +on a single server using Docker Compose. + +## Preparing a Server + +To deploy your application in production, you need a server. +In this tutorial, we will use a virtual machine provided by DigitalOcean, +but any Linux server can work. + +If you already have a Linux server with Docker Compose installed, +you can skip straight to [the next section](#configuring-a-domain-name). + +Otherwise, use [this affiliate link](https://m.do.co/c/5d8aabe3ab80) +to get $100 of free credit, create an account, then click on "Create a Droplet". +Then, click on the "Marketplace" tab under the "Choose an image" section +and search for the app named "Docker". +This will provision an Ubuntu server with the latest versions of Docker and +Docker Compose already installed! + +For test purposes, the cheapest plans will be enough, +even though you might want at least 2GB of RAM to execute Docker Compose +for the first time. +For real production usage, +you'll probably want to pick a plan in the "general purpose" section +to fit your needs. + +![Deploying a Symfony app on DigitalOcean with Docker Compose](digitalocean-droplet.png) + +You can keep the defaults for other settings, or tweak them according to your needs. +Don't forget to add your SSH key or create a password +then press the "Finalize and create" button. + +Then, wait a few seconds while your Droplet is provisioning. +When your Droplet is ready, use SSH to connect: + +```console +ssh root@ +``` + +## Configuring a Domain Name + +In most cases, you'll want to associate a domain name with your site. +If you don't own a domain name yet, you'll have to buy one through a registrar. + +Then create a DNS record of type `A` for your domain name pointing +to the IP address of your server: + +```dns +your-domain-name.example.com. IN A 207.154.233.113 +``` + +Example with the DigitalOcean Domains service ("Networking" > "Domains"): + +![Configuring DNS on DigitalOcean](digitalocean-dns.png) + +> [!NOTE] +> +> Let's Encrypt, the service used by default by Symfony Docker to automatically +> generate a TLS certificate doesn't support using bare IP addresses. +> Using a domain name is mandatory to use Let's Encrypt. + +## Deploying + +Copy your project on the server using `git clone`, `scp`, or any other tool +that may fit your need. +If you use GitHub, you may want to use [a deploy key](https://docs.github.com/en/free-pro-team@latest/developers/overview/managing-deploy-keys#deploy-keys). +Deploy keys are also [supported by GitLab](https://docs.gitlab.com/user/project/deploy_keys/). + +Example with Git: + +```console +git clone git@github.com:/.git +``` + +Go into the directory containing your project (``), +and start the app in production mode: + +```console +# Build fresh production image +docker compose -f compose.yaml -f compose.prod.yaml build --pull --no-cache + +# Start container +SERVER_NAME=your-domain-name.example.com \ +APP_SECRET=ChangeMe \ +CADDY_MERCURE_JWT_SECRET=ChangeThisMercureHubJWTSecretKey \ +docker compose -f compose.yaml -f compose.prod.yaml up --wait +``` + +Be sure to replace `your-domain-name.example.com` with your actual domain name +and to set the values of `APP_SECRET`, `CADDY_MERCURE_JWT_SECRET` +to cryptographically secure random values. + +Your server is up and running, and a HTTPS certificate has been automatically +generated for you. +Go to `https://your-domain-name.example.com` and enjoy! + +> [!CAUTION] +> +> Docker can have a cache layer, make sure you have the right build +> for each deployment or rebuild your project with `--no-cache` option +> to avoid cache issues. + +## Disabling HTTPS + +Alternatively, if you don't want to expose an HTTPS server but only an HTTP one, +run the following command: + +```console +SERVER_NAME=:80 \ +APP_SECRET=ChangeMe \ +CADDY_MERCURE_JWT_SECRET=ChangeThisMercureHubJWTSecretKey \ +docker compose -f compose.yaml -f compose.prod.yaml up --wait +``` + +## Deploying on Multiple Nodes + +If you want to deploy your app on a cluster of machines, you can use [Docker Swarm](https://docs.docker.com/engine/swarm/stack-deploy/), +which is compatible with the provided Compose files. +To deploy on Kubernetes, take a look +at [the Helm chart provided with API Platform](https://api-platform.com/docs/deployment/kubernetes/), +which can be easily adapted for use with Symfony Docker. + +## Passing local environment variables to containers + +By default, `.env.local` and `.env.*.local` files are excluded from production images. +If you want to pass them to your containers, you can use the [`env_file` attribute](https://docs.docker.com/compose/how-tos/environment-variables/set-environment-variables/#use-the-env_file-attribute): + +```yaml +# compose.prod.yaml + +services: + php: + env_file: + - .env.prod.local + # ... +``` diff --git a/docs/tls.md b/docs/tls.md new file mode 100644 index 0000000..6e96f76 --- /dev/null +++ b/docs/tls.md @@ -0,0 +1,88 @@ +# TLS Certificates + +## Trusting the Authority + +With a standard installation, the authority used to sign certificates +generated in the Caddy container is not trusted by your local machine. + +You must add the authority to the trust store of the host. + + + +### Linux + +```console +docker cp $(docker compose ps -q php):/data/caddy/pki/authorities/local/root.crt /usr/local/share/ca-certificates/root.crt && sudo update-ca-certificates +``` + +### Mac + +```console +docker cp $(docker compose ps -q php):/data/caddy/pki/authorities/local/root.crt /tmp/root.crt && sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /tmp/root.crt +``` + +### Windows + +```console +docker compose cp php:/data/caddy/pki/authorities/local/root.crt %TEMP%/root.crt && certutil -addstore -f "ROOT" %TEMP%/root.crt +``` + + + +## Using Custom TLS Certificates + +By default, Caddy will automatically generate TLS certificates using Let's Encrypt +or ZeroSSL. +But sometimes you may prefer using custom certificates. + +For instance, to use self-signed certificates created with [mkcert](https://github.com/FiloSottile/mkcert) +do as follows: + +1. Locally install `mkcert` +2. Create the folder storing the certs: + + ```console + mkdir -p frankenphp/certs + ``` + +3. Generate the certificates for your local host (example: "server-name.localhost"): + + + + ```console + mkcert -cert-file frankenphp/certs/tls.pem -key-file frankenphp/certs/tls.key "server-name.localhost" + ``` + + + +4. Add these lines to the `./compose.override.yaml` file about `CADDY_SERVER_EXTRA_DIRECTIVES` + environment and volume for the `php` service: + + ```diff + php: + environment: + + CADDY_EXTRA_CONFIG: | + + https:// { + + tls /etc/caddy/certs/tls.pem /etc/caddy/certs/tls.key + + } + # ... + volumes: + + - ./frankenphp/certs:/etc/caddy/certs:ro + # ... + ``` + +5. Restart your `php` service + +## Disabling HTTPS for Local Development + +To disable HTTPS, configure your environment to use HTTP by setting the following +variables and starting the project with this command: + +```console +SERVER_NAME=http://localhost \ +MERCURE_PUBLIC_URL=http://localhost/.well-known/mercure \ +docker compose up --wait +``` + +Ensure your application is accessible over HTTP by visiting `http://localhost` +in your web browser. diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md new file mode 100644 index 0000000..6b61ec9 --- /dev/null +++ b/docs/troubleshooting.md @@ -0,0 +1,53 @@ +# Troubleshooting + +## Editing Permissions on Linux + +If you work on Linux and cannot edit some of the project files right after +the first installation, you can run the following command +to set yourself as owner of the project files that were created by the Docker container: + +```console +docker compose run --rm php chown -R $(id -u):$(id -g) . +``` + +## TLS/HTTPS Issues + +See the [TLS section](tls.md) for more details. + +## Production Issues + +### How To Properly Build Fresh Images for Production Use + +Remember that, by default, if you run `docker compose up --wait`, +only the files `compose.yaml` and `compose.override.yaml` will be used. +See ["How Compose works"](https://docs.docker.com/compose/intro/compose-application-model) +and ["Merge Compose files"](https://docs.docker.com/compose/how-tos/multiple-compose-files/merge). + +If you need to build images for production environment, you have to use the following +command: + +```console +docker compose -f compose.yaml -f compose.prod.yaml build --pull --no-cache +``` + +### Building Dev and Prod Images + +Dev and prod images use distinct image names (`app-php-dev` and `app-php-prod`), +so they won't conflict with each other. + +To build and start the dev image: + +```console +docker compose up --wait +``` + +To build and start the prod image: + +```console +docker compose -f compose.yaml -f compose.prod.yaml build --pull --no-cache +docker compose -f compose.yaml -f compose.prod.yaml up --wait +``` + +> [!WARNING] +> +> The order of `-f` arguments matters. diff --git a/docs/updating.md b/docs/updating.md new file mode 100644 index 0000000..ed328fb --- /dev/null +++ b/docs/updating.md @@ -0,0 +1,19 @@ +# Updating Your Project + +To import the changes made to the _Symfony Docker_ template into your project, +we recommend using [_template-sync_](https://github.com/coopTilleuls/template-sync): + +1. Run the script to synchronize your project with the latest version of the skeleton: + + + + ```console + curl -sSL https://raw.githubusercontent.com/coopTilleuls/template-sync/main/template-sync.sh | sh -s -- https://github.com/dunglas/symfony-docker + ``` + + + +2. Resolve conflicts, if any +3. Run `git cherry-pick --continue` + +For more advanced options, refer to [the documentation of _template sync_](https://github.com/coopTilleuls/template-sync#template-sync). diff --git a/docs/xdebug.md b/docs/xdebug.md new file mode 100644 index 0000000..f0349d0 --- /dev/null +++ b/docs/xdebug.md @@ -0,0 +1,98 @@ +# Using Xdebug + +The default development image is shipped with [Xdebug](https://xdebug.org/), +a popular debugger and profiler for PHP. + +When using [Dev Containers](https://containers.dev/), Xdebug is pre-configured and works out of the box. +Open the **Run and Debug** panel in Visual Studio Code and start the **Debug PHP** launch configuration, then set your breakpoints and load a page. + +For other setups, because it has a significant performance overhead, the step-by-step debugger +is disabled by default. +It can be enabled by including `debug` in the values of the `XDEBUG_MODE` environment variable. + +On Linux and Mac: + +```console +XDEBUG_MODE=develop,debug docker compose up --wait +``` + +On Windows: + +```console +set XDEBUG_MODE=develop,debug&& docker compose up --wait&set XDEBUG_MODE= +``` + +## Debugging with Xdebug and PhpStorm + +First, [create a PHP debug remote server configuration](https://www.jetbrains.com/help/phpstorm/creating-a-php-debug-server-configuration.html): + +1. In the `Settings/Preferences` dialog, go to `PHP | Servers` +2. Create a new server: + - Name: `symfony` (or whatever you want to use for the variable `PHP_IDE_CONFIG`) + - Host: `localhost` (or the one defined using the `SERVER_NAME` environment variable) + - Port: `443` + - Debugger: `Xdebug` + - Check `Use path mappings` + - Absolute path on the server: `/app` + +You can now use the debugger! + +1. In PhpStorm, open the `Run` menu and click on `Start Listening for PHP Debug Connections` +2. Add the `XDEBUG_SESSION=PHPSTORM` query parameter to the URL of + the page you want to debug, or use [other available triggers](https://xdebug.org/docs/step_debug#activate_debugger) + + Alternatively, you can use [the **Xdebug extension**](https://xdebug.org/docs/step_debug#browser-extensions) + for your preferred web browser. + +3. On the command line, we might need to tell PhpStorm which + [path mapping configuration](https://www.jetbrains.com/help/phpstorm/zero-configuration-debugging-cli.html#configure-path-mappings) + should be used, set the value of the PHP_IDE_CONFIG environment variable to + `serverName=symfony`, where `symfony` is the name of the debug server configured + above. + + Example: + + ```console + XDEBUG_SESSION=1 PHP_IDE_CONFIG="serverName=symfony" php bin/console ... + ``` + +## Debugging with Xdebug and Visual Studio Code + +1. Install necessary [PHP extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=DEVSENSE.phptools-vscode). +2. Add [debug configuration](https://code.visualstudio.com/docs/debugtest/debugging-configuration#_launch-configurations) + into your `.vscode\launch.json` file. + + Example: + + ```json + { + "version": "0.2.0", + "configurations": [ + { + "name": "Debug PHP", + "type": "php", + "request": "launch", + "pathMappings": { + "/app": "${workspaceFolder}" + } + } + ] + } + ``` + +3. Use [Run and Debug](https://code.visualstudio.com/docs/debugtest/debugging#_start-a-debugging-session) + options and run `Debug PHP` to listen for upcoming connections + with [the **Xdebug extension**](https://xdebug.org/docs/step_debug#browser-extensions) + installed and active. + +## Troubleshooting + +Inspect the installation with the following command. +The Xdebug version should be displayed. + +```console +$ docker compose exec php php --version + +PHP ... + with Xdebug v3.x.x ... +``` diff --git a/frankenphp/Caddyfile b/frankenphp/Caddyfile new file mode 100644 index 0000000..fef196e --- /dev/null +++ b/frankenphp/Caddyfile @@ -0,0 +1,66 @@ +{ + skip_install_trust + + {$CADDY_GLOBAL_OPTIONS} + + frankenphp { + {$FRANKENPHP_CONFIG} + } +} + +{$CADDY_EXTRA_CONFIG} + +{$SERVER_NAME:localhost} { + log { + {$CADDY_SERVER_LOG_OPTIONS} + # Redact the authorization query parameter that can be set by Mercure + format filter { + request>uri query { + replace authorization REDACTED + } + } + } + + root /app/public + encode zstd br gzip + + mercure { + # Publisher JWT key + publisher_jwt {env.MERCURE_PUBLISHER_JWT_KEY} {env.MERCURE_PUBLISHER_JWT_ALG} + # Subscriber JWT key + subscriber_jwt {env.MERCURE_SUBSCRIBER_JWT_KEY} {env.MERCURE_SUBSCRIBER_JWT_ALG} + # Allow anonymous subscribers (double-check that it's what you want) + anonymous + # Enable the subscription API (double-check that it's what you want) + subscriptions + # Extra directives + {$MERCURE_EXTRA_DIRECTIVES} + } + + vulcain + + {$CADDY_SERVER_EXTRA_DIRECTIVES} + + # Disable Topics tracking if not enabled explicitly: https://github.com/jkarlin/topics + header ?Permissions-Policy "browsing-topics=()" + + @phpRoute { + not path /.well-known/mercure* + not file {path} + } + rewrite @phpRoute index.php + + @frontController path index.php + php @frontController { + {$FRANKENPHP_SITE_CONFIG} + + worker { + file ./public/index.php + {$FRANKENPHP_WORKER_CONFIG} + } + } + + file_server { + hide *.php + } +} diff --git a/frankenphp/conf.d/10-app.ini b/frankenphp/conf.d/10-app.ini new file mode 100644 index 0000000..92a9d22 --- /dev/null +++ b/frankenphp/conf.d/10-app.ini @@ -0,0 +1,13 @@ +expose_php = 0 +date.timezone = UTC +apc.enable_cli = 1 +session.use_strict_mode = 1 +zend.detect_unicode = 0 + +; https://symfony.com/doc/current/performance.html +realpath_cache_size = 4096K +realpath_cache_ttl = 600 +opcache.interned_strings_buffer = 16 +opcache.max_accelerated_files = 32531 +opcache.memory_consumption = 256 +opcache.enable_file_override = 1 diff --git a/frankenphp/conf.d/20-app.dev.ini b/frankenphp/conf.d/20-app.dev.ini new file mode 100644 index 0000000..729fe45 --- /dev/null +++ b/frankenphp/conf.d/20-app.dev.ini @@ -0,0 +1,5 @@ +; See https://docs.docker.com/desktop/features/networking/networking-how-tos/#connect-a-container-to-a-service-on-the-host +; See https://github.com/docker/for-linux/issues/264 +; The `client_host` below may optionally be replaced with `discover_client_host=yes` +; Add `start_with_request=yes` to start debug session on each request +xdebug.client_host = host.docker.internal diff --git a/frankenphp/conf.d/20-app.prod.ini b/frankenphp/conf.d/20-app.prod.ini new file mode 100644 index 0000000..99cc791 --- /dev/null +++ b/frankenphp/conf.d/20-app.prod.ini @@ -0,0 +1,5 @@ +; https://symfony.com/doc/current/performance.html#use-the-opcache-class-preloading +opcache.preload_user = www-data +opcache.preload = /app/config/preload.php +; https://symfony.com/doc/current/performance.html#don-t-check-php-files-timestamps +opcache.validate_timestamps = 0 diff --git a/frankenphp/docker-entrypoint.sh b/frankenphp/docker-entrypoint.sh new file mode 100755 index 0000000..561e6f2 --- /dev/null +++ b/frankenphp/docker-entrypoint.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -e + +if [ "$1" = 'frankenphp' ] || [ "$1" = 'php' ] || [ "$1" = 'bin/console' ]; then + + if [ -z "$(ls -A 'vendor/' 2>/dev/null)" ]; then + composer install --prefer-dist --no-progress --no-interaction + fi + + # Display information about the current project + # Or about an error in project initialization + php bin/console -V + + if grep -q ^DATABASE_URL= .env; then + echo 'Waiting for database to be ready...' + ATTEMPTS_LEFT_TO_REACH_DATABASE=60 + until [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ] || DATABASE_ERROR=$(php bin/console dbal:run-sql -q "SELECT 1" 2>&1); do + if [ $? -eq 255 ]; then + # If the Doctrine command exits with 255, an unrecoverable error occurred + ATTEMPTS_LEFT_TO_REACH_DATABASE=0 + break + fi + sleep 1 + ATTEMPTS_LEFT_TO_REACH_DATABASE=$((ATTEMPTS_LEFT_TO_REACH_DATABASE - 1)) + echo "Still waiting for database to be ready... Or maybe the database is not reachable. $ATTEMPTS_LEFT_TO_REACH_DATABASE attempts left." + done + + if [ $ATTEMPTS_LEFT_TO_REACH_DATABASE -eq 0 ]; then + echo 'The database is not up or not reachable:' + echo "$DATABASE_ERROR" + exit 1 + else + echo 'The database is now ready and reachable' + fi + + if [ "$(find ./migrations -iname '*.php' -print -quit)" ]; then + php bin/console doctrine:migrations:migrate --no-interaction --all-or-nothing + fi + fi + + echo 'PHP app ready!' +fi + +exec docker-php-entrypoint "$@" diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..c0037a8 --- /dev/null +++ b/public/index.php @@ -0,0 +1,9 @@ + An array of allowed values for APP_ENV + */ + private function getAllowedEnvs(): array + { + return ['prod', 'dev', 'test']; + } +} diff --git a/symfony.lock b/symfony.lock new file mode 100644 index 0000000..4f0faf0 --- /dev/null +++ b/symfony.lock @@ -0,0 +1,116 @@ +{ + "doctrine/deprecations": { + "version": "1.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.0", + "ref": "fdd756167454623e21f1d769c5b814b243782a67" + } + }, + "symfony/console": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "5.3", + "ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461" + }, + "files": [ + "bin/console" + ] + }, + "symfony/flex": { + "version": "2.11", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "2.4", + "ref": "52e9754527a15e2b79d9a610f98185a1fe46622a" + }, + "files": [ + ".env", + ".env.dev" + ] + }, + "symfony/framework-bundle": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "8.1", + "ref": "312027aea160796a50bf2d185503afdb5d71f570" + }, + "files": [ + "config/packages/cache.yaml", + "config/packages/framework.yaml", + "config/preload.php", + "config/routes/framework.yaml", + "config/services.yaml", + "public/index.php", + "src/Controller/.gitignore", + "src/Kernel.php", + ".editorconfig" + ] + }, + "symfony/maker-bundle": { + "version": "1.67", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "1.0", + "ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f" + } + }, + "symfony/property-info": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.3", + "ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7" + }, + "files": [ + "config/packages/property_info.yaml" + ] + }, + "symfony/routing": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.4", + "ref": "bc94c4fd86f393f3ab3947c18b830ea343e51ded" + }, + "files": [ + "config/packages/routing.yaml", + "config/routes.yaml" + ] + }, + "symfony/security-bundle": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "7.4", + "ref": "c42fee7802181cdd50f61b8622715829f5d2335c" + }, + "files": [ + "config/packages/security.yaml", + "config/routes/security.yaml" + ] + }, + "symfony/twig-bundle": { + "version": "8.1", + "recipe": { + "repo": "github.com/symfony/recipes", + "branch": "main", + "version": "6.4", + "ref": "f250159ebe99153d0c640a3e7742876fc7453f2c" + }, + "files": [ + "config/packages/twig.yaml", + "templates/base.html.twig" + ] + } +} diff --git a/templates/base.html.twig b/templates/base.html.twig new file mode 100644 index 0000000..c6fd7ad --- /dev/null +++ b/templates/base.html.twig @@ -0,0 +1,23 @@ + + + + + {% block title %}Welcome!{% endblock %} + + {% block stylesheets %} + {% endblock %} + + {% block javascripts %} + {% endblock %} + + {% set frankenphpHotReload = app.request.server.get('FRANKENPHP_HOT_RELOAD') %} + {% if frankenphpHotReload %} + + + + {% endif %} + + + {% block body %}{% endblock %} + +