mediawiki/vendor: main (log #625058)

sourcepatches

This run took 32 seconds.

From 732dfbe3911c0f2d31c8febca87894ca272aba52 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Tue, 14 Jun 2022 11:59:48 +0000
Subject: [PATCH] build: Updating php-parallel-lint/php-parallel-lint to 1.3.2

Change-Id: Idb202d0a3b508d12fe2f8ed8d9e36a5bdcf0a2c7
---
 composer.json                                 |    2 +-
 composer.lock                                 |   20 +-
 composer/ClassLoader.php                      |  123 +-
 composer/InstalledVersions.php                | 1426 ++++++++-
 composer/LICENSE                              |    2 -
 composer/autoload_classmap.php                |   38 +-
 composer/autoload_files.php                   |   20 +-
 composer/autoload_namespaces.php              |    2 +-
 composer/autoload_psr4.php                    |    2 +-
 composer/autoload_real.php                    |   30 +-
 composer/autoload_static.php                  |   54 +-
 composer/include_paths.php                    |    2 +-
 composer/installed.json                       |   66 +-
 composer/installed.php                        | 2575 +++++++++--------
 .../php-parallel-lint/CHANGELOG.md            |  169 ++
 php-parallel-lint/php-parallel-lint/LICENSE   |   26 +
 php-parallel-lint/php-parallel-lint/README.md |  122 +
 .../php-parallel-lint/bin/skip-linting.php    |   19 +
 .../php-parallel-lint/composer.json           |   51 +
 .../php-parallel-lint/parallel-lint           |   74 +
 .../php-parallel-lint/src/Application.php     |  129 +
 .../src/Contracts/SyntaxErrorCallback.php     |   13 +
 .../php-parallel-lint/src/Error.php           |  226 ++
 .../php-parallel-lint/src/ErrorFormatter.php  |  140 +
 .../php-parallel-lint/src/Manager.php         |  293 ++
 .../php-parallel-lint/src/Output.php          |  594 ++++
 .../php-parallel-lint/src/ParallelLint.php    |  286 ++
 .../src/Process/GitBlameProcess.php           |  147 +
 .../src/Process/LintProcess.php               |  137 +
 .../src/Process/PhpExecutable.php             |  128 +
 .../src/Process/PhpProcess.php                |   35 +
 .../php-parallel-lint/src/Process/Process.php |  153 +
 .../src/Process/SkipLintProcess.php           |   91 +
 .../php-parallel-lint/src/Result.php          |  171 ++
 .../php-parallel-lint/src/Settings.php        |  247 ++
 .../php-parallel-lint/src/exceptions.php      |   93 +
 .../php-parallel-lint/src/polyfill.php        |   15 +
 37 files changed, 6192 insertions(+), 1529 deletions(-)
 create mode 100644 php-parallel-lint/php-parallel-lint/CHANGELOG.md
 create mode 100644 php-parallel-lint/php-parallel-lint/LICENSE
 create mode 100644 php-parallel-lint/php-parallel-lint/README.md
 create mode 100644 php-parallel-lint/php-parallel-lint/bin/skip-linting.php
 create mode 100644 php-parallel-lint/php-parallel-lint/composer.json
 create mode 100755 php-parallel-lint/php-parallel-lint/parallel-lint
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Application.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Error.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Manager.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Output.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/ParallelLint.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/Process.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Result.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/Settings.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/exceptions.php
 create mode 100644 php-parallel-lint/php-parallel-lint/src/polyfill.php

diff --git a/composer.json b/composer.json
index 8f5efe0..a04f048 100644
--- a/composer.json
+++ b/composer.json
@@ -147,7 +147,7 @@
 		"symfony/polyfill-php72": "1.12.0"
 	},
 	"require-dev": {
-		"php-parallel-lint/php-parallel-lint": "1.3.1"
+		"php-parallel-lint/php-parallel-lint": "1.3.2"
 	},
 	"scripts": {
 		"test": "parallel-lint --exclude composer/autoload_static.php --exclude pear/mail/tests --exclude symfony/console/Attribute/AsCommand.php ."
diff --git a/composer.lock b/composer.lock
index c97348d..74c42e2 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "6f392b45d1f753b670077ba5d0c6b413",
+    "content-hash": "12f8b9cd85e84aee0ec656bc95c28e6b",
     "packages": [
         {
             "name": "beberlei/assert",
@@ -8190,16 +8190,16 @@
     "packages-dev": [
         {
             "name": "php-parallel-lint/php-parallel-lint",
-            "version": "v1.3.1",
+            "version": "v1.3.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
-                "reference": "761f3806e30239b5fcd90a0a45d41dc2138de192"
+                "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/761f3806e30239b5fcd90a0a45d41dc2138de192",
-                "reference": "761f3806e30239b5fcd90a0a45d41dc2138de192",
+                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6483c9832e71973ed29cf71bd6b3f4fde438a9de",
+                "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de",
                 "shasum": ""
             },
             "require": {
@@ -8212,7 +8212,7 @@
             },
             "require-dev": {
                 "nette/tester": "^1.3 || ^2.0",
-                "php-parallel-lint/php-console-highlighter": "~0.3",
+                "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
                 "squizlabs/php_codesniffer": "^3.6"
             },
             "suggest": {
@@ -8224,7 +8224,7 @@
             "type": "library",
             "autoload": {
                 "classmap": [
-                    "./"
+                    "./src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -8241,9 +8241,9 @@
             "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
             "support": {
                 "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
-                "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.1"
+                "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.2"
             },
-            "time": "2021-08-13T05:35:13+00:00"
+            "time": "2022-02-21T12:50:22+00:00"
         }
     ],
     "aliases": [
@@ -8266,5 +8266,5 @@
         "composer-plugin-api": "^2.0"
     },
     "platform-dev": [],
-    "plugin-api-version": "2.3.0"
+    "plugin-api-version": "2.0.0"
 }
diff --git a/composer/ClassLoader.php b/composer/ClassLoader.php
index afef3fa..4d989a2 100644
--- a/composer/ClassLoader.php
+++ b/composer/ClassLoader.php
@@ -42,75 +42,30 @@ namespace Composer\Autoload;
  */
 class ClassLoader
 {
-    /** @var ?string */
     private $vendorDir;
 
     // PSR-4
-    /**
-     * @var array[]
-     * @psalm-var array<string, array<string, int>>
-     */
     private $prefixLengthsPsr4 = array();
-    /**
-     * @var array[]
-     * @psalm-var array<string, array<int, string>>
-     */
     private $prefixDirsPsr4 = array();
-    /**
-     * @var array[]
-     * @psalm-var array<string, string>
-     */
     private $fallbackDirsPsr4 = array();
 
     // PSR-0
-    /**
-     * @var array[]
-     * @psalm-var array<string, array<string, string[]>>
-     */
     private $prefixesPsr0 = array();
-    /**
-     * @var array[]
-     * @psalm-var array<string, string>
-     */
     private $fallbackDirsPsr0 = array();
 
-    /** @var bool */
     private $useIncludePath = false;
-
-    /**
-     * @var string[]
-     * @psalm-var array<string, string>
-     */
     private $classMap = array();
-
-    /** @var bool */
     private $classMapAuthoritative = false;
-
-    /**
-     * @var bool[]
-     * @psalm-var array<string, bool>
-     */
     private $missingClasses = array();
-
-    /** @var ?string */
     private $apcuPrefix;
 
-    /**
-     * @var self[]
-     */
     private static $registeredLoaders = array();
 
-    /**
-     * @param ?string $vendorDir
-     */
     public function __construct($vendorDir = null)
     {
         $this->vendorDir = $vendorDir;
     }
 
-    /**
-     * @return string[]
-     */
     public function getPrefixes()
     {
         if (!empty($this->prefixesPsr0)) {
@@ -120,47 +75,28 @@ class ClassLoader
         return array();
     }
 
-    /**
-     * @return array[]
-     * @psalm-return array<string, array<int, string>>
-     */
     public function getPrefixesPsr4()
     {
         return $this->prefixDirsPsr4;
     }
 
-    /**
-     * @return array[]
-     * @psalm-return array<string, string>
-     */
     public function getFallbackDirs()
     {
         return $this->fallbackDirsPsr0;
     }
 
-    /**
-     * @return array[]
-     * @psalm-return array<string, string>
-     */
     public function getFallbackDirsPsr4()
     {
         return $this->fallbackDirsPsr4;
     }
 
-    /**
-     * @return string[] Array of classname => path
-     * @psalm-return array<string, string>
-     */
     public function getClassMap()
     {
         return $this->classMap;
     }
 
     /**
-     * @param string[] $classMap Class to filename map
-     * @psalm-param array<string, string> $classMap
-     *
-     * @return void
+     * @param array $classMap Class to filename map
      */
     public function addClassMap(array $classMap)
     {
@@ -175,11 +111,9 @@ class ClassLoader
      * Registers a set of PSR-0 directories for a given prefix, either
      * appending or prepending to the ones previously set for this prefix.
      *
-     * @param string          $prefix  The prefix
-     * @param string[]|string $paths   The PSR-0 root directories
-     * @param bool            $prepend Whether to prepend the directories
-     *
-     * @return void
+     * @param string       $prefix  The prefix
+     * @param array|string $paths   The PSR-0 root directories
+     * @param bool         $prepend Whether to prepend the directories
      */
     public function add($prefix, $paths, $prepend = false)
     {
@@ -222,13 +156,11 @@ class ClassLoader
      * Registers a set of PSR-4 directories for a given namespace, either
      * appending or prepending to the ones previously set for this namespace.
      *
-     * @param string          $prefix  The prefix/namespace, with trailing '\\'
-     * @param string[]|string $paths   The PSR-4 base directories
-     * @param bool            $prepend Whether to prepend the directories
+     * @param string       $prefix  The prefix/namespace, with trailing '\\'
+     * @param array|string $paths   The PSR-4 base directories
+     * @param bool         $prepend Whether to prepend the directories
      *
      * @throws \InvalidArgumentException
-     *
-     * @return void
      */
     public function addPsr4($prefix, $paths, $prepend = false)
     {
@@ -272,10 +204,8 @@ class ClassLoader
      * Registers a set of PSR-0 directories for a given prefix,
      * replacing any others previously set for this prefix.
      *
-     * @param string          $prefix The prefix
-     * @param string[]|string $paths  The PSR-0 base directories
-     *
-     * @return void
+     * @param string       $prefix The prefix
+     * @param array|string $paths  The PSR-0 base directories
      */
     public function set($prefix, $paths)
     {
@@ -290,12 +220,10 @@ class ClassLoader
      * Registers a set of PSR-4 directories for a given namespace,
      * replacing any others previously set for this namespace.
      *
-     * @param string          $prefix The prefix/namespace, with trailing '\\'
-     * @param string[]|string $paths  The PSR-4 base directories
+     * @param string       $prefix The prefix/namespace, with trailing '\\'
+     * @param array|string $paths  The PSR-4 base directories
      *
      * @throws \InvalidArgumentException
-     *
-     * @return void
      */
     public function setPsr4($prefix, $paths)
     {
@@ -315,8 +243,6 @@ class ClassLoader
      * Turns on searching the include path for class files.
      *
      * @param bool $useIncludePath
-     *
-     * @return void
      */
     public function setUseIncludePath($useIncludePath)
     {
@@ -339,8 +265,6 @@ class ClassLoader
      * that have not been registered with the class map.
      *
      * @param bool $classMapAuthoritative
-     *
-     * @return void
      */
     public function setClassMapAuthoritative($classMapAuthoritative)
     {
@@ -361,8 +285,6 @@ class ClassLoader
      * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
      *
      * @param string|null $apcuPrefix
-     *
-     * @return void
      */
     public function setApcuPrefix($apcuPrefix)
     {
@@ -383,18 +305,14 @@ class ClassLoader
      * Registers this instance as an autoloader.
      *
      * @param bool $prepend Whether to prepend the autoloader or not
-     *
-     * @return void
      */
     public function register($prepend = false)
     {
         spl_autoload_register(array($this, 'loadClass'), true, $prepend);
 
         if (null === $this->vendorDir) {
-            return;
-        }
-
-        if ($prepend) {
+            //no-op
+        } elseif ($prepend) {
             self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
         } else {
             unset(self::$registeredLoaders[$this->vendorDir]);
@@ -404,8 +322,6 @@ class ClassLoader
 
     /**
      * Unregisters this instance as an autoloader.
-     *
-     * @return void
      */
     public function unregister()
     {
@@ -420,7 +336,7 @@ class ClassLoader
      * Loads the given class or interface.
      *
      * @param  string    $class The name of the class
-     * @return true|null True if loaded, null otherwise
+     * @return bool|null True if loaded, null otherwise
      */
     public function loadClass($class)
     {
@@ -429,8 +345,6 @@ class ClassLoader
 
             return true;
         }
-
-        return null;
     }
 
     /**
@@ -485,11 +399,6 @@ class ClassLoader
         return self::$registeredLoaders;
     }
 
-    /**
-     * @param  string       $class
-     * @param  string       $ext
-     * @return string|false
-     */
     private function findFileWithExtension($class, $ext)
     {
         // PSR-4 lookup
@@ -561,10 +470,6 @@ class ClassLoader
  * Scope isolated include.
  *
  * Prevents access to $this/self from included files.
- *
- * @param  string $file
- * @return void
- * @private
  */
 function includeFile($file)
 {
diff --git a/composer/InstalledVersions.php b/composer/InstalledVersions.php
index 41bc143..f5c3103 100644
--- a/composer/InstalledVersions.php
+++ b/composer/InstalledVersions.php
@@ -18,29 +18,1321 @@ use Composer\Semver\VersionParser;
 /**
  * This class is copied in every Composer installed project and available to all
  *
- * See also https://getcomposer.org/doc/07-runtime.md#installed-versions
- *
- * To require its presence, you can require `composer-runtime-api ^2.0`
- *
- * @final
+ * To require it's presence, you can require `composer-runtime-api ^2.0`
  */
 class InstalledVersions
 {
-    /**
-     * @var mixed[]|null
-     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
-     */
-    private static $installed;
-
-    /**
-     * @var bool|null
-     */
+    private static $installed = array (
+  'root' => 
+  array (
+    'pretty_version' => 'dev-master',
+    'version' => 'dev-master',
+    'aliases' => 
+    array (
+    ),
+    'reference' => 'debbadc67271c83c8925217331582b03cd17b71d',
+    'name' => '__root__',
+  ),
+  'versions' => 
+  array (
+    '__root__' => 
+    array (
+      'pretty_version' => 'dev-master',
+      'version' => 'dev-master',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'debbadc67271c83c8925217331582b03cd17b71d',
+    ),
+    'beberlei/assert' => 
+    array (
+      'pretty_version' => 'v3.3.2',
+      'version' => '3.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
+    ),
+    'brick/math' => 
+    array (
+      'pretty_version' => '0.8.17',
+      'version' => '0.8.17.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e6f8e7d04346a95be89580f8c2c22d6c3fa65556',
+    ),
+    'christian-riesen/base32' => 
+    array (
+      'pretty_version' => '1.6.0',
+      'version' => '1.6.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2e82dab3baa008e24a505649b0d583c31d31e894',
+    ),
+    'composer/ca-bundle' => 
+    array (
+      'pretty_version' => '1.3.1',
+      'version' => '1.3.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b',
+    ),
+    'composer/semver' => 
+    array (
+      'pretty_version' => '3.3.2',
+      'version' => '3.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9',
+    ),
+    'cssjanus/cssjanus' => 
+    array (
+      'pretty_version' => 'v2.1.0',
+      'version' => '2.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'de7483c0805750a6462b372eab55d022d555df02',
+    ),
+    'data-values/common' => 
+    array (
+      'pretty_version' => '1.0.0',
+      'version' => '1.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '315bd95ef8e5c360ce8a1cf02c0eef35bbb92561',
+    ),
+    'data-values/data-values' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '63dee286f8bb4ae7899c2d2e8d439e7b5332cc49',
+    ),
+    'data-values/geo' => 
+    array (
+      'pretty_version' => '4.2.3',
+      'version' => '4.2.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a08d5ce38c2cb789ff8942e9082ce04dfc55a850',
+    ),
+    'data-values/interfaces' => 
+    array (
+      'pretty_version' => '1.0.0',
+      'version' => '1.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '244d078954bc05edf8f8c6b088e848289171c3a8',
+    ),
+    'data-values/number' => 
+    array (
+      'pretty_version' => '0.11.1',
+      'version' => '0.11.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3177a4e11fee862d59a4f66c6b35408e9c609843',
+    ),
+    'data-values/serialization' => 
+    array (
+      'pretty_version' => '1.2.4',
+      'version' => '1.2.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5bc3640f7ddb642479ff490fae64fcf19c7e75af',
+    ),
+    'data-values/time' => 
+    array (
+      'pretty_version' => '1.0.4',
+      'version' => '1.0.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'abbb585f2c71ca8a1ac9aea858cf5ba6b8920320',
+    ),
+    'defuse/php-encryption' => 
+    array (
+      'pretty_version' => 'v2.3.1',
+      'version' => '2.3.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '77880488b9954b7884c25555c2a0ea9e7053f9d2',
+    ),
+    'diff/diff' => 
+    array (
+      'pretty_version' => '3.2.0',
+      'version' => '3.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '89bbd224a9ad6cc6cb8e01263ae5add2564e7cf0',
+    ),
+    'elasticsearch/elasticsearch' => 
+    array (
+      'pretty_version' => 'v6.7.2',
+      'version' => '6.7.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9ba89f905ebf699e72dacffa410331c7fecc8255',
+    ),
+    'fgrosse/phpasn1' => 
+    array (
+      'pretty_version' => 'v2.4.0',
+      'version' => '2.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'eef488991d53e58e60c9554b09b1201ca5ba9296',
+    ),
+    'firebase/php-jwt' => 
+    array (
+      'pretty_version' => 'v5.5.1',
+      'version' => '5.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
+    ),
+    'geoip2/geoip2' => 
+    array (
+      'pretty_version' => 'v2.12.2',
+      'version' => '2.12.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83adb44ac4b9553d36b579a14673ed124583082f',
+    ),
+    'grogy/php-parallel-lint' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'guzzlehttp/guzzle' => 
+    array (
+      'pretty_version' => '7.4.1',
+      'version' => '7.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79',
+    ),
+    'guzzlehttp/promises' => 
+    array (
+      'pretty_version' => '1.5.1',
+      'version' => '1.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
+    ),
+    'guzzlehttp/psr7' => 
+    array (
+      'pretty_version' => '2.1.2',
+      'version' => '2.1.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b36d463b214c76ed12b924bae0445f3531bb1686',
+    ),
+    'guzzlehttp/ringphp' => 
+    array (
+      'pretty_version' => '1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5e2a174052995663dd68e6b5ad838afd47dd615b',
+    ),
+    'guzzlehttp/streams' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5',
+    ),
+    'jakobo/hotp-php' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ff2f13d1918001e54b3f49deb1d366bcfcc98437',
+    ),
+    'jakub-onderka/php-parallel-lint' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'james-heinrich/getid3' => 
+    array (
+      'pretty_version' => 'v1.9.21',
+      'version' => '1.9.21.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '36f5dabb1325415a4b07a401113f8db2eb81eca1',
+    ),
+    'justinrainbow/json-schema' => 
+    array (
+      'pretty_version' => '5.2.11',
+      'version' => '5.2.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2ab6744b7296ded80f8cc4f9509abbff393399aa',
+    ),
+    'lcobucci/jwt' => 
+    array (
+      'pretty_version' => '3.4.6',
+      'version' => '3.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3ef8657a78278dfeae7707d51747251db4176240',
+    ),
+    'league/event' => 
+    array (
+      'pretty_version' => '2.2.0',
+      'version' => '2.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd2cc124cf9a3fab2bb4ff963307f60361ce4d119',
+    ),
+    'league/oauth2-server' => 
+    array (
+      'pretty_version' => 'dev-v9.0.0-alpha',
+      'version' => 'dev-v9.0.0-alpha',
+      'aliases' => 
+      array (
+        0 => '9999999-dev',
+        1 => '9.0.0',
+      ),
+      'reference' => '61d770dc284898ea2905d66e12f8f7e5f6664092',
+    ),
+    'league/oauth2server' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'league/uri' => 
+    array (
+      'pretty_version' => '6.4.0',
+      'version' => '6.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '09da64118eaf4c5d52f9923a1e6a5be1da52fd9a',
+    ),
+    'league/uri-components' => 
+    array (
+      'pretty_version' => '2.2.1',
+      'version' => '2.2.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '14bab20b05bc20d16dec17401a9027c679412589',
+    ),
+    'league/uri-interfaces' => 
+    array (
+      'pretty_version' => '2.3.0',
+      'version' => '2.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
+    ),
+    'liuggio/statsd-php-client' => 
+    array (
+      'pretty_version' => 'v1.0.18',
+      'version' => '1.0.18.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'c42e6d6687b7b2d7683186ec7f4f03351cc3dbca',
+    ),
+    'lncd/oauth2' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'maxmind-db/reader' => 
+    array (
+      'pretty_version' => 'v1.11.0',
+      'version' => '1.11.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b1f3c0699525336d09cc5161a2861268d9f2ae5b',
+    ),
+    'maxmind/web-service-common' => 
+    array (
+      'pretty_version' => 'v0.8.1',
+      'version' => '0.8.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
+    ),
+    'mediawiki/data-values' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'monolog/monolog' => 
+    array (
+      'pretty_version' => '2.2.0',
+      'version' => '2.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '1cb1cde8e8dd0f70cc0fe51354a59acad9302084',
+    ),
+    'mustangostang/spyc' => 
+    array (
+      'pretty_version' => '0.6.3',
+      'version' => '0.6.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
+    ),
+    'nikic/php-parser' => 
+    array (
+      'pretty_version' => 'v4.13.2',
+      'version' => '4.13.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '210577fe3cf7badcc5814d99455df46564f3c077',
+    ),
+    'onoi/message-reporter' => 
+    array (
+      'pretty_version' => '1.4.1',
+      'version' => '1.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cdc7f2c666cef581a1a1e31c62d5a6f2d8ba1482',
+    ),
+    'oojs/oojs-ui' => 
+    array (
+      'pretty_version' => 'v0.44.0',
+      'version' => '0.44.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '05823ff18922e5c0e51f3020d287c49933febc9b',
+    ),
+    'opis/json-schema' => 
+    array (
+      'pretty_version' => '1.1.0',
+      'version' => '1.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '39d8072be8657a329a284339994401066406c43b',
+    ),
+    'paragonie/random_compat' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '9.99.99',
+      ),
+    ),
+    'pear/console_getopt' => 
+    array (
+      'pretty_version' => 'v1.4.3',
+      'version' => '1.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
+    ),
+    'pear/mail' => 
+    array (
+      'pretty_version' => 'v1.4.1',
+      'version' => '1.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9609ed5e42ac5b221dfd9af85de005c59d418ee7',
+    ),
+    'pear/mail_mime' => 
+    array (
+      'pretty_version' => '1.10.11',
+      'version' => '1.10.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd4fb9ce61201593d0f8c6db629c45e29c3409c14',
+    ),
+    'pear/net_smtp' => 
+    array (
+      'pretty_version' => '1.10.0',
+      'version' => '1.10.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '51e5997b711fbd1e5a9a075634d4d682168537fa',
+    ),
+    'pear/net_socket' => 
+    array (
+      'pretty_version' => 'v1.2.2',
+      'version' => '1.2.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'bbe6a12bb4f7059dba161f6ddd43f369c0ec8d09',
+    ),
+    'pear/net_url2' => 
+    array (
+      'pretty_version' => 'v2.2.2',
+      'version' => '2.2.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '07fd055820dbf466ee3990abe96d0e40a8791f9d',
+    ),
+    'pear/pear-core-minimal' => 
+    array (
+      'pretty_version' => 'v1.10.11',
+      'version' => '1.10.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '68d0d32ada737153b7e93b8d3c710ebe70ac867d',
+    ),
+    'pear/pear_exception' => 
+    array (
+      'pretty_version' => 'v1.0.2',
+      'version' => '1.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b14fbe2ddb0b9f94f5b24cf08783d599f776fff0',
+    ),
+    'php-parallel-lint/php-parallel-lint' => 
+    array (
+      'pretty_version' => 'v1.3.2',
+      'version' => '1.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6483c9832e71973ed29cf71bd6b3f4fde438a9de',
+    ),
+    'pimple/pimple' => 
+    array (
+      'pretty_version' => 'v3.5.0',
+      'version' => '3.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
+    ),
+    'pleonasm/bloom-filter' => 
+    array (
+      'pretty_version' => '1.0.2',
+      'version' => '1.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4a3292c9f83a778c44271bf4e4f6be1204b87f7b',
+    ),
+    'psr/container' => 
+    array (
+      'pretty_version' => '1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
+    ),
+    'psr/container-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0.0',
+      ),
+    ),
+    'psr/http-client' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
+    ),
+    'psr/http-client-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/http-factory' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
+    ),
+    'psr/http-factory-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/http-message' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
+    ),
+    'psr/http-message-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/log' => 
+    array (
+      'pretty_version' => '1.1.4',
+      'version' => '1.1.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
+    ),
+    'psr/log-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0.0',
+        1 => '1.0|2.0',
+      ),
+    ),
+    'psr/simple-cache' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
+    ),
+    'psy/psysh' => 
+    array (
+      'pretty_version' => 'v0.11.1',
+      'version' => '0.11.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '570292577277f06f590635381a7f761a6cf4f026',
+    ),
+    'ralouphie/getallheaders' => 
+    array (
+      'pretty_version' => '3.0.3',
+      'version' => '3.0.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '120b605dfeb996808c31b6477290a714d356e822',
+    ),
+    'ramsey/collection' => 
+    array (
+      'pretty_version' => '1.1.4',
+      'version' => '1.1.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ab2237657ad99667a5143e32ba2683c8029563d4',
+    ),
+    'ramsey/uuid' => 
+    array (
+      'pretty_version' => '4.2.3',
+      'version' => '4.2.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df',
+    ),
+    'react/promise' => 
+    array (
+      'pretty_version' => 'v2.9.0',
+      'version' => '2.9.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '234f8fd1023c9158e2314fa9d7d0e6a83db42910',
+    ),
+    'rhumsaa/uuid' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '4.2.3',
+      ),
+    ),
+    'rsky/pear-core-min' => 
+    array (
+      'replaced' => 
+      array (
+        0 => 'v1.10.11',
+      ),
+    ),
+    'ruflin/elastica' => 
+    array (
+      'pretty_version' => '6.2.0',
+      'version' => '6.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6ef9cb6c01e0c167d31b424cb1f768ecc4ef9565',
+    ),
+    'serialization/serialization' => 
+    array (
+      'pretty_version' => '4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6fa293415e2b70c30c1e673d8bcd04d27dc15e44',
+    ),
+    'spomky-labs/base64url' => 
+    array (
+      'pretty_version' => 'v2.0.4',
+      'version' => '2.0.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '7752ce931ec285da4ed1f4c5aa27e45e097be61d',
+    ),
+    'spomky-labs/cbor-php' => 
+    array (
+      'pretty_version' => 'v1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b8e51e6a13606ab1dd8a64aa295651d8ad57ccd1',
+    ),
+    'symfony/console' => 
+    array (
+      'pretty_version' => 'v5.4.5',
+      'version' => '5.4.5.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd8111acc99876953f52fe16d4c50eb60940d49ad',
+    ),
+    'symfony/debug' => 
+    array (
+      'pretty_version' => 'v4.4.37',
+      'version' => '4.4.37.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5de6c6e7f52b364840e53851c126be4d71e60470',
+    ),
+    'symfony/deprecation-contracts' => 
+    array (
+      'pretty_version' => 'v2.5.0',
+      'version' => '2.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6f981ee24cf69ee7ce9736146d1c57c2780598a8',
+    ),
+    'symfony/polyfill-ctype' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.99',
+      ),
+    ),
+    'symfony/polyfill-intl-grapheme' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.1',
+      ),
+    ),
+    'symfony/polyfill-intl-idn' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.0',
+      ),
+    ),
+    'symfony/polyfill-intl-normalizer' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.1',
+      ),
+    ),
+    'symfony/polyfill-mbstring' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.99',
+      ),
+    ),
+    'symfony/polyfill-php72' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.12.0',
+      ),
+    ),
+    'symfony/polyfill-php73' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5',
+    ),
+    'symfony/polyfill-php80' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
+    ),
+    'symfony/polyfill-php81' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f',
+    ),
+    'symfony/process' => 
+    array (
+      'pretty_version' => 'v5.4.5',
+      'version' => '5.4.5.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '95440409896f90a5f85db07a32b517ecec17fa4c',
+    ),
+    'symfony/service-contracts' => 
+    array (
+      'pretty_version' => 'v2.4.1',
+      'version' => '2.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd664541b99d6fb0247ec5ff32e87238582236204',
+    ),
+    'symfony/string' => 
+    array (
+      'pretty_version' => 'v5.4.3',
+      'version' => '5.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '92043b7d8383e48104e411bc9434b260dbeb5a10',
+    ),
+    'symfony/translation' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a7ca9fdfffb0174209440c2ffa1dee228e15d95b',
+    ),
+    'symfony/translation-contracts' => 
+    array (
+      'pretty_version' => 'v2.5.0',
+      'version' => '2.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd28150f0f44ce854e942b671fc2620a98aae1b1e',
+    ),
+    'symfony/translation-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '2.3',
+      ),
+    ),
+    'symfony/validator' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ab461eab209e3be062ba9c609d37b37e8364dbe4',
+    ),
+    'symfony/var-dumper' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '294e9da6e2e0dd404e983daa5aa74253d92c05d0',
+    ),
+    'symfony/yaml' => 
+    array (
+      'pretty_version' => 'v5.4.3',
+      'version' => '5.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2',
+    ),
+    'thecodingmachine/safe' => 
+    array (
+      'pretty_version' => 'v1.3.3',
+      'version' => '1.3.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a8ab0876305a4cdaef31b2350fcb9811b5608dbc',
+    ),
+    'web-auth/cose-lib' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'efa6ec2ba4e840bc1316a493973c9916028afeeb',
+    ),
+    'web-auth/metadata-service' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ef40d2b7b68c4964247d13fab52e2fa8dbd65246',
+    ),
+    'web-auth/webauthn-lib' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5ef9b21c8e9f8a817e524ac93290d08a9f065b33',
+    ),
+    'wikimedia/assert' => 
+    array (
+      'pretty_version' => 'v0.5.1',
+      'version' => '0.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '27c983fddac1197dc37f6a7cec00fc02861529cd',
+    ),
+    'wikimedia/at-ease' => 
+    array (
+      'pretty_version' => 'v2.1.0',
+      'version' => '2.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33',
+    ),
+    'wikimedia/base-convert' => 
+    array (
+      'pretty_version' => 'v2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '449f0d0237cf1e0e71faec90680c88d4af6e711d',
+    ),
+    'wikimedia/cdb' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '70c724f88faa74338c9918f5b999445a615593e8',
+    ),
+    'wikimedia/cldr-plural-rule-parser' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83d78cb8018d5c0f66fd6d0efff6a8ae2de92d36',
+    ),
+    'wikimedia/common-passwords' => 
+    array (
+      'pretty_version' => 'v0.3.0',
+      'version' => '0.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5b51a88a27e17f485ba1295ee6916620686cd5a5',
+    ),
+    'wikimedia/composer-merge-plugin' => 
+    array (
+      'pretty_version' => 'v2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8ca2ed8ab97c8ebce6b39d9943e9909bb4f18912',
+    ),
+    'wikimedia/css-sanitizer' => 
+    array (
+      'pretty_version' => 'v3.0.2',
+      'version' => '3.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '718e2a79fc3fec4c7a43193b5e2ac3bae6756ee4',
+    ),
+    'wikimedia/dodo' => 
+    array (
+      'pretty_version' => 'v0.4.0',
+      'version' => '0.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '47e8176b8fd04ea00034d91b524f272e3745604a',
+    ),
+    'wikimedia/equivset' => 
+    array (
+      'pretty_version' => '1.4.2',
+      'version' => '1.4.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f41a259526a5597e1c3cb3cf745d1f1af6d36a00',
+    ),
+    'wikimedia/html-formatter' => 
+    array (
+      'pretty_version' => '3.0.1',
+      'version' => '3.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f18622f3384b9b7fed185bff2a46594aec92fa47',
+    ),
+    'wikimedia/idle-dom' => 
+    array (
+      'pretty_version' => 'v0.10.0',
+      'version' => '0.10.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '1d34b55cfe259fd26c541811581c2e1578b46727',
+    ),
+    'wikimedia/ip-set' => 
+    array (
+      'pretty_version' => '3.1.0',
+      'version' => '3.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9650ba486e21a84659fcfd46b3e5f2c4fa2b735c',
+    ),
+    'wikimedia/ip-utils' => 
+    array (
+      'pretty_version' => '4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f52a68b95fd3aac91cde3bdbc8654e2faa2fba38',
+    ),
+    'wikimedia/langconv' => 
+    array (
+      'pretty_version' => '0.4.2',
+      'version' => '0.4.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4bd255fd316df6650c489fa0f9b621c48458859b',
+    ),
+    'wikimedia/less.php' => 
+    array (
+      'pretty_version' => 'v3.1.0',
+      'version' => '3.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
+    ),
+    'wikimedia/lucene-explain-parser' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '82a90019468290a6009a9f61010bd0ffd7e8fc10',
+    ),
+    'wikimedia/minify' => 
+    array (
+      'pretty_version' => '2.3.0',
+      'version' => '2.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '61b35567bb3fb85c1086f30809cc67d5900c591f',
+    ),
+    'wikimedia/normalized-exception' => 
+    array (
+      'pretty_version' => 'v1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ed9fc13d75f65c80dc1a95d4792658c97fd782e6',
+    ),
+    'wikimedia/object-factory' => 
+    array (
+      'pretty_version' => 'v4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '20d19657cfbedb1e7bd61c6696e8a16ade232e5c',
+    ),
+    'wikimedia/parsoid' => 
+    array (
+      'pretty_version' => 'v0.16.0-a12',
+      'version' => '0.16.0.0-alpha12',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ed76d0a1d6e36e6ee1a95835d44531d4753bd0e6',
+    ),
+    'wikimedia/php-session-serializer' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '99e7e926f1b61f71623d517fe38d9eec8618c59d',
+    ),
+    'wikimedia/purtle' => 
+    array (
+      'pretty_version' => 'v1.0.8',
+      'version' => '1.0.8.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8f106f38ff811906853511a934d7f5e86dce3d20',
+    ),
+    'wikimedia/relpath' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b237d203c820cd1000f2c5ecad25de9fa7165612',
+    ),
+    'wikimedia/remex-html' => 
+    array (
+      'pretty_version' => '3.0.1',
+      'version' => '3.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '962d1b028d505f488b77ded093cacce9a0855f29',
+    ),
+    'wikimedia/request-timeout' => 
+    array (
+      'pretty_version' => '1.2.0',
+      'version' => '1.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e306a7cb1fb3a1ca3ce93992c56efb62b537c4bc',
+    ),
+    'wikimedia/running-stat' => 
+    array (
+      'pretty_version' => 'v1.2.1',
+      'version' => '1.2.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '60eebada7cc64b7073d90e7d4bab00efaafa0ba9',
+    ),
+    'wikimedia/scoped-callback' => 
+    array (
+      'pretty_version' => 'v3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '0a480d9a9772634697c77598726cf24606597bd0',
+    ),
+    'wikimedia/services' => 
+    array (
+      'pretty_version' => '2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5ef69a8a8b0d2ea115d08469bdab468f58fac820',
+    ),
+    'wikimedia/shellbox' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6b5abcd4a467b27b5ba4fc28f7730ea5d01367a1',
+    ),
+    'wikimedia/testing-access-wrapper' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '280e613c76f481f2fe90e0ea22361080b6ab0d65',
+    ),
+    'wikimedia/textcat' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'dfdfb1c41bb016814a9d4da3aa68b62437b54a82',
+    ),
+    'wikimedia/timestamp' => 
+    array (
+      'pretty_version' => 'v3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '42ce5586d2189826e28ebcf4cedc96226b6d77e2',
+    ),
+    'wikimedia/utfnormal' => 
+    array (
+      'pretty_version' => '3.0.2',
+      'version' => '3.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e690d29487a6ee346bcf4cbf5a6fd89170fa2306',
+    ),
+    'wikimedia/wait-condition-loop' => 
+    array (
+      'pretty_version' => 'v2.0.2',
+      'version' => '2.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9bb0894e8c5195d43b2f2babbe4cc8f36bd5be0e',
+    ),
+    'wikimedia/wikipeg' => 
+    array (
+      'pretty_version' => '2.0.6',
+      'version' => '2.0.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9a92384ae11e1a3b7ecfe0feef1809b1af73889b',
+    ),
+    'wikimedia/wrappedstring' => 
+    array (
+      'pretty_version' => 'v4.0.1',
+      'version' => '4.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '0d526868d92fa855c70a845336a777c63b30b400',
+    ),
+    'wikimedia/xmp-reader' => 
+    array (
+      'pretty_version' => '0.8.1',
+      'version' => '0.8.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4fc577e28e09eec165b64ed74ce878ba4ea45a35',
+    ),
+    'wikimedia/zest-css' => 
+    array (
+      'pretty_version' => '2.0.2',
+      'version' => '2.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '423c867462801fda08a1c31009ec19d91a68b410',
+    ),
+    'wmde/php-vuejs-templating' => 
+    array (
+      'pretty_version' => '1.0.3',
+      'version' => '1.0.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f0c35ef0875d05fe74c9a0e0361b888e5c6818d0',
+    ),
+    'zordius/lightncandy' => 
+    array (
+      'pretty_version' => 'v1.2.6',
+      'version' => '1.2.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b451f73e8b5c73e62e365997ba3c993a0376b72a',
+    ),
+  ),
+);
     private static $canGetVendors;
