qiuenguang 1 жил өмнө
parent
commit
909c1d4349
57 өөрчлөгдсөн 1595 нэмэгдсэн , 1613 устгасан
  1. 1 1
      thinkphp/library/think/Lang.php
  2. 43 45
      vendor/composer/installed.json
  3. 12 12
      vendor/composer/installed.php
  4. 2 2
      vendor/composer/platform_check.php
  5. 1 0
      vendor/maennchen/zipstream-php/.github/FUNDING.yml
  6. 12 0
      vendor/maennchen/zipstream-php/.github/ISSUE_TEMPLATE.md
  7. 6 0
      vendor/maennchen/zipstream-php/.gitignore
  8. 0 4
      vendor/maennchen/zipstream-php/.phive/phars.xml
  9. 0 71
      vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php
  10. 0 15
      vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig
  11. 0 1
      vendor/maennchen/zipstream-php/.tool-versions
  12. 12 0
      vendor/maennchen/zipstream-php/.travis.yml
  13. 51 0
      vendor/maennchen/zipstream-php/CHANGELOG.md
  14. 25 0
      vendor/maennchen/zipstream-php/CONTRIBUTING.md
  15. 35 26
      vendor/maennchen/zipstream-php/README.md
  16. 4 39
      vendor/maennchen/zipstream-php/composer.json
  17. 0 79
      vendor/maennchen/zipstream-php/guides/ContentLength.rst
  18. 0 33
      vendor/maennchen/zipstream-php/guides/FlySystem.rst
  19. 0 16
      vendor/maennchen/zipstream-php/guides/Nginx.rst
  20. 0 61
      vendor/maennchen/zipstream-php/guides/Options.rst
  21. 0 18
      vendor/maennchen/zipstream-php/guides/PSR7Streams.rst
  22. 0 33
      vendor/maennchen/zipstream-php/guides/StreamOutput.rst
  23. 0 126
      vendor/maennchen/zipstream-php/guides/Symfony.rst
  24. 0 22
      vendor/maennchen/zipstream-php/guides/Varnish.rst
  25. 0 85
      vendor/maennchen/zipstream-php/guides/index.rst
  26. 0 39
      vendor/maennchen/zipstream-php/phpdoc.dist.xml
  27. 16 13
      vendor/maennchen/zipstream-php/phpunit.xml.dist
  28. 2 0
      vendor/maennchen/zipstream-php/psalm.xml
  29. 19 21
      vendor/maennchen/zipstream-php/src/Bigint.php
  30. 1 2
      vendor/maennchen/zipstream-php/src/DeflateStream.php
  31. 0 1
      vendor/maennchen/zipstream-php/src/Exception.php
  32. 0 1
      vendor/maennchen/zipstream-php/src/Exception/EncodingException.php
  33. 0 1
      vendor/maennchen/zipstream-php/src/Exception/FileNotFoundException.php
  34. 0 1
      vendor/maennchen/zipstream-php/src/Exception/FileNotReadableException.php
  35. 0 1
      vendor/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php
  36. 0 1
      vendor/maennchen/zipstream-php/src/Exception/OverflowException.php
  37. 0 1
      vendor/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php
  38. 113 119
      vendor/maennchen/zipstream-php/src/File.php
  39. 6 21
      vendor/maennchen/zipstream-php/src/Option/Archive.php
  40. 5 11
      vendor/maennchen/zipstream-php/src/Option/File.php
  41. 2 4
      vendor/maennchen/zipstream-php/src/Option/Method.php
  42. 3 6
      vendor/maennchen/zipstream-php/src/Option/Version.php
  43. 40 52
      vendor/maennchen/zipstream-php/src/Stream.php
  44. 73 82
      vendor/maennchen/zipstream-php/src/ZipStream.php
  45. 0 1
      vendor/maennchen/zipstream-php/test/BigintTest.php
  46. 139 203
      vendor/maennchen/zipstream-php/test/ZipStreamTest.php
  47. 0 1
      vendor/maennchen/zipstream-php/test/bootstrap.php
  48. 6 7
      vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php
  49. 226 0
      vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php
  50. 398 1
      vendor/phpoffice/phpspreadsheet/CHANGELOG.md
  51. 74 0
      vendor/phpoffice/phpspreadsheet/README.md
  52. 21 17
      vendor/phpoffice/phpspreadsheet/composer.json
  53. 179 299
      vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon
  54. 58 0
      vendor/phpoffice/phpspreadsheet/phpstan-conditional.php
  55. 8 14
      vendor/phpoffice/phpspreadsheet/phpstan.neon.dist
  56. 1 1
      vendor/psr/container/composer.json
  57. 1 3
      vendor/psr/container/src/ContainerExceptionInterface.php

+ 1 - 1
thinkphp/library/think/Lang.php

@@ -201,7 +201,7 @@ class Lang
         } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
             // 自动侦测浏览器语言
             preg_match('/^([a-z\d\-]+)/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $matches);
-            $langSet     = strtolower($matches[1]);
+            $langSet     = strtolower($matches[1] ?? '');
             $acceptLangs = Config::get('header_accept_lang');
 
             if (isset($acceptLangs[$langSet])) {

+ 43 - 45
vendor/composer/installed.json

@@ -509,35 +509,32 @@
         },
         {
             "name": "maennchen/zipstream-php",
-            "version": "2.2.6",
-            "version_normalized": "2.2.6.0",
+            "version": "2.1.0",
+            "version_normalized": "2.1.0.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maennchen/ZipStream-PHP.git",
-                "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f"
+                "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f",
-                "reference": "30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f",
+                "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58",
+                "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58",
                 "shasum": ""
             },
             "require": {
                 "myclabs/php-enum": "^1.5",
-                "php": "^7.4 || ^8.0",
+                "php": ">= 7.1",
                 "psr/http-message": "^1.0",
                 "symfony/polyfill-mbstring": "^1.0"
             },
             "require-dev": {
                 "ext-zip": "*",
-                "friendsofphp/php-cs-fixer": "^3.9",
-                "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0",
+                "guzzlehttp/guzzle": ">= 6.3",
                 "mikey179/vfsstream": "^1.6",
-                "php-coveralls/php-coveralls": "^2.4",
-                "phpunit/phpunit": "^8.5.8 || ^9.4.2",
-                "vimeo/psalm": "^4.1"
+                "phpunit/phpunit": ">= 7.5"
             },
-            "time": "2022-11-25T18:57:19+00:00",
+            "time": "2020-05-30T13:11:16+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -574,7 +571,7 @@
             ],
             "support": {
                 "issues": "https://github.com/maennchen/ZipStream-PHP/issues",
-                "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.2.6"
+                "source": "https://github.com/maennchen/ZipStream-PHP/tree/2.1.0"
             },
             "funding": [
                 {
@@ -1197,17 +1194,17 @@
         },
         {
             "name": "phpoffice/phpspreadsheet",
-            "version": "1.19.0",
-            "version_normalized": "1.19.0.0",
+            "version": "1.25.2",
+            "version_normalized": "1.25.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
-                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf"
+                "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
-                "reference": "a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf",
+                "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a317a09e7def49852400a4b3eca4a4b0790ceeb5",
+                "reference": "a317a09e7def49852400a4b3eca4a4b0790ceeb5",
                 "shasum": ""
             },
             "require": {
@@ -1224,35 +1221,36 @@
                 "ext-xmlwriter": "*",
                 "ext-zip": "*",
                 "ext-zlib": "*",
-                "ezyang/htmlpurifier": "^4.13",
+                "ezyang/htmlpurifier": "^4.15",
                 "maennchen/zipstream-php": "^2.1",
                 "markbaker/complex": "^3.0",
                 "markbaker/matrix": "^3.0",
-                "php": "^7.2 || ^8.0",
+                "php": "^7.3 || ^8.0",
                 "psr/http-client": "^1.0",
                 "psr/http-factory": "^1.0",
-                "psr/simple-cache": "^1.0"
+                "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
             },
             "require-dev": {
                 "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
-                "dompdf/dompdf": "^1.0",
-                "friendsofphp/php-cs-fixer": "^2.18",
-                "jpgraph/jpgraph": "^4.0",
-                "mpdf/mpdf": "^8.0",
+                "dompdf/dompdf": "^1.0 || ^2.0",
+                "friendsofphp/php-cs-fixer": "^3.2",
+                "mitoteam/jpgraph": "10.2.4",
+                "mpdf/mpdf": "8.1.1",
                 "phpcompatibility/php-compatibility": "^9.3",
-                "phpstan/phpstan": "^0.12.82",
-                "phpstan/phpstan-phpunit": "^0.12.18",
-                "phpunit/phpunit": "^8.5",
-                "squizlabs/php_codesniffer": "^3.5",
-                "tecnickcom/tcpdf": "^6.3"
+                "phpstan/phpstan": "^1.1",
+                "phpstan/phpstan-phpunit": "^1.0",
+                "phpunit/phpunit": "^8.5 || ^9.0",
+                "squizlabs/php_codesniffer": "^3.7",
+                "tecnickcom/tcpdf": "6.5"
             },
             "suggest": {
-                "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
-                "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
+                "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+                "ext-intl": "PHP Internationalization Functions",
+                "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
                 "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
-                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)"
+                "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer"
             },
-            "time": "2021-10-31T15:09:20+00:00",
+            "time": "2022-09-25T17:21:01+00:00",
             "type": "library",
             "installation-source": "dist",
             "autoload": {
@@ -1298,7 +1296,7 @@
             ],
             "support": {
                 "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues",
-                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.19.0"
+                "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.25.2"
             },
             "install-path": "../phpoffice/phpspreadsheet"
         },
@@ -1412,23 +1410,23 @@
         },
         {
             "name": "psr/container",
-            "version": "2.0.2",
-            "version_normalized": "2.0.2.0",
+            "version": "2.0.1",
+            "version_normalized": "2.0.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/php-fig/container.git",
-                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+                "reference": "2ae37329ee82f91efadc282cc2d527fd6065a5ef"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
-                "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+                "url": "https://api.github.com/repos/php-fig/container/zipball/2ae37329ee82f91efadc282cc2d527fd6065a5ef",
+                "reference": "2ae37329ee82f91efadc282cc2d527fd6065a5ef",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.4.0"
+                "php": ">=7.2.0"
             },
-            "time": "2021-11-05T16:47:00+00:00",
+            "time": "2021-03-24T13:40:57+00:00",
             "type": "library",
             "extra": {
                 "branch-alias": {
@@ -1462,7 +1460,7 @@
             ],
             "support": {
                 "issues": "https://github.com/php-fig/container/issues",
-                "source": "https://github.com/php-fig/container/tree/2.0.2"
+                "source": "https://github.com/php-fig/container/tree/2.0.1"
             },
             "install-path": "../psr/container"
         },
@@ -2902,7 +2900,7 @@
             "source": {
                 "type": "git",
                 "url": "https://gitee.com/fastadminnet/framework.git",
-                "reference": "9b5e33bc0b5490fc617a95f2e639a6db969ebe28"
+                "reference": "988c95b7ba21138ecab30f600bf2ec9050f49a5e"
             },
             "require": {
                 "php": ">=7.1.0",
@@ -2916,7 +2914,7 @@
                 "phpunit/phpunit": "4.8.*",
                 "sebastian/phpcpd": "2.*"
             },
-            "time": "2023-11-28T07:43:39+00:00",
+            "time": "2023-12-14T10:19:34+00:00",
             "default-branch": true,
             "type": "think-framework",
             "installation-source": "source",

+ 12 - 12
vendor/composer/installed.php

@@ -3,7 +3,7 @@
         'name' => 'karsonzhang/fastadmin',
         'pretty_version' => 'dev-master',
         'version' => 'dev-master',
-        'reference' => '5766b6200375d49bd3f816cc8cdc0bae873d92c7',
+        'reference' => '38a32b66697c03d3c47c1fcfed73f3a9a22ca4f8',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
@@ -58,7 +58,7 @@
         'karsonzhang/fastadmin' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
