zhangguidong 2 years ago
parent
commit
781bcf12d0
100 changed files with 3224 additions and 2829 deletions
  1. 2 1
      composer.json
  2. 3 3
      vendor/adbario/php-dot-notation/composer.json
  3. 6 0
      vendor/adbario/php-dot-notation/src/Dot.php
  4. 1 1
      vendor/alibabacloud/tea/composer.json
  5. 1 0
      vendor/alibabacloud/tea/src/Parameter.php
  6. 6 0
      vendor/alibabacloud/tea/src/Response.php
  7. 4 1
      vendor/alibabacloud/tea/src/Tea.php
  8. 11 1
      vendor/alipaysdk/easysdk/CHANGELOG
  9. 2 9
      vendor/alipaysdk/easysdk/composer.json
  10. 0 87
      vendor/alipaysdk/easysdk/go/README.md
  11. 0 14
      vendor/alipaysdk/easysdk/go/src/kernel/AlipayConstants.go
  12. 0 246
      vendor/alipaysdk/easysdk/go/src/kernel/BaseClient.go
  13. 0 142
      vendor/alipaysdk/easysdk/go/src/kernel/client.go
  14. 0 133
      vendor/alipaysdk/easysdk/go/src/kernel/signer.go
  15. 0 37
      vendor/alipaysdk/easysdk/go/src/tea/debug.go
  16. 0 110
      vendor/alipaysdk/easysdk/go/src/tea/logger.go
  17. 0 60
      vendor/alipaysdk/easysdk/go/src/tea/progress.go
  18. 0 919
      vendor/alipaysdk/easysdk/go/src/tea/tea.go
  19. 0 44
      vendor/alipaysdk/easysdk/go/src/tea/utils.go
  20. 0 46
      vendor/alipaysdk/easysdk/go/src/test/main.go
  21. 1 1
      vendor/alipaysdk/easysdk/java/pom.xml
  22. 1 29
      vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/Factory.java
  23. 1 29
      vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/MultipleFactory.java
  24. 0 32
      vendor/alipaysdk/easysdk/java/src/test/java/com/alipay/easysdk/factory/FactoryTest.java
  25. 1 1
      vendor/alipaysdk/easysdk/php/src/Kernel/AlipayConstants.php
  26. 1 2
      vendor/alipaysdk/easysdk/php/src/Payment/Page/Client.php
  27. 5 0
      vendor/aliyuncs/oss-sdk-php/CHANGELOG.md
  28. 86 0
      vendor/aliyuncs/oss-sdk-php/samples/Bucket.php
  29. 211 0
      vendor/aliyuncs/oss-sdk-php/samples/Object.php
  30. 5 1
      vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssUtil.php
  31. 19 20
      vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectInfo.php
  32. 167 12
      vendor/aliyuncs/oss-sdk-php/src/OSS/OssClient.php
  33. 84 32
      vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientMultipartUploadTest.php
  34. 1 1
      vendor/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php
  35. 7 7
      vendor/composer/InstalledVersions.php
  36. 35 0
      vendor/composer/autoload_classmap.php
  37. 4 5
      vendor/composer/autoload_files.php
  38. 3 5
      vendor/composer/autoload_psr4.php
  39. 51 27
      vendor/composer/autoload_static.php
  40. 222 327
      vendor/composer/installed.json
  41. 133 151
      vendor/composer/installed.php
  42. 2 2
      vendor/composer/platform_check.php
  43. 22 0
      vendor/guzzlehttp/guzzle/CHANGELOG.md
  44. 14 14
      vendor/guzzlehttp/guzzle/README.md
  45. 4 1
      vendor/guzzlehttp/guzzle/composer.json
  46. 5 0
      vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
  47. 4 2
      vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
  48. 2 2
      vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
  49. 8 1
      vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
  50. 19 7
      vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php
  51. 52 0
      vendor/guzzlehttp/psr7/CHANGELOG.md
  52. 33 2
      vendor/guzzlehttp/psr7/README.md
  53. 4 1
      vendor/guzzlehttp/psr7/composer.json
  54. 5 0
      vendor/guzzlehttp/psr7/src/CachingStream.php
  55. 3 0
      vendor/guzzlehttp/psr7/src/DroppingStream.php
  56. 1 0
      vendor/guzzlehttp/psr7/src/FnStream.php
  57. 85 20
      vendor/guzzlehttp/psr7/src/Header.php
  58. 3 0
      vendor/guzzlehttp/psr7/src/InflateStream.php
  59. 1 0
      vendor/guzzlehttp/psr7/src/LazyOpenStream.php
  60. 3 0
      vendor/guzzlehttp/psr7/src/LimitStream.php
  61. 3 0
      vendor/guzzlehttp/psr7/src/Message.php
  62. 38 9
      vendor/guzzlehttp/psr7/src/MessageTrait.php
  63. 1208 101
      vendor/guzzlehttp/psr7/src/MimeType.php
  64. 7 1
      vendor/guzzlehttp/psr7/src/MultipartStream.php
  65. 3 0
      vendor/guzzlehttp/psr7/src/NoSeekStream.php
  66. 1 1
      vendor/guzzlehttp/psr7/src/Query.php
  67. 1 1
      vendor/guzzlehttp/psr7/src/ServerRequest.php
  68. 9 6
      vendor/guzzlehttp/psr7/src/Stream.php
  69. 6 1
      vendor/guzzlehttp/psr7/src/Uri.php
  70. 49 2
      vendor/guzzlehttp/psr7/src/Utils.php
  71. 0 9
      vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json
  72. 0 10
      vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json
  73. 0 9
      vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json
  74. 22 0
      vendor/monolog/monolog/CHANGELOG.md
  75. 1 3
      vendor/monolog/monolog/composer.json
  76. 11 5
      vendor/monolog/monolog/src/Monolog/ErrorHandler.php
  77. 18 5
      vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
  78. 11 1
      vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
  79. 4 0
      vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
  80. 33 4
      vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php
  81. 3 3
      vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
  82. 2 1
      vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php
  83. 10 1
      vendor/monolog/monolog/src/Monolog/Handler/Handler.php
  84. 2 1
      vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php
  85. 2 2
      vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php
  86. 2 2
      vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php
  87. 5 1
      vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
  88. 1 1
      vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
  89. 52 9
      vendor/monolog/monolog/src/Monolog/Logger.php
  90. 2 0
      vendor/monolog/monolog/src/Monolog/Test/TestCase.php
  91. 1 1
      vendor/monolog/monolog/src/Monolog/Utils.php
  92. 0 6
      vendor/myclabs/php-enum/.gitattributes
  93. 0 6
      vendor/myclabs/php-enum/.gitignore
  94. 2 2
      vendor/myclabs/php-enum/LICENSE
  95. 22 12
      vendor/myclabs/php-enum/README.md
  96. 4 3
      vendor/myclabs/php-enum/composer.json
  97. 136 22
      vendor/myclabs/php-enum/src/Enum.php
  98. 2 0
      vendor/oygza/aliyun-php-sdk-afs/.gitignore
  99. 201 0
      vendor/oygza/aliyun-php-sdk-afs/LICENSE
  100. 6 0
      vendor/oygza/aliyun-php-sdk-afs/README.md

+ 2 - 1
composer.json

@@ -26,7 +26,8 @@
     "hg/apidoc": "1.1.x",
     "hg/apidoc": "1.1.x",
     "phpoffice/phpexcel": "^1.8",
     "phpoffice/phpexcel": "^1.8",
     "alibabacloud/client": "^1.5",
     "alibabacloud/client": "^1.5",
-    "alipaysdk/easysdk": "^2.0"
+    "alipaysdk/easysdk": "^2.0",
+    "oygza/aliyun-php-sdk-afs": "^1.0"
   },
   },
   "config": {
   "config": {
     "allow-plugins": {
     "allow-plugins": {

+ 3 - 3
vendor/adbario/php-dot-notation/composer.json

@@ -11,12 +11,12 @@
         }
         }
     ],
     ],
     "require": {
     "require": {
-        "php": ">=5.5",
+        "php": "^5.5 || ^7.0 || ^8.0",
         "ext-json": "*"
         "ext-json": "*"
     },
     },
     "require-dev": {
     "require-dev": {
-        "phpunit/phpunit": "^4.0|^5.0|^6.0",
-        "squizlabs/php_codesniffer": "^3.0"
+        "phpunit/phpunit": "^4.8|^5.7|^6.6|^7.5|^8.5|^9.5",
+        "squizlabs/php_codesniffer": "^3.6"
     },
     },
     "autoload": {
     "autoload": {
         "files": [
         "files": [

+ 6 - 0
vendor/adbario/php-dot-notation/src/Dot.php

@@ -507,6 +507,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string $key
      * @param  int|string $key
      * @return bool
      * @return bool
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetExists($key)
     public function offsetExists($key)
     {
     {
         return $this->has($key);
         return $this->has($key);
@@ -518,6 +519,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string $key
      * @param  int|string $key
      * @return mixed
      * @return mixed
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($key)
     public function offsetGet($key)
     {
     {
         return $this->get($key);
         return $this->get($key);
@@ -529,6 +531,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param int|string|null $key
      * @param int|string|null $key
      * @param mixed           $value
      * @param mixed           $value
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetSet($key, $value)
     public function offsetSet($key, $value)
     {
     {
         if (is_null($key)) {
         if (is_null($key)) {
@@ -545,6 +548,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      *
      *
      * @param int|string $key
      * @param int|string $key
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetUnset($key)
     public function offsetUnset($key)
     {
     {
         $this->delete($key);
         $this->delete($key);
@@ -562,6 +566,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      * @param  int|string|null $key
      * @param  int|string|null $key
      * @return int
      * @return int
      */
      */
+    #[\ReturnTypeWillChange]
     public function count($key = null)
     public function count($key = null)
     {
     {
         return count($this->get($key));
         return count($this->get($key));
@@ -578,6 +583,7 @@ class Dot implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
      *
      *
      * @return \ArrayIterator
      * @return \ArrayIterator
      */
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     public function getIterator()
     {
     {
         return new ArrayIterator($this->items);
         return new ArrayIterator($this->items);

+ 1 - 1
vendor/alibabacloud/tea/composer.json

@@ -31,7 +31,7 @@
         "ext-simplexml": "*",
         "ext-simplexml": "*",
         "ext-xmlwriter": "*",
         "ext-xmlwriter": "*",
         "guzzlehttp/guzzle": "^6.3|^7.0",
         "guzzlehttp/guzzle": "^6.3|^7.0",
-        "adbario/php-dot-notation": "^2.2"
+        "adbario/php-dot-notation": "^2.3"
     },
     },
     "require-dev": {
     "require-dev": {
         "symfony/dotenv": "^3.4",
         "symfony/dotenv": "^3.4",

+ 1 - 0
vendor/alibabacloud/tea/src/Parameter.php

@@ -15,6 +15,7 @@ abstract class Parameter implements IteratorAggregate
     /**
     /**
      * @return ArrayIterator|Traversable
      * @return ArrayIterator|Traversable
      */
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     public function getIterator()
     {
     {
         return new ArrayIterator($this->toArray());
         return new ArrayIterator($this->toArray());

+ 6 - 0
vendor/alibabacloud/tea/src/Response.php

@@ -302,6 +302,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
     /**
     /**
      * Retrieve an external iterator.
      * Retrieve an external iterator.
      */
      */
+    #[\ReturnTypeWillChange]
     public function getIterator()
     public function getIterator()
     {
     {
         return $this->dot->getIterator();
         return $this->dot->getIterator();
@@ -314,6 +315,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      *
      * @return bool
      * @return bool
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetExists($offset)
     public function offsetExists($offset)
     {
     {
         return $this->dot->offsetExists($offset);
         return $this->dot->offsetExists($offset);
@@ -326,6 +328,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      *
      * @return mixed
      * @return mixed
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetGet($offset)
     public function offsetGet($offset)
     {
     {
         return $this->dot->offsetGet($offset);
         return $this->dot->offsetGet($offset);
@@ -337,6 +340,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      * @param $offset
      * @param $offset
      * @param $value
      * @param $value
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetSet($offset, $value)
     public function offsetSet($offset, $value)
     {
     {
         $this->dot->offsetSet($offset, $value);
         $this->dot->offsetSet($offset, $value);
@@ -347,6 +351,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      *
      * @param $offset
      * @param $offset
      */
      */
+    #[\ReturnTypeWillChange]
     public function offsetUnset($offset)
     public function offsetUnset($offset)
     {
     {
         $this->dot->offsetUnset($offset);
         $this->dot->offsetUnset($offset);
@@ -359,6 +364,7 @@ class Response extends PsrResponse implements ArrayAccess, IteratorAggregate, Co
      *
      *
      * @return int
      * @return int
      */
      */
+    #[\ReturnTypeWillChange]
     public function count($key = null)
     public function count($key = null)
     {
     {
         return $this->dot->count($key);
         return $this->dot->count($key);

+ 4 - 1
vendor/alibabacloud/tea/src/Tea.php

@@ -173,7 +173,10 @@ class Tea
     public static function allowRetry(array $runtime, $retryTimes, $now)
     public static function allowRetry(array $runtime, $retryTimes, $now)
     {
     {
         unset($now);
         unset($now);
-        if (empty($runtime) || !isset($runtime['maxAttempts'])) {
+        if (!isset($retryTimes) || null === $retryTimes || !\is_numeric($retryTimes)) {
+            return false;
+        }
+        if ($retryTimes > 0 && (empty($runtime) || !isset($runtime['retryable']) || !$runtime['retryable'] || !isset($runtime['maxAttempts']))) {
             return false;
             return false;
         }
         }
         $maxAttempts = $runtime['maxAttempts'];
         $maxAttempts = $runtime['maxAttempts'];

+ 11 - 1
vendor/alipaysdk/easysdk/CHANGELOG

@@ -1,7 +1,11 @@
 最新变更
 最新变更
-修复PHP7.4及其以上环境下,根证书解析报错的问题。
+java删除Factory.getClient方法
+php删除php中多余的composer包
 
 
 Java版本
 Java版本
+2022-05-06 Version: 2.2.2
+1. 删除Factory.getClient方法
+
 2021-09-04 Version: 2.2.1
 2021-09-04 Version: 2.2.1
 1. 修复Okhttp Response没有主动关闭的问题。
 1. 修复Okhttp Response没有主动关闭的问题。
 
 
@@ -114,6 +118,12 @@ Factory.Util.AES().Encrypt AES加密
 
 
 
 
 PHP版本
 PHP版本
+2022-05-06 Version: 2.2.2
+1. php删除php中多余的composer包
+
+2021-09-24 Version: 2.2.1
+1. 修复PHP7.4及其以上环境下,根证书解析报错的问题。
+
 2021-01-18 Version: 2.2.0
 2021-01-18 Version: 2.2.0
 1. 增加sdkExecute功能。
 1. 增加sdkExecute功能。
 2. 增加fileExecute功能。
 2. 增加fileExecute功能。

+ 2 - 9
vendor/alipaysdk/easysdk/composer.json

@@ -2,7 +2,7 @@
 	"name":"alipaysdk/easysdk",
 	"name":"alipaysdk/easysdk",
 	"description":"支付宝官方 Alipay Easy SDK",
 	"description":"支付宝官方 Alipay Easy SDK",
 	"type":"library",
 	"type":"library",
-	"version":"2.2.1",
+	"version":"2.2.2",
 	"authors":[
 	"authors":[
 		{
 		{
 			"name":"junying.wjy",
 			"name":"junying.wjy",
@@ -32,15 +32,8 @@
 		"ext-simplexml":"*",
 		"ext-simplexml":"*",
 		"ext-mbstring":"*",
 		"ext-mbstring":"*",
 		"ext-openssl":"*",
 		"ext-openssl":"*",
-		"pimple/pimple": "^3.0",
-		"xin/container":"^2.0.1",
-		"guzzlehttp/guzzle":">=6.3",
-		"psr/log": "^1.1",
 		"ext-xmlwriter": "*",
 		"ext-xmlwriter": "*",
-		"songshenzong/support": "^2.0",
-		"danielstjules/stringy": "^3.1",
-		"mtdowling/jmespath.php": "^2.4",
-		"adbario/php-dot-notation": "^2.2",
+		"guzzlehttp/guzzle":">=6.3",
 		"alibabacloud/tea": "^3.1",
 		"alibabacloud/tea": "^3.1",
 		"alibabacloud/tea-fileform": "^0.3.2"
 		"alibabacloud/tea-fileform": "^0.3.2"
     },
     },

+ 0 - 87
vendor/alipaysdk/easysdk/go/README.md

@@ -1,87 +0,0 @@
-欢迎使用 Alipay **Easy** SDK for Go(Beta)。
-
-Alipay Esay SDK for Go让您不用复杂编程即可访支付宝开放平台开放的各项常用能力,SDK可以自动帮您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。
-
-下面向您介绍Alipay Easy SDK for Go 的基本设计理念和使用方法。
-
-## 设计理念
-
-Alipay Easy SDK主要目标是提升开发者在**服务端**集成支付宝开放平台开放的各类核心能力的效率。
-
-## 环境要求
-1. Alipay Easy SDK for Go 需要配合`Go 1.12`或其以上版本。
-
-2. 使用 Alipay Easy SDK for Go 之前 ,您需要先前往[支付宝开发平台-开发者中心](https://openhome.alipay.com/platform/developerIndex.htm)完成开发者接入的一些准备工作,包括创建应用、为应用添加功能包、设置应用的接口加签方式等。
-
-3. 准备工作完成后,注意保存如下信息,后续将作为使用SDK的输入。
-
-* 加签模式为公钥证书模式时(推荐)
-
-`AppId`、`应用的私钥`、`应用公钥证书文件`、`支付宝公钥证书文件`、`支付宝根证书文件`
-
-* 加签模式为公钥模式时
-
-`AppId`、`应用的私钥`、`支付宝公钥`
-
-## 安装
-手动下载go目录下源码集成即可
-
-## 快速使用
-以下这段代码示例向您展示了使用Alipay Easy SDK for Go调用一个API的3个主要步骤:
-
-1. 设置参数(全局只需设置一次)。
-2. 发起API调用。
-3. 处理响应或异常。
-
-```go
-package main
-
-import (
-	"encoding/json"
-	"fmt"
-	"kernel"
-	"time"
-)
-
-func init() {
-	account:= kernel.Client{}
-	account.Protocol = "https"
-	account.GatewayHost = "openapi.alipay.com"
-	account.AppId = "<-- 请填写您的AppId,例如:2019022663440152 -->"
-	account.SignType = "RSA2"
-	account.AlipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"
-	account.MerchantPrivateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"
-
-	kernel.InitClient(account)
-}
-
-
-func main() {
-	result, _ := kernel.Execute("alipay.trade.create", nil, getBizParams(time.Now().Format("2006-01-02 15:04:05")))
-	fmt.Println(result)
-}
-
-func getBizParams(outTradeNo string) map[string]string {
-	bizParams := map[string]string{
-		"subject":       "phone6 16G",
-		"out_trade_no":  outTradeNo,
-		"total_amount":  "0.10",
-		"buyer_id":      "2088002656718920",
-		"extend_params": getHuabeiParams(),
-	}
-	return bizParams
-}
-
-func getHuabeiParams() string {
-	extendParams := map[string]string{
-		"hb_fq_num":            "3",
-		"hb_fq_seller_percent": "3",
-	}
-	byt, _ := json.Marshal(extendParams)
-	return string(byt)
-}
-```
-
-## 文档
-
-[Alipay Easy SDK](./../README.md)

+ 0 - 14
vendor/alipaysdk/easysdk/go/src/kernel/AlipayConstants.go

@@ -1,14 +0,0 @@
-package kernel
-
-/**
- * 与网关HTTP交互中涉及到的字段值
- */
-const bizContent = "biz_content"
-const alipayCertSN = "alipay_cert_sn"
-const signField = "sign"
-const bodyField = "http_body"
-const notifyUrl = "notify_url"
-const methodField = "method"
-const response = "_response"
-const errorResponse = "error_response"
-const sdkVersion = "alipay-easysdk-go-1.0.0"

+ 0 - 246
vendor/alipaysdk/easysdk/go/src/kernel/BaseClient.go

@@ -1,246 +0,0 @@
-package kernel
-
-import (
-	"encoding/base64"
-	"encoding/json"
-	"fmt"
-	"io"
-	"io/ioutil"
-	Sort "sort"
-	"strings"
-	"tea"
-	"time"
-)
-
-var this Client
-
-func GetConfig(key string) string {
-	if key == "protocol" {
-		return this.Protocol
-	} else if key == "gatewayHost" {
-		return this.GatewayHost
-	} else if key == "appId" {
-		return this.AppId
-	} else if key == "signType" {
-		return this.SignType
-	} else if key == "alipayPublicKey" {
-		return this.AlipayPublicKey
-	} else if key == "merchantPrivateKey" {
-		return this.MerchantPrivateKey
-	} else if key == "merchantCertPath" {
-		return this.MerchantCertPath
-	} else if key == "alipayCertPath" {
-		return this.AlipayCertPath
-	} else if key == "alipayRootCertPath" {
-		return this.AlipayRootCertPath
-	} else if key == "notifyUrl" {
-		return this.NotifyUrl
-	} else if key == "encryptKey" {
-		return this.EncryptKey
-	} else {
-		panic(key + " is illegal")
-	}
-}
-
-func InitClient(config Client) {
-	this = config
-}
-
-/**
-获取时间戳,格式yyyy-MM-dd HH:mm:ss
-*/
-func GetTimestamp() string {
-	return time.Now().Format("2006-01-02 15:04:05")
-}
-
-func GetSdkVersion() string {
-	return sdkVersion
-}
-
-func GetMerchantCertSN() string {
-	return this.MerchantCertSN
-}
-
-func GetAlipayCertSN(alipayCertSN map[string]string) string {
-	return this.AlipayCertSN
-}
-
-func GetAlipayRootCertSN() string {
-	return this.AlipayRootCertSN
-}
-
-func ExtractAlipayPublicKey(alipayPublicKey string) string {
-	return this.AlipayCertSN
-}
-
-func IsCertMode() bool {
-	if len(this.AlipayCertSN) != 0 {
-		return true
-	} else {
-		return false
-	}
-}
-
-/**
-将业务参数和其他额外文本参数按www-form-urlencoded格式转换成HTTP Body中的字节数组,注意要做URL Encode
-*/
-func ToUrlEncodedRequestBody(bizParams map[string]string) string {
-	sortedMap := getSortedMap(nil, bizParams, nil)
-	if sortedMap == nil {
-		return ""
-	}
-	return buildQueryString(bizParams)
-}
-
-func buildQueryString(sortedMap map[string]string) string {
-	requestUrl := ""
-	keys := make([]string, 0)
-	for k, _ := range sortedMap {
-		keys = append(keys, k)
-	}
-	Sort.Strings(keys)
-	var pList = make([]string, 0, 0)
-	for _, key := range keys {
-		pList = append(pList, key+"="+sortedMap[key])
-	}
-	requestUrl = strings.Join(pList, "&")
-	return requestUrl
-}
-
-func getSortedMap(systemParams map[string]string, bizParams map[string]string, textParams map[string]string) map[string]string {
-	sortedMap := tea.Merge(systemParams, bizParams, textParams)
-	sortedMap = SortMap(sortedMap)
-	return sortedMap
-}
-
-func SortMap(romanNumeralDict map[string]string) map[string]string {
-	keys := make([]string, 0)
-	for k, _ := range romanNumeralDict {
-		keys = append(keys, k)
-	}
-	Sort.Strings(keys)
-	return romanNumeralDict
-}
-
-/**
-计算签名
-*/
-func Sign(systemParams map[string]string, bizParams map[string]string, textParams map[string]string, privateKey string) string {
-	if bizParams != nil {
-		byt, _ := json.Marshal(bizParams)
-		bizParams[bizContent] = string(byt)
-	}
-	sortedMap := getSortedMap(systemParams, bizParams, textParams)
-	data := buildQueryString(sortedMap)
-	var prvKey = formatKey(privateKey, `-----BEGIN RSA PRIVATE KEY-----`, `-----END RSA PRIVATE KEY-----`, 64)
-	signData := RsaSignWithSha256([]byte(data), prvKey)
-	return base64.StdEncoding.EncodeToString(signData)
-}
-
-func Verify(respMap map[string]string, alipayPublicKey string) bool {
-	resp := respMap[bodyField]
-	method := respMap[methodField]
-	content, sign := getSignSourceData(resp, method)
-	signBytes, err := base64.StdEncoding.DecodeString(sign)
-	if err != nil {
-		return false
-	}
-	pubKey := formatKey(alipayPublicKey, `-----BEGIN PUBLIC KEY-----`, `-----END PUBLIC KEY-----`, 64)
-	result := RsaVerySignWithSha256([]byte(content), signBytes, pubKey)
-	return result
-}
-
-func getSignSourceData(body string, method string) (content string, sign string) {
-	var rootNodeName = strings.Replace(method, ".", "_", -1) + response
-	var rootIndex = strings.LastIndex(body, rootNodeName)
-	var errorIndex = strings.LastIndex(body, errorResponse)
-	if rootIndex > 0 {
-		return parserJSONSource(body, rootNodeName, rootIndex)
-	} else if errorIndex > 0 {
-		return parserJSONSource(body, errorResponse, errorIndex)
-	} else {
-		return "", ""
-	}
-}
-
-func parserJSONSource(responseContent string, nodeName string, nodeIndex int) (content string, sign string) {
-	signDataStartIndex := nodeIndex + len(nodeName) + 2
-	signIndex := 0
-	if strings.LastIndex(responseContent, alipayCertSN) > 0 {
-		signIndex = strings.LastIndex(responseContent, "\""+alipayCertSN+"\"")
-	} else {
-		signIndex = strings.LastIndex(responseContent, "\""+signField+"\"")
-	}
-	signDataEndIndex := signIndex - 1
-	indexLen := signDataEndIndex - signDataStartIndex
-	if indexLen < 0 {
-		return "", ""
-	}
-	content = responseContent[signDataStartIndex:signDataEndIndex]
-	sign = responseContent[signIndex+8 : len(responseContent)-2]
-	return content, sign
-}
-
-func ToRespModel(resp map[string]string) map[string]interface{} {
-	body := resp[bodyField]
-	method := resp[methodField]
-	content, _ := getSignSourceData(body, method)
-	result := map[string]interface{}{
-		bodyField: body,
-	}
-	arg := make(map[string]interface{})
-	err := json.Unmarshal([]byte(content), &arg)
-	tmp := make(map[string]string)
-	err = json.Unmarshal([]byte(content), &tmp)
-	if err == nil {
-		for key, value := range arg {
-			if value != "" {
-				result[key] = value
-			}
-		}
-	}
-	return result
-}
-
-/**
-解析网关响应内容,同时将API的接口名称和响应原文插入到响应数组的method和body字段中
-*/
-func ReadAsJson(response io.Reader, method string) (map[string]string, error) {
-	byt, err := ioutil.ReadAll(response)
-	if err != nil {
-		return nil, err
-	}
-	err = json.Unmarshal(byt, response)
-	result := map[string]string{
-		bodyField:   string(byt),
-		methodField: method,
-	}
-	return result, err
-}
-
-func AesDecrypt(cipherText string, encryptKey string) {
-	de:=AESDecrypt([]byte(cipherText), []byte(encryptKey))
-	fmt.Println(de)
-}
-
-func AesEncrypt(plainText string, encryptKey string) {
-	en := AESEncrypt([]byte(plainText), []byte(encryptKey))
-	fmt.Println(en)
-}
-
-type Client struct {
-	Protocol           string
-	GatewayHost        string
-	AppId              string
-	SignType           string
-	AlipayPublicKey    string
-	MerchantPrivateKey string
-	MerchantCertPath   string
-	AlipayCertPath     string
-	AlipayRootCertPath string
-	NotifyUrl          string
-	EncryptKey         string
-	MerchantCertSN     string
-	AlipayCertSN       string
-	AlipayRootCertSN   string
-}

+ 0 - 142
vendor/alipaysdk/easysdk/go/src/kernel/client.go

@@ -1,142 +0,0 @@
-package kernel
-
-
-import (
-	"tea"
-)
-
-type AlipayOpenApiGenericResponse struct {
-	HttpBody *string `json:"http_body" xml:"http_body" require:"true"`
-	Code *string `json:"code" xml:"code" require:"true"`
-	Msg *string `json:"msg" xml:"msg" require:"true"`
-	SubCode *string `json:"sub_code" xml:"sub_code" require:"true"`
-	SubMsg *string `json:"sub_msg" xml:"sub_msg" require:"true"`
-}
-
-func (s AlipayOpenApiGenericResponse) String() string {
-	return tea.Prettify(s)
-}
-
-func (s AlipayOpenApiGenericResponse) GoString() string {
-	return s.String()
-}
-
-func (s *AlipayOpenApiGenericResponse) SetHttpBody(v string) *AlipayOpenApiGenericResponse {
-	s.HttpBody = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetCode(v string) *AlipayOpenApiGenericResponse {
-	s.Code = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetMsg(v string) *AlipayOpenApiGenericResponse {
-	s.Msg = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetSubCode(v string) *AlipayOpenApiGenericResponse {
-	s.SubCode = &v
-	return s
-}
-
-func (s *AlipayOpenApiGenericResponse) SetSubMsg(v string) *AlipayOpenApiGenericResponse {
-	s.SubMsg = &v
-	return s
-}
-
-func NewClient()(*Client, error) {
-	client := new(Client)
-	err := client.Init()
-	return client, err
-}
-
-func (client *Client)Init()(_err error) {
-	return nil
-}
-
-
-func Execute(method string, textParams map[string]string, bizParams map[string]string) (_result *AlipayOpenApiGenericResponse, _err error) {
-	_runtime := map[string]interface{}{
-		"connectTimeout": 15000,
-		"readTimeout": 15000,
-		"retry": map[string]int{
-			"maxAttempts": 0,
-		},
-	}
-
-	_resp := &AlipayOpenApiGenericResponse{}
-	for _retryTimes := 0; tea.AllowRetry(_runtime["retry"], _retryTimes); _retryTimes++ {
-		if _retryTimes > 0 {
-			_backoffTime := tea.GetBackoffTime(_runtime["backoff"], _retryTimes)
-			if _backoffTime > 0 {
-				tea.Sleep(_backoffTime)
-			}
-		}
-
-		_resp, _err = func()(*AlipayOpenApiGenericResponse, error){
-			request_ := tea.NewRequest()
-			systemParams := map[string]string{
-				"method": method,
-				"app_id": GetConfig("appId"),
-				"timestamp": GetTimestamp(),
-				"format": "json",
-				"version": "1.0",
-				"alipay_sdk": GetSdkVersion(),
-				"charset": "UTF-8",
-				"sign_type": GetConfig("signType"),
-				"app_cert_sn": GetMerchantCertSN(),
-				"alipay_root_cert_sn": GetAlipayRootCertSN(),
-			}
-			request_.Protocol = GetConfig("protocol")
-			request_.Method = "POST"
-			request_.Pathname = "/gateway.do"
-			request_.Headers = map[string]string{
-				"host": GetConfig("gatewayHost"),
-				"content-type": "application/x-www-form-urlencoded;charset=utf-8",
-			}
-			request_.Query = SortMap(tea.Merge(map[string]string{
-				"sign": Sign(systemParams, bizParams, textParams, GetConfig("merchantPrivateKey")),
-			},systemParams,
-				textParams))
-			request_.Body = tea.ToReader(ToUrlEncodedRequestBody(bizParams))
-			response_, _err := tea.DoRequest(request_, _runtime)
-			if _err != nil {
-				return nil, _err
-			}
-			respMap, _err := ReadAsJson(response_.Body, method)
-			if _err != nil {
-				return nil, _err
-			}
-
-			if IsCertMode() {
-				if Verify(respMap, ExtractAlipayPublicKey(GetAlipayCertSN(respMap))) {
-					_result = &AlipayOpenApiGenericResponse{}
-					_body := ToRespModel(respMap)
-					_err = tea.Convert(_body, &_result)
-					return _result, _err
-				}
-
-			} else {
-				if Verify(respMap, GetConfig("alipayPublicKey")) {
-					_result = &AlipayOpenApiGenericResponse{}
-					_body := ToRespModel(respMap)
-					_err = tea.Convert(_body, &_result)
-					return _result, _err
-				}
-
-			}
-
-			_err = tea.NewSDKError(map[string]interface{}{
-				"message": "验签失败,请检查支付宝公钥设置是否正确。",
-			})
-			return nil, _err
-		}()
-		if !tea.Retryable(_err) {
-			break
-		}
-	}
-
-	return _resp, _err
-}

+ 0 - 133
vendor/alipaysdk/easysdk/go/src/kernel/signer.go

@@ -1,133 +0,0 @@
-package kernel
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/aes"
-	"crypto/cipher"
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/sha256"
-	"crypto/x509"
-	"encoding/pem"
-	"errors"
-	"fmt"
-	"strings"
-)
-
-//签名
-func RsaSignWithSha256(data []byte, keyBytes []byte) []byte {
-	h := sha256.New()
-	h.Write(data)
-	hashed := h.Sum(nil)
-	block, _ := pem.Decode(keyBytes)
-	if block == nil {
-		panic(errors.New("private key error"))
-	}
-	privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
-	if err != nil {
-		fmt.Println("ParsePKCS8PrivateKey err", err)
-		panic(err)
-	}
-
-	signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed)
-	if err != nil {
-		fmt.Printf("Error from signing: %s\n", err)
-		panic(err)
-	}
-
-	return signature
-}
-
-//验证
-func RsaVerySignWithSha256(data, signData, keyBytes []byte) bool {
-	block, _ := pem.Decode(keyBytes)
-	if block == nil {
-		panic(errors.New("public key error"))
-	}
-	pubKey, err := x509.ParsePKIXPublicKey(block.Bytes)
-	if err != nil {
-		panic(err)
-	}
-
-	hashed := sha256.Sum256(data)
-	err = rsa.VerifyPKCS1v15(pubKey.(*rsa.PublicKey), crypto.SHA256, hashed[:], signData)
-	if err != nil {
-		panic(err)
-	}
-	return true
-}
-
-func formatKey(raw, prefix, suffix string, lineCount int) []byte {
-	if raw == "" {
-		return nil
-	}
-	raw = strings.Replace(raw, prefix, "", 1)
-	raw = strings.Replace(raw, suffix, "", 1)
-	raw = strings.Replace(raw, " ", "", -1)
-	raw = strings.Replace(raw, "\n", "", -1)
-	raw = strings.Replace(raw, "\r", "", -1)
-	raw = strings.Replace(raw, "\t", "", -1)
-	var sl = len(raw)
-	var c = sl / lineCount
-	if sl%lineCount > 0 {
-		c = c + 1
-	}
-
-	var buf bytes.Buffer
-	buf.WriteString(prefix + "\n")
-	for i := 0; i < c; i++ {
-		var b = i * lineCount
-		var e = b + lineCount
-		if e > sl {
-			buf.WriteString(raw[b:])
-		} else {
-			buf.WriteString(raw[b:e])
-		}
-		buf.WriteString("\n")
-	}
-	buf.WriteString(suffix)
-	return buf.Bytes()
-}
-
-//解密
-func AESDecrypt(crypted, key []byte) []byte {
-	block, _ := aes.NewCipher(key)
-	blockSize := block.BlockSize()
-	blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
-	origData := make([]byte, len(crypted))
-	blockMode.CryptBlocks(origData, crypted)
-	origData = PKCS7UnPadding(origData)
-	return origData
-}
-
-//去补码
-func PKCS7UnPadding(origData []byte) []byte {
-	length := len(origData)
-	unpadding := int(origData[length-1])
-	return origData[:length-unpadding]
-}
-
-//加密
-func AESEncrypt(origData, key []byte) []byte {
-	//获取block块
-	block, _ := aes.NewCipher(key)
-	//补码
-	origData = PKCS7Padding(origData, block.BlockSize())
-	//加密模式,
-	blockMode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
-	//创建明文长度的数组
-	crypted := make([]byte, len(origData))
-	//加密明文
-	blockMode.CryptBlocks(crypted, origData)
-	return crypted
-}
-
-//补码
-func PKCS7Padding(origData []byte, blockSize int) []byte {
-	//计算需要补几位数
-	padding := blockSize - len(origData)%blockSize
-	//在切片后面追加char数量的byte(char)
-	padtext := bytes.Repeat([]byte{byte(padding)}, padding)
-	return append(origData, padtext...)
-}

+ 0 - 37
vendor/alipaysdk/easysdk/go/src/tea/debug.go

@@ -1,37 +0,0 @@
-package tea
-
-
-import (
-	"fmt"
-	"os"
-	"strings"
-)
-
-type Debug func(format string, v ...interface{})
-
-var hookGetEnv = func() string {
-	return os.Getenv("DEBUG")
-}
-
-var hookPrint = func(input string) {
-	fmt.Println(input)
-}
-
-func Init(flag string) Debug {
-	enable := false
-
-	env := hookGetEnv()
-	parts := strings.Split(env, ",")
-	for _, part := range parts {
-		if part == flag {
-			enable = true
-			break
-		}
-	}
-
-	return func(format string, v ...interface{}) {
-		if enable {
-			hookPrint(fmt.Sprintf(format, v...))
-		}
-	}
-}

+ 0 - 110
vendor/alipaysdk/easysdk/go/src/tea/logger.go

@@ -1,110 +0,0 @@
-package tea
-
-
-import (
-	"io"
-	"log"
-	"strings"
-	"time"
-)
-
-type Logger struct {
-	*log.Logger
-	formatTemplate string
-	isOpen         bool
-	lastLogMsg     string
-}
-
-var defaultLoggerTemplate = `{time} {channel}: "{method} {uri} HTTP/{version}" {code} {cost} {hostname}`
-var loggerParam = []string{"{time}", "{start_time}", "{ts}", "{channel}", "{pid}", "{host}", "{method}", "{uri}", "{version}", "{target}", "{hostname}", "{code}", "{error}", "{req_headers}", "{res_body}", "{res_headers}", "{cost}"}
-var logChannel string
-
-func InitLogMsg(fieldMap map[string]string) {
-	for _, value := range loggerParam {
-		fieldMap[value] = ""
-	}
-}
-
-func (logger *Logger) SetFormatTemplate(template string) {
-	logger.formatTemplate = template
-
-}
-
-func (logger *Logger) GetFormatTemplate() string {
-	return logger.formatTemplate
-
-}
-
-func NewLogger(level string, channel string, out io.Writer, template string) *Logger {
-	if level == "" {
-		level = "info"
-	}
-
-	logChannel = "AlibabaCloud"
-	if channel != "" {
-		logChannel = channel
-	}
-	log := log.New(out, "["+strings.ToUpper(level)+"]", log.Lshortfile)
-	if template == "" {
-		template = defaultLoggerTemplate
-	}
-
-	return &Logger{
-		Logger:         log,
-		formatTemplate: template,
-		isOpen:         true,
-	}
-}
-
-func (logger *Logger) OpenLogger() {
-	logger.isOpen = true
-}
-
-func (logger *Logger) CloseLogger() {
-	logger.isOpen = false
-}
-
-func (logger *Logger) SetIsopen(isopen bool) {
-	logger.isOpen = isopen
-}
-
-func (logger *Logger) GetIsopen() bool {
-	return logger.isOpen
-}
-
-func (logger *Logger) SetLastLogMsg(lastLogMsg string) {
-	logger.lastLogMsg = lastLogMsg
-}
-
-func (logger *Logger) GetLastLogMsg() string {
-	return logger.lastLogMsg
-}
-
-func SetLogChannel(channel string) {
-	logChannel = channel
-}
-
-func (logger *Logger) PrintLog(fieldMap map[string]string, err error) {
-	if err != nil {
-		fieldMap["{error}"] = err.Error()
-	}
-	fieldMap["{time}"] = time.Now().Format("2006-01-02 15:04:05")
-	fieldMap["{ts}"] = getTimeInFormatISO8601()
-	fieldMap["{channel}"] = logChannel
-	if logger != nil {
-		logMsg := logger.formatTemplate
-		for key, value := range fieldMap {
-			logMsg = strings.Replace(logMsg, key, value, -1)
-		}
-		logger.lastLogMsg = logMsg
-		if logger.isOpen == true {
-			logger.Output(2, logMsg)
-		}
-	}
-}
-
-func getTimeInFormatISO8601() (timeStr string) {
-	gmt := time.FixedZone("GMT", 0)
-
-	return time.Now().In(gmt).Format("2006-01-02T15:04:05Z")
-}

+ 0 - 60
vendor/alipaysdk/easysdk/go/src/tea/progress.go

@@ -1,60 +0,0 @@
-package tea
-
-// ProgressEventType defines transfer progress event type
-type ProgressEventType int
-
-const (
-	// TransferStartedEvent transfer started, set TotalBytes
-	TransferStartedEvent ProgressEventType = 1 + iota
-	// TransferDataEvent transfer data, set ConsumedBytes anmd TotalBytes
-	TransferDataEvent
-	// TransferCompletedEvent transfer completed
-	TransferCompletedEvent
-	// TransferFailedEvent transfer encounters an error
-	TransferFailedEvent
-)
-
-// ProgressEvent defines progress event
-type ProgressEvent struct {
-	ConsumedBytes int64
-	TotalBytes    int64
-	RwBytes       int64
-	EventType     ProgressEventType
-}
-
-// ProgressListener listens progress change
-type ProgressListener interface {
-	ProgressChanged(event *ProgressEvent)
-}
-
-// -------------------- Private --------------------
-
-func NewProgressEvent(eventType ProgressEventType, consumed, total int64, rwBytes int64) *ProgressEvent {
-	return &ProgressEvent{
-		ConsumedBytes: consumed,
-		TotalBytes:    total,
-		RwBytes:       rwBytes,
-		EventType:     eventType}
-}
-
-// publishProgress
-func PublishProgress(listener ProgressListener, event *ProgressEvent) {
-	if listener != nil && event != nil {
-		listener.ProgressChanged(event)
-	}
-}
-
-func GetProgressListener(obj interface{}) ProgressListener {
-	if obj == nil {
-		return nil
-	}
-	listener, ok := obj.(ProgressListener)
-	if !ok {
-		return nil
-	}
-	return listener
-}
-
-type ReaderTracker struct {
-	CompletedBytes int64
-}

+ 0 - 919
vendor/alipaysdk/easysdk/go/src/tea/tea.go

@@ -1,919 +0,0 @@
-package tea
-
-
-import (
-	"bytes"
-	"context"
-	"crypto/tls"
-	"encoding/base64"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"io"
-	"math"
-	"math/rand"
-	"net"
-	"net/http"
-	"net/url"
-	"os"
-	"reflect"
-	"regexp"
-	"strconv"
-	"strings"
-	"sync"
-	"time"
-
-	"golang.org/x/net/proxy"
-)
-
-var debugLog = Init("tea")
-
-var hookDo = func(fn func(req *http.Request) (*http.Response, error)) func(req *http.Request) (*http.Response, error) {
-	return fn
-}
-
-var basicTypes = []string{
-	"int", "int64", "float32", "float64", "string", "bool", "uint64",
-}
-
-// Verify whether the parameters meet the requirements
-var validateParams = []string{"require", "pattern", "maxLength"}
-
-// CastError is used for cast type fails
-type CastError struct {
-	Message string
-}
-
-// Request is used wrap http request
-type Request struct {
-	Protocol string
-	Port     int
-	Method   string
-	Pathname string
-	Domain   string
-	Headers  map[string]string
-	Query    map[string]string
-	Body     io.Reader
-}
-
-// Response is use d wrap http response
-type Response struct {
-	Body          io.ReadCloser
-	StatusCode    int
-	StatusMessage string
-	Headers       map[string]string
-}
-
-// SDKError struct is used save error code and message
-type SDKError struct {
-	Code    string
-	Message string
-	Data    string
-}
-
-// RuntimeObject is used for converting http configuration
-type RuntimeObject struct {
-	IgnoreSSL      bool                   `json:"ignoreSSL" xml:"ignoreSSL"`
-	ReadTimeout    int                    `json:"readTimeout" xml:"readTimeout"`
-	ConnectTimeout int                    `json:"connectTimeout" xml:"connectTimeout"`
-	LocalAddr      string                 `json:"localAddr" xml:"localAddr"`
-	HttpProxy      string                 `json:"httpProxy" xml:"httpProxy"`
-	HttpsProxy     string                 `json:"httpsProxy" xml:"httpsProxy"`
-	NoProxy        string                 `json:"noProxy" xml:"noProxy"`
-	MaxIdleConns   int                    `json:"maxIdleConns" xml:"maxIdleConns"`
-	Socks5Proxy    string                 `json:"socks5Proxy" xml:"socks5Proxy"`
-	Socks5NetWork  string                 `json:"socks5NetWork" xml:"socks5NetWork"`
-	Listener       ProgressListener       `json:"listener" xml:"listener"`
-	Tracker        *ReaderTracker          `json:"tracker" xml:"tracker"`
-	Logger         *Logger                 `json:"logger" xml:"logger"`
-}
-
-type teaClient struct {
-	sync.Mutex
-	httpClient *http.Client
-	ifInit     bool
-}
-
-var clientPool = &sync.Map{}
-
-func (r *RuntimeObject) getClientTag(domain string) string {
-	return strconv.FormatBool(r.IgnoreSSL) + strconv.Itoa(r.ReadTimeout) +
-		strconv.Itoa(r.ConnectTimeout) + r.LocalAddr + r.HttpProxy +
-		r.HttpsProxy + r.NoProxy + r.Socks5Proxy + r.Socks5NetWork + domain
-}
-
-// NewRuntimeObject is used for shortly create runtime object
-func NewRuntimeObject(runtime map[string]interface{}) *RuntimeObject {
-	if runtime == nil {
-		return &RuntimeObject{}
-	}
-
-	runtimeObject := &RuntimeObject{
-		IgnoreSSL:      TransInterfaceToBool(runtime["ignoreSSL"]),
-		ReadTimeout:    TransInterfaceToInt(runtime["readTimeout"]),
-		ConnectTimeout: TransInterfaceToInt(runtime["connectTimeout"]),
-		LocalAddr:      TransInterfaceToString(runtime["localAddr"]),
-		HttpProxy:      TransInterfaceToString(runtime["httpProxy"]),
-		HttpsProxy:     TransInterfaceToString(runtime["httpsProxy"]),
-		NoProxy:        TransInterfaceToString(runtime["noProxy"]),
-		MaxIdleConns:   TransInterfaceToInt(runtime["maxIdleConns"]),
-		Socks5Proxy:    TransInterfaceToString(runtime["socks5Proxy"]),
-		Socks5NetWork:  TransInterfaceToString(runtime["socks5NetWork"]),
-	}
-	if runtime["listener"] != nil {
-		runtimeObject.Listener = runtime["listener"].(ProgressListener)
-	}
-	if runtime["tracker"] != nil {
-		runtimeObject.Tracker = runtime["tracker"].(*ReaderTracker)
-	}
-	if runtime["logger"] != nil {
-		runtimeObject.Logger = runtime["logger"].(*Logger)
-	}
-	return runtimeObject
-}
-
-// NewCastError is used for cast type fails
-func NewCastError(message string) (err error) {
-	return &CastError{
-		Message: message,
-	}
-}
-
-// NewRequest is used shortly create Request
-func NewRequest() (req *Request) {
-	return &Request{
-		Headers: map[string]string{},
-		Query:   map[string]string{},
-	}
-}
-
-// NewResponse is create response with http response
-func NewResponse(httpResponse *http.Response) (res *Response) {
-	res = &Response{}
-	res.Body = httpResponse.Body
-	res.Headers = make(map[string]string)
-	res.StatusCode = httpResponse.StatusCode
-	res.StatusMessage = httpResponse.Status
-	return
-}
-
-// NewSDKError is used for shortly create SDKError object
-func NewSDKError(obj map[string]interface{}) *SDKError {
-	err := &SDKError{}
-	if val, ok := obj["code"].(int); ok {
-		err.Code = strconv.Itoa(val)
-	} else if val, ok := obj["code"].(string); ok {
-		err.Code = val
-	}
-
-	if obj["message"] != nil {
-		err.Message = obj["message"].(string)
-	}
-	if data := obj["data"]; data != nil {
-		byt, _ := json.Marshal(data)
-		err.Data = string(byt)
-	}
-	return err
-}
-
-// Return message of CastError
-func (err *CastError) Error() string {
-	return err.Message
-}
-
-// Convert is use convert map[string]interface object to struct
-func Convert(in interface{}, out interface{}) error {
-	byt, _ := json.Marshal(in)
-	err := json.Unmarshal(byt, out)
-	return err
-}
-
-// ReadBody is used read response body
-func (response *Response) ReadBody() (body []byte, err error) {
-	defer response.Body.Close()
-	var buffer [512]byte
-	result := bytes.NewBuffer(nil)
-
-	for {
-		n, err := response.Body.Read(buffer[0:])
-		result.Write(buffer[0:n])
-		if err != nil && err == io.EOF {
-			break
-		} else if err != nil {
-			return nil, err
-		}
-	}
-	return result.Bytes(), nil
-}
-
-func getTeaClient(tag string) *teaClient {
-	client, ok := clientPool.Load(tag)
-	if client == nil && !ok {
-		client = &teaClient{
-			httpClient: &http.Client{},
-			ifInit:     false,
-		}
-		clientPool.Store(tag, client)
-	}
-	return client.(*teaClient)
-}
-
-// DoRequest is used send request to server
-func DoRequest(request *Request, requestRuntime map[string]interface{}) (response *Response, err error) {
-	runtimeObject := NewRuntimeObject(requestRuntime)
-	fieldMap := make(map[string]string)
-	InitLogMsg(fieldMap)
-	defer func() {
-		if runtimeObject.Logger != nil {
-			runtimeObject.Logger.PrintLog(fieldMap, err)
-		}
-	}()
-	if request.Method == "" {
-		request.Method = "GET"
-	}
-
-	if request.Protocol == "" {
-		request.Protocol = "http"
-	} else {
-		request.Protocol = strings.ToLower(request.Protocol)
-	}
-
-	if request.Protocol == "http" {
-		request.Port = 80
-	} else if request.Protocol == "https" {
-		request.Port = 443
-	}
-
-	requestURL := ""
-	request.Domain = request.Headers["host"]
-	matched, _ := regexp.MatchString(":", request.Domain)
-	if matched {
-		requestURL = fmt.Sprintf("%s://%s%s", request.Protocol, request.Domain, request.Pathname)
-	} else {
-		requestURL = fmt.Sprintf("%s://%s:%d%s", request.Protocol, request.Domain, request.Port, request.Pathname)
-	}
-	queryParams := request.Query
-	// sort QueryParams by key
-	q := url.Values{}
-	for key, value := range queryParams {
-		q.Add(key, value)
-	}
-	querystring := q.Encode()
-	if len(querystring) > 0 {
-		if strings.Contains(requestURL, "?") {
-			requestURL = fmt.Sprintf("%s&%s", requestURL, querystring)
-		} else {
-			requestURL = fmt.Sprintf("%s?%s", requestURL, querystring)
-		}
-	}
-	debugLog("> %s %s", request.Method, requestURL)
-
-	httpRequest, err := http.NewRequest(request.Method, requestURL, request.Body)
-	if err != nil {
-		return
-	}
-	httpRequest.Host = request.Domain
-
-	client := getTeaClient(runtimeObject.getClientTag(request.Domain))
-	client.Lock()
-	if !client.ifInit {
-		trans, err := getHttpTransport(request, runtimeObject)
-		if err != nil {
-			return nil, err
-		}
-		client.httpClient.Timeout = time.Duration(runtimeObject.ConnectTimeout) * time.Second
-		client.httpClient.Transport = trans
-		client.ifInit = true
-	}
-	client.Unlock()
-	for key, value := range request.Headers {
-		if value == "" || key == "content-length" {
-			continue
-		} else if key == "host" {
-			httpRequest.Header["Host"] = []string{value}
-		} else {
-			httpRequest.Header[key] = []string{value}
-		}
-		debugLog("> %s: %s", key, value)
-	}
-	contentlength, _ := strconv.Atoi(request.Headers["content-length"])
-	event := NewProgressEvent(TransferStartedEvent, 0, int64(contentlength), 0)
-	PublishProgress(runtimeObject.Listener, event)
-
-	putMsgToMap(fieldMap, httpRequest)
-	startTime := time.Now()
-	fieldMap["{start_time}"] = startTime.Format("2006-01-02 15:04:05")
-	res, err := hookDo(client.httpClient.Do)(httpRequest)
-	fieldMap["{cost}"] = time.Since(startTime).String()
-	completedBytes := int64(0)
-	if runtimeObject.Tracker != nil {
-		completedBytes = runtimeObject.Tracker.CompletedBytes
-	}
-	if err != nil {
-		event = NewProgressEvent(TransferFailedEvent, completedBytes, int64(contentlength), 0)
-		PublishProgress(runtimeObject.Listener, event)
-		return
-	}
-
-	event = NewProgressEvent(TransferCompletedEvent, completedBytes, int64(contentlength), 0)
-	PublishProgress(runtimeObject.Listener, event)
-
-	response = NewResponse(res)
-	fieldMap["{code}"] = strconv.Itoa(res.StatusCode)
-	fieldMap["{res_headers}"] = TransToString(res.Header)
-	debugLog("< HTTP/1.1 %s", res.Status)
-	for key, value := range res.Header {
-		debugLog("< %s: %s", key, strings.Join(value, ""))
-		if len(value) != 0 {
-			response.Headers[strings.ToLower(key)] = value[0]
-		}
-	}
-	return
-}
-
-func getHttpTransport(req *Request, runtime *RuntimeObject) (*http.Transport, error) {
-	trans := new(http.Transport)
-	httpProxy, err := getHttpProxy(req.Protocol, req.Domain, runtime)
-	if err != nil {
-		return nil, err
-	}
-	trans.TLSClientConfig = &tls.Config{
-		InsecureSkipVerify: runtime.IgnoreSSL,
-	}
-	if httpProxy != nil {
-		trans.Proxy = http.ProxyURL(httpProxy)
-		if httpProxy.User != nil {
-			password, _ := httpProxy.User.Password()
-			auth := httpProxy.User.Username() + ":" + password
-			basic := "Basic " + base64.StdEncoding.EncodeToString([]byte(auth))
-			req.Headers["Proxy-Authorization"] = basic
-		}
-	}
-	if runtime.Socks5Proxy != "" {
-		socks5Proxy, err := getSocks5Proxy(runtime)
-		if err != nil {
-			return nil, err
-		}
-		if socks5Proxy != nil {
-			var auth *proxy.Auth
-			if socks5Proxy.User != nil {
-				password, _ := socks5Proxy.User.Password()
-				auth = &proxy.Auth{
-					User:     socks5Proxy.User.Username(),
-					Password: password,
-				}
-			}
-			dialer, err := proxy.SOCKS5(strings.ToLower(runtime.Socks5NetWork), socks5Proxy.String(), auth,
-				&net.Dialer{
-					Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-					DualStack: true,
-					LocalAddr: getLocalAddr(runtime.LocalAddr, req.Port),
-				})
-			if err != nil {
-				return nil, err
-			}
-			trans.Dial = dialer.Dial
-		}
-	} else {
-		trans.DialContext = setDialContext(runtime, req.Port)
-	}
-	return trans, nil
-}
-
-func TransToString(object interface{}) string {
-	byt, _ := json.Marshal(object)
-	return string(byt)
-}
-
-func putMsgToMap(fieldMap map[string]string, request *http.Request) {
-	fieldMap["{host}"] = request.Host
-	fieldMap["{method}"] = request.Method
-	fieldMap["{uri}"] = request.URL.RequestURI()
-	fieldMap["{pid}"] = strconv.Itoa(os.Getpid())
-	fieldMap["{version}"] = strings.Split(request.Proto, "/")[1]
-	hostname, _ := os.Hostname()
-	fieldMap["{hostname}"] = hostname
-	fieldMap["{req_headers}"] = TransToString(request.Header)
-	fieldMap["{target}"] = request.URL.Path + request.URL.RawQuery
-}
-
-func getNoProxy(protocol string, runtime *RuntimeObject) []string {
-	var urls []string
-	if runtime.NoProxy != "" {
-		urls = strings.Split(runtime.NoProxy, ",")
-	} else if rawurl := os.Getenv("NO_PROXY"); rawurl != "" {
-		urls = strings.Split(rawurl, ",")
-	} else if rawurl := os.Getenv("no_proxy"); rawurl != "" {
-		urls = strings.Split(rawurl, ",")
-	}
-
-	return urls
-}
-
-func ToReader(obj interface{}) io.Reader {
-	switch obj.(type) {
-	case string:
-		return strings.NewReader(obj.(string))
-	case []byte:
-		return strings.NewReader(string(obj.([]byte)))
-	case io.Reader:
-		return obj.(io.Reader)
-	default:
-		panic("Invalid Body. Please set a valid Body.")
-	}
-}
-
-func ToString(val interface{}) string {
-	return fmt.Sprintf("%v", val)
-}
-
-func getHttpProxy(protocol, host string, runtime *RuntimeObject) (proxy *url.URL, err error) {
-	urls := getNoProxy(protocol, runtime)
-	for _, url := range urls {
-		if url == host {
-			return nil, nil
-		}
-	}
-	if protocol == "https" {
-		if runtime.HttpsProxy != "" {
-			proxy, err = url.Parse(runtime.HttpsProxy)
-		} else if rawurl := os.Getenv("HTTPS_PROXY"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		} else if rawurl := os.Getenv("https_proxy"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		}
-	} else {
-		if runtime.HttpProxy != "" {
-			proxy, err = url.Parse(runtime.HttpProxy)
-		} else if rawurl := os.Getenv("HTTP_PROXY"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		} else if rawurl := os.Getenv("http_proxy"); rawurl != "" {
-			proxy, err = url.Parse(rawurl)
-		}
-	}
-
-	return proxy, err
-}
-
-func getSocks5Proxy(runtime *RuntimeObject) (proxy *url.URL, err error) {
-	if runtime.Socks5Proxy != "" {
-		proxy, err = url.Parse(runtime.Socks5Proxy)
-	}
-	return proxy, err
-}
-
-func getLocalAddr(localAddr string, port int) (addr *net.TCPAddr) {
-	if localAddr != "" {
-		addr = &net.TCPAddr{
-			Port: port,
-			IP:   []byte(localAddr),
-		}
-	}
-	return addr
-}
-
-func setDialContext(runtime *RuntimeObject, port int) func(cxt context.Context, net, addr string) (c net.Conn, err error) {
-	return func(ctx context.Context, network, address string) (net.Conn, error) {
-		if runtime.LocalAddr != "" {
-			netAddr := &net.TCPAddr{
-				Port: port,
-				IP:   []byte(runtime.LocalAddr),
-			}
-			return (&net.Dialer{
-				Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-				DualStack: true,
-				LocalAddr: netAddr,
-			}).DialContext(ctx, network, address)
-		}
-		return (&net.Dialer{
-			Timeout:   time.Duration(runtime.ConnectTimeout) * time.Second,
-			DualStack: true,
-		}).DialContext(ctx, network, address)
-	}
-}
-
-func (err *SDKError) Error() string {
-	return fmt.Sprintf("SDKError: %s %s %s", err.Code, err.Message, err.Data)
-}
-
-func ToObject(obj interface{}) map[string]interface{} {
-	result := make(map[string]interface{})
-	byt, _ := json.Marshal(obj)
-	err := json.Unmarshal(byt, &result)
-	if err != nil {
-		return nil
-	}
-	return result
-}
-
-func AllowRetry(retry interface{}, retryTimes int) bool {
-	if retryTimes == 0 {
-		return true
-	}
-	retryMap, ok := retry.(map[string]interface{})
-	if !ok {
-		return false
-	}
-	retryable, ok := retryMap["retryable"].(bool)
-	if !ok || !retryable {
-		return false
-	}
-
-	maxAttempts, ok := retryMap["maxAttempts"].(int)
-	if !ok || maxAttempts < retryTimes {
-		return false
-	}
-	return true
-}
-
-func Merge(args ...interface{}) map[string]string {
-	finalArg := make(map[string]string)
-	for _, obj := range args {
-		switch obj.(type) {
-		case map[string]string:
-			arg := obj.(map[string]string)
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		default:
-			byt, _ := json.Marshal(obj)
-			arg := make(map[string]string)
-			err := json.Unmarshal(byt, &arg)
-			if err != nil {
-				return finalArg
-			}
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		}
-	}
-
-	return finalArg
-}
-
-func isNil(a interface{}) bool {
-	defer func() {
-		recover()
-	}()
-	vi := reflect.ValueOf(a)
-	return vi.IsNil()
-}
-
-func ToMap(args ...interface{}) map[string]interface{} {
-	isNotNil := false
-	finalArg := make(map[string]interface{})
-	for _, obj := range args {
-		if obj == nil {
-			continue
-		}
-
-		if isNil(obj) {
-			continue
-		}
-		isNotNil = true
-
-		switch obj.(type) {
-		case map[string]string:
-			arg := obj.(map[string]string)
-			for key, value := range arg {
-				if value != "" {
-					finalArg[key] = value
-				}
-			}
-		case map[string]interface{}:
-			arg := obj.(map[string]interface{})
-			for key, value := range arg {
-				if value != nil {
-					finalArg[key] = value
-				}
-			}
-		case string:
-			str := obj.(string)
-			arg := make(map[string]interface{})
-			err := json.Unmarshal([]byte(str), &arg)
-			if err == nil {
-				for key, value := range arg {
-					if value != nil {
-						finalArg[key] = value
-					}
-				}
-			}
-			tmp := make(map[string]string)
-			err = json.Unmarshal([]byte(str), &tmp)
-			if err == nil {
-				for key, value := range arg {
-					if value != "" {
-						finalArg[key] = value
-					}
-				}
-			}
-		case []byte:
-			byt := obj.([]byte)
-			arg := make(map[string]interface{})
-			err := json.Unmarshal(byt, &arg)
-			if err == nil {
-				for key, value := range arg {
-					if value != nil {
-						finalArg[key] = value
-					}
-				}
-				break
-			}
-		default:
-			val := reflect.ValueOf(obj)
-			res := structToMap(val)
-			for key, value := range res {
-				if value != nil {
-					finalArg[key] = value
-				}
-			}
-		}
-	}
-
-	if !isNotNil {
-		return nil
-	}
-	return finalArg
-}
-
-func structToMap(dataValue reflect.Value) map[string]interface{} {
-	out := make(map[string]interface{})
-	if !dataValue.IsValid() {
-		return out
-	}
-	if dataValue.Kind().String() == "ptr" {
-		dataValue = dataValue.Elem()
-	}
-	if !dataValue.IsValid() {
-		return out
-	}
-	dataType := dataValue.Type()
-	if dataType.Kind().String() != "struct" {
-		return out
-	}
-	for i := 0; i < dataType.NumField(); i++ {
-		field := dataType.Field(i)
-		name, containsNameTag := field.Tag.Lookup("json")
-		if !containsNameTag {
-			name = field.Name
-		}
-		fieldValue := dataValue.FieldByName(field.Name)
-		if !fieldValue.IsValid() {
-			continue
-		}
-		if field.Type.Kind().String() == "struct" {
-			out[name] = structToMap(fieldValue)
-		} else if field.Type.Kind().String() == "ptr" &&
-			field.Type.Elem().Kind().String() == "struct" {
-			if fieldValue.Elem().IsValid() {
-				out[name] = structToMap(fieldValue)
-			}
-		} else if field.Type.Kind().String() == "ptr" {
-			if fieldValue.IsValid() && !fieldValue.IsNil() {
-				out[name] = fieldValue.Elem().Interface()
-			}
-		} else if field.Type.Kind().String() == "slice" {
-			tmp := make([]interface{}, 0)
-			num := fieldValue.Len()
-			for i := 0; i < num; i++ {
-				value := fieldValue.Index(i)
-				if !value.IsValid() {
-					continue
-				}
-				if value.Type().Kind().String() == "ptr" &&
-					value.Type().Elem().Kind().String() == "struct" {
-					if value.IsValid() && !value.IsNil() {
-						tmp = append(tmp, structToMap(value))
-					}
-				} else if value.Type().Kind().String() == "struct" {
-					tmp = append(tmp, structToMap(value))
-				} else if value.Type().Kind().String() == "ptr" {
-					if value.IsValid() && !value.IsNil() {
-						tmp = append(tmp, value.Elem().Interface())
-					}
-				} else {
-					tmp = append(tmp, value.Interface())
-				}
-			}
-			if len(tmp) > 0 {
-				out[name] = tmp
-			}
-		} else {
-			out[name] = fieldValue.Interface()
-		}
-
-	}
-	return out
-}
-
-func Retryable(err error) bool {
-	if err == nil {
-		return false
-	}
-	if realErr, ok := err.(*SDKError); ok {
-		code, err := strconv.Atoi(realErr.Code)
-		if err != nil {
-			return true
-		}
-		return code >= http.StatusInternalServerError
-	}
-	return true
-}
-
-func GetBackoffTime(backoff interface{}, retrytimes int) int {
-	backoffMap, ok := backoff.(map[string]interface{})
-	if !ok {
-		return 0
-	}
-	policy, ok := backoffMap["policy"].(string)
-	if !ok || policy == "no" {
-		return 0
-	}
-
-	period, ok := backoffMap["period"].(int)
-	if !ok || period == 0 {
-		return 0
-	}
-
-	maxTime := math.Pow(2.0, float64(retrytimes))
-	return rand.Intn(int(maxTime-1)) * period
-}
-
-func Sleep(backoffTime int) {
-	sleeptime := time.Duration(backoffTime) * time.Second
-	time.Sleep(sleeptime)
-}
-
-func Validate(params interface{}) error {
-	requestValue := reflect.ValueOf(params).Elem()
-	err := validate(requestValue)
-	return err
-}
-
-// Verify whether the parameters meet the requirements
-func validate(dataValue reflect.Value) error {
-	if strings.HasPrefix(dataValue.Type().String(), "*") { // Determines whether the input is a structure object or a pointer object
-		if dataValue.IsNil() {
-			return nil
-		}
-		dataValue = dataValue.Elem()
-	}
-	dataType := dataValue.Type()
-	for i := 0; i < dataType.NumField(); i++ {
-		field := dataType.Field(i)
-		valueField := dataValue.Field(i)
-		for _, value := range validateParams {
-			err := validateParam(field, valueField, value)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-func validateParam(field reflect.StructField, valueField reflect.Value, tagName string) error {
-	tag, containsTag := field.Tag.Lookup(tagName) // Take out the checked regular expression
-	if containsTag && tagName == "require" {
-		err := checkRequire(field, valueField)
-		if err != nil {
-			return err
-		}
-	}
-	if strings.HasPrefix(field.Type.String(), "[]") { // Verify the parameters of the array type
-		err := validateSlice(valueField, containsTag, tag, tagName)
-		if err != nil {
-			return err
-		}
-	} else if valueField.Kind() == reflect.Ptr { // Determines whether it is a pointer object
-		err := validatePtr(valueField, containsTag, tag, tagName)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func validateSlice(valueField reflect.Value, containsregexpTag bool, tag, tagName string) error {
-	if valueField.IsValid() && !valueField.IsNil() { // Determines whether the parameter has a value
-		for m := 0; m < valueField.Len(); m++ {
-			elementValue := valueField.Index(m)
-			if elementValue.Type().Kind() == reflect.Ptr { // Determines whether the child elements of an array are of a basic type
-				err := validatePtr(elementValue, containsregexpTag, tag, tagName)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	return nil
-}
-
-func validatePtr(elementValue reflect.Value, containsregexpTag bool, tag, tagName string) error {
-	if elementValue.IsNil() {
-		return nil
-	}
-
-	if isFilterType(elementValue.Elem().Type().String(), basicTypes) {
-		if containsregexpTag {
-			if tagName == "pattern" {
-				err := checkPattern(elementValue.Elem(), tag)
-				if err != nil {
-					return err
-				}
-			}
-
-			if tagName == "maxLength" {
-				err := checkMaxLength(elementValue.Elem(), tag)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	} else {
-		err := validate(elementValue)
-		if err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func checkRequire(field reflect.StructField, valueField reflect.Value) error {
-	name, _ := field.Tag.Lookup("json")
-	if !valueField.IsNil() && valueField.IsValid() {
-		return nil
-	}
-	return errors.New(name + " should be setted")
-}
-
-func checkPattern(valueField reflect.Value, tag string) error {
-	if valueField.IsValid() && valueField.String() != "" {
-		value := valueField.String()
-		if match, _ := regexp.MatchString(tag, value); !match { // Determines whether the parameter value satisfies the regular expression or not, and throws an error
-			return errors.New(value + " is not matched " + tag)
-		}
-	}
-	return nil
-}
-
-func checkMaxLength(valueField reflect.Value, tag string) error {
-	if valueField.IsValid() && valueField.String() != "" {
-		maxLength, err := strconv.Atoi(tag)
-		if err != nil {
-			return err
-		}
-		length := valueField.Len()
-		if valueField.Kind().String() == "string" {
-			length = strings.Count(valueField.String(), "") - 1
-		}
-		if maxLength < length {
-			errMsg := fmt.Sprintf("Length of %s is more than %d", valueField.String(), maxLength)
-			return errors.New(errMsg)
-		}
-	}
-	return nil
-}
-
-// Determines whether realType is in filterTypes
-func isFilterType(realType string, filterTypes []string) bool {
-	for _, value := range filterTypes {
-		if value == realType {
-			return true
-		}
-	}
-	return false
-}
-
-func TransInterfaceToBool(val interface{}) bool {
-	if val == nil {
-		return false
-	}
-
-	return val.(bool)
-}
-
-func TransInterfaceToInt(val interface{}) int {
-	if val == nil {
-		return 0
-	}
-
-	return val.(int)
-}
-
-func TransInterfaceToString(val interface{}) string {
-	if val == nil {
-		return ""
-	}
-
-	return val.(string)
-}
-
-func Prettify(i interface{}) string {
-	resp, _ := json.MarshalIndent(i, "", "   ")
-	return string(resp)
-}

+ 0 - 44
vendor/alipaysdk/easysdk/go/src/tea/utils.go

@@ -1,44 +0,0 @@
-package tea
-
-
-import (
-	"reflect"
-	"strings"
-	"testing"
-)
-
-func containsKind(kinds []reflect.Kind, kind reflect.Kind) bool {
-	for i := 0; i < len(kinds); i++ {
-		if kind == kinds[i] {
-			return true
-		}
-	}
-
-	return false
-}
-
-func AssertEqual(t *testing.T, a, b interface{}) {
-	if !reflect.DeepEqual(a, b) {
-		t.Errorf("%v != %v", a, b)
-	}
-}
-
-func AssertNil(t *testing.T, object interface{}) {
-	if !isNil(object) {
-		t.Errorf("%v is not nil", object)
-	}
-}
-
-func AssertNotNil(t *testing.T, object interface{}) {
-	if isNil(object) {
-		t.Errorf("%v is nil", object)
-	}
-}
-
-func AssertContains(t *testing.T, contains string, msgAndArgs ...string) {
-	for _, value := range msgAndArgs {
-		if ok := strings.Contains(contains, value); !ok {
-			t.Errorf("%s does not contain %s", contains, value)
-		}
-	}
-}

+ 0 - 46
vendor/alipaysdk/easysdk/go/src/test/main.go

@@ -1,46 +0,0 @@
-package main
-
-import (
-	"encoding/json"
-	"fmt"
-	"kernel"
-	"time"
-)
-
-func init() {
-	account:= kernel.Client{}
-	account.Protocol = "https"
-	account.GatewayHost = "openapi.alipay.com"
-	account.AppId = "<-- 请填写您的AppId,例如:2019022663440152 -->"
-	account.SignType = "RSA2"
-	account.AlipayPublicKey = "<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->"
-	account.MerchantPrivateKey = "<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->"
-
-	kernel.InitClient(account)
-}
-
-
-func main() {
-	result, _ := kernel.Execute("alipay.trade.create", nil, getBizParams(time.Now().Format("2006-01-02 15:04:05")))
-	fmt.Println(result)
-}
-
-func getBizParams(outTradeNo string) map[string]string {
-	bizParams := map[string]string{
-		"subject":       "phone6 16G",
-		"out_trade_no":  outTradeNo,
-		"total_amount":  "0.10",
-		"buyer_id":      "2088002656718920",
-		"extend_params": getHuabeiParams(),
-	}
-	return bizParams
-}
-
-func getHuabeiParams() string {
-	extendParams := map[string]string{
-		"hb_fq_num":            "3",
-		"hb_fq_seller_percent": "3",
-	}
-	byt, _ := json.Marshal(extendParams)
-	return string(byt)
-}

+ 1 - 1
vendor/alipaysdk/easysdk/java/pom.xml

@@ -3,7 +3,7 @@
   <modelVersion>4.0.0</modelVersion>
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.alipay.sdk</groupId>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-easysdk</artifactId>
   <artifactId>alipay-easysdk</artifactId>
-  <version>2.2.1</version>
+  <version>2.2.2</version>
   <name>Alipay Easy SDK</name>
   <name>Alipay Easy SDK</name>
   <url>https://open.alipay.com</url>
   <url>https://open.alipay.com</url>
   <description>Alipay Easy SDK for Java
   <description>Alipay Easy SDK for Java

+ 1 - 29
vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/Factory.java

@@ -11,8 +11,6 @@ import com.alipay.easysdk.kms.aliyun.AliyunKMSClient;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.aliyun.tea.TeaModel;
 import com.aliyun.tea.TeaModel;
 
 
-import java.lang.reflect.Constructor;
-
 /**
 /**
  * 客户端工厂,用于快速配置和访问各种场景下的API Client
  * 客户端工厂,用于快速配置和访问各种场景下的API Client
  *
  *
@@ -23,7 +21,7 @@ import java.lang.reflect.Constructor;
  */
  */
 public class Factory {
 public class Factory {
 
 
-    public static final String SDK_VERSION = "alipay-easysdk-java-2.1.2";
+    public static final String SDK_VERSION = "alipay-easysdk-java-2.2.2";
 
 
     /**
     /**
      * 将一些初始化耗时较多的信息缓存在上下文中
      * 将一些初始化耗时较多的信息缓存在上下文中
@@ -49,32 +47,6 @@ public class Factory {
     }
     }
 
 
     /**
     /**
-     * 获取调用OpenAPI所需的客户端实例
-     * 本方法用于调用SDK扩展包中的API Client下的方法
-     *
-     * 注:返回的实例不可重复使用,只可用于单次调用
-     *
-     * @param client API Client的类型对象
-     * @return client实例,用于发起单次调用
-     */
-    public static <T> T getClient(Class<T> client) {
-        try {
-            Constructor<T> constructor = client.getConstructor(Client.class);
-            context.setSdkVersion(getSdkVersion(client));
-            return constructor.newInstance(new Client(context));
-        } catch (Exception e) {
-            throw new RuntimeException("" + e.getMessage(), e);
-        }
-    }
-
-    private static <T> String getSdkVersion(Class<T> client) {
-        return context.getSdkVersion() + "-" + client.getCanonicalName()
-                .replace("com.alipay.easysdk.", "")
-                .replace(".Client", "")
-                .replace(".", "-");
-    }
-
-    /**
      * 支付能力相关
      * 支付能力相关
      */
      */
     public static class Payment {
     public static class Payment {

+ 1 - 29
vendor/alipaysdk/easysdk/java/src/main/java/com/alipay/easysdk/factory/MultipleFactory.java

@@ -12,15 +12,13 @@ import com.alipay.easysdk.kms.aliyun.AliyunKMSClient;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.alipay.easysdk.kms.aliyun.AliyunKMSSigner;
 import com.aliyun.tea.TeaModel;
 import com.aliyun.tea.TeaModel;
 
 
-import java.lang.reflect.Constructor;
-
 /**
 /**
  * @author junying
  * @author junying
  * @version : MultipleFactory.java, v 0.1 2020年12月23日 2:14 下午 junying Exp $
  * @version : MultipleFactory.java, v 0.1 2020年12月23日 2:14 下午 junying Exp $
  */
  */
 public class MultipleFactory {
 public class MultipleFactory {
 
 
-    public final String SDK_VERSION = "alipay-easysdk-java-2.1.2";
+    public final String SDK_VERSION = "alipay-easysdk-java-2.2.2";
 
 
     /**
     /**
      * 将一些初始化耗时较多的信息缓存在上下文中
      * 将一些初始化耗时较多的信息缓存在上下文中
@@ -46,32 +44,6 @@ public class MultipleFactory {
     }
     }
 
 
     /**
     /**
-     * 获取调用OpenAPI所需的客户端实例
-     * 本方法用于调用SDK扩展包中的API Client下的方法
-     * <p>
-     * 注:返回的实例不可重复使用,只可用于单次调用
-     *
-     * @param client API Client的类型对象
-     * @return client实例,用于发起单次调用
-     */
-    public <T> T getClient(Class<T> client) {
-        try {
-            Constructor<T> constructor = client.getConstructor(Client.class);
-            context.setSdkVersion(getSdkVersion(client));
-            return constructor.newInstance(new Client(context));
-        } catch (Exception e) {
-            throw new RuntimeException("" + e.getMessage(), e);
-        }
-    }
-
-    private <T> String getSdkVersion(Class<T> client) {
-        return context.getSdkVersion() + "-" + client.getCanonicalName()
-                .replace("com.alipay.easysdk.", "")
-                .replace(".Client", "")
-                .replace(".", "-");
-    }
-
-    /**
      * 获取支付通用API Client
      * 获取支付通用API Client
      *
      *
      * @return 支付通用API Client
      * @return 支付通用API Client

+ 0 - 32
vendor/alipaysdk/easysdk/java/src/test/java/com/alipay/easysdk/factory/FactoryTest.java

@@ -1,32 +0,0 @@
-package com.alipay.easysdk.factory;
-
-import com.alipay.easysdk.TestAccount.Mini;
-import com.alipay.easysdk.payment.common.Client;
-import com.alipay.easysdk.payment.common.models.AlipayTradeRefundResponse;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-public class FactoryTest {
-    @Before
-    public void setUp() {
-        Factory.setOptions(Mini.CONFIG);
-    }
-
-    @Test
-    public void testGetClient() throws Exception {
-        AlipayTradeRefundResponse response = Factory.getClient(Client.class).refund(
-                "64628156-f784-4572-9540-485b7c91b850", "0.01");
-
-        assertThat(response.code, is("10000"));
-        assertThat(response.msg, is("Success"));
-        assertThat(response.subCode, is(nullValue()));
-        assertThat(response.subMsg, is(nullValue()));
-        assertThat(response.httpBody, not(nullValue()));
-        assertThat(response.refundFee, is("0.01"));
-    }
-}

+ 1 - 1
vendor/alipaysdk/easysdk/php/src/Kernel/AlipayConstants.php

@@ -28,7 +28,7 @@ class AlipayConstants
     const METHOD_FIELD         = "method";
     const METHOD_FIELD         = "method";
     const RESPONSE_SUFFIX      = "_response";
     const RESPONSE_SUFFIX      = "_response";
     const ERROR_RESPONSE       = "error_response";
     const ERROR_RESPONSE       = "error_response";
-    const SDK_VERSION          = "alipay-easysdk-php-2.2.0";
+    const SDK_VERSION          = "alipay-easysdk-php-2.2.2";
 
 
     /**
     /**
      * 默认字符集编码,EasySDK统一固定使用UTF-8编码,无需用户感知编码,用户面对的总是String而不是bytes
      * 默认字符集编码,EasySDK统一固定使用UTF-8编码,无需用户感知编码,用户面对的总是String而不是bytes

+ 1 - 2
vendor/alipaysdk/easysdk/php/src/Payment/Page/Client.php

@@ -23,8 +23,7 @@ class Client {
      */
      */
     public function pay($subject, $outTradeNo, $totalAmount, $returnUrl){
     public function pay($subject, $outTradeNo, $totalAmount, $returnUrl){
         $systemParams = [
         $systemParams = [
-            //"method" => "alipay.trade.page.pay",
-            "method" => "alipay.trade.wap.pay",
+            "method" => "alipay.trade.page.pay",
             "app_id" => $this->_kernel->getConfig("appId"),
             "app_id" => $this->_kernel->getConfig("appId"),
             "timestamp" => $this->_kernel->getTimestamp(),
             "timestamp" => $this->_kernel->getTimestamp(),
             "format" => "json",
             "format" => "json",

+ 5 - 0
vendor/aliyuncs/oss-sdk-php/CHANGELOG.md

@@ -1,5 +1,10 @@
 # ChangeLog - Aliyun OSS SDK for PHP
 # ChangeLog - Aliyun OSS SDK for PHP
 
 
+## v2.5.0 / 2022-05-13
+* Added: support bucket transfer acceleration.
+* Added: support bucket cname token.
+* Added: support listobjectsV2.
+
 ## v2.4.3 / 2021-08-25
 ## v2.4.3 / 2021-08-25
 * Fixed: integer overflow in PHP5.x.
 * Fixed: integer overflow in PHP5.x.
 
 

+ 86 - 0
vendor/aliyuncs/oss-sdk-php/samples/Bucket.php

@@ -18,6 +18,24 @@ Common::println("bucket $bucket created");
 $doesExist = $ossClient->doesBucketExist($bucket);
 $doesExist = $ossClient->doesBucketExist($bucket);
 Common::println("bucket $bucket exist? " . ($doesExist ? "yes" : "no"));
 Common::println("bucket $bucket exist? " . ($doesExist ? "yes" : "no"));
 
 
+// Get the region of bucket
+$regions = $ossClient->getBucketLocation($bucket);
+Common::println("bucket $bucket region: " .print_r($regions,true));
+
+// Get the meta of a bucket
+$metas  = $ossClient->getBucketMeta($bucket);
+Common::println("bucket $bucket meta: " .print_r($metas,true));
+
+// Get the info of bucket
+$info = $ossClient->getBucketInfo($bucket);
+Common::println("bucket name:".$info->getName()."\n");
+Common::println("bucket location:". $info->getLocation()."\n");
+Common::println("bucket creation time:".$info->getCreateDate()."\n");
+Common::println("bucket storage class:".$info->getStorageClass()."\n");
+Common::println("bucket extranet endpoint:".$info->getExtranetEndpoint()."\n");
+Common::println("bucket intranet endpoint:".$info->getIntranetEndpoint()."\n");
+
+
 // Get the bucket list
 // Get the bucket list
 $bucketListInfo = $ossClient->listBuckets();
 $bucketListInfo = $ossClient->listBuckets();
 
 
@@ -33,6 +51,9 @@ Common::println("bucket $bucket acl get: " . $acl);
 
 
 createBucket($ossClient, $bucket);
 createBucket($ossClient, $bucket);
 doesBucketExist($ossClient, $bucket);
 doesBucketExist($ossClient, $bucket);
+getBucketLocation($ossClient, $bucket);
+getBucketMeta($ossClient,$bucket);
+getBucketInfo($ossClient, $bucket);
 deleteBucket($ossClient, $bucket);
 deleteBucket($ossClient, $bucket);
 putBucketAcl($ossClient, $bucket);
 putBucketAcl($ossClient, $bucket);
 getBucketAcl($ossClient, $bucket);
 getBucketAcl($ossClient, $bucket);
@@ -83,6 +104,71 @@ function doesBucketExist($ossClient, $bucket)
 }
 }
 
 
 /**
 /**
+ * Get the info of bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketInfo($ossClient, $bucket)
+{
+	try {
+		$info = $ossClient->getBucketInfo($bucket);
+		printf("bucket name:%s\n", $info->getName());
+		printf("bucket location:%s\n", $info->getLocation());
+		printf("bucket creation time:%s\n", $info->getCreateDate());
+		printf("bucket storage class:%s\n", $info->getStorageClass());
+		printf("bucket extranet endpoint:%s\n", $info->getExtranetEndpoint());
+		printf("bucket intranet endpoint:%s\n", $info->getIntranetEndpoint());
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+
+/**
+ * Get the meta of a bucket
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketLocation($ossClient, $bucket)
+{
+	try {
+		$regions = $ossClient->getBucketLocation($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	
+	print("bucket $bucket region: " .print_r($regions,true));
+	
+}
+
+
+/**
+ *  Get the bucket's meta
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ */
+function getBucketMeta($ossClient, $bucket)
+{
+	try {
+		$metas = $ossClient->getBucketMeta($bucket);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+	print("bucket $bucket meta: " .print_r($metas,true));
+}
+
+/**
  * Delete a bucket. If the bucket is not empty, the deletion fails.
  * Delete a bucket. If the bucket is not empty, the deletion fails.
  * A bucket which is not empty indicates that it does not contain any objects or parts that are not completely uploaded during multipart upload
  * A bucket which is not empty indicates that it does not contain any objects or parts that are not completely uploaded during multipart upload
  *
  *

+ 211 - 0
vendor/aliyuncs/oss-sdk-php/samples/Object.php

@@ -3,6 +3,7 @@ require_once __DIR__ . '/Common.php';
 
 
 use OSS\OssClient;
 use OSS\OssClient;
 use OSS\Core\OssException;
 use OSS\Core\OssException;
+use OSS\Model\RestoreConfig;
 
 
 $bucket = Common::getBucketName();
 $bucket = Common::getBucketName();
 $ossClient = Common::getOssClient();
 $ossClient = Common::getOssClient();
@@ -48,6 +49,17 @@ $ossClient->getObject($bucket, "c.file", $options);
 Common::println("b.file is fetched to the local file: c.file.localcopy");
 Common::println("b.file is fetched to the local file: c.file.localcopy");
 Common::println("b.file is created");
 Common::println("b.file is created");
 
 
+
+// Restore Object
+$day = 3;
+$tier = 'Expedited';
+$config = new RestoreConfig($day,$tier);
+$options = array(
+	OssClient::OSS_RESTORE_CONFIG => $config
+);
+$ossClient->restoreObject($bucket, 'b.file',$options);
+
+
 // Copy an object
 // Copy an object
 $result = $ossClient->copyObject($bucket, "c.file", $bucket, "c.file.copy");
 $result = $ossClient->copyObject($bucket, "c.file", $bucket, "c.file.copy");
 Common::println("lastModifiedTime: " . $result[0]);
 Common::println("lastModifiedTime: " . $result[0]);
@@ -75,9 +87,37 @@ foreach($result as $object)
 sleep(2);
 sleep(2);
 unlink("c.file.localcopy");
 unlink("c.file.localcopy");
 
 
+// Normal upload and download speed limit
+$object= "b.file";
+$content = "hello world";
+
+// The speed limit is 100 KB/s, which is 819200 bit/s.
+$options = array(
+	OssClient::OSS_HEADERS => array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	));
+// Speed limit upload.
+$ossClient->putObject($bucket, $object, $content, $options);
+
+// Speed limit download.
+$ossClient->getObject($bucket, $object, $options);
+
+// Signed URL upload and download speed limit
+
+// Create a URL for uploading with a limited rate, and the validity period is 60s.
+$timeout = 60;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+Common::println("b.file speed limit upload url:".$signedUrl.PHP_EOL);
+
+// Create a URL for speed-limited downloads, with a validity period of 120s.
+$timeout = 120;
+$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+Common::println("b.file speed limit download url:".$signedUrl.PHP_EOL);
+
 //******************************* For complete usage, see the following functions ****************************************************
 //******************************* For complete usage, see the following functions ****************************************************
 
 
 listObjects($ossClient, $bucket);
 listObjects($ossClient, $bucket);
+listObjectsV2($ossClient, $bucket);
 listAllObjects($ossClient, $bucket);
 listAllObjects($ossClient, $bucket);
 createObjectDir($ossClient, $bucket);
 createObjectDir($ossClient, $bucket);
 putObject($ossClient, $bucket);
 putObject($ossClient, $bucket);
@@ -92,6 +132,11 @@ deleteObjects($ossClient, $bucket);
 doesObjectExist($ossClient, $bucket);
 doesObjectExist($ossClient, $bucket);
 getSymlink($ossClient, $bucket);
 getSymlink($ossClient, $bucket);
 putSymlink($ossClient, $bucket);
 putSymlink($ossClient, $bucket);
+putObjectSpeed($ossClient, $bucket);
+getObjectSpeed($ossClient, $bucket);
+signUrlSpeedUpload($ossClient, $bucket);
+signUrlSpeedDownload($ossClient, $bucket);
+restoreObject($ossClient,$bucket);
 /**
 /**
  * Create a 'virtual' folder
  * Create a 'virtual' folder
  *
  *
@@ -194,6 +239,10 @@ function listObjects($ossClient, $bucket)
         print("objectList:\n");
         print("objectList:\n");
         foreach ($objectList as $objectInfo) {
         foreach ($objectList as $objectInfo) {
             print($objectInfo->getKey() . "\n");
             print($objectInfo->getKey() . "\n");
+            if($objectInfo->getOwner() != null){
+                printf("owner id:".$objectInfo->getOwner()->getId() . "\n");
+                printf("owner name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+            }
         }
         }
     }
     }
     if (!empty($prefixList)) {
     if (!empty($prefixList)) {
@@ -205,6 +254,55 @@ function listObjects($ossClient, $bucket)
 }
 }
 
 
 /**
 /**
+ * Lists all files and folders in the bucket.
+ * Note if there's more items than the max-keys specified, the caller needs to use the nextMarker returned as the value for the next call's maker paramter.
+ * Loop through all the items returned from ListObjects.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function listObjectsV2($ossClient, $bucket)
+{
+	$prefix = 'oss-php-sdk-test/';
+	$delimiter = '/';
+	$maxkeys = 1000;
+	$options = array(
+		'delimiter' => $delimiter,
+		'prefix' => $prefix,
+		'max-keys' => $maxkeys,
+		'start-after' =>'test-object',
+		'fetch-owner' =>'true',
+	);
+	try {
+		$listObjectInfo = $ossClient->listObjectsV2($bucket, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+	$objectList = $listObjectInfo->getObjectList(); // object list
+	$prefixList = $listObjectInfo->getPrefixList(); // directory list
+	if (!empty($objectList)) {
+		print("objectList:\n");
+		foreach ($objectList as $objectInfo) {
+			print($objectInfo->getKey() . "\n");
+			if($objectInfo->getOwner() != null){
+				printf("owner id:".$objectInfo->getOwner()->getId() . "\n");
+				printf("owner name:".$objectInfo->getOwner()->getDisplayName() . "\n");
+			}
+		}
+	}
+	if (!empty($prefixList)) {
+		print("prefixList: \n");
+		foreach ($prefixList as $prefixInfo) {
+			print($prefixInfo->getPrefix() . "\n");
+		}
+	}
+}
+
+/**
  * Lists all folders and files under the bucket. Use nextMarker repeatedly to get all objects.
  * Lists all folders and files under the bucket. Use nextMarker repeatedly to get all objects.
  *
  *
  * @param OssClient $ossClient OssClient instance
  * @param OssClient $ossClient OssClient instance
@@ -516,3 +614,116 @@ function doesObjectExist($ossClient, $bucket)
     var_dump($exist);
     var_dump($exist);
 }
 }
 
 
+/**
+ * Speed limit upload.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function putObjectSpeed($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$content = file_get_contents(__FILE__);
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			OssClient::OSS_TRAFFIC_LIMIT => 819200,
+		));
+	try {
+		$ossClient->putObject($bucket, $object, $content, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function getObjectSpeed($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$options = array(
+		OssClient::OSS_HEADERS => array(
+			OssClient::OSS_TRAFFIC_LIMIT => 819200,
+		));
+	try {
+		$ossClient->getObject($bucket, $object, $options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedUpload($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$timeout = 120;
+	$options = array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	);
+	$timeout = 60;
+	$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "PUT", $options);
+	print($signedUrl);
+}
+
+
+/**
+ * Speed limit download.
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function signUrlSpeedDownload($ossClient, $bucket)
+{
+	$object = "upload-test-object-name.txt";
+	$timeout = 120;
+	$options = array(
+		OssClient::OSS_TRAFFIC_LIMIT => 819200,
+	);
+	$signedUrl = $ossClient->signUrl($bucket, $object, $timeout, "GET", $options);
+	print($signedUrl);
+	print(__FUNCTION__ . ": OK" . "\n");
+}
+
+/**
+ * Restore object
+ *
+ * @param OssClient $ossClient OssClient instance
+ * @param string $bucket bucket name
+ * @return null
+ */
+function restoreObject($ossClient, $bucket)
+{
+	$object = "oss-php-sdk-test/upload-test-object-name.txt";
+	$day = 3;
+	$tier = 'Expedited';
+	$config = new RestoreConfig($day,$tier);
+	$options = array(
+		OssClient::OSS_RESTORE_CONFIG => $config
+	);
+	try {
+		$ossClient->restoreObject($bucket, $object,$options);
+	} catch (OssException $e) {
+		printf(__FUNCTION__ . ": FAILED\n");
+		printf($e->getMessage() . "\n");
+		return;
+	}
+	print(__FUNCTION__ . ": OK" . "\n");
+}

+ 5 - 1
vendor/aliyuncs/oss-sdk-php/src/OSS/Core/OssUtil.php

@@ -31,7 +31,11 @@ class OssUtil
         uksort($options, 'strnatcasecmp');
         uksort($options, 'strnatcasecmp');
         foreach ($options as $key => $value) {
         foreach ($options as $key => $value) {
             if (is_string($key) && !is_array($value)) {
             if (is_string($key) && !is_array($value)) {
-                $temp[] = rawurlencode($key) . '=' . rawurlencode($value);
+                if (strlen($value) > 0) {
+                    $temp[] = rawurlencode($key) . '=' . rawurlencode($value);
+                } else {
+                    $temp[] = rawurlencode($key);
+                }
             }
             }
         }
         }
         return implode('&', $temp);
         return implode('&', $temp);

+ 19 - 20
vendor/aliyuncs/oss-sdk-php/src/OSS/Model/ObjectInfo.php

@@ -1,7 +1,6 @@
 <?php
 <?php
 
 
 namespace OSS\Model;
 namespace OSS\Model;
-
 /**
 /**
  *
  *
  * Class ObjectInfo
  * Class ObjectInfo
@@ -67,25 +66,25 @@ class ObjectInfo
     {
     {
         return $this->type;
         return $this->type;
     }
     }
-	
-	/**
-	 * php7 && 64bit can use it
-	 * @return int
-	 */
-	public function getSize()
-	{
-		return (int)$this->size;
-	}
-	
-	
-	/**
-	 * php5.x or 32bit must use it
-	 * @return string
-	 */
-	public function getSizeStr()
-	{
-		return $this->size;
-	}
+    
+    /**
+     * php7 && 64bit can use it
+     * @return int
+     */
+    public function getSize()
+    {
+        return (int)$this->size;
+    }
+    
+    
+    /**
+     * php5.x or 32bit must use it
+     * @return string
+     */
+    public function getSizeStr()
+    {
+        return $this->size;
+    }
     
     
     /**
     /**
      * @return string
      * @return string

+ 167 - 12
vendor/aliyuncs/oss-sdk-php/src/OSS/OssClient.php

@@ -12,6 +12,7 @@ use OSS\Model\LoggingConfig;
 use OSS\Model\LiveChannelConfig;
 use OSS\Model\LiveChannelConfig;
 use OSS\Model\LiveChannelInfo;
 use OSS\Model\LiveChannelInfo;
 use OSS\Model\LiveChannelListInfo;
 use OSS\Model\LiveChannelListInfo;
+use OSS\Model\ObjectListInfoV2;
 use OSS\Model\StorageCapacityConfig;
 use OSS\Model\StorageCapacityConfig;
 use OSS\Result\AclResult;
 use OSS\Result\AclResult;
 use OSS\Result\BodyResult;
 use OSS\Result\BodyResult;
@@ -29,6 +30,7 @@ use OSS\Result\ListBucketsResult;
 use OSS\Result\ListMultipartUploadResult;
 use OSS\Result\ListMultipartUploadResult;
 use OSS\Model\ListMultipartUploadInfo;
 use OSS\Model\ListMultipartUploadInfo;
 use OSS\Result\ListObjectsResult;
 use OSS\Result\ListObjectsResult;
+use OSS\Result\ListObjectsV2Result;
 use OSS\Result\ListPartsResult;
 use OSS\Result\ListPartsResult;
 use OSS\Result\PutSetDeleteResult;
 use OSS\Result\PutSetDeleteResult;
 use OSS\Result\DeleteObjectsResult;
 use OSS\Result\DeleteObjectsResult;
@@ -72,6 +74,11 @@ use OSS\Result\ListObjectVersionsResult;
 use OSS\Model\DeleteObjectInfo;
 use OSS\Model\DeleteObjectInfo;
 use OSS\Model\DeletedObjectInfo;
 use OSS\Model\DeletedObjectInfo;
 use OSS\Result\DeleteObjectVersionsResult;
 use OSS\Result\DeleteObjectVersionsResult;
+use OSS\Model\TransferAccelerationConfig;
+use OSS\Result\GetBucketTransferAccelerationResult;
+use OSS\Model\CnameTokenInfo;
+use OSS\Result\CreateBucketCnameTokenResult;
+use OSS\Result\GetBucketCnameTokenResult;
 
 
 /**
 /**
  * Class OssClient
  * Class OssClient
@@ -542,12 +549,12 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_OBJECT] = '/';
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $cnameConfig = new CnameConfig();
         $cnameConfig = new CnameConfig();
         $cnameConfig->addCname($cname);
         $cnameConfig->addCname($cname);
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_COMP] = 'add';
         $options[self::OSS_COMP] = 'add';
+        $options[self::OSS_CNAME] = '';
 
 
         $response = $this->auth($options);
         $response = $this->auth($options);
         $result = new PutSetDeleteResult($response);
         $result = new PutSetDeleteResult($response);
@@ -568,7 +575,7 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
         $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
         $options[self::OSS_OBJECT] = '/';
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
+        $options[self::OSS_CNAME] = '';
         $response = $this->auth($options);
         $response = $this->auth($options);
         $result = new GetCnameResult($response);
         $result = new GetCnameResult($response);
         return $result->getData();
         return $result->getData();
@@ -589,12 +596,12 @@ class OssClient
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_BUCKET] = $bucket;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
         $options[self::OSS_OBJECT] = '/';
         $options[self::OSS_OBJECT] = '/';
-        $options[self::OSS_SUB_RESOURCE] = 'cname';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $cnameConfig = new CnameConfig();
         $cnameConfig = new CnameConfig();
         $cnameConfig->addCname($cname);
         $cnameConfig->addCname($cname);
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
         $options[self::OSS_COMP] = 'delete';
         $options[self::OSS_COMP] = 'delete';
+        $options[self::OSS_CNAME] = '';
 
 
         $response = $this->auth($options);
         $response = $this->auth($options);
         $result = new PutSetDeleteResult($response);
         $result = new PutSetDeleteResult($response);
@@ -602,6 +609,52 @@ class OssClient
     }
     }
 
 
     /**
     /**
+     * create a cname token for a bucket
+     *
+     * @param string $bucket bucket name
+     * @param array $options
+     * @throws OssException
+     * @return CnameToken
+     */
+    public function createBucketCnameToken($bucket, $cname, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_POST;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $cnameConfig = new CnameConfig();
+        $cnameConfig->addCname($cname);
+        $options[self::OSS_CONTENT] = $cnameConfig->serializeToXml();
+        $options[self::OSS_COMP] = 'token';
+        $options[self::OSS_CNAME] = '';
+        $response = $this->auth($options);
+        $result = new CreateBucketCnameTokenResult($response);
+        return $result->getData();
+    }
+
+    /**
+     * get a cname token for a bucket
+     *
+     * @param string $bucket bucket name
+     * @param array $options
+     * @throws OssException
+     * @return CnameToken
+     */
+    public function getBucketCnameToken($bucket, $cname, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_COMP] = 'token';
+        $options[self::OSS_CNAME] = $cname;
+        $response = $this->auth($options);
+        $result = new GetBucketCnameTokenResult($response);
+        return $result->getData();
+    }
+
+    /**
      * Creates a Live Channel under a bucket
      * Creates a Live Channel under a bucket
      *
      *
      * @param string $bucket bucket name
      * @param string $bucket bucket name
@@ -1493,6 +1546,52 @@ class OssClient
         return $result->getData();
         return $result->getData();
     }
     }
 
 
+
+    /**
+     * Put Bucket TransferAcceleration
+     * @param $bucket
+     * @param $enabled boolean
+     * @param null $options
+     * @return null
+     * @throws OssException
+     */
+
+    public function putBucketTransferAcceleration($bucket,$enabled,$options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_PUT;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_SUB_RESOURCE] = 'transferAcceleration';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $config = new TransferAccelerationConfig();
+        $config->setEnabled($enabled);
+        $options[self::OSS_CONTENT] = $config->serializeToXml();
+        $response = $this->auth($options);
+        $result = new HeaderResult($response);
+        return $result->getData();
+    }
+
+    /**
+     * Put Bucket TransferAcceleration
+     * @param $bucket
+     * @param null $options
+     * @return enabled boolean
+     * @throws OssException
+     */
+    public function getBucketTransferAcceleration($bucket,$options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $options[self::OSS_SUB_RESOURCE] = 'transferAcceleration';
+        $options[self::OSS_CONTENT_TYPE] = 'application/xml';
+        $response = $this->auth($options);
+        $result = new GetBucketTransferAccelerationResult($response);
+        return $result->getData();
+    }
+
     /**
     /**
      * Lists the bucket's object list (in ObjectListInfo)
      * Lists the bucket's object list (in ObjectListInfo)
      *
      *
@@ -1528,6 +1627,52 @@ class OssClient
         $result = new ListObjectsResult($response);
         $result = new ListObjectsResult($response);
         return $result->getData();
         return $result->getData();
     }
     }
+    
+    
+    /**
+     * Lists the bucket's object list v2 (in ObjectListInfoV2)
+     *
+     * @param string $bucket
+     * @param array $options are defined below:
+     * $options = array(
+     *      'max-keys'    => specifies max object count to return. By default is 100 and max value could be 1000.
+     *      'prefix'      => specifies the key prefix the returned objects must have. Note that the returned keys still contain the prefix.
+     *      'delimiter'   => The delimiter of object name for grouping object. When it's specified, listObjects will differeniate the object and folder. And it will return subfolder's objects.
+     *      'start-after' => The key of returned object must be greater than the 'start-after'.
+     *      'continuation-token' => The token from which the list operation must start.
+     *)
+     * Prefix, start-after and continuation-token are for filtering and paging. Their length must be less than 256 bytes
+     * @throws OssException
+     * @return ObjectListInfoV2
+     */
+    public function listObjectsV2($bucket, $options = NULL)
+    {
+        $this->precheckCommon($bucket, NULL, $options, false);
+        $options[self::OSS_BUCKET] = $bucket;
+        $options[self::OSS_METHOD] = self::OSS_HTTP_GET;
+        $options[self::OSS_OBJECT] = '/';
+        $query = isset($options[self::OSS_QUERY_STRING]) ? $options[self::OSS_QUERY_STRING] : array();
+        $temp = array(
+            self::OSS_LIST_TYPE=>2,
+            self::OSS_ENCODING_TYPE => self::OSS_ENCODING_TYPE_URL,
+            self::OSS_DELIMITER => isset($options[self::OSS_DELIMITER]) ? $options[self::OSS_DELIMITER] : '/',
+            self::OSS_PREFIX => isset($options[self::OSS_PREFIX]) ? $options[self::OSS_PREFIX] : '',
+            self::OSS_MAX_KEYS => isset($options[self::OSS_MAX_KEYS]) ? $options[self::OSS_MAX_KEYS] : self::OSS_MAX_KEYS_VALUE,
+            self::OSS_START_AFTER => isset($options[self::OSS_START_AFTER]) ? $options[self::OSS_START_AFTER] : '',
+        );
+        if(isset($options[self::OSS_CONTINUATION_TOKEN])){
+            $temp[self::OSS_CONTINUATION_TOKEN] = $options[self::OSS_CONTINUATION_TOKEN];
+        }
+        $options[self::OSS_QUERY_STRING] = array_merge(
+            $query,$temp
+        );
+        $response = $this->auth($options);
+        $result = new ListObjectsV2Result($response);
+        return $result->getData();
+    }
+    
+    
+    
 
 
     /**
     /**
      * Lists the bucket's object with version information (in ObjectListInfo)
      * Lists the bucket's object with version information (in ObjectListInfo)
@@ -1616,8 +1761,8 @@ class OssClient
 
 
         $is_check_md5 = $this->isCheckMD5($options);
         $is_check_md5 = $this->isCheckMD5($options);
         if ($is_check_md5) {
         if ($is_check_md5) {
-        	$content_md5 = base64_encode(md5($content, true));
-        	$options[self::OSS_CONTENT_MD5] = $content_md5;
+            $content_md5 = base64_encode(md5($content, true));
+            $options[self::OSS_CONTENT_MD5] = $content_md5;
         }
         }
         
         
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
@@ -1784,8 +1929,8 @@ class OssClient
         
         
         $is_check_md5 = $this->isCheckMD5($options);
         $is_check_md5 = $this->isCheckMD5($options);
         if ($is_check_md5) {
         if ($is_check_md5) {
-        	$content_md5 = base64_encode(md5($content, true));
-        	$options[self::OSS_CONTENT_MD5] = $content_md5;
+            $content_md5 = base64_encode(md5($content, true));
+            $options[self::OSS_CONTENT_MD5] = $content_md5;
         }
         }
 
 
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
         if (!isset($options[self::OSS_CONTENT_TYPE])) {
@@ -2334,10 +2479,12 @@ class OssClient
         $options[self::OSS_OBJECT] = $object;
         $options[self::OSS_OBJECT] = $object;
         $options[self::OSS_UPLOAD_ID] = $uploadId;
         $options[self::OSS_UPLOAD_ID] = $uploadId;
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
         $options[self::OSS_CONTENT_TYPE] = 'application/xml';
-        if (!is_array($listParts)) {
-            throw new OssException("listParts must be array type");
+        if (is_array($listParts)) {
+            $options[self::OSS_CONTENT] = OssUtil::createCompleteMultipartUploadXmlBody($listParts);
+        }  else {
+            $options[self::OSS_CONTENT] = "";
         }
         }
-        $options[self::OSS_CONTENT] = OssUtil::createCompleteMultipartUploadXmlBody($listParts);
+
         $response = $this->auth($options);
         $response = $this->auth($options);
         if (isset($options[self::OSS_CALLBACK]) && !empty($options[self::OSS_CALLBACK])) {
         if (isset($options[self::OSS_CALLBACK]) && !empty($options[self::OSS_CALLBACK])) {
             $result = new CallbackResult($response);
             $result = new CallbackResult($response);
@@ -3180,6 +3327,8 @@ class OssClient
             self::OSS_WORM_ID,
             self::OSS_WORM_ID,
             self::OSS_TRAFFIC_LIMIT,
             self::OSS_TRAFFIC_LIMIT,
             self::OSS_VERSION_ID,
             self::OSS_VERSION_ID,
+            self::OSS_CONTINUATION_TOKEN,
+            self::OSS_CNAME,
         );
         );
 
 
         foreach ($signableList as $item) {
         foreach ($signableList as $item) {
@@ -3411,6 +3560,9 @@ class OssClient
     const OSS_PREFIX = 'prefix';
     const OSS_PREFIX = 'prefix';
     const OSS_DELIMITER = 'delimiter';
     const OSS_DELIMITER = 'delimiter';
     const OSS_MARKER = 'marker';
     const OSS_MARKER = 'marker';
+    const OSS_FETCH_OWNER = 'fetch-owner';
+    const OSS_START_AFTER = 'start-after';
+    const OSS_CONTINUATION_TOKEN = 'continuation-token';
     const OSS_ACCEPT_ENCODING = 'Accept-Encoding';
     const OSS_ACCEPT_ENCODING = 'Accept-Encoding';
     const OSS_CONTENT_MD5 = 'Content-Md5';
     const OSS_CONTENT_MD5 = 'Content-Md5';
     const OSS_SELF_CONTENT_MD5 = 'x-oss-meta-md5';
     const OSS_SELF_CONTENT_MD5 = 'x-oss-meta-md5';
@@ -3463,6 +3615,7 @@ class OssClient
     const OSS_VERSION_ID_MARKER = 'version-id-marker';
     const OSS_VERSION_ID_MARKER = 'version-id-marker';
     const OSS_VERSION_ID = 'versionId';
     const OSS_VERSION_ID = 'versionId';
     const OSS_HEADER_VERSION_ID = 'x-oss-version-id';
     const OSS_HEADER_VERSION_ID = 'x-oss-version-id';
+    const OSS_CNAME = 'cname';
 
 
     //private URLs
     //private URLs
     const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId';
     const OSS_URL_ACCESS_KEY_ID = 'OSSAccessKeyId';
@@ -3495,6 +3648,8 @@ class OssClient
     const OSS_ACL_TYPE_PUBLIC_READ_WRITE = 'public-read-write';
     const OSS_ACL_TYPE_PUBLIC_READ_WRITE = 'public-read-write';
     const OSS_ENCODING_TYPE = "encoding-type";
     const OSS_ENCODING_TYPE = "encoding-type";
     const OSS_ENCODING_TYPE_URL = "url";
     const OSS_ENCODING_TYPE_URL = "url";
+    
+    const OSS_LIST_TYPE = "list-type";
 
 
     // Domain Types
     // Domain Types
     const OSS_HOST_TYPE_NORMAL = "normal";//http://bucket.oss-cn-hangzhou.aliyuncs.com/object
     const OSS_HOST_TYPE_NORMAL = "normal";//http://bucket.oss-cn-hangzhou.aliyuncs.com/object
@@ -3509,8 +3664,8 @@ class OssClient
     );
     );
     // OssClient version information
     // OssClient version information
     const OSS_NAME = "aliyun-sdk-php";
     const OSS_NAME = "aliyun-sdk-php";
-    const OSS_VERSION = "2.4.3";
-    const OSS_BUILD = "20210825";
+    const OSS_VERSION = "2.5.0";
+    const OSS_BUILD = "20220513";
     const OSS_AUTHOR = "";
     const OSS_AUTHOR = "";
     const OSS_OPTIONS_ORIGIN = 'Origin';
     const OSS_OPTIONS_ORIGIN = 'Origin';
     const OSS_OPTIONS_REQUEST_METHOD = 'Access-Control-Request-Method';
     const OSS_OPTIONS_REQUEST_METHOD = 'Access-Control-Request-Method';

+ 84 - 32
vendor/aliyuncs/oss-sdk-php/tests/OSS/Tests/OssClientMultipartUploadTest.php

@@ -69,17 +69,12 @@ class OssClientMultipartUploadTest extends TestOssClientBase
         $object = "mpu/multipart-test.txt";
         $object = "mpu/multipart-test.txt";
         $copiedObject = "mpu/multipart-test.txt.copied";
         $copiedObject = "mpu/multipart-test.txt.copied";
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
         } catch (OssException $e) {
             $this->assertFalse(true);
             $this->assertFalse(true);
         }
         }
-        /*
-         * step 2. uploadPartCopy
-         */
+
         $copyId = 1;
         $copyId = 1;
         $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id);
         $eTag = $this->ossClient->uploadPartCopy($this->bucket, $copiedObject, $this->bucket, $object, $copyId, $upload_id);
         $upload_parts[] = array(
         $upload_parts[] = array(
@@ -94,9 +89,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $this->assertTrue(false);
             $this->assertTrue(false);
         }
         }
 
 
-        /**
-         * step 3.
-         */
         try {
         try {
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
         } catch (OssException $e) {
         } catch (OssException $e) {
@@ -113,9 +105,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
         $object = "mpu/multipart-test.txt";
         $object = "mpu/multipart-test.txt";
         $copiedObject = "mpu/multipart-test.txt.range.copied";
         $copiedObject = "mpu/multipart-test.txt.range.copied";
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
         $this->ossClient->putObject($this->bucket, $copiedObject, file_get_contents(__FILE__));
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
         } catch (OssException $e) {
@@ -142,9 +131,6 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $this->assertTrue(false);
             $this->assertTrue(false);
         }
         }
 
 
-        /**
-         * step 3.
-         */
         try {
         try {
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
             $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);
         } catch (OssException $e) {
         } catch (OssException $e) {
@@ -159,17 +145,11 @@ class OssClientMultipartUploadTest extends TestOssClientBase
     public function testAbortMultipartUpload()
     public function testAbortMultipartUpload()
     {
     {
         $object = "mpu/multipart-test.txt";
         $object = "mpu/multipart-test.txt";
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
         } catch (OssException $e) {
             $this->assertFalse(true);
             $this->assertFalse(true);
         }
         }
-        /*
-         * step 2. 上传分片
-         */
         $part_size = 10 * 1024 * 1024;
         $part_size = 10 * 1024 * 1024;
         $upload_file = __FILE__;
         $upload_file = __FILE__;
         $upload_filesize = sprintf('%u',filesize($upload_file));
         $upload_filesize = sprintf('%u',filesize($upload_file));
@@ -244,17 +224,11 @@ class OssClientMultipartUploadTest extends TestOssClientBase
     public function testPutObjectByRawApis()
     public function testPutObjectByRawApis()
     {
     {
         $object = "mpu/multipart-test.txt";
         $object = "mpu/multipart-test.txt";
-        /**
-         *  step 1. 初始化一个分块上传事件, 也就是初始化上传Multipart, 获取upload id
-         */
         try {
         try {
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
             $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
         } catch (OssException $e) {
         } catch (OssException $e) {
             $this->assertFalse(true);
             $this->assertFalse(true);
         }
         }
-        /*
-         * step 2. 上传分片
-         */
         $part_size = 10 * 1024 * 1024;
         $part_size = 10 * 1024 * 1024;
         $upload_file = __FILE__;
         $upload_file = __FILE__;
         $upload_filesize = sprintf('%u',filesize($upload_file));
         $upload_filesize = sprintf('%u',filesize($upload_file));
@@ -416,11 +390,89 @@ class OssClientMultipartUploadTest extends TestOssClientBase
             $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, null);
             $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, null);
             $this->assertTrue(false);
             $this->assertTrue(false);
         } catch (OssException $e) {
         } catch (OssException $e) {
-            $this->assertTrue(true);
-            if (strpos($e, "listParts must be array type") == false)
-            {
-                $this->assertTrue(false);
-            }   
+            $this->assertEquals('NoSuchUpload', $e->getErrorCode());
         }
         }
     }
     }
+
+    public function testCompleteMultipartUploadWithEmptyArray(){
+        $object = 'multipart-test-complete.txt';
+        try {
+            $uploadId = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
+            $listMultipartUploadInfo = $this->ossClient->completeMultipartUpload($this->bucket, $object, $uploadId, array());
+            var_dump($listMultipartUploadInfo);
+            $this->assertNotNull($listMultipartUploadInfo);
+        } catch (OssException $e) {
+            $this->assertFalse(true);
+        }
+
+    }
+
+
+    public function testCompleteMultipartUploadWithNull(){
+        $object = "mpu/multipart-test.txt";
+        try {
+            $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);
+        } catch (OssException $e) {
+            $this->assertFalse(true);
+        }
+
+        $part_size = 5 * 1024 * 1024;
+        $upload_file = __FILE__;
+        $upload_filesize = sprintf('%u',filesize($upload_file));
+        $pieces = $this->ossClient->generateMultiuploadParts($upload_filesize, $part_size);
+        $response_upload_part = array();
+        $upload_position = 0;
+        $is_check_md5 = true;
+        foreach ($pieces as $i => $piece) {
+            $from_pos = $upload_position + (integer)$piece[OssClient::OSS_SEEK_TO];
+            $to_pos = (integer)$piece[OssClient::OSS_LENGTH] + $from_pos - 1;
+            $up_options = array(
+                OssClient::OSS_FILE_UPLOAD => $upload_file,
+                OssClient::OSS_PART_NUM => ($i + 1),
+                OssClient::OSS_SEEK_TO => $from_pos,
+                OssClient::OSS_LENGTH => $to_pos - $from_pos + 1,
+                OssClient::OSS_CHECK_MD5 => $is_check_md5,
+            );
+            if ($is_check_md5) {
+                $content_md5 = OssUtil::getMd5SumForFile($upload_file, $from_pos, $to_pos);
+                $up_options[OssClient::OSS_CONTENT_MD5] = $content_md5;
+            }
+            try {
+                $response_upload_part[] = $this->ossClient->uploadPart($this->bucket, $object, $upload_id, $up_options);
+            } catch (OssException $e) {
+                $this->assertFalse(true);
+            }
+        }
+        $upload_parts = array();
+        foreach ($response_upload_part as $i => $eTag) {
+            $upload_parts[] = array(
+                'PartNumber' => ($i + 1),
+                'ETag' => $eTag,
+            );
+        }
+
+        try {
+            $listPartsInfo = $this->ossClient->listParts($this->bucket, $object, $upload_id);
+            $this->assertNotNull($listPartsInfo);
+        } catch (OssException $e) {
+            $this->assertTrue(false);
+        }
+
+        $options['headers'] = array(
+            'x-oss-forbid-overwrite' => 'false',
+            'x-oss-complete-all'=> 'yes'
+        );
+
+        try {
+            $result = $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, null,$options);
+            var_dump($result);
+            $this->assertNotNull($result);
+        } catch (OssException $e) {
+            $this->assertTrue(false);
+        }
+
+    }
+
+
+
 }
 }

+ 1 - 1
vendor/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php

@@ -33,6 +33,6 @@ final class CompositeEye implements EyeInterface
 
 
     public function getInternalPath() : Path
     public function getInternalPath() : Path
     {
     {
-        return $this->externalEye->getInternalPath();
+        return $this->internalEye->getInternalPath();
     }
     }
 }
 }

+ 7 - 7
vendor/composer/InstalledVersions.php

@@ -28,7 +28,7 @@ class InstalledVersions
 {
 {
     /**
     /**
      * @var mixed[]|null
      * @var mixed[]|null
-     * @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
+     * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
      */
      */
     private static $installed;
     private static $installed;
 
 
@@ -39,7 +39,7 @@ class InstalledVersions
 
 
     /**
     /**
      * @var array[]
      * @var array[]
-     * @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
      */
     private static $installedByVendor = array();
     private static $installedByVendor = array();
 
 
@@ -243,7 +243,7 @@ class InstalledVersions
 
 
     /**
     /**
      * @return array
      * @return array
-     * @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
+     * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
      */
      */
     public static function getRootPackage()
     public static function getRootPackage()
     {
     {
@@ -257,7 +257,7 @@ class InstalledVersions
      *
      *
      * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
      * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
      * @return array[]
      * @return array[]
-     * @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
+     * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
      */
      */
     public static function getRawData()
     public static function getRawData()
     {
     {
@@ -280,7 +280,7 @@ class InstalledVersions
      * Returns the raw data of all installed.php which are currently loaded for custom implementations
      * Returns the raw data of all installed.php which are currently loaded for custom implementations
      *
      *
      * @return array[]
      * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
      */
     public static function getAllRawData()
     public static function getAllRawData()
     {
     {
@@ -303,7 +303,7 @@ class InstalledVersions
      * @param  array[] $data A vendor/composer/installed.php data set
      * @param  array[] $data A vendor/composer/installed.php data set
      * @return void
      * @return void
      *
      *
-     * @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
+     * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
      */
      */
     public static function reload($data)
     public static function reload($data)
     {
     {
@@ -313,7 +313,7 @@ class InstalledVersions
 
 
     /**
     /**
      * @return array[]
      * @return array[]
-     * @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
+     * @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
      */
      */
     private static function getInstalled()
     private static function getInstalled()
     {
     {

+ 35 - 0
vendor/composer/autoload_classmap.php

@@ -6,14 +6,49 @@ $vendorDir = dirname(__DIR__);
 $baseDir = dirname($vendorDir);
 $baseDir = dirname($vendorDir);
 
 
 return array(
 return array(
+    'AcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsRequest.php',
+    'AcsResponse' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsResponse.php',
     'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
     'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+    'Autoloader' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Autoloader/Autoloader.php',
+    'BaseTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BaseTest.php',
+    'ClientException' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ClientException.php',
     'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
     'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
+    'Credential' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/Credential.php',
+    'CredentialTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/CredentialTest.php',
+    'DefaultAcsClient' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/DefaultAcsClient.php',
+    'DefaultAcsClientTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/DefaultAcsClientTest.php',
+    'DefaultProfile' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/DefaultProfile.php',
+    'DefaultProfileTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Profile/DefaultProfileTest.php',
+    'DescribeEndpointRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
+    'EndPointByLocationTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndPointByLocationTest.php',
+    'Endpoint' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/Endpoint.php',
+    'EndpointProvider' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/EndpointProvider.php',
+    'EndpointProviderTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndpointProviderTest.php',
+    'HttpHelper' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpHelper.php',
+    'HttpHelperTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Http/HttpHelperTest.php',
+    'HttpResponse' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpResponse.php',
+    'IAcsClient' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/IAcsClient.php',
+    'IClientProfile' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/IClientProfile.php',
+    'ISigner' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ISigner.php',
     'Ip2Region' => $vendorDir . '/zoujingli/ip2region/Ip2Region.php',
     'Ip2Region' => $vendorDir . '/zoujingli/ip2region/Ip2Region.php',
     'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
     'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+    'LocationService' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
     'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
     'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
     'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
     'PhpToken' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+    'ProductDomain' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/ProductDomain.php',
+    'RoaAcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RoaAcsRequest.php',
+    'RpcAcsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RpcAcsRequest.php',
+    'ServerException' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ServerException.php',
+    'ShaHmac1Signer' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac1Signer.php',
+    'ShaHmac1SignerTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac1SignerTest.php',
+    'ShaHmac256Signer' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac256Signer.php',
+    'ShaHmac256SignerTest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac256SignerTest.php',
     'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
     'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
     'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
     'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+    'UnitTest\\BatchCompute\\Request\\ListImagesRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BatchCompute/ListImagesRequest.php',
+    'UnitTest\\Ecs\\Request\\DescribeRegionsRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ecs/Rquest/DescribeRegionsRequest.php',
+    'UnitTest\\Ft\\TestRoaApiRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRoaApiRequest.php',
+    'UnitTest\\Ft\\TestRpcApiRequest' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRpcApiRequest.php',
     'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
     'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
     'We' => $vendorDir . '/zoujingli/wechat-developer/We.php',
     'We' => $vendorDir . '/zoujingli/wechat-developer/We.php',
 );
 );

+ 4 - 5
vendor/composer/autoload_files.php

@@ -7,25 +7,24 @@ $baseDir = dirname($vendorDir);
 
 
 return array(
 return array(
     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
     '6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
-    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
     'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
     'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
+    '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
     '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     'd767e4fc2dc52fe66584ab8c6684783e' => $vendorDir . '/adbario/php-dot-notation/src/helpers.php',
     'd767e4fc2dc52fe66584ab8c6684783e' => $vendorDir . '/adbario/php-dot-notation/src/helpers.php',
-    '65fec9ebcfbb3cbb4fd0d519687aea01' => $vendorDir . '/danielstjules/stringy/src/Create.php',
     '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
     '8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
     'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
     'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
     '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
     '0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
     'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
     'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
-    'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php',
+    '65fec9ebcfbb3cbb4fd0d519687aea01' => $vendorDir . '/danielstjules/stringy/src/Create.php',
     'a9ed0d27b5a698798a89181429f162c5' => $vendorDir . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
     'a9ed0d27b5a698798a89181429f162c5' => $vendorDir . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
+    'b067bc7112e384b61c701452d53a14a8' => $vendorDir . '/mtdowling/jmespath.php/src/JmesPath.php',
     '841780ea2e1d6545ea3a253239d59c05' => $vendorDir . '/qiniu/php-sdk/src/Qiniu/functions.php',
     '841780ea2e1d6545ea3a253239d59c05' => $vendorDir . '/qiniu/php-sdk/src/Qiniu/functions.php',
-    '0d0b82117c23db94c492fee02b2ed01f' => $vendorDir . '/songshenzong/support/src/StringsHelpers.php',
-    'd96a90b43bcdea846705672ffd4e9294' => $vendorDir . '/songshenzong/support/src/BashEchoHelpers.php',
     '66453932bc1be9fb2f910a27947d11b6' => $vendorDir . '/alibabacloud/client/src/Functions.php',
     '66453932bc1be9fb2f910a27947d11b6' => $vendorDir . '/alibabacloud/client/src/Functions.php',
     'f0e7e63bbb278a92db02393536748c5f' => $vendorDir . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
     'f0e7e63bbb278a92db02393536748c5f' => $vendorDir . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
     '6747f579ad6817f318cc3a7e7a0abb93' => $vendorDir . '/overtrue/wechat/src/Kernel/Helpers.php',
     '6747f579ad6817f318cc3a7e7a0abb93' => $vendorDir . '/overtrue/wechat/src/Kernel/Helpers.php',
+    'e362541fe9d65ccecc6d310665f82822' => $vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Config.php',
     '8dafcc6956460bc297e00381fed53e11' => $vendorDir . '/zoujingli/think-library/src/common.php',
     '8dafcc6956460bc297e00381fed53e11' => $vendorDir . '/zoujingli/think-library/src/common.php',
 );
 );

+ 3 - 5
vendor/composer/autoload_psr4.php

@@ -6,18 +6,17 @@ $vendorDir = dirname(__DIR__);
 $baseDir = dirname($vendorDir);
 $baseDir = dirname($vendorDir);
 
 
 return array(
 return array(
-    'xin\\helper\\' => array($vendorDir . '/xin/helper/src'),
-    'xin\\container\\' => array($vendorDir . '/xin/container/src'),
     'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
     'think\\composer\\' => array($vendorDir . '/topthink/think-installer/src'),
     'library\\' => array($vendorDir . '/zoujingli/think-library/src'),
     'library\\' => array($vendorDir . '/zoujingli/think-library/src'),
     'hg\\apidoc\\' => array($vendorDir . '/hg/apidoc/src'),
     'hg\\apidoc\\' => array($vendorDir . '/hg/apidoc/src'),
     'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
     'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
+    'aliyun\\afs\\' => array($vendorDir . '/oygza/aliyun-php-sdk-afs/src/aliyun/afs'),
     'Zxing\\' => array($vendorDir . '/khanamiryan/qrcode-detector-decoder/lib'),
     'Zxing\\' => array($vendorDir . '/khanamiryan/qrcode-detector-decoder/lib'),
     'WePay\\' => array($vendorDir . '/zoujingli/wechat-developer/WePay'),
     'WePay\\' => array($vendorDir . '/zoujingli/wechat-developer/WePay'),
     'WePayV3\\' => array($vendorDir . '/zoujingli/wechat-developer/WePayV3'),
     'WePayV3\\' => array($vendorDir . '/zoujingli/wechat-developer/WePayV3'),
     'WeOpen\\' => array($vendorDir . '/zoujingli/weopen-developer/WeOpen'),
     'WeOpen\\' => array($vendorDir . '/zoujingli/weopen-developer/WeOpen'),
-    'WeMini\\' => array($vendorDir . '/zoujingli/wechat-developer/WeMini', $vendorDir . '/zoujingli/weopen-developer/WeMini'),
-    'WeChat\\' => array($vendorDir . '/zoujingli/wechat-developer/WeChat', $vendorDir . '/zoujingli/weopen-developer/WeChat'),
+    'WeMini\\' => array($vendorDir . '/zoujingli/weopen-developer/WeMini', $vendorDir . '/zoujingli/wechat-developer/WeMini'),
+    'WeChat\\' => array($vendorDir . '/zoujingli/weopen-developer/WeChat', $vendorDir . '/zoujingli/wechat-developer/WeChat'),
     'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
     'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
     'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
     'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
@@ -38,7 +37,6 @@ return array(
     'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
     'Symfony\\Component\\Cache\\' => array($vendorDir . '/symfony/cache'),
     'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
     'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
     'Stringy\\' => array($vendorDir . '/danielstjules/stringy/src'),
     'Stringy\\' => array($vendorDir . '/danielstjules/stringy/src'),
-    'Songshenzong\\Support\\' => array($vendorDir . '/songshenzong/support/src'),
     'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu'),
     'Qiniu\\' => array($vendorDir . '/qiniu/php-sdk/src/Qiniu'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),

+ 51 - 27
vendor/composer/autoload_static.php

@@ -8,35 +8,29 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
 {
 {
     public static $files = array (
     public static $files = array (
         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
         '6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
-        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
         'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
+        '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         'd767e4fc2dc52fe66584ab8c6684783e' => __DIR__ . '/..' . '/adbario/php-dot-notation/src/helpers.php',
         'd767e4fc2dc52fe66584ab8c6684783e' => __DIR__ . '/..' . '/adbario/php-dot-notation/src/helpers.php',
-        '65fec9ebcfbb3cbb4fd0d519687aea01' => __DIR__ . '/..' . '/danielstjules/stringy/src/Create.php',
         '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
         '8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
         'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
         'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
         '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
         '0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
         'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
         'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
-        'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php',
+        '65fec9ebcfbb3cbb4fd0d519687aea01' => __DIR__ . '/..' . '/danielstjules/stringy/src/Create.php',
         'a9ed0d27b5a698798a89181429f162c5' => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
         'a9ed0d27b5a698798a89181429f162c5' => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib/Common/customFunctions.php',
+        'b067bc7112e384b61c701452d53a14a8' => __DIR__ . '/..' . '/mtdowling/jmespath.php/src/JmesPath.php',
         '841780ea2e1d6545ea3a253239d59c05' => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu/functions.php',
         '841780ea2e1d6545ea3a253239d59c05' => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu/functions.php',
-        '0d0b82117c23db94c492fee02b2ed01f' => __DIR__ . '/..' . '/songshenzong/support/src/StringsHelpers.php',
-        'd96a90b43bcdea846705672ffd4e9294' => __DIR__ . '/..' . '/songshenzong/support/src/BashEchoHelpers.php',
         '66453932bc1be9fb2f910a27947d11b6' => __DIR__ . '/..' . '/alibabacloud/client/src/Functions.php',
         '66453932bc1be9fb2f910a27947d11b6' => __DIR__ . '/..' . '/alibabacloud/client/src/Functions.php',
         'f0e7e63bbb278a92db02393536748c5f' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
         'f0e7e63bbb278a92db02393536748c5f' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Support/Helpers.php',
         '6747f579ad6817f318cc3a7e7a0abb93' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Helpers.php',
         '6747f579ad6817f318cc3a7e7a0abb93' => __DIR__ . '/..' . '/overtrue/wechat/src/Kernel/Helpers.php',
+        'e362541fe9d65ccecc6d310665f82822' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Config.php',
         '8dafcc6956460bc297e00381fed53e11' => __DIR__ . '/..' . '/zoujingli/think-library/src/common.php',
         '8dafcc6956460bc297e00381fed53e11' => __DIR__ . '/..' . '/zoujingli/think-library/src/common.php',
     );
     );
 
 
     public static $prefixLengthsPsr4 = array (
     public static $prefixLengthsPsr4 = array (
-        'x' => 
-        array (
-            'xin\\helper\\' => 11,
-            'xin\\container\\' => 14,
-        ),
         't' => 
         't' => 
         array (
         array (
             'think\\composer\\' => 15,
             'think\\composer\\' => 15,
@@ -53,6 +47,10 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
         array (
             'clagiordano\\weblibs\\configmanager\\' => 34,
             'clagiordano\\weblibs\\configmanager\\' => 34,
         ),
         ),
+        'a' => 
+        array (
+            'aliyun\\afs\\' => 11,
+        ),
         'Z' => 
         'Z' => 
         array (
         array (
             'Zxing\\' => 6,
             'Zxing\\' => 6,
@@ -87,7 +85,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
             'Symfony\\Component\\Cache\\' => 24,
             'Symfony\\Component\\Cache\\' => 24,
             'Symfony\\Bridge\\PsrHttpMessage\\' => 30,
             'Symfony\\Bridge\\PsrHttpMessage\\' => 30,
             'Stringy\\' => 8,
             'Stringy\\' => 8,
-            'Songshenzong\\Support\\' => 21,
         ),
         ),
         'Q' => 
         'Q' => 
         array (
         array (
@@ -153,14 +150,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
     );
     );
 
 
     public static $prefixDirsPsr4 = array (
     public static $prefixDirsPsr4 = array (
-        'xin\\helper\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/xin/helper/src',
-        ),
-        'xin\\container\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/xin/container/src',
-        ),
         'think\\composer\\' => 
         'think\\composer\\' => 
         array (
         array (
             0 => __DIR__ . '/..' . '/topthink/think-installer/src',
             0 => __DIR__ . '/..' . '/topthink/think-installer/src',
@@ -177,6 +166,10 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
         array (
             0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
             0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
         ),
         ),
+        'aliyun\\afs\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/afs',
+        ),
         'Zxing\\' => 
         'Zxing\\' => 
         array (
         array (
             0 => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib',
             0 => __DIR__ . '/..' . '/khanamiryan/qrcode-detector-decoder/lib',
@@ -195,13 +188,13 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         ),
         ),
         'WeMini\\' => 
         'WeMini\\' => 
         array (
         array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini',
-            1 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeMini',
+            0 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeMini',
+            1 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeMini',
         ),
         ),
         'WeChat\\' => 
         'WeChat\\' => 
         array (
         array (
-            0 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat',
-            1 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeChat',
+            0 => __DIR__ . '/..' . '/zoujingli/weopen-developer/WeChat',
+            1 => __DIR__ . '/..' . '/zoujingli/wechat-developer/WeChat',
         ),
         ),
         'Symfony\\Polyfill\\Php80\\' => 
         'Symfony\\Polyfill\\Php80\\' => 
         array (
         array (
@@ -283,10 +276,6 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
         array (
         array (
             0 => __DIR__ . '/..' . '/danielstjules/stringy/src',
             0 => __DIR__ . '/..' . '/danielstjules/stringy/src',
         ),
         ),
-        'Songshenzong\\Support\\' => 
-        array (
-            0 => __DIR__ . '/..' . '/songshenzong/support/src',
-        ),
         'Qiniu\\' => 
         'Qiniu\\' => 
         array (
         array (
             0 => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu',
             0 => __DIR__ . '/..' . '/qiniu/php-sdk/src/Qiniu',
@@ -417,14 +406,49 @@ class ComposerStaticInit4d241e9f8bb10d006cd7432f945fdb5b
     );
     );
 
 
     public static $classMap = array (
     public static $classMap = array (
+        'AcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsRequest.php',
+        'AcsResponse' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/AcsResponse.php',
         'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
         'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
+        'Autoloader' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Autoloader/Autoloader.php',
+        'BaseTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BaseTest.php',
+        'ClientException' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ClientException.php',
         'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
         'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
+        'Credential' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/Credential.php',
+        'CredentialTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/CredentialTest.php',
+        'DefaultAcsClient' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/DefaultAcsClient.php',
+        'DefaultAcsClientTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/DefaultAcsClientTest.php',
+        'DefaultProfile' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/DefaultProfile.php',
+        'DefaultProfileTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Profile/DefaultProfileTest.php',
+        'DescribeEndpointRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
+        'EndPointByLocationTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndPointByLocationTest.php',
+        'Endpoint' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/Endpoint.php',
+        'EndpointProvider' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/EndpointProvider.php',
+        'EndpointProviderTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Regions/EndpointProviderTest.php',
+        'HttpHelper' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpHelper.php',
+        'HttpHelperTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Http/HttpHelperTest.php',
+        'HttpResponse' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Http/HttpResponse.php',
+        'IAcsClient' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/IAcsClient.php',
+        'IClientProfile' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Profile/IClientProfile.php',
+        'ISigner' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ISigner.php',
         'Ip2Region' => __DIR__ . '/..' . '/zoujingli/ip2region/Ip2Region.php',
         'Ip2Region' => __DIR__ . '/..' . '/zoujingli/ip2region/Ip2Region.php',
         'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
         'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
+        'LocationService' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/LocationService.php',
         'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
         'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
         'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
         'PhpToken' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/PhpToken.php',
+        'ProductDomain' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Regions/ProductDomain.php',
+        'RoaAcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RoaAcsRequest.php',
+        'RpcAcsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/RpcAcsRequest.php',
+        'ServerException' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Exception/ServerException.php',
+        'ShaHmac1Signer' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac1Signer.php',
+        'ShaHmac1SignerTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac1SignerTest.php',
+        'ShaHmac256Signer' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/Auth/ShaHmac256Signer.php',
+        'ShaHmac256SignerTest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Auth/ShaHmac256SignerTest.php',
         'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
         'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
         'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
         'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
+        'UnitTest\\BatchCompute\\Request\\ListImagesRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/BatchCompute/ListImagesRequest.php',
+        'UnitTest\\Ecs\\Request\\DescribeRegionsRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ecs/Rquest/DescribeRegionsRequest.php',
+        'UnitTest\\Ft\\TestRoaApiRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRoaApiRequest.php',
+        'UnitTest\\Ft\\TestRpcApiRequest' => __DIR__ . '/..' . '/oygza/aliyun-php-sdk-afs/src/aliyun/core/UnitTest/Ft/TestRpcApiRequest.php',
         'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
         'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
         'We' => __DIR__ . '/..' . '/zoujingli/wechat-developer/We.php',
         'We' => __DIR__ . '/..' . '/zoujingli/wechat-developer/We.php',
     );
     );

File diff suppressed because it is too large
+ 222 - 327
vendor/composer/installed.json


+ 133 - 151
vendor/composer/installed.php

@@ -1,247 +1,256 @@
 <?php return array(
 <?php return array(
     'root' => array(
     'root' => array(
+        'name' => 'zoujingli/thinkadmin',
         'pretty_version' => 'dev-master',
         'pretty_version' => 'dev-master',
         'version' => 'dev-master',
         'version' => 'dev-master',
+        'reference' => '4afa5bd4473dd76d59ec12d4dd574ef2289d4b7e',
         'type' => 'project',
         'type' => 'project',
         'install_path' => __DIR__ . '/../../',
         'install_path' => __DIR__ . '/../../',
         'aliases' => array(),
         'aliases' => array(),
-        'reference' => '450c41a76767b5def137774c8a7eb2b64e975724',
-        'name' => 'zoujingli/thinkadmin',
         'dev' => true,
         'dev' => true,
     ),
     ),
     'versions' => array(
     'versions' => array(
         'adbario/php-dot-notation' => array(
         'adbario/php-dot-notation' => array(
-            'pretty_version' => '2.2.0',
-            'version' => '2.2.0.0',
+            'pretty_version' => '2.3.0',
+            'version' => '2.3.0.0',
+            'reference' => '39ece8d385ce2f5e03718c693932d83ab0cb5972',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../adbario/php-dot-notation',
             'install_path' => __DIR__ . '/../adbario/php-dot-notation',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'eee4fc81296531e6aafba4c2bbccfc5adab1676e',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'alibabacloud/client' => array(
         'alibabacloud/client' => array(
             'pretty_version' => '1.5.31',
             'pretty_version' => '1.5.31',
             'version' => '1.5.31.0',
             'version' => '1.5.31.0',
+            'reference' => '19224d92fe27ab8ef501d77d4891e7660bc023c1',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/client',
             'install_path' => __DIR__ . '/../alibabacloud/client',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '19224d92fe27ab8ef501d77d4891e7660bc023c1',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'alibabacloud/tea' => array(
         'alibabacloud/tea' => array(
-            'pretty_version' => '3.1.23',
-            'version' => '3.1.23.0',
+            'pretty_version' => '3.1.24',
+            'version' => '3.1.24.0',
+            'reference' => 'bb33395f47db3847d1940d6eb8ba1e56cd0623cb',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/tea',
             'install_path' => __DIR__ . '/../alibabacloud/tea',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '61fce993274edf6e7131af07256ed7723d97a85f',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'alibabacloud/tea-fileform' => array(
         'alibabacloud/tea-fileform' => array(
             'pretty_version' => '0.3.4',
             'pretty_version' => '0.3.4',
             'version' => '0.3.4.0',
             'version' => '0.3.4.0',
+            'reference' => '4bf0c75a045c8115aa8cb1a394bd08d8bb833181',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alibabacloud/tea-fileform',
             'install_path' => __DIR__ . '/../alibabacloud/tea-fileform',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '4bf0c75a045c8115aa8cb1a394bd08d8bb833181',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'alipaysdk/easysdk' => array(
         'alipaysdk/easysdk' => array(
-            'pretty_version' => '2.2.1',
-            'version' => '2.2.1.0',
+            'pretty_version' => '2.2.2',
+            'version' => '2.2.2.0',
+            'reference' => 'eac46450971d094e8cfb1c183da1080ca53d75b9',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../alipaysdk/easysdk',
             'install_path' => __DIR__ . '/../alipaysdk/easysdk',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '066388d02c6f55fe0919d75b386456d80801fec2',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'aliyuncs/oss-sdk-php' => array(
         'aliyuncs/oss-sdk-php' => array(
-            'pretty_version' => 'v2.4.3',
-            'version' => '2.4.3.0',
+            'pretty_version' => 'v2.5.0',
+            'version' => '2.5.0.0',
+            'reference' => 'f0413667d765855eb0aaa728b596801464ffdb06',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../aliyuncs/oss-sdk-php',
             'install_path' => __DIR__ . '/../aliyuncs/oss-sdk-php',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '4ccead614915ee6685bf30016afb01aabd347e46',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'bacon/bacon-qr-code' => array(
         'bacon/bacon-qr-code' => array(
-            'pretty_version' => '2.0.6',
-            'version' => '2.0.6.0',
+            'pretty_version' => '2.0.7',
+            'version' => '2.0.7.0',
+            'reference' => 'd70c840f68657ce49094b8d91f9ee0cc07fbf66c',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../bacon/bacon-qr-code',
             'install_path' => __DIR__ . '/../bacon/bacon-qr-code',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '0069435e2a01a57193b25790f105a5d3168653c1',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'clagiordano/weblibs-configmanager' => array(
         'clagiordano/weblibs-configmanager' => array(
             'pretty_version' => 'v1.5.0',
             'pretty_version' => 'v1.5.0',
             'version' => '1.5.0.0',
             'version' => '1.5.0.0',
+            'reference' => '8802c7396d61a923c9a73e37ead062b24bb1b273',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../clagiordano/weblibs-configmanager',
             'install_path' => __DIR__ . '/../clagiordano/weblibs-configmanager',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '8802c7396d61a923c9a73e37ead062b24bb1b273',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'danielstjules/stringy' => array(
         'danielstjules/stringy' => array(
             'pretty_version' => '3.1.0',
             'pretty_version' => '3.1.0',
             'version' => '3.1.0.0',
             'version' => '3.1.0.0',
+            'reference' => 'df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../danielstjules/stringy',
             'install_path' => __DIR__ . '/../danielstjules/stringy',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'df24ab62d2d8213bbbe88cc36fc35a4503b4bd7e',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'dasprid/enum' => array(
         'dasprid/enum' => array(
             'pretty_version' => '1.0.3',
             'pretty_version' => '1.0.3',
             'version' => '1.0.3.0',
             'version' => '1.0.3.0',
+            'reference' => '5abf82f213618696dda8e3bf6f64dd042d8542b2',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../dasprid/enum',
             'install_path' => __DIR__ . '/../dasprid/enum',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '5abf82f213618696dda8e3bf6f64dd042d8542b2',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'easywechat-composer/easywechat-composer' => array(
         'easywechat-composer/easywechat-composer' => array(
             'pretty_version' => '1.4.1',
             'pretty_version' => '1.4.1',
             'version' => '1.4.1.0',
             'version' => '1.4.1.0',
+            'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',
             'type' => 'composer-plugin',
             'type' => 'composer-plugin',
             'install_path' => __DIR__ . '/../easywechat-composer/easywechat-composer',
             'install_path' => __DIR__ . '/../easywechat-composer/easywechat-composer',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '3fc6a7ab6d3853c0f4e2922539b56cc37ef361cd',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'endroid/qr-code' => array(
         'endroid/qr-code' => array(
             'pretty_version' => '3.9.7',
             'pretty_version' => '3.9.7',
             'version' => '3.9.7.0',
             'version' => '3.9.7.0',
+            'reference' => '94563d7b3105288e6ac53a67ae720e3669fac1f6',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../endroid/qr-code',
             'install_path' => __DIR__ . '/../endroid/qr-code',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '94563d7b3105288e6ac53a67ae720e3669fac1f6',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'firebase/php-jwt' => array(
         'firebase/php-jwt' => array(
             'pretty_version' => 'v5.5.1',
             'pretty_version' => 'v5.5.1',
             'version' => '5.5.1.0',
             'version' => '5.5.1.0',
+            'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../firebase/php-jwt',
             'install_path' => __DIR__ . '/../firebase/php-jwt',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '83b609028194aa042ea33b5af2d41a7427de80e6',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'guzzlehttp/guzzle' => array(
         'guzzlehttp/guzzle' => array(
-            'pretty_version' => '7.4.1',
-            'version' => '7.4.1.0',
+            'pretty_version' => '7.4.5',
+            'version' => '7.4.5.0',
+            'reference' => '1dd98b0564cb3f6bd16ce683cb755f94c10fbd82',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
             'install_path' => __DIR__ . '/../guzzlehttp/guzzle',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'ee0a041b1760e6a53d2a39c8c34115adc2af2c79',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'guzzlehttp/promises' => array(
         'guzzlehttp/promises' => array(
             'pretty_version' => '1.5.1',
             'pretty_version' => '1.5.1',
             'version' => '1.5.1.0',
             'version' => '1.5.1.0',
+            'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/promises',
             'install_path' => __DIR__ . '/../guzzlehttp/promises',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'guzzlehttp/psr7' => array(
         'guzzlehttp/psr7' => array(
-            'pretty_version' => '2.1.0',
-            'version' => '2.1.0.0',
+            'pretty_version' => '2.4.0',
+            'version' => '2.4.0.0',
+            'reference' => '13388f00956b1503577598873fffb5ae994b5737',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../guzzlehttp/psr7',
             'install_path' => __DIR__ . '/../guzzlehttp/psr7',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '089edd38f5b8abba6cb01567c2a8aaa47cec4c72',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'hg/apidoc' => array(
         'hg/apidoc' => array(
             'pretty_version' => 'v1.1.2',
             'pretty_version' => 'v1.1.2',
             'version' => '1.1.2.0',
             'version' => '1.1.2.0',
+            'reference' => '4925ddf39c22f48acca702843d53bbb70a4687a4',
             'type' => 'think-extend',
             'type' => 'think-extend',
             'install_path' => __DIR__ . '/../hg/apidoc',
             'install_path' => __DIR__ . '/../hg/apidoc',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '4925ddf39c22f48acca702843d53bbb70a4687a4',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'khanamiryan/qrcode-detector-decoder' => array(
         'khanamiryan/qrcode-detector-decoder' => array(
             'pretty_version' => '1.0.5.2',
             'pretty_version' => '1.0.5.2',
             'version' => '1.0.5.2',
             'version' => '1.0.5.2',
+            'reference' => '04fdd58d86a387065f707dc6d3cc304c719910c1',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../khanamiryan/qrcode-detector-decoder',
             'install_path' => __DIR__ . '/../khanamiryan/qrcode-detector-decoder',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '04fdd58d86a387065f707dc6d3cc304c719910c1',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'monolog/monolog' => array(
         'monolog/monolog' => array(
-            'pretty_version' => '2.6.0',
-            'version' => '2.6.0.0',
+            'pretty_version' => '2.8.0',
+            'version' => '2.8.0.0',
+            'reference' => '720488632c590286b88b80e62aa3d3d551ad4a50',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../monolog/monolog',
             'install_path' => __DIR__ . '/../monolog/monolog',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '247918972acd74356b0a91dfaa5adcaec069b6c0',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'mtdowling/jmespath.php' => array(
         'mtdowling/jmespath.php' => array(
             'pretty_version' => '2.6.1',
             'pretty_version' => '2.6.1',
             'version' => '2.6.1.0',
             'version' => '2.6.1.0',
+            'reference' => '9b87907a81b87bc76d19a7fb2d61e61486ee9edb',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../mtdowling/jmespath.php',
             'install_path' => __DIR__ . '/../mtdowling/jmespath.php',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '9b87907a81b87bc76d19a7fb2d61e61486ee9edb',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'myclabs/php-enum' => array(
         'myclabs/php-enum' => array(
-            'pretty_version' => '1.6.6',
-            'version' => '1.6.6.0',
+            'pretty_version' => '1.8.3',
+            'version' => '1.8.3.0',
+            'reference' => 'b942d263c641ddb5190929ff840c68f78713e937',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../myclabs/php-enum',
             'install_path' => __DIR__ . '/../myclabs/php-enum',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '32c4202886c51fbe5cc3a7c34ec5c9a4a790345e',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'overtrue/socialite' => array(
         'overtrue/socialite' => array(
             'pretty_version' => '2.0.24',
             'pretty_version' => '2.0.24',
             'version' => '2.0.24.0',
             'version' => '2.0.24.0',
+            'reference' => 'ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../overtrue/socialite',
             'install_path' => __DIR__ . '/../overtrue/socialite',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'ee7e7b000ec7d64f2b8aba1f6a2eec5cdf3f8bec',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'overtrue/wechat' => array(
         'overtrue/wechat' => array(
             'pretty_version' => '4.5.0',
             'pretty_version' => '4.5.0',
             'version' => '4.5.0.0',
             'version' => '4.5.0.0',
+            'reference' => '04a940f97d6812a67bb8d5f2dbaebf9ad78ae776',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../overtrue/wechat',
             'install_path' => __DIR__ . '/../overtrue/wechat',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '04a940f97d6812a67bb8d5f2dbaebf9ad78ae776',
+            'dev_requirement' => false,
+        ),
+        'oygza/aliyun-php-sdk-afs' => array(
+            'pretty_version' => '1.0.0',
+            'version' => '1.0.0.0',
+            'reference' => '2b941c48755ee09fea8f58fc65ba372b830269cb',
+            'type' => 'library',
+            'install_path' => __DIR__ . '/../oygza/aliyun-php-sdk-afs',
+            'aliases' => array(),
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'phpoffice/phpexcel' => array(
         'phpoffice/phpexcel' => array(
-            'pretty_version' => '1.8.1',
-            'version' => '1.8.1.0',
+            'pretty_version' => '1.8.2',
+            'version' => '1.8.2.0',
+            'reference' => '1441011fb7ecdd8cc689878f54f8b58a6805f870',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../phpoffice/phpexcel',
             'install_path' => __DIR__ . '/../phpoffice/phpexcel',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '372c7cbb695a6f6f1e62649381aeaa37e7e70b32',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'pimple/pimple' => array(
         'pimple/pimple' => array(
             'pretty_version' => 'v3.5.0',
             'pretty_version' => 'v3.5.0',
             'version' => '3.5.0.0',
             'version' => '3.5.0.0',
+            'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../pimple/pimple',
             'install_path' => __DIR__ . '/../pimple/pimple',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'a94b3a4db7fb774b3d78dad2315ddc07629e1bed',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/cache' => array(
         'psr/cache' => array(
-            'pretty_version' => '2.0.0',
-            'version' => '2.0.0.0',
+            'pretty_version' => '1.0.1',
+            'version' => '1.0.1.0',
+            'reference' => 'd11b50ad223250cf17b86e38383413f5a6764bf8',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/cache',
             'install_path' => __DIR__ . '/../psr/cache',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '213f9dbc5b9bfbc4f8db86d2838dc968752ce13b',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/cache-implementation' => array(
         'psr/cache-implementation' => array(
@@ -251,21 +260,21 @@
             ),
             ),
         ),
         ),
         'psr/container' => array(
         'psr/container' => array(
-            'pretty_version' => '1.1.2',
-            'version' => '1.1.2.0',
+            'pretty_version' => '2.0.1',
+            'version' => '2.0.1.0',
+            'reference' => '2ae37329ee82f91efadc282cc2d527fd6065a5ef',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/container',
             'install_path' => __DIR__ . '/../psr/container',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/event-dispatcher' => array(
         'psr/event-dispatcher' => array(
             'pretty_version' => '1.0.0',
             'pretty_version' => '1.0.0',
             'version' => '1.0.0.0',
             'version' => '1.0.0.0',
+            'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/event-dispatcher',
             'install_path' => __DIR__ . '/../psr/event-dispatcher',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'dbefd12671e8a14ec7f180cab83036ed26714bb0',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/event-dispatcher-implementation' => array(
         'psr/event-dispatcher-implementation' => array(
@@ -277,10 +286,10 @@
         'psr/http-client' => array(
         'psr/http-client' => array(
             'pretty_version' => '1.0.1',
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
             'version' => '1.0.1.0',
+            'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-client',
             'install_path' => __DIR__ . '/../psr/http-client',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '2dfb5f6c5eff0e91e20e913f8c5452ed95b86621',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/http-client-implementation' => array(
         'psr/http-client-implementation' => array(
@@ -292,10 +301,10 @@
         'psr/http-factory' => array(
         'psr/http-factory' => array(
             'pretty_version' => '1.0.1',
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
             'version' => '1.0.1.0',
+            'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-factory',
             'install_path' => __DIR__ . '/../psr/http-factory',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '12ac7fcd07e5b077433f5f2bee95b3a771bf61be',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/http-factory-implementation' => array(
         'psr/http-factory-implementation' => array(
@@ -307,10 +316,10 @@
         'psr/http-message' => array(
         'psr/http-message' => array(
             'pretty_version' => '1.0.1',
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
             'version' => '1.0.1.0',
+            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/http-message',
             'install_path' => __DIR__ . '/../psr/http-message',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/http-message-implementation' => array(
         'psr/http-message-implementation' => array(
@@ -322,10 +331,10 @@
         'psr/log' => array(
         'psr/log' => array(
             'pretty_version' => '1.1.4',
             'pretty_version' => '1.1.4',
             'version' => '1.1.4.0',
             'version' => '1.1.4.0',
+            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/log',
             'install_path' => __DIR__ . '/../psr/log',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/log-implementation' => array(
         'psr/log-implementation' => array(
@@ -337,10 +346,10 @@
         'psr/simple-cache' => array(
         'psr/simple-cache' => array(
             'pretty_version' => '1.0.1',
             'pretty_version' => '1.0.1',
             'version' => '1.0.1.0',
             'version' => '1.0.1.0',
+            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../psr/simple-cache',
             'install_path' => __DIR__ . '/../psr/simple-cache',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'psr/simple-cache-implementation' => array(
         'psr/simple-cache-implementation' => array(
@@ -350,48 +359,39 @@
             ),
             ),
         ),
         ),
         'qiniu/php-sdk' => array(
         'qiniu/php-sdk' => array(
-            'pretty_version' => 'v7.5.0',
-            'version' => '7.5.0.0',
+            'pretty_version' => 'v7.4.1',
+            'version' => '7.4.1.0',
+            'reference' => '10c7ead8357743b4b987a335c14964fb07700d57',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../qiniu/php-sdk',
             'install_path' => __DIR__ . '/../qiniu/php-sdk',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '0cc46e4206002d1a736dbb4abb1424b0b7fc3f22',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'ralouphie/getallheaders' => array(
         'ralouphie/getallheaders' => array(
             'pretty_version' => '3.0.3',
             'pretty_version' => '3.0.3',
             'version' => '3.0.3.0',
             'version' => '3.0.3.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
-            'aliases' => array(),
             'reference' => '120b605dfeb996808c31b6477290a714d356e822',
             'reference' => '120b605dfeb996808c31b6477290a714d356e822',
-            'dev_requirement' => false,
-        ),
-        'songshenzong/support' => array(
-            'pretty_version' => '2.0.6',
-            'version' => '2.0.6.0',
             'type' => 'library',
             'type' => 'library',
-            'install_path' => __DIR__ . '/../songshenzong/support',
+            'install_path' => __DIR__ . '/../ralouphie/getallheaders',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'b334d8abc99e8a85538a556e10c670c18b71c230',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/cache' => array(
         'symfony/cache' => array(
-            'pretty_version' => 'v5.4.8',
-            'version' => '5.4.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => 'c4e387b739022fd4b20abd8edb2143c44c5daa14',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/cache',
             'install_path' => __DIR__ . '/../symfony/cache',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '4c6747cf7e56c6b8e3094dd24852bd3e364375b1',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/cache-contracts' => array(
         'symfony/cache-contracts' => array(
-            'pretty_version' => 'v2.5.1',
-            'version' => '2.5.1.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/cache-contracts',
             'install_path' => __DIR__ . '/../symfony/cache-contracts',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '64be4a7acb83b6f2bf6de9a02cee6dad41277ebc',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/cache-implementation' => array(
         'symfony/cache-implementation' => array(
@@ -401,30 +401,30 @@
             ),
             ),
         ),
         ),
         'symfony/deprecation-contracts' => array(
         'symfony/deprecation-contracts' => array(
-            'pretty_version' => 'v3.0.0',
-            'version' => '3.0.0.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => 'e8b495ea28c1d97b5e0c121748d6f9b53d075c66',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
             'install_path' => __DIR__ . '/../symfony/deprecation-contracts',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'c726b64c1ccfe2896cb7df2e1331c357ad1c8ced',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/event-dispatcher' => array(
         'symfony/event-dispatcher' => array(
-            'pretty_version' => 'v5.4.3',
-            'version' => '5.4.3.0',
+            'pretty_version' => 'v5.4.9',
+            'version' => '5.4.9.0',
+            'reference' => '8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'dec8a9f58d20df252b9cd89f1c6c1530f747685d',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/event-dispatcher-contracts' => array(
         'symfony/event-dispatcher-contracts' => array(
-            'pretty_version' => 'v3.0.1',
-            'version' => '3.0.1.0',
+            'pretty_version' => 'v2.5.2',
+            'version' => '2.5.2.0',
+            'reference' => 'f98b54df6ad059855739db6fcbc2d36995283fe1',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
             'install_path' => __DIR__ . '/../symfony/event-dispatcher-contracts',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '7bc61cc2db649b4637d331240c5346dcc7708051',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/event-dispatcher-implementation' => array(
         'symfony/event-dispatcher-implementation' => array(
@@ -434,221 +434,203 @@
             ),
             ),
         ),
         ),
         'symfony/http-foundation' => array(
         'symfony/http-foundation' => array(
-            'pretty_version' => 'v5.4.8',
-            'version' => '5.4.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => 'e7793b7906f72a8cc51054fbca9dcff7a8af1c1e',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/http-foundation',
             'install_path' => __DIR__ . '/../symfony/http-foundation',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'ff2818d1c3d49860bcae1f2cbb5eb00fcd3bf9e2',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/options-resolver' => array(
         'symfony/options-resolver' => array(
             'pretty_version' => 'v5.4.3',
             'pretty_version' => 'v5.4.3',
             'version' => '5.4.3.0',
             'version' => '5.4.3.0',
+            'reference' => 'cc1147cb11af1b43f503ac18f31aa3bec213aba8',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/options-resolver',
             'install_path' => __DIR__ . '/../symfony/options-resolver',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'cc1147cb11af1b43f503ac18f31aa3bec213aba8',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-ctype' => array(
         'symfony/polyfill-ctype' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
             'install_path' => __DIR__ . '/../symfony/polyfill-ctype',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '30885182c981ab175d4d034db0f6f469898070ab',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-intl-grapheme' => array(
         'symfony/polyfill-intl-grapheme' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '433d05519ce6990bf3530fba6957499d327395c2',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-grapheme',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '81b86b50cf841a64252b439e738e97f4a34e2783',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-intl-normalizer' => array(
         'symfony/polyfill-intl-normalizer' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '219aa369ceff116e673852dce47c3a41794c14bd',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
             'install_path' => __DIR__ . '/../symfony/polyfill-intl-normalizer',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-mbstring' => array(
         'symfony/polyfill-mbstring' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => '9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
             'install_path' => __DIR__ . '/../symfony/polyfill-mbstring',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '0abb51d2f102e00a4eefcf46ba7fec406d245825',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-php73' => array(
         'symfony/polyfill-php73' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => 'e440d35fa0286f77fb45b79a03fedbeda9307e85',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-php73',
             'install_path' => __DIR__ . '/../symfony/polyfill-php73',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'cc5db0e22b3cb4111010e48785a97f670b350ca5',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/polyfill-php80' => array(
         'symfony/polyfill-php80' => array(
-            'pretty_version' => 'v1.25.0',
-            'version' => '1.25.0.0',
+            'pretty_version' => 'v1.26.0',
+            'version' => '1.26.0.0',
+            'reference' => 'cfa0ae98841b9e461207c13ab093d76b0fa7bace',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/polyfill-php80',
             'install_path' => __DIR__ . '/../symfony/polyfill-php80',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '4407588e0d3f1f52efb65fbe92babe41f37fe50c',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/property-access' => array(
         'symfony/property-access' => array(
             'pretty_version' => 'v5.4.8',
             'pretty_version' => 'v5.4.8',
             'version' => '5.4.8.0',
             'version' => '5.4.8.0',
+            'reference' => 'fe501d498d6ec7e9efe928c90fabedf629116495',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/property-access',
             'install_path' => __DIR__ . '/../symfony/property-access',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'fe501d498d6ec7e9efe928c90fabedf629116495',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/property-info' => array(
         'symfony/property-info' => array(
-            'pretty_version' => 'v6.0.7',
-            'version' => '6.0.7.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '924406e19365953870517eb7f63ac3f7bfb71875',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/property-info',
             'install_path' => __DIR__ . '/../symfony/property-info',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '0f26f0870f05d65d5c06681ecbf36e546204f4b5',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/psr-http-message-bridge' => array(
         'symfony/psr-http-message-bridge' => array(
             'pretty_version' => 'v2.1.2',
             'pretty_version' => 'v2.1.2',
             'version' => '2.1.2.0',
             'version' => '2.1.2.0',
+            'reference' => '22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34',
             'type' => 'symfony-bridge',
             'type' => 'symfony-bridge',
             'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
             'install_path' => __DIR__ . '/../symfony/psr-http-message-bridge',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '22b37c8a3f6b5d94e9cdbd88e1270d96e2f97b34',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/service-contracts' => array(
         'symfony/service-contracts' => array(
-            'pretty_version' => 'v2.5.1',
-            'version' => '2.5.1.0',
+            'pretty_version' => 'v1.1.2',
+            'version' => '1.1.2.0',
+            'reference' => '191afdcb5804db960d26d8566b7e9a2843cab3a0',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/service-contracts',
             'install_path' => __DIR__ . '/../symfony/service-contracts',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '24d9dc654b83e91aa59f9d167b131bc3b5bea24c',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/string' => array(
         'symfony/string' => array(
-            'pretty_version' => 'v6.0.8',
-            'version' => '6.0.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '4432bc7df82a554b3e413a8570ce2fea90e94097',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/string',
             'install_path' => __DIR__ . '/../symfony/string',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'ac0aa5c2282e0de624c175b68d13f2c8f2e2649d',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/var-exporter' => array(
         'symfony/var-exporter' => array(
-            'pretty_version' => 'v6.0.8',
-            'version' => '6.0.8.0',
+            'pretty_version' => 'v5.4.10',
+            'version' => '5.4.10.0',
+            'reference' => '8fc03ee75eeece3d9be1ef47d26d79bea1afb340',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/var-exporter',
             'install_path' => __DIR__ . '/../symfony/var-exporter',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '74b272979a490747c6775b0228d06cf246306a99',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'symfony/yaml' => array(
         'symfony/yaml' => array(
             'pretty_version' => 'v2.8.52',
             'pretty_version' => 'v2.8.52',
             'version' => '2.8.52.0',
             'version' => '2.8.52.0',
+            'reference' => '02c1859112aa779d9ab394ae4f3381911d84052b',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../symfony/yaml',
             'install_path' => __DIR__ . '/../symfony/yaml',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '02c1859112aa779d9ab394ae4f3381911d84052b',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'topthink/framework' => array(
         'topthink/framework' => array(
             'pretty_version' => 'v5.1.41',
             'pretty_version' => 'v5.1.41',
             'version' => '5.1.41.0',
             'version' => '5.1.41.0',
+            'reference' => '7137741a323a4a60cfca334507cd1812fac91bb2',
             'type' => 'think-framework',
             'type' => 'think-framework',
             'install_path' => __DIR__ . '/../../thinkphp',
             'install_path' => __DIR__ . '/../../thinkphp',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '7137741a323a4a60cfca334507cd1812fac91bb2',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'topthink/think-installer' => array(
         'topthink/think-installer' => array(
             'pretty_version' => 'v2.0.5',
             'pretty_version' => 'v2.0.5',
             'version' => '2.0.5.0',
             'version' => '2.0.5.0',
+            'reference' => '38ba647706e35d6704b5d370c06f8a160b635f88',
             'type' => 'composer-plugin',
             'type' => 'composer-plugin',
             'install_path' => __DIR__ . '/../topthink/think-installer',
             'install_path' => __DIR__ . '/../topthink/think-installer',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '38ba647706e35d6704b5d370c06f8a160b635f88',
-            'dev_requirement' => false,
-        ),
-        'xin/container' => array(
-            'pretty_version' => '2.0.1',
-            'version' => '2.0.1.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../xin/container',
-            'aliases' => array(),
-            'reference' => '97bb67f87dd851545938a1f2fe0ffbd379e3ff81',
-            'dev_requirement' => false,
-        ),
-        'xin/helper' => array(
-            'pretty_version' => '1.0.0',
-            'version' => '1.0.0.0',
-            'type' => 'library',
-            'install_path' => __DIR__ . '/../xin/helper',
-            'aliases' => array(),
-            'reference' => '02a58132dae2aea2d1c0b8e66f55125969224747',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'zoujingli/ip2region' => array(
         'zoujingli/ip2region' => array(
             'pretty_version' => 'v1.0.12',
             'pretty_version' => 'v1.0.12',
             'version' => '1.0.12.0',
             'version' => '1.0.12.0',
+            'reference' => '82cebc7a6be46524797454e98d3b165521065c26',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/ip2region',
             'install_path' => __DIR__ . '/../zoujingli/ip2region',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '82cebc7a6be46524797454e98d3b165521065c26',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'zoujingli/think-library' => array(
         'zoujingli/think-library' => array(
             'pretty_version' => 'v5.1.x-dev',
             'pretty_version' => 'v5.1.x-dev',
             'version' => '5.1.9999999.9999999-dev',
             'version' => '5.1.9999999.9999999-dev',
+            'reference' => '6a5c8b7ad40d19664494522dcf9388a48df43447',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/think-library',
             'install_path' => __DIR__ . '/../zoujingli/think-library',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '6a5c8b7ad40d19664494522dcf9388a48df43447',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'zoujingli/thinkadmin' => array(
         'zoujingli/thinkadmin' => array(
             'pretty_version' => 'dev-master',
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
             'version' => 'dev-master',
+            'reference' => '4afa5bd4473dd76d59ec12d4dd574ef2289d4b7e',
             'type' => 'project',
             'type' => 'project',
             'install_path' => __DIR__ . '/../../',
             'install_path' => __DIR__ . '/../../',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => '450c41a76767b5def137774c8a7eb2b64e975724',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'zoujingli/wechat-developer' => array(
         'zoujingli/wechat-developer' => array(
-            'pretty_version' => 'v1.2.35',
-            'version' => '1.2.35.0',
+            'pretty_version' => 'v1.2.36',
+            'version' => '1.2.36.0',
+            'reference' => 'a598aaa2b8e2470ea2120cff514df1de88bde6df',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/wechat-developer',
             'install_path' => __DIR__ . '/../zoujingli/wechat-developer',
             'aliases' => array(),
             'aliases' => array(),
-            'reference' => 'cfe3e83798d3c7b78855ae214acb6b14321de45d',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
         'zoujingli/weopen-developer' => array(
         'zoujingli/weopen-developer' => array(
             'pretty_version' => 'dev-master',
             'pretty_version' => 'dev-master',
             'version' => 'dev-master',
             'version' => 'dev-master',
+            'reference' => '4d0d3c064e54556621453845fc65ba52de58a880',
             'type' => 'library',
             'type' => 'library',
             'install_path' => __DIR__ . '/../zoujingli/weopen-developer',
             'install_path' => __DIR__ . '/../zoujingli/weopen-developer',
             'aliases' => array(
             'aliases' => array(
                 0 => '9999999-dev',
                 0 => '9999999-dev',
             ),
             ),
-            'reference' => '4d0d3c064e54556621453845fc65ba52de58a880',
             'dev_requirement' => false,
             'dev_requirement' => false,
         ),
         ),
     ),
     ),

+ 2 - 2
vendor/composer/platform_check.php

@@ -4,8 +4,8 @@
 
 
 $issues = array();
 $issues = array();
 
 
-if (!(PHP_VERSION_ID >= 80002)) {
-    $issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.2". 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) {
 if ($issues) {

+ 22 - 0
vendor/guzzlehttp/guzzle/CHANGELOG.md

@@ -2,6 +2,28 @@
 
 
 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
 Please refer to [UPGRADING](UPGRADING.md) guide for upgrading to a major version.
 
 
+## 7.4.5 - 2022-06-20
+
+* Fix change in port should be considered a change in origin
+* Fix `CURLOPT_HTTPAUTH` option not cleared on change of origin
+
+## 7.4.4 - 2022-06-09
+
+* Fix failure to strip Authorization header on HTTP downgrade
+* Fix failure to strip the Cookie header on change in host or HTTP downgrade
+
+## 7.4.3 - 2022-05-25
+
+* Fix cross-domain cookie leakage
+
+## 7.4.2 - 2022-03-20
+
+### Fixed
+
+- Remove curl auth on cross-domain redirects to align with the Authorization HTTP header
+- Reject non-HTTP schemes in StreamHandler
+- Set a default ssl.peer_name context in StreamHandler to allow `force_ip_resolve`
+
 ## 7.4.1 - 2021-12-06
 ## 7.4.1 - 2021-12-06
 
 
 ### Changed
 ### Changed

+ 14 - 14
vendor/guzzlehttp/guzzle/README.md

@@ -42,9 +42,9 @@ $promise->wait();
 
 
 We use GitHub issues only to discuss bugs and new features. For support please refer to:
 We use GitHub issues only to discuss bugs and new features. For support please refer to:
 
 
-- [Documentation](http://guzzlephp.org/)
-- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle)
-- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](http://slack.httplug.io/)
+- [Documentation](https://docs.guzzlephp.org)
+- [Stack Overflow](https://stackoverflow.com/questions/tagged/guzzle)
+- [#guzzle](https://app.slack.com/client/T0D2S9JCT/CE6UAAKL4) channel on [PHP-HTTP Slack](https://slack.httplug.io/)
 - [Gitter](https://gitter.im/guzzle/guzzle)
 - [Gitter](https://gitter.im/guzzle/guzzle)
 
 
 
 
@@ -60,23 +60,23 @@ composer require guzzlehttp/guzzle
 
 
 ## Version Guidance
 ## Version Guidance
 
 
-| Version | Status     | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version |
-|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------|
-| 3.x     | EOL        | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >= 5.3.3    |
-| 4.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >= 5.4      |
-| 5.x     | EOL        | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >= 5.4      |
-| 6.x     | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >= 5.5      |
-| 7.x     | Latest     | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes   | >= 7.2      |
+| Version | Status         | Packagist           | Namespace    | Repo                | Docs                | PSR-7 | PHP Version  |
+|---------|----------------|---------------------|--------------|---------------------|---------------------|-------|--------------|
+| 3.x     | EOL            | `guzzle/guzzle`     | `Guzzle`     | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No    | >=5.3.3,<7.0 |
+| 4.x     | EOL            | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A                 | No    | >=5.4,<7.0   |
+| 5.x     | EOL            | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No    | >=5.4,<7.4   |
+| 6.x     | Security fixes | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes   | >=5.5,<8.0   |
+| 7.x     | Latest         | `guzzlehttp/guzzle` | `GuzzleHttp` | [v7][guzzle-7-repo] | [v7][guzzle-7-docs] | Yes   | >=7.2.5,<8.2 |
 
 
 [guzzle-3-repo]: https://github.com/guzzle/guzzle3
 [guzzle-3-repo]: https://github.com/guzzle/guzzle3
 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
 [guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x
 [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
 [guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3
 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5
 [guzzle-6-repo]: https://github.com/guzzle/guzzle/tree/6.5
 [guzzle-7-repo]: https://github.com/guzzle/guzzle
 [guzzle-7-repo]: https://github.com/guzzle/guzzle
-[guzzle-3-docs]: http://guzzle3.readthedocs.org
-[guzzle-5-docs]: http://docs.guzzlephp.org/en/5.3/
-[guzzle-6-docs]: http://docs.guzzlephp.org/en/6.5/
-[guzzle-7-docs]: http://docs.guzzlephp.org/en/latest/
+[guzzle-3-docs]: https://guzzle3.readthedocs.io/
+[guzzle-5-docs]: https://docs.guzzlephp.org/en/5.3/
+[guzzle-6-docs]: https://docs.guzzlephp.org/en/6.5/
+[guzzle-7-docs]: https://docs.guzzlephp.org/en/latest/
 
 
 
 
 ## Security
 ## Security

+ 4 - 1
vendor/guzzlehttp/guzzle/composer.json

@@ -54,7 +54,7 @@
         "php": "^7.2.5 || ^8.0",
         "php": "^7.2.5 || ^8.0",
         "ext-json": "*",
         "ext-json": "*",
         "guzzlehttp/promises": "^1.5",
         "guzzlehttp/promises": "^1.5",
-        "guzzlehttp/psr7": "^1.8.3 || ^2.1",
+        "guzzlehttp/psr7": "^1.9 || ^2.4",
         "psr/http-client": "^1.0",
         "psr/http-client": "^1.0",
         "symfony/deprecation-contracts": "^2.2 || ^3.0"
         "symfony/deprecation-contracts": "^2.2 || ^3.0"
     },
     },
@@ -74,6 +74,9 @@
         "psr/log": "Required for using the Log middleware"
         "psr/log": "Required for using the Log middleware"
     },
     },
     "config": {
     "config": {
+        "allow-plugins": {
+            "bamarni/composer-bin-plugin": true
+        },
         "preferred-install": "dist",
         "preferred-install": "dist",
         "sort-packages": true
         "sort-packages": true
     },
     },

+ 5 - 0
vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php

@@ -241,6 +241,11 @@ class CookieJar implements CookieJarInterface
                 if (0 !== \strpos($sc->getPath(), '/')) {
                 if (0 !== \strpos($sc->getPath(), '/')) {
                     $sc->setPath($this->getCookiePathFromRequest($request));
                     $sc->setPath($this->getCookiePathFromRequest($request));
                 }
                 }
+                if (!$sc->matchesDomain($request->getUri()->getHost())) {
+                    continue;
+                }
+                // Note: At this point `$sc->getDomain()` being a public suffix should
+                // be rejected, but we don't want to pull in the full PSL dependency.
                 $this->setCookie($sc);
                 $this->setCookie($sc);
             }
             }
         }
         }

+ 4 - 2
vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php

@@ -379,10 +379,12 @@ class SetCookie
 
 
         // Remove the leading '.' as per spec in RFC 6265.
         // Remove the leading '.' as per spec in RFC 6265.
         // https://tools.ietf.org/html/rfc6265#section-5.2.3
         // https://tools.ietf.org/html/rfc6265#section-5.2.3
-        $cookieDomain = \ltrim($cookieDomain, '.');
+        $cookieDomain = \ltrim(\strtolower($cookieDomain), '.');
+
+        $domain = \strtolower($domain);
 
 
         // Domain not set or exact match.
         // Domain not set or exact match.
-        if (!$cookieDomain || !\strcasecmp($domain, $cookieDomain)) {
+        if ('' === $cookieDomain || $domain === $cookieDomain) {
             return true;
             return true;
         }
         }
 
 

+ 2 - 2
vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php

@@ -32,9 +32,9 @@ class CurlMultiHandler
     private $selectTimeout;
     private $selectTimeout;
 
 
     /**
     /**
-     * @var resource|\CurlMultiHandle|null the currently executing resource in `curl_multi_exec`.
+     * @var int Will be higher than 0 when `curl_multi_exec` is still running.
      */
      */
-    private $active;
+    private $active = 0;
 
 
     /**
     /**
      * @var array Request entry handles, indexed by handle id in `addRequest`.
      * @var array Request entry handles, indexed by handle id in `addRequest`.

+ 8 - 1
vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php

@@ -266,6 +266,10 @@ class StreamHandler
             $methods = \array_flip(\get_class_methods(__CLASS__));
             $methods = \array_flip(\get_class_methods(__CLASS__));
         }
         }
 
 
+        if (!\in_array($request->getUri()->getScheme(), ['http', 'https'])) {
+            throw new RequestException(\sprintf("The scheme '%s' is not supported.", $request->getUri()->getScheme()), $request);
+        }
+
         // HTTP/1.1 streams using the PHP stream wrapper require a
         // HTTP/1.1 streams using the PHP stream wrapper require a
         // Connection: close header
         // Connection: close header
         if ($request->getProtocolVersion() == '1.1'
         if ($request->getProtocolVersion() == '1.1'
@@ -318,7 +322,7 @@ class StreamHandler
         return $this->createResource(
         return $this->createResource(
             function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) {
             function () use ($uri, &$http_response_header, $contextResource, $context, $options, $request) {
                 $resource = @\fopen((string) $uri, 'r', false, $contextResource);
                 $resource = @\fopen((string) $uri, 'r', false, $contextResource);
-                $this->lastHeaders = $http_response_header;
+                $this->lastHeaders = $http_response_header ?? [];
 
 
                 if (false === $resource) {
                 if (false === $resource) {
                     throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context);
                     throw new ConnectException(sprintf('Connection refused for URI %s', $uri), $request, null, $context);
@@ -377,6 +381,9 @@ class StreamHandler
                 'ignore_errors'    => true,
                 'ignore_errors'    => true,
                 'follow_location'  => 0,
                 'follow_location'  => 0,
             ],
             ],
+            'ssl' => [
+                'peer_name' => $request->getUri()->getHost(),
+            ],
         ];
         ];
 
 
         $body = (string) $request->getBody();
         $body = (string) $request->getBody();

+ 19 - 7
vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php

@@ -88,6 +88,14 @@ class RedirectMiddleware
         $this->guardMax($request, $response, $options);
         $this->guardMax($request, $response, $options);
         $nextRequest = $this->modifyRequest($request, $options, $response);
         $nextRequest = $this->modifyRequest($request, $options, $response);
 
 
+        // If authorization is handled by curl, unset it if URI is cross-origin.
+        if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && defined('\CURLOPT_HTTPAUTH')) {
+            unset(
+                $options['curl'][\CURLOPT_HTTPAUTH],
+                $options['curl'][\CURLOPT_USERPWD]
+            );
+        }
+
         if (isset($options['allow_redirects']['on_redirect'])) {
         if (isset($options['allow_redirects']['on_redirect'])) {
             ($options['allow_redirects']['on_redirect'])(
             ($options['allow_redirects']['on_redirect'])(
                 $request,
                 $request,
@@ -132,7 +140,7 @@ class RedirectMiddleware
     }
     }
 
 
     /**
     /**
-     * Check for too many redirects
+     * Check for too many redirects.
      *
      *
      * @throws TooManyRedirectsException Too many redirects.
      * @throws TooManyRedirectsException Too many redirects.
      */
      */
@@ -168,7 +176,7 @@ class RedirectMiddleware
             $modify['body'] = '';
             $modify['body'] = '';
         }
         }
 
 
-        $uri = $this->redirectUri($request, $response, $protocols);
+        $uri = self::redirectUri($request, $response, $protocols);
         if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
         if (isset($options['idn_conversion']) && ($options['idn_conversion'] !== false)) {
             $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion'];
             $idnOptions = ($options['idn_conversion'] === true) ? \IDNA_DEFAULT : $options['idn_conversion'];
             $uri = Utils::idnUriConvert($uri, $idnOptions);
             $uri = Utils::idnUriConvert($uri, $idnOptions);
@@ -188,19 +196,23 @@ class RedirectMiddleware
             $modify['remove_headers'][] = 'Referer';
             $modify['remove_headers'][] = 'Referer';
         }
         }
 
 
-        // Remove Authorization header if host is different.
-        if ($request->getUri()->getHost() !== $modify['uri']->getHost()) {
+        // Remove Authorization and Cookie headers if URI is cross-origin.
+        if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) {
             $modify['remove_headers'][] = 'Authorization';
             $modify['remove_headers'][] = 'Authorization';
+            $modify['remove_headers'][] = 'Cookie';
         }
         }
 
 
         return Psr7\Utils::modifyRequest($request, $modify);
         return Psr7\Utils::modifyRequest($request, $modify);
     }
     }
 
 
     /**
     /**
-     * Set the appropriate URL on the request based on the location header
+     * Set the appropriate URL on the request based on the location header.
      */
      */
-    private function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols): UriInterface
-    {
+    private static function redirectUri(
+        RequestInterface $request,
+        ResponseInterface $response,
+        array $protocols
+    ): UriInterface {
         $location = Psr7\UriResolver::resolve(
         $location = Psr7\UriResolver::resolve(
             $request->getUri(),
             $request->getUri(),
             new Psr7\Uri($response->getHeaderLine('Location'))
             new Psr7\Uri($response->getHeaderLine('Location'))

+ 52 - 0
vendor/guzzlehttp/psr7/CHANGELOG.md

@@ -7,6 +7,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 
 ## Unreleased
 ## Unreleased
 
 
+## 2.4.0 - 2022-06-20
+
+### Added
+
+- Added provisional PHP 8.2 support
+- Added `UriComparator::isCrossOrigin` method
+
+## 2.3.0 - 2022-06-09
+
+### Fixed
+
+- Added `Header::splitList` method
+- Added `Utils::tryGetContents` method
+- Improved `Stream::getContents` method
+- Updated mimetype mappings
+
+## 2.2.2 - 2022-06-08
+
+### Fixed
+
+- Fix `Message::parseRequestUri` for numeric headers
+- Re-wrap exceptions thrown in `fread` into runtime exceptions
+- Throw an exception when multipart options is misformatted
+
+## 2.2.1 - 2022-03-20
+
+### Fixed
+
+- Correct header value validation
+
+## 2.2.0 - 2022-03-20
+
+### Added
+
+- A more compressive list of mime types
+- Add JsonSerializable to Uri
+- Missing return types
+
+### Fixed
+
+- Bug MultipartStream no `uri` metadata
+- Bug MultipartStream with filename for `data://` streams
+- Fixed new line handling in MultipartStream
+- Reduced RAM usage when copying streams
+- Updated parsing in `Header::normalize()`
+
+## 2.1.1 - 2022-03-20
+
+### Fixed
+
+- Validate header values properly
+
 ## 2.1.0 - 2021-10-06
 ## 2.1.0 - 2021-10-06
 
 
 ### Changed
 ### Changed

+ 33 - 2
vendor/guzzlehttp/psr7/README.md

@@ -1,6 +1,6 @@
 # PSR-7 Message Implementation
 # PSR-7 Message Implementation
 
 
-This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/)
+This repository contains a full [PSR-7](https://www.php-fig.org/psr/psr-7/)
 message implementation, several stream decorators, and some helpful
 message implementation, several stream decorators, and some helpful
 functionality like query string parsing.
 functionality like query string parsing.
 
 
@@ -527,6 +527,17 @@ When fopen fails, PHP normally raises a warning. This function adds an
 error handler that checks for errors and throws an exception instead.
 error handler that checks for errors and throws an exception instead.
 
 
 
 
+## `GuzzleHttp\Psr7\Utils::tryGetContents`
+
+`public static function tryGetContents(resource $stream): string`
+
+Safely gets the contents of a given stream.
+
+When stream_get_contents fails, PHP normally raises a warning. This
+function adds an error handler that checks for errors and throws an
+exception instead.
+
+
 ## `GuzzleHttp\Psr7\Utils::uriFor`
 ## `GuzzleHttp\Psr7\Utils::uriFor`
 
 
 `public static function uriFor(string|UriInterface $uri): UriInterface`
 `public static function uriFor(string|UriInterface $uri): UriInterface`
@@ -658,7 +669,7 @@ manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__to
 
 
 `public static function fromParts(array $parts): UriInterface`
 `public static function fromParts(array $parts): UriInterface`
 
 
-Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components.
+Creates a URI from a hash of [`parse_url`](https://www.php.net/manual/en/function.parse-url.php) components.
 
 
 
 
 ### `GuzzleHttp\Psr7\Uri::withQueryValue`
 ### `GuzzleHttp\Psr7\Uri::withQueryValue`
@@ -683,6 +694,16 @@ associative array of key => value.
 Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
 Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the
 provided key are removed.
 provided key are removed.
 
 
+## Cross-Origin Detection
+
+`GuzzleHttp\Psr7\UriComparator` provides methods to determine if a modified URL should be considered cross-origin.
+
+### `GuzzleHttp\Psr7\UriComparator::isCrossOrigin`
+
+`public static function isCrossOrigin(UriInterface $original, UriInterface $modified): bool`
+
+Determines if a modified URL should be considered cross-origin with respect to an original URL.
+
 ## Reference Resolution
 ## Reference Resolution
 
 
 `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
 `GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according
@@ -808,14 +829,24 @@ This of course assumes they will be resolved against the same base URI. If this
 equivalence or difference of relative references does not mean anything.
 equivalence or difference of relative references does not mean anything.
 
 
 
 
+## Version Guidance
+
+| Version | Status         | PHP Version      |
+|---------|----------------|------------------|
+| 1.x     | Security fixes | >=5.4,<8.1       |
+| 2.x     | Latest         | ^7.2.5 \|\| ^8.0 |
+
+
 ## Security
 ## Security
 
 
 If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.
 If you discover a security vulnerability within this package, please send an email to security@tidelift.com. All security vulnerabilities will be promptly addressed. Please do not disclose security-related issues publicly until a fix has been announced. Please see [Security Policy](https://github.com/guzzle/psr7/security/policy) for more information.
 
 
+
 ## License
 ## License
 
 
 Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
 Guzzle is made available under the MIT License (MIT). Please see [License File](LICENSE) for more information.
 
 
+
 ## For Enterprise
 ## For Enterprise
 
 
 Available as part of the Tidelift Subscription
 Available as part of the Tidelift Subscription

+ 4 - 1
vendor/guzzlehttp/psr7/composer.json

@@ -79,10 +79,13 @@
     },
     },
     "extra": {
     "extra": {
         "branch-alias": {
         "branch-alias": {
-            "dev-master": "2.1-dev"
+            "dev-master": "2.4-dev"
         }
         }
     },
     },
     "config": {
     "config": {
+        "allow-plugins": {
+            "bamarni/composer-bin-plugin": true
+        },
         "preferred-install": "dist",
         "preferred-install": "dist",
         "sort-packages": true
         "sort-packages": true
     }
     }

+ 5 - 0
vendor/guzzlehttp/psr7/src/CachingStream.php

@@ -21,6 +21,11 @@ final class CachingStream implements StreamInterface
     private $skipReadBytes = 0;
     private $skipReadBytes = 0;
 
 
     /**
     /**
+     * @var StreamInterface
+     */
+    private $stream;
+
+    /**
      * We will treat the buffer object as the body of the stream
      * We will treat the buffer object as the body of the stream
      *
      *
      * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.
      * @param StreamInterface $stream Stream to cache. The cursor is assumed to be at the beginning of the stream.

+ 3 - 0
vendor/guzzlehttp/psr7/src/DroppingStream.php

@@ -17,6 +17,9 @@ final class DroppingStream implements StreamInterface
     /** @var int */
     /** @var int */
     private $maxLength;
     private $maxLength;
 
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
     /**
      * @param StreamInterface $stream    Underlying stream to decorate.
      * @param StreamInterface $stream    Underlying stream to decorate.
      * @param int             $maxLength Maximum size before dropping data.
      * @param int             $maxLength Maximum size before dropping data.

+ 1 - 0
vendor/guzzlehttp/psr7/src/FnStream.php

@@ -12,6 +12,7 @@ use Psr\Http\Message\StreamInterface;
  * Allows for easy testing and extension of a provided stream without needing
  * Allows for easy testing and extension of a provided stream without needing
  * to create a concrete class for a simple extension point.
  * to create a concrete class for a simple extension point.
  */
  */
+#[\AllowDynamicProperties]
 final class FnStream implements StreamInterface
 final class FnStream implements StreamInterface
 {
 {
     private const SLOTS = [
     private const SLOTS = [

+ 85 - 20
vendor/guzzlehttp/psr7/src/Header.php

@@ -19,20 +19,22 @@ final class Header
         static $trimmed = "\"'  \n\t\r";
         static $trimmed = "\"'  \n\t\r";
         $params = $matches = [];
         $params = $matches = [];
 
 
-        foreach (self::normalize($header) as $val) {
-            $part = [];
-            foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
-                if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
-                    $m = $matches[0];
-                    if (isset($m[1])) {
-                        $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
-                    } else {
-                        $part[] = trim($m[0], $trimmed);
+        foreach ((array) $header as $value) {
+            foreach (self::splitList($value) as $val) {
+                $part = [];
+                foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) {
+                    if (preg_match_all('/<[^>]+>|[^=]+/', $kvp, $matches)) {
+                        $m = $matches[0];
+                        if (isset($m[1])) {
+                            $part[trim($m[0], $trimmed)] = trim($m[1], $trimmed);
+                        } else {
+                            $part[] = trim($m[0], $trimmed);
+                        }
                     }
                     }
                 }
                 }
-            }
-            if ($part) {
-                $params[] = $part;
+                if ($part) {
+                    $params[] = $part;
+                }
             }
             }
         }
         }
 
 
@@ -44,23 +46,86 @@ final class Header
      * headers into an array of headers with no comma separated values.
      * headers into an array of headers with no comma separated values.
      *
      *
      * @param string|array $header Header to normalize.
      * @param string|array $header Header to normalize.
+     *
+     * @deprecated Use self::splitList() instead.
      */
      */
     public static function normalize($header): array
     public static function normalize($header): array
     {
     {
-        if (!is_array($header)) {
-            return array_map('trim', explode(',', $header));
+        $result = [];
+        foreach ((array) $header as $value) {
+            foreach (self::splitList($value) as $parsed) {
+                $result[] = $parsed;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Splits a HTTP header defined to contain comma-separated list into
+     * each individual value. Empty values will be removed.
+     *
+     * Example headers include 'accept', 'cache-control' and 'if-none-match'.
+     *
+     * This method must not be used to parse headers that are not defined as
+     * a list, such as 'user-agent' or 'set-cookie'.
+     *
+     * @param string|string[] $values Header value as returned by MessageInterface::getHeader()
+     *
+     * @return string[]
+     */
+    public static function splitList($values): array
+    {
+        if (!\is_array($values)) {
+            $values = [$values];
         }
         }
 
 
         $result = [];
         $result = [];
-        foreach ($header as $value) {
-            foreach ((array) $value as $v) {
-                if (strpos($v, ',') === false) {
-                    $result[] = $v;
+        foreach ($values as $value) {
+            if (!\is_string($value)) {
+                throw new \TypeError('$header must either be a string or an array containing strings.');
+            }
+
+            $v = '';
+            $isQuoted = false;
+            $isEscaped = false;
+            for ($i = 0, $max = \strlen($value); $i < $max; $i++) {
+                if ($isEscaped) {
+                    $v .= $value[$i];
+                    $isEscaped = false;
+
                     continue;
                     continue;
                 }
                 }
-                foreach (preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) {
-                    $result[] = trim($vv);
+
+                if (!$isQuoted && $value[$i] === ',') {
+                    $v = \trim($v);
+                    if ($v !== '') {
+                        $result[] = $v;
+                    }
+
+                    $v = '';
+                    continue;
                 }
                 }
+
+                if ($isQuoted && $value[$i] === '\\') {
+                    $isEscaped = true;
+                    $v .= $value[$i];
+
+                    continue;
+                }
+                if ($value[$i] === '"') {
+                    $isQuoted = !$isQuoted;
+                    $v .= $value[$i];
+
+                    continue;
+                }
+
+                $v .= $value[$i];
+            }
+
+            $v = \trim($v);
+            if ($v !== '') {
+                $result[] = $v;
             }
             }
         }
         }
 
 

+ 3 - 0
vendor/guzzlehttp/psr7/src/InflateStream.php

@@ -21,6 +21,9 @@ final class InflateStream implements StreamInterface
 {
 {
     use StreamDecoratorTrait;
     use StreamDecoratorTrait;
 
 
+    /** @var StreamInterface */
+    private $stream;
+
     public function __construct(StreamInterface $stream)
     public function __construct(StreamInterface $stream)
     {
     {
         $resource = StreamWrapper::getResource($stream);
         $resource = StreamWrapper::getResource($stream);

+ 1 - 0
vendor/guzzlehttp/psr7/src/LazyOpenStream.php

@@ -10,6 +10,7 @@ use Psr\Http\Message\StreamInterface;
  * Lazily reads or writes to a file that is opened only after an IO operation
  * Lazily reads or writes to a file that is opened only after an IO operation
  * take place on the stream.
  * take place on the stream.
  */
  */
+#[\AllowDynamicProperties]
 final class LazyOpenStream implements StreamInterface
 final class LazyOpenStream implements StreamInterface
 {
 {
     use StreamDecoratorTrait;
     use StreamDecoratorTrait;

+ 3 - 0
vendor/guzzlehttp/psr7/src/LimitStream.php

@@ -19,6 +19,9 @@ final class LimitStream implements StreamInterface
     /** @var int Limit the number of bytes that can be read */
     /** @var int Limit the number of bytes that can be read */
     private $limit;
     private $limit;
 
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
     /**
      * @param StreamInterface $stream Stream to wrap
      * @param StreamInterface $stream Stream to wrap
      * @param int             $limit  Total number of bytes to allow to be read
      * @param int             $limit  Total number of bytes to allow to be read

+ 3 - 0
vendor/guzzlehttp/psr7/src/Message.php

@@ -175,6 +175,9 @@ final class Message
     public static function parseRequestUri(string $path, array $headers): string
     public static function parseRequestUri(string $path, array $headers): string
     {
     {
         $hostKey = array_filter(array_keys($headers), function ($k) {
         $hostKey = array_filter(array_keys($headers), function ($k) {
+            // Numeric array keys are converted to int by PHP.
+            $k = (string) $k;
+
             return strtolower($k) === 'host';
             return strtolower($k) === 'host';
         });
         });
 
 

+ 38 - 9
vendor/guzzlehttp/psr7/src/MessageTrait.php

@@ -145,11 +145,9 @@ trait MessageTrait
     {
     {
         $this->headerNames = $this->headers = [];
         $this->headerNames = $this->headers = [];
         foreach ($headers as $header => $value) {
         foreach ($headers as $header => $value) {
-            if (is_int($header)) {
-                // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec
-                // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass.
-                $header = (string) $header;
-            }
+            // Numeric array keys are converted to int by PHP.
+            $header = (string) $header;
+
             $this->assertHeader($header);
             $this->assertHeader($header);
             $value = $this->normalizeHeaderValue($value);
             $value = $this->normalizeHeaderValue($value);
             $normalized = strtolower($header);
             $normalized = strtolower($header);
@@ -171,14 +169,14 @@ trait MessageTrait
     private function normalizeHeaderValue($value): array
     private function normalizeHeaderValue($value): array
     {
     {
         if (!is_array($value)) {
         if (!is_array($value)) {
-            return $this->trimHeaderValues([$value]);
+            return $this->trimAndValidateHeaderValues([$value]);
         }
         }
 
 
         if (count($value) === 0) {
         if (count($value) === 0) {
             throw new \InvalidArgumentException('Header value can not be an empty array.');
             throw new \InvalidArgumentException('Header value can not be an empty array.');
         }
         }
 
 
-        return $this->trimHeaderValues($value);
+        return $this->trimAndValidateHeaderValues($value);
     }
     }
 
 
     /**
     /**
@@ -195,7 +193,7 @@ trait MessageTrait
      *
      *
      * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
      * @see https://tools.ietf.org/html/rfc7230#section-3.2.4
      */
      */
-    private function trimHeaderValues(array $values): array
+    private function trimAndValidateHeaderValues(array $values): array
     {
     {
         return array_map(function ($value) {
         return array_map(function ($value) {
             if (!is_scalar($value) && null !== $value) {
             if (!is_scalar($value) && null !== $value) {
@@ -205,7 +203,10 @@ trait MessageTrait
                 ));
                 ));
             }
             }
 
 
-            return trim((string) $value, " \t");
+            $trimmed = trim((string) $value, " \t");
+            $this->assertValue($trimmed);
+
+            return $trimmed;
         }, array_values($values));
         }, array_values($values));
     }
     }
 
 
@@ -232,4 +233,32 @@ trait MessageTrait
             );
             );
         }
         }
     }
     }
+
+    /**
+     * @see https://tools.ietf.org/html/rfc7230#section-3.2
+     *
+     * field-value    = *( field-content / obs-fold )
+     * field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
+     * field-vchar    = VCHAR / obs-text
+     * VCHAR          = %x21-7E
+     * obs-text       = %x80-FF
+     * obs-fold       = CRLF 1*( SP / HTAB )
+     */
+    private function assertValue(string $value): void
+    {
+        // The regular expression intentionally does not support the obs-fold production, because as
+        // per RFC 7230#3.2.4:
+        //
+        // A sender MUST NOT generate a message that includes
+        // line folding (i.e., that has any field-value that contains a match to
+        // the obs-fold rule) unless the message is intended for packaging
+        // within the message/http media type.
+        //
+        // Clients must not send a request with line folding and a server sending folded headers is
+        // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting
+        // folding is not likely to break any legitimate use case.
+        if (! preg_match('/^[\x20\x09\x21-\x7E\x80-\xFF]*$/', $value)) {
+            throw new \InvalidArgumentException(sprintf('"%s" is not valid header value', $value));
+        }
+    }
 }
 }

File diff suppressed because it is too large
+ 1208 - 101
vendor/guzzlehttp/psr7/src/MimeType.php


+ 7 - 1
vendor/guzzlehttp/psr7/src/MultipartStream.php

@@ -17,6 +17,9 @@ final class MultipartStream implements StreamInterface
     /** @var string */
     /** @var string */
     private $boundary;
     private $boundary;
 
 
+    /** @var StreamInterface */
+    private $stream;
+
     /**
     /**
      * @param array  $elements Array of associative arrays, each containing a
      * @param array  $elements Array of associative arrays, each containing a
      *                         required "name" key mapping to the form field,
      *                         required "name" key mapping to the form field,
@@ -68,6 +71,9 @@ final class MultipartStream implements StreamInterface
         $stream = new AppendStream();
         $stream = new AppendStream();
 
 
         foreach ($elements as $element) {
         foreach ($elements as $element) {
+            if (!is_array($element)) {
+                throw new \UnexpectedValueException("An array is expected");
+            }
             $this->addElement($stream, $element);
             $this->addElement($stream, $element);
         }
         }
 
 
@@ -89,7 +95,7 @@ final class MultipartStream implements StreamInterface
 
 
         if (empty($element['filename'])) {
         if (empty($element['filename'])) {
             $uri = $element['contents']->getMetadata('uri');
             $uri = $element['contents']->getMetadata('uri');
-            if (substr($uri, 0, 6) !== 'php://') {
+            if ($uri && \is_string($uri) && \substr($uri, 0, 6) !== 'php://' && \substr($uri, 0, 7) !== 'data://') {
                 $element['filename'] = $uri;
                 $element['filename'] = $uri;
             }
             }
         }
         }

+ 3 - 0
vendor/guzzlehttp/psr7/src/NoSeekStream.php

@@ -13,6 +13,9 @@ final class NoSeekStream implements StreamInterface
 {
 {
     use StreamDecoratorTrait;
     use StreamDecoratorTrait;
 
 
+    /** @var StreamInterface */
+    private $stream;
+
     public function seek($offset, $whence = SEEK_SET): void
     public function seek($offset, $whence = SEEK_SET): void
     {
     {
         throw new \RuntimeException('Cannot seek a NoSeekStream');
         throw new \RuntimeException('Cannot seek a NoSeekStream');

+ 1 - 1
vendor/guzzlehttp/psr7/src/Query.php

@@ -43,7 +43,7 @@ final class Query
             $parts = explode('=', $kvp, 2);
             $parts = explode('=', $kvp, 2);
             $key = $decoder($parts[0]);
             $key = $decoder($parts[0]);
             $value = isset($parts[1]) ? $decoder($parts[1]) : null;
             $value = isset($parts[1]) ? $decoder($parts[1]) : null;
-            if (!isset($result[$key])) {
+            if (!array_key_exists($key, $result)) {
                 $result[$key] = $value;
                 $result[$key] = $value;
             } else {
             } else {
                 if (!is_array($result[$key])) {
                 if (!is_array($result[$key])) {

+ 1 - 1
vendor/guzzlehttp/psr7/src/ServerRequest.php

@@ -80,7 +80,7 @@ class ServerRequest extends Request implements ServerRequestInterface
     /**
     /**
      * Return an UploadedFile instance array.
      * Return an UploadedFile instance array.
      *
      *
-     * @param array $files A array which respect $_FILES structure
+     * @param array $files An array which respect $_FILES structure
      *
      *
      * @throws InvalidArgumentException for unrecognized values
      * @throws InvalidArgumentException for unrecognized values
      */
      */

+ 9 - 6
vendor/guzzlehttp/psr7/src/Stream.php

@@ -96,13 +96,11 @@ class Stream implements StreamInterface
             throw new \RuntimeException('Stream is detached');
             throw new \RuntimeException('Stream is detached');
         }
         }
 
 
-        $contents = stream_get_contents($this->stream);
-
-        if ($contents === false) {
-            throw new \RuntimeException('Unable to read stream contents');
+        if (!$this->readable) {
+            throw new \RuntimeException('Cannot read from non-readable stream');
         }
         }
 
 
-        return $contents;
+        return Utils::tryGetContents($this->stream);
     }
     }
 
 
     public function close(): void
     public function close(): void
@@ -229,7 +227,12 @@ class Stream implements StreamInterface
             return '';
             return '';
         }
         }
 
 
-        $string = fread($this->stream, $length);
+        try {
+            $string = fread($this->stream, $length);
+        } catch (\Exception $e) {
+            throw new \RuntimeException('Unable to read from stream', 0, $e);
+        }
+
         if (false === $string) {
         if (false === $string) {
             throw new \RuntimeException('Unable to read from stream');
             throw new \RuntimeException('Unable to read from stream');
         }
         }

+ 6 - 1
vendor/guzzlehttp/psr7/src/Uri.php

@@ -14,7 +14,7 @@ use Psr\Http\Message\UriInterface;
  * @author Tobias Schultze
  * @author Tobias Schultze
  * @author Matthew Weier O'Phinney
  * @author Matthew Weier O'Phinney
  */
  */
-class Uri implements UriInterface
+class Uri implements UriInterface, \JsonSerializable
 {
 {
     /**
     /**
      * Absolute http and https URIs require a host per RFC 7230 Section 2.7
      * Absolute http and https URIs require a host per RFC 7230 Section 2.7
@@ -525,6 +525,11 @@ class Uri implements UriInterface
         return $new;
         return $new;
     }
     }
 
 
+    public function jsonSerialize(): string
+    {
+        return $this->__toString();
+    }
+
     /**
     /**
      * Apply parse_url parts to a URI.
      * Apply parse_url parts to a URI.
      *
      *

+ 49 - 2
vendor/guzzlehttp/psr7/src/Utils.php

@@ -131,7 +131,7 @@ final class Utils
             hash_update($ctx, $stream->read(1048576));
             hash_update($ctx, $stream->read(1048576));
         }
         }
 
 
-        $out = hash_final($ctx, (bool) $rawOutput);
+        $out = hash_final($ctx, $rawOutput);
         $stream->seek($pos);
         $stream->seek($pos);
 
 
         return $out;
         return $out;
@@ -304,7 +304,7 @@ final class Utils
                 /** @var resource $resource */
                 /** @var resource $resource */
                 if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {
                 if ((\stream_get_meta_data($resource)['uri'] ?? '') === 'php://input') {
                     $stream = self::tryFopen('php://temp', 'w+');
                     $stream = self::tryFopen('php://temp', 'w+');
-                    fwrite($stream, stream_get_contents($resource));
+                    stream_copy_to_stream($resource, $stream);
                     fseek($stream, 0);
                     fseek($stream, 0);
                     $resource = $stream;
                     $resource = $stream;
                 }
                 }
@@ -387,6 +387,53 @@ final class Utils
     }
     }
 
 
     /**
     /**
+     * Safely gets the contents of a given stream.
+     *
+     * When stream_get_contents fails, PHP normally raises a warning. This
+     * function adds an error handler that checks for errors and throws an
+     * exception instead.
+     *
+     * @param resource $stream
+     *
+     * @throws \RuntimeException if the stream cannot be read
+     */
+    public static function tryGetContents($stream): string
+    {
+        $ex = null;
+        set_error_handler(static function (int $errno, string $errstr) use (&$ex): bool {
+            $ex = new \RuntimeException(sprintf(
+                'Unable to read stream contents: %s',
+                $errstr
+            ));
+
+            return true;
+        });
+
+        try {
+            /** @var string|false $contents */
+            $contents = stream_get_contents($stream);
+
+            if ($contents === false) {
+                $ex = new \RuntimeException('Unable to read stream contents');
+            }
+        } catch (\Throwable $e) {
+            $ex = new \RuntimeException(sprintf(
+                'Unable to read stream contents: %s',
+                $e->getMessage()
+            ), 0, $e);
+        }
+
+        restore_error_handler();
+
+        if ($ex) {
+            /** @var $ex \RuntimeException */
+            throw $ex;
+        }
+
+        return $contents;
+    }
+
+    /**
      * Returns a UriInterface for the given value.
      * Returns a UriInterface for the given value.
      *
      *
      * This function accepts a string or UriInterface and returns a
      * This function accepts a string or UriInterface and returns a

+ 0 - 9
vendor/guzzlehttp/psr7/vendor-bin/php-cs-fixer/composer.json

@@ -1,9 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "friendsofphp/php-cs-fixer": "3.2.1"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 0 - 10
vendor/guzzlehttp/psr7/vendor-bin/phpstan/composer.json

@@ -1,10 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "phpstan/phpstan": "0.12.81",
-        "phpstan/phpstan-deprecation-rules": "0.12.6"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 0 - 9
vendor/guzzlehttp/psr7/vendor-bin/psalm/composer.json

@@ -1,9 +0,0 @@
-{
-    "require": {
-        "php": "^7.2.5 || ^8.0",
-        "psalm/phar": "4.6.2"
-    },
-    "config": {
-        "preferred-install": "dist"
-    }
-}

+ 22 - 0
vendor/monolog/monolog/CHANGELOG.md

@@ -1,3 +1,25 @@
+### 2.8.0 (2022-07-24)
+
+  * Deprecated `CubeHandler` and `PHPConsoleHandler` as both projects are abandoned and those should not be used anymore (#1734)
+  * Added RFC 5424 level (`7` to `0`) support to `Logger::log` and `Logger::addRecord` to increase interoperability (#1723)
+  * Added support for `__toString` for objects which are not json serializable in `JsonFormatter` (#1733)
+  * Added `GoogleCloudLoggingFormatter` (#1719)
+  * Added support for Predis 2.x (#1732)
+  * Added `AmqpHandler->setExtraAttributes` to allow configuring attributes when using an AMQPExchange (#1724)
+  * Fixed serialization/unserialization of handlers to make sure private properties are included (#1727)
+  * Fixed allowInlineLineBreaks in LineFormatter causing issues with windows paths containing `\n` or `\r` sequences (#1720)
+  * Fixed max normalization depth not being taken into account when formatting exceptions with a deep chain of previous exceptions (#1726)
+  * Fixed PHP 8.2 deprecation warnings (#1722)
+  * Fixed rare race condition or filesystem issue where StreamHandler is unable to create the directory the log should go into yet it exists already (#1678)
+
+### 2.7.0 (2022-06-09)
+
+  * Added `$datetime` parameter to `Logger::addRecord` as low level API to allow logging into the past or future (#1682)
+  * Added `Logger::useLoggingLoopDetection` to allow disabling cyclic logging detection in concurrent frameworks (#1681)
+  * Fixed handling of fatal errors if callPrevious is disabled in ErrorHandler (#1670)
+  * Marked the reusable `Monolog\Test\TestCase` class as `@internal` to make sure PHPStorm does not show it above PHPUnit, you may still use it to test your own handlers/etc though (#1677)
+  * Fixed RotatingFileHandler issue when the date format contained slashes (#1671)
+
 ### 2.6.0 (2022-05-10)
 ### 2.6.0 (2022-05-10)
 
 
   * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead
   * Deprecated `SwiftMailerHandler`, use `SymfonyMailerHandler` instead

+ 1 - 3
vendor/monolog/monolog/composer.json

@@ -26,11 +26,10 @@
         "guzzlehttp/psr7": "^2.2",
         "guzzlehttp/psr7": "^2.2",
         "mongodb/mongodb": "^1.8",
         "mongodb/mongodb": "^1.8",
         "php-amqplib/php-amqplib": "~2.4 || ^3",
         "php-amqplib/php-amqplib": "~2.4 || ^3",
-        "php-console/php-console": "^3.1.3",
         "phpspec/prophecy": "^1.15",
         "phpspec/prophecy": "^1.15",
         "phpstan/phpstan": "^0.12.91",
         "phpstan/phpstan": "^0.12.91",
         "phpunit/phpunit": "^8.5.14",
         "phpunit/phpunit": "^8.5.14",
-        "predis/predis": "^1.1",
+        "predis/predis": "^1.1 || ^2.0",
         "rollbar/rollbar": "^1.3 || ^2 || ^3",
         "rollbar/rollbar": "^1.3 || ^2 || ^3",
         "ruflin/elastica": "^7",
         "ruflin/elastica": "^7",
         "swiftmailer/swiftmailer": "^5.3|^6.0",
         "swiftmailer/swiftmailer": "^5.3|^6.0",
@@ -48,7 +47,6 @@
         "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
         "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
         "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
         "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
         "rollbar/rollbar": "Allow sending log messages to Rollbar",
         "rollbar/rollbar": "Allow sending log messages to Rollbar",
-        "php-console/php-console": "Allow sending log messages to Google Chrome",
         "ext-mbstring": "Allow to work properly with unicode symbols",
         "ext-mbstring": "Allow to work properly with unicode symbols",
         "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
         "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
         "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
         "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",

+ 11 - 5
vendor/monolog/monolog/src/Monolog/ErrorHandler.php

@@ -46,8 +46,8 @@ class ErrorHandler
     private $fatalLevel = LogLevel::ALERT;
     private $fatalLevel = LogLevel::ALERT;
     /** @var ?string */
     /** @var ?string */
     private $reservedMemory = null;
     private $reservedMemory = null;
-    /** @var ?mixed */
-    private $lastFatalTrace;
+    /** @var ?array{type: int, message: string, file: string, line: int, trace: mixed} */
+    private $lastFatalData = null;
     /** @var int[] */
     /** @var int[] */
     private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
     private static $fatalErrors = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
 
 
@@ -223,7 +223,7 @@ class ErrorHandler
         } else {
         } else {
             $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
             $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
             array_shift($trace); // Exclude handleError from trace
             array_shift($trace); // Exclude handleError from trace
-            $this->lastFatalTrace = $trace;
+            $this->lastFatalData = ['type' => $code, 'message' => $message, 'file' => $file, 'line' => $line, 'trace' => $trace];
         }
         }
 
 
         if ($this->previousErrorHandler === true) {
         if ($this->previousErrorHandler === true) {
@@ -242,12 +242,18 @@ class ErrorHandler
     {
     {
         $this->reservedMemory = '';
         $this->reservedMemory = '';
 
 
-        $lastError = error_get_last();
+        if (is_array($this->lastFatalData)) {
+            $lastError = $this->lastFatalData;
+        } else {
+            $lastError = error_get_last();
+        }
+
         if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
         if ($lastError && in_array($lastError['type'], self::$fatalErrors, true)) {
+            $trace = $lastError['trace'] ?? null;
             $this->logger->log(
             $this->logger->log(
                 $this->fatalLevel,
                 $this->fatalLevel,
                 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
                 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
-                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace]
+                ['code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $trace]
             );
             );
 
 
             if ($this->logger instanceof Logger) {
             if ($this->logger instanceof Logger) {

+ 18 - 5
vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php

@@ -178,12 +178,25 @@ class JsonFormatter extends NormalizerFormatter
             return $normalized;
             return $normalized;
         }
         }
 
 
-        if ($data instanceof \DateTimeInterface) {
-            return $this->formatDate($data);
-        }
+        if (is_object($data)) {
+            if ($data instanceof \DateTimeInterface) {
+                return $this->formatDate($data);
+            }
+
+            if ($data instanceof Throwable) {
+                return $this->normalizeException($data, $depth);
+            }
+
+            // if the object has specific json serializability we want to make sure we skip the __toString treatment below
+            if ($data instanceof \JsonSerializable) {
+                return $data;
+            }
+
+            if (method_exists($data, '__toString')) {
+                return $data->__toString();
+            }
 
 
-        if ($data instanceof Throwable) {
-            return $this->normalizeException($data, $depth);
+            return $data;
         }
         }
 
 
         if (is_resource($data)) {
         if (is_resource($data)) {

+ 11 - 1
vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php

@@ -153,6 +153,12 @@ class LineFormatter extends NormalizerFormatter
 
 
         if ($previous = $e->getPrevious()) {
         if ($previous = $e->getPrevious()) {
             do {
             do {
+                $depth++;
+                if ($depth > $this->maxNormalizeDepth) {
+                    $str .= '\n[previous exception] Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization';
+                    break;
+                }
+
                 $str .= "\n[previous exception] " . $this->formatException($previous);
                 $str .= "\n[previous exception] " . $this->formatException($previous);
             } while ($previous = $previous->getPrevious());
             } while ($previous = $previous->getPrevious());
         }
         }
@@ -180,7 +186,11 @@ class LineFormatter extends NormalizerFormatter
     {
     {
         if ($this->allowInlineLineBreaks) {
         if ($this->allowInlineLineBreaks) {
             if (0 === strpos($str, '{')) {
             if (0 === strpos($str, '{')) {
-                return str_replace(array('\r', '\n'), array("\r", "\n"), $str);
+                $str = preg_replace('/(?<!\\\\)\\\\[rn]/', "\n", $str);
+                if (null === $str) {
+                    $pcreErrorCode = preg_last_error();
+                    throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . Utils::pcreLastErrorMessage($pcreErrorCode));
+                }
             }
             }
 
 
             return $str;
             return $str;

+ 4 - 0
vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php

@@ -198,6 +198,10 @@ class NormalizerFormatter implements FormatterInterface
      */
      */
     protected function normalizeException(Throwable $e, int $depth = 0)
     protected function normalizeException(Throwable $e, int $depth = 0)
     {
     {
+        if ($depth > $this->maxNormalizeDepth) {
+            return ['Over ' . $this->maxNormalizeDepth . ' levels deep, aborting normalization'];
+        }
+
         if ($e instanceof \JsonSerializable) {
         if ($e instanceof \JsonSerializable) {
             return (array) $e->jsonSerialize();
             return (array) $e->jsonSerialize();
         }
         }

+ 33 - 4
vendor/monolog/monolog/src/Monolog/Handler/AmqpHandler.php

@@ -27,6 +27,31 @@ class AmqpHandler extends AbstractProcessingHandler
      * @var AMQPExchange|AMQPChannel $exchange
      * @var AMQPExchange|AMQPChannel $exchange
      */
      */
     protected $exchange;
     protected $exchange;
+    /** @var array<string, mixed> */
+    private $extraAttributes = [];
+
+    /**
+     * @return array<string, mixed>
+     */
+    public function getExtraAttributes(): array
+    {
+        return $this->extraAttributes;
+    }
+
+    /**
+     * Configure extra attributes to pass to the AMQPExchange (if you are using the amqp extension)
+     *
+     * @param array<string, mixed> $extraAttributes  One of content_type, content_encoding,
+     *                                               message_id, user_id, app_id, delivery_mode,
+     *                                               priority, timestamp, expiration, type
+     *                                               or reply_to, headers.
+     * @return AmqpHandler
+     */
+    public function setExtraAttributes(array $extraAttributes): self
+    {
+        $this->extraAttributes = $extraAttributes;
+        return $this;
+    }
 
 
     /**
     /**
      * @var string
      * @var string
@@ -60,14 +85,18 @@ class AmqpHandler extends AbstractProcessingHandler
         $routingKey = $this->getRoutingKey($record);
         $routingKey = $this->getRoutingKey($record);
 
 
         if ($this->exchange instanceof AMQPExchange) {
         if ($this->exchange instanceof AMQPExchange) {
+            $attributes = [
+                'delivery_mode' => 2,
+                'content_type'  => 'application/json',
+            ];
+            if ($this->extraAttributes) {
+                $attributes = array_merge($attributes, $this->extraAttributes);
+            }
             $this->exchange->publish(
             $this->exchange->publish(
                 $data,
                 $data,
                 $routingKey,
                 $routingKey,
                 0,
                 0,
-                [
-                    'delivery_mode' => 2,
-                    'content_type' => 'application/json',
-                ]
+                $attributes
             );
             );
         } else {
         } else {
             $this->exchange->basic_publish(
             $this->exchange->basic_publish(

+ 3 - 3
vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php

@@ -149,7 +149,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
         }
         }
 
 
         $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
         $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
-        $data = base64_encode(utf8_encode($json));
+        $data = base64_encode($json);
         if (strlen($data) > 3 * 1024) {
         if (strlen($data) > 3 * 1024) {
             self::$overflowed = true;
             self::$overflowed = true;
 
 
@@ -163,8 +163,8 @@ class ChromePHPHandler extends AbstractProcessingHandler
                 'extra' => [],
                 'extra' => [],
             ];
             ];
             self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);
             self::$json['rows'][count(self::$json['rows']) - 1] = $this->getFormatter()->format($record);
-            $json = Utils::jsonEncode(self::$json, null, true);
-            $data = base64_encode(utf8_encode($json));
+            $json = Utils::jsonEncode(self::$json, Utils::DEFAULT_JSON_FLAGS & ~JSON_UNESCAPED_UNICODE, true);
+            $data = base64_encode($json);
         }
         }
 
 
         if (trim($data) !== '') {
         if (trim($data) !== '') {

+ 2 - 1
vendor/monolog/monolog/src/Monolog/Handler/CubeHandler.php

@@ -17,8 +17,9 @@ use Monolog\Utils;
 /**
 /**
  * Logs to Cube.
  * Logs to Cube.
  *
  *
- * @link http://square.github.com/cube/
+ * @link https://github.com/square/cube/wiki
  * @author Wan Chen <kami@kamisama.me>
  * @author Wan Chen <kami@kamisama.me>
+ * @deprecated Since 2.8.0 and 3.2.0, Cube appears abandoned and thus we will drop this handler in Monolog 4
  */
  */
 class CubeHandler extends AbstractProcessingHandler
 class CubeHandler extends AbstractProcessingHandler
 {
 {

+ 10 - 1
vendor/monolog/monolog/src/Monolog/Handler/Handler.php

@@ -48,6 +48,15 @@ abstract class Handler implements HandlerInterface
     {
     {
         $this->close();
         $this->close();
 
 
-        return array_keys(get_object_vars($this));
+        $reflClass = new \ReflectionClass($this);
+
+        $keys = [];
+        foreach ($reflClass->getProperties() as $reflProp) {
+            if (!$reflProp->isStatic()) {
+                $keys[] = $reflProp->getName();
+            }
+        }
+
+        return $keys;
     }
     }
 }
 }

+ 2 - 1
vendor/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php

@@ -25,7 +25,7 @@ use PhpConsole\Helper;
  * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely
  * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely
  *
  *
  * Usage:
  * Usage:
- * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef
+ * 1. Install Google Chrome extension [now dead and removed from the chrome store]
  * 2. See overview https://github.com/barbushin/php-console#overview
  * 2. See overview https://github.com/barbushin/php-console#overview
  * 3. Install PHP Console library https://github.com/barbushin/php-console#installation
  * 3. Install PHP Console library https://github.com/barbushin/php-console#installation
  * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)
  * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png)
@@ -39,6 +39,7 @@ use PhpConsole\Helper;
  * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
  * @author Sergey Barbushin https://www.linkedin.com/in/barbushin
  *
  *
  * @phpstan-import-type Record from \Monolog\Logger
  * @phpstan-import-type Record from \Monolog\Logger
+ * @deprecated Since 2.8.0 and 3.2.0, PHPConsole is abandoned and thus we will drop this handler in Monolog 4
  */
  */
 class PHPConsoleHandler extends AbstractProcessingHandler
 class PHPConsoleHandler extends AbstractProcessingHandler
 {
 {

+ 2 - 2
vendor/monolog/monolog/src/Monolog/Handler/RedisHandler.php

@@ -30,7 +30,7 @@ use Monolog\Logger;
  */
  */
 class RedisHandler extends AbstractProcessingHandler
 class RedisHandler extends AbstractProcessingHandler
 {
 {
-    /** @var \Predis\Client|\Redis */
+    /** @var \Predis\Client<\Predis\Client>|\Redis */
     private $redisClient;
     private $redisClient;
     /** @var string */
     /** @var string */
     private $redisKey;
     private $redisKey;
@@ -38,7 +38,7 @@ class RedisHandler extends AbstractProcessingHandler
     protected $capSize;
     protected $capSize;
 
 
     /**
     /**
-     * @param \Predis\Client|\Redis $redis   The redis instance
+     * @param \Predis\Client<\Predis\Client>|\Redis $redis   The redis instance
      * @param string                $key     The key name to push records to
      * @param string                $key     The key name to push records to
      * @param int                   $capSize Number of entries to limit list size to, 0 = unlimited
      * @param int                   $capSize Number of entries to limit list size to, 0 = unlimited
      */
      */

+ 2 - 2
vendor/monolog/monolog/src/Monolog/Handler/RedisPubSubHandler.php

@@ -28,13 +28,13 @@ use Monolog\Logger;
  */
  */
 class RedisPubSubHandler extends AbstractProcessingHandler
 class RedisPubSubHandler extends AbstractProcessingHandler
 {
 {
-    /** @var \Predis\Client|\Redis */
+    /** @var \Predis\Client<\Predis\Client>|\Redis */
     private $redisClient;
     private $redisClient;
     /** @var string */
     /** @var string */
     private $channelKey;
     private $channelKey;
 
 
     /**
     /**
-     * @param \Predis\Client|\Redis $redis The redis instance
+     * @param \Predis\Client<\Predis\Client>|\Redis $redis The redis instance
      * @param string                $key   The channel key to publish records to
      * @param string                $key   The channel key to publish records to
      */
      */
     public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true)
     public function __construct($redis, string $key, $level = Logger::DEBUG, bool $bubble = true)

+ 5 - 1
vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php

@@ -191,7 +191,11 @@ class RotatingFileHandler extends StreamHandler
         $fileInfo = pathinfo($this->filename);
         $fileInfo = pathinfo($this->filename);
         $glob = str_replace(
         $glob = str_replace(
             ['{filename}', '{date}'],
             ['{filename}', '{date}'],
-            [$fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'],
+            [$fileInfo['filename'], str_replace(
+                ['Y', 'y', 'm', 'd'],
+                ['[0-9][0-9][0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]', '[0-9][0-9]'],
+                $this->dateFormat)
+            ],
             $fileInfo['dirname'] . '/' . $this->filenameFormat
             $fileInfo['dirname'] . '/' . $this->filenameFormat
         );
         );
         if (isset($fileInfo['extension'])) {
         if (isset($fileInfo['extension'])) {

+ 1 - 1
vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php

@@ -212,7 +212,7 @@ class StreamHandler extends AbstractProcessingHandler
             set_error_handler([$this, 'customErrorHandler']);
             set_error_handler([$this, 'customErrorHandler']);
             $status = mkdir($dir, 0777, true);
             $status = mkdir($dir, 0777, true);
             restore_error_handler();
             restore_error_handler();
-            if (false === $status && !is_dir($dir)) {
+            if (false === $status && !is_dir($dir) && strpos((string) $this->errorMessage, 'File exists') === false) {
                 throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir));
                 throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and it could not be created: '.$this->errorMessage, $dir));
             }
             }
         }
         }

+ 52 - 9
vendor/monolog/monolog/src/Monolog/Logger.php

@@ -112,6 +112,22 @@ class Logger implements LoggerInterface, ResettableInterface
     ];
     ];
 
 
     /**
     /**
+     * Mapping between levels numbers defined in RFC 5424 and Monolog ones
+     *
+     * @phpstan-var array<int, Level> $rfc_5424_levels
+     */
+    private const RFC_5424_LEVELS = [
+        7 => self::DEBUG,
+        6 => self::INFO,
+        5 => self::NOTICE,
+        4 => self::WARNING,
+        3 => self::ERROR,
+        2 => self::CRITICAL,
+        1 => self::ALERT,
+        0 => self::EMERGENCY,
+    ];
+
+    /**
      * @var string
      * @var string
      */
      */
     protected $name;
     protected $name;
@@ -153,6 +169,13 @@ class Logger implements LoggerInterface, ResettableInterface
     private $logDepth = 0;
     private $logDepth = 0;
 
 
     /**
     /**
+     * @var bool Whether to detect infinite logging loops
+     *
+     * This can be disabled via {@see useLoggingLoopDetection} if you have async handlers that do not play well with this
+     */
+    private $detectCycles = true;
+
+    /**
      * @psalm-param array<callable(array): array> $processors
      * @psalm-param array<callable(array): array> $processors
      *
      *
      * @param string             $name       The logging channel, a simple descriptive name that is attached to all log records
      * @param string             $name       The logging channel, a simple descriptive name that is attached to all log records
@@ -284,19 +307,33 @@ class Logger implements LoggerInterface, ResettableInterface
         return $this;
         return $this;
     }
     }
 
 
+    public function useLoggingLoopDetection(bool $detectCycles): self
+    {
+        $this->detectCycles = $detectCycles;
+
+        return $this;
+    }
+
     /**
     /**
      * Adds a log record.
      * Adds a log record.
      *
      *
-     * @param  int     $level   The logging level
-     * @param  string  $message The log message
-     * @param  mixed[] $context The log context
-     * @return bool    Whether the record has been processed
+     * @param  int               $level    The logging level (a Monolog or RFC 5424 level)
+     * @param  string            $message  The log message
+     * @param  mixed[]           $context  The log context
+     * @param  DateTimeImmutable $datetime Optional log date to log into the past or future
+     * @return bool              Whether the record has been processed
      *
      *
      * @phpstan-param Level $level
      * @phpstan-param Level $level
      */
      */
-    public function addRecord(int $level, string $message, array $context = []): bool
+    public function addRecord(int $level, string $message, array $context = [], DateTimeImmutable $datetime = null): bool
     {
     {
-        $this->logDepth += 1;
+        if (isset(self::RFC_5424_LEVELS[$level])) {
+            $level = self::RFC_5424_LEVELS[$level];
+        }
+
+        if ($this->detectCycles) {
+            $this->logDepth += 1;
+        }
         if ($this->logDepth === 3) {
         if ($this->logDepth === 3) {
             $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.');
             $this->warning('A possible infinite logging loop was detected and aborted. It appears some of your handler code is triggering logging, see the previous log record for a hint as to what may be the cause.');
             return false;
             return false;
@@ -322,7 +359,7 @@ class Logger implements LoggerInterface, ResettableInterface
                         'level' => $level,
                         'level' => $level,
                         'level_name' => $levelName,
                         'level_name' => $levelName,
                         'channel' => $this->name,
                         'channel' => $this->name,
-                        'datetime' => new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
+                        'datetime' => $datetime ?? new DateTimeImmutable($this->microsecondTimestamps, $this->timezone),
                         'extra' => [],
                         'extra' => [],
                     ];
                     ];
 
 
@@ -349,7 +386,9 @@ class Logger implements LoggerInterface, ResettableInterface
                 }
                 }
             }
             }
         } finally {
         } finally {
-            $this->logDepth--;
+            if ($this->detectCycles) {
+                $this->logDepth--;
+            }
         }
         }
 
 
         return null !== $record;
         return null !== $record;
@@ -501,7 +540,7 @@ class Logger implements LoggerInterface, ResettableInterface
      *
      *
      * This method allows for compatibility with common interfaces.
      * This method allows for compatibility with common interfaces.
      *
      *
-     * @param mixed             $level   The log level
+     * @param mixed             $level   The log level (a Monolog, PSR-3 or RFC 5424 level)
      * @param string|Stringable $message The log message
      * @param string|Stringable $message The log message
      * @param mixed[]           $context The log context
      * @param mixed[]           $context The log context
      *
      *
@@ -513,6 +552,10 @@ class Logger implements LoggerInterface, ResettableInterface
             throw new \InvalidArgumentException('$level is expected to be a string or int');
             throw new \InvalidArgumentException('$level is expected to be a string or int');
         }
         }
 
 
+        if (isset(self::RFC_5424_LEVELS[$level])) {
+            $level = self::RFC_5424_LEVELS[$level];
+        }
+
         $level = static::toMonologLevel($level);
         $level = static::toMonologLevel($level);
 
 
         $this->addRecord($level, (string) $message, $context);
         $this->addRecord($level, (string) $message, $context);

+ 2 - 0
vendor/monolog/monolog/src/Monolog/Test/TestCase.php

@@ -22,6 +22,8 @@ use Monolog\Formatter\FormatterInterface;
  *
  *
  * @phpstan-import-type Record from \Monolog\Logger
  * @phpstan-import-type Record from \Monolog\Logger
  * @phpstan-import-type Level from \Monolog\Logger
  * @phpstan-import-type Level from \Monolog\Logger
+ *
+ * @internal feel free to reuse this to test your own handlers, this is marked internal to avoid issues with PHPStorm https://github.com/Seldaek/monolog/issues/1677
  */
  */
 class TestCase extends \PHPUnit\Framework\TestCase
 class TestCase extends \PHPUnit\Framework\TestCase
 {
 {

+ 1 - 1
vendor/monolog/monolog/src/Monolog/Utils.php

@@ -211,7 +211,7 @@ final class Utils
             $data = preg_replace_callback(
             $data = preg_replace_callback(
                 '/[\x80-\xFF]+/',
                 '/[\x80-\xFF]+/',
                 function ($m) {
                 function ($m) {
-                    return utf8_encode($m[0]);
+                    return function_exists('mb_convert_encoding') ? mb_convert_encoding($m[0], 'UTF-8', 'ISO-8859-1') : utf8_encode($m[0]);
                 },
                 },
                 $data
                 $data
             );
             );

+ 0 - 6
vendor/myclabs/php-enum/.gitattributes

@@ -1,6 +0,0 @@
-# Auto detect text files and perform LF normalization
-* text=auto
-
-tests/ export-ignore
-phpunit.xml export-ignore
-.travis.yml export-ignore

+ 0 - 6
vendor/myclabs/php-enum/.gitignore

@@ -1,6 +0,0 @@
-.DS_Store
-nbproject/*
-.idea/*
-vendor/*
-composer.phar
-composer.lock

+ 2 - 2
vendor/myclabs/php-enum/LICENSE

@@ -1,6 +1,6 @@
-php-enum - PHP Enum implementation http://github.com/myclabs/php-enum
+The MIT License (MIT)
 
 
-Copyright (C) 2015 My C-Labs
+Copyright (c) 2015 My C-Labs
 
 
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 associated documentation files (the "Software"), to deal in the Software without restriction,
 associated documentation files (the "Software"), to deal in the Software without restriction,

+ 22 - 12
vendor/myclabs/php-enum/README.md

@@ -3,14 +3,18 @@
 [![Build Status](https://travis-ci.org/myclabs/php-enum.png?branch=master)](https://travis-ci.org/myclabs/php-enum)
 [![Build Status](https://travis-ci.org/myclabs/php-enum.png?branch=master)](https://travis-ci.org/myclabs/php-enum)
 [![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum)
 [![Latest Stable Version](https://poser.pugx.org/myclabs/php-enum/version.png)](https://packagist.org/packages/myclabs/php-enum)
 [![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum)
 [![Total Downloads](https://poser.pugx.org/myclabs/php-enum/downloads.png)](https://packagist.org/packages/myclabs/php-enum)
+[![psalm](https://shepherd.dev/github/myclabs/php-enum/coverage.svg)](https://shepherd.dev/github/myclabs/php-enum)
+
+Maintenance for this project is [supported via Tidelift](https://tidelift.com/subscription/pkg/packagist-myclabs-php-enum?utm_source=packagist-myclabs-php-enum&utm_medium=referral&utm_campaign=readme).
 
 
 ## Why?
 ## Why?
 
 
-First, and mainly, `SplEnum` is not integrated to PHP, you have to install it separately.
+First, and mainly, `SplEnum` is not integrated to PHP, you have to install the extension separately.
 
 
 Using an enum instead of class constants provides the following advantages:
 Using an enum instead of class constants provides the following advantages:
 
 
-- You can type-hint: `function setAction(Action $action) {`
+- You can use an enum as a parameter type: `function setAction(Action $action) {`
+- You can use an enum as a return type: `function getAction() : Action {`
 - You can enrich the enum with methods (e.g. `format`, `parse`, …)
 - You can enrich the enum with methods (e.g. `format`, `parse`, …)
 - You can extend the enum to add new values (make your enum `final` to prevent it)
 - You can extend the enum to add new values (make your enum `final` to prevent it)
 - You can get a list of all the possible values (see below)
 - You can get a list of all the possible values (see below)
@@ -31,27 +35,29 @@ use MyCLabs\Enum\Enum;
 /**
 /**
  * Action enum
  * Action enum
  */
  */
-class Action extends Enum
+final class Action extends Enum
 {
 {
     private const VIEW = 'view';
     private const VIEW = 'view';
     private const EDIT = 'edit';
     private const EDIT = 'edit';
 }
 }
 ```
 ```
 
 
-Note the `private` keyword requires PHP > 7.1, you can omit it on PHP 7.0.
-
 ## Usage
 ## Usage
 
 
 ```php
 ```php
-$action = new Action(Action::VIEW);
+$action = Action::VIEW();
 
 
+// or with a dynamic key:
+$action = Action::$key();
+// or with a dynamic value:
+$action = Action::from($value);
 // or
 // or
-$action = Action::VIEW();
+$action = new Action($value);
 ```
 ```
 
 
 As you can see, static methods are automatically implemented to provide quick access to an enum value.
 As you can see, static methods are automatically implemented to provide quick access to an enum value.
 
 
-One advantage over using class constants is to be able to type-hint enum values:
+One advantage over using class constants is to be able to use an enum as a parameter type:
 
 
 ```php
 ```php
 function setAction(Action $action) {
 function setAction(Action $action) {
@@ -69,17 +75,19 @@ function setAction(Action $action) {
 
 
 Static methods:
 Static methods:
 
 
+- `from()` Creates an Enum instance, checking that the value exist in the enum
 - `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
 - `toArray()` method Returns all possible values as an array (constant name in key, constant value in value)
 - `keys()` Returns the names (keys) of all constants in the Enum class
 - `keys()` Returns the names (keys) of all constants in the Enum class
 - `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
 - `values()` Returns instances of the Enum class of all Enum constants (constant name in key, Enum instance in value)
 - `isValid()` Check if tested value is valid on enum set
 - `isValid()` Check if tested value is valid on enum set
 - `isValidKey()` Check if tested key is valid on enum set
 - `isValidKey()` Check if tested key is valid on enum set
+- `assertValidValue()` Assert the value is valid on enum set, throwing exception otherwise
 - `search()` Return key for searched value
 - `search()` Return key for searched value
 
 
 ### Static methods
 ### Static methods
 
 
 ```php
 ```php
-class Action extends Enum
+final class Action extends Enum
 {
 {
     private const VIEW = 'view';
     private const VIEW = 'view';
     private const EDIT = 'edit';
     private const EDIT = 'edit';
@@ -95,7 +103,7 @@ Static method helpers are implemented using [`__callStatic()`](http://www.php.ne
 If you care about IDE autocompletion, you can either implement the static methods yourself:
 If you care about IDE autocompletion, you can either implement the static methods yourself:
 
 
 ```php
 ```php
-class Action extends Enum
+final class Action extends Enum
 {
 {
     private const VIEW = 'view';
     private const VIEW = 'view';
 
 
@@ -115,7 +123,7 @@ or you can use phpdoc (this is supported in PhpStorm for example):
  * @method static Action VIEW()
  * @method static Action VIEW()
  * @method static Action EDIT()
  * @method static Action EDIT()
  */
  */
-class Action extends Enum
+final class Action extends Enum
 {
 {
     private const VIEW = 'view';
     private const VIEW = 'view';
     private const EDIT = 'edit';
     private const EDIT = 'edit';
@@ -125,4 +133,6 @@ class Action extends Enum
 ## Related projects
 ## Related projects
 
 
 - [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
 - [Doctrine enum mapping](https://github.com/acelaya/doctrine-enum-type)
-- [Symfony 2/3 ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
+- [Symfony ParamConverter integration](https://github.com/Ex3v/MyCLabsEnumParamConverter)
+- [PHPStan integration](https://github.com/timeweb/phpstan-enum)
+- [Yii2 enum mapping](https://github.com/KartaviK/yii2-enum)

+ 4 - 3
vendor/myclabs/php-enum/composer.json

@@ -22,11 +22,12 @@
         }
         }
     },
     },
     "require": {
     "require": {
-        "php": ">=5.4",
+        "php": "^7.3 || ^8.0",
         "ext-json": "*"
         "ext-json": "*"
     },
     },
     "require-dev": {
     "require-dev": {
-        "phpunit/phpunit": "^4.8.35|^5.7|^6.0",
-        "squizlabs/php_codesniffer": "1.*"
+        "phpunit/phpunit": "^9.5",
+        "squizlabs/php_codesniffer": "1.*",
+        "vimeo/psalm": "^4.6.2"
     }
     }
 }
 }

+ 136 - 22
vendor/myclabs/php-enum/src/Enum.php

@@ -14,6 +14,10 @@ namespace MyCLabs\Enum;
  * @author Matthieu Napoli <matthieu@mnapoli.fr>
  * @author Matthieu Napoli <matthieu@mnapoli.fr>
  * @author Daniel Costa <danielcosta@gmail.com>
  * @author Daniel Costa <danielcosta@gmail.com>
  * @author Mirosław Filip <mirfilip@gmail.com>
  * @author Mirosław Filip <mirfilip@gmail.com>
+ *
+ * @psalm-template T
+ * @psalm-immutable
+ * @psalm-consistent-constructor
  */
  */
 abstract class Enum implements \JsonSerializable
 abstract class Enum implements \JsonSerializable
 {
 {
@@ -21,40 +25,88 @@ abstract class Enum implements \JsonSerializable
      * Enum value
      * Enum value
      *
      *
      * @var mixed
      * @var mixed
+     * @psalm-var T
      */
      */
     protected $value;
     protected $value;
 
 
     /**
     /**
+     * Enum key, the constant name
+     *
+     * @var string
+     */
+    private $key;
+
+    /**
      * Store existing constants in a static cache per object.
      * Store existing constants in a static cache per object.
      *
      *
+     *
      * @var array
      * @var array
+     * @psalm-var array<class-string, array<string, mixed>>
      */
      */
     protected static $cache = [];
     protected static $cache = [];
 
 
     /**
     /**
+     * Cache of instances of the Enum class
+     *
+     * @var array
+     * @psalm-var array<class-string, array<string, static>>
+     */
+    protected static $instances = [];
+
+    /**
      * Creates a new value of some type
      * Creates a new value of some type
      *
      *
+     * @psalm-pure
      * @param mixed $value
      * @param mixed $value
      *
      *
+     * @psalm-param T $value
      * @throws \UnexpectedValueException if incompatible type is given.
      * @throws \UnexpectedValueException if incompatible type is given.
      */
      */
     public function __construct($value)
     public function __construct($value)
     {
     {
         if ($value instanceof static) {
         if ($value instanceof static) {
-            $this->value = $value->getValue();
-
-            return;
+           /** @psalm-var T */
+            $value = $value->getValue();
         }
         }
 
 
-        if (!$this->isValid($value)) {
-            throw new \UnexpectedValueException("Value '$value' is not part of the enum " . \get_called_class());
-        }
+        /** @psalm-suppress ImplicitToStringCast assertValidValueReturningKey returns always a string but psalm has currently an issue here */
+        $this->key = static::assertValidValueReturningKey($value);
 
 
+        /** @psalm-var T */
         $this->value = $value;
         $this->value = $value;
     }
     }
 
 
     /**
     /**
+     * This method exists only for the compatibility reason when deserializing a previously serialized version
+     * that didn't had the key property
+     */
+    public function __wakeup()
+    {
+        /** @psalm-suppress DocblockTypeContradiction key can be null when deserializing an enum without the key */
+        if ($this->key === null) {
+            /**
+             * @psalm-suppress InaccessibleProperty key is not readonly as marked by psalm
+             * @psalm-suppress PossiblyFalsePropertyAssignmentValue deserializing a case that was removed
+             */
+            $this->key = static::search($this->value);
+        }
+    }
+
+    /**
+     * @param mixed $value
+     * @return static
+     */
+    public static function from($value): self
+    {
+        $key = static::assertValidValueReturningKey($value);
+
+        return self::__callStatic($key, []);
+    }
+
+    /**
+     * @psalm-pure
      * @return mixed
      * @return mixed
+     * @psalm-return T
      */
      */
     public function getValue()
     public function getValue()
     {
     {
@@ -64,14 +116,17 @@ abstract class Enum implements \JsonSerializable
     /**
     /**
      * Returns the enum key (i.e. the constant name).
      * Returns the enum key (i.e. the constant name).
      *
      *
-     * @return mixed
+     * @psalm-pure
+     * @return string
      */
      */
     public function getKey()
     public function getKey()
     {
     {
-        return static::search($this->value);
+        return $this->key;
     }
     }
 
 
     /**
     /**
+     * @psalm-pure
+     * @psalm-suppress InvalidCast
      * @return string
      * @return string
      */
      */
     public function __toString()
     public function __toString()
@@ -80,20 +135,27 @@ abstract class Enum implements \JsonSerializable
     }
     }
 
 
     /**
     /**
-     * Compares one Enum with another.
+     * Determines if Enum should be considered equal with the variable passed as a parameter.
+     * Returns false if an argument is an object of different class or not an object.
      *
      *
      * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4
      * This method is final, for more information read https://github.com/myclabs/php-enum/issues/4
      *
      *
-     * @return bool True if Enums are equal, false if not equal
+     * @psalm-pure
+     * @psalm-param mixed $variable
+     * @return bool
      */
      */
-    final public function equals(Enum $enum = null)
+    final public function equals($variable = null): bool
     {
     {
-        return $enum !== null && $this->getValue() === $enum->getValue() && \get_called_class() === \get_class($enum);
+        return $variable instanceof self
+            && $this->getValue() === $variable->getValue()
+            && static::class === \get_class($variable);
     }
     }
 
 
     /**
     /**
      * Returns the names (keys) of all constants in the Enum class
      * Returns the names (keys) of all constants in the Enum class
      *
      *
+     * @psalm-pure
+     * @psalm-return list<string>
      * @return array
      * @return array
      */
      */
     public static function keys()
     public static function keys()
@@ -104,12 +166,15 @@ abstract class Enum implements \JsonSerializable
     /**
     /**
      * Returns instances of the Enum class of all Enum constants
      * Returns instances of the Enum class of all Enum constants
      *
      *
+     * @psalm-pure
+     * @psalm-return array<string, static>
      * @return static[] Constant name in key, Enum instance in value
      * @return static[] Constant name in key, Enum instance in value
      */
      */
     public static function values()
     public static function values()
     {
     {
         $values = array();
         $values = array();
 
 
+        /** @psalm-var T $value */
         foreach (static::toArray() as $key => $value) {
         foreach (static::toArray() as $key => $value) {
             $values[$key] = new static($value);
             $values[$key] = new static($value);
         }
         }
@@ -120,13 +185,20 @@ abstract class Enum implements \JsonSerializable
     /**
     /**
      * Returns all possible values as an array
      * Returns all possible values as an array
      *
      *
+     * @psalm-pure
+     * @psalm-suppress ImpureStaticProperty
+     *
+     * @psalm-return array<string, mixed>
      * @return array Constant name in key, constant value in value
      * @return array Constant name in key, constant value in value
      */
      */
     public static function toArray()
     public static function toArray()
     {
     {
-        $class = \get_called_class();
+        $class = static::class;
+
         if (!isset(static::$cache[$class])) {
         if (!isset(static::$cache[$class])) {
+            /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
             $reflection            = new \ReflectionClass($class);
             $reflection            = new \ReflectionClass($class);
+            /** @psalm-suppress ImpureMethodCall this reflection API usage has no side-effects here */
             static::$cache[$class] = $reflection->getConstants();
             static::$cache[$class] = $reflection->getConstants();
         }
         }
 
 
@@ -137,7 +209,9 @@ abstract class Enum implements \JsonSerializable
      * Check if is valid enum value
      * Check if is valid enum value
      *
      *
      * @param $value
      * @param $value
-     *
+     * @psalm-param mixed $value
+     * @psalm-pure
+     * @psalm-assert-if-true T $value
      * @return bool
      * @return bool
      */
      */
     public static function isValid($value)
     public static function isValid($value)
@@ -146,10 +220,40 @@ abstract class Enum implements \JsonSerializable
     }
     }
 
 
     /**
     /**
+     * Asserts valid enum value
+     *
+     * @psalm-pure
+     * @psalm-assert T $value
+     * @param mixed $value
+     */
+    public static function assertValidValue($value): void
+    {
+        self::assertValidValueReturningKey($value);
+    }
+
+    /**
+     * Asserts valid enum value
+     *
+     * @psalm-pure
+     * @psalm-assert T $value
+     * @param mixed $value
+     * @return string
+     */
+    private static function assertValidValueReturningKey($value): string
+    {
+        if (false === ($key = static::search($value))) {
+            throw new \UnexpectedValueException("Value '$value' is not part of the enum " . static::class);
+        }
+
+        return $key;
+    }
+
+    /**
      * Check if is valid enum key
      * Check if is valid enum key
      *
      *
      * @param $key
      * @param $key
-     *
+     * @psalm-param string $key
+     * @psalm-pure
      * @return bool
      * @return bool
      */
      */
     public static function isValidKey($key)
     public static function isValidKey($key)
@@ -162,9 +266,11 @@ abstract class Enum implements \JsonSerializable
     /**
     /**
      * Return key for value
      * Return key for value
      *
      *
-     * @param $value
+     * @param mixed $value
      *
      *
-     * @return mixed
+     * @psalm-param mixed $value
+     * @psalm-pure
+     * @return string|false
      */
      */
     public static function search($value)
     public static function search($value)
     {
     {
@@ -179,15 +285,21 @@ abstract class Enum implements \JsonSerializable
      *
      *
      * @return static
      * @return static
      * @throws \BadMethodCallException
      * @throws \BadMethodCallException
+     *
+     * @psalm-pure
      */
      */
     public static function __callStatic($name, $arguments)
     public static function __callStatic($name, $arguments)
     {
     {
-        $array = static::toArray();
-        if (isset($array[$name]) || \array_key_exists($name, $array)) {
-            return new static($array[$name]);
+        $class = static::class;
+        if (!isset(self::$instances[$class][$name])) {
+            $array = static::toArray();
+            if (!isset($array[$name]) && !\array_key_exists($name, $array)) {
+                $message = "No static method or enum constant '$name' in class " . static::class;
+                throw new \BadMethodCallException($message);
+            }
+            return self::$instances[$class][$name] = new static($array[$name]);
         }
         }
-
-        throw new \BadMethodCallException("No static method or enum constant '$name' in class " . \get_called_class());
+        return clone self::$instances[$class][$name];
     }
     }
 
 
     /**
     /**
@@ -196,7 +308,9 @@ abstract class Enum implements \JsonSerializable
      *
      *
      * @return mixed
      * @return mixed
      * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
      * @link http://php.net/manual/en/jsonserializable.jsonserialize.php
+     * @psalm-pure
      */
      */
+    #[\ReturnTypeWillChange]
     public function jsonSerialize()
     public function jsonSerialize()
     {
     {
         return $this->getValue();
         return $this->getValue();

+ 2 - 0
vendor/oygza/aliyun-php-sdk-afs/.gitignore

@@ -0,0 +1,2 @@
+.idea/
+

+ 201 - 0
vendor/oygza/aliyun-php-sdk-afs/LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 6 - 0
vendor/oygza/aliyun-php-sdk-afs/README.md

@@ -0,0 +1,6 @@
+# aliyun-php-sdk-afs
+基于aliyun-php-sdk-afs( 阿里云验证 )封装composer支持
+
+* 对源文件做了重命名命名空间之外,没有做任何操作
+* 为了方便(偷懒)将源文件中的 sdk-core 与 sdk-afs 封装到一起
+* 自测可以使用

Some files were not shown because too many files changed in this diff