From eb5052c0b298eeeded95cfa7ca8781b62b6335ea Mon Sep 17 00:00:00 2001 From: Staormin Date: Tue, 29 Oct 2024 23:46:32 +0100 Subject: [PATCH] Init --- .docker/php/Dockerfile | 41 + .env | 24 + .env.local-dist | 3 + .github/workflows/ci.yml | 22 + .gitignore | 21 + Cistercian numbers.png | Bin 0 -> 147778 bytes Makefile | 50 + Readme.md | 54 + bin/console | 21 + compose.yaml | 8 + composer.json | 73 + composer.lock | 2821 +++++++++++++++++ config/bundles.php | 9 + config/packages/cache.yaml | 19 + config/packages/framework.yaml | 16 + config/packages/routing.yaml | 10 + config/preload.php | 5 + config/routes.yaml | 5 + config/routes/framework.yaml | 4 + config/services.yaml | 24 + ecs.php | 194 ++ phpstan.dist.neon | 4 + public/index.php | 7 + src/Command/GenerateCommand.php | 35 + src/Command/MergeCommand.php | 689 ++++ src/Controller/.gitignore | 0 src/Kernel.php | 11 + .../CistercianNumberGeneratorService.php | 284 ++ src/Utils/FileUtil.php | 17 + src/ValueObject/Quadrant.php | 75 + symfony.lock | 82 + 31 files changed, 4628 insertions(+) create mode 100644 .docker/php/Dockerfile create mode 100644 .env create mode 100644 .env.local-dist create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 Cistercian numbers.png create mode 100644 Makefile create mode 100644 Readme.md create mode 100755 bin/console 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/routing.yaml create mode 100644 config/preload.php create mode 100644 config/routes.yaml create mode 100644 config/routes/framework.yaml create mode 100644 config/services.yaml create mode 100644 ecs.php create mode 100644 phpstan.dist.neon create mode 100644 public/index.php create mode 100644 src/Command/GenerateCommand.php create mode 100644 src/Command/MergeCommand.php create mode 100644 src/Controller/.gitignore create mode 100644 src/Kernel.php create mode 100644 src/Service/CistercianNumberGeneratorService.php create mode 100644 src/Utils/FileUtil.php create mode 100644 src/ValueObject/Quadrant.php create mode 100644 symfony.lock diff --git a/.docker/php/Dockerfile b/.docker/php/Dockerfile new file mode 100644 index 0000000..21f3489 --- /dev/null +++ b/.docker/php/Dockerfile @@ -0,0 +1,41 @@ +FROM php:8.3-cli-alpine + +ARG USER_ID +ARG GROUP_ID + +RUN addgroup -g ${GROUP_ID} -S app +RUN adduser -u ${USER_ID} -S app -G app + +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer + +RUN apk add --no-cache \ + git \ + unzip \ + fish \ + curl + +RUN apk add --no-cache \ + freetype-dev \ + libjpeg-turbo-dev \ + libpng-dev + +RUN docker-php-ext-configure gd --with-freetype --with-jpeg +RUN docker-php-ext-install -j$(nproc) gd + +USER app + +RUN curl https://raw.githubusercontent.com/oh-my-fish/oh-my-fish/master/bin/install -o /tmp/installomf + +RUN chown app:app /tmp/installomf && \ + chmod u+x /tmp/installomf && \ + /tmp/installomf --noninteractive --yes + +RUN fish -c "omf install bobthefish" + +STOPSIGNAL SIGKILL + +WORKDIR /app + +COPY --chown=app:app . /app + +SHELL ["/usr/bin/fish", "-c"] \ No newline at end of file diff --git a/.env b/.env new file mode 100644 index 0000000..f08338f --- /dev/null +++ b/.env @@ -0,0 +1,24 @@ +# 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=46e7590c2429fbef676225f48cd34c5f +###< symfony/framework-bundle ### + +CISTERCIAN_NUMBER_GENERATOR_SEGMENT_LENGTH=~ +CISTERCIAN_NUMBER_GENERATOR_LINE_THICKNESS=~ +CISTERCIAN_NUMBER_GENERATOR_MERGE_PADDING=~ \ No newline at end of file diff --git a/.env.local-dist b/.env.local-dist new file mode 100644 index 0000000..7fb3aeb --- /dev/null +++ b/.env.local-dist @@ -0,0 +1,3 @@ +CISTERCIAN_NUMBER_GENERATOR_SEGMENT_LENGTH=100 +CISTERCIAN_NUMBER_GENERATOR_LINE_THICKNESS=4 +CISTERCIAN_NUMBER_GENERATOR_MERGE_PADDING=300 \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..b3bef50 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,22 @@ +name: ci + +on: + push: + branches: [ main ] + +jobs: + check-code: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: shivammathur/setup-php@v2 + with: + php-version: 8.3 + coverage: none + extensions: gd + - uses: ramsey/composer-install@v2 + - name: PHPStan + run: vendor/bin/phpstan analyse + - name: Easy Coding Standard + run: vendor/bin/ecs check diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4871343 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/config/secrets/prod/prod.decrypt.private.php +/public/bundles/ +/var/ +/vendor/ +###< symfony/framework-bundle ### + +###> phpstan/phpstan ### +phpstan.neon +###< phpstan/phpstan ### + +###> squizlabs/php_codesniffer ### +/.phpcs-cache +/phpcs.xml +###< squizlabs/php_codesniffer ### + +output \ No newline at end of file diff --git a/Cistercian numbers.png b/Cistercian numbers.png new file mode 100644 index 0000000000000000000000000000000000000000..29b63b9970aac847334649afc089273234169c57 GIT binary patch literal 147778 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 N0lh=I#oG1}{{#94F)#oC literal 0 HcmV?d00001 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..009e5fb --- /dev/null +++ b/Makefile @@ -0,0 +1,50 @@ +USER_ID := $(shell id -u) +GROUP_ID := $(shell id -g) +CONTAINER_NAME := php +DOCKER_COMPOSE := docker-compose +DOCKER_COMPOSE_RUN := $(DOCKER_COMPOSE) run --user=$(USER_ID) --rm --no-deps $(CONTAINER_NAME) + +help: ## Show this help. + @fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -e 's/##//' | grep -v '###' + +build: ## Build containers + DOCKER_BUILDKIT=1 docker-compose build --pull --build-arg USER_ID=$(USER_ID) --build-arg GROUP_ID=$(GROUP_ID) + +ssh: ## Log into php container + $(DOCKER_COMPOSE_RUN) fish + +install: destroy build install-vendor copy-env ## install project + +copy-env: + [ -f .env.local ] || cp .env.local-dist .env.local + +install-vendor: ## install vendor + $(DOCKER_COMPOSE_RUN) composer install + +destroy: ## Destroy containers + $(DOCKER_COMPOSE) down -v --remove-orphans --rmi local + rm -rf vendor var output + +cc: phpstan ecs ## Check code + +phpstan: ## Run PHPStan + echo "Running PHPStan" + $(DOCKER_COMPOSE_RUN) ./vendor/bin/phpstan + +ecs: ## Run ECS + echo "Running ECS" + $(DOCKER_COMPOSE_RUN) ./vendor/bin/ecs + +merge-view: merge view-last ## Merge and view last + +merge: ## Playground + $(DOCKER_COMPOSE_RUN) bin/console app:merge + +view-last: ## View last generation in imv + imv -f ./output/merge/$(shell ls -Art ./output/merge/ | tail -n 1) + +generate: ## Generate from 1 to 9999 + $(DOCKER_COMPOSE_RUN) bin/console app:generate + +fix-cs: ## Fix code style + $(DOCKER_COMPOSE_RUN) ./vendor/bin/ecs --fix \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..2e7238e --- /dev/null +++ b/Readme.md @@ -0,0 +1,54 @@ +# Cistercian manipulator + +## Description + +This program was created to help solve the second enigma of "Le Tresor de Gisor" treasure hunt. + +Cistercian numbers are a numeral system that was used by the Cistercian monks in the Middle Ages. It use a set of lines to represent numbers from 1 to 9999. + +![Cistercian numbers](Cistercian%20numbers.png "Cistercian numbers") + +The enigma has Roman numerals and a Cistercian number. We assumed that we needed to convert the Romans numerals to Arabic numerals and then to Cistercian numbers and assemble the glyphs to form some word or number. + +It turned out to be a very wrong assumption which was invalidated by the author of the treasure hunt. + +You can use it for other enigma that may use this mechanism. + +## Requirements + +[Docker](https://www.docker.com/) + +## Installation + +```bash +make install +``` + +## Usage + +You can customize the .env.local file to alter the design of the glyphs. + +### Generate all Cistercian numbers from 1 to 9999 + +```bash +make generate +``` + +### Playground + +```bash +make merge +``` + +Alternatively if you have [imv](https://github.com/eXeC64/imv) installed you can run the following command to generate the numbers then view them in a gallery; + +```bash +make merge-view +``` + +### Local CI + +```bash +make cc +``` + 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 +=8.2", + "ext-ctype": "*", + "ext-iconv": "*", + "symfony/console": "7.1.*", + "symfony/dotenv": "7.1.*", + "symfony/flex": "^2", + "symfony/framework-bundle": "7.1.*", + "symfony/runtime": "7.1.*", + "symfony/yaml": "7.1.*", + "ext-gd": "*" + }, + "require-dev": { + "phpstan/phpstan": "^1.12", + "slevomat/coding-standard": "^8.15", + "symplify/easy-coding-standard": "^12.3" + }, + "config": { + "allow-plugins": { + "php-http/discovery": true, + "symfony/flex": true, + "symfony/runtime": true, + "dealerdirect/phpcodesniffer-composer-installer": 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": "*" + }, + "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": "7.1.*" + } + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..62868b9 --- /dev/null +++ b/composer.lock @@ -0,0 +1,2821 @@ +{ + "_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": "953749d79cce703a336af64de164f9b5", + "packages": [ + { + "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/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": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "567ef6de47fdcba56eb6c0b344b857d1fce1cce0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/567ef6de47fdcba56eb6c0b344b857d1fce1cce0", + "reference": "567ef6de47fdcba56eb6c0b344b857d1fce1cce0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:39:55+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/config", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "5c6152766251ff45a44b76affadd5287e253fb27" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/5c6152766251ff45a44b76affadd5287e253fb27", + "reference": "5c6152766251ff45a44b76affadd5287e253fb27", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/console", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bb5192af6edc797cbab5c8e8ecfea2fe5f421e57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bb5192af6edc797cbab5c8e8ecfea2fe5f421e57", + "reference": "bb5192af6edc797cbab5c8e8ecfea2fe5f421e57", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^6.4|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/event-dispatcher": "<6.4", + "symfony/lock": "<6.4", + "symfony/process": "<6.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-09T08:46:59+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", + "reference": "1f12f9d580ef8dd09e3b756aa111cc2d5f311bfd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/56a10f3032a6c2f085b13bc429e9d78a2c895dc4", + "reference": "56a10f3032a6c2f085b13bc429e9d78a2c895dc4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "conflict": { + "symfony/console": "<6.4", + "symfony/process": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0", + "symfony/process": "^6.4|^7.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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-28T11:14:12+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "d60117093c2a9fe667baa8fedf84e8a09b9c592f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/d60117093c2a9fe667baa8fedf84e8a09b9c592f", + "reference": "d60117093c2a9fe667baa8fedf84e8a09b9c592f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "87254c78dd50721cfd015b62277a8281c5589702" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87254c78dd50721cfd015b62277a8281c5589702", + "reference": "87254c78dd50721cfd015b62277a8281c5589702", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.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": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "reference": "c835867b3c62bb05c7fe3d637c871c7ae52024d4", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/2cb89664897be33f78c65d3d2845954c8d7a43b8", + "reference": "2cb89664897be33f78c65d3d2845954c8d7a43b8", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-01T08:31:23+00:00" + }, + { + "name": "symfony/flex", + "version": "v2.4.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/flex.git", + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/flex/zipball/92f4fba342161ff36072bd3b8e0b3c6c23160402", + "reference": "92f4fba342161ff36072bd3b8e0b3c6c23160402", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^2.1", + "php": ">=8.0" + }, + "conflict": { + "composer/semver": "<1.7.2" + }, + "require-dev": { + "composer/composer": "^2.1", + "symfony/dotenv": "^5.4|^6.0", + "symfony/filesystem": "^5.4|^6.0", + "symfony/phpunit-bridge": "^5.4|^6.0", + "symfony/process": "^5.4|^6.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.4.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-07T08:51:54+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/1d616d762905091e798d64c53ffe3840ccfc3d89", + "reference": "1d616d762905091e798d64c53ffe3840ccfc3d89", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^7.1.5", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/filesystem": "^7.1", + "symfony/finder": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^6.4|^7.0" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<6.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/runtime": "<6.4.13|>=7.0,<7.1.6", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/semaphore": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:11:02+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "3d7bbf071b25f802f7d55524d408bed414ea71e2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/3d7bbf071b25f802f7d55524d408bed414ea71e2", + "reference": "3d7bbf071b25f802f7d55524d408bed414ea71e2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-11T19:23:14+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "5d8315899cd76b2e7e29179bf5fea103e41bdf03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/5d8315899cd76b2e7e29179bf5fea103e41bdf03", + "reference": "5d8315899cd76b2e7e29179bf5fea103e41bdf03", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-27T13:54:21+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/66a2c469f6c22d08603235c46a20007c0701ea0a", + "reference": "66a2c469f6c22d08603235c46a20007c0701ea0a", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-01T08:31:23+00:00" + }, + { + "name": "symfony/runtime", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/runtime.git", + "reference": "5f556dcd917234d11d56763d4c81bbe8f527bcad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/runtime/zipball/5f556dcd917234d11d56763d4c81bbe8f527bcad", + "reference": "5f556dcd917234d11d56763d4c81bbe8f527bcad", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0|^2.0", + "php": ">=8.2" + }, + "conflict": { + "symfony/dotenv": "<6.4" + }, + "require-dev": { + "composer/composer": "^2.6", + "symfony/console": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "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": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/string", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/61b72d66bf96c360a727ae6232df5ac83c71f626", + "reference": "61b72d66bf96c360a727ae6232df5ac83c71f626", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "reference": "cb5bd55a6b8c2c1c7fb68b0aeae0e257948a720c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "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/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "90173ef89c40e7c8c616653241048705f84130ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/90173ef89c40e7c8c616653241048705f84130ef", + "reference": "90173ef89c40e7c8c616653241048705f84130ef", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.1.6", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "reference": "3ced3f29e4f0d6bce2170ff26719f1fe9aacc671", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.1.6" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + } + ], + "packages-dev": [ + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.33.0", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "reference": "82a311fd3690fb2bf7b64d5c98f912b3dd746140", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.33.0" + }, + "time": "2024-10-13T11:25:22+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.12.7", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "reference": "dc2b9976bd8b0f84ec9b0e50cc35378551de7af0", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-10-18T11:12:07+00:00" + }, + { + "name": "slevomat/coding-standard", + "version": "8.15.0", + "source": { + "type": "git", + "url": "https://github.com/slevomat/coding-standard.git", + "reference": "7d1d957421618a3803b593ec31ace470177d7817" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/7d1d957421618a3803b593ec31ace470177d7817", + "reference": "7d1d957421618a3803b593ec31ace470177d7817", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0", + "php": "^7.2 || ^8.0", + "phpstan/phpdoc-parser": "^1.23.1", + "squizlabs/php_codesniffer": "^3.9.0" + }, + "require-dev": { + "phing/phing": "2.17.4", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpstan/phpstan": "1.10.60", + "phpstan/phpstan-deprecation-rules": "1.1.4", + "phpstan/phpstan-phpunit": "1.3.16", + "phpstan/phpstan-strict-rules": "1.5.2", + "phpunit/phpunit": "8.5.21|9.6.8|10.5.11" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "SlevomatCodingStandard\\": "SlevomatCodingStandard/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Slevomat Coding Standard for PHP_CodeSniffer complements Consistence Coding Standard by providing sniffs with additional checks.", + "keywords": [ + "dev", + "phpcs" + ], + "support": { + "issues": "https://github.com/slevomat/coding-standard/issues", + "source": "https://github.com/slevomat/coding-standard/tree/8.15.0" + }, + "funding": [ + { + "url": "https://github.com/kukulich", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/slevomat/coding-standard", + "type": "tidelift" + } + ], + "time": "2024-03-09T15:20:58+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.10.3", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-09-18T10:38:58+00:00" + }, + { + "name": "symplify/easy-coding-standard", + "version": "12.3.6", + "source": { + "type": "git", + "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", + "reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/c0f378782d06dfd21c66c3024e9d28f4e737645e", + "reference": "c0f378782d06dfd21c66c3024e9d28f4e737645e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "conflict": { + "friendsofphp/php-cs-fixer": "<3.46", + "phpcsstandards/php_codesniffer": "<3.8", + "symplify/coding-standard": "<12.1" + }, + "suggest": { + "ext-dom": "Needed to support checkstyle output format in class CheckstyleOutputFormatter" + }, + "bin": [ + "bin/ecs" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Use Coding Standard with 0-knowledge of PHP-CS-Fixer and PHP_CodeSniffer", + "keywords": [ + "Code style", + "automation", + "fixer", + "static analysis" + ], + "support": { + "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.3.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-10-06T08:27:28+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.2", + "ext-ctype": "*", + "ext-iconv": "*", + "ext-gd": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/config/bundles.php b/config/bundles.php new file mode 100644 index 0000000..1722275 --- /dev/null +++ b/config/bundles.php @@ -0,0 +1,9 @@ + [ + 'all' => 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..877eb25 --- /dev/null +++ b/config/packages/framework.yaml @@ -0,0 +1,16 @@ +# see https://symfony.com/doc/current/reference/configuration/framework.html +framework: + secret: '%env(APP_SECRET)%' + #csrf_protection: true + + # 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/routing.yaml b/config/packages/routing.yaml new file mode 100644 index 0000000..8166181 --- /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: http://localhost + +when@prod: + framework: + router: + strict_requirements: null diff --git a/config/preload.php b/config/preload.php new file mode 100644 index 0000000..db37723 --- /dev/null +++ b/config/preload.php @@ -0,0 +1,5 @@ +withPaths([__DIR__ . '/config', __DIR__ . '/public', __DIR__ . '/bin', __DIR__ . '/src']) + ->withSets( + [ + SetList::PSR_12, + SetList::CLEAN_CODE, + SetList::ARRAY, + SetList::DOCTRINE_ANNOTATIONS, + SetList::PHPUNIT, + ] + ) + ->withRules( + [ + AlphabeticallySortedUsesSniff::class, + AlignMultilineCommentFixer::class, + BlankLineBeforeStatementFixer::class, + CastSpacesFixer::class, + FunctionCallArgumentSpacingSniff::class, + MethodChainingIndentationFixer::class, + NoBlankLinesAfterClassOpeningFixer::class, + NoExtraBlankLinesFixer::class, + NoMultilineWhitespaceAroundDoubleArrowFixer::class, + NoUnusedImportsFixer::class, + ObjectOperatorIndentSniff::class, + PhpdocIndentFixer::class, + ReturnAssignmentFixer::class, + BlankLinesBeforeNamespaceFixer::class, + SingleLineAfterImportsFixer::class, + SingleQuoteFixer::class, + SingleTraitInsertPerStatementFixer::class, + TrailingCommaInMultilineFixer::class, + UseArrowFunctionsFixer::class, + UselessInheritDocCommentSniff::class, + UselessOverridingMethodSniff::class, + UselessSemicolonSniff::class, + VisibilityRequiredFixer::class, + VoidReturnFixer::class, + YodaStyleFixer::class, + ModernizeTypesCastingFixer::class, + OrderedClassElementsFixer::class, + FinalClassFixer::class, + ModernClassNameReferenceSniff::class, + AttributeAndTargetSpacingSniff::class, + ClassMemberSpacingSniff::class, + EnumCaseSpacingSniff::class, + RequireConstructorPropertyPromotionSniff::class, + RequireSelfReferenceSniff::class, + DocCommentSpacingSniff::class, + AssignmentInConditionSniff::class, + BlockControlStructureSpacingSniff::class, + EarlyExitSniff::class, + RequireTrailingCommaInDeclarationSniff::class, + UseFromSameNamespaceSniff::class, + UselessAliasSniff::class, + ShortListSniff::class, + UselessParenthesesSniff::class, + DisallowArrayTypeHintSyntaxSniff::class, + NullableTypeForNullDefaultValueSniff::class, + UnusedVariableSniff::class, + OrderedAttributesFixer::class, + RequireMultiLineCallSniff::class, + ] + ) + ->withConfiguredRule(UnusedUsesSniff::class, [ + 'searchAnnotations' => true, + ]) + ->withConfiguredRule(ReferenceUsedNamesOnlySniff::class, [ + 'searchAnnotations' => true, + ]) + ->withConfiguredRule(MethodSpacingSniff::class, [ + 'minLinesCount' => 1, + 'maxLinesCount' => 1, + ]) + ->withConfiguredRule( + EnumCaseSpacingSniff::class, + [ + 'minLinesCountBeforeWithComment' => 0, + 'maxLinesCountBeforeWithComment' => 0, + 'minLinesCountBeforeWithoutComment' => 0, + 'maxLinesCountBeforeWithoutComment' => 0, + ] + ) + ->withConfiguredRule( + EmptyLinesAroundClassBracesSniff::class, + [ + 'linesCountAfterOpeningBrace' => 0, + 'linesCountBeforeClosingBrace' => 0, + ] + ) + ->withConfiguredRule( + ConstantSpacingSniff::class, + [ + 'minLinesCountBeforeWithComment' => 0, + 'maxLinesCountBeforeWithComment' => 0, + 'minLinesCountBeforeWithoutComment' => 0, + 'maxLinesCountBeforeWithoutComment' => 0, + ] + ) + ->withConfiguredRule(ArraySyntaxFixer::class, [ + 'syntax' => 'short', + ]) + ->withConfiguredRule( + ClassAttributesSeparationFixer::class, + [ + 'elements' => [ + 'const' => 'none', + 'property' => 'one', + ], + ] + ) + ->withConfiguredRule( + GlobalNamespaceImportFixer::class, + [ + 'import_classes' => true, + 'import_constants' => true, + 'import_functions' => true, + ] + ) + ->withConfiguredRule( + LineLengthFixer::class, + [ + LineLengthFixer::BREAK_LONG_LINES => true, + LineLengthFixer::INLINE_SHORT_LINES => false, + LineLengthFixer::LINE_LENGTH => 120, + ] + ) + ->withRootFiles() + ->withSpacing(indentation: Option::INDENTATION_SPACES, lineEnding: PHP_EOL) + ->withParallel(); diff --git a/phpstan.dist.neon b/phpstan.dist.neon new file mode 100644 index 0000000..200d200 --- /dev/null +++ b/phpstan.dist.neon @@ -0,0 +1,4 @@ +parameters: + level: max + paths: + - src/ diff --git a/public/index.php b/public/index.php new file mode 100644 index 0000000..a5e5c79 --- /dev/null +++ b/public/index.php @@ -0,0 +1,7 @@ + new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']); diff --git a/src/Command/GenerateCommand.php b/src/Command/GenerateCommand.php new file mode 100644 index 0000000..94b2835 --- /dev/null +++ b/src/Command/GenerateCommand.php @@ -0,0 +1,35 @@ +cistercianNumberGeneratorService->generateCistercianNumber($number); + } + + return Command::SUCCESS; + } +} diff --git a/src/Command/MergeCommand.php b/src/Command/MergeCommand.php new file mode 100644 index 0000000..d5e4c21 --- /dev/null +++ b/src/Command/MergeCommand.php @@ -0,0 +1,689 @@ +widthOfOneImage = $this->segmentLength * 2; + $this->heightOfOneImage = $this->segmentLength * 4; + $this->outputDirectory = $projectDirectory . '/output/merge/' . (new DateTime())->getTimestamp(); + } + + /** + * @param array> $numbers + */ + public function getBaseTallImage(array $numbers): GdImage + { + $outputWidth = $this->widthOfOneImage * 6 + $this->mergePadding; + $outputHeight = count($numbers) * $this->heightOfOneImage + $this->mergePadding; + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + + if (false === $outputImage) { + throw new RuntimeException('Failed to create image'); + } + + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + return $outputImage; + } + + /** + * @param array> $numbers + * @return array{0: int, 1: GdImage} + */ + public function getBaseWideImage(array $numbers): array + { + $heightOfOneImage = $this->segmentLength * 4; + $widthOfOneImage = $this->segmentLength * 2; + + $outputWidth = ($widthOfOneImage * count($numbers)) - (count( + $numbers + ) * $this->lineThickness) + $this->mergePadding; + $outputHeight = $heightOfOneImage + $this->mergePadding; + + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + return [$widthOfOneImage, $outputImage]; + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + FileUtil::ensureDirectoryExists($this->outputDirectory); + + $numbers = [ + [5038, 4245], + [5816, 5725], + [5626, 7119], + [3220, 5123], + [7457, 2254], + [7542, 7258], + [8149, 6445], + [112, 6754, 6050], + [6118, 1719], + [5032, 5213], + [8030, 59], + ]; + + $this->generateOneLineDifference($numbers); + $this->generateOneLineSideToSideUnmerged($numbers); + $this->generateOneLineSideToSideMerged($numbers); + $this->generateMultipleLinesMerged($numbers); + $this->generateMulipleLinesUnmerged($numbers); + $this->generateMultipleLinesUnmergedWithShiftFullSpace($numbers); + $this->generateMultipleLinesUnmergedWithShiftHalfSpace($numbers); + $this->generateMultipleLinesMergedWithShiftFullSpace($numbers); + $this->generateMultipleLinesMergedWithShiftHalfSpace($numbers); + + $this->generateTruncatedOutput(); + + return Command::SUCCESS; + } + + /** + * @param array> $numbers + */ + private function generateMultipleLinesMergedWithShiftFullSpace(array $numbers): void + { + $outputImage = $this->getBaseTallImage($numbers); + + $i = 1; + $x = 0; + $y = 0; + $linesWithShift = [3, 4, 6, 8, 9, 11]; + $image = null; + + foreach ($numbers as $line) { + $j = 1; + + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + $x += (int) floor($this->mergePadding / 2); + $x -= $this->lineThickness; + + if (1 === $j && in_array($i, $linesWithShift, true)) { + $x += $this->widthOfOneImage; + } + + imagecopy( + $outputImage, + $image, + $x, + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $x += $this->lineThickness - (int) floor($this->mergePadding / 2); + $j++; + } + + if (null === $image) { + continue; + } + + $x = 0; + $y += imagesy($image) - $this->lineThickness; + $i++; + } + + imagepng($outputImage, $this->outputDirectory . '/7-output-multiple-lines-shifted-merged-full-space.png'); + } + + /** + * @param array> $numbers + */ + private function generateMultipleLinesMergedWithShiftHalfSpace(array $numbers): void + { + $outputImage = $this->getBaseTallImage($numbers); + + $i = 1; + $y = 0; + $linesWithShift = [3, 4, 6, 8, 9, 11]; + $image = null; + + foreach ($numbers as $line) { + $j = 1; + + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + $x = (int) floor($this->mergePadding / 2); + + if (1 === $j && in_array($i, $linesWithShift, true)) { + $x += (int) floor($this->widthOfOneImage / 2); + } + + imagecopy( + $outputImage, + $image, + $x, + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $j++; + } + + if (null === $image) { + continue; + } + + $x = 0; + $y += imagesy($image) - $this->lineThickness; + $i++; + } + + imagepng($outputImage, $this->outputDirectory . '/8-output-multiple-lines-shifted-merged-half-space.png'); + } + + /** + * @param array> $numbers + */ + private function generateMultipleLinesUnmergedWithShiftHalfSpace(array $numbers): void + { + $outputImage = $this->getBaseTallImage($numbers); + + $i = 1; + $x = 0; + $y = 0; + $linesWithShift = [3, 4, 6, 8, 9, 11]; + $image = null; + + foreach ($numbers as $line) { + $j = 1; + + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + $x += (int) floor($this->mergePadding / 2); + + if (1 === $j && in_array($i, $linesWithShift, true)) { + $x += (int) $this->widthOfOneImage / 2 - (int) ($this->lineThickness / 2); + } + + imagecopy( + $outputImage, + $image, + (int) $x, + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $x += imagesx($image) - $this->lineThickness - (int) floor($this->mergePadding / 2); + $j++; + } + + if (null === $image) { + continue; + } + + $x = 0; + $y += imagesy($image) - $this->lineThickness; + $i++; + } + + imagepng($outputImage, $this->outputDirectory . '/6-output-multiple-lines-shifted-unmerged-half-space.png'); + } + + /** + * @param array> $numbers + */ + private function generateMultipleLinesUnmergedWithShiftFullSpace(array $numbers): void + { + $heightOfOneImage = $this->segmentLength * 4; + $widthOfOneImage = $this->segmentLength * 2; + + $outputWidth = $widthOfOneImage * 6 + $this->mergePadding; + $outputHeight = count($numbers) * $heightOfOneImage + $this->mergePadding; + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + $i = 1; + $x = 0; + $y = 0; + $linesWithShift = [3, 4, 6, 8, 9, 11]; + $image = null; + + foreach ($numbers as $line) { + $j = 1; + + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + $x += (int) floor($this->mergePadding / 2); + + if (1 === $j && in_array($i, $linesWithShift, true)) { + $x += $widthOfOneImage - $this->lineThickness; + } + + imagecopy( + $outputImage, + $image, + $x, + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $x += imagesx($image) - $this->lineThickness - (int) floor($this->mergePadding / 2); + $j++; + } + + if (null === $image) { + continue; + } + + $x = 0; + $y += imagesy($image) - $this->lineThickness; + $i++; + } + + imagepng($outputImage, $this->outputDirectory . '/5-output-multiple-lines-shifted-unmerged-full-space.png'); + } + + /** + * @param array> $numbers + */ + private function generateMulipleLinesUnmerged(array $numbers): void + { + $heightOfOneImage = $this->segmentLength * 4; + $widthOfOneImage = $this->segmentLength * 2; + + $outputWidth = $widthOfOneImage * 3 + $this->mergePadding; + $outputHeight = count($numbers) * $heightOfOneImage + $this->mergePadding; + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + $x = 0; + $y = 0; + $image = null; + + foreach ($numbers as $line) { + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imagecopy( + $outputImage, + $image, + $x + (int) floor($this->mergePadding / 2), + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $x += imagesx($image) - $this->lineThickness; + } + + if (null === $image) { + continue; + } + + $x = 0; + $y += imagesy($image) - $this->lineThickness; + } + + imagepng($outputImage, $this->outputDirectory . '/4-output-multiple-lines-unmerged.png'); + } + + /** + * @param array> $numbers + */ + private function generateMultipleLinesMerged(array $numbers): void + { + $heightOfOneImage = $this->segmentLength * 4; + $widthOfOneImage = $this->segmentLength * 2; + + $outputWidth = $widthOfOneImage + $this->mergePadding; + $outputHeight = count($numbers) * $heightOfOneImage + $this->mergePadding; + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + $x = 0; + $y = 0; + $image = null; + + foreach ($numbers as $line) { + foreach ($line as $number) { + $image = imagecreatefrompng( + $this->cistercianNumberGeneratorService->generateCistercianNumber($number) + ); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imagecopy( + $outputImage, + $image, + $x + (int) floor($this->mergePadding / 2), + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + } + + if (null === $image) { + continue; + } + + $y += imagesy($image) - $this->lineThickness; + } + + imagepng($outputImage, $this->outputDirectory . '/3-output-multiple-lines-merged.png'); + } + + /** + * @param array> $numbers + */ + private function generateOneLineSideToSideUnmerged(array $numbers): void + { + $numbers = array_merge(...$numbers); + + $outputWidth = ($this->widthOfOneImage * count($numbers)) - (count( + $numbers + ) * $this->lineThickness) + $this->mergePadding; + $outputHeight = $this->heightOfOneImage + $this->mergePadding; + + $outputImage = imagecreatetruecolor($outputWidth, $outputHeight); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + $x = 0; + $y = 0; + + foreach ($numbers as $number) { + $image = imagecreatefrompng($this->cistercianNumberGeneratorService->generateCistercianNumber($number)); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imagecopy( + $outputImage, + $image, + $x + (int) floor($this->mergePadding / 2), + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + $x += imagesx($image) - $this->lineThickness; + } + + imagepng($outputImage, $this->outputDirectory . '/1-output-side-to-side-unmerged.png'); + } + + /** + * @param array> $numbers + */ + private function generateOneLineSideToSideMerged(array $numbers): void + { + [$widthOfOneImage, $outputImage] = $this->getBaseWideImage($numbers); + + $x = 0; + $y = 0; + + foreach ($numbers as $line) { + foreach ($line as $number) { + $image = imagecreatefrompng($this->cistercianNumberGeneratorService->generateCistercianNumber($number)); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imagecopy( + $outputImage, + $image, + $x + (int) floor($this->mergePadding / 2), + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + } + + $x += $widthOfOneImage - $this->lineThickness; + } + + imagepng($outputImage, $this->outputDirectory . '/2-output-side-to-side-merged.png'); + } + + /** + * @param array> $numbers + */ + private function generateOneLineDifference(array $numbers): void + { + [$widthOfOneImage, $outputImage] = $this->getBaseWideImage($numbers); + + $x = 0; + $y = 0; + + foreach ($numbers as $line) { + $image = imagecreatefrompng($this->cistercianNumberGeneratorService->generateDifferenceNumbers($line)); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imagecopy( + $outputImage, + $image, + $x + (int) floor($this->mergePadding / 2), + $y + (int) floor($this->mergePadding / 2), + 0, + 0, + imagesx($image), + imagesy($image) + ); + + $x += $widthOfOneImage - $this->lineThickness; + } + + imagepng($outputImage, $this->outputDirectory . '/0-output-difference.png'); + } + + private function generateTruncatedOutput(): void + { + $files = glob($this->outputDirectory . '/*.png'); + + if (false === $files) { + throw new RuntimeException('Failed to get files'); + } + + // Only truncate the first 3 files + $files = array_slice($files, 0, 3); + + // Truncate the middle part files + // Keep segmentLength+lineThickness+mergePadding for the top and bottom, delete the rest + // make the top and bottom part touch each other + foreach ($files as $file) { + $top = imagecreatefrompng($file); + $bottom = imagecreatefrompng($file); + + if (false === $top || false === $bottom) { + throw new RuntimeException('Failed to create image'); + } + + $width = imagesx($top); + $height = imagesy($top) - $this->segmentLength * 2; + $cutHeightStart = (int) ($this->mergePadding / 2); + + $outputImage = imagecreatetruecolor($width, $height); + $white = imagecolorallocate($outputImage, 255, 255, 255); + + if (false === $white) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($outputImage, 0, 0, $white); + + $topCrop = imagecrop( + $top, + [ + 'x' => 0, + 'y' => $cutHeightStart, + 'width' => $width, + 'height' => $this->segmentLength + $this->lineThickness, + ] + ); + + if (false === $topCrop) { + throw new RuntimeException('Failed to crop image'); + } + + $bottomCrop = imagecrop( + $bottom, + [ + 'x' => 0, + 'y' => $cutHeightStart + ($this->segmentLength * 3) + $this->lineThickness, + 'width' => $width, + 'height' => $this->segmentLength + $this->lineThickness, + ] + ); + + if (false === $bottomCrop) { + throw new RuntimeException('Failed to crop image'); + } + + imagecopy( + $outputImage, + $topCrop, + 0, + (int) ($this->mergePadding / 2), + 0, + 0, + imagesx($topCrop), + imagesy($topCrop) + ); + imagecopy( + $outputImage, + $bottomCrop, + 0, + (int) ($this->mergePadding / 2) + $this->segmentLength + $this->lineThickness, + 0, + 0, + imagesx($bottomCrop), + imagesy($bottomCrop) + ); + + imagepng($outputImage, str_replace('.png', '-truncated.png', $file)); + } + } +} diff --git a/src/Controller/.gitignore b/src/Controller/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/src/Kernel.php b/src/Kernel.php new file mode 100644 index 0000000..35ffaa5 --- /dev/null +++ b/src/Kernel.php @@ -0,0 +1,11 @@ + [], + 1 => [self::SEGMENT_TOP], + 2 => [self::SEGMENT_BOTTOM], + 3 => [self::SEGMENT_DIAG_ONE], + 4 => [self::SEGMENT_DIAG_TWO], + 5 => [self::SEGMENT_TOP, self::SEGMENT_DIAG_TWO], + 6 => [self::SEGMENT_RIGHT], + 7 => [self::SEGMENT_TOP, self::SEGMENT_RIGHT], + 8 => [self::SEGMENT_BOTTOM, self::SEGMENT_RIGHT], + 9 => [self::SEGMENT_BOTTOM, self::SEGMENT_RIGHT, self::SEGMENT_TOP], + ]; + + private string $outputDirectory; + + private int $width; + + private int $height; + + private int $offset; + + public function __construct( + #[Autowire('%env(CISTERCIAN_NUMBER_GENERATOR_SEGMENT_LENGTH)%')] + private int $segmentLength, + #[Autowire('%env(CISTERCIAN_NUMBER_GENERATOR_LINE_THICKNESS)%')] + private int $lineThickness, + #[Autowire('%kernel.project_dir%')] + string $projectDirectory, + ) { + $this->outputDirectory = $projectDirectory . '/output/CistercianNumbers'; + $this->width = $this->segmentLength * 2; + $this->height = $this->segmentLength * 4; + $this->offset = (int) floor($this->lineThickness / 2); + } + + /** + * Generates a Cistercian number image for the given Arabic number. + * + * @param int $number The Arabic number to generate a Cistercian number for. + * @return string The path to the generated image. + */ + public function generateCistercianNumber(int $number): string + { + FileUtil::ensureDirectoryExists($this->outputDirectory); + + $outputFilename = sprintf('%s/%d.png', $this->outputDirectory, $number); + + if (file_exists($outputFilename)) { + return $outputFilename; + } + + $outputImage = $this->createTransparentImage($this->width, $this->height); + $black = $this->allocateBlackColor($outputImage); + $this->traceLine($outputImage, $this->width / 2, 0, $this->width / 2, $this->height, $black); + + $digits = $this->extractDigits($number); + $quadrants = [ + Quadrant::createForTopRight($this->segmentLength, $this->offset), + Quadrant::createForTopLeft($this->segmentLength, $this->offset), + Quadrant::createForBottomRight($this->segmentLength, $this->offset), + Quadrant::createForBottomLeft($this->segmentLength, $this->offset), + ]; + + foreach ($digits as $index => $digit) { + $this->traceDigit($outputImage, $digit, $black, $quadrants[$index]); + } + + imagepng($outputImage, $outputFilename); + imagedestroy($outputImage); + + return $outputFilename; + } + + /** + * Generates an image that highlights the differences between the given Cistercian numbers. + * If a segment is present in one number but not in the other, it will be shown in the output image. + * If a segment is present in more than one number, it will not be shown in the output image. + * + * @param array $numbers + * @return string The path to the generated image. + */ + public function generateDifferenceNumbers(array $numbers): string + { + FileUtil::ensureDirectoryExists($this->outputDirectory); + + $segmentsToTrace = array_fill_keys(['first', 'second', 'third', 'fourth'], []); + $alreadyTracedSegments = array_fill_keys(['first', 'second', 'third', 'fourth'], []); + + foreach ($numbers as $number) { + $digits = [ + 'first' => $number % 10, + 'second' => ($number / 10) % 10, + 'third' => ($number / 100) % 10, + 'fourth' => ($number / 1000) % 10, + ]; + + foreach ($digits as $key => $digit) { + foreach (self::SEGMENTS[$digit] as $segment) { + if (in_array($segment, $alreadyTracedSegments[$key], true)) { + unset($segmentsToTrace[$key][array_search($segment, $segmentsToTrace[$key], true)]); + } else { + $segmentsToTrace[$key][] = $segment; + $alreadyTracedSegments[$key][] = $segment; + } + } + } + } + + $outputFilename = sprintf('%s/difference-%s.png', $this->outputDirectory, implode('-', $numbers)); + + if (file_exists($outputFilename)) { + return $outputFilename; + } + + $outputImage = $this->createTransparentImage($this->width, $this->height); + $black = $this->allocateBlackColor($outputImage); + $quadrants = [ + 'first' => Quadrant::createForTopRight($this->segmentLength, $this->offset), + 'second' => Quadrant::createForTopLeft($this->segmentLength, $this->offset), + 'third' => Quadrant::createForBottomRight($this->segmentLength, $this->offset), + 'fourth' => Quadrant::createForBottomLeft($this->segmentLength, $this->offset), + ]; + + foreach ($segmentsToTrace as $key => $segments) { + $quadrant = $quadrants[$key]; + + foreach ($segments as $segment) { + $this->traceSegment($outputImage, $segment, $black, $quadrant); + } + } + + imagepng($outputImage, $outputFilename); + imagedestroy($outputImage); + + return $outputFilename; + } + + /** + * Creates a transparent image with the given dimensions. + */ + private function createTransparentImage(int $width, int $height): GdImage + { + $image = imagecreatetruecolor($width, $height); + + if (false === $image) { + throw new RuntimeException('Failed to create image'); + } + + imageAlphaBlending($image, false); + $transparency = imagecolorallocatealpha($image, 0, 0, 0, 127); + + if (false === $transparency) { + throw new RuntimeException('Failed to allocate color'); + } + + imagefill($image, 0, 0, $transparency); + imagesavealpha($image, true); + + return $image; + } + + /** + * Allocates a black color in the given image. + */ + private function allocateBlackColor(GdImage $image): int + { + $color = imagecolorallocate($image, 0, 0, 0); + + if (false === $color) { + throw new RuntimeException('Failed to allocate color'); + } + + return $color; + } + + /** + * Extracts the digits of the given number. + * + * @return array The digits of the given number. First element is the least significant digit and so on. + */ + private function extractDigits(int $number): array + { + return [ + $number % 10, + ($number / 10) % 10, + ($number / 100) % 10, + ($number / 1000) % 10, + ]; + } + + /** + * Traces the given segment in the given quadrant with the given color. + */ + private function traceSegment(GdImage $image, string $segment, int $color, Quadrant $quadrant): void + { + match ($segment) { + self::SEGMENT_TOP => $this->traceLine( + $image, + $quadrant->x1, + $quadrant->y1 + $quadrant->yOffset, + $quadrant->x2, + $quadrant->y1 + $quadrant->yOffset, + $color + ), + self::SEGMENT_BOTTOM => $this->traceLine( + $image, + $quadrant->x1, + $quadrant->y2 + $quadrant->yOffset, + $quadrant->x2, + $quadrant->y2 + $quadrant->yOffset, + $color + ), + self::SEGMENT_DIAG_ONE => $this->traceLine( + $image, + $quadrant->x1, + $quadrant->y1, + $quadrant->x2, + $quadrant->y2, + $color + ), + self::SEGMENT_DIAG_TWO => $this->traceLine( + $image, + $quadrant->x1, + $quadrant->y2 + $quadrant->yOffset, + $quadrant->x2 + $quadrant->xOffset, + $quadrant->y1, + $color + ), + self::SEGMENT_RIGHT => $this->traceLine( + $image, + $quadrant->x2 - $quadrant->xOffset, + $quadrant->y1, + $quadrant->x2 - $quadrant->xOffset, + $quadrant->y2, + $color + ), + default => null, + }; + } + + /** + * Traces the given digit in the given quadrant with the given color. + */ + private function traceDigit(GdImage $image, int $digit, int $color, Quadrant $quadrant): void + { + foreach (self::SEGMENTS[$digit] as $segment) { + $this->traceSegment($image, $segment, $color, $quadrant); + } + } + + /** + * Traces a line in the given image with the given color. + */ + private function traceLine(GdImage $image, int $x1, int $y1, int $x2, int $y2, int $color): void + { + imagesetthickness($image, $this->lineThickness); + imageline($image, $x1, $y1, $x2, $y2, $color); + } +} diff --git a/src/Utils/FileUtil.php b/src/Utils/FileUtil.php new file mode 100644 index 0000000..fc934a0 --- /dev/null +++ b/src/Utils/FileUtil.php @@ -0,0 +1,17 @@ +