-
-    /**
-     * @var array[]
-     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
-     */
     private static $installedByVendor = array();
 
     /**
@@ -56,6 +1348,7 @@ class InstalledVersions
             $packages[] = array_keys($installed['versions']);
         }
 
+
         if (1 === \count($packages)) {
             return $packages[0];
         }
@@ -63,42 +1356,19 @@ class InstalledVersions
         return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
     }
 
-    /**
-     * Returns a list of all package names with a specific type e.g. 'library'
-     *
-     * @param  string   $type
-     * @return string[]
-     * @psalm-return list<string>
-     */
-    public static function getInstalledPackagesByType($type)
-    {
-        $packagesByType = array();
-
-        foreach (self::getInstalled() as $installed) {
-            foreach ($installed['versions'] as $name => $package) {
-                if (isset($package['type']) && $package['type'] === $type) {
-                    $packagesByType[] = $name;
-                }
-            }
-        }
-
-        return $packagesByType;
-    }
-
     /**
      * Checks whether the given package is installed
      *
      * This also returns true if the package name is provided or replaced by another package
      *
      * @param  string $packageName
-     * @param  bool   $includeDevRequirements
      * @return bool
      */
-    public static function isInstalled($packageName, $includeDevRequirements = true)
+    public static function isInstalled($packageName)
     {
         foreach (self::getInstalled() as $installed) {
             if (isset($installed['versions'][$packageName])) {
-                return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
+                return true;
             }
         }
 
@@ -112,9 +1382,10 @@ class InstalledVersions
      *
      *   Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
      *
-     * @param  VersionParser $parser      Install composer/semver to have access to this class and functionality
-     * @param  string        $packageName
-     * @param  string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     * @param VersionParser $parser      Install composer/semver to have access to this class and functionality
+     * @param string        $packageName
+     * @param string|null   $constraint  A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
+     *
      * @return bool
      */
     public static function satisfies(VersionParser $parser, $packageName, $constraint)
@@ -224,26 +1495,9 @@ class InstalledVersions
         throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
     }
 
-    /**
-     * @param  string      $packageName
-     * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
-     */
-    public static function getInstallPath($packageName)
-    {
-        foreach (self::getInstalled() as $installed) {
-            if (!isset($installed['versions'][$packageName])) {
-                continue;
-            }
-
-            return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
-        }
-
-        throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
-    }
-
     /**
      * @return array
-     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}
      */
     public static function getRootPackage()
     {
@@ -255,38 +1509,14 @@ class InstalledVersions
     /**
      * Returns the raw installed.php data for custom implementations
      *
-     * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
      * @return array[]
-     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>}
      */
     public static function getRawData()
     {
-        @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
-
-        if (null === self::$installed) {
-            // only require the installed.php file if this file is loaded from its dumped location,
-            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
-            if (substr(__DIR__, -8, 1) !== 'C') {
-                self::$installed = include __DIR__ . '/installed.php';
-            } else {
-                self::$installed = array();
-            }
-        }
-
         return self::$installed;
     }
 
-    /**
-     * Returns the raw data of all installed.php which are currently loaded for custom implementations
-     *
-     * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
-     */
-    public static function getAllRawData()
-    {
-        return self::getInstalled();
-    }
-
     /**
      * Lets you reload the static array from another file
      *
@@ -303,7 +1533,7 @@ class InstalledVersions
      * @param  array[] $data A vendor/composer/installed.php data set
      * @return void
      *
-     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>} $data
      */
     public static function reload($data)
     {
@@ -313,7 +1543,6 @@ class InstalledVersions
 
     /**
      * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
      */
     private static function getInstalled()
     {
@@ -324,27 +1553,16 @@ class InstalledVersions
         $installed = array();
 
         if (self::$canGetVendors) {
+            // @phpstan-ignore-next-line
             foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
                 if (isset(self::$installedByVendor[$vendorDir])) {
                     $installed[] = self::$installedByVendor[$vendorDir];
                 } elseif (is_file($vendorDir.'/composer/installed.php')) {
                     $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
-                    if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
-                        self::$installed = $installed[count($installed) - 1];
-                    }
                 }
             }
         }
 
-        if (null === self::$installed) {
-            // only require the installed.php file if this file is loaded from its dumped location,
-            // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
-            if (substr(__DIR__, -8, 1) !== 'C') {
-                self::$installed = require __DIR__ . '/installed.php';
-            } else {
-                self::$installed = array();
-            }
-        }
         $installed[] = self::$installed;
 
         return $installed;
diff --git a/composer/LICENSE b/composer/LICENSE
index f27399a..62ecfd8 100644
--- a/composer/LICENSE
+++ b/composer/LICENSE
@@ -1,4 +1,3 @@
-
 Copyright (c) Nils Adermann, Jordi Boggiano
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -18,4 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 THE SOFTWARE.
-
diff --git a/composer/autoload_classmap.php b/composer/autoload_classmap.php
index 2b60e6c..25ffaf6 100644
--- a/composer/autoload_classmap.php
+++ b/composer/autoload_classmap.php
@@ -2,7 +2,7 @@
 
 // autoload_classmap.php @generated by Composer
 
-$vendorDir = dirname(__DIR__);
+$vendorDir = dirname(dirname(__FILE__));
 $baseDir = $vendorDir;
 
 return array(
@@ -875,6 +875,41 @@ return array(
     'GuzzleHttp\\Utils' => $vendorDir . '/guzzlehttp/guzzle/src/Utils.php',
     'HtmlFormatter\\HtmlFormatter' => $vendorDir . '/wikimedia/html-formatter/src/HtmlFormatter.php',
     'Image_XMP' => $vendorDir . '/james-heinrich/getid3/getid3/module.tag.xmp.php',
+    'JakubOnderka\\PhpParallelLint\\Application' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Application.php',
+    'JakubOnderka\\PhpParallelLint\\ArrayIterator' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Settings.php',
+    'JakubOnderka\\PhpParallelLint\\Blame' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+    'JakubOnderka\\PhpParallelLint\\CheckstyleOutput' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\ConsoleWriter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\Contracts\\SyntaxErrorCallback' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php',
+    'JakubOnderka\\PhpParallelLint\\Error' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+    'JakubOnderka\\PhpParallelLint\\ErrorFormatter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php',
+    'JakubOnderka\\PhpParallelLint\\Exception' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\FileWriter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\GitLabOutput' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\IWriter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\InvalidArgumentException' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\JsonOutput' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\Manager' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Manager.php',
+    'JakubOnderka\\PhpParallelLint\\MultipleWriter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\NotExistsClassException' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\NotExistsPathException' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\NotImplementCallbackException' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\NullWriter' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\Output' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\ParallelLint' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/ParallelLint.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\GitBlameProcess' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\LintProcess' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\PhpExecutable' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\PhpProcess' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\Process' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/Process.php',
+    'JakubOnderka\\PhpParallelLint\\Process\\SkipLintProcess' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php',
+    'JakubOnderka\\PhpParallelLint\\RecursiveDirectoryFilterIterator' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Manager.php',
+    'JakubOnderka\\PhpParallelLint\\Result' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Result.php',
+    'JakubOnderka\\PhpParallelLint\\RunTimeException' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+    'JakubOnderka\\PhpParallelLint\\Settings' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Settings.php',
+    'JakubOnderka\\PhpParallelLint\\SyntaxError' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+    'JakubOnderka\\PhpParallelLint\\TextOutput' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+    'JakubOnderka\\PhpParallelLint\\TextOutputColored' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/Output.php',
     'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
     'JsonSchema\\Constraints\\BaseConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php',
     'JsonSchema\\Constraints\\CollectionConstraint' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php',
@@ -919,6 +954,7 @@ return array(
     'JsonSchema\\Uri\\UriResolver' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php',
     'JsonSchema\\Uri\\UriRetriever' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php',
     'JsonSchema\\Validator' => $vendorDir . '/justinrainbow/json-schema/src/JsonSchema/Validator.php',
+    'JsonSerializable' => $vendorDir . '/php-parallel-lint/php-parallel-lint/src/polyfill.php',
     'Lcobucci\\JWT\\Builder' => $vendorDir . '/lcobucci/jwt/src/Builder.php',
     'Lcobucci\\JWT\\Claim' => $vendorDir . '/lcobucci/jwt/src/Claim.php',
     'Lcobucci\\JWT\\Claim\\Basic' => $vendorDir . '/lcobucci/jwt/src/Claim/Basic.php',
diff --git a/composer/autoload_files.php b/composer/autoload_files.php
index 607153b..fa0d7bd 100644
--- a/composer/autoload_files.php
+++ b/composer/autoload_files.php
@@ -2,27 +2,29 @@
 
 // autoload_files.php @generated by Composer
 
-$vendorDir = dirname(__DIR__);
+$vendorDir = dirname(dirname(__FILE__));
 $baseDir = $vendorDir;
 
 return array(
     'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
-    'a4ecaeafb8cfb009ad0e052c90355e98' => $vendorDir . '/beberlei/assert/lib/Assert/functions.php',
     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
-    'eccc0347283a01e62f5536bcf76b6e62' => $vendorDir . '/wikimedia/at-ease/src/Wikimedia/Functions.php',
-    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
-    'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php',
     '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
-    'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
-    'c3f7f0e81464740a933532e81fa26cc7' => $vendorDir . '/wikimedia/base-convert/src/Functions.php',
+    'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php',
+    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
+    'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
+    'a4ecaeafb8cfb009ad0e052c90355e98' => $vendorDir . '/beberlei/assert/lib/Assert/functions.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+    '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
+    'eccc0347283a01e62f5536bcf76b6e62' => $vendorDir . '/wikimedia/at-ease/src/Wikimedia/Functions.php',
+    '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php',
+    'c3f7f0e81464740a933532e81fa26cc7' => $vendorDir . '/wikimedia/base-convert/src/Functions.php',
     '256c1545158fc915c75e51a931bdba60' => $vendorDir . '/lcobucci/jwt/compat/class-aliases.php',
     '0d273777b2b0d96e49fb3d800c6b0e81' => $vendorDir . '/lcobucci/jwt/compat/json-exception-polyfill.php',
     'd6b246ac924292702635bb2349f4a64b' => $vendorDir . '/lcobucci/jwt/compat/lcobucci-clock-polyfill.php',
     'e39a8b23c42d4e1452234d762b03835a' => $vendorDir . '/ramsey/uuid/src/functions.php',
     '23c18046f52bef3eea034657bafda50f' => $vendorDir . '/symfony/polyfill-php81/bootstrap.php',
-    '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
+    'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php',
     '51fcf4e06c07cc00c920b44bcd900e7a' => $vendorDir . '/thecodingmachine/safe/deprecated/apc.php',
     '47f619d9197b36cf5ab70738d7743fe2' => $vendorDir . '/thecodingmachine/safe/deprecated/libevent.php',
     'ea6bb8a12ef9b68f6ada99058e530760' => $vendorDir . '/thecodingmachine/safe/deprecated/mssql.php',
@@ -116,7 +118,5 @@ return array(
     'c15f8000750e4e04ba559d9745044427' => $vendorDir . '/data-values/number/Number.php',
     '3ef87127dc6892a0a78f223558a0b940' => $vendorDir . '/diff/diff/Diff.php',
     '04c6c5c2f7095ccf6c481d3e53e1776f' => $vendorDir . '/mustangostang/spyc/Spyc.php',
-    '801c31d8ed748cfa537fa45402288c95' => $vendorDir . '/psy/psysh/src/functions.php',
-    'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php',
     '6513700b70192b7dfd0e5e9fc8082cf3' => $vendorDir . '/wikimedia/relpath/src/Wikimedia/RelPath.php',
 );
diff --git a/composer/autoload_namespaces.php b/composer/autoload_namespaces.php
index 40bbb76..b98cc7e 100644
--- a/composer/autoload_namespaces.php
+++ b/composer/autoload_namespaces.php
@@ -2,7 +2,7 @@
 
 // autoload_namespaces.php @generated by Composer
 
-$vendorDir = dirname(__DIR__);
+$vendorDir = dirname(dirname(__FILE__));
 $baseDir = $vendorDir;
 
 return array(
diff --git a/composer/autoload_psr4.php b/composer/autoload_psr4.php
index 3537f71..c7e10eb 100644
--- a/composer/autoload_psr4.php
+++ b/composer/autoload_psr4.php
@@ -2,7 +2,7 @@
 
 // autoload_psr4.php @generated by Composer
 
-$vendorDir = dirname(__DIR__);
+$vendorDir = dirname(dirname(__FILE__));
 $baseDir = $vendorDir;
 
 return array(
diff --git a/composer/autoload_real.php b/composer/autoload_real.php
index 70a0099..3a622c1 100644
--- a/composer/autoload_real.php
+++ b/composer/autoload_real.php
@@ -25,20 +25,33 @@ class ComposerAutoloaderInit_mediawiki_vendor
         require __DIR__ . '/platform_check.php';
 
         spl_autoload_register(array('ComposerAutoloaderInit_mediawiki_vendor', 'loadClassLoader'), true, false);
-        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
         spl_autoload_unregister(array('ComposerAutoloaderInit_mediawiki_vendor', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         $includePaths[] = get_include_path();
         set_include_path(implode(PATH_SEPARATOR, $includePaths));
 
-        require __DIR__ . '/autoload_static.php';
-        \Composer\Autoload\ComposerStaticInit_mediawiki_vendor::getInitializer($loader)();
+        $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
+        if ($useStaticLoader) {
+            require __DIR__ . '/autoload_static.php';
+
+            call_user_func(\Composer\Autoload\ComposerStaticInit_mediawiki_vendor::getInitializer($loader));
+        } else {
+            $classMap = require __DIR__ . '/autoload_classmap.php';
+            if ($classMap) {
+                $loader->addClassMap($classMap);
+            }
+        }
 
         $loader->setClassMapAuthoritative(true);
         $loader->register(false);
 
-        $includeFiles = \Composer\Autoload\ComposerStaticInit_mediawiki_vendor::$files;
+        if ($useStaticLoader) {
+            $includeFiles = Composer\Autoload\ComposerStaticInit_mediawiki_vendor::$files;
+        } else {
+            $includeFiles = require __DIR__ . '/autoload_files.php';
+        }
         foreach ($includeFiles as $fileIdentifier => $file) {
             composerRequire_mediawiki_vendor($fileIdentifier, $file);
         }
@@ -47,16 +60,11 @@ class ComposerAutoloaderInit_mediawiki_vendor
     }
 }
 
-/**
- * @param string $fileIdentifier
- * @param string $file
- * @return void
- */
 function composerRequire_mediawiki_vendor($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
-        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
-
         require $file;
+
+        $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
     }
 }
diff --git a/composer/autoload_static.php b/composer/autoload_static.php
index d6e694a..65944d3 100644
--- a/composer/autoload_static.php
+++ b/composer/autoload_static.php
@@ -8,22 +8,24 @@ class ComposerStaticInit_mediawiki_vendor
 {
     public static $files = array (
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
-        'a4ecaeafb8cfb009ad0e052c90355e98' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/functions.php',
         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
-        'eccc0347283a01e62f5536bcf76b6e62' => __DIR__ . '/..' . '/wikimedia/at-ease/src/Wikimedia/Functions.php',
-        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
-        'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
         '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
-        'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
-        'c3f7f0e81464740a933532e81fa26cc7' => __DIR__ . '/..' . '/wikimedia/base-convert/src/Functions.php',
+        'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
+        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
+        'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
+        'a4ecaeafb8cfb009ad0e052c90355e98' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/functions.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
+        '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
+        'eccc0347283a01e62f5536bcf76b6e62' => __DIR__ . '/..' . '/wikimedia/at-ease/src/Wikimedia/Functions.php',
+        '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php',
+        'c3f7f0e81464740a933532e81fa26cc7' => __DIR__ . '/..' . '/wikimedia/base-convert/src/Functions.php',
         '256c1545158fc915c75e51a931bdba60' => __DIR__ . '/..' . '/lcobucci/jwt/compat/class-aliases.php',
         '0d273777b2b0d96e49fb3d800c6b0e81' => __DIR__ . '/..' . '/lcobucci/jwt/compat/json-exception-polyfill.php',
         'd6b246ac924292702635bb2349f4a64b' => __DIR__ . '/..' . '/lcobucci/jwt/compat/lcobucci-clock-polyfill.php',
         'e39a8b23c42d4e1452234d762b03835a' => __DIR__ . '/..' . '/ramsey/uuid/src/functions.php',
         '23c18046f52bef3eea034657bafda50f' => __DIR__ . '/..' . '/symfony/polyfill-php81/bootstrap.php',
-        '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
+        'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php',
         '51fcf4e06c07cc00c920b44bcd900e7a' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/apc.php',
         '47f619d9197b36cf5ab70738d7743fe2' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/libevent.php',
         'ea6bb8a12ef9b68f6ada99058e530760' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/mssql.php',
@@ -117,8 +119,6 @@ class ComposerStaticInit_mediawiki_vendor
         'c15f8000750e4e04ba559d9745044427' => __DIR__ . '/..' . '/data-values/number/Number.php',
         '3ef87127dc6892a0a78f223558a0b940' => __DIR__ . '/..' . '/diff/diff/Diff.php',
         '04c6c5c2f7095ccf6c481d3e53e1776f' => __DIR__ . '/..' . '/mustangostang/spyc/Spyc.php',
-        '801c31d8ed748cfa537fa45402288c95' => __DIR__ . '/..' . '/psy/psysh/src/functions.php',
-        'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php',
         '6513700b70192b7dfd0e5e9fc8082cf3' => __DIR__ . '/..' . '/wikimedia/relpath/src/Wikimedia/RelPath.php',
     );
 
@@ -1636,6 +1636,41 @@ class ComposerStaticInit_mediawiki_vendor
         'GuzzleHttp\\Utils' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/Utils.php',
         'HtmlFormatter\\HtmlFormatter' => __DIR__ . '/..' . '/wikimedia/html-formatter/src/HtmlFormatter.php',
         'Image_XMP' => __DIR__ . '/..' . '/james-heinrich/getid3/getid3/module.tag.xmp.php',
+        'JakubOnderka\\PhpParallelLint\\Application' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Application.php',
+        'JakubOnderka\\PhpParallelLint\\ArrayIterator' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Settings.php',
+        'JakubOnderka\\PhpParallelLint\\Blame' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+        'JakubOnderka\\PhpParallelLint\\CheckstyleOutput' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\ConsoleWriter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\Contracts\\SyntaxErrorCallback' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php',
+        'JakubOnderka\\PhpParallelLint\\Error' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+        'JakubOnderka\\PhpParallelLint\\ErrorFormatter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php',
+        'JakubOnderka\\PhpParallelLint\\Exception' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\FileWriter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\GitLabOutput' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\IWriter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\InvalidArgumentException' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\JsonOutput' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\Manager' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Manager.php',
+        'JakubOnderka\\PhpParallelLint\\MultipleWriter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\NotExistsClassException' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\NotExistsPathException' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\NotImplementCallbackException' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\NullWriter' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\Output' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\ParallelLint' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/ParallelLint.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\GitBlameProcess' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\LintProcess' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\PhpExecutable' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\PhpProcess' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\Process' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/Process.php',
+        'JakubOnderka\\PhpParallelLint\\Process\\SkipLintProcess' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php',
+        'JakubOnderka\\PhpParallelLint\\RecursiveDirectoryFilterIterator' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Manager.php',
+        'JakubOnderka\\PhpParallelLint\\Result' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Result.php',
+        'JakubOnderka\\PhpParallelLint\\RunTimeException' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/exceptions.php',
+        'JakubOnderka\\PhpParallelLint\\Settings' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Settings.php',
+        'JakubOnderka\\PhpParallelLint\\SyntaxError' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Error.php',
+        'JakubOnderka\\PhpParallelLint\\TextOutput' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
+        'JakubOnderka\\PhpParallelLint\\TextOutputColored' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/Output.php',
         'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
         'JsonSchema\\Constraints\\BaseConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/BaseConstraint.php',
         'JsonSchema\\Constraints\\CollectionConstraint' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Constraints/CollectionConstraint.php',
@@ -1680,6 +1715,7 @@ class ComposerStaticInit_mediawiki_vendor
         'JsonSchema\\Uri\\UriResolver' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriResolver.php',
         'JsonSchema\\Uri\\UriRetriever' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Uri/UriRetriever.php',
         'JsonSchema\\Validator' => __DIR__ . '/..' . '/justinrainbow/json-schema/src/JsonSchema/Validator.php',
+        'JsonSerializable' => __DIR__ . '/..' . '/php-parallel-lint/php-parallel-lint/src/polyfill.php',
         'Lcobucci\\JWT\\Builder' => __DIR__ . '/..' . '/lcobucci/jwt/src/Builder.php',
         'Lcobucci\\JWT\\Claim' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim.php',
         'Lcobucci\\JWT\\Claim\\Basic' => __DIR__ . '/..' . '/lcobucci/jwt/src/Claim/Basic.php',
diff --git a/composer/include_paths.php b/composer/include_paths.php
index 5a92138..8a19ab6 100644
--- a/composer/include_paths.php
+++ b/composer/include_paths.php
@@ -2,7 +2,7 @@
 
 // include_paths.php @generated by Composer
 
-$vendorDir = dirname(__DIR__);
+$vendorDir = dirname(dirname(__FILE__));
 $baseDir = $vendorDir;
 
 return array(
diff --git a/composer/installed.json b/composer/installed.json
index 4e3782a..394c194 100644
--- a/composer/installed.json
+++ b/composer/installed.json
@@ -3509,6 +3509,66 @@
             },
             "install-path": "../pear/pear_exception"
         },
+        {
+            "name": "php-parallel-lint/php-parallel-lint",
+            "version": "v1.3.2",
+            "version_normalized": "1.3.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-parallel-lint/PHP-Parallel-Lint.git",
+                "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-parallel-lint/PHP-Parallel-Lint/zipball/6483c9832e71973ed29cf71bd6b3f4fde438a9de",
+                "reference": "6483c9832e71973ed29cf71bd6b3f4fde438a9de",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": ">=5.3.0"
+            },
+            "replace": {
+                "grogy/php-parallel-lint": "*",
+                "jakub-onderka/php-parallel-lint": "*"
+            },
+            "require-dev": {
+                "nette/tester": "^1.3 || ^2.0",
+                "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
+                "squizlabs/php_codesniffer": "^3.6"
+            },
+            "suggest": {
+                "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+            },
+            "time": "2022-02-21T12:50:22+00:00",
+            "bin": [
+                "parallel-lint"
+            ],
+            "type": "library",
+            "installation-source": "dist",
+            "autoload": {
+                "classmap": [
+                    "./src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "ahoj@jakubonderka.cz"
+                }
+            ],
+            "description": "This tool check syntax of PHP files about 20x faster than serial check.",
+            "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+            "support": {
+                "issues": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues",
+                "source": "https://github.com/php-parallel-lint/PHP-Parallel-Lint/tree/v1.3.2"
+            },
+            "install-path": "../php-parallel-lint/php-parallel-lint"
+        },
         {
             "name": "pimple/pimple",
             "version": "v3.5.0",
@@ -8557,6 +8617,8 @@
             "install-path": "../zordius/lightncandy"
         }
     ],
-    "dev": false,
-    "dev-package-names": []
+    "dev": true,
+    "dev-package-names": [
+        "php-parallel-lint/php-parallel-lint"
+    ]
 }
diff --git a/composer/installed.php b/composer/installed.php
index 9cd4e53..1ef3a42 100644
--- a/composer/installed.php
+++ b/composer/installed.php
@@ -1,1269 +1,1310 @@
-<?php return array(
-    'root' => array(
-        'pretty_version' => 'dev-master',
-        'version' => 'dev-master',
-        'type' => 'library',
-        'install_path' => __DIR__ . '/../',
-        'aliases' => array(),
-        'reference' => '2fe2a139f7b5af9ebea01f96f09e67b97ce95a3b',
-        'name' => '__root__',
-        'dev' => false,
-    ),
-    'versions' => array(
-        '__root__' => array(
-            'pretty_version' => 'dev-master',
-            'version' => 'dev-master',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../',
-            'aliases' => array(),
-            'reference' => '2fe2a139f7b5af9ebea01f96f09e67b97ce95a3b',
-            'dev_requirement' => false,
-        ),
-        'beberlei/assert' => array(
-            'pretty_version' => 'v3.3.2',
-            'version' => '3.3.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../beberlei/assert',
-            'aliases' => array(),
-            'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
-            'dev_requirement' => false,
-        ),
-        'brick/math' => array(
-            'pretty_version' => '0.8.17',
-            'version' => '0.8.17.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../brick/math',
-            'aliases' => array(),
-            'reference' => 'e6f8e7d04346a95be89580f8c2c22d6c3fa65556',
-            'dev_requirement' => false,
-        ),
-        'christian-riesen/base32' => array(
-            'pretty_version' => '1.6.0',
-            'version' => '1.6.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../christian-riesen/base32',
-            'aliases' => array(),
-            'reference' => '2e82dab3baa008e24a505649b0d583c31d31e894',
-            'dev_requirement' => false,
-        ),
-        'composer/ca-bundle' => array(
-            'pretty_version' => '1.3.1',
-            'version' => '1.3.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/./ca-bundle',
-            'aliases' => array(),
-            'reference' => '4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b',
-            'dev_requirement' => false,
-        ),
-        'composer/semver' => array(
-            'pretty_version' => '3.3.2',
-            'version' => '3.3.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/./semver',
-            'aliases' => array(),
-            'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9',
-            'dev_requirement' => false,
-        ),
-        'cssjanus/cssjanus' => array(
-            'pretty_version' => 'v2.1.0',
-            'version' => '2.1.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../cssjanus/cssjanus',
-            'aliases' => array(),
-            'reference' => 'de7483c0805750a6462b372eab55d022d555df02',
-            'dev_requirement' => false,
-        ),
-        'data-values/common' => array(
-            'pretty_version' => '1.0.0',
-            'version' => '1.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/common',
-            'aliases' => array(),
-            'reference' => '315bd95ef8e5c360ce8a1cf02c0eef35bbb92561',
-            'dev_requirement' => false,
-        ),
-        'data-values/data-values' => array(
-            'pretty_version' => '3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/data-values',
-            'aliases' => array(),
-            'reference' => '63dee286f8bb4ae7899c2d2e8d439e7b5332cc49',
-            'dev_requirement' => false,
-        ),
-        'data-values/geo' => array(
-            'pretty_version' => '4.2.3',
-            'version' => '4.2.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/geo',
-            'aliases' => array(),
-            'reference' => 'a08d5ce38c2cb789ff8942e9082ce04dfc55a850',
-            'dev_requirement' => false,
-        ),
-        'data-values/interfaces' => array(
-            'pretty_version' => '1.0.0',
-            'version' => '1.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/interfaces',
-            'aliases' => array(),
-            'reference' => '244d078954bc05edf8f8c6b088e848289171c3a8',
-            'dev_requirement' => false,
-        ),
-        'data-values/number' => array(
-            'pretty_version' => '0.11.1',
-            'version' => '0.11.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/number',
-            'aliases' => array(),
-            'reference' => '3177a4e11fee862d59a4f66c6b35408e9c609843',
-            'dev_requirement' => false,
-        ),
-        'data-values/serialization' => array(
-            'pretty_version' => '1.2.4',
-            'version' => '1.2.4.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/serialization',
-            'aliases' => array(),
-            'reference' => '5bc3640f7ddb642479ff490fae64fcf19c7e75af',
-            'dev_requirement' => false,
-        ),
-        'data-values/time' => array(
-            'pretty_version' => '1.0.4',
-            'version' => '1.0.4.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../data-values/time',
-            'aliases' => array(),
-            'reference' => 'abbb585f2c71ca8a1ac9aea858cf5ba6b8920320',
-            'dev_requirement' => false,
-        ),
-        'defuse/php-encryption' => array(
-            'pretty_version' => 'v2.3.1',
-            'version' => '2.3.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../defuse/php-encryption',
-            'aliases' => array(),
-            'reference' => '77880488b9954b7884c25555c2a0ea9e7053f9d2',
-            'dev_requirement' => false,
-        ),
-        'diff/diff' => array(
-            'pretty_version' => '3.2.0',
-            'version' => '3.2.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../diff/diff',
-            'aliases' => array(),
-            'reference' => '89bbd224a9ad6cc6cb8e01263ae5add2564e7cf0',
-            'dev_requirement' => false,
-        ),
-        'elasticsearch/elasticsearch' => array(
-            'pretty_version' => 'v6.7.2',
-            'version' => '6.7.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../elasticsearch/elasticsearch',
-            'aliases' => array(),
-            'reference' => '9ba89f905ebf699e72dacffa410331c7fecc8255',
-            'dev_requirement' => false,
-        ),
-        'fgrosse/phpasn1' => array(
-            'pretty_version' => 'v2.4.0',
-            'version' => '2.4.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../fgrosse/phpasn1',
-            'aliases' => array(),
-            'reference' => 'eef488991d53e58e60c9554b09b1201ca5ba9296',
-            'dev_requirement' => false,
-        ),
-        'firebase/php-jwt' => array(
-            'pretty_version' => 'v5.5.1',
-            'version' => '5.5.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../firebase/php-jwt',
-            'aliases' => array(),
-            'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
-            'dev_requirement' => false,
-        ),
-        'geoip2/geoip2' => array(
-            'pretty_version' => 'v2.12.2',
-            'version' => '2.12.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../geoip2/geoip2',
-            'aliases' => array(),
-            'reference' => '83adb44ac4b9553d36b579a14673ed124583082f',
-            'dev_requirement' => false,
-        ),
-        'guzzlehttp/guzzle' => array(
-            'pretty_version' => '7.4.1',
-            'version' => '7.4.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
-            'aliases' => array(),
-            'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79',
-            'dev_requirement' => false,
-        ),
-        'guzzlehttp/promises' => array(
-            'pretty_version' => '1.5.1',
-            'version' => '1.5.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../guzzlehttp/promises',
-            'aliases' => array(),
-            'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
-            'dev_requirement' => false,
-        ),
-        'guzzlehttp/psr7' => array(
-            'pretty_version' => '2.1.2',
-            'version' => '2.1.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../guzzlehttp/psr7',
-            'aliases' => array(),
-            'reference' => 'b36d463b214c76ed12b924bae0445f3531bb1686',
-            'dev_requirement' => false,
-        ),
-        'guzzlehttp/ringphp' => array(
-            'pretty_version' => '1.1.1',
-            'version' => '1.1.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../guzzlehttp/ringphp',
-            'aliases' => array(),
-            'reference' => '5e2a174052995663dd68e6b5ad838afd47dd615b',
-            'dev_requirement' => false,
-        ),
-        'guzzlehttp/streams' => array(
-            'pretty_version' => '3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../guzzlehttp/streams',
-            'aliases' => array(),
-            'reference' => '47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5',
-            'dev_requirement' => false,
-        ),
-        'jakobo/hotp-php' => array(
-            'pretty_version' => 'v2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../jakobo/hotp-php',
-            'aliases' => array(),
-            'reference' => 'ff2f13d1918001e54b3f49deb1d366bcfcc98437',
-            'dev_requirement' => false,
-        ),
-        'james-heinrich/getid3' => array(
-            'pretty_version' => 'v1.9.21',
-            'version' => '1.9.21.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../james-heinrich/getid3',
-            'aliases' => array(),
-            'reference' => '36f5dabb1325415a4b07a401113f8db2eb81eca1',
-            'dev_requirement' => false,
-        ),
-        'justinrainbow/json-schema' => array(
-            'pretty_version' => '5.2.11',
-            'version' => '5.2.11.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../justinrainbow/json-schema',
-            'aliases' => array(),
-            'reference' => '2ab6744b7296ded80f8cc4f9509abbff393399aa',
-            'dev_requirement' => false,
-        ),
-        'lcobucci/jwt' => array(
-            'pretty_version' => '3.4.6',
-            'version' => '3.4.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../lcobucci/jwt',
-            'aliases' => array(),
-            'reference' => '3ef8657a78278dfeae7707d51747251db4176240',
-            'dev_requirement' => false,
-        ),
-        'league/event' => array(
-            'pretty_version' => '2.2.0',
-            'version' => '2.2.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../league/event',
-            'aliases' => array(),
-            'reference' => 'd2cc124cf9a3fab2bb4ff963307f60361ce4d119',
-            'dev_requirement' => false,
-        ),
-        'league/oauth2-server' => array(
-            'pretty_version' => 'dev-v9.0.0-alpha',
-            'version' => 'dev-v9.0.0-alpha',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../league/oauth2-server',
-            'aliases' => array(
-                0 => '9999999-dev',
-                1 => '9.0.0',
-            ),
-            'reference' => '61d770dc284898ea2905d66e12f8f7e5f6664092',
-            'dev_requirement' => false,
-        ),
-        'league/oauth2server' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '*',
-            ),
-        ),
-        'league/uri' => array(
-            'pretty_version' => '6.4.0',
-            'version' => '6.4.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../league/uri',
-            'aliases' => array(),
-            'reference' => '09da64118eaf4c5d52f9923a1e6a5be1da52fd9a',
-            'dev_requirement' => false,
-        ),
-        'league/uri-components' => array(
-            'pretty_version' => '2.2.1',
-            'version' => '2.2.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../league/uri-components',
-            'aliases' => array(),
-            'reference' => '14bab20b05bc20d16dec17401a9027c679412589',
-            'dev_requirement' => false,
-        ),
-        'league/uri-interfaces' => array(
-            'pretty_version' => '2.3.0',
-            'version' => '2.3.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../league/uri-interfaces',
-            'aliases' => array(),
-            'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
-            'dev_requirement' => false,
-        ),
-        'liuggio/statsd-php-client' => array(
-            'pretty_version' => 'v1.0.18',
-            'version' => '1.0.18.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../liuggio/statsd-php-client',
-            'aliases' => array(),
-            'reference' => 'c42e6d6687b7b2d7683186ec7f4f03351cc3dbca',
-            'dev_requirement' => false,
-        ),
-        'lncd/oauth2' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '*',
-            ),
-        ),
-        'maxmind-db/reader' => array(
-            'pretty_version' => 'v1.11.0',
-            'version' => '1.11.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../maxmind-db/reader',
-            'aliases' => array(),
-            'reference' => 'b1f3c0699525336d09cc5161a2861268d9f2ae5b',
-            'dev_requirement' => false,
-        ),
-        'maxmind/web-service-common' => array(
-            'pretty_version' => 'v0.8.1',
-            'version' => '0.8.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../maxmind/web-service-common',
-            'aliases' => array(),
-            'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
-            'dev_requirement' => false,
-        ),
-        'mediawiki/data-values' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '*',
-            ),
-        ),
-        'monolog/monolog' => array(
-            'pretty_version' => '2.2.0',
-            'version' => '2.2.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../monolog/monolog',
-            'aliases' => array(),
-            'reference' => '1cb1cde8e8dd0f70cc0fe51354a59acad9302084',
-            'dev_requirement' => false,
-        ),
-        'mustangostang/spyc' => array(
-            'pretty_version' => '0.6.3',
-            'version' => '0.6.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../mustangostang/spyc',
-            'aliases' => array(),
-            'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
-            'dev_requirement' => false,
-        ),
-        'nikic/php-parser' => array(
-            'pretty_version' => 'v4.13.2',
-            'version' => '4.13.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../nikic/php-parser',
-            'aliases' => array(),
-            'reference' => '210577fe3cf7badcc5814d99455df46564f3c077',
-            'dev_requirement' => false,
-        ),
-        'onoi/message-reporter' => array(
-            'pretty_version' => '1.4.1',
-            'version' => '1.4.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../onoi/message-reporter',
-            'aliases' => array(),
-            'reference' => 'cdc7f2c666cef581a1a1e31c62d5a6f2d8ba1482',
-            'dev_requirement' => false,
-        ),
-        'oojs/oojs-ui' => array(
-            'pretty_version' => 'v0.44.0',
-            'version' => '0.44.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../oojs/oojs-ui',
-            'aliases' => array(),
-            'reference' => '05823ff18922e5c0e51f3020d287c49933febc9b',
-            'dev_requirement' => false,
-        ),
-        'opis/json-schema' => array(
-            'pretty_version' => '1.1.0',
-            'version' => '1.1.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../opis/json-schema',
-            'aliases' => array(),
-            'reference' => '39d8072be8657a329a284339994401066406c43b',
-            'dev_requirement' => false,
-        ),
-        'paragonie/random_compat' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '9.99.99',
-            ),
-        ),
-        'pear/console_getopt' => array(
-            'pretty_version' => 'v1.4.3',
-            'version' => '1.4.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/console_getopt',
-            'aliases' => array(),
-            'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
-            'dev_requirement' => false,
-        ),
-        'pear/mail' => array(
-            'pretty_version' => 'v1.4.1',
-            'version' => '1.4.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/mail',
-            'aliases' => array(),
-            'reference' => '9609ed5e42ac5b221dfd9af85de005c59d418ee7',
-            'dev_requirement' => false,
-        ),
-        'pear/mail_mime' => array(
-            'pretty_version' => '1.10.11',
-            'version' => '1.10.11.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/mail_mime',
-            'aliases' => array(),
-            'reference' => 'd4fb9ce61201593d0f8c6db629c45e29c3409c14',
-            'dev_requirement' => false,
-        ),
-        'pear/net_smtp' => array(
-            'pretty_version' => '1.10.0',
-            'version' => '1.10.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/net_smtp',
-            'aliases' => array(),
-            'reference' => '51e5997b711fbd1e5a9a075634d4d682168537fa',
-            'dev_requirement' => false,
-        ),
-        'pear/net_socket' => array(
-            'pretty_version' => 'v1.2.2',
-            'version' => '1.2.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/net_socket',
-            'aliases' => array(),
-            'reference' => 'bbe6a12bb4f7059dba161f6ddd43f369c0ec8d09',
-            'dev_requirement' => false,
-        ),
-        'pear/net_url2' => array(
-            'pretty_version' => 'v2.2.2',
-            'version' => '2.2.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/net_url2',
-            'aliases' => array(),
-            'reference' => '07fd055820dbf466ee3990abe96d0e40a8791f9d',
-            'dev_requirement' => false,
-        ),
-        'pear/pear-core-minimal' => array(
-            'pretty_version' => 'v1.10.11',
-            'version' => '1.10.11.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pear/pear-core-minimal',
-            'aliases' => array(),
-            'reference' => '68d0d32ada737153b7e93b8d3c710ebe70ac867d',
-            'dev_requirement' => false,
-        ),
-        'pear/pear_exception' => array(
-            'pretty_version' => 'v1.0.2',
-            'version' => '1.0.2.0',
-            'type' => 'class',
-            'install_path' => __DIR__ . '/../pear/pear_exception',
-            'aliases' => array(),
-            'reference' => 'b14fbe2ddb0b9f94f5b24cf08783d599f776fff0',
-            'dev_requirement' => false,
-        ),
-        'pimple/pimple' => array(
-            'pretty_version' => 'v3.5.0',
-            'version' => '3.5.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pimple/pimple',
-            'aliases' => array(),
-            'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
-            'dev_requirement' => false,
-        ),
-        'pleonasm/bloom-filter' => array(
-            'pretty_version' => '1.0.2',
-            'version' => '1.0.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../pleonasm/bloom-filter',
-            'aliases' => array(),
-            'reference' => '4a3292c9f83a778c44271bf4e4f6be1204b87f7b',
-            'dev_requirement' => false,
-        ),
-        'psr/container' => array(
-            'pretty_version' => '1.1.1',
-            'version' => '1.1.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/container',
-            'aliases' => array(),
-            'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
-            'dev_requirement' => false,
-        ),
-        'psr/container-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '1.0.0',
-            ),
-        ),
-        'psr/http-client' => array(
-            'pretty_version' => '1.0.1',
-            'version' => '1.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/http-client',
-            'aliases' => array(),
-            'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
-            'dev_requirement' => false,
-        ),
-        'psr/http-client-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '1.0',
-            ),
-        ),
-        'psr/http-factory' => array(
-            'pretty_version' => '1.0.1',
-            'version' => '1.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/http-factory',
-            'aliases' => array(),
-            'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
-            'dev_requirement' => false,
-        ),
-        'psr/http-factory-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '1.0',
-            ),
-        ),
-        'psr/http-message' => array(
-            'pretty_version' => '1.0.1',
-            'version' => '1.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/http-message',
-            'aliases' => array(),
-            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
-            'dev_requirement' => false,
-        ),
-        'psr/http-message-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '1.0',
-            ),
-        ),
-        'psr/log' => array(
-            'pretty_version' => '1.1.4',
-            'version' => '1.1.4.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/log',
-            'aliases' => array(),
-            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
-            'dev_requirement' => false,
-        ),
-        'psr/log-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '1.0.0',
-                1 => '1.0|2.0',
-            ),
-        ),
-        'psr/simple-cache' => array(
-            'pretty_version' => '1.0.1',
-            'version' => '1.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psr/simple-cache',
-            'aliases' => array(),
-            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
-            'dev_requirement' => false,
-        ),
-        'psy/psysh' => array(
-            'pretty_version' => 'v0.11.1',
-            'version' => '0.11.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../psy/psysh',
-            'aliases' => array(),
-            'reference' => '570292577277f06f590635381a7f761a6cf4f026',
-            'dev_requirement' => false,
-        ),
-        'ralouphie/getallheaders' => array(
-            'pretty_version' => '3.0.3',
-            'version' => '3.0.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
-            'aliases' => array(),
-            'reference' => '120b605dfeb996808c31b6477290a714d356e822',
-            'dev_requirement' => false,
-        ),
-        'ramsey/collection' => array(
-            'pretty_version' => '1.1.4',
-            'version' => '1.1.4.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ramsey/collection',
-            'aliases' => array(),
-            'reference' => 'ab2237657ad99667a5143e32ba2683c8029563d4',
-            'dev_requirement' => false,
-        ),
-        'ramsey/uuid' => array(
-            'pretty_version' => '4.2.3',
-            'version' => '4.2.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ramsey/uuid',
-            'aliases' => array(),
-            'reference' => 'fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df',
-            'dev_requirement' => false,
-        ),
-        'react/promise' => array(
-            'pretty_version' => 'v2.9.0',
-            'version' => '2.9.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../react/promise',
-            'aliases' => array(),
-            'reference' => '234f8fd1023c9158e2314fa9d7d0e6a83db42910',
-            'dev_requirement' => false,
-        ),
-        'rhumsaa/uuid' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '4.2.3',
-            ),
-        ),
-        'rsky/pear-core-min' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => 'v1.10.11',
-            ),
-        ),
-        'ruflin/elastica' => array(
-            'pretty_version' => '6.2.0',
-            'version' => '6.2.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ruflin/elastica',
-            'aliases' => array(),
-            'reference' => '6ef9cb6c01e0c167d31b424cb1f768ecc4ef9565',
-            'dev_requirement' => false,
-        ),
-        'serialization/serialization' => array(
-            'pretty_version' => '4.0.0',
-            'version' => '4.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../serialization/serialization',
-            'aliases' => array(),
-            'reference' => '6fa293415e2b70c30c1e673d8bcd04d27dc15e44',
-            'dev_requirement' => false,
-        ),
-        'spomky-labs/base64url' => array(
-            'pretty_version' => 'v2.0.4',
-            'version' => '2.0.4.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../spomky-labs/base64url',
-            'aliases' => array(),
-            'reference' => '7752ce931ec285da4ed1f4c5aa27e45e097be61d',
-            'dev_requirement' => false,
-        ),
-        'spomky-labs/cbor-php' => array(
-            'pretty_version' => 'v1.1.1',
-            'version' => '1.1.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../spomky-labs/cbor-php',
-            'aliases' => array(),
-            'reference' => 'b8e51e6a13606ab1dd8a64aa295651d8ad57ccd1',
-            'dev_requirement' => false,
-        ),
-        'symfony/console' => array(
-            'pretty_version' => 'v5.4.5',
-            'version' => '5.4.5.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/console',
-            'aliases' => array(),
-            'reference' => 'd8111acc99876953f52fe16d4c50eb60940d49ad',
-            'dev_requirement' => false,
-        ),
-        'symfony/debug' => array(
-            'pretty_version' => 'v4.4.37',
-            'version' => '4.4.37.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/debug',
-            'aliases' => array(),
-            'reference' => '5de6c6e7f52b364840e53851c126be4d71e60470',
-            'dev_requirement' => false,
-        ),
-        'symfony/deprecation-contracts' => array(
-            'pretty_version' => 'v2.5.0',
-            'version' => '2.5.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
-            'aliases' => array(),
-            'reference' => '6f981ee24cf69ee7ce9736146d1c57c2780598a8',
-            'dev_requirement' => false,
-        ),
-        'symfony/polyfill-ctype' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.99',
-            ),
-        ),
-        'symfony/polyfill-intl-grapheme' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.17.1',
-            ),
-        ),
-        'symfony/polyfill-intl-idn' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.17.0',
-            ),
-        ),
-        'symfony/polyfill-intl-normalizer' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.17.1',
-            ),
-        ),
-        'symfony/polyfill-mbstring' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.99',
-            ),
-        ),
-        'symfony/polyfill-php72' => array(
-            'dev_requirement' => false,
-            'replaced' => array(
-                0 => '1.12.0',
-            ),
-        ),
-        'symfony/polyfill-php73' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/polyfill-php73',
-            'aliases' => array(),
-            'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5',
-            'dev_requirement' => false,
-        ),
-        'symfony/polyfill-php80' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/polyfill-php80',
-            'aliases' => array(),
-            'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
-            'dev_requirement' => false,
-        ),
-        'symfony/polyfill-php81' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/polyfill-php81',
-            'aliases' => array(),
-            'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f',
-            'dev_requirement' => false,
-        ),
-        'symfony/process' => array(
-            'pretty_version' => 'v5.4.5',
-            'version' => '5.4.5.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/process',
-            'aliases' => array(),
-            'reference' => '95440409896f90a5f85db07a32b517ecec17fa4c',
-            'dev_requirement' => false,
-        ),
-        'symfony/service-contracts' => array(
-            'pretty_version' => 'v2.4.1',
-            'version' => '2.4.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/service-contracts',
-            'aliases' => array(),
-            'reference' => 'd664541b99d6fb0247ec5ff32e87238582236204',
-            'dev_requirement' => false,
-        ),
-        'symfony/string' => array(
-            'pretty_version' => 'v5.4.3',
-            'version' => '5.4.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/string',
-            'aliases' => array(),
-            'reference' => '92043b7d8383e48104e411bc9434b260dbeb5a10',
-            'dev_requirement' => false,
-        ),
-        'symfony/translation' => array(
-            'pretty_version' => 'v5.4.6',
-            'version' => '5.4.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/translation',
-            'aliases' => array(),
-            'reference' => 'a7ca9fdfffb0174209440c2ffa1dee228e15d95b',
-            'dev_requirement' => false,
-        ),
-        'symfony/translation-contracts' => array(
-            'pretty_version' => 'v2.5.0',
-            'version' => '2.5.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/translation-contracts',
-            'aliases' => array(),
-            'reference' => 'd28150f0f44ce854e942b671fc2620a98aae1b1e',
-            'dev_requirement' => false,
-        ),
-        'symfony/translation-implementation' => array(
-            'dev_requirement' => false,
-            'provided' => array(
-                0 => '2.3',
-            ),
-        ),
-        'symfony/validator' => array(
-            'pretty_version' => 'v5.4.6',
-            'version' => '5.4.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/validator',
-            'aliases' => array(),
-            'reference' => 'ab461eab209e3be062ba9c609d37b37e8364dbe4',
-            'dev_requirement' => false,
-        ),
-        'symfony/var-dumper' => array(
-            'pretty_version' => 'v5.4.6',
-            'version' => '5.4.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/var-dumper',
-            'aliases' => array(),
-            'reference' => '294e9da6e2e0dd404e983daa5aa74253d92c05d0',
-            'dev_requirement' => false,
-        ),
-        'symfony/yaml' => array(
-            'pretty_version' => 'v5.4.3',
-            'version' => '5.4.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../symfony/yaml',
-            'aliases' => array(),
-            'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2',
-            'dev_requirement' => false,
-        ),
-        'thecodingmachine/safe' => array(
-            'pretty_version' => 'v1.3.3',
-            'version' => '1.3.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../thecodingmachine/safe',
-            'aliases' => array(),
-            'reference' => 'a8ab0876305a4cdaef31b2350fcb9811b5608dbc',
-            'dev_requirement' => false,
-        ),
-        'web-auth/cose-lib' => array(
-            'pretty_version' => 'v3.3.12',
-            'version' => '3.3.12.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../web-auth/cose-lib',
-            'aliases' => array(),
-            'reference' => 'efa6ec2ba4e840bc1316a493973c9916028afeeb',
-            'dev_requirement' => false,
-        ),
-        'web-auth/metadata-service' => array(
-            'pretty_version' => 'v3.3.12',
-            'version' => '3.3.12.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../web-auth/metadata-service',
-            'aliases' => array(),
-            'reference' => 'ef40d2b7b68c4964247d13fab52e2fa8dbd65246',
-            'dev_requirement' => false,
-        ),
-        'web-auth/webauthn-lib' => array(
-            'pretty_version' => 'v3.3.12',
-            'version' => '3.3.12.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../web-auth/webauthn-lib',
-            'aliases' => array(),
-            'reference' => '5ef9b21c8e9f8a817e524ac93290d08a9f065b33',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/assert' => array(
-            'pretty_version' => 'v0.5.1',
-            'version' => '0.5.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/assert',
-            'aliases' => array(),
-            'reference' => '27c983fddac1197dc37f6a7cec00fc02861529cd',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/at-ease' => array(
-            'pretty_version' => 'v2.1.0',
-            'version' => '2.1.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/at-ease',
-            'aliases' => array(),
-            'reference' => 'e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/base-convert' => array(
-            'pretty_version' => 'v2.0.1',
-            'version' => '2.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/base-convert',
-            'aliases' => array(),
-            'reference' => '449f0d0237cf1e0e71faec90680c88d4af6e711d',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/cdb' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/cdb',
-            'aliases' => array(),
-            'reference' => '70c724f88faa74338c9918f5b999445a615593e8',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/cldr-plural-rule-parser' => array(
-            'pretty_version' => 'v2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/cldr-plural-rule-parser',
-            'aliases' => array(),
-            'reference' => '83d78cb8018d5c0f66fd6d0efff6a8ae2de92d36',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/common-passwords' => array(
-            'pretty_version' => 'v0.3.0',
-            'version' => '0.3.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/common-passwords',
-            'aliases' => array(),
-            'reference' => '5b51a88a27e17f485ba1295ee6916620686cd5a5',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/composer-merge-plugin' => array(
-            'pretty_version' => 'v2.0.1',
-            'version' => '2.0.1.0',
-            'type' => 'composer-plugin',
-            'install_path' => __DIR__ . '/../wikimedia/composer-merge-plugin',
-            'aliases' => array(),
-            'reference' => '8ca2ed8ab97c8ebce6b39d9943e9909bb4f18912',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/css-sanitizer' => array(
-            'pretty_version' => 'v3.0.2',
-            'version' => '3.0.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/css-sanitizer',
-            'aliases' => array(),
-            'reference' => '718e2a79fc3fec4c7a43193b5e2ac3bae6756ee4',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/dodo' => array(
-            'pretty_version' => 'v0.4.0',
-            'version' => '0.4.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/dodo',
-            'aliases' => array(),
-            'reference' => '47e8176b8fd04ea00034d91b524f272e3745604a',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/equivset' => array(
-            'pretty_version' => '1.4.2',
-            'version' => '1.4.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/equivset',
-            'aliases' => array(),
-            'reference' => 'f41a259526a5597e1c3cb3cf745d1f1af6d36a00',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/html-formatter' => array(
-            'pretty_version' => '3.0.1',
-            'version' => '3.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/html-formatter',
-            'aliases' => array(),
-            'reference' => 'f18622f3384b9b7fed185bff2a46594aec92fa47',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/idle-dom' => array(
-            'pretty_version' => 'v0.10.0',
-            'version' => '0.10.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/idle-dom',
-            'aliases' => array(),
-            'reference' => '1d34b55cfe259fd26c541811581c2e1578b46727',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/ip-set' => array(
-            'pretty_version' => '3.1.0',
-            'version' => '3.1.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/ip-set',
-            'aliases' => array(),
-            'reference' => '9650ba486e21a84659fcfd46b3e5f2c4fa2b735c',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/ip-utils' => array(
-            'pretty_version' => '4.0.0',
-            'version' => '4.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/ip-utils',
-            'aliases' => array(),
-            'reference' => 'f52a68b95fd3aac91cde3bdbc8654e2faa2fba38',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/langconv' => array(
-            'pretty_version' => '0.4.2',
-            'version' => '0.4.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/langconv',
-            'aliases' => array(),
-            'reference' => '4bd255fd316df6650c489fa0f9b621c48458859b',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/less.php' => array(
-            'pretty_version' => 'v3.1.0',
-            'version' => '3.1.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/less.php',
-            'aliases' => array(),
-            'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/lucene-explain-parser' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/lucene-explain-parser',
-            'aliases' => array(),
-            'reference' => '82a90019468290a6009a9f61010bd0ffd7e8fc10',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/minify' => array(
-            'pretty_version' => '2.3.0',
-            'version' => '2.3.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/minify',
-            'aliases' => array(),
-            'reference' => '61b35567bb3fb85c1086f30809cc67d5900c591f',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/normalized-exception' => array(
-            'pretty_version' => 'v1.0.1',
-            'version' => '1.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/normalized-exception',
-            'aliases' => array(),
-            'reference' => 'ed9fc13d75f65c80dc1a95d4792658c97fd782e6',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/object-factory' => array(
-            'pretty_version' => 'v4.0.0',
-            'version' => '4.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/object-factory',
-            'aliases' => array(),
-            'reference' => '20d19657cfbedb1e7bd61c6696e8a16ade232e5c',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/parsoid' => array(
-            'pretty_version' => 'v0.16.0-a12',
-            'version' => '0.16.0.0-alpha12',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/parsoid',
-            'aliases' => array(),
-            'reference' => 'ed76d0a1d6e36e6ee1a95835d44531d4753bd0e6',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/php-session-serializer' => array(
-            'pretty_version' => 'v2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/php-session-serializer',
-            'aliases' => array(),
-            'reference' => '99e7e926f1b61f71623d517fe38d9eec8618c59d',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/purtle' => array(
-            'pretty_version' => 'v1.0.8',
-            'version' => '1.0.8.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/purtle',
-            'aliases' => array(),
-            'reference' => '8f106f38ff811906853511a934d7f5e86dce3d20',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/relpath' => array(
-            'pretty_version' => '3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/relpath',
-            'aliases' => array(),
-            'reference' => 'b237d203c820cd1000f2c5ecad25de9fa7165612',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/remex-html' => array(
-            'pretty_version' => '3.0.1',
-            'version' => '3.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/remex-html',
-            'aliases' => array(),
-            'reference' => '962d1b028d505f488b77ded093cacce9a0855f29',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/request-timeout' => array(
-            'pretty_version' => '1.2.0',
-            'version' => '1.2.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/request-timeout',
-            'aliases' => array(),
-            'reference' => 'e306a7cb1fb3a1ca3ce93992c56efb62b537c4bc',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/running-stat' => array(
-            'pretty_version' => 'v1.2.1',
-            'version' => '1.2.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/running-stat',
-            'aliases' => array(),
-            'reference' => '60eebada7cc64b7073d90e7d4bab00efaafa0ba9',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/scoped-callback' => array(
-            'pretty_version' => 'v3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/scoped-callback',
-            'aliases' => array(),
-            'reference' => '0a480d9a9772634697c77598726cf24606597bd0',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/services' => array(
-            'pretty_version' => '2.0.1',
-            'version' => '2.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/services',
-            'aliases' => array(),
-            'reference' => '5ef69a8a8b0d2ea115d08469bdab468f58fac820',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/shellbox' => array(
-            'pretty_version' => '3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/shellbox',
-            'aliases' => array(),
-            'reference' => '6b5abcd4a467b27b5ba4fc28f7730ea5d01367a1',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/testing-access-wrapper' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/testing-access-wrapper',
-            'aliases' => array(),
-            'reference' => '280e613c76f481f2fe90e0ea22361080b6ab0d65',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/textcat' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/textcat',
-            'aliases' => array(),
-            'reference' => 'dfdfb1c41bb016814a9d4da3aa68b62437b54a82',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/timestamp' => array(
-            'pretty_version' => 'v3.0.0',
-            'version' => '3.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/timestamp',
-            'aliases' => array(),
-            'reference' => '42ce5586d2189826e28ebcf4cedc96226b6d77e2',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/utfnormal' => array(
-            'pretty_version' => '3.0.2',
-            'version' => '3.0.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/utfnormal',
-            'aliases' => array(),
-            'reference' => 'e690d29487a6ee346bcf4cbf5a6fd89170fa2306',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/wait-condition-loop' => array(
-            'pretty_version' => 'v2.0.2',
-            'version' => '2.0.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/wait-condition-loop',
-            'aliases' => array(),
-            'reference' => '9bb0894e8c5195d43b2f2babbe4cc8f36bd5be0e',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/wikipeg' => array(
-            'pretty_version' => '2.0.6',
-            'version' => '2.0.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/wikipeg',
-            'aliases' => array(),
-            'reference' => '9a92384ae11e1a3b7ecfe0feef1809b1af73889b',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/wrappedstring' => array(
-            'pretty_version' => 'v4.0.1',
-            'version' => '4.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/wrappedstring',
-            'aliases' => array(),
-            'reference' => '0d526868d92fa855c70a845336a777c63b30b400',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/xmp-reader' => array(
-            'pretty_version' => '0.8.1',
-            'version' => '0.8.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/xmp-reader',
-            'aliases' => array(),
-            'reference' => '4fc577e28e09eec165b64ed74ce878ba4ea45a35',
-            'dev_requirement' => false,
-        ),
-        'wikimedia/zest-css' => array(
-            'pretty_version' => '2.0.2',
-            'version' => '2.0.2.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wikimedia/zest-css',
-            'aliases' => array(),
-            'reference' => '423c867462801fda08a1c31009ec19d91a68b410',
-            'dev_requirement' => false,
-        ),
-        'wmde/php-vuejs-templating' => array(
-            'pretty_version' => '1.0.3',
-            'version' => '1.0.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../wmde/php-vuejs-templating',
-            'aliases' => array(),
-            'reference' => 'f0c35ef0875d05fe74c9a0e0361b888e5c6818d0',
-            'dev_requirement' => false,
-        ),
-        'zordius/lightncandy' => array(
-            'pretty_version' => 'v1.2.6',
-            'version' => '1.2.6.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../zordius/lightncandy',
-            'aliases' => array(),
-            'reference' => 'b451f73e8b5c73e62e365997ba3c993a0376b72a',
-            'dev_requirement' => false,
-        ),
+<?php return array (
+  'root' => 
+  array (
+    'pretty_version' => 'dev-master',
+    'version' => 'dev-master',
+    'aliases' => 
+    array (
     ),
+    'reference' => 'debbadc67271c83c8925217331582b03cd17b71d',
+    'name' => '__root__',
+  ),
+  'versions' => 
+  array (
+    '__root__' => 
+    array (
+      'pretty_version' => 'dev-master',
+      'version' => 'dev-master',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'debbadc67271c83c8925217331582b03cd17b71d',
+    ),
+    'beberlei/assert' => 
+    array (
+      'pretty_version' => 'v3.3.2',
+      'version' => '3.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
+    ),
+    'brick/math' => 
+    array (
+      'pretty_version' => '0.8.17',
+      'version' => '0.8.17.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e6f8e7d04346a95be89580f8c2c22d6c3fa65556',
+    ),
+    'christian-riesen/base32' => 
+    array (
+      'pretty_version' => '1.6.0',
+      'version' => '1.6.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2e82dab3baa008e24a505649b0d583c31d31e894',
+    ),
+    'composer/ca-bundle' => 
+    array (
+      'pretty_version' => '1.3.1',
+      'version' => '1.3.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b',
+    ),
+    'composer/semver' => 
+    array (
+      'pretty_version' => '3.3.2',
+      'version' => '3.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3953f23262f2bff1919fc82183ad9acb13ff62c9',
+    ),
+    'cssjanus/cssjanus' => 
+    array (
+      'pretty_version' => 'v2.1.0',
+      'version' => '2.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'de7483c0805750a6462b372eab55d022d555df02',
+    ),
+    'data-values/common' => 
+    array (
+      'pretty_version' => '1.0.0',
+      'version' => '1.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '315bd95ef8e5c360ce8a1cf02c0eef35bbb92561',
+    ),
+    'data-values/data-values' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '63dee286f8bb4ae7899c2d2e8d439e7b5332cc49',
+    ),
+    'data-values/geo' => 
+    array (
+      'pretty_version' => '4.2.3',
+      'version' => '4.2.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a08d5ce38c2cb789ff8942e9082ce04dfc55a850',
+    ),
+    'data-values/interfaces' => 
+    array (
+      'pretty_version' => '1.0.0',
+      'version' => '1.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '244d078954bc05edf8f8c6b088e848289171c3a8',
+    ),
+    'data-values/number' => 
+    array (
+      'pretty_version' => '0.11.1',
+      'version' => '0.11.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3177a4e11fee862d59a4f66c6b35408e9c609843',
+    ),
+    'data-values/serialization' => 
+    array (
+      'pretty_version' => '1.2.4',
+      'version' => '1.2.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5bc3640f7ddb642479ff490fae64fcf19c7e75af',
+    ),
+    'data-values/time' => 
+    array (
+      'pretty_version' => '1.0.4',
+      'version' => '1.0.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'abbb585f2c71ca8a1ac9aea858cf5ba6b8920320',
+    ),
+    'defuse/php-encryption' => 
+    array (
+      'pretty_version' => 'v2.3.1',
+      'version' => '2.3.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '77880488b9954b7884c25555c2a0ea9e7053f9d2',
+    ),
+    'diff/diff' => 
+    array (
+      'pretty_version' => '3.2.0',
+      'version' => '3.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '89bbd224a9ad6cc6cb8e01263ae5add2564e7cf0',
+    ),
+    'elasticsearch/elasticsearch' => 
+    array (
+      'pretty_version' => 'v6.7.2',
+      'version' => '6.7.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9ba89f905ebf699e72dacffa410331c7fecc8255',
+    ),
+    'fgrosse/phpasn1' => 
+    array (
+      'pretty_version' => 'v2.4.0',
+      'version' => '2.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'eef488991d53e58e60c9554b09b1201ca5ba9296',
+    ),
+    'firebase/php-jwt' => 
+    array (
+      'pretty_version' => 'v5.5.1',
+      'version' => '5.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
+    ),
+    'geoip2/geoip2' => 
+    array (
+      'pretty_version' => 'v2.12.2',
+      'version' => '2.12.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83adb44ac4b9553d36b579a14673ed124583082f',
+    ),
+    'grogy/php-parallel-lint' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'guzzlehttp/guzzle' => 
+    array (
+      'pretty_version' => '7.4.1',
+      'version' => '7.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79',
+    ),
+    'guzzlehttp/promises' => 
+    array (
+      'pretty_version' => '1.5.1',
+      'version' => '1.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
+    ),
+    'guzzlehttp/psr7' => 
+    array (
+      'pretty_version' => '2.1.2',
+      'version' => '2.1.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b36d463b214c76ed12b924bae0445f3531bb1686',
+    ),
+    'guzzlehttp/ringphp' => 
+    array (
+      'pretty_version' => '1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5e2a174052995663dd68e6b5ad838afd47dd615b',
+    ),
+    'guzzlehttp/streams' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5',
+    ),
+    'jakobo/hotp-php' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ff2f13d1918001e54b3f49deb1d366bcfcc98437',
+    ),
+    'jakub-onderka/php-parallel-lint' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'james-heinrich/getid3' => 
+    array (
+      'pretty_version' => 'v1.9.21',
+      'version' => '1.9.21.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '36f5dabb1325415a4b07a401113f8db2eb81eca1',
+    ),
+    'justinrainbow/json-schema' => 
+    array (
+      'pretty_version' => '5.2.11',
+      'version' => '5.2.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2ab6744b7296ded80f8cc4f9509abbff393399aa',
+    ),
+    'lcobucci/jwt' => 
+    array (
+      'pretty_version' => '3.4.6',
+      'version' => '3.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '3ef8657a78278dfeae7707d51747251db4176240',
+    ),
+    'league/event' => 
+    array (
+      'pretty_version' => '2.2.0',
+      'version' => '2.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd2cc124cf9a3fab2bb4ff963307f60361ce4d119',
+    ),
+    'league/oauth2-server' => 
+    array (
+      'pretty_version' => 'dev-v9.0.0-alpha',
+      'version' => 'dev-v9.0.0-alpha',
+      'aliases' => 
+      array (
+        0 => '9999999-dev',
+        1 => '9.0.0',
+      ),
+      'reference' => '61d770dc284898ea2905d66e12f8f7e5f6664092',
+    ),
+    'league/oauth2server' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'league/uri' => 
+    array (
+      'pretty_version' => '6.4.0',
+      'version' => '6.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '09da64118eaf4c5d52f9923a1e6a5be1da52fd9a',
+    ),
+    'league/uri-components' => 
+    array (
+      'pretty_version' => '2.2.1',
+      'version' => '2.2.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '14bab20b05bc20d16dec17401a9027c679412589',
+    ),
+    'league/uri-interfaces' => 
+    array (
+      'pretty_version' => '2.3.0',
+      'version' => '2.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '00e7e2943f76d8cb50c7dfdc2f6dee356e15e383',
+    ),
+    'liuggio/statsd-php-client' => 
+    array (
+      'pretty_version' => 'v1.0.18',
+      'version' => '1.0.18.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'c42e6d6687b7b2d7683186ec7f4f03351cc3dbca',
+    ),
+    'lncd/oauth2' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'maxmind-db/reader' => 
+    array (
+      'pretty_version' => 'v1.11.0',
+      'version' => '1.11.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b1f3c0699525336d09cc5161a2861268d9f2ae5b',
+    ),
+    'maxmind/web-service-common' => 
+    array (
+      'pretty_version' => 'v0.8.1',
+      'version' => '0.8.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '32f274051c543fc865e5a84d3a2c703913641ea8',
+    ),
+    'mediawiki/data-values' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '*',
+      ),
+    ),
+    'monolog/monolog' => 
+    array (
+      'pretty_version' => '2.2.0',
+      'version' => '2.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '1cb1cde8e8dd0f70cc0fe51354a59acad9302084',
+    ),
+    'mustangostang/spyc' => 
+    array (
+      'pretty_version' => '0.6.3',
+      'version' => '0.6.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4627c838b16550b666d15aeae1e5289dd5b77da0',
+    ),
+    'nikic/php-parser' => 
+    array (
+      'pretty_version' => 'v4.13.2',
+      'version' => '4.13.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '210577fe3cf7badcc5814d99455df46564f3c077',
+    ),
+    'onoi/message-reporter' => 
+    array (
+      'pretty_version' => '1.4.1',
+      'version' => '1.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cdc7f2c666cef581a1a1e31c62d5a6f2d8ba1482',
+    ),
+    'oojs/oojs-ui' => 
+    array (
+      'pretty_version' => 'v0.44.0',
+      'version' => '0.44.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '05823ff18922e5c0e51f3020d287c49933febc9b',
+    ),
+    'opis/json-schema' => 
+    array (
+      'pretty_version' => '1.1.0',
+      'version' => '1.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '39d8072be8657a329a284339994401066406c43b',
+    ),
+    'paragonie/random_compat' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '9.99.99',
+      ),
+    ),
+    'pear/console_getopt' => 
+    array (
+      'pretty_version' => 'v1.4.3',
+      'version' => '1.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a41f8d3e668987609178c7c4a9fe48fecac53fa0',
+    ),
+    'pear/mail' => 
+    array (
+      'pretty_version' => 'v1.4.1',
+      'version' => '1.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9609ed5e42ac5b221dfd9af85de005c59d418ee7',
+    ),
+    'pear/mail_mime' => 
+    array (
+      'pretty_version' => '1.10.11',
+      'version' => '1.10.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd4fb9ce61201593d0f8c6db629c45e29c3409c14',
+    ),
+    'pear/net_smtp' => 
+    array (
+      'pretty_version' => '1.10.0',
+      'version' => '1.10.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '51e5997b711fbd1e5a9a075634d4d682168537fa',
+    ),
+    'pear/net_socket' => 
+    array (
+      'pretty_version' => 'v1.2.2',
+      'version' => '1.2.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'bbe6a12bb4f7059dba161f6ddd43f369c0ec8d09',
+    ),
+    'pear/net_url2' => 
+    array (
+      'pretty_version' => 'v2.2.2',
+      'version' => '2.2.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '07fd055820dbf466ee3990abe96d0e40a8791f9d',
+    ),
+    'pear/pear-core-minimal' => 
+    array (
+      'pretty_version' => 'v1.10.11',
+      'version' => '1.10.11.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '68d0d32ada737153b7e93b8d3c710ebe70ac867d',
+    ),
+    'pear/pear_exception' => 
+    array (
+      'pretty_version' => 'v1.0.2',
+      'version' => '1.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b14fbe2ddb0b9f94f5b24cf08783d599f776fff0',
+    ),
+    'php-parallel-lint/php-parallel-lint' => 
+    array (
+      'pretty_version' => 'v1.3.2',
+      'version' => '1.3.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6483c9832e71973ed29cf71bd6b3f4fde438a9de',
+    ),
+    'pimple/pimple' => 
+    array (
+      'pretty_version' => 'v3.5.0',
+      'version' => '3.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
+    ),
+    'pleonasm/bloom-filter' => 
+    array (
+      'pretty_version' => '1.0.2',
+      'version' => '1.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4a3292c9f83a778c44271bf4e4f6be1204b87f7b',
+    ),
+    'psr/container' => 
+    array (
+      'pretty_version' => '1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8622567409010282b7aeebe4bb841fe98b58dcaf',
+    ),
+    'psr/container-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0.0',
+      ),
+    ),
+    'psr/http-client' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
+    ),
+    'psr/http-client-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/http-factory' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
+    ),
+    'psr/http-factory-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/http-message' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
+    ),
+    'psr/http-message-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0',
+      ),
+    ),
+    'psr/log' => 
+    array (
+      'pretty_version' => '1.1.4',
+      'version' => '1.1.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
+    ),
+    'psr/log-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '1.0.0',
+        1 => '1.0|2.0',
+      ),
+    ),
+    'psr/simple-cache' => 
+    array (
+      'pretty_version' => '1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
+    ),
+    'psy/psysh' => 
+    array (
+      'pretty_version' => 'v0.11.1',
+      'version' => '0.11.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '570292577277f06f590635381a7f761a6cf4f026',
+    ),
+    'ralouphie/getallheaders' => 
+    array (
+      'pretty_version' => '3.0.3',
+      'version' => '3.0.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '120b605dfeb996808c31b6477290a714d356e822',
+    ),
+    'ramsey/collection' => 
+    array (
+      'pretty_version' => '1.1.4',
+      'version' => '1.1.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ab2237657ad99667a5143e32ba2683c8029563d4',
+    ),
+    'ramsey/uuid' => 
+    array (
+      'pretty_version' => '4.2.3',
+      'version' => '4.2.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df',
+    ),
+    'react/promise' => 
+    array (
+      'pretty_version' => 'v2.9.0',
+      'version' => '2.9.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '234f8fd1023c9158e2314fa9d7d0e6a83db42910',
+    ),
+    'rhumsaa/uuid' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '4.2.3',
+      ),
+    ),
+    'rsky/pear-core-min' => 
+    array (
+      'replaced' => 
+      array (
+        0 => 'v1.10.11',
+      ),
+    ),
+    'ruflin/elastica' => 
+    array (
+      'pretty_version' => '6.2.0',
+      'version' => '6.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6ef9cb6c01e0c167d31b424cb1f768ecc4ef9565',
+    ),
+    'serialization/serialization' => 
+    array (
+      'pretty_version' => '4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6fa293415e2b70c30c1e673d8bcd04d27dc15e44',
+    ),
+    'spomky-labs/base64url' => 
+    array (
+      'pretty_version' => 'v2.0.4',
+      'version' => '2.0.4.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '7752ce931ec285da4ed1f4c5aa27e45e097be61d',
+    ),
+    'spomky-labs/cbor-php' => 
+    array (
+      'pretty_version' => 'v1.1.1',
+      'version' => '1.1.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b8e51e6a13606ab1dd8a64aa295651d8ad57ccd1',
+    ),
+    'symfony/console' => 
+    array (
+      'pretty_version' => 'v5.4.5',
+      'version' => '5.4.5.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd8111acc99876953f52fe16d4c50eb60940d49ad',
+    ),
+    'symfony/debug' => 
+    array (
+      'pretty_version' => 'v4.4.37',
+      'version' => '4.4.37.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5de6c6e7f52b364840e53851c126be4d71e60470',
+    ),
+    'symfony/deprecation-contracts' => 
+    array (
+      'pretty_version' => 'v2.5.0',
+      'version' => '2.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6f981ee24cf69ee7ce9736146d1c57c2780598a8',
+    ),
+    'symfony/polyfill-ctype' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.99',
+      ),
+    ),
+    'symfony/polyfill-intl-grapheme' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.1',
+      ),
+    ),
+    'symfony/polyfill-intl-idn' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.0',
+      ),
+    ),
+    'symfony/polyfill-intl-normalizer' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.17.1',
+      ),
+    ),
+    'symfony/polyfill-mbstring' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.99',
+      ),
+    ),
+    'symfony/polyfill-php72' => 
+    array (
+      'replaced' => 
+      array (
+        0 => '1.12.0',
+      ),
+    ),
+    'symfony/polyfill-php73' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5',
+    ),
+    'symfony/polyfill-php80' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
+    ),
+    'symfony/polyfill-php81' => 
+    array (
+      'pretty_version' => 'v1.25.0',
+      'version' => '1.25.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5de4ba2d41b15f9bd0e19b2ab9674135813ec98f',
+    ),
+    'symfony/process' => 
+    array (
+      'pretty_version' => 'v5.4.5',
+      'version' => '5.4.5.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '95440409896f90a5f85db07a32b517ecec17fa4c',
+    ),
+    'symfony/service-contracts' => 
+    array (
+      'pretty_version' => 'v2.4.1',
+      'version' => '2.4.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd664541b99d6fb0247ec5ff32e87238582236204',
+    ),
+    'symfony/string' => 
+    array (
+      'pretty_version' => 'v5.4.3',
+      'version' => '5.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '92043b7d8383e48104e411bc9434b260dbeb5a10',
+    ),
+    'symfony/translation' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a7ca9fdfffb0174209440c2ffa1dee228e15d95b',
+    ),
+    'symfony/translation-contracts' => 
+    array (
+      'pretty_version' => 'v2.5.0',
+      'version' => '2.5.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'd28150f0f44ce854e942b671fc2620a98aae1b1e',
+    ),
+    'symfony/translation-implementation' => 
+    array (
+      'provided' => 
+      array (
+        0 => '2.3',
+      ),
+    ),
+    'symfony/validator' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ab461eab209e3be062ba9c609d37b37e8364dbe4',
+    ),
+    'symfony/var-dumper' => 
+    array (
+      'pretty_version' => 'v5.4.6',
+      'version' => '5.4.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '294e9da6e2e0dd404e983daa5aa74253d92c05d0',
+    ),
+    'symfony/yaml' => 
+    array (
+      'pretty_version' => 'v5.4.3',
+      'version' => '5.4.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e80f87d2c9495966768310fc531b487ce64237a2',
+    ),
+    'thecodingmachine/safe' => 
+    array (
+      'pretty_version' => 'v1.3.3',
+      'version' => '1.3.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a8ab0876305a4cdaef31b2350fcb9811b5608dbc',
+    ),
+    'web-auth/cose-lib' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'efa6ec2ba4e840bc1316a493973c9916028afeeb',
+    ),
+    'web-auth/metadata-service' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ef40d2b7b68c4964247d13fab52e2fa8dbd65246',
+    ),
+    'web-auth/webauthn-lib' => 
+    array (
+      'pretty_version' => 'v3.3.12',
+      'version' => '3.3.12.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5ef9b21c8e9f8a817e524ac93290d08a9f065b33',
+    ),
+    'wikimedia/assert' => 
+    array (
+      'pretty_version' => 'v0.5.1',
+      'version' => '0.5.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '27c983fddac1197dc37f6a7cec00fc02861529cd',
+    ),
+    'wikimedia/at-ease' => 
+    array (
+      'pretty_version' => 'v2.1.0',
+      'version' => '2.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33',
+    ),
+    'wikimedia/base-convert' => 
+    array (
+      'pretty_version' => 'v2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '449f0d0237cf1e0e71faec90680c88d4af6e711d',
+    ),
+    'wikimedia/cdb' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '70c724f88faa74338c9918f5b999445a615593e8',
+    ),
+    'wikimedia/cldr-plural-rule-parser' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '83d78cb8018d5c0f66fd6d0efff6a8ae2de92d36',
+    ),
+    'wikimedia/common-passwords' => 
+    array (
+      'pretty_version' => 'v0.3.0',
+      'version' => '0.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5b51a88a27e17f485ba1295ee6916620686cd5a5',
+    ),
+    'wikimedia/composer-merge-plugin' => 
+    array (
+      'pretty_version' => 'v2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8ca2ed8ab97c8ebce6b39d9943e9909bb4f18912',
+    ),
+    'wikimedia/css-sanitizer' => 
+    array (
+      'pretty_version' => 'v3.0.2',
+      'version' => '3.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '718e2a79fc3fec4c7a43193b5e2ac3bae6756ee4',
+    ),
+    'wikimedia/dodo' => 
+    array (
+      'pretty_version' => 'v0.4.0',
+      'version' => '0.4.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '47e8176b8fd04ea00034d91b524f272e3745604a',
+    ),
+    'wikimedia/equivset' => 
+    array (
+      'pretty_version' => '1.4.2',
+      'version' => '1.4.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f41a259526a5597e1c3cb3cf745d1f1af6d36a00',
+    ),
+    'wikimedia/html-formatter' => 
+    array (
+      'pretty_version' => '3.0.1',
+      'version' => '3.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f18622f3384b9b7fed185bff2a46594aec92fa47',
+    ),
+    'wikimedia/idle-dom' => 
+    array (
+      'pretty_version' => 'v0.10.0',
+      'version' => '0.10.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '1d34b55cfe259fd26c541811581c2e1578b46727',
+    ),
+    'wikimedia/ip-set' => 
+    array (
+      'pretty_version' => '3.1.0',
+      'version' => '3.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9650ba486e21a84659fcfd46b3e5f2c4fa2b735c',
+    ),
+    'wikimedia/ip-utils' => 
+    array (
+      'pretty_version' => '4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f52a68b95fd3aac91cde3bdbc8654e2faa2fba38',
+    ),
+    'wikimedia/langconv' => 
+    array (
+      'pretty_version' => '0.4.2',
+      'version' => '0.4.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4bd255fd316df6650c489fa0f9b621c48458859b',
+    ),
+    'wikimedia/less.php' => 
+    array (
+      'pretty_version' => 'v3.1.0',
+      'version' => '3.1.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'a486d78b9bd16b72f237fc6093aa56d69ce8bd13',
+    ),
+    'wikimedia/lucene-explain-parser' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '82a90019468290a6009a9f61010bd0ffd7e8fc10',
+    ),
+    'wikimedia/minify' => 
+    array (
+      'pretty_version' => '2.3.0',
+      'version' => '2.3.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '61b35567bb3fb85c1086f30809cc67d5900c591f',
+    ),
+    'wikimedia/normalized-exception' => 
+    array (
+      'pretty_version' => 'v1.0.1',
+      'version' => '1.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ed9fc13d75f65c80dc1a95d4792658c97fd782e6',
+    ),
+    'wikimedia/object-factory' => 
+    array (
+      'pretty_version' => 'v4.0.0',
+      'version' => '4.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '20d19657cfbedb1e7bd61c6696e8a16ade232e5c',
+    ),
+    'wikimedia/parsoid' => 
+    array (
+      'pretty_version' => 'v0.16.0-a12',
+      'version' => '0.16.0.0-alpha12',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'ed76d0a1d6e36e6ee1a95835d44531d4753bd0e6',
+    ),
+    'wikimedia/php-session-serializer' => 
+    array (
+      'pretty_version' => 'v2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '99e7e926f1b61f71623d517fe38d9eec8618c59d',
+    ),
+    'wikimedia/purtle' => 
+    array (
+      'pretty_version' => 'v1.0.8',
+      'version' => '1.0.8.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '8f106f38ff811906853511a934d7f5e86dce3d20',
+    ),
+    'wikimedia/relpath' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b237d203c820cd1000f2c5ecad25de9fa7165612',
+    ),
+    'wikimedia/remex-html' => 
+    array (
+      'pretty_version' => '3.0.1',
+      'version' => '3.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '962d1b028d505f488b77ded093cacce9a0855f29',
+    ),
+    'wikimedia/request-timeout' => 
+    array (
+      'pretty_version' => '1.2.0',
+      'version' => '1.2.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e306a7cb1fb3a1ca3ce93992c56efb62b537c4bc',
+    ),
+    'wikimedia/running-stat' => 
+    array (
+      'pretty_version' => 'v1.2.1',
+      'version' => '1.2.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '60eebada7cc64b7073d90e7d4bab00efaafa0ba9',
+    ),
+    'wikimedia/scoped-callback' => 
+    array (
+      'pretty_version' => 'v3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '0a480d9a9772634697c77598726cf24606597bd0',
+    ),
+    'wikimedia/services' => 
+    array (
+      'pretty_version' => '2.0.1',
+      'version' => '2.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '5ef69a8a8b0d2ea115d08469bdab468f58fac820',
+    ),
+    'wikimedia/shellbox' => 
+    array (
+      'pretty_version' => '3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '6b5abcd4a467b27b5ba4fc28f7730ea5d01367a1',
+    ),
+    'wikimedia/testing-access-wrapper' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '280e613c76f481f2fe90e0ea22361080b6ab0d65',
+    ),
+    'wikimedia/textcat' => 
+    array (
+      'pretty_version' => '2.0.0',
+      'version' => '2.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'dfdfb1c41bb016814a9d4da3aa68b62437b54a82',
+    ),
+    'wikimedia/timestamp' => 
+    array (
+      'pretty_version' => 'v3.0.0',
+      'version' => '3.0.0.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '42ce5586d2189826e28ebcf4cedc96226b6d77e2',
+    ),
+    'wikimedia/utfnormal' => 
+    array (
+      'pretty_version' => '3.0.2',
+      'version' => '3.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'e690d29487a6ee346bcf4cbf5a6fd89170fa2306',
+    ),
+    'wikimedia/wait-condition-loop' => 
+    array (
+      'pretty_version' => 'v2.0.2',
+      'version' => '2.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9bb0894e8c5195d43b2f2babbe4cc8f36bd5be0e',
+    ),
+    'wikimedia/wikipeg' => 
+    array (
+      'pretty_version' => '2.0.6',
+      'version' => '2.0.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '9a92384ae11e1a3b7ecfe0feef1809b1af73889b',
+    ),
+    'wikimedia/wrappedstring' => 
+    array (
+      'pretty_version' => 'v4.0.1',
+      'version' => '4.0.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '0d526868d92fa855c70a845336a777c63b30b400',
+    ),
+    'wikimedia/xmp-reader' => 
+    array (
+      'pretty_version' => '0.8.1',
+      'version' => '0.8.1.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '4fc577e28e09eec165b64ed74ce878ba4ea45a35',
+    ),
+    'wikimedia/zest-css' => 
+    array (
+      'pretty_version' => '2.0.2',
+      'version' => '2.0.2.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => '423c867462801fda08a1c31009ec19d91a68b410',
+    ),
+    'wmde/php-vuejs-templating' => 
+    array (
+      'pretty_version' => '1.0.3',
+      'version' => '1.0.3.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'f0c35ef0875d05fe74c9a0e0361b888e5c6818d0',
+    ),
+    'zordius/lightncandy' => 
+    array (
+      'pretty_version' => 'v1.2.6',
+      'version' => '1.2.6.0',
+      'aliases' => 
+      array (
+      ),
+      'reference' => 'b451f73e8b5c73e62e365997ba3c993a0376b72a',
+    ),
+  ),
 );
diff --git a/php-parallel-lint/php-parallel-lint/CHANGELOG.md b/php-parallel-lint/php-parallel-lint/CHANGELOG.md
new file mode 100644
index 0000000..66f3898
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/CHANGELOG.md
@@ -0,0 +1,169 @@
+# Changelog
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
+
+## [Unreleased]
+
+[Unreleased]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/compare/v1.3.2...HEAD
+
+## [1.3.2] - 2022-02-19
+
+### Added
+
+- Support for PHP Console Highlighter 1.0.0, which comes with PHP Console Color 1.0.1, [#92] from [@jrfnl].
+
+### Fixed
+
+- Bug fix: make Phar file run independently of project under scan [#63] from [@jrfnl], fixes [#61].
+- Bug fix: checkstyle report could contain invalid XML due to insufficient output escaping [#73] from [@gmazzap], fixes [#72].
+- Fix Phar building [#70] from [@jrfnl]. This fixes PHP 8.1 compatibility for the Phar file.
+- Documentation fix: the `--show-deprecated` option was missing in both the README as well as the CLI `help` [#84] from [@jrfnl], fixes [#81] reported by [@stronk7].
+
+### Changed
+
+- README: updated information about PHAR availability [#77] from [@jrfnl].
+- README: updated CLI example [#80] from [@jrfnl].
+- README: added documentation on how to exclude files from a scan based on the PHP version used [#80] from [@jrfnl].
+- Composer autoload improvement [#88] from [@jrfnl] with thanks to [@mfn].
+
+### Internal
+
+- Welcome [@jrfnl] as a new maintainer [#32].
+- GH Actions: set error reporting to E_ALL [#65], [#76] from [@jrfnl].
+- GH Actions: fix failing tests on PHP 5.3-5.5 [#71] from [@jrfnl] and [@villfa].
+- GH Actions: auto-cancel concurrent builds [#76] from [@jrfnl].
+- GH Actions: testing against PHP 8.2 [#74] from [@grogy].
+- GH Actions: release testing against PHP 5.3 [#79] from [@jrfnl].
+- GH Actions: update used actions [#82] from [@jrfnl].
+- Release checklist can now be found in the `.github` folder [#78] from [@jrfnl].
+
+[1.3.2]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/compare/v1.3.1...v1.3.2
+
+[#32]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues/32
+[#61]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues/61
+[#63]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/63
+[#65]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/65
+[#70]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/70
+[#71]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/71
+[#72]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues/72
+[#73]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/73
+[#74]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/74
+[#76]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/76
+[#77]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/77
+[#78]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/78
+[#79]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/79
+[#80]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/80
+[#81]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/issues/81
+[#82]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/82
+[#84]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/84
+[#88]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/88
+[#89]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/89
+[#92]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/92
+
+
+## [1.3.1] - 2021-08-13
+
+### Added
+
+- Extend by the Code Climate output format [#50] from [@lukas9393]. 
+
+### Fixed
+
+- PHP 8.1: silence the deprecation notices about missing return types [#64] from [@jrfnl].
+
+### Internal
+
+- Reformat changelog to use reflinks in changelog entries [#58] from [@glensc].
+
+[1.3.1]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/compare/v1.3.0...v1.3.1
+
+[#50]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/50
+[#58]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/58
+[#64]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/64
+
+## [1.3.0] - 2021-04-07
+
+### Added
+
+- Allow for multi-part file extensions to be passed using -e (like `-e php,php.dist`) from [@jrfnl].
+- Added syntax error callback [#30] from [@arxeiss].
+- Ignore PHP startup errors [#34] from [@jrfnl].
+- Restore php 5.3 support [#51] from [@glensc].
+
+### Fixed
+
+- Determine skip lint process failure by status code instead of stderr content [#48] from [@jankonas].
+
+### Changed
+
+- Improve wording in the readme [#52] from [@glensc].
+
+### Internal
+
+- Normalized composer.json from [@OndraM].
+- Updated PHPCS dependency from [@jrfnl].
+- Cleaned coding style from [@jrfnl].
+- Provide one true way to run the test suite [#37] from [@mfn].
+- Travis: add build against PHP 8.0 and fix failing test [#41] from [@jrfnl].
+- GitHub Actions for testing, and automatic phar creation [#46] from [@roelofr].
+- Add .github folder to .gitattributes export-ignore [#54] from [@reedy].
+- Suggest to curl composer install via HTTPS [#53] from [@reedy].
+- GH Actions: allow for manually triggering a workflow [#55] from [@jrfnl].
+- GH Actions: fix phar creation [#55] from [@jrfnl].
+- GH Actions: run the tests against all supported PHP versions [#55] from [@jrfnl].
+- GH Actions: report CS violations in the PR [#55] from [@jrfnl].
+
+[1.3.0]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/compare/v1.2.0...v1.3.0
+[#30]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/30
+[#34]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/34
+[#37]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/37
+[#41]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/41
+[#46]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/46
+[#48]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/48
+[#51]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/51
+[#52]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/52
+[#53]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/53
+[#54]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/54
+[#55]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/pull/55
+
+## [1.2.0] - 2020-04-04
+
+### Added
+
+- Added changelog.
+
+### Fixed
+
+- Fixed vendor location for running from other folder from [@Erkens].
+
+### Internal
+
+- Added a .gitattributes file from [@jrfnl], thanks for issue to [@ondrejmirtes].
+- Fixed incorrect unit tests from [@jrfnl].
+- Fixed minor grammatical errors from [@jrfnl].
+- Added Travis: test against nightly (= PHP 8) from [@jrfnl].
+- Travis: removed sudo from [@jrfnl].
+- Added info about installing like not a dependency.
+- Cleaned readme - new organization from previous package.
+- Added checklist for new version from [@szepeviktor].
+
+[1.2.0]: https://github.com/php-parallel-lint/PHP-Parallel-Lint/compare/v1.1.0...v1.2.0
+
+[@Erkens]: https://github.com/Erkens
+[@OndraM]: https://github.com/OndraM
+[@arxeiss]: https://github.com/arxeiss
+[@glensc]: https://github.com/glensc
+[@gmazzap]: https://github.com/gmazzap
+[@jankonas]: https://github.com/jankonas
+[@jrfnl]: https://github.com/jrfnl
+[@mfn]: https://github.com/mfn
+[@ondrejmirtes]: https://github.com/ondrejmirtes
+[@reedy]: https://github.com/reedy
+[@roelofr]: https://github.com/roelofr
+[@stronk7]: https://github.com/stronk7
+[@szepeviktor]: https://github.com/szepeviktor
+[@lukas9393]: https://github.com/lukas9393
+[@villfa]: https://github.com/villfa
+[@grogy]: https://github.com/grogy
diff --git a/php-parallel-lint/php-parallel-lint/LICENSE b/php-parallel-lint/php-parallel-lint/LICENSE
new file mode 100644
index 0000000..09429bb
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2012, Jakub Onderka
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of the FreeBSD Project.
diff --git a/php-parallel-lint/php-parallel-lint/README.md b/php-parallel-lint/php-parallel-lint/README.md
new file mode 100644
index 0000000..cb6b242
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/README.md
@@ -0,0 +1,122 @@
+# PHP Parallel Lint
+
+[![Downloads this Month](https://img.shields.io/packagist/dm/php-parallel-lint/php-parallel-lint.svg)](https://packagist.org/packages/php-parallel-lint/php-parallel-lint)
+[![Build Status](https://github.com/php-parallel-lint/PHP-Parallel-Lint/actions/workflows/test.yml/badge.svg)](https://github.com/php-parallel-lint/PHP-Parallel-Lint/actions/workflows/test.yml)
+[![License](https://poser.pugx.org/php-parallel-lint/php-parallel-lint/license.svg)](https://packagist.org/packages/php-parallel-lint/php-parallel-lint)
+
+This application checks syntax of PHP files in parallel.
+It can output in plain text, colored text, json and checksyntax formats.
+Additionally `blame` can be used to show commits that introduced the breakage.
+
+Running parallel jobs in PHP is inspired by Nette framework tests.
+
+The application is officially supported for use with PHP 5.3 to 8.1.
+
+## Table of contents
+
+1. [Installation](#installation)
+2. [Example output](#example-output)
+3. [History](#history)
+4. [Command line options](#command-line-options)
+5. [Recommended excludes for Symfony framework](#recommended-excludes-for-symfony-framework)
+6. [Excluding files from a scan based on the PHP version used](#excluding-files-from-a-scan-based-on-the-php-version-used)
+7. [How to upgrade](#how-to-upgrade)
+
+## Installation
+
+Install with `composer` as development dependency:
+
+    composer require --dev php-parallel-lint/php-parallel-lint
+
+Alternatively you can install as a standalone `composer` project:
+
+    composer create-project php-parallel-lint/php-parallel-lint /path/to/folder/php-parallel-lint
+    /path/to/folder/php-parallel-lint/parallel-lint # running tool
+
+For colored output, install the suggested package `php-parallel-lint/php-console-highlighter`:
+
+    composer require --dev php-parallel-lint/php-console-highlighter
+
+Since v1.3.0, a PHAR file is also made available for each release.
+This PHAR file is published as an asset for each release and can be found on the [Releases](https://github.com/php-parallel-lint/PHP-Parallel-Lint/releases) page.
+
+## Example output
+
+![Example use of tool with error](/tests/examples/example-images/use-error.png?raw=true "Example use of tool with error")
+
+
+## History
+
+This project was originally created by [@JakubOnderka] and released as
+[jakub-onderka/php-parallel-lint].
+
+Since then, Jakub has moved on to other interests and as of January 2020, the
+second most active maintainer [@grogy] has taken over maintenance of the project
+and given the project - and related dependencies - a new home in the PHP
+Parallel Lint organisation.
+
+It is strongly recommended for existing users of the (unmaintained)
+[jakub-onderka/php-parallel-lint] package to switch their dependency to
+[php-parallel-lint/php-parallel-lint], see [How to upgrade](#how-to-upgrade) below.
+
+[php-parallel-lint/php-parallel-lint]: https://github.com/php-parallel-lint/PHP-Parallel-Lint
+[grogy/php-parallel-lint]: https://github.com/grogy/PHP-Parallel-Lint
+[jakub-onderka/php-parallel-lint]: https://github.com/JakubOnderka/PHP-Parallel-Lint
+[@JakubOnderka]: https://github.com/JakubOnderka
+[@grogy]: https://github.com/grogy
+
+## Command line options
+
+- `-p <php>`                Specify PHP-CGI executable to run (default: 'php').
+- `-s`, `--short`           Set short_open_tag to On (default: Off).
+- `-a`, `--asp`             Set asp_tags to On (default: Off).
+- `-e <ext>`                Check only files with selected extensions separated by comma. (default: php,php3,php4,php5,phtml,phpt)
+- `-j <num>`                Run <num> jobs in parallel (default: 10).
+- `--exclude`               Exclude a file or directory. If you want exclude multiple items, use multiple exclude parameters.
+- `--colors`                Enable colors in console output. (disables auto detection of color support)
+- `--no-colors`             Disable colors in console output.
+- `--no-progress`           Disable progress in console output.
+- `--checkstyle`            Output results as Checkstyle XML.
+- `--json`                  Output results as JSON string (requires PHP 5.4).
+- `--gitlab`                Output results for the GitLab Code Quality Widget (requires PHP 5.4), see more in [Code Quality](https://docs.gitlab.com/ee/user/project/merge_requests/code_quality.html) documentation..
+- `--blame`                 Try to show git blame for row with error.
+- `--git <git>`             Path to Git executable to show blame message (default: 'git').
+- `--stdin`                 Load files and folder to test from standard input.
+- `--ignore-fails`          Ignore failed tests.
+- `--show-deprecated`       Show deprecations (default: Off).
+- `--syntax-error-callback` File with syntax error callback for ability to modify error, see more in [example](doc/syntax-error-callback.md).
+- `-h`, `--help`            Print this help.
+- `-V`, `--version`         Display the application version
+
+
+## Recommended excludes for Symfony framework
+
+To run from the command line:
+
+    vendor/bin/parallel-lint --exclude .git --exclude app --exclude vendor .
+
+
+## Excluding files from a scan based on the PHP version used
+
+Sometimes a particular file in a project may not comply with the project-wide minimum PHP version, like a file which is conditionally included in the project and contains PHP syntax which needs a higher PHP version to run.
+
+This can make it complicated to run Parallel Lint in a CI context, as the `exclude`s used in the command would have to be adjusted based on the PHP version on which the scan is being run.
+
+PHP Parallel Lint offers a straight-forward way around this, as files can define their own minimum PHP version like so:
+```php
+<?php // lint >= 7.4
+
+// Code which contains PHP 7.4 syntax.
+```
+
+With this comment in place, the file will be automatically skipped when PHP Parallel Lint is run on a PHP version lower than PHP 7.4.
+
+Note: The `// lint >= 7.4` comment has to be only the first line of the file and must directly follow the PHP open tag.
+
+
+## How to upgrade
+
+Are you using `jakub-onderka/php-parallel-lint` package? You can switch to `php-parallel-lint/php-parallel-lint` using:
+
+    composer remove --dev jakub-onderka/php-parallel-lint
+    composer require --dev php-parallel-lint/php-parallel-lint
diff --git a/php-parallel-lint/php-parallel-lint/bin/skip-linting.php b/php-parallel-lint/php-parallel-lint/bin/skip-linting.php
new file mode 100644
index 0000000..2c69554
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/bin/skip-linting.php
@@ -0,0 +1,19 @@
+<?php
+$stdin = fopen('php://stdin', 'r');
+$input = stream_get_contents($stdin);
+fclose($stdin);
+
+foreach (explode(PHP_EOL, $input) as $file) {
+    $skip = false;
+    $f = @fopen($file, 'r');
+    if ($f) {
+        $firstLine = fgets($f);
+        @fclose($f);
+
+        if (preg_match('~<?php\\s*\\/\\/\s*lint\s*([^\d\s]+)\s*([^\s]+)\s*~i', $firstLine, $m)) {
+            $skip = version_compare(PHP_VERSION, $m[2], $m[1]) === false;
+        }
+    }
+
+    echo $file . ';' . ($skip ? '1' : '0') . PHP_EOL;
+}
diff --git a/php-parallel-lint/php-parallel-lint/composer.json b/php-parallel-lint/php-parallel-lint/composer.json
new file mode 100644
index 0000000..31666b4
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/composer.json
@@ -0,0 +1,51 @@
+{
+    "name": "php-parallel-lint/php-parallel-lint",
+    "description": "This tool check syntax of PHP files about 20x faster than serial check.",
+    "homepage": "https://github.com/php-parallel-lint/PHP-Parallel-Lint",
+    "license": "BSD-2-Clause",
+    "authors": [
+        {
+            "name": "Jakub Onderka",
+            "email": "ahoj@jakubonderka.cz"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "ext-json": "*"
+    },
+    "replace": {
+        "grogy/php-parallel-lint": "*",
+        "jakub-onderka/php-parallel-lint": "*"
+    },
+    "require-dev": {
+        "nette/tester": "^1.3 || ^2.0",
+        "php-parallel-lint/php-console-highlighter": "0.* || ^1.0",
+        "squizlabs/php_codesniffer": "^3.6"
+    },
+    "suggest": {
+        "php-parallel-lint/php-console-highlighter": "Highlight syntax in code snippet"
+    },
+    "config": {
+        "sort-packages": true
+    },
+    "autoload": {
+        "classmap": [
+            "./src/"
+        ]
+    },
+    "autoload-dev": {
+        "classmap": [
+            "./tests/"
+        ]
+    },
+    "bin": [
+        "parallel-lint"
+    ],
+    "scripts": {
+        "test": "@php vendor/bin/tester -C -p php tests",
+        "testphp5": "@php vendor/bin/tester -c tests/php5.3-5.5.ini -p php tests"
+    },
+    "scripts-descriptions": {
+        "test": "Run all tests!"
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/parallel-lint b/php-parallel-lint/php-parallel-lint/parallel-lint
new file mode 100755
index 0000000..256425c
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/parallel-lint
@@ -0,0 +1,74 @@
+#!/usr/bin/env php
+<?php
+
+/*
+Copyright (c) 2014, Jakub Onderka
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation are those
+of the authors and should not be interpreted as representing official policies,
+either expressed or implied, of the FreeBSD Project.
+ */
+
+if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) {
+    fwrite(STDERR, "PHP Parallel Lint requires PHP 5.3.0 or newer." . PHP_EOL);
+    exit(254);
+}
+
+$autoloadLocations = array(
+    getcwd() . '/vendor/autoload.php',
+    getcwd() . '/../../autoload.php',
+    __DIR__ . '/vendor/autoload.php',
+    __DIR__ . '/../vendor/autoload.php',
+    __DIR__ . '/../../../autoload.php',
+    __DIR__ . '/../../autoload.php',
+);
+
+if (class_exists('Phar') && Phar::running() !== '') {
+    // Running from a phar file. Prevent loading - potentially blocking - project autoload file.
+    $autoloadLocations = array(
+        __DIR__ . '/vendor/autoload.php',
+    );
+}
+
+$loaded = false;
+foreach ($autoloadLocations as $autoload) {
+    if (is_file($autoload)) {
+        require_once($autoload);
+        $loaded = true;
+    }
+}
+
+if (!$loaded) {
+    fwrite(STDERR,
+        'You must set up the project dependencies, run the following commands:' . PHP_EOL .
+        'curl -s https://getcomposer.org/installer | php' . PHP_EOL .
+        'php composer.phar install' . PHP_EOL
+    );
+    exit(254);
+}
+
+require_once __DIR__ . '/src/polyfill.php';
+
+$app = new JakubOnderka\PhpParallelLint\Application();
+exit($app->run());
diff --git a/php-parallel-lint/php-parallel-lint/src/Application.php b/php-parallel-lint/php-parallel-lint/src/Application.php
new file mode 100644
index 0000000..b94e3c9
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Application.php
@@ -0,0 +1,129 @@
+<?php
+
+namespace JakubOnderka\PhpParallelLint;
+
+class Application
+{
+    const VERSION = '1.3.2';
+
+    // Return codes
+    const SUCCESS = 0,
+        WITH_ERRORS = 1,
+        FAILED = 254; // Error code 255 is reserved for PHP itself
+
+    /**
+     * Run the application
+     * @return int Return code
+     */
+    public function run()
+    {
+        if (in_array('proc_open', explode(',', ini_get('disable_functions')))) {
+            echo "Function 'proc_open' is required, but it is disabled by the 'disable_functions' ini setting.", PHP_EOL;
+            return self::FAILED;
+        }
+
+        if (in_array('-h', $_SERVER['argv']) || in_array('--help', $_SERVER['argv'])) {
+            $this->showUsage();
+            return self::SUCCESS;
+        }
+
+        if (in_array('-V', $_SERVER['argv']) || in_array('--version', $_SERVER['argv'])) {
+            $this->showVersion();
+            return self::SUCCESS;
+        }
+
+        try {
+            $settings = Settings::parseArguments($_SERVER['argv']);
+            if ($settings->stdin) {
+                $settings->addPaths(Settings::getPathsFromStdIn());
+            }
+            if (empty($settings->paths)) {
+                $this->showUsage();
+                return self::FAILED;
+            }
+            $manager = new Manager;
+            $result = $manager->run($settings);
+            if ($settings->ignoreFails) {
+                return $result->hasSyntaxError() ? self::WITH_ERRORS : self::SUCCESS;
+            } else {
+                return $result->hasError() ? self::WITH_ERRORS : self::SUCCESS;
+            }
+
+        } catch (InvalidArgumentException $e) {
+            echo "Invalid option {$e->getArgument()}", PHP_EOL, PHP_EOL;
+            $this->showOptions();
+            return self::FAILED;
+
+        } catch (Exception $e) {
+            if (isset($settings) && $settings->format === Settings::FORMAT_JSON) {
+                echo json_encode($e);
+            } else {
+                echo $e->getMessage(), PHP_EOL;
+            }
+            return self::FAILED;
+
+        } catch (\Exception $e) {
+            echo $e->getMessage(), PHP_EOL;
+            return self::FAILED;
+        }
+    }
+
+    /**
+     * Outputs the options
+     */
+    private function showOptions()
+    {
+        echo <<<HELP
+Options:
+    -p <php>                Specify PHP-CGI executable to run (default: 'php').
+    -s, --short             Set short_open_tag to On (default: Off).
+    -a, --asp               Set asp_tags to On (default: Off).
+    -e <ext>                Check only files with selected extensions separated by comma.
+                            (default: php,php3,php4,php5,phtml,phpt)
+    -j <num>                Run <num> jobs in parallel (default: 10).
+    --exclude               Exclude a file or directory. If you want exclude multiple items,
+                            use multiple exclude parameters.
+    --colors                Enable colors in console output.
+                            (disables auto detection of color support)
+    --no-colors             Disable colors in console output.
+    --no-progress           Disable progress in console output.
+    --checkstyle            Output results as Checkstyle XML.
+    --json                  Output results as JSON string
+                            (requires PHP 5.4).
+    --gitlab                Output results for the GitLab Code Quality Widget
+                            (requires PHP 5.4).
+    --blame                 Try to show git blame for row with error.
+    --git <git>             Path to Git executable to show blame message (default: 'git').
+    --stdin                 Load files and folder to test from standard input.
+    --ignore-fails          Ignore failed tests.
+    --show-deprecated       Show deprecations (default: Off).
+    --syntax-error-callback File with syntax error callback for ability to modify error
+    -h, --help              Print this help.
+    -V, --version           Display the application version
+
+HELP;
+    }
+
+    /**
+     * Outputs the current version
+     */
+    private function showVersion()
+    {
+        echo 'PHP Parallel Lint version ' . self::VERSION.PHP_EOL;
+    }
+
+    /**
+     * Shows usage
+     */
+    private function showUsage()
+    {
+        $this->showVersion();
+        echo <<<USAGE
+-------------------------------
+Usage:
+parallel-lint [sa] [-p php] [-e ext] [-j num] [--exclude dir] [files or directories]
+
+USAGE;
+        $this->showOptions();
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php b/php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php
new file mode 100644
index 0000000..0db055f
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Contracts/SyntaxErrorCallback.php
@@ -0,0 +1,13 @@
+<?php
+namespace JakubOnderka\PhpParallelLint\Contracts;
+
+use JakubOnderka\PhpParallelLint\SyntaxError;
+
+interface SyntaxErrorCallback
+{
+    /**
+     * @param SyntaxError $error
+     * @return SyntaxError
+     */
+    public function errorFound(SyntaxError $error);
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Error.php b/php-parallel-lint/php-parallel-lint/src/Error.php
new file mode 100644
index 0000000..0c9f65f
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Error.php
@@ -0,0 +1,226 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use ReturnTypeWillChange;
+
+class Error implements \JsonSerializable
+{
+    /** @var string */
+    protected $filePath;
+
+    /** @var string */
+    protected $message;
+
+    /**
+     * @param string $filePath
+     * @param string $message
+     */
+    public function __construct($filePath, $message)
+    {
+        $this->filePath = $filePath;
+        $this->message = rtrim($message);
+    }
+
+    /**
+     * @return string
+     */
+    public function getMessage()
+    {
+        return $this->message;
+    }
+
+    /**
+     * @return string
+     */
+    public function getFilePath()
+    {
+        return $this->filePath;
+    }
+
+    /**
+     * @return string
+     */
+    public function getShortFilePath()
+    {
+        $cwd = getcwd();
+
+        if ($cwd === '/') {
+            // For root directory in unix, do not modify path
+            return $this->filePath;
+        }
+
+        return preg_replace('/' . preg_quote($cwd, '/') . '/', '', $this->filePath, 1);
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.4.0)<br/>
+     * Specify data which should be serialized to JSON
+     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @return mixed data which can be serialized by <b>json_encode</b>,
+     * which is a value of any type other than a resource.
+     */
+    #[ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+        return array(
+            'type' => 'error',
+            'file' => $this->getFilePath(),
+            'message' => $this->getMessage(),
+        );
+    }
+}
+
+class Blame implements \JsonSerializable
+{
+    public $name;
+
+    public $email;
+
+    /** @var \DateTime */
+    public $datetime;
+
+    public $commitHash;
+
+    public $summary;
+
+    /**
+     * (PHP 5 &gt;= 5.4.0)<br/>
+     * Specify data which should be serialized to JSON
+     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @return mixed data which can be serialized by <b>json_encode</b>,
+     * which is a value of any type other than a resource.
+     */
+    #[ReturnTypeWillChange]
+    function jsonSerialize()
+    {
+        return array(
+            'name' => $this->name,
+            'email' => $this->email,
+            'datetime' => $this->datetime,
+            'commitHash' => $this->commitHash,
+            'summary' => $this->summary,
+        );
+    }
+
+
+}
+
+class SyntaxError extends Error
+{
+    /** @var Blame */
+    private $blame;
+
+    /**
+     * @return int|null
+     */
+    public function getLine()
+    {
+        preg_match('~on line ([0-9]+)$~', $this->message, $matches);
+
+        if ($matches && isset($matches[1])) {
+            $onLine = (int) $matches[1];
+            return $onLine;
+        }
+
+        return null;
+    }
+
+    /**
+     * @param bool $translateTokens
+     * @return mixed|string
+     */
+    public function getNormalizedMessage($translateTokens = false)
+    {
+        $message = preg_replace('~^(Parse|Fatal) error: (syntax error, )?~', '', $this->message);
+        $message = preg_replace('~ in ' . preg_quote(basename($this->filePath)) . ' on line [0-9]+$~', '', $message);
+        $message = ucfirst($message);
+
+        if ($translateTokens) {
+            $message = $this->translateTokens($message);
+        }
+
+        return $message;
+    }
+
+    /**
+     * @param Blame $blame
+     */
+    public function setBlame(Blame $blame)
+    {
+        $this->blame = $blame;
+    }
+
+    /**
+     * @return Blame
+     */
+    public function getBlame()
+    {
+        return $this->blame;
+    }
+
+    /**
+     * @param string $message
+     * @return string
+     */
+    protected function translateTokens($message)
+    {
+        static $translateTokens = array(
+            'T_FILE' => '__FILE__',
+            'T_FUNC_C' => '__FUNCTION__',
+            'T_HALT_COMPILER' => '__halt_compiler()',
+            'T_INC' => '++',
+            'T_IS_EQUAL' => '==',
+            'T_IS_GREATER_OR_EQUAL' => '>=',
+            'T_IS_IDENTICAL' => '===',
+            'T_IS_NOT_IDENTICAL' => '!==',
+            'T_IS_SMALLER_OR_EQUAL' => '<=',
+            'T_LINE' => '__LINE__',
+            'T_METHOD_C' => '__METHOD__',
+            'T_MINUS_EQUAL' => '-=',
+            'T_MOD_EQUAL' => '%=',
+            'T_MUL_EQUAL' => '*=',
+            'T_NS_C' => '__NAMESPACE__',
+            'T_NS_SEPARATOR' => '\\',
+            'T_OBJECT_OPERATOR' => '->',
+            'T_OR_EQUAL' => '|=',
+            'T_PAAMAYIM_NEKUDOTAYIM' => '::',
+            'T_PLUS_EQUAL' => '+=',
+            'T_SL' => '<<',
+            'T_SL_EQUAL' => '<<=',
+            'T_SR' => '>>',
+            'T_SR_EQUAL' => '>>=',
+            'T_START_HEREDOC' => '<<<',
+            'T_XOR_EQUAL' => '^=',
+            'T_ECHO' => 'echo'
+        );
+
+        return preg_replace_callback('~T_([A-Z_]*)~', function ($matches) use ($translateTokens) {
+            list($tokenName) = $matches;
+            if (isset($translateTokens[$tokenName])) {
+                $operator = $translateTokens[$tokenName];
+                return "$operator ($tokenName)";
+            }
+
+            return $tokenName;
+        }, $message);
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.4.0)<br/>
+     * Specify data which should be serialized to JSON
+     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @return mixed data which can be serialized by <b>json_encode</b>,
+     * which is a value of any type other than a resource.
+     */
+    public function jsonSerialize()
+    {
+        return array(
+            'type' => 'syntaxError',
+            'file' => $this->getFilePath(),
+            'line' => $this->getLine(),
+            'message' => $this->getMessage(),
+            'normalizeMessage' => $this->getNormalizedMessage(),
+            'blame' => $this->blame,
+        );
+    }
+}
\ No newline at end of file
diff --git a/php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php b/php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php
new file mode 100644
index 0000000..874fab7
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/ErrorFormatter.php
@@ -0,0 +1,140 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use JakubOnderka\PhpConsoleColor\ConsoleColor as OldConsoleColor;
+use JakubOnderka\PhpConsoleHighlighter\Highlighter as OldHighlighter;
+use PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor;
+use PHP_Parallel_Lint\PhpConsoleHighlighter\Highlighter;
+
+class ErrorFormatter
+{
+    /** @var string */
+    private $useColors;
+
+    /** @var bool */
+    private $forceColors;
+
+    /** @var bool */
+    private $translateTokens;
+
+    public function __construct($useColors = Settings::AUTODETECT, $translateTokens = false, $forceColors = false)
+    {
+        $this->useColors = $useColors;
+        $this->forceColors = $forceColors;
+        $this->translateTokens = $translateTokens;
+    }
+
+    /**
+     * @param Error $error
+     * @return string
+     */
+    public function format(Error $error)
+    {
+        if ($error instanceof SyntaxError) {
+            return $this->formatSyntaxErrorMessage($error);
+        } else {
+            if ($error->getMessage()) {
+                return $error->getMessage();
+            } else {
+                return "Unknown error for file '{$error->getFilePath()}'.";
+            }
+        }
+    }
+
+    /**
+     * @param SyntaxError $error
+     * @param bool $withCodeSnipped
+     * @return string
+     */
+    public function formatSyntaxErrorMessage(SyntaxError $error, $withCodeSnipped = true)
+    {
+        $string = "Parse error: {$error->getShortFilePath()}";
+
+        if ($error->getLine()) {
+            $onLine = $error->getLine();
+            $string .= ":$onLine" . PHP_EOL;
+
+            if ($withCodeSnipped) {
+                if ($this->useColors !== Settings::DISABLED) {
+                    $string .= $this->getColoredCodeSnippet($error->getFilePath(), $onLine);
+                } else {
+                    $string .= $this->getCodeSnippet($error->getFilePath(), $onLine);
+                }
+            }
+        }
+
+        $string .= $error->getNormalizedMessage($this->translateTokens);
+
+        if ($error->getBlame()) {
+            $blame = $error->getBlame();
+            $shortCommitHash = substr($blame->commitHash, 0, 8);
+            $dateTime = $blame->datetime->format('c');
+            $string .= PHP_EOL . "Blame {$blame->name} <{$blame->email}>, commit '$shortCommitHash' from $dateTime";
+        }
+
+        return $string;
+    }
+
+    /**
+     * @param string $filePath
+     * @param int $lineNumber
+     * @param int $linesBefore
+     * @param int $linesAfter
+     * @return string
+     */
+    protected function getCodeSnippet($filePath, $lineNumber, $linesBefore = 2, $linesAfter = 2)
+    {
+        $lines = file($filePath);
+
+        $offset = $lineNumber - $linesBefore - 1;
+        $offset = max($offset, 0);
+        $length = $linesAfter + $linesBefore + 1;
+        $lines = array_slice($lines, $offset, $length, $preserveKeys = true);
+
+        end($lines);
+        $lineStrlen = strlen(key($lines) + 1);
+
+        $snippet = '';
+        foreach ($lines as $i => $line) {
+            $snippet .= ($lineNumber === $i + 1 ? '  > ' : '    ');
+            $snippet .= str_pad($i + 1, $lineStrlen, ' ', STR_PAD_LEFT) . '| ' . rtrim($line) . PHP_EOL;
+        }
+
+        return $snippet;
+    }
+
+    /**
+     * @param string $filePath
+     * @param int $lineNumber
+     * @param int $linesBefore
+     * @param int $linesAfter
+     * @return string
+     */
+    protected function getColoredCodeSnippet($filePath, $lineNumber, $linesBefore = 2, $linesAfter = 2)
+    {
+        if (
+            class_exists('\PHP_Parallel_Lint\PhpConsoleHighlighter\Highlighter')
+            && class_exists('\PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor')
+        ) {
+            // Highlighter and ConsoleColor 1.0+.
+            $colors = new ConsoleColor();
+            $colors->setForceStyle($this->forceColors);
+            $highlighter = new Highlighter($colors);
+        } else if (
+            class_exists('\JakubOnderka\PhpConsoleHighlighter\Highlighter')
+            && class_exists('\JakubOnderka\PhpConsoleColor\ConsoleColor')
+        ) {
+            // Highlighter and ConsoleColor < 1.0.
+            $colors = new OldConsoleColor();
+            $colors->setForceStyle($this->forceColors);
+            $highlighter = new OldHighlighter($colors);
+        }
+
+        if (isset($colors, $highlighter) === false) {
+            return $this->getCodeSnippet($filePath, $lineNumber, $linesBefore, $linesAfter);
+        }
+
+        $fileContent = file_get_contents($filePath);
+        return $highlighter->getCodeSnippet($fileContent, $lineNumber, $linesBefore, $linesAfter);
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Manager.php b/php-parallel-lint/php-parallel-lint/src/Manager.php
new file mode 100644
index 0000000..84b7434
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Manager.php
@@ -0,0 +1,293 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use JakubOnderka\PhpParallelLint\Contracts\SyntaxErrorCallback;
+use JakubOnderka\PhpParallelLint\Process\GitBlameProcess;
+use JakubOnderka\PhpParallelLint\Process\PhpExecutable;
+use ReturnTypeWillChange;
+
+class Manager
+{
+    /** @var Output */
+    protected $output;
+
+    /**
+     * @param null|Settings $settings
+     * @return Result
+     * @throws Exception
+     * @throws \Exception
+     */
+    public function run(Settings $settings = null)
+    {
+        $settings = $settings ?: new Settings;
+        $output = $this->output ?: $this->getDefaultOutput($settings);
+
+        $phpExecutable = PhpExecutable::getPhpExecutable($settings->phpExecutable);
+        $olderThanPhp54 = $phpExecutable->getVersionId() < 50400; // From PHP version 5.4 are tokens translated by default
+        $translateTokens = $phpExecutable->isIsHhvmType() || $olderThanPhp54;
+
+        $output->writeHeader($phpExecutable->getVersionId(), $settings->parallelJobs, $phpExecutable->getHhvmVersion());
+
+        $files = $this->getFilesFromPaths($settings->paths, $settings->extensions, $settings->excluded);
+
+        if (empty($files)) {
+            throw new Exception('No file found to check.');
+        }
+
+        $output->setTotalFileCount(count($files));
+
+        $parallelLint = new ParallelLint($phpExecutable, $settings->parallelJobs);
+        $parallelLint->setAspTagsEnabled($settings->aspTags);
+        $parallelLint->setShortTagEnabled($settings->shortTag);
+        $parallelLint->setShowDeprecated($settings->showDeprecated);
+        $parallelLint->setSyntaxErrorCallback($this->createSyntaxErrorCallback($settings));
+
+        $parallelLint->setProcessCallback(function ($status, $file) use ($output) {
+            if ($status === ParallelLint::STATUS_OK) {
+                $output->ok();
+            } else if ($status === ParallelLint::STATUS_SKIP) {
+                $output->skip();
+            } else if ($status === ParallelLint::STATUS_ERROR) {
+                $output->error();
+            } else {
+                $output->fail();
+            }
+        });
+
+        $result = $parallelLint->lint($files);
+
+        if ($settings->blame) {
+            $this->gitBlame($result, $settings);
+        }
+
+        $output->writeResult($result, new ErrorFormatter($settings->colors, $translateTokens), $settings->ignoreFails);
+
+        return $result;
+    }
+
+    /**
+     * @param Output $output
+     */
+    public function setOutput(Output $output)
+    {
+        $this->output = $output;
+    }
+
+    /**
+     * @param Settings $settings
+     * @return Output
+     */
+    protected function getDefaultOutput(Settings $settings)
+    {
+        $writer = new ConsoleWriter;
+        switch ($settings->format) {
+            case Settings::FORMAT_JSON:
+                return new JsonOutput($writer);
+            case Settings::FORMAT_GITLAB:
+                return new GitLabOutput($writer);
+            case Settings::FORMAT_CHECKSTYLE:
+                return new CheckstyleOutput($writer);
+        }
+
+        if ($settings->colors === Settings::DISABLED) {
+            $output = new TextOutput($writer);
+        } else {
+            $output = new TextOutputColored($writer, $settings->colors);
+        }
+
+        $output->showProgress = $settings->showProgress;
+
+        return $output;
+    }
+
+    /**
+     * @param Result $result
+     * @param Settings $settings
+     * @throws Exception
+     */
+    protected function gitBlame(Result $result, Settings $settings)
+    {
+        if (!GitBlameProcess::gitExists($settings->gitExecutable)) {
+            return;
+        }
+
+        foreach ($result->getErrors() as $error) {
+            if ($error instanceof SyntaxError) {
+                $process = new GitBlameProcess($settings->gitExecutable, $error->getFilePath(), $error->getLine());
+                $process->waitForFinish();
+
+                if ($process->isSuccess()) {
+                    $blame = new Blame;
+                    $blame->name = $process->getAuthor();
+                    $blame->email = $process->getAuthorEmail();
+                    $blame->datetime = $process->getAuthorTime();
+                    $blame->commitHash = $process->getCommitHash();
+                    $blame->summary = $process->getSummary();
+
+                    $error->setBlame($blame);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param array $paths
+     * @param array $extensions
+     * @param array $excluded
+     * @return array
+     * @throws NotExistsPathException
+     */
+    protected function getFilesFromPaths(array $paths, array $extensions, array $excluded = array())
+    {
+        $extensions = array_map('preg_quote', $extensions, array_fill(0, count($extensions), '`'));
+        $regex = '`\.(?:' . implode('|', $extensions) . ')$`iD';
+        $files = array();
+
+        foreach ($paths as $path) {
+            if (is_file($path)) {
+                $files[] = $path;
+            } else if (is_dir($path)) {
+                $iterator = new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS);
+                if (!empty($excluded)) {
+                    $iterator = new RecursiveDirectoryFilterIterator($iterator, $excluded);
+                }
+                $iterator = new \RecursiveIteratorIterator(
+                    $iterator,
+                    \RecursiveIteratorIterator::LEAVES_ONLY,
+                    \RecursiveIteratorIterator::CATCH_GET_CHILD
+                );
+
+                $iterator = new \RegexIterator($iterator, $regex);
+
+                /** @var \SplFileInfo[] $iterator */
+                foreach ($iterator as $directoryFile) {
+                    $files[] = (string) $directoryFile;
+                }
+            } else {
+                throw new NotExistsPathException($path);
+            }
+        }
+
+        $files = array_unique($files);
+
+        return $files;
+    }
+
+    protected function createSyntaxErrorCallback(Settings $settings)
+    {
+        if ($settings->syntaxErrorCallbackFile === null) {
+            return null;
+        }
+
+        $fullFilePath = realpath($settings->syntaxErrorCallbackFile);
+        if ($fullFilePath === false) {
+            throw new NotExistsPathException($settings->syntaxErrorCallbackFile);
+        }
+
+        require_once $fullFilePath;
+
+        $expectedClassName = basename($fullFilePath, '.php');
+        if (!class_exists($expectedClassName)) {
+            throw new NotExistsClassException($expectedClassName, $settings->syntaxErrorCallbackFile);
+        }
+
+        $callbackInstance = new $expectedClassName;
+
+        if (!($callbackInstance instanceof SyntaxErrorCallback)) {
+            throw new NotImplementCallbackException($expectedClassName);
+        }
+
+        return $callbackInstance;
+    }
+}
+
+class RecursiveDirectoryFilterIterator extends \RecursiveFilterIterator
+{
+    /** @var \RecursiveDirectoryIterator */
+    private $iterator;
+
+    /** @var array */
+    private $excluded = array();
+
+    /**
+     * @param \RecursiveDirectoryIterator $iterator
+     * @param array $excluded
+     */
+    public function __construct(\RecursiveDirectoryIterator $iterator, array $excluded)
+    {
+        parent::__construct($iterator);
+        $this->iterator = $iterator;
+        $this->excluded = array_map(array($this, 'getPathname'), $excluded);
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.1.0)<br/>
+     * Check whether the current element of the iterator is acceptable
+     *
+     * @link http://php.net/manual/en/filteriterator.accept.php
+     * @return bool true if the current element is acceptable, otherwise false.
+     */
+    #[ReturnTypeWillChange]
+    public function accept()
+    {
+        $current = $this->current()->getPathname();
+        $current = $this->normalizeDirectorySeparator($current);
+
+        if ('.' . DIRECTORY_SEPARATOR !== $current[0] . $current[1]) {
+            $current = '.' . DIRECTORY_SEPARATOR . $current;
+        }
+
+        return !in_array($current, $this->excluded);
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.1.0)<br/>
+     * Check whether the inner iterator's current element has children
+     *
+     * @link http://php.net/manual/en/recursivefilteriterator.haschildren.php
+     * @return bool true if the inner iterator has children, otherwise false
+     */
+    #[ReturnTypeWillChange]
+    public function hasChildren()
+    {
+        return $this->iterator->hasChildren();
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.1.0)<br/>
+     * Return the inner iterator's children contained in a RecursiveFilterIterator
+     *
+     * @link http://php.net/manual/en/recursivefilteriterator.getchildren.php
+     * @return \RecursiveFilterIterator containing the inner iterator's children.
+     */
+    #[ReturnTypeWillChange]
+    public function getChildren()
+    {
+        return new self($this->iterator->getChildren(), $this->excluded);
+    }
+
+    /**
+     * @param string $file
+     * @return string
+     */
+    private function getPathname($file)
+    {
+        $file = $this->normalizeDirectorySeparator($file);
+
+        if ('.' . DIRECTORY_SEPARATOR !== $file[0] . $file[1]) {
+            $file = '.' . DIRECTORY_SEPARATOR . $file;
+        }
+
+        $directoryFile = new \SplFileInfo($file);
+        return $directoryFile->getPathname();
+    }
+
+    /**
+     * @param string $file
+     * @return string
+     */
+    private function normalizeDirectorySeparator($file)
+    {
+        return str_replace(array('\\', '/'), DIRECTORY_SEPARATOR, $file);
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Output.php b/php-parallel-lint/php-parallel-lint/src/Output.php
new file mode 100644
index 0000000..7b72915
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Output.php
@@ -0,0 +1,594 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+interface Output
+{
+    public function __construct(IWriter $writer);
+
+    public function ok();
+
+    public function skip();
+
+    public function error();
+
+    public function fail();
+
+    public function setTotalFileCount($count);
+
+    public function writeHeader($phpVersion, $parallelJobs, $hhvmVersion = null);
+
+    public function writeResult(Result $result, ErrorFormatter $errorFormatter, $ignoreFails);
+}
+
+class JsonOutput implements Output
+{
+    /** @var IWriter */
+    protected $writer;
+
+    /** @var int */
+    protected $phpVersion;
+
+    /** @var int */
+    protected $parallelJobs;
+
+    /** @var string */
+    protected $hhvmVersion;
+
+    /**
+     * @param IWriter $writer
+     */
+    public function __construct(IWriter $writer)
+    {
+        $this->writer = $writer;
+    }
+
+    public function ok()
+    {
+
+    }
+
+    public function skip()
+    {
+
+    }
+
+    public function error()
+    {
+
+    }
+
+    public function fail()
+    {
+
+    }
+
+    public function setTotalFileCount($count)
+    {
+
+    }
+
+    public function writeHeader($phpVersion, $parallelJobs, $hhvmVersion = null)
+    {
+        $this->phpVersion = $phpVersion;
+        $this->parallelJobs = $parallelJobs;
+        $this->hhvmVersion = $hhvmVersion;
+    }
+
+    public function writeResult(Result $result, ErrorFormatter $errorFormatter, $ignoreFails)
+    {
+        echo json_encode(array(
+            'phpVersion' => $this->phpVersion,
+            'hhvmVersion' => $this->hhvmVersion,
+            'parallelJobs' => $this->parallelJobs,
+            'results' => $result,
+        ));
+    }
+}
+
+class GitLabOutput implements Output
+{
+    /** @var IWriter */
+    protected $writer;
+
+    /**
+     * @param IWriter $writer
+     */
+    public function __construct(IWriter $writer)
+    {
+        $this->writer = $writer;
+    }
+
+    public function ok()
+    {
+
+    }
+
+    public function skip()
+    {
+
+    }
+
+    public function error()
+    {
+
+    }
+
+    public function fail()
+    {
+
+    }
+
+    public function setTotalFileCount($count)
+    {
+
+    }
+
+    public function writeHeader($phpVersion, $parallelJobs, $hhvmVersion = null)
+    {
+
+    }
+
+    public function writeResult(Result $result, ErrorFormatter $errorFormatter, $ignoreFails)
+    {
+        $errors = array();
+        foreach ($result->getErrors() as $error) {
+            $message = $error->getMessage();
+            $line = 1;
+            if ($error instanceof SyntaxError) {
+                $line = $error->getLine();
+            }
+            $filePath = $error->getFilePath();
+            $result = array(
+                'type' => 'issue',
+                'check_name' => 'Parse error',
+                'description' => $message,
+                'categories' => 'Style',
+                'fingerprint' => md5($filePath . $message . $line),
+                'severity' => 'minor',
+                'location' => array(
+                    'path' => $filePath,
+                    'lines' => array(
+                        'begin' => $line,
+                    ),
+                ),
+            );
+            array_push($errors, $result);
+        }
+
+        $string = json_encode($errors) . PHP_EOL;
+        $this->writer->write($string);
+    }
+}
+
+class TextOutput implements Output
+{
+    const TYPE_DEFAULT = 'default',
+        TYPE_SKIP = 'skip',
+        TYPE_ERROR = 'error',
+        TYPE_FAIL = 'fail',
+        TYPE_OK = 'ok';
+
+    /** @var int */
+    public $filesPerLine = 60;
+
+    /** @var bool */
+    public $showProgress = true;
+
+    /** @var int */
+    protected $checkedFiles;
+
+    /** @var int */
+    protected $totalFileCount;
+
+    /** @var IWriter */
+    protected $writer;
+
+    /**
+     * @param IWriter $writer
+     */
+    public function __construct(IWriter $writer)
+    {
+        $this->writer = $writer;
+    }
+
+    public function ok()
+    {
+        $this->writeMark(self::TYPE_OK);
+    }
+
+    public function skip()
+    {
+        $this->writeMark(self::TYPE_SKIP);
+    }
+
+    public function error()
+    {
+        $this->writeMark(self::TYPE_ERROR);
+    }
+
+    public function fail()
+    {
+        $this->writeMark(self::TYPE_FAIL);
+    }
+
+    /**
+     * @param string $string
+     * @param string $type
+     */
+    public function write($string, $type = self::TYPE_DEFAULT)
+    {
+        $this->writer->write($string);
+    }
+
+    /**
+     * @param string|null $line
+     * @param string $type
+     */
+    public function writeLine($line = null, $type = self::TYPE_DEFAULT)
+    {
+        $this->write($line, $type);
+        $this->writeNewLine();
+    }
+
+    /**
+     * @param int $count
+     */
+    public function writeNewLine($count = 1)
+    {
+        $this->write(str_repeat(PHP_EOL, $count));
+    }
+
+    /**
+     * @param int $count
+     */
+    public function setTotalFileCount($count)
+    {
+        $this->totalFileCount = $count;
+    }
+
+    /**
+     * @param int $phpVersion
+     * @param int $parallelJobs
+     * @param string $hhvmVersion
+     */
+    public function writeHeader($phpVersion, $parallelJobs, $hhvmVersion = null)
+    {
+        $this->write("PHP {$this->phpVersionIdToString($phpVersion)} | ");
+
+        if ($hhvmVersion) {
+            $this->write("HHVM $hhvmVersion | ");
+        }
+
+        if ($parallelJobs === 1) {
+            $this->writeLine("1 job");
+        } else {
+            $this->writeLine("{$parallelJobs} parallel jobs");
+        }
+    }
+
+    /**
+     * @param Result $result
+     * @param ErrorFormatter $errorFormatter
+     * @param bool $ignoreFails
+     */
+    public function writeResult(Result $result, ErrorFormatter $errorFormatter, $ignoreFails)
+    {
+        if ($this->showProgress) {
+            if ($this->checkedFiles % $this->filesPerLine !== 0) {
+                $rest = $this->filesPerLine - ($this->checkedFiles % $this->filesPerLine);
+                $this->write(str_repeat(' ', $rest));
+                $this->writePercent();
+            }
+
+            $this->writeNewLine(2);
+        }
+
+        $testTime = round($result->getTestTime(), 1);
+        $message = "Checked {$result->getCheckedFilesCount()} files in $testTime ";
+        $message .= $testTime == 1 ? 'second' : 'seconds';
+
+        if ($result->getSkippedFilesCount() > 0) {
+            $message .= ", skipped {$result->getSkippedFilesCount()} ";
+            $message .= ($result->getSkippedFilesCount() === 1 ? 'file' : 'files');
+        }
+
+        $this->writeLine($message);
+
+        if (!$result->hasSyntaxError()) {
+            $message = "No syntax error found";
+        } else {
+            $message = "Syntax error found in {$result->getFilesWithSyntaxErrorCount()} ";
+            $message .= ($result->getFilesWithSyntaxErrorCount() === 1 ? 'file' : 'files');
+        }
+
+        if ($result->hasFilesWithFail()) {
+            $message .= ", failed to check {$result->getFilesWithFailCount()} ";
+            $message .= ($result->getFilesWithFailCount() === 1 ? 'file' : 'files');
+
+            if ($ignoreFails) {
+                $message .= ' (ignored)';
+            }
+        }
+
+        $hasError = $ignoreFails ? $result->hasSyntaxError() : $result->hasError();
+        $this->writeLine($message, $hasError ? self::TYPE_ERROR : self::TYPE_OK);
+
+        if ($result->hasError()) {
+            $this->writeNewLine();
+            foreach ($result->getErrors() as $error) {
+                $this->writeLine(str_repeat('-', 60));
+                $this->writeLine($errorFormatter->format($error));
+            }
+        }
+    }
+
+    protected function writeMark($type)
+    {
+        ++$this->checkedFiles;
+
+        if ($this->showProgress) {
+            if ($type === self::TYPE_OK) {
+                $this->writer->write('.');
+
+            } else if ($type === self::TYPE_SKIP) {
+                $this->write('S', self::TYPE_SKIP);
+
+            } else if ($type === self::TYPE_ERROR) {
+                $this->write('X', self::TYPE_ERROR);
+
+            } else if ($type === self::TYPE_FAIL) {
+                $this->writer->write('-');
+            }
+
+            if ($this->checkedFiles % $this->filesPerLine === 0) {
+                $this->writePercent();
+            }
+        }
+    }
+
+    protected function writePercent()
+    {
+        $percent = floor($this->checkedFiles / $this->totalFileCount * 100);
+        $current = $this->stringWidth($this->checkedFiles, strlen($this->totalFileCount));
+        $this->writeLine(" $current/$this->totalFileCount ($percent %)");
+    }
+
+    /**
+     * @param string $input
+     * @param int $width
+     * @return string
+     */
+    protected function stringWidth($input, $width = 3)
+    {
+        $multiplier = $width - strlen($input);
+        return str_repeat(' ', $multiplier > 0 ? $multiplier : 0) . $input;
+    }
+
+    /**
+     * @param int $phpVersionId
+     * @return string
+     */
+    protected function phpVersionIdToString($phpVersionId)
+    {
+        $releaseVersion = (int) substr($phpVersionId, -2, 2);
+        $minorVersion = (int) substr($phpVersionId, -4, 2);
+        $majorVersion = (int) substr($phpVersionId, 0, strlen($phpVersionId) - 4);
+
+        return "$majorVersion.$minorVersion.$releaseVersion";
+    }
+}
+
+class CheckstyleOutput implements Output
+{
+    private $writer;
+
+    public function __construct(IWriter $writer)
+    {
+        $this->writer = $writer;
+    }
+
+    public function ok()
+    {
+    }
+
+    public function skip()
+    {
+    }
+
+    public function error()
+    {
+    }
+
+    public function fail()
+    {
+    }
+
+    public function setTotalFileCount($count)
+    {
+    }
+
+    public function writeHeader($phpVersion, $parallelJobs, $hhvmVersion = null)
+    {
+        $this->writer->write('<?xml version="1.0" encoding="UTF-8"?>' . PHP_EOL);
+    }
+
+    public function writeResult(Result $result, ErrorFormatter $errorFormatter, $ignoreFails)
+    {
+        $this->writer->write('<checkstyle>' . PHP_EOL);
+        $errors = array();
+
+        foreach ($result->getErrors() as $error) {
+            $message = $error->getMessage();
+            if ($error instanceof SyntaxError) {
+                $line = $error->getLine();
+                $source = "Syntax Error";
+            } else {
+                $line = 1;
+                $source = "Linter Error";
+            }
+
+            $errors[$error->getShortFilePath()][] = array(
+                'message' => $message,
+                'line' => $line,
+                'source' => $source
+            );
+        }
+
+        foreach ($errors as $file => $fileErrors) {
+            $this->writer->write(sprintf('    <file name="%s">', $file) . PHP_EOL);
+            foreach ($fileErrors as $fileError) {
+                $this->writer->write(
+                    sprintf(
+                        '        <error line="%d" severity="ERROR" message="%s" source="%s" />',
+                        $fileError['line'],
+                        htmlspecialchars($fileError['message'], ENT_COMPAT, 'UTF-8'),
+                        $fileError['source']
+                    ) .
+                    PHP_EOL
+                );
+            }
+            $this->writer->write('    </file>' . PHP_EOL);
+        }
+
+        $this->writer->write('</checkstyle>' . PHP_EOL);
+    }
+}
+
+class TextOutputColored extends TextOutput
+{
+    /** @var \PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor|\JakubOnderka\PhpConsoleColor\ConsoleColor */
+    private $colors;
+
+    public function __construct(IWriter $writer, $colors = Settings::AUTODETECT)
+    {
+        parent::__construct($writer);
+
+        if (class_exists('\PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor')) {
+            $this->colors = new \PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor();
+            $this->colors->setForceStyle($colors === Settings::FORCED);
+        } else if (class_exists('\JakubOnderka\PhpConsoleColor\ConsoleColor')) {
+            $this->colors = new \JakubOnderka\PhpConsoleColor\ConsoleColor();
+            $this->colors->setForceStyle($colors === Settings::FORCED);
+        }
+    }
+
+    /**
+     * @param string $string
+     * @param string $type
+     * @throws \PHP_Parallel_Lint\PhpConsoleColor\InvalidStyleException|\JakubOnderka\PhpConsoleColor\InvalidStyleException
+     */
+    public function write($string, $type = self::TYPE_DEFAULT)
+    {
+        if (
+            !$this->colors instanceof \PHP_Parallel_Lint\PhpConsoleColor\ConsoleColor
+            && !$this->colors instanceof \JakubOnderka\PhpConsoleColor\ConsoleColor
+        ) {
+            parent::write($string, $type);
+        } else {
+            switch ($type) {
+                case self::TYPE_OK:
+                    parent::write($this->colors->apply('bg_green', $string));
+                    break;
+
+                case self::TYPE_SKIP:
+                    parent::write($this->colors->apply('bg_yellow', $string));
+                    break;
+
+                case self::TYPE_ERROR:
+                    parent::write($this->colors->apply('bg_red', $string));
+                    break;
+
+                default:
+                    parent::write($string);
+            }
+        }
+    }
+}
+
+interface IWriter
+{
+    /**
+     * @param string $string
+     */
+    public function write($string);
+}
+
+class NullWriter implements IWriter
+{
+    /**
+     * @param string $string
+     */
+    public function write($string)
+    {
+
+    }
+}
+
+class ConsoleWriter implements IWriter
+{
+    /**
+     * @param string $string
+     */
+    public function write($string)
+    {
+        echo $string;
+    }
+}
+
+class FileWriter implements IWriter
+{
+    /** @var string */
+    protected $logFile;
+
+    /** @var string */
+    protected $buffer;
+
+    public function __construct($logFile)
+    {
+        $this->logFile = $logFile;
+    }
+
+    public function write($string)
+    {
+        $this->buffer .= $string;
+    }
+
+    public function __destruct()
+    {
+        file_put_contents($this->logFile, $this->buffer);
+    }
+}
+
+class MultipleWriter implements IWriter
+{
+    /** @var IWriter[] */
+    protected $writers;
+
+    /**
+     * @param IWriter[] $writers
+     */
+    public function __construct(array $writers)
+    {
+        foreach ($writers as $writer) {
+            $this->addWriter($writer);
+        }
+    }
+
+    /**
+     * @param IWriter $writer
+     */
+    public function addWriter(IWriter $writer)
+    {
+        $this->writers[] = $writer;
+    }
+
+    /**
+     * @param $string
+     */
+    public function write($string)
+    {
+        foreach ($this->writers as $writer) {
+            $writer->write($string);
+        }
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/ParallelLint.php b/php-parallel-lint/php-parallel-lint/src/ParallelLint.php
new file mode 100644
index 0000000..b1825f3
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/ParallelLint.php
@@ -0,0 +1,286 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use JakubOnderka\PhpParallelLint\Contracts\SyntaxErrorCallback;
+use JakubOnderka\PhpParallelLint\Process\LintProcess;
+use JakubOnderka\PhpParallelLint\Process\PhpExecutable;
+use JakubOnderka\PhpParallelLint\Process\SkipLintProcess;
+
+class ParallelLint
+{
+    const STATUS_OK = 'ok',
+        STATUS_SKIP = 'skip',
+        STATUS_FAIL = 'fail',
+        STATUS_ERROR = 'error';
+
+    /** @var int */
+    private $parallelJobs;
+
+    /** @var PhpExecutable */
+    private $phpExecutable;
+
+    /** @var bool */
+    private $aspTagsEnabled = false;
+
+    /** @var bool */
+    private $shortTagEnabled = false;
+
+    /** @var callable */
+    private $processCallback;
+
+    /** @var bool */
+    private $showDeprecated = false;
+
+    /** @var SyntaxErrorCallback|null */
+    private $syntaxErrorCallback = null;
+
+    public function __construct(PhpExecutable $phpExecutable, $parallelJobs = 10)
+    {
+        $this->phpExecutable = $phpExecutable;
+        $this->parallelJobs = $parallelJobs;
+    }
+
+    /**
+     * @param array $files
+     * @return Result
+     * @throws \Exception
+     */
+    public function lint(array $files)
+    {
+        $startTime = microtime(true);
+
+        $skipLintProcess = new SkipLintProcess($this->phpExecutable, $files);
+
+        $processCallback = is_callable($this->processCallback) ? $this->processCallback : function () {
+        };
+
+        /**
+         * @var LintProcess[] $running
+         * @var LintProcess[] $waiting
+         */
+        $errors = $running = $waiting = array();
+        $skippedFiles = $checkedFiles = array();
+
+        while ($files || $running) {
+            for ($i = count($running); $files && $i < $this->parallelJobs; $i++) {
+                $file = array_shift($files);
+
+                if ($skipLintProcess->isSkipped($file) === true) {
+                    $skippedFiles[] = $file;
+                    $processCallback(self::STATUS_SKIP, $file);
+                } else {
+                    $running[$file] = new LintProcess(
+                        $this->phpExecutable,
+                        $file,
+                        $this->aspTagsEnabled,
+                        $this->shortTagEnabled,
+                        $this->showDeprecated
+                    );
+                }
+            }
+
+            $skipLintProcess->getChunk();
+            usleep(100);
+
+            foreach ($running as $file => $process) {
+                if ($process->isFinished()) {
+                    unset($running[$file]);
+
+                    $skipStatus = $skipLintProcess->isSkipped($file);
+                    if ($skipStatus === null) {
+                        $waiting[$file] = $process;
+
+                    } else if ($skipStatus === true) {
+                        $skippedFiles[] = $file;
+                        $processCallback(self::STATUS_SKIP, $file);
+
+                    } else if ($process->containsError()) {
+                        $checkedFiles[] = $file;
+                        $errors[] = $this->triggerSyntaxErrorCallback(new SyntaxError($file, $process->getSyntaxError()));
+                        $processCallback(self::STATUS_ERROR, $file);
+
+                    } else if ($process->isSuccess()) {
+                        $checkedFiles[] = $file;
+                        $processCallback(self::STATUS_OK, $file);
+
+
+                    } else {
+                        $errors[] = new Error($file, $process->getOutput());
+                        $processCallback(self::STATUS_FAIL, $file);
+                    }
+                }
+            }
+        }
+
+        if (!empty($waiting)) {
+            $skipLintProcess->waitForFinish();
+
+            if ($skipLintProcess->isFail()) {
+                $message = "Error in skip-linting.php process\nError output: {$skipLintProcess->getErrorOutput()}";
+                throw new \Exception($message);
+            }
+
+            foreach ($waiting as $file => $process) {
+                $skipStatus = $skipLintProcess->isSkipped($file);
+                if ($skipStatus === null) {
+                    throw new \Exception("File $file has empty skip status. Please contact the author of PHP Parallel Lint.");
+
+                } else if ($skipStatus === true) {
+                    $skippedFiles[] = $file;
+                    $processCallback(self::STATUS_SKIP, $file);
+
+                } else if ($process->isSuccess()) {
+                    $checkedFiles[] = $file;
+                    $processCallback(self::STATUS_OK, $file);
+
+                } else if ($process->containsError()) {
+                    $checkedFiles[] = $file;
+                    $errors[] = $this->triggerSyntaxErrorCallback(new SyntaxError($file, $process->getSyntaxError()));
+                    $processCallback(self::STATUS_ERROR, $file);
+
+                } else {
+                    $errors[] = new Error($file, $process->getOutput());
+                    $processCallback(self::STATUS_FAIL, $file);
+                }
+            }
+        }
+
+        $testTime = microtime(true) - $startTime;
+
+        return new Result($errors, $checkedFiles, $skippedFiles, $testTime);
+    }
+
+    /**
+     * @return int
+     */
+    public function getParallelJobs()
+    {
+        return $this->parallelJobs;
+    }
+
+    /**
+     * @param int $parallelJobs
+     * @return ParallelLint
+     */
+    public function setParallelJobs($parallelJobs)
+    {
+        $this->parallelJobs = $parallelJobs;
+
+        return $this;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPhpExecutable()
+    {
+        return $this->phpExecutable;
+    }
+
+    /**
+     * @param string $phpExecutable
+     * @return ParallelLint
+     */
+    public function setPhpExecutable($phpExecutable)
+    {
+        $this->phpExecutable = $phpExecutable;
+
+        return $this;
+    }
+
+    /**
+     * @return callable
+     */
+    public function getProcessCallback()
+    {
+        return $this->processCallback;
+    }
+
+    /**
+     * @param callable $processCallback
+     * @return ParallelLint
+     */
+    public function setProcessCallback($processCallback)
+    {
+        $this->processCallback = $processCallback;
+
+        return $this;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isAspTagsEnabled()
+    {
+        return $this->aspTagsEnabled;
+    }
+
+    /**
+     * @param boolean $aspTagsEnabled
+     * @return ParallelLint
+     */
+    public function setAspTagsEnabled($aspTagsEnabled)
+    {
+        $this->aspTagsEnabled = $aspTagsEnabled;
+
+        return $this;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isShortTagEnabled()
+    {
+        return $this->shortTagEnabled;
+    }
+
+    /**
+     * @param boolean $shortTagEnabled
+     * @return ParallelLint
+     */
+    public function setShortTagEnabled($shortTagEnabled)
+    {
+        $this->shortTagEnabled = $shortTagEnabled;
+
+        return $this;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isShowDeprecated()
+    {
+        return $this->showDeprecated;
+    }
+
+    /**
+     * @param $showDeprecated
+     * @return ParallelLint
+     */
+    public function setShowDeprecated($showDeprecated)
+    {
+        $this->showDeprecated = $showDeprecated;
+
+        return $this;
+    }
+
+    public function triggerSyntaxErrorCallback($syntaxError)
+    {
+        if ($this->syntaxErrorCallback === null) {
+            return $syntaxError;
+        }
+
+        return $this->syntaxErrorCallback->errorFound($syntaxError);
+    }
+
+    /**
+     * @param SyntaxErrorCallback|null $syntaxErrorCallback
+     * @return ParallelLint
+     */
+    public function setSyntaxErrorCallback($syntaxErrorCallback)
+    {
+        $this->syntaxErrorCallback = $syntaxErrorCallback;
+
+        return $this;
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php b/php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php
new file mode 100644
index 0000000..2d675b8
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/GitBlameProcess.php
@@ -0,0 +1,147 @@
+<?php
+namespace JakubOnderka\PhpParallelLint\Process;
+
+use JakubOnderka\PhpParallelLint\RunTimeException;
+
+class GitBlameProcess extends Process
+{
+    /**
+     * @param string $gitExecutable
+     * @param string $file
+     * @param int $line
+     * @throws RunTimeException
+     */
+    public function __construct($gitExecutable, $file, $line)
+    {
+        $arguments = array('blame', '-p', '-L', "$line,+1", $file);
+        parent::__construct($gitExecutable, $arguments);
+    }
+
+    /**
+     * @return bool
+     * @throws RunTimeException
+     */
+    public function isSuccess()
+    {
+        return $this->getStatusCode() === 0;
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getAuthor()
+    {
+        if (!$this->isSuccess()) {
+            throw new RunTimeException("Author can only be retrieved for successful process output.");
+        }
+
+        $output = $this->getOutput();
+        preg_match('~^author (.*)~m', $output, $matches);
+        return $matches[1];
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getAuthorEmail()
+    {
+        if (!$this->isSuccess()) {
+            throw new RunTimeException("Author e-mail can only be retrieved for successful process output.");
+        }
+
+        $output = $this->getOutput();
+        preg_match('~^author-mail <(.*)>~m', $output, $matches);
+        return $matches[1];
+    }
+
+    /**
+     * @return \DateTime
+     * @throws RunTimeException
+     */
+    public function getAuthorTime()
+    {
+        if (!$this->isSuccess()) {
+            throw new RunTimeException("Author time can only be retrieved for successful process output.");
+        }
+
+        $output = $this->getOutput();
+
+        preg_match('~^author-time (.*)~m', $output, $matches);
+        $time = $matches[1];
+
+        preg_match('~^author-tz (.*)~m', $output, $matches);
+        $zone = $matches[1];
+
+        return $this->getDateTime($time, $zone);
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getCommitHash()
+    {
+        if (!$this->isSuccess()) {
+            throw new RunTimeException("Commit hash can only be retrieved for successful process output.");
+        }
+
+        return substr($this->getOutput(), 0, strpos($this->getOutput(), ' '));
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getSummary()
+    {
+        if (!$this->isSuccess()) {
+            throw new RunTimeException("Commit summary can only be retrieved for successful process output.");
+        }
+
+        $output = $this->getOutput();
+        preg_match('~^summary (.*)~m', $output, $matches);
+        return $matches[1];
+    }
+
+    /**
+     * @param string $gitExecutable
+     * @return bool
+     * @throws RunTimeException
+     */
+    public static function gitExists($gitExecutable)
+    {
+        $process = new Process($gitExecutable, array('--version'));
+        $process->waitForFinish();
+        return $process->getStatusCode() === 0;
+    }
+
+    /**
+     * This harakiri method is required to correct support time zone in PHP 5.4
+     *
+     * @param int $time
+     * @param string $zone
+     * @return \DateTime
+     * @throws \Exception
+     */
+    protected function getDateTime($time, $zone)
+    {
+        $utcTimeZone = new \DateTimeZone('UTC');
+        $datetime = \DateTime::createFromFormat('U', $time, $utcTimeZone);
+
+        $way = substr($zone, 0, 1);
+        $hours = (int) substr($zone, 1, 2);
+        $minutes = (int) substr($zone, 3, 2);
+
+        $interval = new \DateInterval("PT{$hours}H{$minutes}M");
+
+        if ($way === '+') {
+            $datetime->add($interval);
+        } else {
+            $datetime->sub($interval);
+        }
+
+        return new \DateTime($datetime->format('Y-m-d\TH:i:s') . $zone, $utcTimeZone);
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php b/php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php
new file mode 100644
index 0000000..e2e6b2d
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/LintProcess.php
@@ -0,0 +1,137 @@
+<?php
+namespace JakubOnderka\PhpParallelLint\Process;
+
+use JakubOnderka\PhpParallelLint\RunTimeException;
+
+class LintProcess extends PhpProcess
+{
+    const FATAL_ERROR = 'Fatal error';
+    const PARSE_ERROR = 'Parse error';
+    const DEPRECATED_ERROR = 'Deprecated:';
+
+    /**
+     * @var bool
+     */
+    private $showDeprecatedErrors;
+
+    /**
+     * @param PhpExecutable $phpExecutable
+     * @param string $fileToCheck Path to file to check
+     * @param bool $aspTags
+     * @param bool $shortTag
+     * @param bool $deprecated
+     * @throws RunTimeException
+     */
+    public function __construct(PhpExecutable $phpExecutable, $fileToCheck, $aspTags = false, $shortTag = false, $deprecated = false)
+    {
+        if (empty($fileToCheck)) {
+            throw new \InvalidArgumentException("File to check must be set.");
+        }
+
+        $parameters = array(
+            '-d asp_tags=' . ($aspTags ? 'On' : 'Off'),
+            '-d short_open_tag=' . ($shortTag ? 'On' : 'Off'),
+            '-d error_reporting=E_ALL',
+            '-n',
+            '-l',
+            $fileToCheck,
+        );
+
+        $this->showDeprecatedErrors = $deprecated;
+        parent::__construct($phpExecutable, $parameters);
+    }
+
+    /**
+     * @return bool
+     * @throws
+     */
+    public function containsError()
+    {
+        return $this->containsParserError($this->getOutput()) ||
+            $this->containsFatalError($this->getOutput()) ||
+            $this->containsDeprecatedError($this->getOutput());
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getSyntaxError()
+    {
+        if ($this->containsError()) {
+            // Look for fatal errors first
+            foreach (explode("\n", $this->getOutput()) as $line) {
+                if ($this->containsFatalError($line)) {
+                    return $line;
+                }
+            }
+
+            // Look for parser errors second
+            foreach (explode("\n", $this->getOutput()) as $line) {
+                if ($this->containsParserError($line)) {
+                    return $line;
+                }
+            }
+
+            // Look for deprecated errors third
+            foreach (explode("\n", $this->getOutput()) as $line) {
+                if ($this->containsDeprecatedError($line)) {
+                    return $line;
+                }
+            }
+
+            throw new RunTimeException("The output '{$this->getOutput()}' does not contain Parse or Syntax errors");
+        }
+
+        return false;
+    }
+
+    /**
+     * @return bool
+     * @throws RunTimeException
+     */
+    public function isFail()
+    {
+        return defined('PHP_WINDOWS_VERSION_MAJOR') ? $this->getStatusCode() === 1 : parent::isFail();
+    }
+
+    /**
+     * @return bool
+     * @throws RunTimeException
+     */
+    public function isSuccess()
+    {
+        return $this->getStatusCode() === 0;
+    }
+
+    /**
+     * @param string $string
+     * @return bool
+     */
+    private function containsParserError($string)
+    {
+        return strpos($string, self::PARSE_ERROR) !== false;
+    }
+
+    /**
+     * @param string $string
+     * @return bool
+     */
+    private function containsFatalError($string)
+    {
+        return strpos($string, self::FATAL_ERROR) !== false;
+    }
+
+    /**
+     * @param string $string
+     * @return bool
+     */
+    private function containsDeprecatedError($string)
+    {
+        if ($this->showDeprecatedErrors === false) {
+            return false;
+        }
+
+        return strpos($string, self::DEPRECATED_ERROR) !== false;
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php b/php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php
new file mode 100644
index 0000000..001b1e9
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/PhpExecutable.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace JakubOnderka\PhpParallelLint\Process;
+
+use JakubOnderka\PhpParallelLint\RunTimeException;
+
+class PhpExecutable
+{
+    /** @var string */
+    private $path;
+
+    /**
+     * Version as PHP_VERSION_ID constant
+     * @var int
+     */
+    private $versionId;
+
+    /** @var string */
+    private $hhvmVersion;
+
+    /** @var bool */
+    private $isHhvmType;
+
+    /**
+     * @param string $path
+     * @param int $versionId
+     * @param string $hhvmVersion
+     * @param bool $isHhvmType
+     */
+    public function __construct($path, $versionId, $hhvmVersion, $isHhvmType)
+    {
+        $this->path = $path;
+        $this->versionId = $versionId;
+        $this->hhvmVersion = $hhvmVersion;
+        $this->isHhvmType = $isHhvmType;
+    }
+
+    /**
+     * @return string
+     */
+    public function getHhvmVersion()
+    {
+        return $this->hhvmVersion;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isIsHhvmType()
+    {
+        return $this->isHhvmType;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPath()
+    {
+        return $this->path;
+    }
+
+    /**
+     * @return int
+     */
+    public function getVersionId()
+    {
+        return $this->versionId;
+    }
+
+    /**
+     * @param string $phpExecutable
+     * @return PhpExecutable
+     * @throws \Exception
+     */
+    public static function getPhpExecutable($phpExecutable)
+    {
+        $codeToExecute = <<<PHP
+echo 'PHP;', PHP_VERSION_ID, ';', defined('HPHP_VERSION') ? HPHP_VERSION : null;
+PHP;
+
+        $process = new Process($phpExecutable, array('-n', '-r', $codeToExecute));
+        $process->waitForFinish();
+
+        try {
+            if ($process->getStatusCode() !== 0 && $process->getStatusCode() !== 255) {
+                throw new RunTimeException("Unable to execute '{$phpExecutable}'.");
+            }
+
+            return self::getPhpExecutableFromOutput($phpExecutable, $process->getOutput());
+
+        } catch (RunTimeException $e) {
+            // Try HHVM type
+            $process = new Process($phpExecutable, array('--php', '-r', $codeToExecute));
+            $process->waitForFinish();
+
+            if ($process->getStatusCode() !== 0 && $process->getStatusCode() !== 255) {
+                throw new RunTimeException("Unable to execute '{$phpExecutable}'.");
+            }
+
+            return self::getPhpExecutableFromOutput($phpExecutable, $process->getOutput(), $isHhvmType = true);
+        }
+    }
+
+    /**
+     * @param string $phpExecutable
+     * @param string $output
+     * @param bool $isHhvmType
+     * @return PhpExecutable
+     * @throws RunTimeException
+     */
+    private static function getPhpExecutableFromOutput($phpExecutable, $output, $isHhvmType = false)
+    {
+        $parts = explode(';', $output);
+
+        if ($parts[0] !== 'PHP' || !preg_match('~([0-9]+)~', $parts[1], $matches)) {
+            throw new RunTimeException("'{$phpExecutable}' is not valid PHP binary.");
+        }
+
+        $hhvmVersion = isset($parts[2]) ? $parts[2] : false;
+
+        return new PhpExecutable(
+            $phpExecutable,
+            intval($matches[1]),
+            $hhvmVersion,
+            $isHhvmType
+        );
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php b/php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php
new file mode 100644
index 0000000..0df293a
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/PhpProcess.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace JakubOnderka\PhpParallelLint\Process;
+
+class PhpProcess extends Process
+{
+    /**
+     * @param PhpExecutable $phpExecutable
+     * @param array $parameters
+     * @param string|null $stdIn
+     * @throws \JakubOnderka\PhpParallelLint\RunTimeException
+     */
+    public function __construct(PhpExecutable $phpExecutable, array $parameters = array(), $stdIn = null)
+    {
+        $constructedParameters = $this->constructParameters($parameters, $phpExecutable->isIsHhvmType());
+        parent::__construct($phpExecutable->getPath(), $constructedParameters, $stdIn);
+    }
+
+    /**
+     * @param array $parameters
+     * @param bool $isHhvm
+     * @return array
+     */
+    private function constructParameters(array $parameters, $isHhvm)
+    {
+        // Always ignore PHP startup errors ("Unable to load library...") in sub-processes.
+        array_unshift($parameters, '-d display_startup_errors=0');
+
+        if ($isHhvm) {
+            array_unshift($parameters, '-php');
+        }
+
+        return $parameters;
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/Process.php b/php-parallel-lint/php-parallel-lint/src/Process/Process.php
new file mode 100644
index 0000000..190511e
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/Process.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace JakubOnderka\PhpParallelLint\Process;
+
+use JakubOnderka\PhpParallelLint\RunTimeException;
+
+class Process
+{
+    const STDIN = 0,
+        STDOUT = 1,
+        STDERR = 2;
+
+    const READ = 'r',
+        WRITE = 'w';
+
+    /** @var resource */
+    protected $process;
+
+    /** @var resource */
+    protected $stdout;
+
+    /** @var resource */
+    protected $stderr;
+
+    /** @var string */
+    private $output;
+
+    /** @var string */
+    private $errorOutput;
+
+    /** @var int */
+    private $statusCode;
+
+    /**
+     * @param string $executable
+     * @param string[] $arguments
+     * @param string $stdInInput
+     * @throws RunTimeException
+     */
+    public function __construct($executable, array $arguments = array(), $stdInInput = null)
+    {
+        $descriptors = array(
+            self::STDIN  => array('pipe', self::READ),
+            self::STDOUT => array('pipe', self::WRITE),
+            self::STDERR => array('pipe', self::WRITE),
+        );
+
+        $cmdLine = $executable . ' ' . implode(' ', array_map('escapeshellarg', $arguments));
+        $this->process = proc_open($cmdLine, $descriptors, $pipes, null, null, array('bypass_shell' => true));
+
+        if ($this->process === false || $this->process === null) {
+            throw new RunTimeException("Cannot create new process $cmdLine");
+        }
+
+        list($stdin, $this->stdout, $this->stderr) = $pipes;
+
+        if ($stdInInput) {
+            fwrite($stdin, $stdInInput);
+        }
+
+        fclose($stdin);
+    }
+
+    /**
+     * @return bool
+     */
+    public function isFinished()
+    {
+        if ($this->statusCode !== null) {
+            return true;
+        }
+
+        $status = proc_get_status($this->process);
+
+        if ($status['running']) {
+            return false;
+        } else if ($this->statusCode === null) {
+            $this->statusCode = (int) $status['exitcode'];
+        }
+
+        // Process outputs
+        $this->output = stream_get_contents($this->stdout);
+        fclose($this->stdout);
+
+        $this->errorOutput = stream_get_contents($this->stderr);
+        fclose($this->stderr);
+
+        $statusCode = proc_close($this->process);
+
+        if ($this->statusCode === null) {
+            $this->statusCode = $statusCode;
+        }
+
+        $this->process = null;
+
+        return true;
+    }
+
+    public function waitForFinish()
+    {
+        while (!$this->isFinished()) {
+            usleep(100);
+        }
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getOutput()
+    {
+        if (!$this->isFinished()) {
+            throw new RunTimeException("Cannot get output for running process");
+        }
+
+        return $this->output;
+    }
+
+    /**
+     * @return string
+     * @throws RunTimeException
+     */
+    public function getErrorOutput()
+    {
+        if (!$this->isFinished()) {
+            throw new RunTimeException("Cannot get error output for running process");
+        }
+
+        return $this->errorOutput;
+    }
+
+    /**
+     * @return int
+     * @throws RunTimeException
+     */
+    public function getStatusCode()
+    {
+        if (!$this->isFinished()) {
+            throw new RunTimeException("Cannot get status code for running process");
+        }
+
+        return $this->statusCode;
+    }
+
+    /**
+     * @return bool
+     * @throws RunTimeException
+     */
+    public function isFail()
+    {
+        return $this->getStatusCode() === 1;
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php b/php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php
new file mode 100644
index 0000000..52f4e76
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Process/SkipLintProcess.php
@@ -0,0 +1,91 @@
+<?php
+namespace JakubOnderka\PhpParallelLint\Process;
+
+use JakubOnderka\PhpParallelLint\RunTimeException;
+
+class SkipLintProcess extends PhpProcess
+{
+    /** @var array */
+    private $skipped = array();
+
+    /** @var bool */
+    private $done = false;
+
+    /** @var string */
+    private $endLastChunk = '';
+
+    /**
+     * @param PhpExecutable $phpExecutable
+     * @param array $filesToCheck
+     * @throws RunTimeException
+     */
+    public function __construct(PhpExecutable $phpExecutable, array $filesToCheck)
+    {
+        $scriptPath = __DIR__ . '/../../bin/skip-linting.php';
+        $script = file_get_contents($scriptPath);
+
+        if (!$script) {
+            throw new RunTimeException("skip-linting.php script not found in '$scriptPath'.");
+        }
+
+        $script = str_replace('<?php', '', $script);
+
+        $parameters = array('-d', 'display_errors=stderr', '-r', $script);
+        parent::__construct($phpExecutable, $parameters, implode(PHP_EOL, $filesToCheck));
+    }
+
+    /**
+     * @throws RunTimeException
+     */
+    public function getChunk()
+    {
+        if (!$this->isFinished()) {
+            $this->processLines(fread($this->stdout, 8192));
+        }
+    }
+
+    /**
+     * @return bool
+     * @throws \JakubOnderka\PhpParallelLint\RunTimeException
+     */
+    public function isFinished()
+    {
+        $isFinished = parent::isFinished();
+        if ($isFinished && !$this->done) {
+            $this->done = true;
+            $output = $this->getOutput();
+            $this->processLines($output);
+        }
+
+        return $isFinished;
+    }
+
+    /**
+     * @param string $file
+     * @return bool|null
+     */
+    public function isSkipped($file)
+    {
+        if (isset($this->skipped[$file])) {
+            return $this->skipped[$file];
+        }
+
+        return null;
+    }
+
+    /**
+     * @param string $content
+     */
+    private function processLines($content)
+    {
+        if (!empty($content)) {
+            $lines = explode(PHP_EOL, $this->endLastChunk . $content);
+            $this->endLastChunk = array_pop($lines);
+            foreach ($lines as $line) {
+                $parts = explode(';', $line);
+                list($file, $status) = $parts;
+                $this->skipped[$file] = $status === '1' ? true : false;
+            }
+        }
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/Result.php b/php-parallel-lint/php-parallel-lint/src/Result.php
new file mode 100644
index 0000000..9f6a368
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Result.php
@@ -0,0 +1,171 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use ReturnTypeWillChange;
+
+class Result implements \JsonSerializable
+{
+    /** @var Error[] */
+    private $errors;
+
+    /** @var array */
+    private $checkedFiles;
+
+    /** @var array */
+    private $skippedFiles;
+
+    /** @var float */
+    private $testTime;
+
+    /**
+     * @param Error[] $errors
+     * @param array $checkedFiles
+     * @param array $skippedFiles
+     * @param float $testTime
+     */
+    public function __construct(array $errors, array $checkedFiles, array $skippedFiles, $testTime)
+    {
+        $this->errors = $errors;
+        $this->checkedFiles = $checkedFiles;
+        $this->skippedFiles = $skippedFiles;
+        $this->testTime = $testTime;
+    }
+
+    /**
+     * @return Error[]
+     */
+    public function getErrors()
+    {
+        return $this->errors;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasError()
+    {
+        return !empty($this->errors);
+    }
+
+    /**
+     * @return array
+     */
+    public function getFilesWithFail()
+    {
+        $filesWithFail = array();
+        foreach ($this->errors as $error) {
+            if (!$error instanceof SyntaxError) {
+                $filesWithFail[] = $error->getFilePath();
+            }
+        }
+
+        return $filesWithFail;
+    }
+
+    /**
+     * @return int
+     */
+    public function getFilesWithFailCount()
+    {
+        return count($this->getFilesWithFail());
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasFilesWithFail()
+    {
+        return $this->getFilesWithFailCount() !== 0;
+    }
+
+    /**
+     * @return array
+     */
+    public function getCheckedFiles()
+    {
+        return $this->checkedFiles;
+    }
+
+    /**
+     * @return int
+     */
+    public function getCheckedFilesCount()
+    {
+        return count($this->checkedFiles);
+    }
+
+    /**
+     * @return array
+     */
+    public function getSkippedFiles()
+    {
+        return $this->skippedFiles;
+    }
+
+    /**
+     * @return int
+     */
+    public function getSkippedFilesCount()
+    {
+        return count($this->skippedFiles);
+    }
+
+    /**
+     * @return array
+     */
+    public function getFilesWithSyntaxError()
+    {
+        $filesWithSyntaxError = array();
+        foreach ($this->errors as $error) {
+            if ($error instanceof SyntaxError) {
+                $filesWithSyntaxError[] = $error->getFilePath();
+            }
+        }
+
+        return $filesWithSyntaxError;
+    }
+
+    /**
+     * @return int
+     */
+    public function getFilesWithSyntaxErrorCount()
+    {
+        return count($this->getFilesWithSyntaxError());
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasSyntaxError()
+    {
+        return $this->getFilesWithSyntaxErrorCount() !== 0;
+    }
+
+    /**
+     * @return float
+     */
+    public function getTestTime()
+    {
+        return $this->testTime;
+    }
+
+    /**
+     * (PHP 5 &gt;= 5.4.0)<br/>
+     * Specify data which should be serialized to JSON
+     * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @return mixed data which can be serialized by <b>json_encode</b>,
+     * which is a value of any type other than a resource.
+     */
+    #[ReturnTypeWillChange]
+    function jsonSerialize()
+    {
+        return array(
+            'checkedFiles' => $this->getCheckedFiles(),
+            'filesWithSyntaxError' => $this->getFilesWithSyntaxError(),
+            'skippedFiles' => $this->getSkippedFiles(),
+            'errors' => $this->getErrors(),
+        );
+    }
+
+
+}
\ No newline at end of file
diff --git a/php-parallel-lint/php-parallel-lint/src/Settings.php b/php-parallel-lint/php-parallel-lint/src/Settings.php
new file mode 100644
index 0000000..4622910
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/Settings.php
@@ -0,0 +1,247 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+class Settings
+{
+
+    /**
+     * constants for enum settings
+     */
+    const FORCED = 'FORCED';
+    const DISABLED = 'DISABLED';
+    const AUTODETECT = 'AUTODETECT';
+
+    const FORMAT_TEXT = 'text';
+    const FORMAT_JSON = 'json';
+    const FORMAT_GITLAB = 'gitlab';
+    const FORMAT_CHECKSTYLE = 'checkstyle';
+
+    /**
+     * Path to PHP executable
+     * @var string
+     */
+    public $phpExecutable = 'php';
+
+    /**
+     * Check code inside PHP opening short tag <? or <?= in PHP 5.3
+     * @var bool
+     */
+    public $shortTag = false;
+
+    /**
+     * Check PHP code inside ASP-style <% %> tags.
+     * @var bool
+     */
+    public $aspTags = false;
+
+    /**
+     * Number of jobs running in same time
+     * @var int
+     */
+    public $parallelJobs = 10;
+
+    /**
+     * If path contains directory, only file with these extensions are checked
+     * @var array
+     */
+    public $extensions = array('php', 'phtml', 'php3', 'php4', 'php5', 'phpt');
+
+    /**
+     * Array of file or directories to check
+     * @var array
+     */
+    public $paths = array();
+
+    /**
+     * Don't check files or directories
+     * @var array
+     */
+    public $excluded = array();
+
+    /**
+     * Mode for color detection. Possible values: self::FORCED, self::DISABLED and self::AUTODETECT
+     * @var string
+     */
+    public $colors = self::AUTODETECT;
+
+    /**
+     * Show progress in text output
+     * @var bool
+     */
+    public $showProgress = true;
+
+    /**
+     * Output format (see FORMAT_* constants)
+     * @var string
+     */
+    public $format = self::FORMAT_TEXT;
+
+    /**
+     * Read files and folder to tests from standard input (blocking)
+     * @var bool
+     */
+    public $stdin = false;
+
+    /**
+     * Try to show git blame for row with error
+     * @var bool
+     */
+    public $blame = false;
+
+    /**
+     * Path to git executable for blame
+     * @var string
+     */
+    public $gitExecutable = 'git';
+
+    /**
+     * @var bool
+     */
+    public $ignoreFails = false;
+
+    /**
+     * @var bool
+     */
+    public $showDeprecated = false;
+
+    /**
+     * Path to a file with syntax error callback
+     * @var string|null
+     */
+    public $syntaxErrorCallbackFile = null;
+
+    /**
+     * @param array $paths
+     */
+    public function addPaths(array $paths)
+    {
+        $this->paths = array_merge($this->paths, $paths);
+    }
+
+    /**
+     * @param array $arguments
+     * @return Settings
+     * @throws InvalidArgumentException
+     */
+    public static function parseArguments(array $arguments)
+    {
+        $arguments = new ArrayIterator(array_slice($arguments, 1));
+        $settings = new self;
+
+        // Use the currently invoked php as the default if possible
+        if (defined('PHP_BINARY')) {
+            $settings->phpExecutable = PHP_BINARY;
+        }
+
+        foreach ($arguments as $argument) {
+            if ($argument[0] !== '-') {
+                $settings->paths[] = $argument;
+            } else {
+                switch ($argument) {
+                    case '-p':
+                        $settings->phpExecutable = $arguments->getNext();
+                        break;
+
+                    case '-s':
+                    case '--short':
+                        $settings->shortTag = true;
+                        break;
+
+                    case '-a':
+                    case '--asp':
+                        $settings->aspTags = true;
+                        break;
+
+                    case '-e':
+                        $settings->extensions = array_map('trim', explode(',', $arguments->getNext()));
+                        break;
+
+                    case '-j':
+                        $settings->parallelJobs = max((int) $arguments->getNext(), 1);
+                        break;
+
+                    case '--exclude':
+                        $settings->excluded[] = $arguments->getNext();
+                        break;
+
+                    case '--colors':
+                        $settings->colors = self::FORCED;
+                        break;
+
+                    case '--no-colors':
+                        $settings->colors = self::DISABLED;
+                        break;
+
+                    case '--no-progress':
+                        $settings->showProgress = false;
+                        break;
+
+                    case '--checkstyle':
+                        $settings->format = self::FORMAT_CHECKSTYLE;
+                        break;
+
+                    case '--json':
+                        $settings->format = self::FORMAT_JSON;
+                        break;
+
+                    case '--gitlab':
+                        $settings->format = self::FORMAT_GITLAB;
+                        break;
+
+                    case '--git':
+                        $settings->gitExecutable = $arguments->getNext();
+                        break;
+
+                    case '--stdin':
+                        $settings->stdin = true;
+                        break;
+
+                    case '--blame':
+                        $settings->blame = true;
+                        break;
+
+                    case '--ignore-fails':
+                        $settings->ignoreFails = true;
+                        break;
+
+                    case '--show-deprecated':
+                        $settings->showDeprecated = true;
+                        break;
+
+                    case '--syntax-error-callback':
+                        $settings->syntaxErrorCallbackFile = $arguments->getNext();
+                        break;
+
+                    default:
+                        throw new InvalidArgumentException($argument);
+                }
+            }
+        }
+
+        return $settings;
+    }
+
+    /**
+     * @return array
+     */
+    public static function getPathsFromStdIn()
+    {
+        $content = stream_get_contents(STDIN);
+
+        if (empty($content)) {
+            return array();
+        }
+
+        $lines = explode("\n", rtrim($content));
+        return array_map('rtrim', $lines);
+    }
+}
+
+class ArrayIterator extends \ArrayIterator
+{
+    public function getNext()
+    {
+        $this->next();
+        return $this->current();
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/exceptions.php b/php-parallel-lint/php-parallel-lint/src/exceptions.php
new file mode 100644
index 0000000..b96f28a
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/exceptions.php
@@ -0,0 +1,93 @@
+<?php
+namespace JakubOnderka\PhpParallelLint;
+
+use ReturnTypeWillChange;
+
+class Exception extends \Exception implements \JsonSerializable
+{
+    #[ReturnTypeWillChange]
+    public function jsonSerialize()
+    {
+        return array(
+            'type' => get_class($this),
+            'message' => $this->getMessage(),
+            'code' => $this->getCode(),
+        );
+    }
+}
+
+class RunTimeException extends Exception
+{
+
+}
+
+class InvalidArgumentException extends Exception
+{
+    protected $argument;
+
+    public function __construct($argument)
+    {
+        $this->argument = $argument;
+        $this->message = "Invalid argument $argument";
+    }
+
+    public function getArgument()
+    {
+        return $this->argument;
+    }
+}
+
+class NotExistsPathException extends Exception
+{
+    protected $path;
+
+    public function __construct($path)
+    {
+        $this->path = $path;
+        $this->message = "Path '$path' not found";
+    }
+
+    public function getPath()
+    {
+        return $this->path;
+    }
+}
+
+class NotExistsClassException extends Exception
+{
+    protected $className;
+    protected $fileName;
+
+    public function __construct($className, $fileName)
+    {
+        $this->className = $className;
+        $this->fileName = $fileName;
+        $this->message = "Class with name '$className' does not exists in file '$fileName'";
+    }
+
+    public function getClassName()
+    {
+        return $this->className;
+    }
+
+    public function getFileName()
+    {
+        return $this->fileName;
+    }
+}
+
+class NotImplementCallbackException extends Exception
+{
+    protected $className;
+
+    public function __construct($className)
+    {
+        $this->className = $className;
+        $this->message = "Class '$className' does not implement SyntaxErrorCallback interface.";
+    }
+
+    public function getClassName()
+    {
+        return $this->className;
+    }
+}
diff --git a/php-parallel-lint/php-parallel-lint/src/polyfill.php b/php-parallel-lint/php-parallel-lint/src/polyfill.php
new file mode 100644
index 0000000..79b3049
--- /dev/null
+++ b/php-parallel-lint/php-parallel-lint/src/polyfill.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * Polyfill for PHP < 5.4
+ */
+if (!interface_exists('JsonSerializable', false)) {
+    interface JsonSerializable
+    {
+        /**
+         * @param void
+         * @return mixed
+         */
+        function jsonSerialize();
+    }
+}
-- 
2.30.2

**purged**
Source code is licensed under the AGPL.