-            'reference' => '5766b6200375d49bd3f816cc8cdc0bae873d92c7',
+            'reference' => '38a32b66697c03d3c47c1fcfed73f3a9a22ca4f8',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
@@ -74,9 +74,9 @@
             'dev_requirement' => false,
         ),
         'maennchen/zipstream-php' => array(
-            'pretty_version' => '2.2.6',
-            'version' => '2.2.6.0',
-            'reference' => '30ad6f93cf3efe4192bc7a4c9cad11ff8f4f237f',
+            'pretty_version' => '2.1.0',
+            'version' => '2.1.0.0',
+            'reference' => 'c4c5803cc1f93df3d2448478ef79394a5981cc58',
             'type' => 'library',
             'install_path' => __DIR__ . '/../maennchen/zipstream-php',
             'aliases' => array(),
@@ -164,9 +164,9 @@
             'dev_requirement' => false,
         ),
         'phpoffice/phpspreadsheet' => array(
-            'pretty_version' => '1.19.0',
-            'version' => '1.19.0.0',
-            'reference' => 'a9ab55bfae02eecffb3df669a2e19ba0e2f04bbf',
+            'pretty_version' => '1.25.2',
+            'version' => '1.25.2.0',
+            'reference' => 'a317a09e7def49852400a4b3eca4a4b0790ceeb5',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpoffice/phpspreadsheet',
             'aliases' => array(),
@@ -197,9 +197,9 @@
             ),
         ),
         'psr/container' => array(
-            'pretty_version' => '2.0.2',
-            'version' => '2.0.2.0',
-            'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963',
+            'pretty_version' => '2.0.1',
+            'version' => '2.0.1.0',
+            'reference' => '2ae37329ee82f91efadc282cc2d527fd6065a5ef',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/container',
             'aliases' => array(),
@@ -436,7 +436,7 @@
         'topthink/framework' => array(
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
-            'reference' => '9b5e33bc0b5490fc617a95f2e639a6db969ebe28',
+            'reference' => '988c95b7ba21138ecab30f600bf2ec9050f49a5e',
             'type' => 'think-framework',
             'install_path' => __DIR__ . '/../../thinkphp',
             'aliases' => array(

+ 2 - 2
vendor/composer/platform_check.php

@@ -4,8 +4,8 @@
 
 $issues = array();
 
-if (!(PHP_VERSION_ID >= 70400)) {
-    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.';
+if (!(PHP_VERSION_ID >= 70300)) {
+    $issues[] = 'Your Composer dependencies require a PHP version ">= 7.3.0". You are running ' . PHP_VERSION . '.';
 }
 
 if ($issues) {

+ 1 - 0
vendor/maennchen/zipstream-php/.github/FUNDING.yml

@@ -0,0 +1 @@
+open_collective: zipstream

+ 12 - 0
vendor/maennchen/zipstream-php/.github/ISSUE_TEMPLATE.md

@@ -0,0 +1,12 @@
+# Description of the problem
+
+Please be very descriptive and include as much details as possible.
+
+# Example code
+
+# Informations
+
+* ZipStream-PHP version:
+* PHP version:
+
+Please include any supplemental information you deem relevant to this issue.

+ 6 - 0
vendor/maennchen/zipstream-php/.gitignore

@@ -0,0 +1,6 @@
+clover.xml
+composer.lock
+coverage.clover
+.idea
+phpunit.xml
+vendor

+ 0 - 4
vendor/maennchen/zipstream-php/.phive/phars.xml

@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phive xmlns="https://phar.io/phive">
-  <phar name="phpdocumentor" version="^3.3.1" installed="3.3.1" location="./tools/phpdocumentor" copy="false"/>
-</phive>

+ 0 - 71
vendor/maennchen/zipstream-php/.php-cs-fixer.dist.php

@@ -1,71 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-/**
- * PHP-CS-Fixer config for ZipStream-PHP
- * @author Nicolas CARPi <nico-git@deltablot.email>
- * @copyright 2022 Nicolas CARPi
- * @see https://github.com/maennchen/ZipStream-PHP
- * @license MIT
- * @package maennchen/ZipStream-PHP
- */
-
-use PhpCsFixer\Config;
-use PhpCsFixer\Finder;
-
-$finder = Finder::create()
-    ->exclude('.github')
-    ->exclude('.phpdoc')
-    ->exclude('docs')
-    ->exclude('tools')
-    ->exclude('vendor')
-    ->in(__DIR__);
-
-$config = new Config();
-return $config->setRules([
-        '@PER' => true,
-        '@PER:risky' => true,
-        '@PHP81Migration' => true,
-        '@PHPUnit84Migration:risky' => true,
-        'array_syntax' => ['syntax' => 'short'],
-        'class_attributes_separation' => true,
-        'declare_strict_types' => true,
-        'dir_constant' => true,
-        'is_null' => true,
-        'no_homoglyph_names' => true,
-        'no_null_property_initialization' => true,
-        'no_php4_constructor' => true,
-        'no_unused_imports' => true,
-        'no_useless_else' => true,
-        'non_printable_character' => true,
-        'ordered_imports' => true,
-        'ordered_class_elements' => true,
-        'php_unit_construct' => true,
-        'pow_to_exponentiation' => true,
-        'psr_autoloading' => true,
-        'random_api_migration' => true,
-        'return_assignment' => true,
-        'self_accessor' => true,
-        'semicolon_after_instruction' => true,
-        'short_scalar_cast' => true,
-        'simplified_null_return' => true,
-        'single_blank_line_before_namespace' => true,
-        'single_class_element_per_statement' => true,
-        'single_line_comment_style' => true,
-        'single_quote' => true,
-        'space_after_semicolon' => true,
-        'standardize_not_equals' => true,
-        'strict_param' => true,
-        'ternary_operator_spaces' => true,
-        'trailing_comma_in_multiline' => true,
-        'trim_array_spaces' => true,
-        'unary_operator_spaces' => true,
-        'global_namespace_import' => [
-            'import_classes' => true,
-            'import_functions' => true,
-            'import_constants' => true,
-        ],
-    ])
-    ->setFinder($finder)
-    ->setRiskyAllowed(true);

+ 0 - 15
vendor/maennchen/zipstream-php/.phpdoc/template/base.html.twig

@@ -1,15 +0,0 @@
-{% extends 'layout.html.twig' %}
-
-{% set topMenu = {
-    "menu": [
-        { "name": "Guides", "url": "https://maennchen.dev/ZipStream-PHP/guide/index.html"},
-        { "name": "API", "url": "https://maennchen.dev/ZipStream-PHP/classes/ZipStream-ZipStream.html"},
-        { "name": "Issues", "url": "https://github.com/maennchen/ZipStream-PHP/issues"},
-    ],
-    "social": [
-        { "iconClass": "fab fa-github", "url": "https://github.com/maennchen/ZipStream-PHP"},
-        { "iconClass": "fas fa-envelope-open-text", "url": "https://github.com/maennchen/ZipStream-PHP/discussions"},
-        { "iconClass": "fas fa-money-bill", "url": "https://opencollective.com/zipstream"},
-    ]
-}
-%}

+ 0 - 1
vendor/maennchen/zipstream-php/.tool-versions

@@ -1 +0,0 @@
-php 8.1.13

+ 12 - 0
vendor/maennchen/zipstream-php/.travis.yml

@@ -0,0 +1,12 @@
+language: php
+dist: trusty
+sudo: false
+php:
+  - 7.1
+  - 7.2
+  - 7.3
+install: composer install
+script: ./vendor/bin/phpunit --coverage-clover=coverage.clover
+after_script:
+  - wget https://scrutinizer-ci.com/ocular.phar
+  - php ocular.phar code-coverage:upload --format=php-clover coverage.clover

+ 51 - 0
vendor/maennchen/zipstream-php/CHANGELOG.md

@@ -0,0 +1,51 @@
+# CHANGELOG for ZipStream-PHP
+
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+## [2.1.0] - 2020-06-01
+### Changed
+- Don't execute ob_flush() when output buffering is not enabled (#152)
+- Fix inconsistent return type on 32-bit systems (#149) Fix #144
+- Use mbstring polyfill (#151)
+- Promote 7zip usage over unzip to avoid UTF-8 issues (#147)
+
+## [2.0.0] - 2020-02-22
+### Breaking change
+- Only the self opened streams will be closed (#139)
+If you were relying on ZipStream to close streams that the library didn't open,
+you'll need to close them yourself now.
+
+### Changed
+- Minor change to data descriptor (#136)
+
+## [1.2.0] - 2019-07-11
+
+### Added
+- Option to flush output buffer after every write (#122)
+
+## [1.1.0] - 2019-04-30
+
+### Fixed
+- Honor last-modified timestamps set via `ZipStream\Option\File::setTime()` (#106)
+- Documentation regarding output of HTTP headers
+- Test warnings with PHPUnit (#109)
+
+### Added
+- Test for FileNotReadableException (#114)
+- Size attribute to File options (#113)
+- Tests on PHP 7.3 (#108)
+
+## [1.0.0] - 2019-04-17
+
+### Breaking changes
+- Mininum PHP version is now 7.1
+- Options are now passed to the ZipStream object via the Option\Archive object. See the wiki for available options and code examples
+
+### Added
+- Add large file support with Zip64 headers
+
+### Changed
+- Major refactoring and code cleanup

+ 25 - 0
vendor/maennchen/zipstream-php/CONTRIBUTING.md

@@ -0,0 +1,25 @@
+# ZipStream Readme for Contributors
+## Code styling
+### Indention
+For spaces are used to indent code. The convention is [K&R](http://en.wikipedia.org/wiki/Indent_style#K&R)
+
+### Comments
+Double Slashes are used for an one line comment.
+
+Classes, Variables, Methods etc:
+
+```php
+/**
+ * My comment
+ *
+ * @myanotation like @param etc.
+ */
+```
+
+## Pull requests
+Feel free to submit pull requests.
+
+## Testing
+For every new feature please write a new PHPUnit test.
+
+Before every commit execute `./vendor/bin/phpunit` to check if your changes wrecked something:

+ 35 - 26
vendor/maennchen/zipstream-php/README.md

@@ -1,17 +1,12 @@
 # ZipStream-PHP
 
-[![Main Branch](https://github.com/maennchen/ZipStream-PHP/actions/workflows/branch_main.yml/badge.svg)](https://github.com/maennchen/ZipStream-PHP/actions/workflows/branch_main.yml)
-[![Coverage Status](https://coveralls.io/repos/github/maennchen/ZipStream-PHP/badge.svg?branch=main)](https://coveralls.io/github/maennchen/ZipStream-PHP?branch=main)
+[![Build Status](https://travis-ci.org/maennchen/ZipStream-PHP.svg?branch=master)](https://travis-ci.org/maennchen/ZipStream-PHP)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/)
+[![Code Coverage](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/maennchen/ZipStream-PHP/)
 [![Latest Stable Version](https://poser.pugx.org/maennchen/zipstream-php/v/stable)](https://packagist.org/packages/maennchen/zipstream-php)
 [![Total Downloads](https://poser.pugx.org/maennchen/zipstream-php/downloads)](https://packagist.org/packages/maennchen/zipstream-php)
 [![Financial Contributors on Open Collective](https://opencollective.com/zipstream/all/badge.svg?label=financial+contributors)](https://opencollective.com/zipstream) [![License](https://img.shields.io/github/license/maennchen/zipstream-php.svg)](LICENSE)
 
-## Unstable Branch
-
-The `main` branch is not stable. Please see the
-[releases](https://github.com/maennchen/ZipStream-PHP/releases) for a stable
-version.
-
 ## Overview
 
 A fast and simple streaming zip file downloader for PHP. Using this library will save you from having to write the Zip to disk. You can directly send it to the user, which is much faster. It can work with S3 buckets or any PSR7 Stream.
@@ -26,10 +21,7 @@ Simply add a dependency on maennchen/zipstream-php to your project's composer.js
 composer require maennchen/zipstream-php
 ```
 
-## Usage
-
-For detailed instructions, please check the
-[Documentation](https://maennchen.dev/ZipStream-PHP/).
+## Usage and options
 
 Here's a simple example:
 
@@ -50,20 +42,39 @@ $zip->addFile('hello.txt', 'This is the contents of hello.txt');
 // add a file named 'some_image.jpg' from a local file 'path/to/image.jpg'
 $zip->addFileFromPath('some_image.jpg', 'path/to/image.jpg');
 
+// add a file named 'goodbye.txt' from an open stream resource
+$fp = tmpfile();
+fwrite($fp, 'The quick brown fox jumped over the lazy dog.');
+rewind($fp);
+$zip->addFileFromStream('goodbye.txt', $fp);
+fclose($fp);
+
 // finish the zip stream
 $zip->finish();
 ```
 
+You can also add comments, modify file timestamps, and customize (or
+disable) the HTTP headers. It is also possible to specify the storage method when adding files,
+the current default storage method is 'deflate' i.e files are stored with Compression mode 0x08.
+
+See the [Wiki](https://github.com/maennchen/ZipStream-PHP/wiki) for details.
+
+## Known issue
+
+The native Mac OS archive extraction tool might not open archives in some conditions. A workaround is to disable the Zip64 feature with the option `$opt->setEnableZip64(false)`. This limits the archive to 4 Gb and 64k files but will allow Mac OS users to open them without issue. See #116.
+
+The linux `unzip` utility might not handle properly unicode characters. It is recommended to extract with another tool like [7-zip](https://www.7-zip.org/). See #146.
+
 ## Upgrade to version 2.0.0
 
-- Only the self opened streams will be closed (#139)
-  If you were relying on ZipStream to close streams that the library didn't open,
-  you'll need to close them yourself now.
+* Only the self opened streams will be closed (#139)
+If you were relying on ZipStream to close streams that the library didn't open,
+you'll need to close them yourself now.
 
 ## Upgrade to version 1.0.0
 
-- All options parameters to all function have been moved from an `array` to structured option objects. See [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Available-options) for examples.
-- The whole library has been refactored. The minimal PHP requirement has been raised to PHP 7.1.
+* All options parameters to all function have been moved from an `array` to structured option objects. See [the wiki](https://github.com/maennchen/ZipStream-PHP/wiki/Available-options) for examples.
+* The whole library has been refactored. The minimal PHP requirement has been raised to PHP 7.1.
 
 ## Usage with Symfony and S3
 
@@ -71,23 +82,21 @@ You can find example code on [the wiki](https://github.com/maennchen/ZipStream-P
 
 ## Contributing
 
-ZipStream-PHP is a collaborative project. Please take a look at the
-[.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) file.
+ZipStream-PHP is a collaborative project. Please take a look at the [CONTRIBUTING.md](CONTRIBUTING.md) file.
 
 ## About the Authors
 
-- Paul Duncan <pabs@pablotron.org> - https://pablotron.org/
-- Jonatan Männchen <jonatan@maennchen.ch> - https://maennchen.dev
-- Jesse G. Donat <donatj@gmail.com> - https://donatstudios.com
-- Nicolas CARPi <nico-git@deltablot.email> - https://www.deltablot.com
-- Nik Barham <nik@brokencube.co.uk> - https://www.brokencube.co.uk
+* Paul Duncan <pabs@pablotron.org> - https://pablotron.org/
+* Jonatan Männchen <jonatan@maennchen.ch> - https://maennchen.dev
+* Jesse G. Donat <donatj@gmail.com> - https://donatstudios.com
+* Nicolas CARPi <nico-git@deltablot.email> - https://www.deltablot.com
+* Nik Barham <nik@brokencube.co.uk> - https://www.brokencube.co.uk
 
 ## Contributors
 
 ### Code Contributors
 
-This project exists thanks to all the people who contribute.
-[[Contribute](.github/CONTRIBUTING.md)].
+This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
 <a href="https://github.com/maennchen/ZipStream-PHP/graphs/contributors"><img src="https://opencollective.com/zipstream/contributors.svg?width=890&button=false" /></a>
 
 ### Financial Contributors

+ 4 - 39
vendor/maennchen/zipstream-php/composer.json

@@ -22,55 +22,20 @@
     }
   ],
   "require": {
-    "php": "^7.4 || ^8.0",
+    "php": ">= 7.1",
     "symfony/polyfill-mbstring": "^1.0",
     "psr/http-message": "^1.0",
     "myclabs/php-enum": "^1.5"
   },
   "require-dev": {
-    "phpunit/phpunit": "^8.5.8 || ^9.4.2",
-    "guzzlehttp/guzzle": "^6.5.3 || ^7.2.0",
+    "phpunit/phpunit": ">= 7.5",
+    "guzzlehttp/guzzle": ">= 6.3",
     "ext-zip": "*",
-    "mikey179/vfsstream": "^1.6",
-    "vimeo/psalm": "^4.1",
-    "php-coveralls/php-coveralls": "^2.4",
-    "friendsofphp/php-cs-fixer": "^3.9"
-  },
-  "scripts": {
-    "format": "php-cs-fixer fix",
-    "test": "composer run test:unit && composer run test:formatted && composer run test:lint",
-    "test:unit": "phpunit --coverage-clover=coverage.clover.xml",
-    "test:formatted": "composer run format -- --dry-run --stop-on-violation --using-cache=no",
-    "test:lint": "psalm --stats --show-info --find-unused-psalm-suppress",
-    "coverage:report": "php-coveralls --coverage_clover=coverage.clover.xml --json_path=coveralls-upload.json -v",
-    "install:tools": "phive install --trust-gpg-keys 0x67F861C3D889C656",
-    "docs:generate": "tools/phpdocumentor --sourcecode"
+    "mikey179/vfsstream": "^1.6"
   },
   "autoload": {
     "psr-4": {
       "ZipStream\\": "src/"
     }
-  },
-  "archive": {
-    "exclude": [
-      "/composer.lock",
-      "/docs",
-      "/.gitattributes",
-      "/.github",
-      "/.gitignore",
-      "/guides",
-      "/.phive",
-      "/.php-cs-fixer.cache",
-      "/.php-cs-fixer.dist.php",
-      "/.phpdoc",
-      "/phpdoc.dist.xml",
-      "/.phpunit.result.cache",
-      "/phpunit.xml.dist",
-      "/psalm.xml",
-      "/test",
-      "/tools",
-      "/.tool-versions",
-      "/vendor"
-    ]
   }
 }

+ 0 - 79
vendor/maennchen/zipstream-php/guides/ContentLength.rst

@@ -1,79 +0,0 @@
-Adding Content-Length header
-=============
-
-Adding a ``Content-Length`` header for ``ZipStream`` is not trivial since the
-size is not known beforehand.
-
-The following workaround adds an approximated header:
-
-.. code-block:: php
-
-    class Zip
-    {
-        /** @var string */
-        private $name;
-
-        private $files = [];
-
-        public function __construct($name)
-        {
-            $this->name = $name;
-        }
-
-        public function addFile($name, $data)
-        {
-            $this->files[] = ['type' => 'addFile', 'name' => $name, 'data' => $data];
-        }
-
-        public function addFileFromPath($name, $path)
-        {
-            $this->files[] = ['type' => 'addFileFromPath', 'name' => $name, 'path' => $path];
-        }
-
-        public function getEstimate()
-        {
-            $estimate = 22;
-            foreach ($this->files as $file) {
-            $estimate += 76 + 2 * strlen($file['name']);
-            if ($file['type'] === 'addFile') {
-                $estimate += strlen($file['data']);
-            }
-            if ($file['type'] === 'addFileFromPath') {
-                $estimate += filesize($file['path']);
-            }
-            }
-            return $estimate;
-        }
-
-        public function finish()
-        {
-            header('Content-Length: ' . $this->getEstimate());
-            $options = new \ZipStream\Option\Archive();
-            $options->setSendHttpHeaders(true);
-            $options->setEnableZip64(false);
-            $options->setDeflateLevel(-1);
-            $zip = new \ZipStream\ZipStream($this->name, $options);
-
-            $fileOptions = new \ZipStream\Option\File();
-            $fileOptions->setMethod(\ZipStream\Option\Method::STORE());
-            foreach ($this->files as $file) {
-            if ($file['type'] === 'addFile') {
-                $zip->addFile($file['name'], $file['data'], $fileOptions);
-            }
-            if ($file['type'] === 'addFileFromPath') {
-                $zip->addFileFromPath($file['name'], $file['path'], $fileOptions);
-            }
-            }
-            $zip->finish();
-            exit;
-        }
-    }
-
-It only works with the following constraints:
-
-- All file content is known beforehand.
-- Content Deflation is disabled
-
-Thanks to
-`partiellkorrekt <https://github.com/maennchen/ZipStream-PHP/issues/89#issuecomment-1047949274>`_
-for this workaround.

+ 0 - 33
vendor/maennchen/zipstream-php/guides/FlySystem.rst

@@ -1,33 +0,0 @@
-Usage with FlySystem
-===============
-
-For saving or uploading the generated zip, you can use the
-`Flysystem <https://flysystem.thephpleague.com>`_ package, and its many
-adapters.
-
-For that you will need to provide another stream than the ``php://output``
-default one, and pass it to Flysystem ``putStream`` method.
-
-.. code-block:: php
-
-    // Open Stream only once for read and write since it's a memory stream and
-    // the content is lost when closing the stream / opening another one
-    $tempStream = fopen('php://memory', 'w+');
-
-    // Init Options
-    $zipStreamOptions = new Archive();
-    $zipStreamOptions->setOutputStream($tempStream);
-
-    // Create Zip Archive
-    $zipStream = new ZipStream('test.zip', $zipStreamOptions);
-    $zipStream->addFile('test.txt', 'text');
-    $zipStream->finish();
-
-    // Store File (see Flysystem documentation, and all its framework integration)
-    $adapter = new Local(__DIR__.'/path/to/folder'); // Can be any adapter (AWS, Google, Ftp, etc.)
-    $filesystem = new Filesystem($adapter);
-
-    $filesystem->putStream('test.zip', $tempStream)
-
-    // Close Stream
-    fclose($tempStream);

+ 0 - 16
vendor/maennchen/zipstream-php/guides/Nginx.rst

@@ -1,16 +0,0 @@
-Usage with nginx
-=============
-
-If you are using nginx as a webserver, it will try to buffer the response.
-So you'll want to disable this with a custom header:
-
-.. code-block:: php
-    header('X-Accel-Buffering: no');
-    # or with the Response class from Symfony
-    $response->headers->set('X-Accel-Buffering', 'no');
-
-Alternatively, you can tweak the
-`fastcgi cache parameters <https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_buffers>`_
-within nginx config.
-
-See `original issue <https://github.com/maennchen/ZipStream-PHP/issues/77>`_.

+ 0 - 61
vendor/maennchen/zipstream-php/guides/Options.rst

@@ -1,61 +0,0 @@
-Available options
-===============
-
-Here is the full list of options available to you. You can also have a look at
-``src/Option/Archive.php`` file.
-
-First, an instance of ``ZipStream\Option\Archive`` needs to be created, and
-after that you use setters methods to modify the values.
-
-.. code-block:: php
-    use ZipStream\ZipStream;
-    use ZipStream\Option\Archive as ArchiveOptions;
-
-    require_once 'vendor/autoload.php';
-
-    $opt = new ArchiveOptions();
-
-    // Define output stream (argument is of type resource)
-    $opt->setOutputStream($fd);
-
-    // Set the deflate level (default is 6; use -1 to disable it)
-    $opt->setDeflateLevel(6);
-
-    // Add a comment to the zip file
-    $opt->setComment('This is a comment.');
-
-    // Size, in bytes, of the largest file to try and load into memory (used by addFileFromPath()).  Large files may also be compressed differently; see the 'largeFileMethod' option.
-    $opt->setLargeFileSize(30000000);
-
-    // How to handle large files.  Legal values are STORE (the default), or DEFLATE. Store sends the file raw and is significantly faster, while DEFLATE compresses the file and is much, much slower. Note that deflate must compress the file twice and is extremely slow.
-    $opt->setLargeFileMethod(ZipStream\Option\Method::STORE());
-    $opt->setLargeFileMethod(ZipStream\Option\Method::DEFLATE());
-
-    // Send http headers (default is false)
-    $opt->setSendHttpHeaders(false);
-
-    // HTTP Content-Disposition.  Defaults to 'attachment', where FILENAME is the specified filename. Note that this does nothing if you are not sending HTTP headers.
-    $opt->setContentDisposition('attachment');
-
-    // Set the content type (does nothing if you are not sending HTTP headers)
-    $opt->setContentType('application/x-zip');
-
-    // Set the function called for setting headers. Default is the `header()` of PHP
-    $opt->setHttpHeaderCallback('header');
-
-    // Enable streaming files with single read where general purpose bit 3 indicates local file header contain zero values in crc and size fields, these appear only after file contents in data descriptor block. Default is false. Set to true if your input stream is remote (used with addFileFromStream()).
-    $opt->setZeroHeader(false);
-
-    // Enable reading file stat for determining file size. When a 32-bit system reads file size that is over 2 GB, invalid value appears in file size due to integer overflow. Should be disabled on 32-bit systems with method addFileFromPath if any file may exceed 2 GB. In this case file will be read in blocks and correct size will be determined from content. Default is true.
-    $opt->setStatFiles(true);
-
-    // Enable zip64 extension, allowing very large archives (> 4Gb or file count > 64k)
-    // default is true
-    $opt->setEnableZip64(true);
-
-    // Flush output buffer after every write
-    // default is false
-    $opt->setFlushOutput(true);
-
-    // Now that everything is set you can pass the options to the ZipStream instance
-    $zip = new ZipStream('example.zip', $opt);

+ 0 - 18
vendor/maennchen/zipstream-php/guides/PSR7Streams.rst

@@ -1,18 +0,0 @@
-Usage with PSR 7 Streams
-===============
-
-PSR-7 streams are `standardized streams <https://www.php-fig.org/psr/psr-7/>`_.
-
-ZipStream-PHP supports working with these streams with the function
-``addFileFromPsr7Stream``. 
-
-For all parameters of the function see the API documentation.
-
-Example
----------------
-
-.. code-block:: php
-    
-    $stream = $response->getBody();
-    // add a file named 'streamfile.txt' from the content of the stream
-    $zip->addFileFromPsr7Stream('streamfile.txt', $stream);

+ 0 - 33
vendor/maennchen/zipstream-php/guides/StreamOutput.rst

@@ -1,33 +0,0 @@
-Stream Output
-===============
-
-Stream to S3 Bucket
----------------
-
-.. code-block:: php
-    use Aws\S3\S3Client;
-    use Aws\Credentials\CredentialProvider;
-    use ZipStream\Option\Archive;
-    use ZipStream\ZipStream;
-
-    $bucket = 'your bucket name';
-    $client = new S3Client([
-        'region' => 'your region',
-        'version' => 'latest',
-        'bucketName' => $bucket,
-        'credentials' => CredentialProvider::defaultProvider(),
-    ]);
-    $client->registerStreamWrapper();
-
-    $zipFile = fopen("s3://$bucket/example.zip", 'w');
-
-    $options = new Archive();
-    $options->setEnableZip64(false);
-    $options->setOutputStream($zipFile);
-
-    $zip = new ZipStream(null, $options);
-    $zip->addFile('file1.txt', 'File1 data');
-    $zip->addFile('file2.txt', 'File2 data');
-    $zip->finish();
-
-    fclose($zipFile);

+ 0 - 126
vendor/maennchen/zipstream-php/guides/Symfony.rst

@@ -1,126 +0,0 @@
-Usage with Symfony
-===============
-
-Overview for using ZipStream in Symfony
---------
-
-Using ZipStream in Symfony requires use of Symfony's ``StreamedResponse`` when
-used in controller actions.
-
-Wrap your call to the relevant ``ZipStream`` stream method (i.e. ``addFile``,
-``addFileFromPath``, ``addFileFromStream``) in Symfony's ``StreamedResponse``
-function passing in any required arguments for your use case.
-
-Using Symfony's ``StreamedResponse`` will allow Symfony to stream output from
-ZipStream correctly to users' browsers and avoid a corrupted final zip landing
-on the users' end.
-
-Example for using ``ZipStream`` in a controller action to zip stream files
-stored in an AWS S3 bucket by key:
-
-.. code-block:: php
-
-    use Symfony\Component\HttpFoundation\StreamedResponse;
-    use Aws\S3\S3Client;
-    use ZipStream;
-
-    //...
-
-    /**
-    * @Route("/zipstream", name="zipstream")
-    */
-    public function zipStreamAction()
-    {
-        //sample test file on s3
-        $s3keys = array(
-        "ziptestfolder/file1.txt"
-        );
-
-        $s3Client = $this->get('app.amazon.s3'); //s3client service
-        $s3Client->registerStreamWrapper(); //required
-
-        //using StreamedResponse to wrap ZipStream functionality for files on AWS s3.
-        $response = new StreamedResponse(function() use($s3keys, $s3Client)
-        {
-            // Define suitable options for ZipStream Archive.
-            $options = new \ZipStream\Option\Archive();
-            $options->setContentType('application/octet-stream');
-            // this is needed to prevent issues with truncated zip files
-            $options->setZeroHeader(true);
-            $options->setComment('test zip file.');
-
-            //initialise zipstream with output zip filename and options.
-            $zip = new ZipStream\ZipStream('test.zip', $options);
-
-            //loop keys - useful for multiple files
-            foreach ($s3keys as $key) {
-                // Get the file name in S3 key so we can save it to the zip
-                //file using the same name.
-                $fileName = basename($key);
-
-                //concatenate s3path.
-                $bucket = 'bucketname'; //replace with your bucket name or get from parameters file.
-                $s3path = "s3://" . $bucket . "/" . $key;
-
-                //addFileFromStream
-                if ($streamRead = fopen($s3path, 'r')) {
-                $zip->addFileFromStream($fileName, $streamRead);
-                } else {
-                die('Could not open stream for reading');
-                }
-            }
-
-            $zip->finish();
-
-        });
-
-        return $response;
-    }
-
-In the above example, files on AWS S3 are being streamed from S3 to the Symfon
-application via ``fopen`` call when the s3Client has ``registerStreamWrapper``
-applied. This stream is then passed to ``ZipStream`` via the
-``addFileFromStream`` function, which ZipStream then streams as a zip to the
-client browser via Symfony's ``StreamedResponse``. No Zip is created server
-side, which makes this approach a more efficient solution for streaming zips to
-the client browser especially for larger files.
-
-For the above use case you will need to have installed
-`aws/aws-sdk-php-symfony <https://github.com/aws/aws-sdk-php-symfony>`_ to
-support accessing S3 objects in your Symfony web application. This is not
-required for locally stored files on you server you intend to stream via
-``ZipStream``.
-
-See official Symfony documentation for details on
-`Symfony's StreamedResponse <https://symfony.com/doc/current/components/http_foundation.html#streaming-a-response>`_ 
-``Symfony\Component\HttpFoundation\StreamedResponse``.
-
-Note from `S3 documentation <https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-stream-wrapper.html>`_:
-
-    Streams opened in "r" mode only allow data to be read from the stream, and
-    are not seekable by default. This is so that data can be downloaded from
-    Amazon S3 in a truly streaming manner, where previously read bytes do not
-    need to be buffered into memory. If you need a stream to be seekable, you
-    can pass seekable into the stream context options of a function.
-
-Make sure to configure your S3 context correctly!
-
-Uploading a file
---------
-
-You need to add correct permissions
-(see `#120 <https://github.com/maennchen/ZipStream-PHP/issues/120>`_)
-
-**example code**
-
-
-.. code-block:: php
-
-    $path = "s3://{$adapter->getBucket()}/{$this->getArchivePath()}";
-
-    // the important bit
-    $outputContext = stream_context_create([
-        's3' => ['ACL' => 'public-read'],
-    ]);
-
-    fopen($path, 'w', null, $outputContext);

+ 0 - 22
vendor/maennchen/zipstream-php/guides/Varnish.rst

@@ -1,22 +0,0 @@
-Usage with Varnish
-=============
-
-Serving a big zip with varnish in between can cause random stream close.
-This can be solved by adding attached code to the vcl file.
-
-To avoid the problem, add the following to your varnish config file:
-
-.. code-block::
-    sub vcl_recv {
-        # Varnish can’t intercept the discussion anymore
-        # helps for streaming big zips
-        if (req.url ~ "\.(tar|gz|zip|7z|exe)$") {
-            return (pipe);
-        }
-    }
-    # Varnish can’t intercept the discussion anymore
-    # helps for streaming big zips
-    sub vcl_pipe {
-        set bereq.http.connection = "close";
-        return (pipe);
-    }

+ 0 - 85
vendor/maennchen/zipstream-php/guides/index.rst

@@ -1,85 +0,0 @@
-ZipStream PHP
-=============
-
-A fast and simple streaming zip file downloader for PHP. Using this library will
-save you from having to write the Zip to disk. You can directly send it to the
-user, which is much faster. It can work with S3 buckets or any PSR7 Stream.
-
-.. toctree::
-
-   index
-   Symfony
-   Options
-   StreamOutput
-   FlySystem
-   PSR7Streams
-   Nginx
-   Varnish
-   ContentLength
-
-Installation
----------------
-
-Simply add a dependency on ``maennchen/zipstream-php`` to your project's
-``composer.json`` file if you use Composer to manage the dependencies of your
-project. Use following command to add the package to your project's dependencies:
-
-.. code-block:: sh
-   composer require maennchen/zipstream-php
-
-Usage Intro
----------------
-
-Here's a simple example:
-
-.. code-block:: php
-
-   // Autoload the dependencies
-   require 'vendor/autoload.php';
-
-   // enable output of HTTP headers
-   $options = new ZipStream\Option\Archive();
-   $options->setSendHttpHeaders(true);
-
-   // create a new zipstream object
-   $zip = new ZipStream\ZipStream('example.zip', $options);
-
-   // create a file named 'hello.txt'
-   $zip->addFile('hello.txt', 'This is the contents of hello.txt');
-
-   // add a file named 'some_image.jpg' from a local file 'path/to/image.jpg'
-   $zip->addFileFromPath('some_image.jpg', 'path/to/image.jpg');
-
-   // add a file named 'goodbye.txt' from an open stream resource
-   $fp = tmpfile();
-   fwrite($fp, 'The quick brown fox jumped over the lazy dog.');
-   rewind($fp);
-   $zip->addFileFromStream('goodbye.txt', $fp);
-   fclose($fp);
-
-   // finish the zip stream
-   $zip->finish();
-
-You can also add comments, modify file timestamps, and customize (or
-disable) the HTTP headers. It is also possible to specify the storage method
-when adding files, the current default storage method is ``DEFLATE``
-i.e files are stored with Compression mode 0x08.
-
-Known Issues
----------------
-
-The native Mac OS archive extraction tool prior to macOS 10.15 might not open
-archives in some conditions. A workaround is to disable the Zip64 feature with
-the option ``enableZip64: false``. This limits the archive to 4 Gb and 64k files
-but will allow users on macOS 10.14 and below to open them without issue.
-See `#116 <https://github.com/maennchen/ZipStream-PHP/issues/146>`_.
-
-The linux ``unzip`` utility might not handle properly unicode characters.
-It is recommended to extract with another tool like
-`7-zip <https://www.7-zip.org/>`_.
-See `#146 <https://github.com/maennchen/ZipStream-PHP/issues/146>`_.
-
-It is the responsability of the client code to make sure that files are not
-saved with the same path, as it is not possible for the library to figure it out
-while streaming a zip.
-See `#154 <https://github.com/maennchen/ZipStream-PHP/issues/154>`_.

+ 0 - 39
vendor/maennchen/zipstream-php/phpdoc.dist.xml

@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<phpdocumentor
-        configVersion="3"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xmlns="https://www.phpdoc.org"
-        xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/phpDocumentor/phpDocumentor/master/data/xsd/phpdoc.xsd"
->
-    <title>ZipStream-PHP</title>
-    <paths>
-        <output>docs</output>
-    </paths>
-    <version number="3.0.0">
-        <folder>latest</folder>
-        <api>
-            <source dsn=".">
-                <path>src</path>
-            </source>
-            <output>api</output>
-            <ignore hidden="true" symlinks="true">
-                <path>tests/**/*</path>
-                <path>vendor/**/*</path>
-            </ignore>
-            <extensions>
-                <extension>php</extension>
-            </extensions>
-            <visibility>public</visibility>
-            <default-package-name>ZipStream</default-package-name>
-            <include-source>true</include-source>
-        </api>
-        <guide>
-            <source dsn=".">
-                <path>guides</path>
-            </source>
-            <output>guide</output>
-        </guide>
-    </version>
-    <setting name="guides.enabled" value="true"/>
-    <template name="default" />
-</phpdocumentor>

+ 16 - 13
vendor/maennchen/zipstream-php/phpunit.xml.dist

@@ -1,14 +1,17 @@
-<?xml version="1.0"?>
-<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" bootstrap="test/bootstrap.php" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
-  <coverage processUncoveredFiles="true">
-    <include>
-      <directory suffix=".php">src</directory>
-    </include>
-  </coverage>
-  <testsuites>
-    <testsuite name="Application">
-      <directory>test</directory>
-    </testsuite>
-  </testsuites>
-  <logging/>
+<phpunit bootstrap="test/bootstrap.php">
+    <testsuites>
+        <testsuite name="Application">
+            <directory>test</directory>
+        </testsuite>
+    </testsuites>
+
+    <logging>
+        <log type="coverage-clover" target="clover.xml"/>
+    </logging>
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">src</directory>
+        </whitelist>
+    </filter>
 </phpunit>

+ 2 - 0
vendor/maennchen/zipstream-php/psalm.xml

@@ -1,5 +1,6 @@
 <?xml version="1.0"?>
 <psalm
+    totallyTyped="false"
     resolveFromConfigFile="true"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns="https://getpsalm.org/schema/config"
@@ -33,6 +34,7 @@
         <MissingReturnType errorLevel="info" />
         <MissingPropertyType errorLevel="info" />
         <InvalidDocblock errorLevel="info" />
+        <MisplacedRequiredParam errorLevel="info" />
 
         <PropertyNotSetInConstructor errorLevel="info" />
         <MissingConstructor errorLevel="info" />

+ 19 - 21
vendor/maennchen/zipstream-php/src/Bigint.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;
@@ -23,6 +22,22 @@ class Bigint
         $this->fillBytes($value, 0, 8);
     }
 
+    /**
+     * Fill the bytes field with int
+     *
+     * @param int $value
+     * @param int $start
+     * @param int $count
+     * @return void
+     */
+    protected function fillBytes(int $value, int $start, int $count): void
+    {
+        for ($i = 0; $i < $count; $i++) {
+            $this->bytes[$start + $i] = $i >= PHP_INT_SIZE ? 0 : $value & 0xFF;
+            $value >>= 8;
+        }
+    }
+
     /**
      * Get an instance
      *
@@ -43,7 +58,7 @@ class Bigint
      */
     public static function fromLowHigh(int $low, int $high): self
     {
-        $bigint = new self();
+        $bigint = new Bigint();
         $bigint->fillBytes($low, 0, 4);
         $bigint->fillBytes($high, 4, 4);
         return $bigint;
@@ -93,7 +108,6 @@ class Bigint
     /**
      * Check if is over 32
      *
-     * @psalm-suppress ArgumentTypeCoercion
      * @param bool $force
      * @return bool
      */
@@ -135,7 +149,7 @@ class Bigint
      * @param Bigint $other
      * @return Bigint
      */
-    public function add(self $other): self
+    public function add(Bigint $other): Bigint
     {
         $result = clone $this;
         $overflow = false;
@@ -151,24 +165,8 @@ class Bigint
             }
         }
         if ($overflow) {
-            throw new OverflowException();
+            throw new OverflowException;
         }
         return $result;
     }
-
-    /**
-     * Fill the bytes field with int
-     *
-     * @param int $value
-     * @param int $start
-     * @param int $count
-     * @return void
-     */
-    protected function fillBytes(int $value, int $start, int $count): void
-    {
-        for ($i = 0; $i < $count; $i++) {
-            $this->bytes[$start + $i] = $i >= PHP_INT_SIZE ? 0 : $value & 0xFF;
-            $value >>= 8;
-        }
-    }
 }

+ 1 - 2
vendor/maennchen/zipstream-php/src/DeflateStream.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;
@@ -59,7 +58,7 @@ class DeflateStream extends Stream
             'comment' => $options->getComment(),
             'method' => $options->getMethod(),
             'deflateLevel' => $options->getDeflateLevel(),
-            'time' => $options->getTime(),
+            'time' => $options->getTime()
         ];
         $this->filter = stream_filter_append(
             $this->stream,

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/EncodingException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/FileNotFoundException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/FileNotReadableException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/IncompatibleOptionsException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/OverflowException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 0 - 1
vendor/maennchen/zipstream-php/src/Exception/StreamNotReadableException.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Exception;

+ 113 - 119
vendor/maennchen/zipstream-php/src/File.php

@@ -1,11 +1,10 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;
 
-use HashContext;
 use Psr\Http\Message\StreamInterface;
+use ZipStream\Exception\EncodingException;
 use ZipStream\Exception\FileNotFoundException;
 use ZipStream\Exception\FileNotReadableException;
 use ZipStream\Exception\OverflowException;
@@ -15,15 +14,13 @@ use ZipStream\Option\Version;
 
 class File
 {
-    public const HASH_ALGORITHM = 'crc32b';
-
-    public const BIT_ZERO_HEADER = 0x0008;
-
-    public const BIT_EFS_UTF8 = 0x0800;
+    const HASH_ALGORITHM = 'crc32b';
 
-    public const COMPUTE = 1;
+    const BIT_ZERO_HEADER = 0x0008;
+    const BIT_EFS_UTF8 = 0x0800;
 
-    public const SEND = 2;
+    const COMPUTE = 1;
+    const SEND = 2;
 
     private const CHUNKED_READ_BLOCK_SIZE = 1048576;
 
@@ -41,7 +38,6 @@ class File
      * @var Bigint
      */
     public $len;
-
     /**
      * @var Bigint
      */
@@ -79,9 +75,8 @@ class File
      * @var resource
      */
     private $deflate;
-
     /**
-     * @var HashContext
+     * @var resource
      */
     private $hash;
 
@@ -165,17 +160,21 @@ class File
             // Sets Bit 11: Language encoding flag (EFS).  If this bit is set,
             // the filename and comment fields for this file
             // MUST be encoded using UTF-8. (see APPENDIX D)
-            if (mb_check_encoding($name, 'UTF-8') &&
-                mb_check_encoding($comment, 'UTF-8')) {
-                $this->bits |= self::BIT_EFS_UTF8;
+            if (!mb_check_encoding($name, 'UTF-8') ||
+                !mb_check_encoding($comment, 'UTF-8')) {
+                throw new EncodingException(
+                    'File name and comment should use UTF-8 ' .
+                    'if one of them does not fit into ASCII range.'
+                );
             }
+            $this->bits |= self::BIT_EFS_UTF8;
         }
 
         if ($this->method->equals(Method::DEFLATE())) {
             $this->version = Version::DEFLATE();
         }
 
-        $force = (bool)($this->bits & self::BIT_ZERO_HEADER) &&
+        $force = (boolean)($this->bits & self::BIT_ZERO_HEADER) &&
             $this->zip->opt->isEnableZip64();
 
         $footer = $this->buildZip64ExtraBlock($force);
@@ -227,97 +226,6 @@ class File
         return str_replace(['\\', ':', '*', '?', '"', '<', '>', '|'], '_', $filename);
     }
 
-    /**
-     * Create and send data descriptor footer for this file.
-     *
-     * @return void
-     */
-    public function addFileFooter(): void
-    {
-        if ($this->bits & self::BIT_ZERO_HEADER) {
-            // compressed and uncompressed size
-            $sizeFormat = 'V';
-            if ($this->zip->opt->isEnableZip64()) {
-                $sizeFormat = 'P';
-            }
-            $fields = [
-                ['V', ZipStream::DATA_DESCRIPTOR_SIGNATURE],
-                ['V', $this->crc],              // CRC32
-                [$sizeFormat, $this->zlen],     // Length of compressed data
-                [$sizeFormat, $this->len],      // Length of original data
-            ];
-
-            $footer = ZipStream::packFields($fields);
-            $this->zip->send($footer);
-        } else {
-            $footer = '';
-        }
-        $this->totalLength = $this->hlen->add($this->zlen)->add(Bigint::init(strlen($footer)));
-        $this->zip->addToCdr($this);
-    }
-
-    public function processStream(StreamInterface $stream): void
-    {
-        $this->zlen = new Bigint();
-        $this->len = new Bigint();
-
-        if ($this->zip->opt->isZeroHeader()) {
-            $this->processStreamWithZeroHeader($stream);
-        } else {
-            $this->processStreamWithComputedHeader($stream);
-        }
-    }
-
-    /**
-     * Send CDR record for specified file.
-     *
-     * @return string
-     */
-    public function getCdrFile(): string
-    {
-        $name = static::filterFilename($this->name);
-
-        // get attributes
-        $comment = $this->opt->getComment();
-
-        // get dos timestamp
-        $time = static::dosTime($this->opt->getTime()->getTimestamp());
-
-        $footer = $this->buildZip64ExtraBlock();
-
-        $fields = [
-            ['V', ZipStream::CDR_FILE_SIGNATURE],   // Central file header signature
-            ['v', ZipStream::ZIP_VERSION_MADE_BY],  // Made by version
-            ['v', $this->version->getValue()],      // Extract by version
-            ['v', $this->bits],                     // General purpose bit flags - data descriptor flag set
-            ['v', $this->method->getValue()],       // Compression method
-            ['V', $time],                           // Timestamp (DOS Format)
-            ['V', $this->crc],                      // CRC32
-            ['V', $this->zlen->getLowFF()],         // Compressed Data Length
-            ['V', $this->len->getLowFF()],          // Original Data Length
-            ['v', strlen($name)],                   // Length of filename
-            ['v', strlen($footer)],                 // Extra data len (see above)
-            ['v', strlen($comment)],                // Length of comment
-            ['v', 0],                               // Disk number
-            ['v', 0],                               // Internal File Attributes
-            ['V', 32],                              // External File Attributes
-            ['V', $this->ofs->getLowFF()],           // Relative offset of local header
-        ];
-
-        // pack fields, then append name and comment
-        $header = ZipStream::packFields($fields);
-
-        return $header . $name . $footer . $comment;
-    }
-
-    /**
-     * @return Bigint
-     */
-    public function getTotalLength(): Bigint
-    {
-        return $this->totalLength;
-    }
-
     /**
      * Convert a UNIX timestamp to a DOS timestamp.
      *
@@ -331,14 +239,14 @@ class File
 
         // set lower-bound on dates
         if ($d['year'] < 1980) {
-            $d = [
+            $d = array(
                 'year' => 1980,
                 'mon' => 1,
                 'mday' => 1,
                 'hours' => 0,
                 'minutes' => 0,
-                'seconds' => 0,
-            ];
+                'seconds' => 0
+            );
         }
 
         // remove extra years from 1980
@@ -356,6 +264,7 @@ class File
 
     protected function buildZip64ExtraBlock(bool $force = false): string
     {
+
         $fields = [];
         if ($this->len->isOver32($force)) {
             $fields[] = ['P', $this->len];          // Length of original data
@@ -382,14 +291,50 @@ class File
             $this->version = Version::ZIP64();
         }
 
-        if ($this->bits & self::BIT_EFS_UTF8) {
-            // Put the tricky entry to
-            // force Linux unzip to lookup EFS flag.
-            $fields[] = ['v', 0x5653];  // Choose 'ZS' for proprietary usage
-            $fields[] = ['v', 0x0000];  // zero length
+        return ZipStream::packFields($fields);
+    }
+
+    /**
+     * Create and send data descriptor footer for this file.
+     *
+     * @return void
+     */
+
+    public function addFileFooter(): void
+    {
+
+        if ($this->bits & self::BIT_ZERO_HEADER) {
+            // compressed and uncompressed size
+            $sizeFormat = 'V';
+            if ($this->zip->opt->isEnableZip64()) {
+                $sizeFormat = 'P';
+            }
+            $fields = [
+                ['V', ZipStream::DATA_DESCRIPTOR_SIGNATURE],
+                ['V', $this->crc],              // CRC32
+                [$sizeFormat, $this->zlen],     // Length of compressed data
+                [$sizeFormat, $this->len],      // Length of original data
+            ];
+
+            $footer = ZipStream::packFields($fields);
+            $this->zip->send($footer);
+        } else {
+            $footer = '';
         }
+        $this->totalLength = $this->hlen->add($this->zlen)->add(Bigint::init(strlen($footer)));
+        $this->zip->addToCdr($this);
+    }
 
-        return ZipStream::packFields($fields);
+    public function processStream(StreamInterface $stream): void
+    {
+        $this->zlen = new Bigint();
+        $this->len = new Bigint();
+
+        if ($this->zip->opt->isZeroHeader()) {
+            $this->processStreamWithZeroHeader($stream);
+        } else {
+            $this->processStreamWithComputedHeader($stream);
+        }
     }
 
     protected function processStreamWithZeroHeader(StreamInterface $stream): void
@@ -409,7 +354,7 @@ class File
             $data = $stream->read(self::CHUNKED_READ_BLOCK_SIZE);
             $total += strlen($data);
             if ($size > 0 && $total > $size) {
-                $data = substr($data, 0, strlen($data)-($total - $size));
+                $data = substr($data, 0 , strlen($data)-($total - $size));
             }
             $this->deflateData($stream, $data, $options);
             if ($options & self::SEND) {
@@ -421,8 +366,7 @@ class File
 
     protected function deflateInit(): void
     {
-        $hash = hash_init(self::HASH_ALGORITHM);
-        $this->hash = $hash;
+        $this->hash = hash_init(self::HASH_ALGORITHM);
         if ($this->method->equals(Method::DEFLATE())) {
             $this->deflate = deflate_init(
                 ZLIB_ENCODING_RAW,
@@ -480,4 +424,54 @@ class File
         $this->readStream($stream, self::SEND);
         $this->addFileFooter();
     }
+
+    /**
+     * Send CDR record for specified file.
+     *
+     * @return string
+     */
+    public function getCdrFile(): string
+    {
+        $name = static::filterFilename($this->name);
+
+        // get attributes
+        $comment = $this->opt->getComment();
+
+        // get dos timestamp
+        $time = static::dosTime($this->opt->getTime()->getTimestamp());
+
+        $footer = $this->buildZip64ExtraBlock();
+
+        $fields = [
+            ['V', ZipStream::CDR_FILE_SIGNATURE],   // Central file header signature
+            ['v', ZipStream::ZIP_VERSION_MADE_BY],  // Made by version
+            ['v', $this->version->getValue()],      // Extract by version
+            ['v', $this->bits],                     // General purpose bit flags - data descriptor flag set
+            ['v', $this->method->getValue()],       // Compression method
+            ['V', $time],                           // Timestamp (DOS Format)
+            ['V', $this->crc],                      // CRC32
+            ['V', $this->zlen->getLowFF()],         // Compressed Data Length
+            ['V', $this->len->getLowFF()],          // Original Data Length
+            ['v', strlen($name)],                   // Length of filename
+            ['v', strlen($footer)],                 // Extra data len (see above)
+            ['v', strlen($comment)],                // Length of comment
+            ['v', 0],                               // Disk number
+            ['v', 0],                               // Internal File Attributes
+            ['V', 32],                              // External File Attributes
+            ['V', $this->ofs->getLowFF()]           // Relative offset of local header
+        ];
+
+        // pack fields, then append name and comment
+        $header = ZipStream::packFields($fields);
+
+        return $header . $name . $footer . $comment;
+    }
+
+    /**
+     * @return Bigint
+     */
+    public function getTotalLength(): Bigint
+    {
+        return $this->totalLength;
+    }
 }

+ 6 - 21
vendor/maennchen/zipstream-php/src/Option/Archive.php

@@ -1,20 +1,15 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Option;
 
-use Psr\Http\Message\StreamInterface;
-
 final class Archive
 {
-    public const DEFAULT_DEFLATE_LEVEL = 6;
-
+    const DEFAULT_DEFLATE_LEVEL = 6;
     /**
      * @var string
      */
     private $comment = '';
-
     /**
      * Size, in bytes, of the largest file to try
      * and load into memory (used by
@@ -25,7 +20,6 @@ final class Archive
      * @var int
      */
     private $largeFileSize = 20 * 1024 * 1024;
-
     /**
      * How to handle large files.  Legal values are
      * Method::STORE() (the default), or
@@ -38,7 +32,6 @@ final class Archive
      * @var Method
      */
     private $largeFileMethod;
-
     /**
      * Boolean indicating whether or not to send
      * the HTTP headers for this file.
@@ -46,14 +39,12 @@ final class Archive
      * @var bool
      */
     private $sendHttpHeaders = false;
-
     /**
      * The method called to send headers
      *
      * @var Callable
      */
     private $httpHeaderCallback = 'header';
-
     /**
      * Enable Zip64 extension, supporting very large
      * archives (any size > 4 GB or file count > 64k)
@@ -61,7 +52,6 @@ final class Archive
      * @var bool
      */
     private $enableZip64 = true;
-
     /**
      * Enable streaming files with single read where
      * general purpose bit 3 indicates local file header
@@ -72,7 +62,6 @@ final class Archive
      * @var bool
      */
     private $zeroHeader = false;
-
     /**
      * Enable reading file stat for determining file size.
      * When a 32-bit system reads file size that is
@@ -86,13 +75,11 @@ final class Archive
      * @var bool
      */
     private $statFiles = true;
-
     /**
      * Enable flush after every write to output stream.
      * @var bool
      */
     private $flushOutput = false;
-
     /**
      * HTTP Content-Disposition.  Defaults to
      * 'attachment', where
@@ -104,7 +91,6 @@ final class Archive
      * @var string
      */
     private $contentDisposition = 'attachment';
-
     /**
      * Note that this does nothing if you are
      * not sending HTTP headers.
@@ -112,14 +98,13 @@ final class Archive
      * @var string
      */
     private $contentType = 'application/x-zip';
-
     /**
      * @var int
      */
     private $deflateLevel = 6;
 
     /**
-     * @var StreamInterface|resource
+     * @var resource
      */
     private $outputStream;
 
@@ -172,12 +157,12 @@ final class Archive
         $this->sendHttpHeaders = $sendHttpHeaders;
     }
 
-    public function getHttpHeaderCallback(): callable
+    public function getHttpHeaderCallback(): Callable
     {
         return $this->httpHeaderCallback;
     }
 
-    public function setHttpHeaderCallback(callable $httpHeaderCallback): void
+    public function setHttpHeaderCallback(Callable $httpHeaderCallback): void
     {
         $this->httpHeaderCallback = $httpHeaderCallback;
     }
@@ -243,7 +228,7 @@ final class Archive
     }
 
     /**
-     * @return StreamInterface|resource
+     * @return resource
      */
     public function getOutputStream()
     {
@@ -251,7 +236,7 @@ final class Archive
     }
 
     /**
-     * @param StreamInterface|resource $outputStream
+     * @param resource $outputStream
      */
     public function setOutputStream($outputStream): void
     {

+ 5 - 11
vendor/maennchen/zipstream-php/src/Option/File.php

@@ -1,11 +1,9 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Option;
 
 use DateTime;
-use DateTimeInterface;
 
 final class File
 {
@@ -13,22 +11,18 @@ final class File
      * @var string
      */
     private $comment = '';
-
     /**
      * @var Method
      */
     private $method;
-
     /**
      * @var int
      */
     private $deflateLevel;
-
     /**
-     * @var DateTimeInterface
+     * @var DateTime
      */
     private $time;
-
     /**
      * @var int
      */
@@ -89,17 +83,17 @@ final class File
     }
 
     /**
-     * @return DateTimeInterface
+     * @return DateTime
      */
-    public function getTime(): DateTimeInterface
+    public function getTime(): DateTime
     {
         return $this->time;
     }
 
     /**
-     * @param DateTimeInterface $time
+     * @param DateTime $time
      */
-    public function setTime(DateTimeInterface $time): void
+    public function setTime(DateTime $time): void
     {
         $this->time = $time;
     }

+ 2 - 4
vendor/maennchen/zipstream-php/src/Option/Method.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Option;
@@ -15,7 +14,6 @@ use MyCLabs\Enum\Enum;
  */
 class Method extends Enum
 {
-    public const STORE = 0x00;
-
-    public const DEFLATE = 0x08;
+    const STORE = 0x00;
+    const DEFLATE = 0x08;
 }

+ 3 - 6
vendor/maennchen/zipstream-php/src/Option/Version.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream\Option;
@@ -17,9 +16,7 @@ use MyCLabs\Enum\Enum;
  */
 class Version extends Enum
 {
-    public const STORE = 0x000A; // 1.00
-
-    public const DEFLATE = 0x0014; // 2.00
-
-    public const ZIP64 = 0x002D; // 4.50
+    const STORE = 0x000A; // 1.00
+    const DEFLATE = 0x0014; // 2.00
+    const ZIP64 = 0x002D; // 4.50
 }

+ 40 - 52
vendor/maennchen/zipstream-php/src/Stream.php

@@ -1,11 +1,8 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;
 
-use function mb_strlen;
-
 use Psr\Http\Message\StreamInterface;
 use RuntimeException;
 
@@ -25,29 +22,6 @@ class Stream implements StreamInterface
         $this->stream = $stream;
     }
 
-    /**
-     * Reads all data from the stream into a string, from the beginning to end.
-     *
-     * This method MUST attempt to seek to the beginning of the stream before
-     * reading data and read the stream until the end is reached.
-     *
-     * Warning: This could attempt to load a large amount of data into memory.
-     *
-     * This method MUST NOT raise an exception in order to conform with PHP's
-     * string casting operations.
-     *
-     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
-     * @return string
-     */
-    public function __toString(): string
-    {
-        try {
-            $this->seek(0);
-        } catch (RuntimeException $e) {
-        }
-        return (string) stream_get_contents($this->stream);
-    }
-
     /**
      * Closes the stream and any underlying resources.
      *
@@ -75,6 +49,28 @@ class Stream implements StreamInterface
         return $result;
     }
 
+    /**
+     * Reads all data from the stream into a string, from the beginning to end.
+     *
+     * This method MUST attempt to seek to the beginning of the stream before
+     * reading data and read the stream until the end is reached.
+     *
+     * Warning: This could attempt to load a large amount of data into memory.
+     *
+     * This method MUST NOT raise an exception in order to conform with PHP's
+     * string casting operations.
+     *
+     * @see http://php.net/manual/en/language.oop5.magic.php#object.tostring
+     * @return string
+     */
+    public function __toString(): string
+    {
+        try {
+            $this->seek(0);
+        } catch (\RuntimeException $e) {}
+        return (string) stream_get_contents($this->stream);
+    }
+
     /**
      * Seek to a position in the stream.
      *
@@ -85,15 +81,15 @@ class Stream implements StreamInterface
      *     PHP $whence values for `fseek()`.  SEEK_SET: Set position equal to
      *     offset bytes SEEK_CUR: Set position to current location plus offset
      *     SEEK_END: Set position to end-of-stream plus offset.
-     * @throws RuntimeException on failure.
+     * @throws \RuntimeException on failure.
      */
     public function seek($offset, $whence = SEEK_SET): void
     {
         if (!$this->isSeekable()) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         if (fseek($this->stream, $offset, $whence) !== 0) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
     }
 
@@ -140,13 +136,13 @@ class Stream implements StreamInterface
      * Returns the current position of the file read/write pointer
      *
      * @return int Position of the file pointer
-     * @throws RuntimeException on error.
+     * @throws \RuntimeException on error.
      */
     public function tell(): int
     {
         $position = ftell($this->stream);
         if ($position === false) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         return $position;
     }
@@ -169,7 +165,7 @@ class Stream implements StreamInterface
      *
      * @see seek()
      * @link http://www.php.net/manual/en/function.fseek.php
-     * @throws RuntimeException on failure.
+     * @throws \RuntimeException on failure.
      */
     public function rewind(): void
     {
@@ -181,17 +177,17 @@ class Stream implements StreamInterface
      *
      * @param string $string The string that is to be written.
      * @return int Returns the number of bytes written to the stream.
-     * @throws RuntimeException on failure.
+     * @throws \RuntimeException on failure.
      */
     public function write($string): int
     {
         if (!$this->isWritable()) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         if (fwrite($this->stream, $string) === false) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
-        return mb_strlen($string);
+        return \mb_strlen($string);
     }
 
     /**
@@ -201,11 +197,7 @@ class Stream implements StreamInterface
      */
     public function isWritable(): bool
     {
-        $mode = $this->getMetadata('mode');
-        if (!is_string($mode)) {
-            throw new RuntimeException('Could not get stream mode from metadata!');
-        }
-        return preg_match('/[waxc+]/', $mode) === 1;
+        return preg_match('/[waxc+]/', $this->getMetadata('mode')) === 1;
     }
 
     /**
@@ -216,16 +208,16 @@ class Stream implements StreamInterface
      *     call returns fewer bytes.
      * @return string Returns the data read from the stream, or an empty string
      *     if no bytes are available.
-     * @throws RuntimeException if an error occurs.
+     * @throws \RuntimeException if an error occurs.
      */
     public function read($length): string
     {
         if (!$this->isReadable()) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         $result = fread($this->stream, $length);
         if ($result === false) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         return $result;
     }
@@ -237,28 +229,24 @@ class Stream implements StreamInterface
      */
     public function isReadable(): bool
     {
-        $mode = $this->getMetadata('mode');
-        if (!is_string($mode)) {
-            throw new RuntimeException('Could not get stream mode from metadata!');
-        }
-        return preg_match('/[r+]/', $mode) === 1;
+        return preg_match('/[r+]/', $this->getMetadata('mode')) === 1;
     }
 
     /**
      * Returns the remaining contents in a string
      *
      * @return string
-     * @throws RuntimeException if unable to read or an error occurs while
+     * @throws \RuntimeException if unable to read or an error occurs while
      *     reading.
      */
     public function getContents(): string
     {
         if (!$this->isReadable()) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         $result = stream_get_contents($this->stream);
         if ($result === false) {
-            throw new RuntimeException();
+            throw new RuntimeException;
         }
         return $result;
     }

+ 73 - 82
vendor/maennchen/zipstream-php/src/ZipStream.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStream;
@@ -81,24 +80,19 @@ class ZipStream
      * to prevent file permissions issues upon extract (see #84)
      * 0x603 is 00000110 00000011 in binary, so 6 and 3
      */
-    public const ZIP_VERSION_MADE_BY = 0x603;
+    const ZIP_VERSION_MADE_BY = 0x603;
 
     /**
-     * The following signatures end with 0x4b50, which in ASCII is PK,
+     * The following signatures end with 0x4b50, which in ASCII is PK,
      * the initials of the inventor Phil Katz.
      * See https://en.wikipedia.org/wiki/Zip_(file_format)#File_headers
      */
-    public const FILE_HEADER_SIGNATURE = 0x04034b50;
-
-    public const CDR_FILE_SIGNATURE = 0x02014b50;
-
-    public const CDR_EOF_SIGNATURE = 0x06054b50;
-
-    public const DATA_DESCRIPTOR_SIGNATURE = 0x08074b50;
-
-    public const ZIP64_CDR_EOF_SIGNATURE = 0x06064b50;
-
-    public const ZIP64_CDR_LOCATOR_SIGNATURE = 0x07064b50;
+    const FILE_HEADER_SIGNATURE = 0x04034b50;
+    const CDR_FILE_SIGNATURE = 0x02014b50;
+    const CDR_EOF_SIGNATURE = 0x06054b50;
+    const DATA_DESCRIPTOR_SIGNATURE = 0x08074b50;
+    const ZIP64_CDR_EOF_SIGNATURE = 0x06064b50;
+    const ZIP64_CDR_LOCATOR_SIGNATURE = 0x07064b50;
 
     /**
      * Global Options
@@ -318,9 +312,12 @@ class ZipStream
      *
      * Examples:
      *
-     *   $stream = $response->getBody();
+     *   // create a temporary file stream and write text to it
+     *   $fp = tmpfile();
+     *   fwrite($fp, 'The quick brown fox jumped over the lazy dog.');
+     *
      *   // add a file named 'streamfile.txt' from the content of the stream
-     *   $x->addFileFromPsr7Stream('streamfile.txt', $stream);
+     *   $x->addFileFromPsr7Stream('streamfile.txt', $fp);
      *
      * @return void
      */
@@ -381,6 +378,34 @@ class ZipStream
         $this->clear();
     }
 
+    /**
+     * Send ZIP64 CDR EOF (Central Directory Record End-of-File) record.
+     *
+     * @return void
+     */
+    protected function addCdr64Eof(): void
+    {
+        $num_files = count($this->files);
+        $cdr_length = $this->cdr_ofs;
+        $cdr_offset = $this->ofs;
+
+        $fields = [
+            ['V', static::ZIP64_CDR_EOF_SIGNATURE],     // ZIP64 end of central file header signature
+            ['P', 44],                                  // Length of data below this header (length of block - 12) = 44
+            ['v', static::ZIP_VERSION_MADE_BY],         // Made by version
+            ['v', Version::ZIP64],                      // Extract by version
+            ['V', 0x00],                                // disk number
+            ['V', 0x00],                                // no of disks
+            ['P', $num_files],                          // no of entries on disk
+            ['P', $num_files],                          // no of entries in cdr
+            ['P', $cdr_length],                         // CDR size
+            ['P', $cdr_offset],                         // CDR offset
+        ];
+
+        $ret = static::packFields($fields);
+        $this->send($ret);
+    }
+
     /**
      * Create a format string and argument list for pack(), then call
      * pack() and return the result.
@@ -434,13 +459,7 @@ class ZipStream
         }
         $this->need_headers = false;
 
-        $outputStream = $this->opt->getOutputStream();
-
-        if ($outputStream instanceof StreamInterface) {
-            $outputStream->write($str);
-        } else {
-            fwrite($outputStream, $str);
-        }
+        fwrite($this->opt->getOutputStream(), $str);
 
         if ($this->opt->isFlushOutput()) {
             // flush output buffer if it is on and flushable
@@ -454,62 +473,6 @@ class ZipStream
         }
     }
 
-    /**
-     * Is this file larger than large_file_size?
-     *
-     * @param string $path
-     * @return bool
-     */
-    public function isLargeFile(string $path): bool
-    {
-        if (!$this->opt->isStatFiles()) {
-            return false;
-        }
-        $stat = stat($path);
-        return $stat['size'] > $this->opt->getLargeFileSize();
-    }
-
-    /**
-     * Save file attributes for trailing CDR record.
-     *
-     * @param File $file
-     * @return void
-     */
-    public function addToCdr(File $file): void
-    {
-        $file->ofs = $this->ofs;
-        $this->ofs = $this->ofs->add($file->getTotalLength());
-        $this->files[] = $file->getCdrFile();
-    }
-
-    /**
-     * Send ZIP64 CDR EOF (Central Directory Record End-of-File) record.
-     *
-     * @return void
-     */
-    protected function addCdr64Eof(): void
-    {
-        $num_files = count($this->files);
-        $cdr_length = $this->cdr_ofs;
-        $cdr_offset = $this->ofs;
-
-        $fields = [
-            ['V', static::ZIP64_CDR_EOF_SIGNATURE],     // ZIP64 end of central file header signature
-            ['P', 44],                                  // Length of data below this header (length of block - 12) = 44
-            ['v', static::ZIP_VERSION_MADE_BY],         // Made by version
-            ['v', Version::ZIP64],                      // Extract by version
-            ['V', 0x00],                                // disk number
-            ['V', 0x00],                                // no of disks
-            ['P', $num_files],                          // no of entries on disk
-            ['P', $num_files],                          // no of entries in cdr
-            ['P', $cdr_length],                         // CDR size
-            ['P', $cdr_offset],                         // CDR offset
-        ];
-
-        $ret = static::packFields($fields);
-        $this->send($ret);
-    }
-
     /**
      * Send HTTP headers for this stream.
      *
@@ -529,13 +492,13 @@ class ZipStream
             $disposition .= "; filename*=UTF-8''{$urlencoded}";
         }
 
-        $headers = [
+        $headers = array(
             'Content-Type' => $this->opt->getContentType(),
             'Content-Disposition' => $disposition,
             'Pragma' => 'public',
             'Cache-Control' => 'public, must-revalidate',
-            'Content-Transfer-Encoding' => 'binary',
-        ];
+            'Content-Transfer-Encoding' => 'binary'
+        );
 
         $call = $this->opt->getHttpHeaderCallback();
         foreach ($headers as $key => $val) {
@@ -605,4 +568,32 @@ class ZipStream
         $this->cdr_ofs = new Bigint();
         $this->opt = new ArchiveOptions();
     }
+
+    /**
+     * Is this file larger than large_file_size?
+     *
+     * @param string $path
+     * @return bool
+     */
+    public function isLargeFile(string $path): bool
+    {
+        if (!$this->opt->isStatFiles()) {
+            return false;
+        }
+        $stat = stat($path);
+        return $stat['size'] > $this->opt->getLargeFileSize();
+    }
+
+    /**
+     * Save file attributes for trailing CDR record.
+     *
+     * @param File $file
+     * @return void
+     */
+    public function addToCdr(File $file): void
+    {
+        $file->ofs = $this->ofs;
+        $this->ofs = $this->ofs->add($file->getTotalLength());
+        $this->files[] = $file->getCdrFile();
+    }
 }

+ 0 - 1
vendor/maennchen/zipstream-php/test/BigintTest.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 namespace BigintTest;

+ 139 - 203
vendor/maennchen/zipstream-php/test/ZipStreamTest.php

@@ -1,21 +1,15 @@
 <?php
-
 declare(strict_types=1);
 
 namespace ZipStreamTest;
 
-use GuzzleHttp\Psr7\Response;
 use org\bovigo\vfs\vfsStream;
+use GuzzleHttp\Psr7\Response;
 use PHPUnit\Framework\TestCase;
-use RecursiveDirectoryIterator;
-use RecursiveIteratorIterator;
-use ReflectionClass;
-use ZipArchive;
 use ZipStream\File;
 use ZipStream\Option\Archive as ArchiveOptions;
 use ZipStream\Option\File as FileOptions;
 use ZipStream\Option\Method;
-use ZipStream\Stream;
 use ZipStream\ZipStream;
 
 /**
@@ -23,7 +17,7 @@ use ZipStream\ZipStream;
  */
 class ZipStreamTest extends TestCase
 {
-    public const OSX_ARCHIVE_UTILITY =
+    const OSX_ARCHIVE_UTILITY =
         '/System/Library/CoreServices/Applications/Archive Utility.app/Contents/MacOS/Archive Utility';
 
     public function testFileNotFoundException(): void
@@ -41,7 +35,7 @@ class ZipStreamTest extends TestCase
         // create new virtual filesystem
         $root = vfsStream::setup('vfs');
         // create a virtual file with no permissions
-        $file = vfsStream::newFile('foo.txt', 0)->at($root)->setContent('bar');
+        $file = vfsStream::newFile('foo.txt', 0000)->at($root)->setContent('bar');
         $zip = new ZipStream();
         $this->expectException(\ZipStream\Exception\FileNotReadableException::class);
         $zip->addFileFromPath('foo.txt', $file->url());
@@ -50,7 +44,7 @@ class ZipStreamTest extends TestCase
     public function testDostime(): void
     {
         // Allows testing of protected method
-        $class = new ReflectionClass(File::class);
+        $class = new \ReflectionClass(File::class);
         $method = $class->getMethod('dostime');
         $method->setAccessible(true);
 
@@ -81,12 +75,81 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files);
+        $this->assertEquals(['sample.txt', 'test/sample.txt'], $files);
 
         $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data');
         $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data');
     }
 
+    /**
+     * @return array
+     */
+    protected function getTmpFileStream(): array
+    {
+        $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest');
+        $stream = fopen($tmp, 'wb+');
+
+        return array($tmp, $stream);
+    }
+
+    /**
+     * @param string $tmp
+     * @return string
+     */
+    protected function validateAndExtractZip($tmp): string
+    {
+        $tmpDir = $this->getTmpDir();
+
+        $zipArch = new \ZipArchive;
+        $res = $zipArch->open($tmp);
+
+        if ($res !== true) {
+            $this->fail("Failed to open {$tmp}. Code: $res");
+
+            return $tmpDir;
+        }
+
+        $this->assertEquals(0, $zipArch->status);
+        $this->assertEquals(0, $zipArch->statusSys);
+
+        $zipArch->extractTo($tmpDir);
+        $zipArch->close();
+
+        return $tmpDir;
+    }
+
+    protected function getTmpDir(): string
+    {
+        $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest');
+        unlink($tmp);
+        mkdir($tmp) or $this->fail('Failed to make directory');
+
+        return $tmp;
+    }
+
+    /**
+     * @param string $path
+     * @return string[]
+     */
+    protected function getRecursiveFileList(string $path): array
+    {
+        $data = array();
+        $path = (string)realpath($path);
+        $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($path));
+
+        $pathLen = strlen($path);
+        foreach ($files as $file) {
+            $filePath = $file->getRealPath();
+            if (!is_dir($filePath)) {
+                $data[] = substr($filePath, $pathLen + 1);
+            }
+        }
+
+        sort($data);
+
+        return $data;
+    }
+
     public function testAddFileUtf8NameComment(): void
     {
         [$tmp, $stream] = $this->getTmpFileStream();
@@ -113,17 +176,19 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame([$name], $files);
+        $this->assertEquals(array($name), $files);
         $this->assertStringEqualsFile($tmpDir . '/' . $name, $content);
 
-        $zipArch = new ZipArchive();
+        $zipArch = new \ZipArchive();
         $zipArch->open($tmp);
-        $this->assertSame($comment, $zipArch->getCommentName($name));
+        $this->assertEquals($comment, $zipArch->getCommentName($name));
     }
 
     public function testAddFileUtf8NameNonUtfComment(): void
     {
-        [$tmp, $stream] = $this->getTmpFileStream();
+        $this->expectException(\ZipStream\Exception\EncodingException::class);
+
+        $stream = $this->getTmpFileStream()[1];
 
         $options = new ArchiveOptions();
         $options->setOutputStream($stream);
@@ -132,66 +197,33 @@ class ZipStreamTest extends TestCase
 
         $name = 'á.txt';
         $content = 'any';
-        $comment = mb_convert_encoding('á', 'ISO-8859-2', 'UTF-8');
-
-        // @see https://libzip.org/documentation/zip_file_get_comment.html
-        //
-        // mb_convert_encoding hasn't CP437.
-        // nearly CP850 (DOS-Latin-1)
-        $guessComment = mb_convert_encoding($comment, 'UTF-8', 'CP850');
+        $comment = 'á';
 
         $fileOptions = new FileOptions();
-        $fileOptions->setComment($comment);
+        $fileOptions->setComment(mb_convert_encoding($comment, 'ISO-8859-2', 'UTF-8'));
 
         $zip->addFile($name, $content, $fileOptions);
-        $zip->finish();
-        fclose($stream);
-
-        $zipArch = new ZipArchive();
-        $zipArch->open($tmp);
-        $this->assertSame($guessComment, $zipArch->getCommentName($name));
-        $this->assertSame($comment, $zipArch->getCommentName($name, ZipArchive::FL_ENC_RAW));
     }
 
     public function testAddFileNonUtf8NameUtfComment(): void
     {
-        [$tmp, $stream] = $this->getTmpFileStream();
+        $this->expectException(\ZipStream\Exception\EncodingException::class);
+
+        $stream = $this->getTmpFileStream()[1];
 
         $options = new ArchiveOptions();
         $options->setOutputStream($stream);
 
         $zip = new ZipStream(null, $options);
 
-        $name = mb_convert_encoding('á.txt', 'ISO-8859-2', 'UTF-8');
+        $name = 'á.txt';
         $content = 'any';
         $comment = 'á';
 
-        // @see https://libzip.org/documentation/zip_get_name.html
-        //
-        // mb_convert_encoding hasn't CP437.
-        // nearly CP850 (DOS-Latin-1)
-        $guessName = mb_convert_encoding($name, 'UTF-8', 'CP850');
-
         $fileOptions = new FileOptions();
         $fileOptions->setComment($comment);
 
-        $zip->addFile($name, $content, $fileOptions);
-        $zip->finish();
-        fclose($stream);
-
-        $tmpDir = $this->validateAndExtractZip($tmp);
-
-        $files = $this->getRecursiveFileList($tmpDir);
-
-        $this->assertNotSame([$name], $files);
-        $this->assertSame([$guessName], $files);
-        $this->assertStringEqualsFile($tmpDir . '/' . $guessName, $content);
-
-        $zipArch = new ZipArchive();
-        $zipArch->open($tmp);
-        $this->assertSame($guessName, $zipArch->getNameIndex(0));
-        $this->assertSame($name, $zipArch->getNameIndex(0, ZipArchive::FL_ENC_RAW));
-        $this->assertSame($comment, $zipArch->getCommentName($guessName));
+        $zip->addFile(mb_convert_encoding($name, 'ISO-8859-2', 'UTF-8'), $content, $fileOptions);
     }
 
     public function testAddFileWithStorageMethod(): void
@@ -211,13 +243,13 @@ class ZipStreamTest extends TestCase
         $zip->finish();
         fclose($stream);
 
-        $zipArch = new ZipArchive();
+        $zipArch = new \ZipArchive();
         $zipArch->open($tmp);
 
         $sample1 = $zipArch->statName('sample.txt');
         $sample12 = $zipArch->statName('test/sample.txt');
-        $this->assertSame($sample1['comp_method'], Method::STORE);
-        $this->assertSame($sample12['comp_method'], Method::DEFLATE);
+        $this->assertEquals($sample1['comp_method'], Method::STORE);
+        $this->assertEquals($sample12['comp_method'], Method::DEFLATE);
 
         $zipArch->close();
     }
@@ -243,7 +275,7 @@ class ZipStreamTest extends TestCase
 
         exec(escapeshellarg(self::OSX_ARCHIVE_UTILITY) . ' ' . escapeshellarg($tmp), $output, $returnStatus);
 
-        $this->assertSame(0, $returnStatus);
+        $this->assertEquals(0, $returnStatus);
         $this->assertCount(0, $output);
 
         $this->assertFileExists(dirname($tmp) . '/' . $folder . '/sample.txt');
@@ -275,7 +307,7 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files);
+        $this->assertEquals(array('sample.txt', 'test/sample.txt'), $files);
 
         $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data');
         $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data');
@@ -306,14 +338,14 @@ class ZipStreamTest extends TestCase
         $zip->finish();
         fclose($stream);
 
-        $zipArch = new ZipArchive();
+        $zipArch = new \ZipArchive();
         $zipArch->open($tmp);
 
         $sample1 = $zipArch->statName('sample.txt');
-        $this->assertSame(Method::STORE, $sample1['comp_method']);
+        $this->assertEquals(Method::STORE, $sample1['comp_method']);
 
         $sample2 = $zipArch->statName('test/sample.txt');
-        $this->assertSame(Method::DEFLATE, $sample2['comp_method']);
+        $this->assertEquals(Method::DEFLATE, $sample2['comp_method']);
 
         $zipArch->close();
     }
@@ -334,6 +366,42 @@ class ZipStreamTest extends TestCase
         }
     }
 
+    protected function addLargeFileFileFromPath($method, $zeroHeader, $zip64): void
+    {
+        [$tmp, $stream] = $this->getTmpFileStream();
+
+        $options = new ArchiveOptions();
+        $options->setOutputStream($stream);
+        $options->setLargeFileMethod($method);
+        $options->setLargeFileSize(5);
+        $options->setZeroHeader($zeroHeader);
+        $options->setEnableZip64($zip64);
+
+        $zip = new ZipStream(null, $options);
+
+        [$tmpExample, $streamExample] = $this->getTmpFileStream();
+        for ($i = 0; $i <= 10000; $i++) {
+            fwrite($streamExample, sha1((string)$i));
+            if ($i % 100 === 0) {
+                fwrite($streamExample, "\n");
+            }
+        }
+        fclose($streamExample);
+        $shaExample = sha1_file($tmpExample);
+        $zip->addFileFromPath('sample.txt', $tmpExample);
+        unlink($tmpExample);
+
+        $zip->finish();
+        fclose($stream);
+
+        $tmpDir = $this->validateAndExtractZip($tmp);
+
+        $files = $this->getRecursiveFileList($tmpDir);
+        $this->assertEquals(array('sample.txt'), $files);
+
+        $this->assertEquals(sha1_file($tmpDir . '/sample.txt'), $shaExample, "SHA-1 Mismatch Method: {$method}");
+    }
+
     public function testAddFileFromStream(): void
     {
         [$tmp, $stream] = $this->getTmpFileStream();
@@ -365,7 +433,7 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files);
+        $this->assertEquals(array('sample.txt', 'test/sample.txt'), $files);
 
         $this->assertStringEqualsFile(__FILE__, file_get_contents($tmpDir . '/sample.txt'));
         $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data');
@@ -398,14 +466,14 @@ class ZipStreamTest extends TestCase
         $zip->finish();
         fclose($stream);
 
-        $zipArch = new ZipArchive();
+        $zipArch = new \ZipArchive();
         $zipArch->open($tmp);
 
         $sample1 = $zipArch->statName('sample.txt');
-        $this->assertSame(Method::STORE, $sample1['comp_method']);
+        $this->assertEquals(Method::STORE, $sample1['comp_method']);
 
         $sample2 = $zipArch->statName('test/sample.txt');
-        $this->assertSame(Method::DEFLATE, $sample2['comp_method']);
+        $this->assertEquals(Method::DEFLATE, $sample2['comp_method']);
 
         $zipArch->close();
     }
@@ -432,34 +500,7 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.json'], $files);
-        $this->assertStringEqualsFile($tmpDir . '/sample.json', $body);
-    }
-
-    public function testAddFileFromPsr7StreamWithOutputToPsr7Stream(): void
-    {
-        [$tmp, $resource] = $this->getTmpFileStream();
-        $psr7OutputStream = new Stream($resource);
-
-        $options = new ArchiveOptions();
-        $options->setOutputStream($psr7OutputStream);
-
-        $zip = new ZipStream(null, $options);
-
-        $body = 'Sample String Data';
-        $response = new Response(200, [], $body);
-
-        $fileOptions = new FileOptions();
-        $fileOptions->setMethod(Method::STORE());
-
-        $zip->addFileFromPsr7Stream('sample.json', $response->getBody(), $fileOptions);
-        $zip->finish();
-        $psr7OutputStream->close();
-
-        $tmpDir = $this->validateAndExtractZip($tmp);
-        $files = $this->getRecursiveFileList($tmpDir);
-
-        $this->assertSame(['sample.json'], $files);
+        $this->assertEquals(array('sample.json'), $files);
         $this->assertStringEqualsFile($tmpDir . '/sample.json', $body);
     }
 
@@ -488,7 +529,7 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.json'], $files);
+        $this->assertEquals(array('sample.json'), $files);
         $this->assertStringEqualsFile($tmpDir . '/sample.json', $body);
     }
 
@@ -511,7 +552,7 @@ class ZipStreamTest extends TestCase
         $tmpDir = $this->validateAndExtractZip($tmp);
 
         $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.txt', 'test' . DIRECTORY_SEPARATOR . 'sample.txt'], $files);
+        $this->assertEquals(['sample.txt', 'test/sample.txt'], $files);
 
         $this->assertStringEqualsFile($tmpDir . '/sample.txt', 'Sample String Data');
         $this->assertStringEqualsFile($tmpDir . '/test/sample.txt', 'More Simple Sample Data');
@@ -521,7 +562,7 @@ class ZipStreamTest extends TestCase
     {
         // WORKAROUND (1/2): remove phpunit's output buffer in order to run test without any buffering
         ob_end_flush();
-        $this->assertSame(0, ob_get_level());
+        $this->assertEquals(0, ob_get_level());
 
         [$tmp, $stream] = $this->getTmpFileStream();
 
@@ -542,109 +583,4 @@ class ZipStreamTest extends TestCase
         // WORKAROUND (2/2): add back output buffering so that PHPUnit doesn't complain that it is missing
         ob_start();
     }
-
-    /**
-     * @return array
-     */
-    protected function getTmpFileStream(): array
-    {
-        $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest');
-        $stream = fopen($tmp, 'wb+');
-
-        return [$tmp, $stream];
-    }
-
-    /**
-     * @param string $tmp
-     * @return string
-     */
-    protected function validateAndExtractZip($tmp): string
-    {
-        $tmpDir = $this->getTmpDir();
-
-        $zipArch = new ZipArchive();
-        $res = $zipArch->open($tmp);
-
-        if ($res !== true) {
-            $this->fail("Failed to open {$tmp}. Code: $res");
-
-            return $tmpDir;
-        }
-
-        $this->assertSame(0, $zipArch->status);
-        $this->assertSame(0, $zipArch->statusSys);
-
-        $zipArch->extractTo($tmpDir);
-        $zipArch->close();
-
-        return $tmpDir;
-    }
-
-    protected function getTmpDir(): string
-    {
-        $tmp = tempnam(sys_get_temp_dir(), 'zipstreamtest');
-        unlink($tmp);
-        mkdir($tmp) or $this->fail('Failed to make directory');
-
-        return $tmp;
-    }
-
-    /**
-     * @param string $path
-     * @return string[]
-     */
-    protected function getRecursiveFileList(string $path): array
-    {
-        $data = [];
-        $path = (string)realpath($path);
-        $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
-
-        $pathLen = strlen($path);
-        foreach ($files as $file) {
-            $filePath = $file->getRealPath();
-            if (!is_dir($filePath)) {
-                $data[] = substr($filePath, $pathLen + 1);
-            }
-        }
-
-        sort($data);
-
-        return $data;
-    }
-
-    protected function addLargeFileFileFromPath($method, $zeroHeader, $zip64): void
-    {
-        [$tmp, $stream] = $this->getTmpFileStream();
-
-        $options = new ArchiveOptions();
-        $options->setOutputStream($stream);
-        $options->setLargeFileMethod($method);
-        $options->setLargeFileSize(5);
-        $options->setZeroHeader($zeroHeader);
-        $options->setEnableZip64($zip64);
-
-        $zip = new ZipStream(null, $options);
-
-        [$tmpExample, $streamExample] = $this->getTmpFileStream();
-        for ($i = 0; $i <= 10000; $i++) {
-            fwrite($streamExample, sha1((string)$i));
-            if ($i % 100 === 0) {
-                fwrite($streamExample, "\n");
-            }
-        }
-        fclose($streamExample);
-        $shaExample = sha1_file($tmpExample);
-        $zip->addFileFromPath('sample.txt', $tmpExample);
-        unlink($tmpExample);
-
-        $zip->finish();
-        fclose($stream);
-
-        $tmpDir = $this->validateAndExtractZip($tmp);
-
-        $files = $this->getRecursiveFileList($tmpDir);
-        $this->assertSame(['sample.txt'], $files);
-
-        $this->assertSame(sha1_file($tmpDir . '/sample.txt'), $shaExample, "SHA-1 Mismatch Method: {$method}");
-    }
 }

+ 0 - 1
vendor/maennchen/zipstream-php/test/bootstrap.php

@@ -1,5 +1,4 @@
 <?php
-
 declare(strict_types=1);
 
 date_default_timezone_set('UTC');

+ 6 - 7
vendor/maennchen/zipstream-php/test/bug/BugHonorFileTimeTest.php

@@ -1,19 +1,18 @@
 <?php
-
 declare(strict_types=1);
 
 namespace BugHonorFileTimeTest;
 
 use DateTime;
-
-use function fopen;
-
 use PHPUnit\Framework\TestCase;
-use ZipStream\Option\Archive;
-use ZipStream\Option\File;
-
+use ZipStream\Option\{
+    Archive,
+    File
+};
 use ZipStream\ZipStream;
 
+use function fopen;
+
 /**
  * Asserts that specified last-modified timestamps are not overwritten when a
  * file is added

+ 226 - 0
vendor/phpoffice/phpspreadsheet/.php-cs-fixer.dist.php

@@ -0,0 +1,226 @@
+<?php
+
+$finder = PhpCsFixer\Finder::create()
+    ->exclude('vendor')
+    ->in(__DIR__);
+
+$config = new PhpCsFixer\Config();
+$config
+    ->setRiskyAllowed(true)
+    ->setFinder($finder)
+    ->setCacheFile(sys_get_temp_dir() . '/php-cs-fixer' . preg_replace('~\W~', '-', __DIR__))
+    ->setRules([
+        'align_multiline_comment' => true,
+        'array_indentation' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'backtick_to_shell_exec' => true,
+        'binary_operator_spaces' => true,
+        'blank_line_after_namespace' => true,
+        'blank_line_after_opening_tag' => true,
+        'blank_line_before_statement' => true,
+        'braces' => true,
+        'cast_spaces' => true,
+        'class_attributes_separation' => ['elements' => ['method' => 'one', 'property' => 'one']], // const are often grouped with other related const
+        'class_definition' => false,
+        'class_keyword_remove' => false, // ::class keyword gives us better support in IDE
+        'combine_consecutive_issets' => true,
+        'combine_consecutive_unsets' => true,
+        'combine_nested_dirname' => true,
+        'comment_to_phpdoc' => false, // interferes with annotations
+        'compact_nullable_typehint' => true,
+        'concat_space' => ['spacing' => 'one'],
+        'constant_case' => true,
+        'date_time_immutable' => false, // Break our unit tests
+        'declare_equal_normalize' => true,
+        'declare_strict_types' => false, // Too early to adopt strict types
+        'dir_constant' => true,
+        'doctrine_annotation_array_assignment' => true,
+        'doctrine_annotation_braces' => true,
+        'doctrine_annotation_indentation' => true,
+        'doctrine_annotation_spaces' => true,
+        'elseif' => true,
+        'encoding' => true,
+        'ereg_to_preg' => true,
+        'escape_implicit_backslashes' => true,
+        'explicit_indirect_variable' => false, // I feel it makes the code actually harder to read
+        'explicit_string_variable' => false, // I feel it makes the code actually harder to read
+        'final_class' => false, // We need non-final classes
+        'final_internal_class' => true,
+        'final_public_method_for_abstract_class' => false, // We need non-final methods
+        'self_static_accessor' => true,
+        'fopen_flag_order' => true,
+        'fopen_flags' => true,
+        'full_opening_tag' => true,
+        'fully_qualified_strict_types' => true,
+        'function_declaration' => true,
+        'function_to_constant' => true,
+        'function_typehint_space' => true,
+        'general_phpdoc_annotation_remove' => ['annotations' => ['access', 'category', 'copyright']],
+        'global_namespace_import' => true,
+        'header_comment' => false, // We don't use common header in all our files
+        'heredoc_indentation' => false, // Requires PHP >= 7.3
+        'heredoc_to_nowdoc' => false, // Not sure about this one
+        'implode_call' => true,
+        'include' => true,
+        'increment_style' => true,
+        'indentation_type' => true,
+        'is_null' => true,
+        'line_ending' => true,
+        'linebreak_after_opening_tag' => true,
+        'list_syntax' => ['syntax' => 'short'],
+        'logical_operators' => true,
+        'lowercase_cast' => true,
+        'lowercase_keywords' => true,
+        'lowercase_static_reference' => true,
+        'magic_constant_casing' => true,
+        'magic_method_casing' => true,
+        'mb_str_functions' => false, // No, too dangerous to change that
+        'method_argument_space' => true,
+        'method_chaining_indentation' => true,
+        'modernize_types_casting' => true,
+        'multiline_comment_opening_closing' => true,
+        'multiline_whitespace_before_semicolons' => true,
+        'native_constant_invocation' => false, // Micro optimization that look messy
+        'native_function_casing' => true,
+        'native_function_invocation' => false, // I suppose this would be best, but I am still unconvinced about the visual aspect of it
+        'native_function_type_declaration_casing' => true,
+        'new_with_braces' => true,
+        'no_alias_functions' => true,
+        'no_alternative_syntax' => true,
+        'no_binary_string' => true,
+        'no_blank_lines_after_class_opening' => true,
+        'no_blank_lines_after_phpdoc' => true,
+        'no_blank_lines_before_namespace' => false, // we want 1 blank line before namespace
+        'no_break_comment' => true,
+        'no_closing_tag' => true,
+        'no_empty_comment' => true,
+        'no_empty_phpdoc' => true,
+        'no_empty_statement' => true,
+        'no_extra_blank_lines' => true,
+        'no_homoglyph_names' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_mixed_echo_print' => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_null_property_initialization' => true,
+        'no_php4_constructor' => true,
+        'no_short_bool_cast' => true,
+        'echo_tag_syntax' => ['format' => 'long'],
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_spaces_after_function_name' => true,
+        'no_spaces_around_offset' => true,
+        'no_spaces_inside_parenthesis' => true,
+        'no_superfluous_elseif' => false, // Might be risky on a huge code base
+        'no_superfluous_phpdoc_tags' => ['allow_mixed' => true],
+        'no_trailing_comma_in_list_call' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_trailing_whitespace' => true,
+        'no_trailing_whitespace_in_comment' => true,
+        'no_unneeded_control_parentheses' => true,
+        'no_unneeded_curly_braces' => true,
+        'no_unneeded_final_method' => true,
+        'no_unreachable_default_argument_value' => true,
+        'no_unset_cast' => true,
+        'no_unset_on_property' => true,
+        'no_unused_imports' => true,
+        'no_useless_else' => true,
+        'no_useless_return' => true,
+        'no_whitespace_before_comma_in_array' => true,
+        'no_whitespace_in_blank_line' => true,
+        'non_printable_character' => true,
+        'normalize_index_brace' => true,
+        'not_operator_with_space' => false, // No we prefer to keep '!' without spaces
+        'not_operator_with_successor_space' => false, // idem
+        'nullable_type_declaration_for_default_null_value' => true,
+        'object_operator_without_whitespace' => true,
+        'ordered_class_elements' => false, // We prefer to keep some freedom
+        'ordered_imports' => true,
+        'ordered_interfaces' => true,
+        'php_unit_construct' => true,
+        'php_unit_dedicate_assert' => true,
+        'php_unit_dedicate_assert_internal_type' => true,
+        'php_unit_expectation' => true,
+        'php_unit_fqcn_annotation' => true,
+        'php_unit_internal_class' => false, // Because tests are excluded from package
+        'php_unit_method_casing' => true,
+        'php_unit_mock' => true,
+        'php_unit_mock_short_will_return' => true,
+        'php_unit_namespaced' => true,
+        'php_unit_no_expectation_annotation' => true,
+        'phpdoc_order_by_value' => ['annotations' => ['covers']],
+        'php_unit_set_up_tear_down_visibility' => true,
+        'php_unit_size_class' => false, // That seems extra work to maintain for little benefits
+        'php_unit_strict' => false, // We sometime actually need assertEquals
+        'php_unit_test_annotation' => true,
+        'php_unit_test_case_static_method_calls' => ['call_type' => 'self'],
+        'php_unit_test_class_requires_covers' => false, // We don't care as much as we should about coverage
+        'phpdoc_add_missing_param_annotation' => false, // Don't add things that bring no value
+        'phpdoc_align' => false, // Waste of time
+        'phpdoc_annotation_without_dot' => true,
+        'phpdoc_indent' => true,
+        //'phpdoc_inline_tag' => true,
+        'phpdoc_line_span' => false, // Unfortunately our old comments turn even uglier with this
+        'phpdoc_no_access' => true,
+        'phpdoc_no_alias_tag' => true,
+        'phpdoc_no_empty_return' => true,
+        'phpdoc_no_package' => true,
+        'phpdoc_no_useless_inheritdoc' => true,
+        'phpdoc_order' => true,
+        'phpdoc_return_self_reference' => true,
+        'phpdoc_scalar' => true,
+        'phpdoc_separation' => true,
+        'phpdoc_single_line_var_spacing' => true,
+        'phpdoc_summary' => true,
+        'phpdoc_to_comment' => false, // interferes with annotations
+        'phpdoc_to_param_type' => false, // Because experimental, but interesting for one shot use
+        'phpdoc_to_return_type' => false, // idem
+        'phpdoc_trim' => true,
+        'phpdoc_trim_consecutive_blank_line_separation' => true,
+        'phpdoc_types' => true,
+        'phpdoc_types_order' => true,
+        'phpdoc_var_annotation_correct_order' => true,
+        'phpdoc_var_without_name' => true,
+        'pow_to_exponentiation' => true,
+        'protected_to_private' => true,
+        //'psr0' => true,
+        //'psr4' => true,
+        'random_api_migration' => true,
+        'return_assignment' => false, // Sometimes useful for clarity or debug
+        'return_type_declaration' => true,
+        'self_accessor' => true,
+        'self_static_accessor' => true,
+        'semicolon_after_instruction' => false, // Buggy in `samples/index.php`
+        'set_type_to_cast' => true,
+        'short_scalar_cast' => true,
+        'simple_to_complex_string_variable' => false, // Would differ from TypeScript without obvious advantages
+        'simplified_null_return' => false, // Even if technically correct we prefer to be explicit
+        'single_blank_line_at_eof' => true,
+        'single_blank_line_before_namespace' => true,
+        'single_class_element_per_statement' => true,
+        'single_import_per_statement' => true,
+        'single_line_after_imports' => true,
+        'single_line_comment_style' => true,
+        'single_line_throw' => false, // I don't see any reason for having a special case for Exception
+        'single_quote' => true,
+        'single_trait_insert_per_statement' => true,
+        'space_after_semicolon' => true,
+        'standardize_increment' => true,
+        'standardize_not_equals' => true,
+        'static_lambda' => false, // Risky if we can't guarantee nobody use `bindTo()`
+        'strict_comparison' => false, // No, too dangerous to change that
+        'strict_param' => false, // No, too dangerous to change that
+        'string_line_ending' => true,
+        'switch_case_semicolon_to_colon' => true,
+        'switch_case_space' => true,
+        'ternary_operator_spaces' => true,
+        'ternary_to_null_coalescing' => true,
+        'trailing_comma_in_multiline' => true,
+        'trim_array_spaces' => true,
+        'unary_operator_spaces' => true,
+        'visibility_required' => ['elements' => ['property', 'method']], // not const
+        'void_return' => true,
+        'whitespace_after_comma_in_array' => true,
+        'yoda_style' => false,
+    ]);
+
+return $config;

+ 398 - 1
vendor/phpoffice/phpspreadsheet/CHANGELOG.md

@@ -5,6 +5,401 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com)
 and this project adheres to [Semantic Versioning](https://semver.org).
 
+## 1.25.2 - 2022-09-25
+
+### Added
+
+- Nothing
+
+### Changed
+
+- Nothing
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Composer dependency clash with ezyang/htmlpurifier
+
+
+## 1.25.0 - 2022-09-25
+
+### Added
+
+- Implementation of the new `TEXTBEFORE()`, `TEXTAFTER()` and `TEXTSPLIT()` Excel Functions
+- Implementation of the `ARRAYTOTEXT()` and `VALUETOTEXT()` Excel Functions
+- Support for [mitoteam/jpgraph](https://packagist.org/packages/mitoteam/jpgraph) implementation of
+  JpGraph library to render charts added.
+- Charts: Add Gradients, Transparency, Hidden Axes, Rounded Corners, Trendlines, Date Axes.
+
+### Changed
+
+- Allow variant behaviour when merging cells [Issue #3065](https://github.com/PHPOffice/PhpSpreadsheet/issues/3065)
+  - Merge methods now allow an additional `$behaviour` argument. Permitted values are:
+    - Worksheet::MERGE_CELL_CONTENT_EMPTY - Empty the content of the hidden cells (the default behaviour)
+    - Worksheet::MERGE_CELL_CONTENT_HIDE - Keep the content of the hidden cells
+    - Worksheet::MERGE_CELL_CONTENT_MERGE - Move the content of the hidden cells into the first cell
+
+### Deprecated
+
+- Axis getLineProperty deprecated in favor of getLineColorProperty.
+- Moved majorGridlines and minorGridlines from Chart to Axis. Setting either in Chart constructor or through Chart methods, or getting either using Chart methods is deprecated.
+- Chart::EXCEL_COLOR_TYPE_* copied from Properties to ChartColor; use in Properties is deprecated.
+- ChartColor::EXCEL_COLOR_TYPE_ARGB deprecated in favor of EXCEL_COLOR_TYPE_RGB ("A" component was never allowed).
+- Misspelled Properties::LINE_STYLE_DASH_SQUERE_DOT deprecated in favor of LINE_STYLE_DASH_SQUARE_DOT.
+- Clone not permitted for Spreadsheet. Spreadsheet->copy() can be used instead.
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fix update to defined names when inserting/deleting rows/columns [Issue #3076](https://github.com/PHPOffice/PhpSpreadsheet/issues/3076) [PR #3077](https://github.com/PHPOffice/PhpSpreadsheet/pull/3077) 
+- Fix DataValidation sqRef when inserting/deleting rows/columns [Issue #3056](https://github.com/PHPOffice/PhpSpreadsheet/issues/3056) [PR #3074](https://github.com/PHPOffice/PhpSpreadsheet/pull/3074)
+- Named ranges not usable as anchors in OFFSET function [Issue #3013](https://github.com/PHPOffice/PhpSpreadsheet/issues/3013)
+- Fully flatten an array [Issue #2955](https://github.com/PHPOffice/PhpSpreadsheet/issues/2955) [PR #2956](https://github.com/PHPOffice/PhpSpreadsheet/pull/2956)
+- cellExists() and getCell() methods should support UTF-8 named cells [Issue #2987](https://github.com/PHPOffice/PhpSpreadsheet/issues/2987) [PR #2988](https://github.com/PHPOffice/PhpSpreadsheet/pull/2988)
+- Spreadsheet copy fixed, clone disabled. [PR #2951](https://github.com/PHPOffice/PhpSpreadsheet/pull/2951)
+- Fix PDF problems with text rotation and paper size. [Issue #1747](https://github.com/PHPOffice/PhpSpreadsheet/issues/1747) [Issue #1713](https://github.com/PHPOffice/PhpSpreadsheet/issues/1713) [PR #2960](https://github.com/PHPOffice/PhpSpreadsheet/pull/2960)
+- Limited support for chart titles as formulas [Issue #2965](https://github.com/PHPOffice/PhpSpreadsheet/issues/2965) [Issue #749](https://github.com/PHPOffice/PhpSpreadsheet/issues/749) [PR #2971](https://github.com/PHPOffice/PhpSpreadsheet/pull/2971)
+- Add Gradients, Transparency, and Hidden Axes to Chart [Issue #2257](https://github.com/PHPOffice/PhpSpreadsheet/issues/2257) [Issue #2229](https://github.com/PHPOffice/PhpSpreadsheet/issues/2929) [Issue #2935](https://github.com/PHPOffice/PhpSpreadsheet/issues/2935) [PR #2950](https://github.com/PHPOffice/PhpSpreadsheet/pull/2950)
+- Chart Support for Rounded Corners and Trendlines [Issue #2968](https://github.com/PHPOffice/PhpSpreadsheet/issues/2968) [Issue #2815](https://github.com/PHPOffice/PhpSpreadsheet/issues/2815) [PR #2976](https://github.com/PHPOffice/PhpSpreadsheet/pull/2976)
+- Add setName Method for Chart [Issue #2991](https://github.com/PHPOffice/PhpSpreadsheet/issues/2991) [PR #3001](https://github.com/PHPOffice/PhpSpreadsheet/pull/3001)
+- Eliminate partial dependency on php-intl in StringHelper [Issue #2982](https://github.com/PHPOffice/PhpSpreadsheet/issues/2982) [PR #2994](https://github.com/PHPOffice/PhpSpreadsheet/pull/2994)
+- Minor changes for Pdf [Issue #2999](https://github.com/PHPOffice/PhpSpreadsheet/issues/2999) [PR #3002](https://github.com/PHPOffice/PhpSpreadsheet/pull/3002) [PR #3006](https://github.com/PHPOffice/PhpSpreadsheet/pull/3006)
+- Html/Pdf Do net set background color for cells using (default) nofill [PR #3016](https://github.com/PHPOffice/PhpSpreadsheet/pull/3016)
+- Add support for Date Axis to Chart [Issue #2967](https://github.com/PHPOffice/PhpSpreadsheet/issues/2967) [PR #3018](https://github.com/PHPOffice/PhpSpreadsheet/pull/3018)
+- Reconcile Differences Between Css and Excel for Cell Alignment [PR #3048](https://github.com/PHPOffice/PhpSpreadsheet/pull/3048)
+- R1C1 Format Internationalization and Better Support for Relative Offsets [Issue #1704](https://github.com/PHPOffice/PhpSpreadsheet/issues/1704) [PR #3052](https://github.com/PHPOffice/PhpSpreadsheet/pull/3052)
+- Minor Fix for Percentage Formatting [Issue #1929](https://github.com/PHPOffice/PhpSpreadsheet/issues/1929) [PR #3053](https://github.com/PHPOffice/PhpSpreadsheet/pull/3053)
+
+## 1.24.1 - 2022-07-18
+
+### Added
+
+- Support for SimpleCache Interface versions 1.0, 2.0 and 3.0
+- Add Chart Axis Option textRotation [Issue #2705](https://github.com/PHPOffice/PhpSpreadsheet/issues/2705) [PR #2940](https://github.com/PHPOffice/PhpSpreadsheet/pull/2940)
+
+### Changed
+
+- Nothing
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fix Encoding issue with Html reader (PHP 8.2 deprecation for mb_convert_encoding) [Issue #2942](https://github.com/PHPOffice/PhpSpreadsheet/issues/2942) [PR #2943](https://github.com/PHPOffice/PhpSpreadsheet/pull/2943)
+- Additional Chart fixes
+  - Pie chart with part separated unwantedly [Issue #2506](https://github.com/PHPOffice/PhpSpreadsheet/issues/2506) [PR #2928](https://github.com/PHPOffice/PhpSpreadsheet/pull/2928)
+  - Chart styling is lost on simple load / save process [Issue #1797](https://github.com/PHPOffice/PhpSpreadsheet/issues/1797) [Issue #2077](https://github.com/PHPOffice/PhpSpreadsheet/issues/2077) [PR #2930](https://github.com/PHPOffice/PhpSpreadsheet/pull/2930)
+  - Can't create contour chart (surface 2d) [Issue #2931](https://github.com/PHPOffice/PhpSpreadsheet/issues/2931) [PR #2933](https://github.com/PHPOffice/PhpSpreadsheet/pull/2933)
+- VLOOKUP Breaks When Array Contains Null Cells [Issue #2934](https://github.com/PHPOffice/PhpSpreadsheet/issues/2934) [PR #2939](https://github.com/PHPOffice/PhpSpreadsheet/pull/2939)
+
+## 1.24.0 - 2022-07-09
+
+Note that this will be the last 1.x branch release before the 2.x release. We will maintain both branches in parallel for a time; but users are requested to update to version 2.0 once that is fully available.
+
+### Added
+
+- Added `removeComment()` method for Worksheet [PR #2875](https://github.com/PHPOffice/PhpSpreadsheet/pull/2875/files)
+- Add point size option for scatter charts [Issue #2298](https://github.com/PHPOffice/PhpSpreadsheet/issues/2298) [PR #2801](https://github.com/PHPOffice/PhpSpreadsheet/pull/2801)
+- Basic support for Xlsx reading/writing Chart Sheets [PR #2830](https://github.com/PHPOffice/PhpSpreadsheet/pull/2830)
+
+  Note that a ChartSheet is still only written as a normal Worksheet containing a single chart, not as an actual ChartSheet.
+
+- Added Worksheet visibility in Ods Reader [PR #2851](https://github.com/PHPOffice/PhpSpreadsheet/pull/2851) and Gnumeric Reader [PR #2853](https://github.com/PHPOffice/PhpSpreadsheet/pull/2853)
+- Added Worksheet visibility in Ods Writer [PR #2850](https://github.com/PHPOffice/PhpSpreadsheet/pull/2850)
+- Allow Csv Reader to treat string as contents of file [Issue #1285](https://github.com/PHPOffice/PhpSpreadsheet/issues/1285) [PR #2792](https://github.com/PHPOffice/PhpSpreadsheet/pull/2792)
+- Allow Csv Reader to store null string rather than leave cell empty [Issue #2840](https://github.com/PHPOffice/PhpSpreadsheet/issues/2840) [PR #2842](https://github.com/PHPOffice/PhpSpreadsheet/pull/2842)
+- Provide new Worksheet methods to identify if a row or column is "empty", making allowance for different definitions of "empty":
+  - Treat rows/columns containing no cell records as empty (default)
+  - Treat cells containing a null value as empty
+  - Treat cells containing an empty string as empty
+
+### Changed
+
+- Modify `rangeBoundaries()`, `rangeDimension()` and `getRangeBoundaries()` Coordinate methods to work with row/column ranges as well as with cell ranges and cells [PR #2926](https://github.com/PHPOffice/PhpSpreadsheet/pull/2926)
+- Better enforcement of value modification to match specified datatype when using `setValueExplicit()`
+- Relax validation of merge cells to allow merge for a single cell reference [Issue #2776](https://github.com/PHPOffice/PhpSpreadsheet/issues/2776)
+- Memory and speed improvements, particularly for the Cell Collection, and the Writers.
+
+  See [the Discussion section on github](https://github.com/PHPOffice/PhpSpreadsheet/discussions/2821) for details of performance across versions
+- Improved performance for removing rows/columns from a worksheet
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Xls Reader resolving absolute named ranges to relative ranges [Issue #2826](https://github.com/PHPOffice/PhpSpreadsheet/issues/2826) [PR #2827](https://github.com/PHPOffice/PhpSpreadsheet/pull/2827)
+- Null value handling in the Excel Math/Trig PRODUCT() function [Issue #2833](https://github.com/PHPOffice/PhpSpreadsheet/issues/2833) [PR #2834](https://github.com/PHPOffice/PhpSpreadsheet/pull/2834)
+- Invalid Print Area defined in Xlsx corrupts internal storage of print area [Issue #2848](https://github.com/PHPOffice/PhpSpreadsheet/issues/2848) [PR #2849](https://github.com/PHPOffice/PhpSpreadsheet/pull/2849)
+- Time interval formatting [Issue #2768](https://github.com/PHPOffice/PhpSpreadsheet/issues/2768) [PR #2772](https://github.com/PHPOffice/PhpSpreadsheet/pull/2772)
+- Copy from Xls(x) to Html/Pdf loses drawings [PR #2788](https://github.com/PHPOffice/PhpSpreadsheet/pull/2788)
+- Html Reader converting cell containing 0 to null string [Issue #2810](https://github.com/PHPOffice/PhpSpreadsheet/issues/2810) [PR #2813](https://github.com/PHPOffice/PhpSpreadsheet/pull/2813)
+- Many fixes for Charts, especially, but not limited to, Scatter, Bubble, and Surface charts. [Issue #2762](https://github.com/PHPOffice/PhpSpreadsheet/issues/2762) [Issue #2299](https://github.com/PHPOffice/PhpSpreadsheet/issues/2299) [Issue #2700](https://github.com/PHPOffice/PhpSpreadsheet/issues/2700) [Issue #2817](https://github.com/PHPOffice/PhpSpreadsheet/issues/2817) [Issue #2763](https://github.com/PHPOffice/PhpSpreadsheet/issues/2763) [Issue #2219](https://github.com/PHPOffice/PhpSpreadsheet/issues/2219) [Issue #2863](https://github.com/PHPOffice/PhpSpreadsheet/issues/2863) [PR #2828](https://github.com/PHPOffice/PhpSpreadsheet/pull/2828) [PR #2841](https://github.com/PHPOffice/PhpSpreadsheet/pull/2841) [PR #2846](https://github.com/PHPOffice/PhpSpreadsheet/pull/2846) [PR #2852](https://github.com/PHPOffice/PhpSpreadsheet/pull/2852) [PR #2856](https://github.com/PHPOffice/PhpSpreadsheet/pull/2856) [PR #2865](https://github.com/PHPOffice/PhpSpreadsheet/pull/2865) [PR #2872](https://github.com/PHPOffice/PhpSpreadsheet/pull/2872) [PR #2879](https://github.com/PHPOffice/PhpSpreadsheet/pull/2879) [PR #2898](https://github.com/PHPOffice/PhpSpreadsheet/pull/2898) [PR #2906](https://github.com/PHPOffice/PhpSpreadsheet/pull/2906) [PR #2922](https://github.com/PHPOffice/PhpSpreadsheet/pull/2922) [PR #2923](https://github.com/PHPOffice/PhpSpreadsheet/pull/2923)
+- Adjust both coordinates for two-cell anchors when rows/columns are added/deleted. [Issue #2908](https://github.com/PHPOffice/PhpSpreadsheet/issues/2908) [PR #2909](https://github.com/PHPOffice/PhpSpreadsheet/pull/2909)
+- Keep calculated string results below 32K. [PR #2921](https://github.com/PHPOffice/PhpSpreadsheet/pull/2921)
+- Filter out illegal Unicode char values FFFE/FFFF. [Issue #2897](https://github.com/PHPOffice/PhpSpreadsheet/issues/2897) [PR #2910](https://github.com/PHPOffice/PhpSpreadsheet/pull/2910)
+- Better handling of REF errors and propagation of all errors in Calculation engine. [PR #2902](https://github.com/PHPOffice/PhpSpreadsheet/pull/2902)
+- Calculating Engine regexp for Column/Row references when there are multiple quoted worksheet references in the formula [Issue #2874](https://github.com/PHPOffice/PhpSpreadsheet/issues/2874) [PR #2899](https://github.com/PHPOffice/PhpSpreadsheet/pull/2899)
+
+## 1.23.0 - 2022-04-24
+
+### Added
+
+- Ods Writer support for Freeze Pane [Issue #2013](https://github.com/PHPOffice/PhpSpreadsheet/issues/2013) [PR #2755](https://github.com/PHPOffice/PhpSpreadsheet/pull/2755)
+- Ods Writer support for setting column width/row height (including the use of AutoSize) [Issue #2346](https://github.com/PHPOffice/PhpSpreadsheet/issues/2346) [PR #2753](https://github.com/PHPOffice/PhpSpreadsheet/pull/2753)
+- Introduced CellAddress, CellRange, RowRange and ColumnRange value objects that can be used as an alternative to a string value (e.g. `'C5'`, `'B2:D4'`, `'2:2'` or `'B:C'`) in appropriate contexts.
+- Implementation of the FILTER(), SORT(), SORTBY() and UNIQUE() Lookup/Reference (array) functions.
+- Implementation of the ISREF() Information function.
+- Added support for reading "formatted" numeric values from Csv files; although default behaviour of reading these values as strings is preserved.
+
+  (i.e a value of "12,345.67" can be read as numeric `12345.67`, not simply as a string `"12,345.67"`, if the `castFormattedNumberToNumeric()` setting is enabled.
+
+  This functionality is locale-aware, using the server's locale settings to identify the thousands and decimal separators.
+
+- Support for two cell anchor drawing of images. [#2532](https://github.com/PHPOffice/PhpSpreadsheet/pull/2532) [#2674](https://github.com/PHPOffice/PhpSpreadsheet/pull/2674)
+- Limited support for Xls Reader to handle Conditional Formatting:
+
+  Ranges and Rules are read, but style is currently limited to font size, weight and color; and to fill style and color.
+
+- Add ability to suppress Mac line ending check for CSV [#2623](https://github.com/PHPOffice/PhpSpreadsheet/pull/2623)
+- Initial support for creating and writing Tables (Xlsx Writer only) [PR #2671](https://github.com/PHPOffice/PhpSpreadsheet/pull/2671)
+
+  See `/samples/Table` for examples of use.
+
+  Note that PreCalculateFormulas needs to be disabled when saving spreadsheets containing tables with formulae (totals or column formulae).
+
+### Changed
+
+- Gnumeric Reader now loads number formatting for cells.
+- Gnumeric Reader now correctly identifies selected worksheet and selected cells in a worksheet.
+- Some Refactoring of the Ods Reader, moving all formula and address translation from Ods to Excel into a separate class to eliminate code duplication and ensure consistency.
+- Make Boolean Conversion in Csv Reader locale-aware when using the String Value Binder.
+
+  This is determined by the Calculation Engine locale setting.
+
+  (i.e. `"Vrai"` wil be converted to a boolean `true` if the Locale is set to `fr`.)
+- Allow `psr/simple-cache` 2.x
+
+### Deprecated
+
+- All Excel Function implementations in `Calculation\Functions` (including the Error functions) have been moved to dedicated classes for groups of related functions. See the docblocks against all the deprecated methods for details of the new methods to call instead. At some point, these old classes will be deleted.
+- Worksheet methods that reference cells "byColumnandRow". All such methods have an equivalent that references the cell by its address (e.g. '`E3'` rather than `5, 3`).
+
+  These functions now accept either a cell address string (`'E3')` or an array with columnId and rowId (`[5, 3]`) or a new `CellAddress` object as their `cellAddress`/`coordinate` argument.
+  This includes the methods:
+  - `setCellValueByColumnAndRow()` use the equivalent `setCellValue()`
+  - `setCellValueExplicitByColumnAndRow()` use the equivalent `setCellValueExplicit()`
+  - `getCellByColumnAndRow()` use the equivalent `getCell()`
+  - `cellExistsByColumnAndRow()` use the equivalent `cellExists()`
+  - `getStyleByColumnAndRow()` use the equivalent `getStyle()`
+  - `setBreakByColumnAndRow()` use the equivalent `setBreak()`
+  - `mergeCellsByColumnAndRow()` use the equivalent `mergeCells()`
+  - `unmergeCellsByColumnAndRow()` use the equivalent `unmergeCells()`
+  - `protectCellsByColumnAndRow()` use the equivalent `protectCells()`
+  - `unprotectCellsByColumnAndRow()` use the equivalent `unprotectCells()`
+  - `setAutoFilterByColumnAndRow()` use the equivalent `setAutoFilter()`
+  - `freezePaneByColumnAndRow()` use the equivalent `freezePane()`
+  - `getCommentByColumnAndRow()` use the equivalent `getComment()`
+  - `setSelectedCellByColumnAndRow()` use the equivalent `setSelectedCells()`
+
+  This change provides more consistency in the methods (not every "by cell address" method has an equivalent "byColumnAndRow" method);
+  and the "by cell address" methods often provide more flexibility, such as allowing a range of cells, or referencing them by passing the defined name of a named range as the argument.
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Make allowance for the AutoFilter dropdown icon in the first row of an Autofilter range when using Autosize columns. [Issue #2413](https://github.com/PHPOffice/PhpSpreadsheet/issues/2413) [PR #2754](https://github.com/PHPOffice/PhpSpreadsheet/pull/2754)
+- Support for "chained" ranges (e.g. `A5:C10:C20:F1`) in the Calculation Engine; and also support for using named ranges with the Range operator (e.g. `NamedRange1:NamedRange2`) [Issue #2730](https://github.com/PHPOffice/PhpSpreadsheet/issues/2730) [PR #2746](https://github.com/PHPOffice/PhpSpreadsheet/pull/2746)
+- Update Conditional Formatting ranges and rule conditions when inserting/deleting rows/columns [Issue #2678](https://github.com/PHPOffice/PhpSpreadsheet/issues/2678) [PR #2689](https://github.com/PHPOffice/PhpSpreadsheet/pull/2689)
+- Allow `INDIRECT()` to accept row/column ranges as well as cell ranges [PR #2687](https://github.com/PHPOffice/PhpSpreadsheet/pull/2687)
+- Fix bug when deleting cells with hyperlinks, where the hyperlink was then being "inherited" by whatever cell moved to that cell address.
+- Fix bug in Conditional Formatting in the Xls Writer that resulted in a broken file when there were multiple conditional ranges in a worksheet.
+- Fix Conditional Formatting in the Xls Writer to work with rules that contain string literals, cell references and formulae.
+- Fix for setting Active Sheet to the first loaded worksheet when bookViews element isn't defined [Issue #2666](https://github.com/PHPOffice/PhpSpreadsheet/issues/2666) [PR #2669](https://github.com/PHPOffice/PhpSpreadsheet/pull/2669)
+- Fixed behaviour of XLSX font style vertical align settings [PR #2619](https://github.com/PHPOffice/PhpSpreadsheet/pull/2619)
+- Resolved formula translations to handle separators (row and column) for array functions as well as for function argument separators; and cleanly handle nesting levels.
+
+  Note that this method is used when translating Excel functions between `en_us` and other locale languages, as well as when converting formulae between different spreadsheet formats (e.g. Ods to Excel).
+
+  Nor is this a perfect solution, as there may still be issues when function calls have array arguments that themselves contain function calls; but it's still better than the current logic.
+- Fix for escaping double quotes within a formula [Issue #1971](https://github.com/PHPOffice/PhpSpreadsheet/issues/1971) [PR #2651](https://github.com/PHPOffice/PhpSpreadsheet/pull/2651)
+- Change open mode for output from `wb+` to `wb` [Issue #2372](https://github.com/PHPOffice/PhpSpreadsheet/issues/2372) [PR #2657](https://github.com/PHPOffice/PhpSpreadsheet/pull/2657)
+- Use color palette if supplied [Issue #2499](https://github.com/PHPOffice/PhpSpreadsheet/issues/2499) [PR #2595](https://github.com/PHPOffice/PhpSpreadsheet/pull/2595)
+- Xls reader treat drawing offsets as int rather than float [PR #2648](https://github.com/PHPOffice/PhpSpreadsheet/pull/2648)
+- Handle booleans in conditional styles properly [PR #2654](https://github.com/PHPOffice/PhpSpreadsheet/pull/2654)
+- Fix for reading files in the root directory of a ZipFile, which should not be prefixed by relative paths ("./") as dirname($filename) does by default. 
+- Fix invalid style of cells in empty columns with columnDimensions and rows with rowDimensions in added external sheet. [PR #2739](https://github.com/PHPOffice/PhpSpreadsheet/pull/2739)
+- Time Interval Formatting [Issue #2768](https://github.com/PHPOffice/PhpSpreadsheet/issues/2768) [PR #2772](https://github.com/PHPOffice/PhpSpreadsheet/pull/2772)
+
+## 1.22.0 - 2022-02-18
+
+### Added
+
+- Namespacing phase 2 - styles.
+[PR #2471](https://github.com/PHPOffice/PhpSpreadsheet/pull/2471)
+
+- Improved support for passing of array arguments to Excel function implementations to return array results (where appropriate). [Issue #2551](https://github.com/PHPOffice/PhpSpreadsheet/issues/2551)
+
+  This is the first stage in an ongoing process of adding array support to all appropriate function implementations, 
+- Support for the Excel365 Math/Trig SEQUENCE() function [PR #2536](https://github.com/PHPOffice/PhpSpreadsheet/pull/2536)
+- Support for the Excel365 Math/Trig RANDARRAY() function [PR #2540](https://github.com/PHPOffice/PhpSpreadsheet/pull/2540) 
+
+  Note that the Spill Operator is not yet supported in the Calculation Engine; but this can still be useful for defining array constants.
+- Improved support for Conditional Formatting Rules [PR #2491](https://github.com/PHPOffice/PhpSpreadsheet/pull/2491)
+  - Provide support for a wider range of Conditional Formatting Rules for Xlsx Reader/Writer:
+    - Cells Containing (cellIs)
+    - Specific Text (containing, notContaining, beginsWith, endsWith)
+    - Dates Occurring (all supported timePeriods)
+    - Blanks/NoBlanks
+    - Errors/NoErrors
+    - Duplicates/Unique
+    - Expression
+  - Provision of CF Wizards (for all the above listed rule types) to help create/modify CF Rules without having to manage all the combinations of types/operators, and the complexities of formula expressions, or the text/timePeriod attributes.
+
+    See [documentation](https://phpspreadsheet.readthedocs.io/en/latest/topics/conditional-formatting/) for details 
+
+  - Full support of the above CF Rules for the Xlsx Reader and Writer; even when the file being loaded has CF rules listed in the `<extLst><ext><ConditionalFormattings>` element for the worksheet rather than the `<ConditionalFormatting>` element.
+  - Provision of a CellMatcher to identify if rules are matched for a cell, and which matching style will be applied.
+  - Improved documentation and examples, covering all supported CF rule types.
+  - Add support for one digit decimals (FORMAT_NUMBER_0, FORMAT_PERCENTAGE_0). [PR #2525](https://github.com/PHPOffice/PhpSpreadsheet/pull/2525)
+  - Initial work enabling Excel function implementations for handling arrays as arguments when used in "array formulae" [#2562](https://github.com/PHPOffice/PhpSpreadsheet/issues/2562)
+  - Enable most of the Date/Time functions to accept array arguments [#2573](https://github.com/PHPOffice/PhpSpreadsheet/issues/2573)
+  - Array ready functions - Text, Math/Trig, Statistical, Engineering and Logical [#2580](https://github.com/PHPOffice/PhpSpreadsheet/issues/2580)
+
+### Changed
+
+- Additional Russian translations for Excel Functions (courtesy of aleks-samurai).
+- Improved code coverage for NumberFormat. [PR #2556](https://github.com/PHPOffice/PhpSpreadsheet/pull/2556)
+- Extract some methods from the Calculation Engine into dedicated classes [#2537](https://github.com/PHPOffice/PhpSpreadsheet/issues/2537)
+- Eliminate calls to `flattenSingleValue()` that are no longer required when we're checking for array values as arguments [#2590](https://github.com/PHPOffice/PhpSpreadsheet/issues/2590)
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fixed `ReferenceHelper@insertNewBefore` behavior when removing column before last column with null value [PR #2541](https://github.com/PHPOffice/PhpSpreadsheet/pull/2541)
+- Fix bug with `DOLLARDE()` and `DOLLARFR()` functions when the dollar value is negative [Issue #2578](https://github.com/PHPOffice/PhpSpreadsheet/issues/2578) [PR #2579](https://github.com/PHPOffice/PhpSpreadsheet/pull/2579)
+- Fix partial function name matching when translating formulae from Russian to English [Issue #2533](https://github.com/PHPOffice/PhpSpreadsheet/issues/2533) [PR #2534](https://github.com/PHPOffice/PhpSpreadsheet/pull/2534)
+- Various bugs related to Conditional Formatting Rules, and errors in the Xlsx Writer for Conditional Formatting [PR #2491](https://github.com/PHPOffice/PhpSpreadsheet/pull/2491)
+- Xlsx Reader merge range fixes. [Issue #2501](https://github.com/PHPOffice/PhpSpreadsheet/issues/2501) [PR #2504](https://github.com/PHPOffice/PhpSpreadsheet/pull/2504)
+- Handle explicit "date" type for Cell in Xlsx Reader. [Issue #2373](https://github.com/PHPOffice/PhpSpreadsheet/issues/2373) [PR #2485](https://github.com/PHPOffice/PhpSpreadsheet/pull/2485)
+- Recalibrate Row/Column Dimensions after removeRow/Column. [Issue #2442](https://github.com/PHPOffice/PhpSpreadsheet/issues/2442) [PR #2486](https://github.com/PHPOffice/PhpSpreadsheet/pull/2486)
+- Refinement for XIRR. [Issue #2469](https://github.com/PHPOffice/PhpSpreadsheet/issues/2469) [PR #2487](https://github.com/PHPOffice/PhpSpreadsheet/pull/2487)
+- Xlsx Reader handle cell with non-null explicit type but null value. [Issue #2488](https://github.com/PHPOffice/PhpSpreadsheet/issues/2488) [PR #2489](https://github.com/PHPOffice/PhpSpreadsheet/pull/2489)
+- Xlsx Reader fix height and width for oneCellAnchorDrawings. [PR #2492](https://github.com/PHPOffice/PhpSpreadsheet/pull/2492)
+- Fix rounding error in NumberFormat::NUMBER_PERCENTAGE, NumberFormat::NUMBER_PERCENTAGE_00. [PR #2555](https://github.com/PHPOffice/PhpSpreadsheet/pull/2555)
+- Don't treat thumbnail file as xml. [Issue #2516](https://github.com/PHPOffice/PhpSpreadsheet/issues/2516) [PR #2517](https://github.com/PHPOffice/PhpSpreadsheet/pull/2517)
+- Eliminating Xlsx Reader warning when no sz tag for RichText. [Issue #2542](https://github.com/PHPOffice/PhpSpreadsheet/issues/2542) [PR #2550](https://github.com/PHPOffice/PhpSpreadsheet/pull/2550)
+- Fix Xlsx/Xls Writer handling of inline strings. [Issue #353](https://github.com/PHPOffice/PhpSpreadsheet/issues/353) [PR #2569](https://github.com/PHPOffice/PhpSpreadsheet/pull/2569)
+- Richtext colors were not being read correctly after namespace change [#2458](https://github.com/PHPOffice/PhpSpreadsheet/issues/2458)
+- Fix discrepancy between the way markdown tables are rendered in ReadTheDocs and in PHPStorm [#2520](https://github.com/PHPOffice/PhpSpreadsheet/issues/2520)
+- Update Russian Functions Text File [#2557](https://github.com/PHPOffice/PhpSpreadsheet/issues/2557)
+- Fix documentation, instantiation example [#2564](https://github.com/PHPOffice/PhpSpreadsheet/issues/2564)
+
+
+## 1.21.0 - 2022-01-06
+
+### Added
+
+- Ability to add a picture to the background of the comment. Supports four image formats: png, jpeg, gif, bmp. New `Comment::setSizeAsBackgroundImage()` to change the size of a comment to the size of a background image. [Issue #1547](https://github.com/PHPOffice/PhpSpreadsheet/issues/1547) [PR #2422](https://github.com/PHPOffice/PhpSpreadsheet/pull/2422)
+- Ability to set default paper size and orientation [PR #2410](https://github.com/PHPOffice/PhpSpreadsheet/pull/2410)
+- Ability to extend AutoFilter to Maximum Row [PR #2414](https://github.com/PHPOffice/PhpSpreadsheet/pull/2414)
+
+### Changed
+
+- Xlsx Writer will evaluate AutoFilter only if it is as yet unevaluated, or has changed since it was last evaluated [PR #2414](https://github.com/PHPOffice/PhpSpreadsheet/pull/2414)
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Rounding in `NumberFormatter` [Issue #2385](https://github.com/PHPOffice/PhpSpreadsheet/issues/2385) [PR #2399](https://github.com/PHPOffice/PhpSpreadsheet/pull/2399)
+- Support for themes [Issue #2075](https://github.com/PHPOffice/PhpSpreadsheet/issues/2075) [Issue #2387](https://github.com/PHPOffice/PhpSpreadsheet/issues/2387) [PR #2403](https://github.com/PHPOffice/PhpSpreadsheet/pull/2403)
+- Read spreadsheet with `#` in name [Issue #2405](https://github.com/PHPOffice/PhpSpreadsheet/issues/2405) [PR #2409](https://github.com/PHPOffice/PhpSpreadsheet/pull/2409)
+- Improve PDF support for page size and orientation [Issue #1691](https://github.com/PHPOffice/PhpSpreadsheet/issues/1691) [PR #2410](https://github.com/PHPOffice/PhpSpreadsheet/pull/2410)
+- Wildcard handling issues in text match [Issue #2430](https://github.com/PHPOffice/PhpSpreadsheet/issues/2430) [PR #2431](https://github.com/PHPOffice/PhpSpreadsheet/pull/2431)
+- Respect DataType in `insertNewBefore` [PR #2433](https://github.com/PHPOffice/PhpSpreadsheet/pull/2433)
+- Handle rows explicitly hidden after AutoFilter [Issue #1641](https://github.com/PHPOffice/PhpSpreadsheet/issues/1641) [PR #2414](https://github.com/PHPOffice/PhpSpreadsheet/pull/2414)
+- Special characters in image file name [Issue #1470](https://github.com/PHPOffice/PhpSpreadsheet/issues/1470) [Issue #2415](https://github.com/PHPOffice/PhpSpreadsheet/issues/2415) [PR #2416](https://github.com/PHPOffice/PhpSpreadsheet/pull/2416)
+- Mpdf with very many styles [Issue #2432](https://github.com/PHPOffice/PhpSpreadsheet/issues/2432) [PR #2434](https://github.com/PHPOffice/PhpSpreadsheet/pull/2434)
+- Name clashes between parsed and unparsed drawings [Issue #1767](https://github.com/PHPOffice/PhpSpreadsheet/issues/1767) [Issue #2396](https://github.com/PHPOffice/PhpSpreadsheet/issues/2396) [PR #2423](https://github.com/PHPOffice/PhpSpreadsheet/pull/2423)
+- Fill pattern start and end colors [Issue #2441](https://github.com/PHPOffice/PhpSpreadsheet/issues/2441) [PR #2444](https://github.com/PHPOffice/PhpSpreadsheet/pull/2444)
+- General style specified in wrong case [Issue #2450](https://github.com/PHPOffice/PhpSpreadsheet/issues/2450) [PR #2451](https://github.com/PHPOffice/PhpSpreadsheet/pull/2451)
+- Null passed to `AutoFilter::setRange()` [Issue #2281](https://github.com/PHPOffice/PhpSpreadsheet/issues/2281) [PR #2454](https://github.com/PHPOffice/PhpSpreadsheet/pull/2454)
+- Another undefined index in Xls reader (#2470) [Issue #2463](https://github.com/PHPOffice/PhpSpreadsheet/issues/2463) [PR #2470](https://github.com/PHPOffice/PhpSpreadsheet/pull/2470)
+- Allow single-cell checks on conditional styles, even when the style is configured for a range of cells (#) [PR #2483](https://github.com/PHPOffice/PhpSpreadsheet/pull/2483)
+
+## 1.20.0 - 2021-11-23
+
+### Added
+
+- Xlsx Writer Support for WMF Files [#2339](https://github.com/PHPOffice/PhpSpreadsheet/issues/2339)
+- Use standard temporary file for internal use of HTMLPurifier [#2383](https://github.com/PHPOffice/PhpSpreadsheet/issues/2383)
+
+### Changed
+
+- Drop support for PHP 7.2, according to https://phpspreadsheet.readthedocs.io/en/latest/#php-version-support
+- Use native typing for objects that were already documented as such
+
+### Deprecated
+
+- Nothing
+
+### Removed
+
+- Nothing
+
+### Fixed
+
+- Fixed null conversation for strToUpper [#2292](https://github.com/PHPOffice/PhpSpreadsheet/issues/2292)
+- Fixed Trying to access array offset on value of type null (Xls Reader) [#2315](https://github.com/PHPOffice/PhpSpreadsheet/issues/2315)
+- Don't corrupt XLSX files containing data validation [#2377](https://github.com/PHPOffice/PhpSpreadsheet/issues/2377)
+- Non-fixed cells were not updated if shared formula has a fixed cell [#2354](https://github.com/PHPOffice/PhpSpreadsheet/issues/2354)
+- Declare key of generic ArrayObject
+- CSV reader better support for boolean values [#2374](https://github.com/PHPOffice/PhpSpreadsheet/pull/2374)
+- Some ZIP file could not be read [#2376](https://github.com/PHPOffice/PhpSpreadsheet/pull/2376)
+- Fix regression were hyperlinks could not be read [#2391](https://github.com/PHPOffice/PhpSpreadsheet/pull/2391)
+- AutoFilter Improvements [#2393](https://github.com/PHPOffice/PhpSpreadsheet/pull/2393)
+- Don't corrupt file when using chart with fill color [#589](https://github.com/PHPOffice/PhpSpreadsheet/pull/589)
+- Restore imperfect array formula values in xlsx writer [#2343](https://github.com/PHPOffice/PhpSpreadsheet/pull/2343)
+- Restore explicit list of changes to PHPExcel migration document [#1546](https://github.com/PHPOffice/PhpSpreadsheet/issues/1546)
+
 ## 1.19.0 - 2021-10-31
 
 ### Added
@@ -29,7 +424,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
 
 ### Deprecated
 
-- PHP 8.1 will deprecate auto_detect_line_endings. As a result of this change, Csv Reader using PHP8.1+ will no longer be able to handle a Csv with Mac line endings.
+- PHP 8.1 will deprecate auto_detect_line_endings. As a result of this change, Csv Reader using some release after PHP8.1 will no longer be able to handle a Csv with Mac line endings.
 
 ### Removed
 
@@ -82,6 +477,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
 ## 1.18.0 - 2021-05-31
 
 ### Added
+
 - Enhancements to CSV Reader, allowing options to be set when using `IOFactory::load()` with a callback to set delimiter, enclosure, charset etc [PR #2103](https://github.com/PHPOffice/PhpSpreadsheet/pull/2103) - See [documentation](https://github.com/PHPOffice/PhpSpreadsheet/blob/master/docs/topics/reading-and-writing-to-file.md#csv-comma-separated-values) for details.
 - Implemented basic AutoFiltering for Ods Reader and Writer [PR #2053](https://github.com/PHPOffice/PhpSpreadsheet/pull/2053)
 - Implemented basic AutoFiltering for Gnumeric Reader [PR #2055](https://github.com/PHPOffice/PhpSpreadsheet/pull/2055)
@@ -104,6 +500,7 @@ and this project adheres to [Semantic Versioning](https://semver.org).
 - Use of `nb` rather than `no` as the locale language code for Norsk Bokmål.
 
 ### Fixed
+
 - Fixed error in COUPNCD() calculation for end of month [Issue #2116](https://github.com/PHPOffice/PhpSpreadsheet/issues/2116) - [PR #2119](https://github.com/PHPOffice/PhpSpreadsheet/pull/2119)
 - Resolve default values when a null argument is passed for HLOOKUP(), VLOOKUP() and ADDRESS() functions [Issue #2120](https://github.com/PHPOffice/PhpSpreadsheet/issues/2120) - [PR #2121](https://github.com/PHPOffice/PhpSpreadsheet/pull/2121)
 - Fixed incorrect R1C1 to A1 subtraction formula conversion (`R[-2]C-R[2]C`) [Issue #2076](https://github.com/PHPOffice/PhpSpreadsheet/pull/2076) [PR #2086](https://github.com/PHPOffice/PhpSpreadsheet/pull/2086)

+ 74 - 0
vendor/phpoffice/phpspreadsheet/README.md

@@ -11,6 +11,80 @@
 PhpSpreadsheet is a library written in pure PHP and offers a set of classes that
 allow you to read and write various spreadsheet file formats such as Excel and LibreOffice Calc.
 
+## PHP version support
+
+LTS: Support for PHP versions will only be maintained for a period of six months beyond the
+[end of life of that PHP version](https://www.php.net/eol.php).
+
+Currently the required PHP minimum version is PHP __7.3__.
+
+See the `composer.json` for other requirements.
+
+## Installation
+
+Use [composer](https://getcomposer.org) to install PhpSpreadsheet into your project:
+
+```sh
+composer require phpoffice/phpspreadsheet
+```
+
+If you are building your installation on a development machine that is on a different PHP version to the server where it will be deployed, or if your PHP CLI version is not the same as your run-time such as `php-fpm` or Apache's `mod_php`, then you might want to add the following to your `composer.json` before installing:
+```json
+{
+    "require": {
+        "phpoffice/phpspreadsheet": "^1.23"
+    },
+    "config": {
+        "platform": {
+            "php": "7.3"
+        }
+    }
+}
+```
+and then run
+```sh
+composer install
+```
+to ensure that the correct dependencies are retrieved to match your deployment environment.
+
+See [CLI vs Application run-time](https://php.watch/articles/composer-platform-check) for more details.
+
+### Additional Installation Options
+
+If you want to write to PDF, or to include Charts when you write to HTML or PDF, then you will need to install additional libraries:
+
+#### PDF
+
+For PDF Generation, you can install any of the following, and then configure PhpSpreadsheet to indicate which library you are going to use:
+ - mpdf/mpdf
+ - dompdf/dompdf
+ - tecnickcom/tcpdf
+
+and configure PhpSpreadsheet using:
+
+```php
+// Dompdf, Mpdf or Tcpdf (as appropriate)
+$className = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf::class;
+IOFactory::registerWriter('Pdf', $className);
+```
+or the appropriate PDF Writer wrapper for the library that you have chosen to install.
+
+#### Chart Export
+
+For Chart export, we support following packages, which you will also need to install yourself using `composer require`
+ - [jpgraph/jpgraph](https://packagist.org/packages/jpgraph/jpgraph) (this package was abandoned at version 4.0. 
+   You can manually download the latest version that supports PHP 8 and above from [jpgraph.net](https://jpgraph.net/))
+ - [mitoteam/jpgraph](https://packagist.org/packages/mitoteam/jpgraph) (fork with php 8.1 support)
+
+and then configure PhpSpreadsheet using:
+```php
+Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\JpGraph::class); // to use jpgraph/jpgraph
+//or
+Settings::setChartRenderer(\PhpOffice\PhpSpreadsheet\Chart\Renderer\MtJpGraphRenderer::class); // to use mitoteam/jpgraph
+```
+
+One or the other of these libraries is necessary if you want to generate HTML or PDF files that include charts.
+
 ## Documentation
 
 Read more about it, including install instructions, in the [official documentation](https://phpspreadsheet.readthedocs.io). Or check out the [API documentation](https://phpoffice.github.io/PhpSpreadsheet).

+ 21 - 17
vendor/phpoffice/phpspreadsheet/composer.json

@@ -12,7 +12,10 @@
         "spreadsheet"
     ],
     "config": {
-        "sort-packages": true
+        "sort-packages": true,
+        "allow-plugins": {
+            "dealerdirect/phpcodesniffer-composer-installer": true
+        }
     },
     "homepage": "https://github.com/PHPOffice/PhpSpreadsheet",
     "type": "library",
@@ -48,11 +51,11 @@
             "php-cs-fixer fix --ansi"
         ],
         "versions": [
-            "phpcs --report-width=200 samples/ src/ tests/ --ignore=samples/Header.php --standard=PHPCompatibility --runtime-set testVersion 7.2- -n"
+            "phpcs --report-width=200 samples/ src/ tests/ --ignore=samples/Header.php --standard=PHPCompatibility --runtime-set testVersion 7.3- -n"
         ]
     },
     "require": {
-        "php": "^7.2 || ^8.0",
+        "php": "^7.3 || ^8.0",
         "ext-ctype": "*",
         "ext-dom": "*",
         "ext-fileinfo": "*",
@@ -66,32 +69,33 @@
         "ext-xmlwriter": "*",
         "ext-zip": "*",
         "ext-zlib": "*",
-        "ezyang/htmlpurifier": "^4.13",
+        "ezyang/htmlpurifier": "^4.15",
         "maennchen/zipstream-php": "^2.1",
         "markbaker/complex": "^3.0",
         "markbaker/matrix": "^3.0",
         "psr/http-client": "^1.0",
         "psr/http-factory": "^1.0",
-        "psr/simple-cache": "^1.0"
+        "psr/simple-cache": "^1.0 || ^2.0 || ^3.0"
     },
     "require-dev": {
         "dealerdirect/phpcodesniffer-composer-installer": "dev-master",
-        "dompdf/dompdf": "^1.0",
-        "friendsofphp/php-cs-fixer": "^2.18",
-        "jpgraph/jpgraph": "^4.0",
-        "mpdf/mpdf": "^8.0",
+        "dompdf/dompdf": "^1.0 || ^2.0",
+        "friendsofphp/php-cs-fixer": "^3.2",
+        "mitoteam/jpgraph": "10.2.4",
+        "mpdf/mpdf": "8.1.1",
         "phpcompatibility/php-compatibility": "^9.3",
-        "phpstan/phpstan": "^0.12.82",
-        "phpstan/phpstan-phpunit": "^0.12.18",
-        "phpunit/phpunit": "^8.5",
-        "squizlabs/php_codesniffer": "^3.5",
-        "tecnickcom/tcpdf": "^6.3"
+        "phpstan/phpstan": "^1.1",
+        "phpstan/phpstan-phpunit": "^1.0",
+        "phpunit/phpunit": "^8.5 || ^9.0",
+        "squizlabs/php_codesniffer": "^3.7",
+        "tecnickcom/tcpdf": "6.5"
     },
     "suggest": {
+        "ext-intl": "PHP Internationalization Functions",
         "mpdf/mpdf": "Option for rendering PDF with PDF Writer",
-        "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
-        "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)",
-        "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
+        "dompdf/dompdf": "Option for rendering PDF with PDF Writer",
+        "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer",
+        "mitoteam/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers"
     },
     "autoload": {
         "psr-4": {

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 179 - 299
vendor/phpoffice/phpspreadsheet/phpstan-baseline.neon


+ 58 - 0
vendor/phpoffice/phpspreadsheet/phpstan-conditional.php

@@ -0,0 +1,58 @@
+<?php
+
+$config = [];
+
+if (PHP_VERSION_ID < 80000) {
+    // GdImage not available before PHP8
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Method .* has invalid return type GdImage\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Shared/Drawing.php',
+        'count' => 1,
+    ];
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Property .* has unknown class GdImage as its type\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php',
+        'count' => 1,
+    ];
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Method .* has invalid return type GdImage\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php',
+        'count' => 1,
+    ];
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Parameter .* of method .* has invalid type GdImage\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Worksheet/MemoryDrawing.php',
+        'count' => 1,
+    ];
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Class GdImage not found\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Writer/Xls/Worksheet.php',
+        'count' => 1,
+    ];
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '~^Parameter .* of method .* has invalid type GdImage\.$~',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Writer/Xls/Worksheet.php',
+        'count' => 1,
+    ];
+    // Erroneous analysis by Phpstan before PHP8 - 3rd parameter is nullable
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '#^Parameter \\#3 \\$namespace of method XMLWriter\\:\\:startElementNs\\(\\) expects string, null given\\.$#',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php',
+        'count' => 8,
+    ];
+    // Erroneous analysis by Phpstan before PHP8 - mb_strlen does not return false
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '#^Method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\StringHelper\\:\\:countCharacters\\(\\) should return int but returns int(<0, max>)?\\|false\\.$#',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Shared/StringHelper.php',
+        'count' => 1,
+    ];
+} else {
+    // Flagged in Php8+ - unsure how to correct code
+    $config['parameters']['ignoreErrors'][] = [
+        'message' => '#^Binary operation "/" between float and array[|]float[|]int[|]string results in an error.#',
+        'path' => __DIR__ . '/src/PhpSpreadsheet/Calculation/MathTrig/Combinations.php',
+        'count' => 2,
+    ];
+}
+
+return $config;

+ 8 - 14
vendor/phpoffice/phpspreadsheet/phpstan.neon.dist

@@ -1,29 +1,23 @@
 includes:
     - phpstan-baseline.neon
+    - phpstan-conditional.php
     - vendor/phpstan/phpstan-phpunit/extension.neon
     - vendor/phpstan/phpstan-phpunit/rules.neon
 
 parameters:
-    level: max
+    level: 8
     paths:
         - src/
         - tests/
+    excludePaths:
+        - src/PhpSpreadsheet/Chart/Renderer/JpGraph.php
+        - src/PhpSpreadsheet/Chart/Renderer/JpGraphRendererBase.php
     parallel:
         processTimeout: 300.0
     checkMissingIterableValueType: false
     ignoreErrors:
-        - '~^Class GdImage not found\.$~'
-        - '~^Return typehint of method .* has invalid type GdImage\.$~'
-        - '~^Property .* has unknown class GdImage as its type\.$~'
-        - '~^Parameter .* of method .* has invalid typehint type GdImage\.$~'
-        - '~^Parameter \#1 \$im of function (imagedestroy|imageistruecolor|imagealphablending|imagesavealpha|imagecolortransparent|imagecolorsforindex|imagesavealpha|imagesx|imagesy) expects resource, GdImage\|resource given\.$~'
-        - '~^Parameter \#2 \$src_im of function imagecopy expects resource, GdImage\|resource given\.$~'
+        - '~^Parameter \#1 \$im(age)? of function (imagedestroy|imageistruecolor|imagealphablending|imagesavealpha|imagecolortransparent|imagecolorsforindex|imagesavealpha|imagesx|imagesy|imagepng) expects (GdImage|resource), GdImage\|resource given\.$~'
+        - '~^Parameter \#2 \$src_im(age)? of function imagecopy expects (GdImage|resource), GdImage\|resource given\.$~'
         # Accept a bit anything for assert methods
         - '~^Parameter \#2 .* of static method PHPUnit\\Framework\\Assert\:\:assert\w+\(\) expects .*, .* given\.$~'
-        - '~^Method PhpOffice\\PhpSpreadsheetTests\\.*\:\:test.*\(\) has parameter \$args with no typehint specified\.$~'
-
-        # Ignore all JpGraph issues
-        - '~^Constant (MARK_CIRCLE|MARK_CROSS|MARK_DIAMOND|MARK_DTRIANGLE|MARK_FILLEDCIRCLE|MARK_SQUARE|MARK_STAR|MARK_UTRIANGLE|MARK_X|SIDE_RIGHT) not found\.$~'
-        - '~^Instantiated class (AccBarPlot|AccLinePlot|BarPlot|ContourPlot|Graph|GroupBarPlot|GroupBarPlot|LinePlot|LinePlot|PieGraph|PiePlot|PiePlot3D|PiePlotC|RadarGraph|RadarPlot|ScatterPlot|Spline|StockPlot) not found\.$~'
-        - '~^Call to method .*\(\) on an unknown class (AccBarPlot|AccLinePlot|BarPlot|ContourPlot|Graph|GroupBarPlot|GroupBarPlot|LinePlot|LinePlot|PieGraph|PiePlot|PiePlot3D|PiePlotC|RadarGraph|RadarPlot|ScatterPlot|Spline|StockPlot)\.$~'
-        - '~^Access to property .* on an unknown class (AccBarPlot|AccLinePlot|BarPlot|ContourPlot|Graph|GroupBarPlot|GroupBarPlot|LinePlot|LinePlot|PieGraph|PiePlot|PiePlot3D|PiePlotC|RadarGraph|RadarPlot|ScatterPlot|Spline|StockPlot)\.$~'
+        - '~^Method PhpOffice\\PhpSpreadsheetTests\\.*\:\:test.*\(\) has parameter \$args with no type specified\.$~'

+ 1 - 1
vendor/psr/container/composer.json

@@ -12,7 +12,7 @@
         }
     ],
     "require": {
-        "php": ">=7.4.0"
+        "php": ">=7.2.0"
     },
     "autoload": {
         "psr-4": {

+ 1 - 3
vendor/psr/container/src/ContainerExceptionInterface.php

@@ -2,11 +2,9 @@
 
 namespace Psr\Container;
 
-use Throwable;
-
 /**
  * Base interface representing a generic exception in a container.
  */
-interface ContainerExceptionInterface extends Throwable
+interface ContainerExceptionInterface
 {
 }

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно