From df72c936e574315a5107dcc2378a7cd637e4d9a6 Mon Sep 17 00:00:00 2001 From: Christoph Schweppe Date: Tue, 7 Dec 2021 12:22:32 +0100 Subject: [PATCH] First working version --- .github/assets/manage.png | Bin 0 -> 18944 bytes .github/assets/warning.png | Bin 0 -> 7325 bytes README.md | 62 +- composer.json | 7 +- composer.lock | 7060 ++++++++++++++++- dist/voyager-2fa.umd.js | 2 +- ...12_07_000000_add_secret_to_users_table.php | 32 + resources/lang/en/2fa.php | 19 + src/Commands/InstallCommand.php | 55 + src/Components/Login.vue | 44 +- src/Components/Manager.vue | 73 + src/Provider/Routes.php | 48 + src/Provider/Settings.php | 44 + src/TwoFA.php | 106 +- src/TwoFAServiceProvider.php | 12 +- src/main.js | 7 +- vite.config.js | 3 +- 17 files changed, 7554 insertions(+), 20 deletions(-) create mode 100644 .github/assets/manage.png create mode 100644 .github/assets/warning.png create mode 100644 migrations/2021_12_07_000000_add_secret_to_users_table.php create mode 100644 resources/lang/en/2fa.php create mode 100644 src/Commands/InstallCommand.php create mode 100644 src/Components/Manager.vue create mode 100644 src/Provider/Routes.php create mode 100644 src/Provider/Settings.php diff --git a/.github/assets/manage.png b/.github/assets/manage.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5b47095cfd03b17f2404e79f5b9271713527b5 GIT binary patch literal 18944 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 RCFDCk$cq-ib1J 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 84f0516..a2238de 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,60 @@ -# voyager-2fa - Two-factor-authentication for Voyager II +# Two-factor-authentication for Voyager II + +This plugin for Voyager II uses [pragmarx/google2fa-laravel](https://github.com/antonioribeiro/google2fa-laravel) for two-factor-authentication. + +## Installation + +First, run `composer require emptynick/voyager-2fa`. +After that run `php artisan 2fa:install`. + +This will: + +1. Publish `pragmarx/google2fa-laravel` config file +2. Publish a migration to add a field named `google2fa_secret` to your `users` table +3. Migrate + +You can skip publishing the config file and migrating. +This is helpful when you want to modify the migration file. + +## Usage + +By default, this plugin does not force you to use 2FA. +Whenever a 2FA code is assigned to a user, it will ask for it when logging-in. + +### Activating 2FA for your account + +Open the top-right user dropdown and click `Manage 2FA`. +There you will see a QR code and an input box. +Scan the QR code with your phone or enter the code manually and enter the generated OTP into the input. +Click `Enable` and the code will be stored. +Now, whenever you log-in, you'll be asked for a one-time-password. + +![Warning](./.github/assets/manage.png) + +### Disable 2FA + +Clicking the `Disable` button will remove the OTP code from the database. +You are **not** required to enter an OTP when logging-in. +**This requires the setting `2FA.allow_disabling` to be `on`!** + +### Renew 2FA code + +When 2FA is active, you can simply renew the code. Proceed like described in `Activating 2FA for your account` and click on `Renew` instead of `Enable`! + +## Settings + +This plugin publishes some settings. + +### 2FA.force_2fa + +When active, this setting will prevent the user to open **any** page before setting-up 2FA. Defaults to false. + +### 2FA.show_warning + +Shows a warning whenever a page is opened and 2FA is **not** activated for the current user. Defaults to true. + +![Warning](./.github/assets/warning.png) + +### 2FA.allow_disabling + +Allow users to disable two-factor-auth. Defaults to true. \ No newline at end of file diff --git a/composer.json b/composer.json index d36e6d5..9057135 100644 --- a/composer.json +++ b/composer.json @@ -14,12 +14,17 @@ "Emptynick\\TwoFA\\": "src/" } }, - "minimum-stability": "stable", + "minimum-stability": "dev", "extra": { "laravel": { "providers": [ "Emptynick\\TwoFA\\TwoFAServiceProvider" ] } + }, + "require": { + "pragmarx/google2fa-laravel": "^2.0", + "bacon/bacon-qr-code": "^2.0", + "voyager-admin/voyager": "2.x-dev" } } diff --git a/composer.lock b/composer.lock index 3b95f40..ccdef24 100644 --- a/composer.lock +++ b/composer.lock @@ -4,12 +4,7064 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "0aae7f922ea16fa5849e7bffd52f5d45", - "packages": [], + "content-hash": "a7871dc77bd87674ce7362a1cf4bcda4", + "packages": [ + { + "name": "bacon/bacon-qr-code", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09", + "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^1.4", + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.4" + }, + "time": "2021-06-18T13:26:35+00:00" + }, + { + "name": "brick/math", + "version": "0.9.3", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2021-08-15T20:50:18+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "psr/log": "^1.0", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.3.1" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-10-28T20:44:15+00:00" + }, + { + "name": "composer/composer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "09ffabbf6ed1d201cf65dd587fb3a7b9c327bd83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/09ffabbf6ed1d201cf65dd587fb3a7b9c327bd83", + "reference": "09ffabbf6ed1d201cf65dd587fb3a7b9c327bd83", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "composer/metadata-minifier": "^1.0", + "composer/semver": "^3.0", + "composer/spdx-licenses": "^1.2", + "composer/xdebug-handler": "^2.0", + "justinrainbow/json-schema": "^5.2.11", + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1.0 || ^2.0", + "react/promise": "^1.2 || ^2.7", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", + "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" + }, + "require-dev": { + "phpspec/prophecy": "^1.10", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "default-branch": true, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "source": "https://github.com/composer/composer/tree/main" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-12-07T10:21:43+00:00" + }, + { + "name": "composer/metadata-minifier", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\MetadataMinifier\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", + "keywords": [ + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-04-07T13:37:33+00:00" + }, + { + "name": "composer/semver", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "83e511e247de329283478496f7a1e114c9517506" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/83e511e247de329283478496f7a1e114c9517506", + "reference": "83e511e247de329283478496f7a1e114c9517506", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.54", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.2.6" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-10-25T11:34:17+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "a30d487169d799745ca7280bc90fdfa693536901" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/a30d487169d799745ca7280bc90fdfa693536901", + "reference": "a30d487169d799745ca7280bc90fdfa693536901", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.6" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-11-18T10:14:14+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-07-31T17:03:58+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2", + "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^7 | ^8 | ^9", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.3" + }, + "time": "2020-10-02T16:03:48+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^3.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + }, + "time": "2021-08-13T13:06:58+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2021-07-17T14:49:29+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "cb080ac3db166b89d35267eb6642b56fd10953f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/cb080ac3db166b89d35267eb6642b56fd10953f4", + "reference": "cb080ac3db166b89d35267eb6642b56fd10953f4", + "shasum": "" + }, + "require": { + "composer-runtime-api": "^2", + "doctrine/cache": "^1.11|^2.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "php": "^7.3 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.2.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "9.5.10", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.1", + "symfony/cache": "^5.2|^6.0", + "symfony/console": "^2.7|^3.0|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.14.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.3.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2021-12-06T19:19:17+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "e70ba7c7b9843cdfef183d9df0c851ff2f494f7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/e70ba7c7b9843cdfef183d9df0c851ff2f494f7b", + "reference": "e70ba7c7b9843cdfef183d9df0c851ff2f494f7b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "phpstan/phpstan": "^0.12.58", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.2.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2021-10-16T15:37:06+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.7.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-webmozart-assert": "^0.12.7", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2020-11-24T19:55:57+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "emptynick/voyager-tiptap", + "version": "v2.9", + "source": { + "type": "git", + "url": "https://github.com/emptynick/voyager-tiptap.git", + "reference": "c99fc7fb671b83dc354d22f62d9637393be63066" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/emptynick/voyager-tiptap/zipball/c99fc7fb671b83dc354d22f62d9637393be63066", + "reference": "c99fc7fb671b83dc354d22f62d9637393be63066", + "shasum": "" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Emptynick\\Tiptap\\TiptapServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Emptynick\\Tiptap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christoph Schweppe", + "email": "info@cschweppe.de" + } + ], + "description": "Tiptap WYSIWYG editor for Voyager II", + "keywords": [ + "tiptap", + "voyager", + "voyager2-plugin", + "wysiwyg" + ], + "support": { + "issues": "https://github.com/emptynick/voyager-tiptap/issues", + "source": "https://github.com/emptynick/voyager-tiptap/tree/v2.9" + }, + "time": "2021-11-09T09:55:27+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-11-21T21:41:47+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "reference": "ee0a041b1760e6a53d2a39c8c34115adc2af2c79", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.8.3 || ^2.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2021-12-06T18:43:05+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:56:57+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "53b1962090d84f02980bdfd4cd5c5fe35b54e2a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/53b1962090d84f02980bdfd4cd5c5fe35b54e2a6", + "reference": "53b1962090d84f02980bdfd4cd5c5fe35b54e2a6", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/master" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-12-06T18:35:34+00:00" + }, + { + "name": "inertiajs/inertia-laravel", + "version": "v0.4.5", + "source": { + "type": "git", + "url": "https://github.com/inertiajs/inertia-laravel.git", + "reference": "406b15af162e78be5c7793b25aadd5a183eea84b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/inertiajs/inertia-laravel/zipball/406b15af162e78be5c7793b25aadd5a183eea84b", + "reference": "406b15af162e78be5c7793b25aadd5a183eea84b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laravel/framework": "^5.4|^6.0|^7.0|^8.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^4.0|^5.0|^6.0", + "phpunit/phpunit": "^8.0|^9.0", + "roave/security-advisories": "dev-master" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Inertia\\ServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Inertia\\": "src" + }, + "files": [ + "./helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "https://reinink.ca" + } + ], + "description": "The Laravel adapter for Inertia.js.", + "keywords": [ + "inertia", + "laravel" + ], + "support": { + "issues": "https://github.com/inertiajs/inertia-laravel/issues", + "source": "https://github.com/inertiajs/inertia-laravel/tree/v0.4.5" + }, + "funding": [ + { + "url": "https://github.com/reinink", + "type": "github" + } + ], + "time": "2021-10-27T09:37:59+00:00" + }, + { + "name": "intervention/image", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/9a8cc99d30415ec0b3f7649e1647d03a55698545", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/interventionphp", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2021-10-03T14:17:12+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "384f94595c621c7d0d362c5ca3a87815420d0b98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/384f94595c621c7d0d362c5ca3a87815420d0b98", + "reference": "384f94595c621c7d0d362c5ca3a87815420d0b98", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/justinrainbow/json-schema/issues", + "source": "https://github.com/justinrainbow/json-schema/tree/5.x.x" + }, + "time": "2021-10-10T18:28:13+00:00" + }, + { + "name": "laravel/framework", + "version": "v8.73.1", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "36dfae9d9ef7f88e8f9489c484a0a0609592bc21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/36dfae9d9ef7f88e8f9489c484a0a0609592bc21", + "reference": "36dfae9d9ef7f88e8f9489c484a0a0609592bc21", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^3.0.2", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", + "league/flysystem": "^1.1", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.53.1", + "opis/closure": "^3.6", + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/log": "^1.0 || ^2.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^4.2.2", + "swiftmailer/swiftmailer": "^6.3", + "symfony/console": "^5.1.4", + "symfony/error-handler": "^5.1.4", + "symfony/finder": "^5.1.4", + "symfony/http-foundation": "^5.1.4", + "symfony/http-kernel": "^5.1.4", + "symfony/mime": "^5.1.4", + "symfony/process": "^5.1.4", + "symfony/routing": "^5.1.4", + "symfony/var-dumper": "^5.1.4", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.2", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.4", + "filp/whoops": "^2.14.3", + "guzzlehttp/guzzle": "^6.5.5|^7.0.1", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.27", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.9", + "symfony/cache": "^5.1.4" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.4.4).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-20T19:20:02+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "8148e72e6c2c3af7f05640ada1b26c3bca970f8d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8148e72e6c2c3af7f05640ada1b26c3bca970f8d", + "reference": "8148e72e6c2c3af7f05640ada1b26c3bca970f8d", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2021-11-16T17:01:57+00:00" + }, + { + "name": "league/commonmark", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2df87709f44b0dd733df86aef0830dce9b1f0f13", + "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4", + "phpstan/phpstan": "^0.12.88", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", + "type": "custom" + }, + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2021-08-14T14:06:04+00:00" + }, + { + "name": "league/config", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2021-08-14T12:15:32+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.6", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "627be7fcde84c71aa0f15097fcf48fd5f2be5287" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/627be7fcde84c71aa0f15097fcf48fd5f2be5287", + "reference": "627be7fcde84c71aa0f15097fcf48fd5f2be5287", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.6" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2021-11-21T11:04:36+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-11-21T11:48:40+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-10-01T21:08:31+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.2" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^0.12", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.2" + }, + "time": "2021-10-15T11:40:02+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/9cd80396ca58d7969ab44fc7afcf03624dfa526e", + "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.2" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.5" + }, + "time": "2021-09-20T10:50:11+00:00" + }, + { + "name": "opis/closure", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.2" + }, + "time": "2021-04-09T13:42:10+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "shasum": "" + }, + "require": { + "php": "^7|^8" + }, + "require-dev": { + "phpunit/phpunit": "^6|^7|^8|^9", + "vimeo/psalm": "^1|^2|^3|^4" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2020-12-06T15:14:20+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-08-28T21:27:29+00:00" + }, + { + "name": "pragmarx/google2fa", + "version": "8.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa.git", + "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa/zipball/26c4c5cf30a2844ba121760fd7301f8ad240100b", + "reference": "26c4c5cf30a2844ba121760fd7301f8ad240100b", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1.0|^2.0", + "php": "^7.1|^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.18", + "phpunit/phpunit": "^7.5.15|^8.5|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "PragmaRX\\Google2FA\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa/issues", + "source": "https://github.com/antonioribeiro/google2fa/tree/8.0.0" + }, + "time": "2020-04-05T10:47:18+00:00" + }, + { + "name": "pragmarx/google2fa-laravel", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-laravel.git", + "reference": "ae2d11600df3db11a0c6bdd33ce8ce3c68cf5987" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-laravel/zipball/ae2d11600df3db11a0c6bdd33ce8ce3c68cf5987", + "reference": "ae2d11600df3db11a0c6bdd33ce8ce3c68cf5987", + "shasum": "" + }, + "require": { + "laravel/framework": ">=5.4.36|^8.0", + "php": ">=7.0", + "pragmarx/google2fa-qrcode": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "orchestra/testbench": "3.4.*|3.5.*|3.6.*|3.7.*|4.*|5.*|6.*", + "phpunit/phpunit": "~5|~6|~7|~8" + }, + "suggest": { + "bacon/bacon-qr-code": "Required to generate inline QR Codes.", + "pragmarx/recovery": "Generate recovery codes." + }, + "type": "library", + "extra": { + "component": "package", + "frameworks": [ + "Laravel" + ], + "branch-alias": { + "dev-master": "0.2-dev" + }, + "laravel": { + "providers": [ + "PragmaRX\\Google2FALaravel\\ServiceProvider" + ], + "aliases": { + "Google2FA": "PragmaRX\\Google2FALaravel\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FALaravel\\": "src/", + "PragmaRX\\Google2FALaravel\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "A One Time Password Authentication package, compatible with Google Authenticator.", + "keywords": [ + "Authentication", + "Two Factor Authentication", + "google2fa", + "laravel" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-laravel/issues", + "source": "https://github.com/antonioribeiro/google2fa-laravel/tree/v2.0.1" + }, + "time": "2021-08-17T18:45:39+00:00" + }, + { + "name": "pragmarx/google2fa-qrcode", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/antonioribeiro/google2fa-qrcode.git", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/antonioribeiro/google2fa-qrcode/zipball/ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "reference": "ce4d8a729b6c93741c607cfb2217acfffb5bf76b", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "pragmarx/google2fa": ">=4.0" + }, + "require-dev": { + "bacon/bacon-qr-code": "^2.0", + "chillerlan/php-qrcode": "^1.0|^2.0|^3.0|^4.0", + "khanamiryan/qrcode-detector-decoder": "^1.0", + "phpunit/phpunit": "~4|~5|~6|~7|~8|~9" + }, + "suggest": { + "bacon/bacon-qr-code": "For QR Code generation, requires imagick", + "chillerlan/php-qrcode": "For QR Code generation" + }, + "type": "library", + "extra": { + "component": "package", + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "PragmaRX\\Google2FAQRCode\\": "src/", + "PragmaRX\\Google2FAQRCode\\Tests\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Antonio Carlos Ribeiro", + "email": "acr@antoniocarlosribeiro.com", + "role": "Creator & Designer" + } + ], + "description": "QR Code package for Google2FA", + "keywords": [ + "2fa", + "Authentication", + "Two Factor Authentication", + "google2fa", + "qr code", + "qrcode" + ], + "support": { + "issues": "https://github.com/antonioribeiro/google2fa-qrcode/issues", + "source": "https://github.com/antonioribeiro/google2fa-qrcode/tree/v3.0.0" + }, + "time": "2021-08-15T12:53:48+00:00" + }, + { + "name": "psr/cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/0a7c67d0d1c8167b342eb74339d6f961663826ce", + "reference": "0a7c67d0d1c8167b342eb74339d6f961663826ce", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "suggest": { + "fig/cache-util": "Provides some useful PSR-6 utilities" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.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/master" + }, + "time": "2021-02-24T03:25:37+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "22b2ef5687f43679481615605d7a15c557ce85b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/22b2ef5687f43679481615605d7a15c557ce85b1", + "reference": "22b2ef5687f43679481615605d7a15c557ce85b1", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-09-19T09:12:31+00:00" + }, + { + "name": "psr/http-factory", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "36fa03d50ff82abcae81860bdaf4ed9a1510c7cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/36fa03d50ff82abcae81860bdaf4ed9a1510c7cd", + "reference": "36fa03d50ff82abcae81860bdaf4ed9a1510c7cd", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2020-09-17T16:52:55+00:00" + }, + { + "name": "psr/http-message", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "efd67d1dc14a7ef4fc4e518e7dee91c271d524e4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/efd67d1dc14a7ef4fc4e518e7dee91c271d524e4", + "reference": "efd67d1dc14a7ef4fc4e518e7dee91c271d524e4", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2019-08-29T13:16:46+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.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/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.2.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2021-09-25T23:10:38+00:00" + }, + { + "name": "react/promise", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "29daf46dbbe351dff533cec5bc556a0ded6590be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/29daf46dbbe351dff533cec5bc556a0ded6590be", + "reference": "29daf46dbbe351dff533cec5bc556a0ded6590be", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/2.x" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2021-11-17T15:31:12+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "reference": "9ad6ce79c342fbd44df10ea95511a1b24dee5b57", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2020-11-11T09:19:24+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + }, + "time": "2021-08-19T21:01:38+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "8bad7f04fd7d31d021b4752ee89f8a450dad8017" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/8bad7f04fd7d31d021b4752ee89f8a450dad8017", + "reference": "8bad7f04fd7d31d021b4752ee89f8a450dad8017", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.3|^8.0", + "psr/log": "^1.0 | ^2.0 | ^3.0", + "symfony/process": "^4.2|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.21|^9.4.4", + "symfony/var-dumper": "^4.2|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.6.1" + }, + "time": "2021-11-17T10:36:45+00:00" + }, + { + "name": "spatie/laravel-image-optimizer", + "version": "1.6.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-image-optimizer.git", + "reference": "c39e9ea77dee6b6eddfc26800adb1aa06a624294" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-image-optimizer/zipball/c39e9ea77dee6b6eddfc26800adb1aa06a624294", + "reference": "c39e9ea77dee6b6eddfc26800adb1aa06a624294", + "shasum": "" + }, + "require": { + "laravel/framework": "^6.0|^7.0|^8.0", + "php": "^7.2|^8.0", + "spatie/image-optimizer": "^1.2.0" + }, + "require-dev": { + "orchestra/testbench": "^4.0|^5.0|^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelImageOptimizer\\ImageOptimizerServiceProvider" + ], + "aliases": { + "ImageOptimizer": "Spatie\\LaravelImageOptimizer\\Facades\\ImageOptimizer" + } + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Optimize images in your Laravel app", + "homepage": "https://github.com/spatie/laravel-image-optimizer", + "keywords": [ + "laravel-image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-image-optimizer/issues", + "source": "https://github.com/spatie/laravel-image-optimizer/tree/1.6.4" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2020-11-27T18:27:06+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3e7ab8f5905058984899b05a4648096f558bfeba", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-21T19:41:05+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-21T12:38:00+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-13T13:42:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/filesystem", + "version": "6.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "52b3c9cce673b014915445a432339f282e002ce6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", + "reference": "52b3c9cce673b014915445a432339f282e002ce6", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "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/v5.3.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": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "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 HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-11T23:07:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "cdccfda41510821c08983542e83c4b3d97357c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/cdccfda41510821c08983542e83c4b3d97357c77", + "reference": "cdccfda41510821c08983542e83c4b3d97357c77", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-22T14:24:23+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-20T16:42:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.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": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.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": "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.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "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.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.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": "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.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.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": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "6c99204de85d04ca17f16c466fc61896960b0636" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/6c99204de85d04ca17f16c466fc61896960b0636", + "reference": "6c99204de85d04ca17f16c466fc61896960b0636", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "fcbc2b81d55984f04bb704c2269755fa5aaf5cca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/fcbc2b81d55984f04bb704c2269755fa5aaf5cca", + "reference": "fcbc2b81d55984f04bb704c2269755fa5aaf5cca", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.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 an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/17a965c8f3b1b348cf15d903ac53942984561f8a", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "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 internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "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/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-12T11:38:27+00:00" + }, + { + "name": "tightenco/ziggy", + "version": "v1.4.2", + "source": { + "type": "git", + "url": "https://github.com/tighten/ziggy.git", + "reference": "620c135281062b9f6b53a75b07f99a4339267277" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tighten/ziggy/zipball/620c135281062b9f6b53a75b07f99a4339267277", + "reference": "620c135281062b9f6b53a75b07f99a4339267277", + "shasum": "" + }, + "require": { + "laravel/framework": ">=5.4@dev" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Tightenco\\Ziggy\\ZiggyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Tightenco\\Ziggy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Coulbourne", + "email": "daniel@tighten.co" + }, + { + "name": "Jake Bathman", + "email": "jake@tighten.co" + }, + { + "name": "Jacob Baker-Kretzmar", + "email": "jacob@tighten.co" + } + ], + "description": "Generates a Blade directive exporting all of your named Laravel routes. Also provides a nice route() helper function in JavaScript.", + "homepage": "https://github.com/tighten/ziggy", + "keywords": [ + "Ziggy", + "javascript", + "laravel", + "routes" + ], + "support": { + "issues": "https://github.com/tighten/ziggy/issues", + "source": "https://github.com/tighten/ziggy/tree/v1.4.2" + }, + "time": "2021-10-01T13:55:26+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3" + }, + "time": "2020-07-13T06:12:54+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-11-10T01:08:39+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + }, + { + "name": "voyager-admin/voyager", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/voyager-admin/voyager.git", + "reference": "ac42dcc25afde799debeee0c418babeaa3ad248b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voyager-admin/voyager/zipball/ac42dcc25afde799debeee0c418babeaa3ad248b", + "reference": "ac42dcc25afde799debeee0c418babeaa3ad248b", + "shasum": "" + }, + "require": { + "composer/composer": "^2.0", + "doctrine/dbal": "^3.0", + "emptynick/voyager-tiptap": "^2.1", + "ext-json": "*", + "guzzlehttp/guzzle": "^7.3", + "illuminate/contracts": "^8.0", + "illuminate/support": "^8.0", + "inertiajs/inertia-laravel": "^0.4.1", + "intervention/image": "^2.6", + "php": "^8.0", + "spatie/laravel-image-optimizer": "^1.6", + "tightenco/ziggy": "^1.3" + }, + "require-dev": { + "nunomaduro/larastan": "^0.7.12", + "orchestra/testbench": "^6.0", + "voyager-admin/voyager-testbench-plugin": "*" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Voyager\\Admin\\VoyagerServiceProvider", + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Voyager": "Voyager\\Admin\\Facades\\Voyager" + } + } + }, + "autoload": { + "psr-4": { + "Voyager\\Admin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Tony Lea", + "email": "tony.lea@thecontrolgroup.com" + } + ], + "description": "A Laravel Admin Package to make your life easier and steer your project in the right direction", + "homepage": "https://voyager-admin.com", + "keywords": [ + "admin", + "laravel", + "panel" + ], + "support": { + "issues": "https://github.com/voyager-admin/voyager/issues", + "source": "https://github.com/voyager-admin/voyager" + }, + "time": "2021-12-07T10:25:55+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + } + ], "packages-dev": [], "aliases": [], - "minimum-stability": "stable", - "stability-flags": [], + "minimum-stability": "dev", + "stability-flags": { + "voyager-admin/voyager": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": [], diff --git a/dist/voyager-2fa.umd.js b/dist/voyager-2fa.umd.js index 333e549..23c8c8a 100644 --- a/dist/voyager-2fa.umd.js +++ b/dist/voyager-2fa.umd.js @@ -1 +1 @@ -(function(e,n){typeof exports=="object"&&typeof module!="undefined"?n(require("vue")):typeof define=="function"&&define.amd?define(["vue"],n):(e=typeof globalThis!="undefined"?globalThis:e||self,n(e.Vue))})(this,function(e){"use strict";var n=(o,t)=>{for(const[r,i]of t)o[r]=i;return o};const f={data(){return{}}};function u(o,t,r,i,d,s){return e.openBlock(),e.createElementBlock("div",null," Hello world ")}var c=n(f,[["render",u]]);voyager.component("voyager-login",c)}); +(function(e,l){typeof exports=="object"&&typeof module!="undefined"?l(require("vue"),require("axios")):typeof define=="function"&&define.amd?define(["vue","axios"],l):(e=typeof globalThis!="undefined"?globalThis:e||self,l(e.Vue,e.axios))})(this,function(e,l){"use strict";function m(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var d=m(l),c=(t,a)=>{for(const[o,i]of a)t[o]=i;return t};const _={props:{errors:Array,data:Object},computed:{otpRequested(){return this.errors.includes(this.__("2fa::2fa.enter_otp"))||this.errors.includes(this.__("2fa::2fa.otp_empty"))||this.errors.includes(this.__("2fa::2fa.otp_wrong"))}}},f={class:"w-full mt-1"},h={for:"email",class:"label"},p={class:"mt-1 rounded-md shadow-sm"},u=["value","autofocus"],y={class:"w-full mt-6"},b={for:"password",class:"label"},w={class:"mt-1 rounded-md shadow-sm"},g=["value"],V={key:0,class:"w-full mt-6"},E=e.createElementVNode("label",{for:"otp",class:"label"},"One time password",-1),N={class:"mt-1 rounded-md shadow-sm"},k=["value"],D={class:"w-full flex justify-between mt-4"},x={class:"select-none"},B=["checked"],C={for:"remember",class:"text-sm leading-8 mx-1"},M={class:"flex items-center justify-between mt-4"},S={class:"button large accent w-full justify-center",type:"submit"};function T(t,a,o,i,r,n){return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",f,[e.createElementVNode("label",h,e.toDisplayString(t.__("voyager::auth.email")),1),e.createElementVNode("div",p,[e.createElementVNode("input",{type:"email",name:"email",id:"email",class:"input w-full mb-4 placeholder-gray-400",value:o.data.email,autofocus:!n.otpRequested},null,8,u)])]),e.createElementVNode("div",y,[e.createElementVNode("label",b,e.toDisplayString(t.__("voyager::auth.password")),1),e.createElementVNode("div",w,[e.createElementVNode("input",{type:"password",name:"password",id:"password",class:"input w-full mb-3 placeholder-gray-400",value:o.data.password},null,8,g)])]),n.otpRequested?(e.openBlock(),e.createElementBlock("div",V,[E,e.createElementVNode("div",N,[e.createElementVNode("input",{type:"text",name:"otp",id:"otp",class:"input w-full mb-3 placeholder-gray-400",value:o.data.otp,autofocus:""},null,8,k)])])):e.createCommentVNode("",!0),e.createElementVNode("div",D,[e.createElementVNode("div",x,[e.createElementVNode("input",{type:"checkbox",class:"input",name:"remember",id:"remember",checked:o.data.remember=="on"||!1},null,8,B),e.createElementVNode("label",C,e.toDisplayString(t.__("voyager::auth.remember_me")),1)])]),e.createElementVNode("div",M,[e.createElementVNode("button",S,e.toDisplayString(t.__("voyager::auth.login")),1)])])}var L=c(_,[["render",T]]);const q={props:{twofakey:String,qr:String,active:Boolean,allowDisable:Boolean},mounted(){console.log(this.allowDisable)},data(){return{code:null}},methods:{enable(){d.default.post(this.route("voyager.voyager-manage-2fa"),{enable:!0,key:this.twofakey,code:this.code}).then(t=>{t.status==200&&(new this.$notification(this.__("2fa::2fa.activated")).color("green").timeout().show(),location.reload())}).catch(()=>{})},disable(){this.allowDisable&&new this.$notification(this.__("2fa::2fa.disable_confirm")).color("yellow").timeout().confirm().show().then(t=>{t&&d.default.post(this.route("voyager.voyager-manage-2fa"),{enable:!1}).then(a=>{a.status==200&&(new this.$notification(this.__("2fa::2fa.disabled")).color("green").timeout().show(),location.reload())}).catch(()=>{})})}}},j=["innerHTML"],H={class:"flex w-full mt-2"},A={class:"flex-none text-center"},R=["innerHTML"],v=["innerHTML"],O={class:"flex-grow mx-2"},$=["placeholder"],F={class:"inline-flex space-x-2 mt-2"};function U(t,a,o,i,r,n){const G=e.resolveComponent("Alert"),I=e.resolveComponent("Card");return e.openBlock(),e.createBlock(I,{title:"Manage 2FA"},{default:e.withCtx(()=>[o.active?(e.openBlock(),e.createBlock(G,{key:0},{default:e.withCtx(()=>[e.createElementVNode("p",{innerHTML:t.nl2br(o.allowDisable?t.__("2fa::2fa.active_alert_disable"):t.__("2fa::2fa.active_alert"))},null,8,j)]),_:1})):e.createCommentVNode("",!0),e.createElementVNode("div",H,[e.createElementVNode("div",A,[e.createElementVNode("div",{innerHTML:o.qr},null,8,R),e.createElementVNode("div",{innerHTML:o.twofakey},null,8,v)]),e.createElementVNode("div",O,[e.createElementVNode("p",null,e.toDisplayString(t.__("2fa::2fa.scan_info")),1),e.withDirectives(e.createElementVNode("input",{type:"text",class:"input","onUpdate:modelValue":a[0]||(a[0]=s=>r.code=s),placeholder:t.__("2fa::2fa.new_otp")},null,8,$),[[e.vModelText,r.code]]),e.createElementVNode("div",F,[e.createElementVNode("button",{class:"button blue",onClick:a[1]||(a[1]=e.withModifiers((...s)=>n.enable&&n.enable(...s),["prevent"]))},e.toDisplayString(o.active?t.__("2fa::2fa.renew"):t.__("voyager::generic.enable")),1),o.active&&o.allowDisable?(e.openBlock(),e.createElementBlock("button",{key:0,class:"button",onClick:a[2]||(a[2]=e.withModifiers((...s)=>n.disable&&n.disable(...s),["prevent"]))},e.toDisplayString(t.__("voyager::generic.disable")),1)):e.createCommentVNode("",!0)])])])]),_:1})}var z=c(q,[["render",U]]);voyager.component("voyager-2fa-login",L),voyager.component("voyager-2fa-manage",z)}); diff --git a/migrations/2021_12_07_000000_add_secret_to_users_table.php b/migrations/2021_12_07_000000_add_secret_to_users_table.php new file mode 100644 index 0000000..8fa923c --- /dev/null +++ b/migrations/2021_12_07_000000_add_secret_to_users_table.php @@ -0,0 +1,32 @@ +string('google2fa_secret')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('google2fa_secret'); + }); + } +} \ No newline at end of file diff --git a/resources/lang/en/2fa.php b/resources/lang/en/2fa.php new file mode 100644 index 0000000..3d9756a --- /dev/null +++ b/resources/lang/en/2fa.php @@ -0,0 +1,19 @@ + 'Please activate 2 factor authentication by clicking here!', + 'active_alert' => 'Two-factor-authentication is currently enabled.\nYou can renew your OTP here!', + 'active_alert_disable' => 'Two-factor-authentication is currently enabled.\nYou can disable and renew your OTP here!', + 'activated' => 'Two-factor-authentication was successfully enabled!', + 'cannot_disable' => 'You are not allowed to disable 2FA!', + 'disabled' => 'Two-factor-authentication was successfully disabled!', + 'disable_confirm' => 'Are you sure you want to disable two-factor-auth?', + 'enter_otp' => 'Please enter your OTP!', + 'force_2fa' => 'Force 2FA for all users', + 'force_2fa_info' => 'Forces users to setup 2FA before being able to access any page.', + 'new_otp' => 'New one time password', + 'otp_empty' => 'OTP can not be empty!', + 'otp_wrong' => 'The OTP is not valid!', + 'renew' => 'Renew', + 'scan_info' => 'Scan the QR code or enter it manually to generate a one time password.', +]; \ No newline at end of file diff --git a/src/Commands/InstallCommand.php b/src/Commands/InstallCommand.php new file mode 100644 index 0000000..30c27ac --- /dev/null +++ b/src/Commands/InstallCommand.php @@ -0,0 +1,55 @@ +confirm('Do you want to publish pragmarx/google2fa-laravel config file?', true)) { + $this->call('vendor:publish', ['--provider' => \PragmaRX\Google2FALaravel\ServiceProvider::class]); + } + + $this->info('Publishing migrations'); + $this->call('vendor:publish', ['--provider' => \Emptynick\TwoFA\TwoFAServiceProvider::class]); + if ($this->confirm('Do you wish to migrate now? Skip this if you want to modify the migration file', true)) { + $this->call('migrate'); + $this->info('Successfully migrated!'); + } + + $this->info('Everything done. You can re-run this command to repeat steps if needed.'); + } +} \ No newline at end of file diff --git a/src/Components/Login.vue b/src/Components/Login.vue index 28a0c8e..3fc3cee 100644 --- a/src/Components/Login.vue +++ b/src/Components/Login.vue @@ -1,16 +1,48 @@ \ No newline at end of file diff --git a/src/Components/Manager.vue b/src/Components/Manager.vue new file mode 100644 index 0000000..798a4c3 --- /dev/null +++ b/src/Components/Manager.vue @@ -0,0 +1,73 @@ + + + \ No newline at end of file diff --git a/src/Provider/Routes.php b/src/Provider/Routes.php new file mode 100644 index 0000000..647f3ab --- /dev/null +++ b/src/Provider/Routes.php @@ -0,0 +1,48 @@ + $key, + 'qr' => str_replace(['#fefefe', '#000000'], ['none', 'currentcolor'], TwoFactor::getQRCodeInline( + config('app.name'), + $this->name(), + $key, + )), + 'active' => !empty($this->user()->{$this->get2FAField()}), + 'allowDisable' => Voyager::setting('2FA.allow_disabling', true), + ])->withViewData('title', 'Manage 2FA'); + })->name('voyager-manage-2fa'); + + Route::post('manage-2fa', function (Request $request) { + if (!$request->get('enable', true)) { + if (Voyager::setting('2FA.allow_disabling', true)) { + $this->user()->{$this->get2FAField()} = null; + $this->user()->save(); + + return true; + } else { + abort(500, __('2fa::2fa.cannot_disable')); + } + } else if (!TwoFactor::verifyKey($request->input('key'), $request->input('code'))) { + abort(500, __('2fa::2fa.otp_wrong')); + } else { + $this->user()->{$this->get2FAField()} = $request->input('key'); + $this->user()->save(); + + return true; + } + })->name('voyager-manage-2fa'); + } +} \ No newline at end of file diff --git a/src/Provider/Settings.php b/src/Provider/Settings.php new file mode 100644 index 0000000..dd9df04 --- /dev/null +++ b/src/Provider/Settings.php @@ -0,0 +1,44 @@ + 'toggle', + 'group' => '2FA', + 'name' => 'Force 2FA', + 'key' => 'force_2fa', + 'value' => false, + 'translatable' => false, + 'info' => 'Prevents the user to access any page before activating 2FA', + 'options' => [], + 'validation' => [], + ], + [ + 'type' => 'toggle', + 'group' => '2FA', + 'name' => 'Show warning', + 'key' => 'show_warning', + 'value' => true, + 'translatable' => false, + 'info' => 'Show a message to enable 2FA on every page visit', + 'options' => [], + 'validation' => [], + ], + [ + 'type' => 'toggle', + 'group' => '2FA', + 'name' => 'Allow disabling 2FA', + 'key' => 'allow_disabling', + 'value' => true, + 'translatable' => false, + 'info' => 'Allow users to disable 2FA', + 'options' => [], + 'validation' => [], + ] + ]; + } +} \ No newline at end of file diff --git a/src/TwoFA.php b/src/TwoFA.php index 612b08f..3034b8a 100644 --- a/src/TwoFA.php +++ b/src/TwoFA.php @@ -2,11 +2,28 @@ namespace Emptynick\TwoFA; +use Closure; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\{Auth, Event}; +use PragmaRX\Google2FALaravel\Facade as TwoFactor; +use Illuminate\Support\Facades\Route; + +use Voyager\Admin\Classes\UserMenuItem; use Voyager\Admin\Contracts\Plugins\AuthenticationPlugin; -use Voyager\Admin\Contracts\Plugins\Features\Provider\{JS}; +use Voyager\Admin\Contracts\Plugins\Features\Provider\{JS, ProtectedRoutes, Settings}; +use Voyager\Admin\Facades\Voyager; +use Voyager\Admin\Manager\Menu as MenuManager; +use Voyager\Admin\Plugins\AuthenticationPlugin as BaseAuthPlugin; + +use Emptynick\TwoFA\Provider\{Settings as SettingsProvider, Routes as RoutesProvider}; -class TwoFA implements AuthenticationPlugin, JS +class TwoFA extends BaseAuthPlugin implements AuthenticationPlugin, JS, ProtectedRoutes, Settings { + use SettingsProvider, + RoutesProvider; + + private bool $registered = false; + public $name = 'Voyager 2FA'; public $description = 'Two-factor authentication for Voyager II'; public $repository = 'emptynick/voyager-2fa'; @@ -23,4 +40,89 @@ public function provideJS() : string { return file_get_contents(realpath(dirname(__DIR__, 1).'/dist/voyager-2fa.umd.js')); } + + public function loginComponent(): ?string + { + return 'voyager-2fa-login'; + } + + public function authenticate(Request $request): ?array + { + if (!$request->get('email', null) || !$request->get('password', null)) { + return [ __('voyager::auth.error_field_empty') ]; + } else if ($request->has('otp') && empty($request->otp)) { + return [ __('2fa::2fa.otp_empty') ]; + } + + if (Auth::validate($request->only('email', 'password'))) { + // Credentials are good + $user = $this->getUserModel()->where('email', $request->get('email'))->firstOrFail(); + + if ($request->has('otp')) { + if (!TwoFactor::verifyKey($user->{$this->get2FAField()}, $request->input('otp'))) { + // 2FA code wrong + return [ __('2fa::2fa.otp_wrong') ]; + } + // Code is correct. Login normally + } else { + $secret = $user->{$this->get2FAField()}; + if (!is_null($secret) && !empty($secret)) { + // Has to enter code + return [ __('2fa::2fa.enter_otp') ]; + } + // 2FA not activated. Login normally + } + } + + if (Auth::attempt($request->only('email', 'password'), $request->has('remember'))) { + $request->session()->regenerate(); + return null; + } + + return [ __('voyager::auth.login_failed') ]; + } + + public function handleRequest(Request $request, Closure $next): mixed + { + if (!$this->registered) { + auth()->setDefaultDriver($this->guard()); + $this->registered = true; + Event::dispatch('voyager.auth.registered', $this); + $this->registerUserMenuItems(); + } + + if ($this->user() && !Auth::guest()) { + if (!TwoFactor::isActivated()) { + if (Route::currentRouteName() !== 'voyager.voyager-manage-2fa') { + if (Voyager::setting('2FA.force_2fa', false)) { + return redirect()->route('voyager.voyager-manage-2fa'); + } + if (Voyager::setting('2FA.show_warning', true)) { + Voyager::flashMessage(__('2fa::2fa.activate_message', ['url' => route('voyager.voyager-manage-2fa')]), 'yellow'); + } + } + } + if (Voyager::authorize($this->user(), 'browse', ['voyager'])) { + return $next($request); + } + } + + return redirect()->guest(route('voyager.login')); + } + + private function get2FAField() { + return config('google2fa.otp_secret_column', 'google2fa_secret'); + } + + private function getUserModel() { + return app(config('auth.providers.'.config('guards.'.$this->guard().'.provider', 'users').'.model', null)); + } + + private function registerUserMenuItems() { + app(MenuManager::class)->addItems( + (new UserMenuItem(__('voyager::generic.dashboard')))->route('voyager.dashboard'), + (new UserMenuItem('Manage 2FA'))->route('voyager.voyager-manage-2fa'), + (new UserMenuItem(__('voyager::auth.logout')))->route('voyager.logout') + ); + } } diff --git a/src/TwoFAServiceProvider.php b/src/TwoFAServiceProvider.php index 8fc6ee9..854d6af 100644 --- a/src/TwoFAServiceProvider.php +++ b/src/TwoFAServiceProvider.php @@ -3,6 +3,7 @@ namespace Emptynick\TwoFA; use Illuminate\Support\ServiceProvider; +use Voyager\Admin\Facades\Voyager as Voyager; use Voyager\Admin\Manager\Plugins as PluginManager; class TwoFAServiceProvider extends ServiceProvider @@ -10,10 +11,19 @@ class TwoFAServiceProvider extends ServiceProvider public function boot(PluginManager $pluginmanager) { $pluginmanager->addPlugin(\Emptynick\TwoFA\TwoFA::class); + + $this->loadTranslationsFrom(realpath(__DIR__.'/../resources/lang'), '2fa'); + Voyager::addTranslations('2fa', '2fa'); + + $this->publishes([ + __DIR__.'/../migrations/' => database_path('migrations') + ], '2fa-migrations'); } public function register() { - + if ($this->app->runningInConsole()) { + $this->commands(Commands\InstallCommand::class); + } } } \ No newline at end of file diff --git a/src/main.js b/src/main.js index f7eb2a4..93945e0 100644 --- a/src/main.js +++ b/src/main.js @@ -1,2 +1,5 @@ -import LoginView from './components/Login.vue'; -voyager.component('voyager-login', LoginView); \ No newline at end of file +import LoginView from './Components/Login.vue'; +import ManageView from './Components/Manager.vue'; + +voyager.component('voyager-2fa-login', LoginView); +voyager.component('voyager-2fa-manage', ManageView); \ No newline at end of file diff --git a/vite.config.js b/vite.config.js index d95d4fd..82681b2 100644 --- a/vite.config.js +++ b/vite.config.js @@ -13,10 +13,11 @@ export default defineConfig({ fileName: 'voyager-2fa' }, rollupOptions: { - external: ['vue'], + external: ['vue', 'axios'], output: { globals: { vue: 'Vue', + axios: 'axios', } } }